Code coverage report for imgly-sdk-html5/src/js/vendor/stack-blur.js

Statements: 2.98% (5 / 168)      Branches: 0% (0 / 18)      Functions: 0% (0 / 2)      Lines: 3.01% (5 / 166)      Ignored: none     

All files » imgly-sdk-html5/src/js/vendor/ » stack-blur.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277                                                                                    1   1   1                                                                                                                                                                                                                                                                                                                                                                                                                                                     1               1      
"use strict";
/*!
 
StackBlur - a fast almost Gaussian Blur For Canvas
 
Version:  0.5
Author:   Mario Klingemann
Contact:  mario@quasimondo.com
Website:  http://www.quasimondo.com/StackBlurForCanvas
Twitter:  @quasimondo
 
In case you find this class useful - especially in commercial projects -
I am not totally unhappy for a small donation to my PayPal account
mario@quasimondo.de
 
Or support me on flattr:
https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript
 
Copyright (c) 2010 Mario Klingemann
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/
 
var mul_table = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259];
 
var shg_table = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24];
 
function stackBlurCanvasRGBA(imageData, top_x, top_y, width, height, radius) {
  if (isNaN(radius) || radius < 1) return;
  radius |= 0;
 
  var pixels = imageData.data;
 
  var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum, r_out_sum, g_out_sum, b_out_sum, a_out_sum, r_in_sum, g_in_sum, b_in_sum, a_in_sum, pr, pg, pb, pa, rbs;
 
  var div = radius + radius + 1;
  var widthMinus1 = width - 1;
  var heightMinus1 = height - 1;
  var radiusPlus1 = radius + 1;
  var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
 
  var stackStart = new BlurStack();
  var stackEnd;
  var stack = stackStart;
  for (i = 1; i < div; i++) {
    stack = stack.next = new BlurStack();
    if (i == radiusPlus1) stackEnd = stack;
  }
  stack.next = stackStart;
  var stackIn = null;
  var stackOut = null;
 
  yw = yi = 0;
 
  var mul_sum = mul_table[radius];
  var shg_sum = shg_table[radius];
 
  for (y = 0; y < height; y++) {
    r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;
 
    r_out_sum = radiusPlus1 * (pr = pixels[yi]);
    g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
    b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
    a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
 
    r_sum += sumFactor * pr;
    g_sum += sumFactor * pg;
    b_sum += sumFactor * pb;
    a_sum += sumFactor * pa;
 
    stack = stackStart;
 
    for (i = 0; i < radiusPlus1; i++) {
      stack.r = pr;
      stack.g = pg;
      stack.b = pb;
      stack.a = pa;
      stack = stack.next;
    }
 
    for (i = 1; i < radiusPlus1; i++) {
      p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);
      r_sum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - i);
      g_sum += (stack.g = pg = pixels[p + 1]) * rbs;
      b_sum += (stack.b = pb = pixels[p + 2]) * rbs;
      a_sum += (stack.a = pa = pixels[p + 3]) * rbs;
 
      r_in_sum += pr;
      g_in_sum += pg;
      b_in_sum += pb;
      a_in_sum += pa;
 
      stack = stack.next;
    }
 
    stackIn = stackStart;
    stackOut = stackEnd;
    for (x = 0; x < width; x++) {
      pixels[yi + 3] = pa = a_sum * mul_sum >> shg_sum;
      if (pa !== 0) {
        pa = 255 / pa;
        pixels[yi] = (r_sum * mul_sum >> shg_sum) * pa;
        pixels[yi + 1] = (g_sum * mul_sum >> shg_sum) * pa;
        pixels[yi + 2] = (b_sum * mul_sum >> shg_sum) * pa;
      } else {
        pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;
      }
 
      r_sum -= r_out_sum;
      g_sum -= g_out_sum;
      b_sum -= b_out_sum;
      a_sum -= a_out_sum;
 
      r_out_sum -= stackIn.r;
      g_out_sum -= stackIn.g;
      b_out_sum -= stackIn.b;
      a_out_sum -= stackIn.a;
 
      p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2;
 
      r_in_sum += stackIn.r = pixels[p];
      g_in_sum += stackIn.g = pixels[p + 1];
      b_in_sum += stackIn.b = pixels[p + 2];
      a_in_sum += stackIn.a = pixels[p + 3];
 
      r_sum += r_in_sum;
      g_sum += g_in_sum;
      b_sum += b_in_sum;
      a_sum += a_in_sum;
 
      stackIn = stackIn.next;
 
      r_out_sum += pr = stackOut.r;
      g_out_sum += pg = stackOut.g;
      b_out_sum += pb = stackOut.b;
      a_out_sum += pa = stackOut.a;
 
      r_in_sum -= pr;
      g_in_sum -= pg;
      b_in_sum -= pb;
      a_in_sum -= pa;
 
      stackOut = stackOut.next;
 
      yi += 4;
    }
    yw += width;
  }
 
  for (x = 0; x < width; x++) {
    g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;
 
    yi = x << 2;
    r_out_sum = radiusPlus1 * (pr = pixels[yi]);
    g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
    b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
    a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
 
    r_sum += sumFactor * pr;
    g_sum += sumFactor * pg;
    b_sum += sumFactor * pb;
    a_sum += sumFactor * pa;
 
    stack = stackStart;
 
    for (i = 0; i < radiusPlus1; i++) {
      stack.r = pr;
      stack.g = pg;
      stack.b = pb;
      stack.a = pa;
      stack = stack.next;
    }
 
    yp = width;
 
    for (i = 1; i <= radius; i++) {
      yi = yp + x << 2;
 
      r_sum += (stack.r = pr = pixels[yi]) * (rbs = radiusPlus1 - i);
      g_sum += (stack.g = pg = pixels[yi + 1]) * rbs;
      b_sum += (stack.b = pb = pixels[yi + 2]) * rbs;
      a_sum += (stack.a = pa = pixels[yi + 3]) * rbs;
 
      r_in_sum += pr;
      g_in_sum += pg;
      b_in_sum += pb;
      a_in_sum += pa;
 
      stack = stack.next;
 
      if (i < heightMinus1) {
        yp += width;
      }
    }
 
    yi = x;
    stackIn = stackStart;
    stackOut = stackEnd;
    for (y = 0; y < height; y++) {
      p = yi << 2;
      pixels[p + 3] = pa = a_sum * mul_sum >> shg_sum;
      if (pa > 0) {
        pa = 255 / pa;
        pixels[p] = (r_sum * mul_sum >> shg_sum) * pa;
        pixels[p + 1] = (g_sum * mul_sum >> shg_sum) * pa;
        pixels[p + 2] = (b_sum * mul_sum >> shg_sum) * pa;
      } else {
        pixels[p] = pixels[p + 1] = pixels[p + 2] = 0;
      }
 
      r_sum -= r_out_sum;
      g_sum -= g_out_sum;
      b_sum -= b_out_sum;
      a_sum -= a_out_sum;
 
      r_out_sum -= stackIn.r;
      g_out_sum -= stackIn.g;
      b_out_sum -= stackIn.b;
      a_out_sum -= stackIn.a;
 
      p = x + ((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2;
 
      r_sum += r_in_sum += stackIn.r = pixels[p];
      g_sum += g_in_sum += stackIn.g = pixels[p + 1];
      b_sum += b_in_sum += stackIn.b = pixels[p + 2];
      a_sum += a_in_sum += stackIn.a = pixels[p + 3];
 
      stackIn = stackIn.next;
 
      r_out_sum += pr = stackOut.r;
      g_out_sum += pg = stackOut.g;
      b_out_sum += pb = stackOut.b;
      a_out_sum += pa = stackOut.a;
 
      r_in_sum -= pr;
      g_in_sum -= pg;
      b_in_sum -= pb;
      a_in_sum -= pa;
 
      stackOut = stackOut.next;
 
      yi += width;
    }
  }
}
 
function BlurStack() {
  this.r = 0;
  this.g = 0;
  this.b = 0;
  this.a = 0;
  this.next = null;
}
 
module.exports = {
  stackBlurCanvasRGBA: stackBlurCanvasRGBA
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9yb290L1NFUlZFUi9pbWdseS1zZGstaHRtbDUvc3JjL2pzL3ZlbmRvci9zdGFjay1ibHVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMENiLElBQUksU0FBUyxHQUFHLENBQ1IsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUMvRCxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQy9ELEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFDL0QsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUMvRCxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQy9ELEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFDL0QsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUMvRCxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQy9ELEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFDL0QsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUMvRCxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQy9ELEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFDL0QsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUMvRCxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQy9ELEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFDL0QsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUMsQ0FBQzs7QUFHckUsSUFBSSxTQUFTLEdBQUcsQ0FDVCxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQ2hFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBRSxDQUFDOztBQUVqRSxTQUFTLG1CQUFtQixDQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUM1RTtBQUNFLE1BQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUcsT0FBTztBQUMxQyxRQUFNLElBQUksQ0FBQyxDQUFDOztBQUVaLE1BQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7O0FBRTVCLE1BQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFDdEQsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUMxQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3RDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7O0FBRXBCLE1BQUksR0FBRyxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLE1BQUksV0FBVyxHQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDN0IsTUFBSSxZQUFZLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFJLFdBQVcsR0FBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLE1BQUksU0FBUyxHQUFHLFdBQVcsSUFBSyxXQUFXLEdBQUcsQ0FBQyxDQUFBLEFBQUUsR0FBRyxDQUFDLENBQUM7O0FBRXRELE1BQUksVUFBVSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7QUFDakMsTUFBSSxRQUFRLENBQUM7QUFDYixNQUFJLEtBQUssR0FBRyxVQUFVLENBQUM7QUFDdkIsT0FBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQ3pCO0FBQ0UsU0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztBQUNyQyxRQUFLLENBQUMs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QyxDQUFDLEFBQUUsQ0FBQzs7QUFFakMsY0FBUSxJQUFJLEVBQUUsQ0FBQztBQUNmLGNBQVEsSUFBSSxFQUFFLENBQUM7QUFDZixjQUFRLElBQUksRUFBRSxDQUFDO0FBQ2YsY0FBUSxJQUFJLEVBQUUsQ0FBQzs7QUFFZixjQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQzs7QUFFekIsUUFBRSxJQUFJLEtBQUssQ0FBQztLQUNiO0dBQ0Y7Q0FDRjs7QUFFRCxTQUFTLFNBQVMsR0FDbEI7QUFDRSxNQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNYLE1BQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsTUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWCxNQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNYLE1BQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ2xCOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUc7QUFDZixxQkFBbUIsRUFBRSxtQkFBbUI7Q0FDekMsQ0FBQyIsImZpbGUiOiIvcm9vdC9TRVJWRVIvaW1nbHktc2RrLWh0bWw1L3NyYy9qcy92ZW5kb3Ivc3RhY2stYmx1ci5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLyohXG5cblN0YWNrQmx1ciAtIGEgZmFzdCBhbG1vc3QgR2F1c3NpYW4gQmx1ciBGb3IgQ2FudmFzXG5cblZlcnNpb246ICAwLjVcbkF1dGhvcjogICBNYXJpbyBLbGluZ2VtYW5uXG5Db250YWN0OiAgbWFyaW9AcXVhc2ltb25kby5jb21cbldlYnNpdGU6ICBodHRwOi8vd3d3LnF1YXNpbW9uZG8uY29tL1N0YWNrQmx1ckZvckNhbnZhc1xuVHdpdHRlcjogIEBxdWFzaW1vbmRvXG5cbkluIGNhc2UgeW91IGZpbmQgdGhpcyBjbGFzcyB1c2VmdWwgLSBlc3BlY2lhbGx5IGluIGNvbW1lcmNpYWwgcHJvamVjdHMgLVxuSSBhbSBub3QgdG90YWxseSB1bmhhcHB5IGZvciBhIHNtYWxsIGRvbmF0aW9uIHRvIG15IFBheVBhbCBhY2NvdW50XG5tYXJpb0BxdWFzaW1vbmRvLmRlXG5cbk9yIHN1cHBvcnQgbWUgb24gZmxhdHRyOlxuaHR0cHM6Ly9mbGF0dHIuY29tL3RoaW5nLzcyNzkxL1N0YWNrQmx1ci1hLWZhc3QtYWxtb3N0LUdhdXNzaWFuLUJsdXItRWZmZWN0LWZvci1DYW52YXNKYXZhc2NyaXB0XG5cbkNvcHlyaWdodCAoYykgMjAxMCBNYXJpbyBLbGluZ2VtYW5uXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uXG5vYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvblxuZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0XG5yZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSxcbmNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGVcblNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nXG5jb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVNcbk9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG5OT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVFxuSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksXG5XSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbkZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiovXG5cbnZhciBtdWxfdGFibGUgPSBbXG4gICAgICAgIDUxMiw1MTIsNDU2LDUxMiwzMjgsNDU2LDMzNSw1MTIsNDA1LDMyOCwyNzEsNDU2LDM4OCwzMzUsMjkyLDUxMixcbiAgICAgICAgNDU0LDQwNSwzNjQsMzI4LDI5OCwyNzEsNDk2LDQ1Niw0MjAsMzg4LDM2MCwzMzUsMzEyLDI5MiwyNzMsNTEyLFxuICAgICAgICA0ODIsNDU0LDQyOCw0MDUsMzgzLDM2NCwzNDUsMzI4LDMxMiwyOTgsMjg0LDI3MSwyNTksNDk2LDQ3NSw0NTYsXG4gICAgICAgIDQzNyw0MjAsNDA0LDM4OCwzNzQsMzYwLDM0NywzMzUsMzIzLDMxMiwzMDIsMjkyLDI4MiwyNzMsMjY1LDUxMixcbiAgICAgICAgNDk3LDQ4Miw0NjgsNDU0LDQ0MSw0MjgsNDE3LDQwNSwzOTQsMzgzLDM3MywzNjQsMzU0LDM0NSwzMzcsMzI4LFxuICAgICAgICAzMjAsMzEyLDMwNSwyOTgsMjkxLDI4NCwyNzgsMjcxLDI2NSwyNTksNTA3LDQ5Niw0ODUsNDc1LDQ2NSw0NTYsXG4gICAgICAgIDQ0Niw0MzcsNDI4LDQyMCw0MTIsNDA0LDM5NiwzODgsMzgxLDM3NCwzNjcsMzYwLDM1NCwzNDcsMzQxLDMzNSxcbiAgICAgICAgMzI5LDMyMywzMTgsMzEyLDMwNywzMDIsMjk3LDI5MiwyODcsMjgyLDI3OCwyNzMsMjY5LDI2NSwyNjEsNTEyLFxuICAgICAgICA1MDUsNDk3LDQ4OSw0ODIsNDc1LDQ2OCw0NjEsNDU0LDQ0Nyw0NDEsNDM1LDQyOCw0MjIsNDE3LDQxMSw0MDUsXG4gICAgICAgIDM5OSwzOTQsMzg5LDM4MywzNzgsMzczLDM2OCwzNjQsMzU5LDM1NCwzNTAsMzQ1LDM0MSwzMzcsMzMyLDMyOCxcbiAgICAgICAgMzI0LDMyMCwzMTYsMzEyLDMwOSwzMDUsMzAxLDI5OCwyOTQsMjkxLDI4NywyODQsMjgxLDI3OCwyNzQsMjcxLFxuICAgICAgICAyNjgsMjY1LDI2MiwyNTksMjU3LDUwNyw1MDEsNDk2LDQ5MSw0ODUsNDgwLDQ3NSw0NzAsNDY1LDQ2MCw0NTYsXG4gICAgICAgIDQ1MSw0NDYsNDQyLDQzNyw0MzMsNDI4LDQyNCw0MjAsNDE2LDQxMiw0MDgsNDA0LDQwMCwzOTYsMzkyLDM4OCxcbiAgICAgICAgMzg1LDM4MSwzNzcsMzc0LDM3MCwzNjcsMzYzLDM2MCwzNTcsMzU0LDM1MCwzNDcsMzQ0LDM0MSwzMzgsMzM1LFxuICAgICAgICAzMzIsMzI5LDMyNiwzMjMsMzIwLDMxOCwzMTUsMzEyLDMxMCwzMDcsMzA0LDMwMiwyOTksMjk3LDI5NCwyOTIsXG4gICAgICAgIDI4OSwyODcsMjg1LDI4MiwyODAsMjc4LDI3NSwyNzMsMjcxLDI2OSwyNjcsMjY1LDI2MywyNjEsMjU5XTtcblxuXG52YXIgc2hnX3RhYmxlID0gW1xuICAgICAgIDksIDExLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTcsXG4gICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksXG4gICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsXG4gICAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjEsXG4gICAgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsXG4gICAgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsXG4gICAgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsXG4gICAgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjMsXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCBdO1xuXG5mdW5jdGlvbiBzdGFja0JsdXJDYW52YXNSR0JBKCBpbWFnZURhdGEsIHRvcF94LCB0b3BfeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzIClcbntcbiAgaWYgKCBpc05hTihyYWRpdXMpIHx8IHJhZGl1cyA8IDEgKSByZXR1cm47XG4gIHJhZGl1cyB8PSAwO1xuXG4gIHZhciBwaXhlbHMgPSBpbWFnZURhdGEuZGF0YTtcblxuICB2YXIgeCwgeSwgaSwgcCwgeXAsIHlpLCB5dywgcl9zdW0sIGdfc3VtLCBiX3N1bSwgYV9zdW0sXG4gIHJfb3V0X3N1bSwgZ19vdXRfc3VtLCBiX291dF9zdW0sIGFfb3V0X3N1bSxcbiAgcl9pbl9zdW0sIGdfaW5fc3VtLCBiX2luX3N1bSwgYV9pbl9zdW0sXG4gIHByLCBwZywgcGIsIHBhLCByYnM7XG5cbiAgdmFyIGRpdiA9IHJhZGl1cyArIHJhZGl1cyArIDE7XG4gIHZhciB3aWR0aE1pbnVzMSAgPSB3aWR0aCAtIDE7XG4gIHZhciBoZWlnaHRNaW51czEgPSBoZWlnaHQgLSAxO1xuICB2YXIgcmFkaXVzUGx1czEgID0gcmFkaXVzICsgMTtcbiAgdmFyIHN1bUZhY3RvciA9IHJhZGl1c1BsdXMxICogKCByYWRpdXNQbHVzMSArIDEgKSAvIDI7XG5cbiAgdmFyIHN0YWNrU3RhcnQgPSBuZXcgQmx1clN0YWNrKCk7XG4gIHZhciBzdGFja0VuZDtcbiAgdmFyIHN0YWNrID0gc3RhY2tTdGFydDtcbiAgZm9yICggaSA9IDE7IGkgPCBkaXY7IGkrKyApXG4gIHtcbiAgICBzdGFjayA9IHN0YWNrLm5leHQgPSBuZXcgQmx1clN0YWNrKCk7XG4gICAgaWYgKCBpID09IHJhZGl1c1BsdXMxICkgc3RhY2tFbmQgPSBzdGFjaztcbiAgfVxuICBzdGFjay5uZXh0ID0gc3RhY2tTdGFydDtcbiAgdmFyIHN0YWNrSW4gPSBudWxsO1xuICB2YXIgc3RhY2tPdXQgPSBudWxsO1xuXG4gIHl3ID0geWkgPSAwO1xuXG4gIHZhciBtdWxfc3VtID0gbXVsX3RhYmxlW3JhZGl1c107XG4gIHZhciBzaGdfc3VtID0gc2hnX3RhYmxlW3JhZGl1c107XG5cbiAgZm9yICggeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKyApXG4gIHtcbiAgICByX2luX3N1bSA9IGdfaW5fc3VtID0gYl9pbl9zdW0gPSBhX2luX3N1bSA9IHJfc3VtID0gZ19zdW0gPSBiX3N1bSA9IGFfc3VtID0gMDtcblxuICAgIHJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKCBwciA9IHBpeGVsc1t5aV0gKTtcbiAgICBnX291dF9zdW0gPSByYWRpdXNQbHVzMSAqICggcGcgPSBwaXhlbHNbeWkrMV0gKTtcbiAgICBiX291dF9zdW0gPSByYWRpdXNQbHVzMSAqICggcGIgPSBwaXhlbHNbeWkrMl0gKTtcbiAgICBhX291dF9zdW0gPSByYWRpdXNQbHVzMSAqICggcGEgPSBwaXhlbHNbeWkrM10gKTtcblxuICAgIHJfc3VtICs9IHN1bUZhY3RvciAqIHByO1xuICAgIGdfc3VtICs9IHN1bUZhY3RvciAqIHBnO1xuICAgIGJfc3VtICs9IHN1bUZhY3RvciAqIHBiO1xuICAgIGFfc3VtICs9IHN1bUZhY3RvciAqIHBhO1xuXG4gICAgc3RhY2sgPSBzdGFja1N0YXJ0O1xuXG4gICAgZm9yKCBpID0gMDsgaSA8IHJhZGl1c1BsdXMxOyBpKysgKVxuICAgIHtcbiAgICAgIHN0YWNrLnIgPSBwcjtcbiAgICAgIHN0YWNrLmcgPSBwZztcbiAgICAgIHN0YWNrLmIgPSBwYjtcbiAgICAgIHN0YWNrLmEgPSBwYTtcbiAgICAgIHN0YWNrID0gc3RhY2submV4dDtcbiAgICB9XG5cbiAgICBmb3IoIGkgPSAxOyBpIDwgcmFkaXVzUGx1czE7IGkrKyApXG4gICAge1xuICAgICAgcCA9IHlpICsgKCggd2lkdGhNaW51czEgPCBpID8gd2lkdGhNaW51czEgOiBpICkgPDwgMiApO1xuICAgICAgcl9zdW0gKz0gKCBzdGFjay5yID0gKCBwciA9IHBpeGVsc1twXSkpICogKCByYnMgPSByYWRpdXNQbHVzMSAtIGkgKTtcbiAgICAgIGdfc3VtICs9ICggc3RhY2suZyA9ICggcGcgPSBwaXhlbHNbcCsxXSkpICogcmJzO1xuICAgICAgYl9zdW0gKz0gKCBzdGFjay5iID0gKCBwYiA9IHBpeGVsc1twKzJdKSkgKiByYnM7XG4gICAgICBhX3N1bSArPSAoIHN0YWNrLmEgPSAoIHBhID0gcGl4ZWxzW3ArM10pKSAqIHJicztcblxuICAgICAgcl9pbl9zdW0gKz0gcHI7XG4gICAgICBnX2luX3N1bSArPSBwZztcbiAgICAgIGJfaW5fc3VtICs9IHBiO1xuICAgICAgYV9pbl9zdW0gKz0gcGE7XG5cbiAgICAgIHN0YWNrID0gc3RhY2submV4dDtcbiAgICB9XG5cblxuICAgIHN0YWNrSW4gPSBzdGFja1N0YXJ0O1xuICAgIHN0YWNrT3V0ID0gc3RhY2tFbmQ7XG4gICAgZm9yICggeCA9IDA7IHggPCB3aWR0aDsgeCsrIClcbiAgICB7XG4gICAgICBwaXhlbHNbeWkrM10gPSBwYSA9IChhX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW07XG4gICAgICBpZiAoIHBhICE9PSAwIClcbiAgICAgIHtcbiAgICAgICAgcGEgPSAyNTUgLyBwYTtcbiAgICAgICAgcGl4ZWxzW3lpXSAgID0gKChyX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW0pICogcGE7XG4gICAgICAgIHBpeGVsc1t5aSsxXSA9ICgoZ19zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtKSAqIHBhO1xuICAgICAgICBwaXhlbHNbeWkrMl0gPSAoKGJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSkgKiBwYTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBpeGVsc1t5aV0gPSBwaXhlbHNbeWkrMV0gPSBwaXhlbHNbeWkrMl0gPSAwO1xuICAgICAgfVxuXG4gICAgICByX3N1bSAtPSByX291dF9zdW07XG4gICAgICBnX3N1bSAtPSBnX291dF9zdW07XG4gICAgICBiX3N1bSAtPSBiX291dF9zdW07XG4gICAgICBhX3N1bSAtPSBhX291dF9zdW07XG5cbiAgICAgIHJfb3V0X3N1bSAtPSBzdGFja0luLnI7XG4gICAgICBnX291dF9zdW0gLT0gc3RhY2tJbi5nO1xuICAgICAgYl9vdXRfc3VtIC09IHN0YWNrSW4uYjtcbiAgICAgIGFfb3V0X3N1bSAtPSBzdGFja0luLmE7XG5cbiAgICAgIHAgPSAgKCB5dyArICggKCBwID0geCArIHJhZGl1cyArIDEgKSA8IHdpZHRoTWludXMxID8gcCA6IHdpZHRoTWludXMxICkgKSA8PCAyO1xuXG4gICAgICByX2luX3N1bSArPSAoIHN0YWNrSW4uciA9IHBpeGVsc1twXSk7XG4gICAgICBnX2luX3N1bSArPSAoIHN0YWNrSW4uZyA9IHBpeGVsc1twKzFdKTtcbiAgICAgIGJfaW5fc3VtICs9ICggc3RhY2tJbi5iID0gcGl4ZWxzW3ArMl0pO1xuICAgICAgYV9pbl9zdW0gKz0gKCBzdGFja0luLmEgPSBwaXhlbHNbcCszXSk7XG5cbiAgICAgIHJfc3VtICs9IHJfaW5fc3VtO1xuICAgICAgZ19zdW0gKz0gZ19pbl9zdW07XG4gICAgICBiX3N1bSArPSBiX2luX3N1bTtcbiAgICAgIGFfc3VtICs9IGFfaW5fc3VtO1xuXG4gICAgICBzdGFja0luID0gc3RhY2tJbi5uZXh0O1xuXG4gICAgICByX291dF9zdW0gKz0gKCBwciA9IHN0YWNrT3V0LnIgKTtcbiAgICAgIGdfb3V0X3N1bSArPSAoIHBnID0gc3RhY2tPdXQuZyApO1xuICAgICAgYl9vdXRfc3VtICs9ICggcGIgPSBzdGFja091dC5iICk7XG4gICAgICBhX291dF9zdW0gKz0gKCBwYSA9IHN0YWNrT3V0LmEgKTtcblxuICAgICAgcl9pbl9zdW0gLT0gcHI7XG4gICAgICBnX2luX3N1bSAtPSBwZztcbiAgICAgIGJfaW5fc3VtIC09IHBiO1xuICAgICAgYV9pbl9zdW0gLT0gcGE7XG5cbiAgICAgIHN0YWNrT3V0ID0gc3RhY2tPdXQubmV4dDtcblxuICAgICAgeWkgKz0gNDtcbiAgICB9XG4gICAgeXcgKz0gd2lkdGg7XG4gIH1cblxuXG4gIGZvciAoIHggPSAwOyB4IDwgd2lkdGg7IHgrKyApXG4gIHtcbiAgICBnX2luX3N1bSA9IGJfaW5fc3VtID0gYV9pbl9zdW0gPSByX2luX3N1bSA9IGdfc3VtID0gYl9zdW0gPSBhX3N1bSA9IHJfc3VtID0gMDtcblxuICAgIHlpID0geCA8PCAyO1xuICAgIHJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKCBwciA9IHBpeGVsc1t5aV0pO1xuICAgIGdfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKCBwZyA9IHBpeGVsc1t5aSsxXSk7XG4gICAgYl9vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAoIHBiID0gcGl4ZWxzW3lpKzJdKTtcbiAgICBhX291dF9zdW0gPSByYWRpdXNQbHVzMSAqICggcGEgPSBwaXhlbHNbeWkrM10pO1xuXG4gICAgcl9zdW0gKz0gc3VtRmFjdG9yICogcHI7XG4gICAgZ19zdW0gKz0gc3VtRmFjdG9yICogcGc7XG4gICAgYl9zdW0gKz0gc3VtRmFjdG9yICogcGI7XG4gICAgYV9zdW0gKz0gc3VtRmFjdG9yICogcGE7XG5cbiAgICBzdGFjayA9IHN0YWNrU3RhcnQ7XG5cbiAgICBmb3IoIGkgPSAwOyBpIDwgcmFkaXVzUGx1czE7IGkrKyApXG4gICAge1xuICAgICAgc3RhY2suciA9IHByO1xuICAgICAgc3RhY2suZyA9IHBnO1xuICAgICAgc3RhY2suYiA9IHBiO1xuICAgICAgc3RhY2suYSA9IHBhO1xuICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xuICAgIH1cblxuICAgIHlwID0gd2lkdGg7XG5cbiAgICBmb3IoIGkgPSAxOyBpIDw9IHJhZGl1czsgaSsrIClcbiAgICB7XG4gICAgICB5aSA9ICggeXAgKyB4ICkgPDwgMjtcblxuICAgICAgcl9zdW0gKz0gKCBzdGFjay5yID0gKCBwciA9IHBpeGVsc1t5aV0pKSAqICggcmJzID0gcmFkaXVzUGx1czEgLSBpICk7XG4gICAgICBnX3N1bSArPSAoIHN0YWNrLmcgPSAoIHBnID0gcGl4ZWxzW3lpKzFdKSkgKiByYnM7XG4gICAgICBiX3N1bSArPSAoIHN0YWNrLmIgPSAoIHBiID0gcGl4ZWxzW3lpKzJdKSkgKiByYnM7XG4gICAgICBhX3N1bSArPSAoIHN0YWNrLmEgPSAoIHBhID0gcGl4ZWxzW3lpKzNdKSkgKiByYnM7XG5cbiAgICAgIHJfaW5fc3VtICs9IHByO1xuICAgICAgZ19pbl9zdW0gKz0gcGc7XG4gICAgICBiX2luX3N1bSArPSBwYjtcbiAgICAgIGFfaW5fc3VtICs9IHBhO1xuXG4gICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG5cbiAgICAgIGlmKCBpIDwgaGVpZ2h0TWludXMxIClcbiAgICAgIHtcbiAgICAgICAgeXAgKz0gd2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgeWkgPSB4O1xuICAgIHN0YWNrSW4gPSBzdGFja1N0YXJ0O1xuICAgIHN0YWNrT3V0ID0gc3RhY2tFbmQ7XG4gICAgZm9yICggeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKyApXG4gICAge1xuICAgICAgcCA9IHlpIDw8IDI7XG4gICAgICBwaXhlbHNbcCszXSA9IHBhID0gKGFfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bTtcbiAgICAgIGlmICggcGEgPiAwIClcbiAgICAgIHtcbiAgICAgICAgcGEgPSAyNTUgLyBwYTtcbiAgICAgICAgcGl4ZWxzW3BdICAgPSAoKHJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSApICogcGE7XG4gICAgICAgIHBpeGVsc1twKzFdID0gKChnX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW0gKSAqIHBhO1xuICAgICAgICBwaXhlbHNbcCsyXSA9ICgoYl9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtICkgKiBwYTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBpeGVsc1twXSA9IHBpeGVsc1twKzFdID0gcGl4ZWxzW3ArMl0gPSAwO1xuICAgICAgfVxuXG4gICAgICByX3N1bSAtPSByX291dF9zdW07XG4gICAgICBnX3N1bSAtPSBnX291dF9zdW07XG4gICAgICBiX3N1bSAtPSBiX291dF9zdW07XG4gICAgICBhX3N1bSAtPSBhX291dF9zdW07XG5cbiAgICAgIHJfb3V0X3N1bSAtPSBzdGFja0luLnI7XG4gICAgICBnX291dF9zdW0gLT0gc3RhY2tJbi5nO1xuICAgICAgYl9vdXRfc3VtIC09IHN0YWNrSW4uYjtcbiAgICAgIGFfb3V0X3N1bSAtPSBzdGFja0luLmE7XG5cbiAgICAgIHAgPSAoIHggKyAoKCAoIHAgPSB5ICsgcmFkaXVzUGx1czEpIDwgaGVpZ2h0TWludXMxID8gcCA6IGhlaWdodE1pbnVzMSApICogd2lkdGggKSkgPDwgMjtcblxuICAgICAgcl9zdW0gKz0gKCByX2luX3N1bSArPSAoIHN0YWNrSW4uciA9IHBpeGVsc1twXSkpO1xuICAgICAgZ19zdW0gKz0gKCBnX2luX3N1bSArPSAoIHN0YWNrSW4uZyA9IHBpeGVsc1twKzFdKSk7XG4gICAgICBiX3N1bSArPSAoIGJfaW5fc3VtICs9ICggc3RhY2tJbi5iID0gcGl4ZWxzW3ArMl0pKTtcbiAgICAgIGFfc3VtICs9ICggYV9pbl9zdW0gKz0gKCBzdGFja0luLmEgPSBwaXhlbHNbcCszXSkpO1xuXG4gICAgICBzdGFja0luID0gc3RhY2tJbi5uZXh0O1xuXG4gICAgICByX291dF9zdW0gKz0gKCBwciA9IHN0YWNrT3V0LnIgKTtcbiAgICAgIGdfb3V0X3N1bSArPSAoIHBnID0gc3RhY2tPdXQuZyApO1xuICAgICAgYl9vdXRfc3VtICs9ICggcGIgPSBzdGFja091dC5iICk7XG4gICAgICBhX291dF9zdW0gKz0gKCBwYSA9IHN0YWNrT3V0LmEgKTtcblxuICAgICAgcl9pbl9zdW0gLT0gcHI7XG4gICAgICBnX2luX3N1bSAtPSBwZztcbiAgICAgIGJfaW5fc3VtIC09IHBiO1xuICAgICAgYV9pbl9zdW0gLT0gcGE7XG5cbiAgICAgIHN0YWNrT3V0ID0gc3RhY2tPdXQubmV4dDtcblxuICAgICAgeWkgKz0gd2lkdGg7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIEJsdXJTdGFjaygpXG57XG4gIHRoaXMuciA9IDA7XG4gIHRoaXMuZyA9IDA7XG4gIHRoaXMuYiA9IDA7XG4gIHRoaXMuYSA9IDA7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzdGFja0JsdXJDYW52YXNSR0JBOiBzdGFja0JsdXJDYW52YXNSR0JBXG59O1xuIl19