Forráskód Böngészése

faster quad double squaring opencl

Nicolas Winkler 5 éve
szülő
commit
d81d612a77
5 módosított fájl, 297 hozzáadás és 145 törlés
  1. BIN
      icon.png
  2. 12 0
      libmandel/src/ClGenerators.cpp
  3. 55 8
      libmandel/src/opencl/quaddouble.cl
  4. 220 124
      libmandel/src/opencl/quaddouble.h
  5. 10 13
      main.cpp

BIN
icon.png


+ 12 - 0
libmandel/src/ClGenerators.cpp

@@ -399,6 +399,9 @@ void ClGeneratorQuadDouble::generate(const mnd::MandelInfo& info, float* data)
     mnd::QuadDouble psx = mnd::convert<mnd::QuadDouble>(info.view.width / info.bWidth);
     mnd::QuadDouble psy = mnd::convert<mnd::QuadDouble>(info.view.height / info.bHeight);
 
+    mnd::QuadDouble jx = mnd::convert<mnd::QuadDouble>(info.juliaX);
+    mnd::QuadDouble jy = mnd::convert<mnd::QuadDouble>(info.juliaY);
+
     kernel.setArg(0, buffer_A);
     kernel.setArg(1, int(info.bWidth));
     kernel.setArg(2, x.x[0]);
@@ -419,6 +422,15 @@ void ClGeneratorQuadDouble::generate(const mnd::MandelInfo& info, float* data)
     kernel.setArg(17, psy.x[3]);
     kernel.setArg(18, int(info.maxIter));
     kernel.setArg(19, int(info.smooth ? 1 : 0));
+    kernel.setArg(20, int(info.julia ? 1 : 0));
+    kernel.setArg(21, jx.x[0]);
+    kernel.setArg(22, jx.x[1]);
+    kernel.setArg(23, jx.x[2]);
+    kernel.setArg(24, jx.x[3]);
+    kernel.setArg(25, jy.x[0]);
+    kernel.setArg(26, jy.x[1]);
+    kernel.setArg(27, jy.x[2]);
+    kernel.setArg(28, jy.x[3]);
 
     cl_int result = queue.enqueueNDRangeKernel(kernel, 0, NDRange(info.bWidth * info.bHeight));
     queue.enqueueReadBuffer(buffer_A, CL_TRUE, 0, bufferSize, data);

+ 55 - 8
libmandel/src/opencl/quaddouble.cl

@@ -161,10 +161,53 @@ inline double4 mul(double4 a, double4 b) {
     return (double4)(p0, p1, s0, s1);
 }
 
