diff --git a/public/js/all.js b/public/js/all.js
index caf871d4..886cb489 100644
--- a/public/js/all.js
+++ b/public/js/all.js
@@ -1,11 +1,3 @@
-/*
- * ATTENTION: An "eval-source-map" devtool has been used.
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
@@ -15,7 +7,12887 @@
\*****************************************/
/***/ (function(module, exports, __webpack_require__) {
-eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n/*!\n * Chart.js v2.8.0\n * https://www.chartjs.org\n * (c) 2019 Chart.js Contributors\n * Released under the MIT License\n */\n(function (global, factory) {\n ( false ? 0 : _typeof(exports)) === 'object' && \"object\" !== 'undefined' ? module.exports = factory(function () {\n try {\n return __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n } catch (e) {}\n }()) : true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require) {\n return factory(function () {\n try {\n return __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n } catch (e) {}\n }());\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : 0;\n})(this, function (moment) {\n 'use strict';\n\n moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment;\n\n /* MIT license */\n\n var conversions = {\n rgb2hsl: rgb2hsl,\n rgb2hsv: rgb2hsv,\n rgb2hwb: rgb2hwb,\n rgb2cmyk: rgb2cmyk,\n rgb2keyword: rgb2keyword,\n rgb2xyz: rgb2xyz,\n rgb2lab: rgb2lab,\n rgb2lch: rgb2lch,\n hsl2rgb: hsl2rgb,\n hsl2hsv: hsl2hsv,\n hsl2hwb: hsl2hwb,\n hsl2cmyk: hsl2cmyk,\n hsl2keyword: hsl2keyword,\n hsv2rgb: hsv2rgb,\n hsv2hsl: hsv2hsl,\n hsv2hwb: hsv2hwb,\n hsv2cmyk: hsv2cmyk,\n hsv2keyword: hsv2keyword,\n hwb2rgb: hwb2rgb,\n hwb2hsl: hwb2hsl,\n hwb2hsv: hwb2hsv,\n hwb2cmyk: hwb2cmyk,\n hwb2keyword: hwb2keyword,\n cmyk2rgb: cmyk2rgb,\n cmyk2hsl: cmyk2hsl,\n cmyk2hsv: cmyk2hsv,\n cmyk2hwb: cmyk2hwb,\n cmyk2keyword: cmyk2keyword,\n keyword2rgb: keyword2rgb,\n keyword2hsl: keyword2hsl,\n keyword2hsv: keyword2hsv,\n keyword2hwb: keyword2hwb,\n keyword2cmyk: keyword2cmyk,\n keyword2lab: keyword2lab,\n keyword2xyz: keyword2xyz,\n xyz2rgb: xyz2rgb,\n xyz2lab: xyz2lab,\n xyz2lch: xyz2lch,\n lab2xyz: lab2xyz,\n lab2rgb: lab2rgb,\n lab2lch: lab2lch,\n lch2lab: lch2lab,\n lch2xyz: lch2xyz,\n lch2rgb: lch2rgb\n };\n function rgb2hsl(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h,\n s,\n l;\n if (max == min) h = 0;else if (r == max) h = (g - b) / delta;else if (g == max) h = 2 + (b - r) / delta;else if (b == max) h = 4 + (r - g) / delta;\n h = Math.min(h * 60, 360);\n if (h < 0) h += 360;\n l = (min + max) / 2;\n if (max == min) s = 0;else if (l <= 0.5) s = delta / (max + min);else s = delta / (2 - max - min);\n return [h, s * 100, l * 100];\n }\n function rgb2hsv(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h,\n s,\n v;\n if (max == 0) s = 0;else s = delta / max * 1000 / 10;\n if (max == min) h = 0;else if (r == max) h = (g - b) / delta;else if (g == max) h = 2 + (b - r) / delta;else if (b == max) h = 4 + (r - g) / delta;\n h = Math.min(h * 60, 360);\n if (h < 0) h += 360;\n v = max / 255 * 1000 / 10;\n return [h, s, v];\n }\n function rgb2hwb(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n h = rgb2hsl(rgb)[0],\n w = 1 / 255 * Math.min(r, Math.min(g, b)),\n b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n return [h, w * 100, b * 100];\n }\n function rgb2cmyk(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255,\n c,\n m,\n y,\n k;\n k = Math.min(1 - r, 1 - g, 1 - b);\n c = (1 - r - k) / (1 - k) || 0;\n m = (1 - g - k) / (1 - k) || 0;\n y = (1 - b - k) / (1 - k) || 0;\n return [c * 100, m * 100, y * 100, k * 100];\n }\n function rgb2keyword(rgb) {\n return reverseKeywords[JSON.stringify(rgb)];\n }\n function rgb2xyz(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255;\n\n // assume sRGB\n r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n var x = r * 0.4124 + g * 0.3576 + b * 0.1805;\n var y = r * 0.2126 + g * 0.7152 + b * 0.0722;\n var z = r * 0.0193 + g * 0.1192 + b * 0.9505;\n return [x * 100, y * 100, z * 100];\n }\n function rgb2lab(rgb) {\n var xyz = rgb2xyz(rgb),\n x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l,\n a,\n b;\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;\n y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;\n z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;\n l = 116 * y - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n return [l, a, b];\n }\n function rgb2lch(args) {\n return lab2lch(rgb2lab(args));\n }\n function hsl2rgb(hsl) {\n var h = hsl[0] / 360,\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n t1,\n t2,\n t3,\n rgb,\n val;\n if (s == 0) {\n val = l * 255;\n return [val, val, val];\n }\n if (l < 0.5) t2 = l * (1 + s);else t2 = l + s - l * s;\n t1 = 2 * l - t2;\n rgb = [0, 0, 0];\n for (var i = 0; i < 3; i++) {\n t3 = h + 1 / 3 * -(i - 1);\n t3 < 0 && t3++;\n t3 > 1 && t3--;\n if (6 * t3 < 1) val = t1 + (t2 - t1) * 6 * t3;else if (2 * t3 < 1) val = t2;else if (3 * t3 < 2) val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;else val = t1;\n rgb[i] = val * 255;\n }\n return rgb;\n }\n function hsl2hsv(hsl) {\n var h = hsl[0],\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n sv,\n v;\n if (l === 0) {\n // no need to do calc on black\n // also avoids divide by 0 error\n return [0, 0, 0];\n }\n l *= 2;\n s *= l <= 1 ? l : 2 - l;\n v = (l + s) / 2;\n sv = 2 * s / (l + s);\n return [h, sv * 100, v * 100];\n }\n function hsl2hwb(args) {\n return rgb2hwb(hsl2rgb(args));\n }\n function hsl2cmyk(args) {\n return rgb2cmyk(hsl2rgb(args));\n }\n function hsl2keyword(args) {\n return rgb2keyword(hsl2rgb(args));\n }\n function hsv2rgb(hsv) {\n var h = hsv[0] / 60,\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n hi = Math.floor(h) % 6;\n var f = h - Math.floor(h),\n p = 255 * v * (1 - s),\n q = 255 * v * (1 - s * f),\n t = 255 * v * (1 - s * (1 - f)),\n v = 255 * v;\n switch (hi) {\n case 0:\n return [v, t, p];\n case 1:\n return [q, v, p];\n case 2:\n return [p, v, t];\n case 3:\n return [p, q, v];\n case 4:\n return [t, p, v];\n case 5:\n return [v, p, q];\n }\n }\n function hsv2hsl(hsv) {\n var h = hsv[0],\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n sl,\n l;\n l = (2 - s) * v;\n sl = s * v;\n sl /= l <= 1 ? l : 2 - l;\n sl = sl || 0;\n l /= 2;\n return [h, sl * 100, l * 100];\n }\n function hsv2hwb(args) {\n return rgb2hwb(hsv2rgb(args));\n }\n function hsv2cmyk(args) {\n return rgb2cmyk(hsv2rgb(args));\n }\n function hsv2keyword(args) {\n return rgb2keyword(hsv2rgb(args));\n }\n\n // http://dev.w3.org/csswg/css-color/#hwb-to-rgb\n function hwb2rgb(hwb) {\n var h = hwb[0] / 360,\n wh = hwb[1] / 100,\n bl = hwb[2] / 100,\n ratio = wh + bl,\n i,\n v,\n f,\n n;\n\n // wh + bl cant be > 1\n if (ratio > 1) {\n wh /= ratio;\n bl /= ratio;\n }\n i = Math.floor(6 * h);\n v = 1 - bl;\n f = 6 * h - i;\n if ((i & 0x01) != 0) {\n f = 1 - f;\n }\n n = wh + f * (v - wh); // linear interpolation\n\n switch (i) {\n default:\n case 6:\n case 0:\n r = v;\n g = n;\n b = wh;\n break;\n case 1:\n r = n;\n g = v;\n b = wh;\n break;\n case 2:\n r = wh;\n g = v;\n b = n;\n break;\n case 3:\n r = wh;\n g = n;\n b = v;\n break;\n case 4:\n r = n;\n g = wh;\n b = v;\n break;\n case 5:\n r = v;\n g = wh;\n b = n;\n break;\n }\n return [r * 255, g * 255, b * 255];\n }\n function hwb2hsl(args) {\n return rgb2hsl(hwb2rgb(args));\n }\n function hwb2hsv(args) {\n return rgb2hsv(hwb2rgb(args));\n }\n function hwb2cmyk(args) {\n return rgb2cmyk(hwb2rgb(args));\n }\n function hwb2keyword(args) {\n return rgb2keyword(hwb2rgb(args));\n }\n function cmyk2rgb(cmyk) {\n var c = cmyk[0] / 100,\n m = cmyk[1] / 100,\n y = cmyk[2] / 100,\n k = cmyk[3] / 100,\n r,\n g,\n b;\n r = 1 - Math.min(1, c * (1 - k) + k);\n g = 1 - Math.min(1, m * (1 - k) + k);\n b = 1 - Math.min(1, y * (1 - k) + k);\n return [r * 255, g * 255, b * 255];\n }\n function cmyk2hsl(args) {\n return rgb2hsl(cmyk2rgb(args));\n }\n function cmyk2hsv(args) {\n return rgb2hsv(cmyk2rgb(args));\n }\n function cmyk2hwb(args) {\n return rgb2hwb(cmyk2rgb(args));\n }\n function cmyk2keyword(args) {\n return rgb2keyword(cmyk2rgb(args));\n }\n function xyz2rgb(xyz) {\n var x = xyz[0] / 100,\n y = xyz[1] / 100,\n z = xyz[2] / 100,\n r,\n g,\n b;\n r = x * 3.2406 + y * -1.5372 + z * -0.4986;\n g = x * -0.9689 + y * 1.8758 + z * 0.0415;\n b = x * 0.0557 + y * -0.2040 + z * 1.0570;\n\n // assume sRGB\n r = r > 0.0031308 ? 1.055 * Math.pow(r, 1.0 / 2.4) - 0.055 : r = r * 12.92;\n g = g > 0.0031308 ? 1.055 * Math.pow(g, 1.0 / 2.4) - 0.055 : g = g * 12.92;\n b = b > 0.0031308 ? 1.055 * Math.pow(b, 1.0 / 2.4) - 0.055 : b = b * 12.92;\n r = Math.min(Math.max(0, r), 1);\n g = Math.min(Math.max(0, g), 1);\n b = Math.min(Math.max(0, b), 1);\n return [r * 255, g * 255, b * 255];\n }\n function xyz2lab(xyz) {\n var x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l,\n a,\n b;\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;\n y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;\n z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;\n l = 116 * y - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n return [l, a, b];\n }\n function xyz2lch(args) {\n return lab2lch(xyz2lab(args));\n }\n function lab2xyz(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n x,\n y,\n z,\n y2;\n if (l <= 8) {\n y = l * 100 / 903.3;\n y2 = 7.787 * (y / 100) + 16 / 116;\n } else {\n y = 100 * Math.pow((l + 16) / 116, 3);\n y2 = Math.pow(y / 100, 1 / 3);\n }\n x = x / 95.047 <= 0.008856 ? x = 95.047 * (a / 500 + y2 - 16 / 116) / 7.787 : 95.047 * Math.pow(a / 500 + y2, 3);\n z = z / 108.883 <= 0.008859 ? z = 108.883 * (y2 - b / 200 - 16 / 116) / 7.787 : 108.883 * Math.pow(y2 - b / 200, 3);\n return [x, y, z];\n }\n function lab2lch(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n hr,\n h,\n c;\n hr = Math.atan2(b, a);\n h = hr * 360 / 2 / Math.PI;\n if (h < 0) {\n h += 360;\n }\n c = Math.sqrt(a * a + b * b);\n return [l, c, h];\n }\n function lab2rgb(args) {\n return xyz2rgb(lab2xyz(args));\n }\n function lch2lab(lch) {\n var l = lch[0],\n c = lch[1],\n h = lch[2],\n a,\n b,\n hr;\n hr = h / 360 * 2 * Math.PI;\n a = c * Math.cos(hr);\n b = c * Math.sin(hr);\n return [l, a, b];\n }\n function lch2xyz(args) {\n return lab2xyz(lch2lab(args));\n }\n function lch2rgb(args) {\n return lab2rgb(lch2lab(args));\n }\n function keyword2rgb(keyword) {\n return cssKeywords[keyword];\n }\n function keyword2hsl(args) {\n return rgb2hsl(keyword2rgb(args));\n }\n function keyword2hsv(args) {\n return rgb2hsv(keyword2rgb(args));\n }\n function keyword2hwb(args) {\n return rgb2hwb(keyword2rgb(args));\n }\n function keyword2cmyk(args) {\n return rgb2cmyk(keyword2rgb(args));\n }\n function keyword2lab(args) {\n return rgb2lab(keyword2rgb(args));\n }\n function keyword2xyz(args) {\n return rgb2xyz(keyword2rgb(args));\n }\n var cssKeywords = {\n aliceblue: [240, 248, 255],\n antiquewhite: [250, 235, 215],\n aqua: [0, 255, 255],\n aquamarine: [127, 255, 212],\n azure: [240, 255, 255],\n beige: [245, 245, 220],\n bisque: [255, 228, 196],\n black: [0, 0, 0],\n blanchedalmond: [255, 235, 205],\n blue: [0, 0, 255],\n blueviolet: [138, 43, 226],\n brown: [165, 42, 42],\n burlywood: [222, 184, 135],\n cadetblue: [95, 158, 160],\n chartreuse: [127, 255, 0],\n chocolate: [210, 105, 30],\n coral: [255, 127, 80],\n cornflowerblue: [100, 149, 237],\n cornsilk: [255, 248, 220],\n crimson: [220, 20, 60],\n cyan: [0, 255, 255],\n darkblue: [0, 0, 139],\n darkcyan: [0, 139, 139],\n darkgoldenrod: [184, 134, 11],\n darkgray: [169, 169, 169],\n darkgreen: [0, 100, 0],\n darkgrey: [169, 169, 169],\n darkkhaki: [189, 183, 107],\n darkmagenta: [139, 0, 139],\n darkolivegreen: [85, 107, 47],\n darkorange: [255, 140, 0],\n darkorchid: [153, 50, 204],\n darkred: [139, 0, 0],\n darksalmon: [233, 150, 122],\n darkseagreen: [143, 188, 143],\n darkslateblue: [72, 61, 139],\n darkslategray: [47, 79, 79],\n darkslategrey: [47, 79, 79],\n darkturquoise: [0, 206, 209],\n darkviolet: [148, 0, 211],\n deeppink: [255, 20, 147],\n deepskyblue: [0, 191, 255],\n dimgray: [105, 105, 105],\n dimgrey: [105, 105, 105],\n dodgerblue: [30, 144, 255],\n firebrick: [178, 34, 34],\n floralwhite: [255, 250, 240],\n forestgreen: [34, 139, 34],\n fuchsia: [255, 0, 255],\n gainsboro: [220, 220, 220],\n ghostwhite: [248, 248, 255],\n gold: [255, 215, 0],\n goldenrod: [218, 165, 32],\n gray: [128, 128, 128],\n green: [0, 128, 0],\n greenyellow: [173, 255, 47],\n grey: [128, 128, 128],\n honeydew: [240, 255, 240],\n hotpink: [255, 105, 180],\n indianred: [205, 92, 92],\n indigo: [75, 0, 130],\n ivory: [255, 255, 240],\n khaki: [240, 230, 140],\n lavender: [230, 230, 250],\n lavenderblush: [255, 240, 245],\n lawngreen: [124, 252, 0],\n lemonchiffon: [255, 250, 205],\n lightblue: [173, 216, 230],\n lightcoral: [240, 128, 128],\n lightcyan: [224, 255, 255],\n lightgoldenrodyellow: [250, 250, 210],\n lightgray: [211, 211, 211],\n lightgreen: [144, 238, 144],\n lightgrey: [211, 211, 211],\n lightpink: [255, 182, 193],\n lightsalmon: [255, 160, 122],\n lightseagreen: [32, 178, 170],\n lightskyblue: [135, 206, 250],\n lightslategray: [119, 136, 153],\n lightslategrey: [119, 136, 153],\n lightsteelblue: [176, 196, 222],\n lightyellow: [255, 255, 224],\n lime: [0, 255, 0],\n limegreen: [50, 205, 50],\n linen: [250, 240, 230],\n magenta: [255, 0, 255],\n maroon: [128, 0, 0],\n mediumaquamarine: [102, 205, 170],\n mediumblue: [0, 0, 205],\n mediumorchid: [186, 85, 211],\n mediumpurple: [147, 112, 219],\n mediumseagreen: [60, 179, 113],\n mediumslateblue: [123, 104, 238],\n mediumspringgreen: [0, 250, 154],\n mediumturquoise: [72, 209, 204],\n mediumvioletred: [199, 21, 133],\n midnightblue: [25, 25, 112],\n mintcream: [245, 255, 250],\n mistyrose: [255, 228, 225],\n moccasin: [255, 228, 181],\n navajowhite: [255, 222, 173],\n navy: [0, 0, 128],\n oldlace: [253, 245, 230],\n olive: [128, 128, 0],\n olivedrab: [107, 142, 35],\n orange: [255, 165, 0],\n orangered: [255, 69, 0],\n orchid: [218, 112, 214],\n palegoldenrod: [238, 232, 170],\n palegreen: [152, 251, 152],\n paleturquoise: [175, 238, 238],\n palevioletred: [219, 112, 147],\n papayawhip: [255, 239, 213],\n peachpuff: [255, 218, 185],\n peru: [205, 133, 63],\n pink: [255, 192, 203],\n plum: [221, 160, 221],\n powderblue: [176, 224, 230],\n purple: [128, 0, 128],\n rebeccapurple: [102, 51, 153],\n red: [255, 0, 0],\n rosybrown: [188, 143, 143],\n royalblue: [65, 105, 225],\n saddlebrown: [139, 69, 19],\n salmon: [250, 128, 114],\n sandybrown: [244, 164, 96],\n seagreen: [46, 139, 87],\n seashell: [255, 245, 238],\n sienna: [160, 82, 45],\n silver: [192, 192, 192],\n skyblue: [135, 206, 235],\n slateblue: [106, 90, 205],\n slategray: [112, 128, 144],\n slategrey: [112, 128, 144],\n snow: [255, 250, 250],\n springgreen: [0, 255, 127],\n steelblue: [70, 130, 180],\n tan: [210, 180, 140],\n teal: [0, 128, 128],\n thistle: [216, 191, 216],\n tomato: [255, 99, 71],\n turquoise: [64, 224, 208],\n violet: [238, 130, 238],\n wheat: [245, 222, 179],\n white: [255, 255, 255],\n whitesmoke: [245, 245, 245],\n yellow: [255, 255, 0],\n yellowgreen: [154, 205, 50]\n };\n var reverseKeywords = {};\n for (var key in cssKeywords) {\n reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n }\n var convert = function convert() {\n return new Converter();\n };\n for (var func in conversions) {\n // export Raw versions\n convert[func + \"Raw\"] = function (func) {\n // accept array or plain args\n return function (arg) {\n if (typeof arg == \"number\") arg = Array.prototype.slice.call(arguments);\n return conversions[func](arg);\n };\n }(func);\n var pair = /(\\w+)2(\\w+)/.exec(func),\n from = pair[1],\n to = pair[2];\n\n // export rgb2hsl and [\"rgb\"][\"hsl\"]\n convert[from] = convert[from] || {};\n convert[from][to] = convert[func] = function (func) {\n return function (arg) {\n if (typeof arg == \"number\") arg = Array.prototype.slice.call(arguments);\n var val = conversions[func](arg);\n if (typeof val == \"string\" || val === undefined) return val; // keyword\n\n for (var i = 0; i < val.length; i++) val[i] = Math.round(val[i]);\n return val;\n };\n }(func);\n }\n\n /* Converter does lazy conversion and caching */\n var Converter = function Converter() {\n this.convs = {};\n };\n\n /* Either get the values for a space or\n set the values for a space, depending on args */\n Converter.prototype.routeSpace = function (space, args) {\n var values = args[0];\n if (values === undefined) {\n // color.rgb()\n return this.getValues(space);\n }\n // color.rgb(10, 10, 10)\n if (typeof values == \"number\") {\n values = Array.prototype.slice.call(args);\n }\n return this.setValues(space, values);\n };\n\n /* Set the values for a space, invalidating cache */\n Converter.prototype.setValues = function (space, values) {\n this.space = space;\n this.convs = {};\n this.convs[space] = values;\n return this;\n };\n\n /* Get the values for a space. If there's already\n a conversion for the space, fetch it, otherwise\n compute it */\n Converter.prototype.getValues = function (space) {\n var vals = this.convs[space];\n if (!vals) {\n var fspace = this.space,\n from = this.convs[fspace];\n vals = convert[fspace][space](from);\n this.convs[space] = vals;\n }\n return vals;\n };\n [\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function (space) {\n Converter.prototype[space] = function (vals) {\n return this.routeSpace(space, arguments);\n };\n });\n var colorConvert = convert;\n var colorName = {\n \"aliceblue\": [240, 248, 255],\n \"antiquewhite\": [250, 235, 215],\n \"aqua\": [0, 255, 255],\n \"aquamarine\": [127, 255, 212],\n \"azure\": [240, 255, 255],\n \"beige\": [245, 245, 220],\n \"bisque\": [255, 228, 196],\n \"black\": [0, 0, 0],\n \"blanchedalmond\": [255, 235, 205],\n \"blue\": [0, 0, 255],\n \"blueviolet\": [138, 43, 226],\n \"brown\": [165, 42, 42],\n \"burlywood\": [222, 184, 135],\n \"cadetblue\": [95, 158, 160],\n \"chartreuse\": [127, 255, 0],\n \"chocolate\": [210, 105, 30],\n \"coral\": [255, 127, 80],\n \"cornflowerblue\": [100, 149, 237],\n \"cornsilk\": [255, 248, 220],\n \"crimson\": [220, 20, 60],\n \"cyan\": [0, 255, 255],\n \"darkblue\": [0, 0, 139],\n \"darkcyan\": [0, 139, 139],\n \"darkgoldenrod\": [184, 134, 11],\n \"darkgray\": [169, 169, 169],\n \"darkgreen\": [0, 100, 0],\n \"darkgrey\": [169, 169, 169],\n \"darkkhaki\": [189, 183, 107],\n \"darkmagenta\": [139, 0, 139],\n \"darkolivegreen\": [85, 107, 47],\n \"darkorange\": [255, 140, 0],\n \"darkorchid\": [153, 50, 204],\n \"darkred\": [139, 0, 0],\n \"darksalmon\": [233, 150, 122],\n \"darkseagreen\": [143, 188, 143],\n \"darkslateblue\": [72, 61, 139],\n \"darkslategray\": [47, 79, 79],\n \"darkslategrey\": [47, 79, 79],\n \"darkturquoise\": [0, 206, 209],\n \"darkviolet\": [148, 0, 211],\n \"deeppink\": [255, 20, 147],\n \"deepskyblue\": [0, 191, 255],\n \"dimgray\": [105, 105, 105],\n \"dimgrey\": [105, 105, 105],\n \"dodgerblue\": [30, 144, 255],\n \"firebrick\": [178, 34, 34],\n \"floralwhite\": [255, 250, 240],\n \"forestgreen\": [34, 139, 34],\n \"fuchsia\": [255, 0, 255],\n \"gainsboro\": [220, 220, 220],\n \"ghostwhite\": [248, 248, 255],\n \"gold\": [255, 215, 0],\n \"goldenrod\": [218, 165, 32],\n \"gray\": [128, 128, 128],\n \"green\": [0, 128, 0],\n \"greenyellow\": [173, 255, 47],\n \"grey\": [128, 128, 128],\n \"honeydew\": [240, 255, 240],\n \"hotpink\": [255, 105, 180],\n \"indianred\": [205, 92, 92],\n \"indigo\": [75, 0, 130],\n \"ivory\": [255, 255, 240],\n \"khaki\": [240, 230, 140],\n \"lavender\": [230, 230, 250],\n \"lavenderblush\": [255, 240, 245],\n \"lawngreen\": [124, 252, 0],\n \"lemonchiffon\": [255, 250, 205],\n \"lightblue\": [173, 216, 230],\n \"lightcoral\": [240, 128, 128],\n \"lightcyan\": [224, 255, 255],\n \"lightgoldenrodyellow\": [250, 250, 210],\n \"lightgray\": [211, 211, 211],\n \"lightgreen\": [144, 238, 144],\n \"lightgrey\": [211, 211, 211],\n \"lightpink\": [255, 182, 193],\n \"lightsalmon\": [255, 160, 122],\n \"lightseagreen\": [32, 178, 170],\n \"lightskyblue\": [135, 206, 250],\n \"lightslategray\": [119, 136, 153],\n \"lightslategrey\": [119, 136, 153],\n \"lightsteelblue\": [176, 196, 222],\n \"lightyellow\": [255, 255, 224],\n \"lime\": [0, 255, 0],\n \"limegreen\": [50, 205, 50],\n \"linen\": [250, 240, 230],\n \"magenta\": [255, 0, 255],\n \"maroon\": [128, 0, 0],\n \"mediumaquamarine\": [102, 205, 170],\n \"mediumblue\": [0, 0, 205],\n \"mediumorchid\": [186, 85, 211],\n \"mediumpurple\": [147, 112, 219],\n \"mediumseagreen\": [60, 179, 113],\n \"mediumslateblue\": [123, 104, 238],\n \"mediumspringgreen\": [0, 250, 154],\n \"mediumturquoise\": [72, 209, 204],\n \"mediumvioletred\": [199, 21, 133],\n \"midnightblue\": [25, 25, 112],\n \"mintcream\": [245, 255, 250],\n \"mistyrose\": [255, 228, 225],\n \"moccasin\": [255, 228, 181],\n \"navajowhite\": [255, 222, 173],\n \"navy\": [0, 0, 128],\n \"oldlace\": [253, 245, 230],\n \"olive\": [128, 128, 0],\n \"olivedrab\": [107, 142, 35],\n \"orange\": [255, 165, 0],\n \"orangered\": [255, 69, 0],\n \"orchid\": [218, 112, 214],\n \"palegoldenrod\": [238, 232, 170],\n \"palegreen\": [152, 251, 152],\n \"paleturquoise\": [175, 238, 238],\n \"palevioletred\": [219, 112, 147],\n \"papayawhip\": [255, 239, 213],\n \"peachpuff\": [255, 218, 185],\n \"peru\": [205, 133, 63],\n \"pink\": [255, 192, 203],\n \"plum\": [221, 160, 221],\n \"powderblue\": [176, 224, 230],\n \"purple\": [128, 0, 128],\n \"rebeccapurple\": [102, 51, 153],\n \"red\": [255, 0, 0],\n \"rosybrown\": [188, 143, 143],\n \"royalblue\": [65, 105, 225],\n \"saddlebrown\": [139, 69, 19],\n \"salmon\": [250, 128, 114],\n \"sandybrown\": [244, 164, 96],\n \"seagreen\": [46, 139, 87],\n \"seashell\": [255, 245, 238],\n \"sienna\": [160, 82, 45],\n \"silver\": [192, 192, 192],\n \"skyblue\": [135, 206, 235],\n \"slateblue\": [106, 90, 205],\n \"slategray\": [112, 128, 144],\n \"slategrey\": [112, 128, 144],\n \"snow\": [255, 250, 250],\n \"springgreen\": [0, 255, 127],\n \"steelblue\": [70, 130, 180],\n \"tan\": [210, 180, 140],\n \"teal\": [0, 128, 128],\n \"thistle\": [216, 191, 216],\n \"tomato\": [255, 99, 71],\n \"turquoise\": [64, 224, 208],\n \"violet\": [238, 130, 238],\n \"wheat\": [245, 222, 179],\n \"white\": [255, 255, 255],\n \"whitesmoke\": [245, 245, 245],\n \"yellow\": [255, 255, 0],\n \"yellowgreen\": [154, 205, 50]\n };\n\n /* MIT license */\n\n var colorString = {\n getRgba: getRgba,\n getHsla: getHsla,\n getRgb: getRgb,\n getHsl: getHsl,\n getHwb: getHwb,\n getAlpha: getAlpha,\n hexString: hexString,\n rgbString: rgbString,\n rgbaString: rgbaString,\n percentString: percentString,\n percentaString: percentaString,\n hslString: hslString,\n hslaString: hslaString,\n hwbString: hwbString,\n keyword: keyword\n };\n function getRgba(string) {\n if (!string) {\n return;\n }\n var abbr = /^#([a-fA-F0-9]{3,4})$/i,\n hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i,\n rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n keyword = /(\\w+)/;\n var rgb = [0, 0, 0],\n a = 1,\n match = string.match(abbr),\n hexAlpha = \"\";\n if (match) {\n match = match[1];\n hexAlpha = match[3];\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = parseInt(match[i] + match[i], 16);\n }\n if (hexAlpha) {\n a = Math.round(parseInt(hexAlpha + hexAlpha, 16) / 255 * 100) / 100;\n }\n } else if (match = string.match(hex)) {\n hexAlpha = match[2];\n match = match[1];\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n }\n if (hexAlpha) {\n a = Math.round(parseInt(hexAlpha, 16) / 255 * 100) / 100;\n }\n } else if (match = string.match(rgba)) {\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = parseInt(match[i + 1]);\n }\n a = parseFloat(match[4]);\n } else if (match = string.match(per)) {\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n }\n a = parseFloat(match[4]);\n } else if (match = string.match(keyword)) {\n if (match[1] == \"transparent\") {\n return [0, 0, 0, 0];\n }\n rgb = colorName[match[1]];\n if (!rgb) {\n return;\n }\n }\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = scale(rgb[i], 0, 255);\n }\n if (!a && a != 0) {\n a = 1;\n } else {\n a = scale(a, 0, 1);\n }\n rgb[3] = a;\n return rgb;\n }\n function getHsla(string) {\n if (!string) {\n return;\n }\n var hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n var match = string.match(hsl);\n if (match) {\n var alpha = parseFloat(match[4]);\n var h = scale(parseInt(match[1]), 0, 360),\n s = scale(parseFloat(match[2]), 0, 100),\n l = scale(parseFloat(match[3]), 0, 100),\n a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n return [h, s, l, a];\n }\n }\n function getHwb(string) {\n if (!string) {\n return;\n }\n var hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n var match = string.match(hwb);\n if (match) {\n var alpha = parseFloat(match[4]);\n var h = scale(parseInt(match[1]), 0, 360),\n w = scale(parseFloat(match[2]), 0, 100),\n b = scale(parseFloat(match[3]), 0, 100),\n a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n return [h, w, b, a];\n }\n }\n function getRgb(string) {\n var rgba = getRgba(string);\n return rgba && rgba.slice(0, 3);\n }\n function getHsl(string) {\n var hsla = getHsla(string);\n return hsla && hsla.slice(0, 3);\n }\n function getAlpha(string) {\n var vals = getRgba(string);\n if (vals) {\n return vals[3];\n } else if (vals = getHsla(string)) {\n return vals[3];\n } else if (vals = getHwb(string)) {\n return vals[3];\n }\n }\n\n // generators\n function hexString(rgba, a) {\n var a = a !== undefined && rgba.length === 3 ? a : rgba[3];\n return \"#\" + hexDouble(rgba[0]) + hexDouble(rgba[1]) + hexDouble(rgba[2]) + (a >= 0 && a < 1 ? hexDouble(Math.round(a * 255)) : \"\");\n }\n function rgbString(rgba, alpha) {\n if (alpha < 1 || rgba[3] && rgba[3] < 1) {\n return rgbaString(rgba, alpha);\n }\n return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n }\n function rgbaString(rgba, alpha) {\n if (alpha === undefined) {\n alpha = rgba[3] !== undefined ? rgba[3] : 1;\n }\n return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \", \" + alpha + \")\";\n }\n function percentString(rgba, alpha) {\n if (alpha < 1 || rgba[3] && rgba[3] < 1) {\n return percentaString(rgba, alpha);\n }\n var r = Math.round(rgba[0] / 255 * 100),\n g = Math.round(rgba[1] / 255 * 100),\n b = Math.round(rgba[2] / 255 * 100);\n return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n }\n function percentaString(rgba, alpha) {\n var r = Math.round(rgba[0] / 255 * 100),\n g = Math.round(rgba[1] / 255 * 100),\n b = Math.round(rgba[2] / 255 * 100);\n return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n }\n function hslString(hsla, alpha) {\n if (alpha < 1 || hsla[3] && hsla[3] < 1) {\n return hslaString(hsla, alpha);\n }\n return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n }\n function hslaString(hsla, alpha) {\n if (alpha === undefined) {\n alpha = hsla[3] !== undefined ? hsla[3] : 1;\n }\n return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \" + alpha + \")\";\n }\n\n // hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n // (hwb have alpha optional & 1 is default value)\n function hwbString(hwb, alpha) {\n if (alpha === undefined) {\n alpha = hwb[3] !== undefined ? hwb[3] : 1;\n }\n return \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\" + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n }\n function keyword(rgb) {\n return reverseNames[rgb.slice(0, 3)];\n }\n\n // helpers\n function scale(num, min, max) {\n return Math.min(Math.max(min, num), max);\n }\n function hexDouble(num) {\n var str = num.toString(16).toUpperCase();\n return str.length < 2 ? \"0\" + str : str;\n }\n\n //create a list of reverse color names\n var reverseNames = {};\n for (var name in colorName) {\n reverseNames[colorName[name]] = name;\n }\n\n /* MIT license */\n\n var Color = function Color(obj) {\n if (obj instanceof Color) {\n return obj;\n }\n if (!(this instanceof Color)) {\n return new Color(obj);\n }\n this.valid = false;\n this.values = {\n rgb: [0, 0, 0],\n hsl: [0, 0, 0],\n hsv: [0, 0, 0],\n hwb: [0, 0, 0],\n cmyk: [0, 0, 0, 0],\n alpha: 1\n };\n\n // parse Color() argument\n var vals;\n if (typeof obj === 'string') {\n vals = colorString.getRgba(obj);\n if (vals) {\n this.setValues('rgb', vals);\n } else if (vals = colorString.getHsla(obj)) {\n this.setValues('hsl', vals);\n } else if (vals = colorString.getHwb(obj)) {\n this.setValues('hwb', vals);\n }\n } else if (_typeof(obj) === 'object') {\n vals = obj;\n if (vals.r !== undefined || vals.red !== undefined) {\n this.setValues('rgb', vals);\n } else if (vals.l !== undefined || vals.lightness !== undefined) {\n this.setValues('hsl', vals);\n } else if (vals.v !== undefined || vals.value !== undefined) {\n this.setValues('hsv', vals);\n } else if (vals.w !== undefined || vals.whiteness !== undefined) {\n this.setValues('hwb', vals);\n } else if (vals.c !== undefined || vals.cyan !== undefined) {\n this.setValues('cmyk', vals);\n }\n }\n };\n Color.prototype = {\n isValid: function isValid() {\n return this.valid;\n },\n rgb: function rgb() {\n return this.setSpace('rgb', arguments);\n },\n hsl: function hsl() {\n return this.setSpace('hsl', arguments);\n },\n hsv: function hsv() {\n return this.setSpace('hsv', arguments);\n },\n hwb: function hwb() {\n return this.setSpace('hwb', arguments);\n },\n cmyk: function cmyk() {\n return this.setSpace('cmyk', arguments);\n },\n rgbArray: function rgbArray() {\n return this.values.rgb;\n },\n hslArray: function hslArray() {\n return this.values.hsl;\n },\n hsvArray: function hsvArray() {\n return this.values.hsv;\n },\n hwbArray: function hwbArray() {\n var values = this.values;\n if (values.alpha !== 1) {\n return values.hwb.concat([values.alpha]);\n }\n return values.hwb;\n },\n cmykArray: function cmykArray() {\n return this.values.cmyk;\n },\n rgbaArray: function rgbaArray() {\n var values = this.values;\n return values.rgb.concat([values.alpha]);\n },\n hslaArray: function hslaArray() {\n var values = this.values;\n return values.hsl.concat([values.alpha]);\n },\n alpha: function alpha(val) {\n if (val === undefined) {\n return this.values.alpha;\n }\n this.setValues('alpha', val);\n return this;\n },\n red: function red(val) {\n return this.setChannel('rgb', 0, val);\n },\n green: function green(val) {\n return this.setChannel('rgb', 1, val);\n },\n blue: function blue(val) {\n return this.setChannel('rgb', 2, val);\n },\n hue: function hue(val) {\n if (val) {\n val %= 360;\n val = val < 0 ? 360 + val : val;\n }\n return this.setChannel('hsl', 0, val);\n },\n saturation: function saturation(val) {\n return this.setChannel('hsl', 1, val);\n },\n lightness: function lightness(val) {\n return this.setChannel('hsl', 2, val);\n },\n saturationv: function saturationv(val) {\n return this.setChannel('hsv', 1, val);\n },\n whiteness: function whiteness(val) {\n return this.setChannel('hwb', 1, val);\n },\n blackness: function blackness(val) {\n return this.setChannel('hwb', 2, val);\n },\n value: function value(val) {\n return this.setChannel('hsv', 2, val);\n },\n cyan: function cyan(val) {\n return this.setChannel('cmyk', 0, val);\n },\n magenta: function magenta(val) {\n return this.setChannel('cmyk', 1, val);\n },\n yellow: function yellow(val) {\n return this.setChannel('cmyk', 2, val);\n },\n black: function black(val) {\n return this.setChannel('cmyk', 3, val);\n },\n hexString: function hexString() {\n return colorString.hexString(this.values.rgb);\n },\n rgbString: function rgbString() {\n return colorString.rgbString(this.values.rgb, this.values.alpha);\n },\n rgbaString: function rgbaString() {\n return colorString.rgbaString(this.values.rgb, this.values.alpha);\n },\n percentString: function percentString() {\n return colorString.percentString(this.values.rgb, this.values.alpha);\n },\n hslString: function hslString() {\n return colorString.hslString(this.values.hsl, this.values.alpha);\n },\n hslaString: function hslaString() {\n return colorString.hslaString(this.values.hsl, this.values.alpha);\n },\n hwbString: function hwbString() {\n return colorString.hwbString(this.values.hwb, this.values.alpha);\n },\n keyword: function keyword() {\n return colorString.keyword(this.values.rgb, this.values.alpha);\n },\n rgbNumber: function rgbNumber() {\n var rgb = this.values.rgb;\n return rgb[0] << 16 | rgb[1] << 8 | rgb[2];\n },\n luminosity: function luminosity() {\n // http://www.w3.org/TR/WCAG20/#relativeluminancedef\n var rgb = this.values.rgb;\n var lum = [];\n for (var i = 0; i < rgb.length; i++) {\n var chan = rgb[i] / 255;\n lum[i] = chan <= 0.03928 ? chan / 12.92 : Math.pow((chan + 0.055) / 1.055, 2.4);\n }\n return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n },\n contrast: function contrast(color2) {\n // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n var lum1 = this.luminosity();\n var lum2 = color2.luminosity();\n if (lum1 > lum2) {\n return (lum1 + 0.05) / (lum2 + 0.05);\n }\n return (lum2 + 0.05) / (lum1 + 0.05);\n },\n level: function level(color2) {\n var contrastRatio = this.contrast(color2);\n if (contrastRatio >= 7.1) {\n return 'AAA';\n }\n return contrastRatio >= 4.5 ? 'AA' : '';\n },\n dark: function dark() {\n // YIQ equation from http://24ways.org/2010/calculating-color-contrast\n var rgb = this.values.rgb;\n var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n return yiq < 128;\n },\n light: function light() {\n return !this.dark();\n },\n negate: function negate() {\n var rgb = [];\n for (var i = 0; i < 3; i++) {\n rgb[i] = 255 - this.values.rgb[i];\n }\n this.setValues('rgb', rgb);\n return this;\n },\n lighten: function lighten(ratio) {\n var hsl = this.values.hsl;\n hsl[2] += hsl[2] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n darken: function darken(ratio) {\n var hsl = this.values.hsl;\n hsl[2] -= hsl[2] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n saturate: function saturate(ratio) {\n var hsl = this.values.hsl;\n hsl[1] += hsl[1] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n desaturate: function desaturate(ratio) {\n var hsl = this.values.hsl;\n hsl[1] -= hsl[1] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n whiten: function whiten(ratio) {\n var hwb = this.values.hwb;\n hwb[1] += hwb[1] * ratio;\n this.setValues('hwb', hwb);\n return this;\n },\n blacken: function blacken(ratio) {\n var hwb = this.values.hwb;\n hwb[2] += hwb[2] * ratio;\n this.setValues('hwb', hwb);\n return this;\n },\n greyscale: function greyscale() {\n var rgb = this.values.rgb;\n // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n this.setValues('rgb', [val, val, val]);\n return this;\n },\n clearer: function clearer(ratio) {\n var alpha = this.values.alpha;\n this.setValues('alpha', alpha - alpha * ratio);\n return this;\n },\n opaquer: function opaquer(ratio) {\n var alpha = this.values.alpha;\n this.setValues('alpha', alpha + alpha * ratio);\n return this;\n },\n rotate: function rotate(degrees) {\n var hsl = this.values.hsl;\n var hue = (hsl[0] + degrees) % 360;\n hsl[0] = hue < 0 ? 360 + hue : hue;\n this.setValues('hsl', hsl);\n return this;\n },\n /**\n * Ported from sass implementation in C\n * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n */\n mix: function mix(mixinColor, weight) {\n var color1 = this;\n var color2 = mixinColor;\n var p = weight === undefined ? 0.5 : weight;\n var w = 2 * p - 1;\n var a = color1.alpha() - color2.alpha();\n var w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n var w2 = 1 - w1;\n return this.rgb(w1 * color1.red() + w2 * color2.red(), w1 * color1.green() + w2 * color2.green(), w1 * color1.blue() + w2 * color2.blue()).alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n },\n toJSON: function toJSON() {\n return this.rgb();\n },\n clone: function clone() {\n // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n // making the final build way to big to embed in Chart.js. So let's do it manually,\n // assuming that values to clone are 1 dimension arrays containing only numbers,\n // except 'alpha' which is a number.\n var result = new Color();\n var source = this.values;\n var target = result.values;\n var value, type;\n for (var prop in source) {\n if (source.hasOwnProperty(prop)) {\n value = source[prop];\n type = {}.toString.call(value);\n if (type === '[object Array]') {\n target[prop] = value.slice(0);\n } else if (type === '[object Number]') {\n target[prop] = value;\n } else {\n console.error('unexpected color value:', value);\n }\n }\n }\n return result;\n }\n };\n Color.prototype.spaces = {\n rgb: ['red', 'green', 'blue'],\n hsl: ['hue', 'saturation', 'lightness'],\n hsv: ['hue', 'saturation', 'value'],\n hwb: ['hue', 'whiteness', 'blackness'],\n cmyk: ['cyan', 'magenta', 'yellow', 'black']\n };\n Color.prototype.maxes = {\n rgb: [255, 255, 255],\n hsl: [360, 100, 100],\n hsv: [360, 100, 100],\n hwb: [360, 100, 100],\n cmyk: [100, 100, 100, 100]\n };\n Color.prototype.getValues = function (space) {\n var values = this.values;\n var vals = {};\n for (var i = 0; i < space.length; i++) {\n vals[space.charAt(i)] = values[space][i];\n }\n if (values.alpha !== 1) {\n vals.a = values.alpha;\n }\n\n // {r: 255, g: 255, b: 255, a: 0.4}\n return vals;\n };\n Color.prototype.setValues = function (space, vals) {\n var values = this.values;\n var spaces = this.spaces;\n var maxes = this.maxes;\n var alpha = 1;\n var i;\n this.valid = true;\n if (space === 'alpha') {\n alpha = vals;\n } else if (vals.length) {\n // [10, 10, 10]\n values[space] = vals.slice(0, space.length);\n alpha = vals[space.length];\n } else if (vals[space.charAt(0)] !== undefined) {\n // {r: 10, g: 10, b: 10}\n for (i = 0; i < space.length; i++) {\n values[space][i] = vals[space.charAt(i)];\n }\n alpha = vals.a;\n } else if (vals[spaces[space][0]] !== undefined) {\n // {red: 10, green: 10, blue: 10}\n var chans = spaces[space];\n for (i = 0; i < space.length; i++) {\n values[space][i] = vals[chans[i]];\n }\n alpha = vals.alpha;\n }\n values.alpha = Math.max(0, Math.min(1, alpha === undefined ? values.alpha : alpha));\n if (space === 'alpha') {\n return false;\n }\n var capped;\n\n // cap values of the space prior converting all values\n for (i = 0; i < space.length; i++) {\n capped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n values[space][i] = Math.round(capped);\n }\n\n // convert to all the other color spaces\n for (var sname in spaces) {\n if (sname !== space) {\n values[sname] = colorConvert[space][sname](values[space]);\n }\n }\n return true;\n };\n Color.prototype.setSpace = function (space, args) {\n var vals = args[0];\n if (vals === undefined) {\n // color.rgb()\n return this.getValues(space);\n }\n\n // color.rgb(10, 10, 10)\n if (typeof vals === 'number') {\n vals = Array.prototype.slice.call(args);\n }\n this.setValues(space, vals);\n return this;\n };\n Color.prototype.setChannel = function (space, index, val) {\n var svalues = this.values[space];\n if (val === undefined) {\n // color.red()\n return svalues[index];\n } else if (val === svalues[index]) {\n // color.red(color.red())\n return this;\n }\n\n // color.red(100)\n svalues[index] = val;\n this.setValues(space, svalues);\n return this;\n };\n if (typeof window !== 'undefined') {\n window.Color = Color;\n }\n var chartjsColor = Color;\n\n /**\n * @namespace Chart.helpers\n */\n var helpers = {\n /**\n * An empty function that can be used, for example, for optional callback.\n */\n noop: function noop() {},\n /**\n * Returns a unique id, sequentially generated from a global variable.\n * @returns {number}\n * @function\n */\n uid: function () {\n var id = 0;\n return function () {\n return id++;\n };\n }(),\n /**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param {*} value - The value to test.\n * @returns {boolean}\n * @since 2.7.0\n */\n isNullOrUndef: function isNullOrUndef(value) {\n return value === null || typeof value === 'undefined';\n },\n /**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param {*} value - The value to test.\n * @returns {boolean}\n * @function\n */\n isArray: function isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n var type = Object.prototype.toString.call(value);\n if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {\n return true;\n }\n return false;\n },\n /**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param {*} value - The value to test.\n * @returns {boolean}\n * @since 2.7.0\n */\n isObject: function isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n },\n /**\n * Returns true if `value` is a finite number, else returns false\n * @param {*} value - The value to test.\n * @returns {boolean}\n */\n isFinite: function (_isFinite) {\n function isFinite(_x) {\n return _isFinite.apply(this, arguments);\n }\n isFinite.toString = function () {\n return _isFinite.toString();\n };\n return isFinite;\n }(function (value) {\n return (typeof value === 'number' || value instanceof Number) && isFinite(value);\n }),\n /**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param {*} value - The value to return if defined.\n * @param {*} defaultValue - The value to return if `value` is undefined.\n * @returns {*}\n */\n valueOrDefault: function valueOrDefault(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n },\n /**\n * Returns value at the given `index` in array if defined, else returns `defaultValue`.\n * @param {Array} value - The array to lookup for value at `index`.\n * @param {number} index - The index in `value` to lookup for value.\n * @param {*} defaultValue - The value to return if `value[index]` is undefined.\n * @returns {*}\n */\n valueAtIndexOrDefault: function valueAtIndexOrDefault(value, index, defaultValue) {\n return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\n },\n /**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param {function} fn - The function to call.\n * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\n * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @returns {*}\n */\n callback: function callback(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n },\n /**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param {object|Array} loopable - The object or array to be iterated.\n * @param {function} fn - The function to call for each item.\n * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @param {boolean} [reverse] - If true, iterates backward on the loopable.\n */\n each: function each(loopable, fn, thisArg, reverse) {\n var i, len, keys;\n if (helpers.isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (helpers.isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n },\n /**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @see https://stackoverflow.com/a/14853974\n * @param {Array} a0 - The array to compare\n * @param {Array} a1 - The array to compare\n * @returns {boolean}\n */\n arrayEquals: function arrayEquals(a0, a1) {\n var i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n if (v0 instanceof Array && v1 instanceof Array) {\n if (!helpers.arrayEquals(v0, v1)) {\n return false;\n }\n } else if (v0 !== v1) {\n // NOTE: two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n return true;\n },\n /**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param {*} source - The value to clone.\n * @returns {*}\n */\n clone: function clone(source) {\n if (helpers.isArray(source)) {\n return source.map(helpers.clone);\n }\n if (helpers.isObject(source)) {\n var target = {};\n var keys = Object.keys(source);\n var klen = keys.length;\n var k = 0;\n for (; k < klen; ++k) {\n target[keys[k]] = helpers.clone(source[keys[k]]);\n }\n return target;\n }\n return source;\n },\n /**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\n _merger: function _merger(key, target, source, options) {\n var tval = target[key];\n var sval = source[key];\n if (helpers.isObject(tval) && helpers.isObject(sval)) {\n helpers.merge(tval, sval, options);\n } else {\n target[key] = helpers.clone(sval);\n }\n },\n /**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\n _mergerIf: function _mergerIf(key, target, source) {\n var tval = target[key];\n var sval = source[key];\n if (helpers.isObject(tval) && helpers.isObject(sval)) {\n helpers.mergeIf(tval, sval);\n } else if (!target.hasOwnProperty(key)) {\n target[key] = helpers.clone(sval);\n }\n },\n /**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {object} target - The target object in which all sources are merged into.\n * @param {object|object[]} source - Object(s) to merge into `target`.\n * @param {object} [options] - Merging options:\n * @param {function} [options.merger] - The merge method (key, target, source, options)\n * @returns {object} The `target` object.\n */\n merge: function merge(target, source, options) {\n var sources = helpers.isArray(source) ? source : [source];\n var ilen = sources.length;\n var merge, i, keys, klen, k;\n if (!helpers.isObject(target)) {\n return target;\n }\n options = options || {};\n merge = options.merger || helpers._merger;\n for (i = 0; i < ilen; ++i) {\n source = sources[i];\n if (!helpers.isObject(source)) {\n continue;\n }\n keys = Object.keys(source);\n for (k = 0, klen = keys.length; k < klen; ++k) {\n merge(keys[k], target, source, options);\n }\n }\n return target;\n },\n /**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {object} target - The target object in which all sources are merged into.\n * @param {object|object[]} source - Object(s) to merge into `target`.\n * @returns {object} The `target` object.\n */\n mergeIf: function mergeIf(target, source) {\n return helpers.merge(target, source, {\n merger: helpers._mergerIf\n });\n },\n /**\n * Applies the contents of two or more objects together into the first object.\n * @param {object} target - The target object in which all objects are merged into.\n * @param {object} arg1 - Object containing additional properties to merge in target.\n * @param {object} argN - Additional objects containing properties to merge in target.\n * @returns {object} The `target` object.\n */\n extend: function extend(target) {\n var setFn = function setFn(value, key) {\n target[key] = value;\n };\n for (var i = 1, ilen = arguments.length; i < ilen; ++i) {\n helpers.each(arguments[i], setFn);\n }\n return target;\n },\n /**\n * Basic javascript inheritance based on the model created in Backbone.js\n */\n inherits: function inherits(extensions) {\n var me = this;\n var ChartElement = extensions && extensions.hasOwnProperty('constructor') ? extensions.constructor : function () {\n return me.apply(this, arguments);\n };\n var Surrogate = function Surrogate() {\n this.constructor = ChartElement;\n };\n Surrogate.prototype = me.prototype;\n ChartElement.prototype = new Surrogate();\n ChartElement.extend = helpers.inherits;\n if (extensions) {\n helpers.extend(ChartElement.prototype, extensions);\n }\n ChartElement.__super__ = me.prototype;\n return ChartElement;\n }\n };\n var helpers_core = helpers;\n\n // DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use Chart.helpers.callback instead.\n * @function Chart.helpers.callCallback\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n helpers.callCallback = helpers.callback;\n\n /**\n * Provided for backward compatibility, use Array.prototype.indexOf instead.\n * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+\n * @function Chart.helpers.indexOf\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.indexOf = function (array, item, fromIndex) {\n return Array.prototype.indexOf.call(array, item, fromIndex);\n };\n\n /**\n * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.\n * @function Chart.helpers.getValueOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.getValueOrDefault = helpers.valueOrDefault;\n\n /**\n * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.\n * @function Chart.helpers.getValueAtIndexOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n /**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easingEffects\n * @see http://www.robertpenner.com/easing/\n */\n var effects = {\n linear: function linear(t) {\n return t;\n },\n easeInQuad: function easeInQuad(t) {\n return t * t;\n },\n easeOutQuad: function easeOutQuad(t) {\n return -t * (t - 2);\n },\n easeInOutQuad: function easeInOutQuad(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t;\n }\n return -0.5 * (--t * (t - 2) - 1);\n },\n easeInCubic: function easeInCubic(t) {\n return t * t * t;\n },\n easeOutCubic: function easeOutCubic(t) {\n return (t = t - 1) * t * t + 1;\n },\n easeInOutCubic: function easeInOutCubic(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t;\n }\n return 0.5 * ((t -= 2) * t * t + 2);\n },\n easeInQuart: function easeInQuart(t) {\n return t * t * t * t;\n },\n easeOutQuart: function easeOutQuart(t) {\n return -((t = t - 1) * t * t * t - 1);\n },\n easeInOutQuart: function easeInOutQuart(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t * t;\n }\n return -0.5 * ((t -= 2) * t * t * t - 2);\n },\n easeInQuint: function easeInQuint(t) {\n return t * t * t * t * t;\n },\n easeOutQuint: function easeOutQuint(t) {\n return (t = t - 1) * t * t * t * t + 1;\n },\n easeInOutQuint: function easeInOutQuint(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t * t * t;\n }\n return 0.5 * ((t -= 2) * t * t * t * t + 2);\n },\n easeInSine: function easeInSine(t) {\n return -Math.cos(t * (Math.PI / 2)) + 1;\n },\n easeOutSine: function easeOutSine(t) {\n return Math.sin(t * (Math.PI / 2));\n },\n easeInOutSine: function easeInOutSine(t) {\n return -0.5 * (Math.cos(Math.PI * t) - 1);\n },\n easeInExpo: function easeInExpo(t) {\n return t === 0 ? 0 : Math.pow(2, 10 * (t - 1));\n },\n easeOutExpo: function easeOutExpo(t) {\n return t === 1 ? 1 : -Math.pow(2, -10 * t) + 1;\n },\n easeInOutExpo: function easeInOutExpo(t) {\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if ((t /= 0.5) < 1) {\n return 0.5 * Math.pow(2, 10 * (t - 1));\n }\n return 0.5 * (-Math.pow(2, -10 * --t) + 2);\n },\n easeInCirc: function easeInCirc(t) {\n if (t >= 1) {\n return t;\n }\n return -(Math.sqrt(1 - t * t) - 1);\n },\n easeOutCirc: function easeOutCirc(t) {\n return Math.sqrt(1 - (t = t - 1) * t);\n },\n easeInOutCirc: function easeInOutCirc(t) {\n if ((t /= 0.5) < 1) {\n return -0.5 * (Math.sqrt(1 - t * t) - 1);\n }\n return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n },\n easeInElastic: function easeInElastic(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if (!p) {\n p = 0.3;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n },\n easeOutElastic: function easeOutElastic(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if (!p) {\n p = 0.3;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\n },\n easeInOutElastic: function easeInOutElastic(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if ((t /= 0.5) === 2) {\n return 1;\n }\n if (!p) {\n p = 0.45;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n }\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\n },\n easeInBack: function easeInBack(t) {\n var s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack: function easeOutBack(t) {\n var s = 1.70158;\n return (t = t - 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack: function easeInOutBack(t) {\n var s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n },\n easeInBounce: function easeInBounce(t) {\n return 1 - effects.easeOutBounce(1 - t);\n },\n easeOutBounce: function easeOutBounce(t) {\n if (t < 1 / 2.75) {\n return 7.5625 * t * t;\n }\n if (t < 2 / 2.75) {\n return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;\n }\n if (t < 2.5 / 2.75) {\n return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;\n }\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n },\n easeInOutBounce: function easeInOutBounce(t) {\n if (t < 0.5) {\n return effects.easeInBounce(t * 2) * 0.5;\n }\n return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n }\n };\n var helpers_easing = {\n effects: effects\n };\n\n // DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use Chart.helpers.easing.effects instead.\n * @function Chart.helpers.easingEffects\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers_core.easingEffects = effects;\n var PI = Math.PI;\n var RAD_PER_DEG = PI / 180;\n var DOUBLE_PI = PI * 2;\n var HALF_PI = PI / 2;\n var QUARTER_PI = PI / 4;\n var TWO_THIRDS_PI = PI * 2 / 3;\n\n /**\n * @namespace Chart.helpers.canvas\n */\n var exports$1 = {\n /**\n * Clears the entire canvas associated to the given `chart`.\n * @param {Chart} chart - The chart for which to clear the canvas.\n */\n clear: function clear(chart) {\n chart.ctx.clearRect(0, 0, chart.width, chart.height);\n },\n /**\n * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\n * given size (width, height) and the same `radius` for all corners.\n * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\n * @param {number} x - The x axis of the coordinate for the rectangle starting point.\n * @param {number} y - The y axis of the coordinate for the rectangle starting point.\n * @param {number} width - The rectangle's width.\n * @param {number} height - The rectangle's height.\n * @param {number} radius - The rounded amount (in pixels) for the four corners.\n * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\n */\n roundedRect: function roundedRect(ctx, x, y, width, height, radius) {\n if (radius) {\n var r = Math.min(radius, height / 2, width / 2);\n var left = x + r;\n var top = y + r;\n var right = x + width - r;\n var bottom = y + height - r;\n ctx.moveTo(x, top);\n if (left < right && top < bottom) {\n ctx.arc(left, top, r, -PI, -HALF_PI);\n ctx.arc(right, top, r, -HALF_PI, 0);\n ctx.arc(right, bottom, r, 0, HALF_PI);\n ctx.arc(left, bottom, r, HALF_PI, PI);\n } else if (left < right) {\n ctx.moveTo(left, y);\n ctx.arc(right, top, r, -HALF_PI, HALF_PI);\n ctx.arc(left, top, r, HALF_PI, PI + HALF_PI);\n } else if (top < bottom) {\n ctx.arc(left, top, r, -PI, 0);\n ctx.arc(left, bottom, r, 0, PI);\n } else {\n ctx.arc(left, top, r, -PI, PI);\n }\n ctx.closePath();\n ctx.moveTo(x, y);\n } else {\n ctx.rect(x, y, width, height);\n }\n },\n drawPoint: function drawPoint(ctx, style, radius, x, y, rotation) {\n var type, xOffset, yOffset, size, cornerRadius;\n var rad = (rotation || 0) * RAD_PER_DEG;\n if (style && _typeof(style) === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch (style) {\n // Default includes circle\n default:\n ctx.arc(x, y, radius, 0, DOUBLE_PI);\n ctx.closePath();\n break;\n case 'triangle':\n ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n ctx.rect(x - size, y - size, 2 * size, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + yOffset, y - xOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'star':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n rad += QUARTER_PI;\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'line':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n break;\n }\n ctx.fill();\n ctx.stroke();\n },\n /**\n * Returns true if the point is inside the rectangle\n * @param {object} point - The point to test\n * @param {object} area - The rectangle\n * @returns {boolean}\n * @private\n */\n _isPointInArea: function _isPointInArea(point, area) {\n var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n\n return point.x > area.left - epsilon && point.x < area.right + epsilon && point.y > area.top - epsilon && point.y < area.bottom + epsilon;\n },\n clipArea: function clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n },\n unclipArea: function unclipArea(ctx) {\n ctx.restore();\n },\n lineTo: function lineTo(ctx, previous, target, flip) {\n var stepped = target.steppedLine;\n if (stepped) {\n if (stepped === 'middle') {\n var midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, flip ? target.y : previous.y);\n ctx.lineTo(midpoint, flip ? previous.y : target.y);\n } else if (stepped === 'after' && !flip || stepped !== 'after' && flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n return;\n }\n if (!target.tension) {\n ctx.lineTo(target.x, target.y);\n return;\n }\n ctx.bezierCurveTo(flip ? previous.controlPointPreviousX : previous.controlPointNextX, flip ? previous.controlPointPreviousY : previous.controlPointNextY, flip ? target.controlPointNextX : target.controlPointPreviousX, flip ? target.controlPointNextY : target.controlPointPreviousY, target.x, target.y);\n }\n };\n var helpers_canvas = exports$1;\n\n // DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.\n * @namespace Chart.helpers.clear\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers_core.clear = exports$1.clear;\n\n /**\n * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.\n * @namespace Chart.helpers.drawRoundedRectangle\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers_core.drawRoundedRectangle = function (ctx) {\n ctx.beginPath();\n exports$1.roundedRect.apply(exports$1, arguments);\n };\n var defaults = {\n /**\n * @private\n */\n _set: function _set(scope, values) {\n return helpers_core.merge(this[scope] || (this[scope] = {}), values);\n }\n };\n defaults._set('global', {\n defaultColor: 'rgba(0,0,0,0.1)',\n defaultFontColor: '#666',\n defaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n defaultFontSize: 12,\n defaultFontStyle: 'normal',\n defaultLineHeight: 1.2,\n showLines: true\n });\n var core_defaults = defaults;\n var valueOrDefault = helpers_core.valueOrDefault;\n\n /**\n * Converts the given font object into a CSS font string.\n * @param {object} font - A font object.\n * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\n function toFontString(font) {\n if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family;\n }\n\n /**\n * @alias Chart.helpers.options\n * @namespace\n */\n var helpers_options = {\n /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param {number} size - The font size (in pixels) used to resolve relative `value`.\n * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\n toLineHeight: function toLineHeight(value, size) {\n var matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n value = +matches[2];\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n return size * value;\n },\n /**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param {number|object} value - If a number, set the value to all TRBL component,\n * else, if and object, use defined properties and sets undefined ones to 0.\n * @returns {object} The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\n toPadding: function toPadding(value) {\n var t, r, b, l;\n if (helpers_core.isObject(value)) {\n t = +value.top || 0;\n r = +value.right || 0;\n b = +value.bottom || 0;\n l = +value.left || 0;\n } else {\n t = r = b = l = +value || 0;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n height: t + b,\n width: l + r\n };\n },\n /**\n * Parses font options and returns the font object.\n * @param {object} options - A object that contains font options to be parsed.\n * @return {object} The font object.\n * @todo Support font.* options and renamed to toFont().\n * @private\n */\n _parseFont: function _parseFont(options) {\n var globalDefaults = core_defaults.global;\n var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n var font = {\n family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily),\n lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size),\n size: size,\n style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle),\n weight: null,\n string: ''\n };\n font.string = toFontString(font);\n return font;\n },\n /**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param {Array} inputs - An array of values, falling back to the last value.\n * @param {object} [context] - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param {number} [index] - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @since 2.7.0\n */\n resolve: function resolve(inputs, context, index) {\n var i, ilen, value;\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n }\n if (index !== undefined && helpers_core.isArray(value)) {\n value = value[index];\n }\n if (value !== undefined) {\n return value;\n }\n }\n }\n };\n var helpers$1 = helpers_core;\n var easing = helpers_easing;\n var canvas = helpers_canvas;\n var options = helpers_options;\n helpers$1.easing = easing;\n helpers$1.canvas = canvas;\n helpers$1.options = options;\n function interpolate(start, view, model, ease) {\n var keys = Object.keys(model);\n var i, ilen, key, actual, origin, target, type, c0, c1;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n target = model[key];\n\n // if a value is added to the model after pivot() has been called, the view\n // doesn't contain it, so let's initialize the view to the target value.\n if (!view.hasOwnProperty(key)) {\n view[key] = target;\n }\n actual = view[key];\n if (actual === target || key[0] === '_') {\n continue;\n }\n if (!start.hasOwnProperty(key)) {\n start[key] = actual;\n }\n origin = start[key];\n type = _typeof(target);\n if (type === _typeof(origin)) {\n if (type === 'string') {\n c0 = chartjsColor(origin);\n if (c0.valid) {\n c1 = chartjsColor(target);\n if (c1.valid) {\n view[key] = c1.mix(c0, ease).rgbString();\n continue;\n }\n }\n } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) {\n view[key] = origin + (target - origin) * ease;\n continue;\n }\n }\n view[key] = target;\n }\n }\n var Element = function Element(configuration) {\n helpers$1.extend(this, configuration);\n this.initialize.apply(this, arguments);\n };\n helpers$1.extend(Element.prototype, {\n initialize: function initialize() {\n this.hidden = false;\n },\n pivot: function pivot() {\n var me = this;\n if (!me._view) {\n me._view = helpers$1.clone(me._model);\n }\n me._start = {};\n return me;\n },\n transition: function transition(ease) {\n var me = this;\n var model = me._model;\n var start = me._start;\n var view = me._view;\n\n // No animation -> No Transition\n if (!model || ease === 1) {\n me._view = model;\n me._start = null;\n return me;\n }\n if (!view) {\n view = me._view = {};\n }\n if (!start) {\n start = me._start = {};\n }\n interpolate(start, view, model, ease);\n return me;\n },\n tooltipPosition: function tooltipPosition() {\n return {\n x: this._model.x,\n y: this._model.y\n };\n },\n hasValue: function hasValue() {\n return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y);\n }\n });\n Element.extend = helpers$1.inherits;\n var core_element = Element;\n var exports$2 = core_element.extend({\n chart: null,\n // the animation associated chart instance\n currentStep: 0,\n // the current animation step\n numSteps: 60,\n // default number of steps\n easing: '',\n // the easing to use for this animation\n render: null,\n // render function used by the animation service\n\n onAnimationProgress: null,\n // user specified callback to fire on each step of the animation\n onAnimationComplete: null // user specified callback to fire when the animation finishes\n });\n\n var core_animation = exports$2;\n\n // DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use Chart.Animation instead\n * @prop Chart.Animation#animationObject\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\n Object.defineProperty(exports$2.prototype, 'animationObject', {\n get: function get() {\n return this;\n }\n });\n\n /**\n * Provided for backward compatibility, use Chart.Animation#chart instead\n * @prop Chart.Animation#chartInstance\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\n Object.defineProperty(exports$2.prototype, 'chartInstance', {\n get: function get() {\n return this.chart;\n },\n set: function set(value) {\n this.chart = value;\n }\n });\n core_defaults._set('global', {\n animation: {\n duration: 1000,\n easing: 'easeOutQuart',\n onProgress: helpers$1.noop,\n onComplete: helpers$1.noop\n }\n });\n var core_animations = {\n animations: [],\n request: null,\n /**\n * @param {Chart} chart - The chart to animate.\n * @param {Chart.Animation} animation - The animation that we will animate.\n * @param {number} duration - The animation duration in ms.\n * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n */\n addAnimation: function addAnimation(chart, animation, duration, lazy) {\n var animations = this.animations;\n var i, ilen;\n animation.chart = chart;\n animation.startTime = Date.now();\n animation.duration = duration;\n if (!lazy) {\n chart.animating = true;\n }\n for (i = 0, ilen = animations.length; i < ilen; ++i) {\n if (animations[i].chart === chart) {\n animations[i] = animation;\n return;\n }\n }\n animations.push(animation);\n\n // If there are no animations queued, manually kickstart a digest, for lack of a better word\n if (animations.length === 1) {\n this.requestAnimationFrame();\n }\n },\n cancelAnimation: function cancelAnimation(chart) {\n var index = helpers$1.findIndex(this.animations, function (animation) {\n return animation.chart === chart;\n });\n if (index !== -1) {\n this.animations.splice(index, 1);\n chart.animating = false;\n }\n },\n requestAnimationFrame: function requestAnimationFrame() {\n var me = this;\n if (me.request === null) {\n // Skip animation frame requests until the active one is executed.\n // This can happen when processing mouse events, e.g. 'mousemove'\n // and 'mouseout' events will trigger multiple renders.\n me.request = helpers$1.requestAnimFrame.call(window, function () {\n me.request = null;\n me.startDigest();\n });\n }\n },\n /**\n * @private\n */\n startDigest: function startDigest() {\n var me = this;\n me.advance();\n\n // Do we have more stuff to animate?\n if (me.animations.length > 0) {\n me.requestAnimationFrame();\n }\n },\n /**\n * @private\n */\n advance: function advance() {\n var animations = this.animations;\n var animation, chart, numSteps, nextStep;\n var i = 0;\n\n // 1 animation per chart, so we are looping charts here\n while (i < animations.length) {\n animation = animations[i];\n chart = animation.chart;\n numSteps = animation.numSteps;\n\n // Make sure that currentStep starts at 1\n // https://github.com/chartjs/Chart.js/issues/6104\n nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1;\n animation.currentStep = Math.min(nextStep, numSteps);\n helpers$1.callback(animation.render, [chart, animation], chart);\n helpers$1.callback(animation.onAnimationProgress, [animation], chart);\n if (animation.currentStep >= numSteps) {\n helpers$1.callback(animation.onAnimationComplete, [animation], chart);\n chart.animating = false;\n animations.splice(i, 1);\n } else {\n ++i;\n }\n }\n }\n };\n var resolve = helpers$1.options.resolve;\n var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n /**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n */\n function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n arrayEvents.forEach(function (key) {\n var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n var base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value: function value() {\n var args = Array.prototype.slice.call(arguments);\n var res = base.apply(this, args);\n helpers$1.each(array._chartjs.listeners, function (object) {\n if (typeof object[method] === 'function') {\n object[method].apply(object, args);\n }\n });\n return res;\n }\n });\n });\n }\n\n /**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\n function unlistenArrayEvents(array, listener) {\n var stub = array._chartjs;\n if (!stub) {\n return;\n }\n var listeners = stub.listeners;\n var index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach(function (key) {\n delete array[key];\n });\n delete array._chartjs;\n }\n\n // Base class for all dataset controllers (line, bar, etc)\n var DatasetController = function DatasetController(chart, datasetIndex) {\n this.initialize(chart, datasetIndex);\n };\n helpers$1.extend(DatasetController.prototype, {\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n * @type {Chart.core.element}\n */\n datasetElementType: null,\n /**\n * Element type used to generate a meta data (e.g. Chart.element.Point).\n * @type {Chart.core.element}\n */\n dataElementType: null,\n initialize: function initialize(chart, datasetIndex) {\n var me = this;\n me.chart = chart;\n me.index = datasetIndex;\n me.linkScales();\n me.addElements();\n },\n updateIndex: function updateIndex(datasetIndex) {\n this.index = datasetIndex;\n },\n linkScales: function linkScales() {\n var me = this;\n var meta = me.getMeta();\n var dataset = me.getDataset();\n if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) {\n meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n }\n if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) {\n meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n }\n },\n getDataset: function getDataset() {\n return this.chart.data.datasets[this.index];\n },\n getMeta: function getMeta() {\n return this.chart.getDatasetMeta(this.index);\n },\n getScaleForId: function getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n },\n /**\n * @private\n */\n _getValueScaleId: function _getValueScaleId() {\n return this.getMeta().yAxisID;\n },\n /**\n * @private\n */\n _getIndexScaleId: function _getIndexScaleId() {\n return this.getMeta().xAxisID;\n },\n /**\n * @private\n */\n _getValueScale: function _getValueScale() {\n return this.getScaleForId(this._getValueScaleId());\n },\n /**\n * @private\n */\n _getIndexScale: function _getIndexScale() {\n return this.getScaleForId(this._getIndexScaleId());\n },\n reset: function reset() {\n this.update(true);\n },\n /**\n * @private\n */\n destroy: function destroy() {\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n },\n createMetaDataset: function createMetaDataset() {\n var me = this;\n var type = me.datasetElementType;\n return type && new type({\n _chart: me.chart,\n _datasetIndex: me.index\n });\n },\n createMetaData: function createMetaData(index) {\n var me = this;\n var type = me.dataElementType;\n return type && new type({\n _chart: me.chart,\n _datasetIndex: me.index,\n _index: index\n });\n },\n addElements: function addElements() {\n var me = this;\n var meta = me.getMeta();\n var data = me.getDataset().data || [];\n var metaData = meta.data;\n var i, ilen;\n for (i = 0, ilen = data.length; i < ilen; ++i) {\n metaData[i] = metaData[i] || me.createMetaData(i);\n }\n meta.dataset = meta.dataset || me.createMetaDataset();\n },\n addElementAndReset: function addElementAndReset(index) {\n var element = this.createMetaData(index);\n this.getMeta().data.splice(index, 0, element);\n this.updateElement(element, index, true);\n },\n buildOrUpdateElements: function buildOrUpdateElements() {\n var me = this;\n var dataset = me.getDataset();\n var data = dataset.data || (dataset.data = []);\n\n // In order to correctly handle data addition/deletion animation (an thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal meta data accordingly.\n if (me._data !== data) {\n if (me._data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(me._data, me);\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, me);\n }\n me._data = data;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n me.resyncElements();\n },\n update: helpers$1.noop,\n transition: function transition(easingValue) {\n var meta = this.getMeta();\n var elements = meta.data || [];\n var ilen = elements.length;\n var i = 0;\n for (; i < ilen; ++i) {\n elements[i].transition(easingValue);\n }\n if (meta.dataset) {\n meta.dataset.transition(easingValue);\n }\n },\n draw: function draw() {\n var meta = this.getMeta();\n var elements = meta.data || [];\n var ilen = elements.length;\n var i = 0;\n if (meta.dataset) {\n meta.dataset.draw();\n }\n for (; i < ilen; ++i) {\n elements[i].draw();\n }\n },\n removeHoverStyle: function removeHoverStyle(element) {\n helpers$1.merge(element._model, element.$previousStyle || {});\n delete element.$previousStyle;\n },\n setHoverStyle: function setHoverStyle(element) {\n var dataset = this.chart.data.datasets[element._datasetIndex];\n var index = element._index;\n var custom = element.custom || {};\n var model = element._model;\n var getHoverColor = helpers$1.getHoverColor;\n element.$previousStyle = {\n backgroundColor: model.backgroundColor,\n borderColor: model.borderColor,\n borderWidth: model.borderWidth\n };\n model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index);\n model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index);\n model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);\n },\n /**\n * @private\n */\n resyncElements: function resyncElements() {\n var me = this;\n var meta = me.getMeta();\n var data = me.getDataset().data;\n var numMeta = meta.data.length;\n var numData = data.length;\n if (numData < numMeta) {\n meta.data.splice(numData, numMeta - numData);\n } else if (numData > numMeta) {\n me.insertElements(numMeta, numData - numMeta);\n }\n },\n /**\n * @private\n */\n insertElements: function insertElements(start, count) {\n for (var i = 0; i < count; ++i) {\n this.addElementAndReset(start + i);\n }\n },\n /**\n * @private\n */\n onDataPush: function onDataPush() {\n var count = arguments.length;\n this.insertElements(this.getDataset().data.length - count, count);\n },\n /**\n * @private\n */\n onDataPop: function onDataPop() {\n this.getMeta().data.pop();\n },\n /**\n * @private\n */\n onDataShift: function onDataShift() {\n this.getMeta().data.shift();\n },\n /**\n * @private\n */\n onDataSplice: function onDataSplice(start, count) {\n this.getMeta().data.splice(start, count);\n this.insertElements(start, arguments.length - 2);\n },\n /**\n * @private\n */\n onDataUnshift: function onDataUnshift() {\n this.insertElements(0, arguments.length);\n }\n });\n DatasetController.extend = helpers$1.inherits;\n var core_datasetController = DatasetController;\n core_defaults._set('global', {\n elements: {\n arc: {\n backgroundColor: core_defaults.global.defaultColor,\n borderColor: '#fff',\n borderWidth: 2,\n borderAlign: 'center'\n }\n }\n });\n var element_arc = core_element.extend({\n inLabelRange: function inLabelRange(mouseX) {\n var vm = this._view;\n if (vm) {\n return Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2);\n }\n return false;\n },\n inRange: function inRange(chartX, chartY) {\n var vm = this._view;\n if (vm) {\n var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {\n x: chartX,\n y: chartY\n });\n var angle = pointRelativePosition.angle;\n var distance = pointRelativePosition.distance;\n\n // Sanitise angle range\n var startAngle = vm.startAngle;\n var endAngle = vm.endAngle;\n while (endAngle < startAngle) {\n endAngle += 2.0 * Math.PI;\n }\n while (angle > endAngle) {\n angle -= 2.0 * Math.PI;\n }\n while (angle < startAngle) {\n angle += 2.0 * Math.PI;\n }\n\n // Check if within the range of the open/close angle\n var betweenAngles = angle >= startAngle && angle <= endAngle;\n var withinRadius = distance >= vm.innerRadius && distance <= vm.outerRadius;\n return betweenAngles && withinRadius;\n }\n return false;\n },\n getCenterPoint: function getCenterPoint() {\n var vm = this._view;\n var halfAngle = (vm.startAngle + vm.endAngle) / 2;\n var halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n return {\n x: vm.x + Math.cos(halfAngle) * halfRadius,\n y: vm.y + Math.sin(halfAngle) * halfRadius\n };\n },\n getArea: function getArea() {\n var vm = this._view;\n return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n },\n tooltipPosition: function tooltipPosition() {\n var vm = this._view;\n var centreAngle = vm.startAngle + (vm.endAngle - vm.startAngle) / 2;\n var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n return {\n x: vm.x + Math.cos(centreAngle) * rangeFromCentre,\n y: vm.y + Math.sin(centreAngle) * rangeFromCentre\n };\n },\n draw: function draw() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var sA = vm.startAngle;\n var eA = vm.endAngle;\n var pixelMargin = vm.borderAlign === 'inner' ? 0.33 : 0;\n var angleMargin;\n ctx.save();\n ctx.beginPath();\n ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA);\n ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n ctx.closePath();\n ctx.fillStyle = vm.backgroundColor;\n ctx.fill();\n if (vm.borderWidth) {\n if (vm.borderAlign === 'inner') {\n // Draw an inner border by cliping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n angleMargin = pixelMargin / vm.outerRadius;\n ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin);\n if (vm.innerRadius > pixelMargin) {\n angleMargin = pixelMargin / vm.innerRadius;\n ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true);\n } else {\n ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2);\n }\n ctx.closePath();\n ctx.clip();\n ctx.beginPath();\n ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n ctx.closePath();\n ctx.lineWidth = vm.borderWidth * 2;\n ctx.lineJoin = 'round';\n } else {\n ctx.lineWidth = vm.borderWidth;\n ctx.lineJoin = 'bevel';\n }\n ctx.strokeStyle = vm.borderColor;\n ctx.stroke();\n }\n ctx.restore();\n }\n });\n var valueOrDefault$1 = helpers$1.valueOrDefault;\n var defaultColor = core_defaults.global.defaultColor;\n core_defaults._set('global', {\n elements: {\n line: {\n tension: 0.4,\n backgroundColor: defaultColor,\n borderWidth: 3,\n borderColor: defaultColor,\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0.0,\n borderJoinStyle: 'miter',\n capBezierPoints: true,\n fill: true // do we fill in the area between the line and its base axis\n }\n }\n });\n\n var element_line = core_element.extend({\n draw: function draw() {\n var me = this;\n var vm = me._view;\n var ctx = me._chart.ctx;\n var spanGaps = vm.spanGaps;\n var points = me._children.slice(); // clone array\n var globalDefaults = core_defaults.global;\n var globalOptionLineElements = globalDefaults.elements.line;\n var lastDrawnIndex = -1;\n var index, current, previous, currentVM;\n\n // If we are looping, adding the first point again\n if (me._loop && points.length) {\n points.push(points[0]);\n }\n ctx.save();\n\n // Stroke Line Options\n ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n // IE 9 and 10 do not support line dash\n if (ctx.setLineDash) {\n ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n }\n ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset);\n ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth);\n ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n // Stroke Line\n ctx.beginPath();\n lastDrawnIndex = -1;\n for (index = 0; index < points.length; ++index) {\n current = points[index];\n previous = helpers$1.previousItem(points, index);\n currentVM = current._view;\n\n // First point moves to it's starting position no matter what\n if (index === 0) {\n if (!currentVM.skip) {\n ctx.moveTo(currentVM.x, currentVM.y);\n lastDrawnIndex = index;\n }\n } else {\n previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n if (!currentVM.skip) {\n if (lastDrawnIndex !== index - 1 && !spanGaps || lastDrawnIndex === -1) {\n // There was a gap and this is the first point after the gap\n ctx.moveTo(currentVM.x, currentVM.y);\n } else {\n // Line to next point\n helpers$1.canvas.lineTo(ctx, previous._view, current._view);\n }\n lastDrawnIndex = index;\n }\n }\n }\n ctx.stroke();\n ctx.restore();\n }\n });\n var valueOrDefault$2 = helpers$1.valueOrDefault;\n var defaultColor$1 = core_defaults.global.defaultColor;\n core_defaults._set('global', {\n elements: {\n point: {\n radius: 3,\n pointStyle: 'circle',\n backgroundColor: defaultColor$1,\n borderColor: defaultColor$1,\n borderWidth: 1,\n // Hover\n hitRadius: 1,\n hoverRadius: 4,\n hoverBorderWidth: 1\n }\n }\n });\n function xRange(mouseX) {\n var vm = this._view;\n return vm ? Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius : false;\n }\n function yRange(mouseY) {\n var vm = this._view;\n return vm ? Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius : false;\n }\n var element_point = core_element.extend({\n inRange: function inRange(mouseX, mouseY) {\n var vm = this._view;\n return vm ? Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2) < Math.pow(vm.hitRadius + vm.radius, 2) : false;\n },\n inLabelRange: xRange,\n inXRange: xRange,\n inYRange: yRange,\n getCenterPoint: function getCenterPoint() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y\n };\n },\n getArea: function getArea() {\n return Math.PI * Math.pow(this._view.radius, 2);\n },\n tooltipPosition: function tooltipPosition() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y,\n padding: vm.radius + vm.borderWidth\n };\n },\n draw: function draw(chartArea) {\n var vm = this._view;\n var ctx = this._chart.ctx;\n var pointStyle = vm.pointStyle;\n var rotation = vm.rotation;\n var radius = vm.radius;\n var x = vm.x;\n var y = vm.y;\n var globalDefaults = core_defaults.global;\n var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow\n\n if (vm.skip) {\n return;\n }\n\n // Clipping for Points.\n if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) {\n ctx.strokeStyle = vm.borderColor || defaultColor;\n ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth);\n ctx.fillStyle = vm.backgroundColor || defaultColor;\n helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation);\n }\n }\n });\n var defaultColor$2 = core_defaults.global.defaultColor;\n core_defaults._set('global', {\n elements: {\n rectangle: {\n backgroundColor: defaultColor$2,\n borderColor: defaultColor$2,\n borderSkipped: 'bottom',\n borderWidth: 0\n }\n }\n });\n function isVertical(vm) {\n return vm && vm.width !== undefined;\n }\n\n /**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param bar {Chart.Element.Rectangle} the bar\n * @return {Bounds} bounds of the bar\n * @private\n */\n function getBarBounds(vm) {\n var x1, x2, y1, y2, half;\n if (isVertical(vm)) {\n half = vm.width / 2;\n x1 = vm.x - half;\n x2 = vm.x + half;\n y1 = Math.min(vm.y, vm.base);\n y2 = Math.max(vm.y, vm.base);\n } else {\n half = vm.height / 2;\n x1 = Math.min(vm.x, vm.base);\n x2 = Math.max(vm.x, vm.base);\n y1 = vm.y - half;\n y2 = vm.y + half;\n }\n return {\n left: x1,\n top: y1,\n right: x2,\n bottom: y2\n };\n }\n function swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n }\n function parseBorderSkipped(vm) {\n var edge = vm.borderSkipped;\n var res = {};\n if (!edge) {\n return res;\n }\n if (vm.horizontal) {\n if (vm.base > vm.x) {\n edge = swap(edge, 'left', 'right');\n }\n } else if (vm.base < vm.y) {\n edge = swap(edge, 'bottom', 'top');\n }\n res[edge] = true;\n return res;\n }\n function parseBorderWidth(vm, maxW, maxH) {\n var value = vm.borderWidth;\n var skip = parseBorderSkipped(vm);\n var t, r, b, l;\n if (helpers$1.isObject(value)) {\n t = +value.top || 0;\n r = +value.right || 0;\n b = +value.bottom || 0;\n l = +value.left || 0;\n } else {\n t = r = b = l = +value || 0;\n }\n return {\n t: skip.top || t < 0 ? 0 : t > maxH ? maxH : t,\n r: skip.right || r < 0 ? 0 : r > maxW ? maxW : r,\n b: skip.bottom || b < 0 ? 0 : b > maxH ? maxH : b,\n l: skip.left || l < 0 ? 0 : l > maxW ? maxW : l\n };\n }\n function boundingRects(vm) {\n var bounds = getBarBounds(vm);\n var width = bounds.right - bounds.left;\n var height = bounds.bottom - bounds.top;\n var border = parseBorderWidth(vm, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b\n }\n };\n }\n function _inRange(vm, x, y) {\n var skipX = x === null;\n var skipY = y === null;\n var bounds = !vm || skipX && skipY ? false : getBarBounds(vm);\n return bounds && (skipX || x >= bounds.left && x <= bounds.right) && (skipY || y >= bounds.top && y <= bounds.bottom);\n }\n var element_rectangle = core_element.extend({\n draw: function draw() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var rects = boundingRects(vm);\n var outer = rects.outer;\n var inner = rects.inner;\n ctx.fillStyle = vm.backgroundColor;\n ctx.fillRect(outer.x, outer.y, outer.w, outer.h);\n if (outer.w === inner.w && outer.h === inner.h) {\n return;\n }\n ctx.save();\n ctx.beginPath();\n ctx.rect(outer.x, outer.y, outer.w, outer.h);\n ctx.clip();\n ctx.fillStyle = vm.borderColor;\n ctx.rect(inner.x, inner.y, inner.w, inner.h);\n ctx.fill('evenodd');\n ctx.restore();\n },\n height: function height() {\n var vm = this._view;\n return vm.base - vm.y;\n },\n inRange: function inRange(mouseX, mouseY) {\n return _inRange(this._view, mouseX, mouseY);\n },\n inLabelRange: function inLabelRange(mouseX, mouseY) {\n var vm = this._view;\n return isVertical(vm) ? _inRange(vm, mouseX, null) : _inRange(vm, null, mouseY);\n },\n inXRange: function inXRange(mouseX) {\n return _inRange(this._view, mouseX, null);\n },\n inYRange: function inYRange(mouseY) {\n return _inRange(this._view, null, mouseY);\n },\n getCenterPoint: function getCenterPoint() {\n var vm = this._view;\n var x, y;\n if (isVertical(vm)) {\n x = vm.x;\n y = (vm.y + vm.base) / 2;\n } else {\n x = (vm.x + vm.base) / 2;\n y = vm.y;\n }\n return {\n x: x,\n y: y\n };\n },\n getArea: function getArea() {\n var vm = this._view;\n return isVertical(vm) ? vm.width * Math.abs(vm.y - vm.base) : vm.height * Math.abs(vm.x - vm.base);\n },\n tooltipPosition: function tooltipPosition() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y\n };\n }\n });\n var elements = {};\n var Arc = element_arc;\n var Line = element_line;\n var Point = element_point;\n var Rectangle = element_rectangle;\n elements.Arc = Arc;\n elements.Line = Line;\n elements.Point = Point;\n elements.Rectangle = Rectangle;\n var resolve$1 = helpers$1.options.resolve;\n core_defaults._set('bar', {\n hover: {\n mode: 'label'\n },\n scales: {\n xAxes: [{\n type: 'category',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n offset: true,\n gridLines: {\n offsetGridLines: true\n }\n }],\n yAxes: [{\n type: 'linear'\n }]\n }\n });\n\n /**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\n function computeMinSampleSize(scale, pixels) {\n var min = scale.isHorizontal() ? scale.width : scale.height;\n var ticks = scale.getTicks();\n var prev, curr, i, ilen;\n for (i = 1, ilen = pixels.length; i < ilen; ++i) {\n min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1]));\n }\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n min = i > 0 ? Math.min(min, curr - prev) : min;\n prev = curr;\n }\n return min;\n }\n\n /**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\n function computeFitCategoryTraits(index, ruler, options) {\n var thickness = options.barThickness;\n var count = ruler.stackCount;\n var curr = ruler.pixels[index];\n var size, ratio;\n if (helpers$1.isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * count;\n ratio = 1;\n }\n return {\n chunk: size / count,\n ratio: ratio,\n start: curr - size / 2\n };\n }\n\n /**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\n function computeFlexCategoryTraits(index, ruler, options) {\n var pixels = ruler.pixels;\n var curr = pixels[index];\n var prev = index > 0 ? pixels[index - 1] : null;\n var next = index < pixels.length - 1 ? pixels[index + 1] : null;\n var percent = options.categoryPercentage;\n var start, size;\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / ruler.stackCount,\n ratio: options.barPercentage,\n start: start\n };\n }\n var controller_bar = core_datasetController.extend({\n dataElementType: elements.Rectangle,\n initialize: function initialize() {\n var me = this;\n var meta;\n core_datasetController.prototype.initialize.apply(me, arguments);\n meta = me.getMeta();\n meta.stack = me.getDataset().stack;\n meta.bar = true;\n },\n update: function update(reset) {\n var me = this;\n var rects = me.getMeta().data;\n var i, ilen;\n me._ruler = me.getRuler();\n for (i = 0, ilen = rects.length; i < ilen; ++i) {\n me.updateElement(rects[i], i, reset);\n }\n },\n updateElement: function updateElement(rectangle, index, reset) {\n var me = this;\n var meta = me.getMeta();\n var dataset = me.getDataset();\n var options = me._resolveElementOptions(rectangle, index);\n rectangle._xScale = me.getScaleForId(meta.xAxisID);\n rectangle._yScale = me.getScaleForId(meta.yAxisID);\n rectangle._datasetIndex = me.index;\n rectangle._index = index;\n rectangle._model = {\n backgroundColor: options.backgroundColor,\n borderColor: options.borderColor,\n borderSkipped: options.borderSkipped,\n borderWidth: options.borderWidth,\n datasetLabel: dataset.label,\n label: me.chart.data.labels[index]\n };\n me._updateElementGeometry(rectangle, index, reset);\n rectangle.pivot();\n },\n /**\n * @private\n */\n _updateElementGeometry: function _updateElementGeometry(rectangle, index, reset) {\n var me = this;\n var model = rectangle._model;\n var vscale = me._getValueScale();\n var base = vscale.getBasePixel();\n var horizontal = vscale.isHorizontal();\n var ruler = me._ruler || me.getRuler();\n var vpixels = me.calculateBarValuePixels(me.index, index);\n var ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n model.horizontal = horizontal;\n model.base = reset ? base : vpixels.base;\n model.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n model.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n model.height = horizontal ? ipixels.size : undefined;\n model.width = horizontal ? undefined : ipixels.size;\n },\n /**\n * Returns the stacks based on groups and bar visibility.\n * @param {number} [last] - The dataset index\n * @returns {string[]} The list of stack IDs\n * @private\n */\n _getStacks: function _getStacks(last) {\n var me = this;\n var chart = me.chart;\n var scale = me._getIndexScale();\n var stacked = scale.options.stacked;\n var ilen = last === undefined ? chart.data.datasets.length : last + 1;\n var stacks = [];\n var i, meta;\n for (i = 0; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n if (meta.bar && chart.isDatasetVisible(i) && (stacked === false || stacked === true && stacks.indexOf(meta.stack) === -1 || stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1))) {\n stacks.push(meta.stack);\n }\n }\n return stacks;\n },\n /**\n * Returns the effective number of stacks based on groups and bar visibility.\n * @private\n */\n getStackCount: function getStackCount() {\n return this._getStacks().length;\n },\n /**\n * Returns the stack index for the given dataset based on groups and bar visibility.\n * @param {number} [datasetIndex] - The dataset index\n * @param {string} [name] - The stack name to find\n * @returns {number} The stack index\n * @private\n */\n getStackIndex: function getStackIndex(datasetIndex, name) {\n var stacks = this._getStacks(datasetIndex);\n var index = name !== undefined ? stacks.indexOf(name) : -1; // indexOf returns -1 if element is not present\n\n return index === -1 ? stacks.length - 1 : index;\n },\n /**\n * @private\n */\n getRuler: function getRuler() {\n var me = this;\n var scale = me._getIndexScale();\n var stackCount = me.getStackCount();\n var datasetIndex = me.index;\n var isHorizontal = scale.isHorizontal();\n var start = isHorizontal ? scale.left : scale.top;\n var end = start + (isHorizontal ? scale.width : scale.height);\n var pixels = [];\n var i, ilen, min;\n for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n pixels.push(scale.getPixelForValue(null, i, datasetIndex));\n }\n min = helpers$1.isNullOrUndef(scale.options.barThickness) ? computeMinSampleSize(scale, pixels) : -1;\n return {\n min: min,\n pixels: pixels,\n start: start,\n end: end,\n stackCount: stackCount,\n scale: scale\n };\n },\n /**\n * Note: pixel values are not clamped to the scale area.\n * @private\n */\n calculateBarValuePixels: function calculateBarValuePixels(datasetIndex, index) {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var scale = me._getValueScale();\n var isHorizontal = scale.isHorizontal();\n var datasets = chart.data.datasets;\n var value = +scale.getRightValue(datasets[datasetIndex].data[index]);\n var minBarLength = scale.options.minBarLength;\n var stacked = scale.options.stacked;\n var stack = meta.stack;\n var start = 0;\n var i, imeta, ivalue, base, head, size;\n if (stacked || stacked === undefined && stack !== undefined) {\n for (i = 0; i < datasetIndex; ++i) {\n imeta = chart.getDatasetMeta(i);\n if (imeta.bar && imeta.stack === stack && imeta.controller._getValueScaleId() === scale.id && chart.isDatasetVisible(i)) {\n ivalue = +scale.getRightValue(datasets[i].data[index]);\n if (value < 0 && ivalue < 0 || value >= 0 && ivalue > 0) {\n start += ivalue;\n }\n }\n }\n }\n base = scale.getPixelForValue(start);\n head = scale.getPixelForValue(start + value);\n size = head - base;\n if (minBarLength !== undefined && Math.abs(size) < minBarLength) {\n size = minBarLength;\n if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) {\n head = base - minBarLength;\n } else {\n head = base + minBarLength;\n }\n }\n return {\n size: size,\n base: base,\n head: head,\n center: head + size / 2\n };\n },\n /**\n * @private\n */\n calculateBarIndexPixels: function calculateBarIndexPixels(datasetIndex, index, ruler) {\n var me = this;\n var options = ruler.scale.options;\n var range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options) : computeFitCategoryTraits(index, ruler, options);\n var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);\n var center = range.start + range.chunk * stackIndex + range.chunk / 2;\n var size = Math.min(helpers$1.valueOrDefault(options.maxBarThickness, Infinity), range.chunk * range.ratio);\n return {\n base: center - size / 2,\n head: center + size / 2,\n center: center,\n size: size\n };\n },\n draw: function draw() {\n var me = this;\n var chart = me.chart;\n var scale = me._getValueScale();\n var rects = me.getMeta().data;\n var dataset = me.getDataset();\n var ilen = rects.length;\n var i = 0;\n helpers$1.canvas.clipArea(chart.ctx, chart.chartArea);\n for (; i < ilen; ++i) {\n if (!isNaN(scale.getRightValue(dataset.data[i]))) {\n rects[i].draw();\n }\n }\n helpers$1.canvas.unclipArea(chart.ctx);\n },\n /**\n * @private\n */\n _resolveElementOptions: function _resolveElementOptions(rectangle, index) {\n var me = this;\n var chart = me.chart;\n var datasets = chart.data.datasets;\n var dataset = datasets[me.index];\n var custom = rectangle.custom || {};\n var options = chart.options.elements.rectangle;\n var values = {};\n var i, ilen, key;\n\n // Scriptable options\n var context = {\n chart: chart,\n dataIndex: index,\n dataset: dataset,\n datasetIndex: me.index\n };\n var keys = ['backgroundColor', 'borderColor', 'borderSkipped', 'borderWidth'];\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n values[key] = resolve$1([custom[key], dataset[key], options[key]], context, index);\n }\n return values;\n }\n });\n var valueOrDefault$3 = helpers$1.valueOrDefault;\n var resolve$2 = helpers$1.options.resolve;\n core_defaults._set('bubble', {\n hover: {\n mode: 'single'\n },\n scales: {\n xAxes: [{\n type: 'linear',\n // bubble should probably use a linear scale by default\n position: 'bottom',\n id: 'x-axis-0' // need an ID so datasets can reference the scale\n }],\n\n yAxes: [{\n type: 'linear',\n position: 'left',\n id: 'y-axis-0'\n }]\n },\n tooltips: {\n callbacks: {\n title: function title() {\n // Title doesn't make sense for scatter since we format the data as a point\n return '';\n },\n label: function label(item, data) {\n var datasetLabel = data.datasets[item.datasetIndex].label || '';\n var dataPoint = data.datasets[item.datasetIndex].data[item.index];\n return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n }\n }\n }\n });\n var controller_bubble = core_datasetController.extend({\n /**\n * @protected\n */\n dataElementType: elements.Point,\n /**\n * @protected\n */\n update: function update(reset) {\n var me = this;\n var meta = me.getMeta();\n var points = meta.data;\n\n // Update Points\n helpers$1.each(points, function (point, index) {\n me.updateElement(point, index, reset);\n });\n },\n /**\n * @protected\n */\n updateElement: function updateElement(point, index, reset) {\n var me = this;\n var meta = me.getMeta();\n var custom = point.custom || {};\n var xScale = me.getScaleForId(meta.xAxisID);\n var yScale = me.getScaleForId(meta.yAxisID);\n var options = me._resolveElementOptions(point, index);\n var data = me.getDataset().data[index];\n var dsIndex = me.index;\n var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(_typeof(data) === 'object' ? data : NaN, index, dsIndex);\n var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n point._xScale = xScale;\n point._yScale = yScale;\n point._options = options;\n point._datasetIndex = dsIndex;\n point._index = index;\n point._model = {\n backgroundColor: options.backgroundColor,\n borderColor: options.borderColor,\n borderWidth: options.borderWidth,\n hitRadius: options.hitRadius,\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n radius: reset ? 0 : options.radius,\n skip: custom.skip || isNaN(x) || isNaN(y),\n x: x,\n y: y\n };\n point.pivot();\n },\n /**\n * @protected\n */\n setHoverStyle: function setHoverStyle(point) {\n var model = point._model;\n var options = point._options;\n var getHoverColor = helpers$1.getHoverColor;\n point.$previousStyle = {\n backgroundColor: model.backgroundColor,\n borderColor: model.borderColor,\n borderWidth: model.borderWidth,\n radius: model.radius\n };\n model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor));\n model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth);\n model.radius = options.radius + options.hoverRadius;\n },\n /**\n * @private\n */\n _resolveElementOptions: function _resolveElementOptions(point, index) {\n var me = this;\n var chart = me.chart;\n var datasets = chart.data.datasets;\n var dataset = datasets[me.index];\n var custom = point.custom || {};\n var options = chart.options.elements.point;\n var data = dataset.data[index];\n var values = {};\n var i, ilen, key;\n\n // Scriptable options\n var context = {\n chart: chart,\n dataIndex: index,\n dataset: dataset,\n datasetIndex: me.index\n };\n var keys = ['backgroundColor', 'borderColor', 'borderWidth', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth', 'hoverRadius', 'hitRadius', 'pointStyle', 'rotation'];\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n values[key] = resolve$2([custom[key], dataset[key], options[key]], context, index);\n }\n\n // Custom radius resolution\n values.radius = resolve$2([custom.radius, data ? data.r : undefined, dataset.radius, options.radius], context, index);\n return values;\n }\n });\n var resolve$3 = helpers$1.options.resolve;\n var valueOrDefault$4 = helpers$1.valueOrDefault;\n core_defaults._set('doughnut', {\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n hover: {\n mode: 'single'\n },\n legendCallback: function legendCallback(chart) {\n var text = [];\n text.push('
');\n var data = chart.data;\n var datasets = data.datasets;\n var labels = data.labels;\n if (datasets.length) {\n for (var i = 0; i < datasets[0].data.length; ++i) {\n text.push('
');\n if (labels[i]) {\n text.push(labels[i]);\n }\n text.push('
');\n }\n }\n text.push('
');\n return text.join('');\n },\n legend: {\n labels: {\n generateLabels: function generateLabels(chart) {\n var data = chart.data;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map(function (label, i) {\n var meta = chart.getDatasetMeta(0);\n var ds = data.datasets[0];\n var arc = meta.data[i];\n var custom = arc && arc.custom || {};\n var arcOpts = chart.options.elements.arc;\n var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);\n var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);\n var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);\n return {\n text: label,\n fillStyle: fill,\n strokeStyle: stroke,\n lineWidth: bw,\n hidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick: function onClick(e, legendItem) {\n var index = legendItem.index;\n var chart = this.chart;\n var i, ilen, meta;\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n // toggle visibility of index if exists\n if (meta.data[index]) {\n meta.data[index].hidden = !meta.data[index].hidden;\n }\n }\n chart.update();\n }\n },\n // The percentage of the chart that we cut out of the middle.\n cutoutPercentage: 50,\n // The rotation of the chart, where the first data arc begins.\n rotation: Math.PI * -0.5,\n // The total circumference of the chart.\n circumference: Math.PI * 2.0,\n // Need to override these to give a nice default\n tooltips: {\n callbacks: {\n title: function title() {\n return '';\n },\n label: function label(tooltipItem, data) {\n var dataLabel = data.labels[tooltipItem.index];\n var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n if (helpers$1.isArray(dataLabel)) {\n // show value on first line of multiline label\n // need to clone because we are changing the value\n dataLabel = dataLabel.slice();\n dataLabel[0] += value;\n } else {\n dataLabel += value;\n }\n return dataLabel;\n }\n }\n }\n });\n var controller_doughnut = core_datasetController.extend({\n dataElementType: elements.Arc,\n linkScales: helpers$1.noop,\n // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n getRingIndex: function getRingIndex(datasetIndex) {\n var ringIndex = 0;\n for (var j = 0; j < datasetIndex; ++j) {\n if (this.chart.isDatasetVisible(j)) {\n ++ringIndex;\n }\n }\n return ringIndex;\n },\n update: function update(reset) {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var opts = chart.options;\n var availableWidth = chartArea.right - chartArea.left;\n var availableHeight = chartArea.bottom - chartArea.top;\n var minSize = Math.min(availableWidth, availableHeight);\n var offset = {\n x: 0,\n y: 0\n };\n var meta = me.getMeta();\n var arcs = meta.data;\n var cutoutPercentage = opts.cutoutPercentage;\n var circumference = opts.circumference;\n var chartWeight = me._getRingWeight(me.index);\n var i, ilen;\n\n // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n if (circumference < Math.PI * 2.0) {\n var startAngle = opts.rotation % (Math.PI * 2.0);\n startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n var endAngle = startAngle + circumference;\n var start = {\n x: Math.cos(startAngle),\n y: Math.sin(startAngle)\n };\n var end = {\n x: Math.cos(endAngle),\n y: Math.sin(endAngle)\n };\n var contains0 = startAngle <= 0 && endAngle >= 0 || startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle;\n var contains90 = startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle || startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle;\n var contains180 = startAngle <= -Math.PI && -Math.PI <= endAngle || startAngle <= Math.PI && Math.PI <= endAngle;\n var contains270 = startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle || startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle;\n var cutout = cutoutPercentage / 100.0;\n var min = {\n x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)),\n y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))\n };\n var max = {\n x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)),\n y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))\n };\n var size = {\n width: (max.x - min.x) * 0.5,\n height: (max.y - min.y) * 0.5\n };\n minSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n offset = {\n x: (max.x + min.x) * -0.5,\n y: (max.y + min.y) * -0.5\n };\n }\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n arcs[i]._options = me._resolveElementOptions(arcs[i], i);\n }\n chart.borderWidth = me.getMaxBorderWidth();\n chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n chart.innerRadius = Math.max(cutoutPercentage ? chart.outerRadius / 100 * cutoutPercentage : 0, 0);\n chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1);\n chart.offsetX = offset.x * chart.outerRadius;\n chart.offsetY = offset.y * chart.outerRadius;\n meta.total = me.calculateTotal();\n me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index);\n me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0);\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n me.updateElement(arcs[i], i, reset);\n }\n },\n updateElement: function updateElement(arc, index, reset) {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var opts = chart.options;\n var animationOpts = opts.animation;\n var centerX = (chartArea.left + chartArea.right) / 2;\n var centerY = (chartArea.top + chartArea.bottom) / 2;\n var startAngle = opts.rotation; // non reset case handled later\n var endAngle = opts.rotation; // non reset case handled later\n var dataset = me.getDataset();\n var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));\n var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n var options = arc._options || {};\n helpers$1.extend(arc, {\n // Utility\n _datasetIndex: me.index,\n _index: index,\n // Desired view properties\n _model: {\n backgroundColor: options.backgroundColor,\n borderColor: options.borderColor,\n borderWidth: options.borderWidth,\n borderAlign: options.borderAlign,\n x: centerX + chart.offsetX,\n y: centerY + chart.offsetY,\n startAngle: startAngle,\n endAngle: endAngle,\n circumference: circumference,\n outerRadius: outerRadius,\n innerRadius: innerRadius,\n label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n }\n });\n var model = arc._model;\n\n // Set correct angles if not resetting\n if (!reset || !animationOpts.animateRotate) {\n if (index === 0) {\n model.startAngle = opts.rotation;\n } else {\n model.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n }\n model.endAngle = model.startAngle + model.circumference;\n }\n arc.pivot();\n },\n calculateTotal: function calculateTotal() {\n var dataset = this.getDataset();\n var meta = this.getMeta();\n var total = 0;\n var value;\n helpers$1.each(meta.data, function (element, index) {\n value = dataset.data[index];\n if (!isNaN(value) && !element.hidden) {\n total += Math.abs(value);\n }\n });\n\n /* if (total === 0) {\n \ttotal = NaN;\n }*/\n\n return total;\n },\n calculateCircumference: function calculateCircumference(value) {\n var total = this.getMeta().total;\n if (total > 0 && !isNaN(value)) {\n return Math.PI * 2.0 * (Math.abs(value) / total);\n }\n return 0;\n },\n // gets the max border or hover width to properly scale pie charts\n getMaxBorderWidth: function getMaxBorderWidth(arcs) {\n var me = this;\n var max = 0;\n var chart = me.chart;\n var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth;\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n if (i !== me.index) {\n controller = meta.controller;\n }\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n arc = arcs[i];\n options = controller ? controller._resolveElementOptions(arc, i) : arc._options;\n if (options.borderAlign !== 'inner') {\n borderWidth = options.borderWidth;\n hoverWidth = options.hoverBorderWidth;\n max = borderWidth > max ? borderWidth : max;\n max = hoverWidth > max ? hoverWidth : max;\n }\n }\n return max;\n },\n /**\n * @protected\n */\n setHoverStyle: function setHoverStyle(arc) {\n var model = arc._model;\n var options = arc._options;\n var getHoverColor = helpers$1.getHoverColor;\n arc.$previousStyle = {\n backgroundColor: model.backgroundColor,\n borderColor: model.borderColor,\n borderWidth: model.borderWidth\n };\n model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));\n model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);\n },\n /**\n * @private\n */\n _resolveElementOptions: function _resolveElementOptions(arc, index) {\n var me = this;\n var chart = me.chart;\n var dataset = me.getDataset();\n var custom = arc.custom || {};\n var options = chart.options.elements.arc;\n var values = {};\n var i, ilen, key;\n\n // Scriptable options\n var context = {\n chart: chart,\n dataIndex: index,\n dataset: dataset,\n datasetIndex: me.index\n };\n var keys = ['backgroundColor', 'borderColor', 'borderWidth', 'borderAlign', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth'];\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n values[key] = resolve$3([custom[key], dataset[key], options[key]], context, index);\n }\n return values;\n },\n /**\n * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n * @private\n */\n _getRingWeightOffset: function _getRingWeightOffset(datasetIndex) {\n var ringWeightOffset = 0;\n for (var i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n },\n /**\n * @private\n */\n _getRingWeight: function _getRingWeight(dataSetIndex) {\n return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0);\n },\n /**\n * Returns the sum of all visibile data set weights. This value can be 0.\n * @private\n */\n _getVisibleDatasetWeightTotal: function _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length);\n }\n });\n core_defaults._set('horizontalBar', {\n hover: {\n mode: 'index',\n axis: 'y'\n },\n scales: {\n xAxes: [{\n type: 'linear',\n position: 'bottom'\n }],\n yAxes: [{\n type: 'category',\n position: 'left',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n offset: true,\n gridLines: {\n offsetGridLines: true\n }\n }]\n },\n elements: {\n rectangle: {\n borderSkipped: 'left'\n }\n },\n tooltips: {\n mode: 'index',\n axis: 'y'\n }\n });\n var controller_horizontalBar = controller_bar.extend({\n /**\n * @private\n */\n _getValueScaleId: function _getValueScaleId() {\n return this.getMeta().xAxisID;\n },\n /**\n * @private\n */\n _getIndexScaleId: function _getIndexScaleId() {\n return this.getMeta().yAxisID;\n }\n });\n var valueOrDefault$5 = helpers$1.valueOrDefault;\n var resolve$4 = helpers$1.options.resolve;\n var isPointInArea = helpers$1.canvas._isPointInArea;\n core_defaults._set('line', {\n showLines: true,\n spanGaps: false,\n hover: {\n mode: 'label'\n },\n scales: {\n xAxes: [{\n type: 'category',\n id: 'x-axis-0'\n }],\n yAxes: [{\n type: 'linear',\n id: 'y-axis-0'\n }]\n }\n });\n function lineEnabled(dataset, options) {\n return valueOrDefault$5(dataset.showLine, options.showLines);\n }\n var controller_line = core_datasetController.extend({\n datasetElementType: elements.Line,\n dataElementType: elements.Point,\n update: function update(reset) {\n var me = this;\n var meta = me.getMeta();\n var line = meta.dataset;\n var points = meta.data || [];\n var scale = me.getScaleForId(meta.yAxisID);\n var dataset = me.getDataset();\n var showLine = lineEnabled(dataset, me.chart.options);\n var i, ilen;\n\n // Update Line\n if (showLine) {\n // Compatibility: If the properties are defined with only the old name, use those values\n if (dataset.tension !== undefined && dataset.lineTension === undefined) {\n dataset.lineTension = dataset.tension;\n }\n\n // Utility\n line._scale = scale;\n line._datasetIndex = me.index;\n // Data\n line._children = points;\n // Model\n line._model = me._resolveLineOptions(line);\n line.pivot();\n }\n\n // Update Points\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n me.updateElement(points[i], i, reset);\n }\n if (showLine && line._model.tension !== 0) {\n me.updateBezierControlPoints();\n }\n\n // Now pivot the point for animation\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n points[i].pivot();\n }\n },\n updateElement: function updateElement(point, index, reset) {\n var me = this;\n var meta = me.getMeta();\n var custom = point.custom || {};\n var dataset = me.getDataset();\n var datasetIndex = me.index;\n var value = dataset.data[index];\n var yScale = me.getScaleForId(meta.yAxisID);\n var xScale = me.getScaleForId(meta.xAxisID);\n var lineModel = meta.dataset._model;\n var x, y;\n var options = me._resolvePointOptions(point, index);\n x = xScale.getPixelForValue(_typeof(value) === 'object' ? value : NaN, index, datasetIndex);\n y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n // Utility\n point._xScale = xScale;\n point._yScale = yScale;\n point._options = options;\n point._datasetIndex = datasetIndex;\n point._index = index;\n\n // Desired view properties\n point._model = {\n x: x,\n y: y,\n skip: custom.skip || isNaN(x) || isNaN(y),\n // Appearance\n radius: options.radius,\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n backgroundColor: options.backgroundColor,\n borderColor: options.borderColor,\n borderWidth: options.borderWidth,\n tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0),\n steppedLine: lineModel ? lineModel.steppedLine : false,\n // Tooltip\n hitRadius: options.hitRadius\n };\n },\n /**\n * @private\n */\n _resolvePointOptions: function _resolvePointOptions(element, index) {\n var me = this;\n var chart = me.chart;\n var dataset = chart.data.datasets[me.index];\n var custom = element.custom || {};\n var options = chart.options.elements.point;\n var values = {};\n var i, ilen, key;\n\n // Scriptable options\n var context = {\n chart: chart,\n dataIndex: index,\n dataset: dataset,\n datasetIndex: me.index\n };\n var ELEMENT_OPTIONS = {\n backgroundColor: 'pointBackgroundColor',\n borderColor: 'pointBorderColor',\n borderWidth: 'pointBorderWidth',\n hitRadius: 'pointHitRadius',\n hoverBackgroundColor: 'pointHoverBackgroundColor',\n hoverBorderColor: 'pointHoverBorderColor',\n hoverBorderWidth: 'pointHoverBorderWidth',\n hoverRadius: 'pointHoverRadius',\n pointStyle: 'pointStyle',\n radius: 'pointRadius',\n rotation: 'pointRotation'\n };\n var keys = Object.keys(ELEMENT_OPTIONS);\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n values[key] = resolve$4([custom[key], dataset[ELEMENT_OPTIONS[key]], dataset[key], options[key]], context, index);\n }\n return values;\n },\n /**\n * @private\n */\n _resolveLineOptions: function _resolveLineOptions(element) {\n var me = this;\n var chart = me.chart;\n var dataset = chart.data.datasets[me.index];\n var custom = element.custom || {};\n var options = chart.options;\n var elementOptions = options.elements.line;\n var values = {};\n var i, ilen, key;\n var keys = ['backgroundColor', 'borderWidth', 'borderColor', 'borderCapStyle', 'borderDash', 'borderDashOffset', 'borderJoinStyle', 'fill', 'cubicInterpolationMode'];\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n values[key] = resolve$4([custom[key], dataset[key], elementOptions[key]]);\n }\n\n // The default behavior of lines is to break at null values, according\n // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n // This option gives lines the ability to span gaps\n values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps);\n values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension);\n values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]);\n return values;\n },\n calculatePointY: function calculatePointY(value, index, datasetIndex) {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var yScale = me.getScaleForId(meta.yAxisID);\n var sumPos = 0;\n var sumNeg = 0;\n var i, ds, dsMeta;\n if (yScale.options.stacked) {\n for (i = 0; i < datasetIndex; i++) {\n ds = chart.data.datasets[i];\n dsMeta = chart.getDatasetMeta(i);\n if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n var stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n if (stackedRightValue < 0) {\n sumNeg += stackedRightValue || 0;\n } else {\n sumPos += stackedRightValue || 0;\n }\n }\n }\n var rightValue = Number(yScale.getRightValue(value));\n if (rightValue < 0) {\n return yScale.getPixelForValue(sumNeg + rightValue);\n }\n return yScale.getPixelForValue(sumPos + rightValue);\n }\n return yScale.getPixelForValue(value);\n },\n updateBezierControlPoints: function updateBezierControlPoints() {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var lineModel = meta.dataset._model;\n var area = chart.chartArea;\n var points = meta.data || [];\n var i, ilen, model, controlPoints;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (lineModel.spanGaps) {\n points = points.filter(function (pt) {\n return !pt._model.skip;\n });\n }\n function capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n }\n if (lineModel.cubicInterpolationMode === 'monotone') {\n helpers$1.splineCurveMonotone(points);\n } else {\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n model = points[i]._model;\n controlPoints = helpers$1.splineCurve(helpers$1.previousItem(points, i)._model, model, helpers$1.nextItem(points, i)._model, lineModel.tension);\n model.controlPointPreviousX = controlPoints.previous.x;\n model.controlPointPreviousY = controlPoints.previous.y;\n model.controlPointNextX = controlPoints.next.x;\n model.controlPointNextY = controlPoints.next.y;\n }\n }\n if (chart.options.elements.line.capBezierPoints) {\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n model = points[i]._model;\n if (isPointInArea(model, area)) {\n if (i > 0 && isPointInArea(points[i - 1]._model, area)) {\n model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n }\n if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) {\n model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n }\n }\n }\n }\n },\n draw: function draw() {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var points = meta.data || [];\n var area = chart.chartArea;\n var ilen = points.length;\n var halfBorderWidth;\n var i = 0;\n if (lineEnabled(me.getDataset(), chart.options)) {\n halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2;\n helpers$1.canvas.clipArea(chart.ctx, {\n left: area.left,\n right: area.right,\n top: area.top - halfBorderWidth,\n bottom: area.bottom + halfBorderWidth\n });\n meta.dataset.draw();\n helpers$1.canvas.unclipArea(chart.ctx);\n }\n\n // Draw the points\n for (; i < ilen; ++i) {\n points[i].draw(area);\n }\n },\n /**\n * @protected\n */\n setHoverStyle: function setHoverStyle(point) {\n var model = point._model;\n var options = point._options;\n var getHoverColor = helpers$1.getHoverColor;\n point.$previousStyle = {\n backgroundColor: model.backgroundColor,\n borderColor: model.borderColor,\n borderWidth: model.borderWidth,\n radius: model.radius\n };\n model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));\n model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);\n model.radius = valueOrDefault$5(options.hoverRadius, options.radius);\n }\n });\n var resolve$5 = helpers$1.options.resolve;\n core_defaults._set('polarArea', {\n scale: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n gridLines: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n ticks: {\n beginAtZero: true\n }\n },\n // Boolean - Whether to animate the rotation of the chart\n animation: {\n animateRotate: true,\n animateScale: true\n },\n startAngle: -0.5 * Math.PI,\n legendCallback: function legendCallback(chart) {\n var text = [];\n text.push('
');\n var data = chart.data;\n var datasets = data.datasets;\n var labels = data.labels;\n if (datasets.length) {\n for (var i = 0; i < datasets[0].data.length; ++i) {\n text.push('
');\n if (labels[i]) {\n text.push(labels[i]);\n }\n text.push('
');\n }\n }\n text.push('
');\n return text.join('');\n },\n legend: {\n labels: {\n generateLabels: function generateLabels(chart) {\n var data = chart.data;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map(function (label, i) {\n var meta = chart.getDatasetMeta(0);\n var ds = data.datasets[0];\n var arc = meta.data[i];\n var custom = arc.custom || {};\n var arcOpts = chart.options.elements.arc;\n var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);\n var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);\n var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);\n return {\n text: label,\n fillStyle: fill,\n strokeStyle: stroke,\n lineWidth: bw,\n hidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick: function onClick(e, legendItem) {\n var index = legendItem.index;\n var chart = this.chart;\n var i, ilen, meta;\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n meta.data[index].hidden = !meta.data[index].hidden;\n }\n chart.update();\n }\n },\n // Need to override these to give a nice default\n tooltips: {\n callbacks: {\n title: function title() {\n return '';\n },\n label: function label(item, data) {\n return data.labels[item.index] + ': ' + item.yLabel;\n }\n }\n }\n });\n var controller_polarArea = core_datasetController.extend({\n dataElementType: elements.Arc,\n linkScales: helpers$1.noop,\n update: function update(reset) {\n var me = this;\n var dataset = me.getDataset();\n var meta = me.getMeta();\n var start = me.chart.options.startAngle || 0;\n var starts = me._starts = [];\n var angles = me._angles = [];\n var arcs = meta.data;\n var i, ilen, angle;\n me._updateRadius();\n meta.count = me.countVisibleElements();\n for (i = 0, ilen = dataset.data.length; i < ilen; i++) {\n starts[i] = start;\n angle = me._computeAngle(i);\n angles[i] = angle;\n start += angle;\n }\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n arcs[i]._options = me._resolveElementOptions(arcs[i], i);\n me.updateElement(arcs[i], i, reset);\n }\n },\n /**\n * @private\n */\n _updateRadius: function _updateRadius() {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var opts = chart.options;\n var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n chart.outerRadius = Math.max(minSize / 2, 0);\n chart.innerRadius = Math.max(opts.cutoutPercentage ? chart.outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n me.outerRadius = chart.outerRadius - chart.radiusLength * me.index;\n me.innerRadius = me.outerRadius - chart.radiusLength;\n },\n updateElement: function updateElement(arc, index, reset) {\n var me = this;\n var chart = me.chart;\n var dataset = me.getDataset();\n var opts = chart.options;\n var animationOpts = opts.animation;\n var scale = chart.scale;\n var labels = chart.data.labels;\n var centerX = scale.xCenter;\n var centerY = scale.yCenter;\n\n // var negHalfPI = -0.5 * Math.PI;\n var datasetStartAngle = opts.startAngle;\n var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n var startAngle = me._starts[index];\n var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]);\n var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n var options = arc._options || {};\n helpers$1.extend(arc, {\n // Utility\n _datasetIndex: me.index,\n _index: index,\n _scale: scale,\n // Desired view properties\n _model: {\n backgroundColor: options.backgroundColor,\n borderColor: options.borderColor,\n borderWidth: options.borderWidth,\n borderAlign: options.borderAlign,\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius: reset ? resetRadius : distance,\n startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index])\n }\n });\n arc.pivot();\n },\n countVisibleElements: function countVisibleElements() {\n var dataset = this.getDataset();\n var meta = this.getMeta();\n var count = 0;\n helpers$1.each(meta.data, function (element, index) {\n if (!isNaN(dataset.data[index]) && !element.hidden) {\n count++;\n }\n });\n return count;\n },\n /**\n * @protected\n */\n setHoverStyle: function setHoverStyle(arc) {\n var model = arc._model;\n var options = arc._options;\n var getHoverColor = helpers$1.getHoverColor;\n var valueOrDefault = helpers$1.valueOrDefault;\n arc.$previousStyle = {\n backgroundColor: model.backgroundColor,\n borderColor: model.borderColor,\n borderWidth: model.borderWidth\n };\n model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor));\n model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n },\n /**\n * @private\n */\n _resolveElementOptions: function _resolveElementOptions(arc, index) {\n var me = this;\n var chart = me.chart;\n var dataset = me.getDataset();\n var custom = arc.custom || {};\n var options = chart.options.elements.arc;\n var values = {};\n var i, ilen, key;\n\n // Scriptable options\n var context = {\n chart: chart,\n dataIndex: index,\n dataset: dataset,\n datasetIndex: me.index\n };\n var keys = ['backgroundColor', 'borderColor', 'borderWidth', 'borderAlign', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth'];\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n values[key] = resolve$5([custom[key], dataset[key], options[key]], context, index);\n }\n return values;\n },\n /**\n * @private\n */\n _computeAngle: function _computeAngle(index) {\n var me = this;\n var count = this.getMeta().count;\n var dataset = me.getDataset();\n var meta = me.getMeta();\n if (isNaN(dataset.data[index]) || meta.data[index].hidden) {\n return 0;\n }\n\n // Scriptable options\n var context = {\n chart: me.chart,\n dataIndex: index,\n dataset: dataset,\n datasetIndex: me.index\n };\n return resolve$5([me.chart.options.elements.arc.angle, 2 * Math.PI / count], context, index);\n }\n });\n core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut));\n core_defaults._set('pie', {\n cutoutPercentage: 0\n });\n\n // Pie charts are Doughnut chart with different defaults\n var controller_pie = controller_doughnut;\n var valueOrDefault$6 = helpers$1.valueOrDefault;\n var resolve$6 = helpers$1.options.resolve;\n core_defaults._set('radar', {\n scale: {\n type: 'radialLinear'\n },\n elements: {\n line: {\n tension: 0 // no bezier in radar\n }\n }\n });\n\n var controller_radar = core_datasetController.extend({\n datasetElementType: elements.Line,\n dataElementType: elements.Point,\n linkScales: helpers$1.noop,\n update: function update(reset) {\n var me = this;\n var meta = me.getMeta();\n var line = meta.dataset;\n var points = meta.data || [];\n var scale = me.chart.scale;\n var dataset = me.getDataset();\n var i, ilen;\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if (dataset.tension !== undefined && dataset.lineTension === undefined) {\n dataset.lineTension = dataset.tension;\n }\n\n // Utility\n line._scale = scale;\n line._datasetIndex = me.index;\n // Data\n line._children = points;\n line._loop = true;\n // Model\n line._model = me._resolveLineOptions(line);\n line.pivot();\n\n // Update Points\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n me.updateElement(points[i], i, reset);\n }\n\n // Update bezier control points\n me.updateBezierControlPoints();\n\n // Now pivot the point for animation\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n points[i].pivot();\n }\n },\n updateElement: function updateElement(point, index, reset) {\n var me = this;\n var custom = point.custom || {};\n var dataset = me.getDataset();\n var scale = me.chart.scale;\n var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n var options = me._resolvePointOptions(point, index);\n var lineModel = me.getMeta().dataset._model;\n var x = reset ? scale.xCenter : pointPosition.x;\n var y = reset ? scale.yCenter : pointPosition.y;\n\n // Utility\n point._scale = scale;\n point._options = options;\n point._datasetIndex = me.index;\n point._index = index;\n\n // Desired view properties\n point._model = {\n x: x,\n // value not used in dataset scale, but we want a consistent API between scales\n y: y,\n skip: custom.skip || isNaN(x) || isNaN(y),\n // Appearance\n radius: options.radius,\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n backgroundColor: options.backgroundColor,\n borderColor: options.borderColor,\n borderWidth: options.borderWidth,\n tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0),\n // Tooltip\n hitRadius: options.hitRadius\n };\n },\n /**\n * @private\n */\n _resolvePointOptions: function _resolvePointOptions(element, index) {\n var me = this;\n var chart = me.chart;\n var dataset = chart.data.datasets[me.index];\n var custom = element.custom || {};\n var options = chart.options.elements.point;\n var values = {};\n var i, ilen, key;\n\n // Scriptable options\n var context = {\n chart: chart,\n dataIndex: index,\n dataset: dataset,\n datasetIndex: me.index\n };\n var ELEMENT_OPTIONS = {\n backgroundColor: 'pointBackgroundColor',\n borderColor: 'pointBorderColor',\n borderWidth: 'pointBorderWidth',\n hitRadius: 'pointHitRadius',\n hoverBackgroundColor: 'pointHoverBackgroundColor',\n hoverBorderColor: 'pointHoverBorderColor',\n hoverBorderWidth: 'pointHoverBorderWidth',\n hoverRadius: 'pointHoverRadius',\n pointStyle: 'pointStyle',\n radius: 'pointRadius',\n rotation: 'pointRotation'\n };\n var keys = Object.keys(ELEMENT_OPTIONS);\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n values[key] = resolve$6([custom[key], dataset[ELEMENT_OPTIONS[key]], dataset[key], options[key]], context, index);\n }\n return values;\n },\n /**\n * @private\n */\n _resolveLineOptions: function _resolveLineOptions(element) {\n var me = this;\n var chart = me.chart;\n var dataset = chart.data.datasets[me.index];\n var custom = element.custom || {};\n var options = chart.options.elements.line;\n var values = {};\n var i, ilen, key;\n var keys = ['backgroundColor', 'borderWidth', 'borderColor', 'borderCapStyle', 'borderDash', 'borderDashOffset', 'borderJoinStyle', 'fill'];\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n values[key] = resolve$6([custom[key], dataset[key], options[key]]);\n }\n values.tension = valueOrDefault$6(dataset.lineTension, options.tension);\n return values;\n },\n updateBezierControlPoints: function updateBezierControlPoints() {\n var me = this;\n var meta = me.getMeta();\n var area = me.chart.chartArea;\n var points = meta.data || [];\n var i, ilen, model, controlPoints;\n function capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n }\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n model = points[i]._model;\n controlPoints = helpers$1.splineCurve(helpers$1.previousItem(points, i, true)._model, model, helpers$1.nextItem(points, i, true)._model, model.tension);\n\n // Prevent the bezier going outside of the bounds of the graph\n model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right);\n model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom);\n model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right);\n model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom);\n }\n },\n setHoverStyle: function setHoverStyle(point) {\n var model = point._model;\n var options = point._options;\n var getHoverColor = helpers$1.getHoverColor;\n point.$previousStyle = {\n backgroundColor: model.backgroundColor,\n borderColor: model.borderColor,\n borderWidth: model.borderWidth,\n radius: model.radius\n };\n model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor));\n model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth);\n model.radius = valueOrDefault$6(options.hoverRadius, options.radius);\n }\n });\n core_defaults._set('scatter', {\n hover: {\n mode: 'single'\n },\n scales: {\n xAxes: [{\n id: 'x-axis-1',\n // need an ID so datasets can reference the scale\n type: 'linear',\n // scatter should not use a category axis\n position: 'bottom'\n }],\n yAxes: [{\n id: 'y-axis-1',\n type: 'linear',\n position: 'left'\n }]\n },\n showLines: false,\n tooltips: {\n callbacks: {\n title: function title() {\n return ''; // doesn't make sense for scatter since data are formatted as a point\n },\n\n label: function label(item) {\n return '(' + item.xLabel + ', ' + item.yLabel + ')';\n }\n }\n }\n });\n\n // Scatter charts use line controllers\n var controller_scatter = controller_line;\n\n // NOTE export a map in which the key represents the controller type, not\n // the class, and so must be CamelCase in order to be correctly retrieved\n // by the controller in core.controller.js (`controllers[meta.type]`).\n\n var controllers = {\n bar: controller_bar,\n bubble: controller_bubble,\n doughnut: controller_doughnut,\n horizontalBar: controller_horizontalBar,\n line: controller_line,\n polarArea: controller_polarArea,\n pie: controller_pie,\n radar: controller_radar,\n scatter: controller_scatter\n };\n\n /**\n * Helper function to get relative position for an event\n * @param {Event|IEvent} event - The event to get the position for\n * @param {Chart} chart - The chart\n * @returns {object} the event position\n */\n function getRelativePosition(e, chart) {\n if (e[\"native\"]) {\n return {\n x: e.x,\n y: e.y\n };\n }\n return helpers$1.getRelativePosition(e, chart);\n }\n\n /**\n * Helper function to traverse all of the visible elements in the chart\n * @param {Chart} chart - the chart\n * @param {function} handler - the callback to execute for each visible item\n */\n function parseVisibleItems(chart, handler) {\n var datasets = chart.data.datasets;\n var meta, i, j, ilen, jlen;\n for (i = 0, ilen = datasets.length; i < ilen; ++i) {\n if (!chart.isDatasetVisible(i)) {\n continue;\n }\n meta = chart.getDatasetMeta(i);\n for (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n var element = meta.data[j];\n if (!element._view.skip) {\n handler(element);\n }\n }\n }\n }\n\n /**\n * Helper function to get the items that intersect the event position\n * @param {ChartElement[]} items - elements to filter\n * @param {object} position - the point to be nearest to\n * @return {ChartElement[]} the nearest items\n */\n function getIntersectItems(chart, position) {\n var elements = [];\n parseVisibleItems(chart, function (element) {\n if (element.inRange(position.x, position.y)) {\n elements.push(element);\n }\n });\n return elements;\n }\n\n /**\n * Helper function to get the items nearest to the event position considering all visible items in teh chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {object} position - the point to be nearest to\n * @param {boolean} intersect - if true, only consider items that intersect the position\n * @param {function} distanceMetric - function to provide the distance between points\n * @return {ChartElement[]} the nearest items\n */\n function getNearestItems(chart, position, intersect, distanceMetric) {\n var minDistance = Number.POSITIVE_INFINITY;\n var nearestItems = [];\n parseVisibleItems(chart, function (element) {\n if (intersect && !element.inRange(position.x, position.y)) {\n return;\n }\n var center = element.getCenterPoint();\n var distance = distanceMetric(position, center);\n if (distance < minDistance) {\n nearestItems = [element];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n nearestItems.push(element);\n }\n });\n return nearestItems;\n }\n\n /**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy\n */\n function getDistanceMetricForAxis(axis) {\n var useX = axis.indexOf('x') !== -1;\n var useY = axis.indexOf('y') !== -1;\n return function (pt1, pt2) {\n var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n }\n function indexMode(chart, e, options) {\n var position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n options.axis = options.axis || 'x';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n var elements = [];\n if (!items.length) {\n return [];\n }\n chart.data.datasets.forEach(function (dataset, datasetIndex) {\n if (chart.isDatasetVisible(datasetIndex)) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var element = meta.data[items[0]._index];\n\n // don't count items that are skipped (null data)\n if (element && !element._view.skip) {\n elements.push(element);\n }\n }\n });\n return elements;\n }\n\n /**\n * @interface IInteractionOptions\n */\n /**\n * If true, only consider items that intersect the point\n * @name IInterfaceOptions#boolean\n * @type Boolean\n */\n\n /**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\n var core_interaction = {\n // Helper function for different modes\n modes: {\n single: function single(chart, e) {\n var position = getRelativePosition(e, chart);\n var elements = [];\n parseVisibleItems(chart, function (element) {\n if (element.inRange(position.x, position.y)) {\n elements.push(element);\n return elements;\n }\n });\n return elements.slice(0, 1);\n },\n /**\n * @function Chart.Interaction.modes.label\n * @deprecated since version 2.4.0\n * @todo remove at version 3\n * @private\n */\n label: indexMode,\n /**\n * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n * @function Chart.Interaction.modes.index\n * @since v2.4.0\n * @param {Chart} chart - the chart we are returning items from\n * @param {Event} e - the event we are find things at\n * @param {IInteractionOptions} options - options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n index: indexMode,\n /**\n * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect is false, we find the nearest item and return the items in that dataset\n * @function Chart.Interaction.modes.dataset\n * @param {Chart} chart - the chart we are returning items from\n * @param {Event} e - the event we are find things at\n * @param {IInteractionOptions} options - options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n dataset: function dataset(chart, e, options) {\n var position = getRelativePosition(e, chart);\n options.axis = options.axis || 'xy';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n if (items.length > 0) {\n items = chart.getDatasetMeta(items[0]._datasetIndex).data;\n }\n return items;\n },\n /**\n * @function Chart.Interaction.modes.x-axis\n * @deprecated since version 2.4.0. Use index mode and intersect == true\n * @todo remove at version 3\n * @private\n */\n 'x-axis': function xAxis(chart, e) {\n return indexMode(chart, e, {\n intersect: false\n });\n },\n /**\n * Point mode returns all elements that hit test based on the event position\n * of the event\n * @function Chart.Interaction.modes.intersect\n * @param {Chart} chart - the chart we are returning items from\n * @param {Event} e - the event we are find things at\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n point: function point(chart, e) {\n var position = getRelativePosition(e, chart);\n return getIntersectItems(chart, position);\n },\n /**\n * nearest mode returns the element closest to the point\n * @function Chart.Interaction.modes.intersect\n * @param {Chart} chart - the chart we are returning items from\n * @param {Event} e - the event we are find things at\n * @param {IInteractionOptions} options - options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n nearest: function nearest(chart, e, options) {\n var position = getRelativePosition(e, chart);\n options.axis = options.axis || 'xy';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n return getNearestItems(chart, position, options.intersect, distanceMetric);\n },\n /**\n * x mode returns the elements that hit-test at the current x coordinate\n * @function Chart.Interaction.modes.x\n * @param {Chart} chart - the chart we are returning items from\n * @param {Event} e - the event we are find things at\n * @param {IInteractionOptions} options - options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n x: function x(chart, e, options) {\n var position = getRelativePosition(e, chart);\n var items = [];\n var intersectsItem = false;\n parseVisibleItems(chart, function (element) {\n if (element.inXRange(position.x)) {\n items.push(element);\n }\n if (element.inRange(position.x, position.y)) {\n intersectsItem = true;\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (options.intersect && !intersectsItem) {\n items = [];\n }\n return items;\n },\n /**\n * y mode returns the elements that hit-test at the current y coordinate\n * @function Chart.Interaction.modes.y\n * @param {Chart} chart - the chart we are returning items from\n * @param {Event} e - the event we are find things at\n * @param {IInteractionOptions} options - options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n y: function y(chart, e, options) {\n var position = getRelativePosition(e, chart);\n var items = [];\n var intersectsItem = false;\n parseVisibleItems(chart, function (element) {\n if (element.inYRange(position.y)) {\n items.push(element);\n }\n if (element.inRange(position.x, position.y)) {\n intersectsItem = true;\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (options.intersect && !intersectsItem) {\n items = [];\n }\n return items;\n }\n }\n };\n function filterByPosition(array, position) {\n return helpers$1.where(array, function (v) {\n return v.position === position;\n });\n }\n function sortByWeight(array, reverse) {\n array.forEach(function (v, i) {\n v._tmpIndex_ = i;\n return v;\n });\n array.sort(function (a, b) {\n var v0 = reverse ? b : a;\n var v1 = reverse ? a : b;\n return v0.weight === v1.weight ? v0._tmpIndex_ - v1._tmpIndex_ : v0.weight - v1.weight;\n });\n array.forEach(function (v) {\n delete v._tmpIndex_;\n });\n }\n function findMaxPadding(boxes) {\n var top = 0;\n var left = 0;\n var bottom = 0;\n var right = 0;\n helpers$1.each(boxes, function (box) {\n if (box.getPadding) {\n var boxPadding = box.getPadding();\n top = Math.max(top, boxPadding.top);\n left = Math.max(left, boxPadding.left);\n bottom = Math.max(bottom, boxPadding.bottom);\n right = Math.max(right, boxPadding.right);\n }\n });\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right\n };\n }\n function addSizeByPosition(boxes, size) {\n helpers$1.each(boxes, function (box) {\n size[box.position] += box.isHorizontal() ? box.height : box.width;\n });\n }\n core_defaults._set('global', {\n layout: {\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n }\n });\n\n /**\n * @interface ILayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} getPadding - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n // The layout service is very self explanatory. It's responsible for the layout within a chart.\n // Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n // It is this service's responsibility of carrying out that layout.\n var core_layouts = {\n defaults: {},\n /**\n * Register a box to a chart.\n * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n * @param {Chart} chart - the chart to use\n * @param {ILayoutItem} item - the item to add to be layed out\n */\n addBox: function addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullWidth = item.fullWidth || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n chart.boxes.push(item);\n },\n /**\n * Remove a layoutItem from a chart\n * @param {Chart} chart - the chart to remove the box from\n * @param {ILayoutItem} layoutItem - the item to remove from the layout\n */\n removeBox: function removeBox(chart, layoutItem) {\n var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n /**\n * Sets (or updates) options on the given `item`.\n * @param {Chart} chart - the chart in which the item lives (or will be added to)\n * @param {ILayoutItem} item - the item to configure with the given options\n * @param {object} options - the new item options.\n */\n configure: function configure(chart, item, options) {\n var props = ['fullWidth', 'position', 'weight'];\n var ilen = props.length;\n var i = 0;\n var prop;\n for (; i < ilen; ++i) {\n prop = props[i];\n if (options.hasOwnProperty(prop)) {\n item[prop] = options[prop];\n }\n }\n },\n /**\n * Fits boxes of the given chart into the given size by having each box measure itself\n * then running a fitting algorithm\n * @param {Chart} chart - the chart\n * @param {number} width - the width to fit into\n * @param {number} height - the height to fit into\n */\n update: function update(chart, width, height) {\n if (!chart) {\n return;\n }\n var layoutOptions = chart.options.layout || {};\n var padding = helpers$1.options.toPadding(layoutOptions.padding);\n var leftPadding = padding.left;\n var rightPadding = padding.right;\n var topPadding = padding.top;\n var bottomPadding = padding.bottom;\n var leftBoxes = filterByPosition(chart.boxes, 'left');\n var rightBoxes = filterByPosition(chart.boxes, 'right');\n var topBoxes = filterByPosition(chart.boxes, 'top');\n var bottomBoxes = filterByPosition(chart.boxes, 'bottom');\n var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');\n\n // Sort boxes by weight. A higher weight is further away from the chart area\n sortByWeight(leftBoxes, true);\n sortByWeight(rightBoxes, false);\n sortByWeight(topBoxes, true);\n sortByWeight(bottomBoxes, false);\n var verticalBoxes = leftBoxes.concat(rightBoxes);\n var horizontalBoxes = topBoxes.concat(bottomBoxes);\n var outerBoxes = verticalBoxes.concat(horizontalBoxes);\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n // What we do to find the best sizing, we do the following\n // 1. Determine the minimum size of the chart area.\n // 2. Split the remaining width equally between each vertical axis\n // 3. Split the remaining height equally between each horizontal axis\n // 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n // 5. Adjust the sizes of each axis based on it's minimum reported size.\n // 6. Refit each axis\n // 7. Position each axis in the final location\n // 8. Tell the chart the final location of the chart area\n // 9. Tell any axes that overlay the chart area the positions of the chart area\n\n // Step 1\n var chartWidth = width - leftPadding - rightPadding;\n var chartHeight = height - topPadding - bottomPadding;\n var chartAreaWidth = chartWidth / 2; // min 50%\n\n // Step 2\n var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length;\n\n // Step 3\n // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837)\n // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length;\n\n // Step 4\n var maxChartAreaWidth = chartWidth;\n var maxChartAreaHeight = chartHeight;\n var outerBoxSizes = {\n top: topPadding,\n left: leftPadding,\n bottom: bottomPadding,\n right: rightPadding\n };\n var minBoxSizes = [];\n var maxPadding;\n function getMinimumBoxSize(box) {\n var minSize;\n var isHorizontal = box.isHorizontal();\n if (isHorizontal) {\n minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2);\n maxChartAreaHeight -= minSize.height;\n } else {\n minSize = box.update(verticalBoxWidth, maxChartAreaHeight);\n maxChartAreaWidth -= minSize.width;\n }\n minBoxSizes.push({\n horizontal: isHorizontal,\n width: minSize.width,\n box: box\n });\n }\n helpers$1.each(outerBoxes, getMinimumBoxSize);\n\n // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n maxPadding = findMaxPadding(outerBoxes);\n\n // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n // be if the axes are drawn at their minimum sizes.\n // Steps 5 & 6\n\n // Function to fit a box\n function fitBox(box) {\n var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function (minBox) {\n return minBox.box === box;\n });\n if (minBoxSize) {\n if (minBoxSize.horizontal) {\n var scaleMargin = {\n left: Math.max(outerBoxSizes.left, maxPadding.left),\n right: Math.max(outerBoxSizes.right, maxPadding.right),\n top: 0,\n bottom: 0\n };\n\n // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n // on the margin. Sometimes they need to increase in size slightly\n box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n } else {\n box.update(minBoxSize.width, maxChartAreaHeight);\n }\n }\n }\n\n // Update, and calculate the left and right margins for the horizontal boxes\n helpers$1.each(verticalBoxes, fitBox);\n addSizeByPosition(verticalBoxes, outerBoxSizes);\n\n // Set the Left and Right margins for the horizontal boxes\n helpers$1.each(horizontalBoxes, fitBox);\n addSizeByPosition(horizontalBoxes, outerBoxSizes);\n function finalFitVerticalBox(box) {\n var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function (minSize) {\n return minSize.box === box;\n });\n var scaleMargin = {\n left: 0,\n right: 0,\n top: outerBoxSizes.top,\n bottom: outerBoxSizes.bottom\n };\n if (minBoxSize) {\n box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin);\n }\n }\n\n // Let the left layout know the final margin\n helpers$1.each(verticalBoxes, finalFitVerticalBox);\n\n // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n outerBoxSizes = {\n top: topPadding,\n left: leftPadding,\n bottom: bottomPadding,\n right: rightPadding\n };\n addSizeByPosition(outerBoxes, outerBoxSizes);\n\n // We may be adding some padding to account for rotated x axis labels\n var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0);\n outerBoxSizes.left += leftPaddingAddition;\n outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0);\n var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0);\n outerBoxSizes.top += topPaddingAddition;\n outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0);\n\n // Figure out if our chart area changed. This would occur if the dataset layout label rotation\n // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n // without calling `fit` again\n var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom;\n var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right;\n if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n helpers$1.each(verticalBoxes, function (box) {\n box.height = newMaxChartAreaHeight;\n });\n helpers$1.each(horizontalBoxes, function (box) {\n if (!box.fullWidth) {\n box.width = newMaxChartAreaWidth;\n }\n });\n maxChartAreaHeight = newMaxChartAreaHeight;\n maxChartAreaWidth = newMaxChartAreaWidth;\n }\n\n // Step 7 - Position the boxes\n var left = leftPadding + leftPaddingAddition;\n var top = topPadding + topPaddingAddition;\n function placeBox(box) {\n if (box.isHorizontal()) {\n box.left = box.fullWidth ? leftPadding : outerBoxSizes.left;\n box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth;\n box.top = top;\n box.bottom = top + box.height;\n\n // Move to next point\n top = box.bottom;\n } else {\n box.left = left;\n box.right = left + box.width;\n box.top = outerBoxSizes.top;\n box.bottom = outerBoxSizes.top + maxChartAreaHeight;\n\n // Move to next point\n left = box.right;\n }\n }\n helpers$1.each(leftBoxes.concat(topBoxes), placeBox);\n\n // Account for chart width and height\n left += maxChartAreaWidth;\n top += maxChartAreaHeight;\n helpers$1.each(rightBoxes, placeBox);\n helpers$1.each(bottomBoxes, placeBox);\n\n // Step 8\n chart.chartArea = {\n left: outerBoxSizes.left,\n top: outerBoxSizes.top,\n right: outerBoxSizes.left + maxChartAreaWidth,\n bottom: outerBoxSizes.top + maxChartAreaHeight\n };\n\n // Step 9\n helpers$1.each(chartAreaBoxes, function (box) {\n box.left = chart.chartArea.left;\n box.top = chart.chartArea.top;\n box.right = chart.chartArea.right;\n box.bottom = chart.chartArea.bottom;\n box.update(maxChartAreaWidth, maxChartAreaHeight);\n });\n }\n };\n\n /**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\n var platform_basic = {\n acquireContext: function acquireContext(item) {\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item && item.getContext('2d') || null;\n }\n };\n var platform_dom = \"/*\\n * DOM element rendering detection\\n * https://davidwalsh.name/detect-node-insertion\\n */\\n@keyframes chartjs-render-animation {\\n\\tfrom { opacity: 0.99; }\\n\\tto { opacity: 1; }\\n}\\n\\n.chartjs-render-monitor {\\n\\tanimation: chartjs-render-animation 0.001s;\\n}\\n\\n/*\\n * DOM element resizing detection\\n * https://github.com/marcj/css-element-queries\\n */\\n.chartjs-size-monitor,\\n.chartjs-size-monitor-expand,\\n.chartjs-size-monitor-shrink {\\n\\tposition: absolute;\\n\\tdirection: ltr;\\n\\tleft: 0;\\n\\ttop: 0;\\n\\tright: 0;\\n\\tbottom: 0;\\n\\toverflow: hidden;\\n\\tpointer-events: none;\\n\\tvisibility: hidden;\\n\\tz-index: -1;\\n}\\n\\n.chartjs-size-monitor-expand > div {\\n\\tposition: absolute;\\n\\twidth: 1000000px;\\n\\theight: 1000000px;\\n\\tleft: 0;\\n\\ttop: 0;\\n}\\n\\n.chartjs-size-monitor-shrink > div {\\n\\tposition: absolute;\\n\\twidth: 200%;\\n\\theight: 200%;\\n\\tleft: 0;\\n\\ttop: 0;\\n}\\n\";\n var platform_dom$1 = /*#__PURE__*/Object.freeze({\n \"default\": platform_dom\n });\n function getCjsExportFromNamespace(n) {\n return n && n[\"default\"] || n;\n }\n var stylesheet = getCjsExportFromNamespace(platform_dom$1);\n var EXPANDO_KEY = '$chartjs';\n var CSS_PREFIX = 'chartjs-';\n var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor';\n var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\n var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\n var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];\n\n /**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\n var EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n };\n\n /**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns {number} Size in pixels or undefined if unknown.\n */\n function readUsedSize(element, property) {\n var value = helpers$1.getStyle(element, property);\n var matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? Number(matches[1]) : undefined;\n }\n\n /**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n */\n function initCanvas(canvas, config) {\n var style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n var renderHeight = canvas.getAttribute('height');\n var renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n if (renderWidth === null || renderWidth === '') {\n var displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (renderHeight === null || renderHeight === '') {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (config.options.aspectRatio || 2);\n } else {\n var displayHeight = readUsedSize(canvas, 'height');\n if (displayWidth !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n }\n\n /**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\n var supportsEventListenerOptions = function () {\n var supports = false;\n try {\n var options = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line getter-return\n get: function get() {\n supports = true;\n }\n });\n window.addEventListener('e', null, options);\n } catch (e) {\n // continue regardless of error\n }\n return supports;\n }();\n\n // Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n // https://github.com/chartjs/Chart.js/issues/4287\n var eventListenerOptions = supportsEventListenerOptions ? {\n passive: true\n } : false;\n function addListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n function removeListener(node, type, listener) {\n node.removeEventListener(type, listener, eventListenerOptions);\n }\n function createEvent(type, chart, x, y, nativeEvent) {\n return {\n type: type,\n chart: chart,\n \"native\": nativeEvent || null,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null\n };\n }\n function fromNativeEvent(event, chart) {\n var type = EVENT_TYPES[event.type] || event.type;\n var pos = helpers$1.getRelativePosition(event, chart);\n return createEvent(type, chart, pos.x, pos.y, event);\n }\n function throttled(fn, thisArg) {\n var ticking = false;\n var args = [];\n return function () {\n args = Array.prototype.slice.call(arguments);\n thisArg = thisArg || this;\n if (!ticking) {\n ticking = true;\n helpers$1.requestAnimFrame.call(window, function () {\n ticking = false;\n fn.apply(thisArg, args);\n });\n }\n };\n }\n function createDiv(cls) {\n var el = document.createElement('div');\n el.className = cls || '';\n return el;\n }\n\n // Implementation based on https://github.com/marcj/css-element-queries\n function createResizer(handler) {\n var maxSize = 1000000;\n\n // NOTE(SB) Don't use innerHTML because it could be considered unsafe.\n // https://github.com/chartjs/Chart.js/issues/5902\n var resizer = createDiv(CSS_SIZE_MONITOR);\n var expand = createDiv(CSS_SIZE_MONITOR + '-expand');\n var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink');\n expand.appendChild(createDiv());\n shrink.appendChild(createDiv());\n resizer.appendChild(expand);\n resizer.appendChild(shrink);\n resizer._reset = function () {\n expand.scrollLeft = maxSize;\n expand.scrollTop = maxSize;\n shrink.scrollLeft = maxSize;\n shrink.scrollTop = maxSize;\n };\n var onScroll = function onScroll() {\n resizer._reset();\n handler();\n };\n addListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n return resizer;\n }\n\n // https://davidwalsh.name/detect-node-insertion\n function watchForRender(node, handler) {\n var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n var proxy = expando.renderProxy = function (e) {\n if (e.animationName === CSS_RENDER_ANIMATION) {\n handler();\n }\n };\n helpers$1.each(ANIMATION_START_EVENTS, function (type) {\n addListener(node, type, proxy);\n });\n\n // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class\n // is removed then added back immediately (same animation frame?). Accessing the\n // `offsetParent` property will force a reflow and re-evaluate the CSS animation.\n // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics\n // https://github.com/chartjs/Chart.js/issues/4737\n expando.reflow = !!node.offsetParent;\n node.classList.add(CSS_RENDER_MONITOR);\n }\n function unwatchForRender(node) {\n var expando = node[EXPANDO_KEY] || {};\n var proxy = expando.renderProxy;\n if (proxy) {\n helpers$1.each(ANIMATION_START_EVENTS, function (type) {\n removeListener(node, type, proxy);\n });\n delete expando.renderProxy;\n }\n node.classList.remove(CSS_RENDER_MONITOR);\n }\n function addResizeListener(node, listener, chart) {\n var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n // Let's keep track of this added resizer and thus avoid DOM query when removing it.\n var resizer = expando.resizer = createResizer(throttled(function () {\n if (expando.resizer) {\n var container = chart.options.maintainAspectRatio && node.parentNode;\n var w = container ? container.clientWidth : 0;\n listener(createEvent('resize', chart));\n if (container && container.clientWidth < w && chart.canvas) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener(createEvent('resize', chart));\n }\n }\n }));\n\n // The resizer needs to be attached to the node parent, so we first need to be\n // sure that `node` is attached to the DOM before injecting the resizer element.\n watchForRender(node, function () {\n if (expando.resizer) {\n var container = node.parentNode;\n if (container && container !== resizer.parentNode) {\n container.insertBefore(resizer, container.firstChild);\n }\n\n // The container size might have changed, let's reset the resizer state.\n resizer._reset();\n }\n });\n }\n function removeResizeListener(node) {\n var expando = node[EXPANDO_KEY] || {};\n var resizer = expando.resizer;\n delete expando.resizer;\n unwatchForRender(node);\n if (resizer && resizer.parentNode) {\n resizer.parentNode.removeChild(resizer);\n }\n }\n function injectCSS(platform, css) {\n // https://stackoverflow.com/q/3922139\n var style = platform._style || document.createElement('style');\n if (!platform._style) {\n platform._style = style;\n css = '/* Chart.js */\\n' + css;\n style.setAttribute('type', 'text/css');\n document.getElementsByTagName('head')[0].appendChild(style);\n }\n style.appendChild(document.createTextNode(css));\n }\n var platform_dom$2 = {\n /**\n * When `true`, prevents the automatic injection of the stylesheet required to\n * correctly detect when the chart is added to the DOM and then resized. This\n * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`)\n * to be manually imported to make this library compatible with any CSP.\n * See https://github.com/chartjs/Chart.js/issues/5208\n */\n disableCSSInjection: false,\n /**\n * This property holds whether this platform is enabled for the current environment.\n * Currently used by platform.js to select the proper implementation.\n * @private\n */\n _enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\n /**\n * @private\n */\n _ensureLoaded: function _ensureLoaded() {\n if (this._loaded) {\n return;\n }\n this._loaded = true;\n\n // https://github.com/chartjs/Chart.js/issues/5208\n if (!this.disableCSSInjection) {\n injectCSS(this, stylesheet);\n }\n },\n acquireContext: function acquireContext(item, config) {\n if (typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n var context = item && item.getContext && item.getContext('2d');\n\n // Load platform resources on first chart creation, to make possible to change\n // platform options after importing the library (e.g. `disableCSSInjection`).\n this._ensureLoaded();\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the item has a context2D which has item as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === item) {\n initCanvas(item, config);\n return context;\n }\n return null;\n },\n releaseContext: function releaseContext(context) {\n var canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return;\n }\n var initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach(function (prop) {\n var value = initial[prop];\n if (helpers$1.isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n helpers$1.each(initial.style || {}, function (value, key) {\n canvas.style[key] = value;\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n },\n addEventListener: function addEventListener(chart, type, listener) {\n var canvas = chart.canvas;\n if (type === 'resize') {\n // Note: the resize event is not supported on all browsers.\n addResizeListener(canvas, listener, chart);\n return;\n }\n var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\n var proxies = expando.proxies || (expando.proxies = {});\n var proxy = proxies[chart.id + '_' + type] = function (event) {\n listener(fromNativeEvent(event, chart));\n };\n addListener(canvas, type, proxy);\n },\n removeEventListener: function removeEventListener(chart, type, listener) {\n var canvas = chart.canvas;\n if (type === 'resize') {\n // Note: the resize event is not supported on all browsers.\n removeResizeListener(canvas);\n return;\n }\n var expando = listener[EXPANDO_KEY] || {};\n var proxies = expando.proxies || {};\n var proxy = proxies[chart.id + '_' + type];\n if (!proxy) {\n return;\n }\n removeListener(canvas, type, proxy);\n }\n };\n\n // DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n * @function Chart.helpers.addEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers$1.addEvent = addListener;\n\n /**\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\n * @function Chart.helpers.removeEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers$1.removeEvent = removeListener;\n\n // @TODO Make possible to select another platform at build time.\n var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic;\n\n /**\n * @namespace Chart.platform\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n * @since 2.4.0\n */\n var platform = helpers$1.extend({\n /**\n * @since 2.7.0\n */\n initialize: function initialize() {},\n /**\n * Called at chart construction time, returns a context2d instance implementing\n * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n * @param {*} item - The native item from which to acquire context (platform specific)\n * @param {object} options - The chart options\n * @returns {CanvasRenderingContext2D} context2d instance\n */\n acquireContext: function acquireContext() {},\n /**\n * Called at chart destruction time, releases any resources associated to the context\n * previously returned by the acquireContext() method.\n * @param {CanvasRenderingContext2D} context - The context2d instance\n * @returns {boolean} true if the method succeeded, else false\n */\n releaseContext: function releaseContext() {},\n /**\n * Registers the specified listener on the given chart.\n * @param {Chart} chart - Chart from which to listen for event\n * @param {string} type - The ({@link IEvent}) type to listen for\n * @param {function} listener - Receives a notification (an object that implements\n * the {@link IEvent} interface) when an event of the specified type occurs.\n */\n addEventListener: function addEventListener() {},\n /**\n * Removes the specified listener previously registered with addEventListener.\n * @param {Chart} chart - Chart from which to remove the listener\n * @param {string} type - The ({@link IEvent}) type to remove\n * @param {function} listener - The listener function to remove from the event target.\n */\n removeEventListener: function removeEventListener() {}\n }, implementation);\n core_defaults._set('global', {\n plugins: {}\n });\n\n /**\n * The plugin service singleton\n * @namespace Chart.plugins\n * @since 2.1.0\n */\n var core_plugins = {\n /**\n * Globally registered plugins.\n * @private\n */\n _plugins: [],\n /**\n * This identifier is used to invalidate the descriptors cache attached to each chart\n * when a global plugin is registered or unregistered. In this case, the cache ID is\n * incremented and descriptors are regenerated during following API calls.\n * @private\n */\n _cacheId: 0,\n /**\n * Registers the given plugin(s) if not already registered.\n * @param {IPlugin[]|IPlugin} plugins plugin instance(s).\n */\n register: function register(plugins) {\n var p = this._plugins;\n [].concat(plugins).forEach(function (plugin) {\n if (p.indexOf(plugin) === -1) {\n p.push(plugin);\n }\n });\n this._cacheId++;\n },\n /**\n * Unregisters the given plugin(s) only if registered.\n * @param {IPlugin[]|IPlugin} plugins plugin instance(s).\n */\n unregister: function unregister(plugins) {\n var p = this._plugins;\n [].concat(plugins).forEach(function (plugin) {\n var idx = p.indexOf(plugin);\n if (idx !== -1) {\n p.splice(idx, 1);\n }\n });\n this._cacheId++;\n },\n /**\n * Remove all registered plugins.\n * @since 2.1.5\n */\n clear: function clear() {\n this._plugins = [];\n this._cacheId++;\n },\n /**\n * Returns the number of registered plugins?\n * @returns {number}\n * @since 2.1.5\n */\n count: function count() {\n return this._plugins.length;\n },\n /**\n * Returns all registered plugin instances.\n * @returns {IPlugin[]} array of plugin objects.\n * @since 2.1.5\n */\n getAll: function getAll() {\n return this._plugins;\n },\n /**\n * Calls enabled plugins for `chart` on the specified hook and with the given args.\n * This method immediately returns as soon as a plugin explicitly returns false. The\n * returned value can be used, for instance, to interrupt the current action.\n * @param {Chart} chart - The chart instance for which plugins should be called.\n * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n * @param {Array} [args] - Extra arguments to apply to the hook call.\n * @returns {boolean} false if any of the plugins return false, else returns true.\n */\n notify: function notify(chart, hook, args) {\n var descriptors = this.descriptors(chart);\n var ilen = descriptors.length;\n var i, descriptor, plugin, params, method;\n for (i = 0; i < ilen; ++i) {\n descriptor = descriptors[i];\n plugin = descriptor.plugin;\n method = plugin[hook];\n if (typeof method === 'function') {\n params = [chart].concat(args || []);\n params.push(descriptor.options);\n if (method.apply(plugin, params) === false) {\n return false;\n }\n }\n }\n return true;\n },\n /**\n * Returns descriptors of enabled plugins for the given chart.\n * @returns {object[]} [{ plugin, options }]\n * @private\n */\n descriptors: function descriptors(chart) {\n var cache = chart.$plugins || (chart.$plugins = {});\n if (cache.id === this._cacheId) {\n return cache.descriptors;\n }\n var plugins = [];\n var descriptors = [];\n var config = chart && chart.config || {};\n var options = config.options && config.options.plugins || {};\n this._plugins.concat(config.plugins || []).forEach(function (plugin) {\n var idx = plugins.indexOf(plugin);\n if (idx !== -1) {\n return;\n }\n var id = plugin.id;\n var opts = options[id];\n if (opts === false) {\n return;\n }\n if (opts === true) {\n opts = helpers$1.clone(core_defaults.global.plugins[id]);\n }\n plugins.push(plugin);\n descriptors.push({\n plugin: plugin,\n options: opts || {}\n });\n });\n cache.descriptors = descriptors;\n cache.id = this._cacheId;\n return descriptors;\n },\n /**\n * Invalidates cache for the given chart: descriptors hold a reference on plugin option,\n * but in some cases, this reference can be changed by the user when updating options.\n * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n * @private\n */\n _invalidate: function _invalidate(chart) {\n delete chart.$plugins;\n }\n };\n var core_scaleService = {\n // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n // use the new chart options to grab the correct scale\n constructors: {},\n // Use a registration function so that we can move to an ES6 map when we no longer need to support\n // old browsers\n\n // Scale config defaults\n defaults: {},\n registerScaleType: function registerScaleType(type, scaleConstructor, scaleDefaults) {\n this.constructors[type] = scaleConstructor;\n this.defaults[type] = helpers$1.clone(scaleDefaults);\n },\n getScaleConstructor: function getScaleConstructor(type) {\n return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n },\n getScaleDefaults: function getScaleDefaults(type) {\n // Return the scale defaults merged with the global settings so that we always use the latest ones\n return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {};\n },\n updateScaleDefaults: function updateScaleDefaults(type, additions) {\n var me = this;\n if (me.defaults.hasOwnProperty(type)) {\n me.defaults[type] = helpers$1.extend(me.defaults[type], additions);\n }\n },\n addScalesToLayout: function addScalesToLayout(chart) {\n // Adds each scale to the chart.boxes array to be sized accordingly\n helpers$1.each(chart.scales, function (scale) {\n // Set ILayoutItem parameters for backwards compatibility\n scale.fullWidth = scale.options.fullWidth;\n scale.position = scale.options.position;\n scale.weight = scale.options.weight;\n core_layouts.addBox(chart, scale);\n });\n }\n };\n var valueOrDefault$7 = helpers$1.valueOrDefault;\n core_defaults._set('global', {\n tooltips: {\n enabled: true,\n custom: null,\n mode: 'nearest',\n position: 'average',\n intersect: true,\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleFontStyle: 'bold',\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleFontColor: '#fff',\n titleAlign: 'left',\n bodySpacing: 2,\n bodyFontColor: '#fff',\n bodyAlign: 'left',\n footerFontStyle: 'bold',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFontColor: '#fff',\n footerAlign: 'left',\n yPadding: 6,\n xPadding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n multiKeyBackground: '#fff',\n displayColors: true,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n callbacks: {\n // Args are: (tooltipItems, data)\n beforeTitle: helpers$1.noop,\n title: function title(tooltipItems, data) {\n var title = '';\n var labels = data.labels;\n var labelCount = labels ? labels.length : 0;\n if (tooltipItems.length > 0) {\n var item = tooltipItems[0];\n if (item.label) {\n title = item.label;\n } else if (item.xLabel) {\n title = item.xLabel;\n } else if (labelCount > 0 && item.index < labelCount) {\n title = labels[item.index];\n }\n }\n return title;\n },\n afterTitle: helpers$1.noop,\n // Args are: (tooltipItems, data)\n beforeBody: helpers$1.noop,\n // Args are: (tooltipItem, data)\n beforeLabel: helpers$1.noop,\n label: function label(tooltipItem, data) {\n var label = data.datasets[tooltipItem.datasetIndex].label || '';\n if (label) {\n label += ': ';\n }\n if (!helpers$1.isNullOrUndef(tooltipItem.value)) {\n label += tooltipItem.value;\n } else {\n label += tooltipItem.yLabel;\n }\n return label;\n },\n labelColor: function labelColor(tooltipItem, chart) {\n var meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n var activeElement = meta.data[tooltipItem.index];\n var view = activeElement._view;\n return {\n borderColor: view.borderColor,\n backgroundColor: view.backgroundColor\n };\n },\n labelTextColor: function labelTextColor() {\n return this._options.bodyFontColor;\n },\n afterLabel: helpers$1.noop,\n // Args are: (tooltipItems, data)\n afterBody: helpers$1.noop,\n // Args are: (tooltipItems, data)\n beforeFooter: helpers$1.noop,\n footer: helpers$1.noop,\n afterFooter: helpers$1.noop\n }\n }\n });\n var positioners = {\n /**\n * Average mode places the tooltip at the average position of the elements shown\n * @function Chart.Tooltip.positioners.average\n * @param elements {ChartElement[]} the elements being displayed in the tooltip\n * @returns {object} tooltip position\n */\n average: function average(elements) {\n if (!elements.length) {\n return false;\n }\n var i, len;\n var x = 0;\n var y = 0;\n var count = 0;\n for (i = 0, len = elements.length; i < len; ++i) {\n var el = elements[i];\n if (el && el.hasValue()) {\n var pos = el.tooltipPosition();\n x += pos.x;\n y += pos.y;\n ++count;\n }\n }\n return {\n x: x / count,\n y: y / count\n };\n },\n /**\n * Gets the tooltip position nearest of the item nearest to the event position\n * @function Chart.Tooltip.positioners.nearest\n * @param elements {Chart.Element[]} the tooltip elements\n * @param eventPosition {object} the position of the event in canvas coordinates\n * @returns {object} the tooltip position\n */\n nearest: function nearest(elements, eventPosition) {\n var x = eventPosition.x;\n var y = eventPosition.y;\n var minDistance = Number.POSITIVE_INFINITY;\n var i, len, nearestElement;\n for (i = 0, len = elements.length; i < len; ++i) {\n var el = elements[i];\n if (el && el.hasValue()) {\n var center = el.getCenterPoint();\n var d = helpers$1.distanceBetweenPoints(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n var tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x: x,\n y: y\n };\n }\n };\n\n // Helper to push or concat based on if the 2nd parameter is an array or not\n function pushOrConcat(base, toPush) {\n if (toPush) {\n if (helpers$1.isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n }\n\n /**\n * Returns array of strings split by newline\n * @param {string} value - The value to split by newline.\n * @returns {string[]} value if newline present - Returned from String split() method\n * @function\n */\n function splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n }\n\n /**\n * Private helper to create a tooltip item model\n * @param element - the chart element (point, arc, bar) to create the tooltip item for\n * @return new tooltip item\n */\n function createTooltipItem(element) {\n var xScale = element._xScale;\n var yScale = element._yScale || element._scale; // handle radar || polarArea charts\n var index = element._index;\n var datasetIndex = element._datasetIndex;\n var controller = element._chart.getDatasetMeta(datasetIndex).controller;\n var indexScale = controller._getIndexScale();\n var valueScale = controller._getValueScale();\n return {\n xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '',\n value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '',\n index: index,\n datasetIndex: datasetIndex,\n x: element._model.x,\n y: element._model.y\n };\n }\n\n /**\n * Helper to get the reset model for the tooltip\n * @param tooltipOpts {object} the tooltip options\n */\n function getBaseModel(tooltipOpts) {\n var globalDefaults = core_defaults.global;\n return {\n // Positioning\n xPadding: tooltipOpts.xPadding,\n yPadding: tooltipOpts.yPadding,\n xAlign: tooltipOpts.xAlign,\n yAlign: tooltipOpts.yAlign,\n // Body\n bodyFontColor: tooltipOpts.bodyFontColor,\n _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n _bodyAlign: tooltipOpts.bodyAlign,\n bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n bodySpacing: tooltipOpts.bodySpacing,\n // Title\n titleFontColor: tooltipOpts.titleFontColor,\n _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n _titleAlign: tooltipOpts.titleAlign,\n titleSpacing: tooltipOpts.titleSpacing,\n titleMarginBottom: tooltipOpts.titleMarginBottom,\n // Footer\n footerFontColor: tooltipOpts.footerFontColor,\n _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n _footerAlign: tooltipOpts.footerAlign,\n footerSpacing: tooltipOpts.footerSpacing,\n footerMarginTop: tooltipOpts.footerMarginTop,\n // Appearance\n caretSize: tooltipOpts.caretSize,\n cornerRadius: tooltipOpts.cornerRadius,\n backgroundColor: tooltipOpts.backgroundColor,\n opacity: 0,\n legendColorBackground: tooltipOpts.multiKeyBackground,\n displayColors: tooltipOpts.displayColors,\n borderColor: tooltipOpts.borderColor,\n borderWidth: tooltipOpts.borderWidth\n };\n }\n\n /**\n * Get the size of the tooltip\n */\n function getTooltipSize(tooltip, model) {\n var ctx = tooltip._chart.ctx;\n var height = model.yPadding * 2; // Tooltip Padding\n var width = 0;\n\n // Count of all lines in the body\n var body = model.body;\n var combinedBodyLength = body.reduce(function (count, bodyItem) {\n return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n }, 0);\n combinedBodyLength += model.beforeBody.length + model.afterBody.length;\n var titleLineCount = model.title.length;\n var footerLineCount = model.footer.length;\n var titleFontSize = model.titleFontSize;\n var bodyFontSize = model.bodyFontSize;\n var footerFontSize = model.footerFontSize;\n height += titleLineCount * titleFontSize; // Title Lines\n height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n height += combinedBodyLength * bodyFontSize; // Body Lines\n height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n height += footerLineCount * footerFontSize; // Footer Lines\n height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n // Title width\n var widthPadding = 0;\n var maxLineWidth = function maxLineWidth(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n helpers$1.each(model.title, maxLineWidth);\n\n // Body width\n ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = model.displayColors ? bodyFontSize + 2 : 0;\n helpers$1.each(body, function (bodyItem) {\n helpers$1.each(bodyItem.before, maxLineWidth);\n helpers$1.each(bodyItem.lines, maxLineWidth);\n helpers$1.each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n helpers$1.each(model.footer, maxLineWidth);\n\n // Add padding\n width += 2 * model.xPadding;\n return {\n width: width,\n height: height\n };\n }\n\n /**\n * Helper to get the alignment of a tooltip given the size\n */\n function determineAlignment(tooltip, size) {\n var model = tooltip._model;\n var chart = tooltip._chart;\n var chartArea = tooltip._chart.chartArea;\n var xAlign = 'center';\n var yAlign = 'center';\n if (model.y < size.height) {\n yAlign = 'top';\n } else if (model.y > chart.height - size.height) {\n yAlign = 'bottom';\n }\n var lf, rf; // functions to determine left, right alignment\n var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n var midX = (chartArea.left + chartArea.right) / 2;\n var midY = (chartArea.top + chartArea.bottom) / 2;\n if (yAlign === 'center') {\n lf = function lf(x) {\n return x <= midX;\n };\n rf = function rf(x) {\n return x > midX;\n };\n } else {\n lf = function lf(x) {\n return x <= size.width / 2;\n };\n rf = function rf(x) {\n return x >= chart.width - size.width / 2;\n };\n }\n olf = function olf(x) {\n return x + size.width + model.caretSize + model.caretPadding > chart.width;\n };\n orf = function orf(x) {\n return x - size.width - model.caretSize - model.caretPadding < 0;\n };\n yf = function yf(y) {\n return y <= midY ? 'top' : 'bottom';\n };\n if (lf(model.x)) {\n xAlign = 'left';\n\n // Is tooltip too wide and goes over the right side of the chart.?\n if (olf(model.x)) {\n xAlign = 'center';\n yAlign = yf(model.y);\n }\n } else if (rf(model.x)) {\n xAlign = 'right';\n\n // Is tooltip too wide and goes outside left edge of canvas?\n if (orf(model.x)) {\n xAlign = 'center';\n yAlign = yf(model.y);\n }\n }\n var opts = tooltip._options;\n return {\n xAlign: opts.xAlign ? opts.xAlign : xAlign,\n yAlign: opts.yAlign ? opts.yAlign : yAlign\n };\n }\n\n /**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\n function getBackgroundPoint(vm, size, alignment, chart) {\n // Background Position\n var x = vm.x;\n var y = vm.y;\n var caretSize = vm.caretSize;\n var caretPadding = vm.caretPadding;\n var cornerRadius = vm.cornerRadius;\n var xAlign = alignment.xAlign;\n var yAlign = alignment.yAlign;\n var paddingAndSize = caretSize + caretPadding;\n var radiusAndPadding = cornerRadius + caretPadding;\n if (xAlign === 'right') {\n x -= size.width;\n } else if (xAlign === 'center') {\n x -= size.width / 2;\n if (x + size.width > chart.width) {\n x = chart.width - size.width;\n }\n if (x < 0) {\n x = 0;\n }\n }\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= size.height + paddingAndSize;\n } else {\n y -= size.height / 2;\n }\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= radiusAndPadding;\n } else if (xAlign === 'right') {\n x += radiusAndPadding;\n }\n return {\n x: x,\n y: y\n };\n }\n function getAlignedX(vm, align) {\n return align === 'center' ? vm.x + vm.width / 2 : align === 'right' ? vm.x + vm.width - vm.xPadding : vm.x + vm.xPadding;\n }\n\n /**\n * Helper to build before and after body lines\n */\n function getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n }\n var exports$3 = core_element.extend({\n initialize: function initialize() {\n this._model = getBaseModel(this._options);\n this._lastActive = [];\n },\n // Get the title\n // Args are: (tooltipItem, data)\n getTitle: function getTitle() {\n var me = this;\n var opts = me._options;\n var callbacks = opts.callbacks;\n var beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n var title = callbacks.title.apply(me, arguments);\n var afterTitle = callbacks.afterTitle.apply(me, arguments);\n var lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n },\n // Args are: (tooltipItem, data)\n getBeforeBody: function getBeforeBody() {\n return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments));\n },\n // Args are: (tooltipItem, data)\n getBody: function getBody(tooltipItems, data) {\n var me = this;\n var callbacks = me._options.callbacks;\n var bodyItems = [];\n helpers$1.each(tooltipItems, function (tooltipItem) {\n var bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data)));\n pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n },\n // Args are: (tooltipItem, data)\n getAfterBody: function getAfterBody() {\n return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments));\n },\n // Get the footer and beforeFooter and afterFooter lines\n // Args are: (tooltipItem, data)\n getFooter: function getFooter() {\n var me = this;\n var callbacks = me._options.callbacks;\n var beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n var footer = callbacks.footer.apply(me, arguments);\n var afterFooter = callbacks.afterFooter.apply(me, arguments);\n var lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n },\n update: function update(changed) {\n var me = this;\n var opts = me._options;\n\n // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n // which breaks any animations.\n var existingModel = me._model;\n var model = me._model = getBaseModel(opts);\n var active = me._active;\n var data = me._data;\n\n // In the case where active.length === 0 we need to keep these at existing values for good animations\n var alignment = {\n xAlign: existingModel.xAlign,\n yAlign: existingModel.yAlign\n };\n var backgroundPoint = {\n x: existingModel.x,\n y: existingModel.y\n };\n var tooltipSize = {\n width: existingModel.width,\n height: existingModel.height\n };\n var tooltipPosition = {\n x: existingModel.caretX,\n y: existingModel.caretY\n };\n var i, len;\n if (active.length) {\n model.opacity = 1;\n var labelColors = [];\n var labelTextColors = [];\n tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition);\n var tooltipItems = [];\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (opts.filter) {\n tooltipItems = tooltipItems.filter(function (a) {\n return opts.filter(a, data);\n });\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (opts.itemSort) {\n tooltipItems = tooltipItems.sort(function (a, b) {\n return opts.itemSort(a, b, data);\n });\n }\n\n // Determine colors for boxes\n helpers$1.each(tooltipItems, function (tooltipItem) {\n labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n });\n\n // Build the Text Lines\n model.title = me.getTitle(tooltipItems, data);\n model.beforeBody = me.getBeforeBody(tooltipItems, data);\n model.body = me.getBody(tooltipItems, data);\n model.afterBody = me.getAfterBody(tooltipItems, data);\n model.footer = me.getFooter(tooltipItems, data);\n\n // Initial positioning and colors\n model.x = tooltipPosition.x;\n model.y = tooltipPosition.y;\n model.caretPadding = opts.caretPadding;\n model.labelColors = labelColors;\n model.labelTextColors = labelTextColors;\n\n // data points\n model.dataPoints = tooltipItems;\n\n // We need to determine alignment of the tooltip\n tooltipSize = getTooltipSize(this, model);\n alignment = determineAlignment(this, tooltipSize);\n // Final Size and Position\n backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart);\n } else {\n model.opacity = 0;\n }\n model.xAlign = alignment.xAlign;\n model.yAlign = alignment.yAlign;\n model.x = backgroundPoint.x;\n model.y = backgroundPoint.y;\n model.width = tooltipSize.width;\n model.height = tooltipSize.height;\n\n // Point where the caret on the tooltip points to\n model.caretX = tooltipPosition.x;\n model.caretY = tooltipPosition.y;\n me._model = model;\n if (changed && opts.custom) {\n opts.custom.call(me, model);\n }\n return me;\n },\n drawCaret: function drawCaret(tooltipPoint, size) {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n },\n getCaretPosition: function getCaretPosition(tooltipPoint, size, vm) {\n var x1, x2, x3, y1, y2, y3;\n var caretSize = vm.caretSize;\n var cornerRadius = vm.cornerRadius;\n var xAlign = vm.xAlign;\n var yAlign = vm.yAlign;\n var ptX = tooltipPoint.x;\n var ptY = tooltipPoint.y;\n var width = size.width;\n var height = size.height;\n if (yAlign === 'center') {\n y2 = ptY + height / 2;\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n x3 = x1;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n x3 = x1;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n } else {\n if (xAlign === 'left') {\n x2 = ptX + cornerRadius + caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else if (xAlign === 'right') {\n x2 = ptX + width - cornerRadius - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n x2 = vm.caretX;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n y3 = y1;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n y3 = y1;\n // invert drawing order\n var tmp = x3;\n x3 = x1;\n x1 = tmp;\n }\n }\n return {\n x1: x1,\n x2: x2,\n x3: x3,\n y1: y1,\n y2: y2,\n y3: y3\n };\n },\n drawTitle: function drawTitle(pt, vm, ctx) {\n var title = vm.title;\n if (title.length) {\n pt.x = getAlignedX(vm, vm._titleAlign);\n ctx.textAlign = vm._titleAlign;\n ctx.textBaseline = 'top';\n var titleFontSize = vm.titleFontSize;\n var titleSpacing = vm.titleSpacing;\n ctx.fillStyle = vm.titleFontColor;\n ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n var i, len;\n for (i = 0, len = title.length; i < len; ++i) {\n ctx.fillText(title[i], pt.x, pt.y);\n pt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n if (i + 1 === title.length) {\n pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n },\n\n drawBody: function drawBody(pt, vm, ctx) {\n var bodyFontSize = vm.bodyFontSize;\n var bodySpacing = vm.bodySpacing;\n var bodyAlign = vm._bodyAlign;\n var body = vm.body;\n var drawColorBoxes = vm.displayColors;\n var labelColors = vm.labelColors;\n var xLinePadding = 0;\n var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0;\n var textColor;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'top';\n ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n pt.x = getAlignedX(vm, bodyAlign);\n\n // Before Body\n var fillLineOfText = function fillLineOfText(line) {\n ctx.fillText(line, pt.x + xLinePadding, pt.y);\n pt.y += bodyFontSize + bodySpacing;\n };\n\n // Before body lines\n ctx.fillStyle = vm.bodyFontColor;\n helpers$1.each(vm.beforeBody, fillLineOfText);\n xLinePadding = drawColorBoxes && bodyAlign !== 'right' ? bodyAlign === 'center' ? bodyFontSize / 2 + 1 : bodyFontSize + 2 : 0;\n\n // Draw body lines now\n helpers$1.each(body, function (bodyItem, i) {\n textColor = vm.labelTextColors[i];\n ctx.fillStyle = textColor;\n helpers$1.each(bodyItem.before, fillLineOfText);\n helpers$1.each(bodyItem.lines, function (line) {\n // Draw Legend-like boxes if needed\n if (drawColorBoxes) {\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n ctx.fillStyle = vm.legendColorBackground;\n ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize);\n\n // Border\n ctx.lineWidth = 1;\n ctx.strokeStyle = labelColors[i].borderColor;\n ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize);\n\n // Inner square\n ctx.fillStyle = labelColors[i].backgroundColor;\n ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n ctx.fillStyle = textColor;\n }\n fillLineOfText(line);\n });\n helpers$1.each(bodyItem.after, fillLineOfText);\n });\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n\n // After body lines\n helpers$1.each(vm.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n },\n\n drawFooter: function drawFooter(pt, vm, ctx) {\n var footer = vm.footer;\n if (footer.length) {\n pt.x = getAlignedX(vm, vm._footerAlign);\n pt.y += vm.footerMarginTop;\n ctx.textAlign = vm._footerAlign;\n ctx.textBaseline = 'top';\n ctx.fillStyle = vm.footerFontColor;\n ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n helpers$1.each(footer, function (line) {\n ctx.fillText(line, pt.x, pt.y);\n pt.y += vm.footerFontSize + vm.footerSpacing;\n });\n }\n },\n drawBackground: function drawBackground(pt, vm, ctx, tooltipSize) {\n ctx.fillStyle = vm.backgroundColor;\n ctx.strokeStyle = vm.borderColor;\n ctx.lineWidth = vm.borderWidth;\n var xAlign = vm.xAlign;\n var yAlign = vm.yAlign;\n var x = pt.x;\n var y = pt.y;\n var width = tooltipSize.width;\n var height = tooltipSize.height;\n var radius = vm.cornerRadius;\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n ctx.fill();\n if (vm.borderWidth > 0) {\n ctx.stroke();\n }\n },\n draw: function draw() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n if (vm.opacity === 0) {\n return;\n }\n var tooltipSize = {\n width: vm.width,\n height: vm.height\n };\n var pt = {\n x: vm.x,\n y: vm.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n // Truthy/falsey value for empty tooltip\n var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n if (this._options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, vm, ctx, tooltipSize);\n\n // Draw Title, Body, and Footer\n pt.y += vm.yPadding;\n\n // Titles\n this.drawTitle(pt, vm, ctx);\n\n // Body\n this.drawBody(pt, vm, ctx);\n\n // Footer\n this.drawFooter(pt, vm, ctx);\n ctx.restore();\n }\n },\n /**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n * @returns {boolean} true if the tooltip changed\n */\n handleEvent: function handleEvent(e) {\n var me = this;\n var options = me._options;\n var changed = false;\n me._lastActive = me._lastActive || [];\n\n // Find Active Elements for tooltips\n if (e.type === 'mouseout') {\n me._active = [];\n } else {\n me._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n }\n\n // Remember Last Actives\n changed = !helpers$1.arrayEquals(me._active, me._lastActive);\n\n // Only handle target event on tooltip change\n if (changed) {\n me._lastActive = me._active;\n if (options.enabled || options.custom) {\n me._eventPosition = {\n x: e.x,\n y: e.y\n };\n me.update(true);\n me.pivot();\n }\n }\n return changed;\n }\n });\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n var positioners_1 = positioners;\n var core_tooltip = exports$3;\n core_tooltip.positioners = positioners_1;\n var valueOrDefault$8 = helpers$1.valueOrDefault;\n core_defaults._set('global', {\n elements: {},\n events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n hover: {\n onHover: null,\n mode: 'nearest',\n intersect: true,\n animationDuration: 400\n },\n onClick: null,\n maintainAspectRatio: true,\n responsive: true,\n responsiveAnimationDuration: 0\n });\n\n /**\n * Recursively merge the given config objects representing the `scales` option\n * by incorporating scale defaults in `xAxes` and `yAxes` array items, then\n * returns a deep copy of the result, thus doesn't alter inputs.\n */\n function mergeScaleConfig( /* config objects ... */\n ) {\n return helpers$1.merge({}, [].slice.call(arguments), {\n merger: function merger(key, target, source, options) {\n if (key === 'xAxes' || key === 'yAxes') {\n var slen = source[key].length;\n var i, type, scale;\n if (!target[key]) {\n target[key] = [];\n }\n for (i = 0; i < slen; ++i) {\n scale = source[key][i];\n type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear');\n if (i >= target[key].length) {\n target[key].push({});\n }\n if (!target[key][i].type || scale.type && scale.type !== target[key][i].type) {\n // new/untyped scale or type changed: let's apply the new defaults\n // then merge source scale to correctly overwrite the defaults.\n helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]);\n } else {\n // scales type are the same\n helpers$1.merge(target[key][i], scale);\n }\n }\n } else {\n helpers$1._merger(key, target, source, options);\n }\n }\n });\n }\n\n /**\n * Recursively merge the given config objects as the root options by handling\n * default scale options for the `scales` and `scale` properties, then returns\n * a deep copy of the result, thus doesn't alter inputs.\n */\n function mergeConfig( /* config objects ... */\n ) {\n return helpers$1.merge({}, [].slice.call(arguments), {\n merger: function merger(key, target, source, options) {\n var tval = target[key] || {};\n var sval = source[key];\n if (key === 'scales') {\n // scale config merging is complex. Add our own function here for that\n target[key] = mergeScaleConfig(tval, sval);\n } else if (key === 'scale') {\n // used in polar area & radar charts since there is only one scale\n target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]);\n } else {\n helpers$1._merger(key, target, source, options);\n }\n }\n });\n }\n function initConfig(config) {\n config = config || {};\n\n // Do NOT use mergeConfig for the data object because this method merges arrays\n // and so would change references to labels and datasets, preventing data updates.\n var data = config.data = config.data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n config.options = mergeConfig(core_defaults.global, core_defaults[config.type], config.options || {});\n return config;\n }\n function updateConfig(chart) {\n var newOptions = chart.options;\n helpers$1.each(chart.scales, function (scale) {\n core_layouts.removeBox(chart, scale);\n });\n newOptions = mergeConfig(core_defaults.global, core_defaults[chart.config.type], newOptions);\n chart.options = chart.config.options = newOptions;\n chart.ensureScalesHaveIDs();\n chart.buildOrUpdateScales();\n\n // Tooltip\n chart.tooltip._options = newOptions.tooltips;\n chart.tooltip.initialize();\n }\n function positionIsHorizontal(position) {\n return position === 'top' || position === 'bottom';\n }\n var Chart = function Chart(item, config) {\n this.construct(item, config);\n return this;\n };\n helpers$1.extend(Chart.prototype, /** @lends Chart */{\n /**\n * @private\n */\n construct: function construct(item, config) {\n var me = this;\n config = initConfig(config);\n var context = platform.acquireContext(item, config);\n var canvas = context && context.canvas;\n var height = canvas && canvas.height;\n var width = canvas && canvas.width;\n me.id = helpers$1.uid();\n me.ctx = context;\n me.canvas = canvas;\n me.config = config;\n me.width = width;\n me.height = height;\n me.aspectRatio = height ? width / height : null;\n me.options = config.options;\n me._bufferedRender = false;\n\n /**\n * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n * the \"instance\" still need to be defined since it might be called from plugins.\n * @prop Chart#chart\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n me.chart = me;\n me.controller = me; // chart.chart.controller #inception\n\n // Add the chart instance to the global namespace\n Chart.instances[me.id] = me;\n\n // Define alias to the config data: `chart.data === chart.config.data`\n Object.defineProperty(me, 'data', {\n get: function get() {\n return me.config.data;\n },\n set: function set(value) {\n me.config.data = value;\n }\n });\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n me.initialize();\n me.update();\n },\n /**\n * @private\n */\n initialize: function initialize() {\n var me = this;\n\n // Before init plugin notification\n core_plugins.notify(me, 'beforeInit');\n helpers$1.retinaScale(me, me.options.devicePixelRatio);\n me.bindEvents();\n if (me.options.responsive) {\n // Initial resize before chart draws (must be silent to preserve initial animations).\n me.resize(true);\n }\n\n // Make sure scales have IDs and are built before we build any controllers.\n me.ensureScalesHaveIDs();\n me.buildOrUpdateScales();\n me.initToolTip();\n\n // After init plugin notification\n core_plugins.notify(me, 'afterInit');\n return me;\n },\n clear: function clear() {\n helpers$1.canvas.clear(this);\n return this;\n },\n stop: function stop() {\n // Stops any current animation loop occurring\n core_animations.cancelAnimation(this);\n return this;\n },\n resize: function resize(silent) {\n var me = this;\n var options = me.options;\n var canvas = me.canvas;\n var aspectRatio = options.maintainAspectRatio && me.aspectRatio || null;\n\n // the canvas render width and height will be casted to integers so make sure that\n // the canvas display style uses the same integer values to avoid blurring effect.\n\n // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed\n var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas)));\n var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas)));\n if (me.width === newWidth && me.height === newHeight) {\n return;\n }\n canvas.width = me.width = newWidth;\n canvas.height = me.height = newHeight;\n canvas.style.width = newWidth + 'px';\n canvas.style.height = newHeight + 'px';\n helpers$1.retinaScale(me, options.devicePixelRatio);\n if (!silent) {\n // Notify any plugins about the resize\n var newSize = {\n width: newWidth,\n height: newHeight\n };\n core_plugins.notify(me, 'resize', [newSize]);\n\n // Notify of resize\n if (options.onResize) {\n options.onResize(me, newSize);\n }\n me.stop();\n me.update({\n duration: options.responsiveAnimationDuration\n });\n }\n },\n ensureScalesHaveIDs: function ensureScalesHaveIDs() {\n var options = this.options;\n var scalesOptions = options.scales || {};\n var scaleOptions = options.scale;\n helpers$1.each(scalesOptions.xAxes, function (xAxisOptions, index) {\n xAxisOptions.id = xAxisOptions.id || 'x-axis-' + index;\n });\n helpers$1.each(scalesOptions.yAxes, function (yAxisOptions, index) {\n yAxisOptions.id = yAxisOptions.id || 'y-axis-' + index;\n });\n if (scaleOptions) {\n scaleOptions.id = scaleOptions.id || 'scale';\n }\n },\n /**\n * Builds a map of scale ID to scale object for future lookup.\n */\n buildOrUpdateScales: function buildOrUpdateScales() {\n var me = this;\n var options = me.options;\n var scales = me.scales || {};\n var items = [];\n var updated = Object.keys(scales).reduce(function (obj, id) {\n obj[id] = false;\n return obj;\n }, {});\n if (options.scales) {\n items = items.concat((options.scales.xAxes || []).map(function (xAxisOptions) {\n return {\n options: xAxisOptions,\n dtype: 'category',\n dposition: 'bottom'\n };\n }), (options.scales.yAxes || []).map(function (yAxisOptions) {\n return {\n options: yAxisOptions,\n dtype: 'linear',\n dposition: 'left'\n };\n }));\n }\n if (options.scale) {\n items.push({\n options: options.scale,\n dtype: 'radialLinear',\n isDefault: true,\n dposition: 'chartArea'\n });\n }\n helpers$1.each(items, function (item) {\n var scaleOptions = item.options;\n var id = scaleOptions.id;\n var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype);\n if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n var scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n scale.options = scaleOptions;\n scale.ctx = me.ctx;\n scale.chart = me;\n } else {\n var scaleClass = core_scaleService.getScaleConstructor(scaleType);\n if (!scaleClass) {\n return;\n }\n scale = new scaleClass({\n id: id,\n type: scaleType,\n options: scaleOptions,\n ctx: me.ctx,\n chart: me\n });\n scales[scale.id] = scale;\n }\n scale.mergeTicksOptions();\n\n // TODO(SB): I think we should be able to remove this custom case (options.scale)\n // and consider it as a regular scale part of the \"scales\"\" map only! This would\n // make the logic easier and remove some useless? custom code.\n if (item.isDefault) {\n me.scale = scale;\n }\n });\n // clear up discarded scales\n helpers$1.each(updated, function (hasUpdated, id) {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n me.scales = scales;\n core_scaleService.addScalesToLayout(this);\n },\n buildOrUpdateControllers: function buildOrUpdateControllers() {\n var me = this;\n var newControllers = [];\n helpers$1.each(me.data.datasets, function (dataset, datasetIndex) {\n var meta = me.getDatasetMeta(datasetIndex);\n var type = dataset.type || me.config.type;\n if (meta.type && meta.type !== type) {\n me.destroyDatasetMeta(datasetIndex);\n meta = me.getDatasetMeta(datasetIndex);\n }\n meta.type = type;\n if (meta.controller) {\n meta.controller.updateIndex(datasetIndex);\n meta.controller.linkScales();\n } else {\n var ControllerClass = controllers[meta.type];\n if (ControllerClass === undefined) {\n throw new Error('\"' + meta.type + '\" is not a chart type.');\n }\n meta.controller = new ControllerClass(me, datasetIndex);\n newControllers.push(meta.controller);\n }\n }, me);\n return newControllers;\n },\n /**\n * Reset the elements of all datasets\n * @private\n */\n resetElements: function resetElements() {\n var me = this;\n helpers$1.each(me.data.datasets, function (dataset, datasetIndex) {\n me.getDatasetMeta(datasetIndex).controller.reset();\n }, me);\n },\n /**\n * Resets the chart back to it's state before the initial animation\n */\n reset: function reset() {\n this.resetElements();\n this.tooltip.initialize();\n },\n update: function update(config) {\n var me = this;\n if (!config || _typeof(config) !== 'object') {\n // backwards compatibility\n config = {\n duration: config,\n lazy: arguments[1]\n };\n }\n updateConfig(me);\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n core_plugins._invalidate(me);\n if (core_plugins.notify(me, 'beforeUpdate') === false) {\n return;\n }\n\n // In case the entire data object changed\n me.tooltip._data = me.data;\n\n // Make sure dataset controllers are updated and new controllers are reset\n var newControllers = me.buildOrUpdateControllers();\n\n // Make sure all dataset controllers have correct meta data counts\n helpers$1.each(me.data.datasets, function (dataset, datasetIndex) {\n me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n }, me);\n me.updateLayout();\n\n // Can only reset the new controllers after the scales have been updated\n if (me.options.animation && me.options.animation.duration) {\n helpers$1.each(newControllers, function (controller) {\n controller.reset();\n });\n }\n me.updateDatasets();\n\n // Need to reset tooltip in case it is displayed with elements that are removed\n // after update.\n me.tooltip.initialize();\n\n // Last active contains items that were previously in the tooltip.\n // When we reset the tooltip, we need to clear it\n me.lastActive = [];\n\n // Do this before render so that any plugins that need final scale updates can use it\n core_plugins.notify(me, 'afterUpdate');\n if (me._bufferedRender) {\n me._bufferedRequest = {\n duration: config.duration,\n easing: config.easing,\n lazy: config.lazy\n };\n } else {\n me.render(config);\n }\n },\n /**\n * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n * hook, in which case, plugins will not be called on `afterLayout`.\n * @private\n */\n updateLayout: function updateLayout() {\n var me = this;\n if (core_plugins.notify(me, 'beforeLayout') === false) {\n return;\n }\n core_layouts.update(this, this.width, this.height);\n\n /**\n * Provided for backward compatibility, use `afterLayout` instead.\n * @method IPlugin#afterScaleUpdate\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n core_plugins.notify(me, 'afterScaleUpdate');\n core_plugins.notify(me, 'afterLayout');\n },\n /**\n * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n * @private\n */\n updateDatasets: function updateDatasets() {\n var me = this;\n if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n return;\n }\n for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me.updateDataset(i);\n }\n core_plugins.notify(me, 'afterDatasetsUpdate');\n },\n /**\n * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n * @private\n */\n updateDataset: function updateDataset(index) {\n var me = this;\n var meta = me.getDatasetMeta(index);\n var args = {\n meta: meta,\n index: index\n };\n if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n return;\n }\n meta.controller.update();\n core_plugins.notify(me, 'afterDatasetUpdate', [args]);\n },\n render: function render(config) {\n var me = this;\n if (!config || _typeof(config) !== 'object') {\n // backwards compatibility\n config = {\n duration: config,\n lazy: arguments[1]\n };\n }\n var animationOptions = me.options.animation;\n var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration);\n var lazy = config.lazy;\n if (core_plugins.notify(me, 'beforeRender') === false) {\n return;\n }\n var onComplete = function onComplete(animation) {\n core_plugins.notify(me, 'afterRender');\n helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me);\n };\n if (animationOptions && duration) {\n var animation = new core_animation({\n numSteps: duration / 16.66,\n // 60 fps\n easing: config.easing || animationOptions.easing,\n render: function render(chart, animationObject) {\n var easingFunction = helpers$1.easing.effects[animationObject.easing];\n var currentStep = animationObject.currentStep;\n var stepDecimal = currentStep / animationObject.numSteps;\n chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n },\n onAnimationProgress: animationOptions.onProgress,\n onAnimationComplete: onComplete\n });\n core_animations.addAnimation(me, animation, duration, lazy);\n } else {\n me.draw();\n\n // See https://github.com/chartjs/Chart.js/issues/3781\n onComplete(new core_animation({\n numSteps: 0,\n chart: me\n }));\n }\n return me;\n },\n draw: function draw(easingValue) {\n var me = this;\n me.clear();\n if (helpers$1.isNullOrUndef(easingValue)) {\n easingValue = 1;\n }\n me.transition(easingValue);\n if (me.width <= 0 || me.height <= 0) {\n return;\n }\n if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n return;\n }\n\n // Draw all the scales\n helpers$1.each(me.boxes, function (box) {\n box.draw(me.chartArea);\n }, me);\n me.drawDatasets(easingValue);\n me._drawTooltip(easingValue);\n core_plugins.notify(me, 'afterDraw', [easingValue]);\n },\n /**\n * @private\n */\n transition: function transition(easingValue) {\n var me = this;\n for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n if (me.isDatasetVisible(i)) {\n me.getDatasetMeta(i).controller.transition(easingValue);\n }\n }\n me.tooltip.transition(easingValue);\n },\n /**\n * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n * @private\n */\n drawDatasets: function drawDatasets(easingValue) {\n var me = this;\n if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n return;\n }\n\n // Draw datasets reversed to support proper line stacking\n for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {\n if (me.isDatasetVisible(i)) {\n me.drawDataset(i, easingValue);\n }\n }\n core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n },\n /**\n * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n * @private\n */\n drawDataset: function drawDataset(index, easingValue) {\n var me = this;\n var meta = me.getDatasetMeta(index);\n var args = {\n meta: meta,\n index: index,\n easingValue: easingValue\n };\n if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n return;\n }\n meta.controller.draw(easingValue);\n core_plugins.notify(me, 'afterDatasetDraw', [args]);\n },\n /**\n * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`\n * hook, in which case, plugins will not be called on `afterTooltipDraw`.\n * @private\n */\n _drawTooltip: function _drawTooltip(easingValue) {\n var me = this;\n var tooltip = me.tooltip;\n var args = {\n tooltip: tooltip,\n easingValue: easingValue\n };\n if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {\n return;\n }\n tooltip.draw();\n core_plugins.notify(me, 'afterTooltipDraw', [args]);\n },\n /**\n * Get the single element that was clicked on\n * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n */\n getElementAtEvent: function getElementAtEvent(e) {\n return core_interaction.modes.single(this, e);\n },\n getElementsAtEvent: function getElementsAtEvent(e) {\n return core_interaction.modes.label(this, e, {\n intersect: true\n });\n },\n getElementsAtXAxis: function getElementsAtXAxis(e) {\n return core_interaction.modes['x-axis'](this, e, {\n intersect: true\n });\n },\n getElementsAtEventForMode: function getElementsAtEventForMode(e, mode, options) {\n var method = core_interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options);\n }\n return [];\n },\n getDatasetAtEvent: function getDatasetAtEvent(e) {\n return core_interaction.modes.dataset(this, e, {\n intersect: true\n });\n },\n getDatasetMeta: function getDatasetMeta(datasetIndex) {\n var me = this;\n var dataset = me.data.datasets[datasetIndex];\n if (!dataset._meta) {\n dataset._meta = {};\n }\n var meta = dataset._meta[me.id];\n if (!meta) {\n meta = dataset._meta[me.id] = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n // See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null\n };\n }\n return meta;\n },\n getVisibleDatasetCount: function getVisibleDatasetCount() {\n var count = 0;\n for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n if (this.isDatasetVisible(i)) {\n count++;\n }\n }\n return count;\n },\n isDatasetVisible: function isDatasetVisible(datasetIndex) {\n var meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n },\n generateLegend: function generateLegend() {\n return this.options.legendCallback(this);\n },\n /**\n * @private\n */\n destroyDatasetMeta: function destroyDatasetMeta(datasetIndex) {\n var id = this.id;\n var dataset = this.data.datasets[datasetIndex];\n var meta = dataset._meta && dataset._meta[id];\n if (meta) {\n meta.controller.destroy();\n delete dataset._meta[id];\n }\n },\n destroy: function destroy() {\n var me = this;\n var canvas = me.canvas;\n var i, ilen;\n me.stop();\n\n // dataset controllers need to cleanup associated data\n for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me.destroyDatasetMeta(i);\n }\n if (canvas) {\n me.unbindEvents();\n helpers$1.canvas.clear(me);\n platform.releaseContext(me.ctx);\n me.canvas = null;\n me.ctx = null;\n }\n core_plugins.notify(me, 'destroy');\n delete Chart.instances[me.id];\n },\n toBase64Image: function toBase64Image() {\n return this.canvas.toDataURL.apply(this.canvas, arguments);\n },\n initToolTip: function initToolTip() {\n var me = this;\n me.tooltip = new core_tooltip({\n _chart: me,\n _chartInstance: me,\n // deprecated, backward compatibility\n _data: me.data,\n _options: me.options.tooltips\n }, me);\n },\n /**\n * @private\n */\n bindEvents: function bindEvents() {\n var me = this;\n var listeners = me._listeners = {};\n var listener = function listener() {\n me.eventHandler.apply(me, arguments);\n };\n helpers$1.each(me.options.events, function (type) {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n });\n\n // Elements used to detect size change should not be injected for non responsive charts.\n // See https://github.com/chartjs/Chart.js/issues/2210\n if (me.options.responsive) {\n listener = function listener() {\n me.resize();\n };\n platform.addEventListener(me, 'resize', listener);\n listeners.resize = listener;\n }\n },\n /**\n * @private\n */\n unbindEvents: function unbindEvents() {\n var me = this;\n var listeners = me._listeners;\n if (!listeners) {\n return;\n }\n delete me._listeners;\n helpers$1.each(listeners, function (listener, type) {\n platform.removeEventListener(me, type, listener);\n });\n },\n updateHoverStyle: function updateHoverStyle(elements, mode, enabled) {\n var method = enabled ? 'setHoverStyle' : 'removeHoverStyle';\n var element, i, ilen;\n for (i = 0, ilen = elements.length; i < ilen; ++i) {\n element = elements[i];\n if (element) {\n this.getDatasetMeta(element._datasetIndex).controller[method](element);\n }\n }\n },\n /**\n * @private\n */\n eventHandler: function eventHandler(e) {\n var me = this;\n var tooltip = me.tooltip;\n if (core_plugins.notify(me, 'beforeEvent', [e]) === false) {\n return;\n }\n\n // Buffer any update calls so that renders do not occur\n me._bufferedRender = true;\n me._bufferedRequest = null;\n var changed = me.handleEvent(e);\n // for smooth tooltip animations issue #4989\n // the tooltip should be the source of change\n // Animation check workaround:\n // tooltip._start will be null when tooltip isn't animating\n if (tooltip) {\n changed = tooltip._start ? tooltip.handleEvent(e) : changed | tooltip.handleEvent(e);\n }\n core_plugins.notify(me, 'afterEvent', [e]);\n var bufferedRequest = me._bufferedRequest;\n if (bufferedRequest) {\n // If we have an update that was triggered, we need to do a normal render\n me.render(bufferedRequest);\n } else if (changed && !me.animating) {\n // If entering, leaving, or changing elements, animate the change via pivot\n me.stop();\n\n // We only need to render at this point. Updating will cause scales to be\n // recomputed generating flicker & using more memory than necessary.\n me.render({\n duration: me.options.hover.animationDuration,\n lazy: true\n });\n }\n me._bufferedRender = false;\n me._bufferedRequest = null;\n return me;\n },\n /**\n * Handle an event\n * @private\n * @param {IEvent} event the event to handle\n * @return {boolean} true if the chart needs to re-render\n */\n handleEvent: function handleEvent(e) {\n var me = this;\n var options = me.options || {};\n var hoverOptions = options.hover;\n var changed = false;\n me.lastActive = me.lastActive || [];\n\n // Find Active Elements for hover and tooltips\n if (e.type === 'mouseout') {\n me.active = [];\n } else {\n me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n }\n\n // Invoke onHover hook\n // Need to call with native event here to not break backwards compatibility\n helpers$1.callback(options.onHover || options.hover.onHover, [e[\"native\"], me.active], me);\n if (e.type === 'mouseup' || e.type === 'click') {\n if (options.onClick) {\n // Use e.native here for backwards compatibility\n options.onClick.call(me, e[\"native\"], me.active);\n }\n }\n\n // Remove styling for last active (even if it may still be active)\n if (me.lastActive.length) {\n me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n }\n\n // Built in hover styling\n if (me.active.length && hoverOptions.mode) {\n me.updateHoverStyle(me.active, hoverOptions.mode, true);\n }\n changed = !helpers$1.arrayEquals(me.active, me.lastActive);\n\n // Remember Last Actives\n me.lastActive = me.active;\n return changed;\n }\n });\n\n /**\n * NOTE(SB) We actually don't use this container anymore but we need to keep it\n * for backward compatibility. Though, it can still be useful for plugins that\n * would need to work on multiple charts?!\n */\n Chart.instances = {};\n var core_controller = Chart;\n\n // DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use Chart instead.\n * @class Chart.Controller\n * @deprecated since version 2.6\n * @todo remove at version 3\n * @private\n */\n Chart.Controller = Chart;\n\n /**\n * Provided for backward compatibility, not available anymore.\n * @namespace Chart\n * @deprecated since version 2.8\n * @todo remove at version 3\n * @private\n */\n Chart.types = {};\n\n /**\n * Provided for backward compatibility, not available anymore.\n * @namespace Chart.helpers.configMerge\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\n helpers$1.configMerge = mergeConfig;\n\n /**\n * Provided for backward compatibility, not available anymore.\n * @namespace Chart.helpers.scaleMerge\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\n helpers$1.scaleMerge = mergeScaleConfig;\n var core_helpers = function core_helpers() {\n // -- Basic js utility methods\n\n helpers$1.where = function (collection, filterCallback) {\n if (helpers$1.isArray(collection) && Array.prototype.filter) {\n return collection.filter(filterCallback);\n }\n var filtered = [];\n helpers$1.each(collection, function (item) {\n if (filterCallback(item)) {\n filtered.push(item);\n }\n });\n return filtered;\n };\n helpers$1.findIndex = Array.prototype.findIndex ? function (array, callback, scope) {\n return array.findIndex(callback, scope);\n } : function (array, callback, scope) {\n scope = scope === undefined ? array : scope;\n for (var i = 0, ilen = array.length; i < ilen; ++i) {\n if (callback.call(scope, array[i], i, array)) {\n return i;\n }\n }\n return -1;\n };\n helpers$1.findNextWhere = function (arrayToSearch, filterCallback, startIndex) {\n // Default to start of the array\n if (helpers$1.isNullOrUndef(startIndex)) {\n startIndex = -1;\n }\n for (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n var currentItem = arrayToSearch[i];\n if (filterCallback(currentItem)) {\n return currentItem;\n }\n }\n };\n helpers$1.findPreviousWhere = function (arrayToSearch, filterCallback, startIndex) {\n // Default to end of the array\n if (helpers$1.isNullOrUndef(startIndex)) {\n startIndex = arrayToSearch.length;\n }\n for (var i = startIndex - 1; i >= 0; i--) {\n var currentItem = arrayToSearch[i];\n if (filterCallback(currentItem)) {\n return currentItem;\n }\n }\n };\n\n // -- Math methods\n helpers$1.isNumber = function (n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n };\n helpers$1.almostEquals = function (x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n };\n helpers$1.almostWhole = function (x, epsilon) {\n var rounded = Math.round(x);\n return rounded - epsilon < x && rounded + epsilon > x;\n };\n helpers$1.max = function (array) {\n return array.reduce(function (max, value) {\n if (!isNaN(value)) {\n return Math.max(max, value);\n }\n return max;\n }, Number.NEGATIVE_INFINITY);\n };\n helpers$1.min = function (array) {\n return array.reduce(function (min, value) {\n if (!isNaN(value)) {\n return Math.min(min, value);\n }\n return min;\n }, Number.POSITIVE_INFINITY);\n };\n helpers$1.sign = Math.sign ? function (x) {\n return Math.sign(x);\n } : function (x) {\n x = +x; // convert to a number\n if (x === 0 || isNaN(x)) {\n return x;\n }\n return x > 0 ? 1 : -1;\n };\n helpers$1.log10 = Math.log10 ? function (x) {\n return Math.log10(x);\n } : function (x) {\n var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.\n // Check for whole powers of 10,\n // which due to floating point rounding error should be corrected.\n var powerOf10 = Math.round(exponent);\n var isPowerOf10 = x === Math.pow(10, powerOf10);\n return isPowerOf10 ? powerOf10 : exponent;\n };\n helpers$1.toRadians = function (degrees) {\n return degrees * (Math.PI / 180);\n };\n helpers$1.toDegrees = function (radians) {\n return radians * (180 / Math.PI);\n };\n\n /**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param {number} x - A number.\n * @returns {number} The number of decimal places.\n * @private\n */\n helpers$1._decimalPlaces = function (x) {\n if (!helpers$1.isFinite(x)) {\n return;\n }\n var e = 1;\n var p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n };\n\n // Gets the angle from vertical upright to the point about a centre.\n helpers$1.getAngleFromPoint = function (centrePoint, anglePoint) {\n var distanceFromXCenter = anglePoint.x - centrePoint.x;\n var distanceFromYCenter = anglePoint.y - centrePoint.y;\n var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < -0.5 * Math.PI) {\n angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle: angle,\n distance: radialDistanceFromCenter\n };\n };\n helpers$1.distanceBetweenPoints = function (pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n };\n\n /**\n * Provided for backward compatibility, not available anymore\n * @function Chart.helpers.aliasPixel\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n */\n helpers$1.aliasPixel = function (pixelWidth) {\n return pixelWidth % 2 === 0 ? 0 : 0.5;\n };\n\n /**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param {Chart} chart - The chart instance.\n * @param {number} pixel - A pixel value.\n * @param {number} width - The width of the element.\n * @returns {number} The aligned pixel value.\n * @private\n */\n helpers$1._alignPixel = function (chart, pixel, width) {\n var devicePixelRatio = chart.currentDevicePixelRatio;\n var halfWidth = width / 2;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n };\n helpers$1.splineCurve = function (firstPoint, middlePoint, afterPoint, t) {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n var previous = firstPoint.skip ? middlePoint : firstPoint;\n var current = middlePoint;\n var next = afterPoint.skip ? middlePoint : afterPoint;\n var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n var s01 = d01 / (d01 + d12);\n var s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n var fa = t * s01; // scaling factor for triangle Ta\n var fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n };\n helpers$1.EPSILON = Number.EPSILON || 1e-14;\n helpers$1.splineCurveMonotone = function (points) {\n // This function calculates Bézier control points in a similar way than |splineCurve|,\n // but preserves monotonicity of the provided data and ensures no local extremums are added\n // between the dataset discrete points due to the interpolation.\n // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n var pointsWithTangents = (points || []).map(function (point) {\n return {\n model: point._model,\n deltaK: 0,\n mK: 0\n };\n });\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n var pointsLen = pointsWithTangents.length;\n var i, pointBefore, pointCurrent, pointAfter;\n for (i = 0; i < pointsLen; ++i) {\n pointCurrent = pointsWithTangents[i];\n if (pointCurrent.model.skip) {\n continue;\n }\n pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n if (pointAfter && !pointAfter.model.skip) {\n var slopeDeltaX = pointAfter.model.x - pointCurrent.model.x;\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n }\n if (!pointBefore || pointBefore.model.skip) {\n pointCurrent.mK = pointCurrent.deltaK;\n } else if (!pointAfter || pointAfter.model.skip) {\n pointCurrent.mK = pointBefore.deltaK;\n } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n pointCurrent.mK = 0;\n } else {\n pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n }\n }\n\n // Adjust tangents to ensure monotonic properties\n var alphaK, betaK, tauK, squaredMagnitude;\n for (i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointsWithTangents[i];\n pointAfter = pointsWithTangents[i + 1];\n if (pointCurrent.model.skip || pointAfter.model.skip) {\n continue;\n }\n if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n pointCurrent.mK = pointAfter.mK = 0;\n continue;\n }\n alphaK = pointCurrent.mK / pointCurrent.deltaK;\n betaK = pointAfter.mK / pointCurrent.deltaK;\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n pointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n }\n\n // Compute control points\n var deltaX;\n for (i = 0; i < pointsLen; ++i) {\n pointCurrent = pointsWithTangents[i];\n if (pointCurrent.model.skip) {\n continue;\n }\n pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n if (pointBefore && !pointBefore.model.skip) {\n deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n }\n if (pointAfter && !pointAfter.model.skip) {\n deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n }\n }\n };\n helpers$1.nextItem = function (collection, index, loop) {\n if (loop) {\n return index >= collection.length - 1 ? collection[0] : collection[index + 1];\n }\n return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n };\n helpers$1.previousItem = function (collection, index, loop) {\n if (loop) {\n return index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n }\n return index <= 0 ? collection[0] : collection[index - 1];\n };\n // Implementation of the nice number algorithm used in determining where axis labels will go\n helpers$1.niceNum = function (range, round) {\n var exponent = Math.floor(helpers$1.log10(range));\n var fraction = range / Math.pow(10, exponent);\n var niceFraction;\n if (round) {\n if (fraction < 1.5) {\n niceFraction = 1;\n } else if (fraction < 3) {\n niceFraction = 2;\n } else if (fraction < 7) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n } else if (fraction <= 1.0) {\n niceFraction = 1;\n } else if (fraction <= 2) {\n niceFraction = 2;\n } else if (fraction <= 5) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n return niceFraction * Math.pow(10, exponent);\n };\n // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n helpers$1.requestAnimFrame = function () {\n if (typeof window === 'undefined') {\n return function (callback) {\n callback();\n };\n }\n return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {\n return window.setTimeout(callback, 1000 / 60);\n };\n }();\n // -- DOM methods\n helpers$1.getRelativePosition = function (evt, chart) {\n var mouseX, mouseY;\n var e = evt.originalEvent || evt;\n var canvas = evt.target || evt.srcElement;\n var boundingRect = canvas.getBoundingClientRect();\n var touches = e.touches;\n if (touches && touches.length > 0) {\n mouseX = touches[0].clientX;\n mouseY = touches[0].clientY;\n } else {\n mouseX = e.clientX;\n mouseY = e.clientY;\n }\n\n // Scale mouse coordinates into canvas coordinates\n // by following the pattern laid out by 'jerryj' in the comments of\n // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left'));\n var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top'));\n var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right'));\n var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom'));\n var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / width * canvas.width / chart.currentDevicePixelRatio);\n mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / height * canvas.height / chart.currentDevicePixelRatio);\n return {\n x: mouseX,\n y: mouseY\n };\n };\n\n // Private helper function to convert max-width/max-height values that may be percentages into a number\n function parseMaxStyle(styleValue, node, parentProperty) {\n var valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n }\n\n /**\n * Returns if the given value contains an effective constraint.\n * @private\n */\n function isConstrainedValue(value) {\n return value !== undefined && value !== null && value !== 'none';\n }\n\n /**\n * Returns the max width or height of the given DOM node in a cross-browser compatible fashion\n * @param {HTMLElement} domNode - the node to check the constraint on\n * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height')\n * @param {string} percentageProperty - property of parent to use when calculating width as a percentage\n * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser}\n */\n function getConstraintDimension(domNode, maxStyle, percentageProperty) {\n var view = document.defaultView;\n var parentNode = helpers$1._getParentNode(domNode);\n var constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n var hasCNode = isConstrainedValue(constrainedNode);\n var hasCContainer = isConstrainedValue(constrainedContainer);\n var infinity = Number.POSITIVE_INFINITY;\n if (hasCNode || hasCContainer) {\n return Math.min(hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n }\n return 'none';\n }\n // returns Number or undefined if no constraint\n helpers$1.getConstraintWidth = function (domNode) {\n return getConstraintDimension(domNode, 'max-width', 'clientWidth');\n };\n // returns Number or undefined if no constraint\n helpers$1.getConstraintHeight = function (domNode) {\n return getConstraintDimension(domNode, 'max-height', 'clientHeight');\n };\n /**\n * @private\n \t */\n helpers$1._calculatePadding = function (container, padding, parentDimension) {\n padding = helpers$1.getStyle(container, padding);\n return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10);\n };\n /**\n * @private\n */\n helpers$1._getParentNode = function (domNode) {\n var parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = parent.host;\n }\n return parent;\n };\n helpers$1.getMaximumWidth = function (domNode) {\n var container = helpers$1._getParentNode(domNode);\n if (!container) {\n return domNode.clientWidth;\n }\n var clientWidth = container.clientWidth;\n var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth);\n var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth);\n var w = clientWidth - paddingLeft - paddingRight;\n var cw = helpers$1.getConstraintWidth(domNode);\n return isNaN(cw) ? w : Math.min(w, cw);\n };\n helpers$1.getMaximumHeight = function (domNode) {\n var container = helpers$1._getParentNode(domNode);\n if (!container) {\n return domNode.clientHeight;\n }\n var clientHeight = container.clientHeight;\n var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight);\n var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight);\n var h = clientHeight - paddingTop - paddingBottom;\n var ch = helpers$1.getConstraintHeight(domNode);\n return isNaN(ch) ? h : Math.min(h, ch);\n };\n helpers$1.getStyle = function (el, property) {\n return el.currentStyle ? el.currentStyle[property] : document.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n };\n helpers$1.retinaScale = function (chart, forceRatio) {\n var pixelRatio = chart.currentDevicePixelRatio = forceRatio || typeof window !== 'undefined' && window.devicePixelRatio || 1;\n if (pixelRatio === 1) {\n return;\n }\n var canvas = chart.canvas;\n var height = chart.height;\n var width = chart.width;\n canvas.height = height * pixelRatio;\n canvas.width = width * pixelRatio;\n chart.ctx.scale(pixelRatio, pixelRatio);\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (!canvas.style.height && !canvas.style.width) {\n canvas.style.height = height + 'px';\n canvas.style.width = width + 'px';\n }\n };\n // -- Canvas methods\n helpers$1.fontString = function (pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n };\n helpers$1.longestText = function (ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n var data = cache.data = cache.data || {};\n var gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.font = font;\n var longest = 0;\n helpers$1.each(arrayOfThings, function (thing) {\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) {\n longest = helpers$1.measureText(ctx, data, gc, longest, thing);\n } else if (helpers$1.isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n helpers$1.each(thing, function (nestedThing) {\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) {\n longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing);\n }\n });\n }\n });\n var gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (var i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n };\n helpers$1.measureText = function (ctx, data, gc, longest, string) {\n var textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n };\n helpers$1.numberOfLabelLines = function (arrayOfThings) {\n var numberOfLines = 1;\n helpers$1.each(arrayOfThings, function (thing) {\n if (helpers$1.isArray(thing)) {\n if (thing.length > numberOfLines) {\n numberOfLines = thing.length;\n }\n }\n });\n return numberOfLines;\n };\n helpers$1.color = !chartjsColor ? function (value) {\n console.error('Color.js not found!');\n return value;\n } : function (value) {\n /* global CanvasGradient */\n if (value instanceof CanvasGradient) {\n value = core_defaults.global.defaultColor;\n }\n return chartjsColor(value);\n };\n helpers$1.getHoverColor = function (colorValue) {\n /* global CanvasPattern */\n return colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient ? colorValue : helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n };\n };\n function _abstract() {\n throw new Error('This method is not implemented: either no adapter can ' + 'be found or an incomplete integration was provided.');\n }\n\n /**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\n\n /**\n * Currently supported unit string values.\n * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')}\n * @memberof Chart._adapters._date\n * @name Unit\n */\n\n /**\n * @class\n */\n function DateAdapter(options) {\n this.options = options || {};\n }\n helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */{\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n * @returns {{string: string}}\n */\n formats: _abstract,\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param {any} value - the value to parse (usually comes from the data)\n * @param {string} [format] - the expected data format\n * @returns {(number|null)}\n * @function\n */\n parse: _abstract,\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param {number} timestamp - the timestamp to format\n * @param {string} format - the date/time token\n * @return {string}\n * @function\n */\n format: _abstract,\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param {number} timestamp - the input timestamp\n * @param {number} amount - the amount to add\n * @param {Unit} unit - the unit as string\n * @return {number}\n * @function\n */\n add: _abstract,\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param {number} max - the input timestamp (reference)\n * @param {number} min - the timestamp to substract\n * @param {Unit} unit - the unit as string\n * @return {number}\n * @function\n */\n diff: _abstract,\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param {number} timestamp - the input timestamp\n * @param {Unit} unit - the unit as string\n * @param {number} [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n * @function\n */\n startOf: _abstract,\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param {number} timestamp - the input timestamp\n * @param {Unit} unit - the unit as string\n * @function\n */\n endOf: _abstract,\n // DEPRECATIONS\n\n /**\n * Provided for backward compatibility for scale.getValueForPixel(),\n * this method should be overridden only by the moment adapter.\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\n _create: function _create(value) {\n return value;\n }\n });\n DateAdapter.override = function (members) {\n helpers$1.extend(DateAdapter.prototype, members);\n };\n var _date = DateAdapter;\n var core_adapters = {\n _date: _date\n };\n\n /**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\n var core_ticks = {\n /**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\n formatters: {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values: function values(value) {\n return helpers$1.isArray(value) ? value : '' + value;\n },\n /**\n * Formatter for linear numeric ticks\n * @method Chart.Ticks.formatters.linear\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {number[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n linear: function linear(tickValue, index, ticks) {\n // If we have lots of ticks, don't use the ones\n var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) > 1) {\n if (tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n }\n var logDelta = helpers$1.log10(Math.abs(delta));\n var tickString = '';\n if (tickValue !== 0) {\n var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1]));\n if (maxTick < 1e-4) {\n // all ticks are small numbers; use scientific notation\n var logTick = helpers$1.log10(Math.abs(tickValue));\n tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta));\n } else {\n var numDecimal = -1 * Math.floor(logDelta);\n numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n tickString = tickValue.toFixed(numDecimal);\n }\n } else {\n tickString = '0'; // never show decimal places for 0\n }\n\n return tickString;\n },\n logarithmic: function logarithmic(tickValue, index, ticks) {\n var remain = tickValue / Math.pow(10, Math.floor(helpers$1.log10(tickValue)));\n if (tickValue === 0) {\n return '0';\n } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n return tickValue.toExponential();\n }\n return '';\n }\n }\n };\n var valueOrDefault$9 = helpers$1.valueOrDefault;\n var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault;\n core_defaults._set('scale', {\n display: true,\n position: 'left',\n offset: false,\n // grid line settings\n gridLines: {\n display: true,\n color: 'rgba(0, 0, 0, 0.1)',\n lineWidth: 1,\n drawBorder: true,\n drawOnChartArea: true,\n drawTicks: true,\n tickMarkLength: 10,\n zeroLineWidth: 1,\n zeroLineColor: 'rgba(0,0,0,0.25)',\n zeroLineBorderDash: [],\n zeroLineBorderDashOffset: 0.0,\n offsetGridLines: false,\n borderDash: [],\n borderDashOffset: 0.0\n },\n // scale label\n scaleLabel: {\n // display property\n display: false,\n // actual label\n labelString: '',\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n // label settings\n ticks: {\n beginAtZero: false,\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n padding: 0,\n reverse: false,\n display: true,\n autoSkip: true,\n autoSkipPadding: 0,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: core_ticks.formatters.values,\n minor: {},\n major: {}\n }\n });\n function labelsFromTicks(ticks) {\n var labels = [];\n var i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n labels.push(ticks[i].label);\n }\n return labels;\n }\n function getPixelForGridLine(scale, index, offsetGridLines) {\n var lineValue = scale.getPixelForTick(index);\n if (offsetGridLines) {\n if (scale.getTicks().length === 1) {\n lineValue -= scale.isHorizontal() ? Math.max(lineValue - scale.left, scale.right - lineValue) : Math.max(lineValue - scale.top, scale.bottom - lineValue);\n } else if (index === 0) {\n lineValue -= (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;\n }\n }\n return lineValue;\n }\n function computeTextSize(context, tick, font) {\n return helpers$1.isArray(tick) ? helpers$1.longestText(context, font, tick) : context.measureText(tick).width;\n }\n var core_scale = core_element.extend({\n /**\n * Get the padding needed for the scale\n * @method getPadding\n * @private\n * @returns {Padding} the necessary padding\n */\n getPadding: function getPadding() {\n var me = this;\n return {\n left: me.paddingLeft || 0,\n top: me.paddingTop || 0,\n right: me.paddingRight || 0,\n bottom: me.paddingBottom || 0\n };\n },\n /**\n * Returns the scale tick objects ({label, major})\n * @since 2.7\n */\n getTicks: function getTicks() {\n return this._ticks;\n },\n // These methods are ordered by lifecyle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n mergeTicksOptions: function mergeTicksOptions() {\n var ticks = this.options.ticks;\n if (ticks.minor === false) {\n ticks.minor = {\n display: false\n };\n }\n if (ticks.major === false) {\n ticks.major = {\n display: false\n };\n }\n for (var key in ticks) {\n if (key !== 'major' && key !== 'minor') {\n if (typeof ticks.minor[key] === 'undefined') {\n ticks.minor[key] = ticks[key];\n }\n if (typeof ticks.major[key] === 'undefined') {\n ticks.major[key] = ticks[key];\n }\n }\n }\n },\n beforeUpdate: function beforeUpdate() {\n helpers$1.callback(this.options.beforeUpdate, [this]);\n },\n update: function update(maxWidth, maxHeight, margins) {\n var me = this;\n var i, ilen, labels, label, ticks, tick;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = helpers$1.extend({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n me._maxLabelLines = 0;\n me.longestLabelWidth = 0;\n me.longestTextCache = me.longestTextCache || {};\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n\n // Data min/max\n me.beforeDataLimits();\n me.determineDataLimits();\n me.afterDataLimits();\n\n // Ticks - `this.ticks` is now DEPRECATED!\n // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n // and must not be accessed directly from outside this class. `this.ticks` being\n // around for long time and not marked as private, we can't change its structure\n // without unexpected breaking changes. If you need to access the scale ticks,\n // use scale.getTicks() instead.\n\n me.beforeBuildTicks();\n\n // New implementations should return an array of objects but for BACKWARD COMPAT,\n // we still support no return (`this.ticks` internally set by calling this method).\n ticks = me.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n ticks = me.afterBuildTicks(ticks) || ticks;\n me.beforeTickToLabelConversion();\n\n // New implementations should return the formatted tick labels but for BACKWARD\n // COMPAT, we still support no return (`this.ticks` internally changed by calling\n // this method and supposed to contain only string values).\n labels = me.convertTicksToLabels(ticks) || me.ticks;\n me.afterTickToLabelConversion();\n me.ticks = labels; // BACKWARD COMPATIBILITY\n\n // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!\n\n // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n tick = ticks[i];\n if (!tick) {\n ticks.push(tick = {\n label: label,\n major: false\n });\n } else {\n tick.label = label;\n }\n }\n me._ticks = ticks;\n\n // Tick Rotation\n me.beforeCalculateTickRotation();\n me.calculateTickRotation();\n me.afterCalculateTickRotation();\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n return me.minSize;\n },\n afterUpdate: function afterUpdate() {\n helpers$1.callback(this.options.afterUpdate, [this]);\n },\n //\n\n beforeSetDimensions: function beforeSetDimensions() {\n helpers$1.callback(this.options.beforeSetDimensions, [this]);\n },\n setDimensions: function setDimensions() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n },\n afterSetDimensions: function afterSetDimensions() {\n helpers$1.callback(this.options.afterSetDimensions, [this]);\n },\n // Data limits\n beforeDataLimits: function beforeDataLimits() {\n helpers$1.callback(this.options.beforeDataLimits, [this]);\n },\n determineDataLimits: helpers$1.noop,\n afterDataLimits: function afterDataLimits() {\n helpers$1.callback(this.options.afterDataLimits, [this]);\n },\n //\n beforeBuildTicks: function beforeBuildTicks() {\n helpers$1.callback(this.options.beforeBuildTicks, [this]);\n },\n buildTicks: helpers$1.noop,\n afterBuildTicks: function afterBuildTicks(ticks) {\n var me = this;\n // ticks is empty for old axis implementations here\n if (helpers$1.isArray(ticks) && ticks.length) {\n return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]);\n }\n // Support old implementations (that modified `this.ticks` directly in buildTicks)\n me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks;\n return ticks;\n },\n beforeTickToLabelConversion: function beforeTickToLabelConversion() {\n helpers$1.callback(this.options.beforeTickToLabelConversion, [this]);\n },\n convertTicksToLabels: function convertTicksToLabels() {\n var me = this;\n // Convert ticks to strings\n var tickOpts = me.options.ticks;\n me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n },\n afterTickToLabelConversion: function afterTickToLabelConversion() {\n helpers$1.callback(this.options.afterTickToLabelConversion, [this]);\n },\n //\n\n beforeCalculateTickRotation: function beforeCalculateTickRotation() {\n helpers$1.callback(this.options.beforeCalculateTickRotation, [this]);\n },\n calculateTickRotation: function calculateTickRotation() {\n var me = this;\n var context = me.ctx;\n var tickOpts = me.options.ticks;\n var labels = labelsFromTicks(me._ticks);\n\n // Get the width of each grid by calculating the difference\n // between x offsets between 0 and 1.\n var tickFont = helpers$1.options._parseFont(tickOpts);\n context.font = tickFont.string;\n var labelRotation = tickOpts.minRotation || 0;\n if (labels.length && me.options.display && me.isHorizontal()) {\n var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache);\n var labelWidth = originalLabelWidth;\n var cosRotation, sinRotation;\n\n // Allow 3 pixels x2 padding either side for label readability\n var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n // Max label rotation can be set or default to 90 - also act as a loop counter\n while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n var angleRadians = helpers$1.toRadians(labelRotation);\n cosRotation = Math.cos(angleRadians);\n sinRotation = Math.sin(angleRadians);\n if (sinRotation * originalLabelWidth > me.maxHeight) {\n // go back one step\n labelRotation--;\n break;\n }\n labelRotation++;\n labelWidth = cosRotation * originalLabelWidth;\n }\n }\n me.labelRotation = labelRotation;\n },\n afterCalculateTickRotation: function afterCalculateTickRotation() {\n helpers$1.callback(this.options.afterCalculateTickRotation, [this]);\n },\n //\n\n beforeFit: function beforeFit() {\n helpers$1.callback(this.options.beforeFit, [this]);\n },\n fit: function fit() {\n var me = this;\n // Reset\n var minSize = me.minSize = {\n width: 0,\n height: 0\n };\n var labels = labelsFromTicks(me._ticks);\n var opts = me.options;\n var tickOpts = opts.ticks;\n var scaleLabelOpts = opts.scaleLabel;\n var gridLineOpts = opts.gridLines;\n var display = me._isVisible();\n var position = opts.position;\n var isHorizontal = me.isHorizontal();\n var parseFont = helpers$1.options._parseFont;\n var tickFont = parseFont(tickOpts);\n var tickMarkLength = opts.gridLines.tickMarkLength;\n\n // Width\n if (isHorizontal) {\n // subtract the margins to line up with the chartArea if we are a full width scale\n minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n } else {\n minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n }\n\n // height\n if (isHorizontal) {\n minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n } else {\n minSize.height = me.maxHeight; // fill all the height\n }\n\n // Are we showing a title for the scale?\n if (scaleLabelOpts.display && display) {\n var scaleLabelFont = parseFont(scaleLabelOpts);\n var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding);\n var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height;\n if (isHorizontal) {\n minSize.height += deltaHeight;\n } else {\n minSize.width += deltaHeight;\n }\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && display) {\n var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache);\n var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels);\n var lineSpace = tickFont.size * 0.5;\n var tickPadding = me.options.ticks.padding;\n\n // Store max number of lines and widest label for _autoSkip\n me._maxLabelLines = tallestLabelHeightInLines;\n me.longestLabelWidth = largestTextWidth;\n if (isHorizontal) {\n var angleRadians = helpers$1.toRadians(me.labelRotation);\n var cosRotation = Math.cos(angleRadians);\n var sinRotation = Math.sin(angleRadians);\n\n // TODO - improve this calculation\n var labelHeight = sinRotation * largestTextWidth + tickFont.lineHeight * tallestLabelHeightInLines + lineSpace; // padding\n\n minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n me.ctx.font = tickFont.string;\n var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string);\n var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string);\n var offsetLeft = me.getPixelForTick(0) - me.left;\n var offsetRight = me.right - me.getPixelForTick(labels.length - 1);\n var paddingLeft, paddingRight;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (me.labelRotation !== 0) {\n paddingLeft = position === 'bottom' ? cosRotation * firstLabelWidth : cosRotation * lineSpace;\n paddingRight = position === 'bottom' ? cosRotation * lineSpace : cosRotation * lastLabelWidth;\n } else {\n paddingLeft = firstLabelWidth / 2;\n paddingRight = lastLabelWidth / 2;\n }\n me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges\n me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3;\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n if (tickOpts.mirror) {\n largestTextWidth = 0;\n } else {\n // use lineSpace for consistency with horizontal axis\n // tickPadding is not implemented for horizontal\n largestTextWidth += tickPadding + lineSpace;\n }\n minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n me.paddingTop = tickFont.size / 2;\n me.paddingBottom = tickFont.size / 2;\n }\n }\n me.handleMargins();\n me.width = minSize.width;\n me.height = minSize.height;\n },\n /**\n * Handle margins and padding interactions\n * @private\n */\n handleMargins: function handleMargins() {\n var me = this;\n if (me.margins) {\n me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n }\n },\n afterFit: function afterFit() {\n helpers$1.callback(this.options.afterFit, [this]);\n },\n // Shared Methods\n isHorizontal: function isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n },\n isFullWidth: function isFullWidth() {\n return this.options.fullWidth;\n },\n // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n getRightValue: function getRightValue(rawValue) {\n // Null and undefined values first\n if (helpers$1.isNullOrUndef(rawValue)) {\n return NaN;\n }\n // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) {\n return NaN;\n }\n // If it is in fact an object, dive in one more level\n if (rawValue) {\n if (this.isHorizontal()) {\n if (rawValue.x !== undefined) {\n return this.getRightValue(rawValue.x);\n }\n } else if (rawValue.y !== undefined) {\n return this.getRightValue(rawValue.y);\n }\n }\n\n // Value is good, return it\n return rawValue;\n },\n /**\n * Used to get the value to display in the tooltip for the data at the given index\n * @param index\n * @param datasetIndex\n */\n getLabelForIndex: helpers$1.noop,\n /**\n * Returns the location of the given data point. Value can either be an index or a numerical value\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n * @param value\n * @param index\n * @param datasetIndex\n */\n getPixelForValue: helpers$1.noop,\n /**\n * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n * @param pixel\n */\n getValueForPixel: helpers$1.noop,\n /**\n * Returns the location of the tick at the given index\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n */\n getPixelForTick: function getPixelForTick(index) {\n var me = this;\n var offset = me.options.offset;\n if (me.isHorizontal()) {\n var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n var tickWidth = innerWidth / Math.max(me._ticks.length - (offset ? 0 : 1), 1);\n var pixel = tickWidth * index + me.paddingLeft;\n if (offset) {\n pixel += tickWidth / 2;\n }\n var finalVal = me.left + pixel;\n finalVal += me.isFullWidth() ? me.margins.left : 0;\n return finalVal;\n }\n var innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n return me.top + index * (innerHeight / (me._ticks.length - 1));\n },\n /**\n * Utility for getting the pixel location of a percentage of scale\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n */\n getPixelForDecimal: function getPixelForDecimal(decimal) {\n var me = this;\n if (me.isHorizontal()) {\n var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n var valueOffset = innerWidth * decimal + me.paddingLeft;\n var finalVal = me.left + valueOffset;\n finalVal += me.isFullWidth() ? me.margins.left : 0;\n return finalVal;\n }\n return me.top + decimal * me.height;\n },\n /**\n * Returns the pixel for the minimum chart value\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n */\n getBasePixel: function getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n },\n getBaseValue: function getBaseValue() {\n var me = this;\n var min = me.min;\n var max = me.max;\n return me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n },\n /**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @private\n */\n _autoSkip: function _autoSkip(ticks) {\n var me = this;\n var isHorizontal = me.isHorizontal();\n var optionTicks = me.options.ticks.minor;\n var tickCount = ticks.length;\n var skipRatio = false;\n var maxTicks = optionTicks.maxTicksLimit;\n\n // Total space needed to display all ticks. First and last ticks are\n // drawn as their center at end of axis, so tickCount-1\n var ticksLength = me._tickSize() * (tickCount - 1);\n\n // Axis length\n var axisLength = isHorizontal ? me.width - (me.paddingLeft + me.paddingRight) : me.height - (me.paddingTop + me.PaddingBottom);\n var result = [];\n var i, tick;\n if (ticksLength > axisLength) {\n skipRatio = 1 + Math.floor(ticksLength / axisLength);\n }\n\n // if they defined a max number of optionTicks,\n // increase skipRatio until that number is met\n if (tickCount > maxTicks) {\n skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks));\n }\n for (i = 0; i < tickCount; i++) {\n tick = ticks[i];\n if (skipRatio > 1 && i % skipRatio > 0) {\n // leave tick in place but make sure it's not displayed (#4635)\n delete tick.label;\n }\n result.push(tick);\n }\n return result;\n },\n /**\n * @private\n */\n _tickSize: function _tickSize() {\n var me = this;\n var isHorizontal = me.isHorizontal();\n var optionTicks = me.options.ticks.minor;\n\n // Calculate space needed by label in axis direction.\n var rot = helpers$1.toRadians(me.labelRotation);\n var cos = Math.abs(Math.cos(rot));\n var sin = Math.abs(Math.sin(rot));\n var padding = optionTicks.autoSkipPadding || 0;\n var w = me.longestLabelWidth + padding || 0;\n var tickFont = helpers$1.options._parseFont(optionTicks);\n var h = me._maxLabelLines * tickFont.lineHeight + padding || 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return isHorizontal ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin;\n },\n /**\n * @private\n */\n _isVisible: function _isVisible() {\n var me = this;\n var chart = me.chart;\n var display = me.options.display;\n var i, ilen, meta;\n if (display !== 'auto') {\n return !!display;\n }\n\n // When 'auto', the scale is visible if at least one associated dataset is visible.\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n if (meta.xAxisID === me.id || meta.yAxisID === me.id) {\n return true;\n }\n }\n }\n return false;\n },\n /**\n * Actually draw the scale on the canvas\n * @param {object} chartArea - the area of the chart to draw full grid lines on\n */\n draw: function draw(chartArea) {\n var me = this;\n var options = me.options;\n if (!me._isVisible()) {\n return;\n }\n var chart = me.chart;\n var context = me.ctx;\n var globalDefaults = core_defaults.global;\n var defaultFontColor = globalDefaults.defaultFontColor;\n var optionTicks = options.ticks.minor;\n var optionMajorTicks = options.ticks.major || optionTicks;\n var gridLines = options.gridLines;\n var scaleLabel = options.scaleLabel;\n var position = options.position;\n var isRotated = me.labelRotation !== 0;\n var isMirrored = optionTicks.mirror;\n var isHorizontal = me.isHorizontal();\n var parseFont = helpers$1.options._parseFont;\n var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();\n var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor);\n var tickFont = parseFont(optionTicks);\n var lineHeight = tickFont.lineHeight;\n var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor);\n var majorTickFont = parseFont(optionMajorTicks);\n var tickPadding = optionTicks.padding;\n var labelOffset = optionTicks.labelOffset;\n var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor);\n var scaleLabelFont = parseFont(scaleLabel);\n var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding);\n var labelRotationRadians = helpers$1.toRadians(me.labelRotation);\n var itemsToDraw = [];\n var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;\n var alignPixel = helpers$1._alignPixel;\n var borderValue, tickStart, tickEnd;\n if (position === 'top') {\n borderValue = alignPixel(chart, me.bottom, axisWidth);\n tickStart = me.bottom - tl;\n tickEnd = borderValue - axisWidth / 2;\n } else if (position === 'bottom') {\n borderValue = alignPixel(chart, me.top, axisWidth);\n tickStart = borderValue + axisWidth / 2;\n tickEnd = me.top + tl;\n } else if (position === 'left') {\n borderValue = alignPixel(chart, me.right, axisWidth);\n tickStart = me.right - tl;\n tickEnd = borderValue - axisWidth / 2;\n } else {\n borderValue = alignPixel(chart, me.left, axisWidth);\n tickStart = borderValue + axisWidth / 2;\n tickEnd = me.left + tl;\n }\n var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error.\n\n helpers$1.each(ticks, function (tick, index) {\n // autoskipper skipped this tick (#4635)\n if (helpers$1.isNullOrUndef(tick.label)) {\n return;\n }\n var label = tick.label;\n var lineWidth, lineColor, borderDash, borderDashOffset;\n if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {\n // Draw the first index specially\n lineWidth = gridLines.zeroLineWidth;\n lineColor = gridLines.zeroLineColor;\n borderDash = gridLines.zeroLineBorderDash || [];\n borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0;\n } else {\n lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index);\n lineColor = valueAtIndexOrDefault(gridLines.color, index);\n borderDash = gridLines.borderDash || [];\n borderDashOffset = gridLines.borderDashOffset || 0.0;\n }\n\n // Common properties\n var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign;\n var labelCount = helpers$1.isArray(label) ? label.length : 1;\n var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines);\n if (isHorizontal) {\n var labelYOffset = tl + tickPadding;\n if (lineValue < me.left - epsilon) {\n lineColor = 'rgba(0,0,0,0)';\n }\n tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth);\n ty1 = tickStart;\n ty2 = tickEnd;\n labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n if (position === 'top') {\n y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2;\n y2 = chartArea.bottom;\n textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight;\n textAlign = !isRotated ? 'center' : 'left';\n labelY = me.bottom - labelYOffset;\n } else {\n y1 = chartArea.top;\n y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2;\n textOffset = (!isRotated ? 0.5 : 0) * lineHeight;\n textAlign = !isRotated ? 'center' : 'right';\n labelY = me.top + labelYOffset;\n }\n } else {\n var labelXOffset = (isMirrored ? 0 : tl) + tickPadding;\n if (lineValue < me.top - epsilon) {\n lineColor = 'rgba(0,0,0,0)';\n }\n tx1 = tickStart;\n tx2 = tickEnd;\n ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth);\n labelY = me.getPixelForTick(index) + labelOffset;\n textOffset = (1 - labelCount) * lineHeight / 2;\n if (position === 'left') {\n x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2;\n x2 = chartArea.right;\n textAlign = isMirrored ? 'left' : 'right';\n labelX = me.right - labelXOffset;\n } else {\n x1 = chartArea.left;\n x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2;\n textAlign = isMirrored ? 'right' : 'left';\n labelX = me.left + labelXOffset;\n }\n }\n itemsToDraw.push({\n tx1: tx1,\n ty1: ty1,\n tx2: tx2,\n ty2: ty2,\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2,\n labelX: labelX,\n labelY: labelY,\n glWidth: lineWidth,\n glColor: lineColor,\n glBorderDash: borderDash,\n glBorderDashOffset: borderDashOffset,\n rotation: -1 * labelRotationRadians,\n label: label,\n major: tick.major,\n textOffset: textOffset,\n textAlign: textAlign\n });\n });\n\n // Draw all of the tick labels, tick marks, and grid lines at the correct places\n helpers$1.each(itemsToDraw, function (itemToDraw) {\n var glWidth = itemToDraw.glWidth;\n var glColor = itemToDraw.glColor;\n if (gridLines.display && glWidth && glColor) {\n context.save();\n context.lineWidth = glWidth;\n context.strokeStyle = glColor;\n if (context.setLineDash) {\n context.setLineDash(itemToDraw.glBorderDash);\n context.lineDashOffset = itemToDraw.glBorderDashOffset;\n }\n context.beginPath();\n if (gridLines.drawTicks) {\n context.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n context.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n }\n if (gridLines.drawOnChartArea) {\n context.moveTo(itemToDraw.x1, itemToDraw.y1);\n context.lineTo(itemToDraw.x2, itemToDraw.y2);\n }\n context.stroke();\n context.restore();\n }\n if (optionTicks.display) {\n // Make sure we draw text in the correct color and font\n context.save();\n context.translate(itemToDraw.labelX, itemToDraw.labelY);\n context.rotate(itemToDraw.rotation);\n context.font = itemToDraw.major ? majorTickFont.string : tickFont.string;\n context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;\n context.textBaseline = 'middle';\n context.textAlign = itemToDraw.textAlign;\n var label = itemToDraw.label;\n var y = itemToDraw.textOffset;\n if (helpers$1.isArray(label)) {\n for (var i = 0; i < label.length; ++i) {\n // We just make sure the multiline element is a string here..\n context.fillText('' + label[i], 0, y);\n y += lineHeight;\n }\n } else {\n context.fillText(label, 0, y);\n }\n context.restore();\n }\n });\n if (scaleLabel.display) {\n // Draw the scale label\n var scaleLabelX;\n var scaleLabelY;\n var rotation = 0;\n var halfLineHeight = scaleLabelFont.lineHeight / 2;\n if (isHorizontal) {\n scaleLabelX = me.left + (me.right - me.left) / 2; // midpoint of the width\n scaleLabelY = position === 'bottom' ? me.bottom - halfLineHeight - scaleLabelPadding.bottom : me.top + halfLineHeight + scaleLabelPadding.top;\n } else {\n var isLeft = position === 'left';\n scaleLabelX = isLeft ? me.left + halfLineHeight + scaleLabelPadding.top : me.right - halfLineHeight - scaleLabelPadding.top;\n scaleLabelY = me.top + (me.bottom - me.top) / 2;\n rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n }\n context.save();\n context.translate(scaleLabelX, scaleLabelY);\n context.rotate(rotation);\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n context.fillStyle = scaleLabelFontColor; // render in correct colour\n context.font = scaleLabelFont.string;\n context.fillText(scaleLabel.labelString, 0, 0);\n context.restore();\n }\n if (axisWidth) {\n // Draw the line at the edge of the axis\n var firstLineWidth = axisWidth;\n var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0);\n var x1, x2, y1, y2;\n if (isHorizontal) {\n x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2;\n x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2;\n y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n context.lineWidth = axisWidth;\n context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0);\n context.beginPath();\n context.moveTo(x1, y1);\n context.lineTo(x2, y2);\n context.stroke();\n }\n }\n });\n var defaultConfig = {\n position: 'bottom'\n };\n var scale_category = core_scale.extend({\n /**\n * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n * else fall back to data.labels\n * @private\n */\n getLabels: function getLabels() {\n var data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n },\n determineDataLimits: function determineDataLimits() {\n var me = this;\n var labels = me.getLabels();\n me.minIndex = 0;\n me.maxIndex = labels.length - 1;\n var findIndex;\n if (me.options.ticks.min !== undefined) {\n // user specified min value\n findIndex = labels.indexOf(me.options.ticks.min);\n me.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n }\n if (me.options.ticks.max !== undefined) {\n // user specified max value\n findIndex = labels.indexOf(me.options.ticks.max);\n me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n }\n me.min = labels[me.minIndex];\n me.max = labels[me.maxIndex];\n },\n buildTicks: function buildTicks() {\n var me = this;\n var labels = me.getLabels();\n // If we are viewing some subset of labels, slice the original array\n me.ticks = me.minIndex === 0 && me.maxIndex === labels.length - 1 ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n },\n getLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n var me = this;\n var chart = me.chart;\n if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) {\n return me.getRightValue(chart.data.datasets[datasetIndex].data[index]);\n }\n return me.ticks[index - me.minIndex];\n },\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue: function getPixelForValue(value, index) {\n var me = this;\n var offset = me.options.offset;\n // 1 is added because we need the length but we have the indexes\n var offsetAmt = Math.max(me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1), 1);\n\n // If value is a data object, then index is the index in the data array,\n // not the index of the scale. We need to change that.\n var valueCategory;\n if (value !== undefined && value !== null) {\n valueCategory = me.isHorizontal() ? value.x : value.y;\n }\n if (valueCategory !== undefined || value !== undefined && isNaN(index)) {\n var labels = me.getLabels();\n value = valueCategory || value;\n var idx = labels.indexOf(value);\n index = idx !== -1 ? idx : index;\n }\n if (me.isHorizontal()) {\n var valueWidth = me.width / offsetAmt;\n var widthOffset = valueWidth * (index - me.minIndex);\n if (offset) {\n widthOffset += valueWidth / 2;\n }\n return me.left + widthOffset;\n }\n var valueHeight = me.height / offsetAmt;\n var heightOffset = valueHeight * (index - me.minIndex);\n if (offset) {\n heightOffset += valueHeight / 2;\n }\n return me.top + heightOffset;\n },\n getPixelForTick: function getPixelForTick(index) {\n return this.getPixelForValue(this.ticks[index], index + this.minIndex, null);\n },\n getValueForPixel: function getValueForPixel(pixel) {\n var me = this;\n var offset = me.options.offset;\n var value;\n var offsetAmt = Math.max(me._ticks.length - (offset ? 0 : 1), 1);\n var horz = me.isHorizontal();\n var valueDimension = (horz ? me.width : me.height) / offsetAmt;\n pixel -= horz ? me.left : me.top;\n if (offset) {\n pixel -= valueDimension / 2;\n }\n if (pixel <= 0) {\n value = 0;\n } else {\n value = Math.round(pixel / valueDimension);\n }\n return value + me.minIndex;\n },\n getBasePixel: function getBasePixel() {\n return this.bottom;\n }\n });\n\n // INTERNAL: static default options, registered in src/index.js\n var _defaults = defaultConfig;\n scale_category._defaults = _defaults;\n var noop = helpers$1.noop;\n var isNullOrUndef = helpers$1.isNullOrUndef;\n\n /**\n * Generate a set of linear ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {number[]} array of tick values\n */\n function generateTicks(generationOptions, dataRange) {\n var ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n var MIN_SPACING = 1e-14;\n var stepSize = generationOptions.stepSize;\n var unit = stepSize || 1;\n var maxNumSpaces = generationOptions.maxTicks - 1;\n var min = generationOptions.min;\n var max = generationOptions.max;\n var precision = generationOptions.precision;\n var rmin = dataRange.min;\n var rmax = dataRange.max;\n var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit;\n var factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) {\n return [rmin, rmax];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxNumSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit;\n }\n if (stepSize || isNullOrUndef(precision)) {\n // If a precision is not specified, calculate factor based on spacing\n factor = Math.pow(10, helpers$1._decimalPlaces(spacing));\n } else {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n\n // If min, max and stepSize is set and they make an evenly spaced scale use it.\n if (stepSize) {\n // If very close to our whole number, use it.\n if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) {\n niceMin = min;\n }\n if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) {\n niceMax = max;\n }\n }\n numSpaces = (niceMax - niceMin) / spacing;\n // If very close to our rounded value, use it.\n if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n ticks.push(isNullOrUndef(min) ? niceMin : min);\n for (var j = 1; j < numSpaces; ++j) {\n ticks.push(Math.round((niceMin + j * spacing) * factor) / factor);\n }\n ticks.push(isNullOrUndef(max) ? niceMax : max);\n return ticks;\n }\n var scale_linearbase = core_scale.extend({\n getRightValue: function getRightValue(value) {\n if (typeof value === 'string') {\n return +value;\n }\n return core_scale.prototype.getRightValue.call(this, value);\n },\n handleTickRangeOptions: function handleTickRangeOptions() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n\n // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n // do nothing since that would make the chart weird. If the user really wants a weird chart\n // axis, they can manually override it\n if (tickOpts.beginAtZero) {\n var minSign = helpers$1.sign(me.min);\n var maxSign = helpers$1.sign(me.max);\n if (minSign < 0 && maxSign < 0) {\n // move the top up to 0\n me.max = 0;\n } else if (minSign > 0 && maxSign > 0) {\n // move the bottom down to 0\n me.min = 0;\n }\n }\n var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\n var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\n if (tickOpts.min !== undefined) {\n me.min = tickOpts.min;\n } else if (tickOpts.suggestedMin !== undefined) {\n if (me.min === null) {\n me.min = tickOpts.suggestedMin;\n } else {\n me.min = Math.min(me.min, tickOpts.suggestedMin);\n }\n }\n if (tickOpts.max !== undefined) {\n me.max = tickOpts.max;\n } else if (tickOpts.suggestedMax !== undefined) {\n if (me.max === null) {\n me.max = tickOpts.suggestedMax;\n } else {\n me.max = Math.max(me.max, tickOpts.suggestedMax);\n }\n }\n if (setMin !== setMax) {\n // We set the min or the max but not both.\n // So ensure that our range is good\n // Inverted or 0 length range can happen when\n // ticks.min is set, and no datasets are visible\n if (me.min >= me.max) {\n if (setMin) {\n me.max = me.min + 1;\n } else {\n me.min = me.max - 1;\n }\n }\n }\n if (me.min === me.max) {\n me.max++;\n if (!tickOpts.beginAtZero) {\n me.min--;\n }\n }\n },\n getTickLimit: function getTickLimit() {\n var me = this;\n var tickOpts = me.options.ticks;\n var stepSize = tickOpts.stepSize;\n var maxTicksLimit = tickOpts.maxTicksLimit;\n var maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1;\n } else {\n maxTicks = me._computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n },\n _computeTickLimit: function _computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n },\n handleDirectionalChanges: noop,\n buildTicks: function buildTicks() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n var maxTicks = me.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n var numericGeneratorOptions = {\n maxTicks: maxTicks,\n min: tickOpts.min,\n max: tickOpts.max,\n precision: tickOpts.precision,\n stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n };\n var ticks = me.ticks = generateTicks(numericGeneratorOptions, me);\n me.handleDirectionalChanges();\n\n // At this point, we need to update our max and min given the tick values since we have expanded the\n // range of the scale\n me.max = helpers$1.max(ticks);\n me.min = helpers$1.min(ticks);\n if (tickOpts.reverse) {\n ticks.reverse();\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n },\n convertTicksToLabels: function convertTicksToLabels() {\n var me = this;\n me.ticksAsNumbers = me.ticks.slice();\n me.zeroLineIndex = me.ticks.indexOf(0);\n core_scale.prototype.convertTicksToLabels.call(me);\n }\n });\n var defaultConfig$1 = {\n position: 'left',\n ticks: {\n callback: core_ticks.formatters.linear\n }\n };\n var scale_linear = scale_linearbase.extend({\n determineDataLimits: function determineDataLimits() {\n var me = this;\n var opts = me.options;\n var chart = me.chart;\n var data = chart.data;\n var datasets = data.datasets;\n var isHorizontal = me.isHorizontal();\n var DEFAULT_MIN = 0;\n var DEFAULT_MAX = 1;\n function IDMatches(meta) {\n return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n }\n\n // First Calculate the range\n me.min = null;\n me.max = null;\n var hasStacks = opts.stacked;\n if (hasStacks === undefined) {\n helpers$1.each(datasets, function (dataset, datasetIndex) {\n if (hasStacks) {\n return;\n }\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) {\n hasStacks = true;\n }\n });\n }\n if (opts.stacked || hasStacks) {\n var valuesPerStack = {};\n helpers$1.each(datasets, function (dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var key = [meta.type,\n // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n opts.stacked === undefined && meta.stack === undefined ? datasetIndex : '', meta.stack].join('.');\n if (valuesPerStack[key] === undefined) {\n valuesPerStack[key] = {\n positiveValues: [],\n negativeValues: []\n };\n }\n\n // Store these per type\n var positiveValues = valuesPerStack[key].positiveValues;\n var negativeValues = valuesPerStack[key].negativeValues;\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers$1.each(dataset.data, function (rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n positiveValues[index] = positiveValues[index] || 0;\n negativeValues[index] = negativeValues[index] || 0;\n if (opts.relativePoints) {\n positiveValues[index] = 100;\n } else if (value < 0) {\n negativeValues[index] += value;\n } else {\n positiveValues[index] += value;\n }\n });\n }\n });\n helpers$1.each(valuesPerStack, function (valuesForType) {\n var values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n var minVal = helpers$1.min(values);\n var maxVal = helpers$1.max(values);\n me.min = me.min === null ? minVal : Math.min(me.min, minVal);\n me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n });\n } else {\n helpers$1.each(datasets, function (dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers$1.each(dataset.data, function (rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n if (me.min === null) {\n me.min = value;\n } else if (value < me.min) {\n me.min = value;\n }\n if (me.max === null) {\n me.max = value;\n } else if (value > me.max) {\n me.max = value;\n }\n });\n }\n });\n }\n me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\n me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;\n\n // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n this.handleTickRangeOptions();\n },\n // Returns the maximum number of ticks based on the scale dimension\n _computeTickLimit: function _computeTickLimit() {\n var me = this;\n var tickFont;\n if (me.isHorizontal()) {\n return Math.ceil(me.width / 40);\n }\n tickFont = helpers$1.options._parseFont(me.options.ticks);\n return Math.ceil(me.height / tickFont.lineHeight);\n },\n // Called after the ticks are built. We need\n handleDirectionalChanges: function handleDirectionalChanges() {\n if (!this.isHorizontal()) {\n // We are in a vertical orientation. The top value is the highest. So reverse the array\n this.ticks.reverse();\n }\n },\n getLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n // Utils\n getPixelForValue: function getPixelForValue(value) {\n // This must be called after fit has been run so that\n // this.left, this.top, this.right, and this.bottom have been defined\n var me = this;\n var start = me.start;\n var rightValue = +me.getRightValue(value);\n var pixel;\n var range = me.end - start;\n if (me.isHorizontal()) {\n pixel = me.left + me.width / range * (rightValue - start);\n } else {\n pixel = me.bottom - me.height / range * (rightValue - start);\n }\n return pixel;\n },\n getValueForPixel: function getValueForPixel(pixel) {\n var me = this;\n var isHorizontal = me.isHorizontal();\n var innerDimension = isHorizontal ? me.width : me.height;\n var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n return me.start + (me.end - me.start) * offset;\n },\n getPixelForTick: function getPixelForTick(index) {\n return this.getPixelForValue(this.ticksAsNumbers[index]);\n }\n });\n\n // INTERNAL: static default options, registered in src/index.js\n var _defaults$1 = defaultConfig$1;\n scale_linear._defaults = _defaults$1;\n var valueOrDefault$a = helpers$1.valueOrDefault;\n\n /**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {number[]} array of tick values\n */\n function generateTicks$1(generationOptions, dataRange) {\n var ticks = [];\n var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min))));\n var endExp = Math.floor(helpers$1.log10(dataRange.max));\n var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n var exp, significand;\n if (tickVal === 0) {\n exp = Math.floor(helpers$1.log10(dataRange.minNotZero));\n significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n ticks.push(tickVal);\n tickVal = significand * Math.pow(10, exp);\n } else {\n exp = Math.floor(helpers$1.log10(tickVal));\n significand = Math.floor(tickVal / Math.pow(10, exp));\n }\n var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n do {\n ticks.push(tickVal);\n ++significand;\n if (significand === 10) {\n significand = 1;\n ++exp;\n precision = exp >= 0 ? 1 : precision;\n }\n tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n } while (exp < endExp || exp === endExp && significand < endSignificand);\n var lastTick = valueOrDefault$a(generationOptions.max, tickVal);\n ticks.push(lastTick);\n return ticks;\n }\n var defaultConfig$2 = {\n position: 'left',\n // label settings\n ticks: {\n callback: core_ticks.formatters.logarithmic\n }\n };\n\n // TODO(v3): change this to positiveOrDefault\n function nonNegativeOrDefault(value, defaultValue) {\n return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue;\n }\n var scale_logarithmic = core_scale.extend({\n determineDataLimits: function determineDataLimits() {\n var me = this;\n var opts = me.options;\n var chart = me.chart;\n var data = chart.data;\n var datasets = data.datasets;\n var isHorizontal = me.isHorizontal();\n function IDMatches(meta) {\n return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n }\n\n // Calculate Range\n me.min = null;\n me.max = null;\n me.minNotZero = null;\n var hasStacks = opts.stacked;\n if (hasStacks === undefined) {\n helpers$1.each(datasets, function (dataset, datasetIndex) {\n if (hasStacks) {\n return;\n }\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) {\n hasStacks = true;\n }\n });\n }\n if (opts.stacked || hasStacks) {\n var valuesPerStack = {};\n helpers$1.each(datasets, function (dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var key = [meta.type,\n // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n opts.stacked === undefined && meta.stack === undefined ? datasetIndex : '', meta.stack].join('.');\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n if (valuesPerStack[key] === undefined) {\n valuesPerStack[key] = [];\n }\n helpers$1.each(dataset.data, function (rawValue, index) {\n var values = valuesPerStack[key];\n var value = +me.getRightValue(rawValue);\n // invalid, hidden and negative values are ignored\n if (isNaN(value) || meta.data[index].hidden || value < 0) {\n return;\n }\n values[index] = values[index] || 0;\n values[index] += value;\n });\n }\n });\n helpers$1.each(valuesPerStack, function (valuesForType) {\n if (valuesForType.length > 0) {\n var minVal = helpers$1.min(valuesForType);\n var maxVal = helpers$1.max(valuesForType);\n me.min = me.min === null ? minVal : Math.min(me.min, minVal);\n me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n }\n });\n } else {\n helpers$1.each(datasets, function (dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers$1.each(dataset.data, function (rawValue, index) {\n var value = +me.getRightValue(rawValue);\n // invalid, hidden and negative values are ignored\n if (isNaN(value) || meta.data[index].hidden || value < 0) {\n return;\n }\n if (me.min === null) {\n me.min = value;\n } else if (value < me.min) {\n me.min = value;\n }\n if (me.max === null) {\n me.max = value;\n } else if (value > me.max) {\n me.max = value;\n }\n if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n me.minNotZero = value;\n }\n });\n }\n });\n }\n\n // Common base implementation to handle ticks.min, ticks.max\n this.handleTickRangeOptions();\n },\n handleTickRangeOptions: function handleTickRangeOptions() {\n var me = this;\n var tickOpts = me.options.ticks;\n var DEFAULT_MIN = 1;\n var DEFAULT_MAX = 10;\n me.min = nonNegativeOrDefault(tickOpts.min, me.min);\n me.max = nonNegativeOrDefault(tickOpts.max, me.max);\n if (me.min === me.max) {\n if (me.min !== 0 && me.min !== null) {\n me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1);\n me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1);\n } else {\n me.min = DEFAULT_MIN;\n me.max = DEFAULT_MAX;\n }\n }\n if (me.min === null) {\n me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1);\n }\n if (me.max === null) {\n me.max = me.min !== 0 ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1) : DEFAULT_MAX;\n }\n if (me.minNotZero === null) {\n if (me.min > 0) {\n me.minNotZero = me.min;\n } else if (me.max < 1) {\n me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max)));\n } else {\n me.minNotZero = DEFAULT_MIN;\n }\n }\n },\n buildTicks: function buildTicks() {\n var me = this;\n var tickOpts = me.options.ticks;\n var reverse = !me.isHorizontal();\n var generationOptions = {\n min: nonNegativeOrDefault(tickOpts.min),\n max: nonNegativeOrDefault(tickOpts.max)\n };\n var ticks = me.ticks = generateTicks$1(generationOptions, me);\n\n // At this point, we need to update our max and min given the tick values since we have expanded the\n // range of the scale\n me.max = helpers$1.max(ticks);\n me.min = helpers$1.min(ticks);\n if (tickOpts.reverse) {\n reverse = !reverse;\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n if (reverse) {\n ticks.reverse();\n }\n },\n convertTicksToLabels: function convertTicksToLabels() {\n this.tickValues = this.ticks.slice();\n core_scale.prototype.convertTicksToLabels.call(this);\n },\n // Get the correct tooltip label\n getLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n getPixelForTick: function getPixelForTick(index) {\n return this.getPixelForValue(this.tickValues[index]);\n },\n /**\n * Returns the value of the first tick.\n * @param {number} value - The minimum not zero value.\n * @return {number} The first tick value.\n * @private\n */\n _getFirstTickValue: function _getFirstTickValue(value) {\n var exp = Math.floor(helpers$1.log10(value));\n var significand = Math.floor(value / Math.pow(10, exp));\n return significand * Math.pow(10, exp);\n },\n getPixelForValue: function getPixelForValue(value) {\n var me = this;\n var tickOpts = me.options.ticks;\n var reverse = tickOpts.reverse;\n var log10 = helpers$1.log10;\n var firstTickValue = me._getFirstTickValue(me.minNotZero);\n var offset = 0;\n var innerDimension, pixel, start, end, sign;\n value = +me.getRightValue(value);\n if (reverse) {\n start = me.end;\n end = me.start;\n sign = -1;\n } else {\n start = me.start;\n end = me.end;\n sign = 1;\n }\n if (me.isHorizontal()) {\n innerDimension = me.width;\n pixel = reverse ? me.right : me.left;\n } else {\n innerDimension = me.height;\n sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0)\n pixel = reverse ? me.top : me.bottom;\n }\n if (value !== start) {\n if (start === 0) {\n // include zero tick\n offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize);\n innerDimension -= offset;\n start = firstTickValue;\n }\n if (value !== 0) {\n offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start));\n }\n pixel += sign * offset;\n }\n return pixel;\n },\n getValueForPixel: function getValueForPixel(pixel) {\n var me = this;\n var tickOpts = me.options.ticks;\n var reverse = tickOpts.reverse;\n var log10 = helpers$1.log10;\n var firstTickValue = me._getFirstTickValue(me.minNotZero);\n var innerDimension, start, end, value;\n if (reverse) {\n start = me.end;\n end = me.start;\n } else {\n start = me.start;\n end = me.end;\n }\n if (me.isHorizontal()) {\n innerDimension = me.width;\n value = reverse ? me.right - pixel : pixel - me.left;\n } else {\n innerDimension = me.height;\n value = reverse ? pixel - me.top : me.bottom - pixel;\n }\n if (value !== start) {\n if (start === 0) {\n // include zero tick\n var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize);\n value -= offset;\n innerDimension -= offset;\n start = firstTickValue;\n }\n value *= log10(end) - log10(start);\n value /= innerDimension;\n value = Math.pow(10, log10(start) + value);\n }\n return value;\n }\n });\n\n // INTERNAL: static default options, registered in src/index.js\n var _defaults$2 = defaultConfig$2;\n scale_logarithmic._defaults = _defaults$2;\n var valueOrDefault$b = helpers$1.valueOrDefault;\n var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault;\n var resolve$7 = helpers$1.options.resolve;\n var defaultConfig$3 = {\n display: true,\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n angleLines: {\n display: true,\n color: 'rgba(0, 0, 0, 0.1)',\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n gridLines: {\n circular: false\n },\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n // String - The colour of the label backdrop\n backdropColor: 'rgba(255,255,255,0.75)',\n // Number - The backdrop padding above & below the label in pixels\n backdropPaddingY: 2,\n // Number - The backdrop padding to the side of the label in pixels\n backdropPaddingX: 2,\n callback: core_ticks.formatters.linear\n },\n pointLabels: {\n // Boolean - if true, show point labels\n display: true,\n // Number - Point label font size in pixels\n fontSize: 10,\n // Function - Used to convert point labels\n callback: function callback(label) {\n return label;\n }\n }\n };\n function getValueCount(scale) {\n var opts = scale.options;\n return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;\n }\n function getTickBackdropHeight(opts) {\n var tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2;\n }\n return 0;\n }\n function measureLabelSize(ctx, lineHeight, label) {\n if (helpers$1.isArray(label)) {\n return {\n w: helpers$1.longestText(ctx, ctx.font, label),\n h: label.length * lineHeight\n };\n }\n return {\n w: ctx.measureText(label).width,\n h: lineHeight\n };\n }\n function determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - size / 2,\n end: pos + size / 2\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n }\n\n /**\n * Helper function to fit a radial linear scale with point labels\n */\n function fitWithPointLabels(scale) {\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n var plFont = helpers$1.options._parseFont(scale.options.pointLabels);\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n var furthestLimits = {\n l: 0,\n r: scale.width,\n t: 0,\n b: scale.height - scale.paddingTop\n };\n var furthestAngles = {};\n var i, textSize, pointPosition;\n scale.ctx.font = plFont.string;\n scale._pointLabelSizes = [];\n var valueCount = getValueCount(scale);\n for (i = 0; i < valueCount; i++) {\n pointPosition = scale.getPointPosition(i, scale.drawingArea + 5);\n textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || '');\n scale._pointLabelSizes[i] = textSize;\n\n // Add quarter circle to make degree 0 mean top of circle\n var angleRadians = scale.getIndexAngle(i);\n var angle = helpers$1.toDegrees(angleRadians) % 360;\n var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n if (hLimits.start < furthestLimits.l) {\n furthestLimits.l = hLimits.start;\n furthestAngles.l = angleRadians;\n }\n if (hLimits.end > furthestLimits.r) {\n furthestLimits.r = hLimits.end;\n furthestAngles.r = angleRadians;\n }\n if (vLimits.start < furthestLimits.t) {\n furthestLimits.t = vLimits.start;\n furthestAngles.t = angleRadians;\n }\n if (vLimits.end > furthestLimits.b) {\n furthestLimits.b = vLimits.end;\n furthestAngles.b = angleRadians;\n }\n }\n scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles);\n }\n function getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n return 'right';\n }\n function fillText(ctx, text, position, lineHeight) {\n var y = position.y + lineHeight / 2;\n var i, ilen;\n if (helpers$1.isArray(text)) {\n for (i = 0, ilen = text.length; i < ilen; ++i) {\n ctx.fillText(text[i], position.x, y);\n y += lineHeight;\n }\n } else {\n ctx.fillText(text, position.x, y);\n }\n }\n function adjustPointPositionForLabelHeight(angle, textSize, position) {\n if (angle === 90 || angle === 270) {\n position.y -= textSize.h / 2;\n } else if (angle > 270 || angle < 90) {\n position.y -= textSize.h;\n }\n }\n function drawPointLabels(scale) {\n var ctx = scale.ctx;\n var opts = scale.options;\n var angleLineOpts = opts.angleLines;\n var gridLineOpts = opts.gridLines;\n var pointLabelOpts = opts.pointLabels;\n var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth);\n var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color);\n var tickBackdropHeight = getTickBackdropHeight(opts);\n ctx.save();\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = lineColor;\n if (ctx.setLineDash) {\n ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []]));\n ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]);\n }\n var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n\n // Point Label Font\n var plFont = helpers$1.options._parseFont(pointLabelOpts);\n ctx.font = plFont.string;\n ctx.textBaseline = 'middle';\n for (var i = getValueCount(scale) - 1; i >= 0; i--) {\n if (angleLineOpts.display && lineWidth && lineColor) {\n var outerPosition = scale.getPointPosition(i, outerDistance);\n ctx.beginPath();\n ctx.moveTo(scale.xCenter, scale.yCenter);\n ctx.lineTo(outerPosition.x, outerPosition.y);\n ctx.stroke();\n }\n if (pointLabelOpts.display) {\n // Extra pixels out for some label spacing\n var extra = i === 0 ? tickBackdropHeight / 2 : 0;\n var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5);\n\n // Keep this in loop since we may support array properties here\n var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor);\n ctx.fillStyle = pointLabelFontColor;\n var angleRadians = scale.getIndexAngle(i);\n var angle = helpers$1.toDegrees(angleRadians);\n ctx.textAlign = getTextAlignForAngle(angle);\n adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight);\n }\n }\n ctx.restore();\n }\n function drawRadiusLine(scale, gridLineOpts, radius, index) {\n var ctx = scale.ctx;\n var circular = gridLineOpts.circular;\n var valueCount = getValueCount(scale);\n var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1);\n var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1);\n var pointPosition;\n if (!circular && !valueCount || !lineColor || !lineWidth) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n if (ctx.setLineDash) {\n ctx.setLineDash(gridLineOpts.borderDash || []);\n ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0;\n }\n ctx.beginPath();\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n } else {\n // Draw straight lines connecting each index\n pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for (var i = 1; i < valueCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n }\n function numberOrZero(param) {\n return helpers$1.isNumber(param) ? param : 0;\n }\n var scale_radialLinear = scale_linearbase.extend({\n setDimensions: function setDimensions() {\n var me = this;\n\n // Set the unconstrained dimension before label rotation\n me.width = me.maxWidth;\n me.height = me.maxHeight;\n me.paddingTop = getTickBackdropHeight(me.options) / 2;\n me.xCenter = Math.floor(me.width / 2);\n me.yCenter = Math.floor((me.height - me.paddingTop) / 2);\n me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2;\n },\n determineDataLimits: function determineDataLimits() {\n var me = this;\n var chart = me.chart;\n var min = Number.POSITIVE_INFINITY;\n var max = Number.NEGATIVE_INFINITY;\n helpers$1.each(chart.data.datasets, function (dataset, datasetIndex) {\n if (chart.isDatasetVisible(datasetIndex)) {\n var meta = chart.getDatasetMeta(datasetIndex);\n helpers$1.each(dataset.data, function (rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n min = Math.min(value, min);\n max = Math.max(value, max);\n });\n }\n });\n me.min = min === Number.POSITIVE_INFINITY ? 0 : min;\n me.max = max === Number.NEGATIVE_INFINITY ? 0 : max;\n\n // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n me.handleTickRangeOptions();\n },\n // Returns the maximum number of ticks based on the scale dimension\n _computeTickLimit: function _computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n },\n convertTicksToLabels: function convertTicksToLabels() {\n var me = this;\n scale_linearbase.prototype.convertTicksToLabels.call(me);\n\n // Point labels\n me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n },\n getLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n fit: function fit() {\n var me = this;\n var opts = me.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(me);\n } else {\n me.setCenterPoint(0, 0, 0, 0);\n }\n },\n /**\n * Set radius reductions and determine new radius and center point\n * @private\n */\n setReductions: function setReductions(largestPossibleRadius, furthestLimits, furthestAngles) {\n var me = this;\n var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b);\n radiusReductionLeft = numberOrZero(radiusReductionLeft);\n radiusReductionRight = numberOrZero(radiusReductionRight);\n radiusReductionTop = numberOrZero(radiusReductionTop);\n radiusReductionBottom = numberOrZero(radiusReductionBottom);\n me.drawingArea = Math.min(Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n },\n setCenterPoint: function setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n var me = this;\n var maxRight = me.width - rightMovement - me.drawingArea;\n var maxLeft = leftMovement + me.drawingArea;\n var maxTop = topMovement + me.drawingArea;\n var maxBottom = me.height - me.paddingTop - bottomMovement - me.drawingArea;\n me.xCenter = Math.floor((maxLeft + maxRight) / 2 + me.left);\n me.yCenter = Math.floor((maxTop + maxBottom) / 2 + me.top + me.paddingTop);\n },\n getIndexAngle: function getIndexAngle(index) {\n var angleMultiplier = Math.PI * 2 / getValueCount(this);\n var startAngle = this.chart.options && this.chart.options.startAngle ? this.chart.options.startAngle : 0;\n var startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n // Start from the top instead of right, so remove a quarter of the circle\n return index * angleMultiplier + startAngleRadians;\n },\n getDistanceFromCenterForValue: function getDistanceFromCenterForValue(value) {\n var me = this;\n if (value === null) {\n return 0; // null always in center\n }\n\n // Take into account half font size + the yPadding of the top value\n var scalingFactor = me.drawingArea / (me.max - me.min);\n if (me.options.ticks.reverse) {\n return (me.max - value) * scalingFactor;\n }\n return (value - me.min) * scalingFactor;\n },\n getPointPosition: function getPointPosition(index, distanceFromCenter) {\n var me = this;\n var thisAngle = me.getIndexAngle(index) - Math.PI / 2;\n return {\n x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter,\n y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter\n };\n },\n getPointPositionForValue: function getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n },\n getBasePosition: function getBasePosition() {\n var me = this;\n var min = me.min;\n var max = me.max;\n return me.getPointPositionForValue(0, me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0);\n },\n draw: function draw() {\n var me = this;\n var opts = me.options;\n var gridLineOpts = opts.gridLines;\n var tickOpts = opts.ticks;\n if (opts.display) {\n var ctx = me.ctx;\n var startAngle = this.getIndexAngle(0);\n var tickFont = helpers$1.options._parseFont(tickOpts);\n if (opts.angleLines.display || opts.pointLabels.display) {\n drawPointLabels(me);\n }\n helpers$1.each(me.ticks, function (label, index) {\n // Don't draw a centre value (if it is minimum)\n if (index > 0 || tickOpts.reverse) {\n var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\n // Draw circular lines around the scale\n if (gridLineOpts.display && index !== 0) {\n drawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n }\n if (tickOpts.display) {\n var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor);\n ctx.font = tickFont.string;\n ctx.save();\n ctx.translate(me.xCenter, me.yCenter);\n ctx.rotate(startAngle);\n if (tickOpts.showLabelBackdrop) {\n var labelWidth = ctx.measureText(label).width;\n ctx.fillStyle = tickOpts.backdropColor;\n ctx.fillRect(-labelWidth / 2 - tickOpts.backdropPaddingX, -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, labelWidth + tickOpts.backdropPaddingX * 2, tickFont.size + tickOpts.backdropPaddingY * 2);\n }\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = tickFontColor;\n ctx.fillText(label, 0, -yCenterOffset);\n ctx.restore();\n }\n }\n });\n }\n }\n });\n\n // INTERNAL: static default options, registered in src/index.js\n var _defaults$3 = defaultConfig$3;\n scale_radialLinear._defaults = _defaults$3;\n var valueOrDefault$c = helpers$1.valueOrDefault;\n\n // Integer constants are from the ES6 spec.\n var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n var INTERVALS = {\n millisecond: {\n common: true,\n size: 1,\n steps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n },\n second: {\n common: true,\n size: 1000,\n steps: [1, 2, 5, 10, 15, 30]\n },\n minute: {\n common: true,\n size: 60000,\n steps: [1, 2, 5, 10, 15, 30]\n },\n hour: {\n common: true,\n size: 3600000,\n steps: [1, 2, 3, 6, 12]\n },\n day: {\n common: true,\n size: 86400000,\n steps: [1, 2, 5]\n },\n week: {\n common: false,\n size: 604800000,\n steps: [1, 2, 3, 4]\n },\n month: {\n common: true,\n size: 2.628e9,\n steps: [1, 2, 3]\n },\n quarter: {\n common: false,\n size: 7.884e9,\n steps: [1, 2, 3, 4]\n },\n year: {\n common: true,\n size: 3.154e10\n }\n };\n var UNITS = Object.keys(INTERVALS);\n function sorter(a, b) {\n return a - b;\n }\n function arrayUnique(items) {\n var hash = {};\n var out = [];\n var i, ilen, item;\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n if (!hash[item]) {\n hash[item] = true;\n out.push(item);\n }\n }\n return out;\n }\n\n /**\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n * extremity (left + width or top + height). Note that it would be more optimized to directly\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n *\n * @param {number[]} timestamps - timestamps sorted from lowest to highest.\n * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\n * If 'series', timestamps will be positioned at the same distance from each other. In this\n * case, only timestamps that break the time linearity are registered, meaning that in the\n * best case, all timestamps are linear, the table contains only min and max.\n */\n function buildLookupTable(timestamps, min, max, distribution) {\n if (distribution === 'linear' || !timestamps.length) {\n return [{\n time: min,\n pos: 0\n }, {\n time: max,\n pos: 1\n }];\n }\n var table = [];\n var items = [min];\n var i, ilen, prev, curr, next;\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr > min && curr < max) {\n items.push(curr);\n }\n }\n items.push(max);\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\n table.push({\n time: curr,\n pos: i / (ilen - 1)\n });\n }\n }\n return table;\n }\n\n // @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\n function lookup(table, key, value) {\n var lo = 0;\n var hi = table.length - 1;\n var mid, i0, i1;\n while (lo >= 0 && lo <= hi) {\n mid = lo + hi >> 1;\n i0 = table[mid - 1] || null;\n i1 = table[mid];\n if (!i0) {\n // given value is outside table (before first item)\n return {\n lo: null,\n hi: i1\n };\n } else if (i1[key] < value) {\n lo = mid + 1;\n } else if (i0[key] > value) {\n hi = mid - 1;\n } else {\n return {\n lo: i0,\n hi: i1\n };\n }\n }\n\n // given value is outside table (after last item)\n return {\n lo: i1,\n hi: null\n };\n }\n\n /**\n * Linearly interpolates the given source `value` using the table items `skey` values and\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\n * index [0, 1] or [n - 1, n] are used for the interpolation.\n */\n function interpolate$1(table, skey, sval, tkey) {\n var range = lookup(table, skey, sval);\n\n // Note: the lookup table ALWAYS contains at least 2 items (min and max)\n var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\n var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\n var span = next[skey] - prev[skey];\n var ratio = span ? (sval - prev[skey]) / span : 0;\n var offset = (next[tkey] - prev[tkey]) * ratio;\n return prev[tkey] + offset;\n }\n function toTimestamp(scale, input) {\n var adapter = scale._adapter;\n var options = scale.options.time;\n var parser = options.parser;\n var format = parser || options.format;\n var value = input;\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if its not a timestamp already\n if (!helpers$1.isFinite(value)) {\n value = typeof format === 'string' ? adapter.parse(value, format) : adapter.parse(value);\n }\n if (value !== null) {\n return +value;\n }\n\n // Labels are in an incompatible format and no `parser` has been provided.\n // The user might still use the deprecated `format` option for parsing.\n if (!parser && typeof format === 'function') {\n value = format(input);\n\n // `format` could return something else than a timestamp, if so, parse it\n if (!helpers$1.isFinite(value)) {\n value = adapter.parse(value);\n }\n }\n return value;\n }\n function parse(scale, input) {\n if (helpers$1.isNullOrUndef(input)) {\n return null;\n }\n var options = scale.options.time;\n var value = toTimestamp(scale, scale.getRightValue(input));\n if (value === null) {\n return value;\n }\n if (options.round) {\n value = +scale._adapter.startOf(value, options.round);\n }\n return value;\n }\n\n /**\n * Returns the number of unit to skip to be able to display up to `capacity` number of ticks\n * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.\n */\n function determineStepSize(min, max, unit, capacity) {\n var range = max - min;\n var interval = INTERVALS[unit];\n var milliseconds = interval.size;\n var steps = interval.steps;\n var i, ilen, factor;\n if (!steps) {\n return Math.ceil(range / (capacity * milliseconds));\n }\n for (i = 0, ilen = steps.length; i < ilen; ++i) {\n factor = steps[i];\n if (Math.ceil(range / (milliseconds * factor)) <= capacity) {\n break;\n }\n }\n return factor;\n }\n\n /**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n */\n function determineUnitForAutoTicks(minUnit, min, max, capacity) {\n var ilen = UNITS.length;\n var i, interval, factor;\n for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n interval = INTERVALS[UNITS[i]];\n factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n }\n\n /**\n * Figures out what unit to format a set of ticks with\n */\n function determineUnitForFormatting(scale, ticks, minUnit, min, max) {\n var ilen = UNITS.length;\n var i, unit;\n for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) {\n unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n }\n function determineMajorUnit(unit) {\n for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n }\n\n /**\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n * `minor` unit, aligned on the `major` unit and using the given scale time `options`.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n */\n function generate(scale, min, max, capacity) {\n var adapter = scale._adapter;\n var options = scale.options;\n var timeOpts = options.time;\n var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);\n var major = determineMajorUnit(minor);\n var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize);\n var weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n var majorTicksEnabled = options.ticks.major.enabled;\n var interval = INTERVALS[minor];\n var first = min;\n var last = max;\n var ticks = [];\n var time;\n if (!stepSize) {\n stepSize = determineStepSize(min, max, minor, capacity);\n }\n\n // For 'week' unit, handle the first day of week option\n if (weekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n last = +adapter.startOf(last, 'isoWeek', weekday);\n }\n\n // Align first/last ticks on unit\n first = +adapter.startOf(first, weekday ? 'day' : minor);\n last = +adapter.startOf(last, weekday ? 'day' : minor);\n\n // Make sure that the last tick include max\n if (last < max) {\n last = +adapter.add(last, 1, minor);\n }\n time = first;\n if (majorTicksEnabled && major && !weekday && !timeOpts.round) {\n // Align the first tick on the previous `minor` unit aligned on the `major` unit:\n // we first aligned time on the previous `major` unit then add the number of full\n // stepSize there is between first and the previous major time.\n time = +adapter.startOf(time, major);\n time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor);\n }\n for (; time < last; time = +adapter.add(time, stepSize, minor)) {\n ticks.push(+time);\n }\n ticks.push(+time);\n return ticks;\n }\n\n /**\n * Returns the start and end offsets from edges in the form of {start, end}\n * where each value is a relative width to the scale and ranges between 0 and 1.\n * They add extra margins on the both sides by scaling down the original scale.\n * Offsets are added when the `offset` option is true.\n */\n function computeOffsets(table, ticks, min, max, options) {\n var start = 0;\n var end = 0;\n var first, last;\n if (options.offset && ticks.length) {\n if (!options.time.min) {\n first = interpolate$1(table, 'time', ticks[0], 'pos');\n if (ticks.length === 1) {\n start = 1 - first;\n } else {\n start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2;\n }\n }\n if (!options.time.max) {\n last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos');\n if (ticks.length === 1) {\n end = last;\n } else {\n end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2;\n }\n }\n }\n return {\n start: start,\n end: end\n };\n }\n function ticksFromTimestamps(scale, values, majorUnit) {\n var ticks = [];\n var i, ilen, value, major;\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n value = values[i];\n major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false;\n ticks.push({\n value: value,\n major: major\n });\n }\n return ticks;\n }\n var defaultConfig$4 = {\n position: 'bottom',\n /**\n * Data distribution along the scale:\n * - 'linear': data are spread according to their time (distances can vary),\n * - 'series': data are spread at the same distance from each other.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n distribution: 'linear',\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n format: false,\n // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/\n unit: false,\n // false == automatic or override with week, month, year, etc.\n round: false,\n // none, or override with week, month, year, etc.\n displayFormat: false,\n // DEPRECATED\n isoWeekday: false,\n // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n autoSkip: false,\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n major: {\n enabled: false\n }\n }\n };\n var scale_time = core_scale.extend({\n initialize: function initialize() {\n this.mergeTicksOptions();\n core_scale.prototype.initialize.call(this);\n },\n update: function update() {\n var me = this;\n var options = me.options;\n var time = options.time || (options.time = {});\n var adapter = me._adapter = new core_adapters._date(options.adapters.date);\n\n // DEPRECATIONS: output a message only one time per update\n if (time.format) {\n console.warn('options.time.format is deprecated and replaced by options.time.parser.');\n }\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n helpers$1.mergeIf(time.displayFormats, adapter.formats());\n return core_scale.prototype.update.apply(me, arguments);\n },\n /**\n * Allows data to be referenced via 't' attribute\n */\n getRightValue: function getRightValue(rawValue) {\n if (rawValue && rawValue.t !== undefined) {\n rawValue = rawValue.t;\n }\n return core_scale.prototype.getRightValue.call(this, rawValue);\n },\n determineDataLimits: function determineDataLimits() {\n var me = this;\n var chart = me.chart;\n var adapter = me._adapter;\n var timeOpts = me.options.time;\n var unit = timeOpts.unit || 'day';\n var min = MAX_INTEGER;\n var max = MIN_INTEGER;\n var timestamps = [];\n var datasets = [];\n var labels = [];\n var i, j, ilen, jlen, data, timestamp;\n var dataLabels = chart.data.labels || [];\n\n // Convert labels to timestamps\n for (i = 0, ilen = dataLabels.length; i < ilen; ++i) {\n labels.push(parse(me, dataLabels[i]));\n }\n\n // Convert data to timestamps\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n data = chart.data.datasets[i].data;\n\n // Let's consider that all data have the same format.\n if (helpers$1.isObject(data[0])) {\n datasets[i] = [];\n for (j = 0, jlen = data.length; j < jlen; ++j) {\n timestamp = parse(me, data[j]);\n timestamps.push(timestamp);\n datasets[i][j] = timestamp;\n }\n } else {\n for (j = 0, jlen = labels.length; j < jlen; ++j) {\n timestamps.push(labels[j]);\n }\n datasets[i] = labels.slice(0);\n }\n } else {\n datasets[i] = [];\n }\n }\n if (labels.length) {\n // Sort labels **after** data have been converted\n labels = arrayUnique(labels).sort(sorter);\n min = Math.min(min, labels[0]);\n max = Math.max(max, labels[labels.length - 1]);\n }\n if (timestamps.length) {\n timestamps = arrayUnique(timestamps).sort(sorter);\n min = Math.min(min, timestamps[0]);\n max = Math.max(max, timestamps[timestamps.length - 1]);\n }\n min = parse(me, timeOpts.min) || min;\n max = parse(me, timeOpts.max) || max;\n\n // In case there is no valid min/max, set limits based on unit time option\n min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min;\n max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max;\n\n // Make sure that max is strictly higher than min (required by the lookup table)\n me.min = Math.min(min, max);\n me.max = Math.max(min + 1, max);\n\n // PRIVATE\n me._horizontal = me.isHorizontal();\n me._table = [];\n me._timestamps = {\n data: timestamps,\n datasets: datasets,\n labels: labels\n };\n },\n buildTicks: function buildTicks() {\n var me = this;\n var min = me.min;\n var max = me.max;\n var options = me.options;\n var timeOpts = options.time;\n var timestamps = [];\n var ticks = [];\n var i, ilen, timestamp;\n switch (options.ticks.source) {\n case 'data':\n timestamps = me._timestamps.data;\n break;\n case 'labels':\n timestamps = me._timestamps.labels;\n break;\n case 'auto':\n default:\n timestamps = generate(me, min, max, me.getLabelCapacity(min), options);\n }\n if (options.bounds === 'ticks' && timestamps.length) {\n min = timestamps[0];\n max = timestamps[timestamps.length - 1];\n }\n\n // Enforce limits with user min/max options\n min = parse(me, timeOpts.min) || min;\n max = parse(me, timeOpts.max) || max;\n\n // Remove ticks outside the min/max range\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n timestamp = timestamps[i];\n if (timestamp >= min && timestamp <= max) {\n ticks.push(timestamp);\n }\n }\n me.min = min;\n me.max = max;\n\n // PRIVATE\n me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max);\n me._majorUnit = determineMajorUnit(me._unit);\n me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);\n me._offsets = computeOffsets(me._table, ticks, min, max, options);\n if (options.ticks.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(me, ticks, me._majorUnit);\n },\n getLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n var me = this;\n var adapter = me._adapter;\n var data = me.chart.data;\n var timeOpts = me.options.time;\n var label = data.labels && index < data.labels.length ? data.labels[index] : '';\n var value = data.datasets[datasetIndex].data[index];\n if (helpers$1.isObject(value)) {\n label = me.getRightValue(value);\n }\n if (timeOpts.tooltipFormat) {\n return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat);\n }\n if (typeof label === 'string') {\n return label;\n }\n return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime);\n },\n /**\n * Function to format an individual tick mark\n * @private\n */\n tickFormatFunction: function tickFormatFunction(time, index, ticks, format) {\n var me = this;\n var adapter = me._adapter;\n var options = me.options;\n var formats = options.time.displayFormats;\n var minorFormat = formats[me._unit];\n var majorUnit = me._majorUnit;\n var majorFormat = formats[majorUnit];\n var majorTime = +adapter.startOf(time, majorUnit);\n var majorTickOpts = options.ticks.major;\n var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;\n var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat);\n var tickOpts = major ? majorTickOpts : options.ticks.minor;\n var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback);\n return formatter ? formatter(label, index, ticks) : label;\n },\n convertTicksToLabels: function convertTicksToLabels(ticks) {\n var labels = [];\n var i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n labels.push(this.tickFormatFunction(ticks[i].value, i, ticks));\n }\n return labels;\n },\n /**\n * @private\n */\n getPixelForOffset: function getPixelForOffset(time) {\n var me = this;\n var isReverse = me.options.ticks.reverse;\n var size = me._horizontal ? me.width : me.height;\n var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top;\n var pos = interpolate$1(me._table, 'time', time, 'pos');\n var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end);\n return isReverse ? start - offset : start + offset;\n },\n getPixelForValue: function getPixelForValue(value, index, datasetIndex) {\n var me = this;\n var time = null;\n if (index !== undefined && datasetIndex !== undefined) {\n time = me._timestamps.datasets[datasetIndex][index];\n }\n if (time === null) {\n time = parse(me, value);\n }\n if (time !== null) {\n return me.getPixelForOffset(time);\n }\n },\n getPixelForTick: function getPixelForTick(index) {\n var ticks = this.getTicks();\n return index >= 0 && index < ticks.length ? this.getPixelForOffset(ticks[index].value) : null;\n },\n getValueForPixel: function getValueForPixel(pixel) {\n var me = this;\n var size = me._horizontal ? me.width : me.height;\n var start = me._horizontal ? me.left : me.top;\n var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end;\n var time = interpolate$1(me._table, 'pos', pos, 'time');\n\n // DEPRECATION, we should return time directly\n return me._adapter._create(time);\n },\n /**\n * Crude approximation of what the label width might be\n * @private\n */\n getLabelWidth: function getLabelWidth(label) {\n var me = this;\n var ticksOpts = me.options.ticks;\n var tickLabelWidth = me.ctx.measureText(label).width;\n var angle = helpers$1.toRadians(ticksOpts.maxRotation);\n var cosRotation = Math.cos(angle);\n var sinRotation = Math.sin(angle);\n var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize);\n return tickLabelWidth * cosRotation + tickFontSize * sinRotation;\n },\n /**\n * @private\n */\n getLabelCapacity: function getLabelCapacity(exampleTime) {\n var me = this;\n\n // pick the longest format (milliseconds) for guestimation\n var format = me.options.time.displayFormats.millisecond;\n var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format);\n var tickLabelWidth = me.getLabelWidth(exampleLabel);\n var innerWidth = me.isHorizontal() ? me.width : me.height;\n var capacity = Math.floor(innerWidth / tickLabelWidth);\n return capacity > 0 ? capacity : 1;\n }\n });\n\n // INTERNAL: static default options, registered in src/index.js\n var _defaults$4 = defaultConfig$4;\n scale_time._defaults = _defaults$4;\n var scales = {\n category: scale_category,\n linear: scale_linear,\n logarithmic: scale_logarithmic,\n radialLinear: scale_radialLinear,\n time: scale_time\n };\n var FORMATS = {\n datetime: 'MMM D, YYYY, h:mm:ss a',\n millisecond: 'h:mm:ss.SSS a',\n second: 'h:mm:ss a',\n minute: 'h:mm a',\n hour: 'hA',\n day: 'MMM D',\n week: 'll',\n month: 'MMM YYYY',\n quarter: '[Q]Q - YYYY',\n year: 'YYYY'\n };\n core_adapters._date.override(typeof moment === 'function' ? {\n _id: 'moment',\n // DEBUG ONLY\n\n formats: function formats() {\n return FORMATS;\n },\n parse: function parse(value, format) {\n if (typeof value === 'string' && typeof format === 'string') {\n value = moment(value, format);\n } else if (!(value instanceof moment)) {\n value = moment(value);\n }\n return value.isValid() ? value.valueOf() : null;\n },\n format: function format(time, _format) {\n return moment(time).format(_format);\n },\n add: function add(time, amount, unit) {\n return moment(time).add(amount, unit).valueOf();\n },\n diff: function diff(max, min, unit) {\n return moment.duration(moment(max).diff(moment(min))).as(unit);\n },\n startOf: function startOf(time, unit, weekday) {\n time = moment(time);\n if (unit === 'isoWeek') {\n return time.isoWeekday(weekday).valueOf();\n }\n return time.startOf(unit).valueOf();\n },\n endOf: function endOf(time, unit) {\n return moment(time).endOf(unit).valueOf();\n },\n // DEPRECATIONS\n\n /**\n * Provided for backward compatibility with scale.getValueForPixel().\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\n _create: function _create(time) {\n return moment(time);\n }\n } : {});\n core_defaults._set('global', {\n plugins: {\n filler: {\n propagate: true\n }\n }\n });\n var mappers = {\n dataset: function dataset(source) {\n var index = source.fill;\n var chart = source.chart;\n var meta = chart.getDatasetMeta(index);\n var visible = meta && chart.isDatasetVisible(index);\n var points = visible && meta.dataset._children || [];\n var length = points.length || 0;\n return !length ? null : function (point, i) {\n return i < length && points[i]._view || null;\n };\n },\n boundary: function boundary(source) {\n var boundary = source.boundary;\n var x = boundary ? boundary.x : null;\n var y = boundary ? boundary.y : null;\n return function (point) {\n return {\n x: x === null ? point.x : x,\n y: y === null ? point.y : y\n };\n };\n }\n };\n\n // @todo if (fill[0] === '#')\n function decodeFill(el, index, count) {\n var model = el._model || {};\n var fill = model.fill;\n var target;\n if (fill === undefined) {\n fill = !!model.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return 'origin';\n }\n target = parseFloat(fill, 10);\n if (isFinite(target) && Math.floor(target) === target) {\n if (fill[0] === '-' || fill[0] === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n }\n switch (fill) {\n // compatibility\n case 'bottom':\n return 'start';\n case 'top':\n return 'end';\n case 'zero':\n return 'origin';\n // supported boundaries\n case 'origin':\n case 'start':\n case 'end':\n return fill;\n // invalid fill values\n default:\n return false;\n }\n }\n function computeBoundary(source) {\n var model = source.el._model || {};\n var scale = source.el._scale || {};\n var fill = source.fill;\n var target = null;\n var horizontal;\n if (isFinite(fill)) {\n return null;\n }\n\n // Backward compatibility: until v3, we still need to support boundary values set on\n // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n // controllers might still use it (e.g. the Smith chart).\n\n if (fill === 'start') {\n target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\n } else if (fill === 'end') {\n target = model.scaleTop === undefined ? scale.top : model.scaleTop;\n } else if (model.scaleZero !== undefined) {\n target = model.scaleZero;\n } else if (scale.getBasePosition) {\n target = scale.getBasePosition();\n } else if (scale.getBasePixel) {\n target = scale.getBasePixel();\n }\n if (target !== undefined && target !== null) {\n if (target.x !== undefined && target.y !== undefined) {\n return target;\n }\n if (helpers$1.isFinite(target)) {\n horizontal = scale.isHorizontal();\n return {\n x: horizontal ? target : null,\n y: horizontal ? null : target\n };\n }\n }\n return null;\n }\n function resolveTarget(sources, index, propagate) {\n var source = sources[index];\n var fill = source.fill;\n var visited = [index];\n var target;\n if (!propagate) {\n return fill;\n }\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n }\n function createMapper(source) {\n var fill = source.fill;\n var type = 'dataset';\n if (fill === false) {\n return null;\n }\n if (!isFinite(fill)) {\n type = 'boundary';\n }\n return mappers[type](source);\n }\n function isDrawable(point) {\n return point && !point.skip;\n }\n function drawArea(ctx, curve0, curve1, len0, len1) {\n var i;\n if (!len0 || !len1) {\n return;\n }\n\n // building first area curve (normal)\n ctx.moveTo(curve0[0].x, curve0[0].y);\n for (i = 1; i < len0; ++i) {\n helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\n }\n\n // joining the two area curves\n ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);\n\n // building opposite area curve (reverse)\n for (i = len1 - 1; i > 0; --i) {\n helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\n }\n }\n function doFill(ctx, points, mapper, view, color, loop) {\n var count = points.length;\n var span = view.spanGaps;\n var curve0 = [];\n var curve1 = [];\n var len0 = 0;\n var len1 = 0;\n var i, ilen, index, p0, p1, d0, d1;\n ctx.beginPath();\n for (i = 0, ilen = count + !!loop; i < ilen; ++i) {\n index = i % count;\n p0 = points[index]._view;\n p1 = mapper(p0, index, view);\n d0 = isDrawable(p0);\n d1 = isDrawable(p1);\n if (d0 && d1) {\n len0 = curve0.push(p0);\n len1 = curve1.push(p1);\n } else if (len0 && len1) {\n if (!span) {\n drawArea(ctx, curve0, curve1, len0, len1);\n len0 = len1 = 0;\n curve0 = [];\n curve1 = [];\n } else {\n if (d0) {\n curve0.push(p0);\n }\n if (d1) {\n curve1.push(p1);\n }\n }\n }\n }\n drawArea(ctx, curve0, curve1, len0, len1);\n ctx.closePath();\n ctx.fillStyle = color;\n ctx.fill();\n }\n var plugin_filler = {\n id: 'filler',\n afterDatasetsUpdate: function afterDatasetsUpdate(chart, options) {\n var count = (chart.data.datasets || []).length;\n var propagate = options.propagate;\n var sources = [];\n var meta, i, el, source;\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n el = meta.dataset;\n source = null;\n if (el && el._model && el instanceof elements.Line) {\n source = {\n visible: chart.isDatasetVisible(i),\n fill: decodeFill(el, i, count),\n chart: chart,\n el: el\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source) {\n continue;\n }\n source.fill = resolveTarget(sources, i, propagate);\n source.boundary = computeBoundary(source);\n source.mapper = createMapper(source);\n }\n },\n beforeDatasetDraw: function beforeDatasetDraw(chart, args) {\n var meta = args.meta.$filler;\n if (!meta) {\n return;\n }\n var ctx = chart.ctx;\n var el = meta.el;\n var view = el._view;\n var points = el._children || [];\n var mapper = meta.mapper;\n var color = view.backgroundColor || core_defaults.global.defaultColor;\n if (mapper && color && points.length) {\n helpers$1.canvas.clipArea(ctx, chart.chartArea);\n doFill(ctx, points, mapper, view, color, el._loop);\n helpers$1.canvas.unclipArea(ctx);\n }\n }\n };\n var noop$1 = helpers$1.noop;\n var valueOrDefault$d = helpers$1.valueOrDefault;\n core_defaults._set('global', {\n legend: {\n display: true,\n position: 'top',\n fullWidth: true,\n reverse: false,\n weight: 1000,\n // a callback that will handle\n onClick: function onClick(e, legendItem) {\n var index = legendItem.datasetIndex;\n var ci = this.chart;\n var meta = ci.getDatasetMeta(index);\n\n // See controller.isDatasetVisible comment\n meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;\n\n // We hid a dataset ... rerender the chart\n ci.update();\n },\n onHover: null,\n onLeave: null,\n labels: {\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels: function generateLabels(chart) {\n var data = chart.data;\n return helpers$1.isArray(data.datasets) ? data.datasets.map(function (dataset, i) {\n return {\n text: dataset.label,\n fillStyle: !helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0],\n hidden: !chart.isDatasetVisible(i),\n lineCap: dataset.borderCapStyle,\n lineDash: dataset.borderDash,\n lineDashOffset: dataset.borderDashOffset,\n lineJoin: dataset.borderJoinStyle,\n lineWidth: dataset.borderWidth,\n strokeStyle: dataset.borderColor,\n pointStyle: dataset.pointStyle,\n // Below is extra data used for toggling the datasets\n datasetIndex: i\n };\n }, this) : [];\n }\n }\n },\n legendCallback: function legendCallback(chart) {\n var text = [];\n text.push('
');\n for (var i = 0; i < chart.data.datasets.length; i++) {\n text.push('
');\n if (chart.data.datasets[i].label) {\n text.push(chart.data.datasets[i].label);\n }\n text.push('
');\n }\n text.push('
');\n return text.join('');\n }\n });\n\n /**\n * Helper function to get the box width based on the usePointStyle option\n * @param {object} labelopts - the label options on the legend\n * @param {number} fontSize - the label font size\n * @return {number} width of the color box area\n */\n function getBoxWidth(labelOpts, fontSize) {\n return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? fontSize : labelOpts.boxWidth;\n }\n\n /**\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\n */\n var Legend = core_element.extend({\n initialize: function initialize(config) {\n helpers$1.extend(this, config);\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t * @private\n \t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n },\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all legend types.\n // Any function can be extended by the legend type\n\n beforeUpdate: noop$1,\n update: function update(maxWidth, maxHeight, margins) {\n var me = this;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = margins;\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n // Labels\n me.beforeBuildLabels();\n me.buildLabels();\n me.afterBuildLabels();\n\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n return me.minSize;\n },\n afterUpdate: noop$1,\n //\n\n beforeSetDimensions: noop$1,\n setDimensions: function setDimensions() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n\n // Reset minSize\n me.minSize = {\n width: 0,\n height: 0\n };\n },\n afterSetDimensions: noop$1,\n //\n\n beforeBuildLabels: noop$1,\n buildLabels: function buildLabels() {\n var me = this;\n var labelOpts = me.options.labels || {};\n var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter(function (item) {\n return labelOpts.filter(item, me.chart.data);\n });\n }\n if (me.options.reverse) {\n legendItems.reverse();\n }\n me.legendItems = legendItems;\n },\n afterBuildLabels: noop$1,\n //\n\n beforeFit: noop$1,\n fit: function fit() {\n var me = this;\n var opts = me.options;\n var labelOpts = opts.labels;\n var display = opts.display;\n var ctx = me.ctx;\n var labelFont = helpers$1.options._parseFont(labelOpts);\n var fontSize = labelFont.size;\n\n // Reset hit boxes\n var hitboxes = me.legendHitBoxes = [];\n var minSize = me.minSize;\n var isHorizontal = me.isHorizontal();\n if (isHorizontal) {\n minSize.width = me.maxWidth; // fill all the width\n minSize.height = display ? 10 : 0;\n } else {\n minSize.width = display ? 10 : 0;\n minSize.height = me.maxHeight; // fill all the height\n }\n\n // Increase sizes here\n if (display) {\n ctx.font = labelFont.string;\n if (isHorizontal) {\n // Labels\n\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n var lineWidths = me.lineWidths = [0];\n var totalHeight = 0;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n helpers$1.each(me.legendItems, function (legendItem, i) {\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var width = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) {\n totalHeight += fontSize + labelOpts.padding;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {\n left: 0,\n top: 0,\n width: width,\n height: fontSize\n };\n lineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n });\n minSize.height += totalHeight;\n } else {\n var vPadding = labelOpts.padding;\n var columnWidths = me.columnWidths = [];\n var totalWidth = labelOpts.padding;\n var currentColWidth = 0;\n var currentColHeight = 0;\n var itemHeight = fontSize + vPadding;\n helpers$1.each(me.legendItems, function (legendItem, i) {\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) {\n totalWidth += currentColWidth + labelOpts.padding;\n columnWidths.push(currentColWidth); // previous column width\n\n currentColWidth = 0;\n currentColHeight = 0;\n }\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight;\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {\n left: 0,\n top: 0,\n width: itemWidth,\n height: fontSize\n };\n });\n totalWidth += currentColWidth;\n columnWidths.push(currentColWidth);\n minSize.width += totalWidth;\n }\n }\n me.width = minSize.width;\n me.height = minSize.height;\n },\n afterFit: noop$1,\n // Shared Methods\n isHorizontal: function isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n },\n // Actually draw the legend on the canvas\n draw: function draw() {\n var me = this;\n var opts = me.options;\n var labelOpts = opts.labels;\n var globalDefaults = core_defaults.global;\n var defaultColor = globalDefaults.defaultColor;\n var lineDefault = globalDefaults.elements.line;\n var legendWidth = me.width;\n var lineWidths = me.lineWidths;\n if (opts.display) {\n var ctx = me.ctx;\n var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor);\n var labelFont = helpers$1.options._parseFont(labelOpts);\n var fontSize = labelFont.size;\n var cursor;\n\n // Canvas setup\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.strokeStyle = fontColor; // for strikethrough effect\n ctx.fillStyle = fontColor; // render in correct colour\n ctx.font = labelFont.string;\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var hitboxes = me.legendHitBoxes;\n\n // current position\n var drawLegendBox = function drawLegendBox(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth);\n ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle);\n ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle);\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor);\n if (ctx.setLineDash) {\n // IE 9 and 10 do not support line dash\n ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash));\n }\n if (opts.labels && opts.labels.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n var radius = boxWidth * Math.SQRT2 / 2;\n var centerX = x + boxWidth / 2;\n var centerY = y + fontSize / 2;\n\n // Draw pointStyle as legend symbol\n helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n } else {\n // Draw box as legend symbol\n if (lineWidth !== 0) {\n ctx.strokeRect(x, y, boxWidth, fontSize);\n }\n ctx.fillRect(x, y, boxWidth, fontSize);\n }\n ctx.restore();\n };\n var fillText = function fillText(x, y, legendItem, textWidth) {\n var halfFontSize = fontSize / 2;\n var xLeft = boxWidth + halfFontSize + x;\n var yMiddle = y + halfFontSize;\n ctx.fillText(legendItem.text, xLeft, yMiddle);\n if (legendItem.hidden) {\n // Strikethrough the text if hidden\n ctx.beginPath();\n ctx.lineWidth = 2;\n ctx.moveTo(xLeft, yMiddle);\n ctx.lineTo(xLeft + textWidth, yMiddle);\n ctx.stroke();\n }\n };\n\n // Horizontal\n var isHorizontal = me.isHorizontal();\n if (isHorizontal) {\n cursor = {\n x: me.left + (legendWidth - lineWidths[0]) / 2 + labelOpts.padding,\n y: me.top + labelOpts.padding,\n line: 0\n };\n } else {\n cursor = {\n x: me.left + labelOpts.padding,\n y: me.top + labelOpts.padding,\n line: 0\n };\n }\n var itemHeight = fontSize + labelOpts.padding;\n helpers$1.each(me.legendItems, function (legendItem, i) {\n var textWidth = ctx.measureText(legendItem.text).width;\n var width = boxWidth + fontSize / 2 + textWidth;\n var x = cursor.x;\n var y = cursor.y;\n\n // Use (me.left + me.minSize.width) and (me.top + me.minSize.height)\n // instead of me.right and me.bottom because me.width and me.height\n // may have been changed since me.minSize was calculated\n if (isHorizontal) {\n if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) {\n y = cursor.y += itemHeight;\n cursor.line++;\n x = cursor.x = me.left + (legendWidth - lineWidths[cursor.line]) / 2 + labelOpts.padding;\n }\n } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) {\n x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n y = cursor.y = me.top + labelOpts.padding;\n cursor.line++;\n }\n drawLegendBox(x, y, legendItem);\n hitboxes[i].left = x;\n hitboxes[i].top = y;\n\n // Fill the actual label\n fillText(x, y, legendItem, textWidth);\n if (isHorizontal) {\n cursor.x += width + labelOpts.padding;\n } else {\n cursor.y += itemHeight;\n }\n });\n }\n },\n /**\n * @private\n */\n _getLegendItemAt: function _getLegendItemAt(x, y) {\n var me = this;\n var i, hitBox, lh;\n if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n // See if we are touching one of the dataset boxes\n lh = me.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n // Touching an element\n return me.legendItems[i];\n }\n }\n }\n return null;\n },\n /**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n */\n handleEvent: function handleEvent(e) {\n var me = this;\n var opts = me.options;\n var type = e.type === 'mouseup' ? 'click' : e.type;\n var hoveredItem;\n if (type === 'mousemove') {\n if (!opts.onHover && !opts.onLeave) {\n return;\n }\n } else if (type === 'click') {\n if (!opts.onClick) {\n return;\n }\n } else {\n return;\n }\n\n // Chart event already has relative position in it\n hoveredItem = me._getLegendItemAt(e.x, e.y);\n if (type === 'click') {\n if (hoveredItem && opts.onClick) {\n // use e.native for backwards compatibility\n opts.onClick.call(me, e[\"native\"], hoveredItem);\n }\n } else {\n if (opts.onLeave && hoveredItem !== me._hoveredItem) {\n if (me._hoveredItem) {\n opts.onLeave.call(me, e[\"native\"], me._hoveredItem);\n }\n me._hoveredItem = hoveredItem;\n }\n if (opts.onHover && hoveredItem) {\n // use e.native for backwards compatibility\n opts.onHover.call(me, e[\"native\"], hoveredItem);\n }\n }\n }\n });\n function createNewLegendAndAttach(chart, legendOpts) {\n var legend = new Legend({\n ctx: chart.ctx,\n options: legendOpts,\n chart: chart\n });\n core_layouts.configure(chart, legend, legendOpts);\n core_layouts.addBox(chart, legend);\n chart.legend = legend;\n }\n var plugin_legend = {\n id: 'legend',\n /**\n * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making\n * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of\n * the plugin, which one will be re-exposed in the chart.js file.\n * https://github.com/chartjs/Chart.js/pull/2640\n * @private\n */\n _element: Legend,\n beforeInit: function beforeInit(chart) {\n var legendOpts = chart.options.legend;\n if (legendOpts) {\n createNewLegendAndAttach(chart, legendOpts);\n }\n },\n beforeUpdate: function beforeUpdate(chart) {\n var legendOpts = chart.options.legend;\n var legend = chart.legend;\n if (legendOpts) {\n helpers$1.mergeIf(legendOpts, core_defaults.global.legend);\n if (legend) {\n core_layouts.configure(chart, legend, legendOpts);\n legend.options = legendOpts;\n } else {\n createNewLegendAndAttach(chart, legendOpts);\n }\n } else if (legend) {\n core_layouts.removeBox(chart, legend);\n delete chart.legend;\n }\n },\n afterEvent: function afterEvent(chart, e) {\n var legend = chart.legend;\n if (legend) {\n legend.handleEvent(e);\n }\n }\n };\n var noop$2 = helpers$1.noop;\n core_defaults._set('global', {\n title: {\n display: false,\n fontStyle: 'bold',\n fullWidth: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000 // by default greater than legend (1000) to be above\n }\n });\n\n /**\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\n */\n var Title = core_element.extend({\n initialize: function initialize(config) {\n var me = this;\n helpers$1.extend(me, config);\n\n // Contains hit boxes for each dataset (in dataset order)\n me.legendHitBoxes = [];\n },\n // These methods are ordered by lifecycle. Utilities then follow.\n\n beforeUpdate: noop$2,\n update: function update(maxWidth, maxHeight, margins) {\n var me = this;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = margins;\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n // Labels\n me.beforeBuildLabels();\n me.buildLabels();\n me.afterBuildLabels();\n\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n return me.minSize;\n },\n afterUpdate: noop$2,\n //\n\n beforeSetDimensions: noop$2,\n setDimensions: function setDimensions() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n\n // Reset minSize\n me.minSize = {\n width: 0,\n height: 0\n };\n },\n afterSetDimensions: noop$2,\n //\n\n beforeBuildLabels: noop$2,\n buildLabels: noop$2,\n afterBuildLabels: noop$2,\n //\n\n beforeFit: noop$2,\n fit: function fit() {\n var me = this;\n var opts = me.options;\n var display = opts.display;\n var minSize = me.minSize;\n var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1;\n var fontOpts = helpers$1.options._parseFont(opts);\n var textSize = display ? lineCount * fontOpts.lineHeight + opts.padding * 2 : 0;\n if (me.isHorizontal()) {\n minSize.width = me.maxWidth; // fill all the width\n minSize.height = textSize;\n } else {\n minSize.width = textSize;\n minSize.height = me.maxHeight; // fill all the height\n }\n\n me.width = minSize.width;\n me.height = minSize.height;\n },\n afterFit: noop$2,\n // Shared Methods\n isHorizontal: function isHorizontal() {\n var pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n },\n // Actually draw the title block on the canvas\n draw: function draw() {\n var me = this;\n var ctx = me.ctx;\n var opts = me.options;\n if (opts.display) {\n var fontOpts = helpers$1.options._parseFont(opts);\n var lineHeight = fontOpts.lineHeight;\n var offset = lineHeight / 2 + opts.padding;\n var rotation = 0;\n var top = me.top;\n var left = me.left;\n var bottom = me.bottom;\n var right = me.right;\n var maxWidth, titleX, titleY;\n ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour\n ctx.font = fontOpts.string;\n\n // Horizontal\n if (me.isHorizontal()) {\n titleX = left + (right - left) / 2; // midpoint of the width\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n titleX = opts.position === 'left' ? left + offset : right - offset;\n titleY = top + (bottom - top) / 2;\n maxWidth = bottom - top;\n rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n }\n ctx.save();\n ctx.translate(titleX, titleY);\n ctx.rotate(rotation);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n var text = opts.text;\n if (helpers$1.isArray(text)) {\n var y = 0;\n for (var i = 0; i < text.length; ++i) {\n ctx.fillText(text[i], 0, y, maxWidth);\n y += lineHeight;\n }\n } else {\n ctx.fillText(text, 0, 0, maxWidth);\n }\n ctx.restore();\n }\n }\n });\n function createNewTitleBlockAndAttach(chart, titleOpts) {\n var title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart: chart\n });\n core_layouts.configure(chart, title, titleOpts);\n core_layouts.addBox(chart, title);\n chart.titleBlock = title;\n }\n var plugin_title = {\n id: 'title',\n /**\n * Backward compatibility: since 2.1.5, the title is registered as a plugin, making\n * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of\n * the plugin, which one will be re-exposed in the chart.js file.\n * https://github.com/chartjs/Chart.js/pull/2640\n * @private\n */\n _element: Title,\n beforeInit: function beforeInit(chart) {\n var titleOpts = chart.options.title;\n if (titleOpts) {\n createNewTitleBlockAndAttach(chart, titleOpts);\n }\n },\n beforeUpdate: function beforeUpdate(chart) {\n var titleOpts = chart.options.title;\n var titleBlock = chart.titleBlock;\n if (titleOpts) {\n helpers$1.mergeIf(titleOpts, core_defaults.global.title);\n if (titleBlock) {\n core_layouts.configure(chart, titleBlock, titleOpts);\n titleBlock.options = titleOpts;\n } else {\n createNewTitleBlockAndAttach(chart, titleOpts);\n }\n } else if (titleBlock) {\n core_layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n }\n }\n };\n var plugins = {};\n var filler = plugin_filler;\n var legend = plugin_legend;\n var title = plugin_title;\n plugins.filler = filler;\n plugins.legend = legend;\n plugins.title = title;\n\n /**\n * @namespace Chart\n */\n\n core_controller.helpers = helpers$1;\n\n // @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\n core_helpers(core_controller);\n core_controller._adapters = core_adapters;\n core_controller.Animation = core_animation;\n core_controller.animationService = core_animations;\n core_controller.controllers = controllers;\n core_controller.DatasetController = core_datasetController;\n core_controller.defaults = core_defaults;\n core_controller.Element = core_element;\n core_controller.elements = elements;\n core_controller.Interaction = core_interaction;\n core_controller.layouts = core_layouts;\n core_controller.platform = platform;\n core_controller.plugins = core_plugins;\n core_controller.Scale = core_scale;\n core_controller.scaleService = core_scaleService;\n core_controller.Ticks = core_ticks;\n core_controller.Tooltip = core_tooltip;\n\n // Register built-in scales\n\n core_controller.helpers.each(scales, function (scale, type) {\n core_controller.scaleService.registerScaleType(type, scale, scale._defaults);\n });\n\n // Load to register built-in adapters (as side effects)\n\n // Loading built-in plugins\n\n for (var k in plugins) {\n if (plugins.hasOwnProperty(k)) {\n core_controller.plugins.register(plugins[k]);\n }\n }\n core_controller.platform.initialize();\n var src = core_controller;\n if (typeof window !== 'undefined') {\n window.Chart = core_controller;\n }\n\n // DEPRECATIONS\n\n /**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Chart\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\n core_controller.Chart = core_controller;\n\n /**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Legend\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n core_controller.Legend = plugins.legend._element;\n\n /**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Title\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n core_controller.Title = plugins.title._element;\n\n /**\n * Provided for backward compatibility, use Chart.plugins instead\n * @namespace Chart.pluginService\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n core_controller.pluginService = core_controller.plugins;\n\n /**\n * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n * effect, instead simply create/register plugins via plain JavaScript objects.\n * @interface Chart.PluginBase\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n core_controller.PluginBase = core_controller.Element.extend({});\n\n /**\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\n * @namespace Chart.canvasHelpers\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n core_controller.canvasHelpers = core_controller.helpers.canvas;\n\n /**\n * Provided for backward compatibility, use Chart.layouts instead.\n * @namespace Chart.layoutService\n * @deprecated since version 2.7.3\n * @todo remove at version 3\n * @private\n */\n core_controller.layoutService = core_controller.layouts;\n\n /**\n * Provided for backward compatibility, not available anymore.\n * @namespace Chart.LinearScaleBase\n * @deprecated since version 2.8\n * @todo remove at version 3\n * @private\n */\n core_controller.LinearScaleBase = scale_linearbase;\n\n /**\n * Provided for backward compatibility, instead we should create a new Chart\n * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`).\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n */\n core_controller.helpers.each(['Bar', 'Bubble', 'Doughnut', 'Line', 'PolarArea', 'Radar', 'Scatter'], function (klass) {\n core_controller[klass] = function (ctx, cfg) {\n return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, {\n type: klass.charAt(0).toLowerCase() + klass.slice(1)\n }));\n };\n });\n return src;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDLEVBQUUsRUFBQyxFQUFFLEVBQUMsR0FBRyxDQUFDO0lBQzNCQyxhQUFhLEVBQUcsQ0FBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQztJQUMxQkMsYUFBYSxFQUFHLENBQUMsRUFBRSxFQUFDLEVBQUUsRUFBQyxFQUFFLENBQUM7SUFDMUJDLGFBQWEsRUFBRyxDQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDO0lBQzNCQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLEdBQUcsQ0FBQztJQUN2QkMsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxHQUFHLENBQUM7SUFDdEJDLFdBQVcsRUFBRyxDQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDO0lBQ3pCQyxPQUFPLEVBQUcsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQztJQUN2QkMsT0FBTyxFQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDdkJDLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDO0lBQ3hCQyxTQUFTLEVBQUcsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQztJQUN2QkMsV0FBVyxFQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDM0JDLFdBQVcsRUFBRyxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsRUFBRSxDQUFDO0lBQ3pCQyxPQUFPLEVBQUcsQ0FBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLEdBQUcsQ0FBQztJQUNyQkMsU0FBUyxFQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDekJDLFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDO0lBQ3pCQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNqQkMsU0FBUyxFQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxFQUFFLENBQUM7SUFDeEJDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDO0lBQ25CQyxLQUFLLEVBQUcsQ0FBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNqQkMsV0FBVyxFQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxFQUFFLENBQUM7SUFDMUJDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDO0lBQ25CQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQztJQUN2QkMsT0FBTyxFQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDdkJDLFNBQVMsRUFBRyxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsRUFBRSxDQUFDO0lBQ3ZCQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUMsQ0FBQyxFQUFDLEdBQUcsQ0FBQztJQUNsQkMsS0FBSyxFQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDckJDLEtBQUssRUFBRyxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDO0lBQ3JCQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQztJQUN2QkMsYUFBYSxFQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDN0JDLFNBQVMsRUFBRyxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3ZCQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQztJQUMzQkMsU0FBUyxFQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDekJDLFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDO0lBQ3pCQyxTQUFTLEVBQUcsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsQ0FB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QUFHLENBQUM7SUFDekJDLFNBQVMsRUFBRyxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDO0lBQ3hCQyxXQUFXLEVBQUcsQ0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQztJQUN6QkMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDckJDLFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsRUFBRSxDQUFDO0lBQ3hCQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLEVBQUUsQ0FBQztJQUNyQkMsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDdkJDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsRUFBRSxDQUFDO0lBQ25CQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQztJQUNyQkMsT0FBTyxFQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDdkJDLFNBQVMsRUFBRyxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsR0FBRyxDQUFDO0lBQ3hCQyxTQUFTLEVBQUcsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQztJQUN6QkMsU0FBUyxFQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDekJDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDO0lBQ25CQyxXQUFXLEVBQUcsQ0FBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQztJQUN6QkMsU0FBUyxFQUFHLENBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxHQUFHLENBQUM7SUFDeEJDLEdBQUcsRUFBRyxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDO0lBQ25CQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQztJQUNqQkMs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QUcsQ0FBQztJQUMzQixXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN4QixVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUMzQixXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUM1QixhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQztJQUM1QixnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQy9CLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDO0lBQzVCLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzdCLGNBQWMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQy9CLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDO0lBQzlCLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzdCLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzdCLGVBQWUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzlCLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDO0lBQzNCLFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDO0lBQzFCLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzFCLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzFCLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzFCLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzlCLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQzVCLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzdCLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JCLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQzNCLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3ZCLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQzdCLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3ZCLFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzNCLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzFCLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzFCLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDO0lBQ3RCLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzNCLGVBQWUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ2hDLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLGNBQWMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQy9CLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzdCLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCLHNCQUFzQixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdkMsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDN0IsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDOUIsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDL0IsY0FBYyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDL0IsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUNqQyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ2pDLGdCQUFnQixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDakMsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDOUIsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbkIsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDMUIsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDeEIsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7SUFDeEIsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckIsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUNuQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQztJQUN6QixjQUFjLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQztJQUM5QixjQUFjLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUMvQixnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ2hDLGlCQUFpQixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDbEMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUNsQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ2pDLGlCQUFpQixFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDakMsY0FBYyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDN0IsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDM0IsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDOUIsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7SUFDbkIsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDMUIsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdEIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDM0IsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdkIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekIsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDekIsZUFBZSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDaEMsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsZUFBZSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDaEMsZUFBZSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDaEMsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDN0IsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDdEIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdkIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdkIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDN0IsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7SUFDdkIsZUFBZSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDL0IsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDM0IsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDNUIsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDekIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDNUIsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDekIsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDM0IsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDdkIsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDekIsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDMUIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDM0IsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdkIsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDM0IsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdEIsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDckIsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDMUIsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDdkIsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDM0IsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDekIsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDeEIsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDeEIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDN0IsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdkIsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO0VB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QUFlLENBQUMybUIsT0FBTzs7RUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQTNtQixlQUFlLENBQUNxbkIsZUFBZSxHQUFHbFQsZ0JBQWdCOztFQUVsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQW5VLGVBQWUsQ0FBQzdoQyxPQUFPLENBQUNvQixJQUFJLENBQzNCLENBQ0MsS0FBSyxFQUNMLFFBQVEsRUFDUixVQUFVLEVBQ1YsTUFBTSxFQUNOLFdBQVcsRUFDWCxPQUFPLEVBQ1AsU0FBUyxDQUNULEVBQ0QsVUFBUytuRCxLQUFLLEVBQUU7SUFDZnRuQixlQUFlLENBQUNzbkIsS0FBSyxDQUFDLEdBQUcsVUFBUzdpRCxHQUFHLEVBQUU4aUQsR0FBRyxFQUFFO01BQzNDLE9BQU8sSUFBSXZuQixlQUFlLENBQUN2N0IsR0FBRyxFQUFFdTdCLGVBQWUsQ0FBQzdoQyxPQUFPLENBQUNxQyxLQUFLLENBQUMrbUQsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQ3hFbHFELElBQUksRUFBRWlxRCxLQUFLLENBQUMzcEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDNnBELFdBQVcsQ0FBQyxDQUFDLEdBQUdGLEtBQUssQ0FBQ2x4RCxLQUFLLENBQUMsQ0FBQztNQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7RUFDRixDQUNELENBQUM7RUFFRCxPQUFPNHdELEdBQUc7QUFFVixDQUFFLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kZW1pbmcvLi9wdWJsaWMvdmVuZG9ycy9jaGFydGpzL0NoYXJ0LmpzP2Q1MGYiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDaGFydC5qcyB2Mi44LjBcbiAqIGh0dHBzOi8vd3d3LmNoYXJ0anMub3JnXG4gKiAoYykgMjAxOSBDaGFydC5qcyBDb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xudHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KGZ1bmN0aW9uKCkgeyB0cnkgeyByZXR1cm4gcmVxdWlyZSgnbW9tZW50Jyk7IH0gY2F0Y2goZSkgeyB9IH0oKSkgOlxudHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsncmVxdWlyZSddLCBmdW5jdGlvbihyZXF1aXJlKSB7IHJldHVybiBmYWN0b3J5KGZ1bmN0aW9uKCkgeyB0cnkgeyByZXR1cm4gcmVxdWlyZSgnbW9tZW50Jyk7IH0gY2F0Y2goZSkgeyB9IH0oKSk7IH0pIDpcbihnbG9iYWwuQ2hhcnQgPSBmYWN0b3J5KGdsb2JhbC5tb21lbnQpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5tb21lbnQgPSBtb21lbnQgJiYgbW9tZW50Lmhhc093blByb3BlcnR5KCdkZWZhdWx0JykgPyBtb21lbnRbJ2RlZmF1bHQnXSA6IG1vbWVudDtcblxuLyogTUlUIGxpY2Vuc2UgKi9cblxudmFyIGNvbnZlcnNpb25zID0ge1xuICByZ2IyaHNsOiByZ2IyaHNsLFxuICByZ2IyaHN2OiByZ2IyaHN2LFxuICByZ2IyaHdiOiByZ2IyaHdiLFxuICByZ2IyY215azogcmdiMmNteWssXG4gIHJnYjJrZXl3b3JkOiByZ2Iya2V5d29yZCxcbiAgcmdiMnh5ejogcmdiMnh5eixcbiAgcmdiMmxhYjogcmdiMmxhYixcbiAgcmdiMmxjaDogcmdiMmxjaCxcblxuICBoc2wycmdiOiBoc2wycmdiLFxuICBoc2wyaHN2OiBoc2wyaHN2LFxuICBoc2wyaHdiOiBoc2wyaHdiLFxuICBoc2wyY215azogaHNsMmNteWssXG4gIGhzbDJrZXl3b3JkOiBoc2wya2V5d29yZCxcblxuICBoc3YycmdiOiBoc3YycmdiLFxuICBoc3YyaHNsOiBoc3YyaHNsLFxuICBoc3YyaHdiOiBoc3YyaHdiLFxuICBoc3YyY215azogaHN2MmNteWssXG4gIGhzdjJrZXl3b3JkOiBoc3Yya2V5d29yZCxcblxuICBod2IycmdiOiBod2IycmdiLFxuICBod2IyaHNsOiBod2IyaHNsLFxuICBod2IyaHN2OiBod2IyaHN2LFxuICBod2IyY215azogaHdiMmNteWssXG4gIGh3YjJrZXl3b3JkOiBod2Iya2V5d29yZCxcblxuICBjbXlrMnJnYjogY215azJyZ2IsXG4gIGNteWsyaHNsOiBjbXlrMmhzbCxcbiAgY215azJoc3Y6IGNteWsyaHN2LFxuICBjbXlrMmh3YjogY215azJod2IsXG4gIGNteWsya2V5d29yZDogY215azJrZXl3b3JkLFxuXG4gIGtleXdvcmQycmdiOiBrZXl3b3JkMnJnYixcbiAga2V5d29yZDJoc2w6IGtleXdvcmQyaHNsLFxuICBrZXl3b3JkMmhzdjoga2V5d29yZDJoc3YsXG4gIGtleXdvcmQyaHdiOiBrZXl3b3JkMmh3YixcbiAga2V5d29yZDJjbXlrOiBrZXl3b3JkMmNteWssXG4gIGtleXdvcmQybGFiOiBrZXl3b3JkMmxhYixcbiAga2V5d29yZDJ4eXo6IGtleXdvcmQyeHl6LFxuXG4gIHh5ejJyZ2I6IHh5ejJyZ2IsXG4gIHh5ejJsYWI6IHh5ejJsYWIsXG4gIHh5ejJsY2g6IHh5ejJsY2gsXG5cbiAgbGFiMnh5ejogbGFiMnh5eixcbiAgbGFiMnJnYjogbGFiMnJnYixcbiAgbGFiMmxjaDogbGFiMmxjaCxcblxuICBsY2gybGFiOiBsY2gybGFiLFxuICBsY2gyeHl6OiBsY2gyeHl6LFxuICBsY2gycmdiOiBsY2gycmdiXG59O1xuXG5cbmZ1bmN0aW9uIHJnYjJoc2wocmdiKSB7XG4gIHZhciByID0gcmdiWzBdLzI1NSxcbiAgICAgIGcgPSByZ2JbMV0vMjU1LFxuICAgICAgYiA9IHJnYlsyXS8yNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgZGVsdGEgPSBtYXggLSBtaW4sXG4gICAgICBoLCBzLCBsO1xuXG4gIGlmIChtYXggPT0gbWluKVxuICAgIGggPSAwO1xuICBlbHNlIGlmIChyID09IG1heClcbiAgICBoID0gKGcgLSBiKSAvIGRlbHRhO1xuICBlbHNlIGlmIChnID09IG1heClcbiAgICBoID0gMiArIChiIC0gcikgLyBkZWx0YTtcbiAgZWxzZSBpZiAoYiA9PSBtYXgpXG4gICAgaCA9IDQgKyAociAtIGcpLyBkZWx0YTtcblxuICBoID0gTWF0aC5taW4oaCAqIDYwLCAzNjApO1xuXG4gIGlmIChoIDwgMClcbiAgICBoICs9IDM2MDtcblxuICBsID0gKG1pbiArIG1heCkgLyAyO1xuXG4gIGlmIChtYXggPT0gbWluKVxuICAgIHMgPSAwO1xuICBlbHNlIGlmIChsIDw9IDAuNSlcbiAgICBzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcbiAgZWxzZVxuICAgIHMgPSBkZWx0YSAvICgyIC0gbWF4IC0gbWluKTtcblxuICByZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufVxuXG5mdW5jdGlvbiByZ2IyaHN2KHJnYikge1xuICB2YXIgciA9IHJnYlswXSxcbiAgICAgIGcgPSByZ2JbMV0sXG4gICAgICBiID0gcmdiWzJdLFxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksXG4gICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIGRlbHRhID0gbWF4IC0gbWluLFxuICAgICAgaCwgcywgdjtcblxuICBpZiAobWF4ID09IDApXG4gICAgcyA9IDA7XG4gIGVsc2VcbiAgICBzID0gKGRlbHRhL21heCAqIDEwMDApLzEwO1xuXG4gIGlmIChtYXggPT0gbWluKVxuICAgIGggPSAwO1xuICBlbHNlIGlmIChyID09IG1heClcbiAgICBoID0gKGcgLSBiKSAvIGRlbHRhO1xuICBlbHNlIGlmIChnID09IG1heClcbiAgICBoID0gMiArIChiIC0gcikgLyBkZWx0YTtcbiAgZWxzZSBpZiAoYiA9PSBtYXgpXG4gICAgaCA9IDQgKyAociAtIGcpIC8gZGVsdGE7XG5cbiAgaCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuICBpZiAoaCA8IDApXG4gICAgaCArPSAzNjA7XG5cbiAgdiA9ICgobWF4IC8gMjU1KSAqIDEwMDApIC8gMTA7XG5cbiAgcmV0dXJuIFtoLCBzLCB2XTtcbn1cblxuZnVuY3Rpb24gcmdiMmh3YihyZ2IpIHtcbiAgdmFyIHIgPSByZ2JbMF0sXG4gICAgICBnID0gcmdiWzFdLFxuICAgICAgYiA9IHJnYlsyXSxcbiAgICAgIGggPSByZ2IyaHNsKHJnYilbMF0sXG4gICAgICB3ID0gMS8yNTUgKiBNYXRoLm1pbihyLCBNYXRoLm1pbihnLCBiKSksXG4gICAgICBiID0gMSAtIDEvMjU1ICogTWF0aC5tYXgociwgTWF0aC5tYXgoZywgYikpO1xuXG4gIHJldHVybiBbaCwgdyAqIDEwMCwgYiAqIDEwMF07XG59XG5cbmZ1bmN0aW9uIHJnYjJjbXlrKHJnYikge1xuICB2YXIgciA9IHJnYlswXSAvIDI1NSxcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXG4gICAgICBiID0gcmdiWzJdIC8gMjU1LFxuICAgICAgYywgbSwgeSwgaztcblxuICBrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG4gIGMgPSAoMSAtIHIgLSBrKSAvICgxIC0gaykgfHwgMDtcbiAgbSA9ICgxIC0gZyAtIGspIC8gKDEgLSBrKSB8fCAwO1xuICB5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG4gIHJldHVybiBbYyAqIDEwMCwgbSAqIDEwMCwgeSAqIDEwMCwgayAqIDEwMF07XG59XG5cbmZ1bmN0aW9uIHJnYjJrZXl3b3JkKHJnYikge1xuICByZXR1cm4gcmV2ZXJzZUtleXdvcmRzW0pTT04uc3RyaW5naWZ5KHJnYildO1xufVxuXG5mdW5jdGlvbiByZ2IyeHl6KHJnYikge1xuICB2YXIgciA9IHJnYlswXSAvIDI1NSxcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXG4gICAgICBiID0gcmdiWzJdIC8gMjU1O1xuXG4gIC8vIGFzc3VtZSBzUkdCXG4gIHIgPSByID4gMC4wNDA0NSA/IE1hdGgucG93KCgociArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChyIC8gMTIuOTIpO1xuICBnID0gZyA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKGcgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAoZyAvIDEyLjkyKTtcbiAgYiA9IGIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChiICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKGIgLyAxMi45Mik7XG5cbiAgdmFyIHggPSAociAqIDAuNDEyNCkgKyAoZyAqIDAuMzU3NikgKyAoYiAqIDAuMTgwNSk7XG4gIHZhciB5ID0gKHIgKiAwLjIxMjYpICsgKGcgKiAwLjcxNTIpICsgKGIgKiAwLjA3MjIpO1xuICB2YXIgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcblxuICByZXR1cm4gW3ggKiAxMDAsIHkgKjEwMCwgeiAqIDEwMF07XG59XG5cbmZ1bmN0aW9uIHJnYjJsYWIocmdiKSB7XG4gIHZhciB4eXogPSByZ2IyeHl6KHJnYiksXG4gICAgICAgIHggPSB4eXpbMF0sXG4gICAgICAgIHkgPSB4eXpbMV0sXG4gICAgICAgIHogPSB4eXpbMl0sXG4gICAgICAgIGwsIGEsIGI7XG5cbiAgeCAvPSA5NS4wNDc7XG4gIHkgLz0gMTAwO1xuICB6IC89IDEwOC44ODM7XG5cbiAgeCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEvMykgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG4gIHkgPSB5ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh5LCAxLzMpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuICB6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMS8zKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuICBsID0gKDExNiAqIHkpIC0gMTY7XG4gIGEgPSA1MDAgKiAoeCAtIHkpO1xuICBiID0gMjAwICogKHkgLSB6KTtcblxuICByZXR1cm4gW2wsIGEsIGJdO1xufVxuXG5mdW5jdGlvbiByZ2IybGNoKGFyZ3MpIHtcbiAgcmV0dXJuIGxhYjJsY2gocmdiMmxhYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGhzbDJyZ2IoaHNsKSB7XG4gIHZhciBoID0gaHNsWzBdIC8gMzYwLFxuICAgICAgcyA9IGhzbFsxXSAvIDEwMCxcbiAgICAgIGwgPSBoc2xbMl0gLyAxMDAsXG4gICAgICB0MSwgdDIsIHQzLCByZ2IsIHZhbDtcblxuICBpZiAocyA9PSAwKSB7XG4gICAgdmFsID0gbCAqIDI1NTtcbiAgICByZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuICB9XG5cbiAgaWYgKGwgPCAwLjUpXG4gICAgdDIgPSBsICogKDEgKyBzKTtcbiAgZWxzZVxuICAgIHQyID0gbCArIHMgLSBsICogcztcbiAgdDEgPSAyICogbCAtIHQyO1xuXG4gIHJnYiA9IFswLCAwLCAwXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICB0MyA9IGggKyAxIC8gMyAqIC0gKGkgLSAxKTtcbiAgICB0MyA8IDAgJiYgdDMrKztcbiAgICB0MyA+IDEgJiYgdDMtLTtcblxuICAgIGlmICg2ICogdDMgPCAxKVxuICAgICAgdmFsID0gdDEgKyAodDIgLSB0MSkgKiA2ICogdDM7XG4gICAgZWxzZSBpZiAoMiAqIHQzIDwgMSlcbiAgICAgIHZhbCA9IHQyO1xuICAgIGVsc2UgaWYgKDMgKiB0MyA8IDIpXG4gICAgICB2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG4gICAgZWxzZVxuICAgICAgdmFsID0gdDE7XG5cbiAgICByZ2JbaV0gPSB2YWwgKiAyNTU7XG4gIH1cblxuICByZXR1cm4gcmdiO1xufVxuXG5mdW5jdGlvbiBoc2wyaHN2KGhzbCkge1xuICB2YXIgaCA9IGhzbFswXSxcbiAgICAgIHMgPSBoc2xbMV0gLyAxMDAsXG4gICAgICBsID0gaHNsWzJdIC8gMTAwLFxuICAgICAgc3YsIHY7XG5cbiAgaWYobCA9PT0gMCkge1xuICAgICAgLy8gbm8gbmVlZCB0byBkbyBjYWxjIG9uIGJsYWNrXG4gICAgICAvLyBhbHNvIGF2b2lkcyBkaXZpZGUgYnkgMCBlcnJvclxuICAgICAgcmV0dXJuIFswLCAwLCAwXTtcbiAgfVxuXG4gIGwgKj0gMjtcbiAgcyAqPSAobCA8PSAxKSA/IGwgOiAyIC0gbDtcbiAgdiA9IChsICsgcykgLyAyO1xuICBzdiA9ICgyICogcykgLyAobCArIHMpO1xuICByZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcbn1cblxuZnVuY3Rpb24gaHNsMmh3YihhcmdzKSB7XG4gIHJldHVybiByZ2IyaHdiKGhzbDJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBoc2wyY215ayhhcmdzKSB7XG4gIHJldHVybiByZ2IyY215ayhoc2wycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gaHNsMmtleXdvcmQoYXJncykge1xuICByZXR1cm4gcmdiMmtleXdvcmQoaHNsMnJnYihhcmdzKSk7XG59XG5cblxuZnVuY3Rpb24gaHN2MnJnYihoc3YpIHtcbiAgdmFyIGggPSBoc3ZbMF0gLyA2MCxcbiAgICAgIHMgPSBoc3ZbMV0gLyAxMDAsXG4gICAgICB2ID0gaHN2WzJdIC8gMTAwLFxuICAgICAgaGkgPSBNYXRoLmZsb29yKGgpICUgNjtcblxuICB2YXIgZiA9IGggLSBNYXRoLmZsb29yKGgpLFxuICAgICAgcCA9IDI1NSAqIHYgKiAoMSAtIHMpLFxuICAgICAgcSA9IDI1NSAqIHYgKiAoMSAtIChzICogZikpLFxuICAgICAgdCA9IDI1NSAqIHYgKiAoMSAtIChzICogKDEgLSBmKSkpLFxuICAgICAgdiA9IDI1NSAqIHY7XG5cbiAgc3dpdGNoKGhpKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIFt2LCB0LCBwXTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gW3EsIHYsIHBdO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBbcCwgdiwgdF07XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIFtwLCBxLCB2XTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gW3QsIHAsIHZdO1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiBbdiwgcCwgcV07XG4gIH1cbn1cblxuZnVuY3Rpb24gaHN2MmhzbChoc3YpIHtcbiAgdmFyIGggPSBoc3ZbMF0sXG4gICAgICBzID0gaHN2WzFdIC8gMTAwLFxuICAgICAgdiA9IGhzdlsyXSAvIDEwMCxcbiAgICAgIHNsLCBsO1xuXG4gIGwgPSAoMiAtIHMpICogdjtcbiAgc2wgPSBzICogdjtcbiAgc2wgLz0gKGwgPD0gMSkgPyBsIDogMiAtIGw7XG4gIHNsID0gc2wgfHwgMDtcbiAgbCAvPSAyO1xuICByZXR1cm4gW2gsIHNsICogMTAwLCBsICogMTAwXTtcbn1cblxuZnVuY3Rpb24gaHN2Mmh3YihhcmdzKSB7XG4gIHJldHVybiByZ2IyaHdiKGhzdjJyZ2IoYXJncykpXG59XG5cbmZ1bmN0aW9uIGhzdjJjbXlrKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJjbXlrKGhzdjJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBoc3Yya2V5d29yZChhcmdzKSB7XG4gIHJldHVybiByZ2Iya2V5d29yZChoc3YycmdiKGFyZ3MpKTtcbn1cblxuLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLWNvbG9yLyNod2ItdG8tcmdiXG5mdW5jdGlvbiBod2IycmdiKGh3Yikge1xuICB2YXIgaCA9IGh3YlswXSAvIDM2MCxcbiAgICAgIHdoID0gaHdiWzFdIC8gMTAwLFxuICAgICAgYmwgPSBod2JbMl0gLyAxMDAsXG4gICAgICByYXRpbyA9IHdoICsgYmwsXG4gICAgICBpLCB2LCBmLCBuO1xuXG4gIC8vIHdoICsgYmwgY2FudCBiZSA+IDFcbiAgaWYgKHJhdGlvID4gMSkge1xuICAgIHdoIC89IHJhdGlvO1xuICAgIGJsIC89IHJhdGlvO1xuICB9XG5cbiAgaSA9IE1hdGguZmxvb3IoNiAqIGgpO1xuICB2ID0gMSAtIGJsO1xuICBmID0gNiAqIGggLSBpO1xuICBpZiAoKGkgJiAweDAxKSAhPSAwKSB7XG4gICAgZiA9IDEgLSBmO1xuICB9XG4gIG4gPSB3aCArIGYgKiAodiAtIHdoKTsgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uXG5cbiAgc3dpdGNoIChpKSB7XG4gICAgZGVmYXVsdDpcbiAgICBjYXNlIDY6XG4gICAgY2FzZSAwOiByID0gdjsgZyA9IG47IGIgPSB3aDsgYnJlYWs7XG4gICAgY2FzZSAxOiByID0gbjsgZyA9IHY7IGIgPSB3aDsgYnJlYWs7XG4gICAgY2FzZSAyOiByID0gd2g7IGcgPSB2OyBiID0gbjsgYnJlYWs7XG4gICAgY2FzZSAzOiByID0gd2g7IGcgPSBuOyBiID0gdjsgYnJlYWs7XG4gICAgY2FzZSA0OiByID0gbjsgZyA9IHdoOyBiID0gdjsgYnJlYWs7XG4gICAgY2FzZSA1OiByID0gdjsgZyA9IHdoOyBiID0gbjsgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufVxuXG5mdW5jdGlvbiBod2IyaHNsKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJoc2woaHdiMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGh3YjJoc3YoYXJncykge1xuICByZXR1cm4gcmdiMmhzdihod2IycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gaHdiMmNteWsoYXJncykge1xuICByZXR1cm4gcmdiMmNteWsoaHdiMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGh3YjJrZXl3b3JkKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJrZXl3b3JkKGh3YjJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBjbXlrMnJnYihjbXlrKSB7XG4gIHZhciBjID0gY215a1swXSAvIDEwMCxcbiAgICAgIG0gPSBjbXlrWzFdIC8gMTAwLFxuICAgICAgeSA9IGNteWtbMl0gLyAxMDAsXG4gICAgICBrID0gY215a1szXSAvIDEwMCxcbiAgICAgIHIsIGcsIGI7XG5cbiAgciA9IDEgLSBNYXRoLm1pbigxLCBjICogKDEgLSBrKSArIGspO1xuICBnID0gMSAtIE1hdGgubWluKDEsIG0gKiAoMSAtIGspICsgayk7XG4gIGIgPSAxIC0gTWF0aC5taW4oMSwgeSAqICgxIC0gaykgKyBrKTtcbiAgcmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn1cblxuZnVuY3Rpb24gY215azJoc2woYXJncykge1xuICByZXR1cm4gcmdiMmhzbChjbXlrMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGNteWsyaHN2KGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJoc3YoY215azJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBjbXlrMmh3YihhcmdzKSB7XG4gIHJldHVybiByZ2IyaHdiKGNteWsycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gY215azJrZXl3b3JkKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJrZXl3b3JkKGNteWsycmdiKGFyZ3MpKTtcbn1cblxuXG5mdW5jdGlvbiB4eXoycmdiKHh5eikge1xuICB2YXIgeCA9IHh5elswXSAvIDEwMCxcbiAgICAgIHkgPSB4eXpbMV0gLyAxMDAsXG4gICAgICB6ID0geHl6WzJdIC8gMTAwLFxuICAgICAgciwgZywgYjtcblxuICByID0gKHggKiAzLjI0MDYpICsgKHkgKiAtMS41MzcyKSArICh6ICogLTAuNDk4Nik7XG4gIGcgPSAoeCAqIC0wLjk2ODkpICsgKHkgKiAxLjg3NTgpICsgKHogKiAwLjA0MTUpO1xuICBiID0gKHggKiAwLjA1NTcpICsgKHkgKiAtMC4yMDQwKSArICh6ICogMS4wNTcwKTtcblxuICAvLyBhc3N1bWUgc1JHQlxuICByID0gciA+IDAuMDAzMTMwOCA/ICgoMS4wNTUgKiBNYXRoLnBvdyhyLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuICAgIDogciA9IChyICogMTIuOTIpO1xuXG4gIGcgPSBnID4gMC4wMDMxMzA4ID8gKCgxLjA1NSAqIE1hdGgucG93KGcsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG4gICAgOiBnID0gKGcgKiAxMi45Mik7XG5cbiAgYiA9IGIgPiAwLjAwMzEzMDggPyAoKDEuMDU1ICogTWF0aC5wb3coYiwgMS4wIC8gMi40KSkgLSAwLjA1NSlcbiAgICA6IGIgPSAoYiAqIDEyLjkyKTtcblxuICByID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgciksIDEpO1xuICBnID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgZyksIDEpO1xuICBiID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgYiksIDEpO1xuXG4gIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59XG5cbmZ1bmN0aW9uIHh5ejJsYWIoeHl6KSB7XG4gIHZhciB4ID0geHl6WzBdLFxuICAgICAgeSA9IHh5elsxXSxcbiAgICAgIHogPSB4eXpbMl0sXG4gICAgICBsLCBhLCBiO1xuXG4gIHggLz0gOTUuMDQ3O1xuICB5IC89IDEwMDtcbiAgeiAvPSAxMDguODgzO1xuXG4gIHggPSB4ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxLzMpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuICB5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMS8zKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcbiAgeiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEvMykgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cbiAgbCA9ICgxMTYgKiB5KSAtIDE2O1xuICBhID0gNTAwICogKHggLSB5KTtcbiAgYiA9IDIwMCAqICh5IC0geik7XG5cbiAgcmV0dXJuIFtsLCBhLCBiXTtcbn1cblxuZnVuY3Rpb24geHl6MmxjaChhcmdzKSB7XG4gIHJldHVybiBsYWIybGNoKHh5ejJsYWIoYXJncykpO1xufVxuXG5mdW5jdGlvbiBsYWIyeHl6KGxhYikge1xuICB2YXIgbCA9IGxhYlswXSxcbiAgICAgIGEgPSBsYWJbMV0sXG4gICAgICBiID0gbGFiWzJdLFxuICAgICAgeCwgeSwgeiwgeTI7XG5cbiAgaWYgKGwgPD0gOCkge1xuICAgIHkgPSAobCAqIDEwMCkgLyA5MDMuMztcbiAgICB5MiA9ICg3Ljc4NyAqICh5IC8gMTAwKSkgKyAoMTYgLyAxMTYpO1xuICB9IGVsc2Uge1xuICAgIHkgPSAxMDAgKiBNYXRoLnBvdygobCArIDE2KSAvIDExNiwgMyk7XG4gICAgeTIgPSBNYXRoLnBvdyh5IC8gMTAwLCAxLzMpO1xuICB9XG5cbiAgeCA9IHggLyA5NS4wNDcgPD0gMC4wMDg4NTYgPyB4ID0gKDk1LjA0NyAqICgoYSAvIDUwMCkgKyB5MiAtICgxNiAvIDExNikpKSAvIDcuNzg3IDogOTUuMDQ3ICogTWF0aC5wb3coKGEgLyA1MDApICsgeTIsIDMpO1xuXG4gIHogPSB6IC8gMTA4Ljg4MyA8PSAwLjAwODg1OSA/IHogPSAoMTA4Ljg4MyAqICh5MiAtIChiIC8gMjAwKSAtICgxNiAvIDExNikpKSAvIDcuNzg3IDogMTA4Ljg4MyAqIE1hdGgucG93KHkyIC0gKGIgLyAyMDApLCAzKTtcblxuICByZXR1cm4gW3gsIHksIHpdO1xufVxuXG5mdW5jdGlvbiBsYWIybGNoKGxhYikge1xuICB2YXIgbCA9IGxhYlswXSxcbiAgICAgIGEgPSBsYWJbMV0sXG4gICAgICBiID0gbGFiWzJdLFxuICAgICAgaHIsIGgsIGM7XG5cbiAgaHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuICBoID0gaHIgKiAzNjAgLyAyIC8gTWF0aC5QSTtcbiAgaWYgKGggPCAwKSB7XG4gICAgaCArPSAzNjA7XG4gIH1cbiAgYyA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcbiAgcmV0dXJuIFtsLCBjLCBoXTtcbn1cblxuZnVuY3Rpb24gbGFiMnJnYihhcmdzKSB7XG4gIHJldHVybiB4eXoycmdiKGxhYjJ4eXooYXJncykpO1xufVxuXG5mdW5jdGlvbiBsY2gybGFiKGxjaCkge1xuICB2YXIgbCA9IGxjaFswXSxcbiAgICAgIGMgPSBsY2hbMV0sXG4gICAgICBoID0gbGNoWzJdLFxuICAgICAgYSwgYiwgaHI7XG5cbiAgaHIgPSBoIC8gMzYwICogMiAqIE1hdGguUEk7XG4gIGEgPSBjICogTWF0aC5jb3MoaHIpO1xuICBiID0gYyAqIE1hdGguc2luKGhyKTtcbiAgcmV0dXJuIFtsLCBhLCBiXTtcbn1cblxuZnVuY3Rpb24gbGNoMnh5eihhcmdzKSB7XG4gIHJldHVybiBsYWIyeHl6KGxjaDJsYWIoYXJncykpO1xufVxuXG5mdW5jdGlvbiBsY2gycmdiKGFyZ3MpIHtcbiAgcmV0dXJuIGxhYjJyZ2IobGNoMmxhYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGtleXdvcmQycmdiKGtleXdvcmQpIHtcbiAgcmV0dXJuIGNzc0tleXdvcmRzW2tleXdvcmRdO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkMmhzbChhcmdzKSB7XG4gIHJldHVybiByZ2IyaHNsKGtleXdvcmQycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24ga2V5d29yZDJoc3YoYXJncykge1xuICByZXR1cm4gcmdiMmhzdihrZXl3b3JkMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGtleXdvcmQyaHdiKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJod2Ioa2V5d29yZDJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkMmNteWsoYXJncykge1xuICByZXR1cm4gcmdiMmNteWsoa2V5d29yZDJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkMmxhYihhcmdzKSB7XG4gIHJldHVybiByZ2IybGFiKGtleXdvcmQycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24ga2V5d29yZDJ4eXooYXJncykge1xuICByZXR1cm4gcmdiMnh5eihrZXl3b3JkMnJnYihhcmdzKSk7XG59XG5cbnZhciBjc3NLZXl3b3JkcyA9IHtcbiAgYWxpY2VibHVlOiAgWzI0MCwyNDgsMjU1XSxcbiAgYW50aXF1ZXdoaXRlOiBbMjUwLDIzNSwyMTVdLFxuICBhcXVhOiBbMCwyNTUsMjU1XSxcbiAgYXF1YW1hcmluZTogWzEyNywyNTUsMjEyXSxcbiAgYXp1cmU6ICBbMjQwLDI1NSwyNTVdLFxuICBiZWlnZTogIFsyNDUsMjQ1LDIyMF0sXG4gIGJpc3F1ZTogWzI1NSwyMjgsMTk2XSxcbiAgYmxhY2s6ICBbMCwwLDBdLFxuICBibGFuY2hlZGFsbW9uZDogWzI1NSwyMzUsMjA1XSxcbiAgYmx1ZTogWzAsMCwyNTVdLFxuICBibHVldmlvbGV0OiBbMTM4LDQzLDIyNl0sXG4gIGJyb3duOiAgWzE2NSw0Miw0Ml0sXG4gIGJ1cmx5d29vZDogIFsyMjIsMTg0LDEzNV0sXG4gIGNhZGV0Ymx1ZTogIFs5NSwxNTgsMTYwXSxcbiAgY2hhcnRyZXVzZTogWzEyNywyNTUsMF0sXG4gIGNob2NvbGF0ZTogIFsyMTAsMTA1LDMwXSxcbiAgY29yYWw6ICBbMjU1LDEyNyw4MF0sXG4gIGNvcm5mbG93ZXJibHVlOiBbMTAwLDE0OSwyMzddLFxuICBjb3Juc2lsazogWzI1NSwyNDgsMjIwXSxcbiAgY3JpbXNvbjogIFsyMjAsMjAsNjBdLFxuICBjeWFuOiBbMCwyNTUsMjU1XSxcbiAgZGFya2JsdWU6IFswLDAsMTM5XSxcbiAgZGFya2N5YW46IFswLDEzOSwxMzldLFxuICBkYXJrZ29sZGVucm9kOiAgWzE4NCwxMzQsMTFdLFxuICBkYXJrZ3JheTogWzE2OSwxNjksMTY5XSxcbiAgZGFya2dyZWVuOiAgWzAsMTAwLDBdLFxuICBkYXJrZ3JleTogWzE2OSwxNjksMTY5XSxcbiAgZGFya2toYWtpOiAgWzE4OSwxODMsMTA3XSxcbiAgZGFya21hZ2VudGE6ICBbMTM5LDAsMTM5XSxcbiAgZGFya29saXZlZ3JlZW46IFs4NSwxMDcsNDddLFxuICBkYXJrb3JhbmdlOiBbMjU1LDE0MCwwXSxcbiAgZGFya29yY2hpZDogWzE1Myw1MCwyMDRdLFxuICBkYXJrcmVkOiAgWzEzOSwwLDBdLFxuICBkYXJrc2FsbW9uOiBbMjMzLDE1MCwxMjJdLFxuICBkYXJrc2VhZ3JlZW46IFsxNDMsMTg4LDE0M10sXG4gIGRhcmtzbGF0ZWJsdWU6ICBbNzIsNjEsMTM5XSxcbiAgZGFya3NsYXRlZ3JheTogIFs0Nyw3OSw3OV0sXG4gIGRhcmtzbGF0ZWdyZXk6ICBbNDcsNzksNzldLFxuICBkYXJrdHVycXVvaXNlOiAgWzAsMjA2LDIwOV0sXG4gIGRhcmt2aW9sZXQ6IFsxNDgsMCwyMTFdLFxuICBkZWVwcGluazogWzI1NSwyMCwxNDddLFxuICBkZWVwc2t5Ymx1ZTogIFswLDE5MSwyNTVdLFxuICBkaW1ncmF5OiAgWzEwNSwxMDUsMTA1XSxcbiAgZGltZ3JleTogIFsxMDUsMTA1LDEwNV0sXG4gIGRvZGdlcmJsdWU6IFszMCwxNDQsMjU1XSxcbiAgZmlyZWJyaWNrOiAgWzE3OCwzNCwzNF0sXG4gIGZsb3JhbHdoaXRlOiAgWzI1NSwyNTAsMjQwXSxcbiAgZm9yZXN0Z3JlZW46ICBbMzQsMTM5LDM0XSxcbiAgZnVjaHNpYTogIFsyNTUsMCwyNTVdLFxuICBnYWluc2Jvcm86ICBbMjIwLDIyMCwyMjBdLFxuICBnaG9zdHdoaXRlOiBbMjQ4LDI0OCwyNTVdLFxuICBnb2xkOiBbMjU1LDIxNSwwXSxcbiAgZ29sZGVucm9kOiAgWzIxOCwxNjUsMzJdLFxuICBncmF5OiBbMTI4LDEyOCwxMjhdLFxuICBncmVlbjogIFswLDEyOCwwXSxcbiAgZ3JlZW55ZWxsb3c6ICBbMTczLDI1NSw0N10sXG4gIGdyZXk6IFsxMjgsMTI4LDEyOF0sXG4gIGhvbmV5ZGV3OiBbMjQwLDI1NSwyNDBdLFxuICBob3RwaW5rOiAgWzI1NSwxMDUsMTgwXSxcbiAgaW5kaWFucmVkOiAgWzIwNSw5Miw5Ml0sXG4gIGluZGlnbzogWzc1LDAsMTMwXSxcbiAgaXZvcnk6ICBbMjU1LDI1NSwyNDBdLFxuICBraGFraTogIFsyNDAsMjMwLDE0MF0sXG4gIGxhdmVuZGVyOiBbMjMwLDIzMCwyNTBdLFxuICBsYXZlbmRlcmJsdXNoOiAgWzI1NSwyNDAsMjQ1XSxcbiAgbGF3bmdyZWVuOiAgWzEyNCwyNTIsMF0sXG4gIGxlbW9uY2hpZmZvbjogWzI1NSwyNTAsMjA1XSxcbiAgbGlnaHRibHVlOiAgWzE3MywyMTYsMjMwXSxcbiAgbGlnaHRjb3JhbDogWzI0MCwxMjgsMTI4XSxcbiAgbGlnaHRjeWFuOiAgWzIyNCwyNTUsMjU1XSxcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IFsyNTAsMjUwLDIxMF0sXG4gIGxpZ2h0Z3JheTogIFsyMTEsMjExLDIxMV0sXG4gIGxpZ2h0Z3JlZW46IFsxNDQsMjM4LDE0NF0sXG4gIGxpZ2h0Z3JleTogIFsyMTEsMjExLDIxMV0sXG4gIGxpZ2h0cGluazogIFsyNTUsMTgyLDE5M10sXG4gIGxpZ2h0c2FsbW9uOiAgWzI1NSwxNjAsMTIyXSxcbiAgbGlnaHRzZWFncmVlbjogIFszMiwxNzgsMTcwXSxcbiAgbGlnaHRza3libHVlOiBbMTM1LDIwNiwyNTBdLFxuICBsaWdodHNsYXRlZ3JheTogWzExOSwxMzYsMTUzXSxcbiAgbGlnaHRzbGF0ZWdyZXk6IFsxMTksMTM2LDE1M10sXG4gIGxpZ2h0c3RlZWxibHVlOiBbMTc2LDE5NiwyMjJdLFxuICBsaWdodHllbGxvdzogIFsyNTUsMjU1LDIyNF0sXG4gIGxpbWU6IFswLDI1NSwwXSxcbiAgbGltZWdyZWVuOiAgWzUwLDIwNSw1MF0sXG4gIGxpbmVuOiAgWzI1MCwyNDAsMjMwXSxcbiAgbWFnZW50YTogIFsyNTUsMCwyNTVdLFxuICBtYXJvb246IFsxMjgsMCwwXSxcbiAgbWVkaXVtYXF1YW1hcmluZTogWzEwMiwyMDUsMTcwXSxcbiAgbWVkaXVtYmx1ZTogWzAsMCwyMDVdLFxuICBtZWRpdW1vcmNoaWQ6IFsxODYsODUsMjExXSxcbiAgbWVkaXVtcHVycGxlOiBbMTQ3LDExMiwyMTldLFxuICBtZWRpdW1zZWFncmVlbjogWzYwLDE3OSwxMTNdLFxuICBtZWRpdW1zbGF0ZWJsdWU6ICBbMTIzLDEwNCwyMzhdLFxuICBtZWRpdW1zcHJpbmdncmVlbjogIFswLDI1MCwxNTRdLFxuICBtZWRpdW10dXJxdW9pc2U6ICBbNzIsMjA5LDIwNF0sXG4gIG1lZGl1bXZpb2xldHJlZDogIFsxOTksMjEsMTMzXSxcbiAgbWlkbmlnaHRibHVlOiBbMjUsMjUsMTEyXSxcbiAgbWludGNyZWFtOiAgWzI0NSwyNTUsMjUwXSxcbiAgbWlzdHlyb3NlOiAgWzI1NSwyMjgsMjI1XSxcbiAgbW9jY2FzaW46IFsyNTUsMjI4LDE4MV0sXG4gIG5hdmFqb3doaXRlOiAgWzI1NSwyMjIsMTczXSxcbiAgbmF2eTogWzAsMCwxMjhdLFxuICBvbGRsYWNlOiAgWzI1MywyNDUsMjMwXSxcbiAgb2xpdmU6ICBbMTI4LDEyOCwwXSxcbiAgb2xpdmVkcmFiOiAgWzEwNywxNDIsMzVdLFxuICBvcmFuZ2U6IFsyNTUsMTY1LDBdLFxuICBvcmFuZ2VyZWQ6ICBbMjU1LDY5LDBdLFxuICBvcmNoaWQ6IFsyMTgsMTEyLDIxNF0sXG4gIHBhbGVnb2xkZW5yb2Q6ICBbMjM4LDIzMiwxNzBdLFxuICBwYWxlZ3JlZW46ICBbMTUyLDI1MSwxNTJdLFxuICBwYWxldHVycXVvaXNlOiAgWzE3NSwyMzgsMjM4XSxcbiAgcGFsZXZpb2xldHJlZDogIFsyMTksMTEyLDE0N10sXG4gIHBhcGF5YXdoaXA6IFsyNTUsMjM5LDIxM10sXG4gIHBlYWNocHVmZjogIFsyNTUsMjE4LDE4NV0sXG4gIHBlcnU6IFsyMDUsMTMzLDYzXSxcbiAgcGluazogWzI1NSwxOTIsMjAzXSxcbiAgcGx1bTogWzIyMSwxNjAsMjIxXSxcbiAgcG93ZGVyYmx1ZTogWzE3NiwyMjQsMjMwXSxcbiAgcHVycGxlOiBbMTI4LDAsMTI4XSxcbiAgcmViZWNjYXB1cnBsZTogWzEwMiwgNTEsIDE1M10sXG4gIHJlZDogIFsyNTUsMCwwXSxcbiAgcm9zeWJyb3duOiAgWzE4OCwxNDMsMTQzXSxcbiAgcm95YWxibHVlOiAgWzY1LDEwNSwyMjVdLFxuICBzYWRkbGVicm93bjogIFsxMzksNjksMTldLFxuICBzYWxtb246IFsyNTAsMTI4LDExNF0sXG4gIHNhbmR5YnJvd246IFsyNDQsMTY0LDk2XSxcbiAgc2VhZ3JlZW46IFs0NiwxMzksODddLFxuICBzZWFzaGVsbDogWzI1NSwyNDUsMjM4XSxcbiAgc2llbm5hOiBbMTYwLDgyLDQ1XSxcbiAgc2lsdmVyOiBbMTkyLDE5MiwxOTJdLFxuICBza3libHVlOiAgWzEzNSwyMDYsMjM1XSxcbiAgc2xhdGVibHVlOiAgWzEwNiw5MCwyMDVdLFxuICBzbGF0ZWdyYXk6ICBbMTEyLDEyOCwxNDRdLFxuICBzbGF0ZWdyZXk6ICBbMTEyLDEyOCwxNDRdLFxuICBzbm93OiBbMjU1LDI1MCwyNTBdLFxuICBzcHJpbmdncmVlbjogIFswLDI1NSwxMjddLFxuICBzdGVlbGJsdWU6ICBbNzAsMTMwLDE4MF0sXG4gIHRhbjogIFsyMTAsMTgwLDE0MF0sXG4gIHRlYWw6IFswLDEyOCwxMjhdLFxuICB0aGlzdGxlOiAgWzIxNiwxOTEsMjE2XSxcbiAgdG9tYXRvOiBbMjU1LDk5LDcxXSxcbiAgdHVycXVvaXNlOiAgWzY0LDIyNCwyMDhdLFxuICB2aW9sZXQ6IFsyMzgsMTMwLDIzOF0sXG4gIHdoZWF0OiAgWzI0NSwyMjIsMTc5XSxcbiAgd2hpdGU6ICBbMjU1LDI1NSwyNTVdLFxuICB3aGl0ZXNtb2tlOiBbMjQ1LDI0NSwyNDVdLFxuICB5ZWxsb3c6IFsyNTUsMjU1LDBdLFxuICB5ZWxsb3dncmVlbjogIFsxNTQsMjA1LDUwXVxufTtcblxudmFyIHJldmVyc2VLZXl3b3JkcyA9IHt9O1xuZm9yICh2YXIga2V5IGluIGNzc0tleXdvcmRzKSB7XG4gIHJldmVyc2VLZXl3b3Jkc1tKU09OLnN0cmluZ2lmeShjc3NLZXl3b3Jkc1trZXldKV0gPSBrZXk7XG59XG5cbnZhciBjb252ZXJ0ID0gZnVuY3Rpb24oKSB7XG4gICByZXR1cm4gbmV3IENvbnZlcnRlcigpO1xufTtcblxuZm9yICh2YXIgZnVuYyBpbiBjb252ZXJzaW9ucykge1xuICAvLyBleHBvcnQgUmF3IHZlcnNpb25zXG4gIGNvbnZlcnRbZnVuYyArIFwiUmF3XCJdID0gIChmdW5jdGlvbihmdW5jKSB7XG4gICAgLy8gYWNjZXB0IGFycmF5IG9yIHBsYWluIGFyZ3NcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZyA9PSBcIm51bWJlclwiKVxuICAgICAgICBhcmcgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIGNvbnZlcnNpb25zW2Z1bmNdKGFyZyk7XG4gICAgfVxuICB9KShmdW5jKTtcblxuICB2YXIgcGFpciA9IC8oXFx3KykyKFxcdyspLy5leGVjKGZ1bmMpLFxuICAgICAgZnJvbSA9IHBhaXJbMV0sXG4gICAgICB0byA9IHBhaXJbMl07XG5cbiAgLy8gZXhwb3J0IHJnYjJoc2wgYW5kIFtcInJnYlwiXVtcImhzbFwiXVxuICBjb252ZXJ0W2Zyb21dID0gY29udmVydFtmcm9tXSB8fCB7fTtcblxuICBjb252ZXJ0W2Zyb21dW3RvXSA9IGNvbnZlcnRbZnVuY10gPSAoZnVuY3Rpb24oZnVuYykgeyBcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZyA9PSBcIm51bWJlclwiKVxuICAgICAgICBhcmcgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgXG4gICAgICB2YXIgdmFsID0gY29udmVyc2lvbnNbZnVuY10oYXJnKTtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09IFwic3RyaW5nXCIgfHwgdmFsID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB2YWw7IC8vIGtleXdvcmRcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspXG4gICAgICAgIHZhbFtpXSA9IE1hdGgucm91bmQodmFsW2ldKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICB9KShmdW5jKTtcbn1cblxuXG4vKiBDb252ZXJ0ZXIgZG9lcyBsYXp5IGNvbnZlcnNpb24gYW5kIGNhY2hpbmcgKi9cbnZhciBDb252ZXJ0ZXIgPSBmdW5jdGlvbigpIHtcbiAgIHRoaXMuY29udnMgPSB7fTtcbn07XG5cbi8qIEVpdGhlciBnZXQgdGhlIHZhbHVlcyBmb3IgYSBzcGFjZSBvclxuICBzZXQgdGhlIHZhbHVlcyBmb3IgYSBzcGFjZSwgZGVwZW5kaW5nIG9uIGFyZ3MgKi9cbkNvbnZlcnRlci5wcm90b3R5cGUucm91dGVTcGFjZSA9IGZ1bmN0aW9uKHNwYWNlLCBhcmdzKSB7XG4gICB2YXIgdmFsdWVzID0gYXJnc1swXTtcbiAgIGlmICh2YWx1ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gY29sb3IucmdiKClcbiAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlcyhzcGFjZSk7XG4gICB9XG4gICAvLyBjb2xvci5yZ2IoMTAsIDEwLCAxMClcbiAgIGlmICh0eXBlb2YgdmFsdWVzID09IFwibnVtYmVyXCIpIHtcbiAgICAgIHZhbHVlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpOyAgICAgICAgXG4gICB9XG5cbiAgIHJldHVybiB0aGlzLnNldFZhbHVlcyhzcGFjZSwgdmFsdWVzKTtcbn07XG4gIFxuLyogU2V0IHRoZSB2YWx1ZXMgZm9yIGEgc3BhY2UsIGludmFsaWRhdGluZyBjYWNoZSAqL1xuQ29udmVydGVyLnByb3RvdHlwZS5zZXRWYWx1ZXMgPSBmdW5jdGlvbihzcGFjZSwgdmFsdWVzKSB7XG4gICB0aGlzLnNwYWNlID0gc3BhY2U7XG4gICB0aGlzLmNvbnZzID0ge307XG4gICB0aGlzLmNvbnZzW3NwYWNlXSA9IHZhbHVlcztcbiAgIHJldHVybiB0aGlzO1xufTtcblxuLyogR2V0IHRoZSB2YWx1ZXMgZm9yIGEgc3BhY2UuIElmIHRoZXJlJ3MgYWxyZWFkeVxuICBhIGNvbnZlcnNpb24gZm9yIHRoZSBzcGFjZSwgZmV0Y2ggaXQsIG90aGVyd2lzZVxuICBjb21wdXRlIGl0ICovXG5Db252ZXJ0ZXIucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uKHNwYWNlKSB7XG4gICB2YXIgdmFscyA9IHRoaXMuY29udnNbc3BhY2VdO1xuICAgaWYgKCF2YWxzKSB7XG4gICAgICB2YXIgZnNwYWNlID0gdGhpcy5zcGFjZSxcbiAgICAgICAgICBmcm9tID0gdGhpcy5jb252c1tmc3BhY2VdO1xuICAgICAgdmFscyA9IGNvbnZlcnRbZnNwYWNlXVtzcGFjZV0oZnJvbSk7XG5cbiAgICAgIHRoaXMuY29udnNbc3BhY2VdID0gdmFscztcbiAgIH1cbiAgcmV0dXJuIHZhbHM7XG59O1xuXG5bXCJyZ2JcIiwgXCJoc2xcIiwgXCJoc3ZcIiwgXCJjbXlrXCIsIFwia2V5d29yZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKHNwYWNlKSB7XG4gICBDb252ZXJ0ZXIucHJvdG90eXBlW3NwYWNlXSA9IGZ1bmN0aW9uKHZhbHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlU3BhY2Uoc3BhY2UsIGFyZ3VtZW50cyk7XG4gICB9O1xufSk7XG5cbnZhciBjb2xvckNvbnZlcnQgPSBjb252ZXJ0O1xuXG52YXIgY29sb3JOYW1lID0ge1xuXHRcImFsaWNlYmx1ZVwiOiBbMjQwLCAyNDgsIDI1NV0sXG5cdFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsIDIzNSwgMjE1XSxcblx0XCJhcXVhXCI6IFswLCAyNTUsIDI1NV0sXG5cdFwiYXF1YW1hcmluZVwiOiBbMTI3LCAyNTUsIDIxMl0sXG5cdFwiYXp1cmVcIjogWzI0MCwgMjU1LCAyNTVdLFxuXHRcImJlaWdlXCI6IFsyNDUsIDI0NSwgMjIwXSxcblx0XCJiaXNxdWVcIjogWzI1NSwgMjI4LCAxOTZdLFxuXHRcImJsYWNrXCI6IFswLCAwLCAwXSxcblx0XCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LCAyMzUsIDIwNV0sXG5cdFwiYmx1ZVwiOiBbMCwgMCwgMjU1XSxcblx0XCJibHVldmlvbGV0XCI6IFsxMzgsIDQzLCAyMjZdLFxuXHRcImJyb3duXCI6IFsxNjUsIDQyLCA0Ml0sXG5cdFwiYnVybHl3b29kXCI6IFsyMjIsIDE4NCwgMTM1XSxcblx0XCJjYWRldGJsdWVcIjogWzk1LCAxNTgsIDE2MF0sXG5cdFwiY2hhcnRyZXVzZVwiOiBbMTI3LCAyNTUsIDBdLFxuXHRcImNob2NvbGF0ZVwiOiBbMjEwLCAxMDUsIDMwXSxcblx0XCJjb3JhbFwiOiBbMjU1LCAxMjcsIDgwXSxcblx0XCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLCAxNDksIDIzN10sXG5cdFwiY29ybnNpbGtcIjogWzI1NSwgMjQ4LCAyMjBdLFxuXHRcImNyaW1zb25cIjogWzIyMCwgMjAsIDYwXSxcblx0XCJjeWFuXCI6IFswLCAyNTUsIDI1NV0sXG5cdFwiZGFya2JsdWVcIjogWzAsIDAsIDEzOV0sXG5cdFwiZGFya2N5YW5cIjogWzAsIDEzOSwgMTM5XSxcblx0XCJkYXJrZ29sZGVucm9kXCI6IFsxODQsIDEzNCwgMTFdLFxuXHRcImRhcmtncmF5XCI6IFsxNjksIDE2OSwgMTY5XSxcblx0XCJkYXJrZ3JlZW5cIjogWzAsIDEwMCwgMF0sXG5cdFwiZGFya2dyZXlcIjogWzE2OSwgMTY5LCAxNjldLFxuXHRcImRhcmtraGFraVwiOiBbMTg5LCAxODMsIDEwN10sXG5cdFwiZGFya21hZ2VudGFcIjogWzEzOSwgMCwgMTM5XSxcblx0XCJkYXJrb2xpdmVncmVlblwiOiBbODUsIDEwNywgNDddLFxuXHRcImRhcmtvcmFuZ2VcIjogWzI1NSwgMTQwLCAwXSxcblx0XCJkYXJrb3JjaGlkXCI6IFsxNTMsIDUwLCAyMDRdLFxuXHRcImRhcmtyZWRcIjogWzEzOSwgMCwgMF0sXG5cdFwiZGFya3NhbG1vblwiOiBbMjMzLCAxNTAsIDEyMl0sXG5cdFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsIDE4OCwgMTQzXSxcblx0XCJkYXJrc2xhdGVibHVlXCI6IFs3MiwgNjEsIDEzOV0sXG5cdFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsIDc5LCA3OV0sXG5cdFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsIDc5LCA3OV0sXG5cdFwiZGFya3R1cnF1b2lzZVwiOiBbMCwgMjA2LCAyMDldLFxuXHRcImRhcmt2aW9sZXRcIjogWzE0OCwgMCwgMjExXSxcblx0XCJkZWVwcGlua1wiOiBbMjU1LCAyMCwgMTQ3XSxcblx0XCJkZWVwc2t5Ymx1ZVwiOiBbMCwgMTkxLCAyNTVdLFxuXHRcImRpbWdyYXlcIjogWzEwNSwgMTA1LCAxMDVdLFxuXHRcImRpbWdyZXlcIjogWzEwNSwgMTA1LCAxMDVdLFxuXHRcImRvZGdlcmJsdWVcIjogWzMwLCAxNDQsIDI1NV0sXG5cdFwiZmlyZWJyaWNrXCI6IFsxNzgsIDM0LCAzNF0sXG5cdFwiZmxvcmFsd2hpdGVcIjogWzI1NSwgMjUwLCAyNDBdLFxuXHRcImZvcmVzdGdyZWVuXCI6IFszNCwgMTM5LCAzNF0sXG5cdFwiZnVjaHNpYVwiOiBbMjU1LCAwLCAyNTVdLFxuXHRcImdhaW5zYm9yb1wiOiBbMjIwLCAyMjAsIDIyMF0sXG5cdFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LCAyNDgsIDI1NV0sXG5cdFwiZ29sZFwiOiBbMjU1LCAyMTUsIDBdLFxuXHRcImdvbGRlbnJvZFwiOiBbMjE4LCAxNjUsIDMyXSxcblx0XCJncmF5XCI6IFsxMjgsIDEyOCwgMTI4XSxcblx0XCJncmVlblwiOiBbMCwgMTI4LCAwXSxcblx0XCJncmVlbnllbGxvd1wiOiBbMTczLCAyNTUsIDQ3XSxcblx0XCJncmV5XCI6IFsxMjgsIDEyOCwgMTI4XSxcblx0XCJob25leWRld1wiOiBbMjQwLCAyNTUsIDI0MF0sXG5cdFwiaG90cGlua1wiOiBbMjU1LCAxMDUsIDE4MF0sXG5cdFwiaW5kaWFucmVkXCI6IFsyMDUsIDkyLCA5Ml0sXG5cdFwiaW5kaWdvXCI6IFs3NSwgMCwgMTMwXSxcblx0XCJpdm9yeVwiOiBbMjU1LCAyNTUsIDI0MF0sXG5cdFwia2hha2lcIjogWzI0MCwgMjMwLCAxNDBdLFxuXHRcImxhdmVuZGVyXCI6IFsyMzAsIDIzMCwgMjUwXSxcblx0XCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsIDI0MCwgMjQ1XSxcblx0XCJsYXduZ3JlZW5cIjogWzEyNCwgMjUyLCAwXSxcblx0XCJsZW1vbmNoaWZmb25cIjogWzI1NSwgMjUwLCAyMDVdLFxuXHRcImxpZ2h0Ymx1ZVwiOiBbMTczLCAyMTYsIDIzMF0sXG5cdFwibGlnaHRjb3JhbFwiOiBbMjQwLCAxMjgsIDEyOF0sXG5cdFwibGlnaHRjeWFuXCI6IFsyMjQsIDI1NSwgMjU1XSxcblx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLCAyNTAsIDIxMF0sXG5cdFwibGlnaHRncmF5XCI6IFsyMTEsIDIxMSwgMjExXSxcblx0XCJsaWdodGdyZWVuXCI6IFsxNDQsIDIzOCwgMTQ0XSxcblx0XCJsaWdodGdyZXlcIjogWzIxMSwgMjExLCAyMTFdLFxuXHRcImxpZ2h0cGlua1wiOiBbMjU1LCAxODIsIDE5M10sXG5cdFwibGlnaHRzYWxtb25cIjogWzI1NSwgMTYwLCAxMjJdLFxuXHRcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLCAxNzgsIDE3MF0sXG5cdFwibGlnaHRza3libHVlXCI6IFsxMzUsIDIwNiwgMjUwXSxcblx0XCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LCAxMzYsIDE1M10sXG5cdFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwgMTM2LCAxNTNdLFxuXHRcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsIDE5NiwgMjIyXSxcblx0XCJsaWdodHllbGxvd1wiOiBbMjU1LCAyNTUsIDIyNF0sXG5cdFwibGltZVwiOiBbMCwgMjU1LCAwXSxcblx0XCJsaW1lZ3JlZW5cIjogWzUwLCAyMDUsIDUwXSxcblx0XCJsaW5lblwiOiBbMjUwLCAyNDAsIDIzMF0sXG5cdFwibWFnZW50YVwiOiBbMjU1LCAwLCAyNTVdLFxuXHRcIm1hcm9vblwiOiBbMTI4LCAwLCAwXSxcblx0XCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsIDIwNSwgMTcwXSxcblx0XCJtZWRpdW1ibHVlXCI6IFswLCAwLCAyMDVdLFxuXHRcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LCA4NSwgMjExXSxcblx0XCJtZWRpdW1wdXJwbGVcIjogWzE0NywgMTEyLCAyMTldLFxuXHRcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwgMTc5LCAxMTNdLFxuXHRcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLCAxMDQsIDIzOF0sXG5cdFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsIDI1MCwgMTU0XSxcblx0XCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLCAyMDksIDIwNF0sXG5cdFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksIDIxLCAxMzNdLFxuXHRcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsIDI1LCAxMTJdLFxuXHRcIm1pbnRjcmVhbVwiOiBbMjQ1LCAyNTUsIDI1MF0sXG5cdFwibWlzdHlyb3NlXCI6IFsyNTUsIDIyOCwgMjI1XSxcblx0XCJtb2NjYXNpblwiOiBbMjU1LCAyMjgsIDE4MV0sXG5cdFwibmF2YWpvd2hpdGVcIjogWzI1NSwgMjIyLCAxNzNdLFxuXHRcIm5hdnlcIjogWzAsIDAsIDEyOF0sXG5cdFwib2xkbGFjZVwiOiBbMjUzLCAyNDUsIDIzMF0sXG5cdFwib2xpdmVcIjogWzEyOCwgMTI4LCAwXSxcblx0XCJvbGl2ZWRyYWJcIjogWzEwNywgMTQyLCAzNV0sXG5cdFwib3JhbmdlXCI6IFsyNTUsIDE2NSwgMF0sXG5cdFwib3JhbmdlcmVkXCI6IFsyNTUsIDY5LCAwXSxcblx0XCJvcmNoaWRcIjogWzIxOCwgMTEyLCAyMTRdLFxuXHRcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwgMjMyLCAxNzBdLFxuXHRcInBhbGVncmVlblwiOiBbMTUyLCAyNTEsIDE1Ml0sXG5cdFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LCAyMzgsIDIzOF0sXG5cdFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LCAxMTIsIDE0N10sXG5cdFwicGFwYXlhd2hpcFwiOiBbMjU1LCAyMzksIDIxM10sXG5cdFwicGVhY2hwdWZmXCI6IFsyNTUsIDIxOCwgMTg1XSxcblx0XCJwZXJ1XCI6IFsyMDUsIDEzMywgNjNdLFxuXHRcInBpbmtcIjogWzI1NSwgMTkyLCAyMDNdLFxuXHRcInBsdW1cIjogWzIyMSwgMTYwLCAyMjFdLFxuXHRcInBvd2RlcmJsdWVcIjogWzE3NiwgMjI0LCAyMzBdLFxuXHRcInB1cnBsZVwiOiBbMTI4LCAwLCAxMjhdLFxuXHRcInJlYmVjY2FwdXJwbGVcIjogWzEwMiwgNTEsIDE1M10sXG5cdFwicmVkXCI6IFsyNTUsIDAsIDBdLFxuXHRcInJvc3licm93blwiOiBbMTg4LCAxNDMsIDE0M10sXG5cdFwicm95YWxibHVlXCI6IFs2NSwgMTA1LCAyMjVdLFxuXHRcInNhZGRsZWJyb3duXCI6IFsxMzksIDY5LCAxOV0sXG5cdFwic2FsbW9uXCI6IFsyNTAsIDEyOCwgMTE0XSxcblx0XCJzYW5keWJyb3duXCI6IFsyNDQsIDE2NCwgOTZdLFxuXHRcInNlYWdyZWVuXCI6IFs0NiwgMTM5LCA4N10sXG5cdFwic2Vhc2hlbGxcIjogWzI1NSwgMjQ1LCAyMzhdLFxuXHRcInNpZW5uYVwiOiBbMTYwLCA4MiwgNDVdLFxuXHRcInNpbHZlclwiOiBbMTkyLCAxOTIsIDE5Ml0sXG5cdFwic2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDIzNV0sXG5cdFwic2xhdGVibHVlXCI6IFsxMDYsIDkwLCAyMDVdLFxuXHRcInNsYXRlZ3JheVwiOiBbMTEyLCAxMjgsIDE0NF0sXG5cdFwic2xhdGVncmV5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcblx0XCJzbm93XCI6IFsyNTUsIDI1MCwgMjUwXSxcblx0XCJzcHJpbmdncmVlblwiOiBbMCwgMjU1LCAxMjddLFxuXHRcInN0ZWVsYmx1ZVwiOiBbNzAsIDEzMCwgMTgwXSxcblx0XCJ0YW5cIjogWzIxMCwgMTgwLCAxNDBdLFxuXHRcInRlYWxcIjogWzAsIDEyOCwgMTI4XSxcblx0XCJ0aGlzdGxlXCI6IFsyMTYsIDE5MSwgMjE2XSxcblx0XCJ0b21hdG9cIjogWzI1NSwgOTksIDcxXSxcblx0XCJ0dXJxdW9pc2VcIjogWzY0LCAyMjQsIDIwOF0sXG5cdFwidmlvbGV0XCI6IFsyMzgsIDEzMCwgMjM4XSxcblx0XCJ3aGVhdFwiOiBbMjQ1LCAyMjIsIDE3OV0sXG5cdFwid2hpdGVcIjogWzI1NSwgMjU1LCAyNTVdLFxuXHRcIndoaXRlc21va2VcIjogWzI0NSwgMjQ1LCAyNDVdLFxuXHRcInllbGxvd1wiOiBbMjU1LCAyNTUsIDBdLFxuXHRcInllbGxvd2dyZWVuXCI6IFsxNTQsIDIwNSwgNTBdXG59O1xuXG4vKiBNSVQgbGljZW5zZSAqL1xuXG5cbnZhciBjb2xvclN0cmluZyA9IHtcbiAgIGdldFJnYmE6IGdldFJnYmEsXG4gICBnZXRIc2xhOiBnZXRIc2xhLFxuICAgZ2V0UmdiOiBnZXRSZ2IsXG4gICBnZXRIc2w6IGdldEhzbCxcbiAgIGdldEh3YjogZ2V0SHdiLFxuICAgZ2V0QWxwaGE6IGdldEFscGhhLFxuXG4gICBoZXhTdHJpbmc6IGhleFN0cmluZyxcbiAgIHJnYlN0cmluZzogcmdiU3RyaW5nLFxuICAgcmdiYVN0cmluZzogcmdiYVN0cmluZyxcbiAgIHBlcmNlbnRTdHJpbmc6IHBlcmNlbnRTdHJpbmcsXG4gICBwZXJjZW50YVN0cmluZzogcGVyY2VudGFTdHJpbmcsXG4gICBoc2xTdHJpbmc6IGhzbFN0cmluZyxcbiAgIGhzbGFTdHJpbmc6IGhzbGFTdHJpbmcsXG4gICBod2JTdHJpbmc6IGh3YlN0cmluZyxcbiAgIGtleXdvcmQ6IGtleXdvcmRcbn07XG5cbmZ1bmN0aW9uIGdldFJnYmEoc3RyaW5nKSB7XG4gICBpZiAoIXN0cmluZykge1xuICAgICAgcmV0dXJuO1xuICAgfVxuICAgdmFyIGFiYnIgPSAgL14jKFthLWZBLUYwLTldezMsNH0pJC9pLFxuICAgICAgIGhleCA9ICAvXiMoW2EtZkEtRjAtOV17Nn0oW2EtZkEtRjAtOV17Mn0pPykkL2ksXG4gICAgICAgcmdiYSA9IC9ecmdiYT9cXChcXHMqKFsrLV0/XFxkKylcXHMqLFxccyooWystXT9cXGQrKVxccyosXFxzKihbKy1dP1xcZCspXFxzKig/OixcXHMqKFsrLV0/W1xcZFxcLl0rKVxccyopP1xcKSQvaSxcbiAgICAgICBwZXIgPSAvXnJnYmE/XFwoXFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqLFxccyooWystXT9bXFxkXFwuXSspXFwlXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyooPzosXFxzKihbKy1dP1tcXGRcXC5dKylcXHMqKT9cXCkkL2ksXG4gICAgICAga2V5d29yZCA9IC8oXFx3KykvO1xuXG4gICB2YXIgcmdiID0gWzAsIDAsIDBdLFxuICAgICAgIGEgPSAxLFxuICAgICAgIG1hdGNoID0gc3RyaW5nLm1hdGNoKGFiYnIpLFxuICAgICAgIGhleEFscGhhID0gXCJcIjtcbiAgIGlmIChtYXRjaCkge1xuICAgICAgbWF0Y2ggPSBtYXRjaFsxXTtcbiAgICAgIGhleEFscGhhID0gbWF0Y2hbM107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgcmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaV0gKyBtYXRjaFtpXSwgMTYpO1xuICAgICAgfVxuICAgICAgaWYgKGhleEFscGhhKSB7XG4gICAgICAgICBhID0gTWF0aC5yb3VuZCgocGFyc2VJbnQoaGV4QWxwaGEgKyBoZXhBbHBoYSwgMTYpIC8gMjU1KSAqIDEwMCkgLyAxMDA7XG4gICAgICB9XG4gICB9XG4gICBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChoZXgpKSB7XG4gICAgICBoZXhBbHBoYSA9IG1hdGNoWzJdO1xuICAgICAgbWF0Y2ggPSBtYXRjaFsxXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICByZ2JbaV0gPSBwYXJzZUludChtYXRjaC5zbGljZShpICogMiwgaSAqIDIgKyAyKSwgMTYpO1xuICAgICAgfVxuICAgICAgaWYgKGhleEFscGhhKSB7XG4gICAgICAgICBhID0gTWF0aC5yb3VuZCgocGFyc2VJbnQoaGV4QWxwaGEsIDE2KSAvIDI1NSkgKiAxMDApIC8gMTAwO1xuICAgICAgfVxuICAgfVxuICAgZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocmdiYSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICByZ2JbaV0gPSBwYXJzZUludChtYXRjaFtpICsgMV0pO1xuICAgICAgfVxuICAgICAgYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuICAgfVxuICAgZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocGVyKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgIHJnYltpXSA9IE1hdGgucm91bmQocGFyc2VGbG9hdChtYXRjaFtpICsgMV0pICogMi41NSk7XG4gICAgICB9XG4gICAgICBhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG4gICB9XG4gICBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChrZXl3b3JkKSkge1xuICAgICAgaWYgKG1hdGNoWzFdID09IFwidHJhbnNwYXJlbnRcIikge1xuICAgICAgICAgcmV0dXJuIFswLCAwLCAwLCAwXTtcbiAgICAgIH1cbiAgICAgIHJnYiA9IGNvbG9yTmFtZVttYXRjaFsxXV07XG4gICAgICBpZiAoIXJnYikge1xuICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgfVxuXG4gICBmb3IgKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykge1xuICAgICAgcmdiW2ldID0gc2NhbGUocmdiW2ldLCAwLCAyNTUpO1xuICAgfVxuICAgaWYgKCFhICYmIGEgIT0gMCkge1xuICAgICAgYSA9IDE7XG4gICB9XG4gICBlbHNlIHtcbiAgICAgIGEgPSBzY2FsZShhLCAwLCAxKTtcbiAgIH1cbiAgIHJnYlszXSA9IGE7XG4gICByZXR1cm4gcmdiO1xufVxuXG5mdW5jdGlvbiBnZXRIc2xhKHN0cmluZykge1xuICAgaWYgKCFzdHJpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgIH1cbiAgIHZhciBoc2wgPSAvXmhzbGE/XFwoXFxzKihbKy1dP1xcZCspKD86ZGVnKT9cXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKig/OixcXHMqKFsrLV0/W1xcZFxcLl0rKVxccyopP1xcKS87XG4gICB2YXIgbWF0Y2ggPSBzdHJpbmcubWF0Y2goaHNsKTtcbiAgIGlmIChtYXRjaCkge1xuICAgICAgdmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG4gICAgICB2YXIgaCA9IHNjYWxlKHBhcnNlSW50KG1hdGNoWzFdKSwgMCwgMzYwKSxcbiAgICAgICAgICBzID0gc2NhbGUocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCksXG4gICAgICAgICAgbCA9IHNjYWxlKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApLFxuICAgICAgICAgIGEgPSBzY2FsZShpc05hTihhbHBoYSkgPyAxIDogYWxwaGEsIDAsIDEpO1xuICAgICAgcmV0dXJuIFtoLCBzLCBsLCBhXTtcbiAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0SHdiKHN0cmluZykge1xuICAgaWYgKCFzdHJpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgIH1cbiAgIHZhciBod2IgPSAvXmh3YlxcKFxccyooWystXT9cXGQrKSg/OmRlZyk/XFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyooPzosXFxzKihbKy1dP1tcXGRcXC5dKylcXHMqKT9cXCkvO1xuICAgdmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGh3Yik7XG4gICBpZiAobWF0Y2gpIHtcbiAgICB2YXIgYWxwaGEgPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcbiAgICAgIHZhciBoID0gc2NhbGUocGFyc2VJbnQobWF0Y2hbMV0pLCAwLCAzNjApLFxuICAgICAgICAgIHcgPSBzY2FsZShwYXJzZUZsb2F0KG1hdGNoWzJdKSwgMCwgMTAwKSxcbiAgICAgICAgICBiID0gc2NhbGUocGFyc2VGbG9hdChtYXRjaFszXSksIDAsIDEwMCksXG4gICAgICAgICAgYSA9IHNjYWxlKGlzTmFOKGFscGhhKSA/IDEgOiBhbHBoYSwgMCwgMSk7XG4gICAgICByZXR1cm4gW2gsIHcsIGIsIGFdO1xuICAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZ2Ioc3RyaW5nKSB7XG4gICB2YXIgcmdiYSA9IGdldFJnYmEoc3RyaW5nKTtcbiAgIHJldHVybiByZ2JhICYmIHJnYmEuc2xpY2UoMCwgMyk7XG59XG5cbmZ1bmN0aW9uIGdldEhzbChzdHJpbmcpIHtcbiAgdmFyIGhzbGEgPSBnZXRIc2xhKHN0cmluZyk7XG4gIHJldHVybiBoc2xhICYmIGhzbGEuc2xpY2UoMCwgMyk7XG59XG5cbmZ1bmN0aW9uIGdldEFscGhhKHN0cmluZykge1xuICAgdmFyIHZhbHMgPSBnZXRSZ2JhKHN0cmluZyk7XG4gICBpZiAodmFscykge1xuICAgICAgcmV0dXJuIHZhbHNbM107XG4gICB9XG4gICBlbHNlIGlmICh2YWxzID0gZ2V0SHNsYShzdHJpbmcpKSB7XG4gICAgICByZXR1cm4gdmFsc1szXTtcbiAgIH1cbiAgIGVsc2UgaWYgKHZhbHMgPSBnZXRId2Ioc3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHZhbHNbM107XG4gICB9XG59XG5cbi8vIGdlbmVyYXRvcnNcbmZ1bmN0aW9uIGhleFN0cmluZyhyZ2JhLCBhKSB7XG4gICB2YXIgYSA9IChhICE9PSB1bmRlZmluZWQgJiYgcmdiYS5sZW5ndGggPT09IDMpID8gYSA6IHJnYmFbM107XG4gICByZXR1cm4gXCIjXCIgKyBoZXhEb3VibGUocmdiYVswXSkgXG4gICAgICAgICAgICAgICsgaGV4RG91YmxlKHJnYmFbMV0pXG4gICAgICAgICAgICAgICsgaGV4RG91YmxlKHJnYmFbMl0pXG4gICAgICAgICAgICAgICsgKFxuICAgICAgICAgICAgICAgICAoYSA+PSAwICYmIGEgPCAxKVxuICAgICAgICAgICAgICAgICA/IGhleERvdWJsZShNYXRoLnJvdW5kKGEgKiAyNTUpKVxuICAgICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgICAgKTtcbn1cblxuZnVuY3Rpb24gcmdiU3RyaW5nKHJnYmEsIGFscGhhKSB7XG4gICBpZiAoYWxwaGEgPCAxIHx8IChyZ2JhWzNdICYmIHJnYmFbM10gPCAxKSkge1xuICAgICAgcmV0dXJuIHJnYmFTdHJpbmcocmdiYSwgYWxwaGEpO1xuICAgfVxuICAgcmV0dXJuIFwicmdiKFwiICsgcmdiYVswXSArIFwiLCBcIiArIHJnYmFbMV0gKyBcIiwgXCIgKyByZ2JhWzJdICsgXCIpXCI7XG59XG5cbmZ1bmN0aW9uIHJnYmFTdHJpbmcocmdiYSwgYWxwaGEpIHtcbiAgIGlmIChhbHBoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbHBoYSA9IChyZ2JhWzNdICE9PSB1bmRlZmluZWQgPyByZ2JhWzNdIDogMSk7XG4gICB9XG4gICByZXR1cm4gXCJyZ2JhKFwiICsgcmdiYVswXSArIFwiLCBcIiArIHJnYmFbMV0gKyBcIiwgXCIgKyByZ2JhWzJdXG4gICAgICAgICAgICsgXCIsIFwiICsgYWxwaGEgKyBcIilcIjtcbn1cblxuZnVuY3Rpb24gcGVyY2VudFN0cmluZyhyZ2JhLCBhbHBoYSkge1xuICAgaWYgKGFscGhhIDwgMSB8fCAocmdiYVszXSAmJiByZ2JhWzNdIDwgMSkpIHtcbiAgICAgIHJldHVybiBwZXJjZW50YVN0cmluZyhyZ2JhLCBhbHBoYSk7XG4gICB9XG4gICB2YXIgciA9IE1hdGgucm91bmQocmdiYVswXS8yNTUgKiAxMDApLFxuICAgICAgIGcgPSBNYXRoLnJvdW5kKHJnYmFbMV0vMjU1ICogMTAwKSxcbiAgICAgICBiID0gTWF0aC5yb3VuZChyZ2JhWzJdLzI1NSAqIDEwMCk7XG5cbiAgIHJldHVybiBcInJnYihcIiArIHIgKyBcIiUsIFwiICsgZyArIFwiJSwgXCIgKyBiICsgXCIlKVwiO1xufVxuXG5mdW5jdGlvbiBwZXJjZW50YVN0cmluZyhyZ2JhLCBhbHBoYSkge1xuICAgdmFyIHIgPSBNYXRoLnJvdW5kKHJnYmFbMF0vMjU1ICogMTAwKSxcbiAgICAgICBnID0gTWF0aC5yb3VuZChyZ2JhWzFdLzI1NSAqIDEwMCksXG4gICAgICAgYiA9IE1hdGgucm91bmQocmdiYVsyXS8yNTUgKiAxMDApO1xuICAgcmV0dXJuIFwicmdiYShcIiArIHIgKyBcIiUsIFwiICsgZyArIFwiJSwgXCIgKyBiICsgXCIlLCBcIiArIChhbHBoYSB8fCByZ2JhWzNdIHx8IDEpICsgXCIpXCI7XG59XG5cbmZ1bmN0aW9uIGhzbFN0cmluZyhoc2xhLCBhbHBoYSkge1xuICAgaWYgKGFscGhhIDwgMSB8fCAoaHNsYVszXSAmJiBoc2xhWzNdIDwgMSkpIHtcbiAgICAgIHJldHVybiBoc2xhU3RyaW5nKGhzbGEsIGFscGhhKTtcbiAgIH1cbiAgIHJldHVybiBcImhzbChcIiArIGhzbGFbMF0gKyBcIiwgXCIgKyBoc2xhWzFdICsgXCIlLCBcIiArIGhzbGFbMl0gKyBcIiUpXCI7XG59XG5cbmZ1bmN0aW9uIGhzbGFTdHJpbmcoaHNsYSwgYWxwaGEpIHtcbiAgIGlmIChhbHBoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbHBoYSA9IChoc2xhWzNdICE9PSB1bmRlZmluZWQgPyBoc2xhWzNdIDogMSk7XG4gICB9XG4gICByZXR1cm4gXCJoc2xhKFwiICsgaHNsYVswXSArIFwiLCBcIiArIGhzbGFbMV0gKyBcIiUsIFwiICsgaHNsYVsyXSArIFwiJSwgXCJcbiAgICAgICAgICAgKyBhbHBoYSArIFwiKVwiO1xufVxuXG4vLyBod2IgaXMgYSBiaXQgZGlmZmVyZW50IHRoYW4gcmdiKGEpICYgaHNsKGEpIHNpbmNlIHRoZXJlIGlzIG5vIGFscGhhIHNwZWNpZmljIHN5bnRheFxuLy8gKGh3YiBoYXZlIGFscGhhIG9wdGlvbmFsICYgMSBpcyBkZWZhdWx0IHZhbHVlKVxuZnVuY3Rpb24gaHdiU3RyaW5nKGh3YiwgYWxwaGEpIHtcbiAgIGlmIChhbHBoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbHBoYSA9IChod2JbM10gIT09IHVuZGVmaW5lZCA/IGh3YlszXSA6IDEpO1xuICAgfVxuICAgcmV0dXJuIFwiaHdiKFwiICsgaHdiWzBdICsgXCIsIFwiICsgaHdiWzFdICsgXCIlLCBcIiArIGh3YlsyXSArIFwiJVwiXG4gICAgICAgICAgICsgKGFscGhhICE9PSB1bmRlZmluZWQgJiYgYWxwaGEgIT09IDEgPyBcIiwgXCIgKyBhbHBoYSA6IFwiXCIpICsgXCIpXCI7XG59XG5cbmZ1bmN0aW9uIGtleXdvcmQocmdiKSB7XG4gIHJldHVybiByZXZlcnNlTmFtZXNbcmdiLnNsaWNlKDAsIDMpXTtcbn1cblxuLy8gaGVscGVyc1xuZnVuY3Rpb24gc2NhbGUobnVtLCBtaW4sIG1heCkge1xuICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG1pbiwgbnVtKSwgbWF4KTtcbn1cblxuZnVuY3Rpb24gaGV4RG91YmxlKG51bSkge1xuICB2YXIgc3RyID0gbnVtLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICByZXR1cm4gKHN0ci5sZW5ndGggPCAyKSA/IFwiMFwiICsgc3RyIDogc3RyO1xufVxuXG5cbi8vY3JlYXRlIGEgbGlzdCBvZiByZXZlcnNlIGNvbG9yIG5hbWVzXG52YXIgcmV2ZXJzZU5hbWVzID0ge307XG5mb3IgKHZhciBuYW1lIGluIGNvbG9yTmFtZSkge1xuICAgcmV2ZXJzZU5hbWVzW2NvbG9yTmFtZVtuYW1lXV0gPSBuYW1lO1xufVxuXG4vKiBNSVQgbGljZW5zZSAqL1xuXG5cblxudmFyIENvbG9yID0gZnVuY3Rpb24gKG9iaikge1xuXHRpZiAob2JqIGluc3RhbmNlb2YgQ29sb3IpIHtcblx0XHRyZXR1cm4gb2JqO1xuXHR9XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb2xvcikpIHtcblx0XHRyZXR1cm4gbmV3IENvbG9yKG9iaik7XG5cdH1cblxuXHR0aGlzLnZhbGlkID0gZmFsc2U7XG5cdHRoaXMudmFsdWVzID0ge1xuXHRcdHJnYjogWzAsIDAsIDBdLFxuXHRcdGhzbDogWzAsIDAsIDBdLFxuXHRcdGhzdjogWzAsIDAsIDBdLFxuXHRcdGh3YjogWzAsIDAsIDBdLFxuXHRcdGNteWs6IFswLCAwLCAwLCAwXSxcblx0XHRhbHBoYTogMVxuXHR9O1xuXG5cdC8vIHBhcnNlIENvbG9yKCkgYXJndW1lbnRcblx0dmFyIHZhbHM7XG5cdGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuXHRcdHZhbHMgPSBjb2xvclN0cmluZy5nZXRSZ2JhKG9iaik7XG5cdFx0aWYgKHZhbHMpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdyZ2InLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMgPSBjb2xvclN0cmluZy5nZXRIc2xhKG9iaikpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMgPSBjb2xvclN0cmluZy5nZXRId2Iob2JqKSkge1xuXHRcdFx0dGhpcy5zZXRWYWx1ZXMoJ2h3YicsIHZhbHMpO1xuXHRcdH1cblx0fSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuXHRcdHZhbHMgPSBvYmo7XG5cdFx0aWYgKHZhbHMuciAhPT0gdW5kZWZpbmVkIHx8IHZhbHMucmVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdyZ2InLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMubCAhPT0gdW5kZWZpbmVkIHx8IHZhbHMubGlnaHRuZXNzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMudiAhPT0gdW5kZWZpbmVkIHx8IHZhbHMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzdicsIHZhbHMpO1xuXHRcdH0gZWxzZSBpZiAodmFscy53ICE9PSB1bmRlZmluZWQgfHwgdmFscy53aGl0ZW5lc3MgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5zZXRWYWx1ZXMoJ2h3YicsIHZhbHMpO1xuXHRcdH0gZWxzZSBpZiAodmFscy5jICE9PSB1bmRlZmluZWQgfHwgdmFscy5jeWFuICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdjbXlrJywgdmFscyk7XG5cdFx0fVxuXHR9XG59O1xuXG5Db2xvci5wcm90b3R5cGUgPSB7XG5cdGlzVmFsaWQ6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWxpZDtcblx0fSxcblx0cmdiOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0U3BhY2UoJ3JnYicsIGFyZ3VtZW50cyk7XG5cdH0sXG5cdGhzbDogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnNldFNwYWNlKCdoc2wnLCBhcmd1bWVudHMpO1xuXHR9LFxuXHRoc3Y6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRTcGFjZSgnaHN2JywgYXJndW1lbnRzKTtcblx0fSxcblx0aHdiOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0U3BhY2UoJ2h3YicsIGFyZ3VtZW50cyk7XG5cdH0sXG5cdGNteWs6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRTcGFjZSgnY215aycsIGFyZ3VtZW50cyk7XG5cdH0sXG5cblx0cmdiQXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMucmdiO1xuXHR9LFxuXHRoc2xBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5oc2w7XG5cdH0sXG5cdGhzdkFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzLmhzdjtcblx0fSxcblx0aHdiQXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgdmFsdWVzID0gdGhpcy52YWx1ZXM7XG5cdFx0aWYgKHZhbHVlcy5hbHBoYSAhPT0gMSkge1xuXHRcdFx0cmV0dXJuIHZhbHVlcy5od2IuY29uY2F0KFt2YWx1ZXMuYWxwaGFdKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlcy5od2I7XG5cdH0sXG5cdGNteWtBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5jbXlrO1xuXHR9LFxuXHRyZ2JhQXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgdmFsdWVzID0gdGhpcy52YWx1ZXM7XG5cdFx0cmV0dXJuIHZhbHVlcy5yZ2IuY29uY2F0KFt2YWx1ZXMuYWxwaGFdKTtcblx0fSxcblx0aHNsYUFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuXHRcdHJldHVybiB2YWx1ZXMuaHNsLmNvbmNhdChbdmFsdWVzLmFscGhhXSk7XG5cdH0sXG5cdGFscGhhOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy52YWx1ZXMuYWxwaGE7XG5cdFx0fVxuXHRcdHRoaXMuc2V0VmFsdWVzKCdhbHBoYScsIHZhbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVkOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgncmdiJywgMCwgdmFsKTtcblx0fSxcblx0Z3JlZW46IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdyZ2InLCAxLCB2YWwpO1xuXHR9LFxuXHRibHVlOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgncmdiJywgMiwgdmFsKTtcblx0fSxcblx0aHVlOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKHZhbCkge1xuXHRcdFx0dmFsICU9IDM2MDtcblx0XHRcdHZhbCA9IHZhbCA8IDAgPyAzNjAgKyB2YWwgOiB2YWw7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2hzbCcsIDAsIHZhbCk7XG5cdH0sXG5cdHNhdHVyYXRpb246IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdoc2wnLCAxLCB2YWwpO1xuXHR9LFxuXHRsaWdodG5lc3M6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdoc2wnLCAyLCB2YWwpO1xuXHR9LFxuXHRzYXR1cmF0aW9udjogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2hzdicsIDEsIHZhbCk7XG5cdH0sXG5cdHdoaXRlbmVzczogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2h3YicsIDEsIHZhbCk7XG5cdH0sXG5cdGJsYWNrbmVzczogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2h3YicsIDIsIHZhbCk7XG5cdH0sXG5cdHZhbHVlOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnaHN2JywgMiwgdmFsKTtcblx0fSxcblx0Y3lhbjogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2NteWsnLCAwLCB2YWwpO1xuXHR9LFxuXHRtYWdlbnRhOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnY215aycsIDEsIHZhbCk7XG5cdH0sXG5cdHllbGxvdzogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2NteWsnLCAyLCB2YWwpO1xuXHR9LFxuXHRibGFjazogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2NteWsnLCAzLCB2YWwpO1xuXHR9LFxuXG5cdGhleFN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBjb2xvclN0cmluZy5oZXhTdHJpbmcodGhpcy52YWx1ZXMucmdiKTtcblx0fSxcblx0cmdiU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLnJnYlN0cmluZyh0aGlzLnZhbHVlcy5yZ2IsIHRoaXMudmFsdWVzLmFscGhhKTtcblx0fSxcblx0cmdiYVN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBjb2xvclN0cmluZy5yZ2JhU3RyaW5nKHRoaXMudmFsdWVzLnJnYiwgdGhpcy52YWx1ZXMuYWxwaGEpO1xuXHR9LFxuXHRwZXJjZW50U3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLnBlcmNlbnRTdHJpbmcodGhpcy52YWx1ZXMucmdiLCB0aGlzLnZhbHVlcy5hbHBoYSk7XG5cdH0sXG5cdGhzbFN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBjb2xvclN0cmluZy5oc2xTdHJpbmcodGhpcy52YWx1ZXMuaHNsLCB0aGlzLnZhbHVlcy5hbHBoYSk7XG5cdH0sXG5cdGhzbGFTdHJpbmc6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gY29sb3JTdHJpbmcuaHNsYVN0cmluZyh0aGlzLnZhbHVlcy5oc2wsIHRoaXMudmFsdWVzLmFscGhhKTtcblx0fSxcblx0aHdiU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLmh3YlN0cmluZyh0aGlzLnZhbHVlcy5od2IsIHRoaXMudmFsdWVzLmFscGhhKTtcblx0fSxcblx0a2V5d29yZDogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBjb2xvclN0cmluZy5rZXl3b3JkKHRoaXMudmFsdWVzLnJnYiwgdGhpcy52YWx1ZXMuYWxwaGEpO1xuXHR9LFxuXG5cdHJnYk51bWJlcjogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0cmV0dXJuIChyZ2JbMF0gPDwgMTYpIHwgKHJnYlsxXSA8PCA4KSB8IHJnYlsyXTtcblx0fSxcblxuXHRsdW1pbm9zaXR5OiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0dmFyIGx1bSA9IFtdO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgY2hhbiA9IHJnYltpXSAvIDI1NTtcblx0XHRcdGx1bVtpXSA9IChjaGFuIDw9IDAuMDM5MjgpID8gY2hhbiAvIDEyLjkyIDogTWF0aC5wb3coKChjaGFuICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpO1xuXHRcdH1cblx0XHRyZXR1cm4gMC4yMTI2ICogbHVtWzBdICsgMC43MTUyICogbHVtWzFdICsgMC4wNzIyICogbHVtWzJdO1xuXHR9LFxuXG5cdGNvbnRyYXN0OiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuXHRcdHZhciBsdW0xID0gdGhpcy5sdW1pbm9zaXR5KCk7XG5cdFx0dmFyIGx1bTIgPSBjb2xvcjIubHVtaW5vc2l0eSgpO1xuXHRcdGlmIChsdW0xID4gbHVtMikge1xuXHRcdFx0cmV0dXJuIChsdW0xICsgMC4wNSkgLyAobHVtMiArIDAuMDUpO1xuXHRcdH1cblx0XHRyZXR1cm4gKGx1bTIgKyAwLjA1KSAvIChsdW0xICsgMC4wNSk7XG5cdH0sXG5cblx0bGV2ZWw6IGZ1bmN0aW9uIChjb2xvcjIpIHtcblx0XHR2YXIgY29udHJhc3RSYXRpbyA9IHRoaXMuY29udHJhc3QoY29sb3IyKTtcblx0XHRpZiAoY29udHJhc3RSYXRpbyA+PSA3LjEpIHtcblx0XHRcdHJldHVybiAnQUFBJztcblx0XHR9XG5cblx0XHRyZXR1cm4gKGNvbnRyYXN0UmF0aW8gPj0gNC41KSA/ICdBQScgOiAnJztcblx0fSxcblxuXHRkYXJrOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gWUlRIGVxdWF0aW9uIGZyb20gaHR0cDovLzI0d2F5cy5vcmcvMjAxMC9jYWxjdWxhdGluZy1jb2xvci1jb250cmFzdFxuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0dmFyIHlpcSA9IChyZ2JbMF0gKiAyOTkgKyByZ2JbMV0gKiA1ODcgKyByZ2JbMl0gKiAxMTQpIC8gMTAwMDtcblx0XHRyZXR1cm4geWlxIDwgMTI4O1xuXHR9LFxuXG5cdGxpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmRhcmsoKTtcblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IDI1NSAtIHRoaXMudmFsdWVzLnJnYltpXTtcblx0XHR9XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ3JnYicsIHJnYik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0bGlnaHRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMudmFsdWVzLmhzbDtcblx0XHRoc2xbMl0gKz0gaHNsWzJdICogcmF0aW87XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0ZGFya2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy52YWx1ZXMuaHNsO1xuXHRcdGhzbFsyXSAtPSBoc2xbMl0gKiByYXRpbztcblx0XHR0aGlzLnNldFZhbHVlcygnaHNsJywgaHNsKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMudmFsdWVzLmhzbDtcblx0XHRoc2xbMV0gKz0gaHNsWzFdICogcmF0aW87XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0ZGVzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMudmFsdWVzLmhzbDtcblx0XHRoc2xbMV0gLT0gaHNsWzFdICogcmF0aW87XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d2hpdGVuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy52YWx1ZXMuaHdiO1xuXHRcdGh3YlsxXSArPSBod2JbMV0gKiByYXRpbztcblx0XHR0aGlzLnNldFZhbHVlcygnaHdiJywgaHdiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRibGFja2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy52YWx1ZXMuaHdiO1xuXHRcdGh3YlsyXSArPSBod2JbMl0gKiByYXRpbztcblx0XHR0aGlzLnNldFZhbHVlcygnaHdiJywgaHdiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRncmV5c2NhbGU6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy52YWx1ZXMucmdiO1xuXHRcdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3JheXNjYWxlI0NvbnZlcnRpbmdfY29sb3JfdG9fZ3JheXNjYWxlXG5cdFx0dmFyIHZhbCA9IHJnYlswXSAqIDAuMyArIHJnYlsxXSAqIDAuNTkgKyByZ2JbMl0gKiAwLjExO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdyZ2InLCBbdmFsLCB2YWwsIHZhbF0pO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsZWFyZXI6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBhbHBoYSA9IHRoaXMudmFsdWVzLmFscGhhO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdhbHBoYScsIGFscGhhIC0gKGFscGhhICogcmF0aW8pKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRvcGFxdWVyOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgYWxwaGEgPSB0aGlzLnZhbHVlcy5hbHBoYTtcblx0XHR0aGlzLnNldFZhbHVlcygnYWxwaGEnLCBhbHBoYSArIChhbHBoYSAqIHJhdGlvKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoZGVncmVlcykge1xuXHRcdHZhciBoc2wgPSB0aGlzLnZhbHVlcy5oc2w7XG5cdFx0dmFyIGh1ZSA9IChoc2xbMF0gKyBkZWdyZWVzKSAlIDM2MDtcblx0XHRoc2xbMF0gPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCBoc2wpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBQb3J0ZWQgZnJvbSBzYXNzIGltcGxlbWVudGF0aW9uIGluIENcblx0ICogaHR0cHM6Ly9naXRodWIuY29tL3Nhc3MvbGlic2Fzcy9ibG9iLzBlNmI0YTI4NTAwOTIzNTZhYTNlY2UwN2M2YjI0OWYwMjIxY2FjZWQvZnVuY3Rpb25zLmNwcCNMMjA5XG5cdCAqL1xuXHRtaXg6IGZ1bmN0aW9uIChtaXhpbkNvbG9yLCB3ZWlnaHQpIHtcblx0XHR2YXIgY29sb3IxID0gdGhpcztcblx0XHR2YXIgY29sb3IyID0gbWl4aW5Db2xvcjtcblx0XHR2YXIgcCA9IHdlaWdodCA9PT0gdW5kZWZpbmVkID8gMC41IDogd2VpZ2h0O1xuXG5cdFx0dmFyIHcgPSAyICogcCAtIDE7XG5cdFx0dmFyIGEgPSBjb2xvcjEuYWxwaGEoKSAtIGNvbG9yMi5hbHBoYSgpO1xuXG5cdFx0dmFyIHcxID0gKCgodyAqIGEgPT09IC0xKSA/IHcgOiAodyArIGEpIC8gKDEgKyB3ICogYSkpICsgMSkgLyAyLjA7XG5cdFx0dmFyIHcyID0gMSAtIHcxO1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5yZ2IoXG5cdFx0XHRcdHcxICogY29sb3IxLnJlZCgpICsgdzIgKiBjb2xvcjIucmVkKCksXG5cdFx0XHRcdHcxICogY29sb3IxLmdyZWVuKCkgKyB3MiAqIGNvbG9yMi5ncmVlbigpLFxuXHRcdFx0XHR3MSAqIGNvbG9yMS5ibHVlKCkgKyB3MiAqIGNvbG9yMi5ibHVlKClcblx0XHRcdClcblx0XHRcdC5hbHBoYShjb2xvcjEuYWxwaGEoKSAqIHAgKyBjb2xvcjIuYWxwaGEoKSAqICgxIC0gcCkpO1xuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnJnYigpO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gTk9URShTQik6IHVzaW5nIG5vZGUtY2xvbmUgY3JlYXRlcyBhIGRlcGVuZGVuY3kgdG8gQnVmZmVyIHdoZW4gdXNpbmcgYnJvd3NlcmlmeSxcblx0XHQvLyBtYWtpbmcgdGhlIGZpbmFsIGJ1aWxkIHdheSB0byBiaWcgdG8gZW1iZWQgaW4gQ2hhcnQuanMuIFNvIGxldCdzIGRvIGl0IG1hbnVhbGx5LFxuXHRcdC8vIGFzc3VtaW5nIHRoYXQgdmFsdWVzIHRvIGNsb25lIGFyZSAxIGRpbWVuc2lvbiBhcnJheXMgY29udGFpbmluZyBvbmx5IG51bWJlcnMsXG5cdFx0Ly8gZXhjZXB0ICdhbHBoYScgd2hpY2ggaXMgYSBudW1iZXIuXG5cdFx0dmFyIHJlc3VsdCA9IG5ldyBDb2xvcigpO1xuXHRcdHZhciBzb3VyY2UgPSB0aGlzLnZhbHVlcztcblx0XHR2YXIgdGFyZ2V0ID0gcmVzdWx0LnZhbHVlcztcblx0XHR2YXIgdmFsdWUsIHR5cGU7XG5cblx0XHRmb3IgKHZhciBwcm9wIGluIHNvdXJjZSkge1xuXHRcdFx0aWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuXHRcdFx0XHR2YWx1ZSA9IHNvdXJjZVtwcm9wXTtcblx0XHRcdFx0dHlwZSA9ICh7fSkudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cdFx0XHRcdGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG5cdFx0XHRcdFx0dGFyZ2V0W3Byb3BdID0gdmFsdWUuc2xpY2UoMCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgTnVtYmVyXScpIHtcblx0XHRcdFx0XHR0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNvbG9yIHZhbHVlOicsIHZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zcGFjZXMgPSB7XG5cdHJnYjogWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddLFxuXHRoc2w6IFsnaHVlJywgJ3NhdHVyYXRpb24nLCAnbGlnaHRuZXNzJ10sXG5cdGhzdjogWydodWUnLCAnc2F0dXJhdGlvbicsICd2YWx1ZSddLFxuXHRod2I6IFsnaHVlJywgJ3doaXRlbmVzcycsICdibGFja25lc3MnXSxcblx0Y215azogWydjeWFuJywgJ21hZ2VudGEnLCAneWVsbG93JywgJ2JsYWNrJ11cbn07XG5cbkNvbG9yLnByb3RvdHlwZS5tYXhlcyA9IHtcblx0cmdiOiBbMjU1LCAyNTUsIDI1NV0sXG5cdGhzbDogWzM2MCwgMTAwLCAxMDBdLFxuXHRoc3Y6IFszNjAsIDEwMCwgMTAwXSxcblx0aHdiOiBbMzYwLCAxMDAsIDEwMF0sXG5cdGNteWs6IFsxMDAsIDEwMCwgMTAwLCAxMDBdXG59O1xuXG5Db2xvci5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24gKHNwYWNlKSB7XG5cdHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcblx0dmFyIHZhbHMgPSB7fTtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFsc1tzcGFjZS5jaGFyQXQoaSldID0gdmFsdWVzW3NwYWNlXVtpXTtcblx0fVxuXG5cdGlmICh2YWx1ZXMuYWxwaGEgIT09IDEpIHtcblx0XHR2YWxzLmEgPSB2YWx1ZXMuYWxwaGE7XG5cdH1cblxuXHQvLyB7cjogMjU1LCBnOiAyNTUsIGI6IDI1NSwgYTogMC40fVxuXHRyZXR1cm4gdmFscztcbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zZXRWYWx1ZXMgPSBmdW5jdGlvbiAoc3BhY2UsIHZhbHMpIHtcblx0dmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuXHR2YXIgc3BhY2VzID0gdGhpcy5zcGFjZXM7XG5cdHZhciBtYXhlcyA9IHRoaXMubWF4ZXM7XG5cdHZhciBhbHBoYSA9IDE7XG5cdHZhciBpO1xuXG5cdHRoaXMudmFsaWQgPSB0cnVlO1xuXG5cdGlmIChzcGFjZSA9PT0gJ2FscGhhJykge1xuXHRcdGFscGhhID0gdmFscztcblx0fSBlbHNlIGlmICh2YWxzLmxlbmd0aCkge1xuXHRcdC8vIFsxMCwgMTAsIDEwXVxuXHRcdHZhbHVlc1tzcGFjZV0gPSB2YWxzLnNsaWNlKDAsIHNwYWNlLmxlbmd0aCk7XG5cdFx0YWxwaGEgPSB2YWxzW3NwYWNlLmxlbmd0aF07XG5cdH0gZWxzZSBpZiAodmFsc1tzcGFjZS5jaGFyQXQoMCldICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyB7cjogMTAsIGc6IDEwLCBiOiAxMH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhbHVlc1tzcGFjZV1baV0gPSB2YWxzW3NwYWNlLmNoYXJBdChpKV07XG5cdFx0fVxuXG5cdFx0YWxwaGEgPSB2YWxzLmE7XG5cdH0gZWxzZSBpZiAodmFsc1tzcGFjZXNbc3BhY2VdWzBdXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8ge3JlZDogMTAsIGdyZWVuOiAxMCwgYmx1ZTogMTB9XG5cdFx0dmFyIGNoYW5zID0gc3BhY2VzW3NwYWNlXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFsdWVzW3NwYWNlXVtpXSA9IHZhbHNbY2hhbnNbaV1dO1xuXHRcdH1cblxuXHRcdGFscGhhID0gdmFscy5hbHBoYTtcblx0fVxuXG5cdHZhbHVlcy5hbHBoYSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChhbHBoYSA9PT0gdW5kZWZpbmVkID8gdmFsdWVzLmFscGhhIDogYWxwaGEpKSk7XG5cblx0aWYgKHNwYWNlID09PSAnYWxwaGEnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dmFyIGNhcHBlZDtcblxuXHQvLyBjYXAgdmFsdWVzIG9mIHRoZSBzcGFjZSBwcmlvciBjb252ZXJ0aW5nIGFsbCB2YWx1ZXNcblx0Zm9yIChpID0gMDsgaSA8IHNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y2FwcGVkID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obWF4ZXNbc3BhY2VdW2ldLCB2YWx1ZXNbc3BhY2VdW2ldKSk7XG5cdFx0dmFsdWVzW3NwYWNlXVtpXSA9IE1hdGgucm91bmQoY2FwcGVkKTtcblx0fVxuXG5cdC8vIGNvbnZlcnQgdG8gYWxsIHRoZSBvdGhlciBjb2xvciBzcGFjZXNcblx0Zm9yICh2YXIgc25hbWUgaW4gc3BhY2VzKSB7XG5cdFx0aWYgKHNuYW1lICE9PSBzcGFjZSkge1xuXHRcdFx0dmFsdWVzW3NuYW1lXSA9IGNvbG9yQ29udmVydFtzcGFjZV1bc25hbWVdKHZhbHVlc1tzcGFjZV0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcblxuQ29sb3IucHJvdG90eXBlLnNldFNwYWNlID0gZnVuY3Rpb24gKHNwYWNlLCBhcmdzKSB7XG5cdHZhciB2YWxzID0gYXJnc1swXTtcblxuXHRpZiAodmFscyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gY29sb3IucmdiKClcblx0XHRyZXR1cm4gdGhpcy5nZXRWYWx1ZXMoc3BhY2UpO1xuXHR9XG5cblx0Ly8gY29sb3IucmdiKDEwLCAxMCwgMTApXG5cdGlmICh0eXBlb2YgdmFscyA9PT0gJ251bWJlcicpIHtcblx0XHR2YWxzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7XG5cdH1cblxuXHR0aGlzLnNldFZhbHVlcyhzcGFjZSwgdmFscyk7XG5cdHJldHVybiB0aGlzO1xufTtcblxuQ29sb3IucHJvdG90eXBlLnNldENoYW5uZWwgPSBmdW5jdGlvbiAoc3BhY2UsIGluZGV4LCB2YWwpIHtcblx0dmFyIHN2YWx1ZXMgPSB0aGlzLnZhbHVlc1tzcGFjZV07XG5cdGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIGNvbG9yLnJlZCgpXG5cdFx0cmV0dXJuIHN2YWx1ZXNbaW5kZXhdO1xuXHR9IGVsc2UgaWYgKHZhbCA9PT0gc3ZhbHVlc1tpbmRleF0pIHtcblx0XHQvLyBjb2xvci5yZWQoY29sb3IucmVkKCkpXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvLyBjb2xvci5yZWQoMTAwKVxuXHRzdmFsdWVzW2luZGV4XSA9IHZhbDtcblx0dGhpcy5zZXRWYWx1ZXMoc3BhY2UsIHN2YWx1ZXMpO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG5cdHdpbmRvdy5Db2xvciA9IENvbG9yO1xufVxuXG52YXIgY2hhcnRqc0NvbG9yID0gQ29sb3I7XG5cbi8qKlxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzXG4gKi9cbnZhciBoZWxwZXJzID0ge1xuXHQvKipcblx0ICogQW4gZW1wdHkgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIGZvciBvcHRpb25hbCBjYWxsYmFjay5cblx0ICovXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSB1bmlxdWUgaWQsIHNlcXVlbnRpYWxseSBnZW5lcmF0ZWQgZnJvbSBhIGdsb2JhbCB2YXJpYWJsZS5cblx0ICogQHJldHVybnMge251bWJlcn1cblx0ICogQGZ1bmN0aW9uXG5cdCAqL1xuXHR1aWQ6IChmdW5jdGlvbigpIHtcblx0XHR2YXIgaWQgPSAwO1xuXHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBpZCsrO1xuXHRcdH07XG5cdH0oKSksXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIG5laXRoZXIgbnVsbCBub3IgdW5kZWZpbmVkLCBlbHNlIHJldHVybnMgZmFsc2UuXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEBzaW5jZSAyLjcuMFxuXHQgKi9cblx0aXNOdWxsT3JVbmRlZjogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRyZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgKGluY2x1ZGluZyB0eXBlZCBhcnJheXMpLCBlbHNlIHJldHVybnMgZmFsc2UuXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblx0aXNBcnJheTogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcblx0XHRpZiAodHlwZS5zdWJzdHIoMCwgNykgPT09ICdbb2JqZWN0JyAmJiB0eXBlLnN1YnN0cigtNikgPT09ICdBcnJheV0nKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QgKGV4Y2x1ZGluZyBudWxsKSwgZWxzZSByZXR1cm5zIGZhbHNlLlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHRlc3QuXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAc2luY2UgMi43LjBcblx0ICovXG5cdGlzT2JqZWN0OiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIHJldHVybnMgZmFsc2Vcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSAgLSBUaGUgdmFsdWUgdG8gdGVzdC5cblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRpc0Zpbml0ZTogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRyZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpICYmIGlzRmluaXRlKHZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBgdmFsdWVgIGlmIGRlZmluZWQsIGVsc2UgcmV0dXJucyBgZGVmYXVsdFZhbHVlYC5cblx0ICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgZGVmaW5lZC5cblx0ICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGB2YWx1ZWAgaXMgdW5kZWZpbmVkLlxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICovXG5cdHZhbHVlT3JEZWZhdWx0OiBmdW5jdGlvbih2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB2YWx1ZSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBpbiBhcnJheSBpZiBkZWZpbmVkLCBlbHNlIHJldHVybnMgYGRlZmF1bHRWYWx1ZWAuXG5cdCAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIC0gVGhlIGFycmF5IHRvIGxvb2t1cCBmb3IgdmFsdWUgYXQgYGluZGV4YC5cblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGluIGB2YWx1ZWAgdG8gbG9va3VwIGZvciB2YWx1ZS5cblx0ICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGB2YWx1ZVtpbmRleF1gIGlzIHVuZGVmaW5lZC5cblx0ICogQHJldHVybnMgeyp9XG5cdCAqL1xuXHR2YWx1ZUF0SW5kZXhPckRlZmF1bHQ6IGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgZGVmYXVsdFZhbHVlKSB7XG5cdFx0cmV0dXJuIGhlbHBlcnMudmFsdWVPckRlZmF1bHQoaGVscGVycy5pc0FycmF5KHZhbHVlKSA/IHZhbHVlW2luZGV4XSA6IHZhbHVlLCBkZWZhdWx0VmFsdWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxscyBgZm5gIHdpdGggdGhlIGdpdmVuIGBhcmdzYCBpbiB0aGUgc2NvcGUgZGVmaW5lZCBieSBgdGhpc0FyZ2AgYW5kIHJldHVybnMgdGhlXG5cdCAqIHZhbHVlIHJldHVybmVkIGJ5IGBmbmAuIElmIGBmbmAgaXMgbm90IGEgZnVuY3Rpb24sIHRoaXMgbWV0aG9kIHJldHVybnMgdW5kZWZpbmVkLlxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjYWxsLlxuXHQgKiBAcGFyYW0ge0FycmF5fHVuZGVmaW5lZHxudWxsfSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB3aXRoIHdoaWNoIGBmbmAgc2hvdWxkIGJlIGNhbGxlZC5cblx0ICogQHBhcmFtIHtvYmplY3R9IFt0aGlzQXJnXSAtIFRoZSB2YWx1ZSBvZiBgdGhpc2AgcHJvdmlkZWQgZm9yIHRoZSBjYWxsIHRvIGBmbmAuXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKi9cblx0Y2FsbGJhY2s6IGZ1bmN0aW9uKGZuLCBhcmdzLCB0aGlzQXJnKSB7XG5cdFx0aWYgKGZuICYmIHR5cGVvZiBmbi5jYWxsID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRyZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBOb3RlKFNCKSBmb3IgcGVyZm9ybWFuY2Ugc2FrZSwgdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGxvb3BhYmxlIHR5cGVcblx0ICogaXMgdW5rbm93biBvciBpbiBub25lIGludGVuc2l2ZSBjb2RlIChub3QgY2FsbGVkIG9mdGVuIGFuZCBzbWFsbCBsb29wYWJsZSkuIEVsc2Vcblx0ICogaXQncyBwcmVmZXJhYmxlIHRvIHVzZSBhIHJlZ3VsYXIgZm9yKCkgbG9vcCBhbmQgc2F2ZSBleHRyYSBmdW5jdGlvbiBjYWxscy5cblx0ICogQHBhcmFtIHtvYmplY3R8QXJyYXl9IGxvb3BhYmxlIC0gVGhlIG9iamVjdCBvciBhcnJheSB0byBiZSBpdGVyYXRlZC5cblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpdGVtLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW3RoaXNBcmddIC0gVGhlIHZhbHVlIG9mIGB0aGlzYCBwcm92aWRlZCBmb3IgdGhlIGNhbGwgdG8gYGZuYC5cblx0ICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZV0gLSBJZiB0cnVlLCBpdGVyYXRlcyBiYWNrd2FyZCBvbiB0aGUgbG9vcGFibGUuXG5cdCAqL1xuXHRlYWNoOiBmdW5jdGlvbihsb29wYWJsZSwgZm4sIHRoaXNBcmcsIHJldmVyc2UpIHtcblx0XHR2YXIgaSwgbGVuLCBrZXlzO1xuXHRcdGlmIChoZWxwZXJzLmlzQXJyYXkobG9vcGFibGUpKSB7XG5cdFx0XHRsZW4gPSBsb29wYWJsZS5sZW5ndGg7XG5cdFx0XHRpZiAocmV2ZXJzZSkge1xuXHRcdFx0XHRmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0XHRcdGZuLmNhbGwodGhpc0FyZywgbG9vcGFibGVbaV0sIGkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0XHRmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2ldLCBpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaGVscGVycy5pc09iamVjdChsb29wYWJsZSkpIHtcblx0XHRcdGtleXMgPSBPYmplY3Qua2V5cyhsb29wYWJsZSk7XG5cdFx0XHRsZW4gPSBrZXlzLmxlbmd0aDtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2tleXNbaV1dLCBrZXlzW2ldKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYGEwYCBhbmQgYGExYCBhcnJheXMgaGF2ZSB0aGUgc2FtZSBjb250ZW50LCBlbHNlIHJldHVybnMgZmFsc2UuXG5cdCAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0XG5cdCAqIEBwYXJhbSB7QXJyYXl9IGEwIC0gVGhlIGFycmF5IHRvIGNvbXBhcmVcblx0ICogQHBhcmFtIHtBcnJheX0gYTEgLSBUaGUgYXJyYXkgdG8gY29tcGFyZVxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdGFycmF5RXF1YWxzOiBmdW5jdGlvbihhMCwgYTEpIHtcblx0XHR2YXIgaSwgaWxlbiwgdjAsIHYxO1xuXG5cdFx0aWYgKCFhMCB8fCAhYTEgfHwgYTAubGVuZ3RoICE9PSBhMS5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gYTAubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHR2MCA9IGEwW2ldO1xuXHRcdFx0djEgPSBhMVtpXTtcblxuXHRcdFx0aWYgKHYwIGluc3RhbmNlb2YgQXJyYXkgJiYgdjEgaW5zdGFuY2VvZiBBcnJheSkge1xuXHRcdFx0XHRpZiAoIWhlbHBlcnMuYXJyYXlFcXVhbHModjAsIHYxKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh2MCAhPT0gdjEpIHtcblx0XHRcdFx0Ly8gTk9URTogdHdvIGRpZmZlcmVudCBvYmplY3QgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZXF1YWw6IHt4OjIwfSAhPSB7eDoyMH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIGBzb3VyY2VgIHdpdGhvdXQga2VlcGluZyByZWZlcmVuY2VzIG9uIG9iamVjdHMgYW5kIGFycmF5cy5cblx0ICogQHBhcmFtIHsqfSBzb3VyY2UgLSBUaGUgdmFsdWUgdG8gY2xvbmUuXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKi9cblx0Y2xvbmU6IGZ1bmN0aW9uKHNvdXJjZSkge1xuXHRcdGlmIChoZWxwZXJzLmlzQXJyYXkoc291cmNlKSkge1xuXHRcdFx0cmV0dXJuIHNvdXJjZS5tYXAoaGVscGVycy5jbG9uZSk7XG5cdFx0fVxuXG5cdFx0aWYgKGhlbHBlcnMuaXNPYmplY3Qoc291cmNlKSkge1xuXHRcdFx0dmFyIHRhcmdldCA9IHt9O1xuXHRcdFx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXHRcdFx0dmFyIGtsZW4gPSBrZXlzLmxlbmd0aDtcblx0XHRcdHZhciBrID0gMDtcblxuXHRcdFx0Zm9yICg7IGsgPCBrbGVuOyArK2spIHtcblx0XHRcdFx0dGFyZ2V0W2tleXNba11dID0gaGVscGVycy5jbG9uZShzb3VyY2Vba2V5c1trXV0pO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXHRcdH1cblxuXHRcdHJldHVybiBzb3VyY2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoZSBkZWZhdWx0IG1lcmdlciB3aGVuIENoYXJ0LmhlbHBlcnMubWVyZ2UgaXMgY2FsbGVkIHdpdGhvdXQgbWVyZ2VyIG9wdGlvbi5cblx0ICogTm90ZShTQik6IGFsc28gdXNlZCBieSBtZXJnZUNvbmZpZyBhbmQgbWVyZ2VTY2FsZUNvbmZpZyBhcyBmYWxsYmFjay5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9tZXJnZXI6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcblx0XHR2YXIgdHZhbCA9IHRhcmdldFtrZXldO1xuXHRcdHZhciBzdmFsID0gc291cmNlW2tleV07XG5cblx0XHRpZiAoaGVscGVycy5pc09iamVjdCh0dmFsKSAmJiBoZWxwZXJzLmlzT2JqZWN0KHN2YWwpKSB7XG5cdFx0XHRoZWxwZXJzLm1lcmdlKHR2YWwsIHN2YWwsIG9wdGlvbnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YXJnZXRba2V5XSA9IGhlbHBlcnMuY2xvbmUoc3ZhbCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXJnZXMgc291cmNlW2tleV0gaW4gdGFyZ2V0W2tleV0gb25seSBpZiB0YXJnZXRba2V5XSBpcyB1bmRlZmluZWQuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfbWVyZ2VySWY6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBzb3VyY2UpIHtcblx0XHR2YXIgdHZhbCA9IHRhcmdldFtrZXldO1xuXHRcdHZhciBzdmFsID0gc291cmNlW2tleV07XG5cblx0XHRpZiAoaGVscGVycy5pc09iamVjdCh0dmFsKSAmJiBoZWxwZXJzLmlzT2JqZWN0KHN2YWwpKSB7XG5cdFx0XHRoZWxwZXJzLm1lcmdlSWYodHZhbCwgc3ZhbCk7XG5cdFx0fSBlbHNlIGlmICghdGFyZ2V0Lmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdHRhcmdldFtrZXldID0gaGVscGVycy5jbG9uZShzdmFsKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlY3Vyc2l2ZWx5IGRlZXAgY29waWVzIGBzb3VyY2VgIHByb3BlcnRpZXMgaW50byBgdGFyZ2V0YCB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXG5cdCAqIElNUE9SVEFOVDogYHRhcmdldGAgaXMgbm90IGNsb25lZCBhbmQgd2lsbCBiZSB1cGRhdGVkIHdpdGggYHNvdXJjZWAgcHJvcGVydGllcy5cblx0ICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IGluIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSBtZXJnZWQgaW50by5cblx0ICogQHBhcmFtIHtvYmplY3R8b2JqZWN0W119IHNvdXJjZSAtIE9iamVjdChzKSB0byBtZXJnZSBpbnRvIGB0YXJnZXRgLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gTWVyZ2luZyBvcHRpb25zOlxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbb3B0aW9ucy5tZXJnZXJdIC0gVGhlIG1lcmdlIG1ldGhvZCAoa2V5LCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucylcblx0ICogQHJldHVybnMge29iamVjdH0gVGhlIGB0YXJnZXRgIG9iamVjdC5cblx0ICovXG5cdG1lcmdlOiBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdHZhciBzb3VyY2VzID0gaGVscGVycy5pc0FycmF5KHNvdXJjZSkgPyBzb3VyY2UgOiBbc291cmNlXTtcblx0XHR2YXIgaWxlbiA9IHNvdXJjZXMubGVuZ3RoO1xuXHRcdHZhciBtZXJnZSwgaSwga2V5cywga2xlbiwgaztcblxuXHRcdGlmICghaGVscGVycy5pc09iamVjdCh0YXJnZXQpKSB7XG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXHRcdH1cblxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRcdG1lcmdlID0gb3B0aW9ucy5tZXJnZXIgfHwgaGVscGVycy5fbWVyZ2VyO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0c291cmNlID0gc291cmNlc1tpXTtcblx0XHRcdGlmICghaGVscGVycy5pc09iamVjdChzb3VyY2UpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblx0XHRcdGZvciAoayA9IDAsIGtsZW4gPSBrZXlzLmxlbmd0aDsgayA8IGtsZW47ICsraykge1xuXHRcdFx0XHRtZXJnZShrZXlzW2tdLCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldDtcblx0fSxcblxuXHQvKipcblx0ICogUmVjdXJzaXZlbHkgZGVlcCBjb3BpZXMgYHNvdXJjZWAgcHJvcGVydGllcyBpbnRvIGB0YXJnZXRgICpvbmx5KiBpZiBub3QgZGVmaW5lZCBpbiB0YXJnZXQuXG5cdCAqIElNUE9SVEFOVDogYHRhcmdldGAgaXMgbm90IGNsb25lZCBhbmQgd2lsbCBiZSB1cGRhdGVkIHdpdGggYHNvdXJjZWAgcHJvcGVydGllcy5cblx0ICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IGluIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSBtZXJnZWQgaW50by5cblx0ICogQHBhcmFtIHtvYmplY3R8b2JqZWN0W119IHNvdXJjZSAtIE9iamVjdChzKSB0byBtZXJnZSBpbnRvIGB0YXJnZXRgLlxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgYHRhcmdldGAgb2JqZWN0LlxuXHQgKi9cblx0bWVyZ2VJZjogZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHtcblx0XHRyZXR1cm4gaGVscGVycy5tZXJnZSh0YXJnZXQsIHNvdXJjZSwge21lcmdlcjogaGVscGVycy5fbWVyZ2VySWZ9KTtcblx0fSxcblxuXHQvKipcblx0ICogQXBwbGllcyB0aGUgY29udGVudHMgb2YgdHdvIG9yIG1vcmUgb2JqZWN0cyB0b2dldGhlciBpbnRvIHRoZSBmaXJzdCBvYmplY3QuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCBpbiB3aGljaCBhbGwgb2JqZWN0cyBhcmUgbWVyZ2VkIGludG8uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBhcmcxIC0gT2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIG1lcmdlIGluIHRhcmdldC5cblx0ICogQHBhcmFtIHtvYmplY3R9IGFyZ04gLSBBZGRpdGlvbmFsIG9iamVjdHMgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIG1lcmdlIGluIHRhcmdldC5cblx0ICogQHJldHVybnMge29iamVjdH0gVGhlIGB0YXJnZXRgIG9iamVjdC5cblx0ICovXG5cdGV4dGVuZDogZnVuY3Rpb24odGFyZ2V0KSB7XG5cdFx0dmFyIHNldEZuID0gZnVuY3Rpb24odmFsdWUsIGtleSkge1xuXHRcdFx0dGFyZ2V0W2tleV0gPSB2YWx1ZTtcblx0XHR9O1xuXHRcdGZvciAodmFyIGkgPSAxLCBpbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0aGVscGVycy5lYWNoKGFyZ3VtZW50c1tpXSwgc2V0Rm4pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBCYXNpYyBqYXZhc2NyaXB0IGluaGVyaXRhbmNlIGJhc2VkIG9uIHRoZSBtb2RlbCBjcmVhdGVkIGluIEJhY2tib25lLmpzXG5cdCAqL1xuXHRpbmhlcml0czogZnVuY3Rpb24oZXh0ZW5zaW9ucykge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIENoYXJ0RWxlbWVudCA9IChleHRlbnNpb25zICYmIGV4dGVuc2lvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnN0cnVjdG9yJykpID8gZXh0ZW5zaW9ucy5jb25zdHJ1Y3RvciA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIG1lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0fTtcblxuXHRcdHZhciBTdXJyb2dhdGUgPSBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuY29uc3RydWN0b3IgPSBDaGFydEVsZW1lbnQ7XG5cdFx0fTtcblxuXHRcdFN1cnJvZ2F0ZS5wcm90b3R5cGUgPSBtZS5wcm90b3R5cGU7XG5cdFx0Q2hhcnRFbGVtZW50LnByb3RvdHlwZSA9IG5ldyBTdXJyb2dhdGUoKTtcblx0XHRDaGFydEVsZW1lbnQuZXh0ZW5kID0gaGVscGVycy5pbmhlcml0cztcblxuXHRcdGlmIChleHRlbnNpb25zKSB7XG5cdFx0XHRoZWxwZXJzLmV4dGVuZChDaGFydEVsZW1lbnQucHJvdG90eXBlLCBleHRlbnNpb25zKTtcblx0XHR9XG5cblx0XHRDaGFydEVsZW1lbnQuX19zdXBlcl9fID0gbWUucHJvdG90eXBlO1xuXHRcdHJldHVybiBDaGFydEVsZW1lbnQ7XG5cdH1cbn07XG5cbnZhciBoZWxwZXJzX2NvcmUgPSBoZWxwZXJzO1xuXG4vLyBERVBSRUNBVElPTlNcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIENoYXJ0LmhlbHBlcnMuY2FsbGJhY2sgaW5zdGVhZC5cbiAqIEBmdW5jdGlvbiBDaGFydC5oZWxwZXJzLmNhbGxDYWxsYmFja1xuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjYuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVycy5jYWxsQ2FsbGJhY2sgPSBoZWxwZXJzLmNhbGxiYWNrO1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgaW5zdGVhZC5cbiAqIEFycmF5LnByb3RvdHlwZS5pbmRleE9mIGNvbXBhdGliaWxpdHk6IENocm9tZSwgT3BlcmEsIFNhZmFyaSwgRkYxLjUrLCBJRTkrXG4gKiBAZnVuY3Rpb24gQ2hhcnQuaGVscGVycy5pbmRleE9mXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNy4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5oZWxwZXJzLmluZGV4T2YgPSBmdW5jdGlvbihhcnJheSwgaXRlbSwgZnJvbUluZGV4KSB7XG5cdHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGFycmF5LCBpdGVtLCBmcm9tSW5kZXgpO1xufTtcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIENoYXJ0LmhlbHBlcnMudmFsdWVPckRlZmF1bHQgaW5zdGVhZC5cbiAqIEBmdW5jdGlvbiBDaGFydC5oZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0XG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNy4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5oZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdDtcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIENoYXJ0LmhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0IGluc3RlYWQuXG4gKiBAZnVuY3Rpb24gQ2hhcnQuaGVscGVycy5nZXRWYWx1ZUF0SW5kZXhPckRlZmF1bHRcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi43LjBcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbmhlbHBlcnMuZ2V0VmFsdWVBdEluZGV4T3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQ7XG5cbi8qKlxuICogRWFzaW5nIGZ1bmN0aW9ucyBhZGFwdGVkIGZyb20gUm9iZXJ0IFBlbm5lcidzIGVhc2luZyBlcXVhdGlvbnMuXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuZWFzaW5nRWZmZWN0c1xuICogQHNlZSBodHRwOi8vd3d3LnJvYmVydHBlbm5lci5jb20vZWFzaW5nL1xuICovXG52YXIgZWZmZWN0cyA9IHtcblx0bGluZWFyOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIHQ7XG5cdH0sXG5cblx0ZWFzZUluUXVhZDogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiB0ICogdDtcblx0fSxcblxuXHRlYXNlT3V0UXVhZDogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAtdCAqICh0IC0gMik7XG5cdH0sXG5cblx0ZWFzZUluT3V0UXVhZDogZnVuY3Rpb24odCkge1xuXHRcdGlmICgodCAvPSAwLjUpIDwgMSkge1xuXHRcdFx0cmV0dXJuIDAuNSAqIHQgKiB0O1xuXHRcdH1cblx0XHRyZXR1cm4gLTAuNSAqICgoLS10KSAqICh0IC0gMikgLSAxKTtcblx0fSxcblxuXHRlYXNlSW5DdWJpYzogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiB0ICogdCAqIHQ7XG5cdH0sXG5cblx0ZWFzZU91dEN1YmljOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuICh0ID0gdCAtIDEpICogdCAqIHQgKyAxO1xuXHR9LFxuXG5cdGVhc2VJbk91dEN1YmljOiBmdW5jdGlvbih0KSB7XG5cdFx0aWYgKCh0IC89IDAuNSkgPCAxKSB7XG5cdFx0XHRyZXR1cm4gMC41ICogdCAqIHQgKiB0O1xuXHRcdH1cblx0XHRyZXR1cm4gMC41ICogKCh0IC09IDIpICogdCAqIHQgKyAyKTtcblx0fSxcblxuXHRlYXNlSW5RdWFydDogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiB0ICogdCAqIHQgKiB0O1xuXHR9LFxuXG5cdGVhc2VPdXRRdWFydDogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAtKCh0ID0gdCAtIDEpICogdCAqIHQgKiB0IC0gMSk7XG5cdH0sXG5cblx0ZWFzZUluT3V0UXVhcnQ6IGZ1bmN0aW9uKHQpIHtcblx0XHRpZiAoKHQgLz0gMC41KSA8IDEpIHtcblx0XHRcdHJldHVybiAwLjUgKiB0ICogdCAqIHQgKiB0O1xuXHRcdH1cblx0XHRyZXR1cm4gLTAuNSAqICgodCAtPSAyKSAqIHQgKiB0ICogdCAtIDIpO1xuXHR9LFxuXG5cdGVhc2VJblF1aW50OiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIHQgKiB0ICogdCAqIHQgKiB0O1xuXHR9LFxuXG5cdGVhc2VPdXRRdWludDogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAodCA9IHQgLSAxKSAqIHQgKiB0ICogdCAqIHQgKyAxO1xuXHR9LFxuXG5cdGVhc2VJbk91dFF1aW50OiBmdW5jdGlvbih0KSB7XG5cdFx0aWYgKCh0IC89IDAuNSkgPCAxKSB7XG5cdFx0XHRyZXR1cm4gMC41ICogdCAqIHQgKiB0ICogdCAqIHQ7XG5cdFx0fVxuXHRcdHJldHVybiAwLjUgKiAoKHQgLT0gMikgKiB0ICogdCAqIHQgKiB0ICsgMik7XG5cdH0sXG5cblx0ZWFzZUluU2luZTogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAtTWF0aC5jb3ModCAqIChNYXRoLlBJIC8gMikpICsgMTtcblx0fSxcblxuXHRlYXNlT3V0U2luZTogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiBNYXRoLnNpbih0ICogKE1hdGguUEkgLyAyKSk7XG5cdH0sXG5cblx0ZWFzZUluT3V0U2luZTogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAtMC41ICogKE1hdGguY29zKE1hdGguUEkgKiB0KSAtIDEpO1xuXHR9LFxuXG5cdGVhc2VJbkV4cG86IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gKHQgPT09IDApID8gMCA6IE1hdGgucG93KDIsIDEwICogKHQgLSAxKSk7XG5cdH0sXG5cblx0ZWFzZU91dEV4cG86IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gKHQgPT09IDEpID8gMSA6IC1NYXRoLnBvdygyLCAtMTAgKiB0KSArIDE7XG5cdH0sXG5cblx0ZWFzZUluT3V0RXhwbzogZnVuY3Rpb24odCkge1xuXHRcdGlmICh0ID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cdFx0aWYgKHQgPT09IDEpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0XHRpZiAoKHQgLz0gMC41KSA8IDEpIHtcblx0XHRcdHJldHVybiAwLjUgKiBNYXRoLnBvdygyLCAxMCAqICh0IC0gMSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gMC41ICogKC1NYXRoLnBvdygyLCAtMTAgKiAtLXQpICsgMik7XG5cdH0sXG5cblx0ZWFzZUluQ2lyYzogZnVuY3Rpb24odCkge1xuXHRcdGlmICh0ID49IDEpIHtcblx0XHRcdHJldHVybiB0O1xuXHRcdH1cblx0XHRyZXR1cm4gLShNYXRoLnNxcnQoMSAtIHQgKiB0KSAtIDEpO1xuXHR9LFxuXG5cdGVhc2VPdXRDaXJjOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIE1hdGguc3FydCgxIC0gKHQgPSB0IC0gMSkgKiB0KTtcblx0fSxcblxuXHRlYXNlSW5PdXRDaXJjOiBmdW5jdGlvbih0KSB7XG5cdFx0aWYgKCh0IC89IDAuNSkgPCAxKSB7XG5cdFx0XHRyZXR1cm4gLTAuNSAqIChNYXRoLnNxcnQoMSAtIHQgKiB0KSAtIDEpO1xuXHRcdH1cblx0XHRyZXR1cm4gMC41ICogKE1hdGguc3FydCgxIC0gKHQgLT0gMikgKiB0KSArIDEpO1xuXHR9LFxuXG5cdGVhc2VJbkVsYXN0aWM6IGZ1bmN0aW9uKHQpIHtcblx0XHR2YXIgcyA9IDEuNzAxNTg7XG5cdFx0dmFyIHAgPSAwO1xuXHRcdHZhciBhID0gMTtcblx0XHRpZiAodCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXHRcdGlmICh0ID09PSAxKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cdFx0aWYgKCFwKSB7XG5cdFx0XHRwID0gMC4zO1xuXHRcdH1cblx0XHRpZiAoYSA8IDEpIHtcblx0XHRcdGEgPSAxO1xuXHRcdFx0cyA9IHAgLyA0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzID0gcCAvICgyICogTWF0aC5QSSkgKiBNYXRoLmFzaW4oMSAvIGEpO1xuXHRcdH1cblx0XHRyZXR1cm4gLShhICogTWF0aC5wb3coMiwgMTAgKiAodCAtPSAxKSkgKiBNYXRoLnNpbigodCAtIHMpICogKDIgKiBNYXRoLlBJKSAvIHApKTtcblx0fSxcblxuXHRlYXNlT3V0RWxhc3RpYzogZnVuY3Rpb24odCkge1xuXHRcdHZhciBzID0gMS43MDE1ODtcblx0XHR2YXIgcCA9IDA7XG5cdFx0dmFyIGEgPSAxO1xuXHRcdGlmICh0ID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cdFx0aWYgKHQgPT09IDEpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0XHRpZiAoIXApIHtcblx0XHRcdHAgPSAwLjM7XG5cdFx0fVxuXHRcdGlmIChhIDwgMSkge1xuXHRcdFx0YSA9IDE7XG5cdFx0XHRzID0gcCAvIDQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHMgPSBwIC8gKDIgKiBNYXRoLlBJKSAqIE1hdGguYXNpbigxIC8gYSk7XG5cdFx0fVxuXHRcdHJldHVybiBhICogTWF0aC5wb3coMiwgLTEwICogdCkgKiBNYXRoLnNpbigodCAtIHMpICogKDIgKiBNYXRoLlBJKSAvIHApICsgMTtcblx0fSxcblxuXHRlYXNlSW5PdXRFbGFzdGljOiBmdW5jdGlvbih0KSB7XG5cdFx0dmFyIHMgPSAxLjcwMTU4O1xuXHRcdHZhciBwID0gMDtcblx0XHR2YXIgYSA9IDE7XG5cdFx0aWYgKHQgPT09IDApIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblx0XHRpZiAoKHQgLz0gMC41KSA9PT0gMikge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXHRcdGlmICghcCkge1xuXHRcdFx0cCA9IDAuNDU7XG5cdFx0fVxuXHRcdGlmIChhIDwgMSkge1xuXHRcdFx0YSA9IDE7XG5cdFx0XHRzID0gcCAvIDQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHMgPSBwIC8gKDIgKiBNYXRoLlBJKSAqIE1hdGguYXNpbigxIC8gYSk7XG5cdFx0fVxuXHRcdGlmICh0IDwgMSkge1xuXHRcdFx0cmV0dXJuIC0wLjUgKiAoYSAqIE1hdGgucG93KDIsIDEwICogKHQgLT0gMSkpICogTWF0aC5zaW4oKHQgLSBzKSAqICgyICogTWF0aC5QSSkgLyBwKSk7XG5cdFx0fVxuXHRcdHJldHVybiBhICogTWF0aC5wb3coMiwgLTEwICogKHQgLT0gMSkpICogTWF0aC5zaW4oKHQgLSBzKSAqICgyICogTWF0aC5QSSkgLyBwKSAqIDAuNSArIDE7XG5cdH0sXG5cdGVhc2VJbkJhY2s6IGZ1bmN0aW9uKHQpIHtcblx0XHR2YXIgcyA9IDEuNzAxNTg7XG5cdFx0cmV0dXJuIHQgKiB0ICogKChzICsgMSkgKiB0IC0gcyk7XG5cdH0sXG5cblx0ZWFzZU91dEJhY2s6IGZ1bmN0aW9uKHQpIHtcblx0XHR2YXIgcyA9IDEuNzAxNTg7XG5cdFx0cmV0dXJuICh0ID0gdCAtIDEpICogdCAqICgocyArIDEpICogdCArIHMpICsgMTtcblx0fSxcblxuXHRlYXNlSW5PdXRCYWNrOiBmdW5jdGlvbih0KSB7XG5cdFx0dmFyIHMgPSAxLjcwMTU4O1xuXHRcdGlmICgodCAvPSAwLjUpIDwgMSkge1xuXHRcdFx0cmV0dXJuIDAuNSAqICh0ICogdCAqICgoKHMgKj0gKDEuNTI1KSkgKyAxKSAqIHQgLSBzKSk7XG5cdFx0fVxuXHRcdHJldHVybiAwLjUgKiAoKHQgLT0gMikgKiB0ICogKCgocyAqPSAoMS41MjUpKSArIDEpICogdCArIHMpICsgMik7XG5cdH0sXG5cblx0ZWFzZUluQm91bmNlOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuIDEgLSBlZmZlY3RzLmVhc2VPdXRCb3VuY2UoMSAtIHQpO1xuXHR9LFxuXG5cdGVhc2VPdXRCb3VuY2U6IGZ1bmN0aW9uKHQpIHtcblx0XHRpZiAodCA8ICgxIC8gMi43NSkpIHtcblx0XHRcdHJldHVybiA3LjU2MjUgKiB0ICogdDtcblx0XHR9XG5cdFx0aWYgKHQgPCAoMiAvIDIuNzUpKSB7XG5cdFx0XHRyZXR1cm4gNy41NjI1ICogKHQgLT0gKDEuNSAvIDIuNzUpKSAqIHQgKyAwLjc1O1xuXHRcdH1cblx0XHRpZiAodCA8ICgyLjUgLyAyLjc1KSkge1xuXHRcdFx0cmV0dXJuIDcuNTYyNSAqICh0IC09ICgyLjI1IC8gMi43NSkpICogdCArIDAuOTM3NTtcblx0XHR9XG5cdFx0cmV0dXJuIDcuNTYyNSAqICh0IC09ICgyLjYyNSAvIDIuNzUpKSAqIHQgKyAwLjk4NDM3NTtcblx0fSxcblxuXHRlYXNlSW5PdXRCb3VuY2U6IGZ1bmN0aW9uKHQpIHtcblx0XHRpZiAodCA8IDAuNSkge1xuXHRcdFx0cmV0dXJuIGVmZmVjdHMuZWFzZUluQm91bmNlKHQgKiAyKSAqIDAuNTtcblx0XHR9XG5cdFx0cmV0dXJuIGVmZmVjdHMuZWFzZU91dEJvdW5jZSh0ICogMiAtIDEpICogMC41ICsgMC41O1xuXHR9XG59O1xuXG52YXIgaGVscGVyc19lYXNpbmcgPSB7XG5cdGVmZmVjdHM6IGVmZmVjdHNcbn07XG5cbi8vIERFUFJFQ0FUSU9OU1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuaGVscGVycy5lYXNpbmcuZWZmZWN0cyBpbnN0ZWFkLlxuICogQGZ1bmN0aW9uIENoYXJ0LmhlbHBlcnMuZWFzaW5nRWZmZWN0c1xuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVyc19jb3JlLmVhc2luZ0VmZmVjdHMgPSBlZmZlY3RzO1xuXG52YXIgUEkgPSBNYXRoLlBJO1xudmFyIFJBRF9QRVJfREVHID0gUEkgLyAxODA7XG52YXIgRE9VQkxFX1BJID0gUEkgKiAyO1xudmFyIEhBTEZfUEkgPSBQSSAvIDI7XG52YXIgUVVBUlRFUl9QSSA9IFBJIC8gNDtcbnZhciBUV09fVEhJUkRTX1BJID0gUEkgKiAyIC8gMztcblxuLyoqXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuY2FudmFzXG4gKi9cbnZhciBleHBvcnRzJDEgPSB7XG5cdC8qKlxuXHQgKiBDbGVhcnMgdGhlIGVudGlyZSBjYW52YXMgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gYGNoYXJ0YC5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgZm9yIHdoaWNoIHRvIGNsZWFyIHRoZSBjYW52YXMuXG5cdCAqL1xuXHRjbGVhcjogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHRjaGFydC5jdHguY2xlYXJSZWN0KDAsIDAsIGNoYXJ0LndpZHRoLCBjaGFydC5oZWlnaHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgXCJwYXRoXCIgZm9yIGEgcmVjdGFuZ2xlIHdpdGggcm91bmRlZCBjb3JuZXJzIGF0IHBvc2l0aW9uICh4LCB5KSB3aXRoIGFcblx0ICogZ2l2ZW4gc2l6ZSAod2lkdGgsIGhlaWdodCkgYW5kIHRoZSBzYW1lIGByYWRpdXNgIGZvciBhbGwgY29ybmVycy5cblx0ICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCAtIFRoZSBjYW52YXMgMkQgQ29udGV4dC5cblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBheGlzIG9mIHRoZSBjb29yZGluYXRlIGZvciB0aGUgcmVjdGFuZ2xlIHN0YXJ0aW5nIHBvaW50LlxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGF4aXMgb2YgdGhlIGNvb3JkaW5hdGUgZm9yIHRoZSByZWN0YW5nbGUgc3RhcnRpbmcgcG9pbnQuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSByZWN0YW5nbGUncyB3aWR0aC5cblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSByZWN0YW5nbGUncyBoZWlnaHQuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcm91bmRlZCBhbW91bnQgKGluIHBpeGVscykgZm9yIHRoZSBmb3VyIGNvcm5lcnMuXG5cdCAqIEB0b2RvIGhhbmRsZSBgcmFkaXVzYCBhcyB0b3AtbGVmdCwgdG9wLXJpZ2h0LCBib3R0b20tcmlnaHQsIGJvdHRvbS1sZWZ0IGFycmF5L29iamVjdD9cblx0ICovXG5cdHJvdW5kZWRSZWN0OiBmdW5jdGlvbihjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuXHRcdGlmIChyYWRpdXMpIHtcblx0XHRcdHZhciByID0gTWF0aC5taW4ocmFkaXVzLCBoZWlnaHQgLyAyLCB3aWR0aCAvIDIpO1xuXHRcdFx0dmFyIGxlZnQgPSB4ICsgcjtcblx0XHRcdHZhciB0b3AgPSB5ICsgcjtcblx0XHRcdHZhciByaWdodCA9IHggKyB3aWR0aCAtIHI7XG5cdFx0XHR2YXIgYm90dG9tID0geSArIGhlaWdodCAtIHI7XG5cblx0XHRcdGN0eC5tb3ZlVG8oeCwgdG9wKTtcblx0XHRcdGlmIChsZWZ0IDwgcmlnaHQgJiYgdG9wIDwgYm90dG9tKSB7XG5cdFx0XHRcdGN0eC5hcmMobGVmdCwgdG9wLCByLCAtUEksIC1IQUxGX1BJKTtcblx0XHRcdFx0Y3R4LmFyYyhyaWdodCwgdG9wLCByLCAtSEFMRl9QSSwgMCk7XG5cdFx0XHRcdGN0eC5hcmMocmlnaHQsIGJvdHRvbSwgciwgMCwgSEFMRl9QSSk7XG5cdFx0XHRcdGN0eC5hcmMobGVmdCwgYm90dG9tLCByLCBIQUxGX1BJLCBQSSk7XG5cdFx0XHR9IGVsc2UgaWYgKGxlZnQgPCByaWdodCkge1xuXHRcdFx0XHRjdHgubW92ZVRvKGxlZnQsIHkpO1xuXHRcdFx0XHRjdHguYXJjKHJpZ2h0LCB0b3AsIHIsIC1IQUxGX1BJLCBIQUxGX1BJKTtcblx0XHRcdFx0Y3R4LmFyYyhsZWZ0LCB0b3AsIHIsIEhBTEZfUEksIFBJICsgSEFMRl9QSSk7XG5cdFx0XHR9IGVsc2UgaWYgKHRvcCA8IGJvdHRvbSkge1xuXHRcdFx0XHRjdHguYXJjKGxlZnQsIHRvcCwgciwgLVBJLCAwKTtcblx0XHRcdFx0Y3R4LmFyYyhsZWZ0LCBib3R0b20sIHIsIDAsIFBJKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN0eC5hcmMobGVmdCwgdG9wLCByLCAtUEksIFBJKTtcblx0XHRcdH1cblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGN0eC5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuXHRcdH1cblx0fSxcblxuXHRkcmF3UG9pbnQ6IGZ1bmN0aW9uKGN0eCwgc3R5bGUsIHJhZGl1cywgeCwgeSwgcm90YXRpb24pIHtcblx0XHR2YXIgdHlwZSwgeE9mZnNldCwgeU9mZnNldCwgc2l6ZSwgY29ybmVyUmFkaXVzO1xuXHRcdHZhciByYWQgPSAocm90YXRpb24gfHwgMCkgKiBSQURfUEVSX0RFRztcblxuXHRcdGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHR0eXBlID0gc3R5bGUudG9TdHJpbmcoKTtcblx0XHRcdGlmICh0eXBlID09PSAnW29iamVjdCBIVE1MSW1hZ2VFbGVtZW50XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSFRNTENhbnZhc0VsZW1lbnRdJykge1xuXHRcdFx0XHRjdHguZHJhd0ltYWdlKHN0eWxlLCB4IC0gc3R5bGUud2lkdGggLyAyLCB5IC0gc3R5bGUuaGVpZ2h0IC8gMiwgc3R5bGUud2lkdGgsIHN0eWxlLmhlaWdodCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNOYU4ocmFkaXVzKSB8fCByYWRpdXMgPD0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGN0eC5iZWdpblBhdGgoKTtcblxuXHRcdHN3aXRjaCAoc3R5bGUpIHtcblx0XHQvLyBEZWZhdWx0IGluY2x1ZGVzIGNpcmNsZVxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRjdHguYXJjKHgsIHksIHJhZGl1cywgMCwgRE9VQkxFX1BJKTtcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3RyaWFuZ2xlJzpcblx0XHRcdGN0eC5tb3ZlVG8oeCArIE1hdGguc2luKHJhZCkgKiByYWRpdXMsIHkgLSBNYXRoLmNvcyhyYWQpICogcmFkaXVzKTtcblx0XHRcdHJhZCArPSBUV09fVEhJUkRTX1BJO1xuXHRcdFx0Y3R4LmxpbmVUbyh4ICsgTWF0aC5zaW4ocmFkKSAqIHJhZGl1cywgeSAtIE1hdGguY29zKHJhZCkgKiByYWRpdXMpO1xuXHRcdFx0cmFkICs9IFRXT19USElSRFNfUEk7XG5cdFx0XHRjdHgubGluZVRvKHggKyBNYXRoLnNpbihyYWQpICogcmFkaXVzLCB5IC0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cyk7XG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdyZWN0Um91bmRlZCc6XG5cdFx0XHQvLyBOT1RFOiB0aGUgcm91bmRlZCByZWN0IGltcGxlbWVudGF0aW9uIGNoYW5nZWQgdG8gdXNlIGBhcmNgIGluc3RlYWQgb2Zcblx0XHRcdC8vIGBxdWFkcmF0aWNDdXJ2ZVRvYCBzaW5jZSBpdCBnZW5lcmF0ZXMgYmV0dGVyIHJlc3VsdHMgd2hlbiByZWN0IGlzXG5cdFx0XHQvLyBhbG1vc3QgYSBjaXJjbGUuIDAuNTE2IChpbnN0ZWFkIG9mIDAuNSkgcHJvZHVjZXMgcmVzdWx0cyB3aXRoIHZpc3VhbGx5XG5cdFx0XHQvLyBjbG9zZXIgcHJvcG9ydGlvbiB0byB0aGUgcHJldmlvdXMgaW1wbCBhbmQgaXQgaXMgaW5zY3JpYmVkIGluIHRoZVxuXHRcdFx0Ly8gY2lyY2xlIHdpdGggYHJhZGl1c2AuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgZm9sbG93aW5nIFBSczpcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy81NTk3XG5cdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNTg1OFxuXHRcdFx0Y29ybmVyUmFkaXVzID0gcmFkaXVzICogMC41MTY7XG5cdFx0XHRzaXplID0gcmFkaXVzIC0gY29ybmVyUmFkaXVzO1xuXHRcdFx0eE9mZnNldCA9IE1hdGguY29zKHJhZCArIFFVQVJURVJfUEkpICogc2l6ZTtcblx0XHRcdHlPZmZzZXQgPSBNYXRoLnNpbihyYWQgKyBRVUFSVEVSX1BJKSAqIHNpemU7XG5cdFx0XHRjdHguYXJjKHggLSB4T2Zmc2V0LCB5IC0geU9mZnNldCwgY29ybmVyUmFkaXVzLCByYWQgLSBQSSwgcmFkIC0gSEFMRl9QSSk7XG5cdFx0XHRjdHguYXJjKHggKyB5T2Zmc2V0LCB5IC0geE9mZnNldCwgY29ybmVyUmFkaXVzLCByYWQgLSBIQUxGX1BJLCByYWQpO1xuXHRcdFx0Y3R4LmFyYyh4ICsgeE9mZnNldCwgeSArIHlPZmZzZXQsIGNvcm5lclJhZGl1cywgcmFkLCByYWQgKyBIQUxGX1BJKTtcblx0XHRcdGN0eC5hcmMoeCAtIHlPZmZzZXQsIHkgKyB4T2Zmc2V0LCBjb3JuZXJSYWRpdXMsIHJhZCArIEhBTEZfUEksIHJhZCArIFBJKTtcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3JlY3QnOlxuXHRcdFx0aWYgKCFyb3RhdGlvbikge1xuXHRcdFx0XHRzaXplID0gTWF0aC5TUVJUMV8yICogcmFkaXVzO1xuXHRcdFx0XHRjdHgucmVjdCh4IC0gc2l6ZSwgeSAtIHNpemUsIDIgKiBzaXplLCAyICogc2l6ZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0cmFkICs9IFFVQVJURVJfUEk7XG5cdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0Y2FzZSAncmVjdFJvdCc6XG5cdFx0XHR4T2Zmc2V0ID0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cztcblx0XHRcdHlPZmZzZXQgPSBNYXRoLnNpbihyYWQpICogcmFkaXVzO1xuXHRcdFx0Y3R4Lm1vdmVUbyh4IC0geE9mZnNldCwgeSAtIHlPZmZzZXQpO1xuXHRcdFx0Y3R4LmxpbmVUbyh4ICsgeU9mZnNldCwgeSAtIHhPZmZzZXQpO1xuXHRcdFx0Y3R4LmxpbmVUbyh4ICsgeE9mZnNldCwgeSArIHlPZmZzZXQpO1xuXHRcdFx0Y3R4LmxpbmVUbyh4IC0geU9mZnNldCwgeSArIHhPZmZzZXQpO1xuXHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnY3Jvc3NSb3QnOlxuXHRcdFx0cmFkICs9IFFVQVJURVJfUEk7XG5cdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0Y2FzZSAnY3Jvc3MnOlxuXHRcdFx0eE9mZnNldCA9IE1hdGguY29zKHJhZCkgKiByYWRpdXM7XG5cdFx0XHR5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcblx0XHRcdGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXQsIHkgLSB5T2Zmc2V0KTtcblx0XHRcdGN0eC5saW5lVG8oeCArIHhPZmZzZXQsIHkgKyB5T2Zmc2V0KTtcblx0XHRcdGN0eC5tb3ZlVG8oeCArIHlPZmZzZXQsIHkgLSB4T2Zmc2V0KTtcblx0XHRcdGN0eC5saW5lVG8oeCAtIHlPZmZzZXQsIHkgKyB4T2Zmc2V0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3N0YXInOlxuXHRcdFx0eE9mZnNldCA9IE1hdGguY29zKHJhZCkgKiByYWRpdXM7XG5cdFx0XHR5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcblx0XHRcdGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXQsIHkgLSB5T2Zmc2V0KTtcblx0XHRcdGN0eC5saW5lVG8oeCArIHhPZmZzZXQsIHkgKyB5T2Zmc2V0KTtcblx0XHRcdGN0eC5tb3ZlVG8oeCArIHlPZmZzZXQsIHkgLSB4T2Zmc2V0KTtcblx0XHRcdGN0eC5saW5lVG8oeCAtIHlPZmZzZXQsIHkgKyB4T2Zmc2V0KTtcblx0XHRcdHJhZCArPSBRVUFSVEVSX1BJO1xuXHRcdFx0eE9mZnNldCA9IE1hdGguY29zKHJhZCkgKiByYWRpdXM7XG5cdFx0XHR5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcblx0XHRcdGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXQsIHkgLSB5T2Zmc2V0KTtcblx0XHRcdGN0eC5saW5lVG8oeCArIHhPZmZzZXQsIHkgKyB5T2Zmc2V0KTtcblx0XHRcdGN0eC5tb3ZlVG8oeCArIHlPZmZzZXQsIHkgLSB4T2Zmc2V0KTtcblx0XHRcdGN0eC5saW5lVG8oeCAtIHlPZmZzZXQsIHkgKyB4T2Zmc2V0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2xpbmUnOlxuXHRcdFx0eE9mZnNldCA9IE1hdGguY29zKHJhZCkgKiByYWRpdXM7XG5cdFx0XHR5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcblx0XHRcdGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXQsIHkgLSB5T2Zmc2V0KTtcblx0XHRcdGN0eC5saW5lVG8oeCArIHhPZmZzZXQsIHkgKyB5T2Zmc2V0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2Rhc2gnOlxuXHRcdFx0Y3R4Lm1vdmVUbyh4LCB5KTtcblx0XHRcdGN0eC5saW5lVG8oeCArIE1hdGguY29zKHJhZCkgKiByYWRpdXMsIHkgKyBNYXRoLnNpbihyYWQpICogcmFkaXVzKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdGN0eC5maWxsKCk7XG5cdFx0Y3R4LnN0cm9rZSgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBvaW50IGlzIGluc2lkZSB0aGUgcmVjdGFuZ2xlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBwb2ludCAtIFRoZSBwb2ludCB0byB0ZXN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBhcmVhIC0gVGhlIHJlY3RhbmdsZVxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9pc1BvaW50SW5BcmVhOiBmdW5jdGlvbihwb2ludCwgYXJlYSkge1xuXHRcdHZhciBlcHNpbG9uID0gMWUtNjsgLy8gMWUtNiBpcyBtYXJnaW4gaW4gcGl4ZWxzIGZvciBhY2N1bXVsYXRlZCBlcnJvci5cblxuXHRcdHJldHVybiBwb2ludC54ID4gYXJlYS5sZWZ0IC0gZXBzaWxvbiAmJiBwb2ludC54IDwgYXJlYS5yaWdodCArIGVwc2lsb24gJiZcblx0XHRcdHBvaW50LnkgPiBhcmVhLnRvcCAtIGVwc2lsb24gJiYgcG9pbnQueSA8IGFyZWEuYm90dG9tICsgZXBzaWxvbjtcblx0fSxcblxuXHRjbGlwQXJlYTogZnVuY3Rpb24oY3R4LCBhcmVhKSB7XG5cdFx0Y3R4LnNhdmUoKTtcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4LnJlY3QoYXJlYS5sZWZ0LCBhcmVhLnRvcCwgYXJlYS5yaWdodCAtIGFyZWEubGVmdCwgYXJlYS5ib3R0b20gLSBhcmVhLnRvcCk7XG5cdFx0Y3R4LmNsaXAoKTtcblx0fSxcblxuXHR1bmNsaXBBcmVhOiBmdW5jdGlvbihjdHgpIHtcblx0XHRjdHgucmVzdG9yZSgpO1xuXHR9LFxuXG5cdGxpbmVUbzogZnVuY3Rpb24oY3R4LCBwcmV2aW91cywgdGFyZ2V0LCBmbGlwKSB7XG5cdFx0dmFyIHN0ZXBwZWQgPSB0YXJnZXQuc3RlcHBlZExpbmU7XG5cdFx0aWYgKHN0ZXBwZWQpIHtcblx0XHRcdGlmIChzdGVwcGVkID09PSAnbWlkZGxlJykge1xuXHRcdFx0XHR2YXIgbWlkcG9pbnQgPSAocHJldmlvdXMueCArIHRhcmdldC54KSAvIDIuMDtcblx0XHRcdFx0Y3R4LmxpbmVUbyhtaWRwb2ludCwgZmxpcCA/IHRhcmdldC55IDogcHJldmlvdXMueSk7XG5cdFx0XHRcdGN0eC5saW5lVG8obWlkcG9pbnQsIGZsaXAgPyBwcmV2aW91cy55IDogdGFyZ2V0LnkpO1xuXHRcdFx0fSBlbHNlIGlmICgoc3RlcHBlZCA9PT0gJ2FmdGVyJyAmJiAhZmxpcCkgfHwgKHN0ZXBwZWQgIT09ICdhZnRlcicgJiYgZmxpcCkpIHtcblx0XHRcdFx0Y3R4LmxpbmVUbyhwcmV2aW91cy54LCB0YXJnZXQueSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjdHgubGluZVRvKHRhcmdldC54LCBwcmV2aW91cy55KTtcblx0XHRcdH1cblx0XHRcdGN0eC5saW5lVG8odGFyZ2V0LngsIHRhcmdldC55KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIXRhcmdldC50ZW5zaW9uKSB7XG5cdFx0XHRjdHgubGluZVRvKHRhcmdldC54LCB0YXJnZXQueSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y3R4LmJlemllckN1cnZlVG8oXG5cdFx0XHRmbGlwID8gcHJldmlvdXMuY29udHJvbFBvaW50UHJldmlvdXNYIDogcHJldmlvdXMuY29udHJvbFBvaW50TmV4dFgsXG5cdFx0XHRmbGlwID8gcHJldmlvdXMuY29udHJvbFBvaW50UHJldmlvdXNZIDogcHJldmlvdXMuY29udHJvbFBvaW50TmV4dFksXG5cdFx0XHRmbGlwID8gdGFyZ2V0LmNvbnRyb2xQb2ludE5leHRYIDogdGFyZ2V0LmNvbnRyb2xQb2ludFByZXZpb3VzWCxcblx0XHRcdGZsaXAgPyB0YXJnZXQuY29udHJvbFBvaW50TmV4dFkgOiB0YXJnZXQuY29udHJvbFBvaW50UHJldmlvdXNZLFxuXHRcdFx0dGFyZ2V0LngsXG5cdFx0XHR0YXJnZXQueSk7XG5cdH1cbn07XG5cbnZhciBoZWxwZXJzX2NhbnZhcyA9IGV4cG9ydHMkMTtcblxuLy8gREVQUkVDQVRJT05TXG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLmNhbnZhcy5jbGVhciBpbnN0ZWFkLlxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzLmNsZWFyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNy4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5oZWxwZXJzX2NvcmUuY2xlYXIgPSBleHBvcnRzJDEuY2xlYXI7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLmNhbnZhcy5yb3VuZGVkUmVjdCBpbnN0ZWFkLlxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzLmRyYXdSb3VuZGVkUmVjdGFuZ2xlXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNy4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5oZWxwZXJzX2NvcmUuZHJhd1JvdW5kZWRSZWN0YW5nbGUgPSBmdW5jdGlvbihjdHgpIHtcblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRleHBvcnRzJDEucm91bmRlZFJlY3QuYXBwbHkoZXhwb3J0cyQxLCBhcmd1bWVudHMpO1xufTtcblxudmFyIGRlZmF1bHRzID0ge1xuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9zZXQ6IGZ1bmN0aW9uKHNjb3BlLCB2YWx1ZXMpIHtcblx0XHRyZXR1cm4gaGVscGVyc19jb3JlLm1lcmdlKHRoaXNbc2NvcGVdIHx8ICh0aGlzW3Njb3BlXSA9IHt9KSwgdmFsdWVzKTtcblx0fVxufTtcblxuZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xuXHRkZWZhdWx0Q29sb3I6ICdyZ2JhKDAsMCwwLDAuMSknLFxuXHRkZWZhdWx0Rm9udENvbG9yOiAnIzY2NicsXG5cdGRlZmF1bHRGb250RmFtaWx5OiBcIidIZWx2ZXRpY2EgTmV1ZScsICdIZWx2ZXRpY2EnLCAnQXJpYWwnLCBzYW5zLXNlcmlmXCIsXG5cdGRlZmF1bHRGb250U2l6ZTogMTIsXG5cdGRlZmF1bHRGb250U3R5bGU6ICdub3JtYWwnLFxuXHRkZWZhdWx0TGluZUhlaWdodDogMS4yLFxuXHRzaG93TGluZXM6IHRydWVcbn0pO1xuXG52YXIgY29yZV9kZWZhdWx0cyA9IGRlZmF1bHRzO1xuXG52YXIgdmFsdWVPckRlZmF1bHQgPSBoZWxwZXJzX2NvcmUudmFsdWVPckRlZmF1bHQ7XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGdpdmVuIGZvbnQgb2JqZWN0IGludG8gYSBDU1MgZm9udCBzdHJpbmcuXG4gKiBAcGFyYW0ge29iamVjdH0gZm9udCAtIEEgZm9udCBvYmplY3QuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBDU1MgZm9udCBzdHJpbmcuIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZm9udFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdG9Gb250U3RyaW5nKGZvbnQpIHtcblx0aWYgKCFmb250IHx8IGhlbHBlcnNfY29yZS5pc051bGxPclVuZGVmKGZvbnQuc2l6ZSkgfHwgaGVscGVyc19jb3JlLmlzTnVsbE9yVW5kZWYoZm9udC5mYW1pbHkpKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRyZXR1cm4gKGZvbnQuc3R5bGUgPyBmb250LnN0eWxlICsgJyAnIDogJycpXG5cdFx0KyAoZm9udC53ZWlnaHQgPyBmb250LndlaWdodCArICcgJyA6ICcnKVxuXHRcdCsgZm9udC5zaXplICsgJ3B4ICdcblx0XHQrIGZvbnQuZmFtaWx5O1xufVxuXG4vKipcbiAqIEBhbGlhcyBDaGFydC5oZWxwZXJzLm9wdGlvbnNcbiAqIEBuYW1lc3BhY2VcbiAqL1xudmFyIGhlbHBlcnNfb3B0aW9ucyA9IHtcblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSBnaXZlbiBsaW5lIGhlaWdodCBgdmFsdWVgIGluIHBpeGVscyBmb3IgYSBzcGVjaWZpYyBmb250IGBzaXplYC5cblx0ICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAtIFRoZSBsaW5lSGVpZ2h0IHRvIHBhcnNlIChlZy4gMS42LCAnMTRweCcsICc3NSUnLCAnMS42ZW0nKS5cblx0ICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgZm9udCBzaXplIChpbiBwaXhlbHMpIHVzZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBgdmFsdWVgLlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZWZmZWN0aXZlIGxpbmUgaGVpZ2h0IGluIHBpeGVscyAoc2l6ZSAqIDEuMiBpZiB2YWx1ZSBpcyBpbnZhbGlkKS5cblx0ICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvbGluZS1oZWlnaHRcblx0ICogQHNpbmNlIDIuNy4wXG5cdCAqL1xuXHR0b0xpbmVIZWlnaHQ6IGZ1bmN0aW9uKHZhbHVlLCBzaXplKSB7XG5cdFx0dmFyIG1hdGNoZXMgPSAoJycgKyB2YWx1ZSkubWF0Y2goL14obm9ybWFsfChcXGQrKD86XFwuXFxkKyk/KShweHxlbXwlKT8pJC8pO1xuXHRcdGlmICghbWF0Y2hlcyB8fCBtYXRjaGVzWzFdID09PSAnbm9ybWFsJykge1xuXHRcdFx0cmV0dXJuIHNpemUgKiAxLjI7XG5cdFx0fVxuXG5cdFx0dmFsdWUgPSArbWF0Y2hlc1syXTtcblxuXHRcdHN3aXRjaCAobWF0Y2hlc1szXSkge1xuXHRcdGNhc2UgJ3B4Jzpcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRjYXNlICclJzpcblx0XHRcdHZhbHVlIC89IDEwMDtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRyZXR1cm4gc2l6ZSAqIHZhbHVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIHBhZGRpbmcgb2JqZWN0IHdpdGggcHJlLWNvbXB1dGVkIHdpZHRoL2hlaWdodC5cblx0ICogQHBhcmFtIHtudW1iZXJ8b2JqZWN0fSB2YWx1ZSAtIElmIGEgbnVtYmVyLCBzZXQgdGhlIHZhbHVlIHRvIGFsbCBUUkJMIGNvbXBvbmVudCxcblx0ICogIGVsc2UsIGlmIGFuZCBvYmplY3QsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHNldHMgdW5kZWZpbmVkIG9uZXMgdG8gMC5cblx0ICogQHJldHVybnMge29iamVjdH0gVGhlIHBhZGRpbmcgdmFsdWVzICh0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHdpZHRoLCBoZWlnaHQpXG5cdCAqIEBzaW5jZSAyLjcuMFxuXHQgKi9cblx0dG9QYWRkaW5nOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHZhciB0LCByLCBiLCBsO1xuXG5cdFx0aWYgKGhlbHBlcnNfY29yZS5pc09iamVjdCh2YWx1ZSkpIHtcblx0XHRcdHQgPSArdmFsdWUudG9wIHx8IDA7XG5cdFx0XHRyID0gK3ZhbHVlLnJpZ2h0IHx8IDA7XG5cdFx0XHRiID0gK3ZhbHVlLmJvdHRvbSB8fCAwO1xuXHRcdFx0bCA9ICt2YWx1ZS5sZWZ0IHx8IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHQgPSByID0gYiA9IGwgPSArdmFsdWUgfHwgMDtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiB0LFxuXHRcdFx0cmlnaHQ6IHIsXG5cdFx0XHRib3R0b206IGIsXG5cdFx0XHRsZWZ0OiBsLFxuXHRcdFx0aGVpZ2h0OiB0ICsgYixcblx0XHRcdHdpZHRoOiBsICsgclxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIFBhcnNlcyBmb250IG9wdGlvbnMgYW5kIHJldHVybnMgdGhlIGZvbnQgb2JqZWN0LlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIEEgb2JqZWN0IHRoYXQgY29udGFpbnMgZm9udCBvcHRpb25zIHRvIGJlIHBhcnNlZC5cblx0ICogQHJldHVybiB7b2JqZWN0fSBUaGUgZm9udCBvYmplY3QuXG5cdCAqIEB0b2RvIFN1cHBvcnQgZm9udC4qIG9wdGlvbnMgYW5kIHJlbmFtZWQgdG8gdG9Gb250KCkuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcGFyc2VGb250OiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dmFyIGdsb2JhbERlZmF1bHRzID0gY29yZV9kZWZhdWx0cy5nbG9iYWw7XG5cdFx0dmFyIHNpemUgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xuXHRcdHZhciBmb250ID0ge1xuXHRcdFx0ZmFtaWx5OiB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250RmFtaWx5KSxcblx0XHRcdGxpbmVIZWlnaHQ6IGhlbHBlcnNfY29yZS5vcHRpb25zLnRvTGluZUhlaWdodCh2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmxpbmVIZWlnaHQsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRMaW5lSGVpZ2h0KSwgc2l6ZSksXG5cdFx0XHRzaXplOiBzaXplLFxuXHRcdFx0c3R5bGU6IHZhbHVlT3JEZWZhdWx0KG9wdGlvbnMuZm9udFN0eWxlLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFN0eWxlKSxcblx0XHRcdHdlaWdodDogbnVsbCxcblx0XHRcdHN0cmluZzogJydcblx0XHR9O1xuXG5cdFx0Zm9udC5zdHJpbmcgPSB0b0ZvbnRTdHJpbmcoZm9udCk7XG5cdFx0cmV0dXJuIGZvbnQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gYGlucHV0c2Agc2VxdWVudGlhbGx5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBkZWZpbmVkIHZhbHVlLlxuXHQgKiBAcGFyYW0ge0FycmF5fSBpbnB1dHMgLSBBbiBhcnJheSBvZiB2YWx1ZXMsIGZhbGxpbmcgYmFjayB0byB0aGUgbGFzdCB2YWx1ZS5cblx0ICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIElmIGRlZmluZWQgYW5kIHRoZSBjdXJyZW50IHZhbHVlIGlzIGEgZnVuY3Rpb24sIHRoZSB2YWx1ZVxuXHQgKiBpcyBjYWxsZWQgd2l0aCBgY29udGV4dGAgYXMgZmlyc3QgYXJndW1lbnQgYW5kIHRoZSByZXN1bHQgYmVjb21lcyB0aGUgbmV3IGlucHV0LlxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4XSAtIElmIGRlZmluZWQgYW5kIHRoZSBjdXJyZW50IHZhbHVlIGlzIGFuIGFycmF5LCB0aGUgdmFsdWVcblx0ICogYXQgYGluZGV4YCBiZWNvbWUgdGhlIG5ldyBpbnB1dC5cblx0ICogQHNpbmNlIDIuNy4wXG5cdCAqL1xuXHRyZXNvbHZlOiBmdW5jdGlvbihpbnB1dHMsIGNvbnRleHQsIGluZGV4KSB7XG5cdFx0dmFyIGksIGlsZW4sIHZhbHVlO1xuXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IGlucHV0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdHZhbHVlID0gaW5wdXRzW2ldO1xuXHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlKGNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaGVscGVyc19jb3JlLmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWVbaW5kZXhdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxudmFyIGhlbHBlcnMkMSA9IGhlbHBlcnNfY29yZTtcbnZhciBlYXNpbmcgPSBoZWxwZXJzX2Vhc2luZztcbnZhciBjYW52YXMgPSBoZWxwZXJzX2NhbnZhcztcbnZhciBvcHRpb25zID0gaGVscGVyc19vcHRpb25zO1xuaGVscGVycyQxLmVhc2luZyA9IGVhc2luZztcbmhlbHBlcnMkMS5jYW52YXMgPSBjYW52YXM7XG5oZWxwZXJzJDEub3B0aW9ucyA9IG9wdGlvbnM7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlKHN0YXJ0LCB2aWV3LCBtb2RlbCwgZWFzZSkge1xuXHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKG1vZGVsKTtcblx0dmFyIGksIGlsZW4sIGtleSwgYWN0dWFsLCBvcmlnaW4sIHRhcmdldCwgdHlwZSwgYzAsIGMxO1xuXG5cdGZvciAoaSA9IDAsIGlsZW4gPSBrZXlzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdGtleSA9IGtleXNbaV07XG5cblx0XHR0YXJnZXQgPSBtb2RlbFtrZXldO1xuXG5cdFx0Ly8gaWYgYSB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgbW9kZWwgYWZ0ZXIgcGl2b3QoKSBoYXMgYmVlbiBjYWxsZWQsIHRoZSB2aWV3XG5cdFx0Ly8gZG9lc24ndCBjb250YWluIGl0LCBzbyBsZXQncyBpbml0aWFsaXplIHRoZSB2aWV3IHRvIHRoZSB0YXJnZXQgdmFsdWUuXG5cdFx0aWYgKCF2aWV3Lmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdHZpZXdba2V5XSA9IHRhcmdldDtcblx0XHR9XG5cblx0XHRhY3R1YWwgPSB2aWV3W2tleV07XG5cblx0XHRpZiAoYWN0dWFsID09PSB0YXJnZXQgfHwga2V5WzBdID09PSAnXycpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmICghc3RhcnQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0c3RhcnRba2V5XSA9IGFjdHVhbDtcblx0XHR9XG5cblx0XHRvcmlnaW4gPSBzdGFydFtrZXldO1xuXG5cdFx0dHlwZSA9IHR5cGVvZiB0YXJnZXQ7XG5cblx0XHRpZiAodHlwZSA9PT0gdHlwZW9mIG9yaWdpbikge1xuXHRcdFx0aWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdGMwID0gY2hhcnRqc0NvbG9yKG9yaWdpbik7XG5cdFx0XHRcdGlmIChjMC52YWxpZCkge1xuXHRcdFx0XHRcdGMxID0gY2hhcnRqc0NvbG9yKHRhcmdldCk7XG5cdFx0XHRcdFx0aWYgKGMxLnZhbGlkKSB7XG5cdFx0XHRcdFx0XHR2aWV3W2tleV0gPSBjMS5taXgoYzAsIGVhc2UpLnJnYlN0cmluZygpO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGhlbHBlcnMkMS5pc0Zpbml0ZShvcmlnaW4pICYmIGhlbHBlcnMkMS5pc0Zpbml0ZSh0YXJnZXQpKSB7XG5cdFx0XHRcdHZpZXdba2V5XSA9IG9yaWdpbiArICh0YXJnZXQgLSBvcmlnaW4pICogZWFzZTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmlld1trZXldID0gdGFyZ2V0O1xuXHR9XG59XG5cbnZhciBFbGVtZW50ID0gZnVuY3Rpb24oY29uZmlndXJhdGlvbikge1xuXHRoZWxwZXJzJDEuZXh0ZW5kKHRoaXMsIGNvbmZpZ3VyYXRpb24pO1xuXHR0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbmhlbHBlcnMkMS5leHRlbmQoRWxlbWVudC5wcm90b3R5cGUsIHtcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmhpZGRlbiA9IGZhbHNlO1xuXHR9LFxuXG5cdHBpdm90OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdGlmICghbWUuX3ZpZXcpIHtcblx0XHRcdG1lLl92aWV3ID0gaGVscGVycyQxLmNsb25lKG1lLl9tb2RlbCk7XG5cdFx0fVxuXHRcdG1lLl9zdGFydCA9IHt9O1xuXHRcdHJldHVybiBtZTtcblx0fSxcblxuXHR0cmFuc2l0aW9uOiBmdW5jdGlvbihlYXNlKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbW9kZWwgPSBtZS5fbW9kZWw7XG5cdFx0dmFyIHN0YXJ0ID0gbWUuX3N0YXJ0O1xuXHRcdHZhciB2aWV3ID0gbWUuX3ZpZXc7XG5cblx0XHQvLyBObyBhbmltYXRpb24gLT4gTm8gVHJhbnNpdGlvblxuXHRcdGlmICghbW9kZWwgfHwgZWFzZSA9PT0gMSkge1xuXHRcdFx0bWUuX3ZpZXcgPSBtb2RlbDtcblx0XHRcdG1lLl9zdGFydCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gbWU7XG5cdFx0fVxuXG5cdFx0aWYgKCF2aWV3KSB7XG5cdFx0XHR2aWV3ID0gbWUuX3ZpZXcgPSB7fTtcblx0XHR9XG5cblx0XHRpZiAoIXN0YXJ0KSB7XG5cdFx0XHRzdGFydCA9IG1lLl9zdGFydCA9IHt9O1xuXHRcdH1cblxuXHRcdGludGVycG9sYXRlKHN0YXJ0LCB2aWV3LCBtb2RlbCwgZWFzZSk7XG5cblx0XHRyZXR1cm4gbWU7XG5cdH0sXG5cblx0dG9vbHRpcFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogdGhpcy5fbW9kZWwueCxcblx0XHRcdHk6IHRoaXMuX21vZGVsLnlcblx0XHR9O1xuXHR9LFxuXG5cdGhhc1ZhbHVlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gaGVscGVycyQxLmlzTnVtYmVyKHRoaXMuX21vZGVsLngpICYmIGhlbHBlcnMkMS5pc051bWJlcih0aGlzLl9tb2RlbC55KTtcblx0fVxufSk7XG5cbkVsZW1lbnQuZXh0ZW5kID0gaGVscGVycyQxLmluaGVyaXRzO1xuXG52YXIgY29yZV9lbGVtZW50ID0gRWxlbWVudDtcblxudmFyIGV4cG9ydHMkMiA9IGNvcmVfZWxlbWVudC5leHRlbmQoe1xuXHRjaGFydDogbnVsbCwgLy8gdGhlIGFuaW1hdGlvbiBhc3NvY2lhdGVkIGNoYXJ0IGluc3RhbmNlXG5cdGN1cnJlbnRTdGVwOiAwLCAvLyB0aGUgY3VycmVudCBhbmltYXRpb24gc3RlcFxuXHRudW1TdGVwczogNjAsIC8vIGRlZmF1bHQgbnVtYmVyIG9mIHN0ZXBzXG5cdGVhc2luZzogJycsIC8vIHRoZSBlYXNpbmcgdG8gdXNlIGZvciB0aGlzIGFuaW1hdGlvblxuXHRyZW5kZXI6IG51bGwsIC8vIHJlbmRlciBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBhbmltYXRpb24gc2VydmljZVxuXG5cdG9uQW5pbWF0aW9uUHJvZ3Jlc3M6IG51bGwsIC8vIHVzZXIgc3BlY2lmaWVkIGNhbGxiYWNrIHRvIGZpcmUgb24gZWFjaCBzdGVwIG9mIHRoZSBhbmltYXRpb25cblx0b25BbmltYXRpb25Db21wbGV0ZTogbnVsbCwgLy8gdXNlciBzcGVjaWZpZWQgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSBhbmltYXRpb24gZmluaXNoZXNcbn0pO1xuXG52YXIgY29yZV9hbmltYXRpb24gPSBleHBvcnRzJDI7XG5cbi8vIERFUFJFQ0FUSU9OU1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuQW5pbWF0aW9uIGluc3RlYWRcbiAqIEBwcm9wIENoYXJ0LkFuaW1hdGlvbiNhbmltYXRpb25PYmplY3RcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi42LjBcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMkMi5wcm90b3R5cGUsICdhbmltYXRpb25PYmplY3QnLCB7XG5cdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuQW5pbWF0aW9uI2NoYXJ0IGluc3RlYWRcbiAqIEBwcm9wIENoYXJ0LkFuaW1hdGlvbiNjaGFydEluc3RhbmNlXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNi4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzJDIucHJvdG90eXBlLCAnY2hhcnRJbnN0YW5jZScsIHtcblx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5jaGFydDtcblx0fSxcblx0c2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHRoaXMuY2hhcnQgPSB2YWx1ZTtcblx0fVxufSk7XG5cbmNvcmVfZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xuXHRhbmltYXRpb246IHtcblx0XHRkdXJhdGlvbjogMTAwMCxcblx0XHRlYXNpbmc6ICdlYXNlT3V0UXVhcnQnLFxuXHRcdG9uUHJvZ3Jlc3M6IGhlbHBlcnMkMS5ub29wLFxuXHRcdG9uQ29tcGxldGU6IGhlbHBlcnMkMS5ub29wXG5cdH1cbn0pO1xuXG52YXIgY29yZV9hbmltYXRpb25zID0ge1xuXHRhbmltYXRpb25zOiBbXSxcblx0cmVxdWVzdDogbnVsbCxcblxuXHQvKipcblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgdG8gYW5pbWF0ZS5cblx0ICogQHBhcmFtIHtDaGFydC5BbmltYXRpb259IGFuaW1hdGlvbiAtIFRoZSBhbmltYXRpb24gdGhhdCB3ZSB3aWxsIGFuaW1hdGUuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbmltYXRpb24gZHVyYXRpb24gaW4gbXMuXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbGF6eSAtIGlmIHRydWUsIHRoZSBjaGFydCBpcyBub3QgbWFya2VkIGFzIGFuaW1hdGluZyB0byBlbmFibGUgbW9yZSByZXNwb25zaXZlIGludGVyYWN0aW9uc1xuXHQgKi9cblx0YWRkQW5pbWF0aW9uOiBmdW5jdGlvbihjaGFydCwgYW5pbWF0aW9uLCBkdXJhdGlvbiwgbGF6eSkge1xuXHRcdHZhciBhbmltYXRpb25zID0gdGhpcy5hbmltYXRpb25zO1xuXHRcdHZhciBpLCBpbGVuO1xuXG5cdFx0YW5pbWF0aW9uLmNoYXJ0ID0gY2hhcnQ7XG5cdFx0YW5pbWF0aW9uLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cdFx0YW5pbWF0aW9uLmR1cmF0aW9uID0gZHVyYXRpb247XG5cblx0XHRpZiAoIWxhenkpIHtcblx0XHRcdGNoYXJ0LmFuaW1hdGluZyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IGFuaW1hdGlvbnMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRpZiAoYW5pbWF0aW9uc1tpXS5jaGFydCA9PT0gY2hhcnQpIHtcblx0XHRcdFx0YW5pbWF0aW9uc1tpXSA9IGFuaW1hdGlvbjtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGFuaW1hdGlvbnMucHVzaChhbmltYXRpb24pO1xuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIG5vIGFuaW1hdGlvbnMgcXVldWVkLCBtYW51YWxseSBraWNrc3RhcnQgYSBkaWdlc3QsIGZvciBsYWNrIG9mIGEgYmV0dGVyIHdvcmRcblx0XHRpZiAoYW5pbWF0aW9ucy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGNhbmNlbEFuaW1hdGlvbjogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHR2YXIgaW5kZXggPSBoZWxwZXJzJDEuZmluZEluZGV4KHRoaXMuYW5pbWF0aW9ucywgZnVuY3Rpb24oYW5pbWF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gYW5pbWF0aW9uLmNoYXJ0ID09PSBjaGFydDtcblx0XHR9KTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdHRoaXMuYW5pbWF0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0Y2hhcnQuYW5pbWF0aW5nID0gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdHJlcXVlc3RBbmltYXRpb25GcmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHRpZiAobWUucmVxdWVzdCA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gU2tpcCBhbmltYXRpb24gZnJhbWUgcmVxdWVzdHMgdW50aWwgdGhlIGFjdGl2ZSBvbmUgaXMgZXhlY3V0ZWQuXG5cdFx0XHQvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBwcm9jZXNzaW5nIG1vdXNlIGV2ZW50cywgZS5nLiAnbW91c2Vtb3ZlJ1xuXHRcdFx0Ly8gYW5kICdtb3VzZW91dCcgZXZlbnRzIHdpbGwgdHJpZ2dlciBtdWx0aXBsZSByZW5kZXJzLlxuXHRcdFx0bWUucmVxdWVzdCA9IGhlbHBlcnMkMS5yZXF1ZXN0QW5pbUZyYW1lLmNhbGwod2luZG93LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0bWUucmVxdWVzdCA9IG51bGw7XG5cdFx0XHRcdG1lLnN0YXJ0RGlnZXN0KCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRzdGFydERpZ2VzdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdG1lLmFkdmFuY2UoKTtcblxuXHRcdC8vIERvIHdlIGhhdmUgbW9yZSBzdHVmZiB0byBhbmltYXRlP1xuXHRcdGlmIChtZS5hbmltYXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdG1lLnJlcXVlc3RBbmltYXRpb25GcmFtZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFkdmFuY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBhbmltYXRpb25zID0gdGhpcy5hbmltYXRpb25zO1xuXHRcdHZhciBhbmltYXRpb24sIGNoYXJ0LCBudW1TdGVwcywgbmV4dFN0ZXA7XG5cdFx0dmFyIGkgPSAwO1xuXG5cdFx0Ly8gMSBhbmltYXRpb24gcGVyIGNoYXJ0LCBzbyB3ZSBhcmUgbG9vcGluZyBjaGFydHMgaGVyZVxuXHRcdHdoaWxlIChpIDwgYW5pbWF0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGFuaW1hdGlvbiA9IGFuaW1hdGlvbnNbaV07XG5cdFx0XHRjaGFydCA9IGFuaW1hdGlvbi5jaGFydDtcblx0XHRcdG51bVN0ZXBzID0gYW5pbWF0aW9uLm51bVN0ZXBzO1xuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBjdXJyZW50U3RlcCBzdGFydHMgYXQgMVxuXHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzYxMDRcblx0XHRcdG5leHRTdGVwID0gTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIGFuaW1hdGlvbi5zdGFydFRpbWUpIC8gYW5pbWF0aW9uLmR1cmF0aW9uICogbnVtU3RlcHMpICsgMTtcblx0XHRcdGFuaW1hdGlvbi5jdXJyZW50U3RlcCA9IE1hdGgubWluKG5leHRTdGVwLCBudW1TdGVwcyk7XG5cblx0XHRcdGhlbHBlcnMkMS5jYWxsYmFjayhhbmltYXRpb24ucmVuZGVyLCBbY2hhcnQsIGFuaW1hdGlvbl0sIGNoYXJ0KTtcblx0XHRcdGhlbHBlcnMkMS5jYWxsYmFjayhhbmltYXRpb24ub25BbmltYXRpb25Qcm9ncmVzcywgW2FuaW1hdGlvbl0sIGNoYXJ0KTtcblxuXHRcdFx0aWYgKGFuaW1hdGlvbi5jdXJyZW50U3RlcCA+PSBudW1TdGVwcykge1xuXHRcdFx0XHRoZWxwZXJzJDEuY2FsbGJhY2soYW5pbWF0aW9uLm9uQW5pbWF0aW9uQ29tcGxldGUsIFthbmltYXRpb25dLCBjaGFydCk7XG5cdFx0XHRcdGNoYXJ0LmFuaW1hdGluZyA9IGZhbHNlO1xuXHRcdFx0XHRhbmltYXRpb25zLnNwbGljZShpLCAxKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCsraTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbnZhciByZXNvbHZlID0gaGVscGVycyQxLm9wdGlvbnMucmVzb2x2ZTtcblxudmFyIGFycmF5RXZlbnRzID0gWydwdXNoJywgJ3BvcCcsICdzaGlmdCcsICdzcGxpY2UnLCAndW5zaGlmdCddO1xuXG4vKipcbiAqIEhvb2tzIHRoZSBhcnJheSBtZXRob2RzIHRoYXQgYWRkIG9yIHJlbW92ZSB2YWx1ZXMgKCdwdXNoJywgcG9wJywgJ3NoaWZ0JywgJ3NwbGljZScsXG4gKiAndW5zaGlmdCcpIGFuZCBub3RpZnkgdGhlIGxpc3RlbmVyIEFGVEVSIHRoZSBhcnJheSBoYXMgYmVlbiBhbHRlcmVkLiBMaXN0ZW5lcnMgYXJlXG4gKiBjYWxsZWQgb24gdGhlICdvbkRhdGEqJyBjYWxsYmFja3MgKGUuZy4gb25EYXRhUHVzaCwgZXRjLikgd2l0aCBzYW1lIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gbGlzdGVuQXJyYXlFdmVudHMoYXJyYXksIGxpc3RlbmVyKSB7XG5cdGlmIChhcnJheS5fY2hhcnRqcykge1xuXHRcdGFycmF5Ll9jaGFydGpzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJyYXksICdfY2hhcnRqcycsIHtcblx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0dmFsdWU6IHtcblx0XHRcdGxpc3RlbmVyczogW2xpc3RlbmVyXVxuXHRcdH1cblx0fSk7XG5cblx0YXJyYXlFdmVudHMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcblx0XHR2YXIgbWV0aG9kID0gJ29uRGF0YScgKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7XG5cdFx0dmFyIGJhc2UgPSBhcnJheVtrZXldO1xuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGFycmF5LCBrZXksIHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0dmFsdWU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdFx0XHRcdHZhciByZXMgPSBiYXNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG5cdFx0XHRcdGhlbHBlcnMkMS5lYWNoKGFycmF5Ll9jaGFydGpzLmxpc3RlbmVycywgZnVuY3Rpb24ob2JqZWN0KSB7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3RbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdFx0b2JqZWN0W21ldGhvZF0uYXBwbHkob2JqZWN0LCBhcmdzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiByZXM7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGdpdmVuIGFycmF5IGV2ZW50IGxpc3RlbmVyIGFuZCBjbGVhbnVwIGV4dHJhIGF0dGFjaGVkIHByb3BlcnRpZXMgKHN1Y2ggYXNcbiAqIHRoZSBfY2hhcnRqcyBzdHViIGFuZCBvdmVycmlkZGVuIG1ldGhvZHMpIGlmIGFycmF5IGRvZXNuJ3QgaGF2ZSBhbnkgbW9yZSBsaXN0ZW5lcnMuXG4gKi9cbmZ1bmN0aW9uIHVubGlzdGVuQXJyYXlFdmVudHMoYXJyYXksIGxpc3RlbmVyKSB7XG5cdHZhciBzdHViID0gYXJyYXkuX2NoYXJ0anM7XG5cdGlmICghc3R1Yikge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHZhciBsaXN0ZW5lcnMgPSBzdHViLmxpc3RlbmVycztcblx0dmFyIGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuXHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0bGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG5cdH1cblxuXHRpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRhcnJheUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuXHRcdGRlbGV0ZSBhcnJheVtrZXldO1xuXHR9KTtcblxuXHRkZWxldGUgYXJyYXkuX2NoYXJ0anM7XG59XG5cbi8vIEJhc2UgY2xhc3MgZm9yIGFsbCBkYXRhc2V0IGNvbnRyb2xsZXJzIChsaW5lLCBiYXIsIGV0YylcbnZhciBEYXRhc2V0Q29udHJvbGxlciA9IGZ1bmN0aW9uKGNoYXJ0LCBkYXRhc2V0SW5kZXgpIHtcblx0dGhpcy5pbml0aWFsaXplKGNoYXJ0LCBkYXRhc2V0SW5kZXgpO1xufTtcblxuaGVscGVycyQxLmV4dGVuZChEYXRhc2V0Q29udHJvbGxlci5wcm90b3R5cGUsIHtcblxuXHQvKipcblx0ICogRWxlbWVudCB0eXBlIHVzZWQgdG8gZ2VuZXJhdGUgYSBtZXRhIGRhdGFzZXQgKGUuZy4gQ2hhcnQuZWxlbWVudC5MaW5lKS5cblx0ICogQHR5cGUge0NoYXJ0LmNvcmUuZWxlbWVudH1cblx0ICovXG5cdGRhdGFzZXRFbGVtZW50VHlwZTogbnVsbCxcblxuXHQvKipcblx0ICogRWxlbWVudCB0eXBlIHVzZWQgdG8gZ2VuZXJhdGUgYSBtZXRhIGRhdGEgKGUuZy4gQ2hhcnQuZWxlbWVudC5Qb2ludCkuXG5cdCAqIEB0eXBlIHtDaGFydC5jb3JlLmVsZW1lbnR9XG5cdCAqL1xuXHRkYXRhRWxlbWVudFR5cGU6IG51bGwsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oY2hhcnQsIGRhdGFzZXRJbmRleCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0bWUuY2hhcnQgPSBjaGFydDtcblx0XHRtZS5pbmRleCA9IGRhdGFzZXRJbmRleDtcblx0XHRtZS5saW5rU2NhbGVzKCk7XG5cdFx0bWUuYWRkRWxlbWVudHMoKTtcblx0fSxcblxuXHR1cGRhdGVJbmRleDogZnVuY3Rpb24oZGF0YXNldEluZGV4KSB7XG5cdFx0dGhpcy5pbmRleCA9IGRhdGFzZXRJbmRleDtcblx0fSxcblxuXHRsaW5rU2NhbGVzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXG5cdFx0aWYgKG1ldGEueEF4aXNJRCA9PT0gbnVsbCB8fCAhKG1ldGEueEF4aXNJRCBpbiBtZS5jaGFydC5zY2FsZXMpKSB7XG5cdFx0XHRtZXRhLnhBeGlzSUQgPSBkYXRhc2V0LnhBeGlzSUQgfHwgbWUuY2hhcnQub3B0aW9ucy5zY2FsZXMueEF4ZXNbMF0uaWQ7XG5cdFx0fVxuXHRcdGlmIChtZXRhLnlBeGlzSUQgPT09IG51bGwgfHwgIShtZXRhLnlBeGlzSUQgaW4gbWUuY2hhcnQuc2NhbGVzKSkge1xuXHRcdFx0bWV0YS55QXhpc0lEID0gZGF0YXNldC55QXhpc0lEIHx8IG1lLmNoYXJ0Lm9wdGlvbnMuc2NhbGVzLnlBeGVzWzBdLmlkO1xuXHRcdH1cblx0fSxcblxuXHRnZXREYXRhc2V0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW3RoaXMuaW5kZXhdO1xuXHR9LFxuXG5cdGdldE1ldGE6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKHRoaXMuaW5kZXgpO1xuXHR9LFxuXG5cdGdldFNjYWxlRm9ySWQ6IGZ1bmN0aW9uKHNjYWxlSUQpIHtcblx0XHRyZXR1cm4gdGhpcy5jaGFydC5zY2FsZXNbc2NhbGVJRF07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0VmFsdWVTY2FsZUlkOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRNZXRhKCkueUF4aXNJRDtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRJbmRleFNjYWxlSWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmdldE1ldGEoKS54QXhpc0lEO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldFZhbHVlU2NhbGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFNjYWxlRm9ySWQodGhpcy5fZ2V0VmFsdWVTY2FsZUlkKCkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldEluZGV4U2NhbGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFNjYWxlRm9ySWQodGhpcy5fZ2V0SW5kZXhTY2FsZUlkKCkpO1xuXHR9LFxuXG5cdHJlc2V0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVwZGF0ZSh0cnVlKTtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLl9kYXRhKSB7XG5cdFx0XHR1bmxpc3RlbkFycmF5RXZlbnRzKHRoaXMuX2RhdGEsIHRoaXMpO1xuXHRcdH1cblx0fSxcblxuXHRjcmVhdGVNZXRhRGF0YXNldDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgdHlwZSA9IG1lLmRhdGFzZXRFbGVtZW50VHlwZTtcblx0XHRyZXR1cm4gdHlwZSAmJiBuZXcgdHlwZSh7XG5cdFx0XHRfY2hhcnQ6IG1lLmNoYXJ0LFxuXHRcdFx0X2RhdGFzZXRJbmRleDogbWUuaW5kZXhcblx0XHR9KTtcblx0fSxcblxuXHRjcmVhdGVNZXRhRGF0YTogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciB0eXBlID0gbWUuZGF0YUVsZW1lbnRUeXBlO1xuXHRcdHJldHVybiB0eXBlICYmIG5ldyB0eXBlKHtcblx0XHRcdF9jaGFydDogbWUuY2hhcnQsXG5cdFx0XHRfZGF0YXNldEluZGV4OiBtZS5pbmRleCxcblx0XHRcdF9pbmRleDogaW5kZXhcblx0XHR9KTtcblx0fSxcblxuXHRhZGRFbGVtZW50czogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHR2YXIgZGF0YSA9IG1lLmdldERhdGFzZXQoKS5kYXRhIHx8IFtdO1xuXHRcdHZhciBtZXRhRGF0YSA9IG1ldGEuZGF0YTtcblx0XHR2YXIgaSwgaWxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBkYXRhLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0bWV0YURhdGFbaV0gPSBtZXRhRGF0YVtpXSB8fCBtZS5jcmVhdGVNZXRhRGF0YShpKTtcblx0XHR9XG5cblx0XHRtZXRhLmRhdGFzZXQgPSBtZXRhLmRhdGFzZXQgfHwgbWUuY3JlYXRlTWV0YURhdGFzZXQoKTtcblx0fSxcblxuXHRhZGRFbGVtZW50QW5kUmVzZXQ6IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0dmFyIGVsZW1lbnQgPSB0aGlzLmNyZWF0ZU1ldGFEYXRhKGluZGV4KTtcblx0XHR0aGlzLmdldE1ldGEoKS5kYXRhLnNwbGljZShpbmRleCwgMCwgZWxlbWVudCk7XG5cdFx0dGhpcy51cGRhdGVFbGVtZW50KGVsZW1lbnQsIGluZGV4LCB0cnVlKTtcblx0fSxcblxuXHRidWlsZE9yVXBkYXRlRWxlbWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0dmFyIGRhdGEgPSBkYXRhc2V0LmRhdGEgfHwgKGRhdGFzZXQuZGF0YSA9IFtdKTtcblxuXHRcdC8vIEluIG9yZGVyIHRvIGNvcnJlY3RseSBoYW5kbGUgZGF0YSBhZGRpdGlvbi9kZWxldGlvbiBhbmltYXRpb24gKGFuIHRodXMgc2ltdWxhdGVcblx0XHQvLyByZWFsLXRpbWUgY2hhcnRzKSwgd2UgbmVlZCB0byBtb25pdG9yIHRoZXNlIGRhdGEgbW9kaWZpY2F0aW9ucyBhbmQgc3luY2hyb25pemVcblx0XHQvLyB0aGUgaW50ZXJuYWwgbWV0YSBkYXRhIGFjY29yZGluZ2x5LlxuXHRcdGlmIChtZS5fZGF0YSAhPT0gZGF0YSkge1xuXHRcdFx0aWYgKG1lLl9kYXRhKSB7XG5cdFx0XHRcdC8vIFRoaXMgY2FzZSBoYXBwZW5zIHdoZW4gdGhlIHVzZXIgcmVwbGFjZWQgdGhlIGRhdGEgYXJyYXkgaW5zdGFuY2UuXG5cdFx0XHRcdHVubGlzdGVuQXJyYXlFdmVudHMobWUuX2RhdGEsIG1lKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGEgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShkYXRhKSkge1xuXHRcdFx0XHRsaXN0ZW5BcnJheUV2ZW50cyhkYXRhLCBtZSk7XG5cdFx0XHR9XG5cdFx0XHRtZS5fZGF0YSA9IGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gUmUtc3luYyBtZXRhIGRhdGEgaW4gY2FzZSB0aGUgdXNlciByZXBsYWNlZCB0aGUgZGF0YSBhcnJheSBvciBpZiB3ZSBtaXNzZWRcblx0XHQvLyBhbnkgdXBkYXRlcyBhbmQgc28gbWFrZSBzdXJlIHRoYXQgd2UgaGFuZGxlIG51bWJlciBvZiBkYXRhcG9pbnRzIGNoYW5naW5nLlxuXHRcdG1lLnJlc3luY0VsZW1lbnRzKCk7XG5cdH0sXG5cblx0dXBkYXRlOiBoZWxwZXJzJDEubm9vcCxcblxuXHR0cmFuc2l0aW9uOiBmdW5jdGlvbihlYXNpbmdWYWx1ZSkge1xuXHRcdHZhciBtZXRhID0gdGhpcy5nZXRNZXRhKCk7XG5cdFx0dmFyIGVsZW1lbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuXHRcdHZhciBpbGVuID0gZWxlbWVudHMubGVuZ3RoO1xuXHRcdHZhciBpID0gMDtcblxuXHRcdGZvciAoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRlbGVtZW50c1tpXS50cmFuc2l0aW9uKGVhc2luZ1ZhbHVlKTtcblx0XHR9XG5cblx0XHRpZiAobWV0YS5kYXRhc2V0KSB7XG5cdFx0XHRtZXRhLmRhdGFzZXQudHJhbnNpdGlvbihlYXNpbmdWYWx1ZSk7XG5cdFx0fVxuXHR9LFxuXG5cdGRyYXc6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZXRhID0gdGhpcy5nZXRNZXRhKCk7XG5cdFx0dmFyIGVsZW1lbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuXHRcdHZhciBpbGVuID0gZWxlbWVudHMubGVuZ3RoO1xuXHRcdHZhciBpID0gMDtcblxuXHRcdGlmIChtZXRhLmRhdGFzZXQpIHtcblx0XHRcdG1ldGEuZGF0YXNldC5kcmF3KCk7XG5cdFx0fVxuXG5cdFx0Zm9yICg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdGVsZW1lbnRzW2ldLmRyYXcoKTtcblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlSG92ZXJTdHlsZTogZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdGhlbHBlcnMkMS5tZXJnZShlbGVtZW50Ll9tb2RlbCwgZWxlbWVudC4kcHJldmlvdXNTdHlsZSB8fCB7fSk7XG5cdFx0ZGVsZXRlIGVsZW1lbnQuJHByZXZpb3VzU3R5bGU7XG5cdH0sXG5cblx0c2V0SG92ZXJTdHlsZTogZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdHZhciBkYXRhc2V0ID0gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2VsZW1lbnQuX2RhdGFzZXRJbmRleF07XG5cdFx0dmFyIGluZGV4ID0gZWxlbWVudC5faW5kZXg7XG5cdFx0dmFyIGN1c3RvbSA9IGVsZW1lbnQuY3VzdG9tIHx8IHt9O1xuXHRcdHZhciBtb2RlbCA9IGVsZW1lbnQuX21vZGVsO1xuXHRcdHZhciBnZXRIb3ZlckNvbG9yID0gaGVscGVycyQxLmdldEhvdmVyQ29sb3I7XG5cblx0XHRlbGVtZW50LiRwcmV2aW91c1N0eWxlID0ge1xuXHRcdFx0YmFja2dyb3VuZENvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRib3JkZXJDb2xvcjogbW9kZWwuYm9yZGVyQ29sb3IsXG5cdFx0XHRib3JkZXJXaWR0aDogbW9kZWwuYm9yZGVyV2lkdGhcblx0XHR9O1xuXG5cdFx0bW9kZWwuYmFja2dyb3VuZENvbG9yID0gcmVzb2x2ZShbY3VzdG9tLmhvdmVyQmFja2dyb3VuZENvbG9yLCBkYXRhc2V0LmhvdmVyQmFja2dyb3VuZENvbG9yLCBnZXRIb3ZlckNvbG9yKG1vZGVsLmJhY2tncm91bmRDb2xvcildLCB1bmRlZmluZWQsIGluZGV4KTtcblx0XHRtb2RlbC5ib3JkZXJDb2xvciA9IHJlc29sdmUoW2N1c3RvbS5ob3ZlckJvcmRlckNvbG9yLCBkYXRhc2V0LmhvdmVyQm9yZGVyQ29sb3IsIGdldEhvdmVyQ29sb3IobW9kZWwuYm9yZGVyQ29sb3IpXSwgdW5kZWZpbmVkLCBpbmRleCk7XG5cdFx0bW9kZWwuYm9yZGVyV2lkdGggPSByZXNvbHZlKFtjdXN0b20uaG92ZXJCb3JkZXJXaWR0aCwgZGF0YXNldC5ob3ZlckJvcmRlcldpZHRoLCBtb2RlbC5ib3JkZXJXaWR0aF0sIHVuZGVmaW5lZCwgaW5kZXgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cmVzeW5jRWxlbWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0dmFyIGRhdGEgPSBtZS5nZXREYXRhc2V0KCkuZGF0YTtcblx0XHR2YXIgbnVtTWV0YSA9IG1ldGEuZGF0YS5sZW5ndGg7XG5cdFx0dmFyIG51bURhdGEgPSBkYXRhLmxlbmd0aDtcblxuXHRcdGlmIChudW1EYXRhIDwgbnVtTWV0YSkge1xuXHRcdFx0bWV0YS5kYXRhLnNwbGljZShudW1EYXRhLCBudW1NZXRhIC0gbnVtRGF0YSk7XG5cdFx0fSBlbHNlIGlmIChudW1EYXRhID4gbnVtTWV0YSkge1xuXHRcdFx0bWUuaW5zZXJ0RWxlbWVudHMobnVtTWV0YSwgbnVtRGF0YSAtIG51bU1ldGEpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGluc2VydEVsZW1lbnRzOiBmdW5jdGlvbihzdGFydCwgY291bnQpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcblx0XHRcdHRoaXMuYWRkRWxlbWVudEFuZFJlc2V0KHN0YXJ0ICsgaSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0b25EYXRhUHVzaDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcblx0XHR0aGlzLmluc2VydEVsZW1lbnRzKHRoaXMuZ2V0RGF0YXNldCgpLmRhdGEubGVuZ3RoIC0gY291bnQsIGNvdW50KTtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdG9uRGF0YVBvcDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5nZXRNZXRhKCkuZGF0YS5wb3AoKTtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdG9uRGF0YVNoaWZ0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmdldE1ldGEoKS5kYXRhLnNoaWZ0KCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRvbkRhdGFTcGxpY2U6IGZ1bmN0aW9uKHN0YXJ0LCBjb3VudCkge1xuXHRcdHRoaXMuZ2V0TWV0YSgpLmRhdGEuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG5cdFx0dGhpcy5pbnNlcnRFbGVtZW50cyhzdGFydCwgYXJndW1lbnRzLmxlbmd0aCAtIDIpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0b25EYXRhVW5zaGlmdDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5pbnNlcnRFbGVtZW50cygwLCBhcmd1bWVudHMubGVuZ3RoKTtcblx0fVxufSk7XG5cbkRhdGFzZXRDb250cm9sbGVyLmV4dGVuZCA9IGhlbHBlcnMkMS5pbmhlcml0cztcblxudmFyIGNvcmVfZGF0YXNldENvbnRyb2xsZXIgPSBEYXRhc2V0Q29udHJvbGxlcjtcblxuY29yZV9kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdGVsZW1lbnRzOiB7XG5cdFx0YXJjOiB7XG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGNvcmVfZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRDb2xvcixcblx0XHRcdGJvcmRlckNvbG9yOiAnI2ZmZicsXG5cdFx0XHRib3JkZXJXaWR0aDogMixcblx0XHRcdGJvcmRlckFsaWduOiAnY2VudGVyJ1xuXHRcdH1cblx0fVxufSk7XG5cbnZhciBlbGVtZW50X2FyYyA9IGNvcmVfZWxlbWVudC5leHRlbmQoe1xuXHRpbkxhYmVsUmFuZ2U6IGZ1bmN0aW9uKG1vdXNlWCkge1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cblx0XHRpZiAodm0pIHtcblx0XHRcdHJldHVybiAoTWF0aC5wb3cobW91c2VYIC0gdm0ueCwgMikgPCBNYXRoLnBvdyh2bS5yYWRpdXMgKyB2bS5ob3ZlclJhZGl1cywgMikpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0aW5SYW5nZTogZnVuY3Rpb24oY2hhcnRYLCBjaGFydFkpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXG5cdFx0aWYgKHZtKSB7XG5cdFx0XHR2YXIgcG9pbnRSZWxhdGl2ZVBvc2l0aW9uID0gaGVscGVycyQxLmdldEFuZ2xlRnJvbVBvaW50KHZtLCB7eDogY2hhcnRYLCB5OiBjaGFydFl9KTtcblx0XHRcdHZhclx0YW5nbGUgPSBwb2ludFJlbGF0aXZlUG9zaXRpb24uYW5nbGU7XG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBwb2ludFJlbGF0aXZlUG9zaXRpb24uZGlzdGFuY2U7XG5cblx0XHRcdC8vIFNhbml0aXNlIGFuZ2xlIHJhbmdlXG5cdFx0XHR2YXIgc3RhcnRBbmdsZSA9IHZtLnN0YXJ0QW5nbGU7XG5cdFx0XHR2YXIgZW5kQW5nbGUgPSB2bS5lbmRBbmdsZTtcblx0XHRcdHdoaWxlIChlbmRBbmdsZSA8IHN0YXJ0QW5nbGUpIHtcblx0XHRcdFx0ZW5kQW5nbGUgKz0gMi4wICogTWF0aC5QSTtcblx0XHRcdH1cblx0XHRcdHdoaWxlIChhbmdsZSA+IGVuZEFuZ2xlKSB7XG5cdFx0XHRcdGFuZ2xlIC09IDIuMCAqIE1hdGguUEk7XG5cdFx0XHR9XG5cdFx0XHR3aGlsZSAoYW5nbGUgPCBzdGFydEFuZ2xlKSB7XG5cdFx0XHRcdGFuZ2xlICs9IDIuMCAqIE1hdGguUEk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENoZWNrIGlmIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdGhlIG9wZW4vY2xvc2UgYW5nbGVcblx0XHRcdHZhciBiZXR3ZWVuQW5nbGVzID0gKGFuZ2xlID49IHN0YXJ0QW5nbGUgJiYgYW5nbGUgPD0gZW5kQW5nbGUpO1xuXHRcdFx0dmFyIHdpdGhpblJhZGl1cyA9IChkaXN0YW5jZSA+PSB2bS5pbm5lclJhZGl1cyAmJiBkaXN0YW5jZSA8PSB2bS5vdXRlclJhZGl1cyk7XG5cblx0XHRcdHJldHVybiAoYmV0d2VlbkFuZ2xlcyAmJiB3aXRoaW5SYWRpdXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0Z2V0Q2VudGVyUG9pbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0dmFyIGhhbGZBbmdsZSA9ICh2bS5zdGFydEFuZ2xlICsgdm0uZW5kQW5nbGUpIC8gMjtcblx0XHR2YXIgaGFsZlJhZGl1cyA9ICh2bS5pbm5lclJhZGl1cyArIHZtLm91dGVyUmFkaXVzKSAvIDI7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IHZtLnggKyBNYXRoLmNvcyhoYWxmQW5nbGUpICogaGFsZlJhZGl1cyxcblx0XHRcdHk6IHZtLnkgKyBNYXRoLnNpbihoYWxmQW5nbGUpICogaGFsZlJhZGl1c1xuXHRcdH07XG5cdH0sXG5cblx0Z2V0QXJlYTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHRyZXR1cm4gTWF0aC5QSSAqICgodm0uZW5kQW5nbGUgLSB2bS5zdGFydEFuZ2xlKSAvICgyICogTWF0aC5QSSkpICogKE1hdGgucG93KHZtLm91dGVyUmFkaXVzLCAyKSAtIE1hdGgucG93KHZtLmlubmVyUmFkaXVzLCAyKSk7XG5cdH0sXG5cblx0dG9vbHRpcFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHZhciBjZW50cmVBbmdsZSA9IHZtLnN0YXJ0QW5nbGUgKyAoKHZtLmVuZEFuZ2xlIC0gdm0uc3RhcnRBbmdsZSkgLyAyKTtcblx0XHR2YXIgcmFuZ2VGcm9tQ2VudHJlID0gKHZtLm91dGVyUmFkaXVzIC0gdm0uaW5uZXJSYWRpdXMpIC8gMiArIHZtLmlubmVyUmFkaXVzO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IHZtLnggKyAoTWF0aC5jb3MoY2VudHJlQW5nbGUpICogcmFuZ2VGcm9tQ2VudHJlKSxcblx0XHRcdHk6IHZtLnkgKyAoTWF0aC5zaW4oY2VudHJlQW5nbGUpICogcmFuZ2VGcm9tQ2VudHJlKVxuXHRcdH07XG5cdH0sXG5cblx0ZHJhdzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGN0eCA9IHRoaXMuX2NoYXJ0LmN0eDtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHZhciBzQSA9IHZtLnN0YXJ0QW5nbGU7XG5cdFx0dmFyIGVBID0gdm0uZW5kQW5nbGU7XG5cdFx0dmFyIHBpeGVsTWFyZ2luID0gKHZtLmJvcmRlckFsaWduID09PSAnaW5uZXInKSA/IDAuMzMgOiAwO1xuXHRcdHZhciBhbmdsZU1hcmdpbjtcblxuXHRcdGN0eC5zYXZlKCk7XG5cblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4LmFyYyh2bS54LCB2bS55LCBNYXRoLm1heCh2bS5vdXRlclJhZGl1cyAtIHBpeGVsTWFyZ2luLCAwKSwgc0EsIGVBKTtcblx0XHRjdHguYXJjKHZtLngsIHZtLnksIHZtLmlubmVyUmFkaXVzLCBlQSwgc0EsIHRydWUpO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblxuXHRcdGN0eC5maWxsU3R5bGUgPSB2bS5iYWNrZ3JvdW5kQ29sb3I7XG5cdFx0Y3R4LmZpbGwoKTtcblxuXHRcdGlmICh2bS5ib3JkZXJXaWR0aCkge1xuXHRcdFx0aWYgKHZtLmJvcmRlckFsaWduID09PSAnaW5uZXInKSB7XG5cdFx0XHRcdC8vIERyYXcgYW4gaW5uZXIgYm9yZGVyIGJ5IGNsaXBpbmcgdGhlIGFyYyBhbmQgZHJhd2luZyBhIGRvdWJsZS13aWR0aCBib3JkZXJcblx0XHRcdFx0Ly8gRW5sYXJnZSB0aGUgY2xpcHBpbmcgYXJjIGJ5IDAuMzMgcGl4ZWxzIHRvIGVsaW1pbmF0ZSBnbGl0Y2hlcyBiZXR3ZWVuIGJvcmRlcnNcblx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRhbmdsZU1hcmdpbiA9IHBpeGVsTWFyZ2luIC8gdm0ub3V0ZXJSYWRpdXM7XG5cdFx0XHRcdGN0eC5hcmModm0ueCwgdm0ueSwgdm0ub3V0ZXJSYWRpdXMsIHNBIC0gYW5nbGVNYXJnaW4sIGVBICsgYW5nbGVNYXJnaW4pO1xuXHRcdFx0XHRpZiAodm0uaW5uZXJSYWRpdXMgPiBwaXhlbE1hcmdpbikge1xuXHRcdFx0XHRcdGFuZ2xlTWFyZ2luID0gcGl4ZWxNYXJnaW4gLyB2bS5pbm5lclJhZGl1cztcblx0XHRcdFx0XHRjdHguYXJjKHZtLngsIHZtLnksIHZtLmlubmVyUmFkaXVzIC0gcGl4ZWxNYXJnaW4sIGVBICsgYW5nbGVNYXJnaW4sIHNBIC0gYW5nbGVNYXJnaW4sIHRydWUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGN0eC5hcmModm0ueCwgdm0ueSwgcGl4ZWxNYXJnaW4sIGVBICsgTWF0aC5QSSAvIDIsIHNBIC0gTWF0aC5QSSAvIDIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdFx0Y3R4LmNsaXAoKTtcblxuXHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdGN0eC5hcmModm0ueCwgdm0ueSwgdm0ub3V0ZXJSYWRpdXMsIHNBLCBlQSk7XG5cdFx0XHRcdGN0eC5hcmModm0ueCwgdm0ueSwgdm0uaW5uZXJSYWRpdXMsIGVBLCBzQSwgdHJ1ZSk7XG5cdFx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblxuXHRcdFx0XHRjdHgubGluZVdpZHRoID0gdm0uYm9yZGVyV2lkdGggKiAyO1xuXHRcdFx0XHRjdHgubGluZUpvaW4gPSAncm91bmQnO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3R4LmxpbmVXaWR0aCA9IHZtLmJvcmRlcldpZHRoO1xuXHRcdFx0XHRjdHgubGluZUpvaW4gPSAnYmV2ZWwnO1xuXHRcdFx0fVxuXG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSB2bS5ib3JkZXJDb2xvcjtcblx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHR9XG5cblx0XHRjdHgucmVzdG9yZSgpO1xuXHR9XG59KTtcblxudmFyIHZhbHVlT3JEZWZhdWx0JDEgPSBoZWxwZXJzJDEudmFsdWVPckRlZmF1bHQ7XG5cbnZhciBkZWZhdWx0Q29sb3IgPSBjb3JlX2RlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Q29sb3I7XG5cbmNvcmVfZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xuXHRlbGVtZW50czoge1xuXHRcdGxpbmU6IHtcblx0XHRcdHRlbnNpb246IDAuNCxcblx0XHRcdGJhY2tncm91bmRDb2xvcjogZGVmYXVsdENvbG9yLFxuXHRcdFx0Ym9yZGVyV2lkdGg6IDMsXG5cdFx0XHRib3JkZXJDb2xvcjogZGVmYXVsdENvbG9yLFxuXHRcdFx0Ym9yZGVyQ2FwU3R5bGU6ICdidXR0Jyxcblx0XHRcdGJvcmRlckRhc2g6IFtdLFxuXHRcdFx0Ym9yZGVyRGFzaE9mZnNldDogMC4wLFxuXHRcdFx0Ym9yZGVySm9pblN0eWxlOiAnbWl0ZXInLFxuXHRcdFx0Y2FwQmV6aWVyUG9pbnRzOiB0cnVlLFxuXHRcdFx0ZmlsbDogdHJ1ZSwgLy8gZG8gd2UgZmlsbCBpbiB0aGUgYXJlYSBiZXR3ZWVuIHRoZSBsaW5lIGFuZCBpdHMgYmFzZSBheGlzXG5cdFx0fVxuXHR9XG59KTtcblxudmFyIGVsZW1lbnRfbGluZSA9IGNvcmVfZWxlbWVudC5leHRlbmQoe1xuXHRkcmF3OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciB2bSA9IG1lLl92aWV3O1xuXHRcdHZhciBjdHggPSBtZS5fY2hhcnQuY3R4O1xuXHRcdHZhciBzcGFuR2FwcyA9IHZtLnNwYW5HYXBzO1xuXHRcdHZhciBwb2ludHMgPSBtZS5fY2hpbGRyZW4uc2xpY2UoKTsgLy8gY2xvbmUgYXJyYXlcblx0XHR2YXIgZ2xvYmFsRGVmYXVsdHMgPSBjb3JlX2RlZmF1bHRzLmdsb2JhbDtcblx0XHR2YXIgZ2xvYmFsT3B0aW9uTGluZUVsZW1lbnRzID0gZ2xvYmFsRGVmYXVsdHMuZWxlbWVudHMubGluZTtcblx0XHR2YXIgbGFzdERyYXduSW5kZXggPSAtMTtcblx0XHR2YXIgaW5kZXgsIGN1cnJlbnQsIHByZXZpb3VzLCBjdXJyZW50Vk07XG5cblx0XHQvLyBJZiB3ZSBhcmUgbG9vcGluZywgYWRkaW5nIHRoZSBmaXJzdCBwb2ludCBhZ2FpblxuXHRcdGlmIChtZS5fbG9vcCAmJiBwb2ludHMubGVuZ3RoKSB7XG5cdFx0XHRwb2ludHMucHVzaChwb2ludHNbMF0pO1xuXHRcdH1cblxuXHRcdGN0eC5zYXZlKCk7XG5cblx0XHQvLyBTdHJva2UgTGluZSBPcHRpb25zXG5cdFx0Y3R4LmxpbmVDYXAgPSB2bS5ib3JkZXJDYXBTdHlsZSB8fCBnbG9iYWxPcHRpb25MaW5lRWxlbWVudHMuYm9yZGVyQ2FwU3R5bGU7XG5cblx0XHQvLyBJRSA5IGFuZCAxMCBkbyBub3Qgc3VwcG9ydCBsaW5lIGRhc2hcblx0XHRpZiAoY3R4LnNldExpbmVEYXNoKSB7XG5cdFx0XHRjdHguc2V0TGluZURhc2godm0uYm9yZGVyRGFzaCB8fCBnbG9iYWxPcHRpb25MaW5lRWxlbWVudHMuYm9yZGVyRGFzaCk7XG5cdFx0fVxuXG5cdFx0Y3R4LmxpbmVEYXNoT2Zmc2V0ID0gdmFsdWVPckRlZmF1bHQkMSh2bS5ib3JkZXJEYXNoT2Zmc2V0LCBnbG9iYWxPcHRpb25MaW5lRWxlbWVudHMuYm9yZGVyRGFzaE9mZnNldCk7XG5cdFx0Y3R4LmxpbmVKb2luID0gdm0uYm9yZGVySm9pblN0eWxlIHx8IGdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cy5ib3JkZXJKb2luU3R5bGU7XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IHZhbHVlT3JEZWZhdWx0JDEodm0uYm9yZGVyV2lkdGgsIGdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cy5ib3JkZXJXaWR0aCk7XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gdm0uYm9yZGVyQ29sb3IgfHwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdENvbG9yO1xuXG5cdFx0Ly8gU3Ryb2tlIExpbmVcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0bGFzdERyYXduSW5kZXggPSAtMTtcblxuXHRcdGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBvaW50cy5sZW5ndGg7ICsraW5kZXgpIHtcblx0XHRcdGN1cnJlbnQgPSBwb2ludHNbaW5kZXhdO1xuXHRcdFx0cHJldmlvdXMgPSBoZWxwZXJzJDEucHJldmlvdXNJdGVtKHBvaW50cywgaW5kZXgpO1xuXHRcdFx0Y3VycmVudFZNID0gY3VycmVudC5fdmlldztcblxuXHRcdFx0Ly8gRmlyc3QgcG9pbnQgbW92ZXMgdG8gaXQncyBzdGFydGluZyBwb3NpdGlvbiBubyBtYXR0ZXIgd2hhdFxuXHRcdFx0aWYgKGluZGV4ID09PSAwKSB7XG5cdFx0XHRcdGlmICghY3VycmVudFZNLnNraXApIHtcblx0XHRcdFx0XHRjdHgubW92ZVRvKGN1cnJlbnRWTS54LCBjdXJyZW50Vk0ueSk7XG5cdFx0XHRcdFx0bGFzdERyYXduSW5kZXggPSBpbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJldmlvdXMgPSBsYXN0RHJhd25JbmRleCA9PT0gLTEgPyBwcmV2aW91cyA6IHBvaW50c1tsYXN0RHJhd25JbmRleF07XG5cblx0XHRcdFx0aWYgKCFjdXJyZW50Vk0uc2tpcCkge1xuXHRcdFx0XHRcdGlmICgobGFzdERyYXduSW5kZXggIT09IChpbmRleCAtIDEpICYmICFzcGFuR2FwcykgfHwgbGFzdERyYXduSW5kZXggPT09IC0xKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGVyZSB3YXMgYSBnYXAgYW5kIHRoaXMgaXMgdGhlIGZpcnN0IHBvaW50IGFmdGVyIHRoZSBnYXBcblx0XHRcdFx0XHRcdGN0eC5tb3ZlVG8oY3VycmVudFZNLngsIGN1cnJlbnRWTS55KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gTGluZSB0byBuZXh0IHBvaW50XG5cdFx0XHRcdFx0XHRoZWxwZXJzJDEuY2FudmFzLmxpbmVUbyhjdHgsIHByZXZpb3VzLl92aWV3LCBjdXJyZW50Ll92aWV3KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bGFzdERyYXduSW5kZXggPSBpbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGN0eC5zdHJva2UoKTtcblx0XHRjdHgucmVzdG9yZSgpO1xuXHR9XG59KTtcblxudmFyIHZhbHVlT3JEZWZhdWx0JDIgPSBoZWxwZXJzJDEudmFsdWVPckRlZmF1bHQ7XG5cbnZhciBkZWZhdWx0Q29sb3IkMSA9IGNvcmVfZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRDb2xvcjtcblxuY29yZV9kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdGVsZW1lbnRzOiB7XG5cdFx0cG9pbnQ6IHtcblx0XHRcdHJhZGl1czogMyxcblx0XHRcdHBvaW50U3R5bGU6ICdjaXJjbGUnLFxuXHRcdFx0YmFja2dyb3VuZENvbG9yOiBkZWZhdWx0Q29sb3IkMSxcblx0XHRcdGJvcmRlckNvbG9yOiBkZWZhdWx0Q29sb3IkMSxcblx0XHRcdGJvcmRlcldpZHRoOiAxLFxuXHRcdFx0Ly8gSG92ZXJcblx0XHRcdGhpdFJhZGl1czogMSxcblx0XHRcdGhvdmVyUmFkaXVzOiA0LFxuXHRcdFx0aG92ZXJCb3JkZXJXaWR0aDogMVxuXHRcdH1cblx0fVxufSk7XG5cbmZ1bmN0aW9uIHhSYW5nZShtb3VzZVgpIHtcblx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0cmV0dXJuIHZtID8gKE1hdGguYWJzKG1vdXNlWCAtIHZtLngpIDwgdm0ucmFkaXVzICsgdm0uaGl0UmFkaXVzKSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB5UmFuZ2UobW91c2VZKSB7XG5cdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdHJldHVybiB2bSA/IChNYXRoLmFicyhtb3VzZVkgLSB2bS55KSA8IHZtLnJhZGl1cyArIHZtLmhpdFJhZGl1cykgOiBmYWxzZTtcbn1cblxudmFyIGVsZW1lbnRfcG9pbnQgPSBjb3JlX2VsZW1lbnQuZXh0ZW5kKHtcblx0aW5SYW5nZTogZnVuY3Rpb24obW91c2VYLCBtb3VzZVkpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHJldHVybiB2bSA/ICgoTWF0aC5wb3cobW91c2VYIC0gdm0ueCwgMikgKyBNYXRoLnBvdyhtb3VzZVkgLSB2bS55LCAyKSkgPCBNYXRoLnBvdyh2bS5oaXRSYWRpdXMgKyB2bS5yYWRpdXMsIDIpKSA6IGZhbHNlO1xuXHR9LFxuXG5cdGluTGFiZWxSYW5nZTogeFJhbmdlLFxuXHRpblhSYW5nZTogeFJhbmdlLFxuXHRpbllSYW5nZTogeVJhbmdlLFxuXG5cdGdldENlbnRlclBvaW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR4OiB2bS54LFxuXHRcdFx0eTogdm0ueVxuXHRcdH07XG5cdH0sXG5cblx0Z2V0QXJlYTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIE1hdGguUEkgKiBNYXRoLnBvdyh0aGlzLl92aWV3LnJhZGl1cywgMik7XG5cdH0sXG5cblx0dG9vbHRpcFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR4OiB2bS54LFxuXHRcdFx0eTogdm0ueSxcblx0XHRcdHBhZGRpbmc6IHZtLnJhZGl1cyArIHZtLmJvcmRlcldpZHRoXG5cdFx0fTtcblx0fSxcblxuXHRkcmF3OiBmdW5jdGlvbihjaGFydEFyZWEpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHZhciBjdHggPSB0aGlzLl9jaGFydC5jdHg7XG5cdFx0dmFyIHBvaW50U3R5bGUgPSB2bS5wb2ludFN0eWxlO1xuXHRcdHZhciByb3RhdGlvbiA9IHZtLnJvdGF0aW9uO1xuXHRcdHZhciByYWRpdXMgPSB2bS5yYWRpdXM7XG5cdFx0dmFyIHggPSB2bS54O1xuXHRcdHZhciB5ID0gdm0ueTtcblx0XHR2YXIgZ2xvYmFsRGVmYXVsdHMgPSBjb3JlX2RlZmF1bHRzLmdsb2JhbDtcblx0XHR2YXIgZGVmYXVsdENvbG9yID0gZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdENvbG9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNoYWRvd1xuXG5cdFx0aWYgKHZtLnNraXApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDbGlwcGluZyBmb3IgUG9pbnRzLlxuXHRcdGlmIChjaGFydEFyZWEgPT09IHVuZGVmaW5lZCB8fCBoZWxwZXJzJDEuY2FudmFzLl9pc1BvaW50SW5BcmVhKHZtLCBjaGFydEFyZWEpKSB7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSB2bS5ib3JkZXJDb2xvciB8fCBkZWZhdWx0Q29sb3I7XG5cdFx0XHRjdHgubGluZVdpZHRoID0gdmFsdWVPckRlZmF1bHQkMih2bS5ib3JkZXJXaWR0aCwgZ2xvYmFsRGVmYXVsdHMuZWxlbWVudHMucG9pbnQuYm9yZGVyV2lkdGgpO1xuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHZtLmJhY2tncm91bmRDb2xvciB8fCBkZWZhdWx0Q29sb3I7XG5cdFx0XHRoZWxwZXJzJDEuY2FudmFzLmRyYXdQb2ludChjdHgsIHBvaW50U3R5bGUsIHJhZGl1cywgeCwgeSwgcm90YXRpb24pO1xuXHRcdH1cblx0fVxufSk7XG5cbnZhciBkZWZhdWx0Q29sb3IkMiA9IGNvcmVfZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRDb2xvcjtcblxuY29yZV9kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdGVsZW1lbnRzOiB7XG5cdFx0cmVjdGFuZ2xlOiB7XG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGRlZmF1bHRDb2xvciQyLFxuXHRcdFx0Ym9yZGVyQ29sb3I6IGRlZmF1bHRDb2xvciQyLFxuXHRcdFx0Ym9yZGVyU2tpcHBlZDogJ2JvdHRvbScsXG5cdFx0XHRib3JkZXJXaWR0aDogMFxuXHRcdH1cblx0fVxufSk7XG5cbmZ1bmN0aW9uIGlzVmVydGljYWwodm0pIHtcblx0cmV0dXJuIHZtICYmIHZtLndpZHRoICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgYm91bmRzIG9mIHRoZSBiYXIgcmVnYXJkbGVzcyBvZiB0aGUgb3JpZW50YXRpb25cbiAqIEBwYXJhbSBiYXIge0NoYXJ0LkVsZW1lbnQuUmVjdGFuZ2xlfSB0aGUgYmFyXG4gKiBAcmV0dXJuIHtCb3VuZHN9IGJvdW5kcyBvZiB0aGUgYmFyXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRCYXJCb3VuZHModm0pIHtcblx0dmFyIHgxLCB4MiwgeTEsIHkyLCBoYWxmO1xuXG5cdGlmIChpc1ZlcnRpY2FsKHZtKSkge1xuXHRcdGhhbGYgPSB2bS53aWR0aCAvIDI7XG5cdFx0eDEgPSB2bS54IC0gaGFsZjtcblx0XHR4MiA9IHZtLnggKyBoYWxmO1xuXHRcdHkxID0gTWF0aC5taW4odm0ueSwgdm0uYmFzZSk7XG5cdFx0eTIgPSBNYXRoLm1heCh2bS55LCB2bS5iYXNlKTtcblx0fSBlbHNlIHtcblx0XHRoYWxmID0gdm0uaGVpZ2h0IC8gMjtcblx0XHR4MSA9IE1hdGgubWluKHZtLngsIHZtLmJhc2UpO1xuXHRcdHgyID0gTWF0aC5tYXgodm0ueCwgdm0uYmFzZSk7XG5cdFx0eTEgPSB2bS55IC0gaGFsZjtcblx0XHR5MiA9IHZtLnkgKyBoYWxmO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRsZWZ0OiB4MSxcblx0XHR0b3A6IHkxLFxuXHRcdHJpZ2h0OiB4Mixcblx0XHRib3R0b206IHkyXG5cdH07XG59XG5cbmZ1bmN0aW9uIHN3YXAob3JpZywgdjEsIHYyKSB7XG5cdHJldHVybiBvcmlnID09PSB2MSA/IHYyIDogb3JpZyA9PT0gdjIgPyB2MSA6IG9yaWc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQm9yZGVyU2tpcHBlZCh2bSkge1xuXHR2YXIgZWRnZSA9IHZtLmJvcmRlclNraXBwZWQ7XG5cdHZhciByZXMgPSB7fTtcblxuXHRpZiAoIWVkZ2UpIHtcblx0XHRyZXR1cm4gcmVzO1xuXHR9XG5cblx0aWYgKHZtLmhvcml6b250YWwpIHtcblx0XHRpZiAodm0uYmFzZSA+IHZtLngpIHtcblx0XHRcdGVkZ2UgPSBzd2FwKGVkZ2UsICdsZWZ0JywgJ3JpZ2h0Jyk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHZtLmJhc2UgPCB2bS55KSB7XG5cdFx0ZWRnZSA9IHN3YXAoZWRnZSwgJ2JvdHRvbScsICd0b3AnKTtcblx0fVxuXG5cdHJlc1tlZGdlXSA9IHRydWU7XG5cdHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQm9yZGVyV2lkdGgodm0sIG1heFcsIG1heEgpIHtcblx0dmFyIHZhbHVlID0gdm0uYm9yZGVyV2lkdGg7XG5cdHZhciBza2lwID0gcGFyc2VCb3JkZXJTa2lwcGVkKHZtKTtcblx0dmFyIHQsIHIsIGIsIGw7XG5cblx0aWYgKGhlbHBlcnMkMS5pc09iamVjdCh2YWx1ZSkpIHtcblx0XHR0ID0gK3ZhbHVlLnRvcCB8fCAwO1xuXHRcdHIgPSArdmFsdWUucmlnaHQgfHwgMDtcblx0XHRiID0gK3ZhbHVlLmJvdHRvbSB8fCAwO1xuXHRcdGwgPSArdmFsdWUubGVmdCB8fCAwO1xuXHR9IGVsc2Uge1xuXHRcdHQgPSByID0gYiA9IGwgPSArdmFsdWUgfHwgMDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0dDogc2tpcC50b3AgfHwgKHQgPCAwKSA/IDAgOiB0ID4gbWF4SCA/IG1heEggOiB0LFxuXHRcdHI6IHNraXAucmlnaHQgfHwgKHIgPCAwKSA/IDAgOiByID4gbWF4VyA/IG1heFcgOiByLFxuXHRcdGI6IHNraXAuYm90dG9tIHx8IChiIDwgMCkgPyAwIDogYiA+IG1heEggPyBtYXhIIDogYixcblx0XHRsOiBza2lwLmxlZnQgfHwgKGwgPCAwKSA/IDAgOiBsID4gbWF4VyA/IG1heFcgOiBsXG5cdH07XG59XG5cbmZ1bmN0aW9uIGJvdW5kaW5nUmVjdHModm0pIHtcblx0dmFyIGJvdW5kcyA9IGdldEJhckJvdW5kcyh2bSk7XG5cdHZhciB3aWR0aCA9IGJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0O1xuXHR2YXIgaGVpZ2h0ID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7XG5cdHZhciBib3JkZXIgPSBwYXJzZUJvcmRlcldpZHRoKHZtLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuXG5cdHJldHVybiB7XG5cdFx0b3V0ZXI6IHtcblx0XHRcdHg6IGJvdW5kcy5sZWZ0LFxuXHRcdFx0eTogYm91bmRzLnRvcCxcblx0XHRcdHc6IHdpZHRoLFxuXHRcdFx0aDogaGVpZ2h0XG5cdFx0fSxcblx0XHRpbm5lcjoge1xuXHRcdFx0eDogYm91bmRzLmxlZnQgKyBib3JkZXIubCxcblx0XHRcdHk6IGJvdW5kcy50b3AgKyBib3JkZXIudCxcblx0XHRcdHc6IHdpZHRoIC0gYm9yZGVyLmwgLSBib3JkZXIucixcblx0XHRcdGg6IGhlaWdodCAtIGJvcmRlci50IC0gYm9yZGVyLmJcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIGluUmFuZ2Uodm0sIHgsIHkpIHtcblx0dmFyIHNraXBYID0geCA9PT0gbnVsbDtcblx0dmFyIHNraXBZID0geSA9PT0gbnVsbDtcblx0dmFyIGJvdW5kcyA9ICF2bSB8fCAoc2tpcFggJiYgc2tpcFkpID8gZmFsc2UgOiBnZXRCYXJCb3VuZHModm0pO1xuXG5cdHJldHVybiBib3VuZHNcblx0XHQmJiAoc2tpcFggfHwgeCA+PSBib3VuZHMubGVmdCAmJiB4IDw9IGJvdW5kcy5yaWdodClcblx0XHQmJiAoc2tpcFkgfHwgeSA+PSBib3VuZHMudG9wICYmIHkgPD0gYm91bmRzLmJvdHRvbSk7XG59XG5cbnZhciBlbGVtZW50X3JlY3RhbmdsZSA9IGNvcmVfZWxlbWVudC5leHRlbmQoe1xuXHRkcmF3OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY3R4ID0gdGhpcy5fY2hhcnQuY3R4O1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0dmFyIHJlY3RzID0gYm91bmRpbmdSZWN0cyh2bSk7XG5cdFx0dmFyIG91dGVyID0gcmVjdHMub3V0ZXI7XG5cdFx0dmFyIGlubmVyID0gcmVjdHMuaW5uZXI7XG5cblx0XHRjdHguZmlsbFN0eWxlID0gdm0uYmFja2dyb3VuZENvbG9yO1xuXHRcdGN0eC5maWxsUmVjdChvdXRlci54LCBvdXRlci55LCBvdXRlci53LCBvdXRlci5oKTtcblxuXHRcdGlmIChvdXRlci53ID09PSBpbm5lci53ICYmIG91dGVyLmggPT09IGlubmVyLmgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjdHguc2F2ZSgpO1xuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRjdHgucmVjdChvdXRlci54LCBvdXRlci55LCBvdXRlci53LCBvdXRlci5oKTtcblx0XHRjdHguY2xpcCgpO1xuXHRcdGN0eC5maWxsU3R5bGUgPSB2bS5ib3JkZXJDb2xvcjtcblx0XHRjdHgucmVjdChpbm5lci54LCBpbm5lci55LCBpbm5lci53LCBpbm5lci5oKTtcblx0XHRjdHguZmlsbCgnZXZlbm9kZCcpO1xuXHRcdGN0eC5yZXN0b3JlKCk7XG5cdH0sXG5cblx0aGVpZ2h0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHJldHVybiB2bS5iYXNlIC0gdm0ueTtcblx0fSxcblxuXHRpblJhbmdlOiBmdW5jdGlvbihtb3VzZVgsIG1vdXNlWSkge1xuXHRcdHJldHVybiBpblJhbmdlKHRoaXMuX3ZpZXcsIG1vdXNlWCwgbW91c2VZKTtcblx0fSxcblxuXHRpbkxhYmVsUmFuZ2U6IGZ1bmN0aW9uKG1vdXNlWCwgbW91c2VZKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHRyZXR1cm4gaXNWZXJ0aWNhbCh2bSlcblx0XHRcdD8gaW5SYW5nZSh2bSwgbW91c2VYLCBudWxsKVxuXHRcdFx0OiBpblJhbmdlKHZtLCBudWxsLCBtb3VzZVkpO1xuXHR9LFxuXG5cdGluWFJhbmdlOiBmdW5jdGlvbihtb3VzZVgpIHtcblx0XHRyZXR1cm4gaW5SYW5nZSh0aGlzLl92aWV3LCBtb3VzZVgsIG51bGwpO1xuXHR9LFxuXG5cdGluWVJhbmdlOiBmdW5jdGlvbihtb3VzZVkpIHtcblx0XHRyZXR1cm4gaW5SYW5nZSh0aGlzLl92aWV3LCBudWxsLCBtb3VzZVkpO1xuXHR9LFxuXG5cdGdldENlbnRlclBvaW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHZhciB4LCB5O1xuXHRcdGlmIChpc1ZlcnRpY2FsKHZtKSkge1xuXHRcdFx0eCA9IHZtLng7XG5cdFx0XHR5ID0gKHZtLnkgKyB2bS5iYXNlKSAvIDI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHggPSAodm0ueCArIHZtLmJhc2UpIC8gMjtcblx0XHRcdHkgPSB2bS55O1xuXHRcdH1cblxuXHRcdHJldHVybiB7eDogeCwgeTogeX07XG5cdH0sXG5cblx0Z2V0QXJlYTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblxuXHRcdHJldHVybiBpc1ZlcnRpY2FsKHZtKVxuXHRcdFx0PyB2bS53aWR0aCAqIE1hdGguYWJzKHZtLnkgLSB2bS5iYXNlKVxuXHRcdFx0OiB2bS5oZWlnaHQgKiBNYXRoLmFicyh2bS54IC0gdm0uYmFzZSk7XG5cdH0sXG5cblx0dG9vbHRpcFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR4OiB2bS54LFxuXHRcdFx0eTogdm0ueVxuXHRcdH07XG5cdH1cbn0pO1xuXG52YXIgZWxlbWVudHMgPSB7fTtcbnZhciBBcmMgPSBlbGVtZW50X2FyYztcbnZhciBMaW5lID0gZWxlbWVudF9saW5lO1xudmFyIFBvaW50ID0gZWxlbWVudF9wb2ludDtcbnZhciBSZWN0YW5nbGUgPSBlbGVtZW50X3JlY3RhbmdsZTtcbmVsZW1lbnRzLkFyYyA9IEFyYztcbmVsZW1lbnRzLkxpbmUgPSBMaW5lO1xuZWxlbWVudHMuUG9pbnQgPSBQb2ludDtcbmVsZW1lbnRzLlJlY3RhbmdsZSA9IFJlY3RhbmdsZTtcblxudmFyIHJlc29sdmUkMSA9IGhlbHBlcnMkMS5vcHRpb25zLnJlc29sdmU7XG5cbmNvcmVfZGVmYXVsdHMuX3NldCgnYmFyJywge1xuXHRob3Zlcjoge1xuXHRcdG1vZGU6ICdsYWJlbCdcblx0fSxcblxuXHRzY2FsZXM6IHtcblx0XHR4QXhlczogW3tcblx0XHRcdHR5cGU6ICdjYXRlZ29yeScsXG5cdFx0XHRjYXRlZ29yeVBlcmNlbnRhZ2U6IDAuOCxcblx0XHRcdGJhclBlcmNlbnRhZ2U6IDAuOSxcblx0XHRcdG9mZnNldDogdHJ1ZSxcblx0XHRcdGdyaWRMaW5lczoge1xuXHRcdFx0XHRvZmZzZXRHcmlkTGluZXM6IHRydWVcblx0XHRcdH1cblx0XHR9XSxcblxuXHRcdHlBeGVzOiBbe1xuXHRcdFx0dHlwZTogJ2xpbmVhcidcblx0XHR9XVxuXHR9XG59KTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgXCJvcHRpbWFsXCIgc2FtcGxlIHNpemUgdG8gbWFpbnRhaW4gYmFycyBlcXVhbGx5IHNpemVkIHdoaWxlIHByZXZlbnRpbmcgb3ZlcmxhcC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVNaW5TYW1wbGVTaXplKHNjYWxlLCBwaXhlbHMpIHtcblx0dmFyIG1pbiA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpID8gc2NhbGUud2lkdGggOiBzY2FsZS5oZWlnaHQ7XG5cdHZhciB0aWNrcyA9IHNjYWxlLmdldFRpY2tzKCk7XG5cdHZhciBwcmV2LCBjdXJyLCBpLCBpbGVuO1xuXG5cdGZvciAoaSA9IDEsIGlsZW4gPSBwaXhlbHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0bWluID0gTWF0aC5taW4obWluLCBNYXRoLmFicyhwaXhlbHNbaV0gLSBwaXhlbHNbaSAtIDFdKSk7XG5cdH1cblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0Y3VyciA9IHNjYWxlLmdldFBpeGVsRm9yVGljayhpKTtcblx0XHRtaW4gPSBpID4gMCA/IE1hdGgubWluKG1pbiwgY3VyciAtIHByZXYpIDogbWluO1xuXHRcdHByZXYgPSBjdXJyO1xuXHR9XG5cblx0cmV0dXJuIG1pbjtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhbiBcImlkZWFsXCIgY2F0ZWdvcnkgYmFzZWQgb24gdGhlIGFic29sdXRlIGJhciB0aGlja25lc3Mgb3IsIGlmIHVuZGVmaW5lZCBvciBudWxsLFxuICogdXNlcyB0aGUgc21hbGxlc3QgaW50ZXJ2YWwgKHNlZSBjb21wdXRlTWluU2FtcGxlU2l6ZSkgdGhhdCBwcmV2ZW50cyBiYXIgb3ZlcmxhcHBpbmcuIFRoaXNcbiAqIG1vZGUgY3VycmVudGx5IGFsd2F5cyBnZW5lcmF0ZXMgYmFycyBlcXVhbGx5IHNpemVkICh1bnRpbCB3ZSBpbnRyb2R1Y2Ugc2NyaXB0YWJsZSBvcHRpb25zPykuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjb21wdXRlRml0Q2F0ZWdvcnlUcmFpdHMoaW5kZXgsIHJ1bGVyLCBvcHRpb25zKSB7XG5cdHZhciB0aGlja25lc3MgPSBvcHRpb25zLmJhclRoaWNrbmVzcztcblx0dmFyIGNvdW50ID0gcnVsZXIuc3RhY2tDb3VudDtcblx0dmFyIGN1cnIgPSBydWxlci5waXhlbHNbaW5kZXhdO1xuXHR2YXIgc2l6ZSwgcmF0aW87XG5cblx0aWYgKGhlbHBlcnMkMS5pc051bGxPclVuZGVmKHRoaWNrbmVzcykpIHtcblx0XHRzaXplID0gcnVsZXIubWluICogb3B0aW9ucy5jYXRlZ29yeVBlcmNlbnRhZ2U7XG5cdFx0cmF0aW8gPSBvcHRpb25zLmJhclBlcmNlbnRhZ2U7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gV2hlbiBiYXIgdGhpY2tuZXNzIGlzIGVuZm9yY2VkLCBjYXRlZ29yeSBhbmQgYmFyIHBlcmNlbnRhZ2VzIGFyZSBpZ25vcmVkLlxuXHRcdC8vIE5vdGUoU0IpOiB3ZSBjb3VsZCBhZGQgc3VwcG9ydCBmb3IgcmVsYXRpdmUgYmFyIHRoaWNrbmVzcyAoZS5nLiBiYXJUaGlja25lc3M6ICc1MCUnKVxuXHRcdC8vIGFuZCBkZXByZWNhdGUgYmFyUGVyY2VudGFnZSBzaW5jZSB0aGlzIHZhbHVlIGlzIGlnbm9yZWQgd2hlbiB0aGlja25lc3MgaXMgYWJzb2x1dGUuXG5cdFx0c2l6ZSA9IHRoaWNrbmVzcyAqIGNvdW50O1xuXHRcdHJhdGlvID0gMTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Y2h1bms6IHNpemUgLyBjb3VudCxcblx0XHRyYXRpbzogcmF0aW8sXG5cdFx0c3RhcnQ6IGN1cnIgLSAoc2l6ZSAvIDIpXG5cdH07XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgYW4gXCJvcHRpbWFsXCIgY2F0ZWdvcnkgdGhhdCBnbG9iYWxseSBhcnJhbmdlcyBiYXJzIHNpZGUgYnkgc2lkZSAobm8gZ2FwIHdoZW5cbiAqIHBlcmNlbnRhZ2Ugb3B0aW9ucyBhcmUgMSksIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBhbmQgZm9sbG93aW5nIGNhdGVnb3JpZXMuIFRoaXMgbW9kZVxuICogZ2VuZXJhdGVzIGJhcnMgd2l0aCBkaWZmZXJlbnQgd2lkdGhzIHdoZW4gZGF0YSBhcmUgbm90IGV2ZW5seSBzcGFjZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjb21wdXRlRmxleENhdGVnb3J5VHJhaXRzKGluZGV4LCBydWxlciwgb3B0aW9ucykge1xuXHR2YXIgcGl4ZWxzID0gcnVsZXIucGl4ZWxzO1xuXHR2YXIgY3VyciA9IHBpeGVsc1tpbmRleF07XG5cdHZhciBwcmV2ID0gaW5kZXggPiAwID8gcGl4ZWxzW2luZGV4IC0gMV0gOiBudWxsO1xuXHR2YXIgbmV4dCA9IGluZGV4IDwgcGl4ZWxzLmxlbmd0aCAtIDEgPyBwaXhlbHNbaW5kZXggKyAxXSA6IG51bGw7XG5cdHZhciBwZXJjZW50ID0gb3B0aW9ucy5jYXRlZ29yeVBlcmNlbnRhZ2U7XG5cdHZhciBzdGFydCwgc2l6ZTtcblxuXHRpZiAocHJldiA9PT0gbnVsbCkge1xuXHRcdC8vIGZpcnN0IGRhdGE6IGl0cyBzaXplIGlzIGRvdWJsZSBiYXNlZCBvbiB0aGUgbmV4dCBwb2ludCBvcixcblx0XHQvLyBpZiBpdCdzIGFsc28gdGhlIGxhc3QgZGF0YSwgd2UgdXNlIHRoZSBzY2FsZSBzaXplLlxuXHRcdHByZXYgPSBjdXJyIC0gKG5leHQgPT09IG51bGwgPyBydWxlci5lbmQgLSBydWxlci5zdGFydCA6IG5leHQgLSBjdXJyKTtcblx0fVxuXG5cdGlmIChuZXh0ID09PSBudWxsKSB7XG5cdFx0Ly8gbGFzdCBkYXRhOiBpdHMgc2l6ZSBpcyBhbHNvIGRvdWJsZSBiYXNlZCBvbiB0aGUgcHJldmlvdXMgcG9pbnQuXG5cdFx0bmV4dCA9IGN1cnIgKyBjdXJyIC0gcHJldjtcblx0fVxuXG5cdHN0YXJ0ID0gY3VyciAtIChjdXJyIC0gTWF0aC5taW4ocHJldiwgbmV4dCkpIC8gMiAqIHBlcmNlbnQ7XG5cdHNpemUgPSBNYXRoLmFicyhuZXh0IC0gcHJldikgLyAyICogcGVyY2VudDtcblxuXHRyZXR1cm4ge1xuXHRcdGNodW5rOiBzaXplIC8gcnVsZXIuc3RhY2tDb3VudCxcblx0XHRyYXRpbzogb3B0aW9ucy5iYXJQZXJjZW50YWdlLFxuXHRcdHN0YXJ0OiBzdGFydFxuXHR9O1xufVxuXG52YXIgY29udHJvbGxlcl9iYXIgPSBjb3JlX2RhdGFzZXRDb250cm9sbGVyLmV4dGVuZCh7XG5cblx0ZGF0YUVsZW1lbnRUeXBlOiBlbGVtZW50cy5SZWN0YW5nbGUsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbWV0YTtcblxuXHRcdGNvcmVfZGF0YXNldENvbnRyb2xsZXIucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkobWUsIGFyZ3VtZW50cyk7XG5cblx0XHRtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdG1ldGEuc3RhY2sgPSBtZS5nZXREYXRhc2V0KCkuc3RhY2s7XG5cdFx0bWV0YS5iYXIgPSB0cnVlO1xuXHR9LFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24ocmVzZXQpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciByZWN0cyA9IG1lLmdldE1ldGEoKS5kYXRhO1xuXHRcdHZhciBpLCBpbGVuO1xuXG5cdFx0bWUuX3J1bGVyID0gbWUuZ2V0UnVsZXIoKTtcblxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSByZWN0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdG1lLnVwZGF0ZUVsZW1lbnQocmVjdHNbaV0sIGksIHJlc2V0KTtcblx0XHR9XG5cdH0sXG5cblx0dXBkYXRlRWxlbWVudDogZnVuY3Rpb24ocmVjdGFuZ2xlLCBpbmRleCwgcmVzZXQpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXHRcdHZhciBvcHRpb25zID0gbWUuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyhyZWN0YW5nbGUsIGluZGV4KTtcblxuXHRcdHJlY3RhbmdsZS5feFNjYWxlID0gbWUuZ2V0U2NhbGVGb3JJZChtZXRhLnhBeGlzSUQpO1xuXHRcdHJlY3RhbmdsZS5feVNjYWxlID0gbWUuZ2V0U2NhbGVGb3JJZChtZXRhLnlBeGlzSUQpO1xuXHRcdHJlY3RhbmdsZS5fZGF0YXNldEluZGV4ID0gbWUuaW5kZXg7XG5cdFx0cmVjdGFuZ2xlLl9pbmRleCA9IGluZGV4O1xuXHRcdHJlY3RhbmdsZS5fbW9kZWwgPSB7XG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLFxuXHRcdFx0Ym9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG5cdFx0XHRib3JkZXJTa2lwcGVkOiBvcHRpb25zLmJvcmRlclNraXBwZWQsXG5cdFx0XHRib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcblx0XHRcdGRhdGFzZXRMYWJlbDogZGF0YXNldC5sYWJlbCxcblx0XHRcdGxhYmVsOiBtZS5jaGFydC5kYXRhLmxhYmVsc1tpbmRleF1cblx0XHR9O1xuXG5cdFx0bWUuX3VwZGF0ZUVsZW1lbnRHZW9tZXRyeShyZWN0YW5nbGUsIGluZGV4LCByZXNldCk7XG5cblx0XHRyZWN0YW5nbGUucGl2b3QoKTtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF91cGRhdGVFbGVtZW50R2VvbWV0cnk6IGZ1bmN0aW9uKHJlY3RhbmdsZSwgaW5kZXgsIHJlc2V0KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbW9kZWwgPSByZWN0YW5nbGUuX21vZGVsO1xuXHRcdHZhciB2c2NhbGUgPSBtZS5fZ2V0VmFsdWVTY2FsZSgpO1xuXHRcdHZhciBiYXNlID0gdnNjYWxlLmdldEJhc2VQaXhlbCgpO1xuXHRcdHZhciBob3Jpem9udGFsID0gdnNjYWxlLmlzSG9yaXpvbnRhbCgpO1xuXHRcdHZhciBydWxlciA9IG1lLl9ydWxlciB8fCBtZS5nZXRSdWxlcigpO1xuXHRcdHZhciB2cGl4ZWxzID0gbWUuY2FsY3VsYXRlQmFyVmFsdWVQaXhlbHMobWUuaW5kZXgsIGluZGV4KTtcblx0XHR2YXIgaXBpeGVscyA9IG1lLmNhbGN1bGF0ZUJhckluZGV4UGl4ZWxzKG1lLmluZGV4LCBpbmRleCwgcnVsZXIpO1xuXG5cdFx0bW9kZWwuaG9yaXpvbnRhbCA9IGhvcml6b250YWw7XG5cdFx0bW9kZWwuYmFzZSA9IHJlc2V0ID8gYmFzZSA6IHZwaXhlbHMuYmFzZTtcblx0XHRtb2RlbC54ID0gaG9yaXpvbnRhbCA/IHJlc2V0ID8gYmFzZSA6IHZwaXhlbHMuaGVhZCA6IGlwaXhlbHMuY2VudGVyO1xuXHRcdG1vZGVsLnkgPSBob3Jpem9udGFsID8gaXBpeGVscy5jZW50ZXIgOiByZXNldCA/IGJhc2UgOiB2cGl4ZWxzLmhlYWQ7XG5cdFx0bW9kZWwuaGVpZ2h0ID0gaG9yaXpvbnRhbCA/IGlwaXhlbHMuc2l6ZSA6IHVuZGVmaW5lZDtcblx0XHRtb2RlbC53aWR0aCA9IGhvcml6b250YWwgPyB1bmRlZmluZWQgOiBpcGl4ZWxzLnNpemU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHN0YWNrcyBiYXNlZCBvbiBncm91cHMgYW5kIGJhciB2aXNpYmlsaXR5LlxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2xhc3RdIC0gVGhlIGRhdGFzZXQgaW5kZXhcblx0ICogQHJldHVybnMge3N0cmluZ1tdfSBUaGUgbGlzdCBvZiBzdGFjayBJRHNcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRTdGFja3M6IGZ1bmN0aW9uKGxhc3QpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBzY2FsZSA9IG1lLl9nZXRJbmRleFNjYWxlKCk7XG5cdFx0dmFyIHN0YWNrZWQgPSBzY2FsZS5vcHRpb25zLnN0YWNrZWQ7XG5cdFx0dmFyIGlsZW4gPSBsYXN0ID09PSB1bmRlZmluZWQgPyBjaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aCA6IGxhc3QgKyAxO1xuXHRcdHZhciBzdGFja3MgPSBbXTtcblx0XHR2YXIgaSwgbWV0YTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcblx0XHRcdGlmIChtZXRhLmJhciAmJiBjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpICYmXG5cdFx0XHRcdChzdGFja2VkID09PSBmYWxzZSB8fFxuXHRcdFx0XHQoc3RhY2tlZCA9PT0gdHJ1ZSAmJiBzdGFja3MuaW5kZXhPZihtZXRhLnN0YWNrKSA9PT0gLTEpIHx8XG5cdFx0XHRcdChzdGFja2VkID09PSB1bmRlZmluZWQgJiYgKG1ldGEuc3RhY2sgPT09IHVuZGVmaW5lZCB8fCBzdGFja3MuaW5kZXhPZihtZXRhLnN0YWNrKSA9PT0gLTEpKSkpIHtcblx0XHRcdFx0c3RhY2tzLnB1c2gobWV0YS5zdGFjayk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN0YWNrcztcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgZWZmZWN0aXZlIG51bWJlciBvZiBzdGFja3MgYmFzZWQgb24gZ3JvdXBzIGFuZCBiYXIgdmlzaWJpbGl0eS5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGdldFN0YWNrQ291bnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLl9nZXRTdGFja3MoKS5sZW5ndGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHN0YWNrIGluZGV4IGZvciB0aGUgZ2l2ZW4gZGF0YXNldCBiYXNlZCBvbiBncm91cHMgYW5kIGJhciB2aXNpYmlsaXR5LlxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RhdGFzZXRJbmRleF0gLSBUaGUgZGF0YXNldCBpbmRleFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVGhlIHN0YWNrIG5hbWUgdG8gZmluZFxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3RhY2sgaW5kZXhcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGdldFN0YWNrSW5kZXg6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCwgbmFtZSkge1xuXHRcdHZhciBzdGFja3MgPSB0aGlzLl9nZXRTdGFja3MoZGF0YXNldEluZGV4KTtcblx0XHR2YXIgaW5kZXggPSAobmFtZSAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0PyBzdGFja3MuaW5kZXhPZihuYW1lKVxuXHRcdFx0OiAtMTsgLy8gaW5kZXhPZiByZXR1cm5zIC0xIGlmIGVsZW1lbnQgaXMgbm90IHByZXNlbnRcblxuXHRcdHJldHVybiAoaW5kZXggPT09IC0xKVxuXHRcdFx0PyBzdGFja3MubGVuZ3RoIC0gMVxuXHRcdFx0OiBpbmRleDtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGdldFJ1bGVyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBzY2FsZSA9IG1lLl9nZXRJbmRleFNjYWxlKCk7XG5cdFx0dmFyIHN0YWNrQ291bnQgPSBtZS5nZXRTdGFja0NvdW50KCk7XG5cdFx0dmFyIGRhdGFzZXRJbmRleCA9IG1lLmluZGV4O1xuXHRcdHZhciBpc0hvcml6b250YWwgPSBzY2FsZS5pc0hvcml6b250YWwoKTtcblx0XHR2YXIgc3RhcnQgPSBpc0hvcml6b250YWwgPyBzY2FsZS5sZWZ0IDogc2NhbGUudG9wO1xuXHRcdHZhciBlbmQgPSBzdGFydCArIChpc0hvcml6b250YWwgPyBzY2FsZS53aWR0aCA6IHNjYWxlLmhlaWdodCk7XG5cdFx0dmFyIHBpeGVscyA9IFtdO1xuXHRcdHZhciBpLCBpbGVuLCBtaW47XG5cblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gbWUuZ2V0TWV0YSgpLmRhdGEubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRwaXhlbHMucHVzaChzY2FsZS5nZXRQaXhlbEZvclZhbHVlKG51bGwsIGksIGRhdGFzZXRJbmRleCkpO1xuXHRcdH1cblxuXHRcdG1pbiA9IGhlbHBlcnMkMS5pc051bGxPclVuZGVmKHNjYWxlLm9wdGlvbnMuYmFyVGhpY2tuZXNzKVxuXHRcdFx0PyBjb21wdXRlTWluU2FtcGxlU2l6ZShzY2FsZSwgcGl4ZWxzKVxuXHRcdFx0OiAtMTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRtaW46IG1pbixcblx0XHRcdHBpeGVsczogcGl4ZWxzLFxuXHRcdFx0c3RhcnQ6IHN0YXJ0LFxuXHRcdFx0ZW5kOiBlbmQsXG5cdFx0XHRzdGFja0NvdW50OiBzdGFja0NvdW50LFxuXHRcdFx0c2NhbGU6IHNjYWxlXG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogTm90ZTogcGl4ZWwgdmFsdWVzIGFyZSBub3QgY2xhbXBlZCB0byB0aGUgc2NhbGUgYXJlYS5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGNhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzOiBmdW5jdGlvbihkYXRhc2V0SW5kZXgsIGluZGV4KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHR2YXIgc2NhbGUgPSBtZS5fZ2V0VmFsdWVTY2FsZSgpO1xuXHRcdHZhciBpc0hvcml6b250YWwgPSBzY2FsZS5pc0hvcml6b250YWwoKTtcblx0XHR2YXIgZGF0YXNldHMgPSBjaGFydC5kYXRhLmRhdGFzZXRzO1xuXHRcdHZhciB2YWx1ZSA9ICtzY2FsZS5nZXRSaWdodFZhbHVlKGRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0pO1xuXHRcdHZhciBtaW5CYXJMZW5ndGggPSBzY2FsZS5vcHRpb25zLm1pbkJhckxlbmd0aDtcblx0XHR2YXIgc3RhY2tlZCA9IHNjYWxlLm9wdGlvbnMuc3RhY2tlZDtcblx0XHR2YXIgc3RhY2sgPSBtZXRhLnN0YWNrO1xuXHRcdHZhciBzdGFydCA9IDA7XG5cdFx0dmFyIGksIGltZXRhLCBpdmFsdWUsIGJhc2UsIGhlYWQsIHNpemU7XG5cblx0XHRpZiAoc3RhY2tlZCB8fCAoc3RhY2tlZCA9PT0gdW5kZWZpbmVkICYmIHN0YWNrICE9PSB1bmRlZmluZWQpKSB7XG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YXNldEluZGV4OyArK2kpIHtcblx0XHRcdFx0aW1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcblxuXHRcdFx0XHRpZiAoaW1ldGEuYmFyICYmXG5cdFx0XHRcdFx0aW1ldGEuc3RhY2sgPT09IHN0YWNrICYmXG5cdFx0XHRcdFx0aW1ldGEuY29udHJvbGxlci5fZ2V0VmFsdWVTY2FsZUlkKCkgPT09IHNjYWxlLmlkICYmXG5cdFx0XHRcdFx0Y2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xuXG5cdFx0XHRcdFx0aXZhbHVlID0gK3NjYWxlLmdldFJpZ2h0VmFsdWUoZGF0YXNldHNbaV0uZGF0YVtpbmRleF0pO1xuXHRcdFx0XHRcdGlmICgodmFsdWUgPCAwICYmIGl2YWx1ZSA8IDApIHx8ICh2YWx1ZSA+PSAwICYmIGl2YWx1ZSA+IDApKSB7XG5cdFx0XHRcdFx0XHRzdGFydCArPSBpdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YmFzZSA9IHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3RhcnQpO1xuXHRcdGhlYWQgPSBzY2FsZS5nZXRQaXhlbEZvclZhbHVlKHN0YXJ0ICsgdmFsdWUpO1xuXHRcdHNpemUgPSBoZWFkIC0gYmFzZTtcblxuXHRcdGlmIChtaW5CYXJMZW5ndGggIT09IHVuZGVmaW5lZCAmJiBNYXRoLmFicyhzaXplKSA8IG1pbkJhckxlbmd0aCkge1xuXHRcdFx0c2l6ZSA9IG1pbkJhckxlbmd0aDtcblx0XHRcdGlmICh2YWx1ZSA+PSAwICYmICFpc0hvcml6b250YWwgfHwgdmFsdWUgPCAwICYmIGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0XHRoZWFkID0gYmFzZSAtIG1pbkJhckxlbmd0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhlYWQgPSBiYXNlICsgbWluQmFyTGVuZ3RoO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRzaXplOiBzaXplLFxuXHRcdFx0YmFzZTogYmFzZSxcblx0XHRcdGhlYWQ6IGhlYWQsXG5cdFx0XHRjZW50ZXI6IGhlYWQgKyBzaXplIC8gMlxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRjYWxjdWxhdGVCYXJJbmRleFBpeGVsczogZnVuY3Rpb24oZGF0YXNldEluZGV4LCBpbmRleCwgcnVsZXIpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRpb25zID0gcnVsZXIuc2NhbGUub3B0aW9ucztcblx0XHR2YXIgcmFuZ2UgPSBvcHRpb25zLmJhclRoaWNrbmVzcyA9PT0gJ2ZsZXgnXG5cdFx0XHQ/IGNvbXB1dGVGbGV4Q2F0ZWdvcnlUcmFpdHMoaW5kZXgsIHJ1bGVyLCBvcHRpb25zKVxuXHRcdFx0OiBjb21wdXRlRml0Q2F0ZWdvcnlUcmFpdHMoaW5kZXgsIHJ1bGVyLCBvcHRpb25zKTtcblxuXHRcdHZhciBzdGFja0luZGV4ID0gbWUuZ2V0U3RhY2tJbmRleChkYXRhc2V0SW5kZXgsIG1lLmdldE1ldGEoKS5zdGFjayk7XG5cdFx0dmFyIGNlbnRlciA9IHJhbmdlLnN0YXJ0ICsgKHJhbmdlLmNodW5rICogc3RhY2tJbmRleCkgKyAocmFuZ2UuY2h1bmsgLyAyKTtcblx0XHR2YXIgc2l6ZSA9IE1hdGgubWluKFxuXHRcdFx0aGVscGVycyQxLnZhbHVlT3JEZWZhdWx0KG9wdGlvbnMubWF4QmFyVGhpY2tuZXNzLCBJbmZpbml0eSksXG5cdFx0XHRyYW5nZS5jaHVuayAqIHJhbmdlLnJhdGlvKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRiYXNlOiBjZW50ZXIgLSBzaXplIC8gMixcblx0XHRcdGhlYWQ6IGNlbnRlciArIHNpemUgLyAyLFxuXHRcdFx0Y2VudGVyOiBjZW50ZXIsXG5cdFx0XHRzaXplOiBzaXplXG5cdFx0fTtcblx0fSxcblxuXHRkcmF3OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBzY2FsZSA9IG1lLl9nZXRWYWx1ZVNjYWxlKCk7XG5cdFx0dmFyIHJlY3RzID0gbWUuZ2V0TWV0YSgpLmRhdGE7XG5cdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0dmFyIGlsZW4gPSByZWN0cy5sZW5ndGg7XG5cdFx0dmFyIGkgPSAwO1xuXG5cdFx0aGVscGVycyQxLmNhbnZhcy5jbGlwQXJlYShjaGFydC5jdHgsIGNoYXJ0LmNoYXJ0QXJlYSk7XG5cblx0XHRmb3IgKDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0aWYgKCFpc05hTihzY2FsZS5nZXRSaWdodFZhbHVlKGRhdGFzZXQuZGF0YVtpXSkpKSB7XG5cdFx0XHRcdHJlY3RzW2ldLmRyYXcoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRoZWxwZXJzJDEuY2FudmFzLnVuY2xpcEFyZWEoY2hhcnQuY3R4KTtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZXNvbHZlRWxlbWVudE9wdGlvbnM6IGZ1bmN0aW9uKHJlY3RhbmdsZSwgaW5kZXgpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBkYXRhc2V0cyA9IGNoYXJ0LmRhdGEuZGF0YXNldHM7XG5cdFx0dmFyIGRhdGFzZXQgPSBkYXRhc2V0c1ttZS5pbmRleF07XG5cdFx0dmFyIGN1c3RvbSA9IHJlY3RhbmdsZS5jdXN0b20gfHwge307XG5cdFx0dmFyIG9wdGlvbnMgPSBjaGFydC5vcHRpb25zLmVsZW1lbnRzLnJlY3RhbmdsZTtcblx0XHR2YXIgdmFsdWVzID0ge307XG5cdFx0dmFyIGksIGlsZW4sIGtleTtcblxuXHRcdC8vIFNjcmlwdGFibGUgb3B0aW9uc1xuXHRcdHZhciBjb250ZXh0ID0ge1xuXHRcdFx0Y2hhcnQ6IGNoYXJ0LFxuXHRcdFx0ZGF0YUluZGV4OiBpbmRleCxcblx0XHRcdGRhdGFzZXQ6IGRhdGFzZXQsXG5cdFx0XHRkYXRhc2V0SW5kZXg6IG1lLmluZGV4XG5cdFx0fTtcblxuXHRcdHZhciBrZXlzID0gW1xuXHRcdFx0J2JhY2tncm91bmRDb2xvcicsXG5cdFx0XHQnYm9yZGVyQ29sb3InLFxuXHRcdFx0J2JvcmRlclNraXBwZWQnLFxuXHRcdFx0J2JvcmRlcldpZHRoJ1xuXHRcdF07XG5cblx0XHRmb3IgKGkgPSAwLCBpbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdGtleSA9IGtleXNbaV07XG5cdFx0XHR2YWx1ZXNba2V5XSA9IHJlc29sdmUkMShbXG5cdFx0XHRcdGN1c3RvbVtrZXldLFxuXHRcdFx0XHRkYXRhc2V0W2tleV0sXG5cdFx0XHRcdG9wdGlvbnNba2V5XVxuXHRcdFx0XSwgY29udGV4dCwgaW5kZXgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZXM7XG5cdH1cbn0pO1xuXG52YXIgdmFsdWVPckRlZmF1bHQkMyA9IGhlbHBlcnMkMS52YWx1ZU9yRGVmYXVsdDtcbnZhciByZXNvbHZlJDIgPSBoZWxwZXJzJDEub3B0aW9ucy5yZXNvbHZlO1xuXG5jb3JlX2RlZmF1bHRzLl9zZXQoJ2J1YmJsZScsIHtcblx0aG92ZXI6IHtcblx0XHRtb2RlOiAnc2luZ2xlJ1xuXHR9LFxuXG5cdHNjYWxlczoge1xuXHRcdHhBeGVzOiBbe1xuXHRcdFx0dHlwZTogJ2xpbmVhcicsIC8vIGJ1YmJsZSBzaG91bGQgcHJvYmFibHkgdXNlIGEgbGluZWFyIHNjYWxlIGJ5IGRlZmF1bHRcblx0XHRcdHBvc2l0aW9uOiAnYm90dG9tJyxcblx0XHRcdGlkOiAneC1heGlzLTAnIC8vIG5lZWQgYW4gSUQgc28gZGF0YXNldHMgY2FuIHJlZmVyZW5jZSB0aGUgc2NhbGVcblx0XHR9XSxcblx0XHR5QXhlczogW3tcblx0XHRcdHR5cGU6ICdsaW5lYXInLFxuXHRcdFx0cG9zaXRpb246ICdsZWZ0Jyxcblx0XHRcdGlkOiAneS1heGlzLTAnXG5cdFx0fV1cblx0fSxcblxuXHR0b29sdGlwczoge1xuXHRcdGNhbGxiYWNrczoge1xuXHRcdFx0dGl0bGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQvLyBUaXRsZSBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHNjYXR0ZXIgc2luY2Ugd2UgZm9ybWF0IHRoZSBkYXRhIGFzIGEgcG9pbnRcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fSxcblx0XHRcdGxhYmVsOiBmdW5jdGlvbihpdGVtLCBkYXRhKSB7XG5cdFx0XHRcdHZhciBkYXRhc2V0TGFiZWwgPSBkYXRhLmRhdGFzZXRzW2l0ZW0uZGF0YXNldEluZGV4XS5sYWJlbCB8fCAnJztcblx0XHRcdFx0dmFyIGRhdGFQb2ludCA9IGRhdGEuZGF0YXNldHNbaXRlbS5kYXRhc2V0SW5kZXhdLmRhdGFbaXRlbS5pbmRleF07XG5cdFx0XHRcdHJldHVybiBkYXRhc2V0TGFiZWwgKyAnOiAoJyArIGl0ZW0ueExhYmVsICsgJywgJyArIGl0ZW0ueUxhYmVsICsgJywgJyArIGRhdGFQb2ludC5yICsgJyknO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5cbnZhciBjb250cm9sbGVyX2J1YmJsZSA9IGNvcmVfZGF0YXNldENvbnRyb2xsZXIuZXh0ZW5kKHtcblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdGRhdGFFbGVtZW50VHlwZTogZWxlbWVudHMuUG9pbnQsXG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHVwZGF0ZTogZnVuY3Rpb24ocmVzZXQpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdHZhciBwb2ludHMgPSBtZXRhLmRhdGE7XG5cblx0XHQvLyBVcGRhdGUgUG9pbnRzXG5cdFx0aGVscGVycyQxLmVhY2gocG9pbnRzLCBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcblx0XHRcdG1lLnVwZGF0ZUVsZW1lbnQocG9pbnQsIGluZGV4LCByZXNldCk7XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHVwZGF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKHBvaW50LCBpbmRleCwgcmVzZXQpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdHZhciBjdXN0b20gPSBwb2ludC5jdXN0b20gfHwge307XG5cdFx0dmFyIHhTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS54QXhpc0lEKTtcblx0XHR2YXIgeVNjYWxlID0gbWUuZ2V0U2NhbGVGb3JJZChtZXRhLnlBeGlzSUQpO1xuXHRcdHZhciBvcHRpb25zID0gbWUuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyhwb2ludCwgaW5kZXgpO1xuXHRcdHZhciBkYXRhID0gbWUuZ2V0RGF0YXNldCgpLmRhdGFbaW5kZXhdO1xuXHRcdHZhciBkc0luZGV4ID0gbWUuaW5kZXg7XG5cblx0XHR2YXIgeCA9IHJlc2V0ID8geFNjYWxlLmdldFBpeGVsRm9yRGVjaW1hbCgwLjUpIDogeFNjYWxlLmdldFBpeGVsRm9yVmFsdWUodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IE5hTiwgaW5kZXgsIGRzSW5kZXgpO1xuXHRcdHZhciB5ID0gcmVzZXQgPyB5U2NhbGUuZ2V0QmFzZVBpeGVsKCkgOiB5U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShkYXRhLCBpbmRleCwgZHNJbmRleCk7XG5cblx0XHRwb2ludC5feFNjYWxlID0geFNjYWxlO1xuXHRcdHBvaW50Ll95U2NhbGUgPSB5U2NhbGU7XG5cdFx0cG9pbnQuX29wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHBvaW50Ll9kYXRhc2V0SW5kZXggPSBkc0luZGV4O1xuXHRcdHBvaW50Ll9pbmRleCA9IGluZGV4O1xuXHRcdHBvaW50Ll9tb2RlbCA9IHtcblx0XHRcdGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcblx0XHRcdGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuXHRcdFx0aGl0UmFkaXVzOiBvcHRpb25zLmhpdFJhZGl1cyxcblx0XHRcdHBvaW50U3R5bGU6IG9wdGlvbnMucG9pbnRTdHlsZSxcblx0XHRcdHJvdGF0aW9uOiBvcHRpb25zLnJvdGF0aW9uLFxuXHRcdFx0cmFkaXVzOiByZXNldCA/IDAgOiBvcHRpb25zLnJhZGl1cyxcblx0XHRcdHNraXA6IGN1c3RvbS5za2lwIHx8IGlzTmFOKHgpIHx8IGlzTmFOKHkpLFxuXHRcdFx0eDogeCxcblx0XHRcdHk6IHksXG5cdFx0fTtcblxuXHRcdHBvaW50LnBpdm90KCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHNldEhvdmVyU3R5bGU6IGZ1bmN0aW9uKHBvaW50KSB7XG5cdFx0dmFyIG1vZGVsID0gcG9pbnQuX21vZGVsO1xuXHRcdHZhciBvcHRpb25zID0gcG9pbnQuX29wdGlvbnM7XG5cdFx0dmFyIGdldEhvdmVyQ29sb3IgPSBoZWxwZXJzJDEuZ2V0SG92ZXJDb2xvcjtcblxuXHRcdHBvaW50LiRwcmV2aW91c1N0eWxlID0ge1xuXHRcdFx0YmFja2dyb3VuZENvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRib3JkZXJDb2xvcjogbW9kZWwuYm9yZGVyQ29sb3IsXG5cdFx0XHRib3JkZXJXaWR0aDogbW9kZWwuYm9yZGVyV2lkdGgsXG5cdFx0XHRyYWRpdXM6IG1vZGVsLnJhZGl1c1xuXHRcdH07XG5cblx0XHRtb2RlbC5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZU9yRGVmYXVsdCQzKG9wdGlvbnMuaG92ZXJCYWNrZ3JvdW5kQ29sb3IsIGdldEhvdmVyQ29sb3Iob3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpKTtcblx0XHRtb2RlbC5ib3JkZXJDb2xvciA9IHZhbHVlT3JEZWZhdWx0JDMob3B0aW9ucy5ob3ZlckJvcmRlckNvbG9yLCBnZXRIb3ZlckNvbG9yKG9wdGlvbnMuYm9yZGVyQ29sb3IpKTtcblx0XHRtb2RlbC5ib3JkZXJXaWR0aCA9IHZhbHVlT3JEZWZhdWx0JDMob3B0aW9ucy5ob3ZlckJvcmRlcldpZHRoLCBvcHRpb25zLmJvcmRlcldpZHRoKTtcblx0XHRtb2RlbC5yYWRpdXMgPSBvcHRpb25zLnJhZGl1cyArIG9wdGlvbnMuaG92ZXJSYWRpdXM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcmVzb2x2ZUVsZW1lbnRPcHRpb25zOiBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBkYXRhc2V0cyA9IGNoYXJ0LmRhdGEuZGF0YXNldHM7XG5cdFx0dmFyIGRhdGFzZXQgPSBkYXRhc2V0c1ttZS5pbmRleF07XG5cdFx0dmFyIGN1c3RvbSA9IHBvaW50LmN1c3RvbSB8fCB7fTtcblx0XHR2YXIgb3B0aW9ucyA9IGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQ7XG5cdFx0dmFyIGRhdGEgPSBkYXRhc2V0LmRhdGFbaW5kZXhdO1xuXHRcdHZhciB2YWx1ZXMgPSB7fTtcblx0XHR2YXIgaSwgaWxlbiwga2V5O1xuXG5cdFx0Ly8gU2NyaXB0YWJsZSBvcHRpb25zXG5cdFx0dmFyIGNvbnRleHQgPSB7XG5cdFx0XHRjaGFydDogY2hhcnQsXG5cdFx0XHRkYXRhSW5kZXg6IGluZGV4LFxuXHRcdFx0ZGF0YXNldDogZGF0YXNldCxcblx0XHRcdGRhdGFzZXRJbmRleDogbWUuaW5kZXhcblx0XHR9O1xuXG5cdFx0dmFyIGtleXMgPSBbXG5cdFx0XHQnYmFja2dyb3VuZENvbG9yJyxcblx0XHRcdCdib3JkZXJDb2xvcicsXG5cdFx0XHQnYm9yZGVyV2lkdGgnLFxuXHRcdFx0J2hvdmVyQmFja2dyb3VuZENvbG9yJyxcblx0XHRcdCdob3ZlckJvcmRlckNvbG9yJyxcblx0XHRcdCdob3ZlckJvcmRlcldpZHRoJyxcblx0XHRcdCdob3ZlclJhZGl1cycsXG5cdFx0XHQnaGl0UmFkaXVzJyxcblx0XHRcdCdwb2ludFN0eWxlJyxcblx0XHRcdCdyb3RhdGlvbidcblx0XHRdO1xuXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IGtleXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRrZXkgPSBrZXlzW2ldO1xuXHRcdFx0dmFsdWVzW2tleV0gPSByZXNvbHZlJDIoW1xuXHRcdFx0XHRjdXN0b21ba2V5XSxcblx0XHRcdFx0ZGF0YXNldFtrZXldLFxuXHRcdFx0XHRvcHRpb25zW2tleV1cblx0XHRcdF0sIGNvbnRleHQsIGluZGV4KTtcblx0XHR9XG5cblx0XHQvLyBDdXN0b20gcmFkaXVzIHJlc29sdXRpb25cblx0XHR2YWx1ZXMucmFkaXVzID0gcmVzb2x2ZSQyKFtcblx0XHRcdGN1c3RvbS5yYWRpdXMsXG5cdFx0XHRkYXRhID8gZGF0YS5yIDogdW5kZWZpbmVkLFxuXHRcdFx0ZGF0YXNldC5yYWRpdXMsXG5cdFx0XHRvcHRpb25zLnJhZGl1c1xuXHRcdF0sIGNvbnRleHQsIGluZGV4KTtcblxuXHRcdHJldHVybiB2YWx1ZXM7XG5cdH1cbn0pO1xuXG52YXIgcmVzb2x2ZSQzID0gaGVscGVycyQxLm9wdGlvbnMucmVzb2x2ZTtcbnZhciB2YWx1ZU9yRGVmYXVsdCQ0ID0gaGVscGVycyQxLnZhbHVlT3JEZWZhdWx0O1xuXG5jb3JlX2RlZmF1bHRzLl9zZXQoJ2RvdWdobnV0Jywge1xuXHRhbmltYXRpb246IHtcblx0XHQvLyBCb29sZWFuIC0gV2hldGhlciB3ZSBhbmltYXRlIHRoZSByb3RhdGlvbiBvZiB0aGUgRG91Z2hudXRcblx0XHRhbmltYXRlUm90YXRlOiB0cnVlLFxuXHRcdC8vIEJvb2xlYW4gLSBXaGV0aGVyIHdlIGFuaW1hdGUgc2NhbGluZyB0aGUgRG91Z2hudXQgZnJvbSB0aGUgY2VudHJlXG5cdFx0YW5pbWF0ZVNjYWxlOiBmYWxzZVxuXHR9LFxuXHRob3Zlcjoge1xuXHRcdG1vZGU6ICdzaW5nbGUnXG5cdH0sXG5cdGxlZ2VuZENhbGxiYWNrOiBmdW5jdGlvbihjaGFydCkge1xuXHRcdHZhciB0ZXh0ID0gW107XG5cdFx0dGV4dC5wdXNoKCc8dWwgY2xhc3M9XCInICsgY2hhcnQuaWQgKyAnLWxlZ2VuZFwiPicpO1xuXG5cdFx0dmFyIGRhdGEgPSBjaGFydC5kYXRhO1xuXHRcdHZhciBkYXRhc2V0cyA9IGRhdGEuZGF0YXNldHM7XG5cdFx0dmFyIGxhYmVscyA9IGRhdGEubGFiZWxzO1xuXG5cdFx0aWYgKGRhdGFzZXRzLmxlbmd0aCkge1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhc2V0c1swXS5kYXRhLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdHRleHQucHVzaCgnPGxpPjxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjonICsgZGF0YXNldHNbMF0uYmFja2dyb3VuZENvbG9yW2ldICsgJ1wiPjwvc3Bhbj4nKTtcblx0XHRcdFx0aWYgKGxhYmVsc1tpXSkge1xuXHRcdFx0XHRcdHRleHQucHVzaChsYWJlbHNbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRleHQucHVzaCgnPC9saT4nKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0ZXh0LnB1c2goJzwvdWw+Jyk7XG5cdFx0cmV0dXJuIHRleHQuam9pbignJyk7XG5cdH0sXG5cdGxlZ2VuZDoge1xuXHRcdGxhYmVsczoge1xuXHRcdFx0Z2VuZXJhdGVMYWJlbHM6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0XHRcdHZhciBkYXRhID0gY2hhcnQuZGF0YTtcblx0XHRcdFx0aWYgKGRhdGEubGFiZWxzLmxlbmd0aCAmJiBkYXRhLmRhdGFzZXRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhLmxhYmVscy5tYXAoZnVuY3Rpb24obGFiZWwsIGkpIHtcblx0XHRcdFx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoMCk7XG5cdFx0XHRcdFx0XHR2YXIgZHMgPSBkYXRhLmRhdGFzZXRzWzBdO1xuXHRcdFx0XHRcdFx0dmFyIGFyYyA9IG1ldGEuZGF0YVtpXTtcblx0XHRcdFx0XHRcdHZhciBjdXN0b20gPSBhcmMgJiYgYXJjLmN1c3RvbSB8fCB7fTtcblx0XHRcdFx0XHRcdHZhciBhcmNPcHRzID0gY2hhcnQub3B0aW9ucy5lbGVtZW50cy5hcmM7XG5cdFx0XHRcdFx0XHR2YXIgZmlsbCA9IHJlc29sdmUkMyhbY3VzdG9tLmJhY2tncm91bmRDb2xvciwgZHMuYmFja2dyb3VuZENvbG9yLCBhcmNPcHRzLmJhY2tncm91bmRDb2xvcl0sIHVuZGVmaW5lZCwgaSk7XG5cdFx0XHRcdFx0XHR2YXIgc3Ryb2tlID0gcmVzb2x2ZSQzKFtjdXN0b20uYm9yZGVyQ29sb3IsIGRzLmJvcmRlckNvbG9yLCBhcmNPcHRzLmJvcmRlckNvbG9yXSwgdW5kZWZpbmVkLCBpKTtcblx0XHRcdFx0XHRcdHZhciBidyA9IHJlc29sdmUkMyhbY3VzdG9tLmJvcmRlcldpZHRoLCBkcy5ib3JkZXJXaWR0aCwgYXJjT3B0cy5ib3JkZXJXaWR0aF0sIHVuZGVmaW5lZCwgaSk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IGxhYmVsLFxuXHRcdFx0XHRcdFx0XHRmaWxsU3R5bGU6IGZpbGwsXG5cdFx0XHRcdFx0XHRcdHN0cm9rZVN0eWxlOiBzdHJva2UsXG5cdFx0XHRcdFx0XHRcdGxpbmVXaWR0aDogYncsXG5cdFx0XHRcdFx0XHRcdGhpZGRlbjogaXNOYU4oZHMuZGF0YVtpXSkgfHwgbWV0YS5kYXRhW2ldLmhpZGRlbixcblxuXHRcdFx0XHRcdFx0XHQvLyBFeHRyYSBkYXRhIHVzZWQgZm9yIHRvZ2dsaW5nIHRoZSBjb3JyZWN0IGl0ZW1cblx0XHRcdFx0XHRcdFx0aW5kZXg6IGlcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRvbkNsaWNrOiBmdW5jdGlvbihlLCBsZWdlbmRJdGVtKSB7XG5cdFx0XHR2YXIgaW5kZXggPSBsZWdlbmRJdGVtLmluZGV4O1xuXHRcdFx0dmFyIGNoYXJ0ID0gdGhpcy5jaGFydDtcblx0XHRcdHZhciBpLCBpbGVuLCBtZXRhO1xuXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gKGNoYXJ0LmRhdGEuZGF0YXNldHMgfHwgW10pLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG5cdFx0XHRcdC8vIHRvZ2dsZSB2aXNpYmlsaXR5IG9mIGluZGV4IGlmIGV4aXN0c1xuXHRcdFx0XHRpZiAobWV0YS5kYXRhW2luZGV4XSkge1xuXHRcdFx0XHRcdG1ldGEuZGF0YVtpbmRleF0uaGlkZGVuID0gIW1ldGEuZGF0YVtpbmRleF0uaGlkZGVuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNoYXJ0LnVwZGF0ZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBUaGUgcGVyY2VudGFnZSBvZiB0aGUgY2hhcnQgdGhhdCB3ZSBjdXQgb3V0IG9mIHRoZSBtaWRkbGUuXG5cdGN1dG91dFBlcmNlbnRhZ2U6IDUwLFxuXG5cdC8vIFRoZSByb3RhdGlvbiBvZiB0aGUgY2hhcnQsIHdoZXJlIHRoZSBmaXJzdCBkYXRhIGFyYyBiZWdpbnMuXG5cdHJvdGF0aW9uOiBNYXRoLlBJICogLTAuNSxcblxuXHQvLyBUaGUgdG90YWwgY2lyY3VtZmVyZW5jZSBvZiB0aGUgY2hhcnQuXG5cdGNpcmN1bWZlcmVuY2U6IE1hdGguUEkgKiAyLjAsXG5cblx0Ly8gTmVlZCB0byBvdmVycmlkZSB0aGVzZSB0byBnaXZlIGEgbmljZSBkZWZhdWx0XG5cdHRvb2x0aXBzOiB7XG5cdFx0Y2FsbGJhY2tzOiB7XG5cdFx0XHR0aXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH0sXG5cdFx0XHRsYWJlbDogZnVuY3Rpb24odG9vbHRpcEl0ZW0sIGRhdGEpIHtcblx0XHRcdFx0dmFyIGRhdGFMYWJlbCA9IGRhdGEubGFiZWxzW3Rvb2x0aXBJdGVtLmluZGV4XTtcblx0XHRcdFx0dmFyIHZhbHVlID0gJzogJyArIGRhdGEuZGF0YXNldHNbdG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4XS5kYXRhW3Rvb2x0aXBJdGVtLmluZGV4XTtcblxuXHRcdFx0XHRpZiAoaGVscGVycyQxLmlzQXJyYXkoZGF0YUxhYmVsKSkge1xuXHRcdFx0XHRcdC8vIHNob3cgdmFsdWUgb24gZmlyc3QgbGluZSBvZiBtdWx0aWxpbmUgbGFiZWxcblx0XHRcdFx0XHQvLyBuZWVkIHRvIGNsb25lIGJlY2F1c2Ugd2UgYXJlIGNoYW5naW5nIHRoZSB2YWx1ZVxuXHRcdFx0XHRcdGRhdGFMYWJlbCA9IGRhdGFMYWJlbC5zbGljZSgpO1xuXHRcdFx0XHRcdGRhdGFMYWJlbFswXSArPSB2YWx1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhTGFiZWwgKz0gdmFsdWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZGF0YUxhYmVsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5cbnZhciBjb250cm9sbGVyX2RvdWdobnV0ID0gY29yZV9kYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xuXG5cdGRhdGFFbGVtZW50VHlwZTogZWxlbWVudHMuQXJjLFxuXG5cdGxpbmtTY2FsZXM6IGhlbHBlcnMkMS5ub29wLFxuXG5cdC8vIEdldCBpbmRleCBvZiB0aGUgZGF0YXNldCBpbiByZWxhdGlvbiB0byB0aGUgdmlzaWJsZSBkYXRhc2V0cy4gVGhpcyBhbGxvd3MgZGV0ZXJtaW5pbmcgdGhlIGlubmVyIGFuZCBvdXRlciByYWRpdXMgY29ycmVjdGx5XG5cdGdldFJpbmdJbmRleDogZnVuY3Rpb24oZGF0YXNldEluZGV4KSB7XG5cdFx0dmFyIHJpbmdJbmRleCA9IDA7XG5cblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFzZXRJbmRleDsgKytqKSB7XG5cdFx0XHRpZiAodGhpcy5jaGFydC5pc0RhdGFzZXRWaXNpYmxlKGopKSB7XG5cdFx0XHRcdCsrcmluZ0luZGV4O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByaW5nSW5kZXg7XG5cdH0sXG5cblx0dXBkYXRlOiBmdW5jdGlvbihyZXNldCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0dmFyIGNoYXJ0QXJlYSA9IGNoYXJ0LmNoYXJ0QXJlYTtcblx0XHR2YXIgb3B0cyA9IGNoYXJ0Lm9wdGlvbnM7XG5cdFx0dmFyIGF2YWlsYWJsZVdpZHRoID0gY2hhcnRBcmVhLnJpZ2h0IC0gY2hhcnRBcmVhLmxlZnQ7XG5cdFx0dmFyIGF2YWlsYWJsZUhlaWdodCA9IGNoYXJ0QXJlYS5ib3R0b20gLSBjaGFydEFyZWEudG9wO1xuXHRcdHZhciBtaW5TaXplID0gTWF0aC5taW4oYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCk7XG5cdFx0dmFyIG9mZnNldCA9IHt4OiAwLCB5OiAwfTtcblx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHR2YXIgYXJjcyA9IG1ldGEuZGF0YTtcblx0XHR2YXIgY3V0b3V0UGVyY2VudGFnZSA9IG9wdHMuY3V0b3V0UGVyY2VudGFnZTtcblx0XHR2YXIgY2lyY3VtZmVyZW5jZSA9IG9wdHMuY2lyY3VtZmVyZW5jZTtcblx0XHR2YXIgY2hhcnRXZWlnaHQgPSBtZS5fZ2V0UmluZ1dlaWdodChtZS5pbmRleCk7XG5cdFx0dmFyIGksIGlsZW47XG5cblx0XHQvLyBJZiB0aGUgY2hhcnQncyBjaXJjdW1mZXJlbmNlIGlzbid0IGEgZnVsbCBjaXJjbGUsIGNhbGN1bGF0ZSBtaW5TaXplIGFzIGEgcmF0aW8gb2YgdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgYXJjXG5cdFx0aWYgKGNpcmN1bWZlcmVuY2UgPCBNYXRoLlBJICogMi4wKSB7XG5cdFx0XHR2YXIgc3RhcnRBbmdsZSA9IG9wdHMucm90YXRpb24gJSAoTWF0aC5QSSAqIDIuMCk7XG5cdFx0XHRzdGFydEFuZ2xlICs9IE1hdGguUEkgKiAyLjAgKiAoc3RhcnRBbmdsZSA+PSBNYXRoLlBJID8gLTEgOiBzdGFydEFuZ2xlIDwgLU1hdGguUEkgPyAxIDogMCk7XG5cdFx0XHR2YXIgZW5kQW5nbGUgPSBzdGFydEFuZ2xlICsgY2lyY3VtZmVyZW5jZTtcblx0XHRcdHZhciBzdGFydCA9IHt4OiBNYXRoLmNvcyhzdGFydEFuZ2xlKSwgeTogTWF0aC5zaW4oc3RhcnRBbmdsZSl9O1xuXHRcdFx0dmFyIGVuZCA9IHt4OiBNYXRoLmNvcyhlbmRBbmdsZSksIHk6IE1hdGguc2luKGVuZEFuZ2xlKX07XG5cdFx0XHR2YXIgY29udGFpbnMwID0gKHN0YXJ0QW5nbGUgPD0gMCAmJiBlbmRBbmdsZSA+PSAwKSB8fCAoc3RhcnRBbmdsZSA8PSBNYXRoLlBJICogMi4wICYmIE1hdGguUEkgKiAyLjAgPD0gZW5kQW5nbGUpO1xuXHRcdFx0dmFyIGNvbnRhaW5zOTAgPSAoc3RhcnRBbmdsZSA8PSBNYXRoLlBJICogMC41ICYmIE1hdGguUEkgKiAwLjUgPD0gZW5kQW5nbGUpIHx8IChzdGFydEFuZ2xlIDw9IE1hdGguUEkgKiAyLjUgJiYgTWF0aC5QSSAqIDIuNSA8PSBlbmRBbmdsZSk7XG5cdFx0XHR2YXIgY29udGFpbnMxODAgPSAoc3RhcnRBbmdsZSA8PSAtTWF0aC5QSSAmJiAtTWF0aC5QSSA8PSBlbmRBbmdsZSkgfHwgKHN0YXJ0QW5nbGUgPD0gTWF0aC5QSSAmJiBNYXRoLlBJIDw9IGVuZEFuZ2xlKTtcblx0XHRcdHZhciBjb250YWluczI3MCA9IChzdGFydEFuZ2xlIDw9IC1NYXRoLlBJICogMC41ICYmIC1NYXRoLlBJICogMC41IDw9IGVuZEFuZ2xlKSB8fCAoc3RhcnRBbmdsZSA8PSBNYXRoLlBJICogMS41ICYmIE1hdGguUEkgKiAxLjUgPD0gZW5kQW5nbGUpO1xuXHRcdFx0dmFyIGN1dG91dCA9IGN1dG91dFBlcmNlbnRhZ2UgLyAxMDAuMDtcblx0XHRcdHZhciBtaW4gPSB7eDogY29udGFpbnMxODAgPyAtMSA6IE1hdGgubWluKHN0YXJ0LnggKiAoc3RhcnQueCA8IDAgPyAxIDogY3V0b3V0KSwgZW5kLnggKiAoZW5kLnggPCAwID8gMSA6IGN1dG91dCkpLCB5OiBjb250YWluczI3MCA/IC0xIDogTWF0aC5taW4oc3RhcnQueSAqIChzdGFydC55IDwgMCA/IDEgOiBjdXRvdXQpLCBlbmQueSAqIChlbmQueSA8IDAgPyAxIDogY3V0b3V0KSl9O1xuXHRcdFx0dmFyIG1heCA9IHt4OiBjb250YWluczAgPyAxIDogTWF0aC5tYXgoc3RhcnQueCAqIChzdGFydC54ID4gMCA/IDEgOiBjdXRvdXQpLCBlbmQueCAqIChlbmQueCA+IDAgPyAxIDogY3V0b3V0KSksIHk6IGNvbnRhaW5zOTAgPyAxIDogTWF0aC5tYXgoc3RhcnQueSAqIChzdGFydC55ID4gMCA/IDEgOiBjdXRvdXQpLCBlbmQueSAqIChlbmQueSA+IDAgPyAxIDogY3V0b3V0KSl9O1xuXHRcdFx0dmFyIHNpemUgPSB7d2lkdGg6IChtYXgueCAtIG1pbi54KSAqIDAuNSwgaGVpZ2h0OiAobWF4LnkgLSBtaW4ueSkgKiAwLjV9O1xuXHRcdFx0bWluU2l6ZSA9IE1hdGgubWluKGF2YWlsYWJsZVdpZHRoIC8gc2l6ZS53aWR0aCwgYXZhaWxhYmxlSGVpZ2h0IC8gc2l6ZS5oZWlnaHQpO1xuXHRcdFx0b2Zmc2V0ID0ge3g6IChtYXgueCArIG1pbi54KSAqIC0wLjUsIHk6IChtYXgueSArIG1pbi55KSAqIC0wLjV9O1xuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBhcmNzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0YXJjc1tpXS5fb3B0aW9ucyA9IG1lLl9yZXNvbHZlRWxlbWVudE9wdGlvbnMoYXJjc1tpXSwgaSk7XG5cdFx0fVxuXG5cdFx0Y2hhcnQuYm9yZGVyV2lkdGggPSBtZS5nZXRNYXhCb3JkZXJXaWR0aCgpO1xuXHRcdGNoYXJ0Lm91dGVyUmFkaXVzID0gTWF0aC5tYXgoKG1pblNpemUgLSBjaGFydC5ib3JkZXJXaWR0aCkgLyAyLCAwKTtcblx0XHRjaGFydC5pbm5lclJhZGl1cyA9IE1hdGgubWF4KGN1dG91dFBlcmNlbnRhZ2UgPyAoY2hhcnQub3V0ZXJSYWRpdXMgLyAxMDApICogKGN1dG91dFBlcmNlbnRhZ2UpIDogMCwgMCk7XG5cdFx0Y2hhcnQucmFkaXVzTGVuZ3RoID0gKGNoYXJ0Lm91dGVyUmFkaXVzIC0gY2hhcnQuaW5uZXJSYWRpdXMpIC8gKG1lLl9nZXRWaXNpYmxlRGF0YXNldFdlaWdodFRvdGFsKCkgfHwgMSk7XG5cdFx0Y2hhcnQub2Zmc2V0WCA9IG9mZnNldC54ICogY2hhcnQub3V0ZXJSYWRpdXM7XG5cdFx0Y2hhcnQub2Zmc2V0WSA9IG9mZnNldC55ICogY2hhcnQub3V0ZXJSYWRpdXM7XG5cblx0XHRtZXRhLnRvdGFsID0gbWUuY2FsY3VsYXRlVG90YWwoKTtcblxuXHRcdG1lLm91dGVyUmFkaXVzID0gY2hhcnQub3V0ZXJSYWRpdXMgLSBjaGFydC5yYWRpdXNMZW5ndGggKiBtZS5fZ2V0UmluZ1dlaWdodE9mZnNldChtZS5pbmRleCk7XG5cdFx0bWUuaW5uZXJSYWRpdXMgPSBNYXRoLm1heChtZS5vdXRlclJhZGl1cyAtIGNoYXJ0LnJhZGl1c0xlbmd0aCAqIGNoYXJ0V2VpZ2h0LCAwKTtcblxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBhcmNzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0bWUudXBkYXRlRWxlbWVudChhcmNzW2ldLCBpLCByZXNldCk7XG5cdFx0fVxuXHR9LFxuXG5cdHVwZGF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKGFyYywgaW5kZXgsIHJlc2V0KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHR2YXIgY2hhcnRBcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuXHRcdHZhciBvcHRzID0gY2hhcnQub3B0aW9ucztcblx0XHR2YXIgYW5pbWF0aW9uT3B0cyA9IG9wdHMuYW5pbWF0aW9uO1xuXHRcdHZhciBjZW50ZXJYID0gKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDI7XG5cdFx0dmFyIGNlbnRlclkgPSAoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMjtcblx0XHR2YXIgc3RhcnRBbmdsZSA9IG9wdHMucm90YXRpb247IC8vIG5vbiByZXNldCBjYXNlIGhhbmRsZWQgbGF0ZXJcblx0XHR2YXIgZW5kQW5nbGUgPSBvcHRzLnJvdGF0aW9uOyAvLyBub24gcmVzZXQgY2FzZSBoYW5kbGVkIGxhdGVyXG5cdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0dmFyIGNpcmN1bWZlcmVuY2UgPSByZXNldCAmJiBhbmltYXRpb25PcHRzLmFuaW1hdGVSb3RhdGUgPyAwIDogYXJjLmhpZGRlbiA/IDAgOiBtZS5jYWxjdWxhdGVDaXJjdW1mZXJlbmNlKGRhdGFzZXQuZGF0YVtpbmRleF0pICogKG9wdHMuY2lyY3VtZmVyZW5jZSAvICgyLjAgKiBNYXRoLlBJKSk7XG5cdFx0dmFyIGlubmVyUmFkaXVzID0gcmVzZXQgJiYgYW5pbWF0aW9uT3B0cy5hbmltYXRlU2NhbGUgPyAwIDogbWUuaW5uZXJSYWRpdXM7XG5cdFx0dmFyIG91dGVyUmFkaXVzID0gcmVzZXQgJiYgYW5pbWF0aW9uT3B0cy5hbmltYXRlU2NhbGUgPyAwIDogbWUub3V0ZXJSYWRpdXM7XG5cdFx0dmFyIG9wdGlvbnMgPSBhcmMuX29wdGlvbnMgfHwge307XG5cblx0XHRoZWxwZXJzJDEuZXh0ZW5kKGFyYywge1xuXHRcdFx0Ly8gVXRpbGl0eVxuXHRcdFx0X2RhdGFzZXRJbmRleDogbWUuaW5kZXgsXG5cdFx0XHRfaW5kZXg6IGluZGV4LFxuXG5cdFx0XHQvLyBEZXNpcmVkIHZpZXcgcHJvcGVydGllc1xuXHRcdFx0X21vZGVsOiB7XG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuXHRcdFx0XHRib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcblx0XHRcdFx0Ym9yZGVyQWxpZ246IG9wdGlvbnMuYm9yZGVyQWxpZ24sXG5cdFx0XHRcdHg6IGNlbnRlclggKyBjaGFydC5vZmZzZXRYLFxuXHRcdFx0XHR5OiBjZW50ZXJZICsgY2hhcnQub2Zmc2V0WSxcblx0XHRcdFx0c3RhcnRBbmdsZTogc3RhcnRBbmdsZSxcblx0XHRcdFx0ZW5kQW5nbGU6IGVuZEFuZ2xlLFxuXHRcdFx0XHRjaXJjdW1mZXJlbmNlOiBjaXJjdW1mZXJlbmNlLFxuXHRcdFx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG5cdFx0XHRcdGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyxcblx0XHRcdFx0bGFiZWw6IGhlbHBlcnMkMS52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5sYWJlbCwgaW5kZXgsIGNoYXJ0LmRhdGEubGFiZWxzW2luZGV4XSlcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHZhciBtb2RlbCA9IGFyYy5fbW9kZWw7XG5cblx0XHQvLyBTZXQgY29ycmVjdCBhbmdsZXMgaWYgbm90IHJlc2V0dGluZ1xuXHRcdGlmICghcmVzZXQgfHwgIWFuaW1hdGlvbk9wdHMuYW5pbWF0ZVJvdGF0ZSkge1xuXHRcdFx0aWYgKGluZGV4ID09PSAwKSB7XG5cdFx0XHRcdG1vZGVsLnN0YXJ0QW5nbGUgPSBvcHRzLnJvdGF0aW9uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bW9kZWwuc3RhcnRBbmdsZSA9IG1lLmdldE1ldGEoKS5kYXRhW2luZGV4IC0gMV0uX21vZGVsLmVuZEFuZ2xlO1xuXHRcdFx0fVxuXG5cdFx0XHRtb2RlbC5lbmRBbmdsZSA9IG1vZGVsLnN0YXJ0QW5nbGUgKyBtb2RlbC5jaXJjdW1mZXJlbmNlO1xuXHRcdH1cblxuXHRcdGFyYy5waXZvdCgpO1xuXHR9LFxuXG5cdGNhbGN1bGF0ZVRvdGFsOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xuXHRcdHZhciBtZXRhID0gdGhpcy5nZXRNZXRhKCk7XG5cdFx0dmFyIHRvdGFsID0gMDtcblx0XHR2YXIgdmFsdWU7XG5cblx0XHRoZWxwZXJzJDEuZWFjaChtZXRhLmRhdGEsIGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4KSB7XG5cdFx0XHR2YWx1ZSA9IGRhdGFzZXQuZGF0YVtpbmRleF07XG5cdFx0XHRpZiAoIWlzTmFOKHZhbHVlKSAmJiAhZWxlbWVudC5oaWRkZW4pIHtcblx0XHRcdFx0dG90YWwgKz0gTWF0aC5hYnModmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0LyogaWYgKHRvdGFsID09PSAwKSB7XG5cdFx0XHR0b3RhbCA9IE5hTjtcblx0XHR9Ki9cblxuXHRcdHJldHVybiB0b3RhbDtcblx0fSxcblxuXHRjYWxjdWxhdGVDaXJjdW1mZXJlbmNlOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHZhciB0b3RhbCA9IHRoaXMuZ2V0TWV0YSgpLnRvdGFsO1xuXHRcdGlmICh0b3RhbCA+IDAgJiYgIWlzTmFOKHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIChNYXRoLlBJICogMi4wKSAqIChNYXRoLmFicyh2YWx1ZSkgLyB0b3RhbCk7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIGdldHMgdGhlIG1heCBib3JkZXIgb3IgaG92ZXIgd2lkdGggdG8gcHJvcGVybHkgc2NhbGUgcGllIGNoYXJ0c1xuXHRnZXRNYXhCb3JkZXJXaWR0aDogZnVuY3Rpb24oYXJjcykge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG1heCA9IDA7XG5cdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0dmFyIGksIGlsZW4sIG1ldGEsIGFyYywgY29udHJvbGxlciwgb3B0aW9ucywgYm9yZGVyV2lkdGgsIGhvdmVyV2lkdGg7XG5cblx0XHRpZiAoIWFyY3MpIHtcblx0XHRcdC8vIEZpbmQgdGhlIG91dG1vc3QgdmlzaWJsZSBkYXRhc2V0XG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gY2hhcnQuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkpIHtcblx0XHRcdFx0XHRtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG5cdFx0XHRcdFx0YXJjcyA9IG1ldGEuZGF0YTtcblx0XHRcdFx0XHRpZiAoaSAhPT0gbWUuaW5kZXgpIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIgPSBtZXRhLmNvbnRyb2xsZXI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCFhcmNzKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gYXJjcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdGFyYyA9IGFyY3NbaV07XG5cdFx0XHRvcHRpb25zID0gY29udHJvbGxlciA/IGNvbnRyb2xsZXIuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyhhcmMsIGkpIDogYXJjLl9vcHRpb25zO1xuXHRcdFx0aWYgKG9wdGlvbnMuYm9yZGVyQWxpZ24gIT09ICdpbm5lcicpIHtcblx0XHRcdFx0Ym9yZGVyV2lkdGggPSBvcHRpb25zLmJvcmRlcldpZHRoO1xuXHRcdFx0XHRob3ZlcldpZHRoID0gb3B0aW9ucy5ob3ZlckJvcmRlcldpZHRoO1xuXG5cdFx0XHRcdG1heCA9IGJvcmRlcldpZHRoID4gbWF4ID8gYm9yZGVyV2lkdGggOiBtYXg7XG5cdFx0XHRcdG1heCA9IGhvdmVyV2lkdGggPiBtYXggPyBob3ZlcldpZHRoIDogbWF4O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbWF4O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRzZXRIb3ZlclN0eWxlOiBmdW5jdGlvbihhcmMpIHtcblx0XHR2YXIgbW9kZWwgPSBhcmMuX21vZGVsO1xuXHRcdHZhciBvcHRpb25zID0gYXJjLl9vcHRpb25zO1xuXHRcdHZhciBnZXRIb3ZlckNvbG9yID0gaGVscGVycyQxLmdldEhvdmVyQ29sb3I7XG5cblx0XHRhcmMuJHByZXZpb3VzU3R5bGUgPSB7XG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcblx0XHRcdGJvcmRlckNvbG9yOiBtb2RlbC5ib3JkZXJDb2xvcixcblx0XHRcdGJvcmRlcldpZHRoOiBtb2RlbC5ib3JkZXJXaWR0aCxcblx0XHR9O1xuXG5cdFx0bW9kZWwuYmFja2dyb3VuZENvbG9yID0gdmFsdWVPckRlZmF1bHQkNChvcHRpb25zLmhvdmVyQmFja2dyb3VuZENvbG9yLCBnZXRIb3ZlckNvbG9yKG9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSk7XG5cdFx0bW9kZWwuYm9yZGVyQ29sb3IgPSB2YWx1ZU9yRGVmYXVsdCQ0KG9wdGlvbnMuaG92ZXJCb3JkZXJDb2xvciwgZ2V0SG92ZXJDb2xvcihvcHRpb25zLmJvcmRlckNvbG9yKSk7XG5cdFx0bW9kZWwuYm9yZGVyV2lkdGggPSB2YWx1ZU9yRGVmYXVsdCQ0KG9wdGlvbnMuaG92ZXJCb3JkZXJXaWR0aCwgb3B0aW9ucy5ib3JkZXJXaWR0aCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcmVzb2x2ZUVsZW1lbnRPcHRpb25zOiBmdW5jdGlvbihhcmMsIGluZGV4KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblx0XHR2YXIgY3VzdG9tID0gYXJjLmN1c3RvbSB8fCB7fTtcblx0XHR2YXIgb3B0aW9ucyA9IGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMuYXJjO1xuXHRcdHZhciB2YWx1ZXMgPSB7fTtcblx0XHR2YXIgaSwgaWxlbiwga2V5O1xuXG5cdFx0Ly8gU2NyaXB0YWJsZSBvcHRpb25zXG5cdFx0dmFyIGNvbnRleHQgPSB7XG5cdFx0XHRjaGFydDogY2hhcnQsXG5cdFx0XHRkYXRhSW5kZXg6IGluZGV4LFxuXHRcdFx0ZGF0YXNldDogZGF0YXNldCxcblx0XHRcdGRhdGFzZXRJbmRleDogbWUuaW5kZXhcblx0XHR9O1xuXG5cdFx0dmFyIGtleXMgPSBbXG5cdFx0XHQnYmFja2dyb3VuZENvbG9yJyxcblx0XHRcdCdib3JkZXJDb2xvcicsXG5cdFx0XHQnYm9yZGVyV2lkdGgnLFxuXHRcdFx0J2JvcmRlckFsaWduJyxcblx0XHRcdCdob3ZlckJhY2tncm91bmRDb2xvcicsXG5cdFx0XHQnaG92ZXJCb3JkZXJDb2xvcicsXG5cdFx0XHQnaG92ZXJCb3JkZXJXaWR0aCcsXG5cdFx0XTtcblxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBrZXlzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0a2V5ID0ga2V5c1tpXTtcblx0XHRcdHZhbHVlc1trZXldID0gcmVzb2x2ZSQzKFtcblx0XHRcdFx0Y3VzdG9tW2tleV0sXG5cdFx0XHRcdGRhdGFzZXRba2V5XSxcblx0XHRcdFx0b3B0aW9uc1trZXldXG5cdFx0XHRdLCBjb250ZXh0LCBpbmRleCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlcztcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHJhZGl1cyBsZW5ndGggb2Zmc2V0IG9mIHRoZSBkYXRhc2V0IGluIHJlbGF0aW9uIHRvIHRoZSB2aXNpYmxlIGRhdGFzZXRzIHdlaWdodHMuIFRoaXMgYWxsb3dzIGRldGVybWluaW5nIHRoZSBpbm5lciBhbmQgb3V0ZXIgcmFkaXVzIGNvcnJlY3RseVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldFJpbmdXZWlnaHRPZmZzZXQ6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCkge1xuXHRcdHZhciByaW5nV2VpZ2h0T2Zmc2V0ID0gMDtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YXNldEluZGV4OyArK2kpIHtcblx0XHRcdGlmICh0aGlzLmNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkpIHtcblx0XHRcdFx0cmluZ1dlaWdodE9mZnNldCArPSB0aGlzLl9nZXRSaW5nV2VpZ2h0KGkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByaW5nV2VpZ2h0T2Zmc2V0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldFJpbmdXZWlnaHQ6IGZ1bmN0aW9uKGRhdGFTZXRJbmRleCkge1xuXHRcdHJldHVybiBNYXRoLm1heCh2YWx1ZU9yRGVmYXVsdCQ0KHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1tkYXRhU2V0SW5kZXhdLndlaWdodCwgMSksIDApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBzdW0gb2YgYWxsIHZpc2liaWxlIGRhdGEgc2V0IHdlaWdodHMuICBUaGlzIHZhbHVlIGNhbiBiZSAwLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldFZpc2libGVEYXRhc2V0V2VpZ2h0VG90YWw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLl9nZXRSaW5nV2VpZ2h0T2Zmc2V0KHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cy5sZW5ndGgpO1xuXHR9XG59KTtcblxuY29yZV9kZWZhdWx0cy5fc2V0KCdob3Jpem9udGFsQmFyJywge1xuXHRob3Zlcjoge1xuXHRcdG1vZGU6ICdpbmRleCcsXG5cdFx0YXhpczogJ3knXG5cdH0sXG5cblx0c2NhbGVzOiB7XG5cdFx0eEF4ZXM6IFt7XG5cdFx0XHR0eXBlOiAnbGluZWFyJyxcblx0XHRcdHBvc2l0aW9uOiAnYm90dG9tJ1xuXHRcdH1dLFxuXG5cdFx0eUF4ZXM6IFt7XG5cdFx0XHR0eXBlOiAnY2F0ZWdvcnknLFxuXHRcdFx0cG9zaXRpb246ICdsZWZ0Jyxcblx0XHRcdGNhdGVnb3J5UGVyY2VudGFnZTogMC44LFxuXHRcdFx0YmFyUGVyY2VudGFnZTogMC45LFxuXHRcdFx0b2Zmc2V0OiB0cnVlLFxuXHRcdFx0Z3JpZExpbmVzOiB7XG5cdFx0XHRcdG9mZnNldEdyaWRMaW5lczogdHJ1ZVxuXHRcdFx0fVxuXHRcdH1dXG5cdH0sXG5cblx0ZWxlbWVudHM6IHtcblx0XHRyZWN0YW5nbGU6IHtcblx0XHRcdGJvcmRlclNraXBwZWQ6ICdsZWZ0J1xuXHRcdH1cblx0fSxcblxuXHR0b29sdGlwczoge1xuXHRcdG1vZGU6ICdpbmRleCcsXG5cdFx0YXhpczogJ3knXG5cdH1cbn0pO1xuXG52YXIgY29udHJvbGxlcl9ob3Jpem9udGFsQmFyID0gY29udHJvbGxlcl9iYXIuZXh0ZW5kKHtcblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0VmFsdWVTY2FsZUlkOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRNZXRhKCkueEF4aXNJRDtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRJbmRleFNjYWxlSWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmdldE1ldGEoKS55QXhpc0lEO1xuXHR9XG59KTtcblxudmFyIHZhbHVlT3JEZWZhdWx0JDUgPSBoZWxwZXJzJDEudmFsdWVPckRlZmF1bHQ7XG52YXIgcmVzb2x2ZSQ0ID0gaGVscGVycyQxLm9wdGlvbnMucmVzb2x2ZTtcbnZhciBpc1BvaW50SW5BcmVhID0gaGVscGVycyQxLmNhbnZhcy5faXNQb2ludEluQXJlYTtcblxuY29yZV9kZWZhdWx0cy5fc2V0KCdsaW5lJywge1xuXHRzaG93TGluZXM6IHRydWUsXG5cdHNwYW5HYXBzOiBmYWxzZSxcblxuXHRob3Zlcjoge1xuXHRcdG1vZGU6ICdsYWJlbCdcblx0fSxcblxuXHRzY2FsZXM6IHtcblx0XHR4QXhlczogW3tcblx0XHRcdHR5cGU6ICdjYXRlZ29yeScsXG5cdFx0XHRpZDogJ3gtYXhpcy0wJ1xuXHRcdH1dLFxuXHRcdHlBeGVzOiBbe1xuXHRcdFx0dHlwZTogJ2xpbmVhcicsXG5cdFx0XHRpZDogJ3ktYXhpcy0wJ1xuXHRcdH1dXG5cdH1cbn0pO1xuXG5mdW5jdGlvbiBsaW5lRW5hYmxlZChkYXRhc2V0LCBvcHRpb25zKSB7XG5cdHJldHVybiB2YWx1ZU9yRGVmYXVsdCQ1KGRhdGFzZXQuc2hvd0xpbmUsIG9wdGlvbnMuc2hvd0xpbmVzKTtcbn1cblxudmFyIGNvbnRyb2xsZXJfbGluZSA9IGNvcmVfZGF0YXNldENvbnRyb2xsZXIuZXh0ZW5kKHtcblxuXHRkYXRhc2V0RWxlbWVudFR5cGU6IGVsZW1lbnRzLkxpbmUsXG5cblx0ZGF0YUVsZW1lbnRUeXBlOiBlbGVtZW50cy5Qb2ludCxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uKHJlc2V0KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHR2YXIgbGluZSA9IG1ldGEuZGF0YXNldDtcblx0XHR2YXIgcG9pbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuXHRcdHZhciBzY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS55QXhpc0lEKTtcblx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblx0XHR2YXIgc2hvd0xpbmUgPSBsaW5lRW5hYmxlZChkYXRhc2V0LCBtZS5jaGFydC5vcHRpb25zKTtcblx0XHR2YXIgaSwgaWxlbjtcblxuXHRcdC8vIFVwZGF0ZSBMaW5lXG5cdFx0aWYgKHNob3dMaW5lKSB7XG5cdFx0XHQvLyBDb21wYXRpYmlsaXR5OiBJZiB0aGUgcHJvcGVydGllcyBhcmUgZGVmaW5lZCB3aXRoIG9ubHkgdGhlIG9sZCBuYW1lLCB1c2UgdGhvc2UgdmFsdWVzXG5cdFx0XHRpZiAoKGRhdGFzZXQudGVuc2lvbiAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YXNldC5saW5lVGVuc2lvbiA9PT0gdW5kZWZpbmVkKSkge1xuXHRcdFx0XHRkYXRhc2V0LmxpbmVUZW5zaW9uID0gZGF0YXNldC50ZW5zaW9uO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVdGlsaXR5XG5cdFx0XHRsaW5lLl9zY2FsZSA9IHNjYWxlO1xuXHRcdFx0bGluZS5fZGF0YXNldEluZGV4ID0gbWUuaW5kZXg7XG5cdFx0XHQvLyBEYXRhXG5cdFx0XHRsaW5lLl9jaGlsZHJlbiA9IHBvaW50cztcblx0XHRcdC8vIE1vZGVsXG5cdFx0XHRsaW5lLl9tb2RlbCA9IG1lLl9yZXNvbHZlTGluZU9wdGlvbnMobGluZSk7XG5cblx0XHRcdGxpbmUucGl2b3QoKTtcblx0XHR9XG5cblx0XHQvLyBVcGRhdGUgUG9pbnRzXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdG1lLnVwZGF0ZUVsZW1lbnQocG9pbnRzW2ldLCBpLCByZXNldCk7XG5cdFx0fVxuXG5cdFx0aWYgKHNob3dMaW5lICYmIGxpbmUuX21vZGVsLnRlbnNpb24gIT09IDApIHtcblx0XHRcdG1lLnVwZGF0ZUJlemllckNvbnRyb2xQb2ludHMoKTtcblx0XHR9XG5cblx0XHQvLyBOb3cgcGl2b3QgdGhlIHBvaW50IGZvciBhbmltYXRpb25cblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0cG9pbnRzW2ldLnBpdm90KCk7XG5cdFx0fVxuXHR9LFxuXG5cdHVwZGF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKHBvaW50LCBpbmRleCwgcmVzZXQpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdHZhciBjdXN0b20gPSBwb2ludC5jdXN0b20gfHwge307XG5cdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0dmFyIGRhdGFzZXRJbmRleCA9IG1lLmluZGV4O1xuXHRcdHZhciB2YWx1ZSA9IGRhdGFzZXQuZGF0YVtpbmRleF07XG5cdFx0dmFyIHlTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS55QXhpc0lEKTtcblx0XHR2YXIgeFNjYWxlID0gbWUuZ2V0U2NhbGVGb3JJZChtZXRhLnhBeGlzSUQpO1xuXHRcdHZhciBsaW5lTW9kZWwgPSBtZXRhLmRhdGFzZXQuX21vZGVsO1xuXHRcdHZhciB4LCB5O1xuXG5cdFx0dmFyIG9wdGlvbnMgPSBtZS5fcmVzb2x2ZVBvaW50T3B0aW9ucyhwb2ludCwgaW5kZXgpO1xuXG5cdFx0eCA9IHhTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZSA6IE5hTiwgaW5kZXgsIGRhdGFzZXRJbmRleCk7XG5cdFx0eSA9IHJlc2V0ID8geVNjYWxlLmdldEJhc2VQaXhlbCgpIDogbWUuY2FsY3VsYXRlUG9pbnRZKHZhbHVlLCBpbmRleCwgZGF0YXNldEluZGV4KTtcblxuXHRcdC8vIFV0aWxpdHlcblx0XHRwb2ludC5feFNjYWxlID0geFNjYWxlO1xuXHRcdHBvaW50Ll95U2NhbGUgPSB5U2NhbGU7XG5cdFx0cG9pbnQuX29wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHBvaW50Ll9kYXRhc2V0SW5kZXggPSBkYXRhc2V0SW5kZXg7XG5cdFx0cG9pbnQuX2luZGV4ID0gaW5kZXg7XG5cblx0XHQvLyBEZXNpcmVkIHZpZXcgcHJvcGVydGllc1xuXHRcdHBvaW50Ll9tb2RlbCA9IHtcblx0XHRcdHg6IHgsXG5cdFx0XHR5OiB5LFxuXHRcdFx0c2tpcDogY3VzdG9tLnNraXAgfHwgaXNOYU4oeCkgfHwgaXNOYU4oeSksXG5cdFx0XHQvLyBBcHBlYXJhbmNlXG5cdFx0XHRyYWRpdXM6IG9wdGlvbnMucmFkaXVzLFxuXHRcdFx0cG9pbnRTdHlsZTogb3B0aW9ucy5wb2ludFN0eWxlLFxuXHRcdFx0cm90YXRpb246IG9wdGlvbnMucm90YXRpb24sXG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLFxuXHRcdFx0Ym9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG5cdFx0XHRib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcblx0XHRcdHRlbnNpb246IHZhbHVlT3JEZWZhdWx0JDUoY3VzdG9tLnRlbnNpb24sIGxpbmVNb2RlbCA/IGxpbmVNb2RlbC50ZW5zaW9uIDogMCksXG5cdFx0XHRzdGVwcGVkTGluZTogbGluZU1vZGVsID8gbGluZU1vZGVsLnN0ZXBwZWRMaW5lIDogZmFsc2UsXG5cdFx0XHQvLyBUb29sdGlwXG5cdFx0XHRoaXRSYWRpdXM6IG9wdGlvbnMuaGl0UmFkaXVzXG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZXNvbHZlUG9pbnRPcHRpb25zOiBmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0dmFyIGRhdGFzZXQgPSBjaGFydC5kYXRhLmRhdGFzZXRzW21lLmluZGV4XTtcblx0XHR2YXIgY3VzdG9tID0gZWxlbWVudC5jdXN0b20gfHwge307XG5cdFx0dmFyIG9wdGlvbnMgPSBjaGFydC5vcHRpb25zLmVsZW1lbnRzLnBvaW50O1xuXHRcdHZhciB2YWx1ZXMgPSB7fTtcblx0XHR2YXIgaSwgaWxlbiwga2V5O1xuXG5cdFx0Ly8gU2NyaXB0YWJsZSBvcHRpb25zXG5cdFx0dmFyIGNvbnRleHQgPSB7XG5cdFx0XHRjaGFydDogY2hhcnQsXG5cdFx0XHRkYXRhSW5kZXg6IGluZGV4LFxuXHRcdFx0ZGF0YXNldDogZGF0YXNldCxcblx0XHRcdGRhdGFzZXRJbmRleDogbWUuaW5kZXhcblx0XHR9O1xuXG5cdFx0dmFyIEVMRU1FTlRfT1BUSU9OUyA9IHtcblx0XHRcdGJhY2tncm91bmRDb2xvcjogJ3BvaW50QmFja2dyb3VuZENvbG9yJyxcblx0XHRcdGJvcmRlckNvbG9yOiAncG9pbnRCb3JkZXJDb2xvcicsXG5cdFx0XHRib3JkZXJXaWR0aDogJ3BvaW50Qm9yZGVyV2lkdGgnLFxuXHRcdFx0aGl0UmFkaXVzOiAncG9pbnRIaXRSYWRpdXMnLFxuXHRcdFx0aG92ZXJCYWNrZ3JvdW5kQ29sb3I6ICdwb2ludEhvdmVyQmFja2dyb3VuZENvbG9yJyxcblx0XHRcdGhvdmVyQm9yZGVyQ29sb3I6ICdwb2ludEhvdmVyQm9yZGVyQ29sb3InLFxuXHRcdFx0aG92ZXJCb3JkZXJXaWR0aDogJ3BvaW50SG92ZXJCb3JkZXJXaWR0aCcsXG5cdFx0XHRob3ZlclJhZGl1czogJ3BvaW50SG92ZXJSYWRpdXMnLFxuXHRcdFx0cG9pbnRTdHlsZTogJ3BvaW50U3R5bGUnLFxuXHRcdFx0cmFkaXVzOiAncG9pbnRSYWRpdXMnLFxuXHRcdFx0cm90YXRpb246ICdwb2ludFJvdGF0aW9uJ1xuXHRcdH07XG5cdFx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhFTEVNRU5UX09QVElPTlMpO1xuXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IGtleXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRrZXkgPSBrZXlzW2ldO1xuXHRcdFx0dmFsdWVzW2tleV0gPSByZXNvbHZlJDQoW1xuXHRcdFx0XHRjdXN0b21ba2V5XSxcblx0XHRcdFx0ZGF0YXNldFtFTEVNRU5UX09QVElPTlNba2V5XV0sXG5cdFx0XHRcdGRhdGFzZXRba2V5XSxcblx0XHRcdFx0b3B0aW9uc1trZXldXG5cdFx0XHRdLCBjb250ZXh0LCBpbmRleCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlcztcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZXNvbHZlTGluZU9wdGlvbnM6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBkYXRhc2V0ID0gY2hhcnQuZGF0YS5kYXRhc2V0c1ttZS5pbmRleF07XG5cdFx0dmFyIGN1c3RvbSA9IGVsZW1lbnQuY3VzdG9tIHx8IHt9O1xuXHRcdHZhciBvcHRpb25zID0gY2hhcnQub3B0aW9ucztcblx0XHR2YXIgZWxlbWVudE9wdGlvbnMgPSBvcHRpb25zLmVsZW1lbnRzLmxpbmU7XG5cdFx0dmFyIHZhbHVlcyA9IHt9O1xuXHRcdHZhciBpLCBpbGVuLCBrZXk7XG5cblx0XHR2YXIga2V5cyA9IFtcblx0XHRcdCdiYWNrZ3JvdW5kQ29sb3InLFxuXHRcdFx0J2JvcmRlcldpZHRoJyxcblx0XHRcdCdib3JkZXJDb2xvcicsXG5cdFx0XHQnYm9yZGVyQ2FwU3R5bGUnLFxuXHRcdFx0J2JvcmRlckRhc2gnLFxuXHRcdFx0J2JvcmRlckRhc2hPZmZzZXQnLFxuXHRcdFx0J2JvcmRlckpvaW5TdHlsZScsXG5cdFx0XHQnZmlsbCcsXG5cdFx0XHQnY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSdcblx0XHRdO1xuXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IGtleXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRrZXkgPSBrZXlzW2ldO1xuXHRcdFx0dmFsdWVzW2tleV0gPSByZXNvbHZlJDQoW1xuXHRcdFx0XHRjdXN0b21ba2V5XSxcblx0XHRcdFx0ZGF0YXNldFtrZXldLFxuXHRcdFx0XHRlbGVtZW50T3B0aW9uc1trZXldXG5cdFx0XHRdKTtcblx0XHR9XG5cblx0XHQvLyBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBsaW5lcyBpcyB0byBicmVhayBhdCBudWxsIHZhbHVlcywgYWNjb3JkaW5nXG5cdFx0Ly8gdG8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzI0MzUjaXNzdWVjb21tZW50LTIxNjcxODE1OFxuXHRcdC8vIFRoaXMgb3B0aW9uIGdpdmVzIGxpbmVzIHRoZSBhYmlsaXR5IHRvIHNwYW4gZ2Fwc1xuXHRcdHZhbHVlcy5zcGFuR2FwcyA9IHZhbHVlT3JEZWZhdWx0JDUoZGF0YXNldC5zcGFuR2Fwcywgb3B0aW9ucy5zcGFuR2Fwcyk7XG5cdFx0dmFsdWVzLnRlbnNpb24gPSB2YWx1ZU9yRGVmYXVsdCQ1KGRhdGFzZXQubGluZVRlbnNpb24sIGVsZW1lbnRPcHRpb25zLnRlbnNpb24pO1xuXHRcdHZhbHVlcy5zdGVwcGVkTGluZSA9IHJlc29sdmUkNChbY3VzdG9tLnN0ZXBwZWRMaW5lLCBkYXRhc2V0LnN0ZXBwZWRMaW5lLCBlbGVtZW50T3B0aW9ucy5zdGVwcGVkXSk7XG5cblx0XHRyZXR1cm4gdmFsdWVzO1xuXHR9LFxuXG5cdGNhbGN1bGF0ZVBvaW50WTogZnVuY3Rpb24odmFsdWUsIGluZGV4LCBkYXRhc2V0SW5kZXgpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdHZhciB5U2NhbGUgPSBtZS5nZXRTY2FsZUZvcklkKG1ldGEueUF4aXNJRCk7XG5cdFx0dmFyIHN1bVBvcyA9IDA7XG5cdFx0dmFyIHN1bU5lZyA9IDA7XG5cdFx0dmFyIGksIGRzLCBkc01ldGE7XG5cblx0XHRpZiAoeVNjYWxlLm9wdGlvbnMuc3RhY2tlZCkge1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFzZXRJbmRleDsgaSsrKSB7XG5cdFx0XHRcdGRzID0gY2hhcnQuZGF0YS5kYXRhc2V0c1tpXTtcblx0XHRcdFx0ZHNNZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG5cdFx0XHRcdGlmIChkc01ldGEudHlwZSA9PT0gJ2xpbmUnICYmIGRzTWV0YS55QXhpc0lEID09PSB5U2NhbGUuaWQgJiYgY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xuXHRcdFx0XHRcdHZhciBzdGFja2VkUmlnaHRWYWx1ZSA9IE51bWJlcih5U2NhbGUuZ2V0UmlnaHRWYWx1ZShkcy5kYXRhW2luZGV4XSkpO1xuXHRcdFx0XHRcdGlmIChzdGFja2VkUmlnaHRWYWx1ZSA8IDApIHtcblx0XHRcdFx0XHRcdHN1bU5lZyArPSBzdGFja2VkUmlnaHRWYWx1ZSB8fCAwO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzdW1Qb3MgKz0gc3RhY2tlZFJpZ2h0VmFsdWUgfHwgMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIHJpZ2h0VmFsdWUgPSBOdW1iZXIoeVNjYWxlLmdldFJpZ2h0VmFsdWUodmFsdWUpKTtcblx0XHRcdGlmIChyaWdodFZhbHVlIDwgMCkge1xuXHRcdFx0XHRyZXR1cm4geVNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3VtTmVnICsgcmlnaHRWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4geVNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3VtUG9zICsgcmlnaHRWYWx1ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlKTtcblx0fSxcblxuXHR1cGRhdGVCZXppZXJDb250cm9sUG9pbnRzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdHZhciBsaW5lTW9kZWwgPSBtZXRhLmRhdGFzZXQuX21vZGVsO1xuXHRcdHZhciBhcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuXHRcdHZhciBwb2ludHMgPSBtZXRhLmRhdGEgfHwgW107XG5cdFx0dmFyIGksIGlsZW4sIG1vZGVsLCBjb250cm9sUG9pbnRzO1xuXG5cdFx0Ly8gT25seSBjb25zaWRlciBwb2ludHMgdGhhdCBhcmUgZHJhd24gaW4gY2FzZSB0aGUgc3BhbkdhcHMgb3B0aW9uIGlzIHVzZWRcblx0XHRpZiAobGluZU1vZGVsLnNwYW5HYXBzKSB7XG5cdFx0XHRwb2ludHMgPSBwb2ludHMuZmlsdGVyKGZ1bmN0aW9uKHB0KSB7XG5cdFx0XHRcdHJldHVybiAhcHQuX21vZGVsLnNraXA7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjYXBDb250cm9sUG9pbnQocHQsIG1pbiwgbWF4KSB7XG5cdFx0XHRyZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4ocHQsIG1heCksIG1pbik7XG5cdFx0fVxuXG5cdFx0aWYgKGxpbmVNb2RlbC5jdWJpY0ludGVycG9sYXRpb25Nb2RlID09PSAnbW9ub3RvbmUnKSB7XG5cdFx0XHRoZWxwZXJzJDEuc3BsaW5lQ3VydmVNb25vdG9uZShwb2ludHMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRtb2RlbCA9IHBvaW50c1tpXS5fbW9kZWw7XG5cdFx0XHRcdGNvbnRyb2xQb2ludHMgPSBoZWxwZXJzJDEuc3BsaW5lQ3VydmUoXG5cdFx0XHRcdFx0aGVscGVycyQxLnByZXZpb3VzSXRlbShwb2ludHMsIGkpLl9tb2RlbCxcblx0XHRcdFx0XHRtb2RlbCxcblx0XHRcdFx0XHRoZWxwZXJzJDEubmV4dEl0ZW0ocG9pbnRzLCBpKS5fbW9kZWwsXG5cdFx0XHRcdFx0bGluZU1vZGVsLnRlbnNpb25cblx0XHRcdFx0KTtcblx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNYID0gY29udHJvbFBvaW50cy5wcmV2aW91cy54O1xuXHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1kgPSBjb250cm9sUG9pbnRzLnByZXZpb3VzLnk7XG5cdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludE5leHRYID0gY29udHJvbFBvaW50cy5uZXh0Lng7XG5cdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludE5leHRZID0gY29udHJvbFBvaW50cy5uZXh0Lnk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMubGluZS5jYXBCZXppZXJQb2ludHMpIHtcblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdG1vZGVsID0gcG9pbnRzW2ldLl9tb2RlbDtcblx0XHRcdFx0aWYgKGlzUG9pbnRJbkFyZWEobW9kZWwsIGFyZWEpKSB7XG5cdFx0XHRcdFx0aWYgKGkgPiAwICYmIGlzUG9pbnRJbkFyZWEocG9pbnRzW2kgLSAxXS5fbW9kZWwsIGFyZWEpKSB7XG5cdFx0XHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1ggPSBjYXBDb250cm9sUG9pbnQobW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNYLCBhcmVhLmxlZnQsIGFyZWEucmlnaHQpO1xuXHRcdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNZID0gY2FwQ29udHJvbFBvaW50KG1vZGVsLmNvbnRyb2xQb2ludFByZXZpb3VzWSwgYXJlYS50b3AsIGFyZWEuYm90dG9tKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGkgPCBwb2ludHMubGVuZ3RoIC0gMSAmJiBpc1BvaW50SW5BcmVhKHBvaW50c1tpICsgMV0uX21vZGVsLCBhcmVhKSkge1xuXHRcdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50TmV4dFggPSBjYXBDb250cm9sUG9pbnQobW9kZWwuY29udHJvbFBvaW50TmV4dFgsIGFyZWEubGVmdCwgYXJlYS5yaWdodCk7XG5cdFx0XHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnROZXh0WSA9IGNhcENvbnRyb2xQb2ludChtb2RlbC5jb250cm9sUG9pbnROZXh0WSwgYXJlYS50b3AsIGFyZWEuYm90dG9tKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0ZHJhdzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHR2YXIgcG9pbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuXHRcdHZhciBhcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuXHRcdHZhciBpbGVuID0gcG9pbnRzLmxlbmd0aDtcblx0XHR2YXIgaGFsZkJvcmRlcldpZHRoO1xuXHRcdHZhciBpID0gMDtcblxuXHRcdGlmIChsaW5lRW5hYmxlZChtZS5nZXREYXRhc2V0KCksIGNoYXJ0Lm9wdGlvbnMpKSB7XG5cdFx0XHRoYWxmQm9yZGVyV2lkdGggPSAobWV0YS5kYXRhc2V0Ll9tb2RlbC5ib3JkZXJXaWR0aCB8fCAwKSAvIDI7XG5cblx0XHRcdGhlbHBlcnMkMS5jYW52YXMuY2xpcEFyZWEoY2hhcnQuY3R4LCB7XG5cdFx0XHRcdGxlZnQ6IGFyZWEubGVmdCxcblx0XHRcdFx0cmlnaHQ6IGFyZWEucmlnaHQsXG5cdFx0XHRcdHRvcDogYXJlYS50b3AgLSBoYWxmQm9yZGVyV2lkdGgsXG5cdFx0XHRcdGJvdHRvbTogYXJlYS5ib3R0b20gKyBoYWxmQm9yZGVyV2lkdGhcblx0XHRcdH0pO1xuXG5cdFx0XHRtZXRhLmRhdGFzZXQuZHJhdygpO1xuXG5cdFx0XHRoZWxwZXJzJDEuY2FudmFzLnVuY2xpcEFyZWEoY2hhcnQuY3R4KTtcblx0XHR9XG5cblx0XHQvLyBEcmF3IHRoZSBwb2ludHNcblx0XHRmb3IgKDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0cG9pbnRzW2ldLmRyYXcoYXJlYSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRzZXRIb3ZlclN0eWxlOiBmdW5jdGlvbihwb2ludCkge1xuXHRcdHZhciBtb2RlbCA9IHBvaW50Ll9tb2RlbDtcblx0XHR2YXIgb3B0aW9ucyA9IHBvaW50Ll9vcHRpb25zO1xuXHRcdHZhciBnZXRIb3ZlckNvbG9yID0gaGVscGVycyQxLmdldEhvdmVyQ29sb3I7XG5cblx0XHRwb2ludC4kcHJldmlvdXNTdHlsZSA9IHtcblx0XHRcdGJhY2tncm91bmRDb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuXHRcdFx0Ym9yZGVyQ29sb3I6IG1vZGVsLmJvcmRlckNvbG9yLFxuXHRcdFx0Ym9yZGVyV2lkdGg6IG1vZGVsLmJvcmRlcldpZHRoLFxuXHRcdFx0cmFkaXVzOiBtb2RlbC5yYWRpdXNcblx0XHR9O1xuXG5cdFx0bW9kZWwuYmFja2dyb3VuZENvbG9yID0gdmFsdWVPckRlZmF1bHQkNShvcHRpb25zLmhvdmVyQmFja2dyb3VuZENvbG9yLCBnZXRIb3ZlckNvbG9yKG9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSk7XG5cdFx0bW9kZWwuYm9yZGVyQ29sb3IgPSB2YWx1ZU9yRGVmYXVsdCQ1KG9wdGlvbnMuaG92ZXJCb3JkZXJDb2xvciwgZ2V0SG92ZXJDb2xvcihvcHRpb25zLmJvcmRlckNvbG9yKSk7XG5cdFx0bW9kZWwuYm9yZGVyV2lkdGggPSB2YWx1ZU9yRGVmYXVsdCQ1KG9wdGlvbnMuaG92ZXJCb3JkZXJXaWR0aCwgb3B0aW9ucy5ib3JkZXJXaWR0aCk7XG5cdFx0bW9kZWwucmFkaXVzID0gdmFsdWVPckRlZmF1bHQkNShvcHRpb25zLmhvdmVyUmFkaXVzLCBvcHRpb25zLnJhZGl1cyk7XG5cdH0sXG59KTtcblxudmFyIHJlc29sdmUkNSA9IGhlbHBlcnMkMS5vcHRpb25zLnJlc29sdmU7XG5cbmNvcmVfZGVmYXVsdHMuX3NldCgncG9sYXJBcmVhJywge1xuXHRzY2FsZToge1xuXHRcdHR5cGU6ICdyYWRpYWxMaW5lYXInLFxuXHRcdGFuZ2xlTGluZXM6IHtcblx0XHRcdGRpc3BsYXk6IGZhbHNlXG5cdFx0fSxcblx0XHRncmlkTGluZXM6IHtcblx0XHRcdGNpcmN1bGFyOiB0cnVlXG5cdFx0fSxcblx0XHRwb2ludExhYmVsczoge1xuXHRcdFx0ZGlzcGxheTogZmFsc2Vcblx0XHR9LFxuXHRcdHRpY2tzOiB7XG5cdFx0XHRiZWdpbkF0WmVybzogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBCb29sZWFuIC0gV2hldGhlciB0byBhbmltYXRlIHRoZSByb3RhdGlvbiBvZiB0aGUgY2hhcnRcblx0YW5pbWF0aW9uOiB7XG5cdFx0YW5pbWF0ZVJvdGF0ZTogdHJ1ZSxcblx0XHRhbmltYXRlU2NhbGU6IHRydWVcblx0fSxcblxuXHRzdGFydEFuZ2xlOiAtMC41ICogTWF0aC5QSSxcblx0bGVnZW5kQ2FsbGJhY2s6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0dmFyIHRleHQgPSBbXTtcblx0XHR0ZXh0LnB1c2goJzx1bCBjbGFzcz1cIicgKyBjaGFydC5pZCArICctbGVnZW5kXCI+Jyk7XG5cblx0XHR2YXIgZGF0YSA9IGNoYXJ0LmRhdGE7XG5cdFx0dmFyIGRhdGFzZXRzID0gZGF0YS5kYXRhc2V0cztcblx0XHR2YXIgbGFiZWxzID0gZGF0YS5sYWJlbHM7XG5cblx0XHRpZiAoZGF0YXNldHMubGVuZ3RoKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFzZXRzWzBdLmRhdGEubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0dGV4dC5wdXNoKCc8bGk+PHNwYW4gc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOicgKyBkYXRhc2V0c1swXS5iYWNrZ3JvdW5kQ29sb3JbaV0gKyAnXCI+PC9zcGFuPicpO1xuXHRcdFx0XHRpZiAobGFiZWxzW2ldKSB7XG5cdFx0XHRcdFx0dGV4dC5wdXNoKGxhYmVsc1tpXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGV4dC5wdXNoKCc8L2xpPicpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRleHQucHVzaCgnPC91bD4nKTtcblx0XHRyZXR1cm4gdGV4dC5qb2luKCcnKTtcblx0fSxcblx0bGVnZW5kOiB7XG5cdFx0bGFiZWxzOiB7XG5cdFx0XHRnZW5lcmF0ZUxhYmVsczogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHRcdFx0dmFyIGRhdGEgPSBjaGFydC5kYXRhO1xuXHRcdFx0XHRpZiAoZGF0YS5sYWJlbHMubGVuZ3RoICYmIGRhdGEuZGF0YXNldHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEubGFiZWxzLm1hcChmdW5jdGlvbihsYWJlbCwgaSkge1xuXHRcdFx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YSgwKTtcblx0XHRcdFx0XHRcdHZhciBkcyA9IGRhdGEuZGF0YXNldHNbMF07XG5cdFx0XHRcdFx0XHR2YXIgYXJjID0gbWV0YS5kYXRhW2ldO1xuXHRcdFx0XHRcdFx0dmFyIGN1c3RvbSA9IGFyYy5jdXN0b20gfHwge307XG5cdFx0XHRcdFx0XHR2YXIgYXJjT3B0cyA9IGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMuYXJjO1xuXHRcdFx0XHRcdFx0dmFyIGZpbGwgPSByZXNvbHZlJDUoW2N1c3RvbS5iYWNrZ3JvdW5kQ29sb3IsIGRzLmJhY2tncm91bmRDb2xvciwgYXJjT3B0cy5iYWNrZ3JvdW5kQ29sb3JdLCB1bmRlZmluZWQsIGkpO1xuXHRcdFx0XHRcdFx0dmFyIHN0cm9rZSA9IHJlc29sdmUkNShbY3VzdG9tLmJvcmRlckNvbG9yLCBkcy5ib3JkZXJDb2xvciwgYXJjT3B0cy5ib3JkZXJDb2xvcl0sIHVuZGVmaW5lZCwgaSk7XG5cdFx0XHRcdFx0XHR2YXIgYncgPSByZXNvbHZlJDUoW2N1c3RvbS5ib3JkZXJXaWR0aCwgZHMuYm9yZGVyV2lkdGgsIGFyY09wdHMuYm9yZGVyV2lkdGhdLCB1bmRlZmluZWQsIGkpO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBsYWJlbCxcblx0XHRcdFx0XHRcdFx0ZmlsbFN0eWxlOiBmaWxsLFxuXHRcdFx0XHRcdFx0XHRzdHJva2VTdHlsZTogc3Ryb2tlLFxuXHRcdFx0XHRcdFx0XHRsaW5lV2lkdGg6IGJ3LFxuXHRcdFx0XHRcdFx0XHRoaWRkZW46IGlzTmFOKGRzLmRhdGFbaV0pIHx8IG1ldGEuZGF0YVtpXS5oaWRkZW4sXG5cblx0XHRcdFx0XHRcdFx0Ly8gRXh0cmEgZGF0YSB1c2VkIGZvciB0b2dnbGluZyB0aGUgY29ycmVjdCBpdGVtXG5cdFx0XHRcdFx0XHRcdGluZGV4OiBpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0b25DbGljazogZnVuY3Rpb24oZSwgbGVnZW5kSXRlbSkge1xuXHRcdFx0dmFyIGluZGV4ID0gbGVnZW5kSXRlbS5pbmRleDtcblx0XHRcdHZhciBjaGFydCA9IHRoaXMuY2hhcnQ7XG5cdFx0XHR2YXIgaSwgaWxlbiwgbWV0YTtcblxuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IChjaGFydC5kYXRhLmRhdGFzZXRzIHx8IFtdKS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0bWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGkpO1xuXHRcdFx0XHRtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbiA9ICFtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Y2hhcnQudXBkYXRlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5lZWQgdG8gb3ZlcnJpZGUgdGhlc2UgdG8gZ2l2ZSBhIG5pY2UgZGVmYXVsdFxuXHR0b29sdGlwczoge1xuXHRcdGNhbGxiYWNrczoge1xuXHRcdFx0dGl0bGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9LFxuXHRcdFx0bGFiZWw6IGZ1bmN0aW9uKGl0ZW0sIGRhdGEpIHtcblx0XHRcdFx0cmV0dXJuIGRhdGEubGFiZWxzW2l0ZW0uaW5kZXhdICsgJzogJyArIGl0ZW0ueUxhYmVsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5cbnZhciBjb250cm9sbGVyX3BvbGFyQXJlYSA9IGNvcmVfZGF0YXNldENvbnRyb2xsZXIuZXh0ZW5kKHtcblxuXHRkYXRhRWxlbWVudFR5cGU6IGVsZW1lbnRzLkFyYyxcblxuXHRsaW5rU2NhbGVzOiBoZWxwZXJzJDEubm9vcCxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uKHJlc2V0KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHR2YXIgc3RhcnQgPSBtZS5jaGFydC5vcHRpb25zLnN0YXJ0QW5nbGUgfHwgMDtcblx0XHR2YXIgc3RhcnRzID0gbWUuX3N0YXJ0cyA9IFtdO1xuXHRcdHZhciBhbmdsZXMgPSBtZS5fYW5nbGVzID0gW107XG5cdFx0dmFyIGFyY3MgPSBtZXRhLmRhdGE7XG5cdFx0dmFyIGksIGlsZW4sIGFuZ2xlO1xuXG5cdFx0bWUuX3VwZGF0ZVJhZGl1cygpO1xuXG5cdFx0bWV0YS5jb3VudCA9IG1lLmNvdW50VmlzaWJsZUVsZW1lbnRzKCk7XG5cblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gZGF0YXNldC5kYXRhLmxlbmd0aDsgaSA8IGlsZW47IGkrKykge1xuXHRcdFx0c3RhcnRzW2ldID0gc3RhcnQ7XG5cdFx0XHRhbmdsZSA9IG1lLl9jb21wdXRlQW5nbGUoaSk7XG5cdFx0XHRhbmdsZXNbaV0gPSBhbmdsZTtcblx0XHRcdHN0YXJ0ICs9IGFuZ2xlO1xuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBhcmNzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0YXJjc1tpXS5fb3B0aW9ucyA9IG1lLl9yZXNvbHZlRWxlbWVudE9wdGlvbnMoYXJjc1tpXSwgaSk7XG5cdFx0XHRtZS51cGRhdGVFbGVtZW50KGFyY3NbaV0sIGksIHJlc2V0KTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfdXBkYXRlUmFkaXVzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBjaGFydEFyZWEgPSBjaGFydC5jaGFydEFyZWE7XG5cdFx0dmFyIG9wdHMgPSBjaGFydC5vcHRpb25zO1xuXHRcdHZhciBtaW5TaXplID0gTWF0aC5taW4oY2hhcnRBcmVhLnJpZ2h0IC0gY2hhcnRBcmVhLmxlZnQsIGNoYXJ0QXJlYS5ib3R0b20gLSBjaGFydEFyZWEudG9wKTtcblxuXHRcdGNoYXJ0Lm91dGVyUmFkaXVzID0gTWF0aC5tYXgobWluU2l6ZSAvIDIsIDApO1xuXHRcdGNoYXJ0LmlubmVyUmFkaXVzID0gTWF0aC5tYXgob3B0cy5jdXRvdXRQZXJjZW50YWdlID8gKGNoYXJ0Lm91dGVyUmFkaXVzIC8gMTAwKSAqIChvcHRzLmN1dG91dFBlcmNlbnRhZ2UpIDogMSwgMCk7XG5cdFx0Y2hhcnQucmFkaXVzTGVuZ3RoID0gKGNoYXJ0Lm91dGVyUmFkaXVzIC0gY2hhcnQuaW5uZXJSYWRpdXMpIC8gY2hhcnQuZ2V0VmlzaWJsZURhdGFzZXRDb3VudCgpO1xuXG5cdFx0bWUub3V0ZXJSYWRpdXMgPSBjaGFydC5vdXRlclJhZGl1cyAtIChjaGFydC5yYWRpdXNMZW5ndGggKiBtZS5pbmRleCk7XG5cdFx0bWUuaW5uZXJSYWRpdXMgPSBtZS5vdXRlclJhZGl1cyAtIGNoYXJ0LnJhZGl1c0xlbmd0aDtcblx0fSxcblxuXHR1cGRhdGVFbGVtZW50OiBmdW5jdGlvbihhcmMsIGluZGV4LCByZXNldCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0dmFyIG9wdHMgPSBjaGFydC5vcHRpb25zO1xuXHRcdHZhciBhbmltYXRpb25PcHRzID0gb3B0cy5hbmltYXRpb247XG5cdFx0dmFyIHNjYWxlID0gY2hhcnQuc2NhbGU7XG5cdFx0dmFyIGxhYmVscyA9IGNoYXJ0LmRhdGEubGFiZWxzO1xuXG5cdFx0dmFyIGNlbnRlclggPSBzY2FsZS54Q2VudGVyO1xuXHRcdHZhciBjZW50ZXJZID0gc2NhbGUueUNlbnRlcjtcblxuXHRcdC8vIHZhciBuZWdIYWxmUEkgPSAtMC41ICogTWF0aC5QSTtcblx0XHR2YXIgZGF0YXNldFN0YXJ0QW5nbGUgPSBvcHRzLnN0YXJ0QW5nbGU7XG5cdFx0dmFyIGRpc3RhbmNlID0gYXJjLmhpZGRlbiA/IDAgOiBzY2FsZS5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZShkYXRhc2V0LmRhdGFbaW5kZXhdKTtcblx0XHR2YXIgc3RhcnRBbmdsZSA9IG1lLl9zdGFydHNbaW5kZXhdO1xuXHRcdHZhciBlbmRBbmdsZSA9IHN0YXJ0QW5nbGUgKyAoYXJjLmhpZGRlbiA/IDAgOiBtZS5fYW5nbGVzW2luZGV4XSk7XG5cblx0XHR2YXIgcmVzZXRSYWRpdXMgPSBhbmltYXRpb25PcHRzLmFuaW1hdGVTY2FsZSA/IDAgOiBzY2FsZS5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZShkYXRhc2V0LmRhdGFbaW5kZXhdKTtcblx0XHR2YXIgb3B0aW9ucyA9IGFyYy5fb3B0aW9ucyB8fCB7fTtcblxuXHRcdGhlbHBlcnMkMS5leHRlbmQoYXJjLCB7XG5cdFx0XHQvLyBVdGlsaXR5XG5cdFx0XHRfZGF0YXNldEluZGV4OiBtZS5pbmRleCxcblx0XHRcdF9pbmRleDogaW5kZXgsXG5cdFx0XHRfc2NhbGU6IHNjYWxlLFxuXG5cdFx0XHQvLyBEZXNpcmVkIHZpZXcgcHJvcGVydGllc1xuXHRcdFx0X21vZGVsOiB7XG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuXHRcdFx0XHRib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcblx0XHRcdFx0Ym9yZGVyQWxpZ246IG9wdGlvbnMuYm9yZGVyQWxpZ24sXG5cdFx0XHRcdHg6IGNlbnRlclgsXG5cdFx0XHRcdHk6IGNlbnRlclksXG5cdFx0XHRcdGlubmVyUmFkaXVzOiAwLFxuXHRcdFx0XHRvdXRlclJhZGl1czogcmVzZXQgPyByZXNldFJhZGl1cyA6IGRpc3RhbmNlLFxuXHRcdFx0XHRzdGFydEFuZ2xlOiByZXNldCAmJiBhbmltYXRpb25PcHRzLmFuaW1hdGVSb3RhdGUgPyBkYXRhc2V0U3RhcnRBbmdsZSA6IHN0YXJ0QW5nbGUsXG5cdFx0XHRcdGVuZEFuZ2xlOiByZXNldCAmJiBhbmltYXRpb25PcHRzLmFuaW1hdGVSb3RhdGUgPyBkYXRhc2V0U3RhcnRBbmdsZSA6IGVuZEFuZ2xlLFxuXHRcdFx0XHRsYWJlbDogaGVscGVycyQxLnZhbHVlQXRJbmRleE9yRGVmYXVsdChsYWJlbHMsIGluZGV4LCBsYWJlbHNbaW5kZXhdKVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXJjLnBpdm90KCk7XG5cdH0sXG5cblx0Y291bnRWaXNpYmxlRWxlbWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG5cdFx0dmFyIG1ldGEgPSB0aGlzLmdldE1ldGEoKTtcblx0XHR2YXIgY291bnQgPSAwO1xuXG5cdFx0aGVscGVycyQxLmVhY2gobWV0YS5kYXRhLCBmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuXHRcdFx0aWYgKCFpc05hTihkYXRhc2V0LmRhdGFbaW5kZXhdKSAmJiAhZWxlbWVudC5oaWRkZW4pIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBjb3VudDtcblx0fSxcblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0c2V0SG92ZXJTdHlsZTogZnVuY3Rpb24oYXJjKSB7XG5cdFx0dmFyIG1vZGVsID0gYXJjLl9tb2RlbDtcblx0XHR2YXIgb3B0aW9ucyA9IGFyYy5fb3B0aW9ucztcblx0XHR2YXIgZ2V0SG92ZXJDb2xvciA9IGhlbHBlcnMkMS5nZXRIb3ZlckNvbG9yO1xuXHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMkMS52YWx1ZU9yRGVmYXVsdDtcblxuXHRcdGFyYy4kcHJldmlvdXNTdHlsZSA9IHtcblx0XHRcdGJhY2tncm91bmRDb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuXHRcdFx0Ym9yZGVyQ29sb3I6IG1vZGVsLmJvcmRlckNvbG9yLFxuXHRcdFx0Ym9yZGVyV2lkdGg6IG1vZGVsLmJvcmRlcldpZHRoLFxuXHRcdH07XG5cblx0XHRtb2RlbC5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmhvdmVyQmFja2dyb3VuZENvbG9yLCBnZXRIb3ZlckNvbG9yKG9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSk7XG5cdFx0bW9kZWwuYm9yZGVyQ29sb3IgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmhvdmVyQm9yZGVyQ29sb3IsIGdldEhvdmVyQ29sb3Iob3B0aW9ucy5ib3JkZXJDb2xvcikpO1xuXHRcdG1vZGVsLmJvcmRlcldpZHRoID0gdmFsdWVPckRlZmF1bHQob3B0aW9ucy5ob3ZlckJvcmRlcldpZHRoLCBvcHRpb25zLmJvcmRlcldpZHRoKTtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZXNvbHZlRWxlbWVudE9wdGlvbnM6IGZ1bmN0aW9uKGFyYywgaW5kZXgpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXHRcdHZhciBjdXN0b20gPSBhcmMuY3VzdG9tIHx8IHt9O1xuXHRcdHZhciBvcHRpb25zID0gY2hhcnQub3B0aW9ucy5lbGVtZW50cy5hcmM7XG5cdFx0dmFyIHZhbHVlcyA9IHt9O1xuXHRcdHZhciBpLCBpbGVuLCBrZXk7XG5cblx0XHQvLyBTY3JpcHRhYmxlIG9wdGlvbnNcblx0XHR2YXIgY29udGV4dCA9IHtcblx0XHRcdGNoYXJ0OiBjaGFydCxcblx0XHRcdGRhdGFJbmRleDogaW5kZXgsXG5cdFx0XHRkYXRhc2V0OiBkYXRhc2V0LFxuXHRcdFx0ZGF0YXNldEluZGV4OiBtZS5pbmRleFxuXHRcdH07XG5cblx0XHR2YXIga2V5cyA9IFtcblx0XHRcdCdiYWNrZ3JvdW5kQ29sb3InLFxuXHRcdFx0J2JvcmRlckNvbG9yJyxcblx0XHRcdCdib3JkZXJXaWR0aCcsXG5cdFx0XHQnYm9yZGVyQWxpZ24nLFxuXHRcdFx0J2hvdmVyQmFja2dyb3VuZENvbG9yJyxcblx0XHRcdCdob3ZlckJvcmRlckNvbG9yJyxcblx0XHRcdCdob3ZlckJvcmRlcldpZHRoJyxcblx0XHRdO1xuXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IGtleXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRrZXkgPSBrZXlzW2ldO1xuXHRcdFx0dmFsdWVzW2tleV0gPSByZXNvbHZlJDUoW1xuXHRcdFx0XHRjdXN0b21ba2V5XSxcblx0XHRcdFx0ZGF0YXNldFtrZXldLFxuXHRcdFx0XHRvcHRpb25zW2tleV1cblx0XHRcdF0sIGNvbnRleHQsIGluZGV4KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWVzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2NvbXB1dGVBbmdsZTogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjb3VudCA9IHRoaXMuZ2V0TWV0YSgpLmNvdW50O1xuXHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXG5cdFx0aWYgKGlzTmFOKGRhdGFzZXQuZGF0YVtpbmRleF0pIHx8IG1ldGEuZGF0YVtpbmRleF0uaGlkZGVuKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTY3JpcHRhYmxlIG9wdGlvbnNcblx0XHR2YXIgY29udGV4dCA9IHtcblx0XHRcdGNoYXJ0OiBtZS5jaGFydCxcblx0XHRcdGRhdGFJbmRleDogaW5kZXgsXG5cdFx0XHRkYXRhc2V0OiBkYXRhc2V0LFxuXHRcdFx0ZGF0YXNldEluZGV4OiBtZS5pbmRleFxuXHRcdH07XG5cblx0XHRyZXR1cm4gcmVzb2x2ZSQ1KFtcblx0XHRcdG1lLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMuYXJjLmFuZ2xlLFxuXHRcdFx0KDIgKiBNYXRoLlBJKSAvIGNvdW50XG5cdFx0XSwgY29udGV4dCwgaW5kZXgpO1xuXHR9XG59KTtcblxuY29yZV9kZWZhdWx0cy5fc2V0KCdwaWUnLCBoZWxwZXJzJDEuY2xvbmUoY29yZV9kZWZhdWx0cy5kb3VnaG51dCkpO1xuY29yZV9kZWZhdWx0cy5fc2V0KCdwaWUnLCB7XG5cdGN1dG91dFBlcmNlbnRhZ2U6IDBcbn0pO1xuXG4vLyBQaWUgY2hhcnRzIGFyZSBEb3VnaG51dCBjaGFydCB3aXRoIGRpZmZlcmVudCBkZWZhdWx0c1xudmFyIGNvbnRyb2xsZXJfcGllID0gY29udHJvbGxlcl9kb3VnaG51dDtcblxudmFyIHZhbHVlT3JEZWZhdWx0JDYgPSBoZWxwZXJzJDEudmFsdWVPckRlZmF1bHQ7XG52YXIgcmVzb2x2ZSQ2ID0gaGVscGVycyQxLm9wdGlvbnMucmVzb2x2ZTtcblxuY29yZV9kZWZhdWx0cy5fc2V0KCdyYWRhcicsIHtcblx0c2NhbGU6IHtcblx0XHR0eXBlOiAncmFkaWFsTGluZWFyJ1xuXHR9LFxuXHRlbGVtZW50czoge1xuXHRcdGxpbmU6IHtcblx0XHRcdHRlbnNpb246IDAgLy8gbm8gYmV6aWVyIGluIHJhZGFyXG5cdFx0fVxuXHR9XG59KTtcblxudmFyIGNvbnRyb2xsZXJfcmFkYXIgPSBjb3JlX2RhdGFzZXRDb250cm9sbGVyLmV4dGVuZCh7XG5cblx0ZGF0YXNldEVsZW1lbnRUeXBlOiBlbGVtZW50cy5MaW5lLFxuXG5cdGRhdGFFbGVtZW50VHlwZTogZWxlbWVudHMuUG9pbnQsXG5cblx0bGlua1NjYWxlczogaGVscGVycyQxLm5vb3AsXG5cblx0dXBkYXRlOiBmdW5jdGlvbihyZXNldCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0dmFyIGxpbmUgPSBtZXRhLmRhdGFzZXQ7XG5cdFx0dmFyIHBvaW50cyA9IG1ldGEuZGF0YSB8fCBbXTtcblx0XHR2YXIgc2NhbGUgPSBtZS5jaGFydC5zY2FsZTtcblx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblx0XHR2YXIgaSwgaWxlbjtcblxuXHRcdC8vIENvbXBhdGliaWxpdHk6IElmIHRoZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIHdpdGggb25seSB0aGUgb2xkIG5hbWUsIHVzZSB0aG9zZSB2YWx1ZXNcblx0XHRpZiAoKGRhdGFzZXQudGVuc2lvbiAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YXNldC5saW5lVGVuc2lvbiA9PT0gdW5kZWZpbmVkKSkge1xuXHRcdFx0ZGF0YXNldC5saW5lVGVuc2lvbiA9IGRhdGFzZXQudGVuc2lvbjtcblx0XHR9XG5cblx0XHQvLyBVdGlsaXR5XG5cdFx0bGluZS5fc2NhbGUgPSBzY2FsZTtcblx0XHRsaW5lLl9kYXRhc2V0SW5kZXggPSBtZS5pbmRleDtcblx0XHQvLyBEYXRhXG5cdFx0bGluZS5fY2hpbGRyZW4gPSBwb2ludHM7XG5cdFx0bGluZS5fbG9vcCA9IHRydWU7XG5cdFx0Ly8gTW9kZWxcblx0XHRsaW5lLl9tb2RlbCA9IG1lLl9yZXNvbHZlTGluZU9wdGlvbnMobGluZSk7XG5cblx0XHRsaW5lLnBpdm90KCk7XG5cblx0XHQvLyBVcGRhdGUgUG9pbnRzXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdG1lLnVwZGF0ZUVsZW1lbnQocG9pbnRzW2ldLCBpLCByZXNldCk7XG5cdFx0fVxuXG5cdFx0Ly8gVXBkYXRlIGJlemllciBjb250cm9sIHBvaW50c1xuXHRcdG1lLnVwZGF0ZUJlemllckNvbnRyb2xQb2ludHMoKTtcblxuXHRcdC8vIE5vdyBwaXZvdCB0aGUgcG9pbnQgZm9yIGFuaW1hdGlvblxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRwb2ludHNbaV0ucGl2b3QoKTtcblx0XHR9XG5cdH0sXG5cblx0dXBkYXRlRWxlbWVudDogZnVuY3Rpb24ocG9pbnQsIGluZGV4LCByZXNldCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGN1c3RvbSA9IHBvaW50LmN1c3RvbSB8fCB7fTtcblx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblx0XHR2YXIgc2NhbGUgPSBtZS5jaGFydC5zY2FsZTtcblx0XHR2YXIgcG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShpbmRleCwgZGF0YXNldC5kYXRhW2luZGV4XSk7XG5cdFx0dmFyIG9wdGlvbnMgPSBtZS5fcmVzb2x2ZVBvaW50T3B0aW9ucyhwb2ludCwgaW5kZXgpO1xuXHRcdHZhciBsaW5lTW9kZWwgPSBtZS5nZXRNZXRhKCkuZGF0YXNldC5fbW9kZWw7XG5cdFx0dmFyIHggPSByZXNldCA/IHNjYWxlLnhDZW50ZXIgOiBwb2ludFBvc2l0aW9uLng7XG5cdFx0dmFyIHkgPSByZXNldCA/IHNjYWxlLnlDZW50ZXIgOiBwb2ludFBvc2l0aW9uLnk7XG5cblx0XHQvLyBVdGlsaXR5XG5cdFx0cG9pbnQuX3NjYWxlID0gc2NhbGU7XG5cdFx0cG9pbnQuX29wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHBvaW50Ll9kYXRhc2V0SW5kZXggPSBtZS5pbmRleDtcblx0XHRwb2ludC5faW5kZXggPSBpbmRleDtcblxuXHRcdC8vIERlc2lyZWQgdmlldyBwcm9wZXJ0aWVzXG5cdFx0cG9pbnQuX21vZGVsID0ge1xuXHRcdFx0eDogeCwgLy8gdmFsdWUgbm90IHVzZWQgaW4gZGF0YXNldCBzY2FsZSwgYnV0IHdlIHdhbnQgYSBjb25zaXN0ZW50IEFQSSBiZXR3ZWVuIHNjYWxlc1xuXHRcdFx0eTogeSxcblx0XHRcdHNraXA6IGN1c3RvbS5za2lwIHx8IGlzTmFOKHgpIHx8IGlzTmFOKHkpLFxuXHRcdFx0Ly8gQXBwZWFyYW5jZVxuXHRcdFx0cmFkaXVzOiBvcHRpb25zLnJhZGl1cyxcblx0XHRcdHBvaW50U3R5bGU6IG9wdGlvbnMucG9pbnRTdHlsZSxcblx0XHRcdHJvdGF0aW9uOiBvcHRpb25zLnJvdGF0aW9uLFxuXHRcdFx0YmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcblx0XHRcdGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuXHRcdFx0Ym9yZGVyV2lkdGg6IG9wdGlvbnMuYm9yZGVyV2lkdGgsXG5cdFx0XHR0ZW5zaW9uOiB2YWx1ZU9yRGVmYXVsdCQ2KGN1c3RvbS50ZW5zaW9uLCBsaW5lTW9kZWwgPyBsaW5lTW9kZWwudGVuc2lvbiA6IDApLFxuXG5cdFx0XHQvLyBUb29sdGlwXG5cdFx0XHRoaXRSYWRpdXM6IG9wdGlvbnMuaGl0UmFkaXVzXG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZXNvbHZlUG9pbnRPcHRpb25zOiBmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0dmFyIGRhdGFzZXQgPSBjaGFydC5kYXRhLmRhdGFzZXRzW21lLmluZGV4XTtcblx0XHR2YXIgY3VzdG9tID0gZWxlbWVudC5jdXN0b20gfHwge307XG5cdFx0dmFyIG9wdGlvbnMgPSBjaGFydC5vcHRpb25zLmVsZW1lbnRzLnBvaW50O1xuXHRcdHZhciB2YWx1ZXMgPSB7fTtcblx0XHR2YXIgaSwgaWxlbiwga2V5O1xuXG5cdFx0Ly8gU2NyaXB0YWJsZSBvcHRpb25zXG5cdFx0dmFyIGNvbnRleHQgPSB7XG5cdFx0XHRjaGFydDogY2hhcnQsXG5cdFx0XHRkYXRhSW5kZXg6IGluZGV4LFxuXHRcdFx0ZGF0YXNldDogZGF0YXNldCxcblx0XHRcdGRhdGFzZXRJbmRleDogbWUuaW5kZXhcblx0XHR9O1xuXG5cdFx0dmFyIEVMRU1FTlRfT1BUSU9OUyA9IHtcblx0XHRcdGJhY2tncm91bmRDb2xvcjogJ3BvaW50QmFja2dyb3VuZENvbG9yJyxcblx0XHRcdGJvcmRlckNvbG9yOiAncG9pbnRCb3JkZXJDb2xvcicsXG5cdFx0XHRib3JkZXJXaWR0aDogJ3BvaW50Qm9yZGVyV2lkdGgnLFxuXHRcdFx0aGl0UmFkaXVzOiAncG9pbnRIaXRSYWRpdXMnLFxuXHRcdFx0aG92ZXJCYWNrZ3JvdW5kQ29sb3I6ICdwb2ludEhvdmVyQmFja2dyb3VuZENvbG9yJyxcblx0XHRcdGhvdmVyQm9yZGVyQ29sb3I6ICdwb2ludEhvdmVyQm9yZGVyQ29sb3InLFxuXHRcdFx0aG92ZXJCb3JkZXJXaWR0aDogJ3BvaW50SG92ZXJCb3JkZXJXaWR0aCcsXG5cdFx0XHRob3ZlclJhZGl1czogJ3BvaW50SG92ZXJSYWRpdXMnLFxuXHRcdFx0cG9pbnRTdHlsZTogJ3BvaW50U3R5bGUnLFxuXHRcdFx0cmFkaXVzOiAncG9pbnRSYWRpdXMnLFxuXHRcdFx0cm90YXRpb246ICdwb2ludFJvdGF0aW9uJ1xuXHRcdH07XG5cdFx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhFTEVNRU5UX09QVElPTlMpO1xuXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IGtleXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRrZXkgPSBrZXlzW2ldO1xuXHRcdFx0dmFsdWVzW2tleV0gPSByZXNvbHZlJDYoW1xuXHRcdFx0XHRjdXN0b21ba2V5XSxcblx0XHRcdFx0ZGF0YXNldFtFTEVNRU5UX09QVElPTlNba2V5XV0sXG5cdFx0XHRcdGRhdGFzZXRba2V5XSxcblx0XHRcdFx0b3B0aW9uc1trZXldXG5cdFx0XHRdLCBjb250ZXh0LCBpbmRleCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlcztcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZXNvbHZlTGluZU9wdGlvbnM6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBkYXRhc2V0ID0gY2hhcnQuZGF0YS5kYXRhc2V0c1ttZS5pbmRleF07XG5cdFx0dmFyIGN1c3RvbSA9IGVsZW1lbnQuY3VzdG9tIHx8IHt9O1xuXHRcdHZhciBvcHRpb25zID0gY2hhcnQub3B0aW9ucy5lbGVtZW50cy5saW5lO1xuXHRcdHZhciB2YWx1ZXMgPSB7fTtcblx0XHR2YXIgaSwgaWxlbiwga2V5O1xuXG5cdFx0dmFyIGtleXMgPSBbXG5cdFx0XHQnYmFja2dyb3VuZENvbG9yJyxcblx0XHRcdCdib3JkZXJXaWR0aCcsXG5cdFx0XHQnYm9yZGVyQ29sb3InLFxuXHRcdFx0J2JvcmRlckNhcFN0eWxlJyxcblx0XHRcdCdib3JkZXJEYXNoJyxcblx0XHRcdCdib3JkZXJEYXNoT2Zmc2V0Jyxcblx0XHRcdCdib3JkZXJKb2luU3R5bGUnLFxuXHRcdFx0J2ZpbGwnXG5cdFx0XTtcblxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBrZXlzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0a2V5ID0ga2V5c1tpXTtcblx0XHRcdHZhbHVlc1trZXldID0gcmVzb2x2ZSQ2KFtcblx0XHRcdFx0Y3VzdG9tW2tleV0sXG5cdFx0XHRcdGRhdGFzZXRba2V5XSxcblx0XHRcdFx0b3B0aW9uc1trZXldXG5cdFx0XHRdKTtcblx0XHR9XG5cblx0XHR2YWx1ZXMudGVuc2lvbiA9IHZhbHVlT3JEZWZhdWx0JDYoZGF0YXNldC5saW5lVGVuc2lvbiwgb3B0aW9ucy50ZW5zaW9uKTtcblxuXHRcdHJldHVybiB2YWx1ZXM7XG5cdH0sXG5cblx0dXBkYXRlQmV6aWVyQ29udHJvbFBvaW50czogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHR2YXIgYXJlYSA9IG1lLmNoYXJ0LmNoYXJ0QXJlYTtcblx0XHR2YXIgcG9pbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuXHRcdHZhciBpLCBpbGVuLCBtb2RlbCwgY29udHJvbFBvaW50cztcblxuXHRcdGZ1bmN0aW9uIGNhcENvbnRyb2xQb2ludChwdCwgbWluLCBtYXgpIHtcblx0XHRcdHJldHVybiBNYXRoLm1heChNYXRoLm1pbihwdCwgbWF4KSwgbWluKTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0bW9kZWwgPSBwb2ludHNbaV0uX21vZGVsO1xuXHRcdFx0Y29udHJvbFBvaW50cyA9IGhlbHBlcnMkMS5zcGxpbmVDdXJ2ZShcblx0XHRcdFx0aGVscGVycyQxLnByZXZpb3VzSXRlbShwb2ludHMsIGksIHRydWUpLl9tb2RlbCxcblx0XHRcdFx0bW9kZWwsXG5cdFx0XHRcdGhlbHBlcnMkMS5uZXh0SXRlbShwb2ludHMsIGksIHRydWUpLl9tb2RlbCxcblx0XHRcdFx0bW9kZWwudGVuc2lvblxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gUHJldmVudCB0aGUgYmV6aWVyIGdvaW5nIG91dHNpZGUgb2YgdGhlIGJvdW5kcyBvZiB0aGUgZ3JhcGhcblx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludFByZXZpb3VzWCA9IGNhcENvbnRyb2xQb2ludChjb250cm9sUG9pbnRzLnByZXZpb3VzLngsIGFyZWEubGVmdCwgYXJlYS5yaWdodCk7XG5cdFx0XHRtb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1kgPSBjYXBDb250cm9sUG9pbnQoY29udHJvbFBvaW50cy5wcmV2aW91cy55LCBhcmVhLnRvcCwgYXJlYS5ib3R0b20pO1xuXHRcdFx0bW9kZWwuY29udHJvbFBvaW50TmV4dFggPSBjYXBDb250cm9sUG9pbnQoY29udHJvbFBvaW50cy5uZXh0LngsIGFyZWEubGVmdCwgYXJlYS5yaWdodCk7XG5cdFx0XHRtb2RlbC5jb250cm9sUG9pbnROZXh0WSA9IGNhcENvbnRyb2xQb2ludChjb250cm9sUG9pbnRzLm5leHQueSwgYXJlYS50b3AsIGFyZWEuYm90dG9tKTtcblx0XHR9XG5cdH0sXG5cblx0c2V0SG92ZXJTdHlsZTogZnVuY3Rpb24ocG9pbnQpIHtcblx0XHR2YXIgbW9kZWwgPSBwb2ludC5fbW9kZWw7XG5cdFx0dmFyIG9wdGlvbnMgPSBwb2ludC5fb3B0aW9ucztcblx0XHR2YXIgZ2V0SG92ZXJDb2xvciA9IGhlbHBlcnMkMS5nZXRIb3ZlckNvbG9yO1xuXG5cdFx0cG9pbnQuJHByZXZpb3VzU3R5bGUgPSB7XG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcblx0XHRcdGJvcmRlckNvbG9yOiBtb2RlbC5ib3JkZXJDb2xvcixcblx0XHRcdGJvcmRlcldpZHRoOiBtb2RlbC5ib3JkZXJXaWR0aCxcblx0XHRcdHJhZGl1czogbW9kZWwucmFkaXVzXG5cdFx0fTtcblxuXHRcdG1vZGVsLmJhY2tncm91bmRDb2xvciA9IHZhbHVlT3JEZWZhdWx0JDYob3B0aW9ucy5ob3ZlckJhY2tncm91bmRDb2xvciwgZ2V0SG92ZXJDb2xvcihvcHRpb25zLmJhY2tncm91bmRDb2xvcikpO1xuXHRcdG1vZGVsLmJvcmRlckNvbG9yID0gdmFsdWVPckRlZmF1bHQkNihvcHRpb25zLmhvdmVyQm9yZGVyQ29sb3IsIGdldEhvdmVyQ29sb3Iob3B0aW9ucy5ib3JkZXJDb2xvcikpO1xuXHRcdG1vZGVsLmJvcmRlcldpZHRoID0gdmFsdWVPckRlZmF1bHQkNihvcHRpb25zLmhvdmVyQm9yZGVyV2lkdGgsIG9wdGlvbnMuYm9yZGVyV2lkdGgpO1xuXHRcdG1vZGVsLnJhZGl1cyA9IHZhbHVlT3JEZWZhdWx0JDYob3B0aW9ucy5ob3ZlclJhZGl1cywgb3B0aW9ucy5yYWRpdXMpO1xuXHR9XG59KTtcblxuY29yZV9kZWZhdWx0cy5fc2V0KCdzY2F0dGVyJywge1xuXHRob3Zlcjoge1xuXHRcdG1vZGU6ICdzaW5nbGUnXG5cdH0sXG5cblx0c2NhbGVzOiB7XG5cdFx0eEF4ZXM6IFt7XG5cdFx0XHRpZDogJ3gtYXhpcy0xJywgICAgLy8gbmVlZCBhbiBJRCBzbyBkYXRhc2V0cyBjYW4gcmVmZXJlbmNlIHRoZSBzY2FsZVxuXHRcdFx0dHlwZTogJ2xpbmVhcicsICAgIC8vIHNjYXR0ZXIgc2hvdWxkIG5vdCB1c2UgYSBjYXRlZ29yeSBheGlzXG5cdFx0XHRwb3NpdGlvbjogJ2JvdHRvbSdcblx0XHR9XSxcblx0XHR5QXhlczogW3tcblx0XHRcdGlkOiAneS1heGlzLTEnLFxuXHRcdFx0dHlwZTogJ2xpbmVhcicsXG5cdFx0XHRwb3NpdGlvbjogJ2xlZnQnXG5cdFx0fV1cblx0fSxcblxuXHRzaG93TGluZXM6IGZhbHNlLFxuXG5cdHRvb2x0aXBzOiB7XG5cdFx0Y2FsbGJhY2tzOiB7XG5cdFx0XHR0aXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAnJzsgICAgIC8vIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igc2NhdHRlciBzaW5jZSBkYXRhIGFyZSBmb3JtYXR0ZWQgYXMgYSBwb2ludFxuXHRcdFx0fSxcblx0XHRcdGxhYmVsOiBmdW5jdGlvbihpdGVtKSB7XG5cdFx0XHRcdHJldHVybiAnKCcgKyBpdGVtLnhMYWJlbCArICcsICcgKyBpdGVtLnlMYWJlbCArICcpJztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG4vLyBTY2F0dGVyIGNoYXJ0cyB1c2UgbGluZSBjb250cm9sbGVyc1xudmFyIGNvbnRyb2xsZXJfc2NhdHRlciA9IGNvbnRyb2xsZXJfbGluZTtcblxuLy8gTk9URSBleHBvcnQgYSBtYXAgaW4gd2hpY2ggdGhlIGtleSByZXByZXNlbnRzIHRoZSBjb250cm9sbGVyIHR5cGUsIG5vdFxuLy8gdGhlIGNsYXNzLCBhbmQgc28gbXVzdCBiZSBDYW1lbENhc2UgaW4gb3JkZXIgdG8gYmUgY29ycmVjdGx5IHJldHJpZXZlZFxuLy8gYnkgdGhlIGNvbnRyb2xsZXIgaW4gY29yZS5jb250cm9sbGVyLmpzIChgY29udHJvbGxlcnNbbWV0YS50eXBlXWApLlxuXG52YXIgY29udHJvbGxlcnMgPSB7XG5cdGJhcjogY29udHJvbGxlcl9iYXIsXG5cdGJ1YmJsZTogY29udHJvbGxlcl9idWJibGUsXG5cdGRvdWdobnV0OiBjb250cm9sbGVyX2RvdWdobnV0LFxuXHRob3Jpem9udGFsQmFyOiBjb250cm9sbGVyX2hvcml6b250YWxCYXIsXG5cdGxpbmU6IGNvbnRyb2xsZXJfbGluZSxcblx0cG9sYXJBcmVhOiBjb250cm9sbGVyX3BvbGFyQXJlYSxcblx0cGllOiBjb250cm9sbGVyX3BpZSxcblx0cmFkYXI6IGNvbnRyb2xsZXJfcmFkYXIsXG5cdHNjYXR0ZXI6IGNvbnRyb2xsZXJfc2NhdHRlclxufTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHJlbGF0aXZlIHBvc2l0aW9uIGZvciBhbiBldmVudFxuICogQHBhcmFtIHtFdmVudHxJRXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IHRvIGdldCB0aGUgcG9zaXRpb24gZm9yXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydFxuICogQHJldHVybnMge29iamVjdH0gdGhlIGV2ZW50IHBvc2l0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpIHtcblx0aWYgKGUubmF0aXZlKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IGUueCxcblx0XHRcdHk6IGUueVxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4gaGVscGVycyQxLmdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB0cmF2ZXJzZSBhbGwgb2YgdGhlIHZpc2libGUgZWxlbWVudHMgaW4gdGhlIGNoYXJ0XG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydFxuICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlciAtIHRoZSBjYWxsYmFjayB0byBleGVjdXRlIGZvciBlYWNoIHZpc2libGUgaXRlbVxuICovXG5mdW5jdGlvbiBwYXJzZVZpc2libGVJdGVtcyhjaGFydCwgaGFuZGxlcikge1xuXHR2YXIgZGF0YXNldHMgPSBjaGFydC5kYXRhLmRhdGFzZXRzO1xuXHR2YXIgbWV0YSwgaSwgaiwgaWxlbiwgamxlbjtcblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0aWYgKCFjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG5cdFx0Zm9yIChqID0gMCwgamxlbiA9IG1ldGEuZGF0YS5sZW5ndGg7IGogPCBqbGVuOyArK2opIHtcblx0XHRcdHZhciBlbGVtZW50ID0gbWV0YS5kYXRhW2pdO1xuXHRcdFx0aWYgKCFlbGVtZW50Ll92aWV3LnNraXApIHtcblx0XHRcdFx0aGFuZGxlcihlbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBpdGVtcyB0aGF0IGludGVyc2VjdCB0aGUgZXZlbnQgcG9zaXRpb25cbiAqIEBwYXJhbSB7Q2hhcnRFbGVtZW50W119IGl0ZW1zIC0gZWxlbWVudHMgdG8gZmlsdGVyXG4gKiBAcGFyYW0ge29iamVjdH0gcG9zaXRpb24gLSB0aGUgcG9pbnQgdG8gYmUgbmVhcmVzdCB0b1xuICogQHJldHVybiB7Q2hhcnRFbGVtZW50W119IHRoZSBuZWFyZXN0IGl0ZW1zXG4gKi9cbmZ1bmN0aW9uIGdldEludGVyc2VjdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbikge1xuXHR2YXIgZWxlbWVudHMgPSBbXTtcblxuXHRwYXJzZVZpc2libGVJdGVtcyhjaGFydCwgZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdGlmIChlbGVtZW50LmluUmFuZ2UocG9zaXRpb24ueCwgcG9zaXRpb24ueSkpIHtcblx0XHRcdGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gZWxlbWVudHM7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgaXRlbXMgbmVhcmVzdCB0byB0aGUgZXZlbnQgcG9zaXRpb24gY29uc2lkZXJpbmcgYWxsIHZpc2libGUgaXRlbXMgaW4gdGVoIGNoYXJ0XG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB0byBsb29rIGF0IGVsZW1lbnRzIGZyb21cbiAqIEBwYXJhbSB7b2JqZWN0fSBwb3NpdGlvbiAtIHRoZSBwb2ludCB0byBiZSBuZWFyZXN0IHRvXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGludGVyc2VjdCAtIGlmIHRydWUsIG9ubHkgY29uc2lkZXIgaXRlbXMgdGhhdCBpbnRlcnNlY3QgdGhlIHBvc2l0aW9uXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBkaXN0YW5jZU1ldHJpYyAtIGZ1bmN0aW9uIHRvIHByb3ZpZGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gcG9pbnRzXG4gKiBAcmV0dXJuIHtDaGFydEVsZW1lbnRbXX0gdGhlIG5lYXJlc3QgaXRlbXNcbiAqL1xuZnVuY3Rpb24gZ2V0TmVhcmVzdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgaW50ZXJzZWN0LCBkaXN0YW5jZU1ldHJpYykge1xuXHR2YXIgbWluRGlzdGFuY2UgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cdHZhciBuZWFyZXN0SXRlbXMgPSBbXTtcblxuXHRwYXJzZVZpc2libGVJdGVtcyhjaGFydCwgZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdGlmIChpbnRlcnNlY3QgJiYgIWVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55KSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjZW50ZXIgPSBlbGVtZW50LmdldENlbnRlclBvaW50KCk7XG5cdFx0dmFyIGRpc3RhbmNlID0gZGlzdGFuY2VNZXRyaWMocG9zaXRpb24sIGNlbnRlcik7XG5cdFx0aWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcblx0XHRcdG5lYXJlc3RJdGVtcyA9IFtlbGVtZW50XTtcblx0XHRcdG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG5cdFx0fSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gbWluRGlzdGFuY2UpIHtcblx0XHRcdC8vIENhbiBoYXZlIG11bHRpcGxlIGl0ZW1zIGF0IHRoZSBzYW1lIGRpc3RhbmNlIGluIHdoaWNoIGNhc2Ugd2Ugc29ydCBieSBzaXplXG5cdFx0XHRuZWFyZXN0SXRlbXMucHVzaChlbGVtZW50KTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBuZWFyZXN0SXRlbXM7XG59XG5cbi8qKlxuICogR2V0IGEgZGlzdGFuY2UgbWV0cmljIGZ1bmN0aW9uIGZvciB0d28gcG9pbnRzIGJhc2VkIG9uIHRoZVxuICogYXhpcyBtb2RlIHNldHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBheGlzIC0gdGhlIGF4aXMgbW9kZS4geHx5fHh5XG4gKi9cbmZ1bmN0aW9uIGdldERpc3RhbmNlTWV0cmljRm9yQXhpcyhheGlzKSB7XG5cdHZhciB1c2VYID0gYXhpcy5pbmRleE9mKCd4JykgIT09IC0xO1xuXHR2YXIgdXNlWSA9IGF4aXMuaW5kZXhPZigneScpICE9PSAtMTtcblxuXHRyZXR1cm4gZnVuY3Rpb24ocHQxLCBwdDIpIHtcblx0XHR2YXIgZGVsdGFYID0gdXNlWCA/IE1hdGguYWJzKHB0MS54IC0gcHQyLngpIDogMDtcblx0XHR2YXIgZGVsdGFZID0gdXNlWSA/IE1hdGguYWJzKHB0MS55IC0gcHQyLnkpIDogMDtcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGRlbHRhWCwgMikgKyBNYXRoLnBvdyhkZWx0YVksIDIpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gaW5kZXhNb2RlKGNoYXJ0LCBlLCBvcHRpb25zKSB7XG5cdHZhciBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuXHQvLyBEZWZhdWx0IGF4aXMgZm9yIGluZGV4IG1vZGUgaXMgJ3gnIHRvIG1hdGNoIG9sZCBiZWhhdmlvdXJcblx0b3B0aW9ucy5heGlzID0gb3B0aW9ucy5heGlzIHx8ICd4Jztcblx0dmFyIGRpc3RhbmNlTWV0cmljID0gZ2V0RGlzdGFuY2VNZXRyaWNGb3JBeGlzKG9wdGlvbnMuYXhpcyk7XG5cdHZhciBpdGVtcyA9IG9wdGlvbnMuaW50ZXJzZWN0ID8gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uKSA6IGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGZhbHNlLCBkaXN0YW5jZU1ldHJpYyk7XG5cdHZhciBlbGVtZW50cyA9IFtdO1xuXG5cdGlmICghaXRlbXMubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0Y2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkpIHtcblx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblx0XHRcdHZhciBlbGVtZW50ID0gbWV0YS5kYXRhW2l0ZW1zWzBdLl9pbmRleF07XG5cblx0XHRcdC8vIGRvbid0IGNvdW50IGl0ZW1zIHRoYXQgYXJlIHNraXBwZWQgKG51bGwgZGF0YSlcblx0XHRcdGlmIChlbGVtZW50ICYmICFlbGVtZW50Ll92aWV3LnNraXApIHtcblx0XHRcdFx0ZWxlbWVudHMucHVzaChlbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElJbnRlcmFjdGlvbk9wdGlvbnNcbiAqL1xuLyoqXG4gKiBJZiB0cnVlLCBvbmx5IGNvbnNpZGVyIGl0ZW1zIHRoYXQgaW50ZXJzZWN0IHRoZSBwb2ludFxuICogQG5hbWUgSUludGVyZmFjZU9wdGlvbnMjYm9vbGVhblxuICogQHR5cGUgQm9vbGVhblxuICovXG5cbi8qKlxuICogQ29udGFpbnMgaW50ZXJhY3Rpb24gcmVsYXRlZCBmdW5jdGlvbnNcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuSW50ZXJhY3Rpb25cbiAqL1xudmFyIGNvcmVfaW50ZXJhY3Rpb24gPSB7XG5cdC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgZGlmZmVyZW50IG1vZGVzXG5cdG1vZGVzOiB7XG5cdFx0c2luZ2xlOiBmdW5jdGlvbihjaGFydCwgZSkge1xuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG5cdFx0XHR2YXIgZWxlbWVudHMgPSBbXTtcblxuXHRcdFx0cGFyc2VWaXNpYmxlSXRlbXMoY2hhcnQsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRcdFx0aWYgKGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55KSkge1xuXHRcdFx0XHRcdGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnRzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGVsZW1lbnRzLnNsaWNlKDAsIDEpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMubGFiZWxcblx0XHQgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNC4wXG5cdFx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0bGFiZWw6IGluZGV4TW9kZSxcblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgaXRlbXMgYXQgdGhlIHNhbWUgaW5kZXguIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBwYXJhbWV0ZXIgaXMgdHJ1ZSwgd2Ugb25seSByZXR1cm4gaXRlbXMgaWYgd2UgaW50ZXJzZWN0IHNvbWV0aGluZ1xuXHRcdCAqIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBtb2RlIGlzIGZhbHNlLCB3ZSBmaW5kIHRoZSBuZWFyZXN0IGl0ZW0gYW5kIHJldHVybiB0aGUgaXRlbXMgYXQgdGhlIHNhbWUgaW5kZXggYXMgdGhhdCBpdGVtXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLmluZGV4XG5cdFx0ICogQHNpbmNlIHYyLjQuMFxuXHRcdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGUgLSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHBhcmFtIHtJSW50ZXJhY3Rpb25PcHRpb25zfSBvcHRpb25zIC0gb3B0aW9ucyB0byB1c2UgZHVyaW5nIGludGVyYWN0aW9uXG5cdFx0ICogQHJldHVybiB7Q2hhcnQuRWxlbWVudFtdfSBBcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSB1bmRlciB0aGUgcG9pbnQuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZFxuXHRcdCAqL1xuXHRcdGluZGV4OiBpbmRleE1vZGUsXG5cblx0XHQvKipcblx0XHQgKiBSZXR1cm5zIGl0ZW1zIGluIHRoZSBzYW1lIGRhdGFzZXQuIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBwYXJhbWV0ZXIgaXMgdHJ1ZSwgd2Ugb25seSByZXR1cm4gaXRlbXMgaWYgd2UgaW50ZXJzZWN0IHNvbWV0aGluZ1xuXHRcdCAqIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBpcyBmYWxzZSwgd2UgZmluZCB0aGUgbmVhcmVzdCBpdGVtIGFuZCByZXR1cm4gdGhlIGl0ZW1zIGluIHRoYXQgZGF0YXNldFxuXHRcdCAqIEBmdW5jdGlvbiBDaGFydC5JbnRlcmFjdGlvbi5tb2Rlcy5kYXRhc2V0XG5cdFx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZSAtIHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcblx0XHQgKiBAcGFyYW0ge0lJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBvcHRpb25zIHRvIHVzZSBkdXJpbmcgaW50ZXJhY3Rpb25cblx0XHQgKiBAcmV0dXJuIHtDaGFydC5FbGVtZW50W119IEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIHRoZSBwb2ludC4gSWYgbm9uZSBhcmUgZm91bmQsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkXG5cdFx0ICovXG5cdFx0ZGF0YXNldDogZnVuY3Rpb24oY2hhcnQsIGUsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuXHRcdFx0b3B0aW9ucy5heGlzID0gb3B0aW9ucy5heGlzIHx8ICd4eSc7XG5cdFx0XHR2YXIgZGlzdGFuY2VNZXRyaWMgPSBnZXREaXN0YW5jZU1ldHJpY0ZvckF4aXMob3B0aW9ucy5heGlzKTtcblx0XHRcdHZhciBpdGVtcyA9IG9wdGlvbnMuaW50ZXJzZWN0ID8gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uKSA6IGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGZhbHNlLCBkaXN0YW5jZU1ldHJpYyk7XG5cblx0XHRcdGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGl0ZW1zID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaXRlbXNbMF0uX2RhdGFzZXRJbmRleCkuZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGl0ZW1zO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMueC1heGlzXG5cdFx0ICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjQuMC4gVXNlIGluZGV4IG1vZGUgYW5kIGludGVyc2VjdCA9PSB0cnVlXG5cdFx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0J3gtYXhpcyc6IGZ1bmN0aW9uKGNoYXJ0LCBlKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhNb2RlKGNoYXJ0LCBlLCB7aW50ZXJzZWN0OiBmYWxzZX0pO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBQb2ludCBtb2RlIHJldHVybnMgYWxsIGVsZW1lbnRzIHRoYXQgaGl0IHRlc3QgYmFzZWQgb24gdGhlIGV2ZW50IHBvc2l0aW9uXG5cdFx0ICogb2YgdGhlIGV2ZW50XG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLmludGVyc2VjdFxuXHRcdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGUgLSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHJldHVybiB7Q2hhcnQuRWxlbWVudFtdfSBBcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSB1bmRlciB0aGUgcG9pbnQuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZFxuXHRcdCAqL1xuXHRcdHBvaW50OiBmdW5jdGlvbihjaGFydCwgZSkge1xuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG5cdFx0XHRyZXR1cm4gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogbmVhcmVzdCBtb2RlIHJldHVybnMgdGhlIGVsZW1lbnQgY2xvc2VzdCB0byB0aGUgcG9pbnRcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMuaW50ZXJzZWN0XG5cdFx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZSAtIHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcblx0XHQgKiBAcGFyYW0ge0lJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBvcHRpb25zIHRvIHVzZVxuXHRcdCAqIEByZXR1cm4ge0NoYXJ0LkVsZW1lbnRbXX0gQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgdGhlIHBvaW50LiBJZiBub25lIGFyZSBmb3VuZCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWRcblx0XHQgKi9cblx0XHRuZWFyZXN0OiBmdW5jdGlvbihjaGFydCwgZSwgb3B0aW9ucykge1xuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG5cdFx0XHRvcHRpb25zLmF4aXMgPSBvcHRpb25zLmF4aXMgfHwgJ3h5Jztcblx0XHRcdHZhciBkaXN0YW5jZU1ldHJpYyA9IGdldERpc3RhbmNlTWV0cmljRm9yQXhpcyhvcHRpb25zLmF4aXMpO1xuXHRcdFx0cmV0dXJuIGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIG9wdGlvbnMuaW50ZXJzZWN0LCBkaXN0YW5jZU1ldHJpYyk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIHggbW9kZSByZXR1cm5zIHRoZSBlbGVtZW50cyB0aGF0IGhpdC10ZXN0IGF0IHRoZSBjdXJyZW50IHggY29vcmRpbmF0ZVxuXHRcdCAqIEBmdW5jdGlvbiBDaGFydC5JbnRlcmFjdGlvbi5tb2Rlcy54XG5cdFx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZSAtIHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcblx0XHQgKiBAcGFyYW0ge0lJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBvcHRpb25zIHRvIHVzZVxuXHRcdCAqIEByZXR1cm4ge0NoYXJ0LkVsZW1lbnRbXX0gQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgdGhlIHBvaW50LiBJZiBub25lIGFyZSBmb3VuZCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWRcblx0XHQgKi9cblx0XHR4OiBmdW5jdGlvbihjaGFydCwgZSwgb3B0aW9ucykge1xuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG5cdFx0XHR2YXIgaXRlbXMgPSBbXTtcblx0XHRcdHZhciBpbnRlcnNlY3RzSXRlbSA9IGZhbHNlO1xuXG5cdFx0XHRwYXJzZVZpc2libGVJdGVtcyhjaGFydCwgZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdFx0XHRpZiAoZWxlbWVudC5pblhSYW5nZShwb3NpdGlvbi54KSkge1xuXHRcdFx0XHRcdGl0ZW1zLnB1c2goZWxlbWVudCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZWxlbWVudC5pblJhbmdlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpKSB7XG5cdFx0XHRcdFx0aW50ZXJzZWN0c0l0ZW0gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gSWYgd2Ugd2FudCB0byB0cmlnZ2VyIG9uIGFuIGludGVyc2VjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhbnkgaXRlbXNcblx0XHRcdC8vIHRoYXQgaW50ZXJzZWN0IHRoZSBwb3NpdGlvbiwgcmV0dXJuIG5vdGhpbmdcblx0XHRcdGlmIChvcHRpb25zLmludGVyc2VjdCAmJiAhaW50ZXJzZWN0c0l0ZW0pIHtcblx0XHRcdFx0aXRlbXMgPSBbXTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBpdGVtcztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogeSBtb2RlIHJldHVybnMgdGhlIGVsZW1lbnRzIHRoYXQgaGl0LXRlc3QgYXQgdGhlIGN1cnJlbnQgeSBjb29yZGluYXRlXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLnlcblx0XHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cblx0XHQgKiBAcGFyYW0ge0V2ZW50fSBlIC0gdGhlIGV2ZW50IHdlIGFyZSBmaW5kIHRoaW5ncyBhdFxuXHRcdCAqIEBwYXJhbSB7SUludGVyYWN0aW9uT3B0aW9uc30gb3B0aW9ucyAtIG9wdGlvbnMgdG8gdXNlXG5cdFx0ICogQHJldHVybiB7Q2hhcnQuRWxlbWVudFtdfSBBcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSB1bmRlciB0aGUgcG9pbnQuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZFxuXHRcdCAqL1xuXHRcdHk6IGZ1bmN0aW9uKGNoYXJ0LCBlLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcblx0XHRcdHZhciBpdGVtcyA9IFtdO1xuXHRcdFx0dmFyIGludGVyc2VjdHNJdGVtID0gZmFsc2U7XG5cblx0XHRcdHBhcnNlVmlzaWJsZUl0ZW1zKGNoYXJ0LCBmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0XHRcdGlmIChlbGVtZW50LmluWVJhbmdlKHBvc2l0aW9uLnkpKSB7XG5cdFx0XHRcdFx0aXRlbXMucHVzaChlbGVtZW50KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChlbGVtZW50LmluUmFuZ2UocG9zaXRpb24ueCwgcG9zaXRpb24ueSkpIHtcblx0XHRcdFx0XHRpbnRlcnNlY3RzSXRlbSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBJZiB3ZSB3YW50IHRvIHRyaWdnZXIgb24gYW4gaW50ZXJzZWN0IGFuZCB3ZSBkb24ndCBoYXZlIGFueSBpdGVtc1xuXHRcdFx0Ly8gdGhhdCBpbnRlcnNlY3QgdGhlIHBvc2l0aW9uLCByZXR1cm4gbm90aGluZ1xuXHRcdFx0aWYgKG9wdGlvbnMuaW50ZXJzZWN0ICYmICFpbnRlcnNlY3RzSXRlbSkge1xuXHRcdFx0XHRpdGVtcyA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGl0ZW1zO1xuXHRcdH1cblx0fVxufTtcblxuZnVuY3Rpb24gZmlsdGVyQnlQb3NpdGlvbihhcnJheSwgcG9zaXRpb24pIHtcblx0cmV0dXJuIGhlbHBlcnMkMS53aGVyZShhcnJheSwgZnVuY3Rpb24odikge1xuXHRcdHJldHVybiB2LnBvc2l0aW9uID09PSBwb3NpdGlvbjtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIHNvcnRCeVdlaWdodChhcnJheSwgcmV2ZXJzZSkge1xuXHRhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHYsIGkpIHtcblx0XHR2Ll90bXBJbmRleF8gPSBpO1xuXHRcdHJldHVybiB2O1xuXHR9KTtcblx0YXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7XG5cdFx0dmFyIHYwID0gcmV2ZXJzZSA/IGIgOiBhO1xuXHRcdHZhciB2MSA9IHJldmVyc2UgPyBhIDogYjtcblx0XHRyZXR1cm4gdjAud2VpZ2h0ID09PSB2MS53ZWlnaHQgP1xuXHRcdFx0djAuX3RtcEluZGV4XyAtIHYxLl90bXBJbmRleF8gOlxuXHRcdFx0djAud2VpZ2h0IC0gdjEud2VpZ2h0O1xuXHR9KTtcblx0YXJyYXkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG5cdFx0ZGVsZXRlIHYuX3RtcEluZGV4Xztcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRNYXhQYWRkaW5nKGJveGVzKSB7XG5cdHZhciB0b3AgPSAwO1xuXHR2YXIgbGVmdCA9IDA7XG5cdHZhciBib3R0b20gPSAwO1xuXHR2YXIgcmlnaHQgPSAwO1xuXHRoZWxwZXJzJDEuZWFjaChib3hlcywgZnVuY3Rpb24oYm94KSB7XG5cdFx0aWYgKGJveC5nZXRQYWRkaW5nKSB7XG5cdFx0XHR2YXIgYm94UGFkZGluZyA9IGJveC5nZXRQYWRkaW5nKCk7XG5cdFx0XHR0b3AgPSBNYXRoLm1heCh0b3AsIGJveFBhZGRpbmcudG9wKTtcblx0XHRcdGxlZnQgPSBNYXRoLm1heChsZWZ0LCBib3hQYWRkaW5nLmxlZnQpO1xuXHRcdFx0Ym90dG9tID0gTWF0aC5tYXgoYm90dG9tLCBib3hQYWRkaW5nLmJvdHRvbSk7XG5cdFx0XHRyaWdodCA9IE1hdGgubWF4KHJpZ2h0LCBib3hQYWRkaW5nLnJpZ2h0KTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdHRvcDogdG9wLFxuXHRcdGxlZnQ6IGxlZnQsXG5cdFx0Ym90dG9tOiBib3R0b20sXG5cdFx0cmlnaHQ6IHJpZ2h0XG5cdH07XG59XG5cbmZ1bmN0aW9uIGFkZFNpemVCeVBvc2l0aW9uKGJveGVzLCBzaXplKSB7XG5cdGhlbHBlcnMkMS5lYWNoKGJveGVzLCBmdW5jdGlvbihib3gpIHtcblx0XHRzaXplW2JveC5wb3NpdGlvbl0gKz0gYm94LmlzSG9yaXpvbnRhbCgpID8gYm94LmhlaWdodCA6IGJveC53aWR0aDtcblx0fSk7XG59XG5cbmNvcmVfZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xuXHRsYXlvdXQ6IHtcblx0XHRwYWRkaW5nOiB7XG5cdFx0XHR0b3A6IDAsXG5cdFx0XHRyaWdodDogMCxcblx0XHRcdGJvdHRvbTogMCxcblx0XHRcdGxlZnQ6IDBcblx0XHR9XG5cdH1cbn0pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgSUxheW91dEl0ZW1cbiAqIEBwcm9wIHtzdHJpbmd9IHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIGluIHRoZSBjaGFydCBsYXlvdXQuIFBvc3NpYmxlIHZhbHVlcyBhcmVcbiAqICdsZWZ0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCBhbmQgJ2NoYXJ0QXJlYSdcbiAqIEBwcm9wIHtudW1iZXJ9IHdlaWdodCAtIFRoZSB3ZWlnaHQgdXNlZCB0byBzb3J0IHRoZSBpdGVtLiBIaWdoZXIgd2VpZ2h0cyBhcmUgZnVydGhlciBhd2F5IGZyb20gdGhlIGNoYXJ0IGFyZWFcbiAqIEBwcm9wIHtib29sZWFufSBmdWxsV2lkdGggLSBpZiB0cnVlLCBhbmQgdGhlIGl0ZW0gaXMgaG9yaXpvbnRhbCwgdGhlbiBwdXNoIHZlcnRpY2FsIGJveGVzIGRvd25cbiAqIEBwcm9wIHtmdW5jdGlvbn0gaXNIb3Jpem9udGFsIC0gcmV0dXJucyB0cnVlIGlmIHRoZSBsYXlvdXQgaXRlbSBpcyBob3Jpem9udGFsIChpZS4gdG9wIG9yIGJvdHRvbSlcbiAqIEBwcm9wIHtmdW5jdGlvbn0gdXBkYXRlIC0gVGFrZXMgdHdvIHBhcmFtZXRlcnM6IHdpZHRoIGFuZCBoZWlnaHQuIFJldHVybnMgc2l6ZSBvZiBpdGVtXG4gKiBAcHJvcCB7ZnVuY3Rpb259IGdldFBhZGRpbmcgLSAgUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBwYWRkaW5nIG9uIHRoZSBlZGdlc1xuICogQHByb3Age251bWJlcn0gd2lkdGggLSBXaWR0aCBvZiBpdGVtLiBNdXN0IGJlIHZhbGlkIGFmdGVyIHVwZGF0ZSgpXG4gKiBAcHJvcCB7bnVtYmVyfSBoZWlnaHQgLSBIZWlnaHQgb2YgaXRlbS4gTXVzdCBiZSB2YWxpZCBhZnRlciB1cGRhdGUoKVxuICogQHByb3Age251bWJlcn0gbGVmdCAtIExlZnQgZWRnZSBvZiB0aGUgaXRlbS4gU2V0IGJ5IGxheW91dCBzeXN0ZW0gYW5kIGNhbm5vdCBiZSB1c2VkIGluIHVwZGF0ZVxuICogQHByb3Age251bWJlcn0gdG9wIC0gVG9wIGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcbiAqIEBwcm9wIHtudW1iZXJ9IHJpZ2h0IC0gUmlnaHQgZWRnZSBvZiB0aGUgaXRlbS4gU2V0IGJ5IGxheW91dCBzeXN0ZW0gYW5kIGNhbm5vdCBiZSB1c2VkIGluIHVwZGF0ZVxuICogQHByb3Age251bWJlcn0gYm90dG9tIC0gQm90dG9tIGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcbiAqL1xuXG4vLyBUaGUgbGF5b3V0IHNlcnZpY2UgaXMgdmVyeSBzZWxmIGV4cGxhbmF0b3J5LiAgSXQncyByZXNwb25zaWJsZSBmb3IgdGhlIGxheW91dCB3aXRoaW4gYSBjaGFydC5cbi8vIFNjYWxlcywgTGVnZW5kcyBhbmQgUGx1Z2lucyBhbGwgcmVseSBvbiB0aGUgbGF5b3V0IHNlcnZpY2UgYW5kIGNhbiBlYXNpbHkgcmVnaXN0ZXIgdG8gYmUgcGxhY2VkIGFueXdoZXJlIHRoZXkgbmVlZFxuLy8gSXQgaXMgdGhpcyBzZXJ2aWNlJ3MgcmVzcG9uc2liaWxpdHkgb2YgY2Fycnlpbmcgb3V0IHRoYXQgbGF5b3V0LlxudmFyIGNvcmVfbGF5b3V0cyA9IHtcblx0ZGVmYXVsdHM6IHt9LFxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlciBhIGJveCB0byBhIGNoYXJ0LlxuXHQgKiBBIGJveCBpcyBzaW1wbHkgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IHRoYXQgcmVxdWlyZXMgbGF5b3V0LiBlZy4gU2NhbGVzLCBMZWdlbmQsIFRpdGxlLlxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB0byB1c2Vcblx0ICogQHBhcmFtIHtJTGF5b3V0SXRlbX0gaXRlbSAtIHRoZSBpdGVtIHRvIGFkZCB0byBiZSBsYXllZCBvdXRcblx0ICovXG5cdGFkZEJveDogZnVuY3Rpb24oY2hhcnQsIGl0ZW0pIHtcblx0XHRpZiAoIWNoYXJ0LmJveGVzKSB7XG5cdFx0XHRjaGFydC5ib3hlcyA9IFtdO1xuXHRcdH1cblxuXHRcdC8vIGluaXRpYWxpemUgaXRlbSB3aXRoIGRlZmF1bHQgdmFsdWVzXG5cdFx0aXRlbS5mdWxsV2lkdGggPSBpdGVtLmZ1bGxXaWR0aCB8fCBmYWxzZTtcblx0XHRpdGVtLnBvc2l0aW9uID0gaXRlbS5wb3NpdGlvbiB8fCAndG9wJztcblx0XHRpdGVtLndlaWdodCA9IGl0ZW0ud2VpZ2h0IHx8IDA7XG5cblx0XHRjaGFydC5ib3hlcy5wdXNoKGl0ZW0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYSBsYXlvdXRJdGVtIGZyb20gYSBjaGFydFxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB0byByZW1vdmUgdGhlIGJveCBmcm9tXG5cdCAqIEBwYXJhbSB7SUxheW91dEl0ZW19IGxheW91dEl0ZW0gLSB0aGUgaXRlbSB0byByZW1vdmUgZnJvbSB0aGUgbGF5b3V0XG5cdCAqL1xuXHRyZW1vdmVCb3g6IGZ1bmN0aW9uKGNoYXJ0LCBsYXlvdXRJdGVtKSB7XG5cdFx0dmFyIGluZGV4ID0gY2hhcnQuYm94ZXMgPyBjaGFydC5ib3hlcy5pbmRleE9mKGxheW91dEl0ZW0pIDogLTE7XG5cdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0Y2hhcnQuYm94ZXMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldHMgKG9yIHVwZGF0ZXMpIG9wdGlvbnMgb24gdGhlIGdpdmVuIGBpdGVtYC5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgaW4gd2hpY2ggdGhlIGl0ZW0gbGl2ZXMgKG9yIHdpbGwgYmUgYWRkZWQgdG8pXG5cdCAqIEBwYXJhbSB7SUxheW91dEl0ZW19IGl0ZW0gLSB0aGUgaXRlbSB0byBjb25maWd1cmUgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uc1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIHRoZSBuZXcgaXRlbSBvcHRpb25zLlxuXHQgKi9cblx0Y29uZmlndXJlOiBmdW5jdGlvbihjaGFydCwgaXRlbSwgb3B0aW9ucykge1xuXHRcdHZhciBwcm9wcyA9IFsnZnVsbFdpZHRoJywgJ3Bvc2l0aW9uJywgJ3dlaWdodCddO1xuXHRcdHZhciBpbGVuID0gcHJvcHMubGVuZ3RoO1xuXHRcdHZhciBpID0gMDtcblx0XHR2YXIgcHJvcDtcblxuXHRcdGZvciAoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRwcm9wID0gcHJvcHNbaV07XG5cdFx0XHRpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuXHRcdFx0XHRpdGVtW3Byb3BdID0gb3B0aW9uc1twcm9wXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZpdHMgYm94ZXMgb2YgdGhlIGdpdmVuIGNoYXJ0IGludG8gdGhlIGdpdmVuIHNpemUgYnkgaGF2aW5nIGVhY2ggYm94IG1lYXN1cmUgaXRzZWxmXG5cdCAqIHRoZW4gcnVubmluZyBhIGZpdHRpbmcgYWxnb3JpdGhtXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0XG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIHRoZSB3aWR0aCB0byBmaXQgaW50b1xuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gdGhlIGhlaWdodCB0byBmaXQgaW50b1xuXHQgKi9cblx0dXBkYXRlOiBmdW5jdGlvbihjaGFydCwgd2lkdGgsIGhlaWdodCkge1xuXHRcdGlmICghY2hhcnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgbGF5b3V0T3B0aW9ucyA9IGNoYXJ0Lm9wdGlvbnMubGF5b3V0IHx8IHt9O1xuXHRcdHZhciBwYWRkaW5nID0gaGVscGVycyQxLm9wdGlvbnMudG9QYWRkaW5nKGxheW91dE9wdGlvbnMucGFkZGluZyk7XG5cdFx0dmFyIGxlZnRQYWRkaW5nID0gcGFkZGluZy5sZWZ0O1xuXHRcdHZhciByaWdodFBhZGRpbmcgPSBwYWRkaW5nLnJpZ2h0O1xuXHRcdHZhciB0b3BQYWRkaW5nID0gcGFkZGluZy50b3A7XG5cdFx0dmFyIGJvdHRvbVBhZGRpbmcgPSBwYWRkaW5nLmJvdHRvbTtcblxuXHRcdHZhciBsZWZ0Qm94ZXMgPSBmaWx0ZXJCeVBvc2l0aW9uKGNoYXJ0LmJveGVzLCAnbGVmdCcpO1xuXHRcdHZhciByaWdodEJveGVzID0gZmlsdGVyQnlQb3NpdGlvbihjaGFydC5ib3hlcywgJ3JpZ2h0Jyk7XG5cdFx0dmFyIHRvcEJveGVzID0gZmlsdGVyQnlQb3NpdGlvbihjaGFydC5ib3hlcywgJ3RvcCcpO1xuXHRcdHZhciBib3R0b21Cb3hlcyA9IGZpbHRlckJ5UG9zaXRpb24oY2hhcnQuYm94ZXMsICdib3R0b20nKTtcblx0XHR2YXIgY2hhcnRBcmVhQm94ZXMgPSBmaWx0ZXJCeVBvc2l0aW9uKGNoYXJ0LmJveGVzLCAnY2hhcnRBcmVhJyk7XG5cblx0XHQvLyBTb3J0IGJveGVzIGJ5IHdlaWdodC4gQSBoaWdoZXIgd2VpZ2h0IGlzIGZ1cnRoZXIgYXdheSBmcm9tIHRoZSBjaGFydCBhcmVhXG5cdFx0c29ydEJ5V2VpZ2h0KGxlZnRCb3hlcywgdHJ1ZSk7XG5cdFx0c29ydEJ5V2VpZ2h0KHJpZ2h0Qm94ZXMsIGZhbHNlKTtcblx0XHRzb3J0QnlXZWlnaHQodG9wQm94ZXMsIHRydWUpO1xuXHRcdHNvcnRCeVdlaWdodChib3R0b21Cb3hlcywgZmFsc2UpO1xuXG5cdFx0dmFyIHZlcnRpY2FsQm94ZXMgPSBsZWZ0Qm94ZXMuY29uY2F0KHJpZ2h0Qm94ZXMpO1xuXHRcdHZhciBob3Jpem9udGFsQm94ZXMgPSB0b3BCb3hlcy5jb25jYXQoYm90dG9tQm94ZXMpO1xuXHRcdHZhciBvdXRlckJveGVzID0gdmVydGljYWxCb3hlcy5jb25jYXQoaG9yaXpvbnRhbEJveGVzKTtcblxuXHRcdC8vIEVzc2VudGlhbGx5IHdlIG5vdyBoYXZlIGFueSBudW1iZXIgb2YgYm94ZXMgb24gZWFjaCBvZiB0aGUgNCBzaWRlcy5cblx0XHQvLyBPdXIgY2FudmFzIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZy5cblx0XHQvLyBUaGUgYXJlYXMgTDEgYW5kIEwyIGFyZSB0aGUgbGVmdCBheGVzLiBSMSBpcyB0aGUgcmlnaHQgYXhpcywgVDEgaXMgdGhlIHRvcCBheGlzIGFuZFxuXHRcdC8vIEIxIGlzIHRoZSBib3R0b20gYXhpc1xuXHRcdC8vIFRoZXJlIGFyZSBhbHNvIDQgcXVhZHJhbnQtbGlrZSBsb2NhdGlvbnMgKGxlZnQgdG8gcmlnaHQgaW5zdGVhZCBvZiBjbG9ja3dpc2UpIHJlc2VydmVkIGZvciBjaGFydCBvdmVybGF5c1xuXHRcdC8vIFRoZXNlIGxvY2F0aW9ucyBhcmUgc2luZ2xlLWJveCBsb2NhdGlvbnMgb25seSwgd2hlbiB0cnlpbmcgdG8gcmVnaXN0ZXIgYSBjaGFydEFyZWEgbG9jYXRpb24gdGhhdCBpcyBhbHJlYWR5IHRha2VuLFxuXHRcdC8vIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuXHRcdC8vXG5cdFx0Ly8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG5cdFx0Ly8gfCAgICAgICAgICAgICAgICAgIFQxIChGdWxsIFdpZHRoKSAgICAgICAgICAgICAgICAgICB8XG5cdFx0Ly8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG5cdFx0Ly8gfCAgICB8ICAgIHwgICAgICAgICAgICAgICAgIFQyICAgICAgICAgICAgICAgICAgfCAgICB8XG5cdFx0Ly8gfCAgICB8LS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS18XG5cdFx0Ly8gfCAgICB8ICAgIHwgQzEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQzIgfCAgICB8XG5cdFx0Ly8gfCAgICB8ICAgIHwtLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tfCAgICB8XG5cdFx0Ly8gfCAgICB8ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8XG5cdFx0Ly8gfCBMMSB8IEwyIHwgICAgICAgICAgIENoYXJ0QXJlYSAoQzApICAgICAgICAgICAgfCBSMSB8XG5cdFx0Ly8gfCAgICB8ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8XG5cdFx0Ly8gfCAgICB8ICAgIHwtLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tfCAgICB8XG5cdFx0Ly8gfCAgICB8ICAgIHwgQzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQzQgfCAgICB8XG5cdFx0Ly8gfCAgICB8LS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS18XG5cdFx0Ly8gfCAgICB8ICAgIHwgICAgICAgICAgICAgICAgIEIxICAgICAgICAgICAgICAgICAgfCAgICB8XG5cdFx0Ly8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG5cdFx0Ly8gfCAgICAgICAgICAgICAgICAgIEIyIChGdWxsIFdpZHRoKSAgICAgICAgICAgICAgICAgICB8XG5cdFx0Ly8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG5cdFx0Ly9cblx0XHQvLyBXaGF0IHdlIGRvIHRvIGZpbmQgdGhlIGJlc3Qgc2l6aW5nLCB3ZSBkbyB0aGUgZm9sbG93aW5nXG5cdFx0Ly8gMS4gRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGNoYXJ0IGFyZWEuXG5cdFx0Ly8gMi4gU3BsaXQgdGhlIHJlbWFpbmluZyB3aWR0aCBlcXVhbGx5IGJldHdlZW4gZWFjaCB2ZXJ0aWNhbCBheGlzXG5cdFx0Ly8gMy4gU3BsaXQgdGhlIHJlbWFpbmluZyBoZWlnaHQgZXF1YWxseSBiZXR3ZWVuIGVhY2ggaG9yaXpvbnRhbCBheGlzXG5cdFx0Ly8gNC4gR2l2ZSBlYWNoIGxheW91dCB0aGUgbWF4aW11bSBzaXplIGl0IGNhbiBiZS4gVGhlIGxheW91dCB3aWxsIHJldHVybiBpdCdzIG1pbmltdW0gc2l6ZVxuXHRcdC8vIDUuIEFkanVzdCB0aGUgc2l6ZXMgb2YgZWFjaCBheGlzIGJhc2VkIG9uIGl0J3MgbWluaW11bSByZXBvcnRlZCBzaXplLlxuXHRcdC8vIDYuIFJlZml0IGVhY2ggYXhpc1xuXHRcdC8vIDcuIFBvc2l0aW9uIGVhY2ggYXhpcyBpbiB0aGUgZmluYWwgbG9jYXRpb25cblx0XHQvLyA4LiBUZWxsIHRoZSBjaGFydCB0aGUgZmluYWwgbG9jYXRpb24gb2YgdGhlIGNoYXJ0IGFyZWFcblx0XHQvLyA5LiBUZWxsIGFueSBheGVzIHRoYXQgb3ZlcmxheSB0aGUgY2hhcnQgYXJlYSB0aGUgcG9zaXRpb25zIG9mIHRoZSBjaGFydCBhcmVhXG5cblx0XHQvLyBTdGVwIDFcblx0XHR2YXIgY2hhcnRXaWR0aCA9IHdpZHRoIC0gbGVmdFBhZGRpbmcgLSByaWdodFBhZGRpbmc7XG5cdFx0dmFyIGNoYXJ0SGVpZ2h0ID0gaGVpZ2h0IC0gdG9wUGFkZGluZyAtIGJvdHRvbVBhZGRpbmc7XG5cdFx0dmFyIGNoYXJ0QXJlYVdpZHRoID0gY2hhcnRXaWR0aCAvIDI7IC8vIG1pbiA1MCVcblxuXHRcdC8vIFN0ZXAgMlxuXHRcdHZhciB2ZXJ0aWNhbEJveFdpZHRoID0gKHdpZHRoIC0gY2hhcnRBcmVhV2lkdGgpIC8gdmVydGljYWxCb3hlcy5sZW5ndGg7XG5cblx0XHQvLyBTdGVwIDNcblx0XHQvLyBUT0RPIHJlLWxpbWl0IGhvcml6b250YWwgYXhpcyBoZWlnaHQgKHRoaXMgbGltaXQgaGFzIGFmZmVjdGVkIG9ubHkgcGFkZGluZyBjYWxjdWxhdGlvbiBzaW5jZSBQUiAxODM3KVxuXHRcdC8vIHZhciBob3Jpem9udGFsQm94SGVpZ2h0ID0gKGhlaWdodCAtIGNoYXJ0QXJlYUhlaWdodCkgLyBob3Jpem9udGFsQm94ZXMubGVuZ3RoO1xuXG5cdFx0Ly8gU3RlcCA0XG5cdFx0dmFyIG1heENoYXJ0QXJlYVdpZHRoID0gY2hhcnRXaWR0aDtcblx0XHR2YXIgbWF4Q2hhcnRBcmVhSGVpZ2h0ID0gY2hhcnRIZWlnaHQ7XG5cdFx0dmFyIG91dGVyQm94U2l6ZXMgPSB7dG9wOiB0b3BQYWRkaW5nLCBsZWZ0OiBsZWZ0UGFkZGluZywgYm90dG9tOiBib3R0b21QYWRkaW5nLCByaWdodDogcmlnaHRQYWRkaW5nfTtcblx0XHR2YXIgbWluQm94U2l6ZXMgPSBbXTtcblx0XHR2YXIgbWF4UGFkZGluZztcblxuXHRcdGZ1bmN0aW9uIGdldE1pbmltdW1Cb3hTaXplKGJveCkge1xuXHRcdFx0dmFyIG1pblNpemU7XG5cdFx0XHR2YXIgaXNIb3Jpem9udGFsID0gYm94LmlzSG9yaXpvbnRhbCgpO1xuXG5cdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRcdG1pblNpemUgPSBib3gudXBkYXRlKGJveC5mdWxsV2lkdGggPyBjaGFydFdpZHRoIDogbWF4Q2hhcnRBcmVhV2lkdGgsIGNoYXJ0SGVpZ2h0IC8gMik7XG5cdFx0XHRcdG1heENoYXJ0QXJlYUhlaWdodCAtPSBtaW5TaXplLmhlaWdodDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1pblNpemUgPSBib3gudXBkYXRlKHZlcnRpY2FsQm94V2lkdGgsIG1heENoYXJ0QXJlYUhlaWdodCk7XG5cdFx0XHRcdG1heENoYXJ0QXJlYVdpZHRoIC09IG1pblNpemUud2lkdGg7XG5cdFx0XHR9XG5cblx0XHRcdG1pbkJveFNpemVzLnB1c2goe1xuXHRcdFx0XHRob3Jpem9udGFsOiBpc0hvcml6b250YWwsXG5cdFx0XHRcdHdpZHRoOiBtaW5TaXplLndpZHRoLFxuXHRcdFx0XHRib3g6IGJveCxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGhlbHBlcnMkMS5lYWNoKG91dGVyQm94ZXMsIGdldE1pbmltdW1Cb3hTaXplKTtcblxuXHRcdC8vIElmIGEgaG9yaXpvbnRhbCBib3ggaGFzIHBhZGRpbmcsIHdlIG1vdmUgdGhlIGxlZnQgYm94ZXMgb3ZlciB0byBhdm9pZCB1Z2x5IGNoYXJ0cyAoc2VlIGlzc3VlICMyNDc4KVxuXHRcdG1heFBhZGRpbmcgPSBmaW5kTWF4UGFkZGluZyhvdXRlckJveGVzKTtcblxuXHRcdC8vIEF0IHRoaXMgcG9pbnQsIG1heENoYXJ0QXJlYUhlaWdodCBhbmQgbWF4Q2hhcnRBcmVhV2lkdGggYXJlIHRoZSBzaXplIHRoZSBjaGFydCBhcmVhIGNvdWxkXG5cdFx0Ly8gYmUgaWYgdGhlIGF4ZXMgYXJlIGRyYXduIGF0IHRoZWlyIG1pbmltdW0gc2l6ZXMuXG5cdFx0Ly8gU3RlcHMgNSAmIDZcblxuXHRcdC8vIEZ1bmN0aW9uIHRvIGZpdCBhIGJveFxuXHRcdGZ1bmN0aW9uIGZpdEJveChib3gpIHtcblx0XHRcdHZhciBtaW5Cb3hTaXplID0gaGVscGVycyQxLmZpbmROZXh0V2hlcmUobWluQm94U2l6ZXMsIGZ1bmN0aW9uKG1pbkJveCkge1xuXHRcdFx0XHRyZXR1cm4gbWluQm94LmJveCA9PT0gYm94O1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChtaW5Cb3hTaXplKSB7XG5cdFx0XHRcdGlmIChtaW5Cb3hTaXplLmhvcml6b250YWwpIHtcblx0XHRcdFx0XHR2YXIgc2NhbGVNYXJnaW4gPSB7XG5cdFx0XHRcdFx0XHRsZWZ0OiBNYXRoLm1heChvdXRlckJveFNpemVzLmxlZnQsIG1heFBhZGRpbmcubGVmdCksXG5cdFx0XHRcdFx0XHRyaWdodDogTWF0aC5tYXgob3V0ZXJCb3hTaXplcy5yaWdodCwgbWF4UGFkZGluZy5yaWdodCksXG5cdFx0XHRcdFx0XHR0b3A6IDAsXG5cdFx0XHRcdFx0XHRib3R0b206IDBcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgdXNlIG1pbiBzaXplIGhlcmUgYmVjYXVzZSBvZiBsYWJlbCByb3RhdGlvbi4gV2hlbiB0aGUgbGFiZWxzIGFyZSByb3RhdGVkLCB0aGVpciByb3RhdGlvbiBoaWdobHkgZGVwZW5kc1xuXHRcdFx0XHRcdC8vIG9uIHRoZSBtYXJnaW4uIFNvbWV0aW1lcyB0aGV5IG5lZWQgdG8gaW5jcmVhc2UgaW4gc2l6ZSBzbGlnaHRseVxuXHRcdFx0XHRcdGJveC51cGRhdGUoYm94LmZ1bGxXaWR0aCA/IGNoYXJ0V2lkdGggOiBtYXhDaGFydEFyZWFXaWR0aCwgY2hhcnRIZWlnaHQgLyAyLCBzY2FsZU1hcmdpbik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ym94LnVwZGF0ZShtaW5Cb3hTaXplLndpZHRoLCBtYXhDaGFydEFyZWFIZWlnaHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXBkYXRlLCBhbmQgY2FsY3VsYXRlIHRoZSBsZWZ0IGFuZCByaWdodCBtYXJnaW5zIGZvciB0aGUgaG9yaXpvbnRhbCBib3hlc1xuXHRcdGhlbHBlcnMkMS5lYWNoKHZlcnRpY2FsQm94ZXMsIGZpdEJveCk7XG5cdFx0YWRkU2l6ZUJ5UG9zaXRpb24odmVydGljYWxCb3hlcywgb3V0ZXJCb3hTaXplcyk7XG5cblx0XHQvLyBTZXQgdGhlIExlZnQgYW5kIFJpZ2h0IG1hcmdpbnMgZm9yIHRoZSBob3Jpem9udGFsIGJveGVzXG5cdFx0aGVscGVycyQxLmVhY2goaG9yaXpvbnRhbEJveGVzLCBmaXRCb3gpO1xuXHRcdGFkZFNpemVCeVBvc2l0aW9uKGhvcml6b250YWxCb3hlcywgb3V0ZXJCb3hTaXplcyk7XG5cblx0XHRmdW5jdGlvbiBmaW5hbEZpdFZlcnRpY2FsQm94KGJveCkge1xuXHRcdFx0dmFyIG1pbkJveFNpemUgPSBoZWxwZXJzJDEuZmluZE5leHRXaGVyZShtaW5Cb3hTaXplcywgZnVuY3Rpb24obWluU2l6ZSkge1xuXHRcdFx0XHRyZXR1cm4gbWluU2l6ZS5ib3ggPT09IGJveDtcblx0XHRcdH0pO1xuXG5cdFx0XHR2YXIgc2NhbGVNYXJnaW4gPSB7XG5cdFx0XHRcdGxlZnQ6IDAsXG5cdFx0XHRcdHJpZ2h0OiAwLFxuXHRcdFx0XHR0b3A6IG91dGVyQm94U2l6ZXMudG9wLFxuXHRcdFx0XHRib3R0b206IG91dGVyQm94U2l6ZXMuYm90dG9tXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAobWluQm94U2l6ZSkge1xuXHRcdFx0XHRib3gudXBkYXRlKG1pbkJveFNpemUud2lkdGgsIG1heENoYXJ0QXJlYUhlaWdodCwgc2NhbGVNYXJnaW4pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIExldCB0aGUgbGVmdCBsYXlvdXQga25vdyB0aGUgZmluYWwgbWFyZ2luXG5cdFx0aGVscGVycyQxLmVhY2godmVydGljYWxCb3hlcywgZmluYWxGaXRWZXJ0aWNhbEJveCk7XG5cblx0XHQvLyBSZWNhbGN1bGF0ZSBiZWNhdXNlIHRoZSBzaXplIG9mIGVhY2ggbGF5b3V0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzbGlnaHRseSBkdWUgdG8gdGhlIG1hcmdpbnMgKGxhYmVsIHJvdGF0aW9uIGZvciBpbnN0YW5jZSlcblx0XHRvdXRlckJveFNpemVzID0ge3RvcDogdG9wUGFkZGluZywgbGVmdDogbGVmdFBhZGRpbmcsIGJvdHRvbTogYm90dG9tUGFkZGluZywgcmlnaHQ6IHJpZ2h0UGFkZGluZ307XG5cdFx0YWRkU2l6ZUJ5UG9zaXRpb24ob3V0ZXJCb3hlcywgb3V0ZXJCb3hTaXplcyk7XG5cblx0XHQvLyBXZSBtYXkgYmUgYWRkaW5nIHNvbWUgcGFkZGluZyB0byBhY2NvdW50IGZvciByb3RhdGVkIHggYXhpcyBsYWJlbHNcblx0XHR2YXIgbGVmdFBhZGRpbmdBZGRpdGlvbiA9IE1hdGgubWF4KG1heFBhZGRpbmcubGVmdCAtIG91dGVyQm94U2l6ZXMubGVmdCwgMCk7XG5cdFx0b3V0ZXJCb3hTaXplcy5sZWZ0ICs9IGxlZnRQYWRkaW5nQWRkaXRpb247XG5cdFx0b3V0ZXJCb3hTaXplcy5yaWdodCArPSBNYXRoLm1heChtYXhQYWRkaW5nLnJpZ2h0IC0gb3V0ZXJCb3hTaXplcy5yaWdodCwgMCk7XG5cblx0XHR2YXIgdG9wUGFkZGluZ0FkZGl0aW9uID0gTWF0aC5tYXgobWF4UGFkZGluZy50b3AgLSBvdXRlckJveFNpemVzLnRvcCwgMCk7XG5cdFx0b3V0ZXJCb3hTaXplcy50b3AgKz0gdG9wUGFkZGluZ0FkZGl0aW9uO1xuXHRcdG91dGVyQm94U2l6ZXMuYm90dG9tICs9IE1hdGgubWF4KG1heFBhZGRpbmcuYm90dG9tIC0gb3V0ZXJCb3hTaXplcy5ib3R0b20sIDApO1xuXG5cdFx0Ly8gRmlndXJlIG91dCBpZiBvdXIgY2hhcnQgYXJlYSBjaGFuZ2VkLiBUaGlzIHdvdWxkIG9jY3VyIGlmIHRoZSBkYXRhc2V0IGxheW91dCBsYWJlbCByb3RhdGlvblxuXHRcdC8vIGNoYW5nZWQgZHVlIHRvIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgbWFyZ2lucyBpbiBzdGVwIDYuIFNpbmNlIHdlIGNhbiBvbmx5IGdldCBiaWdnZXIsIHRoaXMgaXMgc2FmZSB0byBkb1xuXHRcdC8vIHdpdGhvdXQgY2FsbGluZyBgZml0YCBhZ2FpblxuXHRcdHZhciBuZXdNYXhDaGFydEFyZWFIZWlnaHQgPSBoZWlnaHQgLSBvdXRlckJveFNpemVzLnRvcCAtIG91dGVyQm94U2l6ZXMuYm90dG9tO1xuXHRcdHZhciBuZXdNYXhDaGFydEFyZWFXaWR0aCA9IHdpZHRoIC0gb3V0ZXJCb3hTaXplcy5sZWZ0IC0gb3V0ZXJCb3hTaXplcy5yaWdodDtcblxuXHRcdGlmIChuZXdNYXhDaGFydEFyZWFXaWR0aCAhPT0gbWF4Q2hhcnRBcmVhV2lkdGggfHwgbmV3TWF4Q2hhcnRBcmVhSGVpZ2h0ICE9PSBtYXhDaGFydEFyZWFIZWlnaHQpIHtcblx0XHRcdGhlbHBlcnMkMS5lYWNoKHZlcnRpY2FsQm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0XHRib3guaGVpZ2h0ID0gbmV3TWF4Q2hhcnRBcmVhSGVpZ2h0O1xuXHRcdFx0fSk7XG5cblx0XHRcdGhlbHBlcnMkMS5lYWNoKGhvcml6b250YWxCb3hlcywgZnVuY3Rpb24oYm94KSB7XG5cdFx0XHRcdGlmICghYm94LmZ1bGxXaWR0aCkge1xuXHRcdFx0XHRcdGJveC53aWR0aCA9IG5ld01heENoYXJ0QXJlYVdpZHRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0bWF4Q2hhcnRBcmVhSGVpZ2h0ID0gbmV3TWF4Q2hhcnRBcmVhSGVpZ2h0O1xuXHRcdFx0bWF4Q2hhcnRBcmVhV2lkdGggPSBuZXdNYXhDaGFydEFyZWFXaWR0aDtcblx0XHR9XG5cblx0XHQvLyBTdGVwIDcgLSBQb3NpdGlvbiB0aGUgYm94ZXNcblx0XHR2YXIgbGVmdCA9IGxlZnRQYWRkaW5nICsgbGVmdFBhZGRpbmdBZGRpdGlvbjtcblx0XHR2YXIgdG9wID0gdG9wUGFkZGluZyArIHRvcFBhZGRpbmdBZGRpdGlvbjtcblxuXHRcdGZ1bmN0aW9uIHBsYWNlQm94KGJveCkge1xuXHRcdFx0aWYgKGJveC5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0XHRib3gubGVmdCA9IGJveC5mdWxsV2lkdGggPyBsZWZ0UGFkZGluZyA6IG91dGVyQm94U2l6ZXMubGVmdDtcblx0XHRcdFx0Ym94LnJpZ2h0ID0gYm94LmZ1bGxXaWR0aCA/IHdpZHRoIC0gcmlnaHRQYWRkaW5nIDogb3V0ZXJCb3hTaXplcy5sZWZ0ICsgbWF4Q2hhcnRBcmVhV2lkdGg7XG5cdFx0XHRcdGJveC50b3AgPSB0b3A7XG5cdFx0XHRcdGJveC5ib3R0b20gPSB0b3AgKyBib3guaGVpZ2h0O1xuXG5cdFx0XHRcdC8vIE1vdmUgdG8gbmV4dCBwb2ludFxuXHRcdFx0XHR0b3AgPSBib3guYm90dG9tO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGJveC5sZWZ0ID0gbGVmdDtcblx0XHRcdFx0Ym94LnJpZ2h0ID0gbGVmdCArIGJveC53aWR0aDtcblx0XHRcdFx0Ym94LnRvcCA9IG91dGVyQm94U2l6ZXMudG9wO1xuXHRcdFx0XHRib3guYm90dG9tID0gb3V0ZXJCb3hTaXplcy50b3AgKyBtYXhDaGFydEFyZWFIZWlnaHQ7XG5cblx0XHRcdFx0Ly8gTW92ZSB0byBuZXh0IHBvaW50XG5cdFx0XHRcdGxlZnQgPSBib3gucmlnaHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGVscGVycyQxLmVhY2gobGVmdEJveGVzLmNvbmNhdCh0b3BCb3hlcyksIHBsYWNlQm94KTtcblxuXHRcdC8vIEFjY291bnQgZm9yIGNoYXJ0IHdpZHRoIGFuZCBoZWlnaHRcblx0XHRsZWZ0ICs9IG1heENoYXJ0QXJlYVdpZHRoO1xuXHRcdHRvcCArPSBtYXhDaGFydEFyZWFIZWlnaHQ7XG5cblx0XHRoZWxwZXJzJDEuZWFjaChyaWdodEJveGVzLCBwbGFjZUJveCk7XG5cdFx0aGVscGVycyQxLmVhY2goYm90dG9tQm94ZXMsIHBsYWNlQm94KTtcblxuXHRcdC8vIFN0ZXAgOFxuXHRcdGNoYXJ0LmNoYXJ0QXJlYSA9IHtcblx0XHRcdGxlZnQ6IG91dGVyQm94U2l6ZXMubGVmdCxcblx0XHRcdHRvcDogb3V0ZXJCb3hTaXplcy50b3AsXG5cdFx0XHRyaWdodDogb3V0ZXJCb3hTaXplcy5sZWZ0ICsgbWF4Q2hhcnRBcmVhV2lkdGgsXG5cdFx0XHRib3R0b206IG91dGVyQm94U2l6ZXMudG9wICsgbWF4Q2hhcnRBcmVhSGVpZ2h0XG5cdFx0fTtcblxuXHRcdC8vIFN0ZXAgOVxuXHRcdGhlbHBlcnMkMS5lYWNoKGNoYXJ0QXJlYUJveGVzLCBmdW5jdGlvbihib3gpIHtcblx0XHRcdGJveC5sZWZ0ID0gY2hhcnQuY2hhcnRBcmVhLmxlZnQ7XG5cdFx0XHRib3gudG9wID0gY2hhcnQuY2hhcnRBcmVhLnRvcDtcblx0XHRcdGJveC5yaWdodCA9IGNoYXJ0LmNoYXJ0QXJlYS5yaWdodDtcblx0XHRcdGJveC5ib3R0b20gPSBjaGFydC5jaGFydEFyZWEuYm90dG9tO1xuXG5cdFx0XHRib3gudXBkYXRlKG1heENoYXJ0QXJlYVdpZHRoLCBtYXhDaGFydEFyZWFIZWlnaHQpO1xuXHRcdH0pO1xuXHR9XG59O1xuXG4vKipcbiAqIFBsYXRmb3JtIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIChtaW5pbWFsKS5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvcHVsbC80NTkxI2lzc3VlY29tbWVudC0zMTk1NzU5MzlcbiAqL1xuXG52YXIgcGxhdGZvcm1fYmFzaWMgPSB7XG5cdGFjcXVpcmVDb250ZXh0OiBmdW5jdGlvbihpdGVtKSB7XG5cdFx0aWYgKGl0ZW0gJiYgaXRlbS5jYW52YXMpIHtcblx0XHRcdC8vIFN1cHBvcnQgZm9yIGFueSBvYmplY3QgYXNzb2NpYXRlZCB0byBhIGNhbnZhcyAoaW5jbHVkaW5nIGEgY29udGV4dDJkKVxuXHRcdFx0aXRlbSA9IGl0ZW0uY2FudmFzO1xuXHRcdH1cblxuXHRcdHJldHVybiBpdGVtICYmIGl0ZW0uZ2V0Q29udGV4dCgnMmQnKSB8fCBudWxsO1xuXHR9XG59O1xuXG52YXIgcGxhdGZvcm1fZG9tID0gXCIvKlxcbiAqIERPTSBlbGVtZW50IHJlbmRlcmluZyBkZXRlY3Rpb25cXG4gKiBodHRwczovL2Rhdmlkd2Fsc2gubmFtZS9kZXRlY3Qtbm9kZS1pbnNlcnRpb25cXG4gKi9cXG5Aa2V5ZnJhbWVzIGNoYXJ0anMtcmVuZGVyLWFuaW1hdGlvbiB7XFxuXFx0ZnJvbSB7IG9wYWNpdHk6IDAuOTk7IH1cXG5cXHR0byB7IG9wYWNpdHk6IDE7IH1cXG59XFxuXFxuLmNoYXJ0anMtcmVuZGVyLW1vbml0b3Ige1xcblxcdGFuaW1hdGlvbjogY2hhcnRqcy1yZW5kZXItYW5pbWF0aW9uIDAuMDAxcztcXG59XFxuXFxuLypcXG4gKiBET00gZWxlbWVudCByZXNpemluZyBkZXRlY3Rpb25cXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWFyY2ovY3NzLWVsZW1lbnQtcXVlcmllc1xcbiAqL1xcbi5jaGFydGpzLXNpemUtbW9uaXRvcixcXG4uY2hhcnRqcy1zaXplLW1vbml0b3ItZXhwYW5kLFxcbi5jaGFydGpzLXNpemUtbW9uaXRvci1zaHJpbmsge1xcblxcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG5cXHRkaXJlY3Rpb246IGx0cjtcXG5cXHRsZWZ0OiAwO1xcblxcdHRvcDogMDtcXG5cXHRyaWdodDogMDtcXG5cXHRib3R0b206IDA7XFxuXFx0b3ZlcmZsb3c6IGhpZGRlbjtcXG5cXHRwb2ludGVyLWV2ZW50czogbm9uZTtcXG5cXHR2aXNpYmlsaXR5OiBoaWRkZW47XFxuXFx0ei1pbmRleDogLTE7XFxufVxcblxcbi5jaGFydGpzLXNpemUtbW9uaXRvci1leHBhbmQgPiBkaXYge1xcblxcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG5cXHR3aWR0aDogMTAwMDAwMHB4O1xcblxcdGhlaWdodDogMTAwMDAwMHB4O1xcblxcdGxlZnQ6IDA7XFxuXFx0dG9wOiAwO1xcbn1cXG5cXG4uY2hhcnRqcy1zaXplLW1vbml0b3Itc2hyaW5rID4gZGl2IHtcXG5cXHRwb3NpdGlvbjogYWJzb2x1dGU7XFxuXFx0d2lkdGg6IDIwMCU7XFxuXFx0aGVpZ2h0OiAyMDAlO1xcblxcdGxlZnQ6IDA7XFxuXFx0dG9wOiAwO1xcbn1cXG5cIjtcblxudmFyIHBsYXRmb3JtX2RvbSQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuZGVmYXVsdDogcGxhdGZvcm1fZG9tXG59KTtcblxuZnVuY3Rpb24gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZSAobikge1xuXHRyZXR1cm4gbiAmJiBuLmRlZmF1bHQgfHwgbjtcbn1cblxudmFyIHN0eWxlc2hlZXQgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKHBsYXRmb3JtX2RvbSQxKTtcblxudmFyIEVYUEFORE9fS0VZID0gJyRjaGFydGpzJztcbnZhciBDU1NfUFJFRklYID0gJ2NoYXJ0anMtJztcbnZhciBDU1NfU0laRV9NT05JVE9SID0gQ1NTX1BSRUZJWCArICdzaXplLW1vbml0b3InO1xudmFyIENTU19SRU5ERVJfTU9OSVRPUiA9IENTU19QUkVGSVggKyAncmVuZGVyLW1vbml0b3InO1xudmFyIENTU19SRU5ERVJfQU5JTUFUSU9OID0gQ1NTX1BSRUZJWCArICdyZW5kZXItYW5pbWF0aW9uJztcbnZhciBBTklNQVRJT05fU1RBUlRfRVZFTlRTID0gWydhbmltYXRpb25zdGFydCcsICd3ZWJraXRBbmltYXRpb25TdGFydCddO1xuXG4vKipcbiAqIERPTSBldmVudCB0eXBlcyAtPiBDaGFydC5qcyBldmVudCB0eXBlcy5cbiAqIE5vdGU6IG9ubHkgZXZlbnRzIHdpdGggZGlmZmVyZW50IHR5cGVzIGFyZSBtYXBwZWQuXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50c1xuICovXG52YXIgRVZFTlRfVFlQRVMgPSB7XG5cdHRvdWNoc3RhcnQ6ICdtb3VzZWRvd24nLFxuXHR0b3VjaG1vdmU6ICdtb3VzZW1vdmUnLFxuXHR0b3VjaGVuZDogJ21vdXNldXAnLFxuXHRwb2ludGVyZW50ZXI6ICdtb3VzZWVudGVyJyxcblx0cG9pbnRlcmRvd246ICdtb3VzZWRvd24nLFxuXHRwb2ludGVybW92ZTogJ21vdXNlbW92ZScsXG5cdHBvaW50ZXJ1cDogJ21vdXNldXAnLFxuXHRwb2ludGVybGVhdmU6ICdtb3VzZW91dCcsXG5cdHBvaW50ZXJvdXQ6ICdtb3VzZW91dCdcbn07XG5cbi8qKlxuICogVGhlIFwidXNlZFwiIHNpemUgaXMgdGhlIGZpbmFsIHZhbHVlIG9mIGEgZGltZW5zaW9uIHByb3BlcnR5IGFmdGVyIGFsbCBjYWxjdWxhdGlvbnMgaGF2ZVxuICogYmVlbiBwZXJmb3JtZWQuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGNvbXB1dGVkIHN0eWxlIG9mIGBlbGVtZW50YCBidXQgcmV0dXJucyB1bmRlZmluZWRcbiAqIGlmIHRoZSBjb21wdXRlZCBzdHlsZSBpcyBub3QgZXhwcmVzc2VkIGluIHBpeGVscy4gVGhhdCBjYW4gaGFwcGVuIGluIHNvbWUgY2FzZXMgd2hlcmVcbiAqIGBlbGVtZW50YCBoYXMgYSBzaXplIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgYW5kIHRoaXMgbGFzdCBvbmUgaXMgbm90IHlldCBkaXNwbGF5ZWQsXG4gKiBmb3IgZXhhbXBsZSBiZWNhdXNlIG9mIGBkaXNwbGF5OiBub25lYCBvbiBhIHBhcmVudCBub2RlLlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvdXNlZF92YWx1ZVxuICogQHJldHVybnMge251bWJlcn0gU2l6ZSBpbiBwaXhlbHMgb3IgdW5kZWZpbmVkIGlmIHVua25vd24uXG4gKi9cbmZ1bmN0aW9uIHJlYWRVc2VkU2l6ZShlbGVtZW50LCBwcm9wZXJ0eSkge1xuXHR2YXIgdmFsdWUgPSBoZWxwZXJzJDEuZ2V0U3R5bGUoZWxlbWVudCwgcHJvcGVydHkpO1xuXHR2YXIgbWF0Y2hlcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKC9eKFxcZCspKFxcLlxcZCspP3B4JC8pO1xuXHRyZXR1cm4gbWF0Y2hlcyA/IE51bWJlcihtYXRjaGVzWzFdKSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgY2FudmFzIHN0eWxlIGFuZCByZW5kZXIgc2l6ZSB3aXRob3V0IG1vZGlmeWluZyB0aGUgY2FudmFzIGRpc3BsYXkgc2l6ZSxcbiAqIHNpbmNlIHJlc3BvbnNpdmVuZXNzIGlzIGhhbmRsZWQgYnkgdGhlIGNvbnRyb2xsZXIucmVzaXplKCkgbWV0aG9kLiBUaGUgY29uZmlnIGlzIHVzZWRcbiAqIHRvIGRldGVybWluZSB0aGUgYXNwZWN0IHJhdGlvIHRvIGFwcGx5IGluIGNhc2Ugbm8gZXhwbGljaXQgaGVpZ2h0IGhhcyBiZWVuIHNwZWNpZmllZC5cbiAqL1xuZnVuY3Rpb24gaW5pdENhbnZhcyhjYW52YXMsIGNvbmZpZykge1xuXHR2YXIgc3R5bGUgPSBjYW52YXMuc3R5bGU7XG5cblx0Ly8gTk9URShTQikgY2FudmFzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSAhPT0gY2FudmFzLndpZHRoOiBpbiB0aGUgZmlyc3QgY2FzZSBpdFxuXHQvLyByZXR1cm5zIG51bGwgb3IgJycgaWYgbm8gZXhwbGljaXQgdmFsdWUgaGFzIGJlZW4gc2V0IHRvIHRoZSBjYW52YXMgYXR0cmlidXRlLlxuXHR2YXIgcmVuZGVySGVpZ2h0ID0gY2FudmFzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG5cdHZhciByZW5kZXJXaWR0aCA9IGNhbnZhcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyk7XG5cblx0Ly8gQ2hhcnQuanMgbW9kaWZpZXMgc29tZSBjYW52YXMgdmFsdWVzIHRoYXQgd2Ugd2FudCB0byByZXN0b3JlIG9uIGRlc3Ryb3lcblx0Y2FudmFzW0VYUEFORE9fS0VZXSA9IHtcblx0XHRpbml0aWFsOiB7XG5cdFx0XHRoZWlnaHQ6IHJlbmRlckhlaWdodCxcblx0XHRcdHdpZHRoOiByZW5kZXJXaWR0aCxcblx0XHRcdHN0eWxlOiB7XG5cdFx0XHRcdGRpc3BsYXk6IHN0eWxlLmRpc3BsYXksXG5cdFx0XHRcdGhlaWdodDogc3R5bGUuaGVpZ2h0LFxuXHRcdFx0XHR3aWR0aDogc3R5bGUud2lkdGhcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0Ly8gRm9yY2UgY2FudmFzIHRvIGRpc3BsYXkgYXMgYmxvY2sgdG8gYXZvaWQgZXh0cmEgc3BhY2UgY2F1c2VkIGJ5IGlubGluZVxuXHQvLyBlbGVtZW50cywgd2hpY2ggd291bGQgaW50ZXJmZXJlIHdpdGggdGhlIHJlc3BvbnNpdmUgcmVzaXplIHByb2Nlc3MuXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yNTM4XG5cdHN0eWxlLmRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5IHx8ICdibG9jayc7XG5cblx0aWYgKHJlbmRlcldpZHRoID09PSBudWxsIHx8IHJlbmRlcldpZHRoID09PSAnJykge1xuXHRcdHZhciBkaXNwbGF5V2lkdGggPSByZWFkVXNlZFNpemUoY2FudmFzLCAnd2lkdGgnKTtcblx0XHRpZiAoZGlzcGxheVdpZHRoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNhbnZhcy53aWR0aCA9IGRpc3BsYXlXaWR0aDtcblx0XHR9XG5cdH1cblxuXHRpZiAocmVuZGVySGVpZ2h0ID09PSBudWxsIHx8IHJlbmRlckhlaWdodCA9PT0gJycpIHtcblx0XHRpZiAoY2FudmFzLnN0eWxlLmhlaWdodCA9PT0gJycpIHtcblx0XHRcdC8vIElmIG5vIGV4cGxpY2l0IHJlbmRlciBoZWlnaHQgYW5kIHN0eWxlIGhlaWdodCwgbGV0J3MgYXBwbHkgdGhlIGFzcGVjdCByYXRpbyxcblx0XHRcdC8vIHdoaWNoIG9uZSBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGJ1dCBhbHNvIGJ5IGNoYXJ0cyBhcyBkZWZhdWx0IG9wdGlvblxuXHRcdFx0Ly8gKGkuZS4gb3B0aW9ucy5hc3BlY3RSYXRpbykuIElmIG5vdCBzcGVjaWZpZWQsIHVzZSBjYW52YXMgYXNwZWN0IHJhdGlvIG9mIDIuXG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gY2FudmFzLndpZHRoIC8gKGNvbmZpZy5vcHRpb25zLmFzcGVjdFJhdGlvIHx8IDIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgZGlzcGxheUhlaWdodCA9IHJlYWRVc2VkU2l6ZShjYW52YXMsICdoZWlnaHQnKTtcblx0XHRcdGlmIChkaXNwbGF5V2lkdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjYW52YXMuaGVpZ2h0ID0gZGlzcGxheUhlaWdodDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY2FudmFzO1xufVxuXG4vKipcbiAqIERldGVjdHMgc3VwcG9ydCBmb3Igb3B0aW9ucyBvYmplY3QgYXJndW1lbnQgaW4gYWRkRXZlbnRMaXN0ZW5lci5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI1NhZmVseV9kZXRlY3Rpbmdfb3B0aW9uX3N1cHBvcnRcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBzdXBwb3J0c0V2ZW50TGlzdGVuZXJPcHRpb25zID0gKGZ1bmN0aW9uKCkge1xuXHR2YXIgc3VwcG9ydHMgPSBmYWxzZTtcblx0dHJ5IHtcblx0XHR2YXIgb3B0aW9ucyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2V0dGVyLXJldHVyblxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c3VwcG9ydHMgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlJywgbnVsbCwgb3B0aW9ucyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG5cdH1cblx0cmV0dXJuIHN1cHBvcnRzO1xufSgpKTtcblxuLy8gRGVmYXVsdCBwYXNzaXZlIHRvIHRydWUgYXMgZXhwZWN0ZWQgYnkgQ2hyb21lIGZvciAndG91Y2hzdGFydCcgYW5kICd0b3VjaGVuZCcgZXZlbnRzLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzQyODdcbnZhciBldmVudExpc3RlbmVyT3B0aW9ucyA9IHN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZTtcblxuZnVuY3Rpb24gYWRkTGlzdGVuZXIobm9kZSwgdHlwZSwgbGlzdGVuZXIpIHtcblx0bm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBldmVudExpc3RlbmVyT3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG5vZGUsIHR5cGUsIGxpc3RlbmVyKSB7XG5cdG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lck9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFdmVudCh0eXBlLCBjaGFydCwgeCwgeSwgbmF0aXZlRXZlbnQpIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlLFxuXHRcdGNoYXJ0OiBjaGFydCxcblx0XHRuYXRpdmU6IG5hdGl2ZUV2ZW50IHx8IG51bGwsXG5cdFx0eDogeCAhPT0gdW5kZWZpbmVkID8geCA6IG51bGwsXG5cdFx0eTogeSAhPT0gdW5kZWZpbmVkID8geSA6IG51bGwsXG5cdH07XG59XG5cbmZ1bmN0aW9uIGZyb21OYXRpdmVFdmVudChldmVudCwgY2hhcnQpIHtcblx0dmFyIHR5cGUgPSBFVkVOVF9UWVBFU1tldmVudC50eXBlXSB8fCBldmVudC50eXBlO1xuXHR2YXIgcG9zID0gaGVscGVycyQxLmdldFJlbGF0aXZlUG9zaXRpb24oZXZlbnQsIGNoYXJ0KTtcblx0cmV0dXJuIGNyZWF0ZUV2ZW50KHR5cGUsIGNoYXJ0LCBwb3MueCwgcG9zLnksIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gdGhyb3R0bGVkKGZuLCB0aGlzQXJnKSB7XG5cdHZhciB0aWNraW5nID0gZmFsc2U7XG5cdHZhciBhcmdzID0gW107XG5cblx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXHRcdHRoaXNBcmcgPSB0aGlzQXJnIHx8IHRoaXM7XG5cblx0XHRpZiAoIXRpY2tpbmcpIHtcblx0XHRcdHRpY2tpbmcgPSB0cnVlO1xuXHRcdFx0aGVscGVycyQxLnJlcXVlc3RBbmltRnJhbWUuY2FsbCh3aW5kb3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aWNraW5nID0gZmFsc2U7XG5cdFx0XHRcdGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaXYoY2xzKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRlbC5jbGFzc05hbWUgPSBjbHMgfHwgJyc7XG5cdHJldHVybiBlbDtcbn1cblxuLy8gSW1wbGVtZW50YXRpb24gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21hcmNqL2Nzcy1lbGVtZW50LXF1ZXJpZXNcbmZ1bmN0aW9uIGNyZWF0ZVJlc2l6ZXIoaGFuZGxlcikge1xuXHR2YXIgbWF4U2l6ZSA9IDEwMDAwMDA7XG5cblx0Ly8gTk9URShTQikgRG9uJ3QgdXNlIGlubmVySFRNTCBiZWNhdXNlIGl0IGNvdWxkIGJlIGNvbnNpZGVyZWQgdW5zYWZlLlxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNTkwMlxuXHR2YXIgcmVzaXplciA9IGNyZWF0ZURpdihDU1NfU0laRV9NT05JVE9SKTtcblx0dmFyIGV4cGFuZCA9IGNyZWF0ZURpdihDU1NfU0laRV9NT05JVE9SICsgJy1leHBhbmQnKTtcblx0dmFyIHNocmluayA9IGNyZWF0ZURpdihDU1NfU0laRV9NT05JVE9SICsgJy1zaHJpbmsnKTtcblxuXHRleHBhbmQuYXBwZW5kQ2hpbGQoY3JlYXRlRGl2KCkpO1xuXHRzaHJpbmsuYXBwZW5kQ2hpbGQoY3JlYXRlRGl2KCkpO1xuXG5cdHJlc2l6ZXIuYXBwZW5kQ2hpbGQoZXhwYW5kKTtcblx0cmVzaXplci5hcHBlbmRDaGlsZChzaHJpbmspO1xuXHRyZXNpemVyLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuXHRcdGV4cGFuZC5zY3JvbGxMZWZ0ID0gbWF4U2l6ZTtcblx0XHRleHBhbmQuc2Nyb2xsVG9wID0gbWF4U2l6ZTtcblx0XHRzaHJpbmsuc2Nyb2xsTGVmdCA9IG1heFNpemU7XG5cdFx0c2hyaW5rLnNjcm9sbFRvcCA9IG1heFNpemU7XG5cdH07XG5cblx0dmFyIG9uU2Nyb2xsID0gZnVuY3Rpb24oKSB7XG5cdFx0cmVzaXplci5fcmVzZXQoKTtcblx0XHRoYW5kbGVyKCk7XG5cdH07XG5cblx0YWRkTGlzdGVuZXIoZXhwYW5kLCAnc2Nyb2xsJywgb25TY3JvbGwuYmluZChleHBhbmQsICdleHBhbmQnKSk7XG5cdGFkZExpc3RlbmVyKHNocmluaywgJ3Njcm9sbCcsIG9uU2Nyb2xsLmJpbmQoc2hyaW5rLCAnc2hyaW5rJykpO1xuXG5cdHJldHVybiByZXNpemVyO1xufVxuXG4vLyBodHRwczovL2Rhdmlkd2Fsc2gubmFtZS9kZXRlY3Qtbm9kZS1pbnNlcnRpb25cbmZ1bmN0aW9uIHdhdGNoRm9yUmVuZGVyKG5vZGUsIGhhbmRsZXIpIHtcblx0dmFyIGV4cGFuZG8gPSBub2RlW0VYUEFORE9fS0VZXSB8fCAobm9kZVtFWFBBTkRPX0tFWV0gPSB7fSk7XG5cdHZhciBwcm94eSA9IGV4cGFuZG8ucmVuZGVyUHJveHkgPSBmdW5jdGlvbihlKSB7XG5cdFx0aWYgKGUuYW5pbWF0aW9uTmFtZSA9PT0gQ1NTX1JFTkRFUl9BTklNQVRJT04pIHtcblx0XHRcdGhhbmRsZXIoKTtcblx0XHR9XG5cdH07XG5cblx0aGVscGVycyQxLmVhY2goQU5JTUFUSU9OX1NUQVJUX0VWRU5UUywgZnVuY3Rpb24odHlwZSkge1xuXHRcdGFkZExpc3RlbmVyKG5vZGUsIHR5cGUsIHByb3h5KTtcblx0fSk7XG5cblx0Ly8gIzQ3Mzc6IENocm9tZSBtaWdodCBza2lwIHRoZSBDU1MgYW5pbWF0aW9uIHdoZW4gdGhlIENTU19SRU5ERVJfTU9OSVRPUiBjbGFzc1xuXHQvLyBpcyByZW1vdmVkIHRoZW4gYWRkZWQgYmFjayBpbW1lZGlhdGVseSAoc2FtZSBhbmltYXRpb24gZnJhbWU/KS4gQWNjZXNzaW5nIHRoZVxuXHQvLyBgb2Zmc2V0UGFyZW50YCBwcm9wZXJ0eSB3aWxsIGZvcmNlIGEgcmVmbG93IGFuZCByZS1ldmFsdWF0ZSB0aGUgQ1NTIGFuaW1hdGlvbi5cblx0Ly8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcGF1bGlyaXNoLzVkNTJmYjA4MWIzNTcwYzgxZTNhI2JveC1tZXRyaWNzXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy80NzM3XG5cdGV4cGFuZG8ucmVmbG93ID0gISFub2RlLm9mZnNldFBhcmVudDtcblxuXHRub2RlLmNsYXNzTGlzdC5hZGQoQ1NTX1JFTkRFUl9NT05JVE9SKTtcbn1cblxuZnVuY3Rpb24gdW53YXRjaEZvclJlbmRlcihub2RlKSB7XG5cdHZhciBleHBhbmRvID0gbm9kZVtFWFBBTkRPX0tFWV0gfHwge307XG5cdHZhciBwcm94eSA9IGV4cGFuZG8ucmVuZGVyUHJveHk7XG5cblx0aWYgKHByb3h5KSB7XG5cdFx0aGVscGVycyQxLmVhY2goQU5JTUFUSU9OX1NUQVJUX0VWRU5UUywgZnVuY3Rpb24odHlwZSkge1xuXHRcdFx0cmVtb3ZlTGlzdGVuZXIobm9kZSwgdHlwZSwgcHJveHkpO1xuXHRcdH0pO1xuXG5cdFx0ZGVsZXRlIGV4cGFuZG8ucmVuZGVyUHJveHk7XG5cdH1cblxuXHRub2RlLmNsYXNzTGlzdC5yZW1vdmUoQ1NTX1JFTkRFUl9NT05JVE9SKTtcbn1cblxuZnVuY3Rpb24gYWRkUmVzaXplTGlzdGVuZXIobm9kZSwgbGlzdGVuZXIsIGNoYXJ0KSB7XG5cdHZhciBleHBhbmRvID0gbm9kZVtFWFBBTkRPX0tFWV0gfHwgKG5vZGVbRVhQQU5ET19LRVldID0ge30pO1xuXG5cdC8vIExldCdzIGtlZXAgdHJhY2sgb2YgdGhpcyBhZGRlZCByZXNpemVyIGFuZCB0aHVzIGF2b2lkIERPTSBxdWVyeSB3aGVuIHJlbW92aW5nIGl0LlxuXHR2YXIgcmVzaXplciA9IGV4cGFuZG8ucmVzaXplciA9IGNyZWF0ZVJlc2l6ZXIodGhyb3R0bGVkKGZ1bmN0aW9uKCkge1xuXHRcdGlmIChleHBhbmRvLnJlc2l6ZXIpIHtcblx0XHRcdHZhciBjb250YWluZXIgPSBjaGFydC5vcHRpb25zLm1haW50YWluQXNwZWN0UmF0aW8gJiYgbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0dmFyIHcgPSBjb250YWluZXIgPyBjb250YWluZXIuY2xpZW50V2lkdGggOiAwO1xuXHRcdFx0bGlzdGVuZXIoY3JlYXRlRXZlbnQoJ3Jlc2l6ZScsIGNoYXJ0KSk7XG5cdFx0XHRpZiAoY29udGFpbmVyICYmIGNvbnRhaW5lci5jbGllbnRXaWR0aCA8IHcgJiYgY2hhcnQuY2FudmFzKSB7XG5cdFx0XHRcdC8vIElmIHRoZSBjb250YWluZXIgc2l6ZSBzaHJhbmsgZHVyaW5nIGNoYXJ0IHJlc2l6ZSwgbGV0J3MgYXNzdW1lXG5cdFx0XHRcdC8vIHNjcm9sbGJhciBhcHBlYXJlZC4gU28gd2UgcmVzaXplIGFnYWluIHdpdGggdGhlIHNjcm9sbGJhciB2aXNpYmxlIC1cblx0XHRcdFx0Ly8gZWZmZWN0aXZlbHkgbWFraW5nIGNoYXJ0IHNtYWxsZXIgYW5kIHRoZSBzY3JvbGxiYXIgaGlkZGVuIGFnYWluLlxuXHRcdFx0XHQvLyBCZWNhdXNlIHdlIGFyZSBpbnNpZGUgYHRocm90dGxlZGAsIGFuZCBjdXJyZW50bHkgYHRpY2tpbmdgLCBzY3JvbGxcblx0XHRcdFx0Ly8gZXZlbnRzIGFyZSBpZ25vcmVkIGR1cmluZyB0aGlzIHdob2xlIDIgcmVzaXplIHByb2Nlc3MuXG5cdFx0XHRcdC8vIElmIHdlIGFzc3VtZWQgd3JvbmcgYW5kIHNvbWV0aGluZyBlbHNlIGhhcHBlbmVkLCB3ZSBhcmUgcmVzaXppbmdcblx0XHRcdFx0Ly8gdHdpY2UgaW4gYSBmcmFtZSAocG90ZW50aWFsIHBlcmZvcm1hbmNlIGlzc3VlKVxuXHRcdFx0XHRsaXN0ZW5lcihjcmVhdGVFdmVudCgncmVzaXplJywgY2hhcnQpKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pKTtcblxuXHQvLyBUaGUgcmVzaXplciBuZWVkcyB0byBiZSBhdHRhY2hlZCB0byB0aGUgbm9kZSBwYXJlbnQsIHNvIHdlIGZpcnN0IG5lZWQgdG8gYmVcblx0Ly8gc3VyZSB0aGF0IGBub2RlYCBpcyBhdHRhY2hlZCB0byB0aGUgRE9NIGJlZm9yZSBpbmplY3RpbmcgdGhlIHJlc2l6ZXIgZWxlbWVudC5cblx0d2F0Y2hGb3JSZW5kZXIobm9kZSwgZnVuY3Rpb24oKSB7XG5cdFx0aWYgKGV4cGFuZG8ucmVzaXplcikge1xuXHRcdFx0dmFyIGNvbnRhaW5lciA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdGlmIChjb250YWluZXIgJiYgY29udGFpbmVyICE9PSByZXNpemVyLnBhcmVudE5vZGUpIHtcblx0XHRcdFx0Y29udGFpbmVyLmluc2VydEJlZm9yZShyZXNpemVyLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBjb250YWluZXIgc2l6ZSBtaWdodCBoYXZlIGNoYW5nZWQsIGxldCdzIHJlc2V0IHRoZSByZXNpemVyIHN0YXRlLlxuXHRcdFx0cmVzaXplci5fcmVzZXQoKTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVSZXNpemVMaXN0ZW5lcihub2RlKSB7XG5cdHZhciBleHBhbmRvID0gbm9kZVtFWFBBTkRPX0tFWV0gfHwge307XG5cdHZhciByZXNpemVyID0gZXhwYW5kby5yZXNpemVyO1xuXG5cdGRlbGV0ZSBleHBhbmRvLnJlc2l6ZXI7XG5cdHVud2F0Y2hGb3JSZW5kZXIobm9kZSk7XG5cblx0aWYgKHJlc2l6ZXIgJiYgcmVzaXplci5wYXJlbnROb2RlKSB7XG5cdFx0cmVzaXplci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJlc2l6ZXIpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGluamVjdENTUyhwbGF0Zm9ybSwgY3NzKSB7XG5cdC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8zOTIyMTM5XG5cdHZhciBzdHlsZSA9IHBsYXRmb3JtLl9zdHlsZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuXHRpZiAoIXBsYXRmb3JtLl9zdHlsZSkge1xuXHRcdHBsYXRmb3JtLl9zdHlsZSA9IHN0eWxlO1xuXHRcdGNzcyA9ICcvKiBDaGFydC5qcyAqL1xcbicgKyBjc3M7XG5cdFx0c3R5bGUuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzdHlsZSk7XG5cdH1cblxuXHRzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbn1cblxudmFyIHBsYXRmb3JtX2RvbSQyID0ge1xuXHQvKipcblx0ICogV2hlbiBgdHJ1ZWAsIHByZXZlbnRzIHRoZSBhdXRvbWF0aWMgaW5qZWN0aW9uIG9mIHRoZSBzdHlsZXNoZWV0IHJlcXVpcmVkIHRvXG5cdCAqIGNvcnJlY3RseSBkZXRlY3Qgd2hlbiB0aGUgY2hhcnQgaXMgYWRkZWQgdG8gdGhlIERPTSBhbmQgdGhlbiByZXNpemVkLiBUaGlzXG5cdCAqIHN3aXRjaCBoYXMgYmVlbiBhZGRlZCB0byBhbGxvdyBleHRlcm5hbCBzdHlsZXNoZWV0IChgZGlzdC9DaGFydCgubWluKT8uanNgKVxuXHQgKiB0byBiZSBtYW51YWxseSBpbXBvcnRlZCB0byBtYWtlIHRoaXMgbGlicmFyeSBjb21wYXRpYmxlIHdpdGggYW55IENTUC5cblx0ICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy81MjA4XG5cdCAqL1xuXHRkaXNhYmxlQ1NTSW5qZWN0aW9uOiBmYWxzZSxcblxuXHQvKipcblx0ICogVGhpcyBwcm9wZXJ0eSBob2xkcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gaXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXG5cdCAqIEN1cnJlbnRseSB1c2VkIGJ5IHBsYXRmb3JtLmpzIHRvIHNlbGVjdCB0aGUgcHJvcGVyIGltcGxlbWVudGF0aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2VuYWJsZWQ6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcsXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZW5zdXJlTG9hZGVkOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5fbG9hZGVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fbG9hZGVkID0gdHJ1ZTtcblxuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy81MjA4XG5cdFx0aWYgKCF0aGlzLmRpc2FibGVDU1NJbmplY3Rpb24pIHtcblx0XHRcdGluamVjdENTUyh0aGlzLCBzdHlsZXNoZWV0KTtcblx0XHR9XG5cdH0sXG5cblx0YWNxdWlyZUNvbnRleHQ6IGZ1bmN0aW9uKGl0ZW0sIGNvbmZpZykge1xuXHRcdGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGl0ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpdGVtKTtcblx0XHR9IGVsc2UgaWYgKGl0ZW0ubGVuZ3RoKSB7XG5cdFx0XHQvLyBTdXBwb3J0IGZvciBhcnJheSBiYXNlZCBxdWVyaWVzIChzdWNoIGFzIGpRdWVyeSlcblx0XHRcdGl0ZW0gPSBpdGVtWzBdO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtICYmIGl0ZW0uY2FudmFzKSB7XG5cdFx0XHQvLyBTdXBwb3J0IGZvciBhbnkgb2JqZWN0IGFzc29jaWF0ZWQgdG8gYSBjYW52YXMgKGluY2x1ZGluZyBhIGNvbnRleHQyZClcblx0XHRcdGl0ZW0gPSBpdGVtLmNhbnZhcztcblx0XHR9XG5cblx0XHQvLyBUbyBwcmV2ZW50IGNhbnZhcyBmaW5nZXJwcmludGluZywgc29tZSBhZGQtb25zIHVuZGVmaW5lIHRoZSBnZXRDb250ZXh0XG5cdFx0Ly8gbWV0aG9kLCBmb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL2trYXBzbmVyL0NhbnZhc0Jsb2NrZXJcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjgwN1xuXHRcdHZhciBjb250ZXh0ID0gaXRlbSAmJiBpdGVtLmdldENvbnRleHQgJiYgaXRlbS5nZXRDb250ZXh0KCcyZCcpO1xuXG5cdFx0Ly8gTG9hZCBwbGF0Zm9ybSByZXNvdXJjZXMgb24gZmlyc3QgY2hhcnQgY3JlYXRpb24sIHRvIG1ha2UgcG9zc2libGUgdG8gY2hhbmdlXG5cdFx0Ly8gcGxhdGZvcm0gb3B0aW9ucyBhZnRlciBpbXBvcnRpbmcgdGhlIGxpYnJhcnkgKGUuZy4gYGRpc2FibGVDU1NJbmplY3Rpb25gKS5cblx0XHR0aGlzLl9lbnN1cmVMb2FkZWQoKTtcblxuXHRcdC8vIGBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50L0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRGAgZmFpbHMgd2hlbiB0aGUgaXRlbSBpc1xuXHRcdC8vIGluc2lkZSBhbiBpZnJhbWUgb3Igd2hlbiBydW5uaW5nIGluIGEgcHJvdGVjdGVkIGVudmlyb25tZW50LiBXZSBjb3VsZCBndWVzcyB0aGVcblx0XHQvLyB0eXBlcyBmcm9tIHRoZWlyIHRvU3RyaW5nKCkgdmFsdWUgYnV0IGxldCdzIGtlZXAgdGhpbmdzIGZsZXhpYmxlIGFuZCBhc3N1bWUgaXQnc1xuXHRcdC8vIGEgc3VmZmljaWVudCBjb25kaXRpb24gaWYgdGhlIGl0ZW0gaGFzIGEgY29udGV4dDJEIHdoaWNoIGhhcyBpdGVtIGFzIGBjYW52YXNgLlxuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8zODg3XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzQxMDJcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNDE1MlxuXHRcdGlmIChjb250ZXh0ICYmIGNvbnRleHQuY2FudmFzID09PSBpdGVtKSB7XG5cdFx0XHRpbml0Q2FudmFzKGl0ZW0sIGNvbmZpZyk7XG5cdFx0XHRyZXR1cm4gY29udGV4dDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fSxcblxuXHRyZWxlYXNlQ29udGV4dDogZnVuY3Rpb24oY29udGV4dCkge1xuXHRcdHZhciBjYW52YXMgPSBjb250ZXh0LmNhbnZhcztcblx0XHRpZiAoIWNhbnZhc1tFWFBBTkRPX0tFWV0pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgaW5pdGlhbCA9IGNhbnZhc1tFWFBBTkRPX0tFWV0uaW5pdGlhbDtcblx0XHRbJ2hlaWdodCcsICd3aWR0aCddLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuXHRcdFx0dmFyIHZhbHVlID0gaW5pdGlhbFtwcm9wXTtcblx0XHRcdGlmIChoZWxwZXJzJDEuaXNOdWxsT3JVbmRlZih2YWx1ZSkpIHtcblx0XHRcdFx0Y2FudmFzLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNhbnZhcy5zZXRBdHRyaWJ1dGUocHJvcCwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aGVscGVycyQxLmVhY2goaW5pdGlhbC5zdHlsZSB8fCB7fSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuXHRcdFx0Y2FudmFzLnN0eWxlW2tleV0gPSB2YWx1ZTtcblx0XHR9KTtcblxuXHRcdC8vIFRoZSBjYW52YXMgcmVuZGVyIHNpemUgbWlnaHQgaGF2ZSBiZWVuIGNoYW5nZWQgKGFuZCB0aHVzIHRoZSBzdGF0ZSBzdGFjayBkaXNjYXJkZWQpLFxuXHRcdC8vIHdlIGNhbid0IHVzZSBzYXZlKCkgYW5kIHJlc3RvcmUoKSB0byByZXN0b3JlIHRoZSBpbml0aWFsIHN0YXRlLiBTbyBtYWtlIHN1cmUgdGhhdCBhdFxuXHRcdC8vIGxlYXN0IHRoZSBjYW52YXMgY29udGV4dCBpcyByZXNldCB0byB0aGUgZGVmYXVsdCBzdGF0ZSBieSBzZXR0aW5nIHRoZSBjYW52YXMgd2lkdGguXG5cdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTEvV0QtaHRtbDUtMjAxMTA1MjUvdGhlLWNhbnZhcy1lbGVtZW50Lmh0bWxcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1hc3NpZ25cblx0XHRjYW52YXMud2lkdGggPSBjYW52YXMud2lkdGg7XG5cblx0XHRkZWxldGUgY2FudmFzW0VYUEFORE9fS0VZXTtcblx0fSxcblxuXHRhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHtcblx0XHR2YXIgY2FudmFzID0gY2hhcnQuY2FudmFzO1xuXHRcdGlmICh0eXBlID09PSAncmVzaXplJykge1xuXHRcdFx0Ly8gTm90ZTogdGhlIHJlc2l6ZSBldmVudCBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBicm93c2Vycy5cblx0XHRcdGFkZFJlc2l6ZUxpc3RlbmVyKGNhbnZhcywgbGlzdGVuZXIsIGNoYXJ0KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgZXhwYW5kbyA9IGxpc3RlbmVyW0VYUEFORE9fS0VZXSB8fCAobGlzdGVuZXJbRVhQQU5ET19LRVldID0ge30pO1xuXHRcdHZhciBwcm94aWVzID0gZXhwYW5kby5wcm94aWVzIHx8IChleHBhbmRvLnByb3hpZXMgPSB7fSk7XG5cdFx0dmFyIHByb3h5ID0gcHJveGllc1tjaGFydC5pZCArICdfJyArIHR5cGVdID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdGxpc3RlbmVyKGZyb21OYXRpdmVFdmVudChldmVudCwgY2hhcnQpKTtcblx0XHR9O1xuXG5cdFx0YWRkTGlzdGVuZXIoY2FudmFzLCB0eXBlLCBwcm94eSk7XG5cdH0sXG5cblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oY2hhcnQsIHR5cGUsIGxpc3RlbmVyKSB7XG5cdFx0dmFyIGNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcblx0XHRpZiAodHlwZSA9PT0gJ3Jlc2l6ZScpIHtcblx0XHRcdC8vIE5vdGU6IHRoZSByZXNpemUgZXZlbnQgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgYnJvd3NlcnMuXG5cdFx0XHRyZW1vdmVSZXNpemVMaXN0ZW5lcihjYW52YXMpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBleHBhbmRvID0gbGlzdGVuZXJbRVhQQU5ET19LRVldIHx8IHt9O1xuXHRcdHZhciBwcm94aWVzID0gZXhwYW5kby5wcm94aWVzIHx8IHt9O1xuXHRcdHZhciBwcm94eSA9IHByb3hpZXNbY2hhcnQuaWQgKyAnXycgKyB0eXBlXTtcblx0XHRpZiAoIXByb3h5KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmVtb3ZlTGlzdGVuZXIoY2FudmFzLCB0eXBlLCBwcm94eSk7XG5cdH1cbn07XG5cbi8vIERFUFJFQ0FUSU9OU1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgRXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciBpbnN0ZWFkLlxuICogRXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciBjb21wYXRpYmlsaXR5OiBDaHJvbWUsIE9wZXJhIDcsIFNhZmFyaSwgRkYxLjUrLCBJRTkrXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyXG4gKiBAZnVuY3Rpb24gQ2hhcnQuaGVscGVycy5hZGRFdmVudFxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVycyQxLmFkZEV2ZW50ID0gYWRkTGlzdGVuZXI7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBFdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyIGluc3RlYWQuXG4gKiBFdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyIGNvbXBhdGliaWxpdHk6IENocm9tZSwgT3BlcmEgNywgU2FmYXJpLCBGRjEuNSssIElFOStcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L3JlbW92ZUV2ZW50TGlzdGVuZXJcbiAqIEBmdW5jdGlvbiBDaGFydC5oZWxwZXJzLnJlbW92ZUV2ZW50XG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNy4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5oZWxwZXJzJDEucmVtb3ZlRXZlbnQgPSByZW1vdmVMaXN0ZW5lcjtcblxuLy8gQFRPRE8gTWFrZSBwb3NzaWJsZSB0byBzZWxlY3QgYW5vdGhlciBwbGF0Zm9ybSBhdCBidWlsZCB0aW1lLlxudmFyIGltcGxlbWVudGF0aW9uID0gcGxhdGZvcm1fZG9tJDIuX2VuYWJsZWQgPyBwbGF0Zm9ybV9kb20kMiA6IHBsYXRmb3JtX2Jhc2ljO1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgQ2hhcnQucGxhdGZvcm1cbiAqIEBzZWUgaHR0cHM6Ly9jaGFydGpzLmdpdGJvb2tzLmlvL3Byb3Bvc2Fscy9jb250ZW50L1BsYXRmb3JtLmh0bWxcbiAqIEBzaW5jZSAyLjQuMFxuICovXG52YXIgcGxhdGZvcm0gPSBoZWxwZXJzJDEuZXh0ZW5kKHtcblx0LyoqXG5cdCAqIEBzaW5jZSAyLjcuMFxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7fSxcblxuXHQvKipcblx0ICogQ2FsbGVkIGF0IGNoYXJ0IGNvbnN0cnVjdGlvbiB0aW1lLCByZXR1cm5zIGEgY29udGV4dDJkIGluc3RhbmNlIGltcGxlbWVudGluZ1xuXHQgKiB0aGUgW1czQyBDYW52YXMgMkQgQ29udGV4dCBBUEkgc3RhbmRhcmRde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yZGNvbnRleHQvfS5cblx0ICogQHBhcmFtIHsqfSBpdGVtIC0gVGhlIG5hdGl2ZSBpdGVtIGZyb20gd2hpY2ggdG8gYWNxdWlyZSBjb250ZXh0IChwbGF0Zm9ybSBzcGVjaWZpYylcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBUaGUgY2hhcnQgb3B0aW9uc1xuXHQgKiBAcmV0dXJucyB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjb250ZXh0MmQgaW5zdGFuY2Vcblx0ICovXG5cdGFjcXVpcmVDb250ZXh0OiBmdW5jdGlvbigpIHt9LFxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgYXQgY2hhcnQgZGVzdHJ1Y3Rpb24gdGltZSwgcmVsZWFzZXMgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0XG5cdCAqIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgdGhlIGFjcXVpcmVDb250ZXh0KCkgbWV0aG9kLlxuXHQgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCAtIFRoZSBjb250ZXh0MmQgaW5zdGFuY2Vcblx0ICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIG1ldGhvZCBzdWNjZWVkZWQsIGVsc2UgZmFsc2Vcblx0ICovXG5cdHJlbGVhc2VDb250ZXh0OiBmdW5jdGlvbigpIHt9LFxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBvbiB0aGUgZ2l2ZW4gY2hhcnQuXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gQ2hhcnQgZnJvbSB3aGljaCB0byBsaXN0ZW4gZm9yIGV2ZW50XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlICh7QGxpbmsgSUV2ZW50fSkgdHlwZSB0byBsaXN0ZW4gZm9yXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyIC0gUmVjZWl2ZXMgYSBub3RpZmljYXRpb24gKGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHNcblx0ICogdGhlIHtAbGluayBJRXZlbnR9IGludGVyZmFjZSkgd2hlbiBhbiBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgb2NjdXJzLlxuXHQgKi9cblx0YWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7fSxcblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIGFkZEV2ZW50TGlzdGVuZXIuXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gQ2hhcnQgZnJvbSB3aGljaCB0byByZW1vdmUgdGhlIGxpc3RlbmVyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlICh7QGxpbmsgSUV2ZW50fSkgdHlwZSB0byByZW1vdmVcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGZyb20gdGhlIGV2ZW50IHRhcmdldC5cblx0ICovXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKCkge31cblxufSwgaW1wbGVtZW50YXRpb24pO1xuXG5jb3JlX2RlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0cGx1Z2luczoge31cbn0pO1xuXG4vKipcbiAqIFRoZSBwbHVnaW4gc2VydmljZSBzaW5nbGV0b25cbiAqIEBuYW1lc3BhY2UgQ2hhcnQucGx1Z2luc1xuICogQHNpbmNlIDIuMS4wXG4gKi9cbnZhciBjb3JlX3BsdWdpbnMgPSB7XG5cdC8qKlxuXHQgKiBHbG9iYWxseSByZWdpc3RlcmVkIHBsdWdpbnMuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcGx1Z2luczogW10sXG5cblx0LyoqXG5cdCAqIFRoaXMgaWRlbnRpZmllciBpcyB1c2VkIHRvIGludmFsaWRhdGUgdGhlIGRlc2NyaXB0b3JzIGNhY2hlIGF0dGFjaGVkIHRvIGVhY2ggY2hhcnRcblx0ICogd2hlbiBhIGdsb2JhbCBwbHVnaW4gaXMgcmVnaXN0ZXJlZCBvciB1bnJlZ2lzdGVyZWQuIEluIHRoaXMgY2FzZSwgdGhlIGNhY2hlIElEIGlzXG5cdCAqIGluY3JlbWVudGVkIGFuZCBkZXNjcmlwdG9ycyBhcmUgcmVnZW5lcmF0ZWQgZHVyaW5nIGZvbGxvd2luZyBBUEkgY2FsbHMuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfY2FjaGVJZDogMCxcblxuXHQvKipcblx0ICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBwbHVnaW4ocykgaWYgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC5cblx0ICogQHBhcmFtIHtJUGx1Z2luW118SVBsdWdpbn0gcGx1Z2lucyBwbHVnaW4gaW5zdGFuY2UocykuXG5cdCAqL1xuXHRyZWdpc3RlcjogZnVuY3Rpb24ocGx1Z2lucykge1xuXHRcdHZhciBwID0gdGhpcy5fcGx1Z2lucztcblx0XHQoW10pLmNvbmNhdChwbHVnaW5zKS5mb3JFYWNoKGZ1bmN0aW9uKHBsdWdpbikge1xuXHRcdFx0aWYgKHAuaW5kZXhPZihwbHVnaW4pID09PSAtMSkge1xuXHRcdFx0XHRwLnB1c2gocGx1Z2luKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuX2NhY2hlSWQrKztcblx0fSxcblxuXHQvKipcblx0ICogVW5yZWdpc3RlcnMgdGhlIGdpdmVuIHBsdWdpbihzKSBvbmx5IGlmIHJlZ2lzdGVyZWQuXG5cdCAqIEBwYXJhbSB7SVBsdWdpbltdfElQbHVnaW59IHBsdWdpbnMgcGx1Z2luIGluc3RhbmNlKHMpLlxuXHQgKi9cblx0dW5yZWdpc3RlcjogZnVuY3Rpb24ocGx1Z2lucykge1xuXHRcdHZhciBwID0gdGhpcy5fcGx1Z2lucztcblx0XHQoW10pLmNvbmNhdChwbHVnaW5zKS5mb3JFYWNoKGZ1bmN0aW9uKHBsdWdpbikge1xuXHRcdFx0dmFyIGlkeCA9IHAuaW5kZXhPZihwbHVnaW4pO1xuXHRcdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdFx0cC5zcGxpY2UoaWR4LCAxKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuX2NhY2hlSWQrKztcblx0fSxcblxuXHQvKipcblx0ICogUmVtb3ZlIGFsbCByZWdpc3RlcmVkIHBsdWdpbnMuXG5cdCAqIEBzaW5jZSAyLjEuNVxuXHQgKi9cblx0Y2xlYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuX3BsdWdpbnMgPSBbXTtcblx0XHR0aGlzLl9jYWNoZUlkKys7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIHBsdWdpbnM/XG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqIEBzaW5jZSAyLjEuNVxuXHQgKi9cblx0Y291bnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLl9wbHVnaW5zLmxlbmd0aDtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgcmVnaXN0ZXJlZCBwbHVnaW4gaW5zdGFuY2VzLlxuXHQgKiBAcmV0dXJucyB7SVBsdWdpbltdfSBhcnJheSBvZiBwbHVnaW4gb2JqZWN0cy5cblx0ICogQHNpbmNlIDIuMS41XG5cdCAqL1xuXHRnZXRBbGw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLl9wbHVnaW5zO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxscyBlbmFibGVkIHBsdWdpbnMgZm9yIGBjaGFydGAgb24gdGhlIHNwZWNpZmllZCBob29rIGFuZCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuXHQgKiBUaGlzIG1ldGhvZCBpbW1lZGlhdGVseSByZXR1cm5zIGFzIHNvb24gYXMgYSBwbHVnaW4gZXhwbGljaXRseSByZXR1cm5zIGZhbHNlLiBUaGVcblx0ICogcmV0dXJuZWQgdmFsdWUgY2FuIGJlIHVzZWQsIGZvciBpbnN0YW5jZSwgdG8gaW50ZXJydXB0IHRoZSBjdXJyZW50IGFjdGlvbi5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UgZm9yIHdoaWNoIHBsdWdpbnMgc2hvdWxkIGJlIGNhbGxlZC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGhvb2sgLSBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luIG1ldGhvZCB0byBjYWxsIChlLmcuICdiZWZvcmVVcGRhdGUnKS5cblx0ICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdIC0gRXh0cmEgYXJndW1lbnRzIHRvIGFwcGx5IHRvIHRoZSBob29rIGNhbGwuXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBmYWxzZSBpZiBhbnkgb2YgdGhlIHBsdWdpbnMgcmV0dXJuIGZhbHNlLCBlbHNlIHJldHVybnMgdHJ1ZS5cblx0ICovXG5cdG5vdGlmeTogZnVuY3Rpb24oY2hhcnQsIGhvb2ssIGFyZ3MpIHtcblx0XHR2YXIgZGVzY3JpcHRvcnMgPSB0aGlzLmRlc2NyaXB0b3JzKGNoYXJ0KTtcblx0XHR2YXIgaWxlbiA9IGRlc2NyaXB0b3JzLmxlbmd0aDtcblx0XHR2YXIgaSwgZGVzY3JpcHRvciwgcGx1Z2luLCBwYXJhbXMsIG1ldGhvZDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1tpXTtcblx0XHRcdHBsdWdpbiA9IGRlc2NyaXB0b3IucGx1Z2luO1xuXHRcdFx0bWV0aG9kID0gcGx1Z2luW2hvb2tdO1xuXHRcdFx0aWYgKHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0cGFyYW1zID0gW2NoYXJ0XS5jb25jYXQoYXJncyB8fCBbXSk7XG5cdFx0XHRcdHBhcmFtcy5wdXNoKGRlc2NyaXB0b3Iub3B0aW9ucyk7XG5cdFx0XHRcdGlmIChtZXRob2QuYXBwbHkocGx1Z2luLCBwYXJhbXMpID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGRlc2NyaXB0b3JzIG9mIGVuYWJsZWQgcGx1Z2lucyBmb3IgdGhlIGdpdmVuIGNoYXJ0LlxuXHQgKiBAcmV0dXJucyB7b2JqZWN0W119IFt7IHBsdWdpbiwgb3B0aW9ucyB9XVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0ZGVzY3JpcHRvcnM6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0dmFyIGNhY2hlID0gY2hhcnQuJHBsdWdpbnMgfHwgKGNoYXJ0LiRwbHVnaW5zID0ge30pO1xuXHRcdGlmIChjYWNoZS5pZCA9PT0gdGhpcy5fY2FjaGVJZCkge1xuXHRcdFx0cmV0dXJuIGNhY2hlLmRlc2NyaXB0b3JzO1xuXHRcdH1cblxuXHRcdHZhciBwbHVnaW5zID0gW107XG5cdFx0dmFyIGRlc2NyaXB0b3JzID0gW107XG5cdFx0dmFyIGNvbmZpZyA9IChjaGFydCAmJiBjaGFydC5jb25maWcpIHx8IHt9O1xuXHRcdHZhciBvcHRpb25zID0gKGNvbmZpZy5vcHRpb25zICYmIGNvbmZpZy5vcHRpb25zLnBsdWdpbnMpIHx8IHt9O1xuXG5cdFx0dGhpcy5fcGx1Z2lucy5jb25jYXQoY29uZmlnLnBsdWdpbnMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XG5cdFx0XHR2YXIgaWR4ID0gcGx1Z2lucy5pbmRleE9mKHBsdWdpbik7XG5cdFx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpZCA9IHBsdWdpbi5pZDtcblx0XHRcdHZhciBvcHRzID0gb3B0aW9uc1tpZF07XG5cdFx0XHRpZiAob3B0cyA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0cyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRvcHRzID0gaGVscGVycyQxLmNsb25lKGNvcmVfZGVmYXVsdHMuZ2xvYmFsLnBsdWdpbnNbaWRdKTtcblx0XHRcdH1cblxuXHRcdFx0cGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cdFx0XHRkZXNjcmlwdG9ycy5wdXNoKHtcblx0XHRcdFx0cGx1Z2luOiBwbHVnaW4sXG5cdFx0XHRcdG9wdGlvbnM6IG9wdHMgfHwge31cblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0Y2FjaGUuZGVzY3JpcHRvcnMgPSBkZXNjcmlwdG9ycztcblx0XHRjYWNoZS5pZCA9IHRoaXMuX2NhY2hlSWQ7XG5cdFx0cmV0dXJuIGRlc2NyaXB0b3JzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbnZhbGlkYXRlcyBjYWNoZSBmb3IgdGhlIGdpdmVuIGNoYXJ0OiBkZXNjcmlwdG9ycyBob2xkIGEgcmVmZXJlbmNlIG9uIHBsdWdpbiBvcHRpb24sXG5cdCAqIGJ1dCBpbiBzb21lIGNhc2VzLCB0aGlzIHJlZmVyZW5jZSBjYW4gYmUgY2hhbmdlZCBieSB0aGUgdXNlciB3aGVuIHVwZGF0aW5nIG9wdGlvbnMuXG5cdCAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy81MTExI2lzc3VlY29tbWVudC0zNTU5MzQxNjdcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9pbnZhbGlkYXRlOiBmdW5jdGlvbihjaGFydCkge1xuXHRcdGRlbGV0ZSBjaGFydC4kcGx1Z2lucztcblx0fVxufTtcblxudmFyIGNvcmVfc2NhbGVTZXJ2aWNlID0ge1xuXHQvLyBTY2FsZSByZWdpc3RyYXRpb24gb2JqZWN0LiBFeHRlbnNpb25zIGNhbiByZWdpc3RlciBuZXcgc2NhbGUgdHlwZXMgKHN1Y2ggYXMgbG9nIG9yIERCIHNjYWxlcykgYW5kIHRoZW5cblx0Ly8gdXNlIHRoZSBuZXcgY2hhcnQgb3B0aW9ucyB0byBncmFiIHRoZSBjb3JyZWN0IHNjYWxlXG5cdGNvbnN0cnVjdG9yczoge30sXG5cdC8vIFVzZSBhIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBzbyB0aGF0IHdlIGNhbiBtb3ZlIHRvIGFuIEVTNiBtYXAgd2hlbiB3ZSBubyBsb25nZXIgbmVlZCB0byBzdXBwb3J0XG5cdC8vIG9sZCBicm93c2Vyc1xuXG5cdC8vIFNjYWxlIGNvbmZpZyBkZWZhdWx0c1xuXHRkZWZhdWx0czoge30sXG5cdHJlZ2lzdGVyU2NhbGVUeXBlOiBmdW5jdGlvbih0eXBlLCBzY2FsZUNvbnN0cnVjdG9yLCBzY2FsZURlZmF1bHRzKSB7XG5cdFx0dGhpcy5jb25zdHJ1Y3RvcnNbdHlwZV0gPSBzY2FsZUNvbnN0cnVjdG9yO1xuXHRcdHRoaXMuZGVmYXVsdHNbdHlwZV0gPSBoZWxwZXJzJDEuY2xvbmUoc2NhbGVEZWZhdWx0cyk7XG5cdH0sXG5cdGdldFNjYWxlQ29uc3RydWN0b3I6IGZ1bmN0aW9uKHR5cGUpIHtcblx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcnMuaGFzT3duUHJvcGVydHkodHlwZSkgPyB0aGlzLmNvbnN0cnVjdG9yc1t0eXBlXSA6IHVuZGVmaW5lZDtcblx0fSxcblx0Z2V0U2NhbGVEZWZhdWx0czogZnVuY3Rpb24odHlwZSkge1xuXHRcdC8vIFJldHVybiB0aGUgc2NhbGUgZGVmYXVsdHMgbWVyZ2VkIHdpdGggdGhlIGdsb2JhbCBzZXR0aW5ncyBzbyB0aGF0IHdlIGFsd2F5cyB1c2UgdGhlIGxhdGVzdCBvbmVzXG5cdFx0cmV0dXJuIHRoaXMuZGVmYXVsdHMuaGFzT3duUHJvcGVydHkodHlwZSkgPyBoZWxwZXJzJDEubWVyZ2Uoe30sIFtjb3JlX2RlZmF1bHRzLnNjYWxlLCB0aGlzLmRlZmF1bHRzW3R5cGVdXSkgOiB7fTtcblx0fSxcblx0dXBkYXRlU2NhbGVEZWZhdWx0czogZnVuY3Rpb24odHlwZSwgYWRkaXRpb25zKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHRpZiAobWUuZGVmYXVsdHMuaGFzT3duUHJvcGVydHkodHlwZSkpIHtcblx0XHRcdG1lLmRlZmF1bHRzW3R5cGVdID0gaGVscGVycyQxLmV4dGVuZChtZS5kZWZhdWx0c1t0eXBlXSwgYWRkaXRpb25zKTtcblx0XHR9XG5cdH0sXG5cdGFkZFNjYWxlc1RvTGF5b3V0OiBmdW5jdGlvbihjaGFydCkge1xuXHRcdC8vIEFkZHMgZWFjaCBzY2FsZSB0byB0aGUgY2hhcnQuYm94ZXMgYXJyYXkgdG8gYmUgc2l6ZWQgYWNjb3JkaW5nbHlcblx0XHRoZWxwZXJzJDEuZWFjaChjaGFydC5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlKSB7XG5cdFx0XHQvLyBTZXQgSUxheW91dEl0ZW0gcGFyYW1ldGVycyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdHNjYWxlLmZ1bGxXaWR0aCA9IHNjYWxlLm9wdGlvbnMuZnVsbFdpZHRoO1xuXHRcdFx0c2NhbGUucG9zaXRpb24gPSBzY2FsZS5vcHRpb25zLnBvc2l0aW9uO1xuXHRcdFx0c2NhbGUud2VpZ2h0ID0gc2NhbGUub3B0aW9ucy53ZWlnaHQ7XG5cdFx0XHRjb3JlX2xheW91dHMuYWRkQm94KGNoYXJ0LCBzY2FsZSk7XG5cdFx0fSk7XG5cdH1cbn07XG5cbnZhciB2YWx1ZU9yRGVmYXVsdCQ3ID0gaGVscGVycyQxLnZhbHVlT3JEZWZhdWx0O1xuXG5jb3JlX2RlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0dG9vbHRpcHM6IHtcblx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdGN1c3RvbTogbnVsbCxcblx0XHRtb2RlOiAnbmVhcmVzdCcsXG5cdFx0cG9zaXRpb246ICdhdmVyYWdlJyxcblx0XHRpbnRlcnNlY3Q6IHRydWUsXG5cdFx0YmFja2dyb3VuZENvbG9yOiAncmdiYSgwLDAsMCwwLjgpJyxcblx0XHR0aXRsZUZvbnRTdHlsZTogJ2JvbGQnLFxuXHRcdHRpdGxlU3BhY2luZzogMixcblx0XHR0aXRsZU1hcmdpbkJvdHRvbTogNixcblx0XHR0aXRsZUZvbnRDb2xvcjogJyNmZmYnLFxuXHRcdHRpdGxlQWxpZ246ICdsZWZ0Jyxcblx0XHRib2R5U3BhY2luZzogMixcblx0XHRib2R5Rm9udENvbG9yOiAnI2ZmZicsXG5cdFx0Ym9keUFsaWduOiAnbGVmdCcsXG5cdFx0Zm9vdGVyRm9udFN0eWxlOiAnYm9sZCcsXG5cdFx0Zm9vdGVyU3BhY2luZzogMixcblx0XHRmb290ZXJNYXJnaW5Ub3A6IDYsXG5cdFx0Zm9vdGVyRm9udENvbG9yOiAnI2ZmZicsXG5cdFx0Zm9vdGVyQWxpZ246ICdsZWZ0Jyxcblx0XHR5UGFkZGluZzogNixcblx0XHR4UGFkZGluZzogNixcblx0XHRjYXJldFBhZGRpbmc6IDIsXG5cdFx0Y2FyZXRTaXplOiA1LFxuXHRcdGNvcm5lclJhZGl1czogNixcblx0XHRtdWx0aUtleUJhY2tncm91bmQ6ICcjZmZmJyxcblx0XHRkaXNwbGF5Q29sb3JzOiB0cnVlLFxuXHRcdGJvcmRlckNvbG9yOiAncmdiYSgwLDAsMCwwKScsXG5cdFx0Ym9yZGVyV2lkdGg6IDAsXG5cdFx0Y2FsbGJhY2tzOiB7XG5cdFx0XHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcblx0XHRcdGJlZm9yZVRpdGxlOiBoZWxwZXJzJDEubm9vcCxcblx0XHRcdHRpdGxlOiBmdW5jdGlvbih0b29sdGlwSXRlbXMsIGRhdGEpIHtcblx0XHRcdFx0dmFyIHRpdGxlID0gJyc7XG5cdFx0XHRcdHZhciBsYWJlbHMgPSBkYXRhLmxhYmVscztcblx0XHRcdFx0dmFyIGxhYmVsQ291bnQgPSBsYWJlbHMgPyBsYWJlbHMubGVuZ3RoIDogMDtcblxuXHRcdFx0XHRpZiAodG9vbHRpcEl0ZW1zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHR2YXIgaXRlbSA9IHRvb2x0aXBJdGVtc1swXTtcblx0XHRcdFx0XHRpZiAoaXRlbS5sYWJlbCkge1xuXHRcdFx0XHRcdFx0dGl0bGUgPSBpdGVtLmxhYmVsO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaXRlbS54TGFiZWwpIHtcblx0XHRcdFx0XHRcdHRpdGxlID0gaXRlbS54TGFiZWw7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChsYWJlbENvdW50ID4gMCAmJiBpdGVtLmluZGV4IDwgbGFiZWxDb3VudCkge1xuXHRcdFx0XHRcdFx0dGl0bGUgPSBsYWJlbHNbaXRlbS5pbmRleF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRpdGxlO1xuXHRcdFx0fSxcblx0XHRcdGFmdGVyVGl0bGU6IGhlbHBlcnMkMS5ub29wLFxuXG5cdFx0XHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcblx0XHRcdGJlZm9yZUJvZHk6IGhlbHBlcnMkMS5ub29wLFxuXG5cdFx0XHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtLCBkYXRhKVxuXHRcdFx0YmVmb3JlTGFiZWw6IGhlbHBlcnMkMS5ub29wLFxuXHRcdFx0bGFiZWw6IGZ1bmN0aW9uKHRvb2x0aXBJdGVtLCBkYXRhKSB7XG5cdFx0XHRcdHZhciBsYWJlbCA9IGRhdGEuZGF0YXNldHNbdG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4XS5sYWJlbCB8fCAnJztcblxuXHRcdFx0XHRpZiAobGFiZWwpIHtcblx0XHRcdFx0XHRsYWJlbCArPSAnOiAnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghaGVscGVycyQxLmlzTnVsbE9yVW5kZWYodG9vbHRpcEl0ZW0udmFsdWUpKSB7XG5cdFx0XHRcdFx0bGFiZWwgKz0gdG9vbHRpcEl0ZW0udmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGFiZWwgKz0gdG9vbHRpcEl0ZW0ueUxhYmVsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBsYWJlbDtcblx0XHRcdH0sXG5cdFx0XHRsYWJlbENvbG9yOiBmdW5jdGlvbih0b29sdGlwSXRlbSwgY2hhcnQpIHtcblx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YSh0b29sdGlwSXRlbS5kYXRhc2V0SW5kZXgpO1xuXHRcdFx0XHR2YXIgYWN0aXZlRWxlbWVudCA9IG1ldGEuZGF0YVt0b29sdGlwSXRlbS5pbmRleF07XG5cdFx0XHRcdHZhciB2aWV3ID0gYWN0aXZlRWxlbWVudC5fdmlldztcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRib3JkZXJDb2xvcjogdmlldy5ib3JkZXJDb2xvcixcblx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IHZpZXcuYmFja2dyb3VuZENvbG9yXG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXHRcdFx0bGFiZWxUZXh0Q29sb3I6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fb3B0aW9ucy5ib2R5Rm9udENvbG9yO1xuXHRcdFx0fSxcblx0XHRcdGFmdGVyTGFiZWw6IGhlbHBlcnMkMS5ub29wLFxuXG5cdFx0XHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcblx0XHRcdGFmdGVyQm9keTogaGVscGVycyQxLm5vb3AsXG5cblx0XHRcdC8vIEFyZ3MgYXJlOiAodG9vbHRpcEl0ZW1zLCBkYXRhKVxuXHRcdFx0YmVmb3JlRm9vdGVyOiBoZWxwZXJzJDEubm9vcCxcblx0XHRcdGZvb3RlcjogaGVscGVycyQxLm5vb3AsXG5cdFx0XHRhZnRlckZvb3RlcjogaGVscGVycyQxLm5vb3Bcblx0XHR9XG5cdH1cbn0pO1xuXG52YXIgcG9zaXRpb25lcnMgPSB7XG5cdC8qKlxuXHQgKiBBdmVyYWdlIG1vZGUgcGxhY2VzIHRoZSB0b29sdGlwIGF0IHRoZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50cyBzaG93blxuXHQgKiBAZnVuY3Rpb24gQ2hhcnQuVG9vbHRpcC5wb3NpdGlvbmVycy5hdmVyYWdlXG5cdCAqIEBwYXJhbSBlbGVtZW50cyB7Q2hhcnRFbGVtZW50W119IHRoZSBlbGVtZW50cyBiZWluZyBkaXNwbGF5ZWQgaW4gdGhlIHRvb2x0aXBcblx0ICogQHJldHVybnMge29iamVjdH0gdG9vbHRpcCBwb3NpdGlvblxuXHQgKi9cblx0YXZlcmFnZTogZnVuY3Rpb24oZWxlbWVudHMpIHtcblx0XHRpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHZhciBpLCBsZW47XG5cdFx0dmFyIHggPSAwO1xuXHRcdHZhciB5ID0gMDtcblx0XHR2YXIgY291bnQgPSAwO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcblx0XHRcdHZhciBlbCA9IGVsZW1lbnRzW2ldO1xuXHRcdFx0aWYgKGVsICYmIGVsLmhhc1ZhbHVlKCkpIHtcblx0XHRcdFx0dmFyIHBvcyA9IGVsLnRvb2x0aXBQb3NpdGlvbigpO1xuXHRcdFx0XHR4ICs9IHBvcy54O1xuXHRcdFx0XHR5ICs9IHBvcy55O1xuXHRcdFx0XHQrK2NvdW50O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR4OiB4IC8gY291bnQsXG5cdFx0XHR5OiB5IC8gY291bnRcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSB0b29sdGlwIHBvc2l0aW9uIG5lYXJlc3Qgb2YgdGhlIGl0ZW0gbmVhcmVzdCB0byB0aGUgZXZlbnQgcG9zaXRpb25cblx0ICogQGZ1bmN0aW9uIENoYXJ0LlRvb2x0aXAucG9zaXRpb25lcnMubmVhcmVzdFxuXHQgKiBAcGFyYW0gZWxlbWVudHMge0NoYXJ0LkVsZW1lbnRbXX0gdGhlIHRvb2x0aXAgZWxlbWVudHNcblx0ICogQHBhcmFtIGV2ZW50UG9zaXRpb24ge29iamVjdH0gdGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCBpbiBjYW52YXMgY29vcmRpbmF0ZXNcblx0ICogQHJldHVybnMge29iamVjdH0gdGhlIHRvb2x0aXAgcG9zaXRpb25cblx0ICovXG5cdG5lYXJlc3Q6IGZ1bmN0aW9uKGVsZW1lbnRzLCBldmVudFBvc2l0aW9uKSB7XG5cdFx0dmFyIHggPSBldmVudFBvc2l0aW9uLng7XG5cdFx0dmFyIHkgPSBldmVudFBvc2l0aW9uLnk7XG5cdFx0dmFyIG1pbkRpc3RhbmNlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXHRcdHZhciBpLCBsZW4sIG5lYXJlc3RFbGVtZW50O1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcblx0XHRcdHZhciBlbCA9IGVsZW1lbnRzW2ldO1xuXHRcdFx0aWYgKGVsICYmIGVsLmhhc1ZhbHVlKCkpIHtcblx0XHRcdFx0dmFyIGNlbnRlciA9IGVsLmdldENlbnRlclBvaW50KCk7XG5cdFx0XHRcdHZhciBkID0gaGVscGVycyQxLmRpc3RhbmNlQmV0d2VlblBvaW50cyhldmVudFBvc2l0aW9uLCBjZW50ZXIpO1xuXG5cdFx0XHRcdGlmIChkIDwgbWluRGlzdGFuY2UpIHtcblx0XHRcdFx0XHRtaW5EaXN0YW5jZSA9IGQ7XG5cdFx0XHRcdFx0bmVhcmVzdEVsZW1lbnQgPSBlbDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChuZWFyZXN0RWxlbWVudCkge1xuXHRcdFx0dmFyIHRwID0gbmVhcmVzdEVsZW1lbnQudG9vbHRpcFBvc2l0aW9uKCk7XG5cdFx0XHR4ID0gdHAueDtcblx0XHRcdHkgPSB0cC55O1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR4OiB4LFxuXHRcdFx0eTogeVxuXHRcdH07XG5cdH1cbn07XG5cbi8vIEhlbHBlciB0byBwdXNoIG9yIGNvbmNhdCBiYXNlZCBvbiBpZiB0aGUgMm5kIHBhcmFtZXRlciBpcyBhbiBhcnJheSBvciBub3RcbmZ1bmN0aW9uIHB1c2hPckNvbmNhdChiYXNlLCB0b1B1c2gpIHtcblx0aWYgKHRvUHVzaCkge1xuXHRcdGlmIChoZWxwZXJzJDEuaXNBcnJheSh0b1B1c2gpKSB7XG5cdFx0XHQvLyBiYXNlID0gYmFzZS5jb25jYXQodG9QdXNoKTtcblx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGJhc2UsIHRvUHVzaCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJhc2UucHVzaCh0b1B1c2gpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBiYXNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2Ygc3RyaW5ncyBzcGxpdCBieSBuZXdsaW5lXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc3BsaXQgYnkgbmV3bGluZS5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gdmFsdWUgaWYgbmV3bGluZSBwcmVzZW50IC0gUmV0dXJuZWQgZnJvbSBTdHJpbmcgc3BsaXQoKSBtZXRob2RcbiAqIEBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBzcGxpdE5ld2xpbmVzKHN0cikge1xuXHRpZiAoKHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnIHx8IHN0ciBpbnN0YW5jZW9mIFN0cmluZykgJiYgc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcblx0XHRyZXR1cm4gc3RyLnNwbGl0KCdcXG4nKTtcblx0fVxuXHRyZXR1cm4gc3RyO1xufVxuXG5cbi8qKlxuICogUHJpdmF0ZSBoZWxwZXIgdG8gY3JlYXRlIGEgdG9vbHRpcCBpdGVtIG1vZGVsXG4gKiBAcGFyYW0gZWxlbWVudCAtIHRoZSBjaGFydCBlbGVtZW50IChwb2ludCwgYXJjLCBiYXIpIHRvIGNyZWF0ZSB0aGUgdG9vbHRpcCBpdGVtIGZvclxuICogQHJldHVybiBuZXcgdG9vbHRpcCBpdGVtXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRvb2x0aXBJdGVtKGVsZW1lbnQpIHtcblx0dmFyIHhTY2FsZSA9IGVsZW1lbnQuX3hTY2FsZTtcblx0dmFyIHlTY2FsZSA9IGVsZW1lbnQuX3lTY2FsZSB8fCBlbGVtZW50Ll9zY2FsZTsgLy8gaGFuZGxlIHJhZGFyIHx8IHBvbGFyQXJlYSBjaGFydHNcblx0dmFyIGluZGV4ID0gZWxlbWVudC5faW5kZXg7XG5cdHZhciBkYXRhc2V0SW5kZXggPSBlbGVtZW50Ll9kYXRhc2V0SW5kZXg7XG5cdHZhciBjb250cm9sbGVyID0gZWxlbWVudC5fY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KS5jb250cm9sbGVyO1xuXHR2YXIgaW5kZXhTY2FsZSA9IGNvbnRyb2xsZXIuX2dldEluZGV4U2NhbGUoKTtcblx0dmFyIHZhbHVlU2NhbGUgPSBjb250cm9sbGVyLl9nZXRWYWx1ZVNjYWxlKCk7XG5cblx0cmV0dXJuIHtcblx0XHR4TGFiZWw6IHhTY2FsZSA/IHhTY2FsZS5nZXRMYWJlbEZvckluZGV4KGluZGV4LCBkYXRhc2V0SW5kZXgpIDogJycsXG5cdFx0eUxhYmVsOiB5U2NhbGUgPyB5U2NhbGUuZ2V0TGFiZWxGb3JJbmRleChpbmRleCwgZGF0YXNldEluZGV4KSA6ICcnLFxuXHRcdGxhYmVsOiBpbmRleFNjYWxlID8gJycgKyBpbmRleFNjYWxlLmdldExhYmVsRm9ySW5kZXgoaW5kZXgsIGRhdGFzZXRJbmRleCkgOiAnJyxcblx0XHR2YWx1ZTogdmFsdWVTY2FsZSA/ICcnICsgdmFsdWVTY2FsZS5nZXRMYWJlbEZvckluZGV4KGluZGV4LCBkYXRhc2V0SW5kZXgpIDogJycsXG5cdFx0aW5kZXg6IGluZGV4LFxuXHRcdGRhdGFzZXRJbmRleDogZGF0YXNldEluZGV4LFxuXHRcdHg6IGVsZW1lbnQuX21vZGVsLngsXG5cdFx0eTogZWxlbWVudC5fbW9kZWwueVxuXHR9O1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgdGhlIHJlc2V0IG1vZGVsIGZvciB0aGUgdG9vbHRpcFxuICogQHBhcmFtIHRvb2x0aXBPcHRzIHtvYmplY3R9IHRoZSB0b29sdGlwIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gZ2V0QmFzZU1vZGVsKHRvb2x0aXBPcHRzKSB7XG5cdHZhciBnbG9iYWxEZWZhdWx0cyA9IGNvcmVfZGVmYXVsdHMuZ2xvYmFsO1xuXG5cdHJldHVybiB7XG5cdFx0Ly8gUG9zaXRpb25pbmdcblx0XHR4UGFkZGluZzogdG9vbHRpcE9wdHMueFBhZGRpbmcsXG5cdFx0eVBhZGRpbmc6IHRvb2x0aXBPcHRzLnlQYWRkaW5nLFxuXHRcdHhBbGlnbjogdG9vbHRpcE9wdHMueEFsaWduLFxuXHRcdHlBbGlnbjogdG9vbHRpcE9wdHMueUFsaWduLFxuXG5cdFx0Ly8gQm9keVxuXHRcdGJvZHlGb250Q29sb3I6IHRvb2x0aXBPcHRzLmJvZHlGb250Q29sb3IsXG5cdFx0X2JvZHlGb250RmFtaWx5OiB2YWx1ZU9yRGVmYXVsdCQ3KHRvb2x0aXBPcHRzLmJvZHlGb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udEZhbWlseSksXG5cdFx0X2JvZHlGb250U3R5bGU6IHZhbHVlT3JEZWZhdWx0JDcodG9vbHRpcE9wdHMuYm9keUZvbnRTdHlsZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTdHlsZSksXG5cdFx0X2JvZHlBbGlnbjogdG9vbHRpcE9wdHMuYm9keUFsaWduLFxuXHRcdGJvZHlGb250U2l6ZTogdmFsdWVPckRlZmF1bHQkNyh0b29sdGlwT3B0cy5ib2R5Rm9udFNpemUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U2l6ZSksXG5cdFx0Ym9keVNwYWNpbmc6IHRvb2x0aXBPcHRzLmJvZHlTcGFjaW5nLFxuXG5cdFx0Ly8gVGl0bGVcblx0XHR0aXRsZUZvbnRDb2xvcjogdG9vbHRpcE9wdHMudGl0bGVGb250Q29sb3IsXG5cdFx0X3RpdGxlRm9udEZhbWlseTogdmFsdWVPckRlZmF1bHQkNyh0b29sdGlwT3B0cy50aXRsZUZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250RmFtaWx5KSxcblx0XHRfdGl0bGVGb250U3R5bGU6IHZhbHVlT3JEZWZhdWx0JDcodG9vbHRpcE9wdHMudGl0bGVGb250U3R5bGUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U3R5bGUpLFxuXHRcdHRpdGxlRm9udFNpemU6IHZhbHVlT3JEZWZhdWx0JDcodG9vbHRpcE9wdHMudGl0bGVGb250U2l6ZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTaXplKSxcblx0XHRfdGl0bGVBbGlnbjogdG9vbHRpcE9wdHMudGl0bGVBbGlnbixcblx0XHR0aXRsZVNwYWNpbmc6IHRvb2x0aXBPcHRzLnRpdGxlU3BhY2luZyxcblx0XHR0aXRsZU1hcmdpbkJvdHRvbTogdG9vbHRpcE9wdHMudGl0bGVNYXJnaW5Cb3R0b20sXG5cblx0XHQvLyBGb290ZXJcblx0XHRmb290ZXJGb250Q29sb3I6IHRvb2x0aXBPcHRzLmZvb3RlckZvbnRDb2xvcixcblx0XHRfZm9vdGVyRm9udEZhbWlseTogdmFsdWVPckRlZmF1bHQkNyh0b29sdGlwT3B0cy5mb290ZXJGb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udEZhbWlseSksXG5cdFx0X2Zvb3RlckZvbnRTdHlsZTogdmFsdWVPckRlZmF1bHQkNyh0b29sdGlwT3B0cy5mb290ZXJGb250U3R5bGUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U3R5bGUpLFxuXHRcdGZvb3RlckZvbnRTaXplOiB2YWx1ZU9yRGVmYXVsdCQ3KHRvb2x0aXBPcHRzLmZvb3RlckZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpLFxuXHRcdF9mb290ZXJBbGlnbjogdG9vbHRpcE9wdHMuZm9vdGVyQWxpZ24sXG5cdFx0Zm9vdGVyU3BhY2luZzogdG9vbHRpcE9wdHMuZm9vdGVyU3BhY2luZyxcblx0XHRmb290ZXJNYXJnaW5Ub3A6IHRvb2x0aXBPcHRzLmZvb3Rlck1hcmdpblRvcCxcblxuXHRcdC8vIEFwcGVhcmFuY2Vcblx0XHRjYXJldFNpemU6IHRvb2x0aXBPcHRzLmNhcmV0U2l6ZSxcblx0XHRjb3JuZXJSYWRpdXM6IHRvb2x0aXBPcHRzLmNvcm5lclJhZGl1cyxcblx0XHRiYWNrZ3JvdW5kQ29sb3I6IHRvb2x0aXBPcHRzLmJhY2tncm91bmRDb2xvcixcblx0XHRvcGFjaXR5OiAwLFxuXHRcdGxlZ2VuZENvbG9yQmFja2dyb3VuZDogdG9vbHRpcE9wdHMubXVsdGlLZXlCYWNrZ3JvdW5kLFxuXHRcdGRpc3BsYXlDb2xvcnM6IHRvb2x0aXBPcHRzLmRpc3BsYXlDb2xvcnMsXG5cdFx0Ym9yZGVyQ29sb3I6IHRvb2x0aXBPcHRzLmJvcmRlckNvbG9yLFxuXHRcdGJvcmRlcldpZHRoOiB0b29sdGlwT3B0cy5ib3JkZXJXaWR0aFxuXHR9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgdG9vbHRpcFxuICovXG5mdW5jdGlvbiBnZXRUb29sdGlwU2l6ZSh0b29sdGlwLCBtb2RlbCkge1xuXHR2YXIgY3R4ID0gdG9vbHRpcC5fY2hhcnQuY3R4O1xuXG5cdHZhciBoZWlnaHQgPSBtb2RlbC55UGFkZGluZyAqIDI7IC8vIFRvb2x0aXAgUGFkZGluZ1xuXHR2YXIgd2lkdGggPSAwO1xuXG5cdC8vIENvdW50IG9mIGFsbCBsaW5lcyBpbiB0aGUgYm9keVxuXHR2YXIgYm9keSA9IG1vZGVsLmJvZHk7XG5cdHZhciBjb21iaW5lZEJvZHlMZW5ndGggPSBib2R5LnJlZHVjZShmdW5jdGlvbihjb3VudCwgYm9keUl0ZW0pIHtcblx0XHRyZXR1cm4gY291bnQgKyBib2R5SXRlbS5iZWZvcmUubGVuZ3RoICsgYm9keUl0ZW0ubGluZXMubGVuZ3RoICsgYm9keUl0ZW0uYWZ0ZXIubGVuZ3RoO1xuXHR9LCAwKTtcblx0Y29tYmluZWRCb2R5TGVuZ3RoICs9IG1vZGVsLmJlZm9yZUJvZHkubGVuZ3RoICsgbW9kZWwuYWZ0ZXJCb2R5Lmxlbmd0aDtcblxuXHR2YXIgdGl0bGVMaW5lQ291bnQgPSBtb2RlbC50aXRsZS5sZW5ndGg7XG5cdHZhciBmb290ZXJMaW5lQ291bnQgPSBtb2RlbC5mb290ZXIubGVuZ3RoO1xuXHR2YXIgdGl0bGVGb250U2l6ZSA9IG1vZGVsLnRpdGxlRm9udFNpemU7XG5cdHZhciBib2R5Rm9udFNpemUgPSBtb2RlbC5ib2R5Rm9udFNpemU7XG5cdHZhciBmb290ZXJGb250U2l6ZSA9IG1vZGVsLmZvb3RlckZvbnRTaXplO1xuXG5cdGhlaWdodCArPSB0aXRsZUxpbmVDb3VudCAqIHRpdGxlRm9udFNpemU7IC8vIFRpdGxlIExpbmVzXG5cdGhlaWdodCArPSB0aXRsZUxpbmVDb3VudCA/ICh0aXRsZUxpbmVDb3VudCAtIDEpICogbW9kZWwudGl0bGVTcGFjaW5nIDogMDsgLy8gVGl0bGUgTGluZSBTcGFjaW5nXG5cdGhlaWdodCArPSB0aXRsZUxpbmVDb3VudCA/IG1vZGVsLnRpdGxlTWFyZ2luQm90dG9tIDogMDsgLy8gVGl0bGUncyBib3R0b20gTWFyZ2luXG5cdGhlaWdodCArPSBjb21iaW5lZEJvZHlMZW5ndGggKiBib2R5Rm9udFNpemU7IC8vIEJvZHkgTGluZXNcblx0aGVpZ2h0ICs9IGNvbWJpbmVkQm9keUxlbmd0aCA/IChjb21iaW5lZEJvZHlMZW5ndGggLSAxKSAqIG1vZGVsLmJvZHlTcGFjaW5nIDogMDsgLy8gQm9keSBMaW5lIFNwYWNpbmdcblx0aGVpZ2h0ICs9IGZvb3RlckxpbmVDb3VudCA/IG1vZGVsLmZvb3Rlck1hcmdpblRvcCA6IDA7IC8vIEZvb3RlciBNYXJnaW5cblx0aGVpZ2h0ICs9IGZvb3RlckxpbmVDb3VudCAqIChmb290ZXJGb250U2l6ZSk7IC8vIEZvb3RlciBMaW5lc1xuXHRoZWlnaHQgKz0gZm9vdGVyTGluZUNvdW50ID8gKGZvb3RlckxpbmVDb3VudCAtIDEpICogbW9kZWwuZm9vdGVyU3BhY2luZyA6IDA7IC8vIEZvb3RlciBMaW5lIFNwYWNpbmdcblxuXHQvLyBUaXRsZSB3aWR0aFxuXHR2YXIgd2lkdGhQYWRkaW5nID0gMDtcblx0dmFyIG1heExpbmVXaWR0aCA9IGZ1bmN0aW9uKGxpbmUpIHtcblx0XHR3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdHgubWVhc3VyZVRleHQobGluZSkud2lkdGggKyB3aWR0aFBhZGRpbmcpO1xuXHR9O1xuXG5cdGN0eC5mb250ID0gaGVscGVycyQxLmZvbnRTdHJpbmcodGl0bGVGb250U2l6ZSwgbW9kZWwuX3RpdGxlRm9udFN0eWxlLCBtb2RlbC5fdGl0bGVGb250RmFtaWx5KTtcblx0aGVscGVycyQxLmVhY2gobW9kZWwudGl0bGUsIG1heExpbmVXaWR0aCk7XG5cblx0Ly8gQm9keSB3aWR0aFxuXHRjdHguZm9udCA9IGhlbHBlcnMkMS5mb250U3RyaW5nKGJvZHlGb250U2l6ZSwgbW9kZWwuX2JvZHlGb250U3R5bGUsIG1vZGVsLl9ib2R5Rm9udEZhbWlseSk7XG5cdGhlbHBlcnMkMS5lYWNoKG1vZGVsLmJlZm9yZUJvZHkuY29uY2F0KG1vZGVsLmFmdGVyQm9keSksIG1heExpbmVXaWR0aCk7XG5cblx0Ly8gQm9keSBsaW5lcyBtYXkgaW5jbHVkZSBzb21lIGV4dHJhIHdpZHRoIGR1ZSB0byB0aGUgY29sb3IgYm94XG5cdHdpZHRoUGFkZGluZyA9IG1vZGVsLmRpc3BsYXlDb2xvcnMgPyAoYm9keUZvbnRTaXplICsgMikgOiAwO1xuXHRoZWxwZXJzJDEuZWFjaChib2R5LCBmdW5jdGlvbihib2R5SXRlbSkge1xuXHRcdGhlbHBlcnMkMS5lYWNoKGJvZHlJdGVtLmJlZm9yZSwgbWF4TGluZVdpZHRoKTtcblx0XHRoZWxwZXJzJDEuZWFjaChib2R5SXRlbS5saW5lcywgbWF4TGluZVdpZHRoKTtcblx0XHRoZWxwZXJzJDEuZWFjaChib2R5SXRlbS5hZnRlciwgbWF4TGluZVdpZHRoKTtcblx0fSk7XG5cblx0Ly8gUmVzZXQgYmFjayB0byAwXG5cdHdpZHRoUGFkZGluZyA9IDA7XG5cblx0Ly8gRm9vdGVyIHdpZHRoXG5cdGN0eC5mb250ID0gaGVscGVycyQxLmZvbnRTdHJpbmcoZm9vdGVyRm9udFNpemUsIG1vZGVsLl9mb290ZXJGb250U3R5bGUsIG1vZGVsLl9mb290ZXJGb250RmFtaWx5KTtcblx0aGVscGVycyQxLmVhY2gobW9kZWwuZm9vdGVyLCBtYXhMaW5lV2lkdGgpO1xuXG5cdC8vIEFkZCBwYWRkaW5nXG5cdHdpZHRoICs9IDIgKiBtb2RlbC54UGFkZGluZztcblxuXHRyZXR1cm4ge1xuXHRcdHdpZHRoOiB3aWR0aCxcblx0XHRoZWlnaHQ6IGhlaWdodFxuXHR9O1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgdGhlIGFsaWdubWVudCBvZiBhIHRvb2x0aXAgZ2l2ZW4gdGhlIHNpemVcbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lQWxpZ25tZW50KHRvb2x0aXAsIHNpemUpIHtcblx0dmFyIG1vZGVsID0gdG9vbHRpcC5fbW9kZWw7XG5cdHZhciBjaGFydCA9IHRvb2x0aXAuX2NoYXJ0O1xuXHR2YXIgY2hhcnRBcmVhID0gdG9vbHRpcC5fY2hhcnQuY2hhcnRBcmVhO1xuXHR2YXIgeEFsaWduID0gJ2NlbnRlcic7XG5cdHZhciB5QWxpZ24gPSAnY2VudGVyJztcblxuXHRpZiAobW9kZWwueSA8IHNpemUuaGVpZ2h0KSB7XG5cdFx0eUFsaWduID0gJ3RvcCc7XG5cdH0gZWxzZSBpZiAobW9kZWwueSA+IChjaGFydC5oZWlnaHQgLSBzaXplLmhlaWdodCkpIHtcblx0XHR5QWxpZ24gPSAnYm90dG9tJztcblx0fVxuXG5cdHZhciBsZiwgcmY7IC8vIGZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgbGVmdCwgcmlnaHQgYWxpZ25tZW50XG5cdHZhciBvbGYsIG9yZjsgLy8gZnVuY3Rpb25zIHRvIGRldGVybWluZSBpZiBsZWZ0L3JpZ2h0IGFsaWdubWVudCBjYXVzZXMgdG9vbHRpcCB0byBnbyBvdXRzaWRlIGNoYXJ0XG5cdHZhciB5ZjsgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSB5IGFsaWdubWVudCBpZiB0aGUgdG9vbHRpcCBnb2VzIG91dHNpZGUgb2YgdGhlIGxlZnQgb3IgcmlnaHQgZWRnZXNcblx0dmFyIG1pZFggPSAoY2hhcnRBcmVhLmxlZnQgKyBjaGFydEFyZWEucmlnaHQpIC8gMjtcblx0dmFyIG1pZFkgPSAoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMjtcblxuXHRpZiAoeUFsaWduID09PSAnY2VudGVyJykge1xuXHRcdGxmID0gZnVuY3Rpb24oeCkge1xuXHRcdFx0cmV0dXJuIHggPD0gbWlkWDtcblx0XHR9O1xuXHRcdHJmID0gZnVuY3Rpb24oeCkge1xuXHRcdFx0cmV0dXJuIHggPiBtaWRYO1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0bGYgPSBmdW5jdGlvbih4KSB7XG5cdFx0XHRyZXR1cm4geCA8PSAoc2l6ZS53aWR0aCAvIDIpO1xuXHRcdH07XG5cdFx0cmYgPSBmdW5jdGlvbih4KSB7XG5cdFx0XHRyZXR1cm4geCA+PSAoY2hhcnQud2lkdGggLSAoc2l6ZS53aWR0aCAvIDIpKTtcblx0XHR9O1xuXHR9XG5cblx0b2xmID0gZnVuY3Rpb24oeCkge1xuXHRcdHJldHVybiB4ICsgc2l6ZS53aWR0aCArIG1vZGVsLmNhcmV0U2l6ZSArIG1vZGVsLmNhcmV0UGFkZGluZyA+IGNoYXJ0LndpZHRoO1xuXHR9O1xuXHRvcmYgPSBmdW5jdGlvbih4KSB7XG5cdFx0cmV0dXJuIHggLSBzaXplLndpZHRoIC0gbW9kZWwuY2FyZXRTaXplIC0gbW9kZWwuY2FyZXRQYWRkaW5nIDwgMDtcblx0fTtcblx0eWYgPSBmdW5jdGlvbih5KSB7XG5cdFx0cmV0dXJuIHkgPD0gbWlkWSA/ICd0b3AnIDogJ2JvdHRvbSc7XG5cdH07XG5cblx0aWYgKGxmKG1vZGVsLngpKSB7XG5cdFx0eEFsaWduID0gJ2xlZnQnO1xuXG5cdFx0Ly8gSXMgdG9vbHRpcCB0b28gd2lkZSBhbmQgZ29lcyBvdmVyIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjaGFydC4/XG5cdFx0aWYgKG9sZihtb2RlbC54KSkge1xuXHRcdFx0eEFsaWduID0gJ2NlbnRlcic7XG5cdFx0XHR5QWxpZ24gPSB5Zihtb2RlbC55KTtcblx0XHR9XG5cdH0gZWxzZSBpZiAocmYobW9kZWwueCkpIHtcblx0XHR4QWxpZ24gPSAncmlnaHQnO1xuXG5cdFx0Ly8gSXMgdG9vbHRpcCB0b28gd2lkZSBhbmQgZ29lcyBvdXRzaWRlIGxlZnQgZWRnZSBvZiBjYW52YXM/XG5cdFx0aWYgKG9yZihtb2RlbC54KSkge1xuXHRcdFx0eEFsaWduID0gJ2NlbnRlcic7XG5cdFx0XHR5QWxpZ24gPSB5Zihtb2RlbC55KTtcblx0XHR9XG5cdH1cblxuXHR2YXIgb3B0cyA9IHRvb2x0aXAuX29wdGlvbnM7XG5cdHJldHVybiB7XG5cdFx0eEFsaWduOiBvcHRzLnhBbGlnbiA/IG9wdHMueEFsaWduIDogeEFsaWduLFxuXHRcdHlBbGlnbjogb3B0cy55QWxpZ24gPyBvcHRzLnlBbGlnbiA6IHlBbGlnblxuXHR9O1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgdGhlIGxvY2F0aW9uIGEgdG9vbHRpcCBuZWVkcyB0byBiZSBwbGFjZWQgYXQgZ2l2ZW4gdGhlIGluaXRpYWwgcG9zaXRpb24gKHZpYSB0aGUgdm0pIGFuZCB0aGUgc2l6ZSBhbmQgYWxpZ25tZW50XG4gKi9cbmZ1bmN0aW9uIGdldEJhY2tncm91bmRQb2ludCh2bSwgc2l6ZSwgYWxpZ25tZW50LCBjaGFydCkge1xuXHQvLyBCYWNrZ3JvdW5kIFBvc2l0aW9uXG5cdHZhciB4ID0gdm0ueDtcblx0dmFyIHkgPSB2bS55O1xuXG5cdHZhciBjYXJldFNpemUgPSB2bS5jYXJldFNpemU7XG5cdHZhciBjYXJldFBhZGRpbmcgPSB2bS5jYXJldFBhZGRpbmc7XG5cdHZhciBjb3JuZXJSYWRpdXMgPSB2bS5jb3JuZXJSYWRpdXM7XG5cdHZhciB4QWxpZ24gPSBhbGlnbm1lbnQueEFsaWduO1xuXHR2YXIgeUFsaWduID0gYWxpZ25tZW50LnlBbGlnbjtcblx0dmFyIHBhZGRpbmdBbmRTaXplID0gY2FyZXRTaXplICsgY2FyZXRQYWRkaW5nO1xuXHR2YXIgcmFkaXVzQW5kUGFkZGluZyA9IGNvcm5lclJhZGl1cyArIGNhcmV0UGFkZGluZztcblxuXHRpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG5cdFx0eCAtPSBzaXplLndpZHRoO1xuXHR9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ2NlbnRlcicpIHtcblx0XHR4IC09IChzaXplLndpZHRoIC8gMik7XG5cdFx0aWYgKHggKyBzaXplLndpZHRoID4gY2hhcnQud2lkdGgpIHtcblx0XHRcdHggPSBjaGFydC53aWR0aCAtIHNpemUud2lkdGg7XG5cdFx0fVxuXHRcdGlmICh4IDwgMCkge1xuXHRcdFx0eCA9IDA7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHlBbGlnbiA9PT0gJ3RvcCcpIHtcblx0XHR5ICs9IHBhZGRpbmdBbmRTaXplO1xuXHR9IGVsc2UgaWYgKHlBbGlnbiA9PT0gJ2JvdHRvbScpIHtcblx0XHR5IC09IHNpemUuaGVpZ2h0ICsgcGFkZGluZ0FuZFNpemU7XG5cdH0gZWxzZSB7XG5cdFx0eSAtPSAoc2l6ZS5oZWlnaHQgLyAyKTtcblx0fVxuXG5cdGlmICh5QWxpZ24gPT09ICdjZW50ZXInKSB7XG5cdFx0aWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG5cdFx0XHR4ICs9IHBhZGRpbmdBbmRTaXplO1xuXHRcdH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG5cdFx0XHR4IC09IHBhZGRpbmdBbmRTaXplO1xuXHRcdH1cblx0fSBlbHNlIGlmICh4QWxpZ24gPT09ICdsZWZ0Jykge1xuXHRcdHggLT0gcmFkaXVzQW5kUGFkZGluZztcblx0fSBlbHNlIGlmICh4QWxpZ24gPT09ICdyaWdodCcpIHtcblx0XHR4ICs9IHJhZGl1c0FuZFBhZGRpbmc7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHg6IHgsXG5cdFx0eTogeVxuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRBbGlnbmVkWCh2bSwgYWxpZ24pIHtcblx0cmV0dXJuIGFsaWduID09PSAnY2VudGVyJ1xuXHRcdD8gdm0ueCArIHZtLndpZHRoIC8gMlxuXHRcdDogYWxpZ24gPT09ICdyaWdodCdcblx0XHRcdD8gdm0ueCArIHZtLndpZHRoIC0gdm0ueFBhZGRpbmdcblx0XHRcdDogdm0ueCArIHZtLnhQYWRkaW5nO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBidWlsZCBiZWZvcmUgYW5kIGFmdGVyIGJvZHkgbGluZXNcbiAqL1xuZnVuY3Rpb24gZ2V0QmVmb3JlQWZ0ZXJCb2R5TGluZXMoY2FsbGJhY2spIHtcblx0cmV0dXJuIHB1c2hPckNvbmNhdChbXSwgc3BsaXROZXdsaW5lcyhjYWxsYmFjaykpO1xufVxuXG52YXIgZXhwb3J0cyQzID0gY29yZV9lbGVtZW50LmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuX21vZGVsID0gZ2V0QmFzZU1vZGVsKHRoaXMuX29wdGlvbnMpO1xuXHRcdHRoaXMuX2xhc3RBY3RpdmUgPSBbXTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIHRpdGxlXG5cdC8vIEFyZ3MgYXJlOiAodG9vbHRpcEl0ZW0sIGRhdGEpXG5cdGdldFRpdGxlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRzID0gbWUuX29wdGlvbnM7XG5cdFx0dmFyIGNhbGxiYWNrcyA9IG9wdHMuY2FsbGJhY2tzO1xuXG5cdFx0dmFyIGJlZm9yZVRpdGxlID0gY2FsbGJhY2tzLmJlZm9yZVRpdGxlLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xuXHRcdHZhciB0aXRsZSA9IGNhbGxiYWNrcy50aXRsZS5hcHBseShtZSwgYXJndW1lbnRzKTtcblx0XHR2YXIgYWZ0ZXJUaXRsZSA9IGNhbGxiYWNrcy5hZnRlclRpdGxlLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xuXG5cdFx0dmFyIGxpbmVzID0gW107XG5cdFx0bGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXMoYmVmb3JlVGl0bGUpKTtcblx0XHRsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyh0aXRsZSkpO1xuXHRcdGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGFmdGVyVGl0bGUpKTtcblxuXHRcdHJldHVybiBsaW5lcztcblx0fSxcblxuXHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtLCBkYXRhKVxuXHRnZXRCZWZvcmVCb2R5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZ2V0QmVmb3JlQWZ0ZXJCb2R5TGluZXModGhpcy5fb3B0aW9ucy5jYWxsYmFja3MuYmVmb3JlQm9keS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcblx0fSxcblxuXHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtLCBkYXRhKVxuXHRnZXRCb2R5OiBmdW5jdGlvbih0b29sdGlwSXRlbXMsIGRhdGEpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjYWxsYmFja3MgPSBtZS5fb3B0aW9ucy5jYWxsYmFja3M7XG5cdFx0dmFyIGJvZHlJdGVtcyA9IFtdO1xuXG5cdFx0aGVscGVycyQxLmVhY2godG9vbHRpcEl0ZW1zLCBmdW5jdGlvbih0b29sdGlwSXRlbSkge1xuXHRcdFx0dmFyIGJvZHlJdGVtID0ge1xuXHRcdFx0XHRiZWZvcmU6IFtdLFxuXHRcdFx0XHRsaW5lczogW10sXG5cdFx0XHRcdGFmdGVyOiBbXVxuXHRcdFx0fTtcblx0XHRcdHB1c2hPckNvbmNhdChib2R5SXRlbS5iZWZvcmUsIHNwbGl0TmV3bGluZXMoY2FsbGJhY2tzLmJlZm9yZUxhYmVsLmNhbGwobWUsIHRvb2x0aXBJdGVtLCBkYXRhKSkpO1xuXHRcdFx0cHVzaE9yQ29uY2F0KGJvZHlJdGVtLmxpbmVzLCBjYWxsYmFja3MubGFiZWwuY2FsbChtZSwgdG9vbHRpcEl0ZW0sIGRhdGEpKTtcblx0XHRcdHB1c2hPckNvbmNhdChib2R5SXRlbS5hZnRlciwgc3BsaXROZXdsaW5lcyhjYWxsYmFja3MuYWZ0ZXJMYWJlbC5jYWxsKG1lLCB0b29sdGlwSXRlbSwgZGF0YSkpKTtcblxuXHRcdFx0Ym9keUl0ZW1zLnB1c2goYm9keUl0ZW0pO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGJvZHlJdGVtcztcblx0fSxcblxuXHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtLCBkYXRhKVxuXHRnZXRBZnRlckJvZHk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyh0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5hZnRlckJvZHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG5cdH0sXG5cblx0Ly8gR2V0IHRoZSBmb290ZXIgYW5kIGJlZm9yZUZvb3RlciBhbmQgYWZ0ZXJGb290ZXIgbGluZXNcblx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbSwgZGF0YSlcblx0Z2V0Rm9vdGVyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjYWxsYmFja3MgPSBtZS5fb3B0aW9ucy5jYWxsYmFja3M7XG5cblx0XHR2YXIgYmVmb3JlRm9vdGVyID0gY2FsbGJhY2tzLmJlZm9yZUZvb3Rlci5hcHBseShtZSwgYXJndW1lbnRzKTtcblx0XHR2YXIgZm9vdGVyID0gY2FsbGJhY2tzLmZvb3Rlci5hcHBseShtZSwgYXJndW1lbnRzKTtcblx0XHR2YXIgYWZ0ZXJGb290ZXIgPSBjYWxsYmFja3MuYWZ0ZXJGb290ZXIuYXBwbHkobWUsIGFyZ3VtZW50cyk7XG5cblx0XHR2YXIgbGluZXMgPSBbXTtcblx0XHRsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhiZWZvcmVGb290ZXIpKTtcblx0XHRsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhmb290ZXIpKTtcblx0XHRsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhhZnRlckZvb3RlcikpO1xuXG5cdFx0cmV0dXJuIGxpbmVzO1xuXHR9LFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24oY2hhbmdlZCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG9wdHMgPSBtZS5fb3B0aW9ucztcblxuXHRcdC8vIE5lZWQgdG8gcmVnZW5lcmF0ZSB0aGUgbW9kZWwgYmVjYXVzZSBpdHMgZmFzdGVyIHRoYW4gdXNpbmcgZXh0ZW5kIGFuZCBpdCBpcyBuZWNlc3NhcnkgZHVlIHRvIHRoZSBvcHRpbWl6YXRpb24gaW4gQ2hhcnQuRWxlbWVudC50cmFuc2l0aW9uXG5cdFx0Ly8gdGhhdCBkb2VzIF92aWV3ID0gX21vZGVsIGlmIGVhc2UgPT09IDEuIFRoaXMgY2F1c2VzIHRoZSAybmQgdG9vbHRpcCB1cGRhdGUgdG8gc2V0IHByb3BlcnRpZXMgaW4gYm90aCB0aGUgdmlldyBhbmQgbW9kZWwgYXQgdGhlIHNhbWUgdGltZVxuXHRcdC8vIHdoaWNoIGJyZWFrcyBhbnkgYW5pbWF0aW9ucy5cblx0XHR2YXIgZXhpc3RpbmdNb2RlbCA9IG1lLl9tb2RlbDtcblx0XHR2YXIgbW9kZWwgPSBtZS5fbW9kZWwgPSBnZXRCYXNlTW9kZWwob3B0cyk7XG5cdFx0dmFyIGFjdGl2ZSA9IG1lLl9hY3RpdmU7XG5cblx0XHR2YXIgZGF0YSA9IG1lLl9kYXRhO1xuXG5cdFx0Ly8gSW4gdGhlIGNhc2Ugd2hlcmUgYWN0aXZlLmxlbmd0aCA9PT0gMCB3ZSBuZWVkIHRvIGtlZXAgdGhlc2UgYXQgZXhpc3RpbmcgdmFsdWVzIGZvciBnb29kIGFuaW1hdGlvbnNcblx0XHR2YXIgYWxpZ25tZW50ID0ge1xuXHRcdFx0eEFsaWduOiBleGlzdGluZ01vZGVsLnhBbGlnbixcblx0XHRcdHlBbGlnbjogZXhpc3RpbmdNb2RlbC55QWxpZ25cblx0XHR9O1xuXHRcdHZhciBiYWNrZ3JvdW5kUG9pbnQgPSB7XG5cdFx0XHR4OiBleGlzdGluZ01vZGVsLngsXG5cdFx0XHR5OiBleGlzdGluZ01vZGVsLnlcblx0XHR9O1xuXHRcdHZhciB0b29sdGlwU2l6ZSA9IHtcblx0XHRcdHdpZHRoOiBleGlzdGluZ01vZGVsLndpZHRoLFxuXHRcdFx0aGVpZ2h0OiBleGlzdGluZ01vZGVsLmhlaWdodFxuXHRcdH07XG5cdFx0dmFyIHRvb2x0aXBQb3NpdGlvbiA9IHtcblx0XHRcdHg6IGV4aXN0aW5nTW9kZWwuY2FyZXRYLFxuXHRcdFx0eTogZXhpc3RpbmdNb2RlbC5jYXJldFlcblx0XHR9O1xuXG5cdFx0dmFyIGksIGxlbjtcblxuXHRcdGlmIChhY3RpdmUubGVuZ3RoKSB7XG5cdFx0XHRtb2RlbC5vcGFjaXR5ID0gMTtcblxuXHRcdFx0dmFyIGxhYmVsQ29sb3JzID0gW107XG5cdFx0XHR2YXIgbGFiZWxUZXh0Q29sb3JzID0gW107XG5cdFx0XHR0b29sdGlwUG9zaXRpb24gPSBwb3NpdGlvbmVyc1tvcHRzLnBvc2l0aW9uXS5jYWxsKG1lLCBhY3RpdmUsIG1lLl9ldmVudFBvc2l0aW9uKTtcblxuXHRcdFx0dmFyIHRvb2x0aXBJdGVtcyA9IFtdO1xuXHRcdFx0Zm9yIChpID0gMCwgbGVuID0gYWN0aXZlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHRcdHRvb2x0aXBJdGVtcy5wdXNoKGNyZWF0ZVRvb2x0aXBJdGVtKGFjdGl2ZVtpXSkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGUgdXNlciBwcm92aWRlZCBhIGZpbHRlciBmdW5jdGlvbiwgdXNlIGl0IHRvIG1vZGlmeSB0aGUgdG9vbHRpcCBpdGVtc1xuXHRcdFx0aWYgKG9wdHMuZmlsdGVyKSB7XG5cdFx0XHRcdHRvb2x0aXBJdGVtcyA9IHRvb2x0aXBJdGVtcy5maWx0ZXIoZnVuY3Rpb24oYSkge1xuXHRcdFx0XHRcdHJldHVybiBvcHRzLmZpbHRlcihhLCBkYXRhKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoZSB1c2VyIHByb3ZpZGVkIGEgc29ydGluZyBmdW5jdGlvbiwgdXNlIGl0IHRvIG1vZGlmeSB0aGUgdG9vbHRpcCBpdGVtc1xuXHRcdFx0aWYgKG9wdHMuaXRlbVNvcnQpIHtcblx0XHRcdFx0dG9vbHRpcEl0ZW1zID0gdG9vbHRpcEl0ZW1zLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuXHRcdFx0XHRcdHJldHVybiBvcHRzLml0ZW1Tb3J0KGEsIGIsIGRhdGEpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGNvbG9ycyBmb3IgYm94ZXNcblx0XHRcdGhlbHBlcnMkMS5lYWNoKHRvb2x0aXBJdGVtcywgZnVuY3Rpb24odG9vbHRpcEl0ZW0pIHtcblx0XHRcdFx0bGFiZWxDb2xvcnMucHVzaChvcHRzLmNhbGxiYWNrcy5sYWJlbENvbG9yLmNhbGwobWUsIHRvb2x0aXBJdGVtLCBtZS5fY2hhcnQpKTtcblx0XHRcdFx0bGFiZWxUZXh0Q29sb3JzLnB1c2gob3B0cy5jYWxsYmFja3MubGFiZWxUZXh0Q29sb3IuY2FsbChtZSwgdG9vbHRpcEl0ZW0sIG1lLl9jaGFydCkpO1xuXHRcdFx0fSk7XG5cblxuXHRcdFx0Ly8gQnVpbGQgdGhlIFRleHQgTGluZXNcblx0XHRcdG1vZGVsLnRpdGxlID0gbWUuZ2V0VGl0bGUodG9vbHRpcEl0ZW1zLCBkYXRhKTtcblx0XHRcdG1vZGVsLmJlZm9yZUJvZHkgPSBtZS5nZXRCZWZvcmVCb2R5KHRvb2x0aXBJdGVtcywgZGF0YSk7XG5cdFx0XHRtb2RlbC5ib2R5ID0gbWUuZ2V0Qm9keSh0b29sdGlwSXRlbXMsIGRhdGEpO1xuXHRcdFx0bW9kZWwuYWZ0ZXJCb2R5ID0gbWUuZ2V0QWZ0ZXJCb2R5KHRvb2x0aXBJdGVtcywgZGF0YSk7XG5cdFx0XHRtb2RlbC5mb290ZXIgPSBtZS5nZXRGb290ZXIodG9vbHRpcEl0ZW1zLCBkYXRhKTtcblxuXHRcdFx0Ly8gSW5pdGlhbCBwb3NpdGlvbmluZyBhbmQgY29sb3JzXG5cdFx0XHRtb2RlbC54ID0gdG9vbHRpcFBvc2l0aW9uLng7XG5cdFx0XHRtb2RlbC55ID0gdG9vbHRpcFBvc2l0aW9uLnk7XG5cdFx0XHRtb2RlbC5jYXJldFBhZGRpbmcgPSBvcHRzLmNhcmV0UGFkZGluZztcblx0XHRcdG1vZGVsLmxhYmVsQ29sb3JzID0gbGFiZWxDb2xvcnM7XG5cdFx0XHRtb2RlbC5sYWJlbFRleHRDb2xvcnMgPSBsYWJlbFRleHRDb2xvcnM7XG5cblx0XHRcdC8vIGRhdGEgcG9pbnRzXG5cdFx0XHRtb2RlbC5kYXRhUG9pbnRzID0gdG9vbHRpcEl0ZW1zO1xuXG5cdFx0XHQvLyBXZSBuZWVkIHRvIGRldGVybWluZSBhbGlnbm1lbnQgb2YgdGhlIHRvb2x0aXBcblx0XHRcdHRvb2x0aXBTaXplID0gZ2V0VG9vbHRpcFNpemUodGhpcywgbW9kZWwpO1xuXHRcdFx0YWxpZ25tZW50ID0gZGV0ZXJtaW5lQWxpZ25tZW50KHRoaXMsIHRvb2x0aXBTaXplKTtcblx0XHRcdC8vIEZpbmFsIFNpemUgYW5kIFBvc2l0aW9uXG5cdFx0XHRiYWNrZ3JvdW5kUG9pbnQgPSBnZXRCYWNrZ3JvdW5kUG9pbnQobW9kZWwsIHRvb2x0aXBTaXplLCBhbGlnbm1lbnQsIG1lLl9jaGFydCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1vZGVsLm9wYWNpdHkgPSAwO1xuXHRcdH1cblxuXHRcdG1vZGVsLnhBbGlnbiA9IGFsaWdubWVudC54QWxpZ247XG5cdFx0bW9kZWwueUFsaWduID0gYWxpZ25tZW50LnlBbGlnbjtcblx0XHRtb2RlbC54ID0gYmFja2dyb3VuZFBvaW50Lng7XG5cdFx0bW9kZWwueSA9IGJhY2tncm91bmRQb2ludC55O1xuXHRcdG1vZGVsLndpZHRoID0gdG9vbHRpcFNpemUud2lkdGg7XG5cdFx0bW9kZWwuaGVpZ2h0ID0gdG9vbHRpcFNpemUuaGVpZ2h0O1xuXG5cdFx0Ly8gUG9pbnQgd2hlcmUgdGhlIGNhcmV0IG9uIHRoZSB0b29sdGlwIHBvaW50cyB0b1xuXHRcdG1vZGVsLmNhcmV0WCA9IHRvb2x0aXBQb3NpdGlvbi54O1xuXHRcdG1vZGVsLmNhcmV0WSA9IHRvb2x0aXBQb3NpdGlvbi55O1xuXG5cdFx0bWUuX21vZGVsID0gbW9kZWw7XG5cblx0XHRpZiAoY2hhbmdlZCAmJiBvcHRzLmN1c3RvbSkge1xuXHRcdFx0b3B0cy5jdXN0b20uY2FsbChtZSwgbW9kZWwpO1xuXHRcdH1cblxuXHRcdHJldHVybiBtZTtcblx0fSxcblxuXHRkcmF3Q2FyZXQ6IGZ1bmN0aW9uKHRvb2x0aXBQb2ludCwgc2l6ZSkge1xuXHRcdHZhciBjdHggPSB0aGlzLl9jaGFydC5jdHg7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHR2YXIgY2FyZXRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FyZXRQb3NpdGlvbih0b29sdGlwUG9pbnQsIHNpemUsIHZtKTtcblxuXHRcdGN0eC5saW5lVG8oY2FyZXRQb3NpdGlvbi54MSwgY2FyZXRQb3NpdGlvbi55MSk7XG5cdFx0Y3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngyLCBjYXJldFBvc2l0aW9uLnkyKTtcblx0XHRjdHgubGluZVRvKGNhcmV0UG9zaXRpb24ueDMsIGNhcmV0UG9zaXRpb24ueTMpO1xuXHR9LFxuXHRnZXRDYXJldFBvc2l0aW9uOiBmdW5jdGlvbih0b29sdGlwUG9pbnQsIHNpemUsIHZtKSB7XG5cdFx0dmFyIHgxLCB4MiwgeDMsIHkxLCB5MiwgeTM7XG5cdFx0dmFyIGNhcmV0U2l6ZSA9IHZtLmNhcmV0U2l6ZTtcblx0XHR2YXIgY29ybmVyUmFkaXVzID0gdm0uY29ybmVyUmFkaXVzO1xuXHRcdHZhciB4QWxpZ24gPSB2bS54QWxpZ247XG5cdFx0dmFyIHlBbGlnbiA9IHZtLnlBbGlnbjtcblx0XHR2YXIgcHRYID0gdG9vbHRpcFBvaW50Lng7XG5cdFx0dmFyIHB0WSA9IHRvb2x0aXBQb2ludC55O1xuXHRcdHZhciB3aWR0aCA9IHNpemUud2lkdGg7XG5cdFx0dmFyIGhlaWdodCA9IHNpemUuaGVpZ2h0O1xuXG5cdFx0aWYgKHlBbGlnbiA9PT0gJ2NlbnRlcicpIHtcblx0XHRcdHkyID0gcHRZICsgKGhlaWdodCAvIDIpO1xuXG5cdFx0XHRpZiAoeEFsaWduID09PSAnbGVmdCcpIHtcblx0XHRcdFx0eDEgPSBwdFg7XG5cdFx0XHRcdHgyID0geDEgLSBjYXJldFNpemU7XG5cdFx0XHRcdHgzID0geDE7XG5cblx0XHRcdFx0eTEgPSB5MiArIGNhcmV0U2l6ZTtcblx0XHRcdFx0eTMgPSB5MiAtIGNhcmV0U2l6ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHgxID0gcHRYICsgd2lkdGg7XG5cdFx0XHRcdHgyID0geDEgKyBjYXJldFNpemU7XG5cdFx0XHRcdHgzID0geDE7XG5cblx0XHRcdFx0eTEgPSB5MiAtIGNhcmV0U2l6ZTtcblx0XHRcdFx0eTMgPSB5MiArIGNhcmV0U2l6ZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG5cdFx0XHRcdHgyID0gcHRYICsgY29ybmVyUmFkaXVzICsgKGNhcmV0U2l6ZSk7XG5cdFx0XHRcdHgxID0geDIgLSBjYXJldFNpemU7XG5cdFx0XHRcdHgzID0geDIgKyBjYXJldFNpemU7XG5cdFx0XHR9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuXHRcdFx0XHR4MiA9IHB0WCArIHdpZHRoIC0gY29ybmVyUmFkaXVzIC0gY2FyZXRTaXplO1xuXHRcdFx0XHR4MSA9IHgyIC0gY2FyZXRTaXplO1xuXHRcdFx0XHR4MyA9IHgyICsgY2FyZXRTaXplO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0eDIgPSB2bS5jYXJldFg7XG5cdFx0XHRcdHgxID0geDIgLSBjYXJldFNpemU7XG5cdFx0XHRcdHgzID0geDIgKyBjYXJldFNpemU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoeUFsaWduID09PSAndG9wJykge1xuXHRcdFx0XHR5MSA9IHB0WTtcblx0XHRcdFx0eTIgPSB5MSAtIGNhcmV0U2l6ZTtcblx0XHRcdFx0eTMgPSB5MTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHkxID0gcHRZICsgaGVpZ2h0O1xuXHRcdFx0XHR5MiA9IHkxICsgY2FyZXRTaXplO1xuXHRcdFx0XHR5MyA9IHkxO1xuXHRcdFx0XHQvLyBpbnZlcnQgZHJhd2luZyBvcmRlclxuXHRcdFx0XHR2YXIgdG1wID0geDM7XG5cdFx0XHRcdHgzID0geDE7XG5cdFx0XHRcdHgxID0gdG1wO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4ge3gxOiB4MSwgeDI6IHgyLCB4MzogeDMsIHkxOiB5MSwgeTI6IHkyLCB5MzogeTN9O1xuXHR9LFxuXG5cdGRyYXdUaXRsZTogZnVuY3Rpb24ocHQsIHZtLCBjdHgpIHtcblx0XHR2YXIgdGl0bGUgPSB2bS50aXRsZTtcblxuXHRcdGlmICh0aXRsZS5sZW5ndGgpIHtcblx0XHRcdHB0LnggPSBnZXRBbGlnbmVkWCh2bSwgdm0uX3RpdGxlQWxpZ24pO1xuXG5cdFx0XHRjdHgudGV4dEFsaWduID0gdm0uX3RpdGxlQWxpZ247XG5cdFx0XHRjdHgudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG5cblx0XHRcdHZhciB0aXRsZUZvbnRTaXplID0gdm0udGl0bGVGb250U2l6ZTtcblx0XHRcdHZhciB0aXRsZVNwYWNpbmcgPSB2bS50aXRsZVNwYWNpbmc7XG5cblx0XHRcdGN0eC5maWxsU3R5bGUgPSB2bS50aXRsZUZvbnRDb2xvcjtcblx0XHRcdGN0eC5mb250ID0gaGVscGVycyQxLmZvbnRTdHJpbmcodGl0bGVGb250U2l6ZSwgdm0uX3RpdGxlRm9udFN0eWxlLCB2bS5fdGl0bGVGb250RmFtaWx5KTtcblxuXHRcdFx0dmFyIGksIGxlbjtcblx0XHRcdGZvciAoaSA9IDAsIGxlbiA9IHRpdGxlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHRcdGN0eC5maWxsVGV4dCh0aXRsZVtpXSwgcHQueCwgcHQueSk7XG5cdFx0XHRcdHB0LnkgKz0gdGl0bGVGb250U2l6ZSArIHRpdGxlU3BhY2luZzsgLy8gTGluZSBIZWlnaHQgYW5kIHNwYWNpbmdcblxuXHRcdFx0XHRpZiAoaSArIDEgPT09IHRpdGxlLmxlbmd0aCkge1xuXHRcdFx0XHRcdHB0LnkgKz0gdm0udGl0bGVNYXJnaW5Cb3R0b20gLSB0aXRsZVNwYWNpbmc7IC8vIElmIExhc3QsIGFkZCBtYXJnaW4sIHJlbW92ZSBzcGFjaW5nXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0ZHJhd0JvZHk6IGZ1bmN0aW9uKHB0LCB2bSwgY3R4KSB7XG5cdFx0dmFyIGJvZHlGb250U2l6ZSA9IHZtLmJvZHlGb250U2l6ZTtcblx0XHR2YXIgYm9keVNwYWNpbmcgPSB2bS5ib2R5U3BhY2luZztcblx0XHR2YXIgYm9keUFsaWduID0gdm0uX2JvZHlBbGlnbjtcblx0XHR2YXIgYm9keSA9IHZtLmJvZHk7XG5cdFx0dmFyIGRyYXdDb2xvckJveGVzID0gdm0uZGlzcGxheUNvbG9ycztcblx0XHR2YXIgbGFiZWxDb2xvcnMgPSB2bS5sYWJlbENvbG9ycztcblx0XHR2YXIgeExpbmVQYWRkaW5nID0gMDtcblx0XHR2YXIgY29sb3JYID0gZHJhd0NvbG9yQm94ZXMgPyBnZXRBbGlnbmVkWCh2bSwgJ2xlZnQnKSA6IDA7XG5cdFx0dmFyIHRleHRDb2xvcjtcblxuXHRcdGN0eC50ZXh0QWxpZ24gPSBib2R5QWxpZ247XG5cdFx0Y3R4LnRleHRCYXNlbGluZSA9ICd0b3AnO1xuXHRcdGN0eC5mb250ID0gaGVscGVycyQxLmZvbnRTdHJpbmcoYm9keUZvbnRTaXplLCB2bS5fYm9keUZvbnRTdHlsZSwgdm0uX2JvZHlGb250RmFtaWx5KTtcblxuXHRcdHB0LnggPSBnZXRBbGlnbmVkWCh2bSwgYm9keUFsaWduKTtcblxuXHRcdC8vIEJlZm9yZSBCb2R5XG5cdFx0dmFyIGZpbGxMaW5lT2ZUZXh0ID0gZnVuY3Rpb24obGluZSkge1xuXHRcdFx0Y3R4LmZpbGxUZXh0KGxpbmUsIHB0LnggKyB4TGluZVBhZGRpbmcsIHB0LnkpO1xuXHRcdFx0cHQueSArPSBib2R5Rm9udFNpemUgKyBib2R5U3BhY2luZztcblx0XHR9O1xuXG5cdFx0Ly8gQmVmb3JlIGJvZHkgbGluZXNcblx0XHRjdHguZmlsbFN0eWxlID0gdm0uYm9keUZvbnRDb2xvcjtcblx0XHRoZWxwZXJzJDEuZWFjaCh2bS5iZWZvcmVCb2R5LCBmaWxsTGluZU9mVGV4dCk7XG5cblx0XHR4TGluZVBhZGRpbmcgPSBkcmF3Q29sb3JCb3hlcyAmJiBib2R5QWxpZ24gIT09ICdyaWdodCdcblx0XHRcdD8gYm9keUFsaWduID09PSAnY2VudGVyJyA/IChib2R5Rm9udFNpemUgLyAyICsgMSkgOiAoYm9keUZvbnRTaXplICsgMilcblx0XHRcdDogMDtcblxuXHRcdC8vIERyYXcgYm9keSBsaW5lcyBub3dcblx0XHRoZWxwZXJzJDEuZWFjaChib2R5LCBmdW5jdGlvbihib2R5SXRlbSwgaSkge1xuXHRcdFx0dGV4dENvbG9yID0gdm0ubGFiZWxUZXh0Q29sb3JzW2ldO1xuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHRleHRDb2xvcjtcblx0XHRcdGhlbHBlcnMkMS5lYWNoKGJvZHlJdGVtLmJlZm9yZSwgZmlsbExpbmVPZlRleHQpO1xuXG5cdFx0XHRoZWxwZXJzJDEuZWFjaChib2R5SXRlbS5saW5lcywgZnVuY3Rpb24obGluZSkge1xuXHRcdFx0XHQvLyBEcmF3IExlZ2VuZC1saWtlIGJveGVzIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoZHJhd0NvbG9yQm94ZXMpIHtcblx0XHRcdFx0XHQvLyBGaWxsIGEgd2hpdGUgcmVjdCBzbyB0aGF0IGNvbG91cnMgbWVyZ2UgbmljZWx5IGlmIHRoZSBvcGFjaXR5IGlzIDwgMVxuXHRcdFx0XHRcdGN0eC5maWxsU3R5bGUgPSB2bS5sZWdlbmRDb2xvckJhY2tncm91bmQ7XG5cdFx0XHRcdFx0Y3R4LmZpbGxSZWN0KGNvbG9yWCwgcHQueSwgYm9keUZvbnRTaXplLCBib2R5Rm9udFNpemUpO1xuXG5cdFx0XHRcdFx0Ly8gQm9yZGVyXG5cdFx0XHRcdFx0Y3R4LmxpbmVXaWR0aCA9IDE7XG5cdFx0XHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gbGFiZWxDb2xvcnNbaV0uYm9yZGVyQ29sb3I7XG5cdFx0XHRcdFx0Y3R4LnN0cm9rZVJlY3QoY29sb3JYLCBwdC55LCBib2R5Rm9udFNpemUsIGJvZHlGb250U2l6ZSk7XG5cblx0XHRcdFx0XHQvLyBJbm5lciBzcXVhcmVcblx0XHRcdFx0XHRjdHguZmlsbFN0eWxlID0gbGFiZWxDb2xvcnNbaV0uYmFja2dyb3VuZENvbG9yO1xuXHRcdFx0XHRcdGN0eC5maWxsUmVjdChjb2xvclggKyAxLCBwdC55ICsgMSwgYm9keUZvbnRTaXplIC0gMiwgYm9keUZvbnRTaXplIC0gMik7XG5cdFx0XHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHRleHRDb2xvcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZpbGxMaW5lT2ZUZXh0KGxpbmUpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGhlbHBlcnMkMS5lYWNoKGJvZHlJdGVtLmFmdGVyLCBmaWxsTGluZU9mVGV4dCk7XG5cdFx0fSk7XG5cblx0XHQvLyBSZXNldCBiYWNrIHRvIDAgZm9yIGFmdGVyIGJvZHlcblx0XHR4TGluZVBhZGRpbmcgPSAwO1xuXG5cdFx0Ly8gQWZ0ZXIgYm9keSBsaW5lc1xuXHRcdGhlbHBlcnMkMS5lYWNoKHZtLmFmdGVyQm9keSwgZmlsbExpbmVPZlRleHQpO1xuXHRcdHB0LnkgLT0gYm9keVNwYWNpbmc7IC8vIFJlbW92ZSBsYXN0IGJvZHkgc3BhY2luZ1xuXHR9LFxuXG5cdGRyYXdGb290ZXI6IGZ1bmN0aW9uKHB0LCB2bSwgY3R4KSB7XG5cdFx0dmFyIGZvb3RlciA9IHZtLmZvb3RlcjtcblxuXHRcdGlmIChmb290ZXIubGVuZ3RoKSB7XG5cdFx0XHRwdC54ID0gZ2V0QWxpZ25lZFgodm0sIHZtLl9mb290ZXJBbGlnbik7XG5cdFx0XHRwdC55ICs9IHZtLmZvb3Rlck1hcmdpblRvcDtcblxuXHRcdFx0Y3R4LnRleHRBbGlnbiA9IHZtLl9mb290ZXJBbGlnbjtcblx0XHRcdGN0eC50ZXh0QmFzZWxpbmUgPSAndG9wJztcblxuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHZtLmZvb3RlckZvbnRDb2xvcjtcblx0XHRcdGN0eC5mb250ID0gaGVscGVycyQxLmZvbnRTdHJpbmcodm0uZm9vdGVyRm9udFNpemUsIHZtLl9mb290ZXJGb250U3R5bGUsIHZtLl9mb290ZXJGb250RmFtaWx5KTtcblxuXHRcdFx0aGVscGVycyQxLmVhY2goZm9vdGVyLCBmdW5jdGlvbihsaW5lKSB7XG5cdFx0XHRcdGN0eC5maWxsVGV4dChsaW5lLCBwdC54LCBwdC55KTtcblx0XHRcdFx0cHQueSArPSB2bS5mb290ZXJGb250U2l6ZSArIHZtLmZvb3RlclNwYWNpbmc7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0ZHJhd0JhY2tncm91bmQ6IGZ1bmN0aW9uKHB0LCB2bSwgY3R4LCB0b29sdGlwU2l6ZSkge1xuXHRcdGN0eC5maWxsU3R5bGUgPSB2bS5iYWNrZ3JvdW5kQ29sb3I7XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gdm0uYm9yZGVyQ29sb3I7XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IHZtLmJvcmRlcldpZHRoO1xuXHRcdHZhciB4QWxpZ24gPSB2bS54QWxpZ247XG5cdFx0dmFyIHlBbGlnbiA9IHZtLnlBbGlnbjtcblx0XHR2YXIgeCA9IHB0Lng7XG5cdFx0dmFyIHkgPSBwdC55O1xuXHRcdHZhciB3aWR0aCA9IHRvb2x0aXBTaXplLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSB0b29sdGlwU2l6ZS5oZWlnaHQ7XG5cdFx0dmFyIHJhZGl1cyA9IHZtLmNvcm5lclJhZGl1cztcblxuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRjdHgubW92ZVRvKHggKyByYWRpdXMsIHkpO1xuXHRcdGlmICh5QWxpZ24gPT09ICd0b3AnKSB7XG5cdFx0XHR0aGlzLmRyYXdDYXJldChwdCwgdG9vbHRpcFNpemUpO1xuXHRcdH1cblx0XHRjdHgubGluZVRvKHggKyB3aWR0aCAtIHJhZGl1cywgeSk7XG5cdFx0Y3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyByYWRpdXMpO1xuXHRcdGlmICh5QWxpZ24gPT09ICdjZW50ZXInICYmIHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuXHRcdFx0dGhpcy5kcmF3Q2FyZXQocHQsIHRvb2x0aXBTaXplKTtcblx0XHR9XG5cdFx0Y3R4LmxpbmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSByYWRpdXMpO1xuXHRcdGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCArIHdpZHRoIC0gcmFkaXVzLCB5ICsgaGVpZ2h0KTtcblx0XHRpZiAoeUFsaWduID09PSAnYm90dG9tJykge1xuXHRcdFx0dGhpcy5kcmF3Q2FyZXQocHQsIHRvb2x0aXBTaXplKTtcblx0XHR9XG5cdFx0Y3R4LmxpbmVUbyh4ICsgcmFkaXVzLCB5ICsgaGVpZ2h0KTtcblx0XHRjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5ICsgaGVpZ2h0LCB4LCB5ICsgaGVpZ2h0IC0gcmFkaXVzKTtcblx0XHRpZiAoeUFsaWduID09PSAnY2VudGVyJyAmJiB4QWxpZ24gPT09ICdsZWZ0Jykge1xuXHRcdFx0dGhpcy5kcmF3Q2FyZXQocHQsIHRvb2x0aXBTaXplKTtcblx0XHR9XG5cdFx0Y3R4LmxpbmVUbyh4LCB5ICsgcmFkaXVzKTtcblx0XHRjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5LCB4ICsgcmFkaXVzLCB5KTtcblx0XHRjdHguY2xvc2VQYXRoKCk7XG5cblx0XHRjdHguZmlsbCgpO1xuXG5cdFx0aWYgKHZtLmJvcmRlcldpZHRoID4gMCkge1xuXHRcdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdH1cblx0fSxcblxuXHRkcmF3OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY3R4ID0gdGhpcy5fY2hhcnQuY3R4O1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cblx0XHRpZiAodm0ub3BhY2l0eSA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciB0b29sdGlwU2l6ZSA9IHtcblx0XHRcdHdpZHRoOiB2bS53aWR0aCxcblx0XHRcdGhlaWdodDogdm0uaGVpZ2h0XG5cdFx0fTtcblx0XHR2YXIgcHQgPSB7XG5cdFx0XHR4OiB2bS54LFxuXHRcdFx0eTogdm0ueVxuXHRcdH07XG5cblx0XHQvLyBJRTExL0VkZ2UgZG9lcyBub3QgbGlrZSB2ZXJ5IHNtYWxsIG9wYWNpdGllcywgc28gc25hcCB0byAwXG5cdFx0dmFyIG9wYWNpdHkgPSBNYXRoLmFicyh2bS5vcGFjaXR5IDwgMWUtMykgPyAwIDogdm0ub3BhY2l0eTtcblxuXHRcdC8vIFRydXRoeS9mYWxzZXkgdmFsdWUgZm9yIGVtcHR5IHRvb2x0aXBcblx0XHR2YXIgaGFzVG9vbHRpcENvbnRlbnQgPSB2bS50aXRsZS5sZW5ndGggfHwgdm0uYmVmb3JlQm9keS5sZW5ndGggfHwgdm0uYm9keS5sZW5ndGggfHwgdm0uYWZ0ZXJCb2R5Lmxlbmd0aCB8fCB2bS5mb290ZXIubGVuZ3RoO1xuXG5cdFx0aWYgKHRoaXMuX29wdGlvbnMuZW5hYmxlZCAmJiBoYXNUb29sdGlwQ29udGVudCkge1xuXHRcdFx0Y3R4LnNhdmUoKTtcblx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG5cblx0XHRcdC8vIERyYXcgQmFja2dyb3VuZFxuXHRcdFx0dGhpcy5kcmF3QmFja2dyb3VuZChwdCwgdm0sIGN0eCwgdG9vbHRpcFNpemUpO1xuXG5cdFx0XHQvLyBEcmF3IFRpdGxlLCBCb2R5LCBhbmQgRm9vdGVyXG5cdFx0XHRwdC55ICs9IHZtLnlQYWRkaW5nO1xuXG5cdFx0XHQvLyBUaXRsZXNcblx0XHRcdHRoaXMuZHJhd1RpdGxlKHB0LCB2bSwgY3R4KTtcblxuXHRcdFx0Ly8gQm9keVxuXHRcdFx0dGhpcy5kcmF3Qm9keShwdCwgdm0sIGN0eCk7XG5cblx0XHRcdC8vIEZvb3RlclxuXHRcdFx0dGhpcy5kcmF3Rm9vdGVyKHB0LCB2bSwgY3R4KTtcblxuXHRcdFx0Y3R4LnJlc3RvcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEhhbmRsZSBhbiBldmVudFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0lFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gaGFuZGxlXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSB0b29sdGlwIGNoYW5nZWRcblx0ICovXG5cdGhhbmRsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb3B0aW9ucyA9IG1lLl9vcHRpb25zO1xuXHRcdHZhciBjaGFuZ2VkID0gZmFsc2U7XG5cblx0XHRtZS5fbGFzdEFjdGl2ZSA9IG1lLl9sYXN0QWN0aXZlIHx8IFtdO1xuXG5cdFx0Ly8gRmluZCBBY3RpdmUgRWxlbWVudHMgZm9yIHRvb2x0aXBzXG5cdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuXHRcdFx0bWUuX2FjdGl2ZSA9IFtdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZS5fYWN0aXZlID0gbWUuX2NoYXJ0LmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSwgb3B0aW9ucy5tb2RlLCBvcHRpb25zKTtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciBMYXN0IEFjdGl2ZXNcblx0XHRjaGFuZ2VkID0gIWhlbHBlcnMkMS5hcnJheUVxdWFscyhtZS5fYWN0aXZlLCBtZS5fbGFzdEFjdGl2ZSk7XG5cblx0XHQvLyBPbmx5IGhhbmRsZSB0YXJnZXQgZXZlbnQgb24gdG9vbHRpcCBjaGFuZ2Vcblx0XHRpZiAoY2hhbmdlZCkge1xuXHRcdFx0bWUuX2xhc3RBY3RpdmUgPSBtZS5fYWN0aXZlO1xuXG5cdFx0XHRpZiAob3B0aW9ucy5lbmFibGVkIHx8IG9wdGlvbnMuY3VzdG9tKSB7XG5cdFx0XHRcdG1lLl9ldmVudFBvc2l0aW9uID0ge1xuXHRcdFx0XHRcdHg6IGUueCxcblx0XHRcdFx0XHR5OiBlLnlcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRtZS51cGRhdGUodHJ1ZSk7XG5cdFx0XHRcdG1lLnBpdm90KCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNoYW5nZWQ7XG5cdH1cbn0pO1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuVG9vbHRpcC5wb3NpdGlvbmVyc1xuICovXG52YXIgcG9zaXRpb25lcnNfMSA9IHBvc2l0aW9uZXJzO1xuXG52YXIgY29yZV90b29sdGlwID0gZXhwb3J0cyQzO1xuY29yZV90b29sdGlwLnBvc2l0aW9uZXJzID0gcG9zaXRpb25lcnNfMTtcblxudmFyIHZhbHVlT3JEZWZhdWx0JDggPSBoZWxwZXJzJDEudmFsdWVPckRlZmF1bHQ7XG5cbmNvcmVfZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xuXHRlbGVtZW50czoge30sXG5cdGV2ZW50czogW1xuXHRcdCdtb3VzZW1vdmUnLFxuXHRcdCdtb3VzZW91dCcsXG5cdFx0J2NsaWNrJyxcblx0XHQndG91Y2hzdGFydCcsXG5cdFx0J3RvdWNobW92ZSdcblx0XSxcblx0aG92ZXI6IHtcblx0XHRvbkhvdmVyOiBudWxsLFxuXHRcdG1vZGU6ICduZWFyZXN0Jyxcblx0XHRpbnRlcnNlY3Q6IHRydWUsXG5cdFx0YW5pbWF0aW9uRHVyYXRpb246IDQwMFxuXHR9LFxuXHRvbkNsaWNrOiBudWxsLFxuXHRtYWludGFpbkFzcGVjdFJhdGlvOiB0cnVlLFxuXHRyZXNwb25zaXZlOiB0cnVlLFxuXHRyZXNwb25zaXZlQW5pbWF0aW9uRHVyYXRpb246IDBcbn0pO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IG1lcmdlIHRoZSBnaXZlbiBjb25maWcgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGBzY2FsZXNgIG9wdGlvblxuICogYnkgaW5jb3Jwb3JhdGluZyBzY2FsZSBkZWZhdWx0cyBpbiBgeEF4ZXNgIGFuZCBgeUF4ZXNgIGFycmF5IGl0ZW1zLCB0aGVuXG4gKiByZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoZSByZXN1bHQsIHRodXMgZG9lc24ndCBhbHRlciBpbnB1dHMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlU2NhbGVDb25maWcoLyogY29uZmlnIG9iamVjdHMgLi4uICovKSB7XG5cdHJldHVybiBoZWxwZXJzJDEubWVyZ2Uoe30sIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSwge1xuXHRcdG1lcmdlcjogZnVuY3Rpb24oa2V5LCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdFx0aWYgKGtleSA9PT0gJ3hBeGVzJyB8fCBrZXkgPT09ICd5QXhlcycpIHtcblx0XHRcdFx0dmFyIHNsZW4gPSBzb3VyY2Vba2V5XS5sZW5ndGg7XG5cdFx0XHRcdHZhciBpLCB0eXBlLCBzY2FsZTtcblxuXHRcdFx0XHRpZiAoIXRhcmdldFtrZXldKSB7XG5cdFx0XHRcdFx0dGFyZ2V0W2tleV0gPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBzbGVuOyArK2kpIHtcblx0XHRcdFx0XHRzY2FsZSA9IHNvdXJjZVtrZXldW2ldO1xuXHRcdFx0XHRcdHR5cGUgPSB2YWx1ZU9yRGVmYXVsdCQ4KHNjYWxlLnR5cGUsIGtleSA9PT0gJ3hBeGVzJyA/ICdjYXRlZ29yeScgOiAnbGluZWFyJyk7XG5cblx0XHRcdFx0XHRpZiAoaSA+PSB0YXJnZXRba2V5XS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHRhcmdldFtrZXldLnB1c2goe30pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghdGFyZ2V0W2tleV1baV0udHlwZSB8fCAoc2NhbGUudHlwZSAmJiBzY2FsZS50eXBlICE9PSB0YXJnZXRba2V5XVtpXS50eXBlKSkge1xuXHRcdFx0XHRcdFx0Ly8gbmV3L3VudHlwZWQgc2NhbGUgb3IgdHlwZSBjaGFuZ2VkOiBsZXQncyBhcHBseSB0aGUgbmV3IGRlZmF1bHRzXG5cdFx0XHRcdFx0XHQvLyB0aGVuIG1lcmdlIHNvdXJjZSBzY2FsZSB0byBjb3JyZWN0bHkgb3ZlcndyaXRlIHRoZSBkZWZhdWx0cy5cblx0XHRcdFx0XHRcdGhlbHBlcnMkMS5tZXJnZSh0YXJnZXRba2V5XVtpXSwgW2NvcmVfc2NhbGVTZXJ2aWNlLmdldFNjYWxlRGVmYXVsdHModHlwZSksIHNjYWxlXSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIHNjYWxlcyB0eXBlIGFyZSB0aGUgc2FtZVxuXHRcdFx0XHRcdFx0aGVscGVycyQxLm1lcmdlKHRhcmdldFtrZXldW2ldLCBzY2FsZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoZWxwZXJzJDEuX21lcmdlcihrZXksIHRhcmdldCwgc291cmNlLCBvcHRpb25zKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IG1lcmdlIHRoZSBnaXZlbiBjb25maWcgb2JqZWN0cyBhcyB0aGUgcm9vdCBvcHRpb25zIGJ5IGhhbmRsaW5nXG4gKiBkZWZhdWx0IHNjYWxlIG9wdGlvbnMgZm9yIHRoZSBgc2NhbGVzYCBhbmQgYHNjYWxlYCBwcm9wZXJ0aWVzLCB0aGVuIHJldHVybnNcbiAqIGEgZGVlcCBjb3B5IG9mIHRoZSByZXN1bHQsIHRodXMgZG9lc24ndCBhbHRlciBpbnB1dHMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnKC8qIGNvbmZpZyBvYmplY3RzIC4uLiAqLykge1xuXHRyZXR1cm4gaGVscGVycyQxLm1lcmdlKHt9LCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyksIHtcblx0XHRtZXJnZXI6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcblx0XHRcdHZhciB0dmFsID0gdGFyZ2V0W2tleV0gfHwge307XG5cdFx0XHR2YXIgc3ZhbCA9IHNvdXJjZVtrZXldO1xuXG5cdFx0XHRpZiAoa2V5ID09PSAnc2NhbGVzJykge1xuXHRcdFx0XHQvLyBzY2FsZSBjb25maWcgbWVyZ2luZyBpcyBjb21wbGV4LiBBZGQgb3VyIG93biBmdW5jdGlvbiBoZXJlIGZvciB0aGF0XG5cdFx0XHRcdHRhcmdldFtrZXldID0gbWVyZ2VTY2FsZUNvbmZpZyh0dmFsLCBzdmFsKTtcblx0XHRcdH0gZWxzZSBpZiAoa2V5ID09PSAnc2NhbGUnKSB7XG5cdFx0XHRcdC8vIHVzZWQgaW4gcG9sYXIgYXJlYSAmIHJhZGFyIGNoYXJ0cyBzaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSBzY2FsZVxuXHRcdFx0XHR0YXJnZXRba2V5XSA9IGhlbHBlcnMkMS5tZXJnZSh0dmFsLCBbY29yZV9zY2FsZVNlcnZpY2UuZ2V0U2NhbGVEZWZhdWx0cyhzdmFsLnR5cGUpLCBzdmFsXSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoZWxwZXJzJDEuX21lcmdlcihrZXksIHRhcmdldCwgc291cmNlLCBvcHRpb25zKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBpbml0Q29uZmlnKGNvbmZpZykge1xuXHRjb25maWcgPSBjb25maWcgfHwge307XG5cblx0Ly8gRG8gTk9UIHVzZSBtZXJnZUNvbmZpZyBmb3IgdGhlIGRhdGEgb2JqZWN0IGJlY2F1c2UgdGhpcyBtZXRob2QgbWVyZ2VzIGFycmF5c1xuXHQvLyBhbmQgc28gd291bGQgY2hhbmdlIHJlZmVyZW5jZXMgdG8gbGFiZWxzIGFuZCBkYXRhc2V0cywgcHJldmVudGluZyBkYXRhIHVwZGF0ZXMuXG5cdHZhciBkYXRhID0gY29uZmlnLmRhdGEgPSBjb25maWcuZGF0YSB8fCB7fTtcblx0ZGF0YS5kYXRhc2V0cyA9IGRhdGEuZGF0YXNldHMgfHwgW107XG5cdGRhdGEubGFiZWxzID0gZGF0YS5sYWJlbHMgfHwgW107XG5cblx0Y29uZmlnLm9wdGlvbnMgPSBtZXJnZUNvbmZpZyhcblx0XHRjb3JlX2RlZmF1bHRzLmdsb2JhbCxcblx0XHRjb3JlX2RlZmF1bHRzW2NvbmZpZy50eXBlXSxcblx0XHRjb25maWcub3B0aW9ucyB8fCB7fSk7XG5cblx0cmV0dXJuIGNvbmZpZztcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29uZmlnKGNoYXJ0KSB7XG5cdHZhciBuZXdPcHRpb25zID0gY2hhcnQub3B0aW9ucztcblxuXHRoZWxwZXJzJDEuZWFjaChjaGFydC5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlKSB7XG5cdFx0Y29yZV9sYXlvdXRzLnJlbW92ZUJveChjaGFydCwgc2NhbGUpO1xuXHR9KTtcblxuXHRuZXdPcHRpb25zID0gbWVyZ2VDb25maWcoXG5cdFx0Y29yZV9kZWZhdWx0cy5nbG9iYWwsXG5cdFx0Y29yZV9kZWZhdWx0c1tjaGFydC5jb25maWcudHlwZV0sXG5cdFx0bmV3T3B0aW9ucyk7XG5cblx0Y2hhcnQub3B0aW9ucyA9IGNoYXJ0LmNvbmZpZy5vcHRpb25zID0gbmV3T3B0aW9ucztcblx0Y2hhcnQuZW5zdXJlU2NhbGVzSGF2ZUlEcygpO1xuXHRjaGFydC5idWlsZE9yVXBkYXRlU2NhbGVzKCk7XG5cblx0Ly8gVG9vbHRpcFxuXHRjaGFydC50b29sdGlwLl9vcHRpb25zID0gbmV3T3B0aW9ucy50b29sdGlwcztcblx0Y2hhcnQudG9vbHRpcC5pbml0aWFsaXplKCk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uSXNIb3Jpem9udGFsKHBvc2l0aW9uKSB7XG5cdHJldHVybiBwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcG9zaXRpb24gPT09ICdib3R0b20nO1xufVxuXG52YXIgQ2hhcnQgPSBmdW5jdGlvbihpdGVtLCBjb25maWcpIHtcblx0dGhpcy5jb25zdHJ1Y3QoaXRlbSwgY29uZmlnKTtcblx0cmV0dXJuIHRoaXM7XG59O1xuXG5oZWxwZXJzJDEuZXh0ZW5kKENoYXJ0LnByb3RvdHlwZSwgLyoqIEBsZW5kcyBDaGFydCAqLyB7XG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Y29uc3RydWN0OiBmdW5jdGlvbihpdGVtLCBjb25maWcpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0Y29uZmlnID0gaW5pdENvbmZpZyhjb25maWcpO1xuXG5cdFx0dmFyIGNvbnRleHQgPSBwbGF0Zm9ybS5hY3F1aXJlQ29udGV4dChpdGVtLCBjb25maWcpO1xuXHRcdHZhciBjYW52YXMgPSBjb250ZXh0ICYmIGNvbnRleHQuY2FudmFzO1xuXHRcdHZhciBoZWlnaHQgPSBjYW52YXMgJiYgY2FudmFzLmhlaWdodDtcblx0XHR2YXIgd2lkdGggPSBjYW52YXMgJiYgY2FudmFzLndpZHRoO1xuXG5cdFx0bWUuaWQgPSBoZWxwZXJzJDEudWlkKCk7XG5cdFx0bWUuY3R4ID0gY29udGV4dDtcblx0XHRtZS5jYW52YXMgPSBjYW52YXM7XG5cdFx0bWUuY29uZmlnID0gY29uZmlnO1xuXHRcdG1lLndpZHRoID0gd2lkdGg7XG5cdFx0bWUuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdG1lLmFzcGVjdFJhdGlvID0gaGVpZ2h0ID8gd2lkdGggLyBoZWlnaHQgOiBudWxsO1xuXHRcdG1lLm9wdGlvbnMgPSBjb25maWcub3B0aW9ucztcblx0XHRtZS5fYnVmZmVyZWRSZW5kZXIgPSBmYWxzZTtcblxuXHRcdC8qKlxuXHRcdCAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBDaGFydCBhbmQgQ2hhcnQuQ29udHJvbGxlciBoYXZlIGJlZW4gbWVyZ2VkLFxuXHRcdCAqIHRoZSBcImluc3RhbmNlXCIgc3RpbGwgbmVlZCB0byBiZSBkZWZpbmVkIHNpbmNlIGl0IG1pZ2h0IGJlIGNhbGxlZCBmcm9tIHBsdWdpbnMuXG5cdFx0ICogQHByb3AgQ2hhcnQjY2hhcnRcblx0XHQgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNi4wXG5cdFx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0bWUuY2hhcnQgPSBtZTtcblx0XHRtZS5jb250cm9sbGVyID0gbWU7IC8vIGNoYXJ0LmNoYXJ0LmNvbnRyb2xsZXIgI2luY2VwdGlvblxuXG5cdFx0Ly8gQWRkIHRoZSBjaGFydCBpbnN0YW5jZSB0byB0aGUgZ2xvYmFsIG5hbWVzcGFjZVxuXHRcdENoYXJ0Lmluc3RhbmNlc1ttZS5pZF0gPSBtZTtcblxuXHRcdC8vIERlZmluZSBhbGlhcyB0byB0aGUgY29uZmlnIGRhdGE6IGBjaGFydC5kYXRhID09PSBjaGFydC5jb25maWcuZGF0YWBcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobWUsICdkYXRhJywge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1lLmNvbmZpZy5kYXRhO1xuXHRcdFx0fSxcblx0XHRcdHNldDogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdFx0bWUuY29uZmlnLmRhdGEgPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGlmICghY29udGV4dCB8fCAhY2FudmFzKSB7XG5cdFx0XHQvLyBUaGUgZ2l2ZW4gaXRlbSBpcyBub3QgYSBjb21wYXRpYmxlIGNvbnRleHQyZCBlbGVtZW50LCBsZXQncyByZXR1cm4gYmVmb3JlIGZpbmFsaXppbmdcblx0XHRcdC8vIHRoZSBjaGFydCBpbml0aWFsaXphdGlvbiBidXQgYWZ0ZXIgc2V0dGluZyBiYXNpYyBjaGFydCAvIGNvbnRyb2xsZXIgcHJvcGVydGllcyB0aGF0XG5cdFx0XHQvLyBjYW4gaGVscCB0byBmaWd1cmUgb3V0IHRoYXQgdGhlIGNoYXJ0IGlzIG5vdCB2YWxpZCAoZS5nIGNoYXJ0LmNhbnZhcyAhPT0gbnVsbCk7XG5cdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjgwN1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgY2hhcnQ6IGNhbid0IGFjcXVpcmUgY29udGV4dCBmcm9tIHRoZSBnaXZlbiBpdGVtXCIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdG1lLmluaXRpYWxpemUoKTtcblx0XHRtZS51cGRhdGUoKTtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHQvLyBCZWZvcmUgaW5pdCBwbHVnaW4gbm90aWZpY2F0aW9uXG5cdFx0Y29yZV9wbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZUluaXQnKTtcblxuXHRcdGhlbHBlcnMkMS5yZXRpbmFTY2FsZShtZSwgbWUub3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvKTtcblxuXHRcdG1lLmJpbmRFdmVudHMoKTtcblxuXHRcdGlmIChtZS5vcHRpb25zLnJlc3BvbnNpdmUpIHtcblx0XHRcdC8vIEluaXRpYWwgcmVzaXplIGJlZm9yZSBjaGFydCBkcmF3cyAobXVzdCBiZSBzaWxlbnQgdG8gcHJlc2VydmUgaW5pdGlhbCBhbmltYXRpb25zKS5cblx0XHRcdG1lLnJlc2l6ZSh0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgc2NhbGVzIGhhdmUgSURzIGFuZCBhcmUgYnVpbHQgYmVmb3JlIHdlIGJ1aWxkIGFueSBjb250cm9sbGVycy5cblx0XHRtZS5lbnN1cmVTY2FsZXNIYXZlSURzKCk7XG5cdFx0bWUuYnVpbGRPclVwZGF0ZVNjYWxlcygpO1xuXHRcdG1lLmluaXRUb29sVGlwKCk7XG5cblx0XHQvLyBBZnRlciBpbml0IHBsdWdpbiBub3RpZmljYXRpb25cblx0XHRjb3JlX3BsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJJbml0Jyk7XG5cblx0XHRyZXR1cm4gbWU7XG5cdH0sXG5cblx0Y2xlYXI6IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMkMS5jYW52YXMuY2xlYXIodGhpcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gU3RvcHMgYW55IGN1cnJlbnQgYW5pbWF0aW9uIGxvb3Agb2NjdXJyaW5nXG5cdFx0Y29yZV9hbmltYXRpb25zLmNhbmNlbEFuaW1hdGlvbih0aGlzKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZXNpemU6IGZ1bmN0aW9uKHNpbGVudCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG9wdGlvbnMgPSBtZS5vcHRpb25zO1xuXHRcdHZhciBjYW52YXMgPSBtZS5jYW52YXM7XG5cdFx0dmFyIGFzcGVjdFJhdGlvID0gKG9wdGlvbnMubWFpbnRhaW5Bc3BlY3RSYXRpbyAmJiBtZS5hc3BlY3RSYXRpbykgfHwgbnVsbDtcblxuXHRcdC8vIHRoZSBjYW52YXMgcmVuZGVyIHdpZHRoIGFuZCBoZWlnaHQgd2lsbCBiZSBjYXN0ZWQgdG8gaW50ZWdlcnMgc28gbWFrZSBzdXJlIHRoYXRcblx0XHQvLyB0aGUgY2FudmFzIGRpc3BsYXkgc3R5bGUgdXNlcyB0aGUgc2FtZSBpbnRlZ2VyIHZhbHVlcyB0byBhdm9pZCBibHVycmluZyBlZmZlY3QuXG5cblx0XHQvLyBTZXQgdG8gMCBpbnN0ZWFkIG9mIGNhbnZhcy5zaXplIGJlY2F1c2UgdGhlIHNpemUgZGVmYXVsdHMgdG8gMzAweDE1MCBpZiB0aGUgZWxlbWVudCBpcyBjb2xsYXBzZWRcblx0XHR2YXIgbmV3V2lkdGggPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKGhlbHBlcnMkMS5nZXRNYXhpbXVtV2lkdGgoY2FudmFzKSkpO1xuXHRcdHZhciBuZXdIZWlnaHQgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKGFzcGVjdFJhdGlvID8gbmV3V2lkdGggLyBhc3BlY3RSYXRpbyA6IGhlbHBlcnMkMS5nZXRNYXhpbXVtSGVpZ2h0KGNhbnZhcykpKTtcblxuXHRcdGlmIChtZS53aWR0aCA9PT0gbmV3V2lkdGggJiYgbWUuaGVpZ2h0ID09PSBuZXdIZWlnaHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjYW52YXMud2lkdGggPSBtZS53aWR0aCA9IG5ld1dpZHRoO1xuXHRcdGNhbnZhcy5oZWlnaHQgPSBtZS5oZWlnaHQgPSBuZXdIZWlnaHQ7XG5cdFx0Y2FudmFzLnN0eWxlLndpZHRoID0gbmV3V2lkdGggKyAncHgnO1xuXHRcdGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBuZXdIZWlnaHQgKyAncHgnO1xuXG5cdFx0aGVscGVycyQxLnJldGluYVNjYWxlKG1lLCBvcHRpb25zLmRldmljZVBpeGVsUmF0aW8pO1xuXG5cdFx0aWYgKCFzaWxlbnQpIHtcblx0XHRcdC8vIE5vdGlmeSBhbnkgcGx1Z2lucyBhYm91dCB0aGUgcmVzaXplXG5cdFx0XHR2YXIgbmV3U2l6ZSA9IHt3aWR0aDogbmV3V2lkdGgsIGhlaWdodDogbmV3SGVpZ2h0fTtcblx0XHRcdGNvcmVfcGx1Z2lucy5ub3RpZnkobWUsICdyZXNpemUnLCBbbmV3U2l6ZV0pO1xuXG5cdFx0XHQvLyBOb3RpZnkgb2YgcmVzaXplXG5cdFx0XHRpZiAob3B0aW9ucy5vblJlc2l6ZSkge1xuXHRcdFx0XHRvcHRpb25zLm9uUmVzaXplKG1lLCBuZXdTaXplKTtcblx0XHRcdH1cblxuXHRcdFx0bWUuc3RvcCgpO1xuXHRcdFx0bWUudXBkYXRlKHtcblx0XHRcdFx0ZHVyYXRpb246IG9wdGlvbnMucmVzcG9uc2l2ZUFuaW1hdGlvbkR1cmF0aW9uXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0ZW5zdXJlU2NhbGVzSGF2ZUlEczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cdFx0dmFyIHNjYWxlc09wdGlvbnMgPSBvcHRpb25zLnNjYWxlcyB8fCB7fTtcblx0XHR2YXIgc2NhbGVPcHRpb25zID0gb3B0aW9ucy5zY2FsZTtcblxuXHRcdGhlbHBlcnMkMS5lYWNoKHNjYWxlc09wdGlvbnMueEF4ZXMsIGZ1bmN0aW9uKHhBeGlzT3B0aW9ucywgaW5kZXgpIHtcblx0XHRcdHhBeGlzT3B0aW9ucy5pZCA9IHhBeGlzT3B0aW9ucy5pZCB8fCAoJ3gtYXhpcy0nICsgaW5kZXgpO1xuXHRcdH0pO1xuXG5cdFx0aGVscGVycyQxLmVhY2goc2NhbGVzT3B0aW9ucy55QXhlcywgZnVuY3Rpb24oeUF4aXNPcHRpb25zLCBpbmRleCkge1xuXHRcdFx0eUF4aXNPcHRpb25zLmlkID0geUF4aXNPcHRpb25zLmlkIHx8ICgneS1heGlzLScgKyBpbmRleCk7XG5cdFx0fSk7XG5cblx0XHRpZiAoc2NhbGVPcHRpb25zKSB7XG5cdFx0XHRzY2FsZU9wdGlvbnMuaWQgPSBzY2FsZU9wdGlvbnMuaWQgfHwgJ3NjYWxlJztcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEJ1aWxkcyBhIG1hcCBvZiBzY2FsZSBJRCB0byBzY2FsZSBvYmplY3QgZm9yIGZ1dHVyZSBsb29rdXAuXG5cdCAqL1xuXHRidWlsZE9yVXBkYXRlU2NhbGVzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRpb25zID0gbWUub3B0aW9ucztcblx0XHR2YXIgc2NhbGVzID0gbWUuc2NhbGVzIHx8IHt9O1xuXHRcdHZhciBpdGVtcyA9IFtdO1xuXHRcdHZhciB1cGRhdGVkID0gT2JqZWN0LmtleXMoc2NhbGVzKS5yZWR1Y2UoZnVuY3Rpb24ob2JqLCBpZCkge1xuXHRcdFx0b2JqW2lkXSA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuIG9iajtcblx0XHR9LCB7fSk7XG5cblx0XHRpZiAob3B0aW9ucy5zY2FsZXMpIHtcblx0XHRcdGl0ZW1zID0gaXRlbXMuY29uY2F0KFxuXHRcdFx0XHQob3B0aW9ucy5zY2FsZXMueEF4ZXMgfHwgW10pLm1hcChmdW5jdGlvbih4QXhpc09wdGlvbnMpIHtcblx0XHRcdFx0XHRyZXR1cm4ge29wdGlvbnM6IHhBeGlzT3B0aW9ucywgZHR5cGU6ICdjYXRlZ29yeScsIGRwb3NpdGlvbjogJ2JvdHRvbSd9O1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0KG9wdGlvbnMuc2NhbGVzLnlBeGVzIHx8IFtdKS5tYXAoZnVuY3Rpb24oeUF4aXNPcHRpb25zKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtvcHRpb25zOiB5QXhpc09wdGlvbnMsIGR0eXBlOiAnbGluZWFyJywgZHBvc2l0aW9uOiAnbGVmdCd9O1xuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5zY2FsZSkge1xuXHRcdFx0aXRlbXMucHVzaCh7XG5cdFx0XHRcdG9wdGlvbnM6IG9wdGlvbnMuc2NhbGUsXG5cdFx0XHRcdGR0eXBlOiAncmFkaWFsTGluZWFyJyxcblx0XHRcdFx0aXNEZWZhdWx0OiB0cnVlLFxuXHRcdFx0XHRkcG9zaXRpb246ICdjaGFydEFyZWEnXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRoZWxwZXJzJDEuZWFjaChpdGVtcywgZnVuY3Rpb24oaXRlbSkge1xuXHRcdFx0dmFyIHNjYWxlT3B0aW9ucyA9IGl0ZW0ub3B0aW9ucztcblx0XHRcdHZhciBpZCA9IHNjYWxlT3B0aW9ucy5pZDtcblx0XHRcdHZhciBzY2FsZVR5cGUgPSB2YWx1ZU9yRGVmYXVsdCQ4KHNjYWxlT3B0aW9ucy50eXBlLCBpdGVtLmR0eXBlKTtcblxuXHRcdFx0aWYgKHBvc2l0aW9uSXNIb3Jpem9udGFsKHNjYWxlT3B0aW9ucy5wb3NpdGlvbikgIT09IHBvc2l0aW9uSXNIb3Jpem9udGFsKGl0ZW0uZHBvc2l0aW9uKSkge1xuXHRcdFx0XHRzY2FsZU9wdGlvbnMucG9zaXRpb24gPSBpdGVtLmRwb3NpdGlvbjtcblx0XHRcdH1cblxuXHRcdFx0dXBkYXRlZFtpZF0gPSB0cnVlO1xuXHRcdFx0dmFyIHNjYWxlID0gbnVsbDtcblx0XHRcdGlmIChpZCBpbiBzY2FsZXMgJiYgc2NhbGVzW2lkXS50eXBlID09PSBzY2FsZVR5cGUpIHtcblx0XHRcdFx0c2NhbGUgPSBzY2FsZXNbaWRdO1xuXHRcdFx0XHRzY2FsZS5vcHRpb25zID0gc2NhbGVPcHRpb25zO1xuXHRcdFx0XHRzY2FsZS5jdHggPSBtZS5jdHg7XG5cdFx0XHRcdHNjYWxlLmNoYXJ0ID0gbWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgc2NhbGVDbGFzcyA9IGNvcmVfc2NhbGVTZXJ2aWNlLmdldFNjYWxlQ29uc3RydWN0b3Ioc2NhbGVUeXBlKTtcblx0XHRcdFx0aWYgKCFzY2FsZUNsYXNzKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNjYWxlID0gbmV3IHNjYWxlQ2xhc3Moe1xuXHRcdFx0XHRcdGlkOiBpZCxcblx0XHRcdFx0XHR0eXBlOiBzY2FsZVR5cGUsXG5cdFx0XHRcdFx0b3B0aW9uczogc2NhbGVPcHRpb25zLFxuXHRcdFx0XHRcdGN0eDogbWUuY3R4LFxuXHRcdFx0XHRcdGNoYXJ0OiBtZVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c2NhbGVzW3NjYWxlLmlkXSA9IHNjYWxlO1xuXHRcdFx0fVxuXG5cdFx0XHRzY2FsZS5tZXJnZVRpY2tzT3B0aW9ucygpO1xuXG5cdFx0XHQvLyBUT0RPKFNCKTogSSB0aGluayB3ZSBzaG91bGQgYmUgYWJsZSB0byByZW1vdmUgdGhpcyBjdXN0b20gY2FzZSAob3B0aW9ucy5zY2FsZSlcblx0XHRcdC8vIGFuZCBjb25zaWRlciBpdCBhcyBhIHJlZ3VsYXIgc2NhbGUgcGFydCBvZiB0aGUgXCJzY2FsZXNcIlwiIG1hcCBvbmx5ISBUaGlzIHdvdWxkXG5cdFx0XHQvLyBtYWtlIHRoZSBsb2dpYyBlYXNpZXIgYW5kIHJlbW92ZSBzb21lIHVzZWxlc3M/IGN1c3RvbSBjb2RlLlxuXHRcdFx0aWYgKGl0ZW0uaXNEZWZhdWx0KSB7XG5cdFx0XHRcdG1lLnNjYWxlID0gc2NhbGU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Ly8gY2xlYXIgdXAgZGlzY2FyZGVkIHNjYWxlc1xuXHRcdGhlbHBlcnMkMS5lYWNoKHVwZGF0ZWQsIGZ1bmN0aW9uKGhhc1VwZGF0ZWQsIGlkKSB7XG5cdFx0XHRpZiAoIWhhc1VwZGF0ZWQpIHtcblx0XHRcdFx0ZGVsZXRlIHNjYWxlc1tpZF07XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRtZS5zY2FsZXMgPSBzY2FsZXM7XG5cblx0XHRjb3JlX3NjYWxlU2VydmljZS5hZGRTY2FsZXNUb0xheW91dCh0aGlzKTtcblx0fSxcblxuXHRidWlsZE9yVXBkYXRlQ29udHJvbGxlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG5ld0NvbnRyb2xsZXJzID0gW107XG5cblx0XHRoZWxwZXJzJDEuZWFjaChtZS5kYXRhLmRhdGFzZXRzLCBmdW5jdGlvbihkYXRhc2V0LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblx0XHRcdHZhciB0eXBlID0gZGF0YXNldC50eXBlIHx8IG1lLmNvbmZpZy50eXBlO1xuXG5cdFx0XHRpZiAobWV0YS50eXBlICYmIG1ldGEudHlwZSAhPT0gdHlwZSkge1xuXHRcdFx0XHRtZS5kZXN0cm95RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblx0XHRcdFx0bWV0YSA9IG1lLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHR9XG5cdFx0XHRtZXRhLnR5cGUgPSB0eXBlO1xuXG5cdFx0XHRpZiAobWV0YS5jb250cm9sbGVyKSB7XG5cdFx0XHRcdG1ldGEuY29udHJvbGxlci51cGRhdGVJbmRleChkYXRhc2V0SW5kZXgpO1xuXHRcdFx0XHRtZXRhLmNvbnRyb2xsZXIubGlua1NjYWxlcygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIENvbnRyb2xsZXJDbGFzcyA9IGNvbnRyb2xsZXJzW21ldGEudHlwZV07XG5cdFx0XHRcdGlmIChDb250cm9sbGVyQ2xhc3MgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignXCInICsgbWV0YS50eXBlICsgJ1wiIGlzIG5vdCBhIGNoYXJ0IHR5cGUuJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtZXRhLmNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlckNsYXNzKG1lLCBkYXRhc2V0SW5kZXgpO1xuXHRcdFx0XHRuZXdDb250cm9sbGVycy5wdXNoKG1ldGEuY29udHJvbGxlcik7XG5cdFx0XHR9XG5cdFx0fSwgbWUpO1xuXG5cdFx0cmV0dXJuIG5ld0NvbnRyb2xsZXJzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXNldCB0aGUgZWxlbWVudHMgb2YgYWxsIGRhdGFzZXRzXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRyZXNldEVsZW1lbnRzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdGhlbHBlcnMkMS5lYWNoKG1lLmRhdGEuZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0bWUuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KS5jb250cm9sbGVyLnJlc2V0KCk7XG5cdFx0fSwgbWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQqIFJlc2V0cyB0aGUgY2hhcnQgYmFjayB0byBpdCdzIHN0YXRlIGJlZm9yZSB0aGUgaW5pdGlhbCBhbmltYXRpb25cblx0Ki9cblx0cmVzZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVzZXRFbGVtZW50cygpO1xuXHRcdHRoaXMudG9vbHRpcC5pbml0aWFsaXplKCk7XG5cdH0sXG5cblx0dXBkYXRlOiBmdW5jdGlvbihjb25maWcpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0aWYgKCFjb25maWcgfHwgdHlwZW9mIGNvbmZpZyAhPT0gJ29iamVjdCcpIHtcblx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRjb25maWcgPSB7XG5cdFx0XHRcdGR1cmF0aW9uOiBjb25maWcsXG5cdFx0XHRcdGxhenk6IGFyZ3VtZW50c1sxXVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHR1cGRhdGVDb25maWcobWUpO1xuXG5cdFx0Ly8gcGx1Z2lucyBvcHRpb25zIHJlZmVyZW5jZXMgbWlnaHQgaGF2ZSBjaGFuZ2UsIGxldCdzIGludmFsaWRhdGUgdGhlIGNhY2hlXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzUxMTEjaXNzdWVjb21tZW50LTM1NTkzNDE2N1xuXHRcdGNvcmVfcGx1Z2lucy5faW52YWxpZGF0ZShtZSk7XG5cblx0XHRpZiAoY29yZV9wbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZVVwZGF0ZScpID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEluIGNhc2UgdGhlIGVudGlyZSBkYXRhIG9iamVjdCBjaGFuZ2VkXG5cdFx0bWUudG9vbHRpcC5fZGF0YSA9IG1lLmRhdGE7XG5cblx0XHQvLyBNYWtlIHN1cmUgZGF0YXNldCBjb250cm9sbGVycyBhcmUgdXBkYXRlZCBhbmQgbmV3IGNvbnRyb2xsZXJzIGFyZSByZXNldFxuXHRcdHZhciBuZXdDb250cm9sbGVycyA9IG1lLmJ1aWxkT3JVcGRhdGVDb250cm9sbGVycygpO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIGFsbCBkYXRhc2V0IGNvbnRyb2xsZXJzIGhhdmUgY29ycmVjdCBtZXRhIGRhdGEgY291bnRzXG5cdFx0aGVscGVycyQxLmVhY2gobWUuZGF0YS5kYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHRtZS5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIuYnVpbGRPclVwZGF0ZUVsZW1lbnRzKCk7XG5cdFx0fSwgbWUpO1xuXG5cdFx0bWUudXBkYXRlTGF5b3V0KCk7XG5cblx0XHQvLyBDYW4gb25seSByZXNldCB0aGUgbmV3IGNvbnRyb2xsZXJzIGFmdGVyIHRoZSBzY2FsZXMgaGF2ZSBiZWVuIHVwZGF0ZWRcblx0XHRpZiAobWUub3B0aW9ucy5hbmltYXRpb24gJiYgbWUub3B0aW9ucy5hbmltYXRpb24uZHVyYXRpb24pIHtcblx0XHRcdGhlbHBlcnMkMS5lYWNoKG5ld0NvbnRyb2xsZXJzLCBmdW5jdGlvbihjb250cm9sbGVyKSB7XG5cdFx0XHRcdGNvbnRyb2xsZXIucmVzZXQoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdG1lLnVwZGF0ZURhdGFzZXRzKCk7XG5cblx0XHQvLyBOZWVkIHRvIHJlc2V0IHRvb2x0aXAgaW4gY2FzZSBpdCBpcyBkaXNwbGF5ZWQgd2l0aCBlbGVtZW50cyB0aGF0IGFyZSByZW1vdmVkXG5cdFx0Ly8gYWZ0ZXIgdXBkYXRlLlxuXHRcdG1lLnRvb2x0aXAuaW5pdGlhbGl6ZSgpO1xuXG5cdFx0Ly8gTGFzdCBhY3RpdmUgY29udGFpbnMgaXRlbXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgaW4gdGhlIHRvb2x0aXAuXG5cdFx0Ly8gV2hlbiB3ZSByZXNldCB0aGUgdG9vbHRpcCwgd2UgbmVlZCB0byBjbGVhciBpdFxuXHRcdG1lLmxhc3RBY3RpdmUgPSBbXTtcblxuXHRcdC8vIERvIHRoaXMgYmVmb3JlIHJlbmRlciBzbyB0aGF0IGFueSBwbHVnaW5zIHRoYXQgbmVlZCBmaW5hbCBzY2FsZSB1cGRhdGVzIGNhbiB1c2UgaXRcblx0XHRjb3JlX3BsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJVcGRhdGUnKTtcblxuXHRcdGlmIChtZS5fYnVmZmVyZWRSZW5kZXIpIHtcblx0XHRcdG1lLl9idWZmZXJlZFJlcXVlc3QgPSB7XG5cdFx0XHRcdGR1cmF0aW9uOiBjb25maWcuZHVyYXRpb24sXG5cdFx0XHRcdGVhc2luZzogY29uZmlnLmVhc2luZyxcblx0XHRcdFx0bGF6eTogY29uZmlnLmxhenlcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1lLnJlbmRlcihjb25maWcpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgY2hhcnQgbGF5b3V0IHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVMYXlvdXRgXG5cdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckxheW91dGAuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHR1cGRhdGVMYXlvdXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRpZiAoY29yZV9wbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZUxheW91dCcpID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvcmVfbGF5b3V0cy51cGRhdGUodGhpcywgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuXG5cdFx0LyoqXG5cdFx0ICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBgYWZ0ZXJMYXlvdXRgIGluc3RlYWQuXG5cdFx0ICogQG1ldGhvZCBJUGx1Z2luI2FmdGVyU2NhbGVVcGRhdGVcblx0XHQgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNS4wXG5cdFx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Y29yZV9wbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyU2NhbGVVcGRhdGUnKTtcblx0XHRjb3JlX3BsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJMYXlvdXQnKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyBhbGwgZGF0YXNldHMgdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZURhdGFzZXRzVXBkYXRlYFxuXHQgKiBob29rLCBpbiB3aGljaCBjYXNlLCBwbHVnaW5zIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBgYWZ0ZXJEYXRhc2V0c1VwZGF0ZWAuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHR1cGRhdGVEYXRhc2V0czogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdGlmIChjb3JlX3BsdWdpbnMubm90aWZ5KG1lLCAnYmVmb3JlRGF0YXNldHNVcGRhdGUnKSA9PT0gZmFsc2UpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmb3IgKHZhciBpID0gMCwgaWxlbiA9IG1lLmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRtZS51cGRhdGVEYXRhc2V0KGkpO1xuXHRcdH1cblxuXHRcdGNvcmVfcGx1Z2lucy5ub3RpZnkobWUsICdhZnRlckRhdGFzZXRzVXBkYXRlJyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgZGF0YXNldCBhdCBpbmRleCB1bmxlc3MgYSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgIHRvIHRoZSBgYmVmb3JlRGF0YXNldFVwZGF0ZWBcblx0ICogaG9vaywgaW4gd2hpY2ggY2FzZSwgcGx1Z2lucyB3aWxsIG5vdCBiZSBjYWxsZWQgb24gYGFmdGVyRGF0YXNldFVwZGF0ZWAuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHR1cGRhdGVEYXRhc2V0OiBmdW5jdGlvbihpbmRleCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG1ldGEgPSBtZS5nZXREYXRhc2V0TWV0YShpbmRleCk7XG5cdFx0dmFyIGFyZ3MgPSB7XG5cdFx0XHRtZXRhOiBtZXRhLFxuXHRcdFx0aW5kZXg6IGluZGV4XG5cdFx0fTtcblxuXHRcdGlmIChjb3JlX3BsdWdpbnMubm90aWZ5KG1lLCAnYmVmb3JlRGF0YXNldFVwZGF0ZScsIFthcmdzXSkgPT09IGZhbHNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bWV0YS5jb250cm9sbGVyLnVwZGF0ZSgpO1xuXG5cdFx0Y29yZV9wbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyRGF0YXNldFVwZGF0ZScsIFthcmdzXSk7XG5cdH0sXG5cblx0cmVuZGVyOiBmdW5jdGlvbihjb25maWcpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0aWYgKCFjb25maWcgfHwgdHlwZW9mIGNvbmZpZyAhPT0gJ29iamVjdCcpIHtcblx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRjb25maWcgPSB7XG5cdFx0XHRcdGR1cmF0aW9uOiBjb25maWcsXG5cdFx0XHRcdGxhenk6IGFyZ3VtZW50c1sxXVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHR2YXIgYW5pbWF0aW9uT3B0aW9ucyA9IG1lLm9wdGlvbnMuYW5pbWF0aW9uO1xuXHRcdHZhciBkdXJhdGlvbiA9IHZhbHVlT3JEZWZhdWx0JDgoY29uZmlnLmR1cmF0aW9uLCBhbmltYXRpb25PcHRpb25zICYmIGFuaW1hdGlvbk9wdGlvbnMuZHVyYXRpb24pO1xuXHRcdHZhciBsYXp5ID0gY29uZmlnLmxhenk7XG5cblx0XHRpZiAoY29yZV9wbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZVJlbmRlcicpID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBvbkNvbXBsZXRlID0gZnVuY3Rpb24oYW5pbWF0aW9uKSB7XG5cdFx0XHRjb3JlX3BsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJSZW5kZXInKTtcblx0XHRcdGhlbHBlcnMkMS5jYWxsYmFjayhhbmltYXRpb25PcHRpb25zICYmIGFuaW1hdGlvbk9wdGlvbnMub25Db21wbGV0ZSwgW2FuaW1hdGlvbl0sIG1lKTtcblx0XHR9O1xuXG5cdFx0aWYgKGFuaW1hdGlvbk9wdGlvbnMgJiYgZHVyYXRpb24pIHtcblx0XHRcdHZhciBhbmltYXRpb24gPSBuZXcgY29yZV9hbmltYXRpb24oe1xuXHRcdFx0XHRudW1TdGVwczogZHVyYXRpb24gLyAxNi42NiwgLy8gNjAgZnBzXG5cdFx0XHRcdGVhc2luZzogY29uZmlnLmVhc2luZyB8fCBhbmltYXRpb25PcHRpb25zLmVhc2luZyxcblxuXHRcdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKGNoYXJ0LCBhbmltYXRpb25PYmplY3QpIHtcblx0XHRcdFx0XHR2YXIgZWFzaW5nRnVuY3Rpb24gPSBoZWxwZXJzJDEuZWFzaW5nLmVmZmVjdHNbYW5pbWF0aW9uT2JqZWN0LmVhc2luZ107XG5cdFx0XHRcdFx0dmFyIGN1cnJlbnRTdGVwID0gYW5pbWF0aW9uT2JqZWN0LmN1cnJlbnRTdGVwO1xuXHRcdFx0XHRcdHZhciBzdGVwRGVjaW1hbCA9IGN1cnJlbnRTdGVwIC8gYW5pbWF0aW9uT2JqZWN0Lm51bVN0ZXBzO1xuXG5cdFx0XHRcdFx0Y2hhcnQuZHJhdyhlYXNpbmdGdW5jdGlvbihzdGVwRGVjaW1hbCksIHN0ZXBEZWNpbWFsLCBjdXJyZW50U3RlcCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0b25BbmltYXRpb25Qcm9ncmVzczogYW5pbWF0aW9uT3B0aW9ucy5vblByb2dyZXNzLFxuXHRcdFx0XHRvbkFuaW1hdGlvbkNvbXBsZXRlOiBvbkNvbXBsZXRlXG5cdFx0XHR9KTtcblxuXHRcdFx0Y29yZV9hbmltYXRpb25zLmFkZEFuaW1hdGlvbihtZSwgYW5pbWF0aW9uLCBkdXJhdGlvbiwgbGF6eSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1lLmRyYXcoKTtcblxuXHRcdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8zNzgxXG5cdFx0XHRvbkNvbXBsZXRlKG5ldyBjb3JlX2FuaW1hdGlvbih7bnVtU3RlcHM6IDAsIGNoYXJ0OiBtZX0pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWU7XG5cdH0sXG5cblx0ZHJhdzogZnVuY3Rpb24oZWFzaW5nVmFsdWUpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0bWUuY2xlYXIoKTtcblxuXHRcdGlmIChoZWxwZXJzJDEuaXNOdWxsT3JVbmRlZihlYXNpbmdWYWx1ZSkpIHtcblx0XHRcdGVhc2luZ1ZhbHVlID0gMTtcblx0XHR9XG5cblx0XHRtZS50cmFuc2l0aW9uKGVhc2luZ1ZhbHVlKTtcblxuXHRcdGlmIChtZS53aWR0aCA8PSAwIHx8IG1lLmhlaWdodCA8PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNvcmVfcGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVEcmF3JywgW2Vhc2luZ1ZhbHVlXSkgPT09IGZhbHNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRHJhdyBhbGwgdGhlIHNjYWxlc1xuXHRcdGhlbHBlcnMkMS5lYWNoKG1lLmJveGVzLCBmdW5jdGlvbihib3gpIHtcblx0XHRcdGJveC5kcmF3KG1lLmNoYXJ0QXJlYSk7XG5cdFx0fSwgbWUpO1xuXG5cdFx0bWUuZHJhd0RhdGFzZXRzKGVhc2luZ1ZhbHVlKTtcblx0XHRtZS5fZHJhd1Rvb2x0aXAoZWFzaW5nVmFsdWUpO1xuXG5cdFx0Y29yZV9wbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyRHJhdycsIFtlYXNpbmdWYWx1ZV0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0dHJhbnNpdGlvbjogZnVuY3Rpb24oZWFzaW5nVmFsdWUpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDAsIGlsZW4gPSAobWUuZGF0YS5kYXRhc2V0cyB8fCBbXSkubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRpZiAobWUuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xuXHRcdFx0XHRtZS5nZXREYXRhc2V0TWV0YShpKS5jb250cm9sbGVyLnRyYW5zaXRpb24oZWFzaW5nVmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG1lLnRvb2x0aXAudHJhbnNpdGlvbihlYXNpbmdWYWx1ZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIERyYXdzIGFsbCBkYXRhc2V0cyB1bmxlc3MgYSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgIHRvIHRoZSBgYmVmb3JlRGF0YXNldHNEcmF3YFxuXHQgKiBob29rLCBpbiB3aGljaCBjYXNlLCBwbHVnaW5zIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBgYWZ0ZXJEYXRhc2V0c0RyYXdgLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0ZHJhd0RhdGFzZXRzOiBmdW5jdGlvbihlYXNpbmdWYWx1ZSkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRpZiAoY29yZV9wbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZURhdGFzZXRzRHJhdycsIFtlYXNpbmdWYWx1ZV0pID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERyYXcgZGF0YXNldHMgcmV2ZXJzZWQgdG8gc3VwcG9ydCBwcm9wZXIgbGluZSBzdGFja2luZ1xuXHRcdGZvciAodmFyIGkgPSAobWUuZGF0YS5kYXRhc2V0cyB8fCBbXSkubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcblx0XHRcdGlmIChtZS5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG5cdFx0XHRcdG1lLmRyYXdEYXRhc2V0KGksIGVhc2luZ1ZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb3JlX3BsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJEYXRhc2V0c0RyYXcnLCBbZWFzaW5nVmFsdWVdKTtcblx0fSxcblxuXHQvKipcblx0ICogRHJhd3MgZGF0YXNldCBhdCBpbmRleCB1bmxlc3MgYSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgIHRvIHRoZSBgYmVmb3JlRGF0YXNldERyYXdgXG5cdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXREcmF3YC5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGRyYXdEYXRhc2V0OiBmdW5jdGlvbihpbmRleCwgZWFzaW5nVmFsdWUpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBtZXRhID0gbWUuZ2V0RGF0YXNldE1ldGEoaW5kZXgpO1xuXHRcdHZhciBhcmdzID0ge1xuXHRcdFx0bWV0YTogbWV0YSxcblx0XHRcdGluZGV4OiBpbmRleCxcblx0XHRcdGVhc2luZ1ZhbHVlOiBlYXNpbmdWYWx1ZVxuXHRcdH07XG5cblx0XHRpZiAoY29yZV9wbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZURhdGFzZXREcmF3JywgW2FyZ3NdKSA9PT0gZmFsc2UpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRtZXRhLmNvbnRyb2xsZXIuZHJhdyhlYXNpbmdWYWx1ZSk7XG5cblx0XHRjb3JlX3BsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJEYXRhc2V0RHJhdycsIFthcmdzXSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIERyYXdzIHRvb2x0aXAgdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZVRvb2x0aXBEcmF3YFxuXHQgKiBob29rLCBpbiB3aGljaCBjYXNlLCBwbHVnaW5zIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBgYWZ0ZXJUb29sdGlwRHJhd2AuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZHJhd1Rvb2x0aXA6IGZ1bmN0aW9uKGVhc2luZ1ZhbHVlKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgdG9vbHRpcCA9IG1lLnRvb2x0aXA7XG5cdFx0dmFyIGFyZ3MgPSB7XG5cdFx0XHR0b29sdGlwOiB0b29sdGlwLFxuXHRcdFx0ZWFzaW5nVmFsdWU6IGVhc2luZ1ZhbHVlXG5cdFx0fTtcblxuXHRcdGlmIChjb3JlX3BsdWdpbnMubm90aWZ5KG1lLCAnYmVmb3JlVG9vbHRpcERyYXcnLCBbYXJnc10pID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRvb2x0aXAuZHJhdygpO1xuXG5cdFx0Y29yZV9wbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyVG9vbHRpcERyYXcnLCBbYXJnc10pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHNpbmdsZSBlbGVtZW50IHRoYXQgd2FzIGNsaWNrZWQgb25cblx0ICogQHJldHVybiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YXNldCBpbmRleCBhbmQgZWxlbWVudCBpbmRleCBvZiB0aGUgbWF0Y2hpbmcgZWxlbWVudC4gQWxzbyBjb250YWlucyB0aGUgcmVjdGFuZ2xlIHRoYXQgd2FzIGRyYXdcblx0ICovXG5cdGdldEVsZW1lbnRBdEV2ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0cmV0dXJuIGNvcmVfaW50ZXJhY3Rpb24ubW9kZXMuc2luZ2xlKHRoaXMsIGUpO1xuXHR9LFxuXG5cdGdldEVsZW1lbnRzQXRFdmVudDogZnVuY3Rpb24oZSkge1xuXHRcdHJldHVybiBjb3JlX2ludGVyYWN0aW9uLm1vZGVzLmxhYmVsKHRoaXMsIGUsIHtpbnRlcnNlY3Q6IHRydWV9KTtcblx0fSxcblxuXHRnZXRFbGVtZW50c0F0WEF4aXM6IGZ1bmN0aW9uKGUpIHtcblx0XHRyZXR1cm4gY29yZV9pbnRlcmFjdGlvbi5tb2Rlc1sneC1heGlzJ10odGhpcywgZSwge2ludGVyc2VjdDogdHJ1ZX0pO1xuXHR9LFxuXG5cdGdldEVsZW1lbnRzQXRFdmVudEZvck1vZGU6IGZ1bmN0aW9uKGUsIG1vZGUsIG9wdGlvbnMpIHtcblx0XHR2YXIgbWV0aG9kID0gY29yZV9pbnRlcmFjdGlvbi5tb2Rlc1ttb2RlXTtcblx0XHRpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0cmV0dXJuIG1ldGhvZCh0aGlzLCBlLCBvcHRpb25zKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gW107XG5cdH0sXG5cblx0Z2V0RGF0YXNldEF0RXZlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRyZXR1cm4gY29yZV9pbnRlcmFjdGlvbi5tb2Rlcy5kYXRhc2V0KHRoaXMsIGUsIHtpbnRlcnNlY3Q6IHRydWV9KTtcblx0fSxcblxuXHRnZXREYXRhc2V0TWV0YTogZnVuY3Rpb24oZGF0YXNldEluZGV4KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgZGF0YXNldCA9IG1lLmRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XTtcblx0XHRpZiAoIWRhdGFzZXQuX21ldGEpIHtcblx0XHRcdGRhdGFzZXQuX21ldGEgPSB7fTtcblx0XHR9XG5cblx0XHR2YXIgbWV0YSA9IGRhdGFzZXQuX21ldGFbbWUuaWRdO1xuXHRcdGlmICghbWV0YSkge1xuXHRcdFx0bWV0YSA9IGRhdGFzZXQuX21ldGFbbWUuaWRdID0ge1xuXHRcdFx0XHR0eXBlOiBudWxsLFxuXHRcdFx0XHRkYXRhOiBbXSxcblx0XHRcdFx0ZGF0YXNldDogbnVsbCxcblx0XHRcdFx0Y29udHJvbGxlcjogbnVsbCxcblx0XHRcdFx0aGlkZGVuOiBudWxsLFx0XHRcdC8vIFNlZSBpc0RhdGFzZXRWaXNpYmxlKCkgY29tbWVudFxuXHRcdFx0XHR4QXhpc0lEOiBudWxsLFxuXHRcdFx0XHR5QXhpc0lEOiBudWxsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiBtZXRhO1xuXHR9LFxuXG5cdGdldFZpc2libGVEYXRhc2V0Q291bnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjb3VudCA9IDA7XG5cdFx0Zm9yICh2YXIgaSA9IDAsIGlsZW4gPSB0aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRpZiAodGhpcy5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG5cdFx0XHRcdGNvdW50Kys7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjb3VudDtcblx0fSxcblxuXHRpc0RhdGFzZXRWaXNpYmxlOiBmdW5jdGlvbihkYXRhc2V0SW5kZXgpIHtcblx0XHR2YXIgbWV0YSA9IHRoaXMuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblxuXHRcdC8vIG1ldGEuaGlkZGVuIGlzIGEgcGVyIGNoYXJ0IGRhdGFzZXQgaGlkZGVuIGZsYWcgb3ZlcnJpZGUgd2l0aCAzIHN0YXRlczogaWYgdHJ1ZSBvciBmYWxzZSxcblx0XHQvLyB0aGUgZGF0YXNldC5oaWRkZW4gdmFsdWUgaXMgaWdub3JlZCwgZWxzZSBpZiBudWxsLCB0aGUgZGF0YXNldCBoaWRkZW4gc3RhdGUgaXMgcmV0dXJuZWQuXG5cdFx0cmV0dXJuIHR5cGVvZiBtZXRhLmhpZGRlbiA9PT0gJ2Jvb2xlYW4nID8gIW1ldGEuaGlkZGVuIDogIXRoaXMuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLmhpZGRlbjtcblx0fSxcblxuXHRnZW5lcmF0ZUxlZ2VuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMub3B0aW9ucy5sZWdlbmRDYWxsYmFjayh0aGlzKTtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGRlc3Ryb3lEYXRhc2V0TWV0YTogZnVuY3Rpb24oZGF0YXNldEluZGV4KSB7XG5cdFx0dmFyIGlkID0gdGhpcy5pZDtcblx0XHR2YXIgZGF0YXNldCA9IHRoaXMuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdO1xuXHRcdHZhciBtZXRhID0gZGF0YXNldC5fbWV0YSAmJiBkYXRhc2V0Ll9tZXRhW2lkXTtcblxuXHRcdGlmIChtZXRhKSB7XG5cdFx0XHRtZXRhLmNvbnRyb2xsZXIuZGVzdHJveSgpO1xuXHRcdFx0ZGVsZXRlIGRhdGFzZXQuX21ldGFbaWRdO1xuXHRcdH1cblx0fSxcblxuXHRkZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjYW52YXMgPSBtZS5jYW52YXM7XG5cdFx0dmFyIGksIGlsZW47XG5cblx0XHRtZS5zdG9wKCk7XG5cblx0XHQvLyBkYXRhc2V0IGNvbnRyb2xsZXJzIG5lZWQgdG8gY2xlYW51cCBhc3NvY2lhdGVkIGRhdGFcblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gbWUuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdG1lLmRlc3Ryb3lEYXRhc2V0TWV0YShpKTtcblx0XHR9XG5cblx0XHRpZiAoY2FudmFzKSB7XG5cdFx0XHRtZS51bmJpbmRFdmVudHMoKTtcblx0XHRcdGhlbHBlcnMkMS5jYW52YXMuY2xlYXIobWUpO1xuXHRcdFx0cGxhdGZvcm0ucmVsZWFzZUNvbnRleHQobWUuY3R4KTtcblx0XHRcdG1lLmNhbnZhcyA9IG51bGw7XG5cdFx0XHRtZS5jdHggPSBudWxsO1xuXHRcdH1cblxuXHRcdGNvcmVfcGx1Z2lucy5ub3RpZnkobWUsICdkZXN0cm95Jyk7XG5cblx0XHRkZWxldGUgQ2hhcnQuaW5zdGFuY2VzW21lLmlkXTtcblx0fSxcblxuXHR0b0Jhc2U2NEltYWdlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5jYW52YXMudG9EYXRhVVJMLmFwcGx5KHRoaXMuY2FudmFzLCBhcmd1bWVudHMpO1xuXHR9LFxuXG5cdGluaXRUb29sVGlwOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdG1lLnRvb2x0aXAgPSBuZXcgY29yZV90b29sdGlwKHtcblx0XHRcdF9jaGFydDogbWUsXG5cdFx0XHRfY2hhcnRJbnN0YW5jZTogbWUsIC8vIGRlcHJlY2F0ZWQsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcblx0XHRcdF9kYXRhOiBtZS5kYXRhLFxuXHRcdFx0X29wdGlvbnM6IG1lLm9wdGlvbnMudG9vbHRpcHNcblx0XHR9LCBtZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRiaW5kRXZlbnRzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBsaXN0ZW5lcnMgPSBtZS5fbGlzdGVuZXJzID0ge307XG5cdFx0dmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRtZS5ldmVudEhhbmRsZXIuYXBwbHkobWUsIGFyZ3VtZW50cyk7XG5cdFx0fTtcblxuXHRcdGhlbHBlcnMkMS5lYWNoKG1lLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbih0eXBlKSB7XG5cdFx0XHRwbGF0Zm9ybS5hZGRFdmVudExpc3RlbmVyKG1lLCB0eXBlLCBsaXN0ZW5lcik7XG5cdFx0XHRsaXN0ZW5lcnNbdHlwZV0gPSBsaXN0ZW5lcjtcblx0XHR9KTtcblxuXHRcdC8vIEVsZW1lbnRzIHVzZWQgdG8gZGV0ZWN0IHNpemUgY2hhbmdlIHNob3VsZCBub3QgYmUgaW5qZWN0ZWQgZm9yIG5vbiByZXNwb25zaXZlIGNoYXJ0cy5cblx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzIyMTBcblx0XHRpZiAobWUub3B0aW9ucy5yZXNwb25zaXZlKSB7XG5cdFx0XHRsaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRtZS5yZXNpemUoKTtcblx0XHRcdH07XG5cblx0XHRcdHBsYXRmb3JtLmFkZEV2ZW50TGlzdGVuZXIobWUsICdyZXNpemUnLCBsaXN0ZW5lcik7XG5cdFx0XHRsaXN0ZW5lcnMucmVzaXplID0gbGlzdGVuZXI7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0dW5iaW5kRXZlbnRzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBsaXN0ZW5lcnMgPSBtZS5fbGlzdGVuZXJzO1xuXHRcdGlmICghbGlzdGVuZXJzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZGVsZXRlIG1lLl9saXN0ZW5lcnM7XG5cdFx0aGVscGVycyQxLmVhY2gobGlzdGVuZXJzLCBmdW5jdGlvbihsaXN0ZW5lciwgdHlwZSkge1xuXHRcdFx0cGxhdGZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihtZSwgdHlwZSwgbGlzdGVuZXIpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHVwZGF0ZUhvdmVyU3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnRzLCBtb2RlLCBlbmFibGVkKSB7XG5cdFx0dmFyIG1ldGhvZCA9IGVuYWJsZWQgPyAnc2V0SG92ZXJTdHlsZScgOiAncmVtb3ZlSG92ZXJTdHlsZSc7XG5cdFx0dmFyIGVsZW1lbnQsIGksIGlsZW47XG5cblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRlbGVtZW50ID0gZWxlbWVudHNbaV07XG5cdFx0XHRpZiAoZWxlbWVudCkge1xuXHRcdFx0XHR0aGlzLmdldERhdGFzZXRNZXRhKGVsZW1lbnQuX2RhdGFzZXRJbmRleCkuY29udHJvbGxlclttZXRob2RdKGVsZW1lbnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGV2ZW50SGFuZGxlcjogZnVuY3Rpb24oZSkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIHRvb2x0aXAgPSBtZS50b29sdGlwO1xuXG5cdFx0aWYgKGNvcmVfcGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVFdmVudCcsIFtlXSkgPT09IGZhbHNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQnVmZmVyIGFueSB1cGRhdGUgY2FsbHMgc28gdGhhdCByZW5kZXJzIGRvIG5vdCBvY2N1clxuXHRcdG1lLl9idWZmZXJlZFJlbmRlciA9IHRydWU7XG5cdFx0bWUuX2J1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cblx0XHR2YXIgY2hhbmdlZCA9IG1lLmhhbmRsZUV2ZW50KGUpO1xuXHRcdC8vIGZvciBzbW9vdGggdG9vbHRpcCBhbmltYXRpb25zIGlzc3VlICM0OTg5XG5cdFx0Ly8gdGhlIHRvb2x0aXAgc2hvdWxkIGJlIHRoZSBzb3VyY2Ugb2YgY2hhbmdlXG5cdFx0Ly8gQW5pbWF0aW9uIGNoZWNrIHdvcmthcm91bmQ6XG5cdFx0Ly8gdG9vbHRpcC5fc3RhcnQgd2lsbCBiZSBudWxsIHdoZW4gdG9vbHRpcCBpc24ndCBhbmltYXRpbmdcblx0XHRpZiAodG9vbHRpcCkge1xuXHRcdFx0Y2hhbmdlZCA9IHRvb2x0aXAuX3N0YXJ0XG5cdFx0XHRcdD8gdG9vbHRpcC5oYW5kbGVFdmVudChlKVxuXHRcdFx0XHQ6IGNoYW5nZWQgfCB0b29sdGlwLmhhbmRsZUV2ZW50KGUpO1xuXHRcdH1cblxuXHRcdGNvcmVfcGx1Z2lucy5ub3RpZnkobWUsICdhZnRlckV2ZW50JywgW2VdKTtcblxuXHRcdHZhciBidWZmZXJlZFJlcXVlc3QgPSBtZS5fYnVmZmVyZWRSZXF1ZXN0O1xuXHRcdGlmIChidWZmZXJlZFJlcXVlc3QpIHtcblx0XHRcdC8vIElmIHdlIGhhdmUgYW4gdXBkYXRlIHRoYXQgd2FzIHRyaWdnZXJlZCwgd2UgbmVlZCB0byBkbyBhIG5vcm1hbCByZW5kZXJcblx0XHRcdG1lLnJlbmRlcihidWZmZXJlZFJlcXVlc3QpO1xuXHRcdH0gZWxzZSBpZiAoY2hhbmdlZCAmJiAhbWUuYW5pbWF0aW5nKSB7XG5cdFx0XHQvLyBJZiBlbnRlcmluZywgbGVhdmluZywgb3IgY2hhbmdpbmcgZWxlbWVudHMsIGFuaW1hdGUgdGhlIGNoYW5nZSB2aWEgcGl2b3Rcblx0XHRcdG1lLnN0b3AoKTtcblxuXHRcdFx0Ly8gV2Ugb25seSBuZWVkIHRvIHJlbmRlciBhdCB0aGlzIHBvaW50LiBVcGRhdGluZyB3aWxsIGNhdXNlIHNjYWxlcyB0byBiZVxuXHRcdFx0Ly8gcmVjb21wdXRlZCBnZW5lcmF0aW5nIGZsaWNrZXIgJiB1c2luZyBtb3JlIG1lbW9yeSB0aGFuIG5lY2Vzc2FyeS5cblx0XHRcdG1lLnJlbmRlcih7XG5cdFx0XHRcdGR1cmF0aW9uOiBtZS5vcHRpb25zLmhvdmVyLmFuaW1hdGlvbkR1cmF0aW9uLFxuXHRcdFx0XHRsYXp5OiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRtZS5fYnVmZmVyZWRSZW5kZXIgPSBmYWxzZTtcblx0XHRtZS5fYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuXHRcdHJldHVybiBtZTtcblx0fSxcblxuXHQvKipcblx0ICogSGFuZGxlIGFuIGV2ZW50XG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SUV2ZW50fSBldmVudCB0aGUgZXZlbnQgdG8gaGFuZGxlXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGNoYXJ0IG5lZWRzIHRvIHJlLXJlbmRlclxuXHQgKi9cblx0aGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRpb25zID0gbWUub3B0aW9ucyB8fCB7fTtcblx0XHR2YXIgaG92ZXJPcHRpb25zID0gb3B0aW9ucy5ob3Zlcjtcblx0XHR2YXIgY2hhbmdlZCA9IGZhbHNlO1xuXG5cdFx0bWUubGFzdEFjdGl2ZSA9IG1lLmxhc3RBY3RpdmUgfHwgW107XG5cblx0XHQvLyBGaW5kIEFjdGl2ZSBFbGVtZW50cyBmb3IgaG92ZXIgYW5kIHRvb2x0aXBzXG5cdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuXHRcdFx0bWUuYWN0aXZlID0gW107XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1lLmFjdGl2ZSA9IG1lLmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSwgaG92ZXJPcHRpb25zLm1vZGUsIGhvdmVyT3B0aW9ucyk7XG5cdFx0fVxuXG5cdFx0Ly8gSW52b2tlIG9uSG92ZXIgaG9va1xuXHRcdC8vIE5lZWQgdG8gY2FsbCB3aXRoIG5hdGl2ZSBldmVudCBoZXJlIHRvIG5vdCBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdGhlbHBlcnMkMS5jYWxsYmFjayhvcHRpb25zLm9uSG92ZXIgfHwgb3B0aW9ucy5ob3Zlci5vbkhvdmVyLCBbZS5uYXRpdmUsIG1lLmFjdGl2ZV0sIG1lKTtcblxuXHRcdGlmIChlLnR5cGUgPT09ICdtb3VzZXVwJyB8fCBlLnR5cGUgPT09ICdjbGljaycpIHtcblx0XHRcdGlmIChvcHRpb25zLm9uQ2xpY2spIHtcblx0XHRcdFx0Ly8gVXNlIGUubmF0aXZlIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRcdG9wdGlvbnMub25DbGljay5jYWxsKG1lLCBlLm5hdGl2ZSwgbWUuYWN0aXZlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgc3R5bGluZyBmb3IgbGFzdCBhY3RpdmUgKGV2ZW4gaWYgaXQgbWF5IHN0aWxsIGJlIGFjdGl2ZSlcblx0XHRpZiAobWUubGFzdEFjdGl2ZS5sZW5ndGgpIHtcblx0XHRcdG1lLnVwZGF0ZUhvdmVyU3R5bGUobWUubGFzdEFjdGl2ZSwgaG92ZXJPcHRpb25zLm1vZGUsIGZhbHNlKTtcblx0XHR9XG5cblx0XHQvLyBCdWlsdCBpbiBob3ZlciBzdHlsaW5nXG5cdFx0aWYgKG1lLmFjdGl2ZS5sZW5ndGggJiYgaG92ZXJPcHRpb25zLm1vZGUpIHtcblx0XHRcdG1lLnVwZGF0ZUhvdmVyU3R5bGUobWUuYWN0aXZlLCBob3Zlck9wdGlvbnMubW9kZSwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Y2hhbmdlZCA9ICFoZWxwZXJzJDEuYXJyYXlFcXVhbHMobWUuYWN0aXZlLCBtZS5sYXN0QWN0aXZlKTtcblxuXHRcdC8vIFJlbWVtYmVyIExhc3QgQWN0aXZlc1xuXHRcdG1lLmxhc3RBY3RpdmUgPSBtZS5hY3RpdmU7XG5cblx0XHRyZXR1cm4gY2hhbmdlZDtcblx0fVxufSk7XG5cbi8qKlxuICogTk9URShTQikgV2UgYWN0dWFsbHkgZG9uJ3QgdXNlIHRoaXMgY29udGFpbmVyIGFueW1vcmUgYnV0IHdlIG5lZWQgdG8ga2VlcCBpdFxuICogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFRob3VnaCwgaXQgY2FuIHN0aWxsIGJlIHVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0XG4gKiB3b3VsZCBuZWVkIHRvIHdvcmsgb24gbXVsdGlwbGUgY2hhcnRzPyFcbiAqL1xuQ2hhcnQuaW5zdGFuY2VzID0ge307XG5cbnZhciBjb3JlX2NvbnRyb2xsZXIgPSBDaGFydDtcblxuLy8gREVQUkVDQVRJT05TXG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydCBpbnN0ZWFkLlxuICogQGNsYXNzIENoYXJ0LkNvbnRyb2xsZXJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi42XG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5DaGFydC5Db250cm9sbGVyID0gQ2hhcnQ7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIG5vdCBhdmFpbGFibGUgYW55bW9yZS5cbiAqIEBuYW1lc3BhY2UgQ2hhcnRcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi44XG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5DaGFydC50eXBlcyA9IHt9O1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBub3QgYXZhaWxhYmxlIGFueW1vcmUuXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuY29uZmlnTWVyZ2VcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi44LjBcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbmhlbHBlcnMkMS5jb25maWdNZXJnZSA9IG1lcmdlQ29uZmlnO1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBub3QgYXZhaWxhYmxlIGFueW1vcmUuXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuc2NhbGVNZXJnZVxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjguMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVycyQxLnNjYWxlTWVyZ2UgPSBtZXJnZVNjYWxlQ29uZmlnO1xuXG52YXIgY29yZV9oZWxwZXJzID0gZnVuY3Rpb24oKSB7XG5cblx0Ly8gLS0gQmFzaWMganMgdXRpbGl0eSBtZXRob2RzXG5cblx0aGVscGVycyQxLndoZXJlID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgZmlsdGVyQ2FsbGJhY2spIHtcblx0XHRpZiAoaGVscGVycyQxLmlzQXJyYXkoY29sbGVjdGlvbikgJiYgQXJyYXkucHJvdG90eXBlLmZpbHRlcikge1xuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb24uZmlsdGVyKGZpbHRlckNhbGxiYWNrKTtcblx0XHR9XG5cdFx0dmFyIGZpbHRlcmVkID0gW107XG5cblx0XHRoZWxwZXJzJDEuZWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbihpdGVtKSB7XG5cdFx0XHRpZiAoZmlsdGVyQ2FsbGJhY2soaXRlbSkpIHtcblx0XHRcdFx0ZmlsdGVyZWQucHVzaChpdGVtKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBmaWx0ZXJlZDtcblx0fTtcblx0aGVscGVycyQxLmZpbmRJbmRleCA9IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXggP1xuXHRcdGZ1bmN0aW9uKGFycmF5LCBjYWxsYmFjaywgc2NvcGUpIHtcblx0XHRcdHJldHVybiBhcnJheS5maW5kSW5kZXgoY2FsbGJhY2ssIHNjb3BlKTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbihhcnJheSwgY2FsbGJhY2ssIHNjb3BlKSB7XG5cdFx0XHRzY29wZSA9IHNjb3BlID09PSB1bmRlZmluZWQgPyBhcnJheSA6IHNjb3BlO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGlsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0aWYgKGNhbGxiYWNrLmNhbGwoc2NvcGUsIGFycmF5W2ldLCBpLCBhcnJheSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH07XG5cdGhlbHBlcnMkMS5maW5kTmV4dFdoZXJlID0gZnVuY3Rpb24oYXJyYXlUb1NlYXJjaCwgZmlsdGVyQ2FsbGJhY2ssIHN0YXJ0SW5kZXgpIHtcblx0XHQvLyBEZWZhdWx0IHRvIHN0YXJ0IG9mIHRoZSBhcnJheVxuXHRcdGlmIChoZWxwZXJzJDEuaXNOdWxsT3JVbmRlZihzdGFydEluZGV4KSkge1xuXHRcdFx0c3RhcnRJbmRleCA9IC0xO1xuXHRcdH1cblx0XHRmb3IgKHZhciBpID0gc3RhcnRJbmRleCArIDE7IGkgPCBhcnJheVRvU2VhcmNoLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgY3VycmVudEl0ZW0gPSBhcnJheVRvU2VhcmNoW2ldO1xuXHRcdFx0aWYgKGZpbHRlckNhbGxiYWNrKGN1cnJlbnRJdGVtKSkge1xuXHRcdFx0XHRyZXR1cm4gY3VycmVudEl0ZW07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRoZWxwZXJzJDEuZmluZFByZXZpb3VzV2hlcmUgPSBmdW5jdGlvbihhcnJheVRvU2VhcmNoLCBmaWx0ZXJDYWxsYmFjaywgc3RhcnRJbmRleCkge1xuXHRcdC8vIERlZmF1bHQgdG8gZW5kIG9mIHRoZSBhcnJheVxuXHRcdGlmIChoZWxwZXJzJDEuaXNOdWxsT3JVbmRlZihzdGFydEluZGV4KSkge1xuXHRcdFx0c3RhcnRJbmRleCA9IGFycmF5VG9TZWFyY2gubGVuZ3RoO1xuXHRcdH1cblx0XHRmb3IgKHZhciBpID0gc3RhcnRJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0XHR2YXIgY3VycmVudEl0ZW0gPSBhcnJheVRvU2VhcmNoW2ldO1xuXHRcdFx0aWYgKGZpbHRlckNhbGxiYWNrKGN1cnJlbnRJdGVtKSkge1xuXHRcdFx0XHRyZXR1cm4gY3VycmVudEl0ZW07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8vIC0tIE1hdGggbWV0aG9kc1xuXHRoZWxwZXJzJDEuaXNOdW1iZXIgPSBmdW5jdGlvbihuKSB7XG5cdFx0cmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcblx0fTtcblx0aGVscGVycyQxLmFsbW9zdEVxdWFscyA9IGZ1bmN0aW9uKHgsIHksIGVwc2lsb24pIHtcblx0XHRyZXR1cm4gTWF0aC5hYnMoeCAtIHkpIDwgZXBzaWxvbjtcblx0fTtcblx0aGVscGVycyQxLmFsbW9zdFdob2xlID0gZnVuY3Rpb24oeCwgZXBzaWxvbikge1xuXHRcdHZhciByb3VuZGVkID0gTWF0aC5yb3VuZCh4KTtcblx0XHRyZXR1cm4gKCgocm91bmRlZCAtIGVwc2lsb24pIDwgeCkgJiYgKChyb3VuZGVkICsgZXBzaWxvbikgPiB4KSk7XG5cdH07XG5cdGhlbHBlcnMkMS5tYXggPSBmdW5jdGlvbihhcnJheSkge1xuXHRcdHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24obWF4LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCFpc05hTih2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KG1heCwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1heDtcblx0XHR9LCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO1xuXHR9O1xuXHRoZWxwZXJzJDEubWluID0gZnVuY3Rpb24oYXJyYXkpIHtcblx0XHRyZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uKG1pbiwgdmFsdWUpIHtcblx0XHRcdGlmICghaXNOYU4odmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiBNYXRoLm1pbihtaW4sIHZhbHVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtaW47XG5cdFx0fSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcblx0fTtcblx0aGVscGVycyQxLnNpZ24gPSBNYXRoLnNpZ24gP1xuXHRcdGZ1bmN0aW9uKHgpIHtcblx0XHRcdHJldHVybiBNYXRoLnNpZ24oeCk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oeCkge1xuXHRcdFx0eCA9ICt4OyAvLyBjb252ZXJ0IHRvIGEgbnVtYmVyXG5cdFx0XHRpZiAoeCA9PT0gMCB8fCBpc05hTih4KSkge1xuXHRcdFx0XHRyZXR1cm4geDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB4ID4gMCA/IDEgOiAtMTtcblx0XHR9O1xuXHRoZWxwZXJzJDEubG9nMTAgPSBNYXRoLmxvZzEwID9cblx0XHRmdW5jdGlvbih4KSB7XG5cdFx0XHRyZXR1cm4gTWF0aC5sb2cxMCh4KTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbih4KSB7XG5cdFx0XHR2YXIgZXhwb25lbnQgPSBNYXRoLmxvZyh4KSAqIE1hdGguTE9HMTBFOyAvLyBNYXRoLkxPRzEwRSA9IDEgLyBNYXRoLkxOMTAuXG5cdFx0XHQvLyBDaGVjayBmb3Igd2hvbGUgcG93ZXJzIG9mIDEwLFxuXHRcdFx0Ly8gd2hpY2ggZHVlIHRvIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9yIHNob3VsZCBiZSBjb3JyZWN0ZWQuXG5cdFx0XHR2YXIgcG93ZXJPZjEwID0gTWF0aC5yb3VuZChleHBvbmVudCk7XG5cdFx0XHR2YXIgaXNQb3dlck9mMTAgPSB4ID09PSBNYXRoLnBvdygxMCwgcG93ZXJPZjEwKTtcblxuXHRcdFx0cmV0dXJuIGlzUG93ZXJPZjEwID8gcG93ZXJPZjEwIDogZXhwb25lbnQ7XG5cdFx0fTtcblx0aGVscGVycyQxLnRvUmFkaWFucyA9IGZ1bmN0aW9uKGRlZ3JlZXMpIHtcblx0XHRyZXR1cm4gZGVncmVlcyAqIChNYXRoLlBJIC8gMTgwKTtcblx0fTtcblx0aGVscGVycyQxLnRvRGVncmVlcyA9IGZ1bmN0aW9uKHJhZGlhbnMpIHtcblx0XHRyZXR1cm4gcmFkaWFucyAqICgxODAgLyBNYXRoLlBJKTtcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXG5cdCAqIGkuZS4gdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQsIG9mIHRoZSB2YWx1ZSBvZiB0aGlzIE51bWJlci5cblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBBIG51bWJlci5cblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGhlbHBlcnMkMS5fZGVjaW1hbFBsYWNlcyA9IGZ1bmN0aW9uKHgpIHtcblx0XHRpZiAoIWhlbHBlcnMkMS5pc0Zpbml0ZSh4KSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR2YXIgZSA9IDE7XG5cdFx0dmFyIHAgPSAwO1xuXHRcdHdoaWxlIChNYXRoLnJvdW5kKHggKiBlKSAvIGUgIT09IHgpIHtcblx0XHRcdGUgKj0gMTA7XG5cdFx0XHRwKys7XG5cdFx0fVxuXHRcdHJldHVybiBwO1xuXHR9O1xuXG5cdC8vIEdldHMgdGhlIGFuZ2xlIGZyb20gdmVydGljYWwgdXByaWdodCB0byB0aGUgcG9pbnQgYWJvdXQgYSBjZW50cmUuXG5cdGhlbHBlcnMkMS5nZXRBbmdsZUZyb21Qb2ludCA9IGZ1bmN0aW9uKGNlbnRyZVBvaW50LCBhbmdsZVBvaW50KSB7XG5cdFx0dmFyIGRpc3RhbmNlRnJvbVhDZW50ZXIgPSBhbmdsZVBvaW50LnggLSBjZW50cmVQb2ludC54O1xuXHRcdHZhciBkaXN0YW5jZUZyb21ZQ2VudGVyID0gYW5nbGVQb2ludC55IC0gY2VudHJlUG9pbnQueTtcblx0XHR2YXIgcmFkaWFsRGlzdGFuY2VGcm9tQ2VudGVyID0gTWF0aC5zcXJ0KGRpc3RhbmNlRnJvbVhDZW50ZXIgKiBkaXN0YW5jZUZyb21YQ2VudGVyICsgZGlzdGFuY2VGcm9tWUNlbnRlciAqIGRpc3RhbmNlRnJvbVlDZW50ZXIpO1xuXG5cdFx0dmFyIGFuZ2xlID0gTWF0aC5hdGFuMihkaXN0YW5jZUZyb21ZQ2VudGVyLCBkaXN0YW5jZUZyb21YQ2VudGVyKTtcblxuXHRcdGlmIChhbmdsZSA8ICgtMC41ICogTWF0aC5QSSkpIHtcblx0XHRcdGFuZ2xlICs9IDIuMCAqIE1hdGguUEk7IC8vIG1ha2Ugc3VyZSB0aGUgcmV0dXJuZWQgYW5nbGUgaXMgaW4gdGhlIHJhbmdlIG9mICgtUEkvMiwgM1BJLzJdXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFuZ2xlOiBhbmdsZSxcblx0XHRcdGRpc3RhbmNlOiByYWRpYWxEaXN0YW5jZUZyb21DZW50ZXJcblx0XHR9O1xuXHR9O1xuXHRoZWxwZXJzJDEuZGlzdGFuY2VCZXR3ZWVuUG9pbnRzID0gZnVuY3Rpb24ocHQxLCBwdDIpIHtcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHB0Mi54IC0gcHQxLngsIDIpICsgTWF0aC5wb3cocHQyLnkgLSBwdDEueSwgMikpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgbm90IGF2YWlsYWJsZSBhbnltb3JlXG5cdCAqIEBmdW5jdGlvbiBDaGFydC5oZWxwZXJzLmFsaWFzUGl4ZWxcblx0ICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjguMFxuXHQgKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG5cdCAqL1xuXHRoZWxwZXJzJDEuYWxpYXNQaXhlbCA9IGZ1bmN0aW9uKHBpeGVsV2lkdGgpIHtcblx0XHRyZXR1cm4gKHBpeGVsV2lkdGggJSAyID09PSAwKSA/IDAgOiAwLjU7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGFsaWduZWQgcGl4ZWwgdmFsdWUgdG8gYXZvaWQgYW50aS1hbGlhc2luZyBibHVyXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuXHQgKiBAcGFyYW0ge251bWJlcn0gcGl4ZWwgLSBBIHBpeGVsIHZhbHVlLlxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGVsZW1lbnQuXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBhbGlnbmVkIHBpeGVsIHZhbHVlLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0aGVscGVycyQxLl9hbGlnblBpeGVsID0gZnVuY3Rpb24oY2hhcnQsIHBpeGVsLCB3aWR0aCkge1xuXHRcdHZhciBkZXZpY2VQaXhlbFJhdGlvID0gY2hhcnQuY3VycmVudERldmljZVBpeGVsUmF0aW87XG5cdFx0dmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCgocGl4ZWwgLSBoYWxmV2lkdGgpICogZGV2aWNlUGl4ZWxSYXRpbykgLyBkZXZpY2VQaXhlbFJhdGlvICsgaGFsZldpZHRoO1xuXHR9O1xuXG5cdGhlbHBlcnMkMS5zcGxpbmVDdXJ2ZSA9IGZ1bmN0aW9uKGZpcnN0UG9pbnQsIG1pZGRsZVBvaW50LCBhZnRlclBvaW50LCB0KSB7XG5cdFx0Ly8gUHJvcHMgdG8gUm9iIFNwZW5jZXIgYXQgc2NhbGVkIGlubm92YXRpb24gZm9yIGhpcyBwb3N0IG9uIHNwbGluaW5nIGJldHdlZW4gcG9pbnRzXG5cdFx0Ly8gaHR0cDovL3NjYWxlZGlubm92YXRpb24uY29tL2FuYWx5dGljcy9zcGxpbmVzL2Fib3V0U3BsaW5lcy5odG1sXG5cblx0XHQvLyBUaGlzIGZ1bmN0aW9uIG11c3QgYWxzbyByZXNwZWN0IFwic2tpcHBlZFwiIHBvaW50c1xuXG5cdFx0dmFyIHByZXZpb3VzID0gZmlyc3RQb2ludC5za2lwID8gbWlkZGxlUG9pbnQgOiBmaXJzdFBvaW50O1xuXHRcdHZhciBjdXJyZW50ID0gbWlkZGxlUG9pbnQ7XG5cdFx0dmFyIG5leHQgPSBhZnRlclBvaW50LnNraXAgPyBtaWRkbGVQb2ludCA6IGFmdGVyUG9pbnQ7XG5cblx0XHR2YXIgZDAxID0gTWF0aC5zcXJ0KE1hdGgucG93KGN1cnJlbnQueCAtIHByZXZpb3VzLngsIDIpICsgTWF0aC5wb3coY3VycmVudC55IC0gcHJldmlvdXMueSwgMikpO1xuXHRcdHZhciBkMTIgPSBNYXRoLnNxcnQoTWF0aC5wb3cobmV4dC54IC0gY3VycmVudC54LCAyKSArIE1hdGgucG93KG5leHQueSAtIGN1cnJlbnQueSwgMikpO1xuXG5cdFx0dmFyIHMwMSA9IGQwMSAvIChkMDEgKyBkMTIpO1xuXHRcdHZhciBzMTIgPSBkMTIgLyAoZDAxICsgZDEyKTtcblxuXHRcdC8vIElmIGFsbCBwb2ludHMgYXJlIHRoZSBzYW1lLCBzMDEgJiBzMDIgd2lsbCBiZSBpbmZcblx0XHRzMDEgPSBpc05hTihzMDEpID8gMCA6IHMwMTtcblx0XHRzMTIgPSBpc05hTihzMTIpID8gMCA6IHMxMjtcblxuXHRcdHZhciBmYSA9IHQgKiBzMDE7IC8vIHNjYWxpbmcgZmFjdG9yIGZvciB0cmlhbmdsZSBUYVxuXHRcdHZhciBmYiA9IHQgKiBzMTI7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJldmlvdXM6IHtcblx0XHRcdFx0eDogY3VycmVudC54IC0gZmEgKiAobmV4dC54IC0gcHJldmlvdXMueCksXG5cdFx0XHRcdHk6IGN1cnJlbnQueSAtIGZhICogKG5leHQueSAtIHByZXZpb3VzLnkpXG5cdFx0XHR9LFxuXHRcdFx0bmV4dDoge1xuXHRcdFx0XHR4OiBjdXJyZW50LnggKyBmYiAqIChuZXh0LnggLSBwcmV2aW91cy54KSxcblx0XHRcdFx0eTogY3VycmVudC55ICsgZmIgKiAobmV4dC55IC0gcHJldmlvdXMueSlcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXHRoZWxwZXJzJDEuRVBTSUxPTiA9IE51bWJlci5FUFNJTE9OIHx8IDFlLTE0O1xuXHRoZWxwZXJzJDEuc3BsaW5lQ3VydmVNb25vdG9uZSA9IGZ1bmN0aW9uKHBvaW50cykge1xuXHRcdC8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBCw6l6aWVyIGNvbnRyb2wgcG9pbnRzIGluIGEgc2ltaWxhciB3YXkgdGhhbiB8c3BsaW5lQ3VydmV8LFxuXHRcdC8vIGJ1dCBwcmVzZXJ2ZXMgbW9ub3RvbmljaXR5IG9mIHRoZSBwcm92aWRlZCBkYXRhIGFuZCBlbnN1cmVzIG5vIGxvY2FsIGV4dHJlbXVtcyBhcmUgYWRkZWRcblx0XHQvLyBiZXR3ZWVuIHRoZSBkYXRhc2V0IGRpc2NyZXRlIHBvaW50cyBkdWUgdG8gdGhlIGludGVycG9sYXRpb24uXG5cdFx0Ly8gU2VlIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9ub3RvbmVfY3ViaWNfaW50ZXJwb2xhdGlvblxuXG5cdFx0dmFyIHBvaW50c1dpdGhUYW5nZW50cyA9IChwb2ludHMgfHwgW10pLm1hcChmdW5jdGlvbihwb2ludCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bW9kZWw6IHBvaW50Ll9tb2RlbCxcblx0XHRcdFx0ZGVsdGFLOiAwLFxuXHRcdFx0XHRtSzogMFxuXHRcdFx0fTtcblx0XHR9KTtcblxuXHRcdC8vIENhbGN1bGF0ZSBzbG9wZXMgKGRlbHRhSykgYW5kIGluaXRpYWxpemUgdGFuZ2VudHMgKG1LKVxuXHRcdHZhciBwb2ludHNMZW4gPSBwb2ludHNXaXRoVGFuZ2VudHMubGVuZ3RoO1xuXHRcdHZhciBpLCBwb2ludEJlZm9yZSwgcG9pbnRDdXJyZW50LCBwb2ludEFmdGVyO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBwb2ludHNMZW47ICsraSkge1xuXHRcdFx0cG9pbnRDdXJyZW50ID0gcG9pbnRzV2l0aFRhbmdlbnRzW2ldO1xuXHRcdFx0aWYgKHBvaW50Q3VycmVudC5tb2RlbC5za2lwKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRwb2ludEJlZm9yZSA9IGkgPiAwID8gcG9pbnRzV2l0aFRhbmdlbnRzW2kgLSAxXSA6IG51bGw7XG5cdFx0XHRwb2ludEFmdGVyID0gaSA8IHBvaW50c0xlbiAtIDEgPyBwb2ludHNXaXRoVGFuZ2VudHNbaSArIDFdIDogbnVsbDtcblx0XHRcdGlmIChwb2ludEFmdGVyICYmICFwb2ludEFmdGVyLm1vZGVsLnNraXApIHtcblx0XHRcdFx0dmFyIHNsb3BlRGVsdGFYID0gKHBvaW50QWZ0ZXIubW9kZWwueCAtIHBvaW50Q3VycmVudC5tb2RlbC54KTtcblxuXHRcdFx0XHQvLyBJbiB0aGUgY2FzZSBvZiB0d28gcG9pbnRzIHRoYXQgYXBwZWFyIGF0IHRoZSBzYW1lIHggcGl4ZWwsIHNsb3BlRGVsdGFYIGlzIDBcblx0XHRcdFx0cG9pbnRDdXJyZW50LmRlbHRhSyA9IHNsb3BlRGVsdGFYICE9PSAwID8gKHBvaW50QWZ0ZXIubW9kZWwueSAtIHBvaW50Q3VycmVudC5tb2RlbC55KSAvIHNsb3BlRGVsdGFYIDogMDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFwb2ludEJlZm9yZSB8fCBwb2ludEJlZm9yZS5tb2RlbC5za2lwKSB7XG5cdFx0XHRcdHBvaW50Q3VycmVudC5tSyA9IHBvaW50Q3VycmVudC5kZWx0YUs7XG5cdFx0XHR9IGVsc2UgaWYgKCFwb2ludEFmdGVyIHx8IHBvaW50QWZ0ZXIubW9kZWwuc2tpcCkge1xuXHRcdFx0XHRwb2ludEN1cnJlbnQubUsgPSBwb2ludEJlZm9yZS5kZWx0YUs7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuc2lnbihwb2ludEJlZm9yZS5kZWx0YUspICE9PSB0aGlzLnNpZ24ocG9pbnRDdXJyZW50LmRlbHRhSykpIHtcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1LID0gMDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBvaW50Q3VycmVudC5tSyA9IChwb2ludEJlZm9yZS5kZWx0YUsgKyBwb2ludEN1cnJlbnQuZGVsdGFLKSAvIDI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRqdXN0IHRhbmdlbnRzIHRvIGVuc3VyZSBtb25vdG9uaWMgcHJvcGVydGllc1xuXHRcdHZhciBhbHBoYUssIGJldGFLLCB0YXVLLCBzcXVhcmVkTWFnbml0dWRlO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBwb2ludHNMZW4gLSAxOyArK2kpIHtcblx0XHRcdHBvaW50Q3VycmVudCA9IHBvaW50c1dpdGhUYW5nZW50c1tpXTtcblx0XHRcdHBvaW50QWZ0ZXIgPSBwb2ludHNXaXRoVGFuZ2VudHNbaSArIDFdO1xuXHRcdFx0aWYgKHBvaW50Q3VycmVudC5tb2RlbC5za2lwIHx8IHBvaW50QWZ0ZXIubW9kZWwuc2tpcCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGhlbHBlcnMkMS5hbG1vc3RFcXVhbHMocG9pbnRDdXJyZW50LmRlbHRhSywgMCwgdGhpcy5FUFNJTE9OKSkge1xuXHRcdFx0XHRwb2ludEN1cnJlbnQubUsgPSBwb2ludEFmdGVyLm1LID0gMDtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGFscGhhSyA9IHBvaW50Q3VycmVudC5tSyAvIHBvaW50Q3VycmVudC5kZWx0YUs7XG5cdFx0XHRiZXRhSyA9IHBvaW50QWZ0ZXIubUsgLyBwb2ludEN1cnJlbnQuZGVsdGFLO1xuXHRcdFx0c3F1YXJlZE1hZ25pdHVkZSA9IE1hdGgucG93KGFscGhhSywgMikgKyBNYXRoLnBvdyhiZXRhSywgMik7XG5cdFx0XHRpZiAoc3F1YXJlZE1hZ25pdHVkZSA8PSA5KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0YXVLID0gMyAvIE1hdGguc3FydChzcXVhcmVkTWFnbml0dWRlKTtcblx0XHRcdHBvaW50Q3VycmVudC5tSyA9IGFscGhhSyAqIHRhdUsgKiBwb2ludEN1cnJlbnQuZGVsdGFLO1xuXHRcdFx0cG9pbnRBZnRlci5tSyA9IGJldGFLICogdGF1SyAqIHBvaW50Q3VycmVudC5kZWx0YUs7XG5cdFx0fVxuXG5cdFx0Ly8gQ29tcHV0ZSBjb250cm9sIHBvaW50c1xuXHRcdHZhciBkZWx0YVg7XG5cdFx0Zm9yIChpID0gMDsgaSA8IHBvaW50c0xlbjsgKytpKSB7XG5cdFx0XHRwb2ludEN1cnJlbnQgPSBwb2ludHNXaXRoVGFuZ2VudHNbaV07XG5cdFx0XHRpZiAocG9pbnRDdXJyZW50Lm1vZGVsLnNraXApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHBvaW50QmVmb3JlID0gaSA+IDAgPyBwb2ludHNXaXRoVGFuZ2VudHNbaSAtIDFdIDogbnVsbDtcblx0XHRcdHBvaW50QWZ0ZXIgPSBpIDwgcG9pbnRzTGVuIC0gMSA/IHBvaW50c1dpdGhUYW5nZW50c1tpICsgMV0gOiBudWxsO1xuXHRcdFx0aWYgKHBvaW50QmVmb3JlICYmICFwb2ludEJlZm9yZS5tb2RlbC5za2lwKSB7XG5cdFx0XHRcdGRlbHRhWCA9IChwb2ludEN1cnJlbnQubW9kZWwueCAtIHBvaW50QmVmb3JlLm1vZGVsLngpIC8gMztcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1vZGVsLmNvbnRyb2xQb2ludFByZXZpb3VzWCA9IHBvaW50Q3VycmVudC5tb2RlbC54IC0gZGVsdGFYO1xuXHRcdFx0XHRwb2ludEN1cnJlbnQubW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNZID0gcG9pbnRDdXJyZW50Lm1vZGVsLnkgLSBkZWx0YVggKiBwb2ludEN1cnJlbnQubUs7XG5cdFx0XHR9XG5cdFx0XHRpZiAocG9pbnRBZnRlciAmJiAhcG9pbnRBZnRlci5tb2RlbC5za2lwKSB7XG5cdFx0XHRcdGRlbHRhWCA9IChwb2ludEFmdGVyLm1vZGVsLnggLSBwb2ludEN1cnJlbnQubW9kZWwueCkgLyAzO1xuXHRcdFx0XHRwb2ludEN1cnJlbnQubW9kZWwuY29udHJvbFBvaW50TmV4dFggPSBwb2ludEN1cnJlbnQubW9kZWwueCArIGRlbHRhWDtcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1vZGVsLmNvbnRyb2xQb2ludE5leHRZID0gcG9pbnRDdXJyZW50Lm1vZGVsLnkgKyBkZWx0YVggKiBwb2ludEN1cnJlbnQubUs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRoZWxwZXJzJDEubmV4dEl0ZW0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCBpbmRleCwgbG9vcCkge1xuXHRcdGlmIChsb29wKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggPj0gY29sbGVjdGlvbi5sZW5ndGggLSAxID8gY29sbGVjdGlvblswXSA6IGNvbGxlY3Rpb25baW5kZXggKyAxXTtcblx0XHR9XG5cdFx0cmV0dXJuIGluZGV4ID49IGNvbGxlY3Rpb24ubGVuZ3RoIC0gMSA/IGNvbGxlY3Rpb25bY29sbGVjdGlvbi5sZW5ndGggLSAxXSA6IGNvbGxlY3Rpb25baW5kZXggKyAxXTtcblx0fTtcblx0aGVscGVycyQxLnByZXZpb3VzSXRlbSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGluZGV4LCBsb29wKSB7XG5cdFx0aWYgKGxvb3ApIHtcblx0XHRcdHJldHVybiBpbmRleCA8PSAwID8gY29sbGVjdGlvbltjb2xsZWN0aW9uLmxlbmd0aCAtIDFdIDogY29sbGVjdGlvbltpbmRleCAtIDFdO1xuXHRcdH1cblx0XHRyZXR1cm4gaW5kZXggPD0gMCA/IGNvbGxlY3Rpb25bMF0gOiBjb2xsZWN0aW9uW2luZGV4IC0gMV07XG5cdH07XG5cdC8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBuaWNlIG51bWJlciBhbGdvcml0aG0gdXNlZCBpbiBkZXRlcm1pbmluZyB3aGVyZSBheGlzIGxhYmVscyB3aWxsIGdvXG5cdGhlbHBlcnMkMS5uaWNlTnVtID0gZnVuY3Rpb24ocmFuZ2UsIHJvdW5kKSB7XG5cdFx0dmFyIGV4cG9uZW50ID0gTWF0aC5mbG9vcihoZWxwZXJzJDEubG9nMTAocmFuZ2UpKTtcblx0XHR2YXIgZnJhY3Rpb24gPSByYW5nZSAvIE1hdGgucG93KDEwLCBleHBvbmVudCk7XG5cdFx0dmFyIG5pY2VGcmFjdGlvbjtcblxuXHRcdGlmIChyb3VuZCkge1xuXHRcdFx0aWYgKGZyYWN0aW9uIDwgMS41KSB7XG5cdFx0XHRcdG5pY2VGcmFjdGlvbiA9IDE7XG5cdFx0XHR9IGVsc2UgaWYgKGZyYWN0aW9uIDwgMykge1xuXHRcdFx0XHRuaWNlRnJhY3Rpb24gPSAyO1xuXHRcdFx0fSBlbHNlIGlmIChmcmFjdGlvbiA8IDcpIHtcblx0XHRcdFx0bmljZUZyYWN0aW9uID0gNTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5pY2VGcmFjdGlvbiA9IDEwO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZnJhY3Rpb24gPD0gMS4wKSB7XG5cdFx0XHRuaWNlRnJhY3Rpb24gPSAxO1xuXHRcdH0gZWxzZSBpZiAoZnJhY3Rpb24gPD0gMikge1xuXHRcdFx0bmljZUZyYWN0aW9uID0gMjtcblx0XHR9IGVsc2UgaWYgKGZyYWN0aW9uIDw9IDUpIHtcblx0XHRcdG5pY2VGcmFjdGlvbiA9IDU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5pY2VGcmFjdGlvbiA9IDEwO1xuXHRcdH1cblxuXHRcdHJldHVybiBuaWNlRnJhY3Rpb24gKiBNYXRoLnBvdygxMCwgZXhwb25lbnQpO1xuXHR9O1xuXHQvLyBSZXF1ZXN0IGFuaW1hdGlvbiBwb2x5ZmlsbCAtIGh0dHBzOi8vd3d3LnBhdWxpcmlzaC5jb20vMjAxMS9yZXF1ZXN0YW5pbWF0aW9uZnJhbWUtZm9yLXNtYXJ0LWFuaW1hdGluZy9cblx0aGVscGVycyQxLnJlcXVlc3RBbmltRnJhbWUgPSAoZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oY2FsbGJhY2spIHtcblx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHR3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHR3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHR3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHRmdW5jdGlvbihjYWxsYmFjaykge1xuXHRcdFx0XHRyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG5cdFx0XHR9O1xuXHR9KCkpO1xuXHQvLyAtLSBET00gbWV0aG9kc1xuXHRoZWxwZXJzJDEuZ2V0UmVsYXRpdmVQb3NpdGlvbiA9IGZ1bmN0aW9uKGV2dCwgY2hhcnQpIHtcblx0XHR2YXIgbW91c2VYLCBtb3VzZVk7XG5cdFx0dmFyIGUgPSBldnQub3JpZ2luYWxFdmVudCB8fCBldnQ7XG5cdFx0dmFyIGNhbnZhcyA9IGV2dC50YXJnZXQgfHwgZXZ0LnNyY0VsZW1lbnQ7XG5cdFx0dmFyIGJvdW5kaW5nUmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdHZhciB0b3VjaGVzID0gZS50b3VjaGVzO1xuXHRcdGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0bW91c2VYID0gdG91Y2hlc1swXS5jbGllbnRYO1xuXHRcdFx0bW91c2VZID0gdG91Y2hlc1swXS5jbGllbnRZO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1vdXNlWCA9IGUuY2xpZW50WDtcblx0XHRcdG1vdXNlWSA9IGUuY2xpZW50WTtcblx0XHR9XG5cblx0XHQvLyBTY2FsZSBtb3VzZSBjb29yZGluYXRlcyBpbnRvIGNhbnZhcyBjb29yZGluYXRlc1xuXHRcdC8vIGJ5IGZvbGxvd2luZyB0aGUgcGF0dGVybiBsYWlkIG91dCBieSAnamVycnlqJyBpbiB0aGUgY29tbWVudHMgb2Zcblx0XHQvLyBodHRwczovL3d3dy5odG1sNWNhbnZhc3R1dG9yaWFscy5jb20vYWR2YW5jZWQvaHRtbDUtY2FudmFzLW1vdXNlLWNvb3JkaW5hdGVzL1xuXHRcdHZhciBwYWRkaW5nTGVmdCA9IHBhcnNlRmxvYXQoaGVscGVycyQxLmdldFN0eWxlKGNhbnZhcywgJ3BhZGRpbmctbGVmdCcpKTtcblx0XHR2YXIgcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoaGVscGVycyQxLmdldFN0eWxlKGNhbnZhcywgJ3BhZGRpbmctdG9wJykpO1xuXHRcdHZhciBwYWRkaW5nUmlnaHQgPSBwYXJzZUZsb2F0KGhlbHBlcnMkMS5nZXRTdHlsZShjYW52YXMsICdwYWRkaW5nLXJpZ2h0JykpO1xuXHRcdHZhciBwYWRkaW5nQm90dG9tID0gcGFyc2VGbG9hdChoZWxwZXJzJDEuZ2V0U3R5bGUoY2FudmFzLCAncGFkZGluZy1ib3R0b20nKSk7XG5cdFx0dmFyIHdpZHRoID0gYm91bmRpbmdSZWN0LnJpZ2h0IC0gYm91bmRpbmdSZWN0LmxlZnQgLSBwYWRkaW5nTGVmdCAtIHBhZGRpbmdSaWdodDtcblx0XHR2YXIgaGVpZ2h0ID0gYm91bmRpbmdSZWN0LmJvdHRvbSAtIGJvdW5kaW5nUmVjdC50b3AgLSBwYWRkaW5nVG9wIC0gcGFkZGluZ0JvdHRvbTtcblxuXHRcdC8vIFdlIGRpdmlkZSBieSB0aGUgY3VycmVudCBkZXZpY2UgcGl4ZWwgcmF0aW8sIGJlY2F1c2UgdGhlIGNhbnZhcyBpcyBzY2FsZWQgdXAgYnkgdGhhdCBhbW91bnQgaW4gZWFjaCBkaXJlY3Rpb24uIEhvd2V2ZXJcblx0XHQvLyB0aGUgYmFja2VuZCBtb2RlbCBpcyBpbiB1bnNjYWxlZCBjb29yZGluYXRlcy4gU2luY2Ugd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aCBvdXIgbW9kZWwgY29vcmRpbmF0ZXMsIHdlIGdvIGJhY2sgaGVyZVxuXHRcdG1vdXNlWCA9IE1hdGgucm91bmQoKG1vdXNlWCAtIGJvdW5kaW5nUmVjdC5sZWZ0IC0gcGFkZGluZ0xlZnQpIC8gKHdpZHRoKSAqIGNhbnZhcy53aWR0aCAvIGNoYXJ0LmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvKTtcblx0XHRtb3VzZVkgPSBNYXRoLnJvdW5kKChtb3VzZVkgLSBib3VuZGluZ1JlY3QudG9wIC0gcGFkZGluZ1RvcCkgLyAoaGVpZ2h0KSAqIGNhbnZhcy5oZWlnaHQgLyBjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogbW91c2VYLFxuXHRcdFx0eTogbW91c2VZXG5cdFx0fTtcblxuXHR9O1xuXG5cdC8vIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgbWF4LXdpZHRoL21heC1oZWlnaHQgdmFsdWVzIHRoYXQgbWF5IGJlIHBlcmNlbnRhZ2VzIGludG8gYSBudW1iZXJcblx0ZnVuY3Rpb24gcGFyc2VNYXhTdHlsZShzdHlsZVZhbHVlLCBub2RlLCBwYXJlbnRQcm9wZXJ0eSkge1xuXHRcdHZhciB2YWx1ZUluUGl4ZWxzO1xuXHRcdGlmICh0eXBlb2Ygc3R5bGVWYWx1ZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHZhbHVlSW5QaXhlbHMgPSBwYXJzZUludChzdHlsZVZhbHVlLCAxMCk7XG5cblx0XHRcdGlmIChzdHlsZVZhbHVlLmluZGV4T2YoJyUnKSAhPT0gLTEpIHtcblx0XHRcdFx0Ly8gcGVyY2VudGFnZSAqIHNpemUgaW4gZGltZW5zaW9uXG5cdFx0XHRcdHZhbHVlSW5QaXhlbHMgPSB2YWx1ZUluUGl4ZWxzIC8gMTAwICogbm9kZS5wYXJlbnROb2RlW3BhcmVudFByb3BlcnR5XTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFsdWVJblBpeGVscyA9IHN0eWxlVmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlSW5QaXhlbHM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBpZiB0aGUgZ2l2ZW4gdmFsdWUgY29udGFpbnMgYW4gZWZmZWN0aXZlIGNvbnN0cmFpbnQuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBpc0NvbnN0cmFpbmVkVmFsdWUodmFsdWUpIHtcblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gJ25vbmUnO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG1heCB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGdpdmVuIERPTSBub2RlIGluIGEgY3Jvc3MtYnJvd3NlciBjb21wYXRpYmxlIGZhc2hpb25cblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZG9tTm9kZSAtIHRoZSBub2RlIHRvIGNoZWNrIHRoZSBjb25zdHJhaW50IG9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtYXhTdHlsZSAtIHRoZSBzdHlsZSB0aGF0IGRlZmluZXMgdGhlIG1heGltdW0gZm9yIHRoZSBkaXJlY3Rpb24gd2UgYXJlIHVzaW5nICgnbWF4LXdpZHRoJyAvICdtYXgtaGVpZ2h0Jylcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBlcmNlbnRhZ2VQcm9wZXJ0eSAtIHByb3BlcnR5IG9mIHBhcmVudCB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB3aWR0aCBhcyBhIHBlcmNlbnRhZ2Vcblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93d3cubmF0aGFuYWVsam9uZXMuY29tL2Jsb2cvMjAxMy9yZWFkaW5nLW1heC13aWR0aC1jcm9zcy1icm93c2VyfVxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0Q29uc3RyYWludERpbWVuc2lvbihkb21Ob2RlLCBtYXhTdHlsZSwgcGVyY2VudGFnZVByb3BlcnR5KSB7XG5cdFx0dmFyIHZpZXcgPSBkb2N1bWVudC5kZWZhdWx0Vmlldztcblx0XHR2YXIgcGFyZW50Tm9kZSA9IGhlbHBlcnMkMS5fZ2V0UGFyZW50Tm9kZShkb21Ob2RlKTtcblx0XHR2YXIgY29uc3RyYWluZWROb2RlID0gdmlldy5nZXRDb21wdXRlZFN0eWxlKGRvbU5vZGUpW21heFN0eWxlXTtcblx0XHR2YXIgY29uc3RyYWluZWRDb250YWluZXIgPSB2aWV3LmdldENvbXB1dGVkU3R5bGUocGFyZW50Tm9kZSlbbWF4U3R5bGVdO1xuXHRcdHZhciBoYXNDTm9kZSA9IGlzQ29uc3RyYWluZWRWYWx1ZShjb25zdHJhaW5lZE5vZGUpO1xuXHRcdHZhciBoYXNDQ29udGFpbmVyID0gaXNDb25zdHJhaW5lZFZhbHVlKGNvbnN0cmFpbmVkQ29udGFpbmVyKTtcblx0XHR2YXIgaW5maW5pdHkgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cblx0XHRpZiAoaGFzQ05vZGUgfHwgaGFzQ0NvbnRhaW5lcikge1xuXHRcdFx0cmV0dXJuIE1hdGgubWluKFxuXHRcdFx0XHRoYXNDTm9kZSA/IHBhcnNlTWF4U3R5bGUoY29uc3RyYWluZWROb2RlLCBkb21Ob2RlLCBwZXJjZW50YWdlUHJvcGVydHkpIDogaW5maW5pdHksXG5cdFx0XHRcdGhhc0NDb250YWluZXIgPyBwYXJzZU1heFN0eWxlKGNvbnN0cmFpbmVkQ29udGFpbmVyLCBwYXJlbnROb2RlLCBwZXJjZW50YWdlUHJvcGVydHkpIDogaW5maW5pdHkpO1xuXHRcdH1cblxuXHRcdHJldHVybiAnbm9uZSc7XG5cdH1cblx0Ly8gcmV0dXJucyBOdW1iZXIgb3IgdW5kZWZpbmVkIGlmIG5vIGNvbnN0cmFpbnRcblx0aGVscGVycyQxLmdldENvbnN0cmFpbnRXaWR0aCA9IGZ1bmN0aW9uKGRvbU5vZGUpIHtcblx0XHRyZXR1cm4gZ2V0Q29uc3RyYWludERpbWVuc2lvbihkb21Ob2RlLCAnbWF4LXdpZHRoJywgJ2NsaWVudFdpZHRoJyk7XG5cdH07XG5cdC8vIHJldHVybnMgTnVtYmVyIG9yIHVuZGVmaW5lZCBpZiBubyBjb25zdHJhaW50XG5cdGhlbHBlcnMkMS5nZXRDb25zdHJhaW50SGVpZ2h0ID0gZnVuY3Rpb24oZG9tTm9kZSkge1xuXHRcdHJldHVybiBnZXRDb25zdHJhaW50RGltZW5zaW9uKGRvbU5vZGUsICdtYXgtaGVpZ2h0JywgJ2NsaWVudEhlaWdodCcpO1xuXHR9O1xuXHQvKipcblx0ICogQHByaXZhdGVcbiBcdCAqL1xuXHRoZWxwZXJzJDEuX2NhbGN1bGF0ZVBhZGRpbmcgPSBmdW5jdGlvbihjb250YWluZXIsIHBhZGRpbmcsIHBhcmVudERpbWVuc2lvbikge1xuXHRcdHBhZGRpbmcgPSBoZWxwZXJzJDEuZ2V0U3R5bGUoY29udGFpbmVyLCBwYWRkaW5nKTtcblxuXHRcdHJldHVybiBwYWRkaW5nLmluZGV4T2YoJyUnKSA+IC0xID8gcGFyZW50RGltZW5zaW9uICogcGFyc2VJbnQocGFkZGluZywgMTApIC8gMTAwIDogcGFyc2VJbnQocGFkZGluZywgMTApO1xuXHR9O1xuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGhlbHBlcnMkMS5fZ2V0UGFyZW50Tm9kZSA9IGZ1bmN0aW9uKGRvbU5vZGUpIHtcblx0XHR2YXIgcGFyZW50ID0gZG9tTm9kZS5wYXJlbnROb2RlO1xuXHRcdGlmIChwYXJlbnQgJiYgcGFyZW50LnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IFNoYWRvd1Jvb3RdJykge1xuXHRcdFx0cGFyZW50ID0gcGFyZW50Lmhvc3Q7XG5cdFx0fVxuXHRcdHJldHVybiBwYXJlbnQ7XG5cdH07XG5cdGhlbHBlcnMkMS5nZXRNYXhpbXVtV2lkdGggPSBmdW5jdGlvbihkb21Ob2RlKSB7XG5cdFx0dmFyIGNvbnRhaW5lciA9IGhlbHBlcnMkMS5fZ2V0UGFyZW50Tm9kZShkb21Ob2RlKTtcblx0XHRpZiAoIWNvbnRhaW5lcikge1xuXHRcdFx0cmV0dXJuIGRvbU5vZGUuY2xpZW50V2lkdGg7XG5cdFx0fVxuXG5cdFx0dmFyIGNsaWVudFdpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuXHRcdHZhciBwYWRkaW5nTGVmdCA9IGhlbHBlcnMkMS5fY2FsY3VsYXRlUGFkZGluZyhjb250YWluZXIsICdwYWRkaW5nLWxlZnQnLCBjbGllbnRXaWR0aCk7XG5cdFx0dmFyIHBhZGRpbmdSaWdodCA9IGhlbHBlcnMkMS5fY2FsY3VsYXRlUGFkZGluZyhjb250YWluZXIsICdwYWRkaW5nLXJpZ2h0JywgY2xpZW50V2lkdGgpO1xuXG5cdFx0dmFyIHcgPSBjbGllbnRXaWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0O1xuXHRcdHZhciBjdyA9IGhlbHBlcnMkMS5nZXRDb25zdHJhaW50V2lkdGgoZG9tTm9kZSk7XG5cdFx0cmV0dXJuIGlzTmFOKGN3KSA/IHcgOiBNYXRoLm1pbih3LCBjdyk7XG5cdH07XG5cdGhlbHBlcnMkMS5nZXRNYXhpbXVtSGVpZ2h0ID0gZnVuY3Rpb24oZG9tTm9kZSkge1xuXHRcdHZhciBjb250YWluZXIgPSBoZWxwZXJzJDEuX2dldFBhcmVudE5vZGUoZG9tTm9kZSk7XG5cdFx0aWYgKCFjb250YWluZXIpIHtcblx0XHRcdHJldHVybiBkb21Ob2RlLmNsaWVudEhlaWdodDtcblx0XHR9XG5cblx0XHR2YXIgY2xpZW50SGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcblx0XHR2YXIgcGFkZGluZ1RvcCA9IGhlbHBlcnMkMS5fY2FsY3VsYXRlUGFkZGluZyhjb250YWluZXIsICdwYWRkaW5nLXRvcCcsIGNsaWVudEhlaWdodCk7XG5cdFx0dmFyIHBhZGRpbmdCb3R0b20gPSBoZWxwZXJzJDEuX2NhbGN1bGF0ZVBhZGRpbmcoY29udGFpbmVyLCAncGFkZGluZy1ib3R0b20nLCBjbGllbnRIZWlnaHQpO1xuXG5cdFx0dmFyIGggPSBjbGllbnRIZWlnaHQgLSBwYWRkaW5nVG9wIC0gcGFkZGluZ0JvdHRvbTtcblx0XHR2YXIgY2ggPSBoZWxwZXJzJDEuZ2V0Q29uc3RyYWludEhlaWdodChkb21Ob2RlKTtcblx0XHRyZXR1cm4gaXNOYU4oY2gpID8gaCA6IE1hdGgubWluKGgsIGNoKTtcblx0fTtcblx0aGVscGVycyQxLmdldFN0eWxlID0gZnVuY3Rpb24oZWwsIHByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGVsLmN1cnJlbnRTdHlsZSA/XG5cdFx0XHRlbC5jdXJyZW50U3R5bGVbcHJvcGVydHldIDpcblx0XHRcdGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpO1xuXHR9O1xuXHRoZWxwZXJzJDEucmV0aW5hU2NhbGUgPSBmdW5jdGlvbihjaGFydCwgZm9yY2VSYXRpbykge1xuXHRcdHZhciBwaXhlbFJhdGlvID0gY2hhcnQuY3VycmVudERldmljZVBpeGVsUmF0aW8gPSBmb3JjZVJhdGlvIHx8ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgfHwgMTtcblx0XHRpZiAocGl4ZWxSYXRpbyA9PT0gMSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjYW52YXMgPSBjaGFydC5jYW52YXM7XG5cdFx0dmFyIGhlaWdodCA9IGNoYXJ0LmhlaWdodDtcblx0XHR2YXIgd2lkdGggPSBjaGFydC53aWR0aDtcblxuXHRcdGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xuXHRcdGNhbnZhcy53aWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcblx0XHRjaGFydC5jdHguc2NhbGUocGl4ZWxSYXRpbywgcGl4ZWxSYXRpbyk7XG5cblx0XHQvLyBJZiBubyBzdHlsZSBoYXMgYmVlbiBzZXQgb24gdGhlIGNhbnZhcywgdGhlIHJlbmRlciBzaXplIGlzIHVzZWQgYXMgZGlzcGxheSBzaXplLFxuXHRcdC8vIG1ha2luZyB0aGUgY2hhcnQgdmlzdWFsbHkgYmlnZ2VyLCBzbyBsZXQncyBlbmZvcmNlIGl0IHRvIHRoZSBcImNvcnJlY3RcIiB2YWx1ZXMuXG5cdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8zNTc1XG5cdFx0aWYgKCFjYW52YXMuc3R5bGUuaGVpZ2h0ICYmICFjYW52YXMuc3R5bGUud2lkdGgpIHtcblx0XHRcdGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuXHRcdFx0Y2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuXHRcdH1cblx0fTtcblx0Ly8gLS0gQ2FudmFzIG1ldGhvZHNcblx0aGVscGVycyQxLmZvbnRTdHJpbmcgPSBmdW5jdGlvbihwaXhlbFNpemUsIGZvbnRTdHlsZSwgZm9udEZhbWlseSkge1xuXHRcdHJldHVybiBmb250U3R5bGUgKyAnICcgKyBwaXhlbFNpemUgKyAncHggJyArIGZvbnRGYW1pbHk7XG5cdH07XG5cdGhlbHBlcnMkMS5sb25nZXN0VGV4dCA9IGZ1bmN0aW9uKGN0eCwgZm9udCwgYXJyYXlPZlRoaW5ncywgY2FjaGUpIHtcblx0XHRjYWNoZSA9IGNhY2hlIHx8IHt9O1xuXHRcdHZhciBkYXRhID0gY2FjaGUuZGF0YSA9IGNhY2hlLmRhdGEgfHwge307XG5cdFx0dmFyIGdjID0gY2FjaGUuZ2FyYmFnZUNvbGxlY3QgPSBjYWNoZS5nYXJiYWdlQ29sbGVjdCB8fCBbXTtcblxuXHRcdGlmIChjYWNoZS5mb250ICE9PSBmb250KSB7XG5cdFx0XHRkYXRhID0gY2FjaGUuZGF0YSA9IHt9O1xuXHRcdFx0Z2MgPSBjYWNoZS5nYXJiYWdlQ29sbGVjdCA9IFtdO1xuXHRcdFx0Y2FjaGUuZm9udCA9IGZvbnQ7XG5cdFx0fVxuXG5cdFx0Y3R4LmZvbnQgPSBmb250O1xuXHRcdHZhciBsb25nZXN0ID0gMDtcblx0XHRoZWxwZXJzJDEuZWFjaChhcnJheU9mVGhpbmdzLCBmdW5jdGlvbih0aGluZykge1xuXHRcdFx0Ly8gVW5kZWZpbmVkIHN0cmluZ3MgYW5kIGFycmF5cyBzaG91bGQgbm90IGJlIG1lYXN1cmVkXG5cdFx0XHRpZiAodGhpbmcgIT09IHVuZGVmaW5lZCAmJiB0aGluZyAhPT0gbnVsbCAmJiBoZWxwZXJzJDEuaXNBcnJheSh0aGluZykgIT09IHRydWUpIHtcblx0XHRcdFx0bG9uZ2VzdCA9IGhlbHBlcnMkMS5tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCB0aGluZyk7XG5cdFx0XHR9IGVsc2UgaWYgKGhlbHBlcnMkMS5pc0FycmF5KHRoaW5nKSkge1xuXHRcdFx0XHQvLyBpZiBpdCBpcyBhbiBhcnJheSBsZXRzIG1lYXN1cmUgZWFjaCBlbGVtZW50XG5cdFx0XHRcdC8vIHRvIGRvIG1heWJlIHNpbXBsaWZ5IHRoaXMgZnVuY3Rpb24gYSBiaXQgc28gd2UgY2FuIGRvIHRoaXMgbW9yZSByZWN1cnNpdmVseT9cblx0XHRcdFx0aGVscGVycyQxLmVhY2godGhpbmcsIGZ1bmN0aW9uKG5lc3RlZFRoaW5nKSB7XG5cdFx0XHRcdFx0Ly8gVW5kZWZpbmVkIHN0cmluZ3MgYW5kIGFycmF5cyBzaG91bGQgbm90IGJlIG1lYXN1cmVkXG5cdFx0XHRcdFx0aWYgKG5lc3RlZFRoaW5nICE9PSB1bmRlZmluZWQgJiYgbmVzdGVkVGhpbmcgIT09IG51bGwgJiYgIWhlbHBlcnMkMS5pc0FycmF5KG5lc3RlZFRoaW5nKSkge1xuXHRcdFx0XHRcdFx0bG9uZ2VzdCA9IGhlbHBlcnMkMS5tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCBuZXN0ZWRUaGluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHZhciBnY0xlbiA9IGdjLmxlbmd0aCAvIDI7XG5cdFx0aWYgKGdjTGVuID4gYXJyYXlPZlRoaW5ncy5sZW5ndGgpIHtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZ2NMZW47IGkrKykge1xuXHRcdFx0XHRkZWxldGUgZGF0YVtnY1tpXV07XG5cdFx0XHR9XG5cdFx0XHRnYy5zcGxpY2UoMCwgZ2NMZW4pO1xuXHRcdH1cblx0XHRyZXR1cm4gbG9uZ2VzdDtcblx0fTtcblx0aGVscGVycyQxLm1lYXN1cmVUZXh0ID0gZnVuY3Rpb24oY3R4LCBkYXRhLCBnYywgbG9uZ2VzdCwgc3RyaW5nKSB7XG5cdFx0dmFyIHRleHRXaWR0aCA9IGRhdGFbc3RyaW5nXTtcblx0XHRpZiAoIXRleHRXaWR0aCkge1xuXHRcdFx0dGV4dFdpZHRoID0gZGF0YVtzdHJpbmddID0gY3R4Lm1lYXN1cmVUZXh0KHN0cmluZykud2lkdGg7XG5cdFx0XHRnYy5wdXNoKHN0cmluZyk7XG5cdFx0fVxuXHRcdGlmICh0ZXh0V2lkdGggPiBsb25nZXN0KSB7XG5cdFx0XHRsb25nZXN0ID0gdGV4dFdpZHRoO1xuXHRcdH1cblx0XHRyZXR1cm4gbG9uZ2VzdDtcblx0fTtcblx0aGVscGVycyQxLm51bWJlck9mTGFiZWxMaW5lcyA9IGZ1bmN0aW9uKGFycmF5T2ZUaGluZ3MpIHtcblx0XHR2YXIgbnVtYmVyT2ZMaW5lcyA9IDE7XG5cdFx0aGVscGVycyQxLmVhY2goYXJyYXlPZlRoaW5ncywgZnVuY3Rpb24odGhpbmcpIHtcblx0XHRcdGlmIChoZWxwZXJzJDEuaXNBcnJheSh0aGluZykpIHtcblx0XHRcdFx0aWYgKHRoaW5nLmxlbmd0aCA+IG51bWJlck9mTGluZXMpIHtcblx0XHRcdFx0XHRudW1iZXJPZkxpbmVzID0gdGhpbmcubGVuZ3RoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG51bWJlck9mTGluZXM7XG5cdH07XG5cblx0aGVscGVycyQxLmNvbG9yID0gIWNoYXJ0anNDb2xvciA/XG5cdFx0ZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ0NvbG9yLmpzIG5vdCBmb3VuZCEnKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0LyogZ2xvYmFsIENhbnZhc0dyYWRpZW50ICovXG5cdFx0XHRpZiAodmFsdWUgaW5zdGFuY2VvZiBDYW52YXNHcmFkaWVudCkge1xuXHRcdFx0XHR2YWx1ZSA9IGNvcmVfZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRDb2xvcjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNoYXJ0anNDb2xvcih2YWx1ZSk7XG5cdFx0fTtcblxuXHRoZWxwZXJzJDEuZ2V0SG92ZXJDb2xvciA9IGZ1bmN0aW9uKGNvbG9yVmFsdWUpIHtcblx0XHQvKiBnbG9iYWwgQ2FudmFzUGF0dGVybiAqL1xuXHRcdHJldHVybiAoY29sb3JWYWx1ZSBpbnN0YW5jZW9mIENhbnZhc1BhdHRlcm4gfHwgY29sb3JWYWx1ZSBpbnN0YW5jZW9mIENhbnZhc0dyYWRpZW50KSA/XG5cdFx0XHRjb2xvclZhbHVlIDpcblx0XHRcdGhlbHBlcnMkMS5jb2xvcihjb2xvclZhbHVlKS5zYXR1cmF0ZSgwLjUpLmRhcmtlbigwLjEpLnJnYlN0cmluZygpO1xuXHR9O1xufTtcblxuZnVuY3Rpb24gYWJzdHJhY3QoKSB7XG5cdHRocm93IG5ldyBFcnJvcihcblx0XHQnVGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkOiBlaXRoZXIgbm8gYWRhcHRlciBjYW4gJyArXG5cdFx0J2JlIGZvdW5kIG9yIGFuIGluY29tcGxldGUgaW50ZWdyYXRpb24gd2FzIHByb3ZpZGVkLidcblx0KTtcbn1cblxuLyoqXG4gKiBEYXRlIGFkYXB0ZXIgKGN1cnJlbnQgdXNlZCBieSB0aGUgdGltZSBzY2FsZSlcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuX2FkYXB0ZXJzLl9kYXRlXG4gKiBAbWVtYmVyb2YgQ2hhcnQuX2FkYXB0ZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ3VycmVudGx5IHN1cHBvcnRlZCB1bml0IHN0cmluZyB2YWx1ZXMuXG4gKiBAdHlwZWRlZiB7KCdtaWxsaXNlY29uZCd8J3NlY29uZCd8J21pbnV0ZSd8J2hvdXInfCdkYXknfCd3ZWVrJ3wnbW9udGgnfCdxdWFydGVyJ3wneWVhcicpfVxuICogQG1lbWJlcm9mIENoYXJ0Ll9hZGFwdGVycy5fZGF0ZVxuICogQG5hbWUgVW5pdFxuICovXG5cbi8qKlxuICogQGNsYXNzXG4gKi9cbmZ1bmN0aW9uIERhdGVBZGFwdGVyKG9wdGlvbnMpIHtcblx0dGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbn1cblxuaGVscGVycyQxLmV4dGVuZChEYXRlQWRhcHRlci5wcm90b3R5cGUsIC8qKiBAbGVuZHMgRGF0ZUFkYXB0ZXIgKi8ge1xuXHQvKipcblx0ICogUmV0dXJucyBhIG1hcCBvZiB0aW1lIGZvcm1hdHMgZm9yIHRoZSBzdXBwb3J0ZWQgZm9ybWF0dGluZyB1bml0cyBkZWZpbmVkXG5cdCAqIGluIFVuaXQgYXMgd2VsbCBhcyAnZGF0ZXRpbWUnIHJlcHJlc2VudGluZyBhIGRldGFpbGVkIGRhdGUvdGltZSBzdHJpbmcuXG5cdCAqIEByZXR1cm5zIHt7c3RyaW5nOiBzdHJpbmd9fVxuXHQgKi9cblx0Zm9ybWF0czogYWJzdHJhY3QsXG5cblx0LyoqXG5cdCAqIFBhcnNlcyB0aGUgZ2l2ZW4gYHZhbHVlYCBhbmQgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIHRpbWVzdGFtcC5cblx0ICogQHBhcmFtIHthbnl9IHZhbHVlIC0gdGhlIHZhbHVlIHRvIHBhcnNlICh1c3VhbGx5IGNvbWVzIGZyb20gdGhlIGRhdGEpXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbZm9ybWF0XSAtIHRoZSBleHBlY3RlZCBkYXRhIGZvcm1hdFxuXHQgKiBAcmV0dXJucyB7KG51bWJlcnxudWxsKX1cblx0ICogQGZ1bmN0aW9uXG5cdCAqL1xuXHRwYXJzZTogYWJzdHJhY3QsXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBkYXRlIGluIHRoZSBzcGVjaWZpZWQgYGZvcm1hdGAgZm9yIGEgZ2l2ZW4gYHRpbWVzdGFtcGAuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lc3RhbXAgLSB0aGUgdGltZXN0YW1wIHRvIGZvcm1hdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gdGhlIGRhdGUvdGltZSB0b2tlblxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblx0Zm9ybWF0OiBhYnN0cmFjdCxcblxuXHQvKipcblx0ICogQWRkcyB0aGUgc3BlY2lmaWVkIGBhbW91bnRgIG9mIGB1bml0YCB0byB0aGUgZ2l2ZW4gYHRpbWVzdGFtcGAuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lc3RhbXAgLSB0aGUgaW5wdXQgdGltZXN0YW1wXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnQgLSB0aGUgYW1vdW50IHRvIGFkZFxuXHQgKiBAcGFyYW0ge1VuaXR9IHVuaXQgLSB0aGUgdW5pdCBhcyBzdHJpbmdcblx0ICogQHJldHVybiB7bnVtYmVyfVxuXHQgKiBAZnVuY3Rpb25cblx0ICovXG5cdGFkZDogYWJzdHJhY3QsXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG51bWJlciBvZiBgdW5pdGAgYmV0d2VlbiB0aGUgZ2l2ZW4gdGltZXN0YW1wcy5cblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIHRoZSBpbnB1dCB0aW1lc3RhbXAgKHJlZmVyZW5jZSlcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIHRoZSB0aW1lc3RhbXAgdG8gc3Vic3RyYWN0XG5cdCAqIEBwYXJhbSB7VW5pdH0gdW5pdCAtIHRoZSB1bml0IGFzIHN0cmluZ1xuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblx0ZGlmZjogYWJzdHJhY3QsXG5cblx0LyoqXG5cdCAqIFJldHVybnMgc3RhcnQgb2YgYHVuaXRgIGZvciB0aGUgZ2l2ZW4gYHRpbWVzdGFtcGAuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lc3RhbXAgLSB0aGUgaW5wdXQgdGltZXN0YW1wXG5cdCAqIEBwYXJhbSB7VW5pdH0gdW5pdCAtIHRoZSB1bml0IGFzIHN0cmluZ1xuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dlZWtkYXldIC0gdGhlIElTTyBkYXkgb2YgdGhlIHdlZWsgd2l0aCAxIGJlaW5nIE1vbmRheVxuXHQgKiBhbmQgNyBiZWluZyBTdW5kYXkgKG9ubHkgbmVlZGVkIGlmIHBhcmFtICp1bml0KiBpcyBgaXNvV2Vla2ApLlxuXHQgKiBAZnVuY3Rpb25cblx0ICovXG5cdHN0YXJ0T2Y6IGFic3RyYWN0LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGVuZCBvZiBgdW5pdGAgZm9yIHRoZSBnaXZlbiBgdGltZXN0YW1wYC5cblx0ICogQHBhcmFtIHtudW1iZXJ9IHRpbWVzdGFtcCAtIHRoZSBpbnB1dCB0aW1lc3RhbXBcblx0ICogQHBhcmFtIHtVbml0fSB1bml0IC0gdGhlIHVuaXQgYXMgc3RyaW5nXG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblx0ZW5kT2Y6IGFic3RyYWN0LFxuXG5cdC8vIERFUFJFQ0FUSU9OU1xuXG5cdC8qKlxuXHQgKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3Igc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbCgpLFxuXHQgKiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBvbmx5IGJ5IHRoZSBtb21lbnQgYWRhcHRlci5cblx0ICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjguMFxuXHQgKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfY3JlYXRlOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxufSk7XG5cbkRhdGVBZGFwdGVyLm92ZXJyaWRlID0gZnVuY3Rpb24obWVtYmVycykge1xuXHRoZWxwZXJzJDEuZXh0ZW5kKERhdGVBZGFwdGVyLnByb3RvdHlwZSwgbWVtYmVycyk7XG59O1xuXG52YXIgX2RhdGUgPSBEYXRlQWRhcHRlcjtcblxudmFyIGNvcmVfYWRhcHRlcnMgPSB7XG5cdF9kYXRlOiBfZGF0ZVxufTtcblxuLyoqXG4gKiBOYW1lc3BhY2UgdG8gaG9sZCBzdGF0aWMgdGljayBnZW5lcmF0aW9uIGZ1bmN0aW9uc1xuICogQG5hbWVzcGFjZSBDaGFydC5UaWNrc1xuICovXG52YXIgY29yZV90aWNrcyA9IHtcblx0LyoqXG5cdCAqIE5hbWVzcGFjZSB0byBob2xkIGZvcm1hdHRlcnMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiB0aWNrc1xuXHQgKiBAbmFtZXNwYWNlIENoYXJ0LlRpY2tzLmZvcm1hdHRlcnNcblx0ICovXG5cdGZvcm1hdHRlcnM6IHtcblx0XHQvKipcblx0XHQgKiBGb3JtYXR0ZXIgZm9yIHZhbHVlIGxhYmVsc1xuXHRcdCAqIEBtZXRob2QgQ2hhcnQuVGlja3MuZm9ybWF0dGVycy52YWx1ZXNcblx0XHQgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGRpc3BsYXlcblx0XHQgKiBAcmV0dXJuIHtzdHJpbmd8c3RyaW5nW119IHRoZSBsYWJlbCB0byBkaXNwbGF5XG5cdFx0ICovXG5cdFx0dmFsdWVzOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIGhlbHBlcnMkMS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogJycgKyB2YWx1ZTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogRm9ybWF0dGVyIGZvciBsaW5lYXIgbnVtZXJpYyB0aWNrc1xuXHRcdCAqIEBtZXRob2QgQ2hhcnQuVGlja3MuZm9ybWF0dGVycy5saW5lYXJcblx0XHQgKiBAcGFyYW0gdGlja1ZhbHVlIHtudW1iZXJ9IHRoZSB2YWx1ZSB0byBiZSBmb3JtYXR0ZWRcblx0XHQgKiBAcGFyYW0gaW5kZXgge251bWJlcn0gdGhlIHBvc2l0aW9uIG9mIHRoZSB0aWNrVmFsdWUgcGFyYW1ldGVyIGluIHRoZSB0aWNrcyBhcnJheVxuXHRcdCAqIEBwYXJhbSB0aWNrcyB7bnVtYmVyW119IHRoZSBsaXN0IG9mIHRpY2tzIGJlaW5nIGNvbnZlcnRlZFxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0aWNrVmFsdWUgcGFyYW1ldGVyXG5cdFx0ICovXG5cdFx0bGluZWFyOiBmdW5jdGlvbih0aWNrVmFsdWUsIGluZGV4LCB0aWNrcykge1xuXHRcdFx0Ly8gSWYgd2UgaGF2ZSBsb3RzIG9mIHRpY2tzLCBkb24ndCB1c2UgdGhlIG9uZXNcblx0XHRcdHZhciBkZWx0YSA9IHRpY2tzLmxlbmd0aCA+IDMgPyB0aWNrc1syXSAtIHRpY2tzWzFdIDogdGlja3NbMV0gLSB0aWNrc1swXTtcblxuXHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIG51bWJlciBsaWtlIDIuNSBhcyB0aGUgZGVsdGEsIGZpZ3VyZSBvdXQgaG93IG1hbnkgZGVjaW1hbCBwbGFjZXMgd2UgbmVlZFxuXHRcdFx0aWYgKE1hdGguYWJzKGRlbHRhKSA+IDEpIHtcblx0XHRcdFx0aWYgKHRpY2tWYWx1ZSAhPT0gTWF0aC5mbG9vcih0aWNrVmFsdWUpKSB7XG5cdFx0XHRcdFx0Ly8gbm90IGFuIGludGVnZXJcblx0XHRcdFx0XHRkZWx0YSA9IHRpY2tWYWx1ZSAtIE1hdGguZmxvb3IodGlja1ZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbG9nRGVsdGEgPSBoZWxwZXJzJDEubG9nMTAoTWF0aC5hYnMoZGVsdGEpKTtcblx0XHRcdHZhciB0aWNrU3RyaW5nID0gJyc7XG5cblx0XHRcdGlmICh0aWNrVmFsdWUgIT09IDApIHtcblx0XHRcdFx0dmFyIG1heFRpY2sgPSBNYXRoLm1heChNYXRoLmFicyh0aWNrc1swXSksIE1hdGguYWJzKHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdKSk7XG5cdFx0XHRcdGlmIChtYXhUaWNrIDwgMWUtNCkgeyAvLyBhbGwgdGlja3MgYXJlIHNtYWxsIG51bWJlcnM7IHVzZSBzY2llbnRpZmljIG5vdGF0aW9uXG5cdFx0XHRcdFx0dmFyIGxvZ1RpY2sgPSBoZWxwZXJzJDEubG9nMTAoTWF0aC5hYnModGlja1ZhbHVlKSk7XG5cdFx0XHRcdFx0dGlja1N0cmluZyA9IHRpY2tWYWx1ZS50b0V4cG9uZW50aWFsKE1hdGguZmxvb3IobG9nVGljaykgLSBNYXRoLmZsb29yKGxvZ0RlbHRhKSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIG51bURlY2ltYWwgPSAtMSAqIE1hdGguZmxvb3IobG9nRGVsdGEpO1xuXHRcdFx0XHRcdG51bURlY2ltYWwgPSBNYXRoLm1heChNYXRoLm1pbihudW1EZWNpbWFsLCAyMCksIDApOyAvLyB0b0ZpeGVkIGhhcyBhIG1heCBvZiAyMCBkZWNpbWFsIHBsYWNlc1xuXHRcdFx0XHRcdHRpY2tTdHJpbmcgPSB0aWNrVmFsdWUudG9GaXhlZChudW1EZWNpbWFsKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGlja1N0cmluZyA9ICcwJzsgLy8gbmV2ZXIgc2hvdyBkZWNpbWFsIHBsYWNlcyBmb3IgMFxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGlja1N0cmluZztcblx0XHR9LFxuXG5cdFx0bG9nYXJpdGhtaWM6IGZ1bmN0aW9uKHRpY2tWYWx1ZSwgaW5kZXgsIHRpY2tzKSB7XG5cdFx0XHR2YXIgcmVtYWluID0gdGlja1ZhbHVlIC8gKE1hdGgucG93KDEwLCBNYXRoLmZsb29yKGhlbHBlcnMkMS5sb2cxMCh0aWNrVmFsdWUpKSkpO1xuXG5cdFx0XHRpZiAodGlja1ZhbHVlID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiAnMCc7XG5cdFx0XHR9IGVsc2UgaWYgKHJlbWFpbiA9PT0gMSB8fCByZW1haW4gPT09IDIgfHwgcmVtYWluID09PSA1IHx8IGluZGV4ID09PSAwIHx8IGluZGV4ID09PSB0aWNrcy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdHJldHVybiB0aWNrVmFsdWUudG9FeHBvbmVudGlhbCgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblx0fVxufTtcblxudmFyIHZhbHVlT3JEZWZhdWx0JDkgPSBoZWxwZXJzJDEudmFsdWVPckRlZmF1bHQ7XG52YXIgdmFsdWVBdEluZGV4T3JEZWZhdWx0ID0gaGVscGVycyQxLnZhbHVlQXRJbmRleE9yRGVmYXVsdDtcblxuY29yZV9kZWZhdWx0cy5fc2V0KCdzY2FsZScsIHtcblx0ZGlzcGxheTogdHJ1ZSxcblx0cG9zaXRpb246ICdsZWZ0Jyxcblx0b2Zmc2V0OiBmYWxzZSxcblxuXHQvLyBncmlkIGxpbmUgc2V0dGluZ3Ncblx0Z3JpZExpbmVzOiB7XG5cdFx0ZGlzcGxheTogdHJ1ZSxcblx0XHRjb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC4xKScsXG5cdFx0bGluZVdpZHRoOiAxLFxuXHRcdGRyYXdCb3JkZXI6IHRydWUsXG5cdFx0ZHJhd09uQ2hhcnRBcmVhOiB0cnVlLFxuXHRcdGRyYXdUaWNrczogdHJ1ZSxcblx0XHR0aWNrTWFya0xlbmd0aDogMTAsXG5cdFx0emVyb0xpbmVXaWR0aDogMSxcblx0XHR6ZXJvTGluZUNvbG9yOiAncmdiYSgwLDAsMCwwLjI1KScsXG5cdFx0emVyb0xpbmVCb3JkZXJEYXNoOiBbXSxcblx0XHR6ZXJvTGluZUJvcmRlckRhc2hPZmZzZXQ6IDAuMCxcblx0XHRvZmZzZXRHcmlkTGluZXM6IGZhbHNlLFxuXHRcdGJvcmRlckRhc2g6IFtdLFxuXHRcdGJvcmRlckRhc2hPZmZzZXQ6IDAuMFxuXHR9LFxuXG5cdC8vIHNjYWxlIGxhYmVsXG5cdHNjYWxlTGFiZWw6IHtcblx0XHQvLyBkaXNwbGF5IHByb3BlcnR5XG5cdFx0ZGlzcGxheTogZmFsc2UsXG5cblx0XHQvLyBhY3R1YWwgbGFiZWxcblx0XHRsYWJlbFN0cmluZzogJycsXG5cblx0XHQvLyB0b3AvYm90dG9tIHBhZGRpbmdcblx0XHRwYWRkaW5nOiB7XG5cdFx0XHR0b3A6IDQsXG5cdFx0XHRib3R0b206IDRcblx0XHR9XG5cdH0sXG5cblx0Ly8gbGFiZWwgc2V0dGluZ3Ncblx0dGlja3M6IHtcblx0XHRiZWdpbkF0WmVybzogZmFsc2UsXG5cdFx0bWluUm90YXRpb246IDAsXG5cdFx0bWF4Um90YXRpb246IDUwLFxuXHRcdG1pcnJvcjogZmFsc2UsXG5cdFx0cGFkZGluZzogMCxcblx0XHRyZXZlcnNlOiBmYWxzZSxcblx0XHRkaXNwbGF5OiB0cnVlLFxuXHRcdGF1dG9Ta2lwOiB0cnVlLFxuXHRcdGF1dG9Ta2lwUGFkZGluZzogMCxcblx0XHRsYWJlbE9mZnNldDogMCxcblx0XHQvLyBXZSBwYXNzIHRocm91Z2ggYXJyYXlzIHRvIGJlIHJlbmRlcmVkIGFzIG11bHRpbGluZSBsYWJlbHMsIHdlIGNvbnZlcnQgT3RoZXJzIHRvIHN0cmluZ3MgaGVyZS5cblx0XHRjYWxsYmFjazogY29yZV90aWNrcy5mb3JtYXR0ZXJzLnZhbHVlcyxcblx0XHRtaW5vcjoge30sXG5cdFx0bWFqb3I6IHt9XG5cdH1cbn0pO1xuXG5mdW5jdGlvbiBsYWJlbHNGcm9tVGlja3ModGlja3MpIHtcblx0dmFyIGxhYmVscyA9IFtdO1xuXHR2YXIgaSwgaWxlbjtcblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0bGFiZWxzLnB1c2godGlja3NbaV0ubGFiZWwpO1xuXHR9XG5cblx0cmV0dXJuIGxhYmVscztcbn1cblxuZnVuY3Rpb24gZ2V0UGl4ZWxGb3JHcmlkTGluZShzY2FsZSwgaW5kZXgsIG9mZnNldEdyaWRMaW5lcykge1xuXHR2YXIgbGluZVZhbHVlID0gc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKGluZGV4KTtcblxuXHRpZiAob2Zmc2V0R3JpZExpbmVzKSB7XG5cdFx0aWYgKHNjYWxlLmdldFRpY2tzKCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRsaW5lVmFsdWUgLT0gc2NhbGUuaXNIb3Jpem9udGFsKCkgP1xuXHRcdFx0XHRNYXRoLm1heChsaW5lVmFsdWUgLSBzY2FsZS5sZWZ0LCBzY2FsZS5yaWdodCAtIGxpbmVWYWx1ZSkgOlxuXHRcdFx0XHRNYXRoLm1heChsaW5lVmFsdWUgLSBzY2FsZS50b3AsIHNjYWxlLmJvdHRvbSAtIGxpbmVWYWx1ZSk7XG5cdFx0fSBlbHNlIGlmIChpbmRleCA9PT0gMCkge1xuXHRcdFx0bGluZVZhbHVlIC09IChzY2FsZS5nZXRQaXhlbEZvclRpY2soMSkgLSBsaW5lVmFsdWUpIC8gMjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGluZVZhbHVlIC09IChsaW5lVmFsdWUgLSBzY2FsZS5nZXRQaXhlbEZvclRpY2soaW5kZXggLSAxKSkgLyAyO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbGluZVZhbHVlO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlVGV4dFNpemUoY29udGV4dCwgdGljaywgZm9udCkge1xuXHRyZXR1cm4gaGVscGVycyQxLmlzQXJyYXkodGljaykgP1xuXHRcdGhlbHBlcnMkMS5sb25nZXN0VGV4dChjb250ZXh0LCBmb250LCB0aWNrKSA6XG5cdFx0Y29udGV4dC5tZWFzdXJlVGV4dCh0aWNrKS53aWR0aDtcbn1cblxudmFyIGNvcmVfc2NhbGUgPSBjb3JlX2VsZW1lbnQuZXh0ZW5kKHtcblx0LyoqXG5cdCAqIEdldCB0aGUgcGFkZGluZyBuZWVkZWQgZm9yIHRoZSBzY2FsZVxuXHQgKiBAbWV0aG9kIGdldFBhZGRpbmdcblx0ICogQHByaXZhdGVcblx0ICogQHJldHVybnMge1BhZGRpbmd9IHRoZSBuZWNlc3NhcnkgcGFkZGluZ1xuXHQgKi9cblx0Z2V0UGFkZGluZzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHRyZXR1cm4ge1xuXHRcdFx0bGVmdDogbWUucGFkZGluZ0xlZnQgfHwgMCxcblx0XHRcdHRvcDogbWUucGFkZGluZ1RvcCB8fCAwLFxuXHRcdFx0cmlnaHQ6IG1lLnBhZGRpbmdSaWdodCB8fCAwLFxuXHRcdFx0Ym90dG9tOiBtZS5wYWRkaW5nQm90dG9tIHx8IDBcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBzY2FsZSB0aWNrIG9iamVjdHMgKHtsYWJlbCwgbWFqb3J9KVxuXHQgKiBAc2luY2UgMi43XG5cdCAqL1xuXHRnZXRUaWNrczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3RpY2tzO1xuXHR9LFxuXG5cdC8vIFRoZXNlIG1ldGhvZHMgYXJlIG9yZGVyZWQgYnkgbGlmZWN5bGUuIFV0aWxpdGllcyB0aGVuIGZvbGxvdy5cblx0Ly8gQW55IGZ1bmN0aW9uIGRlZmluZWQgaGVyZSBpcyBpbmhlcml0ZWQgYnkgYWxsIHNjYWxlIHR5cGVzLlxuXHQvLyBBbnkgZnVuY3Rpb24gY2FuIGJlIGV4dGVuZGVkIGJ5IHRoZSBzY2FsZSB0eXBlXG5cblx0bWVyZ2VUaWNrc09wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB0aWNrcyA9IHRoaXMub3B0aW9ucy50aWNrcztcblx0XHRpZiAodGlja3MubWlub3IgPT09IGZhbHNlKSB7XG5cdFx0XHR0aWNrcy5taW5vciA9IHtcblx0XHRcdFx0ZGlzcGxheTogZmFsc2Vcblx0XHRcdH07XG5cdFx0fVxuXHRcdGlmICh0aWNrcy5tYWpvciA9PT0gZmFsc2UpIHtcblx0XHRcdHRpY2tzLm1ham9yID0ge1xuXHRcdFx0XHRkaXNwbGF5OiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0Zm9yICh2YXIga2V5IGluIHRpY2tzKSB7XG5cdFx0XHRpZiAoa2V5ICE9PSAnbWFqb3InICYmIGtleSAhPT0gJ21pbm9yJykge1xuXHRcdFx0XHRpZiAodHlwZW9mIHRpY2tzLm1pbm9yW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdFx0dGlja3MubWlub3Jba2V5XSA9IHRpY2tzW2tleV07XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVvZiB0aWNrcy5tYWpvcltrZXldID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdHRpY2tzLm1ham9yW2tleV0gPSB0aWNrc1trZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRiZWZvcmVVcGRhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMkMS5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlVXBkYXRlLCBbdGhpc10pO1xuXHR9LFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24obWF4V2lkdGgsIG1heEhlaWdodCwgbWFyZ2lucykge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGksIGlsZW4sIGxhYmVscywgbGFiZWwsIHRpY2tzLCB0aWNrO1xuXG5cdFx0Ly8gVXBkYXRlIExpZmVjeWNsZSAtIFByb2JhYmx5IGRvbid0IHdhbnQgdG8gZXZlciBleHRlbmQgb3Igb3ZlcndyaXRlIHRoaXMgZnVuY3Rpb24gOylcblx0XHRtZS5iZWZvcmVVcGRhdGUoKTtcblxuXHRcdC8vIEFic29yYiB0aGUgbWFzdGVyIG1lYXN1cmVtZW50c1xuXHRcdG1lLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0bWUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xuXHRcdG1lLm1hcmdpbnMgPSBoZWxwZXJzJDEuZXh0ZW5kKHtcblx0XHRcdGxlZnQ6IDAsXG5cdFx0XHRyaWdodDogMCxcblx0XHRcdHRvcDogMCxcblx0XHRcdGJvdHRvbTogMFxuXHRcdH0sIG1hcmdpbnMpO1xuXG5cdFx0bWUuX21heExhYmVsTGluZXMgPSAwO1xuXHRcdG1lLmxvbmdlc3RMYWJlbFdpZHRoID0gMDtcblx0XHRtZS5sb25nZXN0VGV4dENhY2hlID0gbWUubG9uZ2VzdFRleHRDYWNoZSB8fCB7fTtcblxuXHRcdC8vIERpbWVuc2lvbnNcblx0XHRtZS5iZWZvcmVTZXREaW1lbnNpb25zKCk7XG5cdFx0bWUuc2V0RGltZW5zaW9ucygpO1xuXHRcdG1lLmFmdGVyU2V0RGltZW5zaW9ucygpO1xuXG5cdFx0Ly8gRGF0YSBtaW4vbWF4XG5cdFx0bWUuYmVmb3JlRGF0YUxpbWl0cygpO1xuXHRcdG1lLmRldGVybWluZURhdGFMaW1pdHMoKTtcblx0XHRtZS5hZnRlckRhdGFMaW1pdHMoKTtcblxuXHRcdC8vIFRpY2tzIC0gYHRoaXMudGlja3NgIGlzIG5vdyBERVBSRUNBVEVEIVxuXHRcdC8vIEludGVybmFsIHRpY2tzIGFyZSBub3cgc3RvcmVkIGFzIG9iamVjdHMgaW4gdGhlIFBSSVZBVEUgYHRoaXMuX3RpY2tzYCBtZW1iZXJcblx0XHQvLyBhbmQgbXVzdCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBvdXRzaWRlIHRoaXMgY2xhc3MuIGB0aGlzLnRpY2tzYCBiZWluZ1xuXHRcdC8vIGFyb3VuZCBmb3IgbG9uZyB0aW1lIGFuZCBub3QgbWFya2VkIGFzIHByaXZhdGUsIHdlIGNhbid0IGNoYW5nZSBpdHMgc3RydWN0dXJlXG5cdFx0Ly8gd2l0aG91dCB1bmV4cGVjdGVkIGJyZWFraW5nIGNoYW5nZXMuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2NhbGUgdGlja3MsXG5cdFx0Ly8gdXNlIHNjYWxlLmdldFRpY2tzKCkgaW5zdGVhZC5cblxuXHRcdG1lLmJlZm9yZUJ1aWxkVGlja3MoKTtcblxuXHRcdC8vIE5ldyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHJldHVybiBhbiBhcnJheSBvZiBvYmplY3RzIGJ1dCBmb3IgQkFDS1dBUkQgQ09NUEFULFxuXHRcdC8vIHdlIHN0aWxsIHN1cHBvcnQgbm8gcmV0dXJuIChgdGhpcy50aWNrc2AgaW50ZXJuYWxseSBzZXQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCkuXG5cdFx0dGlja3MgPSBtZS5idWlsZFRpY2tzKCkgfHwgW107XG5cblx0XHQvLyBBbGxvdyBtb2RpZmljYXRpb24gb2YgdGlja3MgaW4gY2FsbGJhY2suXG5cdFx0dGlja3MgPSBtZS5hZnRlckJ1aWxkVGlja3ModGlja3MpIHx8IHRpY2tzO1xuXG5cdFx0bWUuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCk7XG5cblx0XHQvLyBOZXcgaW1wbGVtZW50YXRpb25zIHNob3VsZCByZXR1cm4gdGhlIGZvcm1hdHRlZCB0aWNrIGxhYmVscyBidXQgZm9yIEJBQ0tXQVJEXG5cdFx0Ly8gQ09NUEFULCB3ZSBzdGlsbCBzdXBwb3J0IG5vIHJldHVybiAoYHRoaXMudGlja3NgIGludGVybmFsbHkgY2hhbmdlZCBieSBjYWxsaW5nXG5cdFx0Ly8gdGhpcyBtZXRob2QgYW5kIHN1cHBvc2VkIHRvIGNvbnRhaW4gb25seSBzdHJpbmcgdmFsdWVzKS5cblx0XHRsYWJlbHMgPSBtZS5jb252ZXJ0VGlja3NUb0xhYmVscyh0aWNrcykgfHwgbWUudGlja3M7XG5cblx0XHRtZS5hZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbigpO1xuXG5cdFx0bWUudGlja3MgPSBsYWJlbHM7ICAgLy8gQkFDS1dBUkQgQ09NUEFUSUJJTElUWVxuXG5cdFx0Ly8gSU1QT1JUQU5UOiBmcm9tIHRoaXMgcG9pbnQsIHdlIGNvbnNpZGVyIHRoYXQgYHRoaXMudGlja3NgIHdpbGwgTkVWRVIgY2hhbmdlIVxuXG5cdFx0Ly8gQkFDS1dBUkQgQ09NUEFUOiBzeW5jaHJvbml6ZSBgX3RpY2tzYCB3aXRoIGxhYmVscyAoc28gcG90ZW50aWFsbHkgYHRoaXMudGlja3NgKVxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBsYWJlbHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRsYWJlbCA9IGxhYmVsc1tpXTtcblx0XHRcdHRpY2sgPSB0aWNrc1tpXTtcblx0XHRcdGlmICghdGljaykge1xuXHRcdFx0XHR0aWNrcy5wdXNoKHRpY2sgPSB7XG5cdFx0XHRcdFx0bGFiZWw6IGxhYmVsLFxuXHRcdFx0XHRcdG1ham9yOiBmYWxzZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRpY2subGFiZWwgPSBsYWJlbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtZS5fdGlja3MgPSB0aWNrcztcblxuXHRcdC8vIFRpY2sgUm90YXRpb25cblx0XHRtZS5iZWZvcmVDYWxjdWxhdGVUaWNrUm90YXRpb24oKTtcblx0XHRtZS5jYWxjdWxhdGVUaWNrUm90YXRpb24oKTtcblx0XHRtZS5hZnRlckNhbGN1bGF0ZVRpY2tSb3RhdGlvbigpO1xuXHRcdC8vIEZpdFxuXHRcdG1lLmJlZm9yZUZpdCgpO1xuXHRcdG1lLmZpdCgpO1xuXHRcdG1lLmFmdGVyRml0KCk7XG5cdFx0Ly9cblx0XHRtZS5hZnRlclVwZGF0ZSgpO1xuXG5cdFx0cmV0dXJuIG1lLm1pblNpemU7XG5cblx0fSxcblx0YWZ0ZXJVcGRhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMkMS5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJVcGRhdGUsIFt0aGlzXSk7XG5cdH0sXG5cblx0Ly9cblxuXHRiZWZvcmVTZXREaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzJDEuY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZVNldERpbWVuc2lvbnMsIFt0aGlzXSk7XG5cdH0sXG5cdHNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0Ly8gU2V0IHRoZSB1bmNvbnN0cmFpbmVkIGRpbWVuc2lvbiBiZWZvcmUgbGFiZWwgcm90YXRpb25cblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdC8vIFJlc2V0IHBvc2l0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyByb3RhdGlvblxuXHRcdFx0bWUud2lkdGggPSBtZS5tYXhXaWR0aDtcblx0XHRcdG1lLmxlZnQgPSAwO1xuXHRcdFx0bWUucmlnaHQgPSBtZS53aWR0aDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0O1xuXG5cdFx0XHQvLyBSZXNldCBwb3NpdGlvbiBiZWZvcmUgY2FsY3VsYXRpbmcgcm90YXRpb25cblx0XHRcdG1lLnRvcCA9IDA7XG5cdFx0XHRtZS5ib3R0b20gPSBtZS5oZWlnaHQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVzZXQgcGFkZGluZ1xuXHRcdG1lLnBhZGRpbmdMZWZ0ID0gMDtcblx0XHRtZS5wYWRkaW5nVG9wID0gMDtcblx0XHRtZS5wYWRkaW5nUmlnaHQgPSAwO1xuXHRcdG1lLnBhZGRpbmdCb3R0b20gPSAwO1xuXHR9LFxuXHRhZnRlclNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMkMS5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJTZXREaW1lbnNpb25zLCBbdGhpc10pO1xuXHR9LFxuXG5cdC8vIERhdGEgbGltaXRzXG5cdGJlZm9yZURhdGFMaW1pdHM6IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMkMS5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlRGF0YUxpbWl0cywgW3RoaXNdKTtcblx0fSxcblx0ZGV0ZXJtaW5lRGF0YUxpbWl0czogaGVscGVycyQxLm5vb3AsXG5cdGFmdGVyRGF0YUxpbWl0czogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycyQxLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5hZnRlckRhdGFMaW1pdHMsIFt0aGlzXSk7XG5cdH0sXG5cblx0Ly9cblx0YmVmb3JlQnVpbGRUaWNrczogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycyQxLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVCdWlsZFRpY2tzLCBbdGhpc10pO1xuXHR9LFxuXHRidWlsZFRpY2tzOiBoZWxwZXJzJDEubm9vcCxcblx0YWZ0ZXJCdWlsZFRpY2tzOiBmdW5jdGlvbih0aWNrcykge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0Ly8gdGlja3MgaXMgZW1wdHkgZm9yIG9sZCBheGlzIGltcGxlbWVudGF0aW9ucyBoZXJlXG5cdFx0aWYgKGhlbHBlcnMkMS5pc0FycmF5KHRpY2tzKSAmJiB0aWNrcy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBoZWxwZXJzJDEuY2FsbGJhY2sobWUub3B0aW9ucy5hZnRlckJ1aWxkVGlja3MsIFttZSwgdGlja3NdKTtcblx0XHR9XG5cdFx0Ly8gU3VwcG9ydCBvbGQgaW1wbGVtZW50YXRpb25zICh0aGF0IG1vZGlmaWVkIGB0aGlzLnRpY2tzYCBkaXJlY3RseSBpbiBidWlsZFRpY2tzKVxuXHRcdG1lLnRpY2tzID0gaGVscGVycyQxLmNhbGxiYWNrKG1lLm9wdGlvbnMuYWZ0ZXJCdWlsZFRpY2tzLCBbbWUsIG1lLnRpY2tzXSkgfHwgbWUudGlja3M7XG5cdFx0cmV0dXJuIHRpY2tzO1xuXHR9LFxuXG5cdGJlZm9yZVRpY2tUb0xhYmVsQ29udmVyc2lvbjogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycyQxLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb24sIFt0aGlzXSk7XG5cdH0sXG5cdGNvbnZlcnRUaWNrc1RvTGFiZWxzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdC8vIENvbnZlcnQgdGlja3MgdG8gc3RyaW5nc1xuXHRcdHZhciB0aWNrT3B0cyA9IG1lLm9wdGlvbnMudGlja3M7XG5cdFx0bWUudGlja3MgPSBtZS50aWNrcy5tYXAodGlja09wdHMudXNlckNhbGxiYWNrIHx8IHRpY2tPcHRzLmNhbGxiYWNrLCB0aGlzKTtcblx0fSxcblx0YWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb246IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMkMS5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24sIFt0aGlzXSk7XG5cdH0sXG5cblx0Ly9cblxuXHRiZWZvcmVDYWxjdWxhdGVUaWNrUm90YXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMkMS5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlQ2FsY3VsYXRlVGlja1JvdGF0aW9uLCBbdGhpc10pO1xuXHR9LFxuXHRjYWxjdWxhdGVUaWNrUm90YXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGNvbnRleHQgPSBtZS5jdHg7XG5cdFx0dmFyIHRpY2tPcHRzID0gbWUub3B0aW9ucy50aWNrcztcblx0XHR2YXIgbGFiZWxzID0gbGFiZWxzRnJvbVRpY2tzKG1lLl90aWNrcyk7XG5cblx0XHQvLyBHZXQgdGhlIHdpZHRoIG9mIGVhY2ggZ3JpZCBieSBjYWxjdWxhdGluZyB0aGUgZGlmZmVyZW5jZVxuXHRcdC8vIGJldHdlZW4geCBvZmZzZXRzIGJldHdlZW4gMCBhbmQgMS5cblx0XHR2YXIgdGlja0ZvbnQgPSBoZWxwZXJzJDEub3B0aW9ucy5fcGFyc2VGb250KHRpY2tPcHRzKTtcblx0XHRjb250ZXh0LmZvbnQgPSB0aWNrRm9udC5zdHJpbmc7XG5cblx0XHR2YXIgbGFiZWxSb3RhdGlvbiA9IHRpY2tPcHRzLm1pblJvdGF0aW9uIHx8IDA7XG5cblx0XHRpZiAobGFiZWxzLmxlbmd0aCAmJiBtZS5vcHRpb25zLmRpc3BsYXkgJiYgbWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdHZhciBvcmlnaW5hbExhYmVsV2lkdGggPSBoZWxwZXJzJDEubG9uZ2VzdFRleHQoY29udGV4dCwgdGlja0ZvbnQuc3RyaW5nLCBsYWJlbHMsIG1lLmxvbmdlc3RUZXh0Q2FjaGUpO1xuXHRcdFx0dmFyIGxhYmVsV2lkdGggPSBvcmlnaW5hbExhYmVsV2lkdGg7XG5cdFx0XHR2YXIgY29zUm90YXRpb24sIHNpblJvdGF0aW9uO1xuXG5cdFx0XHQvLyBBbGxvdyAzIHBpeGVscyB4MiBwYWRkaW5nIGVpdGhlciBzaWRlIGZvciBsYWJlbCByZWFkYWJpbGl0eVxuXHRcdFx0dmFyIHRpY2tXaWR0aCA9IG1lLmdldFBpeGVsRm9yVGljaygxKSAtIG1lLmdldFBpeGVsRm9yVGljaygwKSAtIDY7XG5cblx0XHRcdC8vIE1heCBsYWJlbCByb3RhdGlvbiBjYW4gYmUgc2V0IG9yIGRlZmF1bHQgdG8gOTAgLSBhbHNvIGFjdCBhcyBhIGxvb3AgY291bnRlclxuXHRcdFx0d2hpbGUgKGxhYmVsV2lkdGggPiB0aWNrV2lkdGggJiYgbGFiZWxSb3RhdGlvbiA8IHRpY2tPcHRzLm1heFJvdGF0aW9uKSB7XG5cdFx0XHRcdHZhciBhbmdsZVJhZGlhbnMgPSBoZWxwZXJzJDEudG9SYWRpYW5zKGxhYmVsUm90YXRpb24pO1xuXHRcdFx0XHRjb3NSb3RhdGlvbiA9IE1hdGguY29zKGFuZ2xlUmFkaWFucyk7XG5cdFx0XHRcdHNpblJvdGF0aW9uID0gTWF0aC5zaW4oYW5nbGVSYWRpYW5zKTtcblxuXHRcdFx0XHRpZiAoc2luUm90YXRpb24gKiBvcmlnaW5hbExhYmVsV2lkdGggPiBtZS5tYXhIZWlnaHQpIHtcblx0XHRcdFx0XHQvLyBnbyBiYWNrIG9uZSBzdGVwXG5cdFx0XHRcdFx0bGFiZWxSb3RhdGlvbi0tO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGFiZWxSb3RhdGlvbisrO1xuXHRcdFx0XHRsYWJlbFdpZHRoID0gY29zUm90YXRpb24gKiBvcmlnaW5hbExhYmVsV2lkdGg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bWUubGFiZWxSb3RhdGlvbiA9IGxhYmVsUm90YXRpb247XG5cdH0sXG5cdGFmdGVyQ2FsY3VsYXRlVGlja1JvdGF0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzJDEuY2FsbGJhY2sodGhpcy5vcHRpb25zLmFmdGVyQ2FsY3VsYXRlVGlja1JvdGF0aW9uLCBbdGhpc10pO1xuXHR9LFxuXG5cdC8vXG5cblx0YmVmb3JlRml0OiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzJDEuY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZUZpdCwgW3RoaXNdKTtcblx0fSxcblx0Zml0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdC8vIFJlc2V0XG5cdFx0dmFyIG1pblNpemUgPSBtZS5taW5TaXplID0ge1xuXHRcdFx0d2lkdGg6IDAsXG5cdFx0XHRoZWlnaHQ6IDBcblx0XHR9O1xuXG5cdFx0dmFyIGxhYmVscyA9IGxhYmVsc0Zyb21UaWNrcyhtZS5fdGlja3MpO1xuXG5cdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdHZhciB0aWNrT3B0cyA9IG9wdHMudGlja3M7XG5cdFx0dmFyIHNjYWxlTGFiZWxPcHRzID0gb3B0cy5zY2FsZUxhYmVsO1xuXHRcdHZhciBncmlkTGluZU9wdHMgPSBvcHRzLmdyaWRMaW5lcztcblx0XHR2YXIgZGlzcGxheSA9IG1lLl9pc1Zpc2libGUoKTtcblx0XHR2YXIgcG9zaXRpb24gPSBvcHRzLnBvc2l0aW9uO1xuXHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblxuXHRcdHZhciBwYXJzZUZvbnQgPSBoZWxwZXJzJDEub3B0aW9ucy5fcGFyc2VGb250O1xuXHRcdHZhciB0aWNrRm9udCA9IHBhcnNlRm9udCh0aWNrT3B0cyk7XG5cdFx0dmFyIHRpY2tNYXJrTGVuZ3RoID0gb3B0cy5ncmlkTGluZXMudGlja01hcmtMZW5ndGg7XG5cblx0XHQvLyBXaWR0aFxuXHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdC8vIHN1YnRyYWN0IHRoZSBtYXJnaW5zIHRvIGxpbmUgdXAgd2l0aCB0aGUgY2hhcnRBcmVhIGlmIHdlIGFyZSBhIGZ1bGwgd2lkdGggc2NhbGVcblx0XHRcdG1pblNpemUud2lkdGggPSBtZS5pc0Z1bGxXaWR0aCgpID8gbWUubWF4V2lkdGggLSBtZS5tYXJnaW5zLmxlZnQgLSBtZS5tYXJnaW5zLnJpZ2h0IDogbWUubWF4V2lkdGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1pblNpemUud2lkdGggPSBkaXNwbGF5ICYmIGdyaWRMaW5lT3B0cy5kcmF3VGlja3MgPyB0aWNrTWFya0xlbmd0aCA6IDA7XG5cdFx0fVxuXG5cdFx0Ly8gaGVpZ2h0XG5cdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0bWluU2l6ZS5oZWlnaHQgPSBkaXNwbGF5ICYmIGdyaWRMaW5lT3B0cy5kcmF3VGlja3MgPyB0aWNrTWFya0xlbmd0aCA6IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1pblNpemUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0OyAvLyBmaWxsIGFsbCB0aGUgaGVpZ2h0XG5cdFx0fVxuXG5cdFx0Ly8gQXJlIHdlIHNob3dpbmcgYSB0aXRsZSBmb3IgdGhlIHNjYWxlP1xuXHRcdGlmIChzY2FsZUxhYmVsT3B0cy5kaXNwbGF5ICYmIGRpc3BsYXkpIHtcblx0XHRcdHZhciBzY2FsZUxhYmVsRm9udCA9IHBhcnNlRm9udChzY2FsZUxhYmVsT3B0cyk7XG5cdFx0XHR2YXIgc2NhbGVMYWJlbFBhZGRpbmcgPSBoZWxwZXJzJDEub3B0aW9ucy50b1BhZGRpbmcoc2NhbGVMYWJlbE9wdHMucGFkZGluZyk7XG5cdFx0XHR2YXIgZGVsdGFIZWlnaHQgPSBzY2FsZUxhYmVsRm9udC5saW5lSGVpZ2h0ICsgc2NhbGVMYWJlbFBhZGRpbmcuaGVpZ2h0O1xuXG5cdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRcdG1pblNpemUuaGVpZ2h0ICs9IGRlbHRhSGVpZ2h0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWluU2l6ZS53aWR0aCArPSBkZWx0YUhlaWdodDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBEb24ndCBib3RoZXIgZml0dGluZyB0aGUgdGlja3MgaWYgd2UgYXJlIG5vdCBzaG93aW5nIHRoZSBsYWJlbHNcblx0XHRpZiAodGlja09wdHMuZGlzcGxheSAmJiBkaXNwbGF5KSB7XG5cdFx0XHR2YXIgbGFyZ2VzdFRleHRXaWR0aCA9IGhlbHBlcnMkMS5sb25nZXN0VGV4dChtZS5jdHgsIHRpY2tGb250LnN0cmluZywgbGFiZWxzLCBtZS5sb25nZXN0VGV4dENhY2hlKTtcblx0XHRcdHZhciB0YWxsZXN0TGFiZWxIZWlnaHRJbkxpbmVzID0gaGVscGVycyQxLm51bWJlck9mTGFiZWxMaW5lcyhsYWJlbHMpO1xuXHRcdFx0dmFyIGxpbmVTcGFjZSA9IHRpY2tGb250LnNpemUgKiAwLjU7XG5cdFx0XHR2YXIgdGlja1BhZGRpbmcgPSBtZS5vcHRpb25zLnRpY2tzLnBhZGRpbmc7XG5cblx0XHRcdC8vIFN0b3JlIG1heCBudW1iZXIgb2YgbGluZXMgYW5kIHdpZGVzdCBsYWJlbCBmb3IgX2F1dG9Ta2lwXG5cdFx0XHRtZS5fbWF4TGFiZWxMaW5lcyA9IHRhbGxlc3RMYWJlbEhlaWdodEluTGluZXM7XG5cdFx0XHRtZS5sb25nZXN0TGFiZWxXaWR0aCA9IGxhcmdlc3RUZXh0V2lkdGg7XG5cblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0dmFyIGFuZ2xlUmFkaWFucyA9IGhlbHBlcnMkMS50b1JhZGlhbnMobWUubGFiZWxSb3RhdGlvbik7XG5cdFx0XHRcdHZhciBjb3NSb3RhdGlvbiA9IE1hdGguY29zKGFuZ2xlUmFkaWFucyk7XG5cdFx0XHRcdHZhciBzaW5Sb3RhdGlvbiA9IE1hdGguc2luKGFuZ2xlUmFkaWFucyk7XG5cblx0XHRcdFx0Ly8gVE9ETyAtIGltcHJvdmUgdGhpcyBjYWxjdWxhdGlvblxuXHRcdFx0XHR2YXIgbGFiZWxIZWlnaHQgPSAoc2luUm90YXRpb24gKiBsYXJnZXN0VGV4dFdpZHRoKVxuXHRcdFx0XHRcdCsgKHRpY2tGb250LmxpbmVIZWlnaHQgKiB0YWxsZXN0TGFiZWxIZWlnaHRJbkxpbmVzKVxuXHRcdFx0XHRcdCsgbGluZVNwYWNlOyAvLyBwYWRkaW5nXG5cblx0XHRcdFx0bWluU2l6ZS5oZWlnaHQgPSBNYXRoLm1pbihtZS5tYXhIZWlnaHQsIG1pblNpemUuaGVpZ2h0ICsgbGFiZWxIZWlnaHQgKyB0aWNrUGFkZGluZyk7XG5cblx0XHRcdFx0bWUuY3R4LmZvbnQgPSB0aWNrRm9udC5zdHJpbmc7XG5cdFx0XHRcdHZhciBmaXJzdExhYmVsV2lkdGggPSBjb21wdXRlVGV4dFNpemUobWUuY3R4LCBsYWJlbHNbMF0sIHRpY2tGb250LnN0cmluZyk7XG5cdFx0XHRcdHZhciBsYXN0TGFiZWxXaWR0aCA9IGNvbXB1dGVUZXh0U2l6ZShtZS5jdHgsIGxhYmVsc1tsYWJlbHMubGVuZ3RoIC0gMV0sIHRpY2tGb250LnN0cmluZyk7XG5cdFx0XHRcdHZhciBvZmZzZXRMZWZ0ID0gbWUuZ2V0UGl4ZWxGb3JUaWNrKDApIC0gbWUubGVmdDtcblx0XHRcdFx0dmFyIG9mZnNldFJpZ2h0ID0gbWUucmlnaHQgLSBtZS5nZXRQaXhlbEZvclRpY2sobGFiZWxzLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHR2YXIgcGFkZGluZ0xlZnQsIHBhZGRpbmdSaWdodDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhhdCBvdXIgdGlja3MgYXJlIGFsd2F5cyBpbnNpZGUgdGhlIGNhbnZhcy4gV2hlbiByb3RhdGVkLCB0aWNrcyBhcmUgcmlnaHQgYWxpZ25lZFxuXHRcdFx0XHQvLyB3aGljaCBtZWFucyB0aGF0IHRoZSByaWdodCBwYWRkaW5nIGlzIGRvbWluYXRlZCBieSB0aGUgZm9udCBoZWlnaHRcblx0XHRcdFx0aWYgKG1lLmxhYmVsUm90YXRpb24gIT09IDApIHtcblx0XHRcdFx0XHRwYWRkaW5nTGVmdCA9IHBvc2l0aW9uID09PSAnYm90dG9tJyA/IChjb3NSb3RhdGlvbiAqIGZpcnN0TGFiZWxXaWR0aCkgOiAoY29zUm90YXRpb24gKiBsaW5lU3BhY2UpO1xuXHRcdFx0XHRcdHBhZGRpbmdSaWdodCA9IHBvc2l0aW9uID09PSAnYm90dG9tJyA/IChjb3NSb3RhdGlvbiAqIGxpbmVTcGFjZSkgOiAoY29zUm90YXRpb24gKiBsYXN0TGFiZWxXaWR0aCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cGFkZGluZ0xlZnQgPSBmaXJzdExhYmVsV2lkdGggLyAyO1xuXHRcdFx0XHRcdHBhZGRpbmdSaWdodCA9IGxhc3RMYWJlbFdpZHRoIC8gMjtcblx0XHRcdFx0fVxuXHRcdFx0XHRtZS5wYWRkaW5nTGVmdCA9IE1hdGgubWF4KHBhZGRpbmdMZWZ0IC0gb2Zmc2V0TGVmdCwgMCkgKyAzOyAvLyBhZGQgMyBweCB0byBtb3ZlIGF3YXkgZnJvbSBjYW52YXMgZWRnZXNcblx0XHRcdFx0bWUucGFkZGluZ1JpZ2h0ID0gTWF0aC5tYXgocGFkZGluZ1JpZ2h0IC0gb2Zmc2V0UmlnaHQsIDApICsgMztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEEgdmVydGljYWwgYXhpcyBpcyBtb3JlIGNvbnN0cmFpbmVkIGJ5IHRoZSB3aWR0aC4gTGFiZWxzIGFyZSB0aGVcblx0XHRcdFx0Ly8gZG9taW5hbnQgZmFjdG9yIGhlcmUsIHNvIGdldCB0aGF0IGxlbmd0aCBmaXJzdCBhbmQgYWNjb3VudCBmb3IgcGFkZGluZ1xuXHRcdFx0XHRpZiAodGlja09wdHMubWlycm9yKSB7XG5cdFx0XHRcdFx0bGFyZ2VzdFRleHRXaWR0aCA9IDA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdXNlIGxpbmVTcGFjZSBmb3IgY29uc2lzdGVuY3kgd2l0aCBob3Jpem9udGFsIGF4aXNcblx0XHRcdFx0XHQvLyB0aWNrUGFkZGluZyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIGhvcml6b250YWxcblx0XHRcdFx0XHRsYXJnZXN0VGV4dFdpZHRoICs9IHRpY2tQYWRkaW5nICsgbGluZVNwYWNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bWluU2l6ZS53aWR0aCA9IE1hdGgubWluKG1lLm1heFdpZHRoLCBtaW5TaXplLndpZHRoICsgbGFyZ2VzdFRleHRXaWR0aCk7XG5cblx0XHRcdFx0bWUucGFkZGluZ1RvcCA9IHRpY2tGb250LnNpemUgLyAyO1xuXHRcdFx0XHRtZS5wYWRkaW5nQm90dG9tID0gdGlja0ZvbnQuc2l6ZSAvIDI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bWUuaGFuZGxlTWFyZ2lucygpO1xuXG5cdFx0bWUud2lkdGggPSBtaW5TaXplLndpZHRoO1xuXHRcdG1lLmhlaWdodCA9IG1pblNpemUuaGVpZ2h0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgbWFyZ2lucyBhbmQgcGFkZGluZyBpbnRlcmFjdGlvbnNcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGhhbmRsZU1hcmdpbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0aWYgKG1lLm1hcmdpbnMpIHtcblx0XHRcdG1lLnBhZGRpbmdMZWZ0ID0gTWF0aC5tYXgobWUucGFkZGluZ0xlZnQgLSBtZS5tYXJnaW5zLmxlZnQsIDApO1xuXHRcdFx0bWUucGFkZGluZ1RvcCA9IE1hdGgubWF4KG1lLnBhZGRpbmdUb3AgLSBtZS5tYXJnaW5zLnRvcCwgMCk7XG5cdFx0XHRtZS5wYWRkaW5nUmlnaHQgPSBNYXRoLm1heChtZS5wYWRkaW5nUmlnaHQgLSBtZS5tYXJnaW5zLnJpZ2h0LCAwKTtcblx0XHRcdG1lLnBhZGRpbmdCb3R0b20gPSBNYXRoLm1heChtZS5wYWRkaW5nQm90dG9tIC0gbWUubWFyZ2lucy5ib3R0b20sIDApO1xuXHRcdH1cblx0fSxcblxuXHRhZnRlckZpdDogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycyQxLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5hZnRlckZpdCwgW3RoaXNdKTtcblx0fSxcblxuXHQvLyBTaGFyZWQgTWV0aG9kc1xuXHRpc0hvcml6b250YWw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICd0b3AnIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2JvdHRvbSc7XG5cdH0sXG5cdGlzRnVsbFdpZHRoOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gKHRoaXMub3B0aW9ucy5mdWxsV2lkdGgpO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgY29ycmVjdCB2YWx1ZS4gTmFOIGJhZCBpbnB1dHMsIElmIHRoZSB2YWx1ZSB0eXBlIGlzIG9iamVjdCBnZXQgdGhlIHggb3IgeSBiYXNlZCBvbiB3aGV0aGVyIHdlIGFyZSBob3Jpem9udGFsIG9yIG5vdFxuXHRnZXRSaWdodFZhbHVlOiBmdW5jdGlvbihyYXdWYWx1ZSkge1xuXHRcdC8vIE51bGwgYW5kIHVuZGVmaW5lZCB2YWx1ZXMgZmlyc3Rcblx0XHRpZiAoaGVscGVycyQxLmlzTnVsbE9yVW5kZWYocmF3VmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gTmFOO1xuXHRcdH1cblx0XHQvLyBpc05hTihvYmplY3QpIHJldHVybnMgdHJ1ZSwgc28gbWFrZSBzdXJlIE5hTiBpcyBjaGVja2luZyBmb3IgYSBudW1iZXI7IERpc2NhcmQgSW5maW5pdGUgdmFsdWVzXG5cdFx0aWYgKCh0eXBlb2YgcmF3VmFsdWUgPT09ICdudW1iZXInIHx8IHJhd1ZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSAmJiAhaXNGaW5pdGUocmF3VmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gTmFOO1xuXHRcdH1cblx0XHQvLyBJZiBpdCBpcyBpbiBmYWN0IGFuIG9iamVjdCwgZGl2ZSBpbiBvbmUgbW9yZSBsZXZlbFxuXHRcdGlmIChyYXdWYWx1ZSkge1xuXHRcdFx0aWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdFx0aWYgKHJhd1ZhbHVlLnggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmdldFJpZ2h0VmFsdWUocmF3VmFsdWUueCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAocmF3VmFsdWUueSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldFJpZ2h0VmFsdWUocmF3VmFsdWUueSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVmFsdWUgaXMgZ29vZCwgcmV0dXJuIGl0XG5cdFx0cmV0dXJuIHJhd1ZhbHVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVc2VkIHRvIGdldCB0aGUgdmFsdWUgdG8gZGlzcGxheSBpbiB0aGUgdG9vbHRpcCBmb3IgdGhlIGRhdGEgYXQgdGhlIGdpdmVuIGluZGV4XG5cdCAqIEBwYXJhbSBpbmRleFxuXHQgKiBAcGFyYW0gZGF0YXNldEluZGV4XG5cdCAqL1xuXHRnZXRMYWJlbEZvckluZGV4OiBoZWxwZXJzJDEubm9vcCxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGdpdmVuIGRhdGEgcG9pbnQuIFZhbHVlIGNhbiBlaXRoZXIgYmUgYW4gaW5kZXggb3IgYSBudW1lcmljYWwgdmFsdWVcblx0ICogVGhlIGNvb3JkaW5hdGUgKDAsIDApIGlzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKiBAcGFyYW0gaW5kZXhcblx0ICogQHBhcmFtIGRhdGFzZXRJbmRleFxuXHQgKi9cblx0Z2V0UGl4ZWxGb3JWYWx1ZTogaGVscGVycyQxLm5vb3AsXG5cblx0LyoqXG5cdCAqIFVzZWQgdG8gZ2V0IHRoZSBkYXRhIHZhbHVlIGZyb20gYSBnaXZlbiBwaXhlbC4gVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiBnZXRQaXhlbEZvclZhbHVlXG5cdCAqIFRoZSBjb29yZGluYXRlICgwLCAwKSBpcyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhc1xuXHQgKiBAcGFyYW0gcGl4ZWxcblx0ICovXG5cdGdldFZhbHVlRm9yUGl4ZWw6IGhlbHBlcnMkMS5ub29wLFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgdGljayBhdCB0aGUgZ2l2ZW4gaW5kZXhcblx0ICogVGhlIGNvb3JkaW5hdGUgKDAsIDApIGlzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzXG5cdCAqL1xuXHRnZXRQaXhlbEZvclRpY2s6IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb2Zmc2V0ID0gbWUub3B0aW9ucy5vZmZzZXQ7XG5cdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHR2YXIgaW5uZXJXaWR0aCA9IG1lLndpZHRoIC0gKG1lLnBhZGRpbmdMZWZ0ICsgbWUucGFkZGluZ1JpZ2h0KTtcblx0XHRcdHZhciB0aWNrV2lkdGggPSBpbm5lcldpZHRoIC8gTWF0aC5tYXgoKG1lLl90aWNrcy5sZW5ndGggLSAob2Zmc2V0ID8gMCA6IDEpKSwgMSk7XG5cdFx0XHR2YXIgcGl4ZWwgPSAodGlja1dpZHRoICogaW5kZXgpICsgbWUucGFkZGluZ0xlZnQ7XG5cblx0XHRcdGlmIChvZmZzZXQpIHtcblx0XHRcdFx0cGl4ZWwgKz0gdGlja1dpZHRoIC8gMjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGZpbmFsVmFsID0gbWUubGVmdCArIHBpeGVsO1xuXHRcdFx0ZmluYWxWYWwgKz0gbWUuaXNGdWxsV2lkdGgoKSA/IG1lLm1hcmdpbnMubGVmdCA6IDA7XG5cdFx0XHRyZXR1cm4gZmluYWxWYWw7XG5cdFx0fVxuXHRcdHZhciBpbm5lckhlaWdodCA9IG1lLmhlaWdodCAtIChtZS5wYWRkaW5nVG9wICsgbWUucGFkZGluZ0JvdHRvbSk7XG5cdFx0cmV0dXJuIG1lLnRvcCArIChpbmRleCAqIChpbm5lckhlaWdodCAvIChtZS5fdGlja3MubGVuZ3RoIC0gMSkpKTtcblx0fSxcblxuXHQvKipcblx0ICogVXRpbGl0eSBmb3IgZ2V0dGluZyB0aGUgcGl4ZWwgbG9jYXRpb24gb2YgYSBwZXJjZW50YWdlIG9mIHNjYWxlXG5cdCAqIFRoZSBjb29yZGluYXRlICgwLCAwKSBpcyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhc1xuXHQgKi9cblx0Z2V0UGl4ZWxGb3JEZWNpbWFsOiBmdW5jdGlvbihkZWNpbWFsKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdHZhciBpbm5lcldpZHRoID0gbWUud2lkdGggLSAobWUucGFkZGluZ0xlZnQgKyBtZS5wYWRkaW5nUmlnaHQpO1xuXHRcdFx0dmFyIHZhbHVlT2Zmc2V0ID0gKGlubmVyV2lkdGggKiBkZWNpbWFsKSArIG1lLnBhZGRpbmdMZWZ0O1xuXG5cdFx0XHR2YXIgZmluYWxWYWwgPSBtZS5sZWZ0ICsgdmFsdWVPZmZzZXQ7XG5cdFx0XHRmaW5hbFZhbCArPSBtZS5pc0Z1bGxXaWR0aCgpID8gbWUubWFyZ2lucy5sZWZ0IDogMDtcblx0XHRcdHJldHVybiBmaW5hbFZhbDtcblx0XHR9XG5cdFx0cmV0dXJuIG1lLnRvcCArIChkZWNpbWFsICogbWUuaGVpZ2h0KTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcGl4ZWwgZm9yIHRoZSBtaW5pbXVtIGNoYXJ0IHZhbHVlXG5cdCAqIFRoZSBjb29yZGluYXRlICgwLCAwKSBpcyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhc1xuXHQgKi9cblx0Z2V0QmFzZVBpeGVsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRoaXMuZ2V0QmFzZVZhbHVlKCkpO1xuXHR9LFxuXG5cdGdldEJhc2VWYWx1ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbWluID0gbWUubWluO1xuXHRcdHZhciBtYXggPSBtZS5tYXg7XG5cblx0XHRyZXR1cm4gbWUuYmVnaW5BdFplcm8gPyAwIDpcblx0XHRcdG1pbiA8IDAgJiYgbWF4IDwgMCA/IG1heCA6XG5cdFx0XHRtaW4gPiAwICYmIG1heCA+IDAgPyBtaW4gOlxuXHRcdFx0MDtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBhIHN1YnNldCBvZiB0aWNrcyB0byBiZSBwbG90dGVkIHRvIGF2b2lkIG92ZXJsYXBwaW5nIGxhYmVscy5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9hdXRvU2tpcDogZnVuY3Rpb24odGlja3MpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblx0XHR2YXIgb3B0aW9uVGlja3MgPSBtZS5vcHRpb25zLnRpY2tzLm1pbm9yO1xuXHRcdHZhciB0aWNrQ291bnQgPSB0aWNrcy5sZW5ndGg7XG5cdFx0dmFyIHNraXBSYXRpbyA9IGZhbHNlO1xuXHRcdHZhciBtYXhUaWNrcyA9IG9wdGlvblRpY2tzLm1heFRpY2tzTGltaXQ7XG5cblx0XHQvLyBUb3RhbCBzcGFjZSBuZWVkZWQgdG8gZGlzcGxheSBhbGwgdGlja3MuIEZpcnN0IGFuZCBsYXN0IHRpY2tzIGFyZVxuXHRcdC8vIGRyYXduIGFzIHRoZWlyIGNlbnRlciBhdCBlbmQgb2YgYXhpcywgc28gdGlja0NvdW50LTFcblx0XHR2YXIgdGlja3NMZW5ndGggPSBtZS5fdGlja1NpemUoKSAqICh0aWNrQ291bnQgLSAxKTtcblxuXHRcdC8vIEF4aXMgbGVuZ3RoXG5cdFx0dmFyIGF4aXNMZW5ndGggPSBpc0hvcml6b250YWxcblx0XHRcdD8gbWUud2lkdGggLSAobWUucGFkZGluZ0xlZnQgKyBtZS5wYWRkaW5nUmlnaHQpXG5cdFx0XHQ6IG1lLmhlaWdodCAtIChtZS5wYWRkaW5nVG9wICsgbWUuUGFkZGluZ0JvdHRvbSk7XG5cblx0XHR2YXIgcmVzdWx0ID0gW107XG5cdFx0dmFyIGksIHRpY2s7XG5cblx0XHRpZiAodGlja3NMZW5ndGggPiBheGlzTGVuZ3RoKSB7XG5cdFx0XHRza2lwUmF0aW8gPSAxICsgTWF0aC5mbG9vcih0aWNrc0xlbmd0aCAvIGF4aXNMZW5ndGgpO1xuXHRcdH1cblxuXHRcdC8vIGlmIHRoZXkgZGVmaW5lZCBhIG1heCBudW1iZXIgb2Ygb3B0aW9uVGlja3MsXG5cdFx0Ly8gaW5jcmVhc2Ugc2tpcFJhdGlvIHVudGlsIHRoYXQgbnVtYmVyIGlzIG1ldFxuXHRcdGlmICh0aWNrQ291bnQgPiBtYXhUaWNrcykge1xuXHRcdFx0c2tpcFJhdGlvID0gTWF0aC5tYXgoc2tpcFJhdGlvLCAxICsgTWF0aC5mbG9vcih0aWNrQ291bnQgLyBtYXhUaWNrcykpO1xuXHRcdH1cblxuXHRcdGZvciAoaSA9IDA7IGkgPCB0aWNrQ291bnQ7IGkrKykge1xuXHRcdFx0dGljayA9IHRpY2tzW2ldO1xuXG5cdFx0XHRpZiAoc2tpcFJhdGlvID4gMSAmJiBpICUgc2tpcFJhdGlvID4gMCkge1xuXHRcdFx0XHQvLyBsZWF2ZSB0aWNrIGluIHBsYWNlIGJ1dCBtYWtlIHN1cmUgaXQncyBub3QgZGlzcGxheWVkICgjNDYzNSlcblx0XHRcdFx0ZGVsZXRlIHRpY2subGFiZWw7XG5cdFx0XHR9XG5cdFx0XHRyZXN1bHQucHVzaCh0aWNrKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF90aWNrU2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XG5cdFx0dmFyIG9wdGlvblRpY2tzID0gbWUub3B0aW9ucy50aWNrcy5taW5vcjtcblxuXHRcdC8vIENhbGN1bGF0ZSBzcGFjZSBuZWVkZWQgYnkgbGFiZWwgaW4gYXhpcyBkaXJlY3Rpb24uXG5cdFx0dmFyIHJvdCA9IGhlbHBlcnMkMS50b1JhZGlhbnMobWUubGFiZWxSb3RhdGlvbik7XG5cdFx0dmFyIGNvcyA9IE1hdGguYWJzKE1hdGguY29zKHJvdCkpO1xuXHRcdHZhciBzaW4gPSBNYXRoLmFicyhNYXRoLnNpbihyb3QpKTtcblxuXHRcdHZhciBwYWRkaW5nID0gb3B0aW9uVGlja3MuYXV0b1NraXBQYWRkaW5nIHx8IDA7XG5cdFx0dmFyIHcgPSAobWUubG9uZ2VzdExhYmVsV2lkdGggKyBwYWRkaW5nKSB8fCAwO1xuXG5cdFx0dmFyIHRpY2tGb250ID0gaGVscGVycyQxLm9wdGlvbnMuX3BhcnNlRm9udChvcHRpb25UaWNrcyk7XG5cdFx0dmFyIGggPSAobWUuX21heExhYmVsTGluZXMgKiB0aWNrRm9udC5saW5lSGVpZ2h0ICsgcGFkZGluZykgfHwgMDtcblxuXHRcdC8vIENhbGN1bGF0ZSBzcGFjZSBuZWVkZWQgZm9yIDEgdGljayBpbiBheGlzIGRpcmVjdGlvbi5cblx0XHRyZXR1cm4gaXNIb3Jpem9udGFsXG5cdFx0XHQ/IGggKiBjb3MgPiB3ICogc2luID8gdyAvIGNvcyA6IGggLyBzaW5cblx0XHRcdDogaCAqIHNpbiA8IHcgKiBjb3MgPyBoIC8gY29zIDogdyAvIHNpbjtcblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9pc1Zpc2libGU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0dmFyIGRpc3BsYXkgPSBtZS5vcHRpb25zLmRpc3BsYXk7XG5cdFx0dmFyIGksIGlsZW4sIG1ldGE7XG5cblx0XHRpZiAoZGlzcGxheSAhPT0gJ2F1dG8nKSB7XG5cdFx0XHRyZXR1cm4gISFkaXNwbGF5O1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gJ2F1dG8nLCB0aGUgc2NhbGUgaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgYXNzb2NpYXRlZCBkYXRhc2V0IGlzIHZpc2libGUuXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IGNoYXJ0LmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xuXHRcdFx0XHRtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG5cdFx0XHRcdGlmIChtZXRhLnhBeGlzSUQgPT09IG1lLmlkIHx8IG1ldGEueUF4aXNJRCA9PT0gbWUuaWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICogQWN0dWFsbHkgZHJhdyB0aGUgc2NhbGUgb24gdGhlIGNhbnZhc1xuXHQgKiBAcGFyYW0ge29iamVjdH0gY2hhcnRBcmVhIC0gdGhlIGFyZWEgb2YgdGhlIGNoYXJ0IHRvIGRyYXcgZnVsbCBncmlkIGxpbmVzIG9uXG5cdCAqL1xuXHRkcmF3OiBmdW5jdGlvbihjaGFydEFyZWEpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRpb25zID0gbWUub3B0aW9ucztcblxuXHRcdGlmICghbWUuX2lzVmlzaWJsZSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0dmFyIGNvbnRleHQgPSBtZS5jdHg7XG5cdFx0dmFyIGdsb2JhbERlZmF1bHRzID0gY29yZV9kZWZhdWx0cy5nbG9iYWw7XG5cdFx0dmFyIGRlZmF1bHRGb250Q29sb3IgPSBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udENvbG9yO1xuXHRcdHZhciBvcHRpb25UaWNrcyA9IG9wdGlvbnMudGlja3MubWlub3I7XG5cdFx0dmFyIG9wdGlvbk1ham9yVGlja3MgPSBvcHRpb25zLnRpY2tzLm1ham9yIHx8IG9wdGlvblRpY2tzO1xuXHRcdHZhciBncmlkTGluZXMgPSBvcHRpb25zLmdyaWRMaW5lcztcblx0XHR2YXIgc2NhbGVMYWJlbCA9IG9wdGlvbnMuc2NhbGVMYWJlbDtcblx0XHR2YXIgcG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uO1xuXG5cdFx0dmFyIGlzUm90YXRlZCA9IG1lLmxhYmVsUm90YXRpb24gIT09IDA7XG5cdFx0dmFyIGlzTWlycm9yZWQgPSBvcHRpb25UaWNrcy5taXJyb3I7XG5cdFx0dmFyIGlzSG9yaXpvbnRhbCA9IG1lLmlzSG9yaXpvbnRhbCgpO1xuXG5cdFx0dmFyIHBhcnNlRm9udCA9IGhlbHBlcnMkMS5vcHRpb25zLl9wYXJzZUZvbnQ7XG5cdFx0dmFyIHRpY2tzID0gb3B0aW9uVGlja3MuZGlzcGxheSAmJiBvcHRpb25UaWNrcy5hdXRvU2tpcCA/IG1lLl9hdXRvU2tpcChtZS5nZXRUaWNrcygpKSA6IG1lLmdldFRpY2tzKCk7XG5cdFx0dmFyIHRpY2tGb250Q29sb3IgPSB2YWx1ZU9yRGVmYXVsdCQ5KG9wdGlvblRpY2tzLmZvbnRDb2xvciwgZGVmYXVsdEZvbnRDb2xvcik7XG5cdFx0dmFyIHRpY2tGb250ID0gcGFyc2VGb250KG9wdGlvblRpY2tzKTtcblx0XHR2YXIgbGluZUhlaWdodCA9IHRpY2tGb250LmxpbmVIZWlnaHQ7XG5cdFx0dmFyIG1ham9yVGlja0ZvbnRDb2xvciA9IHZhbHVlT3JEZWZhdWx0JDkob3B0aW9uTWFqb3JUaWNrcy5mb250Q29sb3IsIGRlZmF1bHRGb250Q29sb3IpO1xuXHRcdHZhciBtYWpvclRpY2tGb250ID0gcGFyc2VGb250KG9wdGlvbk1ham9yVGlja3MpO1xuXHRcdHZhciB0aWNrUGFkZGluZyA9IG9wdGlvblRpY2tzLnBhZGRpbmc7XG5cdFx0dmFyIGxhYmVsT2Zmc2V0ID0gb3B0aW9uVGlja3MubGFiZWxPZmZzZXQ7XG5cblx0XHR2YXIgdGwgPSBncmlkTGluZXMuZHJhd1RpY2tzID8gZ3JpZExpbmVzLnRpY2tNYXJrTGVuZ3RoIDogMDtcblxuXHRcdHZhciBzY2FsZUxhYmVsRm9udENvbG9yID0gdmFsdWVPckRlZmF1bHQkOShzY2FsZUxhYmVsLmZvbnRDb2xvciwgZGVmYXVsdEZvbnRDb2xvcik7XG5cdFx0dmFyIHNjYWxlTGFiZWxGb250ID0gcGFyc2VGb250KHNjYWxlTGFiZWwpO1xuXHRcdHZhciBzY2FsZUxhYmVsUGFkZGluZyA9IGhlbHBlcnMkMS5vcHRpb25zLnRvUGFkZGluZyhzY2FsZUxhYmVsLnBhZGRpbmcpO1xuXHRcdHZhciBsYWJlbFJvdGF0aW9uUmFkaWFucyA9IGhlbHBlcnMkMS50b1JhZGlhbnMobWUubGFiZWxSb3RhdGlvbik7XG5cblx0XHR2YXIgaXRlbXNUb0RyYXcgPSBbXTtcblxuXHRcdHZhciBheGlzV2lkdGggPSBncmlkTGluZXMuZHJhd0JvcmRlciA/IHZhbHVlQXRJbmRleE9yRGVmYXVsdChncmlkTGluZXMubGluZVdpZHRoLCAwLCAwKSA6IDA7XG5cdFx0dmFyIGFsaWduUGl4ZWwgPSBoZWxwZXJzJDEuX2FsaWduUGl4ZWw7XG5cdFx0dmFyIGJvcmRlclZhbHVlLCB0aWNrU3RhcnQsIHRpY2tFbmQ7XG5cblx0XHRpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG5cdFx0XHRib3JkZXJWYWx1ZSA9IGFsaWduUGl4ZWwoY2hhcnQsIG1lLmJvdHRvbSwgYXhpc1dpZHRoKTtcblx0XHRcdHRpY2tTdGFydCA9IG1lLmJvdHRvbSAtIHRsO1xuXHRcdFx0dGlja0VuZCA9IGJvcmRlclZhbHVlIC0gYXhpc1dpZHRoIC8gMjtcblx0XHR9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnYm90dG9tJykge1xuXHRcdFx0Ym9yZGVyVmFsdWUgPSBhbGlnblBpeGVsKGNoYXJ0LCBtZS50b3AsIGF4aXNXaWR0aCk7XG5cdFx0XHR0aWNrU3RhcnQgPSBib3JkZXJWYWx1ZSArIGF4aXNXaWR0aCAvIDI7XG5cdFx0XHR0aWNrRW5kID0gbWUudG9wICsgdGw7XG5cdFx0fSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG5cdFx0XHRib3JkZXJWYWx1ZSA9IGFsaWduUGl4ZWwoY2hhcnQsIG1lLnJpZ2h0LCBheGlzV2lkdGgpO1xuXHRcdFx0dGlja1N0YXJ0ID0gbWUucmlnaHQgLSB0bDtcblx0XHRcdHRpY2tFbmQgPSBib3JkZXJWYWx1ZSAtIGF4aXNXaWR0aCAvIDI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJvcmRlclZhbHVlID0gYWxpZ25QaXhlbChjaGFydCwgbWUubGVmdCwgYXhpc1dpZHRoKTtcblx0XHRcdHRpY2tTdGFydCA9IGJvcmRlclZhbHVlICsgYXhpc1dpZHRoIC8gMjtcblx0XHRcdHRpY2tFbmQgPSBtZS5sZWZ0ICsgdGw7XG5cdFx0fVxuXG5cdFx0dmFyIGVwc2lsb24gPSAwLjAwMDAwMDE7IC8vIDAuMDAwMDAwMSBpcyBtYXJnaW4gaW4gcGl4ZWxzIGZvciBBY2N1bXVsYXRlZCBlcnJvci5cblxuXHRcdGhlbHBlcnMkMS5lYWNoKHRpY2tzLCBmdW5jdGlvbih0aWNrLCBpbmRleCkge1xuXHRcdFx0Ly8gYXV0b3NraXBwZXIgc2tpcHBlZCB0aGlzIHRpY2sgKCM0NjM1KVxuXHRcdFx0aWYgKGhlbHBlcnMkMS5pc051bGxPclVuZGVmKHRpY2subGFiZWwpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGxhYmVsID0gdGljay5sYWJlbDtcblx0XHRcdHZhciBsaW5lV2lkdGgsIGxpbmVDb2xvciwgYm9yZGVyRGFzaCwgYm9yZGVyRGFzaE9mZnNldDtcblx0XHRcdGlmIChpbmRleCA9PT0gbWUuemVyb0xpbmVJbmRleCAmJiBvcHRpb25zLm9mZnNldCA9PT0gZ3JpZExpbmVzLm9mZnNldEdyaWRMaW5lcykge1xuXHRcdFx0XHQvLyBEcmF3IHRoZSBmaXJzdCBpbmRleCBzcGVjaWFsbHlcblx0XHRcdFx0bGluZVdpZHRoID0gZ3JpZExpbmVzLnplcm9MaW5lV2lkdGg7XG5cdFx0XHRcdGxpbmVDb2xvciA9IGdyaWRMaW5lcy56ZXJvTGluZUNvbG9yO1xuXHRcdFx0XHRib3JkZXJEYXNoID0gZ3JpZExpbmVzLnplcm9MaW5lQm9yZGVyRGFzaCB8fCBbXTtcblx0XHRcdFx0Ym9yZGVyRGFzaE9mZnNldCA9IGdyaWRMaW5lcy56ZXJvTGluZUJvcmRlckRhc2hPZmZzZXQgfHwgMC4wO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bGluZVdpZHRoID0gdmFsdWVBdEluZGV4T3JEZWZhdWx0KGdyaWRMaW5lcy5saW5lV2lkdGgsIGluZGV4KTtcblx0XHRcdFx0bGluZUNvbG9yID0gdmFsdWVBdEluZGV4T3JEZWZhdWx0KGdyaWRMaW5lcy5jb2xvciwgaW5kZXgpO1xuXHRcdFx0XHRib3JkZXJEYXNoID0gZ3JpZExpbmVzLmJvcmRlckRhc2ggfHwgW107XG5cdFx0XHRcdGJvcmRlckRhc2hPZmZzZXQgPSBncmlkTGluZXMuYm9yZGVyRGFzaE9mZnNldCB8fCAwLjA7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbW1vbiBwcm9wZXJ0aWVzXG5cdFx0XHR2YXIgdHgxLCB0eTEsIHR4MiwgdHkyLCB4MSwgeTEsIHgyLCB5MiwgbGFiZWxYLCBsYWJlbFksIHRleHRPZmZzZXQsIHRleHRBbGlnbjtcblx0XHRcdHZhciBsYWJlbENvdW50ID0gaGVscGVycyQxLmlzQXJyYXkobGFiZWwpID8gbGFiZWwubGVuZ3RoIDogMTtcblx0XHRcdHZhciBsaW5lVmFsdWUgPSBnZXRQaXhlbEZvckdyaWRMaW5lKG1lLCBpbmRleCwgZ3JpZExpbmVzLm9mZnNldEdyaWRMaW5lcyk7XG5cblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0dmFyIGxhYmVsWU9mZnNldCA9IHRsICsgdGlja1BhZGRpbmc7XG5cblx0XHRcdFx0aWYgKGxpbmVWYWx1ZSA8IG1lLmxlZnQgLSBlcHNpbG9uKSB7XG5cdFx0XHRcdFx0bGluZUNvbG9yID0gJ3JnYmEoMCwwLDAsMCknO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHgxID0gdHgyID0geDEgPSB4MiA9IGFsaWduUGl4ZWwoY2hhcnQsIGxpbmVWYWx1ZSwgbGluZVdpZHRoKTtcblx0XHRcdFx0dHkxID0gdGlja1N0YXJ0O1xuXHRcdFx0XHR0eTIgPSB0aWNrRW5kO1xuXHRcdFx0XHRsYWJlbFggPSBtZS5nZXRQaXhlbEZvclRpY2soaW5kZXgpICsgbGFiZWxPZmZzZXQ7IC8vIHggdmFsdWVzIGZvciBvcHRpb25UaWNrcyAobmVlZCB0byBjb25zaWRlciBvZmZzZXRMYWJlbCBvcHRpb24pXG5cblx0XHRcdFx0aWYgKHBvc2l0aW9uID09PSAndG9wJykge1xuXHRcdFx0XHRcdHkxID0gYWxpZ25QaXhlbChjaGFydCwgY2hhcnRBcmVhLnRvcCwgYXhpc1dpZHRoKSArIGF4aXNXaWR0aCAvIDI7XG5cdFx0XHRcdFx0eTIgPSBjaGFydEFyZWEuYm90dG9tO1xuXHRcdFx0XHRcdHRleHRPZmZzZXQgPSAoKCFpc1JvdGF0ZWQgPyAwLjUgOiAxKSAtIGxhYmVsQ291bnQpICogbGluZUhlaWdodDtcblx0XHRcdFx0XHR0ZXh0QWxpZ24gPSAhaXNSb3RhdGVkID8gJ2NlbnRlcicgOiAnbGVmdCc7XG5cdFx0XHRcdFx0bGFiZWxZID0gbWUuYm90dG9tIC0gbGFiZWxZT2Zmc2V0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHkxID0gY2hhcnRBcmVhLnRvcDtcblx0XHRcdFx0XHR5MiA9IGFsaWduUGl4ZWwoY2hhcnQsIGNoYXJ0QXJlYS5ib3R0b20sIGF4aXNXaWR0aCkgLSBheGlzV2lkdGggLyAyO1xuXHRcdFx0XHRcdHRleHRPZmZzZXQgPSAoIWlzUm90YXRlZCA/IDAuNSA6IDApICogbGluZUhlaWdodDtcblx0XHRcdFx0XHR0ZXh0QWxpZ24gPSAhaXNSb3RhdGVkID8gJ2NlbnRlcicgOiAncmlnaHQnO1xuXHRcdFx0XHRcdGxhYmVsWSA9IG1lLnRvcCArIGxhYmVsWU9mZnNldDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGxhYmVsWE9mZnNldCA9IChpc01pcnJvcmVkID8gMCA6IHRsKSArIHRpY2tQYWRkaW5nO1xuXG5cdFx0XHRcdGlmIChsaW5lVmFsdWUgPCBtZS50b3AgLSBlcHNpbG9uKSB7XG5cdFx0XHRcdFx0bGluZUNvbG9yID0gJ3JnYmEoMCwwLDAsMCknO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHgxID0gdGlja1N0YXJ0O1xuXHRcdFx0XHR0eDIgPSB0aWNrRW5kO1xuXHRcdFx0XHR0eTEgPSB0eTIgPSB5MSA9IHkyID0gYWxpZ25QaXhlbChjaGFydCwgbGluZVZhbHVlLCBsaW5lV2lkdGgpO1xuXHRcdFx0XHRsYWJlbFkgPSBtZS5nZXRQaXhlbEZvclRpY2soaW5kZXgpICsgbGFiZWxPZmZzZXQ7XG5cdFx0XHRcdHRleHRPZmZzZXQgPSAoMSAtIGxhYmVsQ291bnQpICogbGluZUhlaWdodCAvIDI7XG5cblx0XHRcdFx0aWYgKHBvc2l0aW9uID09PSAnbGVmdCcpIHtcblx0XHRcdFx0XHR4MSA9IGFsaWduUGl4ZWwoY2hhcnQsIGNoYXJ0QXJlYS5sZWZ0LCBheGlzV2lkdGgpICsgYXhpc1dpZHRoIC8gMjtcblx0XHRcdFx0XHR4MiA9IGNoYXJ0QXJlYS5yaWdodDtcblx0XHRcdFx0XHR0ZXh0QWxpZ24gPSBpc01pcnJvcmVkID8gJ2xlZnQnIDogJ3JpZ2h0Jztcblx0XHRcdFx0XHRsYWJlbFggPSBtZS5yaWdodCAtIGxhYmVsWE9mZnNldDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR4MSA9IGNoYXJ0QXJlYS5sZWZ0O1xuXHRcdFx0XHRcdHgyID0gYWxpZ25QaXhlbChjaGFydCwgY2hhcnRBcmVhLnJpZ2h0LCBheGlzV2lkdGgpIC0gYXhpc1dpZHRoIC8gMjtcblx0XHRcdFx0XHR0ZXh0QWxpZ24gPSBpc01pcnJvcmVkID8gJ3JpZ2h0JyA6ICdsZWZ0Jztcblx0XHRcdFx0XHRsYWJlbFggPSBtZS5sZWZ0ICsgbGFiZWxYT2Zmc2V0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGl0ZW1zVG9EcmF3LnB1c2goe1xuXHRcdFx0XHR0eDE6IHR4MSxcblx0XHRcdFx0dHkxOiB0eTEsXG5cdFx0XHRcdHR4MjogdHgyLFxuXHRcdFx0XHR0eTI6IHR5Mixcblx0XHRcdFx0eDE6IHgxLFxuXHRcdFx0XHR5MTogeTEsXG5cdFx0XHRcdHgyOiB4Mixcblx0XHRcdFx0eTI6IHkyLFxuXHRcdFx0XHRsYWJlbFg6IGxhYmVsWCxcblx0XHRcdFx0bGFiZWxZOiBsYWJlbFksXG5cdFx0XHRcdGdsV2lkdGg6IGxpbmVXaWR0aCxcblx0XHRcdFx0Z2xDb2xvcjogbGluZUNvbG9yLFxuXHRcdFx0XHRnbEJvcmRlckRhc2g6IGJvcmRlckRhc2gsXG5cdFx0XHRcdGdsQm9yZGVyRGFzaE9mZnNldDogYm9yZGVyRGFzaE9mZnNldCxcblx0XHRcdFx0cm90YXRpb246IC0xICogbGFiZWxSb3RhdGlvblJhZGlhbnMsXG5cdFx0XHRcdGxhYmVsOiBsYWJlbCxcblx0XHRcdFx0bWFqb3I6IHRpY2subWFqb3IsXG5cdFx0XHRcdHRleHRPZmZzZXQ6IHRleHRPZmZzZXQsXG5cdFx0XHRcdHRleHRBbGlnbjogdGV4dEFsaWduXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdC8vIERyYXcgYWxsIG9mIHRoZSB0aWNrIGxhYmVscywgdGljayBtYXJrcywgYW5kIGdyaWQgbGluZXMgYXQgdGhlIGNvcnJlY3QgcGxhY2VzXG5cdFx0aGVscGVycyQxLmVhY2goaXRlbXNUb0RyYXcsIGZ1bmN0aW9uKGl0ZW1Ub0RyYXcpIHtcblx0XHRcdHZhciBnbFdpZHRoID0gaXRlbVRvRHJhdy5nbFdpZHRoO1xuXHRcdFx0dmFyIGdsQ29sb3IgPSBpdGVtVG9EcmF3LmdsQ29sb3I7XG5cblx0XHRcdGlmIChncmlkTGluZXMuZGlzcGxheSAmJiBnbFdpZHRoICYmIGdsQ29sb3IpIHtcblx0XHRcdFx0Y29udGV4dC5zYXZlKCk7XG5cdFx0XHRcdGNvbnRleHQubGluZVdpZHRoID0gZ2xXaWR0aDtcblx0XHRcdFx0Y29udGV4dC5zdHJva2VTdHlsZSA9IGdsQ29sb3I7XG5cdFx0XHRcdGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG5cdFx0XHRcdFx0Y29udGV4dC5zZXRMaW5lRGFzaChpdGVtVG9EcmF3LmdsQm9yZGVyRGFzaCk7XG5cdFx0XHRcdFx0Y29udGV4dC5saW5lRGFzaE9mZnNldCA9IGl0ZW1Ub0RyYXcuZ2xCb3JkZXJEYXNoT2Zmc2V0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29udGV4dC5iZWdpblBhdGgoKTtcblxuXHRcdFx0XHRpZiAoZ3JpZExpbmVzLmRyYXdUaWNrcykge1xuXHRcdFx0XHRcdGNvbnRleHQubW92ZVRvKGl0ZW1Ub0RyYXcudHgxLCBpdGVtVG9EcmF3LnR5MSk7XG5cdFx0XHRcdFx0Y29udGV4dC5saW5lVG8oaXRlbVRvRHJhdy50eDIsIGl0ZW1Ub0RyYXcudHkyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChncmlkTGluZXMuZHJhd09uQ2hhcnRBcmVhKSB7XG5cdFx0XHRcdFx0Y29udGV4dC5tb3ZlVG8oaXRlbVRvRHJhdy54MSwgaXRlbVRvRHJhdy55MSk7XG5cdFx0XHRcdFx0Y29udGV4dC5saW5lVG8oaXRlbVRvRHJhdy54MiwgaXRlbVRvRHJhdy55Mik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb250ZXh0LnN0cm9rZSgpO1xuXHRcdFx0XHRjb250ZXh0LnJlc3RvcmUoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9wdGlvblRpY2tzLmRpc3BsYXkpIHtcblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHdlIGRyYXcgdGV4dCBpbiB0aGUgY29ycmVjdCBjb2xvciBhbmQgZm9udFxuXHRcdFx0XHRjb250ZXh0LnNhdmUoKTtcblx0XHRcdFx0Y29udGV4dC50cmFuc2xhdGUoaXRlbVRvRHJhdy5sYWJlbFgsIGl0ZW1Ub0RyYXcubGFiZWxZKTtcblx0XHRcdFx0Y29udGV4dC5yb3RhdGUoaXRlbVRvRHJhdy5yb3RhdGlvbik7XG5cdFx0XHRcdGNvbnRleHQuZm9udCA9IGl0ZW1Ub0RyYXcubWFqb3IgPyBtYWpvclRpY2tGb250LnN0cmluZyA6IHRpY2tGb250LnN0cmluZztcblx0XHRcdFx0Y29udGV4dC5maWxsU3R5bGUgPSBpdGVtVG9EcmF3Lm1ham9yID8gbWFqb3JUaWNrRm9udENvbG9yIDogdGlja0ZvbnRDb2xvcjtcblx0XHRcdFx0Y29udGV4dC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcblx0XHRcdFx0Y29udGV4dC50ZXh0QWxpZ24gPSBpdGVtVG9EcmF3LnRleHRBbGlnbjtcblxuXHRcdFx0XHR2YXIgbGFiZWwgPSBpdGVtVG9EcmF3LmxhYmVsO1xuXHRcdFx0XHR2YXIgeSA9IGl0ZW1Ub0RyYXcudGV4dE9mZnNldDtcblx0XHRcdFx0aWYgKGhlbHBlcnMkMS5pc0FycmF5KGxhYmVsKSkge1xuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGFiZWwubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0XHRcdC8vIFdlIGp1c3QgbWFrZSBzdXJlIHRoZSBtdWx0aWxpbmUgZWxlbWVudCBpcyBhIHN0cmluZyBoZXJlLi5cblx0XHRcdFx0XHRcdGNvbnRleHQuZmlsbFRleHQoJycgKyBsYWJlbFtpXSwgMCwgeSk7XG5cdFx0XHRcdFx0XHR5ICs9IGxpbmVIZWlnaHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRleHQuZmlsbFRleHQobGFiZWwsIDAsIHkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRleHQucmVzdG9yZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKHNjYWxlTGFiZWwuZGlzcGxheSkge1xuXHRcdFx0Ly8gRHJhdyB0aGUgc2NhbGUgbGFiZWxcblx0XHRcdHZhciBzY2FsZUxhYmVsWDtcblx0XHRcdHZhciBzY2FsZUxhYmVsWTtcblx0XHRcdHZhciByb3RhdGlvbiA9IDA7XG5cdFx0XHR2YXIgaGFsZkxpbmVIZWlnaHQgPSBzY2FsZUxhYmVsRm9udC5saW5lSGVpZ2h0IC8gMjtcblxuXHRcdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0XHRzY2FsZUxhYmVsWCA9IG1lLmxlZnQgKyAoKG1lLnJpZ2h0IC0gbWUubGVmdCkgLyAyKTsgLy8gbWlkcG9pbnQgb2YgdGhlIHdpZHRoXG5cdFx0XHRcdHNjYWxlTGFiZWxZID0gcG9zaXRpb24gPT09ICdib3R0b20nXG5cdFx0XHRcdFx0PyBtZS5ib3R0b20gLSBoYWxmTGluZUhlaWdodCAtIHNjYWxlTGFiZWxQYWRkaW5nLmJvdHRvbVxuXHRcdFx0XHRcdDogbWUudG9wICsgaGFsZkxpbmVIZWlnaHQgKyBzY2FsZUxhYmVsUGFkZGluZy50b3A7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgaXNMZWZ0ID0gcG9zaXRpb24gPT09ICdsZWZ0Jztcblx0XHRcdFx0c2NhbGVMYWJlbFggPSBpc0xlZnRcblx0XHRcdFx0XHQ/IG1lLmxlZnQgKyBoYWxmTGluZUhlaWdodCArIHNjYWxlTGFiZWxQYWRkaW5nLnRvcFxuXHRcdFx0XHRcdDogbWUucmlnaHQgLSBoYWxmTGluZUhlaWdodCAtIHNjYWxlTGFiZWxQYWRkaW5nLnRvcDtcblx0XHRcdFx0c2NhbGVMYWJlbFkgPSBtZS50b3AgKyAoKG1lLmJvdHRvbSAtIG1lLnRvcCkgLyAyKTtcblx0XHRcdFx0cm90YXRpb24gPSBpc0xlZnQgPyAtMC41ICogTWF0aC5QSSA6IDAuNSAqIE1hdGguUEk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnRleHQuc2F2ZSgpO1xuXHRcdFx0Y29udGV4dC50cmFuc2xhdGUoc2NhbGVMYWJlbFgsIHNjYWxlTGFiZWxZKTtcblx0XHRcdGNvbnRleHQucm90YXRlKHJvdGF0aW9uKTtcblx0XHRcdGNvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG5cdFx0XHRjb250ZXh0LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuXHRcdFx0Y29udGV4dC5maWxsU3R5bGUgPSBzY2FsZUxhYmVsRm9udENvbG9yOyAvLyByZW5kZXIgaW4gY29ycmVjdCBjb2xvdXJcblx0XHRcdGNvbnRleHQuZm9udCA9IHNjYWxlTGFiZWxGb250LnN0cmluZztcblx0XHRcdGNvbnRleHQuZmlsbFRleHQoc2NhbGVMYWJlbC5sYWJlbFN0cmluZywgMCwgMCk7XG5cdFx0XHRjb250ZXh0LnJlc3RvcmUoKTtcblx0XHR9XG5cblx0XHRpZiAoYXhpc1dpZHRoKSB7XG5cdFx0XHQvLyBEcmF3IHRoZSBsaW5lIGF0IHRoZSBlZGdlIG9mIHRoZSBheGlzXG5cdFx0XHR2YXIgZmlyc3RMaW5lV2lkdGggPSBheGlzV2lkdGg7XG5cdFx0XHR2YXIgbGFzdExpbmVXaWR0aCA9IHZhbHVlQXRJbmRleE9yRGVmYXVsdChncmlkTGluZXMubGluZVdpZHRoLCB0aWNrcy5sZW5ndGggLSAxLCAwKTtcblx0XHRcdHZhciB4MSwgeDIsIHkxLCB5MjtcblxuXHRcdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0XHR4MSA9IGFsaWduUGl4ZWwoY2hhcnQsIG1lLmxlZnQsIGZpcnN0TGluZVdpZHRoKSAtIGZpcnN0TGluZVdpZHRoIC8gMjtcblx0XHRcdFx0eDIgPSBhbGlnblBpeGVsKGNoYXJ0LCBtZS5yaWdodCwgbGFzdExpbmVXaWR0aCkgKyBsYXN0TGluZVdpZHRoIC8gMjtcblx0XHRcdFx0eTEgPSB5MiA9IGJvcmRlclZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0eTEgPSBhbGlnblBpeGVsKGNoYXJ0LCBtZS50b3AsIGZpcnN0TGluZVdpZHRoKSAtIGZpcnN0TGluZVdpZHRoIC8gMjtcblx0XHRcdFx0eTIgPSBhbGlnblBpeGVsKGNoYXJ0LCBtZS5ib3R0b20sIGxhc3RMaW5lV2lkdGgpICsgbGFzdExpbmVXaWR0aCAvIDI7XG5cdFx0XHRcdHgxID0geDIgPSBib3JkZXJWYWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29udGV4dC5saW5lV2lkdGggPSBheGlzV2lkdGg7XG5cdFx0XHRjb250ZXh0LnN0cm9rZVN0eWxlID0gdmFsdWVBdEluZGV4T3JEZWZhdWx0KGdyaWRMaW5lcy5jb2xvciwgMCk7XG5cdFx0XHRjb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdFx0Y29udGV4dC5tb3ZlVG8oeDEsIHkxKTtcblx0XHRcdGNvbnRleHQubGluZVRvKHgyLCB5Mik7XG5cdFx0XHRjb250ZXh0LnN0cm9rZSgpO1xuXHRcdH1cblx0fVxufSk7XG5cbnZhciBkZWZhdWx0Q29uZmlnID0ge1xuXHRwb3NpdGlvbjogJ2JvdHRvbSdcbn07XG5cbnZhciBzY2FsZV9jYXRlZ29yeSA9IGNvcmVfc2NhbGUuZXh0ZW5kKHtcblx0LyoqXG5cdCogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjb3JyZWN0IGxhYmVscy4gSWYgZGF0YS54TGFiZWxzIG9yIGRhdGEueUxhYmVscyBhcmUgZGVmaW5lZCwgdXNlIHRob3NlXG5cdCogZWxzZSBmYWxsIGJhY2sgdG8gZGF0YS5sYWJlbHNcblx0KiBAcHJpdmF0ZVxuXHQqL1xuXHRnZXRMYWJlbHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBkYXRhID0gdGhpcy5jaGFydC5kYXRhO1xuXHRcdHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWxzIHx8ICh0aGlzLmlzSG9yaXpvbnRhbCgpID8gZGF0YS54TGFiZWxzIDogZGF0YS55TGFiZWxzKSB8fCBkYXRhLmxhYmVscztcblx0fSxcblxuXHRkZXRlcm1pbmVEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBsYWJlbHMgPSBtZS5nZXRMYWJlbHMoKTtcblx0XHRtZS5taW5JbmRleCA9IDA7XG5cdFx0bWUubWF4SW5kZXggPSBsYWJlbHMubGVuZ3RoIC0gMTtcblx0XHR2YXIgZmluZEluZGV4O1xuXG5cdFx0aWYgKG1lLm9wdGlvbnMudGlja3MubWluICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIHVzZXIgc3BlY2lmaWVkIG1pbiB2YWx1ZVxuXHRcdFx0ZmluZEluZGV4ID0gbGFiZWxzLmluZGV4T2YobWUub3B0aW9ucy50aWNrcy5taW4pO1xuXHRcdFx0bWUubWluSW5kZXggPSBmaW5kSW5kZXggIT09IC0xID8gZmluZEluZGV4IDogbWUubWluSW5kZXg7XG5cdFx0fVxuXG5cdFx0aWYgKG1lLm9wdGlvbnMudGlja3MubWF4ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIHVzZXIgc3BlY2lmaWVkIG1heCB2YWx1ZVxuXHRcdFx0ZmluZEluZGV4ID0gbGFiZWxzLmluZGV4T2YobWUub3B0aW9ucy50aWNrcy5tYXgpO1xuXHRcdFx0bWUubWF4SW5kZXggPSBmaW5kSW5kZXggIT09IC0xID8gZmluZEluZGV4IDogbWUubWF4SW5kZXg7XG5cdFx0fVxuXG5cdFx0bWUubWluID0gbGFiZWxzW21lLm1pbkluZGV4XTtcblx0XHRtZS5tYXggPSBsYWJlbHNbbWUubWF4SW5kZXhdO1xuXHR9LFxuXG5cdGJ1aWxkVGlja3M6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGxhYmVscyA9IG1lLmdldExhYmVscygpO1xuXHRcdC8vIElmIHdlIGFyZSB2aWV3aW5nIHNvbWUgc3Vic2V0IG9mIGxhYmVscywgc2xpY2UgdGhlIG9yaWdpbmFsIGFycmF5XG5cdFx0bWUudGlja3MgPSAobWUubWluSW5kZXggPT09IDAgJiYgbWUubWF4SW5kZXggPT09IGxhYmVscy5sZW5ndGggLSAxKSA/IGxhYmVscyA6IGxhYmVscy5zbGljZShtZS5taW5JbmRleCwgbWUubWF4SW5kZXggKyAxKTtcblx0fSxcblxuXHRnZXRMYWJlbEZvckluZGV4OiBmdW5jdGlvbihpbmRleCwgZGF0YXNldEluZGV4KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblxuXHRcdGlmIChjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIuX2dldFZhbHVlU2NhbGVJZCgpID09PSBtZS5pZCkge1xuXHRcdFx0cmV0dXJuIG1lLmdldFJpZ2h0VmFsdWUoY2hhcnQuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLmRhdGFbaW5kZXhdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWUudGlja3NbaW5kZXggLSBtZS5taW5JbmRleF07XG5cdH0sXG5cblx0Ly8gVXNlZCB0byBnZXQgZGF0YSB2YWx1ZSBsb2NhdGlvbnMuICBWYWx1ZSBjYW4gZWl0aGVyIGJlIGFuIGluZGV4IG9yIGEgbnVtZXJpY2FsIHZhbHVlXG5cdGdldFBpeGVsRm9yVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG9mZnNldCA9IG1lLm9wdGlvbnMub2Zmc2V0O1xuXHRcdC8vIDEgaXMgYWRkZWQgYmVjYXVzZSB3ZSBuZWVkIHRoZSBsZW5ndGggYnV0IHdlIGhhdmUgdGhlIGluZGV4ZXNcblx0XHR2YXIgb2Zmc2V0QW10ID0gTWF0aC5tYXgoKG1lLm1heEluZGV4ICsgMSAtIG1lLm1pbkluZGV4IC0gKG9mZnNldCA/IDAgOiAxKSksIDEpO1xuXG5cdFx0Ly8gSWYgdmFsdWUgaXMgYSBkYXRhIG9iamVjdCwgdGhlbiBpbmRleCBpcyB0aGUgaW5kZXggaW4gdGhlIGRhdGEgYXJyYXksXG5cdFx0Ly8gbm90IHRoZSBpbmRleCBvZiB0aGUgc2NhbGUuIFdlIG5lZWQgdG8gY2hhbmdlIHRoYXQuXG5cdFx0dmFyIHZhbHVlQ2F0ZWdvcnk7XG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdHZhbHVlQ2F0ZWdvcnkgPSBtZS5pc0hvcml6b250YWwoKSA/IHZhbHVlLnggOiB2YWx1ZS55O1xuXHRcdH1cblx0XHRpZiAodmFsdWVDYXRlZ29yeSAhPT0gdW5kZWZpbmVkIHx8ICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGlzTmFOKGluZGV4KSkpIHtcblx0XHRcdHZhciBsYWJlbHMgPSBtZS5nZXRMYWJlbHMoKTtcblx0XHRcdHZhbHVlID0gdmFsdWVDYXRlZ29yeSB8fCB2YWx1ZTtcblx0XHRcdHZhciBpZHggPSBsYWJlbHMuaW5kZXhPZih2YWx1ZSk7XG5cdFx0XHRpbmRleCA9IGlkeCAhPT0gLTEgPyBpZHggOiBpbmRleDtcblx0XHR9XG5cblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdHZhciB2YWx1ZVdpZHRoID0gbWUud2lkdGggLyBvZmZzZXRBbXQ7XG5cdFx0XHR2YXIgd2lkdGhPZmZzZXQgPSAodmFsdWVXaWR0aCAqIChpbmRleCAtIG1lLm1pbkluZGV4KSk7XG5cblx0XHRcdGlmIChvZmZzZXQpIHtcblx0XHRcdFx0d2lkdGhPZmZzZXQgKz0gKHZhbHVlV2lkdGggLyAyKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1lLmxlZnQgKyB3aWR0aE9mZnNldDtcblx0XHR9XG5cdFx0dmFyIHZhbHVlSGVpZ2h0ID0gbWUuaGVpZ2h0IC8gb2Zmc2V0QW10O1xuXHRcdHZhciBoZWlnaHRPZmZzZXQgPSAodmFsdWVIZWlnaHQgKiAoaW5kZXggLSBtZS5taW5JbmRleCkpO1xuXG5cdFx0aWYgKG9mZnNldCkge1xuXHRcdFx0aGVpZ2h0T2Zmc2V0ICs9ICh2YWx1ZUhlaWdodCAvIDIpO1xuXHRcdH1cblxuXHRcdHJldHVybiBtZS50b3AgKyBoZWlnaHRPZmZzZXQ7XG5cdH0sXG5cblx0Z2V0UGl4ZWxGb3JUaWNrOiBmdW5jdGlvbihpbmRleCkge1xuXHRcdHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGhpcy50aWNrc1tpbmRleF0sIGluZGV4ICsgdGhpcy5taW5JbmRleCwgbnVsbCk7XG5cdH0sXG5cblx0Z2V0VmFsdWVGb3JQaXhlbDogZnVuY3Rpb24ocGl4ZWwpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvZmZzZXQgPSBtZS5vcHRpb25zLm9mZnNldDtcblx0XHR2YXIgdmFsdWU7XG5cdFx0dmFyIG9mZnNldEFtdCA9IE1hdGgubWF4KChtZS5fdGlja3MubGVuZ3RoIC0gKG9mZnNldCA/IDAgOiAxKSksIDEpO1xuXHRcdHZhciBob3J6ID0gbWUuaXNIb3Jpem9udGFsKCk7XG5cdFx0dmFyIHZhbHVlRGltZW5zaW9uID0gKGhvcnogPyBtZS53aWR0aCA6IG1lLmhlaWdodCkgLyBvZmZzZXRBbXQ7XG5cblx0XHRwaXhlbCAtPSBob3J6ID8gbWUubGVmdCA6IG1lLnRvcDtcblxuXHRcdGlmIChvZmZzZXQpIHtcblx0XHRcdHBpeGVsIC09ICh2YWx1ZURpbWVuc2lvbiAvIDIpO1xuXHRcdH1cblxuXHRcdGlmIChwaXhlbCA8PSAwKSB7XG5cdFx0XHR2YWx1ZSA9IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbHVlID0gTWF0aC5yb3VuZChwaXhlbCAvIHZhbHVlRGltZW5zaW9uKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWUgKyBtZS5taW5JbmRleDtcblx0fSxcblxuXHRnZXRCYXNlUGl4ZWw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmJvdHRvbTtcblx0fVxufSk7XG5cbi8vIElOVEVSTkFMOiBzdGF0aWMgZGVmYXVsdCBvcHRpb25zLCByZWdpc3RlcmVkIGluIHNyYy9pbmRleC5qc1xudmFyIF9kZWZhdWx0cyA9IGRlZmF1bHRDb25maWc7XG5zY2FsZV9jYXRlZ29yeS5fZGVmYXVsdHMgPSBfZGVmYXVsdHM7XG5cbnZhciBub29wID0gaGVscGVycyQxLm5vb3A7XG52YXIgaXNOdWxsT3JVbmRlZiA9IGhlbHBlcnMkMS5pc051bGxPclVuZGVmO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgc2V0IG9mIGxpbmVhciB0aWNrc1xuICogQHBhcmFtIGdlbmVyYXRpb25PcHRpb25zIHRoZSBvcHRpb25zIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRpY2tzXG4gKiBAcGFyYW0gZGF0YVJhbmdlIHRoZSByYW5nZSBvZiB0aGUgZGF0YVxuICogQHJldHVybnMge251bWJlcltdfSBhcnJheSBvZiB0aWNrIHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVRpY2tzKGdlbmVyYXRpb25PcHRpb25zLCBkYXRhUmFuZ2UpIHtcblx0dmFyIHRpY2tzID0gW107XG5cdC8vIFRvIGdldCBhIFwibmljZVwiIHZhbHVlIGZvciB0aGUgdGljayBzcGFjaW5nLCB3ZSB3aWxsIHVzZSB0aGUgYXBwcm9wcmlhdGVseSBuYW1lZFxuXHQvLyBcIm5pY2UgbnVtYmVyXCIgYWxnb3JpdGhtLiBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvODUwNjg4MS9uaWNlLWxhYmVsLWFsZ29yaXRobS1mb3ItY2hhcnRzLXdpdGgtbWluaW11bS10aWNrc1xuXHQvLyBmb3IgZGV0YWlscy5cblxuXHR2YXIgTUlOX1NQQUNJTkcgPSAxZS0xNDtcblx0dmFyIHN0ZXBTaXplID0gZ2VuZXJhdGlvbk9wdGlvbnMuc3RlcFNpemU7XG5cdHZhciB1bml0ID0gc3RlcFNpemUgfHwgMTtcblx0dmFyIG1heE51bVNwYWNlcyA9IGdlbmVyYXRpb25PcHRpb25zLm1heFRpY2tzIC0gMTtcblx0dmFyIG1pbiA9IGdlbmVyYXRpb25PcHRpb25zLm1pbjtcblx0dmFyIG1heCA9IGdlbmVyYXRpb25PcHRpb25zLm1heDtcblx0dmFyIHByZWNpc2lvbiA9IGdlbmVyYXRpb25PcHRpb25zLnByZWNpc2lvbjtcblx0dmFyIHJtaW4gPSBkYXRhUmFuZ2UubWluO1xuXHR2YXIgcm1heCA9IGRhdGFSYW5nZS5tYXg7XG5cdHZhciBzcGFjaW5nID0gaGVscGVycyQxLm5pY2VOdW0oKHJtYXggLSBybWluKSAvIG1heE51bVNwYWNlcyAvIHVuaXQpICogdW5pdDtcblx0dmFyIGZhY3RvciwgbmljZU1pbiwgbmljZU1heCwgbnVtU3BhY2VzO1xuXG5cdC8vIEJleW9uZCBNSU5fU1BBQ0lORyBmbG9hdGluZyBwb2ludCBudW1iZXJzIGJlaW5nIHRvIGxvc2UgcHJlY2lzaW9uXG5cdC8vIHN1Y2ggdGhhdCB3ZSBjYW4ndCBkbyB0aGUgbWF0aCBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgdGlja3Ncblx0aWYgKHNwYWNpbmcgPCBNSU5fU1BBQ0lORyAmJiBpc051bGxPclVuZGVmKG1pbikgJiYgaXNOdWxsT3JVbmRlZihtYXgpKSB7XG5cdFx0cmV0dXJuIFtybWluLCBybWF4XTtcblx0fVxuXG5cdG51bVNwYWNlcyA9IE1hdGguY2VpbChybWF4IC8gc3BhY2luZykgLSBNYXRoLmZsb29yKHJtaW4gLyBzcGFjaW5nKTtcblx0aWYgKG51bVNwYWNlcyA+IG1heE51bVNwYWNlcykge1xuXHRcdC8vIElmIHRoZSBjYWxjdWxhdGVkIG51bSBvZiBzcGFjZXMgZXhjZWVkcyBtYXhOdW1TcGFjZXMsIHJlY2FsY3VsYXRlIGl0XG5cdFx0c3BhY2luZyA9IGhlbHBlcnMkMS5uaWNlTnVtKG51bVNwYWNlcyAqIHNwYWNpbmcgLyBtYXhOdW1TcGFjZXMgLyB1bml0KSAqIHVuaXQ7XG5cdH1cblxuXHRpZiAoc3RlcFNpemUgfHwgaXNOdWxsT3JVbmRlZihwcmVjaXNpb24pKSB7XG5cdFx0Ly8gSWYgYSBwcmVjaXNpb24gaXMgbm90IHNwZWNpZmllZCwgY2FsY3VsYXRlIGZhY3RvciBiYXNlZCBvbiBzcGFjaW5nXG5cdFx0ZmFjdG9yID0gTWF0aC5wb3coMTAsIGhlbHBlcnMkMS5fZGVjaW1hbFBsYWNlcyhzcGFjaW5nKSk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGEgcHJlY2lzaW9uLCByb3VuZCB0byB0aGF0IG51bWJlciBvZiBkZWNpbWFsIHBsYWNlc1xuXHRcdGZhY3RvciA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24pO1xuXHRcdHNwYWNpbmcgPSBNYXRoLmNlaWwoc3BhY2luZyAqIGZhY3RvcikgLyBmYWN0b3I7XG5cdH1cblxuXHRuaWNlTWluID0gTWF0aC5mbG9vcihybWluIC8gc3BhY2luZykgKiBzcGFjaW5nO1xuXHRuaWNlTWF4ID0gTWF0aC5jZWlsKHJtYXggLyBzcGFjaW5nKSAqIHNwYWNpbmc7XG5cblx0Ly8gSWYgbWluLCBtYXggYW5kIHN0ZXBTaXplIGlzIHNldCBhbmQgdGhleSBtYWtlIGFuIGV2ZW5seSBzcGFjZWQgc2NhbGUgdXNlIGl0LlxuXHRpZiAoc3RlcFNpemUpIHtcblx0XHQvLyBJZiB2ZXJ5IGNsb3NlIHRvIG91ciB3aG9sZSBudW1iZXIsIHVzZSBpdC5cblx0XHRpZiAoIWlzTnVsbE9yVW5kZWYobWluKSAmJiBoZWxwZXJzJDEuYWxtb3N0V2hvbGUobWluIC8gc3BhY2luZywgc3BhY2luZyAvIDEwMDApKSB7XG5cdFx0XHRuaWNlTWluID0gbWluO1xuXHRcdH1cblx0XHRpZiAoIWlzTnVsbE9yVW5kZWYobWF4KSAmJiBoZWxwZXJzJDEuYWxtb3N0V2hvbGUobWF4IC8gc3BhY2luZywgc3BhY2luZyAvIDEwMDApKSB7XG5cdFx0XHRuaWNlTWF4ID0gbWF4O1xuXHRcdH1cblx0fVxuXG5cdG51bVNwYWNlcyA9IChuaWNlTWF4IC0gbmljZU1pbikgLyBzcGFjaW5nO1xuXHQvLyBJZiB2ZXJ5IGNsb3NlIHRvIG91ciByb3VuZGVkIHZhbHVlLCB1c2UgaXQuXG5cdGlmIChoZWxwZXJzJDEuYWxtb3N0RXF1YWxzKG51bVNwYWNlcywgTWF0aC5yb3VuZChudW1TcGFjZXMpLCBzcGFjaW5nIC8gMTAwMCkpIHtcblx0XHRudW1TcGFjZXMgPSBNYXRoLnJvdW5kKG51bVNwYWNlcyk7XG5cdH0gZWxzZSB7XG5cdFx0bnVtU3BhY2VzID0gTWF0aC5jZWlsKG51bVNwYWNlcyk7XG5cdH1cblxuXHRuaWNlTWluID0gTWF0aC5yb3VuZChuaWNlTWluICogZmFjdG9yKSAvIGZhY3Rvcjtcblx0bmljZU1heCA9IE1hdGgucm91bmQobmljZU1heCAqIGZhY3RvcikgLyBmYWN0b3I7XG5cdHRpY2tzLnB1c2goaXNOdWxsT3JVbmRlZihtaW4pID8gbmljZU1pbiA6IG1pbik7XG5cdGZvciAodmFyIGogPSAxOyBqIDwgbnVtU3BhY2VzOyArK2opIHtcblx0XHR0aWNrcy5wdXNoKE1hdGgucm91bmQoKG5pY2VNaW4gKyBqICogc3BhY2luZykgKiBmYWN0b3IpIC8gZmFjdG9yKTtcblx0fVxuXHR0aWNrcy5wdXNoKGlzTnVsbE9yVW5kZWYobWF4KSA/IG5pY2VNYXggOiBtYXgpO1xuXG5cdHJldHVybiB0aWNrcztcbn1cblxudmFyIHNjYWxlX2xpbmVhcmJhc2UgPSBjb3JlX3NjYWxlLmV4dGVuZCh7XG5cdGdldFJpZ2h0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiArdmFsdWU7XG5cdFx0fVxuXHRcdHJldHVybiBjb3JlX3NjYWxlLnByb3RvdHlwZS5nZXRSaWdodFZhbHVlLmNhbGwodGhpcywgdmFsdWUpO1xuXHR9LFxuXG5cdGhhbmRsZVRpY2tSYW5nZU9wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdHZhciB0aWNrT3B0cyA9IG9wdHMudGlja3M7XG5cblx0XHQvLyBJZiB3ZSBhcmUgZm9yY2luZyBpdCB0byBiZWdpbiBhdCAwLCBidXQgMCB3aWxsIGFscmVhZHkgYmUgcmVuZGVyZWQgb24gdGhlIGNoYXJ0LFxuXHRcdC8vIGRvIG5vdGhpbmcgc2luY2UgdGhhdCB3b3VsZCBtYWtlIHRoZSBjaGFydCB3ZWlyZC4gSWYgdGhlIHVzZXIgcmVhbGx5IHdhbnRzIGEgd2VpcmQgY2hhcnRcblx0XHQvLyBheGlzLCB0aGV5IGNhbiBtYW51YWxseSBvdmVycmlkZSBpdFxuXHRcdGlmICh0aWNrT3B0cy5iZWdpbkF0WmVybykge1xuXHRcdFx0dmFyIG1pblNpZ24gPSBoZWxwZXJzJDEuc2lnbihtZS5taW4pO1xuXHRcdFx0dmFyIG1heFNpZ24gPSBoZWxwZXJzJDEuc2lnbihtZS5tYXgpO1xuXG5cdFx0XHRpZiAobWluU2lnbiA8IDAgJiYgbWF4U2lnbiA8IDApIHtcblx0XHRcdFx0Ly8gbW92ZSB0aGUgdG9wIHVwIHRvIDBcblx0XHRcdFx0bWUubWF4ID0gMDtcblx0XHRcdH0gZWxzZSBpZiAobWluU2lnbiA+IDAgJiYgbWF4U2lnbiA+IDApIHtcblx0XHRcdFx0Ly8gbW92ZSB0aGUgYm90dG9tIGRvd24gdG8gMFxuXHRcdFx0XHRtZS5taW4gPSAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBzZXRNaW4gPSB0aWNrT3B0cy5taW4gIT09IHVuZGVmaW5lZCB8fCB0aWNrT3B0cy5zdWdnZXN0ZWRNaW4gIT09IHVuZGVmaW5lZDtcblx0XHR2YXIgc2V0TWF4ID0gdGlja09wdHMubWF4ICE9PSB1bmRlZmluZWQgfHwgdGlja09wdHMuc3VnZ2VzdGVkTWF4ICE9PSB1bmRlZmluZWQ7XG5cblx0XHRpZiAodGlja09wdHMubWluICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdG1lLm1pbiA9IHRpY2tPcHRzLm1pbjtcblx0XHR9IGVsc2UgaWYgKHRpY2tPcHRzLnN1Z2dlc3RlZE1pbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAobWUubWluID09PSBudWxsKSB7XG5cdFx0XHRcdG1lLm1pbiA9IHRpY2tPcHRzLnN1Z2dlc3RlZE1pbjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1lLm1pbiA9IE1hdGgubWluKG1lLm1pbiwgdGlja09wdHMuc3VnZ2VzdGVkTWluKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGlja09wdHMubWF4ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdG1lLm1heCA9IHRpY2tPcHRzLm1heDtcblx0XHR9IGVsc2UgaWYgKHRpY2tPcHRzLnN1Z2dlc3RlZE1heCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAobWUubWF4ID09PSBudWxsKSB7XG5cdFx0XHRcdG1lLm1heCA9IHRpY2tPcHRzLnN1Z2dlc3RlZE1heDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1lLm1heCA9IE1hdGgubWF4KG1lLm1heCwgdGlja09wdHMuc3VnZ2VzdGVkTWF4KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc2V0TWluICE9PSBzZXRNYXgpIHtcblx0XHRcdC8vIFdlIHNldCB0aGUgbWluIG9yIHRoZSBtYXggYnV0IG5vdCBib3RoLlxuXHRcdFx0Ly8gU28gZW5zdXJlIHRoYXQgb3VyIHJhbmdlIGlzIGdvb2Rcblx0XHRcdC8vIEludmVydGVkIG9yIDAgbGVuZ3RoIHJhbmdlIGNhbiBoYXBwZW4gd2hlblxuXHRcdFx0Ly8gdGlja3MubWluIGlzIHNldCwgYW5kIG5vIGRhdGFzZXRzIGFyZSB2aXNpYmxlXG5cdFx0XHRpZiAobWUubWluID49IG1lLm1heCkge1xuXHRcdFx0XHRpZiAoc2V0TWluKSB7XG5cdFx0XHRcdFx0bWUubWF4ID0gbWUubWluICsgMTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtZS5taW4gPSBtZS5tYXggLSAxO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1lLm1pbiA9PT0gbWUubWF4KSB7XG5cdFx0XHRtZS5tYXgrKztcblxuXHRcdFx0aWYgKCF0aWNrT3B0cy5iZWdpbkF0WmVybykge1xuXHRcdFx0XHRtZS5taW4tLTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Z2V0VGlja0xpbWl0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciB0aWNrT3B0cyA9IG1lLm9wdGlvbnMudGlja3M7XG5cdFx0dmFyIHN0ZXBTaXplID0gdGlja09wdHMuc3RlcFNpemU7XG5cdFx0dmFyIG1heFRpY2tzTGltaXQgPSB0aWNrT3B0cy5tYXhUaWNrc0xpbWl0O1xuXHRcdHZhciBtYXhUaWNrcztcblxuXHRcdGlmIChzdGVwU2l6ZSkge1xuXHRcdFx0bWF4VGlja3MgPSBNYXRoLmNlaWwobWUubWF4IC8gc3RlcFNpemUpIC0gTWF0aC5mbG9vcihtZS5taW4gLyBzdGVwU2l6ZSkgKyAxO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXhUaWNrcyA9IG1lLl9jb21wdXRlVGlja0xpbWl0KCk7XG5cdFx0XHRtYXhUaWNrc0xpbWl0ID0gbWF4VGlja3NMaW1pdCB8fCAxMTtcblx0XHR9XG5cblx0XHRpZiAobWF4VGlja3NMaW1pdCkge1xuXHRcdFx0bWF4VGlja3MgPSBNYXRoLm1pbihtYXhUaWNrc0xpbWl0LCBtYXhUaWNrcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1heFRpY2tzO1xuXHR9LFxuXG5cdF9jb21wdXRlVGlja0xpbWl0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXHR9LFxuXG5cdGhhbmRsZURpcmVjdGlvbmFsQ2hhbmdlczogbm9vcCxcblxuXHRidWlsZFRpY2tzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHR2YXIgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuXG5cdFx0Ly8gRmlndXJlIG91dCB3aGF0IHRoZSBtYXggbnVtYmVyIG9mIHRpY2tzIHdlIGNhbiBzdXBwb3J0IGl0IGlzIGJhc2VkIG9uIHRoZSBzaXplIG9mXG5cdFx0Ly8gdGhlIGF4aXMgYXJlYS4gRm9yIG5vdywgd2Ugc2F5IHRoYXQgdGhlIG1pbmltdW0gdGljayBzcGFjaW5nIGluIHBpeGVscyBtdXN0IGJlIDQwXG5cdFx0Ly8gV2UgYWxzbyBsaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGlja3MgdG8gMTEgd2hpY2ggZ2l2ZXMgYSBuaWNlIDEwIHNxdWFyZXMgb25cblx0XHQvLyB0aGUgZ3JhcGguIE1ha2Ugc3VyZSB3ZSBhbHdheXMgaGF2ZSBhdCBsZWFzdCAyIHRpY2tzXG5cdFx0dmFyIG1heFRpY2tzID0gbWUuZ2V0VGlja0xpbWl0KCk7XG5cdFx0bWF4VGlja3MgPSBNYXRoLm1heCgyLCBtYXhUaWNrcyk7XG5cblx0XHR2YXIgbnVtZXJpY0dlbmVyYXRvck9wdGlvbnMgPSB7XG5cdFx0XHRtYXhUaWNrczogbWF4VGlja3MsXG5cdFx0XHRtaW46IHRpY2tPcHRzLm1pbixcblx0XHRcdG1heDogdGlja09wdHMubWF4LFxuXHRcdFx0cHJlY2lzaW9uOiB0aWNrT3B0cy5wcmVjaXNpb24sXG5cdFx0XHRzdGVwU2l6ZTogaGVscGVycyQxLnZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmZpeGVkU3RlcFNpemUsIHRpY2tPcHRzLnN0ZXBTaXplKVxuXHRcdH07XG5cdFx0dmFyIHRpY2tzID0gbWUudGlja3MgPSBnZW5lcmF0ZVRpY2tzKG51bWVyaWNHZW5lcmF0b3JPcHRpb25zLCBtZSk7XG5cblx0XHRtZS5oYW5kbGVEaXJlY3Rpb25hbENoYW5nZXMoKTtcblxuXHRcdC8vIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gdXBkYXRlIG91ciBtYXggYW5kIG1pbiBnaXZlbiB0aGUgdGljayB2YWx1ZXMgc2luY2Ugd2UgaGF2ZSBleHBhbmRlZCB0aGVcblx0XHQvLyByYW5nZSBvZiB0aGUgc2NhbGVcblx0XHRtZS5tYXggPSBoZWxwZXJzJDEubWF4KHRpY2tzKTtcblx0XHRtZS5taW4gPSBoZWxwZXJzJDEubWluKHRpY2tzKTtcblxuXHRcdGlmICh0aWNrT3B0cy5yZXZlcnNlKSB7XG5cdFx0XHR0aWNrcy5yZXZlcnNlKCk7XG5cblx0XHRcdG1lLnN0YXJ0ID0gbWUubWF4O1xuXHRcdFx0bWUuZW5kID0gbWUubWluO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZS5zdGFydCA9IG1lLm1pbjtcblx0XHRcdG1lLmVuZCA9IG1lLm1heDtcblx0XHR9XG5cdH0sXG5cblx0Y29udmVydFRpY2tzVG9MYWJlbHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0bWUudGlja3NBc051bWJlcnMgPSBtZS50aWNrcy5zbGljZSgpO1xuXHRcdG1lLnplcm9MaW5lSW5kZXggPSBtZS50aWNrcy5pbmRleE9mKDApO1xuXG5cdFx0Y29yZV9zY2FsZS5wcm90b3R5cGUuY29udmVydFRpY2tzVG9MYWJlbHMuY2FsbChtZSk7XG5cdH1cbn0pO1xuXG52YXIgZGVmYXVsdENvbmZpZyQxID0ge1xuXHRwb3NpdGlvbjogJ2xlZnQnLFxuXHR0aWNrczoge1xuXHRcdGNhbGxiYWNrOiBjb3JlX3RpY2tzLmZvcm1hdHRlcnMubGluZWFyXG5cdH1cbn07XG5cbnZhciBzY2FsZV9saW5lYXIgPSBzY2FsZV9saW5lYXJiYXNlLmV4dGVuZCh7XG5cdGRldGVybWluZURhdGFMaW1pdHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBkYXRhID0gY2hhcnQuZGF0YTtcblx0XHR2YXIgZGF0YXNldHMgPSBkYXRhLmRhdGFzZXRzO1xuXHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblx0XHR2YXIgREVGQVVMVF9NSU4gPSAwO1xuXHRcdHZhciBERUZBVUxUX01BWCA9IDE7XG5cblx0XHRmdW5jdGlvbiBJRE1hdGNoZXMobWV0YSkge1xuXHRcdFx0cmV0dXJuIGlzSG9yaXpvbnRhbCA/IG1ldGEueEF4aXNJRCA9PT0gbWUuaWQgOiBtZXRhLnlBeGlzSUQgPT09IG1lLmlkO1xuXHRcdH1cblxuXHRcdC8vIEZpcnN0IENhbGN1bGF0ZSB0aGUgcmFuZ2Vcblx0XHRtZS5taW4gPSBudWxsO1xuXHRcdG1lLm1heCA9IG51bGw7XG5cblx0XHR2YXIgaGFzU3RhY2tzID0gb3B0cy5zdGFja2VkO1xuXHRcdGlmIChoYXNTdGFja3MgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aGVscGVycyQxLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHRpZiAoaGFzU3RhY2tzKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuXHRcdFx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShkYXRhc2V0SW5kZXgpICYmIElETWF0Y2hlcyhtZXRhKSAmJlxuXHRcdFx0XHRcdG1ldGEuc3RhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGhhc1N0YWNrcyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChvcHRzLnN0YWNrZWQgfHwgaGFzU3RhY2tzKSB7XG5cdFx0XHR2YXIgdmFsdWVzUGVyU3RhY2sgPSB7fTtcblxuXHRcdFx0aGVscGVycyQxLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdHZhciBrZXkgPSBbXG5cdFx0XHRcdFx0bWV0YS50eXBlLFxuXHRcdFx0XHRcdC8vIHdlIGhhdmUgYSBzZXBhcmF0ZSBzdGFjayBmb3Igc3RhY2s9dW5kZWZpbmVkIGRhdGFzZXRzIHdoZW4gdGhlIG9wdHMuc3RhY2tlZCBpcyB1bmRlZmluZWRcblx0XHRcdFx0XHQoKG9wdHMuc3RhY2tlZCA9PT0gdW5kZWZpbmVkICYmIG1ldGEuc3RhY2sgPT09IHVuZGVmaW5lZCkgPyBkYXRhc2V0SW5kZXggOiAnJyksXG5cdFx0XHRcdFx0bWV0YS5zdGFja1xuXHRcdFx0XHRdLmpvaW4oJy4nKTtcblxuXHRcdFx0XHRpZiAodmFsdWVzUGVyU3RhY2tba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dmFsdWVzUGVyU3RhY2tba2V5XSA9IHtcblx0XHRcdFx0XHRcdHBvc2l0aXZlVmFsdWVzOiBbXSxcblx0XHRcdFx0XHRcdG5lZ2F0aXZlVmFsdWVzOiBbXVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdG9yZSB0aGVzZSBwZXIgdHlwZVxuXHRcdFx0XHR2YXIgcG9zaXRpdmVWYWx1ZXMgPSB2YWx1ZXNQZXJTdGFja1trZXldLnBvc2l0aXZlVmFsdWVzO1xuXHRcdFx0XHR2YXIgbmVnYXRpdmVWYWx1ZXMgPSB2YWx1ZXNQZXJTdGFja1trZXldLm5lZ2F0aXZlVmFsdWVzO1xuXG5cdFx0XHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkgJiYgSURNYXRjaGVzKG1ldGEpKSB7XG5cdFx0XHRcdFx0aGVscGVycyQxLmVhY2goZGF0YXNldC5kYXRhLCBmdW5jdGlvbihyYXdWYWx1ZSwgaW5kZXgpIHtcblx0XHRcdFx0XHRcdHZhciB2YWx1ZSA9ICttZS5nZXRSaWdodFZhbHVlKHJhd1ZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChpc05hTih2YWx1ZSkgfHwgbWV0YS5kYXRhW2luZGV4XS5oaWRkZW4pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRwb3NpdGl2ZVZhbHVlc1tpbmRleF0gPSBwb3NpdGl2ZVZhbHVlc1tpbmRleF0gfHwgMDtcblx0XHRcdFx0XHRcdG5lZ2F0aXZlVmFsdWVzW2luZGV4XSA9IG5lZ2F0aXZlVmFsdWVzW2luZGV4XSB8fCAwO1xuXG5cdFx0XHRcdFx0XHRpZiAob3B0cy5yZWxhdGl2ZVBvaW50cykge1xuXHRcdFx0XHRcdFx0XHRwb3NpdGl2ZVZhbHVlc1tpbmRleF0gPSAxMDA7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuXHRcdFx0XHRcdFx0XHRuZWdhdGl2ZVZhbHVlc1tpbmRleF0gKz0gdmFsdWU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwb3NpdGl2ZVZhbHVlc1tpbmRleF0gKz0gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRoZWxwZXJzJDEuZWFjaCh2YWx1ZXNQZXJTdGFjaywgZnVuY3Rpb24odmFsdWVzRm9yVHlwZSkge1xuXHRcdFx0XHR2YXIgdmFsdWVzID0gdmFsdWVzRm9yVHlwZS5wb3NpdGl2ZVZhbHVlcy5jb25jYXQodmFsdWVzRm9yVHlwZS5uZWdhdGl2ZVZhbHVlcyk7XG5cdFx0XHRcdHZhciBtaW5WYWwgPSBoZWxwZXJzJDEubWluKHZhbHVlcyk7XG5cdFx0XHRcdHZhciBtYXhWYWwgPSBoZWxwZXJzJDEubWF4KHZhbHVlcyk7XG5cdFx0XHRcdG1lLm1pbiA9IG1lLm1pbiA9PT0gbnVsbCA/IG1pblZhbCA6IE1hdGgubWluKG1lLm1pbiwgbWluVmFsKTtcblx0XHRcdFx0bWUubWF4ID0gbWUubWF4ID09PSBudWxsID8gbWF4VmFsIDogTWF0aC5tYXgobWUubWF4LCBtYXhWYWwpO1xuXHRcdFx0fSk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0aGVscGVycyQxLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkgJiYgSURNYXRjaGVzKG1ldGEpKSB7XG5cdFx0XHRcdFx0aGVscGVycyQxLmVhY2goZGF0YXNldC5kYXRhLCBmdW5jdGlvbihyYXdWYWx1ZSwgaW5kZXgpIHtcblx0XHRcdFx0XHRcdHZhciB2YWx1ZSA9ICttZS5nZXRSaWdodFZhbHVlKHJhd1ZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChpc05hTih2YWx1ZSkgfHwgbWV0YS5kYXRhW2luZGV4XS5oaWRkZW4pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAobWUubWluID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdG1lLm1pbiA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh2YWx1ZSA8IG1lLm1pbikge1xuXHRcdFx0XHRcdFx0XHRtZS5taW4gPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG1lLm1heCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHRtZS5tYXggPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodmFsdWUgPiBtZS5tYXgpIHtcblx0XHRcdFx0XHRcdFx0bWUubWF4ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdG1lLm1pbiA9IGlzRmluaXRlKG1lLm1pbikgJiYgIWlzTmFOKG1lLm1pbikgPyBtZS5taW4gOiBERUZBVUxUX01JTjtcblx0XHRtZS5tYXggPSBpc0Zpbml0ZShtZS5tYXgpICYmICFpc05hTihtZS5tYXgpID8gbWUubWF4IDogREVGQVVMVF9NQVg7XG5cblx0XHQvLyBDb21tb24gYmFzZSBpbXBsZW1lbnRhdGlvbiB0byBoYW5kbGUgdGlja3MubWluLCB0aWNrcy5tYXgsIHRpY2tzLmJlZ2luQXRaZXJvXG5cdFx0dGhpcy5oYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCk7XG5cdH0sXG5cblx0Ly8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGlja3MgYmFzZWQgb24gdGhlIHNjYWxlIGRpbWVuc2lvblxuXHRfY29tcHV0ZVRpY2tMaW1pdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgdGlja0ZvbnQ7XG5cblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdHJldHVybiBNYXRoLmNlaWwobWUud2lkdGggLyA0MCk7XG5cdFx0fVxuXHRcdHRpY2tGb250ID0gaGVscGVycyQxLm9wdGlvbnMuX3BhcnNlRm9udChtZS5vcHRpb25zLnRpY2tzKTtcblx0XHRyZXR1cm4gTWF0aC5jZWlsKG1lLmhlaWdodCAvIHRpY2tGb250LmxpbmVIZWlnaHQpO1xuXHR9LFxuXG5cdC8vIENhbGxlZCBhZnRlciB0aGUgdGlja3MgYXJlIGJ1aWx0LiBXZSBuZWVkXG5cdGhhbmRsZURpcmVjdGlvbmFsQ2hhbmdlczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHQvLyBXZSBhcmUgaW4gYSB2ZXJ0aWNhbCBvcmllbnRhdGlvbi4gVGhlIHRvcCB2YWx1ZSBpcyB0aGUgaGlnaGVzdC4gU28gcmV2ZXJzZSB0aGUgYXJyYXlcblx0XHRcdHRoaXMudGlja3MucmV2ZXJzZSgpO1xuXHRcdH1cblx0fSxcblxuXHRnZXRMYWJlbEZvckluZGV4OiBmdW5jdGlvbihpbmRleCwgZGF0YXNldEluZGV4KSB7XG5cdFx0cmV0dXJuICt0aGlzLmdldFJpZ2h0VmFsdWUodGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0pO1xuXHR9LFxuXG5cdC8vIFV0aWxzXG5cdGdldFBpeGVsRm9yVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0Ly8gVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBmaXQgaGFzIGJlZW4gcnVuIHNvIHRoYXRcblx0XHQvLyB0aGlzLmxlZnQsIHRoaXMudG9wLCB0aGlzLnJpZ2h0LCBhbmQgdGhpcy5ib3R0b20gaGF2ZSBiZWVuIGRlZmluZWRcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBzdGFydCA9IG1lLnN0YXJ0O1xuXG5cdFx0dmFyIHJpZ2h0VmFsdWUgPSArbWUuZ2V0UmlnaHRWYWx1ZSh2YWx1ZSk7XG5cdFx0dmFyIHBpeGVsO1xuXHRcdHZhciByYW5nZSA9IG1lLmVuZCAtIHN0YXJ0O1xuXG5cdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHRwaXhlbCA9IG1lLmxlZnQgKyAobWUud2lkdGggLyByYW5nZSAqIChyaWdodFZhbHVlIC0gc3RhcnQpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGl4ZWwgPSBtZS5ib3R0b20gLSAobWUuaGVpZ2h0IC8gcmFuZ2UgKiAocmlnaHRWYWx1ZSAtIHN0YXJ0KSk7XG5cdFx0fVxuXHRcdHJldHVybiBwaXhlbDtcblx0fSxcblxuXHRnZXRWYWx1ZUZvclBpeGVsOiBmdW5jdGlvbihwaXhlbCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGlzSG9yaXpvbnRhbCA9IG1lLmlzSG9yaXpvbnRhbCgpO1xuXHRcdHZhciBpbm5lckRpbWVuc2lvbiA9IGlzSG9yaXpvbnRhbCA/IG1lLndpZHRoIDogbWUuaGVpZ2h0O1xuXHRcdHZhciBvZmZzZXQgPSAoaXNIb3Jpem9udGFsID8gcGl4ZWwgLSBtZS5sZWZ0IDogbWUuYm90dG9tIC0gcGl4ZWwpIC8gaW5uZXJEaW1lbnNpb247XG5cdFx0cmV0dXJuIG1lLnN0YXJ0ICsgKChtZS5lbmQgLSBtZS5zdGFydCkgKiBvZmZzZXQpO1xuXHR9LFxuXG5cdGdldFBpeGVsRm9yVGljazogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRoaXMudGlja3NBc051bWJlcnNbaW5kZXhdKTtcblx0fVxufSk7XG5cbi8vIElOVEVSTkFMOiBzdGF0aWMgZGVmYXVsdCBvcHRpb25zLCByZWdpc3RlcmVkIGluIHNyYy9pbmRleC5qc1xudmFyIF9kZWZhdWx0cyQxID0gZGVmYXVsdENvbmZpZyQxO1xuc2NhbGVfbGluZWFyLl9kZWZhdWx0cyA9IF9kZWZhdWx0cyQxO1xuXG52YXIgdmFsdWVPckRlZmF1bHQkYSA9IGhlbHBlcnMkMS52YWx1ZU9yRGVmYXVsdDtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHNldCBvZiBsb2dhcml0aG1pYyB0aWNrc1xuICogQHBhcmFtIGdlbmVyYXRpb25PcHRpb25zIHRoZSBvcHRpb25zIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRpY2tzXG4gKiBAcGFyYW0gZGF0YVJhbmdlIHRoZSByYW5nZSBvZiB0aGUgZGF0YVxuICogQHJldHVybnMge251bWJlcltdfSBhcnJheSBvZiB0aWNrIHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVRpY2tzJDEoZ2VuZXJhdGlvbk9wdGlvbnMsIGRhdGFSYW5nZSkge1xuXHR2YXIgdGlja3MgPSBbXTtcblxuXHR2YXIgdGlja1ZhbCA9IHZhbHVlT3JEZWZhdWx0JGEoZ2VuZXJhdGlvbk9wdGlvbnMubWluLCBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzJDEubG9nMTAoZGF0YVJhbmdlLm1pbikpKSk7XG5cblx0dmFyIGVuZEV4cCA9IE1hdGguZmxvb3IoaGVscGVycyQxLmxvZzEwKGRhdGFSYW5nZS5tYXgpKTtcblx0dmFyIGVuZFNpZ25pZmljYW5kID0gTWF0aC5jZWlsKGRhdGFSYW5nZS5tYXggLyBNYXRoLnBvdygxMCwgZW5kRXhwKSk7XG5cdHZhciBleHAsIHNpZ25pZmljYW5kO1xuXG5cdGlmICh0aWNrVmFsID09PSAwKSB7XG5cdFx0ZXhwID0gTWF0aC5mbG9vcihoZWxwZXJzJDEubG9nMTAoZGF0YVJhbmdlLm1pbk5vdFplcm8pKTtcblx0XHRzaWduaWZpY2FuZCA9IE1hdGguZmxvb3IoZGF0YVJhbmdlLm1pbk5vdFplcm8gLyBNYXRoLnBvdygxMCwgZXhwKSk7XG5cblx0XHR0aWNrcy5wdXNoKHRpY2tWYWwpO1xuXHRcdHRpY2tWYWwgPSBzaWduaWZpY2FuZCAqIE1hdGgucG93KDEwLCBleHApO1xuXHR9IGVsc2Uge1xuXHRcdGV4cCA9IE1hdGguZmxvb3IoaGVscGVycyQxLmxvZzEwKHRpY2tWYWwpKTtcblx0XHRzaWduaWZpY2FuZCA9IE1hdGguZmxvb3IodGlja1ZhbCAvIE1hdGgucG93KDEwLCBleHApKTtcblx0fVxuXHR2YXIgcHJlY2lzaW9uID0gZXhwIDwgMCA/IE1hdGgucG93KDEwLCBNYXRoLmFicyhleHApKSA6IDE7XG5cblx0ZG8ge1xuXHRcdHRpY2tzLnB1c2godGlja1ZhbCk7XG5cblx0XHQrK3NpZ25pZmljYW5kO1xuXHRcdGlmIChzaWduaWZpY2FuZCA9PT0gMTApIHtcblx0XHRcdHNpZ25pZmljYW5kID0gMTtcblx0XHRcdCsrZXhwO1xuXHRcdFx0cHJlY2lzaW9uID0gZXhwID49IDAgPyAxIDogcHJlY2lzaW9uO1xuXHRcdH1cblxuXHRcdHRpY2tWYWwgPSBNYXRoLnJvdW5kKHNpZ25pZmljYW5kICogTWF0aC5wb3coMTAsIGV4cCkgKiBwcmVjaXNpb24pIC8gcHJlY2lzaW9uO1xuXHR9IHdoaWxlIChleHAgPCBlbmRFeHAgfHwgKGV4cCA9PT0gZW5kRXhwICYmIHNpZ25pZmljYW5kIDwgZW5kU2lnbmlmaWNhbmQpKTtcblxuXHR2YXIgbGFzdFRpY2sgPSB2YWx1ZU9yRGVmYXVsdCRhKGdlbmVyYXRpb25PcHRpb25zLm1heCwgdGlja1ZhbCk7XG5cdHRpY2tzLnB1c2gobGFzdFRpY2spO1xuXG5cdHJldHVybiB0aWNrcztcbn1cblxudmFyIGRlZmF1bHRDb25maWckMiA9IHtcblx0cG9zaXRpb246ICdsZWZ0JyxcblxuXHQvLyBsYWJlbCBzZXR0aW5nc1xuXHR0aWNrczoge1xuXHRcdGNhbGxiYWNrOiBjb3JlX3RpY2tzLmZvcm1hdHRlcnMubG9nYXJpdGhtaWNcblx0fVxufTtcblxuLy8gVE9ETyh2Myk6IGNoYW5nZSB0aGlzIHRvIHBvc2l0aXZlT3JEZWZhdWx0XG5mdW5jdGlvbiBub25OZWdhdGl2ZU9yRGVmYXVsdCh2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG5cdHJldHVybiBoZWxwZXJzJDEuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDAgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbn1cblxudmFyIHNjYWxlX2xvZ2FyaXRobWljID0gY29yZV9zY2FsZS5leHRlbmQoe1xuXHRkZXRlcm1pbmVEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHR2YXIgZGF0YSA9IGNoYXJ0LmRhdGE7XG5cdFx0dmFyIGRhdGFzZXRzID0gZGF0YS5kYXRhc2V0cztcblx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XG5cdFx0ZnVuY3Rpb24gSURNYXRjaGVzKG1ldGEpIHtcblx0XHRcdHJldHVybiBpc0hvcml6b250YWwgPyBtZXRhLnhBeGlzSUQgPT09IG1lLmlkIDogbWV0YS55QXhpc0lEID09PSBtZS5pZDtcblx0XHR9XG5cblx0XHQvLyBDYWxjdWxhdGUgUmFuZ2Vcblx0XHRtZS5taW4gPSBudWxsO1xuXHRcdG1lLm1heCA9IG51bGw7XG5cdFx0bWUubWluTm90WmVybyA9IG51bGw7XG5cblx0XHR2YXIgaGFzU3RhY2tzID0gb3B0cy5zdGFja2VkO1xuXHRcdGlmIChoYXNTdGFja3MgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aGVscGVycyQxLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHRpZiAoaGFzU3RhY2tzKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuXHRcdFx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShkYXRhc2V0SW5kZXgpICYmIElETWF0Y2hlcyhtZXRhKSAmJlxuXHRcdFx0XHRcdG1ldGEuc3RhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGhhc1N0YWNrcyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChvcHRzLnN0YWNrZWQgfHwgaGFzU3RhY2tzKSB7XG5cdFx0XHR2YXIgdmFsdWVzUGVyU3RhY2sgPSB7fTtcblxuXHRcdFx0aGVscGVycyQxLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdHZhciBrZXkgPSBbXG5cdFx0XHRcdFx0bWV0YS50eXBlLFxuXHRcdFx0XHRcdC8vIHdlIGhhdmUgYSBzZXBhcmF0ZSBzdGFjayBmb3Igc3RhY2s9dW5kZWZpbmVkIGRhdGFzZXRzIHdoZW4gdGhlIG9wdHMuc3RhY2tlZCBpcyB1bmRlZmluZWRcblx0XHRcdFx0XHQoKG9wdHMuc3RhY2tlZCA9PT0gdW5kZWZpbmVkICYmIG1ldGEuc3RhY2sgPT09IHVuZGVmaW5lZCkgPyBkYXRhc2V0SW5kZXggOiAnJyksXG5cdFx0XHRcdFx0bWV0YS5zdGFja1xuXHRcdFx0XHRdLmpvaW4oJy4nKTtcblxuXHRcdFx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShkYXRhc2V0SW5kZXgpICYmIElETWF0Y2hlcyhtZXRhKSkge1xuXHRcdFx0XHRcdGlmICh2YWx1ZXNQZXJTdGFja1trZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHZhbHVlc1BlclN0YWNrW2tleV0gPSBbXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRoZWxwZXJzJDEuZWFjaChkYXRhc2V0LmRhdGEsIGZ1bmN0aW9uKHJhd1ZhbHVlLCBpbmRleCkge1xuXHRcdFx0XHRcdFx0dmFyIHZhbHVlcyA9IHZhbHVlc1BlclN0YWNrW2tleV07XG5cdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSArbWUuZ2V0UmlnaHRWYWx1ZShyYXdWYWx1ZSk7XG5cdFx0XHRcdFx0XHQvLyBpbnZhbGlkLCBoaWRkZW4gYW5kIG5lZ2F0aXZlIHZhbHVlcyBhcmUgaWdub3JlZFxuXHRcdFx0XHRcdFx0aWYgKGlzTmFOKHZhbHVlKSB8fCBtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbiB8fCB2YWx1ZSA8IDApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dmFsdWVzW2luZGV4XSA9IHZhbHVlc1tpbmRleF0gfHwgMDtcblx0XHRcdFx0XHRcdHZhbHVlc1tpbmRleF0gKz0gdmFsdWU7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRoZWxwZXJzJDEuZWFjaCh2YWx1ZXNQZXJTdGFjaywgZnVuY3Rpb24odmFsdWVzRm9yVHlwZSkge1xuXHRcdFx0XHRpZiAodmFsdWVzRm9yVHlwZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dmFyIG1pblZhbCA9IGhlbHBlcnMkMS5taW4odmFsdWVzRm9yVHlwZSk7XG5cdFx0XHRcdFx0dmFyIG1heFZhbCA9IGhlbHBlcnMkMS5tYXgodmFsdWVzRm9yVHlwZSk7XG5cdFx0XHRcdFx0bWUubWluID0gbWUubWluID09PSBudWxsID8gbWluVmFsIDogTWF0aC5taW4obWUubWluLCBtaW5WYWwpO1xuXHRcdFx0XHRcdG1lLm1heCA9IG1lLm1heCA9PT0gbnVsbCA/IG1heFZhbCA6IE1hdGgubWF4KG1lLm1heCwgbWF4VmFsKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0aGVscGVycyQxLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkgJiYgSURNYXRjaGVzKG1ldGEpKSB7XG5cdFx0XHRcdFx0aGVscGVycyQxLmVhY2goZGF0YXNldC5kYXRhLCBmdW5jdGlvbihyYXdWYWx1ZSwgaW5kZXgpIHtcblx0XHRcdFx0XHRcdHZhciB2YWx1ZSA9ICttZS5nZXRSaWdodFZhbHVlKHJhd1ZhbHVlKTtcblx0XHRcdFx0XHRcdC8vIGludmFsaWQsIGhpZGRlbiBhbmQgbmVnYXRpdmUgdmFsdWVzIGFyZSBpZ25vcmVkXG5cdFx0XHRcdFx0XHRpZiAoaXNOYU4odmFsdWUpIHx8IG1ldGEuZGF0YVtpbmRleF0uaGlkZGVuIHx8IHZhbHVlIDwgMCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChtZS5taW4gPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0bWUubWluID0gdmFsdWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHZhbHVlIDwgbWUubWluKSB7XG5cdFx0XHRcdFx0XHRcdG1lLm1pbiA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAobWUubWF4ID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdG1lLm1heCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh2YWx1ZSA+IG1lLm1heCkge1xuXHRcdFx0XHRcdFx0XHRtZS5tYXggPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHZhbHVlICE9PSAwICYmIChtZS5taW5Ob3RaZXJvID09PSBudWxsIHx8IHZhbHVlIDwgbWUubWluTm90WmVybykpIHtcblx0XHRcdFx0XHRcdFx0bWUubWluTm90WmVybyA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBDb21tb24gYmFzZSBpbXBsZW1lbnRhdGlvbiB0byBoYW5kbGUgdGlja3MubWluLCB0aWNrcy5tYXhcblx0XHR0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKTtcblx0fSxcblxuXHRoYW5kbGVUaWNrUmFuZ2VPcHRpb25zOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciB0aWNrT3B0cyA9IG1lLm9wdGlvbnMudGlja3M7XG5cdFx0dmFyIERFRkFVTFRfTUlOID0gMTtcblx0XHR2YXIgREVGQVVMVF9NQVggPSAxMDtcblxuXHRcdG1lLm1pbiA9IG5vbk5lZ2F0aXZlT3JEZWZhdWx0KHRpY2tPcHRzLm1pbiwgbWUubWluKTtcblx0XHRtZS5tYXggPSBub25OZWdhdGl2ZU9yRGVmYXVsdCh0aWNrT3B0cy5tYXgsIG1lLm1heCk7XG5cblx0XHRpZiAobWUubWluID09PSBtZS5tYXgpIHtcblx0XHRcdGlmIChtZS5taW4gIT09IDAgJiYgbWUubWluICE9PSBudWxsKSB7XG5cdFx0XHRcdG1lLm1pbiA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKGhlbHBlcnMkMS5sb2cxMChtZS5taW4pKSAtIDEpO1xuXHRcdFx0XHRtZS5tYXggPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzJDEubG9nMTAobWUubWF4KSkgKyAxKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1lLm1pbiA9IERFRkFVTFRfTUlOO1xuXHRcdFx0XHRtZS5tYXggPSBERUZBVUxUX01BWDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG1lLm1pbiA9PT0gbnVsbCkge1xuXHRcdFx0bWUubWluID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoaGVscGVycyQxLmxvZzEwKG1lLm1heCkpIC0gMSk7XG5cdFx0fVxuXHRcdGlmIChtZS5tYXggPT09IG51bGwpIHtcblx0XHRcdG1lLm1heCA9IG1lLm1pbiAhPT0gMFxuXHRcdFx0XHQ/IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKGhlbHBlcnMkMS5sb2cxMChtZS5taW4pKSArIDEpXG5cdFx0XHRcdDogREVGQVVMVF9NQVg7XG5cdFx0fVxuXHRcdGlmIChtZS5taW5Ob3RaZXJvID09PSBudWxsKSB7XG5cdFx0XHRpZiAobWUubWluID4gMCkge1xuXHRcdFx0XHRtZS5taW5Ob3RaZXJvID0gbWUubWluO1xuXHRcdFx0fSBlbHNlIGlmIChtZS5tYXggPCAxKSB7XG5cdFx0XHRcdG1lLm1pbk5vdFplcm8gPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzJDEubG9nMTAobWUubWF4KSkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWUubWluTm90WmVybyA9IERFRkFVTFRfTUlOO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRidWlsZFRpY2tzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciB0aWNrT3B0cyA9IG1lLm9wdGlvbnMudGlja3M7XG5cdFx0dmFyIHJldmVyc2UgPSAhbWUuaXNIb3Jpem9udGFsKCk7XG5cblx0XHR2YXIgZ2VuZXJhdGlvbk9wdGlvbnMgPSB7XG5cdFx0XHRtaW46IG5vbk5lZ2F0aXZlT3JEZWZhdWx0KHRpY2tPcHRzLm1pbiksXG5cdFx0XHRtYXg6IG5vbk5lZ2F0aXZlT3JEZWZhdWx0KHRpY2tPcHRzLm1heClcblx0XHR9O1xuXHRcdHZhciB0aWNrcyA9IG1lLnRpY2tzID0gZ2VuZXJhdGVUaWNrcyQxKGdlbmVyYXRpb25PcHRpb25zLCBtZSk7XG5cblx0XHQvLyBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgbWF4IGFuZCBtaW4gZ2l2ZW4gdGhlIHRpY2sgdmFsdWVzIHNpbmNlIHdlIGhhdmUgZXhwYW5kZWQgdGhlXG5cdFx0Ly8gcmFuZ2Ugb2YgdGhlIHNjYWxlXG5cdFx0bWUubWF4ID0gaGVscGVycyQxLm1heCh0aWNrcyk7XG5cdFx0bWUubWluID0gaGVscGVycyQxLm1pbih0aWNrcyk7XG5cblx0XHRpZiAodGlja09wdHMucmV2ZXJzZSkge1xuXHRcdFx0cmV2ZXJzZSA9ICFyZXZlcnNlO1xuXHRcdFx0bWUuc3RhcnQgPSBtZS5tYXg7XG5cdFx0XHRtZS5lbmQgPSBtZS5taW47XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1lLnN0YXJ0ID0gbWUubWluO1xuXHRcdFx0bWUuZW5kID0gbWUubWF4O1xuXHRcdH1cblx0XHRpZiAocmV2ZXJzZSkge1xuXHRcdFx0dGlja3MucmV2ZXJzZSgpO1xuXHRcdH1cblx0fSxcblxuXHRjb252ZXJ0VGlja3NUb0xhYmVsczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50aWNrVmFsdWVzID0gdGhpcy50aWNrcy5zbGljZSgpO1xuXG5cdFx0Y29yZV9zY2FsZS5wcm90b3R5cGUuY29udmVydFRpY2tzVG9MYWJlbHMuY2FsbCh0aGlzKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIGNvcnJlY3QgdG9vbHRpcCBsYWJlbFxuXHRnZXRMYWJlbEZvckluZGV4OiBmdW5jdGlvbihpbmRleCwgZGF0YXNldEluZGV4KSB7XG5cdFx0cmV0dXJuICt0aGlzLmdldFJpZ2h0VmFsdWUodGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0pO1xuXHR9LFxuXG5cdGdldFBpeGVsRm9yVGljazogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRoaXMudGlja1ZhbHVlc1tpbmRleF0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgdGljay5cblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIG1pbmltdW0gbm90IHplcm8gdmFsdWUuXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGZpcnN0IHRpY2sgdmFsdWUuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0Rmlyc3RUaWNrVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0dmFyIGV4cCA9IE1hdGguZmxvb3IoaGVscGVycyQxLmxvZzEwKHZhbHVlKSk7XG5cdFx0dmFyIHNpZ25pZmljYW5kID0gTWF0aC5mbG9vcih2YWx1ZSAvIE1hdGgucG93KDEwLCBleHApKTtcblxuXHRcdHJldHVybiBzaWduaWZpY2FuZCAqIE1hdGgucG93KDEwLCBleHApO1xuXHR9LFxuXG5cdGdldFBpeGVsRm9yVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgdGlja09wdHMgPSBtZS5vcHRpb25zLnRpY2tzO1xuXHRcdHZhciByZXZlcnNlID0gdGlja09wdHMucmV2ZXJzZTtcblx0XHR2YXIgbG9nMTAgPSBoZWxwZXJzJDEubG9nMTA7XG5cdFx0dmFyIGZpcnN0VGlja1ZhbHVlID0gbWUuX2dldEZpcnN0VGlja1ZhbHVlKG1lLm1pbk5vdFplcm8pO1xuXHRcdHZhciBvZmZzZXQgPSAwO1xuXHRcdHZhciBpbm5lckRpbWVuc2lvbiwgcGl4ZWwsIHN0YXJ0LCBlbmQsIHNpZ247XG5cblx0XHR2YWx1ZSA9ICttZS5nZXRSaWdodFZhbHVlKHZhbHVlKTtcblx0XHRpZiAocmV2ZXJzZSkge1xuXHRcdFx0c3RhcnQgPSBtZS5lbmQ7XG5cdFx0XHRlbmQgPSBtZS5zdGFydDtcblx0XHRcdHNpZ24gPSAtMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3RhcnQgPSBtZS5zdGFydDtcblx0XHRcdGVuZCA9IG1lLmVuZDtcblx0XHRcdHNpZ24gPSAxO1xuXHRcdH1cblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdGlubmVyRGltZW5zaW9uID0gbWUud2lkdGg7XG5cdFx0XHRwaXhlbCA9IHJldmVyc2UgPyBtZS5yaWdodCA6IG1lLmxlZnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlubmVyRGltZW5zaW9uID0gbWUuaGVpZ2h0O1xuXHRcdFx0c2lnbiAqPSAtMTsgLy8gaW52ZXJ0LCBzaW5jZSB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhcyBpcyBhdCBwaXhlbCAoMCwgMClcblx0XHRcdHBpeGVsID0gcmV2ZXJzZSA/IG1lLnRvcCA6IG1lLmJvdHRvbTtcblx0XHR9XG5cdFx0aWYgKHZhbHVlICE9PSBzdGFydCkge1xuXHRcdFx0aWYgKHN0YXJ0ID09PSAwKSB7IC8vIGluY2x1ZGUgemVybyB0aWNrXG5cdFx0XHRcdG9mZnNldCA9IHZhbHVlT3JEZWZhdWx0JGEodGlja09wdHMuZm9udFNpemUsIGNvcmVfZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRGb250U2l6ZSk7XG5cdFx0XHRcdGlubmVyRGltZW5zaW9uIC09IG9mZnNldDtcblx0XHRcdFx0c3RhcnQgPSBmaXJzdFRpY2tWYWx1ZTtcblx0XHRcdH1cblx0XHRcdGlmICh2YWx1ZSAhPT0gMCkge1xuXHRcdFx0XHRvZmZzZXQgKz0gaW5uZXJEaW1lbnNpb24gLyAobG9nMTAoZW5kKSAtIGxvZzEwKHN0YXJ0KSkgKiAobG9nMTAodmFsdWUpIC0gbG9nMTAoc3RhcnQpKTtcblx0XHRcdH1cblx0XHRcdHBpeGVsICs9IHNpZ24gKiBvZmZzZXQ7XG5cdFx0fVxuXHRcdHJldHVybiBwaXhlbDtcblx0fSxcblxuXHRnZXRWYWx1ZUZvclBpeGVsOiBmdW5jdGlvbihwaXhlbCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIHRpY2tPcHRzID0gbWUub3B0aW9ucy50aWNrcztcblx0XHR2YXIgcmV2ZXJzZSA9IHRpY2tPcHRzLnJldmVyc2U7XG5cdFx0dmFyIGxvZzEwID0gaGVscGVycyQxLmxvZzEwO1xuXHRcdHZhciBmaXJzdFRpY2tWYWx1ZSA9IG1lLl9nZXRGaXJzdFRpY2tWYWx1ZShtZS5taW5Ob3RaZXJvKTtcblx0XHR2YXIgaW5uZXJEaW1lbnNpb24sIHN0YXJ0LCBlbmQsIHZhbHVlO1xuXG5cdFx0aWYgKHJldmVyc2UpIHtcblx0XHRcdHN0YXJ0ID0gbWUuZW5kO1xuXHRcdFx0ZW5kID0gbWUuc3RhcnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN0YXJ0ID0gbWUuc3RhcnQ7XG5cdFx0XHRlbmQgPSBtZS5lbmQ7XG5cdFx0fVxuXHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0aW5uZXJEaW1lbnNpb24gPSBtZS53aWR0aDtcblx0XHRcdHZhbHVlID0gcmV2ZXJzZSA/IG1lLnJpZ2h0IC0gcGl4ZWwgOiBwaXhlbCAtIG1lLmxlZnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlubmVyRGltZW5zaW9uID0gbWUuaGVpZ2h0O1xuXHRcdFx0dmFsdWUgPSByZXZlcnNlID8gcGl4ZWwgLSBtZS50b3AgOiBtZS5ib3R0b20gLSBwaXhlbDtcblx0XHR9XG5cdFx0aWYgKHZhbHVlICE9PSBzdGFydCkge1xuXHRcdFx0aWYgKHN0YXJ0ID09PSAwKSB7IC8vIGluY2x1ZGUgemVybyB0aWNrXG5cdFx0XHRcdHZhciBvZmZzZXQgPSB2YWx1ZU9yRGVmYXVsdCRhKHRpY2tPcHRzLmZvbnRTaXplLCBjb3JlX2RlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Rm9udFNpemUpO1xuXHRcdFx0XHR2YWx1ZSAtPSBvZmZzZXQ7XG5cdFx0XHRcdGlubmVyRGltZW5zaW9uIC09IG9mZnNldDtcblx0XHRcdFx0c3RhcnQgPSBmaXJzdFRpY2tWYWx1ZTtcblx0XHRcdH1cblx0XHRcdHZhbHVlICo9IGxvZzEwKGVuZCkgLSBsb2cxMChzdGFydCk7XG5cdFx0XHR2YWx1ZSAvPSBpbm5lckRpbWVuc2lvbjtcblx0XHRcdHZhbHVlID0gTWF0aC5wb3coMTAsIGxvZzEwKHN0YXJ0KSArIHZhbHVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG59KTtcblxuLy8gSU5URVJOQUw6IHN0YXRpYyBkZWZhdWx0IG9wdGlvbnMsIHJlZ2lzdGVyZWQgaW4gc3JjL2luZGV4LmpzXG52YXIgX2RlZmF1bHRzJDIgPSBkZWZhdWx0Q29uZmlnJDI7XG5zY2FsZV9sb2dhcml0aG1pYy5fZGVmYXVsdHMgPSBfZGVmYXVsdHMkMjtcblxudmFyIHZhbHVlT3JEZWZhdWx0JGIgPSBoZWxwZXJzJDEudmFsdWVPckRlZmF1bHQ7XG52YXIgdmFsdWVBdEluZGV4T3JEZWZhdWx0JDEgPSBoZWxwZXJzJDEudmFsdWVBdEluZGV4T3JEZWZhdWx0O1xudmFyIHJlc29sdmUkNyA9IGhlbHBlcnMkMS5vcHRpb25zLnJlc29sdmU7XG5cbnZhciBkZWZhdWx0Q29uZmlnJDMgPSB7XG5cdGRpc3BsYXk6IHRydWUsXG5cblx0Ly8gQm9vbGVhbiAtIFdoZXRoZXIgdG8gYW5pbWF0ZSBzY2FsaW5nIHRoZSBjaGFydCBmcm9tIHRoZSBjZW50cmVcblx0YW5pbWF0ZTogdHJ1ZSxcblx0cG9zaXRpb246ICdjaGFydEFyZWEnLFxuXG5cdGFuZ2xlTGluZXM6IHtcblx0XHRkaXNwbGF5OiB0cnVlLFxuXHRcdGNvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjEpJyxcblx0XHRsaW5lV2lkdGg6IDEsXG5cdFx0Ym9yZGVyRGFzaDogW10sXG5cdFx0Ym9yZGVyRGFzaE9mZnNldDogMC4wXG5cdH0sXG5cblx0Z3JpZExpbmVzOiB7XG5cdFx0Y2lyY3VsYXI6IGZhbHNlXG5cdH0sXG5cblx0Ly8gbGFiZWwgc2V0dGluZ3Ncblx0dGlja3M6IHtcblx0XHQvLyBCb29sZWFuIC0gU2hvdyBhIGJhY2tkcm9wIHRvIHRoZSBzY2FsZSBsYWJlbFxuXHRcdHNob3dMYWJlbEJhY2tkcm9wOiB0cnVlLFxuXG5cdFx0Ly8gU3RyaW5nIC0gVGhlIGNvbG91ciBvZiB0aGUgbGFiZWwgYmFja2Ryb3Bcblx0XHRiYWNrZHJvcENvbG9yOiAncmdiYSgyNTUsMjU1LDI1NSwwLjc1KScsXG5cblx0XHQvLyBOdW1iZXIgLSBUaGUgYmFja2Ryb3AgcGFkZGluZyBhYm92ZSAmIGJlbG93IHRoZSBsYWJlbCBpbiBwaXhlbHNcblx0XHRiYWNrZHJvcFBhZGRpbmdZOiAyLFxuXG5cdFx0Ly8gTnVtYmVyIC0gVGhlIGJhY2tkcm9wIHBhZGRpbmcgdG8gdGhlIHNpZGUgb2YgdGhlIGxhYmVsIGluIHBpeGVsc1xuXHRcdGJhY2tkcm9wUGFkZGluZ1g6IDIsXG5cblx0XHRjYWxsYmFjazogY29yZV90aWNrcy5mb3JtYXR0ZXJzLmxpbmVhclxuXHR9LFxuXG5cdHBvaW50TGFiZWxzOiB7XG5cdFx0Ly8gQm9vbGVhbiAtIGlmIHRydWUsIHNob3cgcG9pbnQgbGFiZWxzXG5cdFx0ZGlzcGxheTogdHJ1ZSxcblxuXHRcdC8vIE51bWJlciAtIFBvaW50IGxhYmVsIGZvbnQgc2l6ZSBpbiBwaXhlbHNcblx0XHRmb250U2l6ZTogMTAsXG5cblx0XHQvLyBGdW5jdGlvbiAtIFVzZWQgdG8gY29udmVydCBwb2ludCBsYWJlbHNcblx0XHRjYWxsYmFjazogZnVuY3Rpb24obGFiZWwpIHtcblx0XHRcdHJldHVybiBsYWJlbDtcblx0XHR9XG5cdH1cbn07XG5cbmZ1bmN0aW9uIGdldFZhbHVlQ291bnQoc2NhbGUpIHtcblx0dmFyIG9wdHMgPSBzY2FsZS5vcHRpb25zO1xuXHRyZXR1cm4gb3B0cy5hbmdsZUxpbmVzLmRpc3BsYXkgfHwgb3B0cy5wb2ludExhYmVscy5kaXNwbGF5ID8gc2NhbGUuY2hhcnQuZGF0YS5sYWJlbHMubGVuZ3RoIDogMDtcbn1cblxuZnVuY3Rpb24gZ2V0VGlja0JhY2tkcm9wSGVpZ2h0KG9wdHMpIHtcblx0dmFyIHRpY2tPcHRzID0gb3B0cy50aWNrcztcblxuXHRpZiAodGlja09wdHMuZGlzcGxheSAmJiBvcHRzLmRpc3BsYXkpIHtcblx0XHRyZXR1cm4gdmFsdWVPckRlZmF1bHQkYih0aWNrT3B0cy5mb250U2l6ZSwgY29yZV9kZWZhdWx0cy5nbG9iYWwuZGVmYXVsdEZvbnRTaXplKSArIHRpY2tPcHRzLmJhY2tkcm9wUGFkZGluZ1kgKiAyO1xuXHR9XG5cdHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBtZWFzdXJlTGFiZWxTaXplKGN0eCwgbGluZUhlaWdodCwgbGFiZWwpIHtcblx0aWYgKGhlbHBlcnMkMS5pc0FycmF5KGxhYmVsKSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR3OiBoZWxwZXJzJDEubG9uZ2VzdFRleHQoY3R4LCBjdHguZm9udCwgbGFiZWwpLFxuXHRcdFx0aDogbGFiZWwubGVuZ3RoICogbGluZUhlaWdodFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHc6IGN0eC5tZWFzdXJlVGV4dChsYWJlbCkud2lkdGgsXG5cdFx0aDogbGluZUhlaWdodFxuXHR9O1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVMaW1pdHMoYW5nbGUsIHBvcywgc2l6ZSwgbWluLCBtYXgpIHtcblx0aWYgKGFuZ2xlID09PSBtaW4gfHwgYW5nbGUgPT09IG1heCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzdGFydDogcG9zIC0gKHNpemUgLyAyKSxcblx0XHRcdGVuZDogcG9zICsgKHNpemUgLyAyKVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoYW5nbGUgPCBtaW4gfHwgYW5nbGUgPiBtYXgpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c3RhcnQ6IHBvcyAtIHNpemUsXG5cdFx0XHRlbmQ6IHBvc1xuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHN0YXJ0OiBwb3MsXG5cdFx0ZW5kOiBwb3MgKyBzaXplXG5cdH07XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGZpdCBhIHJhZGlhbCBsaW5lYXIgc2NhbGUgd2l0aCBwb2ludCBsYWJlbHNcbiAqL1xuZnVuY3Rpb24gZml0V2l0aFBvaW50TGFiZWxzKHNjYWxlKSB7XG5cblx0Ly8gUmlnaHQsIHRoaXMgaXMgcmVhbGx5IGNvbmZ1c2luZyBhbmQgdGhlcmUgaXMgYSBsb3Qgb2YgbWF0aHMgZ29pbmcgb24gaGVyZVxuXHQvLyBUaGUgZ2lzdCBvZiB0aGUgcHJvYmxlbSBpcyBoZXJlOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9ubm5pY2svNjk2Y2M5YzU1ZjRiMGJlYjhmZTlcblx0Ly9cblx0Ly8gUmVhY3Rpb246IGh0dHBzOi8vZGwuZHJvcGJveHVzZXJjb250ZW50LmNvbS91LzM0NjAxMzYzL3Rvb211Y2hzY2llbmNlLmdpZlxuXHQvL1xuXHQvLyBTb2x1dGlvbjpcblx0Ly9cblx0Ly8gV2UgYXNzdW1lIHRoZSByYWRpdXMgb2YgdGhlIHBvbHlnb24gaXMgaGFsZiB0aGUgc2l6ZSBvZiB0aGUgY2FudmFzIGF0IGZpcnN0XG5cdC8vIGF0IGVhY2ggaW5kZXggd2UgY2hlY2sgaWYgdGhlIHRleHQgb3ZlcmxhcHMuXG5cdC8vXG5cdC8vIFdoZXJlIGl0IGRvZXMsIHdlIHN0b3JlIHRoYXQgYW5nbGUgYW5kIHRoYXQgaW5kZXguXG5cdC8vXG5cdC8vIEFmdGVyIGZpbmRpbmcgdGhlIGxhcmdlc3QgaW5kZXggYW5kIGFuZ2xlIHdlIGNhbGN1bGF0ZSBob3cgbXVjaCB3ZSBuZWVkIHRvIHJlbW92ZVxuXHQvLyBmcm9tIHRoZSBzaGFwZSByYWRpdXMgdG8gbW92ZSB0aGUgcG9pbnQgaW53YXJkcyBieSB0aGF0IHguXG5cdC8vXG5cdC8vIFdlIGF2ZXJhZ2UgdGhlIGxlZnQgYW5kIHJpZ2h0IGRpc3RhbmNlcyB0byBnZXQgdGhlIG1heGltdW0gc2hhcGUgcmFkaXVzIHRoYXQgY2FuIGZpdCBpbiB0aGUgYm94XG5cdC8vIGFsb25nIHdpdGggbGFiZWxzLlxuXHQvL1xuXHQvLyBPbmNlIHdlIGhhdmUgdGhhdCwgd2UgY2FuIGZpbmQgdGhlIGNlbnRyZSBwb2ludCBmb3IgdGhlIGNoYXJ0LCBieSB0YWtpbmcgdGhlIHggdGV4dCBwcm90cnVzaW9uXG5cdC8vIG9uIGVhY2ggc2lkZSwgcmVtb3ZpbmcgdGhhdCBmcm9tIHRoZSBzaXplLCBoYWx2aW5nIGl0IGFuZCBhZGRpbmcgdGhlIGxlZnQgeCBwcm90cnVzaW9uIHdpZHRoLlxuXHQvL1xuXHQvLyBUaGlzIHdpbGwgbWVhbiB3ZSBoYXZlIGEgc2hhcGUgZml0dGVkIHRvIHRoZSBjYW52YXMsIGFzIGxhcmdlIGFzIGl0IGNhbiBiZSB3aXRoIHRoZSBsYWJlbHNcblx0Ly8gYW5kIHBvc2l0aW9uIGl0IGluIHRoZSBtb3N0IHNwYWNlIGVmZmljaWVudCBtYW5uZXJcblx0Ly9cblx0Ly8gaHR0cHM6Ly9kbC5kcm9wYm94dXNlcmNvbnRlbnQuY29tL3UvMzQ2MDEzNjMveWVhaHNjaWVuY2UuZ2lmXG5cblx0dmFyIHBsRm9udCA9IGhlbHBlcnMkMS5vcHRpb25zLl9wYXJzZUZvbnQoc2NhbGUub3B0aW9ucy5wb2ludExhYmVscyk7XG5cblx0Ly8gR2V0IG1heGltdW0gcmFkaXVzIG9mIHRoZSBwb2x5Z29uLiBFaXRoZXIgaGFsZiB0aGUgaGVpZ2h0IChtaW51cyB0aGUgdGV4dCB3aWR0aCkgb3IgaGFsZiB0aGUgd2lkdGguXG5cdC8vIFVzZSB0aGlzIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0ICsgY2hhbmdlLiAtIE1ha2Ugc3VyZSBML1IgcHJvdHJ1c2lvbiBpcyBhdCBsZWFzdCAwIHRvIHN0b3AgaXNzdWVzIHdpdGggY2VudHJlIHBvaW50c1xuXHR2YXIgZnVydGhlc3RMaW1pdHMgPSB7XG5cdFx0bDogMCxcblx0XHRyOiBzY2FsZS53aWR0aCxcblx0XHR0OiAwLFxuXHRcdGI6IHNjYWxlLmhlaWdodCAtIHNjYWxlLnBhZGRpbmdUb3Bcblx0fTtcblx0dmFyIGZ1cnRoZXN0QW5nbGVzID0ge307XG5cdHZhciBpLCB0ZXh0U2l6ZSwgcG9pbnRQb3NpdGlvbjtcblxuXHRzY2FsZS5jdHguZm9udCA9IHBsRm9udC5zdHJpbmc7XG5cdHNjYWxlLl9wb2ludExhYmVsU2l6ZXMgPSBbXTtcblxuXHR2YXIgdmFsdWVDb3VudCA9IGdldFZhbHVlQ291bnQoc2NhbGUpO1xuXHRmb3IgKGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKSB7XG5cdFx0cG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oaSwgc2NhbGUuZHJhd2luZ0FyZWEgKyA1KTtcblx0XHR0ZXh0U2l6ZSA9IG1lYXN1cmVMYWJlbFNpemUoc2NhbGUuY3R4LCBwbEZvbnQubGluZUhlaWdodCwgc2NhbGUucG9pbnRMYWJlbHNbaV0gfHwgJycpO1xuXHRcdHNjYWxlLl9wb2ludExhYmVsU2l6ZXNbaV0gPSB0ZXh0U2l6ZTtcblxuXHRcdC8vIEFkZCBxdWFydGVyIGNpcmNsZSB0byBtYWtlIGRlZ3JlZSAwIG1lYW4gdG9wIG9mIGNpcmNsZVxuXHRcdHZhciBhbmdsZVJhZGlhbnMgPSBzY2FsZS5nZXRJbmRleEFuZ2xlKGkpO1xuXHRcdHZhciBhbmdsZSA9IGhlbHBlcnMkMS50b0RlZ3JlZXMoYW5nbGVSYWRpYW5zKSAlIDM2MDtcblx0XHR2YXIgaExpbWl0cyA9IGRldGVybWluZUxpbWl0cyhhbmdsZSwgcG9pbnRQb3NpdGlvbi54LCB0ZXh0U2l6ZS53LCAwLCAxODApO1xuXHRcdHZhciB2TGltaXRzID0gZGV0ZXJtaW5lTGltaXRzKGFuZ2xlLCBwb2ludFBvc2l0aW9uLnksIHRleHRTaXplLmgsIDkwLCAyNzApO1xuXG5cdFx0aWYgKGhMaW1pdHMuc3RhcnQgPCBmdXJ0aGVzdExpbWl0cy5sKSB7XG5cdFx0XHRmdXJ0aGVzdExpbWl0cy5sID0gaExpbWl0cy5zdGFydDtcblx0XHRcdGZ1cnRoZXN0QW5nbGVzLmwgPSBhbmdsZVJhZGlhbnM7XG5cdFx0fVxuXG5cdFx0aWYgKGhMaW1pdHMuZW5kID4gZnVydGhlc3RMaW1pdHMucikge1xuXHRcdFx0ZnVydGhlc3RMaW1pdHMuciA9IGhMaW1pdHMuZW5kO1xuXHRcdFx0ZnVydGhlc3RBbmdsZXMuciA9IGFuZ2xlUmFkaWFucztcblx0XHR9XG5cblx0XHRpZiAodkxpbWl0cy5zdGFydCA8IGZ1cnRoZXN0TGltaXRzLnQpIHtcblx0XHRcdGZ1cnRoZXN0TGltaXRzLnQgPSB2TGltaXRzLnN0YXJ0O1xuXHRcdFx0ZnVydGhlc3RBbmdsZXMudCA9IGFuZ2xlUmFkaWFucztcblx0XHR9XG5cblx0XHRpZiAodkxpbWl0cy5lbmQgPiBmdXJ0aGVzdExpbWl0cy5iKSB7XG5cdFx0XHRmdXJ0aGVzdExpbWl0cy5iID0gdkxpbWl0cy5lbmQ7XG5cdFx0XHRmdXJ0aGVzdEFuZ2xlcy5iID0gYW5nbGVSYWRpYW5zO1xuXHRcdH1cblx0fVxuXG5cdHNjYWxlLnNldFJlZHVjdGlvbnMoc2NhbGUuZHJhd2luZ0FyZWEsIGZ1cnRoZXN0TGltaXRzLCBmdXJ0aGVzdEFuZ2xlcyk7XG59XG5cbmZ1bmN0aW9uIGdldFRleHRBbGlnbkZvckFuZ2xlKGFuZ2xlKSB7XG5cdGlmIChhbmdsZSA9PT0gMCB8fCBhbmdsZSA9PT0gMTgwKSB7XG5cdFx0cmV0dXJuICdjZW50ZXInO1xuXHR9IGVsc2UgaWYgKGFuZ2xlIDwgMTgwKSB7XG5cdFx0cmV0dXJuICdsZWZ0Jztcblx0fVxuXG5cdHJldHVybiAncmlnaHQnO1xufVxuXG5mdW5jdGlvbiBmaWxsVGV4dChjdHgsIHRleHQsIHBvc2l0aW9uLCBsaW5lSGVpZ2h0KSB7XG5cdHZhciB5ID0gcG9zaXRpb24ueSArIGxpbmVIZWlnaHQgLyAyO1xuXHR2YXIgaSwgaWxlbjtcblxuXHRpZiAoaGVscGVycyQxLmlzQXJyYXkodGV4dCkpIHtcblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gdGV4dC5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdGN0eC5maWxsVGV4dCh0ZXh0W2ldLCBwb3NpdGlvbi54LCB5KTtcblx0XHRcdHkgKz0gbGluZUhlaWdodDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y3R4LmZpbGxUZXh0KHRleHQsIHBvc2l0aW9uLngsIHkpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGFkanVzdFBvaW50UG9zaXRpb25Gb3JMYWJlbEhlaWdodChhbmdsZSwgdGV4dFNpemUsIHBvc2l0aW9uKSB7XG5cdGlmIChhbmdsZSA9PT0gOTAgfHwgYW5nbGUgPT09IDI3MCkge1xuXHRcdHBvc2l0aW9uLnkgLT0gKHRleHRTaXplLmggLyAyKTtcblx0fSBlbHNlIGlmIChhbmdsZSA+IDI3MCB8fCBhbmdsZSA8IDkwKSB7XG5cdFx0cG9zaXRpb24ueSAtPSB0ZXh0U2l6ZS5oO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRyYXdQb2ludExhYmVscyhzY2FsZSkge1xuXHR2YXIgY3R4ID0gc2NhbGUuY3R4O1xuXHR2YXIgb3B0cyA9IHNjYWxlLm9wdGlvbnM7XG5cdHZhciBhbmdsZUxpbmVPcHRzID0gb3B0cy5hbmdsZUxpbmVzO1xuXHR2YXIgZ3JpZExpbmVPcHRzID0gb3B0cy5ncmlkTGluZXM7XG5cdHZhciBwb2ludExhYmVsT3B0cyA9IG9wdHMucG9pbnRMYWJlbHM7XG5cdHZhciBsaW5lV2lkdGggPSB2YWx1ZU9yRGVmYXVsdCRiKGFuZ2xlTGluZU9wdHMubGluZVdpZHRoLCBncmlkTGluZU9wdHMubGluZVdpZHRoKTtcblx0dmFyIGxpbmVDb2xvciA9IHZhbHVlT3JEZWZhdWx0JGIoYW5nbGVMaW5lT3B0cy5jb2xvciwgZ3JpZExpbmVPcHRzLmNvbG9yKTtcblx0dmFyIHRpY2tCYWNrZHJvcEhlaWdodCA9IGdldFRpY2tCYWNrZHJvcEhlaWdodChvcHRzKTtcblxuXHRjdHguc2F2ZSgpO1xuXHRjdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuXHRjdHguc3Ryb2tlU3R5bGUgPSBsaW5lQ29sb3I7XG5cdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRjdHguc2V0TGluZURhc2gocmVzb2x2ZSQ3KFthbmdsZUxpbmVPcHRzLmJvcmRlckRhc2gsIGdyaWRMaW5lT3B0cy5ib3JkZXJEYXNoLCBbXV0pKTtcblx0XHRjdHgubGluZURhc2hPZmZzZXQgPSByZXNvbHZlJDcoW2FuZ2xlTGluZU9wdHMuYm9yZGVyRGFzaE9mZnNldCwgZ3JpZExpbmVPcHRzLmJvcmRlckRhc2hPZmZzZXQsIDAuMF0pO1xuXHR9XG5cblx0dmFyIG91dGVyRGlzdGFuY2UgPSBzY2FsZS5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZShvcHRzLnRpY2tzLnJldmVyc2UgPyBzY2FsZS5taW4gOiBzY2FsZS5tYXgpO1xuXG5cdC8vIFBvaW50IExhYmVsIEZvbnRcblx0dmFyIHBsRm9udCA9IGhlbHBlcnMkMS5vcHRpb25zLl9wYXJzZUZvbnQocG9pbnRMYWJlbE9wdHMpO1xuXG5cdGN0eC5mb250ID0gcGxGb250LnN0cmluZztcblx0Y3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuXG5cdGZvciAodmFyIGkgPSBnZXRWYWx1ZUNvdW50KHNjYWxlKSAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0aWYgKGFuZ2xlTGluZU9wdHMuZGlzcGxheSAmJiBsaW5lV2lkdGggJiYgbGluZUNvbG9yKSB7XG5cdFx0XHR2YXIgb3V0ZXJQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oaSwgb3V0ZXJEaXN0YW5jZSk7XG5cdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRjdHgubW92ZVRvKHNjYWxlLnhDZW50ZXIsIHNjYWxlLnlDZW50ZXIpO1xuXHRcdFx0Y3R4LmxpbmVUbyhvdXRlclBvc2l0aW9uLngsIG91dGVyUG9zaXRpb24ueSk7XG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHBvaW50TGFiZWxPcHRzLmRpc3BsYXkpIHtcblx0XHRcdC8vIEV4dHJhIHBpeGVscyBvdXQgZm9yIHNvbWUgbGFiZWwgc3BhY2luZ1xuXHRcdFx0dmFyIGV4dHJhID0gKGkgPT09IDAgPyB0aWNrQmFja2Ryb3BIZWlnaHQgLyAyIDogMCk7XG5cdFx0XHR2YXIgcG9pbnRMYWJlbFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbihpLCBvdXRlckRpc3RhbmNlICsgZXh0cmEgKyA1KTtcblxuXHRcdFx0Ly8gS2VlcCB0aGlzIGluIGxvb3Agc2luY2Ugd2UgbWF5IHN1cHBvcnQgYXJyYXkgcHJvcGVydGllcyBoZXJlXG5cdFx0XHR2YXIgcG9pbnRMYWJlbEZvbnRDb2xvciA9IHZhbHVlQXRJbmRleE9yRGVmYXVsdCQxKHBvaW50TGFiZWxPcHRzLmZvbnRDb2xvciwgaSwgY29yZV9kZWZhdWx0cy5nbG9iYWwuZGVmYXVsdEZvbnRDb2xvcik7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gcG9pbnRMYWJlbEZvbnRDb2xvcjtcblxuXHRcdFx0dmFyIGFuZ2xlUmFkaWFucyA9IHNjYWxlLmdldEluZGV4QW5nbGUoaSk7XG5cdFx0XHR2YXIgYW5nbGUgPSBoZWxwZXJzJDEudG9EZWdyZWVzKGFuZ2xlUmFkaWFucyk7XG5cdFx0XHRjdHgudGV4dEFsaWduID0gZ2V0VGV4dEFsaWduRm9yQW5nbGUoYW5nbGUpO1xuXHRcdFx0YWRqdXN0UG9pbnRQb3NpdGlvbkZvckxhYmVsSGVpZ2h0KGFuZ2xlLCBzY2FsZS5fcG9pbnRMYWJlbFNpemVzW2ldLCBwb2ludExhYmVsUG9zaXRpb24pO1xuXHRcdFx0ZmlsbFRleHQoY3R4LCBzY2FsZS5wb2ludExhYmVsc1tpXSB8fCAnJywgcG9pbnRMYWJlbFBvc2l0aW9uLCBwbEZvbnQubGluZUhlaWdodCk7XG5cdFx0fVxuXHR9XG5cdGN0eC5yZXN0b3JlKCk7XG59XG5cbmZ1bmN0aW9uIGRyYXdSYWRpdXNMaW5lKHNjYWxlLCBncmlkTGluZU9wdHMsIHJhZGl1cywgaW5kZXgpIHtcblx0dmFyIGN0eCA9IHNjYWxlLmN0eDtcblx0dmFyIGNpcmN1bGFyID0gZ3JpZExpbmVPcHRzLmNpcmN1bGFyO1xuXHR2YXIgdmFsdWVDb3VudCA9IGdldFZhbHVlQ291bnQoc2NhbGUpO1xuXHR2YXIgbGluZUNvbG9yID0gdmFsdWVBdEluZGV4T3JEZWZhdWx0JDEoZ3JpZExpbmVPcHRzLmNvbG9yLCBpbmRleCAtIDEpO1xuXHR2YXIgbGluZVdpZHRoID0gdmFsdWVBdEluZGV4T3JEZWZhdWx0JDEoZ3JpZExpbmVPcHRzLmxpbmVXaWR0aCwgaW5kZXggLSAxKTtcblx0dmFyIHBvaW50UG9zaXRpb247XG5cblx0aWYgKCghY2lyY3VsYXIgJiYgIXZhbHVlQ291bnQpIHx8ICFsaW5lQ29sb3IgfHwgIWxpbmVXaWR0aCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGN0eC5zYXZlKCk7XG5cdGN0eC5zdHJva2VTdHlsZSA9IGxpbmVDb2xvcjtcblx0Y3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcblx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdGN0eC5zZXRMaW5lRGFzaChncmlkTGluZU9wdHMuYm9yZGVyRGFzaCB8fCBbXSk7XG5cdFx0Y3R4LmxpbmVEYXNoT2Zmc2V0ID0gZ3JpZExpbmVPcHRzLmJvcmRlckRhc2hPZmZzZXQgfHwgMC4wO1xuXHR9XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRpZiAoY2lyY3VsYXIpIHtcblx0XHQvLyBEcmF3IGNpcmN1bGFyIGFyY3MgYmV0d2VlbiB0aGUgcG9pbnRzXG5cdFx0Y3R4LmFyYyhzY2FsZS54Q2VudGVyLCBzY2FsZS55Q2VudGVyLCByYWRpdXMsIDAsIE1hdGguUEkgKiAyKTtcblx0fSBlbHNlIHtcblx0XHQvLyBEcmF3IHN0cmFpZ2h0IGxpbmVzIGNvbm5lY3RpbmcgZWFjaCBpbmRleFxuXHRcdHBvaW50UG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKDAsIHJhZGl1cyk7XG5cdFx0Y3R4Lm1vdmVUbyhwb2ludFBvc2l0aW9uLngsIHBvaW50UG9zaXRpb24ueSk7XG5cblx0XHRmb3IgKHZhciBpID0gMTsgaSA8IHZhbHVlQ291bnQ7IGkrKykge1xuXHRcdFx0cG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oaSwgcmFkaXVzKTtcblx0XHRcdGN0eC5saW5lVG8ocG9pbnRQb3NpdGlvbi54LCBwb2ludFBvc2l0aW9uLnkpO1xuXHRcdH1cblx0fVxuXHRjdHguY2xvc2VQYXRoKCk7XG5cdGN0eC5zdHJva2UoKTtcblx0Y3R4LnJlc3RvcmUoKTtcbn1cblxuZnVuY3Rpb24gbnVtYmVyT3JaZXJvKHBhcmFtKSB7XG5cdHJldHVybiBoZWxwZXJzJDEuaXNOdW1iZXIocGFyYW0pID8gcGFyYW0gOiAwO1xufVxuXG52YXIgc2NhbGVfcmFkaWFsTGluZWFyID0gc2NhbGVfbGluZWFyYmFzZS5leHRlbmQoe1xuXHRzZXREaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0Ly8gU2V0IHRoZSB1bmNvbnN0cmFpbmVkIGRpbWVuc2lvbiBiZWZvcmUgbGFiZWwgcm90YXRpb25cblx0XHRtZS53aWR0aCA9IG1lLm1heFdpZHRoO1xuXHRcdG1lLmhlaWdodCA9IG1lLm1heEhlaWdodDtcblx0XHRtZS5wYWRkaW5nVG9wID0gZ2V0VGlja0JhY2tkcm9wSGVpZ2h0KG1lLm9wdGlvbnMpIC8gMjtcblx0XHRtZS54Q2VudGVyID0gTWF0aC5mbG9vcihtZS53aWR0aCAvIDIpO1xuXHRcdG1lLnlDZW50ZXIgPSBNYXRoLmZsb29yKChtZS5oZWlnaHQgLSBtZS5wYWRkaW5nVG9wKSAvIDIpO1xuXHRcdG1lLmRyYXdpbmdBcmVhID0gTWF0aC5taW4obWUuaGVpZ2h0IC0gbWUucGFkZGluZ1RvcCwgbWUud2lkdGgpIC8gMjtcblx0fSxcblxuXHRkZXRlcm1pbmVEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cdFx0dmFyIG1heCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuXHRcdGhlbHBlcnMkMS5lYWNoKGNoYXJ0LmRhdGEuZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSkge1xuXHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cblx0XHRcdFx0aGVscGVycyQxLmVhY2goZGF0YXNldC5kYXRhLCBmdW5jdGlvbihyYXdWYWx1ZSwgaW5kZXgpIHtcblx0XHRcdFx0XHR2YXIgdmFsdWUgPSArbWUuZ2V0UmlnaHRWYWx1ZShyYXdWYWx1ZSk7XG5cdFx0XHRcdFx0aWYgKGlzTmFOKHZhbHVlKSB8fCBtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbikge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1pbiA9IE1hdGgubWluKHZhbHVlLCBtaW4pO1xuXHRcdFx0XHRcdG1heCA9IE1hdGgubWF4KHZhbHVlLCBtYXgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdG1lLm1pbiA9IChtaW4gPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA/IDAgOiBtaW4pO1xuXHRcdG1lLm1heCA9IChtYXggPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA/IDAgOiBtYXgpO1xuXG5cdFx0Ly8gQ29tbW9uIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gaGFuZGxlIHRpY2tzLm1pbiwgdGlja3MubWF4LCB0aWNrcy5iZWdpbkF0WmVyb1xuXHRcdG1lLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKTtcblx0fSxcblxuXHQvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrcyBiYXNlZCBvbiB0aGUgc2NhbGUgZGltZW5zaW9uXG5cdF9jb21wdXRlVGlja0xpbWl0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gTWF0aC5jZWlsKHRoaXMuZHJhd2luZ0FyZWEgLyBnZXRUaWNrQmFja2Ryb3BIZWlnaHQodGhpcy5vcHRpb25zKSk7XG5cdH0sXG5cblx0Y29udmVydFRpY2tzVG9MYWJlbHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRzY2FsZV9saW5lYXJiYXNlLnByb3RvdHlwZS5jb252ZXJ0VGlja3NUb0xhYmVscy5jYWxsKG1lKTtcblxuXHRcdC8vIFBvaW50IGxhYmVsc1xuXHRcdG1lLnBvaW50TGFiZWxzID0gbWUuY2hhcnQuZGF0YS5sYWJlbHMubWFwKG1lLm9wdGlvbnMucG9pbnRMYWJlbHMuY2FsbGJhY2ssIG1lKTtcblx0fSxcblxuXHRnZXRMYWJlbEZvckluZGV4OiBmdW5jdGlvbihpbmRleCwgZGF0YXNldEluZGV4KSB7XG5cdFx0cmV0dXJuICt0aGlzLmdldFJpZ2h0VmFsdWUodGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0pO1xuXHR9LFxuXG5cdGZpdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cblx0XHRpZiAob3B0cy5kaXNwbGF5ICYmIG9wdHMucG9pbnRMYWJlbHMuZGlzcGxheSkge1xuXHRcdFx0Zml0V2l0aFBvaW50TGFiZWxzKG1lKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWUuc2V0Q2VudGVyUG9pbnQoMCwgMCwgMCwgMCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXQgcmFkaXVzIHJlZHVjdGlvbnMgYW5kIGRldGVybWluZSBuZXcgcmFkaXVzIGFuZCBjZW50ZXIgcG9pbnRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHNldFJlZHVjdGlvbnM6IGZ1bmN0aW9uKGxhcmdlc3RQb3NzaWJsZVJhZGl1cywgZnVydGhlc3RMaW1pdHMsIGZ1cnRoZXN0QW5nbGVzKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgcmFkaXVzUmVkdWN0aW9uTGVmdCA9IGZ1cnRoZXN0TGltaXRzLmwgLyBNYXRoLnNpbihmdXJ0aGVzdEFuZ2xlcy5sKTtcblx0XHR2YXIgcmFkaXVzUmVkdWN0aW9uUmlnaHQgPSBNYXRoLm1heChmdXJ0aGVzdExpbWl0cy5yIC0gbWUud2lkdGgsIDApIC8gTWF0aC5zaW4oZnVydGhlc3RBbmdsZXMucik7XG5cdFx0dmFyIHJhZGl1c1JlZHVjdGlvblRvcCA9IC1mdXJ0aGVzdExpbWl0cy50IC8gTWF0aC5jb3MoZnVydGhlc3RBbmdsZXMudCk7XG5cdFx0dmFyIHJhZGl1c1JlZHVjdGlvbkJvdHRvbSA9IC1NYXRoLm1heChmdXJ0aGVzdExpbWl0cy5iIC0gKG1lLmhlaWdodCAtIG1lLnBhZGRpbmdUb3ApLCAwKSAvIE1hdGguY29zKGZ1cnRoZXN0QW5nbGVzLmIpO1xuXG5cdFx0cmFkaXVzUmVkdWN0aW9uTGVmdCA9IG51bWJlck9yWmVybyhyYWRpdXNSZWR1Y3Rpb25MZWZ0KTtcblx0XHRyYWRpdXNSZWR1Y3Rpb25SaWdodCA9IG51bWJlck9yWmVybyhyYWRpdXNSZWR1Y3Rpb25SaWdodCk7XG5cdFx0cmFkaXVzUmVkdWN0aW9uVG9wID0gbnVtYmVyT3JaZXJvKHJhZGl1c1JlZHVjdGlvblRvcCk7XG5cdFx0cmFkaXVzUmVkdWN0aW9uQm90dG9tID0gbnVtYmVyT3JaZXJvKHJhZGl1c1JlZHVjdGlvbkJvdHRvbSk7XG5cblx0XHRtZS5kcmF3aW5nQXJlYSA9IE1hdGgubWluKFxuXHRcdFx0TWF0aC5mbG9vcihsYXJnZXN0UG9zc2libGVSYWRpdXMgLSAocmFkaXVzUmVkdWN0aW9uTGVmdCArIHJhZGl1c1JlZHVjdGlvblJpZ2h0KSAvIDIpLFxuXHRcdFx0TWF0aC5mbG9vcihsYXJnZXN0UG9zc2libGVSYWRpdXMgLSAocmFkaXVzUmVkdWN0aW9uVG9wICsgcmFkaXVzUmVkdWN0aW9uQm90dG9tKSAvIDIpKTtcblx0XHRtZS5zZXRDZW50ZXJQb2ludChyYWRpdXNSZWR1Y3Rpb25MZWZ0LCByYWRpdXNSZWR1Y3Rpb25SaWdodCwgcmFkaXVzUmVkdWN0aW9uVG9wLCByYWRpdXNSZWR1Y3Rpb25Cb3R0b20pO1xuXHR9LFxuXG5cdHNldENlbnRlclBvaW50OiBmdW5jdGlvbihsZWZ0TW92ZW1lbnQsIHJpZ2h0TW92ZW1lbnQsIHRvcE1vdmVtZW50LCBib3R0b21Nb3ZlbWVudCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG1heFJpZ2h0ID0gbWUud2lkdGggLSByaWdodE1vdmVtZW50IC0gbWUuZHJhd2luZ0FyZWE7XG5cdFx0dmFyIG1heExlZnQgPSBsZWZ0TW92ZW1lbnQgKyBtZS5kcmF3aW5nQXJlYTtcblx0XHR2YXIgbWF4VG9wID0gdG9wTW92ZW1lbnQgKyBtZS5kcmF3aW5nQXJlYTtcblx0XHR2YXIgbWF4Qm90dG9tID0gKG1lLmhlaWdodCAtIG1lLnBhZGRpbmdUb3ApIC0gYm90dG9tTW92ZW1lbnQgLSBtZS5kcmF3aW5nQXJlYTtcblxuXHRcdG1lLnhDZW50ZXIgPSBNYXRoLmZsb29yKCgobWF4TGVmdCArIG1heFJpZ2h0KSAvIDIpICsgbWUubGVmdCk7XG5cdFx0bWUueUNlbnRlciA9IE1hdGguZmxvb3IoKChtYXhUb3AgKyBtYXhCb3R0b20pIC8gMikgKyBtZS50b3AgKyBtZS5wYWRkaW5nVG9wKTtcblx0fSxcblxuXHRnZXRJbmRleEFuZ2xlOiBmdW5jdGlvbihpbmRleCkge1xuXHRcdHZhciBhbmdsZU11bHRpcGxpZXIgPSAoTWF0aC5QSSAqIDIpIC8gZ2V0VmFsdWVDb3VudCh0aGlzKTtcblx0XHR2YXIgc3RhcnRBbmdsZSA9IHRoaXMuY2hhcnQub3B0aW9ucyAmJiB0aGlzLmNoYXJ0Lm9wdGlvbnMuc3RhcnRBbmdsZSA/XG5cdFx0XHR0aGlzLmNoYXJ0Lm9wdGlvbnMuc3RhcnRBbmdsZSA6XG5cdFx0XHQwO1xuXG5cdFx0dmFyIHN0YXJ0QW5nbGVSYWRpYW5zID0gc3RhcnRBbmdsZSAqIE1hdGguUEkgKiAyIC8gMzYwO1xuXG5cdFx0Ly8gU3RhcnQgZnJvbSB0aGUgdG9wIGluc3RlYWQgb2YgcmlnaHQsIHNvIHJlbW92ZSBhIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuXHRcdHJldHVybiBpbmRleCAqIGFuZ2xlTXVsdGlwbGllciArIHN0YXJ0QW5nbGVSYWRpYW5zO1xuXHR9LFxuXG5cdGdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiAwOyAvLyBudWxsIGFsd2F5cyBpbiBjZW50ZXJcblx0XHR9XG5cblx0XHQvLyBUYWtlIGludG8gYWNjb3VudCBoYWxmIGZvbnQgc2l6ZSArIHRoZSB5UGFkZGluZyBvZiB0aGUgdG9wIHZhbHVlXG5cdFx0dmFyIHNjYWxpbmdGYWN0b3IgPSBtZS5kcmF3aW5nQXJlYSAvIChtZS5tYXggLSBtZS5taW4pO1xuXHRcdGlmIChtZS5vcHRpb25zLnRpY2tzLnJldmVyc2UpIHtcblx0XHRcdHJldHVybiAobWUubWF4IC0gdmFsdWUpICogc2NhbGluZ0ZhY3Rvcjtcblx0XHR9XG5cdFx0cmV0dXJuICh2YWx1ZSAtIG1lLm1pbikgKiBzY2FsaW5nRmFjdG9yO1xuXHR9LFxuXG5cdGdldFBvaW50UG9zaXRpb246IGZ1bmN0aW9uKGluZGV4LCBkaXN0YW5jZUZyb21DZW50ZXIpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciB0aGlzQW5nbGUgPSBtZS5nZXRJbmRleEFuZ2xlKGluZGV4KSAtIChNYXRoLlBJIC8gMik7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IE1hdGguY29zKHRoaXNBbmdsZSkgKiBkaXN0YW5jZUZyb21DZW50ZXIgKyBtZS54Q2VudGVyLFxuXHRcdFx0eTogTWF0aC5zaW4odGhpc0FuZ2xlKSAqIGRpc3RhbmNlRnJvbUNlbnRlciArIG1lLnlDZW50ZXJcblx0XHR9O1xuXHR9LFxuXG5cdGdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZTogZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UG9pbnRQb3NpdGlvbihpbmRleCwgdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh2YWx1ZSkpO1xuXHR9LFxuXG5cdGdldEJhc2VQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbWluID0gbWUubWluO1xuXHRcdHZhciBtYXggPSBtZS5tYXg7XG5cblx0XHRyZXR1cm4gbWUuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKDAsXG5cdFx0XHRtZS5iZWdpbkF0WmVybyA/IDAgOlxuXHRcdFx0bWluIDwgMCAmJiBtYXggPCAwID8gbWF4IDpcblx0XHRcdG1pbiA+IDAgJiYgbWF4ID4gMCA/IG1pbiA6XG5cdFx0XHQwKTtcblx0fSxcblxuXHRkcmF3OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHR2YXIgZ3JpZExpbmVPcHRzID0gb3B0cy5ncmlkTGluZXM7XG5cdFx0dmFyIHRpY2tPcHRzID0gb3B0cy50aWNrcztcblxuXHRcdGlmIChvcHRzLmRpc3BsYXkpIHtcblx0XHRcdHZhciBjdHggPSBtZS5jdHg7XG5cdFx0XHR2YXIgc3RhcnRBbmdsZSA9IHRoaXMuZ2V0SW5kZXhBbmdsZSgwKTtcblx0XHRcdHZhciB0aWNrRm9udCA9IGhlbHBlcnMkMS5vcHRpb25zLl9wYXJzZUZvbnQodGlja09wdHMpO1xuXG5cdFx0XHRpZiAob3B0cy5hbmdsZUxpbmVzLmRpc3BsYXkgfHwgb3B0cy5wb2ludExhYmVscy5kaXNwbGF5KSB7XG5cdFx0XHRcdGRyYXdQb2ludExhYmVscyhtZSk7XG5cdFx0XHR9XG5cblx0XHRcdGhlbHBlcnMkMS5lYWNoKG1lLnRpY2tzLCBmdW5jdGlvbihsYWJlbCwgaW5kZXgpIHtcblx0XHRcdFx0Ly8gRG9uJ3QgZHJhdyBhIGNlbnRyZSB2YWx1ZSAoaWYgaXQgaXMgbWluaW11bSlcblx0XHRcdFx0aWYgKGluZGV4ID4gMCB8fCB0aWNrT3B0cy5yZXZlcnNlKSB7XG5cdFx0XHRcdFx0dmFyIHlDZW50ZXJPZmZzZXQgPSBtZS5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZShtZS50aWNrc0FzTnVtYmVyc1tpbmRleF0pO1xuXG5cdFx0XHRcdFx0Ly8gRHJhdyBjaXJjdWxhciBsaW5lcyBhcm91bmQgdGhlIHNjYWxlXG5cdFx0XHRcdFx0aWYgKGdyaWRMaW5lT3B0cy5kaXNwbGF5ICYmIGluZGV4ICE9PSAwKSB7XG5cdFx0XHRcdFx0XHRkcmF3UmFkaXVzTGluZShtZSwgZ3JpZExpbmVPcHRzLCB5Q2VudGVyT2Zmc2V0LCBpbmRleCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHRpY2tPcHRzLmRpc3BsYXkpIHtcblx0XHRcdFx0XHRcdHZhciB0aWNrRm9udENvbG9yID0gdmFsdWVPckRlZmF1bHQkYih0aWNrT3B0cy5mb250Q29sb3IsIGNvcmVfZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRGb250Q29sb3IpO1xuXHRcdFx0XHRcdFx0Y3R4LmZvbnQgPSB0aWNrRm9udC5zdHJpbmc7XG5cblx0XHRcdFx0XHRcdGN0eC5zYXZlKCk7XG5cdFx0XHRcdFx0XHRjdHgudHJhbnNsYXRlKG1lLnhDZW50ZXIsIG1lLnlDZW50ZXIpO1xuXHRcdFx0XHRcdFx0Y3R4LnJvdGF0ZShzdGFydEFuZ2xlKTtcblxuXHRcdFx0XHRcdFx0aWYgKHRpY2tPcHRzLnNob3dMYWJlbEJhY2tkcm9wKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBsYWJlbFdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGxhYmVsKS53aWR0aDtcblx0XHRcdFx0XHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHRpY2tPcHRzLmJhY2tkcm9wQ29sb3I7XG5cdFx0XHRcdFx0XHRcdGN0eC5maWxsUmVjdChcblx0XHRcdFx0XHRcdFx0XHQtbGFiZWxXaWR0aCAvIDIgLSB0aWNrT3B0cy5iYWNrZHJvcFBhZGRpbmdYLFxuXHRcdFx0XHRcdFx0XHRcdC15Q2VudGVyT2Zmc2V0IC0gdGlja0ZvbnQuc2l6ZSAvIDIgLSB0aWNrT3B0cy5iYWNrZHJvcFBhZGRpbmdZLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsV2lkdGggKyB0aWNrT3B0cy5iYWNrZHJvcFBhZGRpbmdYICogMixcblx0XHRcdFx0XHRcdFx0XHR0aWNrRm9udC5zaXplICsgdGlja09wdHMuYmFja2Ryb3BQYWRkaW5nWSAqIDJcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuXHRcdFx0XHRcdFx0Y3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuXHRcdFx0XHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHRpY2tGb250Q29sb3I7XG5cdFx0XHRcdFx0XHRjdHguZmlsbFRleHQobGFiZWwsIDAsIC15Q2VudGVyT2Zmc2V0KTtcblx0XHRcdFx0XHRcdGN0eC5yZXN0b3JlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn0pO1xuXG4vLyBJTlRFUk5BTDogc3RhdGljIGRlZmF1bHQgb3B0aW9ucywgcmVnaXN0ZXJlZCBpbiBzcmMvaW5kZXguanNcbnZhciBfZGVmYXVsdHMkMyA9IGRlZmF1bHRDb25maWckMztcbnNjYWxlX3JhZGlhbExpbmVhci5fZGVmYXVsdHMgPSBfZGVmYXVsdHMkMztcblxudmFyIHZhbHVlT3JEZWZhdWx0JGMgPSBoZWxwZXJzJDEudmFsdWVPckRlZmF1bHQ7XG5cbi8vIEludGVnZXIgY29uc3RhbnRzIGFyZSBmcm9tIHRoZSBFUzYgc3BlYy5cbnZhciBNSU5fSU5URUdFUiA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSIHx8IC05MDA3MTk5MjU0NzQwOTkxO1xudmFyIE1BWF9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHwgOTAwNzE5OTI1NDc0MDk5MTtcblxudmFyIElOVEVSVkFMUyA9IHtcblx0bWlsbGlzZWNvbmQ6IHtcblx0XHRjb21tb246IHRydWUsXG5cdFx0c2l6ZTogMSxcblx0XHRzdGVwczogWzEsIDIsIDUsIDEwLCAyMCwgNTAsIDEwMCwgMjUwLCA1MDBdXG5cdH0sXG5cdHNlY29uZDoge1xuXHRcdGNvbW1vbjogdHJ1ZSxcblx0XHRzaXplOiAxMDAwLFxuXHRcdHN0ZXBzOiBbMSwgMiwgNSwgMTAsIDE1LCAzMF1cblx0fSxcblx0bWludXRlOiB7XG5cdFx0Y29tbW9uOiB0cnVlLFxuXHRcdHNpemU6IDYwMDAwLFxuXHRcdHN0ZXBzOiBbMSwgMiwgNSwgMTAsIDE1LCAzMF1cblx0fSxcblx0aG91cjoge1xuXHRcdGNvbW1vbjogdHJ1ZSxcblx0XHRzaXplOiAzNjAwMDAwLFxuXHRcdHN0ZXBzOiBbMSwgMiwgMywgNiwgMTJdXG5cdH0sXG5cdGRheToge1xuXHRcdGNvbW1vbjogdHJ1ZSxcblx0XHRzaXplOiA4NjQwMDAwMCxcblx0XHRzdGVwczogWzEsIDIsIDVdXG5cdH0sXG5cdHdlZWs6IHtcblx0XHRjb21tb246IGZhbHNlLFxuXHRcdHNpemU6IDYwNDgwMDAwMCxcblx0XHRzdGVwczogWzEsIDIsIDMsIDRdXG5cdH0sXG5cdG1vbnRoOiB7XG5cdFx0Y29tbW9uOiB0cnVlLFxuXHRcdHNpemU6IDIuNjI4ZTksXG5cdFx0c3RlcHM6IFsxLCAyLCAzXVxuXHR9LFxuXHRxdWFydGVyOiB7XG5cdFx0Y29tbW9uOiBmYWxzZSxcblx0XHRzaXplOiA3Ljg4NGU5LFxuXHRcdHN0ZXBzOiBbMSwgMiwgMywgNF1cblx0fSxcblx0eWVhcjoge1xuXHRcdGNvbW1vbjogdHJ1ZSxcblx0XHRzaXplOiAzLjE1NGUxMFxuXHR9XG59O1xuXG52YXIgVU5JVFMgPSBPYmplY3Qua2V5cyhJTlRFUlZBTFMpO1xuXG5mdW5jdGlvbiBzb3J0ZXIoYSwgYikge1xuXHRyZXR1cm4gYSAtIGI7XG59XG5cbmZ1bmN0aW9uIGFycmF5VW5pcXVlKGl0ZW1zKSB7XG5cdHZhciBoYXNoID0ge307XG5cdHZhciBvdXQgPSBbXTtcblx0dmFyIGksIGlsZW4sIGl0ZW07XG5cblx0Zm9yIChpID0gMCwgaWxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdGl0ZW0gPSBpdGVtc1tpXTtcblx0XHRpZiAoIWhhc2hbaXRlbV0pIHtcblx0XHRcdGhhc2hbaXRlbV0gPSB0cnVlO1xuXHRcdFx0b3V0LnB1c2goaXRlbSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIHt0aW1lLCBwb3N9IG9iamVjdHMgdXNlZCB0byBpbnRlcnBvbGF0ZSBhIHNwZWNpZmljIGB0aW1lYCBvciBwb3NpdGlvblxuICogKGBwb3NgKSBvbiB0aGUgc2NhbGUsIGJ5IHNlYXJjaGluZyBlbnRyaWVzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHJlcXVlc3RlZCB2YWx1ZS4gYHBvc2AgaXNcbiAqIGEgZGVjaW1hbCBiZXR3ZWVuIDAgYW5kIDE6IDAgYmVpbmcgdGhlIHN0YXJ0IG9mIHRoZSBzY2FsZSAobGVmdCBvciB0b3ApIGFuZCAxIHRoZSBvdGhlclxuICogZXh0cmVtaXR5IChsZWZ0ICsgd2lkdGggb3IgdG9wICsgaGVpZ2h0KS4gTm90ZSB0aGF0IGl0IHdvdWxkIGJlIG1vcmUgb3B0aW1pemVkIHRvIGRpcmVjdGx5XG4gKiBzdG9yZSBwcmUtY29tcHV0ZWQgcGl4ZWxzLCBidXQgdGhlIHNjYWxlIGRpbWVuc2lvbnMgYXJlIG5vdCBndWFyYW50ZWVkIGF0IHRoZSB0aW1lIHdlIG5lZWRcbiAqIHRvIGNyZWF0ZSB0aGUgbG9va3VwIHRhYmxlLiBUaGUgdGFibGUgQUxXQVlTIGNvbnRhaW5zIGF0IGxlYXN0IHR3byBpdGVtczogbWluIGFuZCBtYXguXG4gKlxuICogQHBhcmFtIHtudW1iZXJbXX0gdGltZXN0YW1wcyAtIHRpbWVzdGFtcHMgc29ydGVkIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzdHJpYnV0aW9uIC0gSWYgJ2xpbmVhcicsIHRpbWVzdGFtcHMgd2lsbCBiZSBzcHJlYWQgbGluZWFybHkgYWxvbmcgdGhlIG1pblxuICogYW5kIG1heCByYW5nZSwgc28gYmFzaWNhbGx5LCB0aGUgdGFibGUgd2lsbCBjb250YWlucyBvbmx5IHR3byBpdGVtczoge21pbiwgMH0gYW5kIHttYXgsIDF9LlxuICogSWYgJ3NlcmllcycsIHRpbWVzdGFtcHMgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBzYW1lIGRpc3RhbmNlIGZyb20gZWFjaCBvdGhlci4gSW4gdGhpc1xuICogY2FzZSwgb25seSB0aW1lc3RhbXBzIHRoYXQgYnJlYWsgdGhlIHRpbWUgbGluZWFyaXR5IGFyZSByZWdpc3RlcmVkLCBtZWFuaW5nIHRoYXQgaW4gdGhlXG4gKiBiZXN0IGNhc2UsIGFsbCB0aW1lc3RhbXBzIGFyZSBsaW5lYXIsIHRoZSB0YWJsZSBjb250YWlucyBvbmx5IG1pbiBhbmQgbWF4LlxuICovXG5mdW5jdGlvbiBidWlsZExvb2t1cFRhYmxlKHRpbWVzdGFtcHMsIG1pbiwgbWF4LCBkaXN0cmlidXRpb24pIHtcblx0aWYgKGRpc3RyaWJ1dGlvbiA9PT0gJ2xpbmVhcicgfHwgIXRpbWVzdGFtcHMubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHt0aW1lOiBtaW4sIHBvczogMH0sXG5cdFx0XHR7dGltZTogbWF4LCBwb3M6IDF9XG5cdFx0XTtcblx0fVxuXG5cdHZhciB0YWJsZSA9IFtdO1xuXHR2YXIgaXRlbXMgPSBbbWluXTtcblx0dmFyIGksIGlsZW4sIHByZXYsIGN1cnIsIG5leHQ7XG5cblx0Zm9yIChpID0gMCwgaWxlbiA9IHRpbWVzdGFtcHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0Y3VyciA9IHRpbWVzdGFtcHNbaV07XG5cdFx0aWYgKGN1cnIgPiBtaW4gJiYgY3VyciA8IG1heCkge1xuXHRcdFx0aXRlbXMucHVzaChjdXJyKTtcblx0XHR9XG5cdH1cblxuXHRpdGVtcy5wdXNoKG1heCk7XG5cblx0Zm9yIChpID0gMCwgaWxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdG5leHQgPSBpdGVtc1tpICsgMV07XG5cdFx0cHJldiA9IGl0ZW1zW2kgLSAxXTtcblx0XHRjdXJyID0gaXRlbXNbaV07XG5cblx0XHQvLyBvbmx5IGFkZCBwb2ludHMgdGhhdCBicmVha3MgdGhlIHNjYWxlIGxpbmVhcml0eVxuXHRcdGlmIChwcmV2ID09PSB1bmRlZmluZWQgfHwgbmV4dCA9PT0gdW5kZWZpbmVkIHx8IE1hdGgucm91bmQoKG5leHQgKyBwcmV2KSAvIDIpICE9PSBjdXJyKSB7XG5cdFx0XHR0YWJsZS5wdXNoKHt0aW1lOiBjdXJyLCBwb3M6IGkgLyAoaWxlbiAtIDEpfSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRhYmxlO1xufVxuXG4vLyBAc2VlIGFkYXB0ZWQgZnJvbSBodHRwczovL3d3dy5hbnVqZ2FraGFyLmNvbS8yMDE0LzAzLzAxL2JpbmFyeS1zZWFyY2gtaW4tamF2YXNjcmlwdC9cbmZ1bmN0aW9uIGxvb2t1cCh0YWJsZSwga2V5LCB2YWx1ZSkge1xuXHR2YXIgbG8gPSAwO1xuXHR2YXIgaGkgPSB0YWJsZS5sZW5ndGggLSAxO1xuXHR2YXIgbWlkLCBpMCwgaTE7XG5cblx0d2hpbGUgKGxvID49IDAgJiYgbG8gPD0gaGkpIHtcblx0XHRtaWQgPSAobG8gKyBoaSkgPj4gMTtcblx0XHRpMCA9IHRhYmxlW21pZCAtIDFdIHx8IG51bGw7XG5cdFx0aTEgPSB0YWJsZVttaWRdO1xuXG5cdFx0aWYgKCFpMCkge1xuXHRcdFx0Ly8gZ2l2ZW4gdmFsdWUgaXMgb3V0c2lkZSB0YWJsZSAoYmVmb3JlIGZpcnN0IGl0ZW0pXG5cdFx0XHRyZXR1cm4ge2xvOiBudWxsLCBoaTogaTF9O1xuXHRcdH0gZWxzZSBpZiAoaTFba2V5XSA8IHZhbHVlKSB7XG5cdFx0XHRsbyA9IG1pZCArIDE7XG5cdFx0fSBlbHNlIGlmIChpMFtrZXldID4gdmFsdWUpIHtcblx0XHRcdGhpID0gbWlkIC0gMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHtsbzogaTAsIGhpOiBpMX07XG5cdFx0fVxuXHR9XG5cblx0Ly8gZ2l2ZW4gdmFsdWUgaXMgb3V0c2lkZSB0YWJsZSAoYWZ0ZXIgbGFzdCBpdGVtKVxuXHRyZXR1cm4ge2xvOiBpMSwgaGk6IG51bGx9O1xufVxuXG4vKipcbiAqIExpbmVhcmx5IGludGVycG9sYXRlcyB0aGUgZ2l2ZW4gc291cmNlIGB2YWx1ZWAgdXNpbmcgdGhlIHRhYmxlIGl0ZW1zIGBza2V5YCB2YWx1ZXMgYW5kXG4gKiByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGB0a2V5YCB2YWx1ZS4gRm9yIGV4YW1wbGUsIGludGVycG9sYXRlKHRhYmxlLCAndGltZScsIDQyLCAncG9zJylcbiAqIHJldHVybnMgdGhlIHBvc2l0aW9uIGZvciBhIHRpbWVzdGFtcCBlcXVhbCB0byA0Mi4gSWYgdmFsdWUgaXMgb3V0IG9mIGJvdW5kcywgdmFsdWVzIGF0XG4gKiBpbmRleCBbMCwgMV0gb3IgW24gLSAxLCBuXSBhcmUgdXNlZCBmb3IgdGhlIGludGVycG9sYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGludGVycG9sYXRlJDEodGFibGUsIHNrZXksIHN2YWwsIHRrZXkpIHtcblx0dmFyIHJhbmdlID0gbG9va3VwKHRhYmxlLCBza2V5LCBzdmFsKTtcblxuXHQvLyBOb3RlOiB0aGUgbG9va3VwIHRhYmxlIEFMV0FZUyBjb250YWlucyBhdCBsZWFzdCAyIGl0ZW1zIChtaW4gYW5kIG1heClcblx0dmFyIHByZXYgPSAhcmFuZ2UubG8gPyB0YWJsZVswXSA6ICFyYW5nZS5oaSA/IHRhYmxlW3RhYmxlLmxlbmd0aCAtIDJdIDogcmFuZ2UubG87XG5cdHZhciBuZXh0ID0gIXJhbmdlLmxvID8gdGFibGVbMV0gOiAhcmFuZ2UuaGkgPyB0YWJsZVt0YWJsZS5sZW5ndGggLSAxXSA6IHJhbmdlLmhpO1xuXG5cdHZhciBzcGFuID0gbmV4dFtza2V5XSAtIHByZXZbc2tleV07XG5cdHZhciByYXRpbyA9IHNwYW4gPyAoc3ZhbCAtIHByZXZbc2tleV0pIC8gc3BhbiA6IDA7XG5cdHZhciBvZmZzZXQgPSAobmV4dFt0a2V5XSAtIHByZXZbdGtleV0pICogcmF0aW87XG5cblx0cmV0dXJuIHByZXZbdGtleV0gKyBvZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIHRvVGltZXN0YW1wKHNjYWxlLCBpbnB1dCkge1xuXHR2YXIgYWRhcHRlciA9IHNjYWxlLl9hZGFwdGVyO1xuXHR2YXIgb3B0aW9ucyA9IHNjYWxlLm9wdGlvbnMudGltZTtcblx0dmFyIHBhcnNlciA9IG9wdGlvbnMucGFyc2VyO1xuXHR2YXIgZm9ybWF0ID0gcGFyc2VyIHx8IG9wdGlvbnMuZm9ybWF0O1xuXHR2YXIgdmFsdWUgPSBpbnB1dDtcblxuXHRpZiAodHlwZW9mIHBhcnNlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHZhbHVlID0gcGFyc2VyKHZhbHVlKTtcblx0fVxuXG5cdC8vIE9ubHkgcGFyc2UgaWYgaXRzIG5vdCBhIHRpbWVzdGFtcCBhbHJlYWR5XG5cdGlmICghaGVscGVycyQxLmlzRmluaXRlKHZhbHVlKSkge1xuXHRcdHZhbHVlID0gdHlwZW9mIGZvcm1hdCA9PT0gJ3N0cmluZydcblx0XHRcdD8gYWRhcHRlci5wYXJzZSh2YWx1ZSwgZm9ybWF0KVxuXHRcdFx0OiBhZGFwdGVyLnBhcnNlKHZhbHVlKTtcblx0fVxuXG5cdGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdHJldHVybiArdmFsdWU7XG5cdH1cblxuXHQvLyBMYWJlbHMgYXJlIGluIGFuIGluY29tcGF0aWJsZSBmb3JtYXQgYW5kIG5vIGBwYXJzZXJgIGhhcyBiZWVuIHByb3ZpZGVkLlxuXHQvLyBUaGUgdXNlciBtaWdodCBzdGlsbCB1c2UgdGhlIGRlcHJlY2F0ZWQgYGZvcm1hdGAgb3B0aW9uIGZvciBwYXJzaW5nLlxuXHRpZiAoIXBhcnNlciAmJiB0eXBlb2YgZm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFsdWUgPSBmb3JtYXQoaW5wdXQpO1xuXG5cdFx0Ly8gYGZvcm1hdGAgY291bGQgcmV0dXJuIHNvbWV0aGluZyBlbHNlIHRoYW4gYSB0aW1lc3RhbXAsIGlmIHNvLCBwYXJzZSBpdFxuXHRcdGlmICghaGVscGVycyQxLmlzRmluaXRlKHZhbHVlKSkge1xuXHRcdFx0dmFsdWUgPSBhZGFwdGVyLnBhcnNlKHZhbHVlKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHNjYWxlLCBpbnB1dCkge1xuXHRpZiAoaGVscGVycyQxLmlzTnVsbE9yVW5kZWYoaW5wdXQpKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHR2YXIgb3B0aW9ucyA9IHNjYWxlLm9wdGlvbnMudGltZTtcblx0dmFyIHZhbHVlID0gdG9UaW1lc3RhbXAoc2NhbGUsIHNjYWxlLmdldFJpZ2h0VmFsdWUoaW5wdXQpKTtcblx0aWYgKHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMucm91bmQpIHtcblx0XHR2YWx1ZSA9ICtzY2FsZS5fYWRhcHRlci5zdGFydE9mKHZhbHVlLCBvcHRpb25zLnJvdW5kKTtcblx0fVxuXG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5pdCB0byBza2lwIHRvIGJlIGFibGUgdG8gZGlzcGxheSB1cCB0byBgY2FwYWNpdHlgIG51bWJlciBvZiB0aWNrc1xuICogaW4gYHVuaXRgIGZvciB0aGUgZ2l2ZW4gYG1pbmAgLyBgbWF4YCByYW5nZSBhbmQgcmVzcGVjdGluZyB0aGUgaW50ZXJ2YWwgc3RlcHMgY29uc3RyYWludHMuXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluZVN0ZXBTaXplKG1pbiwgbWF4LCB1bml0LCBjYXBhY2l0eSkge1xuXHR2YXIgcmFuZ2UgPSBtYXggLSBtaW47XG5cdHZhciBpbnRlcnZhbCA9IElOVEVSVkFMU1t1bml0XTtcblx0dmFyIG1pbGxpc2Vjb25kcyA9IGludGVydmFsLnNpemU7XG5cdHZhciBzdGVwcyA9IGludGVydmFsLnN0ZXBzO1xuXHR2YXIgaSwgaWxlbiwgZmFjdG9yO1xuXG5cdGlmICghc3RlcHMpIHtcblx0XHRyZXR1cm4gTWF0aC5jZWlsKHJhbmdlIC8gKGNhcGFjaXR5ICogbWlsbGlzZWNvbmRzKSk7XG5cdH1cblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gc3RlcHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0ZmFjdG9yID0gc3RlcHNbaV07XG5cdFx0aWYgKE1hdGguY2VpbChyYW5nZSAvIChtaWxsaXNlY29uZHMgKiBmYWN0b3IpKSA8PSBjYXBhY2l0eSkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZhY3Rvcjtcbn1cblxuLyoqXG4gKiBGaWd1cmVzIG91dCB3aGF0IHVuaXQgcmVzdWx0cyBpbiBhbiBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYXV0by1nZW5lcmF0ZWQgdGlja3NcbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lVW5pdEZvckF1dG9UaWNrcyhtaW5Vbml0LCBtaW4sIG1heCwgY2FwYWNpdHkpIHtcblx0dmFyIGlsZW4gPSBVTklUUy5sZW5ndGg7XG5cdHZhciBpLCBpbnRlcnZhbCwgZmFjdG9yO1xuXG5cdGZvciAoaSA9IFVOSVRTLmluZGV4T2YobWluVW5pdCk7IGkgPCBpbGVuIC0gMTsgKytpKSB7XG5cdFx0aW50ZXJ2YWwgPSBJTlRFUlZBTFNbVU5JVFNbaV1dO1xuXHRcdGZhY3RvciA9IGludGVydmFsLnN0ZXBzID8gaW50ZXJ2YWwuc3RlcHNbaW50ZXJ2YWwuc3RlcHMubGVuZ3RoIC0gMV0gOiBNQVhfSU5URUdFUjtcblxuXHRcdGlmIChpbnRlcnZhbC5jb21tb24gJiYgTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gKGZhY3RvciAqIGludGVydmFsLnNpemUpKSA8PSBjYXBhY2l0eSkge1xuXHRcdFx0cmV0dXJuIFVOSVRTW2ldO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBVTklUU1tpbGVuIC0gMV07XG59XG5cbi8qKlxuICogRmlndXJlcyBvdXQgd2hhdCB1bml0IHRvIGZvcm1hdCBhIHNldCBvZiB0aWNrcyB3aXRoXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluZVVuaXRGb3JGb3JtYXR0aW5nKHNjYWxlLCB0aWNrcywgbWluVW5pdCwgbWluLCBtYXgpIHtcblx0dmFyIGlsZW4gPSBVTklUUy5sZW5ndGg7XG5cdHZhciBpLCB1bml0O1xuXG5cdGZvciAoaSA9IGlsZW4gLSAxOyBpID49IFVOSVRTLmluZGV4T2YobWluVW5pdCk7IGktLSkge1xuXHRcdHVuaXQgPSBVTklUU1tpXTtcblx0XHRpZiAoSU5URVJWQUxTW3VuaXRdLmNvbW1vbiAmJiBzY2FsZS5fYWRhcHRlci5kaWZmKG1heCwgbWluLCB1bml0KSA+PSB0aWNrcy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiB1bml0O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBVTklUU1ttaW5Vbml0ID8gVU5JVFMuaW5kZXhPZihtaW5Vbml0KSA6IDBdO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVNYWpvclVuaXQodW5pdCkge1xuXHRmb3IgKHZhciBpID0gVU5JVFMuaW5kZXhPZih1bml0KSArIDEsIGlsZW4gPSBVTklUUy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRpZiAoSU5URVJWQUxTW1VOSVRTW2ldXS5jb21tb24pIHtcblx0XHRcdHJldHVybiBVTklUU1tpXTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXhpbXVtIG9mIGBjYXBhY2l0eWAgdGltZXN0YW1wcyBiZXR3ZWVuIG1pbiBhbmQgbWF4LCByb3VuZGVkIHRvIHRoZVxuICogYG1pbm9yYCB1bml0LCBhbGlnbmVkIG9uIHRoZSBgbWFqb3JgIHVuaXQgYW5kIHVzaW5nIHRoZSBnaXZlbiBzY2FsZSB0aW1lIGBvcHRpb25zYC5cbiAqIEltcG9ydGFudDogdGhpcyBtZXRob2QgY2FuIHJldHVybiB0aWNrcyBvdXRzaWRlIHRoZSBtaW4gYW5kIG1heCByYW5nZSwgaXQncyB0aGVcbiAqIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsaW5nIGNvZGUgdG8gY2xhbXAgdmFsdWVzIGlmIG5lZWRlZC5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGUoc2NhbGUsIG1pbiwgbWF4LCBjYXBhY2l0eSkge1xuXHR2YXIgYWRhcHRlciA9IHNjYWxlLl9hZGFwdGVyO1xuXHR2YXIgb3B0aW9ucyA9IHNjYWxlLm9wdGlvbnM7XG5cdHZhciB0aW1lT3B0cyA9IG9wdGlvbnMudGltZTtcblx0dmFyIG1pbm9yID0gdGltZU9wdHMudW5pdCB8fCBkZXRlcm1pbmVVbml0Rm9yQXV0b1RpY2tzKHRpbWVPcHRzLm1pblVuaXQsIG1pbiwgbWF4LCBjYXBhY2l0eSk7XG5cdHZhciBtYWpvciA9IGRldGVybWluZU1ham9yVW5pdChtaW5vcik7XG5cdHZhciBzdGVwU2l6ZSA9IHZhbHVlT3JEZWZhdWx0JGModGltZU9wdHMuc3RlcFNpemUsIHRpbWVPcHRzLnVuaXRTdGVwU2l6ZSk7XG5cdHZhciB3ZWVrZGF5ID0gbWlub3IgPT09ICd3ZWVrJyA/IHRpbWVPcHRzLmlzb1dlZWtkYXkgOiBmYWxzZTtcblx0dmFyIG1ham9yVGlja3NFbmFibGVkID0gb3B0aW9ucy50aWNrcy5tYWpvci5lbmFibGVkO1xuXHR2YXIgaW50ZXJ2YWwgPSBJTlRFUlZBTFNbbWlub3JdO1xuXHR2YXIgZmlyc3QgPSBtaW47XG5cdHZhciBsYXN0ID0gbWF4O1xuXHR2YXIgdGlja3MgPSBbXTtcblx0dmFyIHRpbWU7XG5cblx0aWYgKCFzdGVwU2l6ZSkge1xuXHRcdHN0ZXBTaXplID0gZGV0ZXJtaW5lU3RlcFNpemUobWluLCBtYXgsIG1pbm9yLCBjYXBhY2l0eSk7XG5cdH1cblxuXHQvLyBGb3IgJ3dlZWsnIHVuaXQsIGhhbmRsZSB0aGUgZmlyc3QgZGF5IG9mIHdlZWsgb3B0aW9uXG5cdGlmICh3ZWVrZGF5KSB7XG5cdFx0Zmlyc3QgPSArYWRhcHRlci5zdGFydE9mKGZpcnN0LCAnaXNvV2VlaycsIHdlZWtkYXkpO1xuXHRcdGxhc3QgPSArYWRhcHRlci5zdGFydE9mKGxhc3QsICdpc29XZWVrJywgd2Vla2RheSk7XG5cdH1cblxuXHQvLyBBbGlnbiBmaXJzdC9sYXN0IHRpY2tzIG9uIHVuaXRcblx0Zmlyc3QgPSArYWRhcHRlci5zdGFydE9mKGZpcnN0LCB3ZWVrZGF5ID8gJ2RheScgOiBtaW5vcik7XG5cdGxhc3QgPSArYWRhcHRlci5zdGFydE9mKGxhc3QsIHdlZWtkYXkgPyAnZGF5JyA6IG1pbm9yKTtcblxuXHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbGFzdCB0aWNrIGluY2x1ZGUgbWF4XG5cdGlmIChsYXN0IDwgbWF4KSB7XG5cdFx0bGFzdCA9ICthZGFwdGVyLmFkZChsYXN0LCAxLCBtaW5vcik7XG5cdH1cblxuXHR0aW1lID0gZmlyc3Q7XG5cblx0aWYgKG1ham9yVGlja3NFbmFibGVkICYmIG1ham9yICYmICF3ZWVrZGF5ICYmICF0aW1lT3B0cy5yb3VuZCkge1xuXHRcdC8vIEFsaWduIHRoZSBmaXJzdCB0aWNrIG9uIHRoZSBwcmV2aW91cyBgbWlub3JgIHVuaXQgYWxpZ25lZCBvbiB0aGUgYG1ham9yYCB1bml0OlxuXHRcdC8vIHdlIGZpcnN0IGFsaWduZWQgdGltZSBvbiB0aGUgcHJldmlvdXMgYG1ham9yYCB1bml0IHRoZW4gYWRkIHRoZSBudW1iZXIgb2YgZnVsbFxuXHRcdC8vIHN0ZXBTaXplIHRoZXJlIGlzIGJldHdlZW4gZmlyc3QgYW5kIHRoZSBwcmV2aW91cyBtYWpvciB0aW1lLlxuXHRcdHRpbWUgPSArYWRhcHRlci5zdGFydE9mKHRpbWUsIG1ham9yKTtcblx0XHR0aW1lID0gK2FkYXB0ZXIuYWRkKHRpbWUsIH5+KChmaXJzdCAtIHRpbWUpIC8gKGludGVydmFsLnNpemUgKiBzdGVwU2l6ZSkpICogc3RlcFNpemUsIG1pbm9yKTtcblx0fVxuXG5cdGZvciAoOyB0aW1lIDwgbGFzdDsgdGltZSA9ICthZGFwdGVyLmFkZCh0aW1lLCBzdGVwU2l6ZSwgbWlub3IpKSB7XG5cdFx0dGlja3MucHVzaCgrdGltZSk7XG5cdH1cblxuXHR0aWNrcy5wdXNoKCt0aW1lKTtcblxuXHRyZXR1cm4gdGlja3M7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RhcnQgYW5kIGVuZCBvZmZzZXRzIGZyb20gZWRnZXMgaW4gdGhlIGZvcm0gb2Yge3N0YXJ0LCBlbmR9XG4gKiB3aGVyZSBlYWNoIHZhbHVlIGlzIGEgcmVsYXRpdmUgd2lkdGggdG8gdGhlIHNjYWxlIGFuZCByYW5nZXMgYmV0d2VlbiAwIGFuZCAxLlxuICogVGhleSBhZGQgZXh0cmEgbWFyZ2lucyBvbiB0aGUgYm90aCBzaWRlcyBieSBzY2FsaW5nIGRvd24gdGhlIG9yaWdpbmFsIHNjYWxlLlxuICogT2Zmc2V0cyBhcmUgYWRkZWQgd2hlbiB0aGUgYG9mZnNldGAgb3B0aW9uIGlzIHRydWUuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVPZmZzZXRzKHRhYmxlLCB0aWNrcywgbWluLCBtYXgsIG9wdGlvbnMpIHtcblx0dmFyIHN0YXJ0ID0gMDtcblx0dmFyIGVuZCA9IDA7XG5cdHZhciBmaXJzdCwgbGFzdDtcblxuXHRpZiAob3B0aW9ucy5vZmZzZXQgJiYgdGlja3MubGVuZ3RoKSB7XG5cdFx0aWYgKCFvcHRpb25zLnRpbWUubWluKSB7XG5cdFx0XHRmaXJzdCA9IGludGVycG9sYXRlJDEodGFibGUsICd0aW1lJywgdGlja3NbMF0sICdwb3MnKTtcblx0XHRcdGlmICh0aWNrcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0c3RhcnQgPSAxIC0gZmlyc3Q7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdGFydCA9IChpbnRlcnBvbGF0ZSQxKHRhYmxlLCAndGltZScsIHRpY2tzWzFdLCAncG9zJykgLSBmaXJzdCkgLyAyO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIW9wdGlvbnMudGltZS5tYXgpIHtcblx0XHRcdGxhc3QgPSBpbnRlcnBvbGF0ZSQxKHRhYmxlLCAndGltZScsIHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdLCAncG9zJyk7XG5cdFx0XHRpZiAodGlja3MubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdGVuZCA9IGxhc3Q7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbmQgPSAobGFzdCAtIGludGVycG9sYXRlJDEodGFibGUsICd0aW1lJywgdGlja3NbdGlja3MubGVuZ3RoIC0gMl0sICdwb3MnKSkgLyAyO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7c3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZH07XG59XG5cbmZ1bmN0aW9uIHRpY2tzRnJvbVRpbWVzdGFtcHMoc2NhbGUsIHZhbHVlcywgbWFqb3JVbml0KSB7XG5cdHZhciB0aWNrcyA9IFtdO1xuXHR2YXIgaSwgaWxlbiwgdmFsdWUsIG1ham9yO1xuXG5cdGZvciAoaSA9IDAsIGlsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0dmFsdWUgPSB2YWx1ZXNbaV07XG5cdFx0bWFqb3IgPSBtYWpvclVuaXQgPyB2YWx1ZSA9PT0gK3NjYWxlLl9hZGFwdGVyLnN0YXJ0T2YodmFsdWUsIG1ham9yVW5pdCkgOiBmYWxzZTtcblxuXHRcdHRpY2tzLnB1c2goe1xuXHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0bWFqb3I6IG1ham9yXG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gdGlja3M7XG59XG5cbnZhciBkZWZhdWx0Q29uZmlnJDQgPSB7XG5cdHBvc2l0aW9uOiAnYm90dG9tJyxcblxuXHQvKipcblx0ICogRGF0YSBkaXN0cmlidXRpb24gYWxvbmcgdGhlIHNjYWxlOlxuXHQgKiAtICdsaW5lYXInOiBkYXRhIGFyZSBzcHJlYWQgYWNjb3JkaW5nIHRvIHRoZWlyIHRpbWUgKGRpc3RhbmNlcyBjYW4gdmFyeSksXG5cdCAqIC0gJ3Nlcmllcyc6IGRhdGEgYXJlIHNwcmVhZCBhdCB0aGUgc2FtZSBkaXN0YW5jZSBmcm9tIGVhY2ggb3RoZXIuXG5cdCAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvcHVsbC80NTA3XG5cdCAqIEBzaW5jZSAyLjcuMFxuXHQgKi9cblx0ZGlzdHJpYnV0aW9uOiAnbGluZWFyJyxcblxuXHQvKipcblx0ICogU2NhbGUgYm91bmRhcnkgc3RyYXRlZ3kgKGJ5cGFzc2VkIGJ5IG1pbi9tYXggdGltZSBvcHRpb25zKVxuXHQgKiAtIGBkYXRhYDogbWFrZSBzdXJlIGRhdGEgYXJlIGZ1bGx5IHZpc2libGUsIHRpY2tzIG91dHNpZGUgYXJlIHJlbW92ZWRcblx0ICogLSBgdGlja3NgOiBtYWtlIHN1cmUgdGlja3MgYXJlIGZ1bGx5IHZpc2libGUsIGRhdGEgb3V0c2lkZSBhcmUgdHJ1bmNhdGVkXG5cdCAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvcHVsbC80NTU2XG5cdCAqIEBzaW5jZSAyLjcuMFxuXHQgKi9cblx0Ym91bmRzOiAnZGF0YScsXG5cblx0YWRhcHRlcnM6IHt9LFxuXHR0aW1lOiB7XG5cdFx0cGFyc2VyOiBmYWxzZSwgLy8gZmFsc2UgPT0gYSBwYXR0ZXJuIHN0cmluZyBmcm9tIGh0dHBzOi8vbW9tZW50anMuY29tL2RvY3MvIy9wYXJzaW5nL3N0cmluZy1mb3JtYXQvIG9yIGEgY3VzdG9tIGNhbGxiYWNrIHRoYXQgY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgbW9tZW50XG5cdFx0Zm9ybWF0OiBmYWxzZSwgLy8gREVQUkVDQVRFRCBmYWxzZSA9PSBkYXRlIG9iamVjdHMsIG1vbWVudCBvYmplY3QsIGNhbGxiYWNrIG9yIGEgcGF0dGVybiBzdHJpbmcgZnJvbSBodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyMvcGFyc2luZy9zdHJpbmctZm9ybWF0L1xuXHRcdHVuaXQ6IGZhbHNlLCAvLyBmYWxzZSA9PSBhdXRvbWF0aWMgb3Igb3ZlcnJpZGUgd2l0aCB3ZWVrLCBtb250aCwgeWVhciwgZXRjLlxuXHRcdHJvdW5kOiBmYWxzZSwgLy8gbm9uZSwgb3Igb3ZlcnJpZGUgd2l0aCB3ZWVrLCBtb250aCwgeWVhciwgZXRjLlxuXHRcdGRpc3BsYXlGb3JtYXQ6IGZhbHNlLCAvLyBERVBSRUNBVEVEXG5cdFx0aXNvV2Vla2RheTogZmFsc2UsIC8vIG92ZXJyaWRlIHdlZWsgc3RhcnQgZGF5IC0gc2VlIGh0dHBzOi8vbW9tZW50anMuY29tL2RvY3MvIy9nZXQtc2V0L2lzby13ZWVrZGF5L1xuXHRcdG1pblVuaXQ6ICdtaWxsaXNlY29uZCcsXG5cdFx0ZGlzcGxheUZvcm1hdHM6IHt9XG5cdH0sXG5cdHRpY2tzOiB7XG5cdFx0YXV0b1NraXA6IGZhbHNlLFxuXG5cdFx0LyoqXG5cdFx0ICogVGlja3MgZ2VuZXJhdGlvbiBpbnB1dCB2YWx1ZXM6XG5cdFx0ICogLSAnYXV0byc6IGdlbmVyYXRlcyBcIm9wdGltYWxcIiB0aWNrcyBiYXNlZCBvbiBzY2FsZSBzaXplIGFuZCB0aW1lIG9wdGlvbnMuXG5cdFx0ICogLSAnZGF0YSc6IGdlbmVyYXRlcyB0aWNrcyBmcm9tIGRhdGEgKGluY2x1ZGluZyBsYWJlbHMgZnJvbSBkYXRhIHt0fHh8eX0gb2JqZWN0cykuXG5cdFx0ICogLSAnbGFiZWxzJzogZ2VuZXJhdGVzIHRpY2tzIGZyb20gdXNlciBnaXZlbiBgZGF0YS5sYWJlbHNgIHZhbHVlcyBPTkxZLlxuXHRcdCAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvcHVsbC80NTA3XG5cdFx0ICogQHNpbmNlIDIuNy4wXG5cdFx0ICovXG5cdFx0c291cmNlOiAnYXV0bycsXG5cblx0XHRtYWpvcjoge1xuXHRcdFx0ZW5hYmxlZDogZmFsc2Vcblx0XHR9XG5cdH1cbn07XG5cbnZhciBzY2FsZV90aW1lID0gY29yZV9zY2FsZS5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1lcmdlVGlja3NPcHRpb25zKCk7XG5cdFx0Y29yZV9zY2FsZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpO1xuXHR9LFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnM7XG5cdFx0dmFyIHRpbWUgPSBvcHRpb25zLnRpbWUgfHwgKG9wdGlvbnMudGltZSA9IHt9KTtcblx0XHR2YXIgYWRhcHRlciA9IG1lLl9hZGFwdGVyID0gbmV3IGNvcmVfYWRhcHRlcnMuX2RhdGUob3B0aW9ucy5hZGFwdGVycy5kYXRlKTtcblxuXHRcdC8vIERFUFJFQ0FUSU9OUzogb3V0cHV0IGEgbWVzc2FnZSBvbmx5IG9uZSB0aW1lIHBlciB1cGRhdGVcblx0XHRpZiAodGltZS5mb3JtYXQpIHtcblx0XHRcdGNvbnNvbGUud2Fybignb3B0aW9ucy50aW1lLmZvcm1hdCBpcyBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBvcHRpb25zLnRpbWUucGFyc2VyLicpO1xuXHRcdH1cblxuXHRcdC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGJlZm9yZSBpbnRyb2R1Y2luZyBhZGFwdGVyLCBgZGlzcGxheUZvcm1hdHNgIHdhc1xuXHRcdC8vIHN1cHBvc2VkIHRvIGNvbnRhaW4gKmFsbCogdW5pdC9zdHJpbmcgcGFpcnMgYnV0IHRoaXMgY2FuJ3QgYmUgcmVzb2x2ZWRcblx0XHQvLyB3aGVuIGxvYWRpbmcgdGhlIHNjYWxlIChhZGFwdGVycyBhcmUgbG9hZGVkIGFmdGVyd2FyZCksIHNvIGxldCdzIHBvcHVsYXRlXG5cdFx0Ly8gbWlzc2luZyBmb3JtYXRzIG9uIHVwZGF0ZVxuXHRcdGhlbHBlcnMkMS5tZXJnZUlmKHRpbWUuZGlzcGxheUZvcm1hdHMsIGFkYXB0ZXIuZm9ybWF0cygpKTtcblxuXHRcdHJldHVybiBjb3JlX3NjYWxlLnByb3RvdHlwZS51cGRhdGUuYXBwbHkobWUsIGFyZ3VtZW50cyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFsbG93cyBkYXRhIHRvIGJlIHJlZmVyZW5jZWQgdmlhICd0JyBhdHRyaWJ1dGVcblx0ICovXG5cdGdldFJpZ2h0VmFsdWU6IGZ1bmN0aW9uKHJhd1ZhbHVlKSB7XG5cdFx0aWYgKHJhd1ZhbHVlICYmIHJhd1ZhbHVlLnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmF3VmFsdWUgPSByYXdWYWx1ZS50O1xuXHRcdH1cblx0XHRyZXR1cm4gY29yZV9zY2FsZS5wcm90b3R5cGUuZ2V0UmlnaHRWYWx1ZS5jYWxsKHRoaXMsIHJhd1ZhbHVlKTtcblx0fSxcblxuXHRkZXRlcm1pbmVEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdHZhciBhZGFwdGVyID0gbWUuX2FkYXB0ZXI7XG5cdFx0dmFyIHRpbWVPcHRzID0gbWUub3B0aW9ucy50aW1lO1xuXHRcdHZhciB1bml0ID0gdGltZU9wdHMudW5pdCB8fCAnZGF5Jztcblx0XHR2YXIgbWluID0gTUFYX0lOVEVHRVI7XG5cdFx0dmFyIG1heCA9IE1JTl9JTlRFR0VSO1xuXHRcdHZhciB0aW1lc3RhbXBzID0gW107XG5cdFx0dmFyIGRhdGFzZXRzID0gW107XG5cdFx0dmFyIGxhYmVscyA9IFtdO1xuXHRcdHZhciBpLCBqLCBpbGVuLCBqbGVuLCBkYXRhLCB0aW1lc3RhbXA7XG5cdFx0dmFyIGRhdGFMYWJlbHMgPSBjaGFydC5kYXRhLmxhYmVscyB8fCBbXTtcblxuXHRcdC8vIENvbnZlcnQgbGFiZWxzIHRvIHRpbWVzdGFtcHNcblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gZGF0YUxhYmVscy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdGxhYmVscy5wdXNoKHBhcnNlKG1lLCBkYXRhTGFiZWxzW2ldKSk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBkYXRhIHRvIHRpbWVzdGFtcHNcblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gKGNoYXJ0LmRhdGEuZGF0YXNldHMgfHwgW10pLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkpIHtcblx0XHRcdFx0ZGF0YSA9IGNoYXJ0LmRhdGEuZGF0YXNldHNbaV0uZGF0YTtcblxuXHRcdFx0XHQvLyBMZXQncyBjb25zaWRlciB0aGF0IGFsbCBkYXRhIGhhdmUgdGhlIHNhbWUgZm9ybWF0LlxuXHRcdFx0XHRpZiAoaGVscGVycyQxLmlzT2JqZWN0KGRhdGFbMF0pKSB7XG5cdFx0XHRcdFx0ZGF0YXNldHNbaV0gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoaiA9IDAsIGpsZW4gPSBkYXRhLmxlbmd0aDsgaiA8IGpsZW47ICsraikge1xuXHRcdFx0XHRcdFx0dGltZXN0YW1wID0gcGFyc2UobWUsIGRhdGFbal0pO1xuXHRcdFx0XHRcdFx0dGltZXN0YW1wcy5wdXNoKHRpbWVzdGFtcCk7XG5cdFx0XHRcdFx0XHRkYXRhc2V0c1tpXVtqXSA9IHRpbWVzdGFtcDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9yIChqID0gMCwgamxlbiA9IGxhYmVscy5sZW5ndGg7IGogPCBqbGVuOyArK2opIHtcblx0XHRcdFx0XHRcdHRpbWVzdGFtcHMucHVzaChsYWJlbHNbal0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhc2V0c1tpXSA9IGxhYmVscy5zbGljZSgwKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YXNldHNbaV0gPSBbXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobGFiZWxzLmxlbmd0aCkge1xuXHRcdFx0Ly8gU29ydCBsYWJlbHMgKiphZnRlcioqIGRhdGEgaGF2ZSBiZWVuIGNvbnZlcnRlZFxuXHRcdFx0bGFiZWxzID0gYXJyYXlVbmlxdWUobGFiZWxzKS5zb3J0KHNvcnRlcik7XG5cdFx0XHRtaW4gPSBNYXRoLm1pbihtaW4sIGxhYmVsc1swXSk7XG5cdFx0XHRtYXggPSBNYXRoLm1heChtYXgsIGxhYmVsc1tsYWJlbHMubGVuZ3RoIC0gMV0pO1xuXHRcdH1cblxuXHRcdGlmICh0aW1lc3RhbXBzLmxlbmd0aCkge1xuXHRcdFx0dGltZXN0YW1wcyA9IGFycmF5VW5pcXVlKHRpbWVzdGFtcHMpLnNvcnQoc29ydGVyKTtcblx0XHRcdG1pbiA9IE1hdGgubWluKG1pbiwgdGltZXN0YW1wc1swXSk7XG5cdFx0XHRtYXggPSBNYXRoLm1heChtYXgsIHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAxXSk7XG5cdFx0fVxuXG5cdFx0bWluID0gcGFyc2UobWUsIHRpbWVPcHRzLm1pbikgfHwgbWluO1xuXHRcdG1heCA9IHBhcnNlKG1lLCB0aW1lT3B0cy5tYXgpIHx8IG1heDtcblxuXHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgbm8gdmFsaWQgbWluL21heCwgc2V0IGxpbWl0cyBiYXNlZCBvbiB1bml0IHRpbWUgb3B0aW9uXG5cdFx0bWluID0gbWluID09PSBNQVhfSU5URUdFUiA/ICthZGFwdGVyLnN0YXJ0T2YoRGF0ZS5ub3coKSwgdW5pdCkgOiBtaW47XG5cdFx0bWF4ID0gbWF4ID09PSBNSU5fSU5URUdFUiA/ICthZGFwdGVyLmVuZE9mKERhdGUubm93KCksIHVuaXQpICsgMSA6IG1heDtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IG1heCBpcyBzdHJpY3RseSBoaWdoZXIgdGhhbiBtaW4gKHJlcXVpcmVkIGJ5IHRoZSBsb29rdXAgdGFibGUpXG5cdFx0bWUubWluID0gTWF0aC5taW4obWluLCBtYXgpO1xuXHRcdG1lLm1heCA9IE1hdGgubWF4KG1pbiArIDEsIG1heCk7XG5cblx0XHQvLyBQUklWQVRFXG5cdFx0bWUuX2hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblx0XHRtZS5fdGFibGUgPSBbXTtcblx0XHRtZS5fdGltZXN0YW1wcyA9IHtcblx0XHRcdGRhdGE6IHRpbWVzdGFtcHMsXG5cdFx0XHRkYXRhc2V0czogZGF0YXNldHMsXG5cdFx0XHRsYWJlbHM6IGxhYmVsc1xuXHRcdH07XG5cdH0sXG5cblx0YnVpbGRUaWNrczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbWluID0gbWUubWluO1xuXHRcdHZhciBtYXggPSBtZS5tYXg7XG5cdFx0dmFyIG9wdGlvbnMgPSBtZS5vcHRpb25zO1xuXHRcdHZhciB0aW1lT3B0cyA9IG9wdGlvbnMudGltZTtcblx0XHR2YXIgdGltZXN0YW1wcyA9IFtdO1xuXHRcdHZhciB0aWNrcyA9IFtdO1xuXHRcdHZhciBpLCBpbGVuLCB0aW1lc3RhbXA7XG5cblx0XHRzd2l0Y2ggKG9wdGlvbnMudGlja3Muc291cmNlKSB7XG5cdFx0Y2FzZSAnZGF0YSc6XG5cdFx0XHR0aW1lc3RhbXBzID0gbWUuX3RpbWVzdGFtcHMuZGF0YTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2xhYmVscyc6XG5cdFx0XHR0aW1lc3RhbXBzID0gbWUuX3RpbWVzdGFtcHMubGFiZWxzO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnYXV0byc6XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRpbWVzdGFtcHMgPSBnZW5lcmF0ZShtZSwgbWluLCBtYXgsIG1lLmdldExhYmVsQ2FwYWNpdHkobWluKSwgb3B0aW9ucyk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMuYm91bmRzID09PSAndGlja3MnICYmIHRpbWVzdGFtcHMubGVuZ3RoKSB7XG5cdFx0XHRtaW4gPSB0aW1lc3RhbXBzWzBdO1xuXHRcdFx0bWF4ID0gdGltZXN0YW1wc1t0aW1lc3RhbXBzLmxlbmd0aCAtIDFdO1xuXHRcdH1cblxuXHRcdC8vIEVuZm9yY2UgbGltaXRzIHdpdGggdXNlciBtaW4vbWF4IG9wdGlvbnNcblx0XHRtaW4gPSBwYXJzZShtZSwgdGltZU9wdHMubWluKSB8fCBtaW47XG5cdFx0bWF4ID0gcGFyc2UobWUsIHRpbWVPcHRzLm1heCkgfHwgbWF4O1xuXG5cdFx0Ly8gUmVtb3ZlIHRpY2tzIG91dHNpZGUgdGhlIG1pbi9tYXggcmFuZ2Vcblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gdGltZXN0YW1wcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdHRpbWVzdGFtcCA9IHRpbWVzdGFtcHNbaV07XG5cdFx0XHRpZiAodGltZXN0YW1wID49IG1pbiAmJiB0aW1lc3RhbXAgPD0gbWF4KSB7XG5cdFx0XHRcdHRpY2tzLnB1c2godGltZXN0YW1wKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtZS5taW4gPSBtaW47XG5cdFx0bWUubWF4ID0gbWF4O1xuXG5cdFx0Ly8gUFJJVkFURVxuXHRcdG1lLl91bml0ID0gdGltZU9wdHMudW5pdCB8fCBkZXRlcm1pbmVVbml0Rm9yRm9ybWF0dGluZyhtZSwgdGlja3MsIHRpbWVPcHRzLm1pblVuaXQsIG1lLm1pbiwgbWUubWF4KTtcblx0XHRtZS5fbWFqb3JVbml0ID0gZGV0ZXJtaW5lTWFqb3JVbml0KG1lLl91bml0KTtcblx0XHRtZS5fdGFibGUgPSBidWlsZExvb2t1cFRhYmxlKG1lLl90aW1lc3RhbXBzLmRhdGEsIG1pbiwgbWF4LCBvcHRpb25zLmRpc3RyaWJ1dGlvbik7XG5cdFx0bWUuX29mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyhtZS5fdGFibGUsIHRpY2tzLCBtaW4sIG1heCwgb3B0aW9ucyk7XG5cblx0XHRpZiAob3B0aW9ucy50aWNrcy5yZXZlcnNlKSB7XG5cdFx0XHR0aWNrcy5yZXZlcnNlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRpY2tzRnJvbVRpbWVzdGFtcHMobWUsIHRpY2tzLCBtZS5fbWFqb3JVbml0KTtcblx0fSxcblxuXHRnZXRMYWJlbEZvckluZGV4OiBmdW5jdGlvbihpbmRleCwgZGF0YXNldEluZGV4KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgYWRhcHRlciA9IG1lLl9hZGFwdGVyO1xuXHRcdHZhciBkYXRhID0gbWUuY2hhcnQuZGF0YTtcblx0XHR2YXIgdGltZU9wdHMgPSBtZS5vcHRpb25zLnRpbWU7XG5cdFx0dmFyIGxhYmVsID0gZGF0YS5sYWJlbHMgJiYgaW5kZXggPCBkYXRhLmxhYmVscy5sZW5ndGggPyBkYXRhLmxhYmVsc1tpbmRleF0gOiAnJztcblx0XHR2YXIgdmFsdWUgPSBkYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF07XG5cblx0XHRpZiAoaGVscGVycyQxLmlzT2JqZWN0KHZhbHVlKSkge1xuXHRcdFx0bGFiZWwgPSBtZS5nZXRSaWdodFZhbHVlKHZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKHRpbWVPcHRzLnRvb2x0aXBGb3JtYXQpIHtcblx0XHRcdHJldHVybiBhZGFwdGVyLmZvcm1hdCh0b1RpbWVzdGFtcChtZSwgbGFiZWwpLCB0aW1lT3B0cy50b29sdGlwRm9ybWF0KTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBsYWJlbCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiBsYWJlbDtcblx0XHR9XG5cdFx0cmV0dXJuIGFkYXB0ZXIuZm9ybWF0KHRvVGltZXN0YW1wKG1lLCBsYWJlbCksIHRpbWVPcHRzLmRpc3BsYXlGb3JtYXRzLmRhdGV0aW1lKTtcblx0fSxcblxuXHQvKipcblx0ICogRnVuY3Rpb24gdG8gZm9ybWF0IGFuIGluZGl2aWR1YWwgdGljayBtYXJrXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHR0aWNrRm9ybWF0RnVuY3Rpb246IGZ1bmN0aW9uKHRpbWUsIGluZGV4LCB0aWNrcywgZm9ybWF0KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgYWRhcHRlciA9IG1lLl9hZGFwdGVyO1xuXHRcdHZhciBvcHRpb25zID0gbWUub3B0aW9ucztcblx0XHR2YXIgZm9ybWF0cyA9IG9wdGlvbnMudGltZS5kaXNwbGF5Rm9ybWF0cztcblx0XHR2YXIgbWlub3JGb3JtYXQgPSBmb3JtYXRzW21lLl91bml0XTtcblx0XHR2YXIgbWFqb3JVbml0ID0gbWUuX21ham9yVW5pdDtcblx0XHR2YXIgbWFqb3JGb3JtYXQgPSBmb3JtYXRzW21ham9yVW5pdF07XG5cdFx0dmFyIG1ham9yVGltZSA9ICthZGFwdGVyLnN0YXJ0T2YodGltZSwgbWFqb3JVbml0KTtcblx0XHR2YXIgbWFqb3JUaWNrT3B0cyA9IG9wdGlvbnMudGlja3MubWFqb3I7XG5cdFx0dmFyIG1ham9yID0gbWFqb3JUaWNrT3B0cy5lbmFibGVkICYmIG1ham9yVW5pdCAmJiBtYWpvckZvcm1hdCAmJiB0aW1lID09PSBtYWpvclRpbWU7XG5cdFx0dmFyIGxhYmVsID0gYWRhcHRlci5mb3JtYXQodGltZSwgZm9ybWF0ID8gZm9ybWF0IDogbWFqb3IgPyBtYWpvckZvcm1hdCA6IG1pbm9yRm9ybWF0KTtcblx0XHR2YXIgdGlja09wdHMgPSBtYWpvciA/IG1ham9yVGlja09wdHMgOiBvcHRpb25zLnRpY2tzLm1pbm9yO1xuXHRcdHZhciBmb3JtYXR0ZXIgPSB2YWx1ZU9yRGVmYXVsdCRjKHRpY2tPcHRzLmNhbGxiYWNrLCB0aWNrT3B0cy51c2VyQ2FsbGJhY2spO1xuXG5cdFx0cmV0dXJuIGZvcm1hdHRlciA/IGZvcm1hdHRlcihsYWJlbCwgaW5kZXgsIHRpY2tzKSA6IGxhYmVsO1xuXHR9LFxuXG5cdGNvbnZlcnRUaWNrc1RvTGFiZWxzOiBmdW5jdGlvbih0aWNrcykge1xuXHRcdHZhciBsYWJlbHMgPSBbXTtcblx0XHR2YXIgaSwgaWxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSB0aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdGxhYmVscy5wdXNoKHRoaXMudGlja0Zvcm1hdEZ1bmN0aW9uKHRpY2tzW2ldLnZhbHVlLCBpLCB0aWNrcykpO1xuXHRcdH1cblxuXHRcdHJldHVybiBsYWJlbHM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRnZXRQaXhlbEZvck9mZnNldDogZnVuY3Rpb24odGltZSkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGlzUmV2ZXJzZSA9IG1lLm9wdGlvbnMudGlja3MucmV2ZXJzZTtcblx0XHR2YXIgc2l6ZSA9IG1lLl9ob3Jpem9udGFsID8gbWUud2lkdGggOiBtZS5oZWlnaHQ7XG5cdFx0dmFyIHN0YXJ0ID0gbWUuX2hvcml6b250YWwgPyBpc1JldmVyc2UgPyBtZS5yaWdodCA6IG1lLmxlZnQgOiBpc1JldmVyc2UgPyBtZS5ib3R0b20gOiBtZS50b3A7XG5cdFx0dmFyIHBvcyA9IGludGVycG9sYXRlJDEobWUuX3RhYmxlLCAndGltZScsIHRpbWUsICdwb3MnKTtcblx0XHR2YXIgb2Zmc2V0ID0gc2l6ZSAqIChtZS5fb2Zmc2V0cy5zdGFydCArIHBvcykgLyAobWUuX29mZnNldHMuc3RhcnQgKyAxICsgbWUuX29mZnNldHMuZW5kKTtcblxuXHRcdHJldHVybiBpc1JldmVyc2UgPyBzdGFydCAtIG9mZnNldCA6IHN0YXJ0ICsgb2Zmc2V0O1xuXHR9LFxuXG5cdGdldFBpeGVsRm9yVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgZGF0YXNldEluZGV4KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgdGltZSA9IG51bGw7XG5cblx0XHRpZiAoaW5kZXggIT09IHVuZGVmaW5lZCAmJiBkYXRhc2V0SW5kZXggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGltZSA9IG1lLl90aW1lc3RhbXBzLmRhdGFzZXRzW2RhdGFzZXRJbmRleF1baW5kZXhdO1xuXHRcdH1cblxuXHRcdGlmICh0aW1lID09PSBudWxsKSB7XG5cdFx0XHR0aW1lID0gcGFyc2UobWUsIHZhbHVlKTtcblx0XHR9XG5cblx0XHRpZiAodGltZSAhPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIG1lLmdldFBpeGVsRm9yT2Zmc2V0KHRpbWUpO1xuXHRcdH1cblx0fSxcblxuXHRnZXRQaXhlbEZvclRpY2s6IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0dmFyIHRpY2tzID0gdGhpcy5nZXRUaWNrcygpO1xuXHRcdHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgdGlja3MubGVuZ3RoID9cblx0XHRcdHRoaXMuZ2V0UGl4ZWxGb3JPZmZzZXQodGlja3NbaW5kZXhdLnZhbHVlKSA6XG5cdFx0XHRudWxsO1xuXHR9LFxuXG5cdGdldFZhbHVlRm9yUGl4ZWw6IGZ1bmN0aW9uKHBpeGVsKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgc2l6ZSA9IG1lLl9ob3Jpem9udGFsID8gbWUud2lkdGggOiBtZS5oZWlnaHQ7XG5cdFx0dmFyIHN0YXJ0ID0gbWUuX2hvcml6b250YWwgPyBtZS5sZWZ0IDogbWUudG9wO1xuXHRcdHZhciBwb3MgPSAoc2l6ZSA/IChwaXhlbCAtIHN0YXJ0KSAvIHNpemUgOiAwKSAqIChtZS5fb2Zmc2V0cy5zdGFydCArIDEgKyBtZS5fb2Zmc2V0cy5zdGFydCkgLSBtZS5fb2Zmc2V0cy5lbmQ7XG5cdFx0dmFyIHRpbWUgPSBpbnRlcnBvbGF0ZSQxKG1lLl90YWJsZSwgJ3BvcycsIHBvcywgJ3RpbWUnKTtcblxuXHRcdC8vIERFUFJFQ0FUSU9OLCB3ZSBzaG91bGQgcmV0dXJuIHRpbWUgZGlyZWN0bHlcblx0XHRyZXR1cm4gbWUuX2FkYXB0ZXIuX2NyZWF0ZSh0aW1lKTtcblx0fSxcblxuXHQvKipcblx0ICogQ3J1ZGUgYXBwcm94aW1hdGlvbiBvZiB3aGF0IHRoZSBsYWJlbCB3aWR0aCBtaWdodCBiZVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Z2V0TGFiZWxXaWR0aDogZnVuY3Rpb24obGFiZWwpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciB0aWNrc09wdHMgPSBtZS5vcHRpb25zLnRpY2tzO1xuXHRcdHZhciB0aWNrTGFiZWxXaWR0aCA9IG1lLmN0eC5tZWFzdXJlVGV4dChsYWJlbCkud2lkdGg7XG5cdFx0dmFyIGFuZ2xlID0gaGVscGVycyQxLnRvUmFkaWFucyh0aWNrc09wdHMubWF4Um90YXRpb24pO1xuXHRcdHZhciBjb3NSb3RhdGlvbiA9IE1hdGguY29zKGFuZ2xlKTtcblx0XHR2YXIgc2luUm90YXRpb24gPSBNYXRoLnNpbihhbmdsZSk7XG5cdFx0dmFyIHRpY2tGb250U2l6ZSA9IHZhbHVlT3JEZWZhdWx0JGModGlja3NPcHRzLmZvbnRTaXplLCBjb3JlX2RlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Rm9udFNpemUpO1xuXG5cdFx0cmV0dXJuICh0aWNrTGFiZWxXaWR0aCAqIGNvc1JvdGF0aW9uKSArICh0aWNrRm9udFNpemUgKiBzaW5Sb3RhdGlvbik7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRnZXRMYWJlbENhcGFjaXR5OiBmdW5jdGlvbihleGFtcGxlVGltZSkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHQvLyBwaWNrIHRoZSBsb25nZXN0IGZvcm1hdCAobWlsbGlzZWNvbmRzKSBmb3IgZ3Vlc3RpbWF0aW9uXG5cdFx0dmFyIGZvcm1hdCA9IG1lLm9wdGlvbnMudGltZS5kaXNwbGF5Rm9ybWF0cy5taWxsaXNlY29uZDtcblx0XHR2YXIgZXhhbXBsZUxhYmVsID0gbWUudGlja0Zvcm1hdEZ1bmN0aW9uKGV4YW1wbGVUaW1lLCAwLCBbXSwgZm9ybWF0KTtcblx0XHR2YXIgdGlja0xhYmVsV2lkdGggPSBtZS5nZXRMYWJlbFdpZHRoKGV4YW1wbGVMYWJlbCk7XG5cdFx0dmFyIGlubmVyV2lkdGggPSBtZS5pc0hvcml6b250YWwoKSA/IG1lLndpZHRoIDogbWUuaGVpZ2h0O1xuXHRcdHZhciBjYXBhY2l0eSA9IE1hdGguZmxvb3IoaW5uZXJXaWR0aCAvIHRpY2tMYWJlbFdpZHRoKTtcblxuXHRcdHJldHVybiBjYXBhY2l0eSA+IDAgPyBjYXBhY2l0eSA6IDE7XG5cdH1cbn0pO1xuXG4vLyBJTlRFUk5BTDogc3RhdGljIGRlZmF1bHQgb3B0aW9ucywgcmVnaXN0ZXJlZCBpbiBzcmMvaW5kZXguanNcbnZhciBfZGVmYXVsdHMkNCA9IGRlZmF1bHRDb25maWckNDtcbnNjYWxlX3RpbWUuX2RlZmF1bHRzID0gX2RlZmF1bHRzJDQ7XG5cbnZhciBzY2FsZXMgPSB7XG5cdGNhdGVnb3J5OiBzY2FsZV9jYXRlZ29yeSxcblx0bGluZWFyOiBzY2FsZV9saW5lYXIsXG5cdGxvZ2FyaXRobWljOiBzY2FsZV9sb2dhcml0aG1pYyxcblx0cmFkaWFsTGluZWFyOiBzY2FsZV9yYWRpYWxMaW5lYXIsXG5cdHRpbWU6IHNjYWxlX3RpbWVcbn07XG5cbnZhciBGT1JNQVRTID0ge1xuXHRkYXRldGltZTogJ01NTSBELCBZWVlZLCBoOm1tOnNzIGEnLFxuXHRtaWxsaXNlY29uZDogJ2g6bW06c3MuU1NTIGEnLFxuXHRzZWNvbmQ6ICdoOm1tOnNzIGEnLFxuXHRtaW51dGU6ICdoOm1tIGEnLFxuXHRob3VyOiAnaEEnLFxuXHRkYXk6ICdNTU0gRCcsXG5cdHdlZWs6ICdsbCcsXG5cdG1vbnRoOiAnTU1NIFlZWVknLFxuXHRxdWFydGVyOiAnW1FdUSAtIFlZWVknLFxuXHR5ZWFyOiAnWVlZWSdcbn07XG5cbmNvcmVfYWRhcHRlcnMuX2RhdGUub3ZlcnJpZGUodHlwZW9mIG1vbWVudCA9PT0gJ2Z1bmN0aW9uJyA/IHtcblx0X2lkOiAnbW9tZW50JywgLy8gREVCVUcgT05MWVxuXG5cdGZvcm1hdHM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBGT1JNQVRTO1xuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbih2YWx1ZSwgZm9ybWF0KSB7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGZvcm1hdCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHZhbHVlID0gbW9tZW50KHZhbHVlLCBmb3JtYXQpO1xuXHRcdH0gZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIG1vbWVudCkpIHtcblx0XHRcdHZhbHVlID0gbW9tZW50KHZhbHVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlLmlzVmFsaWQoKSA/IHZhbHVlLnZhbHVlT2YoKSA6IG51bGw7XG5cdH0sXG5cblx0Zm9ybWF0OiBmdW5jdGlvbih0aW1lLCBmb3JtYXQpIHtcblx0XHRyZXR1cm4gbW9tZW50KHRpbWUpLmZvcm1hdChmb3JtYXQpO1xuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24odGltZSwgYW1vdW50LCB1bml0KSB7XG5cdFx0cmV0dXJuIG1vbWVudCh0aW1lKS5hZGQoYW1vdW50LCB1bml0KS52YWx1ZU9mKCk7XG5cdH0sXG5cblx0ZGlmZjogZnVuY3Rpb24obWF4LCBtaW4sIHVuaXQpIHtcblx0XHRyZXR1cm4gbW9tZW50LmR1cmF0aW9uKG1vbWVudChtYXgpLmRpZmYobW9tZW50KG1pbikpKS5hcyh1bml0KTtcblx0fSxcblxuXHRzdGFydE9mOiBmdW5jdGlvbih0aW1lLCB1bml0LCB3ZWVrZGF5KSB7XG5cdFx0dGltZSA9IG1vbWVudCh0aW1lKTtcblx0XHRpZiAodW5pdCA9PT0gJ2lzb1dlZWsnKSB7XG5cdFx0XHRyZXR1cm4gdGltZS5pc29XZWVrZGF5KHdlZWtkYXkpLnZhbHVlT2YoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRpbWUuc3RhcnRPZih1bml0KS52YWx1ZU9mKCk7XG5cdH0sXG5cblx0ZW5kT2Y6IGZ1bmN0aW9uKHRpbWUsIHVuaXQpIHtcblx0XHRyZXR1cm4gbW9tZW50KHRpbWUpLmVuZE9mKHVuaXQpLnZhbHVlT2YoKTtcblx0fSxcblxuXHQvLyBERVBSRUNBVElPTlNcblxuXHQvKipcblx0ICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKCkuXG5cdCAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi44LjBcblx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2NyZWF0ZTogZnVuY3Rpb24odGltZSkge1xuXHRcdHJldHVybiBtb21lbnQodGltZSk7XG5cdH0sXG59IDoge30pO1xuXG5jb3JlX2RlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0cGx1Z2luczoge1xuXHRcdGZpbGxlcjoge1xuXHRcdFx0cHJvcGFnYXRlOiB0cnVlXG5cdFx0fVxuXHR9XG59KTtcblxudmFyIG1hcHBlcnMgPSB7XG5cdGRhdGFzZXQ6IGZ1bmN0aW9uKHNvdXJjZSkge1xuXHRcdHZhciBpbmRleCA9IHNvdXJjZS5maWxsO1xuXHRcdHZhciBjaGFydCA9IHNvdXJjZS5jaGFydDtcblx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGluZGV4KTtcblx0XHR2YXIgdmlzaWJsZSA9IG1ldGEgJiYgY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpbmRleCk7XG5cdFx0dmFyIHBvaW50cyA9ICh2aXNpYmxlICYmIG1ldGEuZGF0YXNldC5fY2hpbGRyZW4pIHx8IFtdO1xuXHRcdHZhciBsZW5ndGggPSBwb2ludHMubGVuZ3RoIHx8IDA7XG5cblx0XHRyZXR1cm4gIWxlbmd0aCA/IG51bGwgOiBmdW5jdGlvbihwb2ludCwgaSkge1xuXHRcdFx0cmV0dXJuIChpIDwgbGVuZ3RoICYmIHBvaW50c1tpXS5fdmlldykgfHwgbnVsbDtcblx0XHR9O1xuXHR9LFxuXG5cdGJvdW5kYXJ5OiBmdW5jdGlvbihzb3VyY2UpIHtcblx0XHR2YXIgYm91bmRhcnkgPSBzb3VyY2UuYm91bmRhcnk7XG5cdFx0dmFyIHggPSBib3VuZGFyeSA/IGJvdW5kYXJ5LnggOiBudWxsO1xuXHRcdHZhciB5ID0gYm91bmRhcnkgPyBib3VuZGFyeS55IDogbnVsbDtcblxuXHRcdHJldHVybiBmdW5jdGlvbihwb2ludCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0eDogeCA9PT0gbnVsbCA/IHBvaW50LnggOiB4LFxuXHRcdFx0XHR5OiB5ID09PSBudWxsID8gcG9pbnQueSA6IHksXG5cdFx0XHR9O1xuXHRcdH07XG5cdH1cbn07XG5cbi8vIEB0b2RvIGlmIChmaWxsWzBdID09PSAnIycpXG5mdW5jdGlvbiBkZWNvZGVGaWxsKGVsLCBpbmRleCwgY291bnQpIHtcblx0dmFyIG1vZGVsID0gZWwuX21vZGVsIHx8IHt9O1xuXHR2YXIgZmlsbCA9IG1vZGVsLmZpbGw7XG5cdHZhciB0YXJnZXQ7XG5cblx0aWYgKGZpbGwgPT09IHVuZGVmaW5lZCkge1xuXHRcdGZpbGwgPSAhIW1vZGVsLmJhY2tncm91bmRDb2xvcjtcblx0fVxuXG5cdGlmIChmaWxsID09PSBmYWxzZSB8fCBmaWxsID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aWYgKGZpbGwgPT09IHRydWUpIHtcblx0XHRyZXR1cm4gJ29yaWdpbic7XG5cdH1cblxuXHR0YXJnZXQgPSBwYXJzZUZsb2F0KGZpbGwsIDEwKTtcblx0aWYgKGlzRmluaXRlKHRhcmdldCkgJiYgTWF0aC5mbG9vcih0YXJnZXQpID09PSB0YXJnZXQpIHtcblx0XHRpZiAoZmlsbFswXSA9PT0gJy0nIHx8IGZpbGxbMF0gPT09ICcrJykge1xuXHRcdFx0dGFyZ2V0ID0gaW5kZXggKyB0YXJnZXQ7XG5cdFx0fVxuXG5cdFx0aWYgKHRhcmdldCA9PT0gaW5kZXggfHwgdGFyZ2V0IDwgMCB8fCB0YXJnZXQgPj0gY291bnQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9XG5cblx0c3dpdGNoIChmaWxsKSB7XG5cdC8vIGNvbXBhdGliaWxpdHlcblx0Y2FzZSAnYm90dG9tJzpcblx0XHRyZXR1cm4gJ3N0YXJ0Jztcblx0Y2FzZSAndG9wJzpcblx0XHRyZXR1cm4gJ2VuZCc7XG5cdGNhc2UgJ3plcm8nOlxuXHRcdHJldHVybiAnb3JpZ2luJztcblx0Ly8gc3VwcG9ydGVkIGJvdW5kYXJpZXNcblx0Y2FzZSAnb3JpZ2luJzpcblx0Y2FzZSAnc3RhcnQnOlxuXHRjYXNlICdlbmQnOlxuXHRcdHJldHVybiBmaWxsO1xuXHQvLyBpbnZhbGlkIGZpbGwgdmFsdWVzXG5cdGRlZmF1bHQ6XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVCb3VuZGFyeShzb3VyY2UpIHtcblx0dmFyIG1vZGVsID0gc291cmNlLmVsLl9tb2RlbCB8fCB7fTtcblx0dmFyIHNjYWxlID0gc291cmNlLmVsLl9zY2FsZSB8fCB7fTtcblx0dmFyIGZpbGwgPSBzb3VyY2UuZmlsbDtcblx0dmFyIHRhcmdldCA9IG51bGw7XG5cdHZhciBob3Jpem9udGFsO1xuXG5cdGlmIChpc0Zpbml0ZShmaWxsKSkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gQmFja3dhcmQgY29tcGF0aWJpbGl0eTogdW50aWwgdjMsIHdlIHN0aWxsIG5lZWQgdG8gc3VwcG9ydCBib3VuZGFyeSB2YWx1ZXMgc2V0IG9uXG5cdC8vIHRoZSBtb2RlbCAoc2NhbGVUb3AsIHNjYWxlQm90dG9tIGFuZCBzY2FsZVplcm8pIGJlY2F1c2Ugc29tZSBleHRlcm5hbCBwbHVnaW5zIGFuZFxuXHQvLyBjb250cm9sbGVycyBtaWdodCBzdGlsbCB1c2UgaXQgKGUuZy4gdGhlIFNtaXRoIGNoYXJ0KS5cblxuXHRpZiAoZmlsbCA9PT0gJ3N0YXJ0Jykge1xuXHRcdHRhcmdldCA9IG1vZGVsLnNjYWxlQm90dG9tID09PSB1bmRlZmluZWQgPyBzY2FsZS5ib3R0b20gOiBtb2RlbC5zY2FsZUJvdHRvbTtcblx0fSBlbHNlIGlmIChmaWxsID09PSAnZW5kJykge1xuXHRcdHRhcmdldCA9IG1vZGVsLnNjYWxlVG9wID09PSB1bmRlZmluZWQgPyBzY2FsZS50b3AgOiBtb2RlbC5zY2FsZVRvcDtcblx0fSBlbHNlIGlmIChtb2RlbC5zY2FsZVplcm8gIT09IHVuZGVmaW5lZCkge1xuXHRcdHRhcmdldCA9IG1vZGVsLnNjYWxlWmVybztcblx0fSBlbHNlIGlmIChzY2FsZS5nZXRCYXNlUG9zaXRpb24pIHtcblx0XHR0YXJnZXQgPSBzY2FsZS5nZXRCYXNlUG9zaXRpb24oKTtcblx0fSBlbHNlIGlmIChzY2FsZS5nZXRCYXNlUGl4ZWwpIHtcblx0XHR0YXJnZXQgPSBzY2FsZS5nZXRCYXNlUGl4ZWwoKTtcblx0fVxuXG5cdGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQgIT09IG51bGwpIHtcblx0XHRpZiAodGFyZ2V0LnggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQueSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXHRcdH1cblxuXHRcdGlmIChoZWxwZXJzJDEuaXNGaW5pdGUodGFyZ2V0KSkge1xuXHRcdFx0aG9yaXpvbnRhbCA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0eDogaG9yaXpvbnRhbCA/IHRhcmdldCA6IG51bGwsXG5cdFx0XHRcdHk6IGhvcml6b250YWwgPyBudWxsIDogdGFyZ2V0XG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVGFyZ2V0KHNvdXJjZXMsIGluZGV4LCBwcm9wYWdhdGUpIHtcblx0dmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuXHR2YXIgZmlsbCA9IHNvdXJjZS5maWxsO1xuXHR2YXIgdmlzaXRlZCA9IFtpbmRleF07XG5cdHZhciB0YXJnZXQ7XG5cblx0aWYgKCFwcm9wYWdhdGUpIHtcblx0XHRyZXR1cm4gZmlsbDtcblx0fVxuXG5cdHdoaWxlIChmaWxsICE9PSBmYWxzZSAmJiB2aXNpdGVkLmluZGV4T2YoZmlsbCkgPT09IC0xKSB7XG5cdFx0aWYgKCFpc0Zpbml0ZShmaWxsKSkge1xuXHRcdFx0cmV0dXJuIGZpbGw7XG5cdFx0fVxuXG5cdFx0dGFyZ2V0ID0gc291cmNlc1tmaWxsXTtcblx0XHRpZiAoIXRhcmdldCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICh0YXJnZXQudmlzaWJsZSkge1xuXHRcdFx0cmV0dXJuIGZpbGw7XG5cdFx0fVxuXG5cdFx0dmlzaXRlZC5wdXNoKGZpbGwpO1xuXHRcdGZpbGwgPSB0YXJnZXQuZmlsbDtcblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFwcGVyKHNvdXJjZSkge1xuXHR2YXIgZmlsbCA9IHNvdXJjZS5maWxsO1xuXHR2YXIgdHlwZSA9ICdkYXRhc2V0JztcblxuXHRpZiAoZmlsbCA9PT0gZmFsc2UpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGlmICghaXNGaW5pdGUoZmlsbCkpIHtcblx0XHR0eXBlID0gJ2JvdW5kYXJ5Jztcblx0fVxuXG5cdHJldHVybiBtYXBwZXJzW3R5cGVdKHNvdXJjZSk7XG59XG5cbmZ1bmN0aW9uIGlzRHJhd2FibGUocG9pbnQpIHtcblx0cmV0dXJuIHBvaW50ICYmICFwb2ludC5za2lwO1xufVxuXG5mdW5jdGlvbiBkcmF3QXJlYShjdHgsIGN1cnZlMCwgY3VydmUxLCBsZW4wLCBsZW4xKSB7XG5cdHZhciBpO1xuXG5cdGlmICghbGVuMCB8fCAhbGVuMSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIGJ1aWxkaW5nIGZpcnN0IGFyZWEgY3VydmUgKG5vcm1hbClcblx0Y3R4Lm1vdmVUbyhjdXJ2ZTBbMF0ueCwgY3VydmUwWzBdLnkpO1xuXHRmb3IgKGkgPSAxOyBpIDwgbGVuMDsgKytpKSB7XG5cdFx0aGVscGVycyQxLmNhbnZhcy5saW5lVG8oY3R4LCBjdXJ2ZTBbaSAtIDFdLCBjdXJ2ZTBbaV0pO1xuXHR9XG5cblx0Ly8gam9pbmluZyB0aGUgdHdvIGFyZWEgY3VydmVzXG5cdGN0eC5saW5lVG8oY3VydmUxW2xlbjEgLSAxXS54LCBjdXJ2ZTFbbGVuMSAtIDFdLnkpO1xuXG5cdC8vIGJ1aWxkaW5nIG9wcG9zaXRlIGFyZWEgY3VydmUgKHJldmVyc2UpXG5cdGZvciAoaSA9IGxlbjEgLSAxOyBpID4gMDsgLS1pKSB7XG5cdFx0aGVscGVycyQxLmNhbnZhcy5saW5lVG8oY3R4LCBjdXJ2ZTFbaV0sIGN1cnZlMVtpIC0gMV0sIHRydWUpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRvRmlsbChjdHgsIHBvaW50cywgbWFwcGVyLCB2aWV3LCBjb2xvciwgbG9vcCkge1xuXHR2YXIgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuXHR2YXIgc3BhbiA9IHZpZXcuc3BhbkdhcHM7XG5cdHZhciBjdXJ2ZTAgPSBbXTtcblx0dmFyIGN1cnZlMSA9IFtdO1xuXHR2YXIgbGVuMCA9IDA7XG5cdHZhciBsZW4xID0gMDtcblx0dmFyIGksIGlsZW4sIGluZGV4LCBwMCwgcDEsIGQwLCBkMTtcblxuXHRjdHguYmVnaW5QYXRoKCk7XG5cblx0Zm9yIChpID0gMCwgaWxlbiA9IChjb3VudCArICEhbG9vcCk7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRpbmRleCA9IGkgJSBjb3VudDtcblx0XHRwMCA9IHBvaW50c1tpbmRleF0uX3ZpZXc7XG5cdFx0cDEgPSBtYXBwZXIocDAsIGluZGV4LCB2aWV3KTtcblx0XHRkMCA9IGlzRHJhd2FibGUocDApO1xuXHRcdGQxID0gaXNEcmF3YWJsZShwMSk7XG5cblx0XHRpZiAoZDAgJiYgZDEpIHtcblx0XHRcdGxlbjAgPSBjdXJ2ZTAucHVzaChwMCk7XG5cdFx0XHRsZW4xID0gY3VydmUxLnB1c2gocDEpO1xuXHRcdH0gZWxzZSBpZiAobGVuMCAmJiBsZW4xKSB7XG5cdFx0XHRpZiAoIXNwYW4pIHtcblx0XHRcdFx0ZHJhd0FyZWEoY3R4LCBjdXJ2ZTAsIGN1cnZlMSwgbGVuMCwgbGVuMSk7XG5cdFx0XHRcdGxlbjAgPSBsZW4xID0gMDtcblx0XHRcdFx0Y3VydmUwID0gW107XG5cdFx0XHRcdGN1cnZlMSA9IFtdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGQwKSB7XG5cdFx0XHRcdFx0Y3VydmUwLnB1c2gocDApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChkMSkge1xuXHRcdFx0XHRcdGN1cnZlMS5wdXNoKHAxKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGRyYXdBcmVhKGN0eCwgY3VydmUwLCBjdXJ2ZTEsIGxlbjAsIGxlbjEpO1xuXG5cdGN0eC5jbG9zZVBhdGgoKTtcblx0Y3R4LmZpbGxTdHlsZSA9IGNvbG9yO1xuXHRjdHguZmlsbCgpO1xufVxuXG52YXIgcGx1Z2luX2ZpbGxlciA9IHtcblx0aWQ6ICdmaWxsZXInLFxuXG5cdGFmdGVyRGF0YXNldHNVcGRhdGU6IGZ1bmN0aW9uKGNoYXJ0LCBvcHRpb25zKSB7XG5cdFx0dmFyIGNvdW50ID0gKGNoYXJ0LmRhdGEuZGF0YXNldHMgfHwgW10pLmxlbmd0aDtcblx0XHR2YXIgcHJvcGFnYXRlID0gb3B0aW9ucy5wcm9wYWdhdGU7XG5cdFx0dmFyIHNvdXJjZXMgPSBbXTtcblx0XHR2YXIgbWV0YSwgaSwgZWwsIHNvdXJjZTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG5cdFx0XHRtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG5cdFx0XHRlbCA9IG1ldGEuZGF0YXNldDtcblx0XHRcdHNvdXJjZSA9IG51bGw7XG5cblx0XHRcdGlmIChlbCAmJiBlbC5fbW9kZWwgJiYgZWwgaW5zdGFuY2VvZiBlbGVtZW50cy5MaW5lKSB7XG5cdFx0XHRcdHNvdXJjZSA9IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpLFxuXHRcdFx0XHRcdGZpbGw6IGRlY29kZUZpbGwoZWwsIGksIGNvdW50KSxcblx0XHRcdFx0XHRjaGFydDogY2hhcnQsXG5cdFx0XHRcdFx0ZWw6IGVsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdG1ldGEuJGZpbGxlciA9IHNvdXJjZTtcblx0XHRcdHNvdXJjZXMucHVzaChzb3VyY2UpO1xuXHRcdH1cblxuXHRcdGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG5cdFx0XHRzb3VyY2UgPSBzb3VyY2VzW2ldO1xuXHRcdFx0aWYgKCFzb3VyY2UpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNvdXJjZS5maWxsID0gcmVzb2x2ZVRhcmdldChzb3VyY2VzLCBpLCBwcm9wYWdhdGUpO1xuXHRcdFx0c291cmNlLmJvdW5kYXJ5ID0gY29tcHV0ZUJvdW5kYXJ5KHNvdXJjZSk7XG5cdFx0XHRzb3VyY2UubWFwcGVyID0gY3JlYXRlTWFwcGVyKHNvdXJjZSk7XG5cdFx0fVxuXHR9LFxuXG5cdGJlZm9yZURhdGFzZXREcmF3OiBmdW5jdGlvbihjaGFydCwgYXJncykge1xuXHRcdHZhciBtZXRhID0gYXJncy5tZXRhLiRmaWxsZXI7XG5cdFx0aWYgKCFtZXRhKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGN0eCA9IGNoYXJ0LmN0eDtcblx0XHR2YXIgZWwgPSBtZXRhLmVsO1xuXHRcdHZhciB2aWV3ID0gZWwuX3ZpZXc7XG5cdFx0dmFyIHBvaW50cyA9IGVsLl9jaGlsZHJlbiB8fCBbXTtcblx0XHR2YXIgbWFwcGVyID0gbWV0YS5tYXBwZXI7XG5cdFx0dmFyIGNvbG9yID0gdmlldy5iYWNrZ3JvdW5kQ29sb3IgfHwgY29yZV9kZWZhdWx0cy5nbG9iYWwuZGVmYXVsdENvbG9yO1xuXG5cdFx0aWYgKG1hcHBlciAmJiBjb2xvciAmJiBwb2ludHMubGVuZ3RoKSB7XG5cdFx0XHRoZWxwZXJzJDEuY2FudmFzLmNsaXBBcmVhKGN0eCwgY2hhcnQuY2hhcnRBcmVhKTtcblx0XHRcdGRvRmlsbChjdHgsIHBvaW50cywgbWFwcGVyLCB2aWV3LCBjb2xvciwgZWwuX2xvb3ApO1xuXHRcdFx0aGVscGVycyQxLmNhbnZhcy51bmNsaXBBcmVhKGN0eCk7XG5cdFx0fVxuXHR9XG59O1xuXG52YXIgbm9vcCQxID0gaGVscGVycyQxLm5vb3A7XG52YXIgdmFsdWVPckRlZmF1bHQkZCA9IGhlbHBlcnMkMS52YWx1ZU9yRGVmYXVsdDtcblxuY29yZV9kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdGxlZ2VuZDoge1xuXHRcdGRpc3BsYXk6IHRydWUsXG5cdFx0cG9zaXRpb246ICd0b3AnLFxuXHRcdGZ1bGxXaWR0aDogdHJ1ZSxcblx0XHRyZXZlcnNlOiBmYWxzZSxcblx0XHR3ZWlnaHQ6IDEwMDAsXG5cblx0XHQvLyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBoYW5kbGVcblx0XHRvbkNsaWNrOiBmdW5jdGlvbihlLCBsZWdlbmRJdGVtKSB7XG5cdFx0XHR2YXIgaW5kZXggPSBsZWdlbmRJdGVtLmRhdGFzZXRJbmRleDtcblx0XHRcdHZhciBjaSA9IHRoaXMuY2hhcnQ7XG5cdFx0XHR2YXIgbWV0YSA9IGNpLmdldERhdGFzZXRNZXRhKGluZGV4KTtcblxuXHRcdFx0Ly8gU2VlIGNvbnRyb2xsZXIuaXNEYXRhc2V0VmlzaWJsZSBjb21tZW50XG5cdFx0XHRtZXRhLmhpZGRlbiA9IG1ldGEuaGlkZGVuID09PSBudWxsID8gIWNpLmRhdGEuZGF0YXNldHNbaW5kZXhdLmhpZGRlbiA6IG51bGw7XG5cblx0XHRcdC8vIFdlIGhpZCBhIGRhdGFzZXQgLi4uIHJlcmVuZGVyIHRoZSBjaGFydFxuXHRcdFx0Y2kudXBkYXRlKCk7XG5cdFx0fSxcblxuXHRcdG9uSG92ZXI6IG51bGwsXG5cdFx0b25MZWF2ZTogbnVsbCxcblxuXHRcdGxhYmVsczoge1xuXHRcdFx0Ym94V2lkdGg6IDQwLFxuXHRcdFx0cGFkZGluZzogMTAsXG5cdFx0XHQvLyBHZW5lcmF0ZXMgbGFiZWxzIHNob3duIGluIHRoZSBsZWdlbmRcblx0XHRcdC8vIFZhbGlkIHByb3BlcnRpZXMgdG8gcmV0dXJuOlxuXHRcdFx0Ly8gdGV4dCA6IHRleHQgdG8gZGlzcGxheVxuXHRcdFx0Ly8gZmlsbFN0eWxlIDogZmlsbCBvZiBjb2xvdXJlZCBib3hcblx0XHRcdC8vIHN0cm9rZVN0eWxlOiBzdHJva2Ugb2YgY29sb3VyZWQgYm94XG5cdFx0XHQvLyBoaWRkZW4gOiBpZiB0aGlzIGxlZ2VuZCBpdGVtIHJlZmVycyB0byBhIGhpZGRlbiBpdGVtXG5cdFx0XHQvLyBsaW5lQ2FwIDogY2FwIHN0eWxlIGZvciBsaW5lXG5cdFx0XHQvLyBsaW5lRGFzaFxuXHRcdFx0Ly8gbGluZURhc2hPZmZzZXQgOlxuXHRcdFx0Ly8gbGluZUpvaW4gOlxuXHRcdFx0Ly8gbGluZVdpZHRoIDpcblx0XHRcdGdlbmVyYXRlTGFiZWxzOiBmdW5jdGlvbihjaGFydCkge1xuXHRcdFx0XHR2YXIgZGF0YSA9IGNoYXJ0LmRhdGE7XG5cdFx0XHRcdHJldHVybiBoZWxwZXJzJDEuaXNBcnJheShkYXRhLmRhdGFzZXRzKSA/IGRhdGEuZGF0YXNldHMubWFwKGZ1bmN0aW9uKGRhdGFzZXQsIGkpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0dGV4dDogZGF0YXNldC5sYWJlbCxcblx0XHRcdFx0XHRcdGZpbGxTdHlsZTogKCFoZWxwZXJzJDEuaXNBcnJheShkYXRhc2V0LmJhY2tncm91bmRDb2xvcikgPyBkYXRhc2V0LmJhY2tncm91bmRDb2xvciA6IGRhdGFzZXQuYmFja2dyb3VuZENvbG9yWzBdKSxcblx0XHRcdFx0XHRcdGhpZGRlbjogIWNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSksXG5cdFx0XHRcdFx0XHRsaW5lQ2FwOiBkYXRhc2V0LmJvcmRlckNhcFN0eWxlLFxuXHRcdFx0XHRcdFx0bGluZURhc2g6IGRhdGFzZXQuYm9yZGVyRGFzaCxcblx0XHRcdFx0XHRcdGxpbmVEYXNoT2Zmc2V0OiBkYXRhc2V0LmJvcmRlckRhc2hPZmZzZXQsXG5cdFx0XHRcdFx0XHRsaW5lSm9pbjogZGF0YXNldC5ib3JkZXJKb2luU3R5bGUsXG5cdFx0XHRcdFx0XHRsaW5lV2lkdGg6IGRhdGFzZXQuYm9yZGVyV2lkdGgsXG5cdFx0XHRcdFx0XHRzdHJva2VTdHlsZTogZGF0YXNldC5ib3JkZXJDb2xvcixcblx0XHRcdFx0XHRcdHBvaW50U3R5bGU6IGRhdGFzZXQucG9pbnRTdHlsZSxcblxuXHRcdFx0XHRcdFx0Ly8gQmVsb3cgaXMgZXh0cmEgZGF0YSB1c2VkIGZvciB0b2dnbGluZyB0aGUgZGF0YXNldHNcblx0XHRcdFx0XHRcdGRhdGFzZXRJbmRleDogaVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0sIHRoaXMpIDogW107XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdGxlZ2VuZENhbGxiYWNrOiBmdW5jdGlvbihjaGFydCkge1xuXHRcdHZhciB0ZXh0ID0gW107XG5cdFx0dGV4dC5wdXNoKCc8dWwgY2xhc3M9XCInICsgY2hhcnQuaWQgKyAnLWxlZ2VuZFwiPicpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnQuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dGV4dC5wdXNoKCc8bGk+PHNwYW4gc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOicgKyBjaGFydC5kYXRhLmRhdGFzZXRzW2ldLmJhY2tncm91bmRDb2xvciArICdcIj48L3NwYW4+Jyk7XG5cdFx0XHRpZiAoY2hhcnQuZGF0YS5kYXRhc2V0c1tpXS5sYWJlbCkge1xuXHRcdFx0XHR0ZXh0LnB1c2goY2hhcnQuZGF0YS5kYXRhc2V0c1tpXS5sYWJlbCk7XG5cdFx0XHR9XG5cdFx0XHR0ZXh0LnB1c2goJzwvbGk+Jyk7XG5cdFx0fVxuXHRcdHRleHQucHVzaCgnPC91bD4nKTtcblx0XHRyZXR1cm4gdGV4dC5qb2luKCcnKTtcblx0fVxufSk7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgYm94IHdpZHRoIGJhc2VkIG9uIHRoZSB1c2VQb2ludFN0eWxlIG9wdGlvblxuICogQHBhcmFtIHtvYmplY3R9IGxhYmVsb3B0cyAtIHRoZSBsYWJlbCBvcHRpb25zIG9uIHRoZSBsZWdlbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb250U2l6ZSAtIHRoZSBsYWJlbCBmb250IHNpemVcbiAqIEByZXR1cm4ge251bWJlcn0gd2lkdGggb2YgdGhlIGNvbG9yIGJveCBhcmVhXG4gKi9cbmZ1bmN0aW9uIGdldEJveFdpZHRoKGxhYmVsT3B0cywgZm9udFNpemUpIHtcblx0cmV0dXJuIGxhYmVsT3B0cy51c2VQb2ludFN0eWxlICYmIGxhYmVsT3B0cy5ib3hXaWR0aCA+IGZvbnRTaXplID9cblx0XHRmb250U2l6ZSA6XG5cdFx0bGFiZWxPcHRzLmJveFdpZHRoO1xufVxuXG4vKipcbiAqIElNUE9SVEFOVDogdGhpcyBjbGFzcyBpcyBleHBvc2VkIHB1YmxpY2x5IGFzIENoYXJ0LkxlZ2VuZCwgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZXF1aXJlZCFcbiAqL1xudmFyIExlZ2VuZCA9IGNvcmVfZWxlbWVudC5leHRlbmQoe1xuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKGNvbmZpZykge1xuXHRcdGhlbHBlcnMkMS5leHRlbmQodGhpcywgY29uZmlnKTtcblxuXHRcdC8vIENvbnRhaW5zIGhpdCBib3hlcyBmb3IgZWFjaCBkYXRhc2V0IChpbiBkYXRhc2V0IG9yZGVyKVxuXHRcdHRoaXMubGVnZW5kSGl0Qm94ZXMgPSBbXTtcblxuXHRcdC8qKlxuIFx0XHQgKiBAcHJpdmF0ZVxuIFx0XHQgKi9cblx0XHR0aGlzLl9ob3ZlcmVkSXRlbSA9IG51bGw7XG5cblx0XHQvLyBBcmUgd2UgaW4gZG91Z2hudXQgbW9kZSB3aGljaCBoYXMgYSBkaWZmZXJlbnQgZGF0YSB0eXBlXG5cdFx0dGhpcy5kb3VnaG51dE1vZGUgPSBmYWxzZTtcblx0fSxcblxuXHQvLyBUaGVzZSBtZXRob2RzIGFyZSBvcmRlcmVkIGJ5IGxpZmVjeWNsZS4gVXRpbGl0aWVzIHRoZW4gZm9sbG93LlxuXHQvLyBBbnkgZnVuY3Rpb24gZGVmaW5lZCBoZXJlIGlzIGluaGVyaXRlZCBieSBhbGwgbGVnZW5kIHR5cGVzLlxuXHQvLyBBbnkgZnVuY3Rpb24gY2FuIGJlIGV4dGVuZGVkIGJ5IHRoZSBsZWdlbmQgdHlwZVxuXG5cdGJlZm9yZVVwZGF0ZTogbm9vcCQxLFxuXHR1cGRhdGU6IGZ1bmN0aW9uKG1heFdpZHRoLCBtYXhIZWlnaHQsIG1hcmdpbnMpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0Ly8gVXBkYXRlIExpZmVjeWNsZSAtIFByb2JhYmx5IGRvbid0IHdhbnQgdG8gZXZlciBleHRlbmQgb3Igb3ZlcndyaXRlIHRoaXMgZnVuY3Rpb24gOylcblx0XHRtZS5iZWZvcmVVcGRhdGUoKTtcblxuXHRcdC8vIEFic29yYiB0aGUgbWFzdGVyIG1lYXN1cmVtZW50c1xuXHRcdG1lLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0bWUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xuXHRcdG1lLm1hcmdpbnMgPSBtYXJnaW5zO1xuXG5cdFx0Ly8gRGltZW5zaW9uc1xuXHRcdG1lLmJlZm9yZVNldERpbWVuc2lvbnMoKTtcblx0XHRtZS5zZXREaW1lbnNpb25zKCk7XG5cdFx0bWUuYWZ0ZXJTZXREaW1lbnNpb25zKCk7XG5cdFx0Ly8gTGFiZWxzXG5cdFx0bWUuYmVmb3JlQnVpbGRMYWJlbHMoKTtcblx0XHRtZS5idWlsZExhYmVscygpO1xuXHRcdG1lLmFmdGVyQnVpbGRMYWJlbHMoKTtcblxuXHRcdC8vIEZpdFxuXHRcdG1lLmJlZm9yZUZpdCgpO1xuXHRcdG1lLmZpdCgpO1xuXHRcdG1lLmFmdGVyRml0KCk7XG5cdFx0Ly9cblx0XHRtZS5hZnRlclVwZGF0ZSgpO1xuXG5cdFx0cmV0dXJuIG1lLm1pblNpemU7XG5cdH0sXG5cdGFmdGVyVXBkYXRlOiBub29wJDEsXG5cblx0Ly9cblxuXHRiZWZvcmVTZXREaW1lbnNpb25zOiBub29wJDEsXG5cdHNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0Ly8gU2V0IHRoZSB1bmNvbnN0cmFpbmVkIGRpbWVuc2lvbiBiZWZvcmUgbGFiZWwgcm90YXRpb25cblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdC8vIFJlc2V0IHBvc2l0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyByb3RhdGlvblxuXHRcdFx0bWUud2lkdGggPSBtZS5tYXhXaWR0aDtcblx0XHRcdG1lLmxlZnQgPSAwO1xuXHRcdFx0bWUucmlnaHQgPSBtZS53aWR0aDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0O1xuXG5cdFx0XHQvLyBSZXNldCBwb3NpdGlvbiBiZWZvcmUgY2FsY3VsYXRpbmcgcm90YXRpb25cblx0XHRcdG1lLnRvcCA9IDA7XG5cdFx0XHRtZS5ib3R0b20gPSBtZS5oZWlnaHQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVzZXQgcGFkZGluZ1xuXHRcdG1lLnBhZGRpbmdMZWZ0ID0gMDtcblx0XHRtZS5wYWRkaW5nVG9wID0gMDtcblx0XHRtZS5wYWRkaW5nUmlnaHQgPSAwO1xuXHRcdG1lLnBhZGRpbmdCb3R0b20gPSAwO1xuXG5cdFx0Ly8gUmVzZXQgbWluU2l6ZVxuXHRcdG1lLm1pblNpemUgPSB7XG5cdFx0XHR3aWR0aDogMCxcblx0XHRcdGhlaWdodDogMFxuXHRcdH07XG5cdH0sXG5cdGFmdGVyU2V0RGltZW5zaW9uczogbm9vcCQxLFxuXG5cdC8vXG5cblx0YmVmb3JlQnVpbGRMYWJlbHM6IG5vb3AkMSxcblx0YnVpbGRMYWJlbHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGxhYmVsT3B0cyA9IG1lLm9wdGlvbnMubGFiZWxzIHx8IHt9O1xuXHRcdHZhciBsZWdlbmRJdGVtcyA9IGhlbHBlcnMkMS5jYWxsYmFjayhsYWJlbE9wdHMuZ2VuZXJhdGVMYWJlbHMsIFttZS5jaGFydF0sIG1lKSB8fCBbXTtcblxuXHRcdGlmIChsYWJlbE9wdHMuZmlsdGVyKSB7XG5cdFx0XHRsZWdlbmRJdGVtcyA9IGxlZ2VuZEl0ZW1zLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XG5cdFx0XHRcdHJldHVybiBsYWJlbE9wdHMuZmlsdGVyKGl0ZW0sIG1lLmNoYXJ0LmRhdGEpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKG1lLm9wdGlvbnMucmV2ZXJzZSkge1xuXHRcdFx0bGVnZW5kSXRlbXMucmV2ZXJzZSgpO1xuXHRcdH1cblxuXHRcdG1lLmxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXM7XG5cdH0sXG5cdGFmdGVyQnVpbGRMYWJlbHM6IG5vb3AkMSxcblxuXHQvL1xuXG5cdGJlZm9yZUZpdDogbm9vcCQxLFxuXHRmaXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdHZhciBsYWJlbE9wdHMgPSBvcHRzLmxhYmVscztcblx0XHR2YXIgZGlzcGxheSA9IG9wdHMuZGlzcGxheTtcblxuXHRcdHZhciBjdHggPSBtZS5jdHg7XG5cblx0XHR2YXIgbGFiZWxGb250ID0gaGVscGVycyQxLm9wdGlvbnMuX3BhcnNlRm9udChsYWJlbE9wdHMpO1xuXHRcdHZhciBmb250U2l6ZSA9IGxhYmVsRm9udC5zaXplO1xuXG5cdFx0Ly8gUmVzZXQgaGl0IGJveGVzXG5cdFx0dmFyIGhpdGJveGVzID0gbWUubGVnZW5kSGl0Qm94ZXMgPSBbXTtcblxuXHRcdHZhciBtaW5TaXplID0gbWUubWluU2l6ZTtcblx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XG5cblx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRtaW5TaXplLndpZHRoID0gbWUubWF4V2lkdGg7IC8vIGZpbGwgYWxsIHRoZSB3aWR0aFxuXHRcdFx0bWluU2l6ZS5oZWlnaHQgPSBkaXNwbGF5ID8gMTAgOiAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtaW5TaXplLndpZHRoID0gZGlzcGxheSA/IDEwIDogMDtcblx0XHRcdG1pblNpemUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0OyAvLyBmaWxsIGFsbCB0aGUgaGVpZ2h0XG5cdFx0fVxuXG5cdFx0Ly8gSW5jcmVhc2Ugc2l6ZXMgaGVyZVxuXHRcdGlmIChkaXNwbGF5KSB7XG5cdFx0XHRjdHguZm9udCA9IGxhYmVsRm9udC5zdHJpbmc7XG5cblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0Ly8gTGFiZWxzXG5cblx0XHRcdFx0Ly8gV2lkdGggb2YgZWFjaCBsaW5lIG9mIGxlZ2VuZCBib3hlcy4gTGFiZWxzIHdyYXAgb250byBtdWx0aXBsZSBsaW5lcyB3aGVuIHRoZXJlIGFyZSB0b28gbWFueSB0byBmaXQgb24gb25lXG5cdFx0XHRcdHZhciBsaW5lV2lkdGhzID0gbWUubGluZVdpZHRocyA9IFswXTtcblx0XHRcdFx0dmFyIHRvdGFsSGVpZ2h0ID0gMDtcblxuXHRcdFx0XHRjdHgudGV4dEFsaWduID0gJ2xlZnQnO1xuXHRcdFx0XHRjdHgudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG5cblx0XHRcdFx0aGVscGVycyQxLmVhY2gobWUubGVnZW5kSXRlbXMsIGZ1bmN0aW9uKGxlZ2VuZEl0ZW0sIGkpIHtcblx0XHRcdFx0XHR2YXIgYm94V2lkdGggPSBnZXRCb3hXaWR0aChsYWJlbE9wdHMsIGZvbnRTaXplKTtcblx0XHRcdFx0XHR2YXIgd2lkdGggPSBib3hXaWR0aCArIChmb250U2l6ZSAvIDIpICsgY3R4Lm1lYXN1cmVUZXh0KGxlZ2VuZEl0ZW0udGV4dCkud2lkdGg7XG5cblx0XHRcdFx0XHRpZiAoaSA9PT0gMCB8fCBsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoIC0gMV0gKyB3aWR0aCArIGxhYmVsT3B0cy5wYWRkaW5nID4gbWluU2l6ZS53aWR0aCkge1xuXHRcdFx0XHRcdFx0dG90YWxIZWlnaHQgKz0gZm9udFNpemUgKyBsYWJlbE9wdHMucGFkZGluZztcblx0XHRcdFx0XHRcdGxpbmVXaWR0aHNbbGluZVdpZHRocy5sZW5ndGggLSAoaSA+IDAgPyAwIDogMSldID0gbGFiZWxPcHRzLnBhZGRpbmc7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgdGhlIGhpdGJveCB3aWR0aCBhbmQgaGVpZ2h0IGhlcmUuIEZpbmFsIHBvc2l0aW9uIHdpbGwgYmUgdXBkYXRlZCBpbiBgZHJhd2Bcblx0XHRcdFx0XHRoaXRib3hlc1tpXSA9IHtcblx0XHRcdFx0XHRcdGxlZnQ6IDAsXG5cdFx0XHRcdFx0XHR0b3A6IDAsXG5cdFx0XHRcdFx0XHR3aWR0aDogd2lkdGgsXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IGZvbnRTaXplXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGxpbmVXaWR0aHNbbGluZVdpZHRocy5sZW5ndGggLSAxXSArPSB3aWR0aCArIGxhYmVsT3B0cy5wYWRkaW5nO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRtaW5TaXplLmhlaWdodCArPSB0b3RhbEhlaWdodDtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIHZQYWRkaW5nID0gbGFiZWxPcHRzLnBhZGRpbmc7XG5cdFx0XHRcdHZhciBjb2x1bW5XaWR0aHMgPSBtZS5jb2x1bW5XaWR0aHMgPSBbXTtcblx0XHRcdFx0dmFyIHRvdGFsV2lkdGggPSBsYWJlbE9wdHMucGFkZGluZztcblx0XHRcdFx0dmFyIGN1cnJlbnRDb2xXaWR0aCA9IDA7XG5cdFx0XHRcdHZhciBjdXJyZW50Q29sSGVpZ2h0ID0gMDtcblx0XHRcdFx0dmFyIGl0ZW1IZWlnaHQgPSBmb250U2l6ZSArIHZQYWRkaW5nO1xuXG5cdFx0XHRcdGhlbHBlcnMkMS5lYWNoKG1lLmxlZ2VuZEl0ZW1zLCBmdW5jdGlvbihsZWdlbmRJdGVtLCBpKSB7XG5cdFx0XHRcdFx0dmFyIGJveFdpZHRoID0gZ2V0Qm94V2lkdGgobGFiZWxPcHRzLCBmb250U2l6ZSk7XG5cdFx0XHRcdFx0dmFyIGl0ZW1XaWR0aCA9IGJveFdpZHRoICsgKGZvbnRTaXplIC8gMikgKyBjdHgubWVhc3VyZVRleHQobGVnZW5kSXRlbS50ZXh0KS53aWR0aDtcblxuXHRcdFx0XHRcdC8vIElmIHRvbyB0YWxsLCBnbyB0byBuZXcgY29sdW1uXG5cdFx0XHRcdFx0aWYgKGkgPiAwICYmIGN1cnJlbnRDb2xIZWlnaHQgKyBpdGVtSGVpZ2h0ID4gbWluU2l6ZS5oZWlnaHQgLSB2UGFkZGluZykge1xuXHRcdFx0XHRcdFx0dG90YWxXaWR0aCArPSBjdXJyZW50Q29sV2lkdGggKyBsYWJlbE9wdHMucGFkZGluZztcblx0XHRcdFx0XHRcdGNvbHVtbldpZHRocy5wdXNoKGN1cnJlbnRDb2xXaWR0aCk7IC8vIHByZXZpb3VzIGNvbHVtbiB3aWR0aFxuXG5cdFx0XHRcdFx0XHRjdXJyZW50Q29sV2lkdGggPSAwO1xuXHRcdFx0XHRcdFx0Y3VycmVudENvbEhlaWdodCA9IDA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gR2V0IG1heCB3aWR0aFxuXHRcdFx0XHRcdGN1cnJlbnRDb2xXaWR0aCA9IE1hdGgubWF4KGN1cnJlbnRDb2xXaWR0aCwgaXRlbVdpZHRoKTtcblx0XHRcdFx0XHRjdXJyZW50Q29sSGVpZ2h0ICs9IGl0ZW1IZWlnaHQ7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSB0aGUgaGl0Ym94IHdpZHRoIGFuZCBoZWlnaHQgaGVyZS4gRmluYWwgcG9zaXRpb24gd2lsbCBiZSB1cGRhdGVkIGluIGBkcmF3YFxuXHRcdFx0XHRcdGhpdGJveGVzW2ldID0ge1xuXHRcdFx0XHRcdFx0bGVmdDogMCxcblx0XHRcdFx0XHRcdHRvcDogMCxcblx0XHRcdFx0XHRcdHdpZHRoOiBpdGVtV2lkdGgsXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IGZvbnRTaXplXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dG90YWxXaWR0aCArPSBjdXJyZW50Q29sV2lkdGg7XG5cdFx0XHRcdGNvbHVtbldpZHRocy5wdXNoKGN1cnJlbnRDb2xXaWR0aCk7XG5cdFx0XHRcdG1pblNpemUud2lkdGggKz0gdG90YWxXaWR0aDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtZS53aWR0aCA9IG1pblNpemUud2lkdGg7XG5cdFx0bWUuaGVpZ2h0ID0gbWluU2l6ZS5oZWlnaHQ7XG5cdH0sXG5cdGFmdGVyRml0OiBub29wJDEsXG5cblx0Ly8gU2hhcmVkIE1ldGhvZHNcblx0aXNIb3Jpem9udGFsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uID09PSAndG9wJyB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICdib3R0b20nO1xuXHR9LFxuXG5cdC8vIEFjdHVhbGx5IGRyYXcgdGhlIGxlZ2VuZCBvbiB0aGUgY2FudmFzXG5cdGRyYXc6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdHZhciBsYWJlbE9wdHMgPSBvcHRzLmxhYmVscztcblx0XHR2YXIgZ2xvYmFsRGVmYXVsdHMgPSBjb3JlX2RlZmF1bHRzLmdsb2JhbDtcblx0XHR2YXIgZGVmYXVsdENvbG9yID0gZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdENvbG9yO1xuXHRcdHZhciBsaW5lRGVmYXVsdCA9IGdsb2JhbERlZmF1bHRzLmVsZW1lbnRzLmxpbmU7XG5cdFx0dmFyIGxlZ2VuZFdpZHRoID0gbWUud2lkdGg7XG5cdFx0dmFyIGxpbmVXaWR0aHMgPSBtZS5saW5lV2lkdGhzO1xuXG5cdFx0aWYgKG9wdHMuZGlzcGxheSkge1xuXHRcdFx0dmFyIGN0eCA9IG1lLmN0eDtcblx0XHRcdHZhciBmb250Q29sb3IgPSB2YWx1ZU9yRGVmYXVsdCRkKGxhYmVsT3B0cy5mb250Q29sb3IsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250Q29sb3IpO1xuXHRcdFx0dmFyIGxhYmVsRm9udCA9IGhlbHBlcnMkMS5vcHRpb25zLl9wYXJzZUZvbnQobGFiZWxPcHRzKTtcblx0XHRcdHZhciBmb250U2l6ZSA9IGxhYmVsRm9udC5zaXplO1xuXHRcdFx0dmFyIGN1cnNvcjtcblxuXHRcdFx0Ly8gQ2FudmFzIHNldHVwXG5cdFx0XHRjdHgudGV4dEFsaWduID0gJ2xlZnQnO1xuXHRcdFx0Y3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IDAuNTtcblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IGZvbnRDb2xvcjsgLy8gZm9yIHN0cmlrZXRocm91Z2ggZWZmZWN0XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gZm9udENvbG9yOyAvLyByZW5kZXIgaW4gY29ycmVjdCBjb2xvdXJcblx0XHRcdGN0eC5mb250ID0gbGFiZWxGb250LnN0cmluZztcblxuXHRcdFx0dmFyIGJveFdpZHRoID0gZ2V0Qm94V2lkdGgobGFiZWxPcHRzLCBmb250U2l6ZSk7XG5cdFx0XHR2YXIgaGl0Ym94ZXMgPSBtZS5sZWdlbmRIaXRCb3hlcztcblxuXHRcdFx0Ly8gY3VycmVudCBwb3NpdGlvblxuXHRcdFx0dmFyIGRyYXdMZWdlbmRCb3ggPSBmdW5jdGlvbih4LCB5LCBsZWdlbmRJdGVtKSB7XG5cdFx0XHRcdGlmIChpc05hTihib3hXaWR0aCkgfHwgYm94V2lkdGggPD0gMCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCB0aGUgY3R4IGZvciB0aGUgYm94XG5cdFx0XHRcdGN0eC5zYXZlKCk7XG5cblx0XHRcdFx0dmFyIGxpbmVXaWR0aCA9IHZhbHVlT3JEZWZhdWx0JGQobGVnZW5kSXRlbS5saW5lV2lkdGgsIGxpbmVEZWZhdWx0LmJvcmRlcldpZHRoKTtcblx0XHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHZhbHVlT3JEZWZhdWx0JGQobGVnZW5kSXRlbS5maWxsU3R5bGUsIGRlZmF1bHRDb2xvcik7XG5cdFx0XHRcdGN0eC5saW5lQ2FwID0gdmFsdWVPckRlZmF1bHQkZChsZWdlbmRJdGVtLmxpbmVDYXAsIGxpbmVEZWZhdWx0LmJvcmRlckNhcFN0eWxlKTtcblx0XHRcdFx0Y3R4LmxpbmVEYXNoT2Zmc2V0ID0gdmFsdWVPckRlZmF1bHQkZChsZWdlbmRJdGVtLmxpbmVEYXNoT2Zmc2V0LCBsaW5lRGVmYXVsdC5ib3JkZXJEYXNoT2Zmc2V0KTtcblx0XHRcdFx0Y3R4LmxpbmVKb2luID0gdmFsdWVPckRlZmF1bHQkZChsZWdlbmRJdGVtLmxpbmVKb2luLCBsaW5lRGVmYXVsdC5ib3JkZXJKb2luU3R5bGUpO1xuXHRcdFx0XHRjdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuXHRcdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSB2YWx1ZU9yRGVmYXVsdCRkKGxlZ2VuZEl0ZW0uc3Ryb2tlU3R5bGUsIGRlZmF1bHRDb2xvcik7XG5cblx0XHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRcdC8vIElFIDkgYW5kIDEwIGRvIG5vdCBzdXBwb3J0IGxpbmUgZGFzaFxuXHRcdFx0XHRcdGN0eC5zZXRMaW5lRGFzaCh2YWx1ZU9yRGVmYXVsdCRkKGxlZ2VuZEl0ZW0ubGluZURhc2gsIGxpbmVEZWZhdWx0LmJvcmRlckRhc2gpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvcHRzLmxhYmVscyAmJiBvcHRzLmxhYmVscy51c2VQb2ludFN0eWxlKSB7XG5cdFx0XHRcdFx0Ly8gUmVjYWxjdWxhdGUgeCBhbmQgeSBmb3IgZHJhd1BvaW50KCkgYmVjYXVzZSBpdHMgZXhwZWN0aW5nXG5cdFx0XHRcdFx0Ly8geCBhbmQgeSB0byBiZSBjZW50ZXIgb2YgZmlndXJlIChpbnN0ZWFkIG9mIHRvcCBsZWZ0KVxuXHRcdFx0XHRcdHZhciByYWRpdXMgPSBib3hXaWR0aCAqIE1hdGguU1FSVDIgLyAyO1xuXHRcdFx0XHRcdHZhciBjZW50ZXJYID0geCArIGJveFdpZHRoIC8gMjtcblx0XHRcdFx0XHR2YXIgY2VudGVyWSA9IHkgKyBmb250U2l6ZSAvIDI7XG5cblx0XHRcdFx0XHQvLyBEcmF3IHBvaW50U3R5bGUgYXMgbGVnZW5kIHN5bWJvbFxuXHRcdFx0XHRcdGhlbHBlcnMkMS5jYW52YXMuZHJhd1BvaW50KGN0eCwgbGVnZW5kSXRlbS5wb2ludFN0eWxlLCByYWRpdXMsIGNlbnRlclgsIGNlbnRlclkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIERyYXcgYm94IGFzIGxlZ2VuZCBzeW1ib2xcblx0XHRcdFx0XHRpZiAobGluZVdpZHRoICE9PSAwKSB7XG5cdFx0XHRcdFx0XHRjdHguc3Ryb2tlUmVjdCh4LCB5LCBib3hXaWR0aCwgZm9udFNpemUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjdHguZmlsbFJlY3QoeCwgeSwgYm94V2lkdGgsIGZvbnRTaXplKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGN0eC5yZXN0b3JlKCk7XG5cdFx0XHR9O1xuXHRcdFx0dmFyIGZpbGxUZXh0ID0gZnVuY3Rpb24oeCwgeSwgbGVnZW5kSXRlbSwgdGV4dFdpZHRoKSB7XG5cdFx0XHRcdHZhciBoYWxmRm9udFNpemUgPSBmb250U2l6ZSAvIDI7XG5cdFx0XHRcdHZhciB4TGVmdCA9IGJveFdpZHRoICsgaGFsZkZvbnRTaXplICsgeDtcblx0XHRcdFx0dmFyIHlNaWRkbGUgPSB5ICsgaGFsZkZvbnRTaXplO1xuXG5cdFx0XHRcdGN0eC5maWxsVGV4dChsZWdlbmRJdGVtLnRleHQsIHhMZWZ0LCB5TWlkZGxlKTtcblxuXHRcdFx0XHRpZiAobGVnZW5kSXRlbS5oaWRkZW4pIHtcblx0XHRcdFx0XHQvLyBTdHJpa2V0aHJvdWdoIHRoZSB0ZXh0IGlmIGhpZGRlblxuXHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRjdHgubGluZVdpZHRoID0gMjtcblx0XHRcdFx0XHRjdHgubW92ZVRvKHhMZWZ0LCB5TWlkZGxlKTtcblx0XHRcdFx0XHRjdHgubGluZVRvKHhMZWZ0ICsgdGV4dFdpZHRoLCB5TWlkZGxlKTtcblx0XHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdC8vIEhvcml6b250YWxcblx0XHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0Y3Vyc29yID0ge1xuXHRcdFx0XHRcdHg6IG1lLmxlZnQgKyAoKGxlZ2VuZFdpZHRoIC0gbGluZVdpZHRoc1swXSkgLyAyKSArIGxhYmVsT3B0cy5wYWRkaW5nLFxuXHRcdFx0XHRcdHk6IG1lLnRvcCArIGxhYmVsT3B0cy5wYWRkaW5nLFxuXHRcdFx0XHRcdGxpbmU6IDBcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1cnNvciA9IHtcblx0XHRcdFx0XHR4OiBtZS5sZWZ0ICsgbGFiZWxPcHRzLnBhZGRpbmcsXG5cdFx0XHRcdFx0eTogbWUudG9wICsgbGFiZWxPcHRzLnBhZGRpbmcsXG5cdFx0XHRcdFx0bGluZTogMFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaXRlbUhlaWdodCA9IGZvbnRTaXplICsgbGFiZWxPcHRzLnBhZGRpbmc7XG5cdFx0XHRoZWxwZXJzJDEuZWFjaChtZS5sZWdlbmRJdGVtcywgZnVuY3Rpb24obGVnZW5kSXRlbSwgaSkge1xuXHRcdFx0XHR2YXIgdGV4dFdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGxlZ2VuZEl0ZW0udGV4dCkud2lkdGg7XG5cdFx0XHRcdHZhciB3aWR0aCA9IGJveFdpZHRoICsgKGZvbnRTaXplIC8gMikgKyB0ZXh0V2lkdGg7XG5cdFx0XHRcdHZhciB4ID0gY3Vyc29yLng7XG5cdFx0XHRcdHZhciB5ID0gY3Vyc29yLnk7XG5cblx0XHRcdFx0Ly8gVXNlIChtZS5sZWZ0ICsgbWUubWluU2l6ZS53aWR0aCkgYW5kIChtZS50b3AgKyBtZS5taW5TaXplLmhlaWdodClcblx0XHRcdFx0Ly8gaW5zdGVhZCBvZiBtZS5yaWdodCBhbmQgbWUuYm90dG9tIGJlY2F1c2UgbWUud2lkdGggYW5kIG1lLmhlaWdodFxuXHRcdFx0XHQvLyBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgbWUubWluU2l6ZSB3YXMgY2FsY3VsYXRlZFxuXHRcdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRcdFx0aWYgKGkgPiAwICYmIHggKyB3aWR0aCArIGxhYmVsT3B0cy5wYWRkaW5nID4gbWUubGVmdCArIG1lLm1pblNpemUud2lkdGgpIHtcblx0XHRcdFx0XHRcdHkgPSBjdXJzb3IueSArPSBpdGVtSGVpZ2h0O1xuXHRcdFx0XHRcdFx0Y3Vyc29yLmxpbmUrKztcblx0XHRcdFx0XHRcdHggPSBjdXJzb3IueCA9IG1lLmxlZnQgKyAoKGxlZ2VuZFdpZHRoIC0gbGluZVdpZHRoc1tjdXJzb3IubGluZV0pIC8gMikgKyBsYWJlbE9wdHMucGFkZGluZztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoaSA+IDAgJiYgeSArIGl0ZW1IZWlnaHQgPiBtZS50b3AgKyBtZS5taW5TaXplLmhlaWdodCkge1xuXHRcdFx0XHRcdHggPSBjdXJzb3IueCA9IHggKyBtZS5jb2x1bW5XaWR0aHNbY3Vyc29yLmxpbmVdICsgbGFiZWxPcHRzLnBhZGRpbmc7XG5cdFx0XHRcdFx0eSA9IGN1cnNvci55ID0gbWUudG9wICsgbGFiZWxPcHRzLnBhZGRpbmc7XG5cdFx0XHRcdFx0Y3Vyc29yLmxpbmUrKztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRyYXdMZWdlbmRCb3goeCwgeSwgbGVnZW5kSXRlbSk7XG5cblx0XHRcdFx0aGl0Ym94ZXNbaV0ubGVmdCA9IHg7XG5cdFx0XHRcdGhpdGJveGVzW2ldLnRvcCA9IHk7XG5cblx0XHRcdFx0Ly8gRmlsbCB0aGUgYWN0dWFsIGxhYmVsXG5cdFx0XHRcdGZpbGxUZXh0KHgsIHksIGxlZ2VuZEl0ZW0sIHRleHRXaWR0aCk7XG5cblx0XHRcdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0XHRcdGN1cnNvci54ICs9IHdpZHRoICsgbGFiZWxPcHRzLnBhZGRpbmc7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3Vyc29yLnkgKz0gaXRlbUhlaWdodDtcblx0XHRcdFx0fVxuXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0TGVnZW5kSXRlbUF0OiBmdW5jdGlvbih4LCB5KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgaSwgaGl0Qm94LCBsaDtcblxuXHRcdGlmICh4ID49IG1lLmxlZnQgJiYgeCA8PSBtZS5yaWdodCAmJiB5ID49IG1lLnRvcCAmJiB5IDw9IG1lLmJvdHRvbSkge1xuXHRcdFx0Ly8gU2VlIGlmIHdlIGFyZSB0b3VjaGluZyBvbmUgb2YgdGhlIGRhdGFzZXQgYm94ZXNcblx0XHRcdGxoID0gbWUubGVnZW5kSGl0Qm94ZXM7XG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgbGgubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0aGl0Qm94ID0gbGhbaV07XG5cblx0XHRcdFx0aWYgKHggPj0gaGl0Qm94LmxlZnQgJiYgeCA8PSBoaXRCb3gubGVmdCArIGhpdEJveC53aWR0aCAmJiB5ID49IGhpdEJveC50b3AgJiYgeSA8PSBoaXRCb3gudG9wICsgaGl0Qm94LmhlaWdodCkge1xuXHRcdFx0XHRcdC8vIFRvdWNoaW5nIGFuIGVsZW1lbnRcblx0XHRcdFx0XHRyZXR1cm4gbWUubGVnZW5kSXRlbXNbaV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fSxcblxuXHQvKipcblx0ICogSGFuZGxlIGFuIGV2ZW50XG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SUV2ZW50fSBldmVudCAtIFRoZSBldmVudCB0byBoYW5kbGVcblx0ICovXG5cdGhhbmRsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cdFx0dmFyIHR5cGUgPSBlLnR5cGUgPT09ICdtb3VzZXVwJyA/ICdjbGljaycgOiBlLnR5cGU7XG5cdFx0dmFyIGhvdmVyZWRJdGVtO1xuXG5cdFx0aWYgKHR5cGUgPT09ICdtb3VzZW1vdmUnKSB7XG5cdFx0XHRpZiAoIW9wdHMub25Ib3ZlciAmJiAhb3B0cy5vbkxlYXZlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHR5cGUgPT09ICdjbGljaycpIHtcblx0XHRcdGlmICghb3B0cy5vbkNsaWNrKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIENoYXJ0IGV2ZW50IGFscmVhZHkgaGFzIHJlbGF0aXZlIHBvc2l0aW9uIGluIGl0XG5cdFx0aG92ZXJlZEl0ZW0gPSBtZS5fZ2V0TGVnZW5kSXRlbUF0KGUueCwgZS55KTtcblxuXHRcdGlmICh0eXBlID09PSAnY2xpY2snKSB7XG5cdFx0XHRpZiAoaG92ZXJlZEl0ZW0gJiYgb3B0cy5vbkNsaWNrKSB7XG5cdFx0XHRcdC8vIHVzZSBlLm5hdGl2ZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdFx0b3B0cy5vbkNsaWNrLmNhbGwobWUsIGUubmF0aXZlLCBob3ZlcmVkSXRlbSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChvcHRzLm9uTGVhdmUgJiYgaG92ZXJlZEl0ZW0gIT09IG1lLl9ob3ZlcmVkSXRlbSkge1xuXHRcdFx0XHRpZiAobWUuX2hvdmVyZWRJdGVtKSB7XG5cdFx0XHRcdFx0b3B0cy5vbkxlYXZlLmNhbGwobWUsIGUubmF0aXZlLCBtZS5faG92ZXJlZEl0ZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1lLl9ob3ZlcmVkSXRlbSA9IGhvdmVyZWRJdGVtO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0cy5vbkhvdmVyICYmIGhvdmVyZWRJdGVtKSB7XG5cdFx0XHRcdC8vIHVzZSBlLm5hdGl2ZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdFx0b3B0cy5vbkhvdmVyLmNhbGwobWUsIGUubmF0aXZlLCBob3ZlcmVkSXRlbSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxuZnVuY3Rpb24gY3JlYXRlTmV3TGVnZW5kQW5kQXR0YWNoKGNoYXJ0LCBsZWdlbmRPcHRzKSB7XG5cdHZhciBsZWdlbmQgPSBuZXcgTGVnZW5kKHtcblx0XHRjdHg6IGNoYXJ0LmN0eCxcblx0XHRvcHRpb25zOiBsZWdlbmRPcHRzLFxuXHRcdGNoYXJ0OiBjaGFydFxuXHR9KTtcblxuXHRjb3JlX2xheW91dHMuY29uZmlndXJlKGNoYXJ0LCBsZWdlbmQsIGxlZ2VuZE9wdHMpO1xuXHRjb3JlX2xheW91dHMuYWRkQm94KGNoYXJ0LCBsZWdlbmQpO1xuXHRjaGFydC5sZWdlbmQgPSBsZWdlbmQ7XG59XG5cbnZhciBwbHVnaW5fbGVnZW5kID0ge1xuXHRpZDogJ2xlZ2VuZCcsXG5cblx0LyoqXG5cdCAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IHNpbmNlIDIuMS41LCB0aGUgbGVnZW5kIGlzIHJlZ2lzdGVyZWQgYXMgYSBwbHVnaW4sIG1ha2luZ1xuXHQgKiBDaGFydC5MZWdlbmQgb2Jzb2xldGUuIFRvIGF2b2lkIGEgYnJlYWtpbmcgY2hhbmdlLCB3ZSBleHBvcnQgdGhlIExlZ2VuZCBhcyBwYXJ0IG9mXG5cdCAqIHRoZSBwbHVnaW4sIHdoaWNoIG9uZSB3aWxsIGJlIHJlLWV4cG9zZWQgaW4gdGhlIGNoYXJ0LmpzIGZpbGUuXG5cdCAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvMjY0MFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2VsZW1lbnQ6IExlZ2VuZCxcblxuXHRiZWZvcmVJbml0OiBmdW5jdGlvbihjaGFydCkge1xuXHRcdHZhciBsZWdlbmRPcHRzID0gY2hhcnQub3B0aW9ucy5sZWdlbmQ7XG5cblx0XHRpZiAobGVnZW5kT3B0cykge1xuXHRcdFx0Y3JlYXRlTmV3TGVnZW5kQW5kQXR0YWNoKGNoYXJ0LCBsZWdlbmRPcHRzKTtcblx0XHR9XG5cdH0sXG5cblx0YmVmb3JlVXBkYXRlOiBmdW5jdGlvbihjaGFydCkge1xuXHRcdHZhciBsZWdlbmRPcHRzID0gY2hhcnQub3B0aW9ucy5sZWdlbmQ7XG5cdFx0dmFyIGxlZ2VuZCA9IGNoYXJ0LmxlZ2VuZDtcblxuXHRcdGlmIChsZWdlbmRPcHRzKSB7XG5cdFx0XHRoZWxwZXJzJDEubWVyZ2VJZihsZWdlbmRPcHRzLCBjb3JlX2RlZmF1bHRzLmdsb2JhbC5sZWdlbmQpO1xuXG5cdFx0XHRpZiAobGVnZW5kKSB7XG5cdFx0XHRcdGNvcmVfbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIGxlZ2VuZCwgbGVnZW5kT3B0cyk7XG5cdFx0XHRcdGxlZ2VuZC5vcHRpb25zID0gbGVnZW5kT3B0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZU5ld0xlZ2VuZEFuZEF0dGFjaChjaGFydCwgbGVnZW5kT3B0cyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChsZWdlbmQpIHtcblx0XHRcdGNvcmVfbGF5b3V0cy5yZW1vdmVCb3goY2hhcnQsIGxlZ2VuZCk7XG5cdFx0XHRkZWxldGUgY2hhcnQubGVnZW5kO1xuXHRcdH1cblx0fSxcblxuXHRhZnRlckV2ZW50OiBmdW5jdGlvbihjaGFydCwgZSkge1xuXHRcdHZhciBsZWdlbmQgPSBjaGFydC5sZWdlbmQ7XG5cdFx0aWYgKGxlZ2VuZCkge1xuXHRcdFx0bGVnZW5kLmhhbmRsZUV2ZW50KGUpO1xuXHRcdH1cblx0fVxufTtcblxudmFyIG5vb3AkMiA9IGhlbHBlcnMkMS5ub29wO1xuXG5jb3JlX2RlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0dGl0bGU6IHtcblx0XHRkaXNwbGF5OiBmYWxzZSxcblx0XHRmb250U3R5bGU6ICdib2xkJyxcblx0XHRmdWxsV2lkdGg6IHRydWUsXG5cdFx0cGFkZGluZzogMTAsXG5cdFx0cG9zaXRpb246ICd0b3AnLFxuXHRcdHRleHQ6ICcnLFxuXHRcdHdlaWdodDogMjAwMCAgICAgICAgIC8vIGJ5IGRlZmF1bHQgZ3JlYXRlciB0aGFuIGxlZ2VuZCAoMTAwMCkgdG8gYmUgYWJvdmVcblx0fVxufSk7XG5cbi8qKlxuICogSU1QT1JUQU5UOiB0aGlzIGNsYXNzIGlzIGV4cG9zZWQgcHVibGljbHkgYXMgQ2hhcnQuTGVnZW5kLCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlcXVpcmVkIVxuICovXG52YXIgVGl0bGUgPSBjb3JlX2VsZW1lbnQuZXh0ZW5kKHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oY29uZmlnKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHRoZWxwZXJzJDEuZXh0ZW5kKG1lLCBjb25maWcpO1xuXG5cdFx0Ly8gQ29udGFpbnMgaGl0IGJveGVzIGZvciBlYWNoIGRhdGFzZXQgKGluIGRhdGFzZXQgb3JkZXIpXG5cdFx0bWUubGVnZW5kSGl0Qm94ZXMgPSBbXTtcblx0fSxcblxuXHQvLyBUaGVzZSBtZXRob2RzIGFyZSBvcmRlcmVkIGJ5IGxpZmVjeWNsZS4gVXRpbGl0aWVzIHRoZW4gZm9sbG93LlxuXG5cdGJlZm9yZVVwZGF0ZTogbm9vcCQyLFxuXHR1cGRhdGU6IGZ1bmN0aW9uKG1heFdpZHRoLCBtYXhIZWlnaHQsIG1hcmdpbnMpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0Ly8gVXBkYXRlIExpZmVjeWNsZSAtIFByb2JhYmx5IGRvbid0IHdhbnQgdG8gZXZlciBleHRlbmQgb3Igb3ZlcndyaXRlIHRoaXMgZnVuY3Rpb24gOylcblx0XHRtZS5iZWZvcmVVcGRhdGUoKTtcblxuXHRcdC8vIEFic29yYiB0aGUgbWFzdGVyIG1lYXN1cmVtZW50c1xuXHRcdG1lLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0bWUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xuXHRcdG1lLm1hcmdpbnMgPSBtYXJnaW5zO1xuXG5cdFx0Ly8gRGltZW5zaW9uc1xuXHRcdG1lLmJlZm9yZVNldERpbWVuc2lvbnMoKTtcblx0XHRtZS5zZXREaW1lbnNpb25zKCk7XG5cdFx0bWUuYWZ0ZXJTZXREaW1lbnNpb25zKCk7XG5cdFx0Ly8gTGFiZWxzXG5cdFx0bWUuYmVmb3JlQnVpbGRMYWJlbHMoKTtcblx0XHRtZS5idWlsZExhYmVscygpO1xuXHRcdG1lLmFmdGVyQnVpbGRMYWJlbHMoKTtcblxuXHRcdC8vIEZpdFxuXHRcdG1lLmJlZm9yZUZpdCgpO1xuXHRcdG1lLmZpdCgpO1xuXHRcdG1lLmFmdGVyRml0KCk7XG5cdFx0Ly9cblx0XHRtZS5hZnRlclVwZGF0ZSgpO1xuXG5cdFx0cmV0dXJuIG1lLm1pblNpemU7XG5cblx0fSxcblx0YWZ0ZXJVcGRhdGU6IG5vb3AkMixcblxuXHQvL1xuXG5cdGJlZm9yZVNldERpbWVuc2lvbnM6IG5vb3AkMixcblx0c2V0RGltZW5zaW9uczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHQvLyBTZXQgdGhlIHVuY29uc3RyYWluZWQgZGltZW5zaW9uIGJlZm9yZSBsYWJlbCByb3RhdGlvblxuXHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0Ly8gUmVzZXQgcG9zaXRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIHJvdGF0aW9uXG5cdFx0XHRtZS53aWR0aCA9IG1lLm1heFdpZHRoO1xuXHRcdFx0bWUubGVmdCA9IDA7XG5cdFx0XHRtZS5yaWdodCA9IG1lLndpZHRoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZS5oZWlnaHQgPSBtZS5tYXhIZWlnaHQ7XG5cblx0XHRcdC8vIFJlc2V0IHBvc2l0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyByb3RhdGlvblxuXHRcdFx0bWUudG9wID0gMDtcblx0XHRcdG1lLmJvdHRvbSA9IG1lLmhlaWdodDtcblx0XHR9XG5cblx0XHQvLyBSZXNldCBwYWRkaW5nXG5cdFx0bWUucGFkZGluZ0xlZnQgPSAwO1xuXHRcdG1lLnBhZGRpbmdUb3AgPSAwO1xuXHRcdG1lLnBhZGRpbmdSaWdodCA9IDA7XG5cdFx0bWUucGFkZGluZ0JvdHRvbSA9IDA7XG5cblx0XHQvLyBSZXNldCBtaW5TaXplXG5cdFx0bWUubWluU2l6ZSA9IHtcblx0XHRcdHdpZHRoOiAwLFxuXHRcdFx0aGVpZ2h0OiAwXG5cdFx0fTtcblx0fSxcblx0YWZ0ZXJTZXREaW1lbnNpb25zOiBub29wJDIsXG5cblx0Ly9cblxuXHRiZWZvcmVCdWlsZExhYmVsczogbm9vcCQyLFxuXHRidWlsZExhYmVsczogbm9vcCQyLFxuXHRhZnRlckJ1aWxkTGFiZWxzOiBub29wJDIsXG5cblx0Ly9cblxuXHRiZWZvcmVGaXQ6IG5vb3AkMixcblx0Zml0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHR2YXIgZGlzcGxheSA9IG9wdHMuZGlzcGxheTtcblx0XHR2YXIgbWluU2l6ZSA9IG1lLm1pblNpemU7XG5cdFx0dmFyIGxpbmVDb3VudCA9IGhlbHBlcnMkMS5pc0FycmF5KG9wdHMudGV4dCkgPyBvcHRzLnRleHQubGVuZ3RoIDogMTtcblx0XHR2YXIgZm9udE9wdHMgPSBoZWxwZXJzJDEub3B0aW9ucy5fcGFyc2VGb250KG9wdHMpO1xuXHRcdHZhciB0ZXh0U2l6ZSA9IGRpc3BsYXkgPyAobGluZUNvdW50ICogZm9udE9wdHMubGluZUhlaWdodCkgKyAob3B0cy5wYWRkaW5nICogMikgOiAwO1xuXG5cdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHRtaW5TaXplLndpZHRoID0gbWUubWF4V2lkdGg7IC8vIGZpbGwgYWxsIHRoZSB3aWR0aFxuXHRcdFx0bWluU2l6ZS5oZWlnaHQgPSB0ZXh0U2l6ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWluU2l6ZS53aWR0aCA9IHRleHRTaXplO1xuXHRcdFx0bWluU2l6ZS5oZWlnaHQgPSBtZS5tYXhIZWlnaHQ7IC8vIGZpbGwgYWxsIHRoZSBoZWlnaHRcblx0XHR9XG5cblx0XHRtZS53aWR0aCA9IG1pblNpemUud2lkdGg7XG5cdFx0bWUuaGVpZ2h0ID0gbWluU2l6ZS5oZWlnaHQ7XG5cblx0fSxcblx0YWZ0ZXJGaXQ6IG5vb3AkMixcblxuXHQvLyBTaGFyZWQgTWV0aG9kc1xuXHRpc0hvcml6b250YWw6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBwb3MgPSB0aGlzLm9wdGlvbnMucG9zaXRpb247XG5cdFx0cmV0dXJuIHBvcyA9PT0gJ3RvcCcgfHwgcG9zID09PSAnYm90dG9tJztcblx0fSxcblxuXHQvLyBBY3R1YWxseSBkcmF3IHRoZSB0aXRsZSBibG9jayBvbiB0aGUgY2FudmFzXG5cdGRyYXc6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGN0eCA9IG1lLmN0eDtcblx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cblx0XHRpZiAob3B0cy5kaXNwbGF5KSB7XG5cdFx0XHR2YXIgZm9udE9wdHMgPSBoZWxwZXJzJDEub3B0aW9ucy5fcGFyc2VGb250KG9wdHMpO1xuXHRcdFx0dmFyIGxpbmVIZWlnaHQgPSBmb250T3B0cy5saW5lSGVpZ2h0O1xuXHRcdFx0dmFyIG9mZnNldCA9IGxpbmVIZWlnaHQgLyAyICsgb3B0cy5wYWRkaW5nO1xuXHRcdFx0dmFyIHJvdGF0aW9uID0gMDtcblx0XHRcdHZhciB0b3AgPSBtZS50b3A7XG5cdFx0XHR2YXIgbGVmdCA9IG1lLmxlZnQ7XG5cdFx0XHR2YXIgYm90dG9tID0gbWUuYm90dG9tO1xuXHRcdFx0dmFyIHJpZ2h0ID0gbWUucmlnaHQ7XG5cdFx0XHR2YXIgbWF4V2lkdGgsIHRpdGxlWCwgdGl0bGVZO1xuXG5cdFx0XHRjdHguZmlsbFN0eWxlID0gaGVscGVycyQxLnZhbHVlT3JEZWZhdWx0KG9wdHMuZm9udENvbG9yLCBjb3JlX2RlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Rm9udENvbG9yKTsgLy8gcmVuZGVyIGluIGNvcnJlY3QgY29sb3VyXG5cdFx0XHRjdHguZm9udCA9IGZvbnRPcHRzLnN0cmluZztcblxuXHRcdFx0Ly8gSG9yaXpvbnRhbFxuXHRcdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHRcdHRpdGxlWCA9IGxlZnQgKyAoKHJpZ2h0IC0gbGVmdCkgLyAyKTsgLy8gbWlkcG9pbnQgb2YgdGhlIHdpZHRoXG5cdFx0XHRcdHRpdGxlWSA9IHRvcCArIG9mZnNldDtcblx0XHRcdFx0bWF4V2lkdGggPSByaWdodCAtIGxlZnQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aXRsZVggPSBvcHRzLnBvc2l0aW9uID09PSAnbGVmdCcgPyBsZWZ0ICsgb2Zmc2V0IDogcmlnaHQgLSBvZmZzZXQ7XG5cdFx0XHRcdHRpdGxlWSA9IHRvcCArICgoYm90dG9tIC0gdG9wKSAvIDIpO1xuXHRcdFx0XHRtYXhXaWR0aCA9IGJvdHRvbSAtIHRvcDtcblx0XHRcdFx0cm90YXRpb24gPSBNYXRoLlBJICogKG9wdHMucG9zaXRpb24gPT09ICdsZWZ0JyA/IC0wLjUgOiAwLjUpO1xuXHRcdFx0fVxuXG5cdFx0XHRjdHguc2F2ZSgpO1xuXHRcdFx0Y3R4LnRyYW5zbGF0ZSh0aXRsZVgsIHRpdGxlWSk7XG5cdFx0XHRjdHgucm90YXRlKHJvdGF0aW9uKTtcblx0XHRcdGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJztcblx0XHRcdGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcblxuXHRcdFx0dmFyIHRleHQgPSBvcHRzLnRleHQ7XG5cdFx0XHRpZiAoaGVscGVycyQxLmlzQXJyYXkodGV4dCkpIHtcblx0XHRcdFx0dmFyIHkgPSAwO1xuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0XHRjdHguZmlsbFRleHQodGV4dFtpXSwgMCwgeSwgbWF4V2lkdGgpO1xuXHRcdFx0XHRcdHkgKz0gbGluZUhlaWdodDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3R4LmZpbGxUZXh0KHRleHQsIDAsIDAsIG1heFdpZHRoKTtcblx0XHRcdH1cblxuXHRcdFx0Y3R4LnJlc3RvcmUoKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVOZXdUaXRsZUJsb2NrQW5kQXR0YWNoKGNoYXJ0LCB0aXRsZU9wdHMpIHtcblx0dmFyIHRpdGxlID0gbmV3IFRpdGxlKHtcblx0XHRjdHg6IGNoYXJ0LmN0eCxcblx0XHRvcHRpb25zOiB0aXRsZU9wdHMsXG5cdFx0Y2hhcnQ6IGNoYXJ0XG5cdH0pO1xuXG5cdGNvcmVfbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlLCB0aXRsZU9wdHMpO1xuXHRjb3JlX2xheW91dHMuYWRkQm94KGNoYXJ0LCB0aXRsZSk7XG5cdGNoYXJ0LnRpdGxlQmxvY2sgPSB0aXRsZTtcbn1cblxudmFyIHBsdWdpbl90aXRsZSA9IHtcblx0aWQ6ICd0aXRsZScsXG5cblx0LyoqXG5cdCAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IHNpbmNlIDIuMS41LCB0aGUgdGl0bGUgaXMgcmVnaXN0ZXJlZCBhcyBhIHBsdWdpbiwgbWFraW5nXG5cdCAqIENoYXJ0LlRpdGxlIG9ic29sZXRlLiBUbyBhdm9pZCBhIGJyZWFraW5nIGNoYW5nZSwgd2UgZXhwb3J0IHRoZSBUaXRsZSBhcyBwYXJ0IG9mXG5cdCAqIHRoZSBwbHVnaW4sIHdoaWNoIG9uZSB3aWxsIGJlIHJlLWV4cG9zZWQgaW4gdGhlIGNoYXJ0LmpzIGZpbGUuXG5cdCAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvMjY0MFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2VsZW1lbnQ6IFRpdGxlLFxuXG5cdGJlZm9yZUluaXQ6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0dmFyIHRpdGxlT3B0cyA9IGNoYXJ0Lm9wdGlvbnMudGl0bGU7XG5cblx0XHRpZiAodGl0bGVPcHRzKSB7XG5cdFx0XHRjcmVhdGVOZXdUaXRsZUJsb2NrQW5kQXR0YWNoKGNoYXJ0LCB0aXRsZU9wdHMpO1xuXHRcdH1cblx0fSxcblxuXHRiZWZvcmVVcGRhdGU6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0dmFyIHRpdGxlT3B0cyA9IGNoYXJ0Lm9wdGlvbnMudGl0bGU7XG5cdFx0dmFyIHRpdGxlQmxvY2sgPSBjaGFydC50aXRsZUJsb2NrO1xuXG5cdFx0aWYgKHRpdGxlT3B0cykge1xuXHRcdFx0aGVscGVycyQxLm1lcmdlSWYodGl0bGVPcHRzLCBjb3JlX2RlZmF1bHRzLmdsb2JhbC50aXRsZSk7XG5cblx0XHRcdGlmICh0aXRsZUJsb2NrKSB7XG5cdFx0XHRcdGNvcmVfbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlQmxvY2ssIHRpdGxlT3B0cyk7XG5cdFx0XHRcdHRpdGxlQmxvY2sub3B0aW9ucyA9IHRpdGxlT3B0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZU5ld1RpdGxlQmxvY2tBbmRBdHRhY2goY2hhcnQsIHRpdGxlT3B0cyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0aXRsZUJsb2NrKSB7XG5cdFx0XHRjb3JlX2xheW91dHMucmVtb3ZlQm94KGNoYXJ0LCB0aXRsZUJsb2NrKTtcblx0XHRcdGRlbGV0ZSBjaGFydC50aXRsZUJsb2NrO1xuXHRcdH1cblx0fVxufTtcblxudmFyIHBsdWdpbnMgPSB7fTtcbnZhciBmaWxsZXIgPSBwbHVnaW5fZmlsbGVyO1xudmFyIGxlZ2VuZCA9IHBsdWdpbl9sZWdlbmQ7XG52YXIgdGl0bGUgPSBwbHVnaW5fdGl0bGU7XG5wbHVnaW5zLmZpbGxlciA9IGZpbGxlcjtcbnBsdWdpbnMubGVnZW5kID0gbGVnZW5kO1xucGx1Z2lucy50aXRsZSA9IHRpdGxlO1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgQ2hhcnRcbiAqL1xuXG5cbmNvcmVfY29udHJvbGxlci5oZWxwZXJzID0gaGVscGVycyQxO1xuXG4vLyBAdG9kbyBkaXNwYXRjaCB0aGVzZSBoZWxwZXJzIGludG8gYXBwcm9wcmlhdGVkIGhlbHBlcnMvaGVscGVycy4qIGZpbGUgYW5kIHdyaXRlIHVuaXQgdGVzdHMhXG5jb3JlX2hlbHBlcnMoY29yZV9jb250cm9sbGVyKTtcblxuY29yZV9jb250cm9sbGVyLl9hZGFwdGVycyA9IGNvcmVfYWRhcHRlcnM7XG5jb3JlX2NvbnRyb2xsZXIuQW5pbWF0aW9uID0gY29yZV9hbmltYXRpb247XG5jb3JlX2NvbnRyb2xsZXIuYW5pbWF0aW9uU2VydmljZSA9IGNvcmVfYW5pbWF0aW9ucztcbmNvcmVfY29udHJvbGxlci5jb250cm9sbGVycyA9IGNvbnRyb2xsZXJzO1xuY29yZV9jb250cm9sbGVyLkRhdGFzZXRDb250cm9sbGVyID0gY29yZV9kYXRhc2V0Q29udHJvbGxlcjtcbmNvcmVfY29udHJvbGxlci5kZWZhdWx0cyA9IGNvcmVfZGVmYXVsdHM7XG5jb3JlX2NvbnRyb2xsZXIuRWxlbWVudCA9IGNvcmVfZWxlbWVudDtcbmNvcmVfY29udHJvbGxlci5lbGVtZW50cyA9IGVsZW1lbnRzO1xuY29yZV9jb250cm9sbGVyLkludGVyYWN0aW9uID0gY29yZV9pbnRlcmFjdGlvbjtcbmNvcmVfY29udHJvbGxlci5sYXlvdXRzID0gY29yZV9sYXlvdXRzO1xuY29yZV9jb250cm9sbGVyLnBsYXRmb3JtID0gcGxhdGZvcm07XG5jb3JlX2NvbnRyb2xsZXIucGx1Z2lucyA9IGNvcmVfcGx1Z2lucztcbmNvcmVfY29udHJvbGxlci5TY2FsZSA9IGNvcmVfc2NhbGU7XG5jb3JlX2NvbnRyb2xsZXIuc2NhbGVTZXJ2aWNlID0gY29yZV9zY2FsZVNlcnZpY2U7XG5jb3JlX2NvbnRyb2xsZXIuVGlja3MgPSBjb3JlX3RpY2tzO1xuY29yZV9jb250cm9sbGVyLlRvb2x0aXAgPSBjb3JlX3Rvb2x0aXA7XG5cbi8vIFJlZ2lzdGVyIGJ1aWx0LWluIHNjYWxlc1xuXG5jb3JlX2NvbnRyb2xsZXIuaGVscGVycy5lYWNoKHNjYWxlcywgZnVuY3Rpb24oc2NhbGUsIHR5cGUpIHtcblx0Y29yZV9jb250cm9sbGVyLnNjYWxlU2VydmljZS5yZWdpc3RlclNjYWxlVHlwZSh0eXBlLCBzY2FsZSwgc2NhbGUuX2RlZmF1bHRzKTtcbn0pO1xuXG4vLyBMb2FkIHRvIHJlZ2lzdGVyIGJ1aWx0LWluIGFkYXB0ZXJzIChhcyBzaWRlIGVmZmVjdHMpXG5cblxuLy8gTG9hZGluZyBidWlsdC1pbiBwbHVnaW5zXG5cbmZvciAodmFyIGsgaW4gcGx1Z2lucykge1xuXHRpZiAocGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShrKSkge1xuXHRcdGNvcmVfY29udHJvbGxlci5wbHVnaW5zLnJlZ2lzdGVyKHBsdWdpbnNba10pO1xuXHR9XG59XG5cbmNvcmVfY29udHJvbGxlci5wbGF0Zm9ybS5pbml0aWFsaXplKCk7XG5cbnZhciBzcmMgPSBjb3JlX2NvbnRyb2xsZXI7XG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0d2luZG93LkNoYXJ0ID0gY29yZV9jb250cm9sbGVyO1xufVxuXG4vLyBERVBSRUNBVElPTlNcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgbm90IGF2YWlsYWJsZSBhbnltb3JlXG4gKiBAbmFtZXNwYWNlIENoYXJ0LkNoYXJ0XG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuOC4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5jb3JlX2NvbnRyb2xsZXIuQ2hhcnQgPSBjb3JlX2NvbnRyb2xsZXI7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIG5vdCBhdmFpbGFibGUgYW55bW9yZVxuICogQG5hbWVzcGFjZSBDaGFydC5MZWdlbmRcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4xLjVcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbmNvcmVfY29udHJvbGxlci5MZWdlbmQgPSBwbHVnaW5zLmxlZ2VuZC5fZWxlbWVudDtcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgbm90IGF2YWlsYWJsZSBhbnltb3JlXG4gKiBAbmFtZXNwYWNlIENoYXJ0LlRpdGxlXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuMS41XG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5jb3JlX2NvbnRyb2xsZXIuVGl0bGUgPSBwbHVnaW5zLnRpdGxlLl9lbGVtZW50O1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQucGx1Z2lucyBpbnN0ZWFkXG4gKiBAbmFtZXNwYWNlIENoYXJ0LnBsdWdpblNlcnZpY2VcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4xLjVcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbmNvcmVfY29udHJvbGxlci5wbHVnaW5TZXJ2aWNlID0gY29yZV9jb250cm9sbGVyLnBsdWdpbnM7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGluaGVyaXRpbmcgZnJvbSBDaGFydC5QbHVnaW5nQmFzZSBoYXMgbm9cbiAqIGVmZmVjdCwgaW5zdGVhZCBzaW1wbHkgY3JlYXRlL3JlZ2lzdGVyIHBsdWdpbnMgdmlhIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy5cbiAqIEBpbnRlcmZhY2UgQ2hhcnQuUGx1Z2luQmFzZVxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjUuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuY29yZV9jb250cm9sbGVyLlBsdWdpbkJhc2UgPSBjb3JlX2NvbnRyb2xsZXIuRWxlbWVudC5leHRlbmQoe30pO1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuaGVscGVycy5jYW52YXMgaW5zdGVhZC5cbiAqIEBuYW1lc3BhY2UgQ2hhcnQuY2FudmFzSGVscGVyc1xuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjYuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuY29yZV9jb250cm9sbGVyLmNhbnZhc0hlbHBlcnMgPSBjb3JlX2NvbnRyb2xsZXIuaGVscGVycy5jYW52YXM7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5sYXlvdXRzIGluc3RlYWQuXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmxheW91dFNlcnZpY2VcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi43LjNcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbmNvcmVfY29udHJvbGxlci5sYXlvdXRTZXJ2aWNlID0gY29yZV9jb250cm9sbGVyLmxheW91dHM7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIG5vdCBhdmFpbGFibGUgYW55bW9yZS5cbiAqIEBuYW1lc3BhY2UgQ2hhcnQuTGluZWFyU2NhbGVCYXNlXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuOFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuY29yZV9jb250cm9sbGVyLkxpbmVhclNjYWxlQmFzZSA9IHNjYWxlX2xpbmVhcmJhc2U7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGluc3RlYWQgd2Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBDaGFydFxuICogYnkgc2V0dGluZyB0aGUgdHlwZSBpbiB0aGUgY29uZmlnIChgbmV3IENoYXJ0KGlkLCB7dHlwZTogJ3tjaGFydC10eXBlfSd9YCkuXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuOC4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKi9cbmNvcmVfY29udHJvbGxlci5oZWxwZXJzLmVhY2goXG5cdFtcblx0XHQnQmFyJyxcblx0XHQnQnViYmxlJyxcblx0XHQnRG91Z2hudXQnLFxuXHRcdCdMaW5lJyxcblx0XHQnUG9sYXJBcmVhJyxcblx0XHQnUmFkYXInLFxuXHRcdCdTY2F0dGVyJ1xuXHRdLFxuXHRmdW5jdGlvbihrbGFzcykge1xuXHRcdGNvcmVfY29udHJvbGxlcltrbGFzc10gPSBmdW5jdGlvbihjdHgsIGNmZykge1xuXHRcdFx0cmV0dXJuIG5ldyBjb3JlX2NvbnRyb2xsZXIoY3R4LCBjb3JlX2NvbnRyb2xsZXIuaGVscGVycy5tZXJnZShjZmcgfHwge30sIHtcblx0XHRcdFx0dHlwZToga2xhc3MuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBrbGFzcy5zbGljZSgxKVxuXHRcdFx0fSkpO1xuXHRcdH07XG5cdH1cbik7XG5cbnJldHVybiBzcmM7XG5cbn0pKSk7XG4iXSwibmFtZXMiOlsiZ2xvYmFsIiwiZmFjdG9yeSIsImV4cG9ydHMiLCJfdHlwZW9mIiwibW9kdWxlIiwicmVxdWlyZSIsImUiLCJkZWZpbmUiLCJhbWQiLCJDaGFydCIsIm1vbWVudCIsImhhc093blByb3BlcnR5IiwiY29udmVyc2lvbnMiLCJyZ2IyaHNsIiwicmdiMmhzdiIsInJnYjJod2IiLCJyZ2IyY215ayIsInJnYjJrZXl3b3JkIiwicmdiMnh5eiIsInJnYjJsYWIiLCJyZ2IybGNoIiwiaHNsMnJnYiIsImhzbDJoc3YiLCJoc2wyaHdiIiwiaHNsMmNteWsiLCJoc2wya2V5d29yZCIsImhzdjJyZ2IiLCJoc3YyaHNsIiwiaHN2Mmh3YiIsImhzdjJjbXlrIiwiaHN2MmtleXdvcmQiLCJod2IycmdiIiwiaHdiMmhzbCIsImh3YjJoc3YiLCJod2IyY215ayIsImh3YjJrZXl3b3JkIiwiY215azJyZ2IiLCJjbXlrMmhzbCIsImNteWsyaHN2IiwiY215azJod2IiLCJjbXlrMmtleXdvcmQiLCJrZXl3b3JkMnJnYiIsImtleXdvcmQyaHNsIiwia2V5d29yZDJoc3YiLCJrZXl3b3JkMmh3YiIsImtleXdvcmQyY215ayIsImtleXdvcmQybGFiIiwia2V5d29yZDJ4eXoiLCJ4eXoycmdiIiwieHl6MmxhYiIsInh5ejJsY2giLCJsYWIyeHl6IiwibGFiMnJnYiIsImxhYjJsY2giLCJsY2gybGFiIiwibGNoMnh5eiIsImxjaDJyZ2IiLCJyZ2IiLCJyIiwiZyIsImIiLCJtaW4iLCJNYXRoIiwibWF4IiwiZGVsdGEiLCJoIiwicyIsImwiLCJ2IiwidyIsImMiLCJtIiwieSIsImsiLCJyZXZlcnNlS2V5d29yZHMiLCJKU09OIiwic3RyaW5naWZ5IiwicG93IiwieCIsInoiLCJ4eXoiLCJhIiwiYXJncyIsImhzbCIsInQxIiwidDIiLCJ0MyIsInZhbCIsImkiLCJzdiIsImhzdiIsImhpIiwiZmxvb3IiLCJmIiwicCIsInEiLCJ0Iiwic2wiLCJod2IiLCJ3aCIsImJsIiwicmF0aW8iLCJuIiwiY215ayIsImxhYiIsInkyIiwiaHIiLCJhdGFuMiIsIlBJIiwic3FydCIsImxjaCIsImNvcyIsInNpbiIsImtleXdvcmQiLCJjc3NLZXl3b3JkcyIsImFsaWNlYmx1ZSIsImFudGlxdWV3aGl0ZSIsImFxdWEiLCJhcXVhbWFyaW5lIiwiYXp1cmUiLCJiZWlnZSIsImJpc3F1ZSIsImJsYWNrIiwiYmxhbmNoZWRhbG1vbmQiLCJibHVlIiwiYmx1ZXZpb2xldCIsImJyb3duIiwiYnVybHl3b29kIiwiY2FkZXRibHVlIiwiY2hhcnRyZXVzZSIsImNob2NvbGF0ZSIsImNvcmFsIiwiY29ybmZsb3dlcmJsdWUiLCJjb3Juc2lsayIsImNyaW1zb24iLCJjeWFuIiwiZGFya2JsdWUiLCJkYXJrY3lhbiIsImRhcmtnb2xkZW5yb2QiLCJkYXJrZ3JheSIsImRhcmtncmVlbiIsImRhcmtncmV5IiwiZGFya2toYWtpIiwiZGFya21hZ2VudGEiLCJkYXJrb2xpdmVncmVlbiIsImRhcmtvcmFuZ2UiLCJkYXJrb3JjaGlkIiwiZGFya3JlZCIsImRhcmtzYWxtb24iLCJkYXJrc2VhZ3JlZW4iLCJkYXJrc2xhdGVibHVlIiwiZGFya3NsYXRlZ3JheSIsImRhcmtzbGF0ZWdyZXkiLCJkYXJrdHVycXVvaXNlIiwiZGFya3Zpb2xldCIsImRlZXBwaW5rIiwiZGVlcHNreWJsdWUiLCJkaW1ncmF5IiwiZGltZ3JleSIsImRvZGdlcmJsdWUiLCJmaXJlYnJpY2siLCJmbG9yYWx3aGl0ZSIsImZvcmVzdGdyZWVuIiwiZnVjaHNpYSIsImdhaW5zYm9ybyIsImdob3N0d2hpdGUiLCJnb2xkIiwiZ29sZGVucm9kIiwiZ3JheSIsImdyZWVuIiwiZ3JlZW55ZWxsb3ciLCJncmV5IiwiaG9uZXlkZXciLCJob3RwaW5rIiwiaW5kaWFucmVkIiwiaW5kaWdvIiwiaXZvcnkiLCJraGFraSIsImxhdmVuZGVyIiwibGF2ZW5kZXJibHVzaCIsImxhd25ncmVlbiIsImxlbW9uY2hpZmZvbiIsImxpZ2h0Ymx1ZSIsImxpZ2h0Y29yYWwiLCJsaWdodGN5YW4iLCJsaWdodGdvbGRlbnJvZHllbGxvdyIsImxpZ2h0Z3JheSIsImxpZ2h0Z3JlZW4iLCJsaWdodGdyZXkiLCJsaWdodHBpbmsiLCJsaWdodHNhbG1vbiIsImxpZ2h0c2VhZ3JlZW4iLCJsaWdodHNreWJsdWUiLCJsaWdodHNsYXRlZ3JheSIsImxpZ2h0c2xhdGVncmV5IiwibGlnaHRzdGVlbGJsdWUiLCJsaWdodHllbGxvdyIsImxpbWUiLCJsaW1lZ3JlZW4iLCJsaW5lbiIsIm1hZ2VudGEiLCJtYXJvb24iLCJtZWRpdW1hcXVhbWFyaW5lIiwibWVkaXVtYmx1ZSIsIm1lZGl1bW9yY2hpZCIsIm1lZGl1bXB1cnBsZSIsIm1lZGl1bXNlYWdyZWVuIiwibWVkaXVtc2xhdGVibHVlIiwibWVkaXVtc3ByaW5nZ3JlZW4iLCJtZWRpdW10dXJxdW9pc2UiLCJtZWRpdW12aW9sZXRyZWQiLCJtaWRuaWdodGJsdWUiLCJtaW50Y3JlYW0iLCJtaXN0eXJvc2UiLCJtb2NjYXNpbiIsIm5hdmFqb3doaXRlIiwibmF2eSIsIm9sZGxhY2UiLCJvbGl2ZSIsIm9saXZlZHJhYiIsIm9yYW5nZSIsIm9yYW5nZXJlZCIsIm9yY2hpZCIsInBhbGVnb2xkZW5yb2QiLCJwYWxlZ3JlZW4iLCJwYWxldHVycXVvaXNlIiwicGFsZXZpb2xldHJlZCIsInBhcGF5YXdoaXAiLCJwZWFjaHB1ZmYiLCJwZXJ1IiwicGluayIsInBsdW0iLCJwb3dkZXJibHVlIiwicHVycGxlIiwicmViZWNjYXB1cnBsZSIsInJlZCIsInJvc3licm93biIsInJveWFsYmx1ZSIsInNhZGRsZWJyb3duIiwic2FsbW9uIiwic2FuZHlicm93biIsInNlYWdyZWVuIiwic2Vhc2hlbGwiLCJzaWVubmEiLCJzaWx2ZXIiLCJza3libHVlIiwic2xhdGVibHVlIiwic2xhdGVncmF5Iiwic2xhdGVncmV5Iiwic25vdyIsInNwcmluZ2dyZWVuIiwic3RlZWxibHVlIiwidGFuIiwidGVhbCIsInRoaXN0bGUiLCJ0b21hdG8iLCJ0dXJxdW9pc2UiLCJ2aW9sZXQiLCJ3aGVhdCIsIndoaXRlIiwid2hpdGVzbW9rZSIsInllbGxvdyIsInllbGxvd2dyZWVuIiwia2V5IiwiY29udmVydCIsIkNvbnZlcnRlciIsImZ1bmMiLCJhcmciLCJBcnJheSIsInByb3RvdHlwZSIsInNsaWNlIiwiY2FsbCIsImFyZ3VtZW50cyIsInBhaXIiLCJleGVjIiwiZnJvbSIsInRvIiwidW5kZWZpbmVkIiwibGVuZ3RoIiwicm91bmQiLCJjb252cyIsInJvdXRlU3BhY2UiLCJzcGFjZSIsInZhbHVlcyIsImdldFZhbHVlcyIsInNldFZhbHVlcyIsInZhbHMiLCJmc3BhY2UiLCJmb3JFYWNoIiwiY29sb3JDb252ZXJ0IiwiY29sb3JOYW1lIiwiY29sb3JTdHJpbmciLCJnZXRSZ2JhIiwiZ2V0SHNsYSIsImdldFJnYiIsImdldEhzbCIsImdldEh3YiIsImdldEFscGhhIiwiaGV4U3RyaW5nIiwicmdiU3RyaW5nIiwicmdiYVN0cmluZyIsInBlcmNlbnRTdHJpbmciLCJwZXJjZW50YVN0cmluZyIsImhzbFN0cmluZyIsImhzbGFTdHJpbmciLCJod2JTdHJpbmciLCJzdHJpbmciLCJhYmJyIiwiaGV4IiwicmdiYSIsInBlciIsIm1hdGNoIiwiaGV4QWxwaGEiLCJwYXJzZUludCIsInBhcnNlRmxvYXQiLCJzY2FsZSIsImFscGhhIiwiaXNOYU4iLCJoc2xhIiwiaGV4RG91YmxlIiwicmV2ZXJzZU5hbWVzIiwibnVtIiwic3RyIiwidG9TdHJpbmciLCJ0b1VwcGVyQ2FzZSIsIm5hbWUiLCJDb2xvciIsIm9iaiIsInZhbGlkIiwibGlnaHRuZXNzIiwidmFsdWUiLCJ3aGl0ZW5lc3MiLCJpc1ZhbGlkIiwic2V0U3BhY2UiLCJyZ2JBcnJheSIsImhzbEFycmF5IiwiaHN2QXJyYXkiLCJod2JBcnJheSIsImNvbmNhdCIsImNteWtBcnJheSIsInJnYmFBcnJheSIsImhzbGFBcnJheSIsInNldENoYW5uZWwiLCJodWUiLCJzYXR1cmF0aW9uIiwic2F0dXJhdGlvbnYiLCJibGFja25lc3MiLCJyZ2JOdW1iZXIiLCJsdW1pbm9zaXR5IiwibHVtIiwiY2hhbiIsImNvbnRyYXN0IiwiY29sb3IyIiwibHVtMSIsImx1bTIiLCJsZXZlbCIsImNvbnRyYXN0UmF0aW8iLCJkYXJrIiwieWlxIiwibGlnaHQiLCJuZWdhdGUiLCJsaWdodGVuIiwiZGFya2VuIiwic2F0dXJhdGUiLCJkZXNhdHVyYXRlIiwid2hpdGVuIiwiYmxhY2tlbiIsImdyZXlzY2FsZSIsImNsZWFyZXIiLCJvcGFxdWVyIiwicm90YXRlIiwiZGVncmVlcyIsIm1peCIsIm1peGluQ29sb3IiLCJ3ZWlnaHQiLCJjb2xvcjEiLCJ3MSIsIncyIiwidG9KU09OIiwiY2xvbmUiLCJyZXN1bHQiLCJzb3VyY2UiLCJ0YXJnZXQiLCJ0eXBlIiwicHJvcCIsImNvbnNvbGUiLCJlcnJvciIsInNwYWNlcyIsIm1heGVzIiwiY2hhckF0IiwiY2hhbnMiLCJjYXBwZWQiLCJzbmFtZSIsImluZGV4Iiwic3ZhbHVlcyIsIndpbmRvdyIsImNoYXJ0anNDb2xvciIsImhlbHBlcnMiLCJub29wIiwidWlkIiwiaWQiLCJpc051bGxPclVuZGVmIiwiaXNBcnJheSIsIk9iamVjdCIsInN1YnN0ciIsImlzT2JqZWN0IiwiaXNGaW5pdGUiLCJfaXNGaW5pdGUiLCJfeCIsImFwcGx5IiwiTnVtYmVyIiwidmFsdWVPckRlZmF1bHQiLCJkZWZhdWx0VmFsdWUiLCJ2YWx1ZUF0SW5kZXhPckRlZmF1bHQiLCJjYWxsYmFjayIsImZuIiwidGhpc0FyZyIsImVhY2giLCJsb29wYWJsZSIsInJldmVyc2UiLCJsZW4iLCJrZXlzIiwiYXJyYXlFcXVhbHMiLCJhMCIsImExIiwiaWxlbiIsInYwIiwidjEiLCJtYXAiLCJrbGVuIiwiX21lcmdlciIsIm9wdGlvbnMiLCJ0dmFsIiwic3ZhbCIsIm1lcmdlIiwiX21lcmdlcklmIiwibWVyZ2VJZiIsInNvdXJjZXMiLCJtZXJnZXIiLCJleHRlbmQiLCJzZXRGbiIsImluaGVyaXRzIiwiZXh0ZW5zaW9ucyIsIm1lIiwiQ2hhcnRFbGVtZW50IiwiY29uc3RydWN0b3IiLCJTdXJyb2dhdGUiLCJfX3N1cGVyX18iLCJoZWxwZXJzX2NvcmUiLCJjYWxsQ2FsbGJhY2siLCJpbmRleE9mIiwiYXJyYXkiLCJpdGVtIiwiZnJvbUluZGV4IiwiZ2V0VmFsdWVPckRlZmF1bHQiLCJnZXRWYWx1ZUF0SW5kZXhPckRlZmF1bHQiLCJlZmZlY3RzIiwibGluZWFyIiwiZWFzZUluUXVhZCIsImVhc2VPdXRRdWFkIiwiZWFzZUluT3V0UXVhZCIsImVhc2VJbkN1YmljIiwiZWFzZU91dEN1YmljIiwiZWFzZUluT3V0Q3ViaWMiLCJlYXNlSW5RdWFydCIsImVhc2VPdXRRdWFydCIsImVhc2VJbk91dFF1YXJ0IiwiZWFzZUluUXVpbnQiLCJlYXNlT3V0UXVpbnQiLCJlYXNlSW5PdXRRdWludCIsImVhc2VJblNpbmUiLCJlYXNlT3V0U2luZSIsImVhc2VJbk91dFNpbmUiLCJlYXNlSW5FeHBvIiwiZWFzZU91dEV4cG8iLCJlYXNlSW5PdXRFeHBvIiwiZWFzZUluQ2lyYyIsImVhc2VPdXRDaXJjIiwiZWFzZUluT3V0Q2lyYyIsImVhc2VJbkVsYXN0aWMiLCJhc2luIiwiZWFzZU91dEVsYXN0aWMiLCJlYXNlSW5PdXRFbGFzdGljIiwiZWFzZUluQmFjayIsImVhc2VPdXRCYWNrIiwiZWFzZUluT3V0QmFjayIsImVhc2VJbkJvdW5jZSIsImVhc2VPdXRCb3VuY2UiLCJlYXNlSW5PdXRCb3VuY2UiLCJoZWxwZXJzX2Vhc2luZyIsImVhc2luZ0VmZmVjdHMiLCJSQURfUEVSX0RFRyIsIkRPVUJMRV9QSSIsIkhBTEZfUEkiLCJRVUFSVEVSX1BJIiwiVFdPX1RISVJEU19QSSIsImV4cG9ydHMkMSIsImNsZWFyIiwiY2hhcnQiLCJjdHgiLCJjbGVhclJlY3QiLCJ3aWR0aCIsImhlaWdodCIsInJvdW5kZWRSZWN0IiwicmFkaXVzIiwibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibW92ZVRvIiwiYXJjIiwiY2xvc2VQYXRoIiwicmVjdCIsImRyYXdQb2ludCIsInN0eWxlIiwicm90YXRpb24iLCJ4T2Zmc2V0IiwieU9mZnNldCIsInNpemUiLCJjb3JuZXJSYWRpdXMiLCJyYWQiLCJkcmF3SW1hZ2UiLCJiZWdpblBhdGgiLCJsaW5lVG8iLCJTUVJUMV8yIiwiZmlsbCIsInN0cm9rZSIsIl9pc1BvaW50SW5BcmVhIiwicG9pbnQiLCJhcmVhIiwiZXBzaWxvbiIsImNsaXBBcmVhIiwic2F2ZSIsImNsaXAiLCJ1bmNsaXBBcmVhIiwicmVzdG9yZSIsInByZXZpb3VzIiwiZmxpcCIsInN0ZXBwZWQiLCJzdGVwcGVkTGluZSIsIm1pZHBvaW50IiwidGVuc2lvbiIsImJlemllckN1cnZlVG8iLCJjb250cm9sUG9pbnRQcmV2aW91c1giLCJjb250cm9sUG9pbnROZXh0WCIsImNvbnRyb2xQb2ludFByZXZpb3VzWSIsImNvbnRyb2xQb2ludE5leHRZIiwiaGVscGVyc19jYW52YXMiLCJkcmF3Um91bmRlZFJlY3RhbmdsZSIsImRlZmF1bHRzIiwiX3NldCIsInNjb3BlIiwiZGVmYXVsdENvbG9yIiwiZGVmYXVsdEZvbnRDb2xvciIsImRlZmF1bHRGb250RmFtaWx5IiwiZGVmYXVsdEZvbnRTaXplIiwiZGVmYXVsdEZvbnRTdHlsZSIsImRlZmF1bHRMaW5lSGVpZ2h0Iiwic2hvd0xpbmVzIiwiY29yZV9kZWZhdWx0cyIsInRvRm9udFN0cmluZyIsImZvbnQiLCJmYW1pbHkiLCJoZWxwZXJzX29wdGlvbnMiLCJ0b0xpbmVIZWlnaHQiLCJtYXRjaGVzIiwidG9QYWRkaW5nIiwiX3BhcnNlRm9udCIsImdsb2JhbERlZmF1bHRzIiwiZm9udFNpemUiLCJmb250RmFtaWx5IiwibGluZUhlaWdodCIsImZvbnRTdHlsZSIsInJlc29sdmUiLCJpbnB1dHMiLCJjb250ZXh0IiwiaGVscGVycyQxIiwiZWFzaW5nIiwiY2FudmFzIiwiaW50ZXJwb2xhdGUiLCJzdGFydCIsInZpZXciLCJtb2RlbCIsImVhc2UiLCJhY3R1YWwiLCJvcmlnaW4iLCJjMCIsImMxIiwiRWxlbWVudCIsImNvbmZpZ3VyYXRpb24iLCJpbml0aWFsaXplIiwiaGlkZGVuIiwicGl2b3QiLCJfdmlldyIsIl9tb2RlbCIsIl9zdGFydCIsInRyYW5zaXRpb24iLCJ0b29sdGlwUG9zaXRpb24iLCJoYXNWYWx1ZSIsImlzTnVtYmVyIiwiY29yZV9lbGVtZW50IiwiZXhwb3J0cyQyIiwiY3VycmVudFN0ZXAiLCJudW1TdGVwcyIsInJlbmRlciIsIm9uQW5pbWF0aW9uUHJvZ3Jlc3MiLCJvbkFuaW1hdGlvbkNvbXBsZXRlIiwiY29yZV9hbmltYXRpb24iLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsInNldCIsImFuaW1hdGlvbiIsImR1cmF0aW9uIiwib25Qcm9ncmVzcyIsIm9uQ29tcGxldGUiLCJjb3JlX2FuaW1hdGlvbnMiLCJhbmltYXRpb25zIiwicmVxdWVzdCIsImFkZEFuaW1hdGlvbiIsImxhenkiLCJzdGFydFRpbWUiLCJEYXRlIiwibm93IiwiYW5pbWF0aW5nIiwicHVzaCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNhbmNlbEFuaW1hdGlvbiIsImZpbmRJbmRleCIsInNwbGljZSIsInJlcXVlc3RBbmltRnJhbWUiLCJzdGFydERpZ2VzdCIsImFkdmFuY2UiLCJuZXh0U3RlcCIsImFycmF5RXZlbnRzIiwibGlzdGVuQXJyYXlFdmVudHMiLCJsaXN0ZW5lciIsIl9jaGFydGpzIiwibGlzdGVuZXJzIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIm1ldGhvZCIsImJhc2UiLCJyZXMiLCJvYmplY3QiLCJ1bmxpc3RlbkFycmF5RXZlbnRzIiwic3R1YiIsIkRhdGFzZXRDb250cm9sbGVyIiwiZGF0YXNldEluZGV4IiwiZGF0YXNldEVsZW1lbnRUeXBlIiwiZGF0YUVsZW1lbnRUeXBlIiwibGlua1NjYWxlcyIsImFkZEVsZW1lbnRzIiwidXBkYXRlSW5kZXgiLCJtZXRhIiwiZ2V0TWV0YSIsImRhdGFzZXQiLCJnZXREYXRhc2V0IiwieEF4aXNJRCIsInNjYWxlcyIsInhBeGVzIiwieUF4aXNJRCIsInlBeGVzIiwiZGF0YSIsImRhdGFzZXRzIiwiZ2V0RGF0YXNldE1ldGEiLCJnZXRTY2FsZUZvcklkIiwic2NhbGVJRCIsIl9nZXRWYWx1ZVNjYWxlSWQiLCJfZ2V0SW5kZXhTY2FsZUlkIiwiX2dldFZhbHVlU2NhbGUiLCJfZ2V0SW5kZXhTY2FsZSIsInJlc2V0IiwidXBkYXRlIiwiZGVzdHJveSIsIl9kYXRhIiwiY3JlYXRlTWV0YURhdGFzZXQiLCJfY2hhcnQiLCJfZGF0YXNldEluZGV4IiwiY3JlYXRlTWV0YURhdGEiLCJfaW5kZXgiLCJtZXRhRGF0YSIsImFkZEVsZW1lbnRBbmRSZXNldCIsImVsZW1lbnQiLCJ1cGRhdGVFbGVtZW50IiwiYnVpbGRPclVwZGF0ZUVsZW1lbnRzIiwiaXNFeHRlbnNpYmxlIiwicmVzeW5jRWxlbWVudHMiLCJlYXNpbmdWYWx1ZSIsImVsZW1lbnRzIiwiZHJhdyIsInJlbW92ZUhvdmVyU3R5bGUiLCIkcHJldmlvdXNTdHlsZSIsInNldEhvdmVyU3R5bGUiLCJjdXN0b20iLCJnZXRIb3ZlckNvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJXaWR0aCIsImhvdmVyQmFja2dyb3VuZENvbG9yIiwiaG92ZXJCb3JkZXJDb2xvciIsImhvdmVyQm9yZGVyV2lkdGgiLCJudW1NZXRhIiwibnVtRGF0YSIsImluc2VydEVsZW1lbnRzIiwiY291bnQiLCJvbkRhdGFQdXNoIiwib25EYXRhUG9wIiwicG9wIiwib25EYXRhU2hpZnQiLCJzaGlmdCIsIm9uRGF0YVNwbGljZSIsIm9uRGF0YVVuc2hpZnQiLCJjb3JlX2RhdGFzZXRDb250cm9sbGVyIiwiYm9yZGVyQWxpZ24iLCJlbGVtZW50X2FyYyIsImluTGFiZWxSYW5nZSIsIm1vdXNlWCIsInZtIiwiaG92ZXJSYWRpdXMiLCJpblJhbmdlIiwiY2hhcnRYIiwiY2hhcnRZIiwicG9pbnRSZWxhdGl2ZVBvc2l0aW9uIiwiZ2V0QW5nbGVGcm9tUG9pbnQiLCJhbmdsZSIsImRpc3RhbmNlIiwic3RhcnRBbmdsZSIsImVuZEFuZ2xlIiwiYmV0d2VlbkFuZ2xlcyIsIndpdGhpblJhZGl1cyIsImlubmVyUmFkaXVzIiwib3V0ZXJSYWRpdXMiLCJnZXRDZW50ZXJQb2ludCIsImhhbGZBbmdsZSIsImhhbGZSYWRpdXMiLCJnZXRBcmVhIiwiY2VudHJlQW5nbGUiLCJyYW5nZUZyb21DZW50cmUiLCJzQSIsImVBIiwicGl4ZWxNYXJnaW4iLCJhbmdsZU1hcmdpbiIsImZpbGxTdHlsZSIsImxpbmVXaWR0aCIsImxpbmVKb2luIiwic3Ryb2tlU3R5bGUiLCJ2YWx1ZU9yRGVmYXVsdCQxIiwibGluZSIsImJvcmRlckNhcFN0eWxlIiwiYm9yZGVyRGFzaCIsImJvcmRlckRhc2hPZmZzZXQiLCJib3JkZXJKb2luU3R5bGUiLCJjYXBCZXppZXJQb2ludHMiLCJlbGVtZW50X2xpbmUiLCJzcGFuR2FwcyIsInBvaW50cyIsIl9jaGlsZHJlbiIsImdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cyIsImxhc3REcmF3bkluZGV4IiwiY3VycmVudCIsImN1cnJlbnRWTSIsIl9sb29wIiwibGluZUNhcCIsInNldExpbmVEYXNoIiwibGluZURhc2hPZmZzZXQiLCJwcmV2aW91c0l0ZW0iLCJza2lwIiwidmFsdWVPckRlZmF1bHQkMiIsImRlZmF1bHRDb2xvciQxIiwicG9pbnRTdHlsZSIsImhpdFJhZGl1cyIsInhSYW5nZSIsImFicyIsInlSYW5nZSIsIm1vdXNlWSIsImVsZW1lbnRfcG9pbnQiLCJpblhSYW5nZSIsImluWVJhbmdlIiwicGFkZGluZyIsImNoYXJ0QXJlYSIsImRlZmF1bHRDb2xvciQyIiwicmVjdGFuZ2xlIiwiYm9yZGVyU2tpcHBlZCIsImlzVmVydGljYWwiLCJnZXRCYXJCb3VuZHMiLCJ4MSIsIngyIiwieTEiLCJoYWxmIiwic3dhcCIsIm9yaWciLCJ2MiIsInBhcnNlQm9yZGVyU2tpcHBlZCIsImVkZ2UiLCJob3Jpem9udGFsIiwicGFyc2VCb3JkZXJXaWR0aCIsIm1heFciLCJtYXhIIiwiYm91bmRpbmdSZWN0cyIsImJvdW5kcyIsImJvcmRlciIsIm91dGVyIiwiaW5uZXIiLCJza2lwWCIsInNraXBZIiwiZWxlbWVudF9yZWN0YW5nbGUiLCJyZWN0cyIsImZpbGxSZWN0IiwiQXJjIiwiTGluZSIsIlBvaW50IiwiUmVjdGFuZ2xlIiwicmVzb2x2ZSQxIiwiaG92ZXIiLCJtb2RlIiwiY2F0ZWdvcnlQZXJjZW50YWdlIiwiYmFyUGVyY2VudGFnZSIsIm9mZnNldCIsImdyaWRMaW5lcyIsIm9mZnNldEdyaWRMaW5lcyIsImNvbXB1dGVNaW5TYW1wbGVTaXplIiwicGl4ZWxzIiwiaXNIb3Jpem9udGFsIiwidGlja3MiLCJnZXRUaWNrcyIsInByZXYiLCJjdXJyIiwiZ2V0UGl4ZWxGb3JUaWNrIiwiY29tcHV0ZUZpdENhdGVnb3J5VHJhaXRzIiwicnVsZXIiLCJ0aGlja25lc3MiLCJiYXJUaGlja25lc3MiLCJzdGFja0NvdW50IiwiY2h1bmsiLCJjb21wdXRlRmxleENhdGVnb3J5VHJhaXRzIiwibmV4dCIsInBlcmNlbnQiLCJlbmQiLCJjb250cm9sbGVyX2JhciIsInN0YWNrIiwiYmFyIiwiX3J1bGVyIiwiZ2V0UnVsZXIiLCJfcmVzb2x2ZUVsZW1lbnRPcHRpb25zIiwiX3hTY2FsZSIsIl95U2NhbGUiLCJkYXRhc2V0TGFiZWwiLCJsYWJlbCIsImxhYmVscyIsIl91cGRhdGVFbGVtZW50R2VvbWV0cnkiLCJ2c2NhbGUiLCJnZXRCYXNlUGl4ZWwiLCJ2cGl4ZWxzIiwiY2FsY3VsYXRlQmFyVmFsdWVQaXhlbHMiLCJpcGl4ZWxzIiwiY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMiLCJoZWFkIiwiY2VudGVyIiwiX2dldFN0YWNrcyIsImxhc3QiLCJzdGFja2VkIiwic3RhY2tzIiwiaXNEYXRhc2V0VmlzaWJsZSIsImdldFN0YWNrQ291bnQiLCJnZXRTdGFja0luZGV4IiwiZ2V0UGl4ZWxGb3JWYWx1ZSIsImdldFJpZ2h0VmFsdWUiLCJtaW5CYXJMZW5ndGgiLCJpbWV0YSIsIml2YWx1ZSIsImNvbnRyb2xsZXIiLCJyYW5nZSIsInN0YWNrSW5kZXgiLCJtYXhCYXJUaGlja25lc3MiLCJJbmZpbml0eSIsImRhdGFJbmRleCIsInZhbHVlT3JEZWZhdWx0JDMiLCJyZXNvbHZlJDIiLCJwb3NpdGlvbiIsInRvb2x0aXBzIiwiY2FsbGJhY2tzIiwidGl0bGUiLCJkYXRhUG9pbnQiLCJ4TGFiZWwiLCJ5TGFiZWwiLCJjb250cm9sbGVyX2J1YmJsZSIsInhTY2FsZSIsInlTY2FsZSIsImRzSW5kZXgiLCJnZXRQaXhlbEZvckRlY2ltYWwiLCJOYU4iLCJfb3B0aW9ucyIsInJlc29sdmUkMyIsInZhbHVlT3JEZWZhdWx0JDQiLCJhbmltYXRlUm90YXRlIiwiYW5pbWF0ZVNjYWxlIiwibGVnZW5kQ2FsbGJhY2siLCJ0ZXh0Iiwiam9pbiIsImxlZ2VuZCIsImdlbmVyYXRlTGFiZWxzIiwiZHMiLCJhcmNPcHRzIiwiYnciLCJvbkNsaWNrIiwibGVnZW5kSXRlbSIsImN1dG91dFBlcmNlbnRhZ2UiLCJjaXJjdW1mZXJlbmNlIiwidG9vbHRpcEl0ZW0iLCJkYXRhTGFiZWwiLCJjb250cm9sbGVyX2RvdWdobnV0IiwiZ2V0UmluZ0luZGV4IiwicmluZ0luZGV4IiwiaiIsIm9wdHMiLCJhdmFpbGFibGVXaWR0aCIsImF2YWlsYWJsZUhlaWdodCIsIm1pblNpemUiLCJhcmNzIiwiY2hhcnRXZWlnaHQiLCJfZ2V0UmluZ1dlaWdodCIsImNvbnRhaW5zMCIsImNvbnRhaW5zOTAiLCJjb250YWluczE4MCIsImNvbnRhaW5zMjcwIiwiY3V0b3V0IiwiZ2V0TWF4Qm9yZGVyV2lkdGgiLCJyYWRpdXNMZW5ndGgiLCJfZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCIsIm9mZnNldFgiLCJvZmZzZXRZIiwidG90YWwiLCJjYWxjdWxhdGVUb3RhbCIsIl9nZXRSaW5nV2VpZ2h0T2Zmc2V0IiwiYW5pbWF0aW9uT3B0cyIsImNlbnRlclgiLCJjZW50ZXJZIiwiY2FsY3VsYXRlQ2lyY3VtZmVyZW5jZSIsImhvdmVyV2lkdGgiLCJyaW5nV2VpZ2h0T2Zmc2V0IiwiZGF0YVNldEluZGV4IiwiYXhpcyIsImNvbnRyb2xsZXJfaG9yaXpvbnRhbEJhciIsInZhbHVlT3JEZWZhdWx0JDUiLCJyZXNvbHZlJDQiLCJpc1BvaW50SW5BcmVhIiwibGluZUVuYWJsZWQiLCJzaG93TGluZSIsImNvbnRyb2xsZXJfbGluZSIsImxpbmVUZW5zaW9uIiwiX3NjYWxlIiwiX3Jlc29sdmVMaW5lT3B0aW9ucyIsInVwZGF0ZUJlemllckNvbnRyb2xQb2ludHMiLCJsaW5lTW9kZWwiLCJfcmVzb2x2ZVBvaW50T3B0aW9ucyIsImNhbGN1bGF0ZVBvaW50WSIsIkVMRU1FTlRfT1BUSU9OUyIsImVsZW1lbnRPcHRpb25zIiwic3VtUG9zIiwic3VtTmVnIiwiZHNNZXRhIiwic3RhY2tlZFJpZ2h0VmFsdWUiLCJyaWdodFZhbHVlIiwiY29udHJvbFBvaW50cyIsImZpbHRlciIsInB0IiwiY2FwQ29udHJvbFBvaW50IiwiY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSIsInNwbGluZUN1cnZlTW9ub3RvbmUiLCJzcGxpbmVDdXJ2ZSIsIm5leHRJdGVtIiwiaGFsZkJvcmRlcldpZHRoIiwicmVzb2x2ZSQ1IiwiYW5nbGVMaW5lcyIsImRpc3BsYXkiLCJjaXJjdWxhciIsInBvaW50TGFiZWxzIiwiYmVnaW5BdFplcm8iLCJjb250cm9sbGVyX3BvbGFyQXJlYSIsInN0YXJ0cyIsIl9zdGFydHMiLCJhbmdsZXMiLCJfYW5nbGVzIiwiX3VwZGF0ZVJhZGl1cyIsImNvdW50VmlzaWJsZUVsZW1lbnRzIiwiX2NvbXB1dGVBbmdsZSIsImdldFZpc2libGVEYXRhc2V0Q291bnQiLCJ4Q2VudGVyIiwieUNlbnRlciIsImRhdGFzZXRTdGFydEFuZ2xlIiwiZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUiLCJyZXNldFJhZGl1cyIsImRvdWdobnV0IiwiY29udHJvbGxlcl9waWUiLCJ2YWx1ZU9yRGVmYXVsdCQ2IiwicmVzb2x2ZSQ2IiwiY29udHJvbGxlcl9yYWRhciIsInBvaW50UG9zaXRpb24iLCJnZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUiLCJjb250cm9sbGVyX3NjYXR0ZXIiLCJjb250cm9sbGVycyIsImJ1YmJsZSIsImhvcml6b250YWxCYXIiLCJwb2xhckFyZWEiLCJwaWUiLCJyYWRhciIsInNjYXR0ZXIiLCJnZXRSZWxhdGl2ZVBvc2l0aW9uIiwicGFyc2VWaXNpYmxlSXRlbXMiLCJoYW5kbGVyIiwiamxlbiIsImdldEludGVyc2VjdEl0ZW1zIiwiZ2V0TmVhcmVzdEl0ZW1zIiwiaW50ZXJzZWN0IiwiZGlzdGFuY2VNZXRyaWMiLCJtaW5EaXN0YW5jZSIsIlBPU0lUSVZFX0lORklOSVRZIiwibmVhcmVzdEl0ZW1zIiwiZ2V0RGlzdGFuY2VNZXRyaWNGb3JBeGlzIiwidXNlWCIsInVzZVkiLCJwdDEiLCJwdDIiLCJkZWx0YVgiLCJkZWx0YVkiLCJpbmRleE1vZGUiLCJpdGVtcyIsImNvcmVfaW50ZXJhY3Rpb24iLCJtb2RlcyIsInNpbmdsZSIsInhBeGlzIiwibmVhcmVzdCIsImludGVyc2VjdHNJdGVtIiwiZmlsdGVyQnlQb3NpdGlvbiIsIndoZXJlIiwic29ydEJ5V2VpZ2h0IiwiX3RtcEluZGV4XyIsInNvcnQiLCJmaW5kTWF4UGFkZGluZyIsImJveGVzIiwiYm94IiwiZ2V0UGFkZGluZyIsImJveFBhZGRpbmciLCJhZGRTaXplQnlQb3NpdGlvbiIsImxheW91dCIsImNvcmVfbGF5b3V0cyIsImFkZEJveCIsImZ1bGxXaWR0aCIsInJlbW92ZUJveCIsImxheW91dEl0ZW0iLCJjb25maWd1cmUiLCJwcm9wcyIsImxheW91dE9wdGlvbnMiLCJsZWZ0UGFkZGluZyIsInJpZ2h0UGFkZGluZyIsInRvcFBhZGRpbmciLCJib3R0b21QYWRkaW5nIiwibGVmdEJveGVzIiwicmlnaHRCb3hlcyIsInRvcEJveGVzIiwiYm90dG9tQm94ZXMiLCJjaGFydEFyZWFCb3hlcyIsInZlcnRpY2FsQm94ZXMiLCJob3Jpem9udGFsQm94ZXMiLCJvdXRlckJveGVzIiwiY2hhcnRXaWR0aCIsImNoYXJ0SGVpZ2h0IiwiY2hhcnRBcmVhV2lkdGgiLCJ2ZXJ0aWNhbEJveFdpZHRoIiwibWF4Q2hhcnRBcmVhV2lkdGgiLCJtYXhDaGFydEFyZWFIZWlnaHQiLCJvdXRlckJveFNpemVzIiwibWluQm94U2l6ZXMiLCJtYXhQYWRkaW5nIiwiZ2V0TWluaW11bUJveFNpemUiLCJmaXRCb3giLCJtaW5Cb3hTaXplIiwiZmluZE5leHRXaGVyZSIsIm1pbkJveCIsInNjYWxlTWFyZ2luIiwiZmluYWxGaXRWZXJ0aWNhbEJveCIsImxlZnRQYWRkaW5nQWRkaXRpb24iLCJ0b3BQYWRkaW5nQWRkaXRpb24iLCJuZXdNYXhDaGFydEFyZWFIZWlnaHQiLCJuZXdNYXhDaGFydEFyZWFXaWR0aCIsInBsYWNlQm94IiwicGxhdGZvcm1fYmFzaWMiLCJhY3F1aXJlQ29udGV4dCIsImdldENvbnRleHQiLCJwbGF0Zm9ybV9kb20iLCJwbGF0Zm9ybV9kb20kMSIsImZyZWV6ZSIsImdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UiLCJzdHlsZXNoZWV0IiwiRVhQQU5ET19LRVkiLCJDU1NfUFJFRklYIiwiQ1NTX1NJWkVfTU9OSVRPUiIsIkNTU19SRU5ERVJfTU9OSVRPUiIsIkNTU19SRU5ERVJfQU5JTUFUSU9OIiwiQU5JTUFUSU9OX1NUQVJUX0VWRU5UUyIsIkVWRU5UX1RZUEVTIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwicG9pbnRlcmVudGVyIiwicG9pbnRlcmRvd24iLCJwb2ludGVybW92ZSIsInBvaW50ZXJ1cCIsInBvaW50ZXJsZWF2ZSIsInBvaW50ZXJvdXQiLCJyZWFkVXNlZFNpemUiLCJwcm9wZXJ0eSIsImdldFN0eWxlIiwiaW5pdENhbnZhcyIsImNvbmZpZyIsInJlbmRlckhlaWdodCIsImdldEF0dHJpYnV0ZSIsInJlbmRlcldpZHRoIiwiaW5pdGlhbCIsImRpc3BsYXlXaWR0aCIsImFzcGVjdFJhdGlvIiwiZGlzcGxheUhlaWdodCIsInN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMiLCJzdXBwb3J0cyIsImFkZEV2ZW50TGlzdGVuZXIiLCJldmVudExpc3RlbmVyT3B0aW9ucyIsInBhc3NpdmUiLCJhZGRMaXN0ZW5lciIsIm5vZGUiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJjcmVhdGVFdmVudCIsIm5hdGl2ZUV2ZW50IiwiZnJvbU5hdGl2ZUV2ZW50IiwiZXZlbnQiLCJwb3MiLCJ0aHJvdHRsZWQiLCJ0aWNraW5nIiwiY3JlYXRlRGl2IiwiY2xzIiwiZWwiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJjcmVhdGVSZXNpemVyIiwibWF4U2l6ZSIsInJlc2l6ZXIiLCJleHBhbmQiLCJzaHJpbmsiLCJhcHBlbmRDaGlsZCIsIl9yZXNldCIsInNjcm9sbExlZnQiLCJzY3JvbGxUb3AiLCJvblNjcm9sbCIsImJpbmQiLCJ3YXRjaEZvclJlbmRlciIsImV4cGFuZG8iLCJwcm94eSIsInJlbmRlclByb3h5IiwiYW5pbWF0aW9uTmFtZSIsInJlZmxvdyIsIm9mZnNldFBhcmVudCIsImNsYXNzTGlzdCIsImFkZCIsInVud2F0Y2hGb3JSZW5kZXIiLCJyZW1vdmUiLCJhZGRSZXNpemVMaXN0ZW5lciIsImNvbnRhaW5lciIsIm1haW50YWluQXNwZWN0UmF0aW8iLCJwYXJlbnROb2RlIiwiY2xpZW50V2lkdGgiLCJpbnNlcnRCZWZvcmUiLCJmaXJzdENoaWxkIiwicmVtb3ZlUmVzaXplTGlzdGVuZXIiLCJyZW1vdmVDaGlsZCIsImluamVjdENTUyIsInBsYXRmb3JtIiwiY3NzIiwiX3N0eWxlIiwic2V0QXR0cmlidXRlIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJjcmVhdGVUZXh0Tm9kZSIsInBsYXRmb3JtX2RvbSQyIiwiZGlzYWJsZUNTU0luamVjdGlvbiIsIl9lbmFibGVkIiwiX2Vuc3VyZUxvYWRlZCIsIl9sb2FkZWQiLCJnZXRFbGVtZW50QnlJZCIsInJlbGVhc2VDb250ZXh0IiwicmVtb3ZlQXR0cmlidXRlIiwicHJveGllcyIsImFkZEV2ZW50IiwicmVtb3ZlRXZlbnQiLCJpbXBsZW1lbnRhdGlvbiIsInBsdWdpbnMiLCJjb3JlX3BsdWdpbnMiLCJfcGx1Z2lucyIsIl9jYWNoZUlkIiwicmVnaXN0ZXIiLCJwbHVnaW4iLCJ1bnJlZ2lzdGVyIiwiaWR4IiwiZ2V0QWxsIiwibm90aWZ5IiwiaG9vayIsImRlc2NyaXB0b3JzIiwiZGVzY3JpcHRvciIsInBhcmFtcyIsImNhY2hlIiwiJHBsdWdpbnMiLCJfaW52YWxpZGF0ZSIsImNvcmVfc2NhbGVTZXJ2aWNlIiwiY29uc3RydWN0b3JzIiwicmVnaXN0ZXJTY2FsZVR5cGUiLCJzY2FsZUNvbnN0cnVjdG9yIiwic2NhbGVEZWZhdWx0cyIsImdldFNjYWxlQ29uc3RydWN0b3IiLCJnZXRTY2FsZURlZmF1bHRzIiwidXBkYXRlU2NhbGVEZWZhdWx0cyIsImFkZGl0aW9ucyIsImFkZFNjYWxlc1RvTGF5b3V0IiwidmFsdWVPckRlZmF1bHQkNyIsImVuYWJsZWQiLCJ0aXRsZUZvbnRTdHlsZSIsInRpdGxlU3BhY2luZyIsInRpdGxlTWFyZ2luQm90dG9tIiwidGl0bGVGb250Q29sb3IiLCJ0aXRsZUFsaWduIiwiYm9keVNwYWNpbmciLCJib2R5Rm9udENvbG9yIiwiYm9keUFsaWduIiwiZm9vdGVyRm9udFN0eWxlIiwiZm9vdGVyU3BhY2luZyIsImZvb3Rlck1hcmdpblRvcCIsImZvb3RlckZvbnRDb2xvciIsImZvb3RlckFsaWduIiwieVBhZGRpbmciLCJ4UGFkZGluZyIsImNhcmV0UGFkZGluZyIsImNhcmV0U2l6ZSIsIm11bHRpS2V5QmFja2dyb3VuZCIsImRpc3BsYXlDb2xvcnMiLCJiZWZvcmVUaXRsZSIsInRvb2x0aXBJdGVtcyIsImxhYmVsQ291bnQiLCJhZnRlclRpdGxlIiwiYmVmb3JlQm9keSIsImJlZm9yZUxhYmVsIiwibGFiZWxDb2xvciIsImFjdGl2ZUVsZW1lbnQiLCJsYWJlbFRleHRDb2xvciIsImFmdGVyTGFiZWwiLCJhZnRlckJvZHkiLCJiZWZvcmVGb290ZXIiLCJmb290ZXIiLCJhZnRlckZvb3RlciIsInBvc2l0aW9uZXJzIiwiYXZlcmFnZSIsImV2ZW50UG9zaXRpb24iLCJuZWFyZXN0RWxlbWVudCIsImQiLCJkaXN0YW5jZUJldHdlZW5Qb2ludHMiLCJ0cCIsInB1c2hPckNvbmNhdCIsInRvUHVzaCIsInNwbGl0TmV3bGluZXMiLCJTdHJpbmciLCJzcGxpdCIsImNyZWF0ZVRvb2x0aXBJdGVtIiwiaW5kZXhTY2FsZSIsInZhbHVlU2NhbGUiLCJnZXRMYWJlbEZvckluZGV4IiwiZ2V0QmFzZU1vZGVsIiwidG9vbHRpcE9wdHMiLCJ4QWxpZ24iLCJ5QWxpZ24iLCJfYm9keUZvbnRGYW1pbHkiLCJib2R5Rm9udEZhbWlseSIsIl9ib2R5Rm9udFN0eWxlIiwiYm9keUZvbnRTdHlsZSIsIl9ib2R5QWxpZ24iLCJib2R5Rm9udFNpemUiLCJfdGl0bGVGb250RmFtaWx5IiwidGl0bGVGb250RmFtaWx5IiwiX3RpdGxlRm9udFN0eWxlIiwidGl0bGVGb250U2l6ZSIsIl90aXRsZUFsaWduIiwiX2Zvb3RlckZvbnRGYW1pbHkiLCJmb290ZXJGb250RmFtaWx5IiwiX2Zvb3RlckZvbnRTdHlsZSIsImZvb3RlckZvbnRTaXplIiwiX2Zvb3RlckFsaWduIiwib3BhY2l0eSIsImxlZ2VuZENvbG9yQmFja2dyb3VuZCIsImdldFRvb2x0aXBTaXplIiwidG9vbHRpcCIsImJvZHkiLCJjb21iaW5lZEJvZHlMZW5ndGgiLCJyZWR1Y2UiLCJib2R5SXRlbSIsImJlZm9yZSIsImxpbmVzIiwiYWZ0ZXIiLCJ0aXRsZUxpbmVDb3VudCIsImZvb3RlckxpbmVDb3VudCIsIndpZHRoUGFkZGluZyIsIm1heExpbmVXaWR0aCIsIm1lYXN1cmVUZXh0IiwiZm9udFN0cmluZyIsImRldGVybWluZUFsaWdubWVudCIsImxmIiwicmYiLCJvbGYiLCJvcmYiLCJ5ZiIsIm1pZFgiLCJtaWRZIiwiZ2V0QmFja2dyb3VuZFBvaW50IiwiYWxpZ25tZW50IiwicGFkZGluZ0FuZFNpemUiLCJyYWRpdXNBbmRQYWRkaW5nIiwiZ2V0QWxpZ25lZFgiLCJhbGlnbiIsImdldEJlZm9yZUFmdGVyQm9keUxpbmVzIiwiZXhwb3J0cyQzIiwiX2xhc3RBY3RpdmUiLCJnZXRUaXRsZSIsImdldEJlZm9yZUJvZHkiLCJnZXRCb2R5IiwiYm9keUl0ZW1zIiwiZ2V0QWZ0ZXJCb2R5IiwiZ2V0Rm9vdGVyIiwiY2hhbmdlZCIsImV4aXN0aW5nTW9kZWwiLCJhY3RpdmUiLCJfYWN0aXZlIiwiYmFja2dyb3VuZFBvaW50IiwidG9vbHRpcFNpemUiLCJjYXJldFgiLCJjYXJldFkiLCJsYWJlbENvbG9ycyIsImxhYmVsVGV4dENvbG9ycyIsIl9ldmVudFBvc2l0aW9uIiwiaXRlbVNvcnQiLCJkYXRhUG9pbnRzIiwiZHJhd0NhcmV0IiwidG9vbHRpcFBvaW50IiwiY2FyZXRQb3NpdGlvbiIsImdldENhcmV0UG9zaXRpb24iLCJ4MyIsInkzIiwicHRYIiwicHRZIiwidG1wIiwiZHJhd1RpdGxlIiwidGV4dEFsaWduIiwidGV4dEJhc2VsaW5lIiwiZmlsbFRleHQiLCJkcmF3Qm9keSIsImRyYXdDb2xvckJveGVzIiwieExpbmVQYWRkaW5nIiwiY29sb3JYIiwidGV4dENvbG9yIiwiZmlsbExpbmVPZlRleHQiLCJzdHJva2VSZWN0IiwiZHJhd0Zvb3RlciIsImRyYXdCYWNrZ3JvdW5kIiwicXVhZHJhdGljQ3VydmVUbyIsImhhc1Rvb2x0aXBDb250ZW50IiwiZ2xvYmFsQWxwaGEiLCJoYW5kbGVFdmVudCIsImdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUiLCJwb3NpdGlvbmVyc18xIiwiY29yZV90b29sdGlwIiwidmFsdWVPckRlZmF1bHQkOCIsImV2ZW50cyIsIm9uSG92ZXIiLCJhbmltYXRpb25EdXJhdGlvbiIsInJlc3BvbnNpdmUiLCJyZXNwb25zaXZlQW5pbWF0aW9uRHVyYXRpb24iLCJtZXJnZVNjYWxlQ29uZmlnIiwic2xlbiIsIm1lcmdlQ29uZmlnIiwiaW5pdENvbmZpZyIsInVwZGF0ZUNvbmZpZyIsIm5ld09wdGlvbnMiLCJlbnN1cmVTY2FsZXNIYXZlSURzIiwiYnVpbGRPclVwZGF0ZVNjYWxlcyIsInBvc2l0aW9uSXNIb3Jpem9udGFsIiwiY29uc3RydWN0IiwiX2J1ZmZlcmVkUmVuZGVyIiwiaW5zdGFuY2VzIiwicmV0aW5hU2NhbGUiLCJkZXZpY2VQaXhlbFJhdGlvIiwiYmluZEV2ZW50cyIsInJlc2l6ZSIsImluaXRUb29sVGlwIiwic3RvcCIsInNpbGVudCIsIm5ld1dpZHRoIiwiZ2V0TWF4aW11bVdpZHRoIiwibmV3SGVpZ2h0IiwiZ2V0TWF4aW11bUhlaWdodCIsIm5ld1NpemUiLCJvblJlc2l6ZSIsInNjYWxlc09wdGlvbnMiLCJzY2FsZU9wdGlvbnMiLCJ4QXhpc09wdGlvbnMiLCJ5QXhpc09wdGlvbnMiLCJ1cGRhdGVkIiwiZHR5cGUiLCJkcG9zaXRpb24iLCJpc0RlZmF1bHQiLCJzY2FsZVR5cGUiLCJzY2FsZUNsYXNzIiwibWVyZ2VUaWNrc09wdGlvbnMiLCJoYXNVcGRhdGVkIiwiYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzIiwibmV3Q29udHJvbGxlcnMiLCJkZXN0cm95RGF0YXNldE1ldGEiLCJDb250cm9sbGVyQ2xhc3MiLCJFcnJvciIsInJlc2V0RWxlbWVudHMiLCJ1cGRhdGVMYXlvdXQiLCJ1cGRhdGVEYXRhc2V0cyIsImxhc3RBY3RpdmUiLCJfYnVmZmVyZWRSZXF1ZXN0IiwidXBkYXRlRGF0YXNldCIsImFuaW1hdGlvbk9wdGlvbnMiLCJhbmltYXRpb25PYmplY3QiLCJlYXNpbmdGdW5jdGlvbiIsInN0ZXBEZWNpbWFsIiwiZHJhd0RhdGFzZXRzIiwiX2RyYXdUb29sdGlwIiwiZHJhd0RhdGFzZXQiLCJnZXRFbGVtZW50QXRFdmVudCIsImdldEVsZW1lbnRzQXRFdmVudCIsImdldEVsZW1lbnRzQXRYQXhpcyIsImdldERhdGFzZXRBdEV2ZW50IiwiX21ldGEiLCJnZW5lcmF0ZUxlZ2VuZCIsInVuYmluZEV2ZW50cyIsInRvQmFzZTY0SW1hZ2UiLCJ0b0RhdGFVUkwiLCJfY2hhcnRJbnN0YW5jZSIsIl9saXN0ZW5lcnMiLCJldmVudEhhbmRsZXIiLCJ1cGRhdGVIb3ZlclN0eWxlIiwiYnVmZmVyZWRSZXF1ZXN0IiwiaG92ZXJPcHRpb25zIiwiY29yZV9jb250cm9sbGVyIiwiQ29udHJvbGxlciIsInR5cGVzIiwiY29uZmlnTWVyZ2UiLCJzY2FsZU1lcmdlIiwiY29yZV9oZWxwZXJzIiwiY29sbGVjdGlvbiIsImZpbHRlckNhbGxiYWNrIiwiZmlsdGVyZWQiLCJhcnJheVRvU2VhcmNoIiwic3RhcnRJbmRleCIsImN1cnJlbnRJdGVtIiwiZmluZFByZXZpb3VzV2hlcmUiLCJhbG1vc3RFcXVhbHMiLCJhbG1vc3RXaG9sZSIsInJvdW5kZWQiLCJORUdBVElWRV9JTkZJTklUWSIsInNpZ24iLCJsb2cxMCIsImV4cG9uZW50IiwibG9nIiwiTE9HMTBFIiwicG93ZXJPZjEwIiwiaXNQb3dlck9mMTAiLCJ0b1JhZGlhbnMiLCJ0b0RlZ3JlZXMiLCJyYWRpYW5zIiwiX2RlY2ltYWxQbGFjZXMiLCJjZW50cmVQb2ludCIsImFuZ2xlUG9pbnQiLCJkaXN0YW5jZUZyb21YQ2VudGVyIiwiZGlzdGFuY2VGcm9tWUNlbnRlciIsInJhZGlhbERpc3RhbmNlRnJvbUNlbnRlciIsImFsaWFzUGl4ZWwiLCJwaXhlbFdpZHRoIiwiX2FsaWduUGl4ZWwiLCJwaXhlbCIsImN1cnJlbnREZXZpY2VQaXhlbFJhdGlvIiwiaGFsZldpZHRoIiwiZmlyc3RQb2ludCIsIm1pZGRsZVBvaW50IiwiYWZ0ZXJQb2ludCIsImQwMSIsImQxMiIsInMwMSIsInMxMiIsImZhIiwiZmIiLCJFUFNJTE9OIiwicG9pbnRzV2l0aFRhbmdlbnRzIiwiZGVsdGFLIiwibUsiLCJwb2ludHNMZW4iLCJwb2ludEJlZm9yZSIsInBvaW50Q3VycmVudCIsInBvaW50QWZ0ZXIiLCJzbG9wZURlbHRhWCIsImFscGhhSyIsImJldGFLIiwidGF1SyIsInNxdWFyZWRNYWduaXR1ZGUiLCJsb29wIiwibmljZU51bSIsImZyYWN0aW9uIiwibmljZUZyYWN0aW9uIiwid2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwib1JlcXVlc3RBbmltYXRpb25GcmFtZSIsIm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2V0VGltZW91dCIsImV2dCIsIm9yaWdpbmFsRXZlbnQiLCJzcmNFbGVtZW50IiwiYm91bmRpbmdSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidG91Y2hlcyIsImNsaWVudFgiLCJjbGllbnRZIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhcnNlTWF4U3R5bGUiLCJzdHlsZVZhbHVlIiwicGFyZW50UHJvcGVydHkiLCJ2YWx1ZUluUGl4ZWxzIiwiaXNDb25zdHJhaW5lZFZhbHVlIiwiZ2V0Q29uc3RyYWludERpbWVuc2lvbiIsImRvbU5vZGUiLCJtYXhTdHlsZSIsInBlcmNlbnRhZ2VQcm9wZXJ0eSIsImRlZmF1bHRWaWV3IiwiX2dldFBhcmVudE5vZGUiLCJjb25zdHJhaW5lZE5vZGUiLCJnZXRDb21wdXRlZFN0eWxlIiwiY29uc3RyYWluZWRDb250YWluZXIiLCJoYXNDTm9kZSIsImhhc0NDb250YWluZXIiLCJpbmZpbml0eSIsImdldENvbnN0cmFpbnRXaWR0aCIsImdldENvbnN0cmFpbnRIZWlnaHQiLCJfY2FsY3VsYXRlUGFkZGluZyIsInBhcmVudERpbWVuc2lvbiIsInBhcmVudCIsImhvc3QiLCJjdyIsImNsaWVudEhlaWdodCIsImNoIiwiY3VycmVudFN0eWxlIiwiZ2V0UHJvcGVydHlWYWx1ZSIsImZvcmNlUmF0aW8iLCJwaXhlbFJhdGlvIiwicGl4ZWxTaXplIiwibG9uZ2VzdFRleHQiLCJhcnJheU9mVGhpbmdzIiwiZ2MiLCJnYXJiYWdlQ29sbGVjdCIsImxvbmdlc3QiLCJ0aGluZyIsIm5lc3RlZFRoaW5nIiwiZ2NMZW4iLCJ0ZXh0V2lkdGgiLCJudW1iZXJPZkxhYmVsTGluZXMiLCJudW1iZXJPZkxpbmVzIiwiY29sb3IiLCJDYW52YXNHcmFkaWVudCIsImNvbG9yVmFsdWUiLCJDYW52YXNQYXR0ZXJuIiwiYWJzdHJhY3QiLCJEYXRlQWRhcHRlciIsImZvcm1hdHMiLCJwYXJzZSIsImZvcm1hdCIsImRpZmYiLCJzdGFydE9mIiwiZW5kT2YiLCJfY3JlYXRlIiwib3ZlcnJpZGUiLCJtZW1iZXJzIiwiX2RhdGUiLCJjb3JlX2FkYXB0ZXJzIiwiY29yZV90aWNrcyIsImZvcm1hdHRlcnMiLCJ0aWNrVmFsdWUiLCJsb2dEZWx0YSIsInRpY2tTdHJpbmciLCJtYXhUaWNrIiwibG9nVGljayIsInRvRXhwb25lbnRpYWwiLCJudW1EZWNpbWFsIiwidG9GaXhlZCIsImxvZ2FyaXRobWljIiwicmVtYWluIiwidmFsdWVPckRlZmF1bHQkOSIsImRyYXdCb3JkZXIiLCJkcmF3T25DaGFydEFyZWEiLCJkcmF3VGlja3MiLCJ0aWNrTWFya0xlbmd0aCIsInplcm9MaW5lV2lkdGgiLCJ6ZXJvTGluZUNvbG9yIiwiemVyb0xpbmVCb3JkZXJEYXNoIiwiemVyb0xpbmVCb3JkZXJEYXNoT2Zmc2V0Iiwic2NhbGVMYWJlbCIsImxhYmVsU3RyaW5nIiwibWluUm90YXRpb24iLCJtYXhSb3RhdGlvbiIsIm1pcnJvciIsImF1dG9Ta2lwIiwiYXV0b1NraXBQYWRkaW5nIiwibGFiZWxPZmZzZXQiLCJtaW5vciIsIm1ham9yIiwibGFiZWxzRnJvbVRpY2tzIiwiZ2V0UGl4ZWxGb3JHcmlkTGluZSIsImxpbmVWYWx1ZSIsImNvbXB1dGVUZXh0U2l6ZSIsInRpY2siLCJjb3JlX3NjYWxlIiwiX3RpY2tzIiwiYmVmb3JlVXBkYXRlIiwibWF4V2lkdGgiLCJtYXhIZWlnaHQiLCJtYXJnaW5zIiwiX21heExhYmVsTGluZXMiLCJsb25nZXN0TGFiZWxXaWR0aCIsImxvbmdlc3RUZXh0Q2FjaGUiLCJiZWZvcmVTZXREaW1lbnNpb25zIiwic2V0RGltZW5zaW9ucyIsImFmdGVyU2V0RGltZW5zaW9ucyIsImJlZm9yZURhdGFMaW1pdHMiLCJkZXRlcm1pbmVEYXRhTGltaXRzIiwiYWZ0ZXJEYXRhTGltaXRzIiwiYmVmb3JlQnVpbGRUaWNrcyIsImJ1aWxkVGlja3MiLCJhZnRlckJ1aWxkVGlja3MiLCJiZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb24iLCJjb252ZXJ0VGlja3NUb0xhYmVscyIsImFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uIiwiYmVmb3JlQ2FsY3VsYXRlVGlja1JvdGF0aW9uIiwiY2FsY3VsYXRlVGlja1JvdGF0aW9uIiwiYWZ0ZXJDYWxjdWxhdGVUaWNrUm90YXRpb24iLCJiZWZvcmVGaXQiLCJmaXQiLCJhZnRlckZpdCIsImFmdGVyVXBkYXRlIiwidGlja09wdHMiLCJ1c2VyQ2FsbGJhY2siLCJ0aWNrRm9udCIsImxhYmVsUm90YXRpb24iLCJvcmlnaW5hbExhYmVsV2lkdGgiLCJsYWJlbFdpZHRoIiwiY29zUm90YXRpb24iLCJzaW5Sb3RhdGlvbiIsInRpY2tXaWR0aCIsImFuZ2xlUmFkaWFucyIsInNjYWxlTGFiZWxPcHRzIiwiZ3JpZExpbmVPcHRzIiwiX2lzVmlzaWJsZSIsInBhcnNlRm9udCIsImlzRnVsbFdpZHRoIiwic2NhbGVMYWJlbEZvbnQiLCJzY2FsZUxhYmVsUGFkZGluZyIsImRlbHRhSGVpZ2h0IiwibGFyZ2VzdFRleHRXaWR0aCIsInRhbGxlc3RMYWJlbEhlaWdodEluTGluZXMiLCJsaW5lU3BhY2UiLCJ0aWNrUGFkZGluZyIsImxhYmVsSGVpZ2h0IiwiZmlyc3RMYWJlbFdpZHRoIiwibGFzdExhYmVsV2lkdGgiLCJvZmZzZXRMZWZ0Iiwib2Zmc2V0UmlnaHQiLCJoYW5kbGVNYXJnaW5zIiwicmF3VmFsdWUiLCJnZXRWYWx1ZUZvclBpeGVsIiwiaW5uZXJXaWR0aCIsImZpbmFsVmFsIiwiaW5uZXJIZWlnaHQiLCJkZWNpbWFsIiwidmFsdWVPZmZzZXQiLCJnZXRCYXNlVmFsdWUiLCJfYXV0b1NraXAiLCJvcHRpb25UaWNrcyIsInRpY2tDb3VudCIsInNraXBSYXRpbyIsIm1heFRpY2tzIiwibWF4VGlja3NMaW1pdCIsInRpY2tzTGVuZ3RoIiwiX3RpY2tTaXplIiwiYXhpc0xlbmd0aCIsIlBhZGRpbmdCb3R0b20iLCJyb3QiLCJvcHRpb25NYWpvclRpY2tzIiwiaXNSb3RhdGVkIiwiaXNNaXJyb3JlZCIsInRpY2tGb250Q29sb3IiLCJmb250Q29sb3IiLCJtYWpvclRpY2tGb250Q29sb3IiLCJtYWpvclRpY2tGb250IiwidGwiLCJzY2FsZUxhYmVsRm9udENvbG9yIiwibGFiZWxSb3RhdGlvblJhZGlhbnMiLCJpdGVtc1RvRHJhdyIsImF4aXNXaWR0aCIsImFsaWduUGl4ZWwiLCJib3JkZXJWYWx1ZSIsInRpY2tTdGFydCIsInRpY2tFbmQiLCJsaW5lQ29sb3IiLCJ6ZXJvTGluZUluZGV4IiwidHgxIiwidHkxIiwidHgyIiwidHkyIiwibGFiZWxYIiwibGFiZWxZIiwidGV4dE9mZnNldCIsImxhYmVsWU9mZnNldCIsImxhYmVsWE9mZnNldCIsImdsV2lkdGgiLCJnbENvbG9yIiwiZ2xCb3JkZXJEYXNoIiwiZ2xCb3JkZXJEYXNoT2Zmc2V0IiwiaXRlbVRvRHJhdyIsInRyYW5zbGF0ZSIsInNjYWxlTGFiZWxYIiwic2NhbGVMYWJlbFkiLCJoYWxmTGluZUhlaWdodCIsImlzTGVmdCIsImZpcnN0TGluZVdpZHRoIiwibGFzdExpbmVXaWR0aCIsImRlZmF1bHRDb25maWciLCJzY2FsZV9jYXRlZ29yeSIsImdldExhYmVscyIsInhMYWJlbHMiLCJ5TGFiZWxzIiwibWluSW5kZXgiLCJtYXhJbmRleCIsIm9mZnNldEFtdCIsInZhbHVlQ2F0ZWdvcnkiLCJ2YWx1ZVdpZHRoIiwid2lkdGhPZmZzZXQiLCJ2YWx1ZUhlaWdodCIsImhlaWdodE9mZnNldCIsImhvcnoiLCJ2YWx1ZURpbWVuc2lvbiIsIl9kZWZhdWx0cyIsImdlbmVyYXRlVGlja3MiLCJnZW5lcmF0aW9uT3B0aW9ucyIsImRhdGFSYW5nZSIsIk1JTl9TUEFDSU5HIiwic3RlcFNpemUiLCJ1bml0IiwibWF4TnVtU3BhY2VzIiwicHJlY2lzaW9uIiwicm1pbiIsInJtYXgiLCJzcGFjaW5nIiwiZmFjdG9yIiwibmljZU1pbiIsIm5pY2VNYXgiLCJudW1TcGFjZXMiLCJjZWlsIiwic2NhbGVfbGluZWFyYmFzZSIsImhhbmRsZVRpY2tSYW5nZU9wdGlvbnMiLCJtaW5TaWduIiwibWF4U2lnbiIsInNldE1pbiIsInN1Z2dlc3RlZE1pbiIsInNldE1heCIsInN1Z2dlc3RlZE1heCIsImdldFRpY2tMaW1pdCIsIl9jb21wdXRlVGlja0xpbWl0IiwiaGFuZGxlRGlyZWN0aW9uYWxDaGFuZ2VzIiwibnVtZXJpY0dlbmVyYXRvck9wdGlvbnMiLCJmaXhlZFN0ZXBTaXplIiwidGlja3NBc051bWJlcnMiLCJkZWZhdWx0Q29uZmlnJDEiLCJzY2FsZV9saW5lYXIiLCJERUZBVUxUX01JTiIsIkRFRkFVTFRfTUFYIiwiSURNYXRjaGVzIiwiaGFzU3RhY2tzIiwidmFsdWVzUGVyU3RhY2siLCJwb3NpdGl2ZVZhbHVlcyIsIm5lZ2F0aXZlVmFsdWVzIiwicmVsYXRpdmVQb2ludHMiLCJ2YWx1ZXNGb3JUeXBlIiwibWluVmFsIiwibWF4VmFsIiwiaW5uZXJEaW1lbnNpb24iLCJfZGVmYXVsdHMkMSIsInZhbHVlT3JEZWZhdWx0JGEiLCJnZW5lcmF0ZVRpY2tzJDEiLCJ0aWNrVmFsIiwiZW5kRXhwIiwiZW5kU2lnbmlmaWNhbmQiLCJleHAiLCJzaWduaWZpY2FuZCIsIm1pbk5vdFplcm8iLCJsYXN0VGljayIsImRlZmF1bHRDb25maWckMiIsIm5vbk5lZ2F0aXZlT3JEZWZhdWx0Iiwic2NhbGVfbG9nYXJpdGhtaWMiLCJ0aWNrVmFsdWVzIiwiX2dldEZpcnN0VGlja1ZhbHVlIiwiZmlyc3RUaWNrVmFsdWUiLCJfZGVmYXVsdHMkMiIsInZhbHVlT3JEZWZhdWx0JGIiLCJ2YWx1ZUF0SW5kZXhPckRlZmF1bHQkMSIsInJlc29sdmUkNyIsImRlZmF1bHRDb25maWckMyIsImFuaW1hdGUiLCJzaG93TGFiZWxCYWNrZHJvcCIsImJhY2tkcm9wQ29sb3IiLCJiYWNrZHJvcFBhZGRpbmdZIiwiYmFja2Ryb3BQYWRkaW5nWCIsImdldFZhbHVlQ291bnQiLCJnZXRUaWNrQmFja2Ryb3BIZWlnaHQiLCJtZWFzdXJlTGFiZWxTaXplIiwiZGV0ZXJtaW5lTGltaXRzIiwiZml0V2l0aFBvaW50TGFiZWxzIiwicGxGb250IiwiZnVydGhlc3RMaW1pdHMiLCJmdXJ0aGVzdEFuZ2xlcyIsInRleHRTaXplIiwiX3BvaW50TGFiZWxTaXplcyIsInZhbHVlQ291bnQiLCJnZXRQb2ludFBvc2l0aW9uIiwiZHJhd2luZ0FyZWEiLCJnZXRJbmRleEFuZ2xlIiwiaExpbWl0cyIsInZMaW1pdHMiLCJzZXRSZWR1Y3Rpb25zIiwiZ2V0VGV4dEFsaWduRm9yQW5nbGUiLCJhZGp1c3RQb2ludFBvc2l0aW9uRm9yTGFiZWxIZWlnaHQiLCJkcmF3UG9pbnRMYWJlbHMiLCJhbmdsZUxpbmVPcHRzIiwicG9pbnRMYWJlbE9wdHMiLCJ0aWNrQmFja2Ryb3BIZWlnaHQiLCJvdXRlckRpc3RhbmNlIiwib3V0ZXJQb3NpdGlvbiIsImV4dHJhIiwicG9pbnRMYWJlbFBvc2l0aW9uIiwicG9pbnRMYWJlbEZvbnRDb2xvciIsImRyYXdSYWRpdXNMaW5lIiwibnVtYmVyT3JaZXJvIiwicGFyYW0iLCJzY2FsZV9yYWRpYWxMaW5lYXIiLCJzZXRDZW50ZXJQb2ludCIsImxhcmdlc3RQb3NzaWJsZVJhZGl1cyIsInJhZGl1c1JlZHVjdGlvbkxlZnQiLCJyYWRpdXNSZWR1Y3Rpb25SaWdodCIsInJhZGl1c1JlZHVjdGlvblRvcCIsInJhZGl1c1JlZHVjdGlvbkJvdHRvbSIsImxlZnRNb3ZlbWVudCIsInJpZ2h0TW92ZW1lbnQiLCJ0b3BNb3ZlbWVudCIsImJvdHRvbU1vdmVtZW50IiwibWF4UmlnaHQiLCJtYXhMZWZ0IiwibWF4VG9wIiwibWF4Qm90dG9tIiwiYW5nbGVNdWx0aXBsaWVyIiwic3RhcnRBbmdsZVJhZGlhbnMiLCJzY2FsaW5nRmFjdG9yIiwiZGlzdGFuY2VGcm9tQ2VudGVyIiwidGhpc0FuZ2xlIiwiZ2V0QmFzZVBvc2l0aW9uIiwieUNlbnRlck9mZnNldCIsIl9kZWZhdWx0cyQzIiwidmFsdWVPckRlZmF1bHQkYyIsIk1JTl9JTlRFR0VSIiwiTUlOX1NBRkVfSU5URUdFUiIsIk1BWF9JTlRFR0VSIiwiTUFYX1NBRkVfSU5URUdFUiIsIklOVEVSVkFMUyIsIm1pbGxpc2Vjb25kIiwiY29tbW9uIiwic3RlcHMiLCJzZWNvbmQiLCJtaW51dGUiLCJob3VyIiwiZGF5Iiwid2VlayIsIm1vbnRoIiwicXVhcnRlciIsInllYXIiLCJVTklUUyIsInNvcnRlciIsImFycmF5VW5pcXVlIiwiaGFzaCIsIm91dCIsImJ1aWxkTG9va3VwVGFibGUiLCJ0aW1lc3RhbXBzIiwiZGlzdHJpYnV0aW9uIiwidGltZSIsInRhYmxlIiwibG9va3VwIiwibG8iLCJtaWQiLCJpMCIsImkxIiwiaW50ZXJwb2xhdGUkMSIsInNrZXkiLCJ0a2V5Iiwic3BhbiIsInRvVGltZXN0YW1wIiwiaW5wdXQiLCJhZGFwdGVyIiwiX2FkYXB0ZXIiLCJwYXJzZXIiLCJkZXRlcm1pbmVTdGVwU2l6ZSIsImNhcGFjaXR5IiwiaW50ZXJ2YWwiLCJtaWxsaXNlY29uZHMiLCJkZXRlcm1pbmVVbml0Rm9yQXV0b1RpY2tzIiwibWluVW5pdCIsImRldGVybWluZVVuaXRGb3JGb3JtYXR0aW5nIiwiZGV0ZXJtaW5lTWFqb3JVbml0IiwiZ2VuZXJhdGUiLCJ0aW1lT3B0cyIsInVuaXRTdGVwU2l6ZSIsIndlZWtkYXkiLCJpc29XZWVrZGF5IiwibWFqb3JUaWNrc0VuYWJsZWQiLCJmaXJzdCIsImNvbXB1dGVPZmZzZXRzIiwidGlja3NGcm9tVGltZXN0YW1wcyIsIm1ham9yVW5pdCIsImRlZmF1bHRDb25maWckNCIsImFkYXB0ZXJzIiwiZGlzcGxheUZvcm1hdCIsImRpc3BsYXlGb3JtYXRzIiwic2NhbGVfdGltZSIsImRhdGUiLCJ3YXJuIiwidGltZXN0YW1wIiwiZGF0YUxhYmVscyIsIl9ob3Jpem9udGFsIiwiX3RhYmxlIiwiX3RpbWVzdGFtcHMiLCJnZXRMYWJlbENhcGFjaXR5IiwiX3VuaXQiLCJfbWFqb3JVbml0IiwiX29mZnNldHMiLCJ0b29sdGlwRm9ybWF0IiwiZGF0ZXRpbWUiLCJ0aWNrRm9ybWF0RnVuY3Rpb24iLCJtaW5vckZvcm1hdCIsIm1ham9yRm9ybWF0IiwibWFqb3JUaW1lIiwibWFqb3JUaWNrT3B0cyIsImZvcm1hdHRlciIsImdldFBpeGVsRm9yT2Zmc2V0IiwiaXNSZXZlcnNlIiwiZ2V0TGFiZWxXaWR0aCIsInRpY2tzT3B0cyIsInRpY2tMYWJlbFdpZHRoIiwidGlja0ZvbnRTaXplIiwiZXhhbXBsZVRpbWUiLCJleGFtcGxlTGFiZWwiLCJfZGVmYXVsdHMkNCIsImNhdGVnb3J5IiwicmFkaWFsTGluZWFyIiwiRk9STUFUUyIsIl9pZCIsInZhbHVlT2YiLCJhbW91bnQiLCJhcyIsImZpbGxlciIsInByb3BhZ2F0ZSIsIm1hcHBlcnMiLCJ2aXNpYmxlIiwiYm91bmRhcnkiLCJkZWNvZGVGaWxsIiwiY29tcHV0ZUJvdW5kYXJ5Iiwic2NhbGVCb3R0b20iLCJzY2FsZVRvcCIsInNjYWxlWmVybyIsInJlc29sdmVUYXJnZXQiLCJ2aXNpdGVkIiwiY3JlYXRlTWFwcGVyIiwiaXNEcmF3YWJsZSIsImRyYXdBcmVhIiwiY3VydmUwIiwiY3VydmUxIiwibGVuMCIsImxlbjEiLCJkb0ZpbGwiLCJtYXBwZXIiLCJwMCIsInAxIiwiZDAiLCJkMSIsInBsdWdpbl9maWxsZXIiLCJhZnRlckRhdGFzZXRzVXBkYXRlIiwiJGZpbGxlciIsImJlZm9yZURhdGFzZXREcmF3Iiwibm9vcCQxIiwidmFsdWVPckRlZmF1bHQkZCIsImNpIiwib25MZWF2ZSIsImJveFdpZHRoIiwibGluZURhc2giLCJnZXRCb3hXaWR0aCIsImxhYmVsT3B0cyIsInVzZVBvaW50U3R5bGUiLCJMZWdlbmQiLCJsZWdlbmRIaXRCb3hlcyIsIl9ob3ZlcmVkSXRlbSIsImRvdWdobnV0TW9kZSIsImJlZm9yZUJ1aWxkTGFiZWxzIiwiYnVpbGRMYWJlbHMiLCJhZnRlckJ1aWxkTGFiZWxzIiwibGVnZW5kSXRlbXMiLCJsYWJlbEZvbnQiLCJoaXRib3hlcyIsImxpbmVXaWR0aHMiLCJ0b3RhbEhlaWdodCIsInZQYWRkaW5nIiwiY29sdW1uV2lkdGhzIiwidG90YWxXaWR0aCIsImN1cnJlbnRDb2xXaWR0aCIsImN1cnJlbnRDb2xIZWlnaHQiLCJpdGVtSGVpZ2h0IiwiaXRlbVdpZHRoIiwibGluZURlZmF1bHQiLCJsZWdlbmRXaWR0aCIsImN1cnNvciIsImRyYXdMZWdlbmRCb3giLCJTUVJUMiIsImhhbGZGb250U2l6ZSIsInhMZWZ0IiwieU1pZGRsZSIsIl9nZXRMZWdlbmRJdGVtQXQiLCJoaXRCb3giLCJsaCIsImhvdmVyZWRJdGVtIiwiY3JlYXRlTmV3TGVnZW5kQW5kQXR0YWNoIiwibGVnZW5kT3B0cyIsInBsdWdpbl9sZWdlbmQiLCJfZWxlbWVudCIsImJlZm9yZUluaXQiLCJhZnRlckV2ZW50Iiwibm9vcCQyIiwiVGl0bGUiLCJsaW5lQ291bnQiLCJmb250T3B0cyIsInRpdGxlWCIsInRpdGxlWSIsImNyZWF0ZU5ld1RpdGxlQmxvY2tBbmRBdHRhY2giLCJ0aXRsZU9wdHMiLCJ0aXRsZUJsb2NrIiwicGx1Z2luX3RpdGxlIiwiX2FkYXB0ZXJzIiwiQW5pbWF0aW9uIiwiYW5pbWF0aW9uU2VydmljZSIsIkludGVyYWN0aW9uIiwibGF5b3V0cyIsIlNjYWxlIiwic2NhbGVTZXJ2aWNlIiwiVGlja3MiLCJUb29sdGlwIiwic3JjIiwicGx1Z2luU2VydmljZSIsIlBsdWdpbkJhc2UiLCJjYW52YXNIZWxwZXJzIiwibGF5b3V0U2VydmljZSIsIkxpbmVhclNjYWxlQmFzZSIsImtsYXNzIiwiY2ZnIiwidG9Mb3dlckNhc2UiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./public/vendors/chartjs/Chart.js\n");
+var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
+/*!
+ * Chart.js v2.8.0
+ * https://www.chartjs.org
+ * (c) 2019 Chart.js Contributors
+ * Released under the MIT License
+ */
+(function (global, factory) {
+ ( false ? 0 : _typeof(exports)) === 'object' && "object" !== 'undefined' ? module.exports = factory(function () {
+ try {
+ return __webpack_require__(/*! moment */ "./node_modules/moment/moment.js");
+ } catch (e) {}
+ }()) : true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require) {
+ return factory(function () {
+ try {
+ return __webpack_require__(/*! moment */ "./node_modules/moment/moment.js");
+ } catch (e) {}
+ }());
+ }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : 0;
+})(this, function (moment) {
+ 'use strict';
+
+ moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment;
+
+ /* MIT license */
+
+ var conversions = {
+ rgb2hsl: rgb2hsl,
+ rgb2hsv: rgb2hsv,
+ rgb2hwb: rgb2hwb,
+ rgb2cmyk: rgb2cmyk,
+ rgb2keyword: rgb2keyword,
+ rgb2xyz: rgb2xyz,
+ rgb2lab: rgb2lab,
+ rgb2lch: rgb2lch,
+ hsl2rgb: hsl2rgb,
+ hsl2hsv: hsl2hsv,
+ hsl2hwb: hsl2hwb,
+ hsl2cmyk: hsl2cmyk,
+ hsl2keyword: hsl2keyword,
+ hsv2rgb: hsv2rgb,
+ hsv2hsl: hsv2hsl,
+ hsv2hwb: hsv2hwb,
+ hsv2cmyk: hsv2cmyk,
+ hsv2keyword: hsv2keyword,
+ hwb2rgb: hwb2rgb,
+ hwb2hsl: hwb2hsl,
+ hwb2hsv: hwb2hsv,
+ hwb2cmyk: hwb2cmyk,
+ hwb2keyword: hwb2keyword,
+ cmyk2rgb: cmyk2rgb,
+ cmyk2hsl: cmyk2hsl,
+ cmyk2hsv: cmyk2hsv,
+ cmyk2hwb: cmyk2hwb,
+ cmyk2keyword: cmyk2keyword,
+ keyword2rgb: keyword2rgb,
+ keyword2hsl: keyword2hsl,
+ keyword2hsv: keyword2hsv,
+ keyword2hwb: keyword2hwb,
+ keyword2cmyk: keyword2cmyk,
+ keyword2lab: keyword2lab,
+ keyword2xyz: keyword2xyz,
+ xyz2rgb: xyz2rgb,
+ xyz2lab: xyz2lab,
+ xyz2lch: xyz2lch,
+ lab2xyz: lab2xyz,
+ lab2rgb: lab2rgb,
+ lab2lch: lab2lch,
+ lch2lab: lch2lab,
+ lch2xyz: lch2xyz,
+ lch2rgb: lch2rgb
+ };
+ function rgb2hsl(rgb) {
+ var r = rgb[0] / 255,
+ g = rgb[1] / 255,
+ b = rgb[2] / 255,
+ min = Math.min(r, g, b),
+ max = Math.max(r, g, b),
+ delta = max - min,
+ h,
+ s,
+ l;
+ if (max == min) h = 0;else if (r == max) h = (g - b) / delta;else if (g == max) h = 2 + (b - r) / delta;else if (b == max) h = 4 + (r - g) / delta;
+ h = Math.min(h * 60, 360);
+ if (h < 0) h += 360;
+ l = (min + max) / 2;
+ if (max == min) s = 0;else if (l <= 0.5) s = delta / (max + min);else s = delta / (2 - max - min);
+ return [h, s * 100, l * 100];
+ }
+ function rgb2hsv(rgb) {
+ var r = rgb[0],
+ g = rgb[1],
+ b = rgb[2],
+ min = Math.min(r, g, b),
+ max = Math.max(r, g, b),
+ delta = max - min,
+ h,
+ s,
+ v;
+ if (max == 0) s = 0;else s = delta / max * 1000 / 10;
+ if (max == min) h = 0;else if (r == max) h = (g - b) / delta;else if (g == max) h = 2 + (b - r) / delta;else if (b == max) h = 4 + (r - g) / delta;
+ h = Math.min(h * 60, 360);
+ if (h < 0) h += 360;
+ v = max / 255 * 1000 / 10;
+ return [h, s, v];
+ }
+ function rgb2hwb(rgb) {
+ var r = rgb[0],
+ g = rgb[1],
+ b = rgb[2],
+ h = rgb2hsl(rgb)[0],
+ w = 1 / 255 * Math.min(r, Math.min(g, b)),
+ b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
+ return [h, w * 100, b * 100];
+ }
+ function rgb2cmyk(rgb) {
+ var r = rgb[0] / 255,
+ g = rgb[1] / 255,
+ b = rgb[2] / 255,
+ c,
+ m,
+ y,
+ k;
+ k = Math.min(1 - r, 1 - g, 1 - b);
+ c = (1 - r - k) / (1 - k) || 0;
+ m = (1 - g - k) / (1 - k) || 0;
+ y = (1 - b - k) / (1 - k) || 0;
+ return [c * 100, m * 100, y * 100, k * 100];
+ }
+ function rgb2keyword(rgb) {
+ return reverseKeywords[JSON.stringify(rgb)];
+ }
+ function rgb2xyz(rgb) {
+ var r = rgb[0] / 255,
+ g = rgb[1] / 255,
+ b = rgb[2] / 255;
+
+ // assume sRGB
+ r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;
+ g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;
+ b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;
+ var x = r * 0.4124 + g * 0.3576 + b * 0.1805;
+ var y = r * 0.2126 + g * 0.7152 + b * 0.0722;
+ var z = r * 0.0193 + g * 0.1192 + b * 0.9505;
+ return [x * 100, y * 100, z * 100];
+ }
+ function rgb2lab(rgb) {
+ var xyz = rgb2xyz(rgb),
+ x = xyz[0],
+ y = xyz[1],
+ z = xyz[2],
+ l,
+ a,
+ b;
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;
+ l = 116 * y - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
+ return [l, a, b];
+ }
+ function rgb2lch(args) {
+ return lab2lch(rgb2lab(args));
+ }
+ function hsl2rgb(hsl) {
+ var h = hsl[0] / 360,
+ s = hsl[1] / 100,
+ l = hsl[2] / 100,
+ t1,
+ t2,
+ t3,
+ rgb,
+ val;
+ if (s == 0) {
+ val = l * 255;
+ return [val, val, val];
+ }
+ if (l < 0.5) t2 = l * (1 + s);else t2 = l + s - l * s;
+ t1 = 2 * l - t2;
+ rgb = [0, 0, 0];
+ for (var i = 0; i < 3; i++) {
+ t3 = h + 1 / 3 * -(i - 1);
+ t3 < 0 && t3++;
+ t3 > 1 && t3--;
+ if (6 * t3 < 1) val = t1 + (t2 - t1) * 6 * t3;else if (2 * t3 < 1) val = t2;else if (3 * t3 < 2) val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;else val = t1;
+ rgb[i] = val * 255;
+ }
+ return rgb;
+ }
+ function hsl2hsv(hsl) {
+ var h = hsl[0],
+ s = hsl[1] / 100,
+ l = hsl[2] / 100,
+ sv,
+ v;
+ if (l === 0) {
+ // no need to do calc on black
+ // also avoids divide by 0 error
+ return [0, 0, 0];
+ }
+ l *= 2;
+ s *= l <= 1 ? l : 2 - l;
+ v = (l + s) / 2;
+ sv = 2 * s / (l + s);
+ return [h, sv * 100, v * 100];
+ }
+ function hsl2hwb(args) {
+ return rgb2hwb(hsl2rgb(args));
+ }
+ function hsl2cmyk(args) {
+ return rgb2cmyk(hsl2rgb(args));
+ }
+ function hsl2keyword(args) {
+ return rgb2keyword(hsl2rgb(args));
+ }
+ function hsv2rgb(hsv) {
+ var h = hsv[0] / 60,
+ s = hsv[1] / 100,
+ v = hsv[2] / 100,
+ hi = Math.floor(h) % 6;
+ var f = h - Math.floor(h),
+ p = 255 * v * (1 - s),
+ q = 255 * v * (1 - s * f),
+ t = 255 * v * (1 - s * (1 - f)),
+ v = 255 * v;
+ switch (hi) {
+ case 0:
+ return [v, t, p];
+ case 1:
+ return [q, v, p];
+ case 2:
+ return [p, v, t];
+ case 3:
+ return [p, q, v];
+ case 4:
+ return [t, p, v];
+ case 5:
+ return [v, p, q];
+ }
+ }
+ function hsv2hsl(hsv) {
+ var h = hsv[0],
+ s = hsv[1] / 100,
+ v = hsv[2] / 100,
+ sl,
+ l;
+ l = (2 - s) * v;
+ sl = s * v;
+ sl /= l <= 1 ? l : 2 - l;
+ sl = sl || 0;
+ l /= 2;
+ return [h, sl * 100, l * 100];
+ }
+ function hsv2hwb(args) {
+ return rgb2hwb(hsv2rgb(args));
+ }
+ function hsv2cmyk(args) {
+ return rgb2cmyk(hsv2rgb(args));
+ }
+ function hsv2keyword(args) {
+ return rgb2keyword(hsv2rgb(args));
+ }
+
+ // http://dev.w3.org/csswg/css-color/#hwb-to-rgb
+ function hwb2rgb(hwb) {
+ var h = hwb[0] / 360,
+ wh = hwb[1] / 100,
+ bl = hwb[2] / 100,
+ ratio = wh + bl,
+ i,
+ v,
+ f,
+ n;
+
+ // wh + bl cant be > 1
+ if (ratio > 1) {
+ wh /= ratio;
+ bl /= ratio;
+ }
+ i = Math.floor(6 * h);
+ v = 1 - bl;
+ f = 6 * h - i;
+ if ((i & 0x01) != 0) {
+ f = 1 - f;
+ }
+ n = wh + f * (v - wh); // linear interpolation
+
+ switch (i) {
+ default:
+ case 6:
+ case 0:
+ r = v;
+ g = n;
+ b = wh;
+ break;
+ case 1:
+ r = n;
+ g = v;
+ b = wh;
+ break;
+ case 2:
+ r = wh;
+ g = v;
+ b = n;
+ break;
+ case 3:
+ r = wh;
+ g = n;
+ b = v;
+ break;
+ case 4:
+ r = n;
+ g = wh;
+ b = v;
+ break;
+ case 5:
+ r = v;
+ g = wh;
+ b = n;
+ break;
+ }
+ return [r * 255, g * 255, b * 255];
+ }
+ function hwb2hsl(args) {
+ return rgb2hsl(hwb2rgb(args));
+ }
+ function hwb2hsv(args) {
+ return rgb2hsv(hwb2rgb(args));
+ }
+ function hwb2cmyk(args) {
+ return rgb2cmyk(hwb2rgb(args));
+ }
+ function hwb2keyword(args) {
+ return rgb2keyword(hwb2rgb(args));
+ }
+ function cmyk2rgb(cmyk) {
+ var c = cmyk[0] / 100,
+ m = cmyk[1] / 100,
+ y = cmyk[2] / 100,
+ k = cmyk[3] / 100,
+ r,
+ g,
+ b;
+ r = 1 - Math.min(1, c * (1 - k) + k);
+ g = 1 - Math.min(1, m * (1 - k) + k);
+ b = 1 - Math.min(1, y * (1 - k) + k);
+ return [r * 255, g * 255, b * 255];
+ }
+ function cmyk2hsl(args) {
+ return rgb2hsl(cmyk2rgb(args));
+ }
+ function cmyk2hsv(args) {
+ return rgb2hsv(cmyk2rgb(args));
+ }
+ function cmyk2hwb(args) {
+ return rgb2hwb(cmyk2rgb(args));
+ }
+ function cmyk2keyword(args) {
+ return rgb2keyword(cmyk2rgb(args));
+ }
+ function xyz2rgb(xyz) {
+ var x = xyz[0] / 100,
+ y = xyz[1] / 100,
+ z = xyz[2] / 100,
+ r,
+ g,
+ b;
+ r = x * 3.2406 + y * -1.5372 + z * -0.4986;
+ g = x * -0.9689 + y * 1.8758 + z * 0.0415;
+ b = x * 0.0557 + y * -0.2040 + z * 1.0570;
+
+ // assume sRGB
+ r = r > 0.0031308 ? 1.055 * Math.pow(r, 1.0 / 2.4) - 0.055 : r = r * 12.92;
+ g = g > 0.0031308 ? 1.055 * Math.pow(g, 1.0 / 2.4) - 0.055 : g = g * 12.92;
+ b = b > 0.0031308 ? 1.055 * Math.pow(b, 1.0 / 2.4) - 0.055 : b = b * 12.92;
+ r = Math.min(Math.max(0, r), 1);
+ g = Math.min(Math.max(0, g), 1);
+ b = Math.min(Math.max(0, b), 1);
+ return [r * 255, g * 255, b * 255];
+ }
+ function xyz2lab(xyz) {
+ var x = xyz[0],
+ y = xyz[1],
+ z = xyz[2],
+ l,
+ a,
+ b;
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;
+ l = 116 * y - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
+ return [l, a, b];
+ }
+ function xyz2lch(args) {
+ return lab2lch(xyz2lab(args));
+ }
+ function lab2xyz(lab) {
+ var l = lab[0],
+ a = lab[1],
+ b = lab[2],
+ x,
+ y,
+ z,
+ y2;
+ if (l <= 8) {
+ y = l * 100 / 903.3;
+ y2 = 7.787 * (y / 100) + 16 / 116;
+ } else {
+ y = 100 * Math.pow((l + 16) / 116, 3);
+ y2 = Math.pow(y / 100, 1 / 3);
+ }
+ x = x / 95.047 <= 0.008856 ? x = 95.047 * (a / 500 + y2 - 16 / 116) / 7.787 : 95.047 * Math.pow(a / 500 + y2, 3);
+ z = z / 108.883 <= 0.008859 ? z = 108.883 * (y2 - b / 200 - 16 / 116) / 7.787 : 108.883 * Math.pow(y2 - b / 200, 3);
+ return [x, y, z];
+ }
+ function lab2lch(lab) {
+ var l = lab[0],
+ a = lab[1],
+ b = lab[2],
+ hr,
+ h,
+ c;
+ hr = Math.atan2(b, a);
+ h = hr * 360 / 2 / Math.PI;
+ if (h < 0) {
+ h += 360;
+ }
+ c = Math.sqrt(a * a + b * b);
+ return [l, c, h];
+ }
+ function lab2rgb(args) {
+ return xyz2rgb(lab2xyz(args));
+ }
+ function lch2lab(lch) {
+ var l = lch[0],
+ c = lch[1],
+ h = lch[2],
+ a,
+ b,
+ hr;
+ hr = h / 360 * 2 * Math.PI;
+ a = c * Math.cos(hr);
+ b = c * Math.sin(hr);
+ return [l, a, b];
+ }
+ function lch2xyz(args) {
+ return lab2xyz(lch2lab(args));
+ }
+ function lch2rgb(args) {
+ return lab2rgb(lch2lab(args));
+ }
+ function keyword2rgb(keyword) {
+ return cssKeywords[keyword];
+ }
+ function keyword2hsl(args) {
+ return rgb2hsl(keyword2rgb(args));
+ }
+ function keyword2hsv(args) {
+ return rgb2hsv(keyword2rgb(args));
+ }
+ function keyword2hwb(args) {
+ return rgb2hwb(keyword2rgb(args));
+ }
+ function keyword2cmyk(args) {
+ return rgb2cmyk(keyword2rgb(args));
+ }
+ function keyword2lab(args) {
+ return rgb2lab(keyword2rgb(args));
+ }
+ function keyword2xyz(args) {
+ return rgb2xyz(keyword2rgb(args));
+ }
+ var cssKeywords = {
+ aliceblue: [240, 248, 255],
+ antiquewhite: [250, 235, 215],
+ aqua: [0, 255, 255],
+ aquamarine: [127, 255, 212],
+ azure: [240, 255, 255],
+ beige: [245, 245, 220],
+ bisque: [255, 228, 196],
+ black: [0, 0, 0],
+ blanchedalmond: [255, 235, 205],
+ blue: [0, 0, 255],
+ blueviolet: [138, 43, 226],
+ brown: [165, 42, 42],
+ burlywood: [222, 184, 135],
+ cadetblue: [95, 158, 160],
+ chartreuse: [127, 255, 0],
+ chocolate: [210, 105, 30],
+ coral: [255, 127, 80],
+ cornflowerblue: [100, 149, 237],
+ cornsilk: [255, 248, 220],
+ crimson: [220, 20, 60],
+ cyan: [0, 255, 255],
+ darkblue: [0, 0, 139],
+ darkcyan: [0, 139, 139],
+ darkgoldenrod: [184, 134, 11],
+ darkgray: [169, 169, 169],
+ darkgreen: [0, 100, 0],
+ darkgrey: [169, 169, 169],
+ darkkhaki: [189, 183, 107],
+ darkmagenta: [139, 0, 139],
+ darkolivegreen: [85, 107, 47],
+ darkorange: [255, 140, 0],
+ darkorchid: [153, 50, 204],
+ darkred: [139, 0, 0],
+ darksalmon: [233, 150, 122],
+ darkseagreen: [143, 188, 143],
+ darkslateblue: [72, 61, 139],
+ darkslategray: [47, 79, 79],
+ darkslategrey: [47, 79, 79],
+ darkturquoise: [0, 206, 209],
+ darkviolet: [148, 0, 211],
+ deeppink: [255, 20, 147],
+ deepskyblue: [0, 191, 255],
+ dimgray: [105, 105, 105],
+ dimgrey: [105, 105, 105],
+ dodgerblue: [30, 144, 255],
+ firebrick: [178, 34, 34],
+ floralwhite: [255, 250, 240],
+ forestgreen: [34, 139, 34],
+ fuchsia: [255, 0, 255],
+ gainsboro: [220, 220, 220],
+ ghostwhite: [248, 248, 255],
+ gold: [255, 215, 0],
+ goldenrod: [218, 165, 32],
+ gray: [128, 128, 128],
+ green: [0, 128, 0],
+ greenyellow: [173, 255, 47],
+ grey: [128, 128, 128],
+ honeydew: [240, 255, 240],
+ hotpink: [255, 105, 180],
+ indianred: [205, 92, 92],
+ indigo: [75, 0, 130],
+ ivory: [255, 255, 240],
+ khaki: [240, 230, 140],
+ lavender: [230, 230, 250],
+ lavenderblush: [255, 240, 245],
+ lawngreen: [124, 252, 0],
+ lemonchiffon: [255, 250, 205],
+ lightblue: [173, 216, 230],
+ lightcoral: [240, 128, 128],
+ lightcyan: [224, 255, 255],
+ lightgoldenrodyellow: [250, 250, 210],
+ lightgray: [211, 211, 211],
+ lightgreen: [144, 238, 144],
+ lightgrey: [211, 211, 211],
+ lightpink: [255, 182, 193],
+ lightsalmon: [255, 160, 122],
+ lightseagreen: [32, 178, 170],
+ lightskyblue: [135, 206, 250],
+ lightslategray: [119, 136, 153],
+ lightslategrey: [119, 136, 153],
+ lightsteelblue: [176, 196, 222],
+ lightyellow: [255, 255, 224],
+ lime: [0, 255, 0],
+ limegreen: [50, 205, 50],
+ linen: [250, 240, 230],
+ magenta: [255, 0, 255],
+ maroon: [128, 0, 0],
+ mediumaquamarine: [102, 205, 170],
+ mediumblue: [0, 0, 205],
+ mediumorchid: [186, 85, 211],
+ mediumpurple: [147, 112, 219],
+ mediumseagreen: [60, 179, 113],
+ mediumslateblue: [123, 104, 238],
+ mediumspringgreen: [0, 250, 154],
+ mediumturquoise: [72, 209, 204],
+ mediumvioletred: [199, 21, 133],
+ midnightblue: [25, 25, 112],
+ mintcream: [245, 255, 250],
+ mistyrose: [255, 228, 225],
+ moccasin: [255, 228, 181],
+ navajowhite: [255, 222, 173],
+ navy: [0, 0, 128],
+ oldlace: [253, 245, 230],
+ olive: [128, 128, 0],
+ olivedrab: [107, 142, 35],
+ orange: [255, 165, 0],
+ orangered: [255, 69, 0],
+ orchid: [218, 112, 214],
+ palegoldenrod: [238, 232, 170],
+ palegreen: [152, 251, 152],
+ paleturquoise: [175, 238, 238],
+ palevioletred: [219, 112, 147],
+ papayawhip: [255, 239, 213],
+ peachpuff: [255, 218, 185],
+ peru: [205, 133, 63],
+ pink: [255, 192, 203],
+ plum: [221, 160, 221],
+ powderblue: [176, 224, 230],
+ purple: [128, 0, 128],
+ rebeccapurple: [102, 51, 153],
+ red: [255, 0, 0],
+ rosybrown: [188, 143, 143],
+ royalblue: [65, 105, 225],
+ saddlebrown: [139, 69, 19],
+ salmon: [250, 128, 114],
+ sandybrown: [244, 164, 96],
+ seagreen: [46, 139, 87],
+ seashell: [255, 245, 238],
+ sienna: [160, 82, 45],
+ silver: [192, 192, 192],
+ skyblue: [135, 206, 235],
+ slateblue: [106, 90, 205],
+ slategray: [112, 128, 144],
+ slategrey: [112, 128, 144],
+ snow: [255, 250, 250],
+ springgreen: [0, 255, 127],
+ steelblue: [70, 130, 180],
+ tan: [210, 180, 140],
+ teal: [0, 128, 128],
+ thistle: [216, 191, 216],
+ tomato: [255, 99, 71],
+ turquoise: [64, 224, 208],
+ violet: [238, 130, 238],
+ wheat: [245, 222, 179],
+ white: [255, 255, 255],
+ whitesmoke: [245, 245, 245],
+ yellow: [255, 255, 0],
+ yellowgreen: [154, 205, 50]
+ };
+ var reverseKeywords = {};
+ for (var key in cssKeywords) {
+ reverseKeywords[JSON.stringify(cssKeywords[key])] = key;
+ }
+ var convert = function convert() {
+ return new Converter();
+ };
+ for (var func in conversions) {
+ // export Raw versions
+ convert[func + "Raw"] = function (func) {
+ // accept array or plain args
+ return function (arg) {
+ if (typeof arg == "number") arg = Array.prototype.slice.call(arguments);
+ return conversions[func](arg);
+ };
+ }(func);
+ var pair = /(\w+)2(\w+)/.exec(func),
+ from = pair[1],
+ to = pair[2];
+
+ // export rgb2hsl and ["rgb"]["hsl"]
+ convert[from] = convert[from] || {};
+ convert[from][to] = convert[func] = function (func) {
+ return function (arg) {
+ if (typeof arg == "number") arg = Array.prototype.slice.call(arguments);
+ var val = conversions[func](arg);
+ if (typeof val == "string" || val === undefined) return val; // keyword
+
+ for (var i = 0; i < val.length; i++) val[i] = Math.round(val[i]);
+ return val;
+ };
+ }(func);
+ }
+
+ /* Converter does lazy conversion and caching */
+ var Converter = function Converter() {
+ this.convs = {};
+ };
+
+ /* Either get the values for a space or
+ set the values for a space, depending on args */
+ Converter.prototype.routeSpace = function (space, args) {
+ var values = args[0];
+ if (values === undefined) {
+ // color.rgb()
+ return this.getValues(space);
+ }
+ // color.rgb(10, 10, 10)
+ if (typeof values == "number") {
+ values = Array.prototype.slice.call(args);
+ }
+ return this.setValues(space, values);
+ };
+
+ /* Set the values for a space, invalidating cache */
+ Converter.prototype.setValues = function (space, values) {
+ this.space = space;
+ this.convs = {};
+ this.convs[space] = values;
+ return this;
+ };
+
+ /* Get the values for a space. If there's already
+ a conversion for the space, fetch it, otherwise
+ compute it */
+ Converter.prototype.getValues = function (space) {
+ var vals = this.convs[space];
+ if (!vals) {
+ var fspace = this.space,
+ from = this.convs[fspace];
+ vals = convert[fspace][space](from);
+ this.convs[space] = vals;
+ }
+ return vals;
+ };
+ ["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function (space) {
+ Converter.prototype[space] = function (vals) {
+ return this.routeSpace(space, arguments);
+ };
+ });
+ var colorConvert = convert;
+ var colorName = {
+ "aliceblue": [240, 248, 255],
+ "antiquewhite": [250, 235, 215],
+ "aqua": [0, 255, 255],
+ "aquamarine": [127, 255, 212],
+ "azure": [240, 255, 255],
+ "beige": [245, 245, 220],
+ "bisque": [255, 228, 196],
+ "black": [0, 0, 0],
+ "blanchedalmond": [255, 235, 205],
+ "blue": [0, 0, 255],
+ "blueviolet": [138, 43, 226],
+ "brown": [165, 42, 42],
+ "burlywood": [222, 184, 135],
+ "cadetblue": [95, 158, 160],
+ "chartreuse": [127, 255, 0],
+ "chocolate": [210, 105, 30],
+ "coral": [255, 127, 80],
+ "cornflowerblue": [100, 149, 237],
+ "cornsilk": [255, 248, 220],
+ "crimson": [220, 20, 60],
+ "cyan": [0, 255, 255],
+ "darkblue": [0, 0, 139],
+ "darkcyan": [0, 139, 139],
+ "darkgoldenrod": [184, 134, 11],
+ "darkgray": [169, 169, 169],
+ "darkgreen": [0, 100, 0],
+ "darkgrey": [169, 169, 169],
+ "darkkhaki": [189, 183, 107],
+ "darkmagenta": [139, 0, 139],
+ "darkolivegreen": [85, 107, 47],
+ "darkorange": [255, 140, 0],
+ "darkorchid": [153, 50, 204],
+ "darkred": [139, 0, 0],
+ "darksalmon": [233, 150, 122],
+ "darkseagreen": [143, 188, 143],
+ "darkslateblue": [72, 61, 139],
+ "darkslategray": [47, 79, 79],
+ "darkslategrey": [47, 79, 79],
+ "darkturquoise": [0, 206, 209],
+ "darkviolet": [148, 0, 211],
+ "deeppink": [255, 20, 147],
+ "deepskyblue": [0, 191, 255],
+ "dimgray": [105, 105, 105],
+ "dimgrey": [105, 105, 105],
+ "dodgerblue": [30, 144, 255],
+ "firebrick": [178, 34, 34],
+ "floralwhite": [255, 250, 240],
+ "forestgreen": [34, 139, 34],
+ "fuchsia": [255, 0, 255],
+ "gainsboro": [220, 220, 220],
+ "ghostwhite": [248, 248, 255],
+ "gold": [255, 215, 0],
+ "goldenrod": [218, 165, 32],
+ "gray": [128, 128, 128],
+ "green": [0, 128, 0],
+ "greenyellow": [173, 255, 47],
+ "grey": [128, 128, 128],
+ "honeydew": [240, 255, 240],
+ "hotpink": [255, 105, 180],
+ "indianred": [205, 92, 92],
+ "indigo": [75, 0, 130],
+ "ivory": [255, 255, 240],
+ "khaki": [240, 230, 140],
+ "lavender": [230, 230, 250],
+ "lavenderblush": [255, 240, 245],
+ "lawngreen": [124, 252, 0],
+ "lemonchiffon": [255, 250, 205],
+ "lightblue": [173, 216, 230],
+ "lightcoral": [240, 128, 128],
+ "lightcyan": [224, 255, 255],
+ "lightgoldenrodyellow": [250, 250, 210],
+ "lightgray": [211, 211, 211],
+ "lightgreen": [144, 238, 144],
+ "lightgrey": [211, 211, 211],
+ "lightpink": [255, 182, 193],
+ "lightsalmon": [255, 160, 122],
+ "lightseagreen": [32, 178, 170],
+ "lightskyblue": [135, 206, 250],
+ "lightslategray": [119, 136, 153],
+ "lightslategrey": [119, 136, 153],
+ "lightsteelblue": [176, 196, 222],
+ "lightyellow": [255, 255, 224],
+ "lime": [0, 255, 0],
+ "limegreen": [50, 205, 50],
+ "linen": [250, 240, 230],
+ "magenta": [255, 0, 255],
+ "maroon": [128, 0, 0],
+ "mediumaquamarine": [102, 205, 170],
+ "mediumblue": [0, 0, 205],
+ "mediumorchid": [186, 85, 211],
+ "mediumpurple": [147, 112, 219],
+ "mediumseagreen": [60, 179, 113],
+ "mediumslateblue": [123, 104, 238],
+ "mediumspringgreen": [0, 250, 154],
+ "mediumturquoise": [72, 209, 204],
+ "mediumvioletred": [199, 21, 133],
+ "midnightblue": [25, 25, 112],
+ "mintcream": [245, 255, 250],
+ "mistyrose": [255, 228, 225],
+ "moccasin": [255, 228, 181],
+ "navajowhite": [255, 222, 173],
+ "navy": [0, 0, 128],
+ "oldlace": [253, 245, 230],
+ "olive": [128, 128, 0],
+ "olivedrab": [107, 142, 35],
+ "orange": [255, 165, 0],
+ "orangered": [255, 69, 0],
+ "orchid": [218, 112, 214],
+ "palegoldenrod": [238, 232, 170],
+ "palegreen": [152, 251, 152],
+ "paleturquoise": [175, 238, 238],
+ "palevioletred": [219, 112, 147],
+ "papayawhip": [255, 239, 213],
+ "peachpuff": [255, 218, 185],
+ "peru": [205, 133, 63],
+ "pink": [255, 192, 203],
+ "plum": [221, 160, 221],
+ "powderblue": [176, 224, 230],
+ "purple": [128, 0, 128],
+ "rebeccapurple": [102, 51, 153],
+ "red": [255, 0, 0],
+ "rosybrown": [188, 143, 143],
+ "royalblue": [65, 105, 225],
+ "saddlebrown": [139, 69, 19],
+ "salmon": [250, 128, 114],
+ "sandybrown": [244, 164, 96],
+ "seagreen": [46, 139, 87],
+ "seashell": [255, 245, 238],
+ "sienna": [160, 82, 45],
+ "silver": [192, 192, 192],
+ "skyblue": [135, 206, 235],
+ "slateblue": [106, 90, 205],
+ "slategray": [112, 128, 144],
+ "slategrey": [112, 128, 144],
+ "snow": [255, 250, 250],
+ "springgreen": [0, 255, 127],
+ "steelblue": [70, 130, 180],
+ "tan": [210, 180, 140],
+ "teal": [0, 128, 128],
+ "thistle": [216, 191, 216],
+ "tomato": [255, 99, 71],
+ "turquoise": [64, 224, 208],
+ "violet": [238, 130, 238],
+ "wheat": [245, 222, 179],
+ "white": [255, 255, 255],
+ "whitesmoke": [245, 245, 245],
+ "yellow": [255, 255, 0],
+ "yellowgreen": [154, 205, 50]
+ };
+
+ /* MIT license */
+
+ var colorString = {
+ getRgba: getRgba,
+ getHsla: getHsla,
+ getRgb: getRgb,
+ getHsl: getHsl,
+ getHwb: getHwb,
+ getAlpha: getAlpha,
+ hexString: hexString,
+ rgbString: rgbString,
+ rgbaString: rgbaString,
+ percentString: percentString,
+ percentaString: percentaString,
+ hslString: hslString,
+ hslaString: hslaString,
+ hwbString: hwbString,
+ keyword: keyword
+ };
+ function getRgba(string) {
+ if (!string) {
+ return;
+ }
+ var abbr = /^#([a-fA-F0-9]{3,4})$/i,
+ hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i,
+ rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i,
+ per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i,
+ keyword = /(\w+)/;
+ var rgb = [0, 0, 0],
+ a = 1,
+ match = string.match(abbr),
+ hexAlpha = "";
+ if (match) {
+ match = match[1];
+ hexAlpha = match[3];
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = parseInt(match[i] + match[i], 16);
+ }
+ if (hexAlpha) {
+ a = Math.round(parseInt(hexAlpha + hexAlpha, 16) / 255 * 100) / 100;
+ }
+ } else if (match = string.match(hex)) {
+ hexAlpha = match[2];
+ match = match[1];
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);
+ }
+ if (hexAlpha) {
+ a = Math.round(parseInt(hexAlpha, 16) / 255 * 100) / 100;
+ }
+ } else if (match = string.match(rgba)) {
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = parseInt(match[i + 1]);
+ }
+ a = parseFloat(match[4]);
+ } else if (match = string.match(per)) {
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);
+ }
+ a = parseFloat(match[4]);
+ } else if (match = string.match(keyword)) {
+ if (match[1] == "transparent") {
+ return [0, 0, 0, 0];
+ }
+ rgb = colorName[match[1]];
+ if (!rgb) {
+ return;
+ }
+ }
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = scale(rgb[i], 0, 255);
+ }
+ if (!a && a != 0) {
+ a = 1;
+ } else {
+ a = scale(a, 0, 1);
+ }
+ rgb[3] = a;
+ return rgb;
+ }
+ function getHsla(string) {
+ if (!string) {
+ return;
+ }
+ var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
+ var match = string.match(hsl);
+ if (match) {
+ var alpha = parseFloat(match[4]);
+ var h = scale(parseInt(match[1]), 0, 360),
+ s = scale(parseFloat(match[2]), 0, 100),
+ l = scale(parseFloat(match[3]), 0, 100),
+ a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
+ return [h, s, l, a];
+ }
+ }
+ function getHwb(string) {
+ if (!string) {
+ return;
+ }
+ var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
+ var match = string.match(hwb);
+ if (match) {
+ var alpha = parseFloat(match[4]);
+ var h = scale(parseInt(match[1]), 0, 360),
+ w = scale(parseFloat(match[2]), 0, 100),
+ b = scale(parseFloat(match[3]), 0, 100),
+ a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
+ return [h, w, b, a];
+ }
+ }
+ function getRgb(string) {
+ var rgba = getRgba(string);
+ return rgba && rgba.slice(0, 3);
+ }
+ function getHsl(string) {
+ var hsla = getHsla(string);
+ return hsla && hsla.slice(0, 3);
+ }
+ function getAlpha(string) {
+ var vals = getRgba(string);
+ if (vals) {
+ return vals[3];
+ } else if (vals = getHsla(string)) {
+ return vals[3];
+ } else if (vals = getHwb(string)) {
+ return vals[3];
+ }
+ }
+
+ // generators
+ function hexString(rgba, a) {
+ var a = a !== undefined && rgba.length === 3 ? a : rgba[3];
+ return "#" + hexDouble(rgba[0]) + hexDouble(rgba[1]) + hexDouble(rgba[2]) + (a >= 0 && a < 1 ? hexDouble(Math.round(a * 255)) : "");
+ }
+ function rgbString(rgba, alpha) {
+ if (alpha < 1 || rgba[3] && rgba[3] < 1) {
+ return rgbaString(rgba, alpha);
+ }
+ return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")";
+ }
+ function rgbaString(rgba, alpha) {
+ if (alpha === undefined) {
+ alpha = rgba[3] !== undefined ? rgba[3] : 1;
+ }
+ return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ", " + alpha + ")";
+ }
+ function percentString(rgba, alpha) {
+ if (alpha < 1 || rgba[3] && rgba[3] < 1) {
+ return percentaString(rgba, alpha);
+ }
+ var r = Math.round(rgba[0] / 255 * 100),
+ g = Math.round(rgba[1] / 255 * 100),
+ b = Math.round(rgba[2] / 255 * 100);
+ return "rgb(" + r + "%, " + g + "%, " + b + "%)";
+ }
+ function percentaString(rgba, alpha) {
+ var r = Math.round(rgba[0] / 255 * 100),
+ g = Math.round(rgba[1] / 255 * 100),
+ b = Math.round(rgba[2] / 255 * 100);
+ return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")";
+ }
+ function hslString(hsla, alpha) {
+ if (alpha < 1 || hsla[3] && hsla[3] < 1) {
+ return hslaString(hsla, alpha);
+ }
+ return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)";
+ }
+ function hslaString(hsla, alpha) {
+ if (alpha === undefined) {
+ alpha = hsla[3] !== undefined ? hsla[3] : 1;
+ }
+ return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + alpha + ")";
+ }
+
+ // hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax
+ // (hwb have alpha optional & 1 is default value)
+ function hwbString(hwb, alpha) {
+ if (alpha === undefined) {
+ alpha = hwb[3] !== undefined ? hwb[3] : 1;
+ }
+ return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")";
+ }
+ function keyword(rgb) {
+ return reverseNames[rgb.slice(0, 3)];
+ }
+
+ // helpers
+ function scale(num, min, max) {
+ return Math.min(Math.max(min, num), max);
+ }
+ function hexDouble(num) {
+ var str = num.toString(16).toUpperCase();
+ return str.length < 2 ? "0" + str : str;
+ }
+
+ //create a list of reverse color names
+ var reverseNames = {};
+ for (var name in colorName) {
+ reverseNames[colorName[name]] = name;
+ }
+
+ /* MIT license */
+
+ var Color = function Color(obj) {
+ if (obj instanceof Color) {
+ return obj;
+ }
+ if (!(this instanceof Color)) {
+ return new Color(obj);
+ }
+ this.valid = false;
+ this.values = {
+ rgb: [0, 0, 0],
+ hsl: [0, 0, 0],
+ hsv: [0, 0, 0],
+ hwb: [0, 0, 0],
+ cmyk: [0, 0, 0, 0],
+ alpha: 1
+ };
+
+ // parse Color() argument
+ var vals;
+ if (typeof obj === 'string') {
+ vals = colorString.getRgba(obj);
+ if (vals) {
+ this.setValues('rgb', vals);
+ } else if (vals = colorString.getHsla(obj)) {
+ this.setValues('hsl', vals);
+ } else if (vals = colorString.getHwb(obj)) {
+ this.setValues('hwb', vals);
+ }
+ } else if (_typeof(obj) === 'object') {
+ vals = obj;
+ if (vals.r !== undefined || vals.red !== undefined) {
+ this.setValues('rgb', vals);
+ } else if (vals.l !== undefined || vals.lightness !== undefined) {
+ this.setValues('hsl', vals);
+ } else if (vals.v !== undefined || vals.value !== undefined) {
+ this.setValues('hsv', vals);
+ } else if (vals.w !== undefined || vals.whiteness !== undefined) {
+ this.setValues('hwb', vals);
+ } else if (vals.c !== undefined || vals.cyan !== undefined) {
+ this.setValues('cmyk', vals);
+ }
+ }
+ };
+ Color.prototype = {
+ isValid: function isValid() {
+ return this.valid;
+ },
+ rgb: function rgb() {
+ return this.setSpace('rgb', arguments);
+ },
+ hsl: function hsl() {
+ return this.setSpace('hsl', arguments);
+ },
+ hsv: function hsv() {
+ return this.setSpace('hsv', arguments);
+ },
+ hwb: function hwb() {
+ return this.setSpace('hwb', arguments);
+ },
+ cmyk: function cmyk() {
+ return this.setSpace('cmyk', arguments);
+ },
+ rgbArray: function rgbArray() {
+ return this.values.rgb;
+ },
+ hslArray: function hslArray() {
+ return this.values.hsl;
+ },
+ hsvArray: function hsvArray() {
+ return this.values.hsv;
+ },
+ hwbArray: function hwbArray() {
+ var values = this.values;
+ if (values.alpha !== 1) {
+ return values.hwb.concat([values.alpha]);
+ }
+ return values.hwb;
+ },
+ cmykArray: function cmykArray() {
+ return this.values.cmyk;
+ },
+ rgbaArray: function rgbaArray() {
+ var values = this.values;
+ return values.rgb.concat([values.alpha]);
+ },
+ hslaArray: function hslaArray() {
+ var values = this.values;
+ return values.hsl.concat([values.alpha]);
+ },
+ alpha: function alpha(val) {
+ if (val === undefined) {
+ return this.values.alpha;
+ }
+ this.setValues('alpha', val);
+ return this;
+ },
+ red: function red(val) {
+ return this.setChannel('rgb', 0, val);
+ },
+ green: function green(val) {
+ return this.setChannel('rgb', 1, val);
+ },
+ blue: function blue(val) {
+ return this.setChannel('rgb', 2, val);
+ },
+ hue: function hue(val) {
+ if (val) {
+ val %= 360;
+ val = val < 0 ? 360 + val : val;
+ }
+ return this.setChannel('hsl', 0, val);
+ },
+ saturation: function saturation(val) {
+ return this.setChannel('hsl', 1, val);
+ },
+ lightness: function lightness(val) {
+ return this.setChannel('hsl', 2, val);
+ },
+ saturationv: function saturationv(val) {
+ return this.setChannel('hsv', 1, val);
+ },
+ whiteness: function whiteness(val) {
+ return this.setChannel('hwb', 1, val);
+ },
+ blackness: function blackness(val) {
+ return this.setChannel('hwb', 2, val);
+ },
+ value: function value(val) {
+ return this.setChannel('hsv', 2, val);
+ },
+ cyan: function cyan(val) {
+ return this.setChannel('cmyk', 0, val);
+ },
+ magenta: function magenta(val) {
+ return this.setChannel('cmyk', 1, val);
+ },
+ yellow: function yellow(val) {
+ return this.setChannel('cmyk', 2, val);
+ },
+ black: function black(val) {
+ return this.setChannel('cmyk', 3, val);
+ },
+ hexString: function hexString() {
+ return colorString.hexString(this.values.rgb);
+ },
+ rgbString: function rgbString() {
+ return colorString.rgbString(this.values.rgb, this.values.alpha);
+ },
+ rgbaString: function rgbaString() {
+ return colorString.rgbaString(this.values.rgb, this.values.alpha);
+ },
+ percentString: function percentString() {
+ return colorString.percentString(this.values.rgb, this.values.alpha);
+ },
+ hslString: function hslString() {
+ return colorString.hslString(this.values.hsl, this.values.alpha);
+ },
+ hslaString: function hslaString() {
+ return colorString.hslaString(this.values.hsl, this.values.alpha);
+ },
+ hwbString: function hwbString() {
+ return colorString.hwbString(this.values.hwb, this.values.alpha);
+ },
+ keyword: function keyword() {
+ return colorString.keyword(this.values.rgb, this.values.alpha);
+ },
+ rgbNumber: function rgbNumber() {
+ var rgb = this.values.rgb;
+ return rgb[0] << 16 | rgb[1] << 8 | rgb[2];
+ },
+ luminosity: function luminosity() {
+ // http://www.w3.org/TR/WCAG20/#relativeluminancedef
+ var rgb = this.values.rgb;
+ var lum = [];
+ for (var i = 0; i < rgb.length; i++) {
+ var chan = rgb[i] / 255;
+ lum[i] = chan <= 0.03928 ? chan / 12.92 : Math.pow((chan + 0.055) / 1.055, 2.4);
+ }
+ return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];
+ },
+ contrast: function contrast(color2) {
+ // http://www.w3.org/TR/WCAG20/#contrast-ratiodef
+ var lum1 = this.luminosity();
+ var lum2 = color2.luminosity();
+ if (lum1 > lum2) {
+ return (lum1 + 0.05) / (lum2 + 0.05);
+ }
+ return (lum2 + 0.05) / (lum1 + 0.05);
+ },
+ level: function level(color2) {
+ var contrastRatio = this.contrast(color2);
+ if (contrastRatio >= 7.1) {
+ return 'AAA';
+ }
+ return contrastRatio >= 4.5 ? 'AA' : '';
+ },
+ dark: function dark() {
+ // YIQ equation from http://24ways.org/2010/calculating-color-contrast
+ var rgb = this.values.rgb;
+ var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;
+ return yiq < 128;
+ },
+ light: function light() {
+ return !this.dark();
+ },
+ negate: function negate() {
+ var rgb = [];
+ for (var i = 0; i < 3; i++) {
+ rgb[i] = 255 - this.values.rgb[i];
+ }
+ this.setValues('rgb', rgb);
+ return this;
+ },
+ lighten: function lighten(ratio) {
+ var hsl = this.values.hsl;
+ hsl[2] += hsl[2] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+ darken: function darken(ratio) {
+ var hsl = this.values.hsl;
+ hsl[2] -= hsl[2] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+ saturate: function saturate(ratio) {
+ var hsl = this.values.hsl;
+ hsl[1] += hsl[1] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+ desaturate: function desaturate(ratio) {
+ var hsl = this.values.hsl;
+ hsl[1] -= hsl[1] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+ whiten: function whiten(ratio) {
+ var hwb = this.values.hwb;
+ hwb[1] += hwb[1] * ratio;
+ this.setValues('hwb', hwb);
+ return this;
+ },
+ blacken: function blacken(ratio) {
+ var hwb = this.values.hwb;
+ hwb[2] += hwb[2] * ratio;
+ this.setValues('hwb', hwb);
+ return this;
+ },
+ greyscale: function greyscale() {
+ var rgb = this.values.rgb;
+ // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
+ var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;
+ this.setValues('rgb', [val, val, val]);
+ return this;
+ },
+ clearer: function clearer(ratio) {
+ var alpha = this.values.alpha;
+ this.setValues('alpha', alpha - alpha * ratio);
+ return this;
+ },
+ opaquer: function opaquer(ratio) {
+ var alpha = this.values.alpha;
+ this.setValues('alpha', alpha + alpha * ratio);
+ return this;
+ },
+ rotate: function rotate(degrees) {
+ var hsl = this.values.hsl;
+ var hue = (hsl[0] + degrees) % 360;
+ hsl[0] = hue < 0 ? 360 + hue : hue;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+ /**
+ * Ported from sass implementation in C
+ * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209
+ */
+ mix: function mix(mixinColor, weight) {
+ var color1 = this;
+ var color2 = mixinColor;
+ var p = weight === undefined ? 0.5 : weight;
+ var w = 2 * p - 1;
+ var a = color1.alpha() - color2.alpha();
+ var w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
+ var w2 = 1 - w1;
+ return this.rgb(w1 * color1.red() + w2 * color2.red(), w1 * color1.green() + w2 * color2.green(), w1 * color1.blue() + w2 * color2.blue()).alpha(color1.alpha() * p + color2.alpha() * (1 - p));
+ },
+ toJSON: function toJSON() {
+ return this.rgb();
+ },
+ clone: function clone() {
+ // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,
+ // making the final build way to big to embed in Chart.js. So let's do it manually,
+ // assuming that values to clone are 1 dimension arrays containing only numbers,
+ // except 'alpha' which is a number.
+ var result = new Color();
+ var source = this.values;
+ var target = result.values;
+ var value, type;
+ for (var prop in source) {
+ if (source.hasOwnProperty(prop)) {
+ value = source[prop];
+ type = {}.toString.call(value);
+ if (type === '[object Array]') {
+ target[prop] = value.slice(0);
+ } else if (type === '[object Number]') {
+ target[prop] = value;
+ } else {
+ console.error('unexpected color value:', value);
+ }
+ }
+ }
+ return result;
+ }
+ };
+ Color.prototype.spaces = {
+ rgb: ['red', 'green', 'blue'],
+ hsl: ['hue', 'saturation', 'lightness'],
+ hsv: ['hue', 'saturation', 'value'],
+ hwb: ['hue', 'whiteness', 'blackness'],
+ cmyk: ['cyan', 'magenta', 'yellow', 'black']
+ };
+ Color.prototype.maxes = {
+ rgb: [255, 255, 255],
+ hsl: [360, 100, 100],
+ hsv: [360, 100, 100],
+ hwb: [360, 100, 100],
+ cmyk: [100, 100, 100, 100]
+ };
+ Color.prototype.getValues = function (space) {
+ var values = this.values;
+ var vals = {};
+ for (var i = 0; i < space.length; i++) {
+ vals[space.charAt(i)] = values[space][i];
+ }
+ if (values.alpha !== 1) {
+ vals.a = values.alpha;
+ }
+
+ // {r: 255, g: 255, b: 255, a: 0.4}
+ return vals;
+ };
+ Color.prototype.setValues = function (space, vals) {
+ var values = this.values;
+ var spaces = this.spaces;
+ var maxes = this.maxes;
+ var alpha = 1;
+ var i;
+ this.valid = true;
+ if (space === 'alpha') {
+ alpha = vals;
+ } else if (vals.length) {
+ // [10, 10, 10]
+ values[space] = vals.slice(0, space.length);
+ alpha = vals[space.length];
+ } else if (vals[space.charAt(0)] !== undefined) {
+ // {r: 10, g: 10, b: 10}
+ for (i = 0; i < space.length; i++) {
+ values[space][i] = vals[space.charAt(i)];
+ }
+ alpha = vals.a;
+ } else if (vals[spaces[space][0]] !== undefined) {
+ // {red: 10, green: 10, blue: 10}
+ var chans = spaces[space];
+ for (i = 0; i < space.length; i++) {
+ values[space][i] = vals[chans[i]];
+ }
+ alpha = vals.alpha;
+ }
+ values.alpha = Math.max(0, Math.min(1, alpha === undefined ? values.alpha : alpha));
+ if (space === 'alpha') {
+ return false;
+ }
+ var capped;
+
+ // cap values of the space prior converting all values
+ for (i = 0; i < space.length; i++) {
+ capped = Math.max(0, Math.min(maxes[space][i], values[space][i]));
+ values[space][i] = Math.round(capped);
+ }
+
+ // convert to all the other color spaces
+ for (var sname in spaces) {
+ if (sname !== space) {
+ values[sname] = colorConvert[space][sname](values[space]);
+ }
+ }
+ return true;
+ };
+ Color.prototype.setSpace = function (space, args) {
+ var vals = args[0];
+ if (vals === undefined) {
+ // color.rgb()
+ return this.getValues(space);
+ }
+
+ // color.rgb(10, 10, 10)
+ if (typeof vals === 'number') {
+ vals = Array.prototype.slice.call(args);
+ }
+ this.setValues(space, vals);
+ return this;
+ };
+ Color.prototype.setChannel = function (space, index, val) {
+ var svalues = this.values[space];
+ if (val === undefined) {
+ // color.red()
+ return svalues[index];
+ } else if (val === svalues[index]) {
+ // color.red(color.red())
+ return this;
+ }
+
+ // color.red(100)
+ svalues[index] = val;
+ this.setValues(space, svalues);
+ return this;
+ };
+ if (typeof window !== 'undefined') {
+ window.Color = Color;
+ }
+ var chartjsColor = Color;
+
+ /**
+ * @namespace Chart.helpers
+ */
+ var helpers = {
+ /**
+ * An empty function that can be used, for example, for optional callback.
+ */
+ noop: function noop() {},
+ /**
+ * Returns a unique id, sequentially generated from a global variable.
+ * @returns {number}
+ * @function
+ */
+ uid: function () {
+ var id = 0;
+ return function () {
+ return id++;
+ };
+ }(),
+ /**
+ * Returns true if `value` is neither null nor undefined, else returns false.
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ * @since 2.7.0
+ */
+ isNullOrUndef: function isNullOrUndef(value) {
+ return value === null || typeof value === 'undefined';
+ },
+ /**
+ * Returns true if `value` is an array (including typed arrays), else returns false.
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ * @function
+ */
+ isArray: function isArray(value) {
+ if (Array.isArray && Array.isArray(value)) {
+ return true;
+ }
+ var type = Object.prototype.toString.call(value);
+ if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {
+ return true;
+ }
+ return false;
+ },
+ /**
+ * Returns true if `value` is an object (excluding null), else returns false.
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ * @since 2.7.0
+ */
+ isObject: function isObject(value) {
+ return value !== null && Object.prototype.toString.call(value) === '[object Object]';
+ },
+ /**
+ * Returns true if `value` is a finite number, else returns false
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ */
+ isFinite: function (_isFinite) {
+ function isFinite(_x) {
+ return _isFinite.apply(this, arguments);
+ }
+ isFinite.toString = function () {
+ return _isFinite.toString();
+ };
+ return isFinite;
+ }(function (value) {
+ return (typeof value === 'number' || value instanceof Number) && isFinite(value);
+ }),
+ /**
+ * Returns `value` if defined, else returns `defaultValue`.
+ * @param {*} value - The value to return if defined.
+ * @param {*} defaultValue - The value to return if `value` is undefined.
+ * @returns {*}
+ */
+ valueOrDefault: function valueOrDefault(value, defaultValue) {
+ return typeof value === 'undefined' ? defaultValue : value;
+ },
+ /**
+ * Returns value at the given `index` in array if defined, else returns `defaultValue`.
+ * @param {Array} value - The array to lookup for value at `index`.
+ * @param {number} index - The index in `value` to lookup for value.
+ * @param {*} defaultValue - The value to return if `value[index]` is undefined.
+ * @returns {*}
+ */
+ valueAtIndexOrDefault: function valueAtIndexOrDefault(value, index, defaultValue) {
+ return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);
+ },
+ /**
+ * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the
+ * value returned by `fn`. If `fn` is not a function, this method returns undefined.
+ * @param {function} fn - The function to call.
+ * @param {Array|undefined|null} args - The arguments with which `fn` should be called.
+ * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.
+ * @returns {*}
+ */
+ callback: function callback(fn, args, thisArg) {
+ if (fn && typeof fn.call === 'function') {
+ return fn.apply(thisArg, args);
+ }
+ },
+ /**
+ * Note(SB) for performance sake, this method should only be used when loopable type
+ * is unknown or in none intensive code (not called often and small loopable). Else
+ * it's preferable to use a regular for() loop and save extra function calls.
+ * @param {object|Array} loopable - The object or array to be iterated.
+ * @param {function} fn - The function to call for each item.
+ * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.
+ * @param {boolean} [reverse] - If true, iterates backward on the loopable.
+ */
+ each: function each(loopable, fn, thisArg, reverse) {
+ var i, len, keys;
+ if (helpers.isArray(loopable)) {
+ len = loopable.length;
+ if (reverse) {
+ for (i = len - 1; i >= 0; i--) {
+ fn.call(thisArg, loopable[i], i);
+ }
+ } else {
+ for (i = 0; i < len; i++) {
+ fn.call(thisArg, loopable[i], i);
+ }
+ }
+ } else if (helpers.isObject(loopable)) {
+ keys = Object.keys(loopable);
+ len = keys.length;
+ for (i = 0; i < len; i++) {
+ fn.call(thisArg, loopable[keys[i]], keys[i]);
+ }
+ }
+ },
+ /**
+ * Returns true if the `a0` and `a1` arrays have the same content, else returns false.
+ * @see https://stackoverflow.com/a/14853974
+ * @param {Array} a0 - The array to compare
+ * @param {Array} a1 - The array to compare
+ * @returns {boolean}
+ */
+ arrayEquals: function arrayEquals(a0, a1) {
+ var i, ilen, v0, v1;
+ if (!a0 || !a1 || a0.length !== a1.length) {
+ return false;
+ }
+ for (i = 0, ilen = a0.length; i < ilen; ++i) {
+ v0 = a0[i];
+ v1 = a1[i];
+ if (v0 instanceof Array && v1 instanceof Array) {
+ if (!helpers.arrayEquals(v0, v1)) {
+ return false;
+ }
+ } else if (v0 !== v1) {
+ // NOTE: two different object instances will never be equal: {x:20} != {x:20}
+ return false;
+ }
+ }
+ return true;
+ },
+ /**
+ * Returns a deep copy of `source` without keeping references on objects and arrays.
+ * @param {*} source - The value to clone.
+ * @returns {*}
+ */
+ clone: function clone(source) {
+ if (helpers.isArray(source)) {
+ return source.map(helpers.clone);
+ }
+ if (helpers.isObject(source)) {
+ var target = {};
+ var keys = Object.keys(source);
+ var klen = keys.length;
+ var k = 0;
+ for (; k < klen; ++k) {
+ target[keys[k]] = helpers.clone(source[keys[k]]);
+ }
+ return target;
+ }
+ return source;
+ },
+ /**
+ * The default merger when Chart.helpers.merge is called without merger option.
+ * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.
+ * @private
+ */
+ _merger: function _merger(key, target, source, options) {
+ var tval = target[key];
+ var sval = source[key];
+ if (helpers.isObject(tval) && helpers.isObject(sval)) {
+ helpers.merge(tval, sval, options);
+ } else {
+ target[key] = helpers.clone(sval);
+ }
+ },
+ /**
+ * Merges source[key] in target[key] only if target[key] is undefined.
+ * @private
+ */
+ _mergerIf: function _mergerIf(key, target, source) {
+ var tval = target[key];
+ var sval = source[key];
+ if (helpers.isObject(tval) && helpers.isObject(sval)) {
+ helpers.mergeIf(tval, sval);
+ } else if (!target.hasOwnProperty(key)) {
+ target[key] = helpers.clone(sval);
+ }
+ },
+ /**
+ * Recursively deep copies `source` properties into `target` with the given `options`.
+ * IMPORTANT: `target` is not cloned and will be updated with `source` properties.
+ * @param {object} target - The target object in which all sources are merged into.
+ * @param {object|object[]} source - Object(s) to merge into `target`.
+ * @param {object} [options] - Merging options:
+ * @param {function} [options.merger] - The merge method (key, target, source, options)
+ * @returns {object} The `target` object.
+ */
+ merge: function merge(target, source, options) {
+ var sources = helpers.isArray(source) ? source : [source];
+ var ilen = sources.length;
+ var merge, i, keys, klen, k;
+ if (!helpers.isObject(target)) {
+ return target;
+ }
+ options = options || {};
+ merge = options.merger || helpers._merger;
+ for (i = 0; i < ilen; ++i) {
+ source = sources[i];
+ if (!helpers.isObject(source)) {
+ continue;
+ }
+ keys = Object.keys(source);
+ for (k = 0, klen = keys.length; k < klen; ++k) {
+ merge(keys[k], target, source, options);
+ }
+ }
+ return target;
+ },
+ /**
+ * Recursively deep copies `source` properties into `target` *only* if not defined in target.
+ * IMPORTANT: `target` is not cloned and will be updated with `source` properties.
+ * @param {object} target - The target object in which all sources are merged into.
+ * @param {object|object[]} source - Object(s) to merge into `target`.
+ * @returns {object} The `target` object.
+ */
+ mergeIf: function mergeIf(target, source) {
+ return helpers.merge(target, source, {
+ merger: helpers._mergerIf
+ });
+ },
+ /**
+ * Applies the contents of two or more objects together into the first object.
+ * @param {object} target - The target object in which all objects are merged into.
+ * @param {object} arg1 - Object containing additional properties to merge in target.
+ * @param {object} argN - Additional objects containing properties to merge in target.
+ * @returns {object} The `target` object.
+ */
+ extend: function extend(target) {
+ var setFn = function setFn(value, key) {
+ target[key] = value;
+ };
+ for (var i = 1, ilen = arguments.length; i < ilen; ++i) {
+ helpers.each(arguments[i], setFn);
+ }
+ return target;
+ },
+ /**
+ * Basic javascript inheritance based on the model created in Backbone.js
+ */
+ inherits: function inherits(extensions) {
+ var me = this;
+ var ChartElement = extensions && extensions.hasOwnProperty('constructor') ? extensions.constructor : function () {
+ return me.apply(this, arguments);
+ };
+ var Surrogate = function Surrogate() {
+ this.constructor = ChartElement;
+ };
+ Surrogate.prototype = me.prototype;
+ ChartElement.prototype = new Surrogate();
+ ChartElement.extend = helpers.inherits;
+ if (extensions) {
+ helpers.extend(ChartElement.prototype, extensions);
+ }
+ ChartElement.__super__ = me.prototype;
+ return ChartElement;
+ }
+ };
+ var helpers_core = helpers;
+
+ // DEPRECATIONS
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.callback instead.
+ * @function Chart.helpers.callCallback
+ * @deprecated since version 2.6.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers.callCallback = helpers.callback;
+
+ /**
+ * Provided for backward compatibility, use Array.prototype.indexOf instead.
+ * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+
+ * @function Chart.helpers.indexOf
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers.indexOf = function (array, item, fromIndex) {
+ return Array.prototype.indexOf.call(array, item, fromIndex);
+ };
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.
+ * @function Chart.helpers.getValueOrDefault
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers.getValueOrDefault = helpers.valueOrDefault;
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.
+ * @function Chart.helpers.getValueAtIndexOrDefault
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;
+
+ /**
+ * Easing functions adapted from Robert Penner's easing equations.
+ * @namespace Chart.helpers.easingEffects
+ * @see http://www.robertpenner.com/easing/
+ */
+ var effects = {
+ linear: function linear(t) {
+ return t;
+ },
+ easeInQuad: function easeInQuad(t) {
+ return t * t;
+ },
+ easeOutQuad: function easeOutQuad(t) {
+ return -t * (t - 2);
+ },
+ easeInOutQuad: function easeInOutQuad(t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t;
+ }
+ return -0.5 * (--t * (t - 2) - 1);
+ },
+ easeInCubic: function easeInCubic(t) {
+ return t * t * t;
+ },
+ easeOutCubic: function easeOutCubic(t) {
+ return (t = t - 1) * t * t + 1;
+ },
+ easeInOutCubic: function easeInOutCubic(t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t * t;
+ }
+ return 0.5 * ((t -= 2) * t * t + 2);
+ },
+ easeInQuart: function easeInQuart(t) {
+ return t * t * t * t;
+ },
+ easeOutQuart: function easeOutQuart(t) {
+ return -((t = t - 1) * t * t * t - 1);
+ },
+ easeInOutQuart: function easeInOutQuart(t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t * t * t;
+ }
+ return -0.5 * ((t -= 2) * t * t * t - 2);
+ },
+ easeInQuint: function easeInQuint(t) {
+ return t * t * t * t * t;
+ },
+ easeOutQuint: function easeOutQuint(t) {
+ return (t = t - 1) * t * t * t * t + 1;
+ },
+ easeInOutQuint: function easeInOutQuint(t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t * t * t * t;
+ }
+ return 0.5 * ((t -= 2) * t * t * t * t + 2);
+ },
+ easeInSine: function easeInSine(t) {
+ return -Math.cos(t * (Math.PI / 2)) + 1;
+ },
+ easeOutSine: function easeOutSine(t) {
+ return Math.sin(t * (Math.PI / 2));
+ },
+ easeInOutSine: function easeInOutSine(t) {
+ return -0.5 * (Math.cos(Math.PI * t) - 1);
+ },
+ easeInExpo: function easeInExpo(t) {
+ return t === 0 ? 0 : Math.pow(2, 10 * (t - 1));
+ },
+ easeOutExpo: function easeOutExpo(t) {
+ return t === 1 ? 1 : -Math.pow(2, -10 * t) + 1;
+ },
+ easeInOutExpo: function easeInOutExpo(t) {
+ if (t === 0) {
+ return 0;
+ }
+ if (t === 1) {
+ return 1;
+ }
+ if ((t /= 0.5) < 1) {
+ return 0.5 * Math.pow(2, 10 * (t - 1));
+ }
+ return 0.5 * (-Math.pow(2, -10 * --t) + 2);
+ },
+ easeInCirc: function easeInCirc(t) {
+ if (t >= 1) {
+ return t;
+ }
+ return -(Math.sqrt(1 - t * t) - 1);
+ },
+ easeOutCirc: function easeOutCirc(t) {
+ return Math.sqrt(1 - (t = t - 1) * t);
+ },
+ easeInOutCirc: function easeInOutCirc(t) {
+ if ((t /= 0.5) < 1) {
+ return -0.5 * (Math.sqrt(1 - t * t) - 1);
+ }
+ return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);
+ },
+ easeInElastic: function easeInElastic(t) {
+ var s = 1.70158;
+ var p = 0;
+ var a = 1;
+ if (t === 0) {
+ return 0;
+ }
+ if (t === 1) {
+ return 1;
+ }
+ if (!p) {
+ p = 0.3;
+ }
+ if (a < 1) {
+ a = 1;
+ s = p / 4;
+ } else {
+ s = p / (2 * Math.PI) * Math.asin(1 / a);
+ }
+ return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
+ },
+ easeOutElastic: function easeOutElastic(t) {
+ var s = 1.70158;
+ var p = 0;
+ var a = 1;
+ if (t === 0) {
+ return 0;
+ }
+ if (t === 1) {
+ return 1;
+ }
+ if (!p) {
+ p = 0.3;
+ }
+ if (a < 1) {
+ a = 1;
+ s = p / 4;
+ } else {
+ s = p / (2 * Math.PI) * Math.asin(1 / a);
+ }
+ return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;
+ },
+ easeInOutElastic: function easeInOutElastic(t) {
+ var s = 1.70158;
+ var p = 0;
+ var a = 1;
+ if (t === 0) {
+ return 0;
+ }
+ if ((t /= 0.5) === 2) {
+ return 1;
+ }
+ if (!p) {
+ p = 0.45;
+ }
+ if (a < 1) {
+ a = 1;
+ s = p / 4;
+ } else {
+ s = p / (2 * Math.PI) * Math.asin(1 / a);
+ }
+ if (t < 1) {
+ return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
+ }
+ return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;
+ },
+ easeInBack: function easeInBack(t) {
+ var s = 1.70158;
+ return t * t * ((s + 1) * t - s);
+ },
+ easeOutBack: function easeOutBack(t) {
+ var s = 1.70158;
+ return (t = t - 1) * t * ((s + 1) * t + s) + 1;
+ },
+ easeInOutBack: function easeInOutBack(t) {
+ var s = 1.70158;
+ if ((t /= 0.5) < 1) {
+ return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));
+ }
+ return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);
+ },
+ easeInBounce: function easeInBounce(t) {
+ return 1 - effects.easeOutBounce(1 - t);
+ },
+ easeOutBounce: function easeOutBounce(t) {
+ if (t < 1 / 2.75) {
+ return 7.5625 * t * t;
+ }
+ if (t < 2 / 2.75) {
+ return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;
+ }
+ if (t < 2.5 / 2.75) {
+ return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;
+ }
+ return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;
+ },
+ easeInOutBounce: function easeInOutBounce(t) {
+ if (t < 0.5) {
+ return effects.easeInBounce(t * 2) * 0.5;
+ }
+ return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;
+ }
+ };
+ var helpers_easing = {
+ effects: effects
+ };
+
+ // DEPRECATIONS
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.easing.effects instead.
+ * @function Chart.helpers.easingEffects
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers_core.easingEffects = effects;
+ var PI = Math.PI;
+ var RAD_PER_DEG = PI / 180;
+ var DOUBLE_PI = PI * 2;
+ var HALF_PI = PI / 2;
+ var QUARTER_PI = PI / 4;
+ var TWO_THIRDS_PI = PI * 2 / 3;
+
+ /**
+ * @namespace Chart.helpers.canvas
+ */
+ var exports$1 = {
+ /**
+ * Clears the entire canvas associated to the given `chart`.
+ * @param {Chart} chart - The chart for which to clear the canvas.
+ */
+ clear: function clear(chart) {
+ chart.ctx.clearRect(0, 0, chart.width, chart.height);
+ },
+ /**
+ * Creates a "path" for a rectangle with rounded corners at position (x, y) with a
+ * given size (width, height) and the same `radius` for all corners.
+ * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.
+ * @param {number} x - The x axis of the coordinate for the rectangle starting point.
+ * @param {number} y - The y axis of the coordinate for the rectangle starting point.
+ * @param {number} width - The rectangle's width.
+ * @param {number} height - The rectangle's height.
+ * @param {number} radius - The rounded amount (in pixels) for the four corners.
+ * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?
+ */
+ roundedRect: function roundedRect(ctx, x, y, width, height, radius) {
+ if (radius) {
+ var r = Math.min(radius, height / 2, width / 2);
+ var left = x + r;
+ var top = y + r;
+ var right = x + width - r;
+ var bottom = y + height - r;
+ ctx.moveTo(x, top);
+ if (left < right && top < bottom) {
+ ctx.arc(left, top, r, -PI, -HALF_PI);
+ ctx.arc(right, top, r, -HALF_PI, 0);
+ ctx.arc(right, bottom, r, 0, HALF_PI);
+ ctx.arc(left, bottom, r, HALF_PI, PI);
+ } else if (left < right) {
+ ctx.moveTo(left, y);
+ ctx.arc(right, top, r, -HALF_PI, HALF_PI);
+ ctx.arc(left, top, r, HALF_PI, PI + HALF_PI);
+ } else if (top < bottom) {
+ ctx.arc(left, top, r, -PI, 0);
+ ctx.arc(left, bottom, r, 0, PI);
+ } else {
+ ctx.arc(left, top, r, -PI, PI);
+ }
+ ctx.closePath();
+ ctx.moveTo(x, y);
+ } else {
+ ctx.rect(x, y, width, height);
+ }
+ },
+ drawPoint: function drawPoint(ctx, style, radius, x, y, rotation) {
+ var type, xOffset, yOffset, size, cornerRadius;
+ var rad = (rotation || 0) * RAD_PER_DEG;
+ if (style && _typeof(style) === 'object') {
+ type = style.toString();
+ if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {
+ ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);
+ return;
+ }
+ }
+ if (isNaN(radius) || radius <= 0) {
+ return;
+ }
+ ctx.beginPath();
+ switch (style) {
+ // Default includes circle
+ default:
+ ctx.arc(x, y, radius, 0, DOUBLE_PI);
+ ctx.closePath();
+ break;
+ case 'triangle':
+ ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
+ rad += TWO_THIRDS_PI;
+ ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
+ rad += TWO_THIRDS_PI;
+ ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
+ ctx.closePath();
+ break;
+ case 'rectRounded':
+ // NOTE: the rounded rect implementation changed to use `arc` instead of
+ // `quadraticCurveTo` since it generates better results when rect is
+ // almost a circle. 0.516 (instead of 0.5) produces results with visually
+ // closer proportion to the previous impl and it is inscribed in the
+ // circle with `radius`. For more details, see the following PRs:
+ // https://github.com/chartjs/Chart.js/issues/5597
+ // https://github.com/chartjs/Chart.js/issues/5858
+ cornerRadius = radius * 0.516;
+ size = radius - cornerRadius;
+ xOffset = Math.cos(rad + QUARTER_PI) * size;
+ yOffset = Math.sin(rad + QUARTER_PI) * size;
+ ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);
+ ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);
+ ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);
+ ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);
+ ctx.closePath();
+ break;
+ case 'rect':
+ if (!rotation) {
+ size = Math.SQRT1_2 * radius;
+ ctx.rect(x - size, y - size, 2 * size, 2 * size);
+ break;
+ }
+ rad += QUARTER_PI;
+ /* falls through */
+ case 'rectRot':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ ctx.closePath();
+ break;
+ case 'crossRot':
+ rad += QUARTER_PI;
+ /* falls through */
+ case 'cross':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.moveTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ break;
+ case 'star':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.moveTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ rad += QUARTER_PI;
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.moveTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ break;
+ case 'line':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ break;
+ case 'dash':
+ ctx.moveTo(x, y);
+ ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);
+ break;
+ }
+ ctx.fill();
+ ctx.stroke();
+ },
+ /**
+ * Returns true if the point is inside the rectangle
+ * @param {object} point - The point to test
+ * @param {object} area - The rectangle
+ * @returns {boolean}
+ * @private
+ */
+ _isPointInArea: function _isPointInArea(point, area) {
+ var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.
+
+ return point.x > area.left - epsilon && point.x < area.right + epsilon && point.y > area.top - epsilon && point.y < area.bottom + epsilon;
+ },
+ clipArea: function clipArea(ctx, area) {
+ ctx.save();
+ ctx.beginPath();
+ ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);
+ ctx.clip();
+ },
+ unclipArea: function unclipArea(ctx) {
+ ctx.restore();
+ },
+ lineTo: function lineTo(ctx, previous, target, flip) {
+ var stepped = target.steppedLine;
+ if (stepped) {
+ if (stepped === 'middle') {
+ var midpoint = (previous.x + target.x) / 2.0;
+ ctx.lineTo(midpoint, flip ? target.y : previous.y);
+ ctx.lineTo(midpoint, flip ? previous.y : target.y);
+ } else if (stepped === 'after' && !flip || stepped !== 'after' && flip) {
+ ctx.lineTo(previous.x, target.y);
+ } else {
+ ctx.lineTo(target.x, previous.y);
+ }
+ ctx.lineTo(target.x, target.y);
+ return;
+ }
+ if (!target.tension) {
+ ctx.lineTo(target.x, target.y);
+ return;
+ }
+ ctx.bezierCurveTo(flip ? previous.controlPointPreviousX : previous.controlPointNextX, flip ? previous.controlPointPreviousY : previous.controlPointNextY, flip ? target.controlPointNextX : target.controlPointPreviousX, flip ? target.controlPointNextY : target.controlPointPreviousY, target.x, target.y);
+ }
+ };
+ var helpers_canvas = exports$1;
+
+ // DEPRECATIONS
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.
+ * @namespace Chart.helpers.clear
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers_core.clear = exports$1.clear;
+
+ /**
+ * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.
+ * @namespace Chart.helpers.drawRoundedRectangle
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+ helpers_core.drawRoundedRectangle = function (ctx) {
+ ctx.beginPath();
+ exports$1.roundedRect.apply(exports$1, arguments);
+ };
+ var defaults = {
+ /**
+ * @private
+ */
+ _set: function _set(scope, values) {
+ return helpers_core.merge(this[scope] || (this[scope] = {}), values);
+ }
+ };
+ defaults._set('global', {
+ defaultColor: 'rgba(0,0,0,0.1)',
+ defaultFontColor: '#666',
+ defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
+ defaultFontSize: 12,
+ defaultFontStyle: 'normal',
+ defaultLineHeight: 1.2,
+ showLines: true
+ });
+ var core_defaults = defaults;
+ var valueOrDefault = helpers_core.valueOrDefault;
+
+ /**
+ * Converts the given font object into a CSS font string.
+ * @param {object} font - A font object.
+ * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font
+ * @private
+ */
+ function toFontString(font) {
+ if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) {
+ return null;
+ }
+ return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family;
+ }
+
+ /**
+ * @alias Chart.helpers.options
+ * @namespace
+ */
+ var helpers_options = {
+ /**
+ * Converts the given line height `value` in pixels for a specific font `size`.
+ * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').
+ * @param {number} size - The font size (in pixels) used to resolve relative `value`.
+ * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid).
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height
+ * @since 2.7.0
+ */
+ toLineHeight: function toLineHeight(value, size) {
+ var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);
+ if (!matches || matches[1] === 'normal') {
+ return size * 1.2;
+ }
+ value = +matches[2];
+ switch (matches[3]) {
+ case 'px':
+ return value;
+ case '%':
+ value /= 100;
+ break;
+ default:
+ break;
+ }
+ return size * value;
+ },
+ /**
+ * Converts the given value into a padding object with pre-computed width/height.
+ * @param {number|object} value - If a number, set the value to all TRBL component,
+ * else, if and object, use defined properties and sets undefined ones to 0.
+ * @returns {object} The padding values (top, right, bottom, left, width, height)
+ * @since 2.7.0
+ */
+ toPadding: function toPadding(value) {
+ var t, r, b, l;
+ if (helpers_core.isObject(value)) {
+ t = +value.top || 0;
+ r = +value.right || 0;
+ b = +value.bottom || 0;
+ l = +value.left || 0;
+ } else {
+ t = r = b = l = +value || 0;
+ }
+ return {
+ top: t,
+ right: r,
+ bottom: b,
+ left: l,
+ height: t + b,
+ width: l + r
+ };
+ },
+ /**
+ * Parses font options and returns the font object.
+ * @param {object} options - A object that contains font options to be parsed.
+ * @return {object} The font object.
+ * @todo Support font.* options and renamed to toFont().
+ * @private
+ */
+ _parseFont: function _parseFont(options) {
+ var globalDefaults = core_defaults.global;
+ var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);
+ var font = {
+ family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily),
+ lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size),
+ size: size,
+ style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle),
+ weight: null,
+ string: ''
+ };
+ font.string = toFontString(font);
+ return font;
+ },
+ /**
+ * Evaluates the given `inputs` sequentially and returns the first defined value.
+ * @param {Array} inputs - An array of values, falling back to the last value.
+ * @param {object} [context] - If defined and the current value is a function, the value
+ * is called with `context` as first argument and the result becomes the new input.
+ * @param {number} [index] - If defined and the current value is an array, the value
+ * at `index` become the new input.
+ * @since 2.7.0
+ */
+ resolve: function resolve(inputs, context, index) {
+ var i, ilen, value;
+ for (i = 0, ilen = inputs.length; i < ilen; ++i) {
+ value = inputs[i];
+ if (value === undefined) {
+ continue;
+ }
+ if (context !== undefined && typeof value === 'function') {
+ value = value(context);
+ }
+ if (index !== undefined && helpers_core.isArray(value)) {
+ value = value[index];
+ }
+ if (value !== undefined) {
+ return value;
+ }
+ }
+ }
+ };
+ var helpers$1 = helpers_core;
+ var easing = helpers_easing;
+ var canvas = helpers_canvas;
+ var options = helpers_options;
+ helpers$1.easing = easing;
+ helpers$1.canvas = canvas;
+ helpers$1.options = options;
+ function interpolate(start, view, model, ease) {
+ var keys = Object.keys(model);
+ var i, ilen, key, actual, origin, target, type, c0, c1;
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ target = model[key];
+
+ // if a value is added to the model after pivot() has been called, the view
+ // doesn't contain it, so let's initialize the view to the target value.
+ if (!view.hasOwnProperty(key)) {
+ view[key] = target;
+ }
+ actual = view[key];
+ if (actual === target || key[0] === '_') {
+ continue;
+ }
+ if (!start.hasOwnProperty(key)) {
+ start[key] = actual;
+ }
+ origin = start[key];
+ type = _typeof(target);
+ if (type === _typeof(origin)) {
+ if (type === 'string') {
+ c0 = chartjsColor(origin);
+ if (c0.valid) {
+ c1 = chartjsColor(target);
+ if (c1.valid) {
+ view[key] = c1.mix(c0, ease).rgbString();
+ continue;
+ }
+ }
+ } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) {
+ view[key] = origin + (target - origin) * ease;
+ continue;
+ }
+ }
+ view[key] = target;
+ }
+ }
+ var Element = function Element(configuration) {
+ helpers$1.extend(this, configuration);
+ this.initialize.apply(this, arguments);
+ };
+ helpers$1.extend(Element.prototype, {
+ initialize: function initialize() {
+ this.hidden = false;
+ },
+ pivot: function pivot() {
+ var me = this;
+ if (!me._view) {
+ me._view = helpers$1.clone(me._model);
+ }
+ me._start = {};
+ return me;
+ },
+ transition: function transition(ease) {
+ var me = this;
+ var model = me._model;
+ var start = me._start;
+ var view = me._view;
+
+ // No animation -> No Transition
+ if (!model || ease === 1) {
+ me._view = model;
+ me._start = null;
+ return me;
+ }
+ if (!view) {
+ view = me._view = {};
+ }
+ if (!start) {
+ start = me._start = {};
+ }
+ interpolate(start, view, model, ease);
+ return me;
+ },
+ tooltipPosition: function tooltipPosition() {
+ return {
+ x: this._model.x,
+ y: this._model.y
+ };
+ },
+ hasValue: function hasValue() {
+ return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y);
+ }
+ });
+ Element.extend = helpers$1.inherits;
+ var core_element = Element;
+ var exports$2 = core_element.extend({
+ chart: null,
+ // the animation associated chart instance
+ currentStep: 0,
+ // the current animation step
+ numSteps: 60,
+ // default number of steps
+ easing: '',
+ // the easing to use for this animation
+ render: null,
+ // render function used by the animation service
+
+ onAnimationProgress: null,
+ // user specified callback to fire on each step of the animation
+ onAnimationComplete: null // user specified callback to fire when the animation finishes
+ });
+
+ var core_animation = exports$2;
+
+ // DEPRECATIONS
+
+ /**
+ * Provided for backward compatibility, use Chart.Animation instead
+ * @prop Chart.Animation#animationObject
+ * @deprecated since version 2.6.0
+ * @todo remove at version 3
+ */
+ Object.defineProperty(exports$2.prototype, 'animationObject', {
+ get: function get() {
+ return this;
+ }
+ });
+
+ /**
+ * Provided for backward compatibility, use Chart.Animation#chart instead
+ * @prop Chart.Animation#chartInstance
+ * @deprecated since version 2.6.0
+ * @todo remove at version 3
+ */
+ Object.defineProperty(exports$2.prototype, 'chartInstance', {
+ get: function get() {
+ return this.chart;
+ },
+ set: function set(value) {
+ this.chart = value;
+ }
+ });
+ core_defaults._set('global', {
+ animation: {
+ duration: 1000,
+ easing: 'easeOutQuart',
+ onProgress: helpers$1.noop,
+ onComplete: helpers$1.noop
+ }
+ });
+ var core_animations = {
+ animations: [],
+ request: null,
+ /**
+ * @param {Chart} chart - The chart to animate.
+ * @param {Chart.Animation} animation - The animation that we will animate.
+ * @param {number} duration - The animation duration in ms.
+ * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions
+ */
+ addAnimation: function addAnimation(chart, animation, duration, lazy) {
+ var animations = this.animations;
+ var i, ilen;
+ animation.chart = chart;
+ animation.startTime = Date.now();
+ animation.duration = duration;
+ if (!lazy) {
+ chart.animating = true;
+ }
+ for (i = 0, ilen = animations.length; i < ilen; ++i) {
+ if (animations[i].chart === chart) {
+ animations[i] = animation;
+ return;
+ }
+ }
+ animations.push(animation);
+
+ // If there are no animations queued, manually kickstart a digest, for lack of a better word
+ if (animations.length === 1) {
+ this.requestAnimationFrame();
+ }
+ },
+ cancelAnimation: function cancelAnimation(chart) {
+ var index = helpers$1.findIndex(this.animations, function (animation) {
+ return animation.chart === chart;
+ });
+ if (index !== -1) {
+ this.animations.splice(index, 1);
+ chart.animating = false;
+ }
+ },
+ requestAnimationFrame: function requestAnimationFrame() {
+ var me = this;
+ if (me.request === null) {
+ // Skip animation frame requests until the active one is executed.
+ // This can happen when processing mouse events, e.g. 'mousemove'
+ // and 'mouseout' events will trigger multiple renders.
+ me.request = helpers$1.requestAnimFrame.call(window, function () {
+ me.request = null;
+ me.startDigest();
+ });
+ }
+ },
+ /**
+ * @private
+ */
+ startDigest: function startDigest() {
+ var me = this;
+ me.advance();
+
+ // Do we have more stuff to animate?
+ if (me.animations.length > 0) {
+ me.requestAnimationFrame();
+ }
+ },
+ /**
+ * @private
+ */
+ advance: function advance() {
+ var animations = this.animations;
+ var animation, chart, numSteps, nextStep;
+ var i = 0;
+
+ // 1 animation per chart, so we are looping charts here
+ while (i < animations.length) {
+ animation = animations[i];
+ chart = animation.chart;
+ numSteps = animation.numSteps;
+
+ // Make sure that currentStep starts at 1
+ // https://github.com/chartjs/Chart.js/issues/6104
+ nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1;
+ animation.currentStep = Math.min(nextStep, numSteps);
+ helpers$1.callback(animation.render, [chart, animation], chart);
+ helpers$1.callback(animation.onAnimationProgress, [animation], chart);
+ if (animation.currentStep >= numSteps) {
+ helpers$1.callback(animation.onAnimationComplete, [animation], chart);
+ chart.animating = false;
+ animations.splice(i, 1);
+ } else {
+ ++i;
+ }
+ }
+ }
+ };
+ var resolve = helpers$1.options.resolve;
+ var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];
+
+ /**
+ * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',
+ * 'unshift') and notify the listener AFTER the array has been altered. Listeners are
+ * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.
+ */
+ function listenArrayEvents(array, listener) {
+ if (array._chartjs) {
+ array._chartjs.listeners.push(listener);
+ return;
+ }
+ Object.defineProperty(array, '_chartjs', {
+ configurable: true,
+ enumerable: false,
+ value: {
+ listeners: [listener]
+ }
+ });
+ arrayEvents.forEach(function (key) {
+ var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);
+ var base = array[key];
+ Object.defineProperty(array, key, {
+ configurable: true,
+ enumerable: false,
+ value: function value() {
+ var args = Array.prototype.slice.call(arguments);
+ var res = base.apply(this, args);
+ helpers$1.each(array._chartjs.listeners, function (object) {
+ if (typeof object[method] === 'function') {
+ object[method].apply(object, args);
+ }
+ });
+ return res;
+ }
+ });
+ });
+ }
+
+ /**
+ * Removes the given array event listener and cleanup extra attached properties (such as
+ * the _chartjs stub and overridden methods) if array doesn't have any more listeners.
+ */
+ function unlistenArrayEvents(array, listener) {
+ var stub = array._chartjs;
+ if (!stub) {
+ return;
+ }
+ var listeners = stub.listeners;
+ var index = listeners.indexOf(listener);
+ if (index !== -1) {
+ listeners.splice(index, 1);
+ }
+ if (listeners.length > 0) {
+ return;
+ }
+ arrayEvents.forEach(function (key) {
+ delete array[key];
+ });
+ delete array._chartjs;
+ }
+
+ // Base class for all dataset controllers (line, bar, etc)
+ var DatasetController = function DatasetController(chart, datasetIndex) {
+ this.initialize(chart, datasetIndex);
+ };
+ helpers$1.extend(DatasetController.prototype, {
+ /**
+ * Element type used to generate a meta dataset (e.g. Chart.element.Line).
+ * @type {Chart.core.element}
+ */
+ datasetElementType: null,
+ /**
+ * Element type used to generate a meta data (e.g. Chart.element.Point).
+ * @type {Chart.core.element}
+ */
+ dataElementType: null,
+ initialize: function initialize(chart, datasetIndex) {
+ var me = this;
+ me.chart = chart;
+ me.index = datasetIndex;
+ me.linkScales();
+ me.addElements();
+ },
+ updateIndex: function updateIndex(datasetIndex) {
+ this.index = datasetIndex;
+ },
+ linkScales: function linkScales() {
+ var me = this;
+ var meta = me.getMeta();
+ var dataset = me.getDataset();
+ if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) {
+ meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;
+ }
+ if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) {
+ meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;
+ }
+ },
+ getDataset: function getDataset() {
+ return this.chart.data.datasets[this.index];
+ },
+ getMeta: function getMeta() {
+ return this.chart.getDatasetMeta(this.index);
+ },
+ getScaleForId: function getScaleForId(scaleID) {
+ return this.chart.scales[scaleID];
+ },
+ /**
+ * @private
+ */
+ _getValueScaleId: function _getValueScaleId() {
+ return this.getMeta().yAxisID;
+ },
+ /**
+ * @private
+ */
+ _getIndexScaleId: function _getIndexScaleId() {
+ return this.getMeta().xAxisID;
+ },
+ /**
+ * @private
+ */
+ _getValueScale: function _getValueScale() {
+ return this.getScaleForId(this._getValueScaleId());
+ },
+ /**
+ * @private
+ */
+ _getIndexScale: function _getIndexScale() {
+ return this.getScaleForId(this._getIndexScaleId());
+ },
+ reset: function reset() {
+ this.update(true);
+ },
+ /**
+ * @private
+ */
+ destroy: function destroy() {
+ if (this._data) {
+ unlistenArrayEvents(this._data, this);
+ }
+ },
+ createMetaDataset: function createMetaDataset() {
+ var me = this;
+ var type = me.datasetElementType;
+ return type && new type({
+ _chart: me.chart,
+ _datasetIndex: me.index
+ });
+ },
+ createMetaData: function createMetaData(index) {
+ var me = this;
+ var type = me.dataElementType;
+ return type && new type({
+ _chart: me.chart,
+ _datasetIndex: me.index,
+ _index: index
+ });
+ },
+ addElements: function addElements() {
+ var me = this;
+ var meta = me.getMeta();
+ var data = me.getDataset().data || [];
+ var metaData = meta.data;
+ var i, ilen;
+ for (i = 0, ilen = data.length; i < ilen; ++i) {
+ metaData[i] = metaData[i] || me.createMetaData(i);
+ }
+ meta.dataset = meta.dataset || me.createMetaDataset();
+ },
+ addElementAndReset: function addElementAndReset(index) {
+ var element = this.createMetaData(index);
+ this.getMeta().data.splice(index, 0, element);
+ this.updateElement(element, index, true);
+ },
+ buildOrUpdateElements: function buildOrUpdateElements() {
+ var me = this;
+ var dataset = me.getDataset();
+ var data = dataset.data || (dataset.data = []);
+
+ // In order to correctly handle data addition/deletion animation (an thus simulate
+ // real-time charts), we need to monitor these data modifications and synchronize
+ // the internal meta data accordingly.
+ if (me._data !== data) {
+ if (me._data) {
+ // This case happens when the user replaced the data array instance.
+ unlistenArrayEvents(me._data, me);
+ }
+ if (data && Object.isExtensible(data)) {
+ listenArrayEvents(data, me);
+ }
+ me._data = data;
+ }
+
+ // Re-sync meta data in case the user replaced the data array or if we missed
+ // any updates and so make sure that we handle number of datapoints changing.
+ me.resyncElements();
+ },
+ update: helpers$1.noop,
+ transition: function transition(easingValue) {
+ var meta = this.getMeta();
+ var elements = meta.data || [];
+ var ilen = elements.length;
+ var i = 0;
+ for (; i < ilen; ++i) {
+ elements[i].transition(easingValue);
+ }
+ if (meta.dataset) {
+ meta.dataset.transition(easingValue);
+ }
+ },
+ draw: function draw() {
+ var meta = this.getMeta();
+ var elements = meta.data || [];
+ var ilen = elements.length;
+ var i = 0;
+ if (meta.dataset) {
+ meta.dataset.draw();
+ }
+ for (; i < ilen; ++i) {
+ elements[i].draw();
+ }
+ },
+ removeHoverStyle: function removeHoverStyle(element) {
+ helpers$1.merge(element._model, element.$previousStyle || {});
+ delete element.$previousStyle;
+ },
+ setHoverStyle: function setHoverStyle(element) {
+ var dataset = this.chart.data.datasets[element._datasetIndex];
+ var index = element._index;
+ var custom = element.custom || {};
+ var model = element._model;
+ var getHoverColor = helpers$1.getHoverColor;
+ element.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth
+ };
+ model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index);
+ model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index);
+ model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);
+ },
+ /**
+ * @private
+ */
+ resyncElements: function resyncElements() {
+ var me = this;
+ var meta = me.getMeta();
+ var data = me.getDataset().data;
+ var numMeta = meta.data.length;
+ var numData = data.length;
+ if (numData < numMeta) {
+ meta.data.splice(numData, numMeta - numData);
+ } else if (numData > numMeta) {
+ me.insertElements(numMeta, numData - numMeta);
+ }
+ },
+ /**
+ * @private
+ */
+ insertElements: function insertElements(start, count) {
+ for (var i = 0; i < count; ++i) {
+ this.addElementAndReset(start + i);
+ }
+ },
+ /**
+ * @private
+ */
+ onDataPush: function onDataPush() {
+ var count = arguments.length;
+ this.insertElements(this.getDataset().data.length - count, count);
+ },
+ /**
+ * @private
+ */
+ onDataPop: function onDataPop() {
+ this.getMeta().data.pop();
+ },
+ /**
+ * @private
+ */
+ onDataShift: function onDataShift() {
+ this.getMeta().data.shift();
+ },
+ /**
+ * @private
+ */
+ onDataSplice: function onDataSplice(start, count) {
+ this.getMeta().data.splice(start, count);
+ this.insertElements(start, arguments.length - 2);
+ },
+ /**
+ * @private
+ */
+ onDataUnshift: function onDataUnshift() {
+ this.insertElements(0, arguments.length);
+ }
+ });
+ DatasetController.extend = helpers$1.inherits;
+ var core_datasetController = DatasetController;
+ core_defaults._set('global', {
+ elements: {
+ arc: {
+ backgroundColor: core_defaults.global.defaultColor,
+ borderColor: '#fff',
+ borderWidth: 2,
+ borderAlign: 'center'
+ }
+ }
+ });
+ var element_arc = core_element.extend({
+ inLabelRange: function inLabelRange(mouseX) {
+ var vm = this._view;
+ if (vm) {
+ return Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2);
+ }
+ return false;
+ },
+ inRange: function inRange(chartX, chartY) {
+ var vm = this._view;
+ if (vm) {
+ var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {
+ x: chartX,
+ y: chartY
+ });
+ var angle = pointRelativePosition.angle;
+ var distance = pointRelativePosition.distance;
+
+ // Sanitise angle range
+ var startAngle = vm.startAngle;
+ var endAngle = vm.endAngle;
+ while (endAngle < startAngle) {
+ endAngle += 2.0 * Math.PI;
+ }
+ while (angle > endAngle) {
+ angle -= 2.0 * Math.PI;
+ }
+ while (angle < startAngle) {
+ angle += 2.0 * Math.PI;
+ }
+
+ // Check if within the range of the open/close angle
+ var betweenAngles = angle >= startAngle && angle <= endAngle;
+ var withinRadius = distance >= vm.innerRadius && distance <= vm.outerRadius;
+ return betweenAngles && withinRadius;
+ }
+ return false;
+ },
+ getCenterPoint: function getCenterPoint() {
+ var vm = this._view;
+ var halfAngle = (vm.startAngle + vm.endAngle) / 2;
+ var halfRadius = (vm.innerRadius + vm.outerRadius) / 2;
+ return {
+ x: vm.x + Math.cos(halfAngle) * halfRadius,
+ y: vm.y + Math.sin(halfAngle) * halfRadius
+ };
+ },
+ getArea: function getArea() {
+ var vm = this._view;
+ return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));
+ },
+ tooltipPosition: function tooltipPosition() {
+ var vm = this._view;
+ var centreAngle = vm.startAngle + (vm.endAngle - vm.startAngle) / 2;
+ var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;
+ return {
+ x: vm.x + Math.cos(centreAngle) * rangeFromCentre,
+ y: vm.y + Math.sin(centreAngle) * rangeFromCentre
+ };
+ },
+ draw: function draw() {
+ var ctx = this._chart.ctx;
+ var vm = this._view;
+ var sA = vm.startAngle;
+ var eA = vm.endAngle;
+ var pixelMargin = vm.borderAlign === 'inner' ? 0.33 : 0;
+ var angleMargin;
+ ctx.save();
+ ctx.beginPath();
+ ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA);
+ ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);
+ ctx.closePath();
+ ctx.fillStyle = vm.backgroundColor;
+ ctx.fill();
+ if (vm.borderWidth) {
+ if (vm.borderAlign === 'inner') {
+ // Draw an inner border by cliping the arc and drawing a double-width border
+ // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders
+ ctx.beginPath();
+ angleMargin = pixelMargin / vm.outerRadius;
+ ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin);
+ if (vm.innerRadius > pixelMargin) {
+ angleMargin = pixelMargin / vm.innerRadius;
+ ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true);
+ } else {
+ ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2);
+ }
+ ctx.closePath();
+ ctx.clip();
+ ctx.beginPath();
+ ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);
+ ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);
+ ctx.closePath();
+ ctx.lineWidth = vm.borderWidth * 2;
+ ctx.lineJoin = 'round';
+ } else {
+ ctx.lineWidth = vm.borderWidth;
+ ctx.lineJoin = 'bevel';
+ }
+ ctx.strokeStyle = vm.borderColor;
+ ctx.stroke();
+ }
+ ctx.restore();
+ }
+ });
+ var valueOrDefault$1 = helpers$1.valueOrDefault;
+ var defaultColor = core_defaults.global.defaultColor;
+ core_defaults._set('global', {
+ elements: {
+ line: {
+ tension: 0.4,
+ backgroundColor: defaultColor,
+ borderWidth: 3,
+ borderColor: defaultColor,
+ borderCapStyle: 'butt',
+ borderDash: [],
+ borderDashOffset: 0.0,
+ borderJoinStyle: 'miter',
+ capBezierPoints: true,
+ fill: true // do we fill in the area between the line and its base axis
+ }
+ }
+ });
+
+ var element_line = core_element.extend({
+ draw: function draw() {
+ var me = this;
+ var vm = me._view;
+ var ctx = me._chart.ctx;
+ var spanGaps = vm.spanGaps;
+ var points = me._children.slice(); // clone array
+ var globalDefaults = core_defaults.global;
+ var globalOptionLineElements = globalDefaults.elements.line;
+ var lastDrawnIndex = -1;
+ var index, current, previous, currentVM;
+
+ // If we are looping, adding the first point again
+ if (me._loop && points.length) {
+ points.push(points[0]);
+ }
+ ctx.save();
+
+ // Stroke Line Options
+ ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;
+
+ // IE 9 and 10 do not support line dash
+ if (ctx.setLineDash) {
+ ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);
+ }
+ ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset);
+ ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;
+ ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth);
+ ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;
+
+ // Stroke Line
+ ctx.beginPath();
+ lastDrawnIndex = -1;
+ for (index = 0; index < points.length; ++index) {
+ current = points[index];
+ previous = helpers$1.previousItem(points, index);
+ currentVM = current._view;
+
+ // First point moves to it's starting position no matter what
+ if (index === 0) {
+ if (!currentVM.skip) {
+ ctx.moveTo(currentVM.x, currentVM.y);
+ lastDrawnIndex = index;
+ }
+ } else {
+ previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];
+ if (!currentVM.skip) {
+ if (lastDrawnIndex !== index - 1 && !spanGaps || lastDrawnIndex === -1) {
+ // There was a gap and this is the first point after the gap
+ ctx.moveTo(currentVM.x, currentVM.y);
+ } else {
+ // Line to next point
+ helpers$1.canvas.lineTo(ctx, previous._view, current._view);
+ }
+ lastDrawnIndex = index;
+ }
+ }
+ }
+ ctx.stroke();
+ ctx.restore();
+ }
+ });
+ var valueOrDefault$2 = helpers$1.valueOrDefault;
+ var defaultColor$1 = core_defaults.global.defaultColor;
+ core_defaults._set('global', {
+ elements: {
+ point: {
+ radius: 3,
+ pointStyle: 'circle',
+ backgroundColor: defaultColor$1,
+ borderColor: defaultColor$1,
+ borderWidth: 1,
+ // Hover
+ hitRadius: 1,
+ hoverRadius: 4,
+ hoverBorderWidth: 1
+ }
+ }
+ });
+ function xRange(mouseX) {
+ var vm = this._view;
+ return vm ? Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius : false;
+ }
+ function yRange(mouseY) {
+ var vm = this._view;
+ return vm ? Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius : false;
+ }
+ var element_point = core_element.extend({
+ inRange: function inRange(mouseX, mouseY) {
+ var vm = this._view;
+ return vm ? Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2) < Math.pow(vm.hitRadius + vm.radius, 2) : false;
+ },
+ inLabelRange: xRange,
+ inXRange: xRange,
+ inYRange: yRange,
+ getCenterPoint: function getCenterPoint() {
+ var vm = this._view;
+ return {
+ x: vm.x,
+ y: vm.y
+ };
+ },
+ getArea: function getArea() {
+ return Math.PI * Math.pow(this._view.radius, 2);
+ },
+ tooltipPosition: function tooltipPosition() {
+ var vm = this._view;
+ return {
+ x: vm.x,
+ y: vm.y,
+ padding: vm.radius + vm.borderWidth
+ };
+ },
+ draw: function draw(chartArea) {
+ var vm = this._view;
+ var ctx = this._chart.ctx;
+ var pointStyle = vm.pointStyle;
+ var rotation = vm.rotation;
+ var radius = vm.radius;
+ var x = vm.x;
+ var y = vm.y;
+ var globalDefaults = core_defaults.global;
+ var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow
+
+ if (vm.skip) {
+ return;
+ }
+
+ // Clipping for Points.
+ if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) {
+ ctx.strokeStyle = vm.borderColor || defaultColor;
+ ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth);
+ ctx.fillStyle = vm.backgroundColor || defaultColor;
+ helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation);
+ }
+ }
+ });
+ var defaultColor$2 = core_defaults.global.defaultColor;
+ core_defaults._set('global', {
+ elements: {
+ rectangle: {
+ backgroundColor: defaultColor$2,
+ borderColor: defaultColor$2,
+ borderSkipped: 'bottom',
+ borderWidth: 0
+ }
+ }
+ });
+ function isVertical(vm) {
+ return vm && vm.width !== undefined;
+ }
+
+ /**
+ * Helper function to get the bounds of the bar regardless of the orientation
+ * @param bar {Chart.Element.Rectangle} the bar
+ * @return {Bounds} bounds of the bar
+ * @private
+ */
+ function getBarBounds(vm) {
+ var x1, x2, y1, y2, half;
+ if (isVertical(vm)) {
+ half = vm.width / 2;
+ x1 = vm.x - half;
+ x2 = vm.x + half;
+ y1 = Math.min(vm.y, vm.base);
+ y2 = Math.max(vm.y, vm.base);
+ } else {
+ half = vm.height / 2;
+ x1 = Math.min(vm.x, vm.base);
+ x2 = Math.max(vm.x, vm.base);
+ y1 = vm.y - half;
+ y2 = vm.y + half;
+ }
+ return {
+ left: x1,
+ top: y1,
+ right: x2,
+ bottom: y2
+ };
+ }
+ function swap(orig, v1, v2) {
+ return orig === v1 ? v2 : orig === v2 ? v1 : orig;
+ }
+ function parseBorderSkipped(vm) {
+ var edge = vm.borderSkipped;
+ var res = {};
+ if (!edge) {
+ return res;
+ }
+ if (vm.horizontal) {
+ if (vm.base > vm.x) {
+ edge = swap(edge, 'left', 'right');
+ }
+ } else if (vm.base < vm.y) {
+ edge = swap(edge, 'bottom', 'top');
+ }
+ res[edge] = true;
+ return res;
+ }
+ function parseBorderWidth(vm, maxW, maxH) {
+ var value = vm.borderWidth;
+ var skip = parseBorderSkipped(vm);
+ var t, r, b, l;
+ if (helpers$1.isObject(value)) {
+ t = +value.top || 0;
+ r = +value.right || 0;
+ b = +value.bottom || 0;
+ l = +value.left || 0;
+ } else {
+ t = r = b = l = +value || 0;
+ }
+ return {
+ t: skip.top || t < 0 ? 0 : t > maxH ? maxH : t,
+ r: skip.right || r < 0 ? 0 : r > maxW ? maxW : r,
+ b: skip.bottom || b < 0 ? 0 : b > maxH ? maxH : b,
+ l: skip.left || l < 0 ? 0 : l > maxW ? maxW : l
+ };
+ }
+ function boundingRects(vm) {
+ var bounds = getBarBounds(vm);
+ var width = bounds.right - bounds.left;
+ var height = bounds.bottom - bounds.top;
+ var border = parseBorderWidth(vm, width / 2, height / 2);
+ return {
+ outer: {
+ x: bounds.left,
+ y: bounds.top,
+ w: width,
+ h: height
+ },
+ inner: {
+ x: bounds.left + border.l,
+ y: bounds.top + border.t,
+ w: width - border.l - border.r,
+ h: height - border.t - border.b
+ }
+ };
+ }
+ function _inRange(vm, x, y) {
+ var skipX = x === null;
+ var skipY = y === null;
+ var bounds = !vm || skipX && skipY ? false : getBarBounds(vm);
+ return bounds && (skipX || x >= bounds.left && x <= bounds.right) && (skipY || y >= bounds.top && y <= bounds.bottom);
+ }
+ var element_rectangle = core_element.extend({
+ draw: function draw() {
+ var ctx = this._chart.ctx;
+ var vm = this._view;
+ var rects = boundingRects(vm);
+ var outer = rects.outer;
+ var inner = rects.inner;
+ ctx.fillStyle = vm.backgroundColor;
+ ctx.fillRect(outer.x, outer.y, outer.w, outer.h);
+ if (outer.w === inner.w && outer.h === inner.h) {
+ return;
+ }
+ ctx.save();
+ ctx.beginPath();
+ ctx.rect(outer.x, outer.y, outer.w, outer.h);
+ ctx.clip();
+ ctx.fillStyle = vm.borderColor;
+ ctx.rect(inner.x, inner.y, inner.w, inner.h);
+ ctx.fill('evenodd');
+ ctx.restore();
+ },
+ height: function height() {
+ var vm = this._view;
+ return vm.base - vm.y;
+ },
+ inRange: function inRange(mouseX, mouseY) {
+ return _inRange(this._view, mouseX, mouseY);
+ },
+ inLabelRange: function inLabelRange(mouseX, mouseY) {
+ var vm = this._view;
+ return isVertical(vm) ? _inRange(vm, mouseX, null) : _inRange(vm, null, mouseY);
+ },
+ inXRange: function inXRange(mouseX) {
+ return _inRange(this._view, mouseX, null);
+ },
+ inYRange: function inYRange(mouseY) {
+ return _inRange(this._view, null, mouseY);
+ },
+ getCenterPoint: function getCenterPoint() {
+ var vm = this._view;
+ var x, y;
+ if (isVertical(vm)) {
+ x = vm.x;
+ y = (vm.y + vm.base) / 2;
+ } else {
+ x = (vm.x + vm.base) / 2;
+ y = vm.y;
+ }
+ return {
+ x: x,
+ y: y
+ };
+ },
+ getArea: function getArea() {
+ var vm = this._view;
+ return isVertical(vm) ? vm.width * Math.abs(vm.y - vm.base) : vm.height * Math.abs(vm.x - vm.base);
+ },
+ tooltipPosition: function tooltipPosition() {
+ var vm = this._view;
+ return {
+ x: vm.x,
+ y: vm.y
+ };
+ }
+ });
+ var elements = {};
+ var Arc = element_arc;
+ var Line = element_line;
+ var Point = element_point;
+ var Rectangle = element_rectangle;
+ elements.Arc = Arc;
+ elements.Line = Line;
+ elements.Point = Point;
+ elements.Rectangle = Rectangle;
+ var resolve$1 = helpers$1.options.resolve;
+ core_defaults._set('bar', {
+ hover: {
+ mode: 'label'
+ },
+ scales: {
+ xAxes: [{
+ type: 'category',
+ categoryPercentage: 0.8,
+ barPercentage: 0.9,
+ offset: true,
+ gridLines: {
+ offsetGridLines: true
+ }
+ }],
+ yAxes: [{
+ type: 'linear'
+ }]
+ }
+ });
+
+ /**
+ * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap.
+ * @private
+ */
+ function computeMinSampleSize(scale, pixels) {
+ var min = scale.isHorizontal() ? scale.width : scale.height;
+ var ticks = scale.getTicks();
+ var prev, curr, i, ilen;
+ for (i = 1, ilen = pixels.length; i < ilen; ++i) {
+ min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1]));
+ }
+ for (i = 0, ilen = ticks.length; i < ilen; ++i) {
+ curr = scale.getPixelForTick(i);
+ min = i > 0 ? Math.min(min, curr - prev) : min;
+ prev = curr;
+ }
+ return min;
+ }
+
+ /**
+ * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null,
+ * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This
+ * mode currently always generates bars equally sized (until we introduce scriptable options?).
+ * @private
+ */
+ function computeFitCategoryTraits(index, ruler, options) {
+ var thickness = options.barThickness;
+ var count = ruler.stackCount;
+ var curr = ruler.pixels[index];
+ var size, ratio;
+ if (helpers$1.isNullOrUndef(thickness)) {
+ size = ruler.min * options.categoryPercentage;
+ ratio = options.barPercentage;
+ } else {
+ // When bar thickness is enforced, category and bar percentages are ignored.
+ // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')
+ // and deprecate barPercentage since this value is ignored when thickness is absolute.
+ size = thickness * count;
+ ratio = 1;
+ }
+ return {
+ chunk: size / count,
+ ratio: ratio,
+ start: curr - size / 2
+ };
+ }
+
+ /**
+ * Computes an "optimal" category that globally arranges bars side by side (no gap when
+ * percentage options are 1), based on the previous and following categories. This mode
+ * generates bars with different widths when data are not evenly spaced.
+ * @private
+ */
+ function computeFlexCategoryTraits(index, ruler, options) {
+ var pixels = ruler.pixels;
+ var curr = pixels[index];
+ var prev = index > 0 ? pixels[index - 1] : null;
+ var next = index < pixels.length - 1 ? pixels[index + 1] : null;
+ var percent = options.categoryPercentage;
+ var start, size;
+ if (prev === null) {
+ // first data: its size is double based on the next point or,
+ // if it's also the last data, we use the scale size.
+ prev = curr - (next === null ? ruler.end - ruler.start : next - curr);
+ }
+ if (next === null) {
+ // last data: its size is also double based on the previous point.
+ next = curr + curr - prev;
+ }
+ start = curr - (curr - Math.min(prev, next)) / 2 * percent;
+ size = Math.abs(next - prev) / 2 * percent;
+ return {
+ chunk: size / ruler.stackCount,
+ ratio: options.barPercentage,
+ start: start
+ };
+ }
+ var controller_bar = core_datasetController.extend({
+ dataElementType: elements.Rectangle,
+ initialize: function initialize() {
+ var me = this;
+ var meta;
+ core_datasetController.prototype.initialize.apply(me, arguments);
+ meta = me.getMeta();
+ meta.stack = me.getDataset().stack;
+ meta.bar = true;
+ },
+ update: function update(reset) {
+ var me = this;
+ var rects = me.getMeta().data;
+ var i, ilen;
+ me._ruler = me.getRuler();
+ for (i = 0, ilen = rects.length; i < ilen; ++i) {
+ me.updateElement(rects[i], i, reset);
+ }
+ },
+ updateElement: function updateElement(rectangle, index, reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var dataset = me.getDataset();
+ var options = me._resolveElementOptions(rectangle, index);
+ rectangle._xScale = me.getScaleForId(meta.xAxisID);
+ rectangle._yScale = me.getScaleForId(meta.yAxisID);
+ rectangle._datasetIndex = me.index;
+ rectangle._index = index;
+ rectangle._model = {
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderSkipped: options.borderSkipped,
+ borderWidth: options.borderWidth,
+ datasetLabel: dataset.label,
+ label: me.chart.data.labels[index]
+ };
+ me._updateElementGeometry(rectangle, index, reset);
+ rectangle.pivot();
+ },
+ /**
+ * @private
+ */
+ _updateElementGeometry: function _updateElementGeometry(rectangle, index, reset) {
+ var me = this;
+ var model = rectangle._model;
+ var vscale = me._getValueScale();
+ var base = vscale.getBasePixel();
+ var horizontal = vscale.isHorizontal();
+ var ruler = me._ruler || me.getRuler();
+ var vpixels = me.calculateBarValuePixels(me.index, index);
+ var ipixels = me.calculateBarIndexPixels(me.index, index, ruler);
+ model.horizontal = horizontal;
+ model.base = reset ? base : vpixels.base;
+ model.x = horizontal ? reset ? base : vpixels.head : ipixels.center;
+ model.y = horizontal ? ipixels.center : reset ? base : vpixels.head;
+ model.height = horizontal ? ipixels.size : undefined;
+ model.width = horizontal ? undefined : ipixels.size;
+ },
+ /**
+ * Returns the stacks based on groups and bar visibility.
+ * @param {number} [last] - The dataset index
+ * @returns {string[]} The list of stack IDs
+ * @private
+ */
+ _getStacks: function _getStacks(last) {
+ var me = this;
+ var chart = me.chart;
+ var scale = me._getIndexScale();
+ var stacked = scale.options.stacked;
+ var ilen = last === undefined ? chart.data.datasets.length : last + 1;
+ var stacks = [];
+ var i, meta;
+ for (i = 0; i < ilen; ++i) {
+ meta = chart.getDatasetMeta(i);
+ if (meta.bar && chart.isDatasetVisible(i) && (stacked === false || stacked === true && stacks.indexOf(meta.stack) === -1 || stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1))) {
+ stacks.push(meta.stack);
+ }
+ }
+ return stacks;
+ },
+ /**
+ * Returns the effective number of stacks based on groups and bar visibility.
+ * @private
+ */
+ getStackCount: function getStackCount() {
+ return this._getStacks().length;
+ },
+ /**
+ * Returns the stack index for the given dataset based on groups and bar visibility.
+ * @param {number} [datasetIndex] - The dataset index
+ * @param {string} [name] - The stack name to find
+ * @returns {number} The stack index
+ * @private
+ */
+ getStackIndex: function getStackIndex(datasetIndex, name) {
+ var stacks = this._getStacks(datasetIndex);
+ var index = name !== undefined ? stacks.indexOf(name) : -1; // indexOf returns -1 if element is not present
+
+ return index === -1 ? stacks.length - 1 : index;
+ },
+ /**
+ * @private
+ */
+ getRuler: function getRuler() {
+ var me = this;
+ var scale = me._getIndexScale();
+ var stackCount = me.getStackCount();
+ var datasetIndex = me.index;
+ var isHorizontal = scale.isHorizontal();
+ var start = isHorizontal ? scale.left : scale.top;
+ var end = start + (isHorizontal ? scale.width : scale.height);
+ var pixels = [];
+ var i, ilen, min;
+ for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {
+ pixels.push(scale.getPixelForValue(null, i, datasetIndex));
+ }
+ min = helpers$1.isNullOrUndef(scale.options.barThickness) ? computeMinSampleSize(scale, pixels) : -1;
+ return {
+ min: min,
+ pixels: pixels,
+ start: start,
+ end: end,
+ stackCount: stackCount,
+ scale: scale
+ };
+ },
+ /**
+ * Note: pixel values are not clamped to the scale area.
+ * @private
+ */
+ calculateBarValuePixels: function calculateBarValuePixels(datasetIndex, index) {
+ var me = this;
+ var chart = me.chart;
+ var meta = me.getMeta();
+ var scale = me._getValueScale();
+ var isHorizontal = scale.isHorizontal();
+ var datasets = chart.data.datasets;
+ var value = +scale.getRightValue(datasets[datasetIndex].data[index]);
+ var minBarLength = scale.options.minBarLength;
+ var stacked = scale.options.stacked;
+ var stack = meta.stack;
+ var start = 0;
+ var i, imeta, ivalue, base, head, size;
+ if (stacked || stacked === undefined && stack !== undefined) {
+ for (i = 0; i < datasetIndex; ++i) {
+ imeta = chart.getDatasetMeta(i);
+ if (imeta.bar && imeta.stack === stack && imeta.controller._getValueScaleId() === scale.id && chart.isDatasetVisible(i)) {
+ ivalue = +scale.getRightValue(datasets[i].data[index]);
+ if (value < 0 && ivalue < 0 || value >= 0 && ivalue > 0) {
+ start += ivalue;
+ }
+ }
+ }
+ }
+ base = scale.getPixelForValue(start);
+ head = scale.getPixelForValue(start + value);
+ size = head - base;
+ if (minBarLength !== undefined && Math.abs(size) < minBarLength) {
+ size = minBarLength;
+ if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) {
+ head = base - minBarLength;
+ } else {
+ head = base + minBarLength;
+ }
+ }
+ return {
+ size: size,
+ base: base,
+ head: head,
+ center: head + size / 2
+ };
+ },
+ /**
+ * @private
+ */
+ calculateBarIndexPixels: function calculateBarIndexPixels(datasetIndex, index, ruler) {
+ var me = this;
+ var options = ruler.scale.options;
+ var range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options) : computeFitCategoryTraits(index, ruler, options);
+ var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);
+ var center = range.start + range.chunk * stackIndex + range.chunk / 2;
+ var size = Math.min(helpers$1.valueOrDefault(options.maxBarThickness, Infinity), range.chunk * range.ratio);
+ return {
+ base: center - size / 2,
+ head: center + size / 2,
+ center: center,
+ size: size
+ };
+ },
+ draw: function draw() {
+ var me = this;
+ var chart = me.chart;
+ var scale = me._getValueScale();
+ var rects = me.getMeta().data;
+ var dataset = me.getDataset();
+ var ilen = rects.length;
+ var i = 0;
+ helpers$1.canvas.clipArea(chart.ctx, chart.chartArea);
+ for (; i < ilen; ++i) {
+ if (!isNaN(scale.getRightValue(dataset.data[i]))) {
+ rects[i].draw();
+ }
+ }
+ helpers$1.canvas.unclipArea(chart.ctx);
+ },
+ /**
+ * @private
+ */
+ _resolveElementOptions: function _resolveElementOptions(rectangle, index) {
+ var me = this;
+ var chart = me.chart;
+ var datasets = chart.data.datasets;
+ var dataset = datasets[me.index];
+ var custom = rectangle.custom || {};
+ var options = chart.options.elements.rectangle;
+ var values = {};
+ var i, ilen, key;
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: dataset,
+ datasetIndex: me.index
+ };
+ var keys = ['backgroundColor', 'borderColor', 'borderSkipped', 'borderWidth'];
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve$1([custom[key], dataset[key], options[key]], context, index);
+ }
+ return values;
+ }
+ });
+ var valueOrDefault$3 = helpers$1.valueOrDefault;
+ var resolve$2 = helpers$1.options.resolve;
+ core_defaults._set('bubble', {
+ hover: {
+ mode: 'single'
+ },
+ scales: {
+ xAxes: [{
+ type: 'linear',
+ // bubble should probably use a linear scale by default
+ position: 'bottom',
+ id: 'x-axis-0' // need an ID so datasets can reference the scale
+ }],
+
+ yAxes: [{
+ type: 'linear',
+ position: 'left',
+ id: 'y-axis-0'
+ }]
+ },
+ tooltips: {
+ callbacks: {
+ title: function title() {
+ // Title doesn't make sense for scatter since we format the data as a point
+ return '';
+ },
+ label: function label(item, data) {
+ var datasetLabel = data.datasets[item.datasetIndex].label || '';
+ var dataPoint = data.datasets[item.datasetIndex].data[item.index];
+ return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';
+ }
+ }
+ }
+ });
+ var controller_bubble = core_datasetController.extend({
+ /**
+ * @protected
+ */
+ dataElementType: elements.Point,
+ /**
+ * @protected
+ */
+ update: function update(reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var points = meta.data;
+
+ // Update Points
+ helpers$1.each(points, function (point, index) {
+ me.updateElement(point, index, reset);
+ });
+ },
+ /**
+ * @protected
+ */
+ updateElement: function updateElement(point, index, reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var custom = point.custom || {};
+ var xScale = me.getScaleForId(meta.xAxisID);
+ var yScale = me.getScaleForId(meta.yAxisID);
+ var options = me._resolveElementOptions(point, index);
+ var data = me.getDataset().data[index];
+ var dsIndex = me.index;
+ var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(_typeof(data) === 'object' ? data : NaN, index, dsIndex);
+ var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);
+ point._xScale = xScale;
+ point._yScale = yScale;
+ point._options = options;
+ point._datasetIndex = dsIndex;
+ point._index = index;
+ point._model = {
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderWidth: options.borderWidth,
+ hitRadius: options.hitRadius,
+ pointStyle: options.pointStyle,
+ rotation: options.rotation,
+ radius: reset ? 0 : options.radius,
+ skip: custom.skip || isNaN(x) || isNaN(y),
+ x: x,
+ y: y
+ };
+ point.pivot();
+ },
+ /**
+ * @protected
+ */
+ setHoverStyle: function setHoverStyle(point) {
+ var model = point._model;
+ var options = point._options;
+ var getHoverColor = helpers$1.getHoverColor;
+ point.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth,
+ radius: model.radius
+ };
+ model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth);
+ model.radius = options.radius + options.hoverRadius;
+ },
+ /**
+ * @private
+ */
+ _resolveElementOptions: function _resolveElementOptions(point, index) {
+ var me = this;
+ var chart = me.chart;
+ var datasets = chart.data.datasets;
+ var dataset = datasets[me.index];
+ var custom = point.custom || {};
+ var options = chart.options.elements.point;
+ var data = dataset.data[index];
+ var values = {};
+ var i, ilen, key;
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: dataset,
+ datasetIndex: me.index
+ };
+ var keys = ['backgroundColor', 'borderColor', 'borderWidth', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth', 'hoverRadius', 'hitRadius', 'pointStyle', 'rotation'];
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve$2([custom[key], dataset[key], options[key]], context, index);
+ }
+
+ // Custom radius resolution
+ values.radius = resolve$2([custom.radius, data ? data.r : undefined, dataset.radius, options.radius], context, index);
+ return values;
+ }
+ });
+ var resolve$3 = helpers$1.options.resolve;
+ var valueOrDefault$4 = helpers$1.valueOrDefault;
+ core_defaults._set('doughnut', {
+ animation: {
+ // Boolean - Whether we animate the rotation of the Doughnut
+ animateRotate: true,
+ // Boolean - Whether we animate scaling the Doughnut from the centre
+ animateScale: false
+ },
+ hover: {
+ mode: 'single'
+ },
+ legendCallback: function legendCallback(chart) {
+ var text = [];
+ text.push('
');
+ var data = chart.data;
+ var datasets = data.datasets;
+ var labels = data.labels;
+ if (datasets.length) {
+ for (var i = 0; i < datasets[0].data.length; ++i) {
+ text.push('
');
+ return text.join('');
+ },
+ legend: {
+ labels: {
+ generateLabels: function generateLabels(chart) {
+ var data = chart.data;
+ if (data.labels.length && data.datasets.length) {
+ return data.labels.map(function (label, i) {
+ var meta = chart.getDatasetMeta(0);
+ var ds = data.datasets[0];
+ var arc = meta.data[i];
+ var custom = arc && arc.custom || {};
+ var arcOpts = chart.options.elements.arc;
+ var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);
+ var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);
+ var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);
+ return {
+ text: label,
+ fillStyle: fill,
+ strokeStyle: stroke,
+ lineWidth: bw,
+ hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
+ // Extra data used for toggling the correct item
+ index: i
+ };
+ });
+ }
+ return [];
+ }
+ },
+ onClick: function onClick(e, legendItem) {
+ var index = legendItem.index;
+ var chart = this.chart;
+ var i, ilen, meta;
+ for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
+ meta = chart.getDatasetMeta(i);
+ // toggle visibility of index if exists
+ if (meta.data[index]) {
+ meta.data[index].hidden = !meta.data[index].hidden;
+ }
+ }
+ chart.update();
+ }
+ },
+ // The percentage of the chart that we cut out of the middle.
+ cutoutPercentage: 50,
+ // The rotation of the chart, where the first data arc begins.
+ rotation: Math.PI * -0.5,
+ // The total circumference of the chart.
+ circumference: Math.PI * 2.0,
+ // Need to override these to give a nice default
+ tooltips: {
+ callbacks: {
+ title: function title() {
+ return '';
+ },
+ label: function label(tooltipItem, data) {
+ var dataLabel = data.labels[tooltipItem.index];
+ var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
+ if (helpers$1.isArray(dataLabel)) {
+ // show value on first line of multiline label
+ // need to clone because we are changing the value
+ dataLabel = dataLabel.slice();
+ dataLabel[0] += value;
+ } else {
+ dataLabel += value;
+ }
+ return dataLabel;
+ }
+ }
+ }
+ });
+ var controller_doughnut = core_datasetController.extend({
+ dataElementType: elements.Arc,
+ linkScales: helpers$1.noop,
+ // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly
+ getRingIndex: function getRingIndex(datasetIndex) {
+ var ringIndex = 0;
+ for (var j = 0; j < datasetIndex; ++j) {
+ if (this.chart.isDatasetVisible(j)) {
+ ++ringIndex;
+ }
+ }
+ return ringIndex;
+ },
+ update: function update(reset) {
+ var me = this;
+ var chart = me.chart;
+ var chartArea = chart.chartArea;
+ var opts = chart.options;
+ var availableWidth = chartArea.right - chartArea.left;
+ var availableHeight = chartArea.bottom - chartArea.top;
+ var minSize = Math.min(availableWidth, availableHeight);
+ var offset = {
+ x: 0,
+ y: 0
+ };
+ var meta = me.getMeta();
+ var arcs = meta.data;
+ var cutoutPercentage = opts.cutoutPercentage;
+ var circumference = opts.circumference;
+ var chartWeight = me._getRingWeight(me.index);
+ var i, ilen;
+
+ // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc
+ if (circumference < Math.PI * 2.0) {
+ var startAngle = opts.rotation % (Math.PI * 2.0);
+ startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);
+ var endAngle = startAngle + circumference;
+ var start = {
+ x: Math.cos(startAngle),
+ y: Math.sin(startAngle)
+ };
+ var end = {
+ x: Math.cos(endAngle),
+ y: Math.sin(endAngle)
+ };
+ var contains0 = startAngle <= 0 && endAngle >= 0 || startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle;
+ var contains90 = startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle || startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle;
+ var contains180 = startAngle <= -Math.PI && -Math.PI <= endAngle || startAngle <= Math.PI && Math.PI <= endAngle;
+ var contains270 = startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle || startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle;
+ var cutout = cutoutPercentage / 100.0;
+ var min = {
+ x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)),
+ y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))
+ };
+ var max = {
+ x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)),
+ y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))
+ };
+ var size = {
+ width: (max.x - min.x) * 0.5,
+ height: (max.y - min.y) * 0.5
+ };
+ minSize = Math.min(availableWidth / size.width, availableHeight / size.height);
+ offset = {
+ x: (max.x + min.x) * -0.5,
+ y: (max.y + min.y) * -0.5
+ };
+ }
+ for (i = 0, ilen = arcs.length; i < ilen; ++i) {
+ arcs[i]._options = me._resolveElementOptions(arcs[i], i);
+ }
+ chart.borderWidth = me.getMaxBorderWidth();
+ chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);
+ chart.innerRadius = Math.max(cutoutPercentage ? chart.outerRadius / 100 * cutoutPercentage : 0, 0);
+ chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1);
+ chart.offsetX = offset.x * chart.outerRadius;
+ chart.offsetY = offset.y * chart.outerRadius;
+ meta.total = me.calculateTotal();
+ me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index);
+ me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0);
+ for (i = 0, ilen = arcs.length; i < ilen; ++i) {
+ me.updateElement(arcs[i], i, reset);
+ }
+ },
+ updateElement: function updateElement(arc, index, reset) {
+ var me = this;
+ var chart = me.chart;
+ var chartArea = chart.chartArea;
+ var opts = chart.options;
+ var animationOpts = opts.animation;
+ var centerX = (chartArea.left + chartArea.right) / 2;
+ var centerY = (chartArea.top + chartArea.bottom) / 2;
+ var startAngle = opts.rotation; // non reset case handled later
+ var endAngle = opts.rotation; // non reset case handled later
+ var dataset = me.getDataset();
+ var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));
+ var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;
+ var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;
+ var options = arc._options || {};
+ helpers$1.extend(arc, {
+ // Utility
+ _datasetIndex: me.index,
+ _index: index,
+ // Desired view properties
+ _model: {
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderWidth: options.borderWidth,
+ borderAlign: options.borderAlign,
+ x: centerX + chart.offsetX,
+ y: centerY + chart.offsetY,
+ startAngle: startAngle,
+ endAngle: endAngle,
+ circumference: circumference,
+ outerRadius: outerRadius,
+ innerRadius: innerRadius,
+ label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])
+ }
+ });
+ var model = arc._model;
+
+ // Set correct angles if not resetting
+ if (!reset || !animationOpts.animateRotate) {
+ if (index === 0) {
+ model.startAngle = opts.rotation;
+ } else {
+ model.startAngle = me.getMeta().data[index - 1]._model.endAngle;
+ }
+ model.endAngle = model.startAngle + model.circumference;
+ }
+ arc.pivot();
+ },
+ calculateTotal: function calculateTotal() {
+ var dataset = this.getDataset();
+ var meta = this.getMeta();
+ var total = 0;
+ var value;
+ helpers$1.each(meta.data, function (element, index) {
+ value = dataset.data[index];
+ if (!isNaN(value) && !element.hidden) {
+ total += Math.abs(value);
+ }
+ });
+
+ /* if (total === 0) {
+ total = NaN;
+ }*/
+
+ return total;
+ },
+ calculateCircumference: function calculateCircumference(value) {
+ var total = this.getMeta().total;
+ if (total > 0 && !isNaN(value)) {
+ return Math.PI * 2.0 * (Math.abs(value) / total);
+ }
+ return 0;
+ },
+ // gets the max border or hover width to properly scale pie charts
+ getMaxBorderWidth: function getMaxBorderWidth(arcs) {
+ var me = this;
+ var max = 0;
+ var chart = me.chart;
+ var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth;
+ if (!arcs) {
+ // Find the outmost visible dataset
+ for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {
+ if (chart.isDatasetVisible(i)) {
+ meta = chart.getDatasetMeta(i);
+ arcs = meta.data;
+ if (i !== me.index) {
+ controller = meta.controller;
+ }
+ break;
+ }
+ }
+ }
+ if (!arcs) {
+ return 0;
+ }
+ for (i = 0, ilen = arcs.length; i < ilen; ++i) {
+ arc = arcs[i];
+ options = controller ? controller._resolveElementOptions(arc, i) : arc._options;
+ if (options.borderAlign !== 'inner') {
+ borderWidth = options.borderWidth;
+ hoverWidth = options.hoverBorderWidth;
+ max = borderWidth > max ? borderWidth : max;
+ max = hoverWidth > max ? hoverWidth : max;
+ }
+ }
+ return max;
+ },
+ /**
+ * @protected
+ */
+ setHoverStyle: function setHoverStyle(arc) {
+ var model = arc._model;
+ var options = arc._options;
+ var getHoverColor = helpers$1.getHoverColor;
+ arc.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth
+ };
+ model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);
+ },
+ /**
+ * @private
+ */
+ _resolveElementOptions: function _resolveElementOptions(arc, index) {
+ var me = this;
+ var chart = me.chart;
+ var dataset = me.getDataset();
+ var custom = arc.custom || {};
+ var options = chart.options.elements.arc;
+ var values = {};
+ var i, ilen, key;
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: dataset,
+ datasetIndex: me.index
+ };
+ var keys = ['backgroundColor', 'borderColor', 'borderWidth', 'borderAlign', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth'];
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve$3([custom[key], dataset[key], options[key]], context, index);
+ }
+ return values;
+ },
+ /**
+ * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly
+ * @private
+ */
+ _getRingWeightOffset: function _getRingWeightOffset(datasetIndex) {
+ var ringWeightOffset = 0;
+ for (var i = 0; i < datasetIndex; ++i) {
+ if (this.chart.isDatasetVisible(i)) {
+ ringWeightOffset += this._getRingWeight(i);
+ }
+ }
+ return ringWeightOffset;
+ },
+ /**
+ * @private
+ */
+ _getRingWeight: function _getRingWeight(dataSetIndex) {
+ return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0);
+ },
+ /**
+ * Returns the sum of all visibile data set weights. This value can be 0.
+ * @private
+ */
+ _getVisibleDatasetWeightTotal: function _getVisibleDatasetWeightTotal() {
+ return this._getRingWeightOffset(this.chart.data.datasets.length);
+ }
+ });
+ core_defaults._set('horizontalBar', {
+ hover: {
+ mode: 'index',
+ axis: 'y'
+ },
+ scales: {
+ xAxes: [{
+ type: 'linear',
+ position: 'bottom'
+ }],
+ yAxes: [{
+ type: 'category',
+ position: 'left',
+ categoryPercentage: 0.8,
+ barPercentage: 0.9,
+ offset: true,
+ gridLines: {
+ offsetGridLines: true
+ }
+ }]
+ },
+ elements: {
+ rectangle: {
+ borderSkipped: 'left'
+ }
+ },
+ tooltips: {
+ mode: 'index',
+ axis: 'y'
+ }
+ });
+ var controller_horizontalBar = controller_bar.extend({
+ /**
+ * @private
+ */
+ _getValueScaleId: function _getValueScaleId() {
+ return this.getMeta().xAxisID;
+ },
+ /**
+ * @private
+ */
+ _getIndexScaleId: function _getIndexScaleId() {
+ return this.getMeta().yAxisID;
+ }
+ });
+ var valueOrDefault$5 = helpers$1.valueOrDefault;
+ var resolve$4 = helpers$1.options.resolve;
+ var isPointInArea = helpers$1.canvas._isPointInArea;
+ core_defaults._set('line', {
+ showLines: true,
+ spanGaps: false,
+ hover: {
+ mode: 'label'
+ },
+ scales: {
+ xAxes: [{
+ type: 'category',
+ id: 'x-axis-0'
+ }],
+ yAxes: [{
+ type: 'linear',
+ id: 'y-axis-0'
+ }]
+ }
+ });
+ function lineEnabled(dataset, options) {
+ return valueOrDefault$5(dataset.showLine, options.showLines);
+ }
+ var controller_line = core_datasetController.extend({
+ datasetElementType: elements.Line,
+ dataElementType: elements.Point,
+ update: function update(reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var line = meta.dataset;
+ var points = meta.data || [];
+ var scale = me.getScaleForId(meta.yAxisID);
+ var dataset = me.getDataset();
+ var showLine = lineEnabled(dataset, me.chart.options);
+ var i, ilen;
+
+ // Update Line
+ if (showLine) {
+ // Compatibility: If the properties are defined with only the old name, use those values
+ if (dataset.tension !== undefined && dataset.lineTension === undefined) {
+ dataset.lineTension = dataset.tension;
+ }
+
+ // Utility
+ line._scale = scale;
+ line._datasetIndex = me.index;
+ // Data
+ line._children = points;
+ // Model
+ line._model = me._resolveLineOptions(line);
+ line.pivot();
+ }
+
+ // Update Points
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ me.updateElement(points[i], i, reset);
+ }
+ if (showLine && line._model.tension !== 0) {
+ me.updateBezierControlPoints();
+ }
+
+ // Now pivot the point for animation
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ points[i].pivot();
+ }
+ },
+ updateElement: function updateElement(point, index, reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var custom = point.custom || {};
+ var dataset = me.getDataset();
+ var datasetIndex = me.index;
+ var value = dataset.data[index];
+ var yScale = me.getScaleForId(meta.yAxisID);
+ var xScale = me.getScaleForId(meta.xAxisID);
+ var lineModel = meta.dataset._model;
+ var x, y;
+ var options = me._resolvePointOptions(point, index);
+ x = xScale.getPixelForValue(_typeof(value) === 'object' ? value : NaN, index, datasetIndex);
+ y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);
+
+ // Utility
+ point._xScale = xScale;
+ point._yScale = yScale;
+ point._options = options;
+ point._datasetIndex = datasetIndex;
+ point._index = index;
+
+ // Desired view properties
+ point._model = {
+ x: x,
+ y: y,
+ skip: custom.skip || isNaN(x) || isNaN(y),
+ // Appearance
+ radius: options.radius,
+ pointStyle: options.pointStyle,
+ rotation: options.rotation,
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderWidth: options.borderWidth,
+ tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0),
+ steppedLine: lineModel ? lineModel.steppedLine : false,
+ // Tooltip
+ hitRadius: options.hitRadius
+ };
+ },
+ /**
+ * @private
+ */
+ _resolvePointOptions: function _resolvePointOptions(element, index) {
+ var me = this;
+ var chart = me.chart;
+ var dataset = chart.data.datasets[me.index];
+ var custom = element.custom || {};
+ var options = chart.options.elements.point;
+ var values = {};
+ var i, ilen, key;
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: dataset,
+ datasetIndex: me.index
+ };
+ var ELEMENT_OPTIONS = {
+ backgroundColor: 'pointBackgroundColor',
+ borderColor: 'pointBorderColor',
+ borderWidth: 'pointBorderWidth',
+ hitRadius: 'pointHitRadius',
+ hoverBackgroundColor: 'pointHoverBackgroundColor',
+ hoverBorderColor: 'pointHoverBorderColor',
+ hoverBorderWidth: 'pointHoverBorderWidth',
+ hoverRadius: 'pointHoverRadius',
+ pointStyle: 'pointStyle',
+ radius: 'pointRadius',
+ rotation: 'pointRotation'
+ };
+ var keys = Object.keys(ELEMENT_OPTIONS);
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve$4([custom[key], dataset[ELEMENT_OPTIONS[key]], dataset[key], options[key]], context, index);
+ }
+ return values;
+ },
+ /**
+ * @private
+ */
+ _resolveLineOptions: function _resolveLineOptions(element) {
+ var me = this;
+ var chart = me.chart;
+ var dataset = chart.data.datasets[me.index];
+ var custom = element.custom || {};
+ var options = chart.options;
+ var elementOptions = options.elements.line;
+ var values = {};
+ var i, ilen, key;
+ var keys = ['backgroundColor', 'borderWidth', 'borderColor', 'borderCapStyle', 'borderDash', 'borderDashOffset', 'borderJoinStyle', 'fill', 'cubicInterpolationMode'];
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve$4([custom[key], dataset[key], elementOptions[key]]);
+ }
+
+ // The default behavior of lines is to break at null values, according
+ // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158
+ // This option gives lines the ability to span gaps
+ values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps);
+ values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension);
+ values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]);
+ return values;
+ },
+ calculatePointY: function calculatePointY(value, index, datasetIndex) {
+ var me = this;
+ var chart = me.chart;
+ var meta = me.getMeta();
+ var yScale = me.getScaleForId(meta.yAxisID);
+ var sumPos = 0;
+ var sumNeg = 0;
+ var i, ds, dsMeta;
+ if (yScale.options.stacked) {
+ for (i = 0; i < datasetIndex; i++) {
+ ds = chart.data.datasets[i];
+ dsMeta = chart.getDatasetMeta(i);
+ if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {
+ var stackedRightValue = Number(yScale.getRightValue(ds.data[index]));
+ if (stackedRightValue < 0) {
+ sumNeg += stackedRightValue || 0;
+ } else {
+ sumPos += stackedRightValue || 0;
+ }
+ }
+ }
+ var rightValue = Number(yScale.getRightValue(value));
+ if (rightValue < 0) {
+ return yScale.getPixelForValue(sumNeg + rightValue);
+ }
+ return yScale.getPixelForValue(sumPos + rightValue);
+ }
+ return yScale.getPixelForValue(value);
+ },
+ updateBezierControlPoints: function updateBezierControlPoints() {
+ var me = this;
+ var chart = me.chart;
+ var meta = me.getMeta();
+ var lineModel = meta.dataset._model;
+ var area = chart.chartArea;
+ var points = meta.data || [];
+ var i, ilen, model, controlPoints;
+
+ // Only consider points that are drawn in case the spanGaps option is used
+ if (lineModel.spanGaps) {
+ points = points.filter(function (pt) {
+ return !pt._model.skip;
+ });
+ }
+ function capControlPoint(pt, min, max) {
+ return Math.max(Math.min(pt, max), min);
+ }
+ if (lineModel.cubicInterpolationMode === 'monotone') {
+ helpers$1.splineCurveMonotone(points);
+ } else {
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ model = points[i]._model;
+ controlPoints = helpers$1.splineCurve(helpers$1.previousItem(points, i)._model, model, helpers$1.nextItem(points, i)._model, lineModel.tension);
+ model.controlPointPreviousX = controlPoints.previous.x;
+ model.controlPointPreviousY = controlPoints.previous.y;
+ model.controlPointNextX = controlPoints.next.x;
+ model.controlPointNextY = controlPoints.next.y;
+ }
+ }
+ if (chart.options.elements.line.capBezierPoints) {
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ model = points[i]._model;
+ if (isPointInArea(model, area)) {
+ if (i > 0 && isPointInArea(points[i - 1]._model, area)) {
+ model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);
+ model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);
+ }
+ if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) {
+ model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);
+ model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);
+ }
+ }
+ }
+ }
+ },
+ draw: function draw() {
+ var me = this;
+ var chart = me.chart;
+ var meta = me.getMeta();
+ var points = meta.data || [];
+ var area = chart.chartArea;
+ var ilen = points.length;
+ var halfBorderWidth;
+ var i = 0;
+ if (lineEnabled(me.getDataset(), chart.options)) {
+ halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2;
+ helpers$1.canvas.clipArea(chart.ctx, {
+ left: area.left,
+ right: area.right,
+ top: area.top - halfBorderWidth,
+ bottom: area.bottom + halfBorderWidth
+ });
+ meta.dataset.draw();
+ helpers$1.canvas.unclipArea(chart.ctx);
+ }
+
+ // Draw the points
+ for (; i < ilen; ++i) {
+ points[i].draw(area);
+ }
+ },
+ /**
+ * @protected
+ */
+ setHoverStyle: function setHoverStyle(point) {
+ var model = point._model;
+ var options = point._options;
+ var getHoverColor = helpers$1.getHoverColor;
+ point.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth,
+ radius: model.radius
+ };
+ model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);
+ model.radius = valueOrDefault$5(options.hoverRadius, options.radius);
+ }
+ });
+ var resolve$5 = helpers$1.options.resolve;
+ core_defaults._set('polarArea', {
+ scale: {
+ type: 'radialLinear',
+ angleLines: {
+ display: false
+ },
+ gridLines: {
+ circular: true
+ },
+ pointLabels: {
+ display: false
+ },
+ ticks: {
+ beginAtZero: true
+ }
+ },
+ // Boolean - Whether to animate the rotation of the chart
+ animation: {
+ animateRotate: true,
+ animateScale: true
+ },
+ startAngle: -0.5 * Math.PI,
+ legendCallback: function legendCallback(chart) {
+ var text = [];
+ text.push('
');
+ var data = chart.data;
+ var datasets = data.datasets;
+ var labels = data.labels;
+ if (datasets.length) {
+ for (var i = 0; i < datasets[0].data.length; ++i) {
+ text.push('