+inline double4 sq(double4 a) {
+    double p0, p1, p2, p3, p4, p5;
+    double q0, q1, q2, q3;
+    double s0, s1;
+    double t0, t1;
+    
+    p0 = two_prod(a[0], a[0], &q0);
+    p1 = two_prod(2.0 * a[0], a[1], &q1);
+    p2 = two_prod(2.0 * a[0], a[2], &q2);
+    p3 = two_prod(a[1], a[1], &q3);
+
+    p1 = two_sum(q0, p1, &q0);
+
+    q0 = two_sum(q0, q1, &q1);
+    p2 = two_sum(p2, p3, &p3);
+
+    s0 = two_sum(q0, p2, &t0);
+    s1 = two_sum(q1, p3, &t1);
+
+    s1 = two_sum(s1, t0, &t0);
+    t0 += t1;
+
+    s1 = quick_two_sum(s1, t0, &t0);
+    p2 = quick_two_sum(s0, s1, &t1);
+    p3 = quick_two_sum(t1, t0, &q0);
+
+    p4 = 2.0 * a[0] * a[3];
+    p5 = 2.0 * a[1] * a[2];
+
+    p4 = two_sum(p4, p5, &p5);
+    q2 = two_sum(q2, q3, &q3);
+
+    t0 = two_sum(p4, q2, &t1);
+    t1 = t1 + p5 + q3;
+
+    p3 = two_sum(p3, t0, &p4);
+    p4 = p4 + q0 + t1;
+
+    renorm(&p0, &p1, &p2, &p3, &p4);
+    return (double4)(p0, p1, p2, p3);
+}
+
 
 __kernel void iterate(__global float* A, const int width,
                       double x1, double x2, double x3, double x4, double y1, double y2, double y3, double y4,
-                      double pw1, double pw2, double pw3, double pw4, double ph1, double ph2, double ph3, double ph4, int max, int smooth) {
+                      double pw1, double pw2, double pw3, double pw4, double ph1, double ph2, double ph3, double ph4, int max, int smooth, int julia,
+                      double jx1, double jx2, double jx3, double jx4, double jy1, double jy2, double jy3, double jy4) {
     int index = get_global_id(0);
     int px = index % width;
     int py = index / width;
@@ -174,15 +217,19 @@ __kernel void iterate(__global float* A, const int width,
     double4 pixelScaleX = (double4)(pw1, pw2, pw3, pw4);
     double4 pixelScaleY = (double4)(ph1, ph2, ph3, ph4);
 
-    double4 a = add(mul(pixelScaleX, (double4) (px, 0, 0, 0)), xl); // pixelScaleX * px + xl
-    double4 b = add(mul(pixelScaleY, (double4) (py, 0, 0, 0)), yt); // pixelScaleY * py + yt
-    double4 ca = a;
-    double4 cb = b;
+    double4 ca = add(mul(pixelScaleX, (double4) (px, 0, 0, 0)), xl); // pixelScaleX * px + xl
+    double4 cb = add(mul(pixelScaleY, (double4) (py, 0, 0, 0)), yt); // pixelScaleY * py + yt
+    double4 a = ca;
+    double4 b = cb;
+    if (julia != 0) {
+        ca = (double4)(jx1, jx2, jx3, jx4);
+        cb = (double4)(jy1, jy2, jy3, jy4);
+    }
 
     int n = 0;
     while (n < max - 1) {
-        double4 aa = mul(a, a);
-        double4 bb = mul(b, b);
+        double4 aa = sq(a);
+        double4 bb = sq(b);
         double4 ab = mul(a, b);
         if (aa.s0 + bb.s0 > 16) break;
         double4 minusbb = (double4)(-bb.s0, -bb.s1, -bb.s2, -bb.s3);
@@ -202,4 +249,4 @@ __kernel void iterate(__global float* A, const int width,
     }
     //               A[index] = ((float)n) + 1 - (a * a + b * b - 16) / (256 - 16);
     //           A[get_global_id(0)] = 5;
-}
+}

+ 220 - 124
libmandel/src/opencl/quaddouble.h

@@ -312,137 +312,233 @@ unsigned char quaddouble_cl[] = {
   0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
   0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
   0x29, 0x28, 0x70, 0x30, 0x2c, 0x20, 0x70, 0x31, 0x2c, 0x20, 0x73, 0x30,
-  0x2c, 0x20, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x5f,
-  0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64,
-  0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67,
-  0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a,
-  0x20, 0x41, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e,
-  0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20,
+  0x2c, 0x20, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e,
+  0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
+  0x20, 0x73, 0x71, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20,
+  0x61, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x70, 0x30, 0x2c, 0x20, 0x70, 0x31, 0x2c, 0x20,
+  0x70, 0x32, 0x2c, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x70, 0x34, 0x2c, 0x20,
+  0x70, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x71, 0x30, 0x2c, 0x20, 0x71, 0x31, 0x2c, 0x20, 0x71,
+  0x32, 0x2c, 0x20, 0x71, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x74, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x30, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x5b, 0x30, 0x5d,
+  0x2c, 0x20, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x30, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x31, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x32, 0x2e, 0x30, 0x20,
+  0x2a, 0x20, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x61, 0x5b, 0x31, 0x5d,
+  0x2c, 0x20, 0x26, 0x71, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x70, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f,
+  0x64, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x5b, 0x30, 0x5d,
+  0x2c, 0x20, 0x61, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x32, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x5b, 0x31, 0x5d,
+  0x2c, 0x20, 0x61, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x33, 0x29,
+  0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x31, 0x20, 0x3d, 0x20,
+  0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x71, 0x30, 0x2c, 0x20,
+  0x70, 0x31, 0x2c, 0x20, 0x26, 0x71, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x71, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f,
+  0x73, 0x75, 0x6d, 0x28, 0x71, 0x30, 0x2c, 0x20, 0x71, 0x31, 0x2c, 0x20,
+  0x26, 0x71, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x32,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x70,
+  0x32, 0x2c, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x26, 0x70, 0x33, 0x29, 0x3b,
+  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x71, 0x30, 0x2c, 0x20, 0x70,
+  0x32, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75,
+  0x6d, 0x28, 0x71, 0x31, 0x2c, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x26, 0x74,
+  0x31, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31,
+  0x2c, 0x20, 0x74, 0x30, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x74, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x74, 0x31,
+  0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20,
+  0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75,
+  0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x30, 0x2c, 0x20, 0x26, 0x74,
+  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x32, 0x20, 0x3d,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73,
+  0x75, 0x6d, 0x28, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2c, 0x20, 0x26,
+  0x74, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x33, 0x20,
+  0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f,
+  0x73, 0x75, 0x6d, 0x28, 0x74, 0x31, 0x2c, 0x20, 0x74, 0x30, 0x2c, 0x20,
+  0x26, 0x71, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70,
+  0x34, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x5b,
+  0x30, 0x5d, 0x20, 0x2a, 0x20, 0x61, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x70, 0x35, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20,
+  0x2a, 0x20, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x61, 0x5b, 0x32,
+  0x5d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x34, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x70, 0x34, 0x2c,
+  0x20, 0x70, 0x35, 0x2c, 0x20, 0x26, 0x70, 0x35, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x71, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f,
+  0x73, 0x75, 0x6d, 0x28, 0x71, 0x32, 0x2c, 0x20, 0x71, 0x33, 0x2c, 0x20,
+  0x26, 0x71, 0x33, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74,
+  0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28,
+  0x70, 0x34, 0x2c, 0x20, 0x71, 0x32, 0x2c, 0x20, 0x26, 0x74, 0x31, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x74,
+  0x31, 0x20, 0x2b, 0x20, 0x70, 0x35, 0x20, 0x2b, 0x20, 0x71, 0x33, 0x3b,
+  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x70, 0x33, 0x2c, 0x20, 0x74,
+  0x30, 0x2c, 0x20, 0x26, 0x70, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x70, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x34, 0x20, 0x2b, 0x20, 0x71,
+  0x30, 0x20, 0x2b, 0x20, 0x74, 0x31, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x72, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x28, 0x26, 0x70, 0x30, 0x2c,
+  0x20, 0x26, 0x70, 0x31, 0x2c, 0x20, 0x26, 0x70, 0x32, 0x2c, 0x20, 0x26,
+  0x70, 0x33, 0x2c, 0x20, 0x26, 0x70, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x70, 0x30, 0x2c, 0x20, 0x70,
+  0x31, 0x2c, 0x20, 0x70, 0x32, 0x2c, 0x20, 0x70, 0x33, 0x29, 0x3b, 0x0a,
+  0x7d, 0x0a, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c,
+  0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74,
+  0x65, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x41, 0x2c, 0x20, 0x63, 0x6f, 0x6e,
+  0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68,
+  0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x78, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x78, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78,
-  0x34, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x31,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x32, 0x2c,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x33, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x34, 0x2c, 0x0a, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x31, 0x2c, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x78, 0x34, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x79, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x79, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x79, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x79, 0x34, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x34, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x34, 0x2c, 0x20, 0x69, 0x6e, 0x74,
-  0x20, 0x6d, 0x61, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6d,
-  0x6f, 0x6f, 0x74, 0x68, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20,
-  0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69,
-  0x64, 0x28, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
-  0x74, 0x20, 0x70, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78,
-  0x20, 0x25, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x69,
-  0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68,
-  0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x34, 0x20, 0x78, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x78, 0x31, 0x2c, 0x20, 0x78, 0x32,
-  0x2c, 0x20, 0x78, 0x33, 0x2c, 0x20, 0x78, 0x34, 0x29, 0x3b, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x79,
-  0x74, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
-  0x29, 0x28, 0x79, 0x31, 0x2c, 0x20, 0x79, 0x32, 0x2c, 0x20, 0x79, 0x33,
-  0x2c, 0x20, 0x79, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c,
-  0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x70, 0x77, 0x31, 0x2c, 0x20,
-  0x70, 0x77, 0x32, 0x2c, 0x20, 0x70, 0x77, 0x33, 0x2c, 0x20, 0x70, 0x77,
-  0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x34, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61,
-  0x6c, 0x65, 0x59, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x34, 0x29, 0x28, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x70, 0x68, 0x32,
-  0x2c, 0x20, 0x70, 0x68, 0x33, 0x2c, 0x20, 0x70, 0x68, 0x34, 0x29, 0x3b,
-  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x34, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75,
-  0x6c, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
-  0x58, 0x2c, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29,
-  0x20, 0x28, 0x70, 0x78, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20,
-  0x30, 0x29, 0x29, 0x2c, 0x20, 0x78, 0x6c, 0x29, 0x3b, 0x20, 0x2f, 0x2f,
-  0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58,
-  0x20, 0x2a, 0x20, 0x70, 0x78, 0x20, 0x2b, 0x20, 0x78, 0x6c, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x62,
-  0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c, 0x28, 0x70,
-  0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x2c, 0x20,
-  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x20, 0x28, 0x70,
-  0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x29,
-  0x2c, 0x20, 0x79, 0x74, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69,
-  0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x20, 0x2a, 0x20,
-  0x70, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x63, 0x61, 0x20, 0x3d,
-  0x20, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x34, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x62, 0x3b, 0x0a,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x31,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x32,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x33,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x34,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x31,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x32,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x33,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x34,
+  0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x78, 0x2c, 0x20, 0x69,
+  0x6e, 0x74, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x2c, 0x20, 0x69,
+  0x6e, 0x74, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x2c, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x6a, 0x78, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x6a, 0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x6a, 0x78, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x6a, 0x78, 0x34, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x6a, 0x79, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x6a, 0x79, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x6a, 0x79, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x6a, 0x79, 0x34, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20,
+  0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c,
+  0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x20, 0x70, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64,
+  0x65, 0x78, 0x20, 0x25, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x79, 0x20, 0x3d,
+  0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x77, 0x69, 0x64,
+  0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x34, 0x20, 0x78, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x78, 0x31, 0x2c, 0x20,
+  0x78, 0x32, 0x2c, 0x20, 0x78, 0x33, 0x2c, 0x20, 0x78, 0x34, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
+  0x20, 0x79, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x34, 0x29, 0x28, 0x79, 0x31, 0x2c, 0x20, 0x79, 0x32, 0x2c, 0x20,
+  0x79, 0x33, 0x2c, 0x20, 0x79, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x70, 0x69, 0x78,
+  0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x3d, 0x20, 0x28,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x70, 0x77, 0x31,
+  0x2c, 0x20, 0x70, 0x77, 0x32, 0x2c, 0x20, 0x70, 0x77, 0x33, 0x2c, 0x20,
+  0x70, 0x77, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53,
+  0x63, 0x61, 0x6c, 0x65, 0x59, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x70,
+  0x68, 0x32, 0x2c, 0x20, 0x70, 0x68, 0x33, 0x2c, 0x20, 0x70, 0x68, 0x34,
+  0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x34, 0x20, 0x63, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64,
+  0x28, 0x6d, 0x75, 0x6c, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63,
+  0x61, 0x6c, 0x65, 0x58, 0x2c, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x34, 0x29, 0x20, 0x28, 0x70, 0x78, 0x2c, 0x20, 0x30, 0x2c, 0x20,
+  0x30, 0x2c, 0x20, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x78, 0x6c, 0x29, 0x3b,
+  0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61,
+  0x6c, 0x65, 0x58, 0x20, 0x2a, 0x20, 0x70, 0x78, 0x20, 0x2b, 0x20, 0x78,
+  0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x34, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d,
+  0x75, 0x6c, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c,
+  0x65, 0x59, 0x2c, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
+  0x29, 0x20, 0x28, 0x70, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c,
+  0x20, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x79, 0x74, 0x29, 0x3b, 0x20, 0x2f,
+  0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
+  0x59, 0x20, 0x2a, 0x20, 0x70, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x74, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20,
+  0x61, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x62, 0x20, 0x3d, 0x20,
+  0x63, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28,
+  0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x20,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61,
+  0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29,
+  0x28, 0x6a, 0x78, 0x31, 0x2c, 0x20, 0x6a, 0x78, 0x32, 0x2c, 0x20, 0x6a,
+  0x78, 0x33, 0x2c, 0x20, 0x6a, 0x78, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x28,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x6a, 0x79, 0x31,
+  0x2c, 0x20, 0x6a, 0x79, 0x32, 0x2c, 0x20, 0x6a, 0x79, 0x33, 0x2c, 0x20,
+  0x6a, 0x79, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,
   0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x20, 0x3d,
   0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c,
   0x65, 0x20, 0x28, 0x6e, 0x20, 0x3c, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d,
   0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x61, 0x61,
-  0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x61, 0x2c, 0x20, 0x61, 0x29,
-  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x6d,
-  0x75, 0x6c, 0x28, 0x62, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x3d, 0x20, 0x73, 0x71, 0x28, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x34, 0x20, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x61,
-  0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x61, 0x2e, 0x73, 0x30, 0x20,
-  0x2b, 0x20, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x20, 0x31, 0x36,
-  0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
-  0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x28,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x2d, 0x62, 0x62,
-  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x31, 0x2c,
-  0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x2d, 0x62, 0x62,
-  0x2e, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64,
-  0x64, 0x28, 0x61, 0x61, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62,
-  0x62, 0x29, 0x2c, 0x20, 0x63, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64,
-  0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x62, 0x2c, 0x20, 0x61, 0x62, 0x29,
-  0x2c, 0x20, 0x63, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x6e, 0x2b, 0x2b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x20,
-  0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x28, 0x6c,
-  0x6f, 0x67, 0x20, 0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29, 0x7c, 0x29, 0x20,
-  0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x69, 0x66, 0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x61, 0x78,
-  0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d,
-  0x20, 0x6d, 0x61, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c,
-  0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x20,
-  0x21, 0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x34, 0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x71, 0x28, 0x62, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x6d,
+  0x75, 0x6c, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x61,
+  0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x20,
+  0x3e, 0x20, 0x31, 0x36, 0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x34, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62,
+  0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29,
+  0x28, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x2d, 0x62, 0x62,
+  0x2e, 0x73, 0x31, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x32, 0x2c,
+  0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64,
+  0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x61, 0x2c, 0x20, 0x6d, 0x69,
+  0x6e, 0x75, 0x73, 0x62, 0x62, 0x29, 0x2c, 0x20, 0x63, 0x61, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d,
+  0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x62, 0x2c,
+  0x20, 0x61, 0x62, 0x29, 0x2c, 0x20, 0x63, 0x62, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x2b, 0x2b, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f,
+  0x2f, 0x20, 0x4e, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f,
+  0x67, 0x20, 0x28, 0x6c, 0x6f, 0x67, 0x20, 0x20, 0x7c, 0x5a, 0x28, 0x4e,
+  0x29, 0x7c, 0x29, 0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x32, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d,
+  0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65,
-  0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x29, 0x20, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c,
-  0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x67, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x20,
-  0x2a, 0x20, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73,
-  0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x20, 0x2f, 0x20,
-  0x32, 0x29, 0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x28, 0x32, 0x2e, 0x30,
-  0x66, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78,
-  0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29,
-  0x6e, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64,
-  0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61,
-  0x74, 0x29, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x28,
-  0x61, 0x20, 0x2a, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x20, 0x2a, 0x20,
-  0x62, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x32,
-  0x35, 0x36, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x41, 0x5b, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f,
-  0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x20, 0x3d,
-  0x20, 0x35, 0x3b, 0x0a, 0x7d, 0x0a
+  0x78, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x6d, 0x6f,
+  0x6f, 0x74, 0x68, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b,
+  0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x29, 0x20, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31,
+  0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x67, 0x28, 0x61,
+  0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b,
+  0x20, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30,
+  0x29, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67,
+  0x28, 0x32, 0x2e, 0x30, 0x66, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69,
+  0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41,
+  0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31,
+  0x20, 0x2d, 0x20, 0x28, 0x61, 0x20, 0x2a, 0x20, 0x61, 0x20, 0x2b, 0x20,
+  0x62, 0x20, 0x2a, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x20,
+  0x2f, 0x20, 0x28, 0x32, 0x35, 0x36, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x67, 0x65, 0x74,
+  0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30,
+  0x29, 0x5d, 0x20, 0x3d, 0x20, 0x35, 0x3b, 0x0a, 0x7d
 };
-unsigned int quaddouble_cl_len = 5334;
+unsigned int quaddouble_cl_len = 6489;

+ 10 - 13
main.cpp

@@ -3,40 +3,37 @@
 #include <QPixmap>
 #include <QDesktopWidget>
 #include <QSplashScreen>
-#include <QMovie>
-#include <QTimer>
-#include <QFuture>
+//#include <QTimer>
 #include <cmath>
-#include <QtConcurrent>
 
 class AlmondSplashScreen : public QSplashScreen
 {
 private:
     float animOff = 0.0f;
-    QTimer animUpdate;
+    //QTimer animUpdate;
     volatile bool updated = true;
 public:
     AlmondSplashScreen(QPixmap splash) :
-        QSplashScreen{ splash },
-        animUpdate{ this }
+        QSplashScreen{ splash }
+        //animUpdate{ this }
     {
-        animUpdate.start(10);
+        //animUpdate.start(10);
         //loading.start();
         //this->add(loading);
         //connect(&loading, &QMovie::updated, this, &AlmondSplashScreen::nextFrame);
-        connect(&animUpdate, &QTimer::timeout, this, &AlmondSplashScreen::nextFrame);
+        //connect(&animUpdate, &QTimer::timeout, this, &AlmondSplashScreen::nextFrame);
     }
 
     ~AlmondSplashScreen(void)
     {
-        animUpdate.stop();
+        //animUpdate.stop();
     }
 
     void drawContents(QPainter* painter) override
     {
         QSplashScreen::drawContents(painter);
-        drawAnimation(painter);
-        updated = true;
+        //drawAnimation(painter);
+        //updated = true;
     }
 
     void drawAnimation(QPainter* painter)
@@ -74,7 +71,7 @@ public slots:
     void nextFrame() //(const QRect& rect)
     {
         emit this->repaint();
-        animOff += 3;
+        //animOff += 3;
     }
 };