webseite-grav/plugins/flex-objects/js/flex-objects.js

526 lines
3.3 MiB
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is not 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__ = ({
/***/ 1720:
/***/ ((module) => {
eval("var nestRE = /^(attrs|props|on|nativeOn|class|style|hook)$/;\n\nmodule.exports = function mergeJSXProps(objs) {\n return objs.reduce(function (a, b) {\n var aa, bb, key, nestedKey, temp;\n\n for (key in b) {\n aa = a[key];\n bb = b[key];\n\n if (aa && nestRE.test(key)) {\n // normalize class\n if (key === 'class') {\n if (typeof aa === 'string') {\n temp = aa;\n a[key] = aa = {};\n aa[temp] = true;\n }\n\n if (typeof bb === 'string') {\n temp = bb;\n b[key] = bb = {};\n bb[temp] = true;\n }\n }\n\n if (key === 'on' || key === 'nativeOn' || key === 'hook') {\n // merge functions\n for (nestedKey in bb) {\n aa[nestedKey] = mergeFn(aa[nestedKey], bb[nestedKey]);\n }\n } else if (Array.isArray(aa)) {\n a[key] = aa.concat(bb);\n } else if (Array.isArray(bb)) {\n a[key] = [aa].concat(bb);\n } else {\n for (nestedKey in bb) {\n aa[nestedKey] = bb[nestedKey];\n }\n }\n } else {\n a[key] = b[key];\n }\n }\n\n return a;\n }, {});\n};\n\nfunction mergeFn(a, b) {\n return function () {\n a && a.apply(this, arguments);\n b && b.apply(this, arguments);\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvYmFiZWwtaGVscGVyLXZ1ZS1qc3gtbWVyZ2UtcHJvcHMvaW5kZXguanM/OTJmYSJdLCJuYW1lcyI6WyJuZXN0UkUiLCJtb2R1bGUiLCJleHBvcnRzIiwibWVyZ2VKU1hQcm9wcyIsIm9ianMiLCJyZWR1Y2UiLCJhIiwiYiIsImFhIiwiYmIiLCJrZXkiLCJuZXN0ZWRLZXkiLCJ0ZW1wIiwidGVzdCIsIm1lcmdlRm4iLCJBcnJheSIsImlzQXJyYXkiLCJjb25jYXQiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSUEsTUFBTSxHQUFHLDhDQUFiOztBQUVBQyxNQUFNLENBQUNDLE9BQVAsR0FBaUIsU0FBU0MsYUFBVCxDQUF3QkMsSUFBeEIsRUFBOEI7QUFDN0MsU0FBT0EsSUFBSSxDQUFDQyxNQUFMLENBQVksVUFBVUMsQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQ2pDLFFBQUlDLEVBQUosRUFBUUMsRUFBUixFQUFZQyxHQUFaLEVBQWlCQyxTQUFqQixFQUE0QkMsSUFBNUI7O0FBQ0EsU0FBS0YsR0FBTCxJQUFZSCxDQUFaLEVBQWU7QUFDYkMsTUFBQUEsRUFBRSxHQUFHRixDQUFDLENBQUNJLEdBQUQsQ0FBTjtBQUNBRCxNQUFBQSxFQUFFLEdBQUdGLENBQUMsQ0FBQ0csR0FBRCxDQUFOOztBQUNBLFVBQUlGLEVBQUUsSUFBSVIsTUFBTSxDQUFDYSxJQUFQLENBQVlILEdBQVosQ0FBVixFQUE0QjtBQUMxQjtBQUNBLFlBQUlBLEdBQUcsS0FBSyxPQUFaLEVBQXFCO0FBQ25CLGNBQUksT0FBT0YsRUFBUCxLQUFjLFFBQWxCLEVBQTRCO0FBQzFCSSxZQUFBQSxJQUFJLEdBQUdKLEVBQVA7QUFDQUYsWUFBQUEsQ0FBQyxDQUFDSSxHQUFELENBQUQsR0FBU0YsRUFBRSxHQUFHLEVBQWQ7QUFDQUEsWUFBQUEsRUFBRSxDQUFDSSxJQUFELENBQUYsR0FBVyxJQUFYO0FBQ0Q7O0FBQ0QsY0FBSSxPQUFPSCxFQUFQLEtBQWMsUUFBbEIsRUFBNEI7QUFDMUJHLFlBQUFBLElBQUksR0FBR0gsRUFBUDtBQUNBRixZQUFBQSxDQUFDLENBQUNHLEdBQUQsQ0FBRCxHQUFTRCxFQUFFLEdBQUcsRUFBZDtBQUNBQSxZQUFBQSxFQUFFLENBQUNHLElBQUQsQ0FBRixHQUFXLElBQVg7QUFDRDtBQUNGOztBQUNELFlBQUlGLEdBQUcsS0FBSyxJQUFSLElBQWdCQSxHQUFHLEtBQUssVUFBeEIsSUFBc0NBLEdBQUcsS0FBSyxNQUFsRCxFQUEwRDtBQUN4RDtBQUNBLGVBQUtDLFNBQUwsSUFBa0JGLEVBQWxCLEVBQXNCO0FBQ3BCRCxZQUFBQSxFQUFFLENBQUNHLFNBQUQsQ0FBRixHQUFnQkcsT0FBTyxDQUFDTixFQUFFLENBQUNHLFNBQUQsQ0FBSCxFQUFnQkYsRUFBRSxDQUFDRSxTQUFELENBQWxCLENBQXZCO0FBQ0Q7QUFDRixTQUxELE1BS08sSUFBSUksS0FBSyxDQUFDQyxPQUFOLENBQWNSLEVBQWQsQ0FBSixFQUF1QjtBQUM1QkYsVUFBQUEsQ0FBQyxDQUFDSSxHQUFELENBQUQsR0FBU0YsRUFBRSxDQUFDUyxNQUFILENBQVVSLEVBQVYsQ0FBVDtBQUNELFNBRk0sTUFFQSxJQUFJTSxLQUFLLENBQUNDLE9BQU4sQ0FBY1AsRUFBZCxDQUFKLEVBQXVCO0FBQzVCSCxVQUFBQSxDQUFDLENBQUNJLEdBQUQsQ0FBRCxHQUFTLENBQUNGLEVBQUQsRUFBS1MsTUFBTCxDQUFZUixFQUFaLENBQVQ7QUFDRCxTQUZNLE1BRUE7QUFDTCxlQUFLRSxTQUFMLElBQWtCRixFQUFsQixFQUFzQjtBQUNwQkQsWUFBQUEsRUFBRSxDQUFDRyxTQUFELENBQUYsR0FBZ0JGLEVBQUUsQ0FBQ0UsU0FBRCxDQUFsQjtBQUNEO0FBQ0Y7QUFDRixPQTVCRCxNQTRCTztBQUNMTCxRQUFBQSxDQUFDLENBQUNJLEdBQUQsQ0FBRCxHQUFTSCxDQUFDLENBQUNHLEdBQUQsQ0FBVjtBQUNEO0FBQ0Y7O0FBQ0QsV0FBT0osQ0FBUDtBQUNELEdBdENNLEVBc0NKLEVBdENJLENBQVA7QUF1Q0QsQ0F4Q0Q7O0FBMENBLFNBQVNRLE9BQVQsQ0FBa0JSLENBQWxCLEVBQXFCQyxDQUFyQixFQUF3QjtBQUN0QixTQUFPLFlBQVk7QUFDakJELElBQUFBLENBQUMsSUFBSUEsQ0FBQyxDQUFDWSxLQUFGLENBQVEsSUFBUixFQUFjQyxTQUFkLENBQUw7QUFDQVosSUFBQUEsQ0FBQyxJQUFJQSxDQUFDLENBQUNXLEtBQUYsQ0FBUSxJQUFSLEVBQWNDLFNBQWQsQ0FBTDtBQUNELEdBSEQ7QUFJRCIsInNvdXJjZXNDb250ZW50IjpbInZhciBuZXN0UkUgPSAvXihhdHRyc3xwcm9wc3xvbnxuYXRpdmVPbnxjbGFzc3xzdHlsZXxob29rKSQvXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbWVyZ2VKU1hQcm9wcyAob2Jqcykge1xuICByZXR1cm4gb2Jqcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgYWEsIGJiLCBrZXksIG5lc3RlZEtleSwgdGVtcFxuICAgIGZvciAoa2V5IGluIGIpIHtcbiAgICAgIGFhID0gYVtrZXldXG4gICAgICBiYiA9IGJba2V5XVxuICAgICAgaWYgKGFhICYmIG5lc3RSRS50ZXN0KGtleSkpIHtcbiAgICAgICAgLy8gbm9ybWFsaXplIGNsYXNzXG4gICAgICAgIGlmIChrZXkgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGFhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGVtcCA9IGFhXG4gICAgICAgICAgICBhW2tleV0gPSBhYSA9IHt9XG4gICAgICAgICAgICBhYVt0ZW1wXSA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBiYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRlbXAgPSBiYlxuICAgICAgICAgICAgYltrZXldID0gYmIgPSB7fVxuICAgICAgICAgICAgYmJbdGVtcF0gPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdvbicgfHwga2V5ID09PSAnbmF0aXZlT24nIHx8IGtleSA9PT0gJ2hvb2snKSB7XG4gICAgICAgICAgLy8gbWVyZ2UgZnVuY3Rpb25zXG4gICAgICAgICAgZm9yIChuZXN0ZWRLZXkgaW4gYmIpIHtcbiAgICAgICAgICAgIGFhW25lc3RlZEtleV0gPSBtZXJnZUZuKGFhW25lc3RlZEtleV0sIGJiW25lc3RlZEtleV0pXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYWEpKSB7XG4gICAgICAgICAgYVtrZXldID0gYWEuY29uY2F0KGJiKVxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYmIpKSB7XG4gICAgICAgICAgYVtrZXldID0gW2FhXS5jb25jYXQoYmIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChuZXN0ZWRLZXkgaW4gYmIpIHtcbiAgICAgICAgICAgIGFhW25lc3RlZEtleV0gPSBiYltuZXN0ZWRLZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhW2tleV0gPSBiW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFcbiAgfSwge30pXG59XG5cbmZ1bmN0aW9uIG1lcmdlRm4gKGEsIGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBhICYmIGEuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIGIgJiYgYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbn1cbiJdLCJmaWxlIjoiMTcyMC5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1720\n");
/***/ }),
/***/ 9422:
/***/ ((module) => {
"use strict";
eval("\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\n\nmodule.exports = function (cssWithMappingToString) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item);\n\n if (item[2]) {\n return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n }\n\n return content;\n }).join('');\n }; // import a list of modules into the list\n // eslint-disable-next-line func-names\n\n\n list.i = function (modules, mediaQuery, dedupe) {\n if (typeof modules === 'string') {\n // eslint-disable-next-line no-param-reassign\n modules = [[null, modules, '']];\n }\n\n var alreadyImportedModules = {};\n\n if (dedupe) {\n for (var i = 0; i < this.length; i++) {\n // eslint-disable-next-line prefer-destructuring\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n\n for (var _i = 0; _i < modules.length; _i++) {\n var item = [].concat(modules[_i]);\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (mediaQuery) {\n if (!item[2]) {\n item[2] = mediaQuery;\n } else {\n item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n }\n }\n\n list.push(item);\n }\n };\n\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzPzI0ZmIiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsImNzc1dpdGhNYXBwaW5nVG9TdHJpbmciLCJsaXN0IiwidG9TdHJpbmciLCJtYXAiLCJpdGVtIiwiY29udGVudCIsImNvbmNhdCIsImpvaW4iLCJpIiwibW9kdWxlcyIsIm1lZGlhUXVlcnkiLCJkZWR1cGUiLCJhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzIiwibGVuZ3RoIiwiaWQiLCJfaSIsInB1c2giXSwibWFwcGluZ3MiOiJBQUFhO0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBQSxNQUFNLENBQUNDLE9BQVAsR0FBaUIsVUFBVUMsc0JBQVYsRUFBa0M7QUFDakQsTUFBSUMsSUFBSSxHQUFHLEVBQVgsQ0FEaUQsQ0FDbEM7O0FBRWZBLE1BQUksQ0FBQ0MsUUFBTCxHQUFnQixTQUFTQSxRQUFULEdBQW9CO0FBQ2xDLFdBQU8sS0FBS0MsR0FBTCxDQUFTLFVBQVVDLElBQVYsRUFBZ0I7QUFDOUIsVUFBSUMsT0FBTyxHQUFHTCxzQkFBc0IsQ0FBQ0ksSUFBRCxDQUFwQzs7QUFFQSxVQUFJQSxJQUFJLENBQUMsQ0FBRCxDQUFSLEVBQWE7QUFDWCxlQUFPLFVBQVVFLE1BQVYsQ0FBaUJGLElBQUksQ0FBQyxDQUFELENBQXJCLEVBQTBCLElBQTFCLEVBQWdDRSxNQUFoQyxDQUF1Q0QsT0FBdkMsRUFBZ0QsR0FBaEQsQ0FBUDtBQUNEOztBQUVELGFBQU9BLE9BQVA7QUFDRCxLQVJNLEVBUUpFLElBUkksQ0FRQyxFQVJELENBQVA7QUFTRCxHQVZELENBSGlELENBYTlDO0FBQ0g7OztBQUdBTixNQUFJLENBQUNPLENBQUwsR0FBUyxVQUFVQyxPQUFWLEVBQW1CQyxVQUFuQixFQUErQkMsTUFBL0IsRUFBdUM7QUFDOUMsUUFBSSxPQUFPRixPQUFQLEtBQW1CLFFBQXZCLEVBQWlDO0FBQy9CO0FBQ0FBLGFBQU8sR0FBRyxDQUFDLENBQUMsSUFBRCxFQUFPQSxPQUFQLEVBQWdCLEVBQWhCLENBQUQsQ0FBVjtBQUNEOztBQUVELFFBQUlHLHNCQUFzQixHQUFHLEVBQTdCOztBQUVBLFFBQUlELE1BQUosRUFBWTtBQUNWLFdBQUssSUFBSUgsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBRyxLQUFLSyxNQUF6QixFQUFpQ0wsQ0FBQyxFQUFsQyxFQUFzQztBQUNwQztBQUNBLFlBQUlNLEVBQUUsR0FBRyxLQUFLTixDQUFMLEVBQVEsQ0FBUixDQUFUOztBQUVBLFlBQUlNLEVBQUUsSUFBSSxJQUFWLEVBQWdCO0FBQ2RGLGdDQUFzQixDQUFDRSxFQUFELENBQXRCLEdBQTZCLElBQTdCO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFNBQUssSUFBSUMsRUFBRSxHQUFHLENBQWQsRUFBaUJBLEVBQUUsR0FBR04sT0FBTyxDQUFDSSxNQUE5QixFQUFzQ0UsRUFBRSxFQUF4QyxFQUE0QztBQUMxQyxVQUFJWCxJQUFJLEdBQUcsR0FBR0UsTUFBSCxDQUFVRyxPQUFPLENBQUNNLEVBQUQsQ0FBakIsQ0FBWDs7QUFFQSxVQUFJSixNQUFNLElBQUlDLHNCQUFzQixDQUFDUixJQUFJLENBQUMsQ0FBRCxDQUFMLENBQXBDLEVBQStDO0FBQzdDO0FBQ0E7QUFDRDs7QUFFRCxVQUFJTSxVQUFKLEVBQWdCO0FBQ2QsWUFBSSxDQUFDTixJQUFJLENBQUMsQ0FBRCxDQUFULEVBQWM7QUFDWkEsY0FBSSxDQUFDLENBQUQsQ0FBSixHQUFVTSxVQUFWO0FBQ0QsU0FGRCxNQUVPO0FBQ0xOLGNBQUksQ0FBQyxDQUFELENBQUosR0FBVSxHQUFHRSxNQUFILENBQVVJLFVBQVYsRUFBc0IsT0FBdEIsRUFBK0JKLE1BQS9CLENBQXNDRixJQUFJLENBQUMsQ0FBRCxDQUExQyxDQUFWO0FBQ0Q7QUFDRjs7QUFFREgsVUFBSSxDQUFDZSxJQUFMLENBQVVaLElBQVY7QUFDRDtBQUNGLEdBckNEOztBQXVDQSxTQUFPSCxJQUFQO0FBQ0QsQ0F6REQiLCJmaWxlIjoiOTQyMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xuLy8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107IC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcblxuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG5cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIHJldHVybiBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoY29udGVudCwgXCJ9XCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKCcnKTtcbiAgfTsgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblxuXG4gIGxpc3QuaSA9IGZ1bmN0aW9uIChtb2R1bGVzLCBtZWRpYVF1ZXJ5LCBkZWR1cGUpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsICcnXV07XG4gICAgfVxuXG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblxuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgICAgdmFyIGlkID0gdGhpc1tpXVswXTtcblxuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBtb2R1bGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfaV0pO1xuXG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVkaWFRdWVyeSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWFRdWVyeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzJdID0gXCJcIi5jb25jYXQobWVkaWFRdWVyeSwgXCIgYW5kIFwiKS5jb25jYXQoaXRlbVsyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbGlzdDtcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9422\n");
/***/ }),
/***/ 5507:
/***/ ((module) => {
"use strict";
eval("\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = function cssWithMappingToString(item) {\n var _item = _slicedToArray(item, 4),\n content = _item[1],\n cssMapping = _item[3];\n\n if (typeof btoa === 'function') {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || '').concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n }\n\n return [content].join('\\n');\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qcz83NWU5Il0sIm5hbWVzIjpbIl9zbGljZWRUb0FycmF5IiwiYXJyIiwiaSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJUeXBlRXJyb3IiLCJvIiwibWluTGVuIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJuIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJBcnJheSIsImZyb20iLCJ0ZXN0IiwibGVuIiwibGVuZ3RoIiwiYXJyMiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiX2FyciIsIl9uIiwiX2QiLCJfZSIsInVuZGVmaW5lZCIsIl9pIiwiX3MiLCJuZXh0IiwiZG9uZSIsInB1c2giLCJ2YWx1ZSIsImVyciIsImlzQXJyYXkiLCJtb2R1bGUiLCJleHBvcnRzIiwiY3NzV2l0aE1hcHBpbmdUb1N0cmluZyIsIml0ZW0iLCJfaXRlbSIsImNvbnRlbnQiLCJjc3NNYXBwaW5nIiwiYnRvYSIsImJhc2U2NCIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsImRhdGEiLCJjb25jYXQiLCJzb3VyY2VNYXBwaW5nIiwic291cmNlVVJMcyIsInNvdXJjZXMiLCJtYXAiLCJzb3VyY2UiLCJzb3VyY2VSb290Iiwiam9pbiJdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsU0FBU0EsY0FBVCxDQUF3QkMsR0FBeEIsRUFBNkJDLENBQTdCLEVBQWdDO0FBQUUsU0FBT0MsZUFBZSxDQUFDRixHQUFELENBQWYsSUFBd0JHLHFCQUFxQixDQUFDSCxHQUFELEVBQU1DLENBQU4sQ0FBN0MsSUFB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akI7QUFHQSxXQUFPLENBQUNkLE9BQUQsRUFBVVMsTUFBVixDQUFpQkUsVUFBakIsRUFBNkJGLE1BQTdCLENBQW9DLENBQUNDLGFBQUQsQ0FBcEMsRUFBcURNLElBQXJELENBQTBELElBQTFELENBQVA7QUFDRDs7QUFFRCxTQUFPLENBQUNoQixPQUFELEVBQVVnQixJQUFWLENBQWUsSUFBZixDQUFQO0FBQ0QsQ0FqQkQiLCJmaWxlIjoiNTUwNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSkge1xuICB2YXIgX2l0ZW0gPSBfc2xpY2VkVG9BcnJheShpdGVtLCA0KSxcbiAgICAgIGNvbnRlbnQgPSBfaXRlbVsxXSxcbiAgICAgIGNzc01hcHBpbmcgPSBfaXRlbVszXTtcblxuICBpZiAodHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gXCIvKiMgc291cmNlVVJMPVwiLmNvbmNhdChjc3NNYXBwaW5nLnNvdXJjZVJvb3QgfHwgJycpLmNvbmNhdChzb3VyY2UsIFwiICovXCIpO1xuICAgIH0pO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KHNvdXJjZVVSTHMpLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKCdcXG4nKTtcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5507\n");
/***/ }),
/***/ 3897:
/***/ (() => {
eval("var toggle = document.querySelector('.filters-bar .adv-options');\nvar panel = document.querySelector('.filters-advanced');\n\nif (toggle && panel) {\n document.addEventListener('click', function (event) {\n if (event.target.classList.contains('adv-options') || event.target.closest('.adv-options')) {\n event.preventDefault();\n var isOpen = toggle.classList.contains('open');\n panel.classList.toggle('hide');\n toggle.classList.remove(isOpen ? 'open' : 'close');\n toggle.classList.add(isOpen ? 'close' : 'open');\n }\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9hcHAvZmlsdGVycy9wYW5lbC5qcz81Zjg4Il0sIm5hbWVzIjpbInRvZ2dsZSIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsInBhbmVsIiwiYWRkRXZlbnRMaXN0ZW5lciIsImV2ZW50IiwidGFyZ2V0IiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJjbG9zZXN0IiwicHJldmVudERlZmF1bHQiLCJpc09wZW4iLCJyZW1vdmUiLCJhZGQiXSwibWFwcGluZ3MiOiJBQUFBLElBQU1BLE1BQU0sR0FBR0MsUUFBUSxDQUFDQyxhQUFULENBQXVCLDJCQUF2QixDQUFmO0FBQ0EsSUFBTUMsS0FBSyxHQUFHRixRQUFRLENBQUNDLGFBQVQsQ0FBdUIsbUJBQXZCLENBQWQ7O0FBRUEsSUFBSUYsTUFBTSxJQUFJRyxLQUFkLEVBQXFCO0FBQ2pCRixFQUFBQSxRQUFRLENBQUNHLGdCQUFULENBQTBCLE9BQTFCLEVBQW1DLFVBQUNDLEtBQUQsRUFBVztBQUMxQyxRQUFJQSxLQUFLLENBQUNDLE1BQU4sQ0FBYUMsU0FBYixDQUF1QkMsUUFBdkIsQ0FBZ0MsYUFBaEMsS0FBa0RILEtBQUssQ0FBQ0MsTUFBTixDQUFhRyxPQUFiLENBQXFCLGNBQXJCLENBQXRELEVBQTRGO0FBQ3hGSixNQUFBQSxLQUFLLENBQUNLLGNBQU47QUFDQSxVQUFNQyxNQUFNLEdBQUdYLE1BQU0sQ0FBQ08sU0FBUCxDQUFpQkMsUUFBakIsQ0FBMEIsTUFBMUIsQ0FBZjtBQUVBTCxNQUFBQSxLQUFLLENBQUNJLFNBQU4sQ0FBZ0JQLE1BQWhCLENBQXVCLE1BQXZCO0FBQ0FBLE1BQUFBLE1BQU0sQ0FBQ08sU0FBUCxDQUFpQkssTUFBakIsQ0FBd0JELE1BQU0sR0FBRyxNQUFILEdBQVksT0FBMUM7QUFDQVgsTUFBQUEsTUFBTSxDQUFDTyxTQUFQLENBQWlCTSxHQUFqQixDQUFxQkYsTUFBTSxHQUFHLE9BQUgsR0FBYSxNQUF4QztBQUNIO0FBQ0osR0FURDtBQVVIIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgdG9nZ2xlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMtYmFyIC5hZHYtb3B0aW9ucycpO1xuY29uc3QgcGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsdGVycy1hZHZhbmNlZCcpO1xuXG5pZiAodG9nZ2xlICYmIHBhbmVsKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2Fkdi1vcHRpb25zJykgfHwgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5hZHYtb3B0aW9ucycpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNPcGVuID0gdG9nZ2xlLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpO1xuXG4gICAgICAgICAgICBwYW5lbC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRlJyk7XG4gICAgICAgICAgICB0b2dnbGUuY2xhc3NMaXN0LnJlbW92ZShpc09wZW4gPyAnb3BlbicgOiAnY2xvc2UnKTtcbiAgICAgICAgICAgIHRvZ2dsZS5jbGFzc0xpc3QuYWRkKGlzT3BlbiA/ICdjbG9zZScgOiAnb3BlbicpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iXSwiZmlsZSI6IjM4OTcuanMiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3897\n");
/***/ }),
/***/ 2850:
/***/ (() => {
eval("document.addEventListener('click', function (event) {\n var wrapper = event.target.closest('.checkboxes.indeterminate');\n\n if (wrapper) {\n event.preventDefault();\n var checkbox = wrapper.querySelector('input[type=\"checkbox\"]:not([disabled])');\n var checkStatus = wrapper.dataset._checkStatus;\n wrapper.classList.remove('status-checked', 'status-unchecked', 'status-indeterminate');\n\n switch (checkStatus) {\n // checked, going indeterminate\n case '1':\n wrapper.dataset._checkStatus = '2';\n checkbox.indeterminate = true;\n checkbox.checked = false;\n checkbox.value = 0;\n wrapper.classList.add('status-indeterminate');\n break;\n // indeterminate, going unchecked\n\n case '2':\n wrapper.dataset._checkStatus = '0';\n checkbox.indeterminate = false;\n checkbox.checked = false;\n checkbox.value = '';\n wrapper.classList.add('status-unchecked');\n break;\n // unchecked, going checked\n\n case '0':\n default:\n wrapper.dataset._checkStatus = '1';\n checkbox.indeterminate = false;\n checkbox.checked = true;\n checkbox.value = 1;\n wrapper.classList.add('status-checked');\n break;\n }\n\n var input = new CustomEvent('input', {\n detail: {\n target: checkbox\n }\n });\n document.dispatchEvent(input);\n }\n});\n(document.querySelectorAll('input[type=\"checkbox\"][indeterminate=\"true\"]') || []).forEach(function (input) {\n input.indeterminate = true;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9hcHAvdXRpbHMvaW5kZXRlcm1pbmF0ZS5qcz8xZDM0Il0sIm5hbWVzIjpbImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsImV2ZW50Iiwid3JhcHBlciIsInRhcmdldCIsImNsb3Nlc3QiLCJwcmV2ZW50RGVmYXVsdCIsImNoZWNrYm94IiwicXVlcnlTZWxlY3RvciIsImNoZWNrU3RhdHVzIiwiZGF0YXNldCIsIl9jaGVja1N0YXR1cyIsImNsYXNzTGlzdCIsInJlbW92ZSIsImluZGV0ZXJtaW5hdGUiLCJjaGVja2VkIiwidmFsdWUiLCJhZGQiLCJpbnB1dCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiZGlzcGF0Y2hFdmVudCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIl0sIm1hcHBpbmdzIjoiQUFBQUEsUUFBUSxDQUFDQyxnQkFBVCxDQUEwQixPQUExQixFQUFtQyxVQUFDQyxLQUFELEVBQVc7QUFDMUMsTUFBTUMsT0FBTyxHQUFHRCxLQUFLLENBQUNFLE1BQU4sQ0FBYUMsT0FBYixDQUFxQiwyQkFBckIsQ0FBaEI7O0FBQ0EsTUFBSUYsT0FBSixFQUFhO0FBQ1RELElBQUFBLEtBQUssQ0FBQ0ksY0FBTjtBQUNBLFFBQU1DLFFBQVEsR0FBR0osT0FBTyxDQUFDSyxhQUFSLENBQXNCLHdDQUF0QixDQUFqQjtBQUNBLFFBQU1DLFdBQVcsR0FBR04sT0FBTyxDQUFDTyxPQUFSLENBQWdCQyxZQUFwQztBQUNBUixJQUFBQSxPQUFPLENBQUNTLFNBQVIsQ0FBa0JDLE1BQWxCLENBQXlCLGdCQUF6QixFQUEyQyxrQkFBM0MsRUFBK0Qsc0JBQS9EOztBQUVBLFlBQVFKLFdBQVI7QUFDSTtBQUNBLFdBQUssR0FBTDtBQUNJTixRQUFBQSxPQUFPLENBQUNPLE9BQVIsQ0FBZ0JDLFlBQWhCLEdBQStCLEdBQS9CO0FBQ0FKLFFBQUFBLFFBQVEsQ0FBQ08sYUFBVCxHQUF5QixJQUF6QjtBQUNBUCxRQUFBQSxRQUFRLENBQUNRLE9BQVQsR0FBbUIsS0FBbkI7QUFDQVIsUUFBQUEsUUFBUSxDQUFDUyxLQUFULEdBQWlCLENBQWpCO0FBQ0FiLFFBQUFBLE9BQU8sQ0FBQ1MsU0FBUixDQUFrQkssR0FBbEIsQ0FBc0Isc0JBQXRCO0FBQ0E7QUFFSjs7QUFDQSxXQUFLLEdBQUw7QUFDSWQsUUFBQUEsT0FBTyxDQUFDTyxPQUFSLENBQWdCQyxZQUFoQixHQUErQixHQUEvQjtBQUNBSixRQUFBQSxRQUFRLENBQUNPLGFBQVQsR0FBeUIsS0FBekI7QUFDQVAsUUFBQUEsUUFBUSxDQUFDUSxPQUFULEdBQW1CLEtBQW5CO0FBQ0FSLFFBQUFBLFFBQVEsQ0FBQ1MsS0FBVCxHQUFpQixFQUFqQjtBQUNBYixRQUFBQSxPQUFPLENBQUNTLFNBQVIsQ0FBa0JLLEdBQWxCLENBQXNCLGtCQUF0QjtBQUNBO0FBRUo7O0FBQ0EsV0FBSyxHQUFMO0FBQ0E7QUFDSWQsUUFBQUEsT0FBTyxDQUFDTyxPQUFSLENBQWdCQyxZQUFoQixHQUErQixHQUEvQjtBQUNBSixRQUFBQSxRQUFRLENBQUNPLGFBQVQsR0FBeUIsS0FBekI7QUFDQVAsUUFBQUEsUUFBUSxDQUFDUSxPQUFULEdBQW1CLElBQW5CO0FBQ0FSLFFBQUFBLFFBQVEsQ0FBQ1MsS0FBVCxHQUFpQixDQUFqQjtBQUNBYixRQUFBQSxPQUFPLENBQUNTLFNBQVIsQ0FBa0JLLEdBQWxCLENBQXNCLGdCQUF0QjtBQUNBO0FBM0JSOztBQThCQSxRQUFNQyxLQUFLLEdBQUcsSUFBSUMsV0FBSixDQUFnQixPQUFoQixFQUF5QjtBQUFFQyxNQUFBQSxNQUFNLEVBQUU7QUFBRWhCLFFBQUFBLE1BQU0sRUFBRUc7QUFBVjtBQUFWLEtBQXpCLENBQWQ7QUFDQVAsSUFBQUEsUUFBUSxDQUFDcUIsYUFBVCxDQUF1QkgsS0FBdkI7QUFDSDtBQUNKLENBekNEO0FBMkNBLENBQUNsQixRQUFRLENBQUNzQixnQkFBVCxDQUEwQiw4Q0FBMUIsS0FBNkUsRUFBOUUsRUFBa0ZDLE9BQWxGLENBQTBGLFVBQUNMLEtBQUQsRUFBVztBQUFFQSxFQUFBQSxLQUFLLENBQUNKLGFBQU4sR0FBc0IsSUFBdEI7QUFBNkIsQ0FBcEkiLCJzb3VyY2VzQ29udGVudCI6WyJkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnLmNoZWNrYm94ZXMuaW5kZXRlcm1pbmF0ZScpO1xuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGNoZWNrYm94ID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06bm90KFtkaXNhYmxlZF0pJyk7XG4gICAgICAgIGNvbnN0IGNoZWNrU3RhdHVzID0gd3JhcHBlci5kYXRhc2V0Ll9jaGVja1N0YXR1cztcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCdzdGF0dXMtY2hlY2tlZCcsICdzdGF0dXMtdW5jaGVja2VkJywgJ3N0YXR1cy1pbmRldGVybWluYXRlJyk7XG5cbiAgICAgICAgc3dpdGNoIChjaGVja1N0YXR1cykge1xuICAgICAgICAgICAgLy8gY2hlY2tlZCwgZ29pbmcgaW5kZXRlcm1pbmF0ZVxuICAgICAgICAgICAgY2FzZSAnMSc6XG4gICAgICAgICAgICAgICAgd3JhcHBlci5kYXRhc2V0Ll9jaGVja1N0YXR1cyA9ICcyJztcbiAgICAgICAgICAgICAgICBjaGVja2JveC5pbmRldGVybWluYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hlY2tib3gudmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgIHdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnc3RhdHVzLWluZGV0ZXJtaW5hdGUnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgLy8gaW5kZXRlcm1pbmF0ZSwgZ29pbmcgdW5jaGVja2VkXG4gICAgICAgICAgICBjYXNlICcyJzpcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmRhdGFzZXQuX2NoZWNrU3RhdHVzID0gJzAnO1xuICAgICAgICAgICAgICAgIGNoZWNrYm94LmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hlY2tib3gudmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoJ3N0YXR1cy11bmNoZWNrZWQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgLy8gdW5jaGVja2VkLCBnb2luZyBjaGVja2VkXG4gICAgICAgICAgICBjYXNlICcwJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgd3JhcHBlci5kYXRhc2V0Ll9jaGVja1N0YXR1cyA9ICcxJztcbiAgICAgICAgICAgICAgICBjaGVja2JveC5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2hlY2tib3gudmFsdWUgPSAxO1xuICAgICAgICAgICAgICAgIHdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnc3RhdHVzLWNoZWNrZWQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IEN1c3RvbUV2ZW50KCdpbnB1dCcsIHsgZGV0YWlsOiB7IHRhcmdldDogY2hlY2tib3ggfX0pO1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGlucHV0KTtcbiAgICB9XG59KTtcblxuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXVtpbmRldGVybWluYXRlPVwidHJ1ZVwiXScpIHx8IFtdKS5mb3JFYWNoKChpbnB1dCkgPT4geyBpbnB1dC5pbmRldGVybWluYXRlID0gdHJ1ZTsgfSk7XG4iXSwiZmlsZSI6IjI4NTAuanMiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2850\n");
/***/ }),
/***/ 4238:
/***/ ((module) => {
"use strict";
eval("\n\nvar has = Object.prototype.hasOwnProperty,\n prefix = '~';\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\n\nfunction Events() {} //\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\n\n\nif (Object.create) {\n Events.prototype = Object.create(null); //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n\n if (!new Events().__proto__) prefix = false;\n}\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\n\n\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\n\n\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once),\n evt = prefix ? prefix + event : event;\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);else emitter._events[evt] = [emitter._events[evt], listener];\n return emitter;\n}\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\n\n\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();else delete emitter._events[evt];\n}\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\n\n\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\n\n\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = [],\n events,\n name;\n if (this._eventsCount === 0) return names;\n\n for (name in events = this._events) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\n\n\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event,\n handlers = this._events[evt];\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\n\n\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event,\n listeners = this._events[evt];\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\n\n\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n if (!this._events[evt]) return false;\n var listeners = this._events[evt],\n len = arguments.length,\n args,\n i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1:\n return listeners.fn.call(listeners.context), true;\n\n case 2:\n return listeners.fn.call(listeners.context, a1), true;\n\n case 3:\n return listeners.fn.call(listeners.context, a1, a2), true;\n\n case 4:\n return listeners.fn.call(listeners.context, a1, a2, a3), true;\n\n case 5:\n return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n\n case 6:\n return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len - 1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length,\n j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1:\n listeners[i].fn.call(listeners[i].context);\n break;\n\n case 2:\n listeners[i].fn.call(listeners[i].context, a1);\n break;\n\n case 3:\n listeners[i].fn.call(listeners[i].context, a1, a2);\n break;\n\n case 4:\n listeners[i].fn.call(listeners[i].context, a1, a2, a3);\n break;\n\n default:\n if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\n\n\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\n\n\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\n\n\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n if (!this._events[evt]) return this;\n\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {\n events.push(listeners[i]);\n }\n } //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n\n\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;else clearEvent(this, evt);\n }\n\n return this;\n};\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\n\n\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n}; //\n// Alias methods names because people roll like that.\n//\n\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on; //\n// Expose the prefix.\n//\n\nEventEmitter.prefixed = prefix; //\n// Allow `EventEmitter` to be imported as module namespace.\n//\n\nEventEmitter.EventEmitter = EventEmitter; //\n// Expose the module.\n//\n\nif (true) {\n module.exports = EventEmitter;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvZXZlbnRlbWl0dGVyMy9pbmRleC5qcz9iYTEwIl0sIm5hbWVzIjpbImhhcyIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicHJlZml4IiwiRXZlbnRzIiwiY3JlYXRlIiwiX19wcm90b19fIiwiRUUiLCJmbiIsImNvbnRleHQiLCJvbmNlIiwiYWRkTGlzdGVuZXIiLCJlbWl0dGVyIiwiZXZlbnQiLCJUeXBlRXJyb3IiLCJsaXN0ZW5lciIsImV2dCIsIl9ldmVudHMiLCJfZXZlbnRzQ291bnQiLCJwdXNoIiwiY2xlYXJFdmVudCIsIkV2ZW50RW1pdHRlciIsImV2ZW50TmFtZXMiLCJuYW1lcyIsImV2ZW50cyIsIm5hbWUiLCJjYWxsIiwic2xpY2UiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJjb25jYXQiLCJsaXN0ZW5lcnMiLCJoYW5kbGVycyIsImkiLCJsIiwibGVuZ3RoIiwiZWUiLCJBcnJheSIsImxpc3RlbmVyQ291bnQiLCJlbWl0IiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImxlbiIsImFyZ3VtZW50cyIsImFyZ3MiLCJyZW1vdmVMaXN0ZW5lciIsInVuZGVmaW5lZCIsImFwcGx5IiwiaiIsIm9uIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwib2ZmIiwicHJlZml4ZWQiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJQSxHQUFHLEdBQUdDLE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsY0FBM0I7QUFBQSxJQUNJQyxNQUFNLEdBQUcsR0FEYjtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLFNBQVNDLE1BQVQsR0FBa0IsQ0FBRSxDLENBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxJQUFJSixNQUFNLENBQUNLLE1BQVgsRUFBbUI7QUFDakJELFFBQU0sQ0FBQ0gsU0FBUCxHQUFtQkQsTUFBTSxDQUFDSyxNQUFQLENBQWMsSUFBZCxDQUFuQixDQURpQixDQUdqQjtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxNQUFJLENBQUMsSUFBSUQsTUFBSixHQUFhRSxTQUFsQixFQUE2QkgsTUFBTSxHQUFHLEtBQVQ7QUFDOUI7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFNBQVNJLEVBQVQsQ0FBWUMsRUFBWixFQUFnQkMsT0FBaEIsRUFBeUJDLElBQXpCLEVBQStCO0FBQzdCLE9BQUtGLEVBQUwsR0FBVUEsRUFBVjtBQUNBLE9BQUtDLE9BQUwsR0FBZUEsT0FBZjtBQUNBLE9BQUtDLElBQUwsR0FBWUEsSUFBSSxJQUFJLEtBQXBCO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTQyxXQUFULENBQXFCQyxPQUFyQixFQUE4QkMsS0FBOUIsRUFBcUNMLEVBQXJDLEVBQXlDQyxPQUF6QyxFQUFrREMsSUFBbEQsRUFBd0Q7QUFDdEQsTUFBSSxPQUFPRixFQUFQLEtBQWMsVUFBbEIsRUFBOEI7QUFDNUIsVUFBTSxJQUFJTSxTQUFKLENBQWMsaUNBQWQsQ0FBTjtBQUNEOztBQUVELE1BQUlDLFFBQVEsR0FBRyxJQUFJUixFQUFKLENBQU9DLEVBQVAsRUFBV0MsT0FBTyxJQUFJRyxPQUF0QixFQUErQkYsSUFBL0IsQ0FBZjtBQUFBLE1BQ0lNLEdBQUcsR0FBR2IsTUFBTSxHQUFHQSxNQUFNLEdBQUdVLEtBQVosR0FBb0JBLEtBRHBDO0FBR0EsTUFBSSxDQUFDRCxPQUFPLENBQUNLLE9BQVIsQ0FBZ0JELEdBQWhCLENBQUwsRUFBMkJKLE9BQU8sQ0FBQ0ssT0FBUixDQUFnQkQsR0FBaEIsSUFBdUJELFFBQXZCLEVBQWlDSCxPQUFPLENBQUNNLFlBQVIsRUFBakMsQ0FBM0IsS0FDSyxJQUFJLENBQUNOLE9BQU8sQ0FBQ0ssT0FBUixDQUFnQkQsR0FBaEIsRUFBcUJSLEVBQTFCLEVBQThCSSxPQUFPLENBQUNLLE9BQVIsQ0FBZ0JELEdBQWhCLEVBQXFCRyxJQUFyQixDQUEwQkosUUFBMUIsRUFBOUIsS0FDQUgsT0FBTyxDQUFDSyxPQUFSLENBQWdCRCxHQUFoQixJQUF1QixDQUFDSixPQUFPLENBQUNLLE9BQVIsQ0FBZ0JELEdBQWhCLENBQUQsRUFBdUJELFFBQXZCLENBQXZCO0FBRUwsU0FBT0gsT0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFNBQVNRLFVBQVQsQ0FBb0JSLE9BQXBCLEVBQTZCSSxHQUE3QixFQUFrQztBQUNoQyxNQUFJLEVBQUVKLE9BQU8sQ0FBQ00sWUFBVixLQUEyQixDQUEvQixFQUFrQ04sT0FBTyxDQUFDSyxPQUFSLEdBQWtCLElBQUliLE1BQUosRUFBbEIsQ0FBbEMsS0FDSyxPQUFPUSxPQUFPLENBQUNLLE9BQVIsQ0FBZ0JELEdBQWhCLENBQVA7QUFDTjtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTSyxZQUFULEdBQXdCO0FBQ3RCLE9BQUtKLE9BQUwsR0FBZSxJQUFJYixNQUFKLEVBQWY7QUFDQSxPQUFLYyxZQUFMLEdBQW9CLENBQXBCO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0FHLFlBQVksQ0FBQ3BCLFNBQWIsQ0FBdUJxQixVQUF2QixHQUFvQyxTQUFTQSxVQUFULEdBQXNCO0FBQ3hELE1BQUlDLEtBQUssR0FBRyxFQUFaO0FBQUEsTUFDSUMsTUFESjtBQUFBLE1BRUlDLElBRko7QUFJQSxNQUFJLEtBQUtQLFlBQUwsS0FBc0IsQ0FBMUIsRUFBNkIsT0FBT0ssS0FBUDs7QUFFN0IsT0FBS0UsSUFBTCxJQUFjRCxNQUFNLEdBQUcsS0FBS1AsT0FBNUIsRUFBc0M7QUFDcEMsUUFBSWxCLEdBQUcsQ0FBQzJCLElBQUosQ0FBU0YsTUFBVCxFQUFpQkMsSUFBakIsQ0FBSixFQUE0QkYsS0FBSyxDQUFDSixJQUFOLENBQVdoQixNQUFNLEdBQUdzQixJQUFJLENBQUNFLEtBQUwsQ0FBVyxDQUFYLENBQUgsR0FBbUJGLElBQXBDO0FBQzdCOztBQUVELE1BQUl6QixNQUFNLENBQUM0QixxQkFBWCxFQUFrQztBQUNoQyxXQUFPTCxLQUFLLENBQUNNLE1BQU4sQ0FBYTdCLE1BQU0sQ0FBQzRCLHFCQUFQLENBQTZCSixNQUE3QixDQUFiLENBQVA7QUFDRDs7QUFFRCxTQUFPRCxLQUFQO0FBQ0QsQ0FoQkQ7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBRixZQUFZLENBQUNwQixTQUFiLENBQXVCNkIsU0FBdkIsR0FBbUMsU0FBU0EsU0FBVCxDQUFtQmpCLEtBQW5CLEVBQTBCO0FBQzNELE1BQUlHLEdBQUcsR0FBR2IsTUFBTSxHQUFHQSxNQUFNLEdBQUdVLEtBQVosR0FBb0JBLEtBQXBDO0FBQUEsTUFDSWtCLFFBQVEsR0FBRyxLQUFLZCxPQUFMLENBQWFELEdBQWIsQ0FEZjtBQUdBLE1BQUksQ0FBQ2UsUUFBTCxFQUFlLE9BQU8sRUFBUDtBQUNmLE1BQUlBLFFBQVEsQ0FBQ3ZCLEVBQWIsRUFBaUIsT0FBTyxDQUFDdUIsUUFBUSxDQUFDdkIsRUFBVixDQUFQOztBQUVqQixPQUFLLElBQUl3QixDQUFDLEdBQUcsQ0FBUixFQUFXQyxDQUFDLEdBQUdGLFFBQVEsQ0FBQ0csTUFBeEIsRUFBZ0NDLEVBQUUsR0FBRyxJQUFJQyxLQUFKLENBQVVILENBQVYsQ0FBMUMsRUFBd0RELENBQUMsR0FBR0MsQ0FBNUQsRUFBK0RELENBQUMsRUFBaEUsRUFBb0U7QUFDbEVHLE1BQUUsQ0FBQ0gsQ0FBRCxDQUFGLEdBQVFELFFBQVEsQ0FBQ0MsQ0FBRCxDQUFSLENBQVl4QixFQUFwQjtBQUNEOztBQUVELFNBQU8yQixFQUFQO0FBQ0QsQ0FaRDtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQWQsWUFBWSxDQUFDcEIsU0FBYixDQUF1Qm9DLGFBQXZCLEdBQXVDLFNBQVNBLGFBQVQsQ0FBdUJ4QixLQUF2QixFQUE4QjtBQUNuRSxNQUFJRyxHQUFHLEdBQUdiLE1BQU0sR0FBR0EsTUFBTSxHQUFHVSxLQUFaLEdBQW9CQSxLQUFwQztBQUFBLE1BQ0lpQixTQUFTLEdBQUcsS0FBS2IsT0FBTCxDQUFhRCxHQUFiLENBRGhCO0FBR0EsTUFBSSxDQUFDYyxTQUFMLEVBQWdCLE9BQU8sQ0FBUDtBQUNoQixNQUFJQSxTQUFTLENBQUN0QixFQUFkLEVBQWtCLE9BQU8sQ0FBUDtBQUNsQixTQUFPc0IsU0FBUyxDQUFDSSxNQUFqQjtBQUNELENBUEQ7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0FiLFlBQVksQ0FBQ3BCLFNBQWIsQ0FBdUJxQyxJQUF2QixHQUE4QixTQUFTQSxJQUFULENBQWN6QixLQUFkLEVBQXFCMEIsRUFBckIsRUFBeUJDLEVBQXpCLEVBQTZCQyxFQUE3QixFQUFpQ0MsRUFBakMsRUFBcUNDLEVBQXJDLEVBQXlDO0FBQ3JFLE1BQUkzQixHQUFHLEdBQUdiLE1BQU0sR0FBR0EsTUFBTSxHQUFHVSxLQUFaLEdBQW9CQSxLQUFwQztBQUVBLE1BQUksQ0FBQyxLQUFLSSxPQUFMLENBQWFELEdBQWIsQ0FBTCxFQUF3QixPQUFPLEtBQVA7QUFFeEIsTUFBSWMsU0FBUyxHQUFHLEtBQUtiLE9BQUwsQ0FBYUQsR0FBYixDQUFoQjtBQUFBLE1BQ0k0QixHQUFHLEdBQUdDLFNBQVMsQ0FBQ1gsTUFEcEI7QUFBQSxNQUVJWSxJQUZKO0FBQUEsTUFHSWQsQ0FISjs7QUFLQSxNQUFJRixTQUFTLENBQUN0QixFQUFkLEVBQWtCO0FBQ2hCLFFBQUlzQixTQUFTLENBQUNwQixJQUFkLEVBQW9CLEtBQUtxQyxjQUFMLENBQW9CbEMsS0FBcEIsRUFBMkJpQixTQUFTLENBQUN0QixFQUFyQyxFQUF5Q3dDLFNBQXpDLEVBQW9ELElBQXBEOztBQUVwQixZQUFRSixHQUFSO0FBQ0UsV0FBSyxDQUFMO0FBQVEsZUFBT2QsU0FBUyxDQUFDdEIsRUFBVixDQUFha0IsSUFBYixDQUFrQkksU0FBUyxDQUFDckIsT0FBNUIsR0FBc0MsSUFBN0M7O0FBQ1IsV0FBSyxDQUFMO0FBQVEsZUFBT3FCLFNBQVMsQ0FBQ3RCLEVBQVYsQ0FBYWtCLElBQWIsQ0FBa0JJLFNBQVMsQ0FBQ3JCLE9BQTVCLEVBQXFDOEIsRUFBckMsR0FBMEMsSUFBakQ7O0FBQ1IsV0FBSyxDQUFMO0FBQVEsZUFBT1QsU0FBUyxDQUFDdEIsRUFBVixDQUFha0IsSUFBYixDQUFrQkksU0FBUyxDQUFDckIsT0FBNUIsRUFBcUM4QixFQUFyQyxFQUF5Q0MsRUFBekMsR0FBOEMsSUFBckQ7O0FBQ1IsV0FBSyxDQUFMO0FBQVEsZUFBT1YsU0FBUyxDQUFDdEIsRUFBVixDQUFha0IsSUFBYixDQUFrQkksU0FBUyxDQUFDckIsT0FBNUIsRUFBcUM4QixFQUFyQyxFQUF5Q0MsRUFBekMsRUFBNkNDLEVBQTdDLEdBQWtELElBQXpEOztBQUNSLFdBQUssQ0FBTDtBQUFRLGVBQU9YLFNBQVMsQ0FBQ3RCLEVBQVYsQ0FBYWtCLElBQWIsQ0FBa0JJLFNBQVMsQ0FBQ3JCLE9BQTVCLEVBQXFDOEIsRUFBckMsRUFBeUNDLEVBQXpDLEVBQTZDQyxFQUE3QyxFQUFpREMsRUFBakQsR0FBc0QsSUFBN0Q7O0FBQ1IsV0FBSyxDQUFMO0FBQVEsZUFBT1osU0FBUyxDQUFDdEIsRUFBVixDQUFha0IsSUFBYixDQUFrQkksU0FBUyxDQUFDckIsT0FBNUIsRUFBcUM4QixFQUFyQyxFQUF5Q0MsRUFBekMsRUFBNkNDLEVBQTdDLEVBQWlEQyxFQUFqRCxFQUFxREMsRUFBckQsR0FBMEQsSUFBakU7QUFOVjs7QUFTQSxTQUFLWCxDQUFDLEdBQUcsQ0FBSixFQUFPYyxJQUFJLEdBQUcsSUFBSVYsS0FBSixDQUFVUSxHQUFHLEdBQUUsQ0FBZixDQUFuQixFQUFzQ1osQ0FBQyxHQUFHWSxHQUExQyxFQUErQ1osQ0FBQyxFQUFoRCxFQUFvRDtBQUNsRGMsVUFBSSxDQUFDZCxDQUFDLEdBQUcsQ0FBTCxDQUFKLEdBQWNhLFNBQVMsQ0FBQ2IsQ0FBRCxDQUF2QjtBQUNEOztBQUVERixhQUFTLENBQUN0QixFQUFWLENBQWF5QyxLQUFiLENBQW1CbkIsU0FBUyxDQUFDckIsT0FBN0IsRUFBc0NxQyxJQUF0QztBQUNELEdBakJELE1BaUJPO0FBQ0wsUUFBSVosTUFBTSxHQUFHSixTQUFTLENBQUNJLE1BQXZCO0FBQUEsUUFDSWdCLENBREo7O0FBR0EsU0FBS2xCLENBQUMsR0FBRyxDQUFULEVBQVlBLENBQUMsR0FBR0UsTUFBaEIsRUFBd0JGLENBQUMsRUFBekIsRUFBNkI7QUFDM0IsVUFBSUYsU0FBUyxDQUFDRSxDQUFELENBQVQsQ0FBYXRCLElBQWpCLEVBQXVCLEtBQUtxQyxjQUFMLENBQW9CbEMsS0FBcEIsRUFBMkJpQixTQUFTLENBQUNFLENBQUQsQ0FBVCxDQUFheEIsRUFBeEMsRUFBNEN3QyxTQUE1QyxFQUF1RCxJQUF2RDs7QUFFdkIsY0FBUUosR0FBUjtBQUNFLGFBQUssQ0FBTDtBQUFRZCxtQkFBUyxDQUFDRSxDQUFELENBQVQsQ0FBYXhCLEVBQWIsQ0FBZ0JrQixJQUFoQixDQUFxQkksU0FBUyxDQUFDRSxDQUFELENBQVQsQ0FBYXZCLE9BQWxDO0FBQTRDOztBQUNwRCxhQUFLLENBQUw7QUFBUXFCLG1CQUFTLENBQUNFLENBQUQsQ0FBVCxDQUFheEIsRUFBYixDQUFnQmtCLElBQWhCLENBQXFCSSxTQUFTLENBQUNFLENBQUQsQ0FBVCxDQUFhdkIsT0FBbEMsRUFBMkM4QixFQUEzQztBQUFnRDs7QUFDeEQsYUFBSyxDQUFMO0FBQVFULG1CQUFTLENBQUNFLENBQUQsQ0FBVCxDQUFheEIsRUFBYixDQUFnQmtCLElBQWhCLENBQXFCSSxTQUFTLENBQUNFLENBQUQsQ0FBVCxDQUFhdkIsT0FBbEMsRUFBMkM4QixFQUEzQyxFQUErQ0MsRUFBL0M7QUFBb0Q7O0FBQzVELGFBQUssQ0FBTDtBQUFRVixtQkFBUyxDQUFDRSxDQUFELENBQVQsQ0FBYXhCLEVBQWIsQ0FBZ0JrQixJQUFoQixDQUFxQkksU0FBUyxDQUFDRSxDQUFELENBQVQsQ0FBYXZCLE9BQWxDLEVBQTJDOEIsRUFBM0MsRUFBK0NDLEVBQS9DLEVBQW1EQyxFQUFuRDtBQUF3RDs7QUFDaEU7QUFDRSxjQUFJLENBQUNLLElBQUwsRUFBVyxLQUFLSSxDQUFDLEdBQUcsQ0FBSixFQUFPSixJQUFJLEdBQUcsSUFBSVYsS0FBSixDQUFVUSxHQUFHLEdBQUUsQ0FBZixDQUFuQixFQUFzQ00sQ0FBQyxHQUFHTixHQUExQyxFQUErQ00sQ0FBQyxFQUFoRCxFQUFvRDtBQUM3REosZ0JBQUksQ0FBQ0ksQ0FBQyxHQUFHLENBQUwsQ0FBSixHQUFjTCxTQUFTLENBQUNLLENBQUQsQ0FBdkI7QUFDRDtBQUVEcEIsbUJBQVMsQ0FBQ0UsQ0FBRCxDQUFULENBQWF4QixFQUFiLENBQWdCeUMsS0FBaEIsQ0FBc0JuQixTQUFTLENBQUNFLENBQUQsQ0FBVCxDQUFhdkIsT0FBbkMsRUFBNENxQyxJQUE1QztBQVZKO0FBWUQ7QUFDRjs7QUFFRCxTQUFPLElBQVA7QUFDRCxDQWxERDtBQW9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBekIsWUFBWSxDQUFDcEIsU0FBYixDQUF1QmtELEVBQXZCLEdBQTRCLFNBQVNBLEVBQVQsQ0FBWXRDLEtBQVosRUFBbUJMLEVBQW5CLEVBQXVCQyxPQUF2QixFQUFnQztBQUMxRCxTQUFPRSxXQUFXLENBQUMsSUFBRCxFQUFPRSxLQUFQLEVBQWNMLEVBQWQsRUFBa0JDLE9BQWxCLEVBQTJCLEtBQTNCLENBQWxCO0FBQ0QsQ0FGRDtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0FZLFlBQVksQ0FBQ3BCLFNBQWIsQ0FBdUJTLElBQXZCLEdBQThCLFNBQVNBLElBQVQsQ0FBY0csS0FBZCxFQUFxQkwsRUFBckIsRUFBeUJDLE9BQXpCLEVBQWtDO0FBQzlELFNBQU9FLFdBQVcsQ0FBQyxJQUFELEVBQU9FLEtBQVAsRUFBY0wsRUFBZCxFQUFrQkMsT0FBbEIsRUFBMkIsSUFBM0IsQ0FBbEI7QUFDRCxDQUZEO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBWSxZQUFZLENBQUNwQixTQUFiLENBQXVCOEMsY0FBdkIsR0FBd0MsU0FBU0EsY0FBVCxDQUF3QmxDLEtBQXhCLEVBQStCTCxFQUEvQixFQUFtQ0MsT0FBbkMsRUFBNENDLElBQTVDLEVBQWtEO0FBQ3hGLE1BQUlNLEdBQUcsR0FBR2IsTUFBTSxHQUFHQSxNQUFNLEdBQUdVLEtBQVosR0FBb0JBLEtBQXBDO0FBRUEsTUFBSSxDQUFDLEtBQUtJLE9BQUwsQ0FBYUQsR0FBYixDQUFMLEVBQXdCLE9BQU8sSUFBUDs7QUFDeEIsTUFBSSxDQUFDUixFQUFMLEVBQVM7QUFDUFksY0FBVSxDQUFDLElBQUQsRUFBT0osR0FBUCxDQUFWO0FBQ0EsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsTUFBSWMsU0FBUyxHQUFHLEtBQUtiLE9BQUwsQ0FBYUQsR0FBYixDQUFoQjs7QUFFQSxNQUFJYyxTQUFTLENBQUN0QixFQUFkLEVBQWtCO0FBQ2hCLFFBQ0VzQixTQUFTLENBQUN0QixFQUFWLEtBQWlCQSxFQUFqQixLQUNDLENBQUNFLElBQUQsSUFBU29CLFNBQVMsQ0FBQ3BCLElBRHBCLE1BRUMsQ0FBQ0QsT0FBRCxJQUFZcUIsU0FBUyxDQUFDckIsT0FBVixLQUFzQkEsT0FGbkMsQ0FERixFQUlFO0FBQ0FXLGdCQUFVLENBQUMsSUFBRCxFQUFPSixHQUFQLENBQVY7QUFDRDtBQUNGLEdBUkQsTUFRTztBQUNMLFNBQUssSUFBSWdCLENBQUMsR0FBRyxDQUFSLEVBQVdSLE1BQU0sR0FBRyxFQUFwQixFQUF3QlUsTUFBTSxHQUFHSixTQUFTLENBQUNJLE1BQWhELEVBQXdERixDQUFDLEdBQUdFLE1BQTVELEVBQW9FRixDQUFDLEVBQXJFLEVBQXlFO0FBQ3ZFLFVBQ0VGLFNBQVMsQ0FBQ0UsQ0FBRCxDQUFULENBQWF4QixFQUFiLEtBQW9CQSxFQUFwQixJQUNDRSxJQUFJLElBQUksQ0FBQ29CLFNBQVMsQ0FBQ0UsQ0FBRCxDQUFULENBQWF0QixJQUR2QixJQUVDRCxPQUFPLElBQUlxQixTQUFTLENBQUNFLENBQUQsQ0FBVCxDQUFhdkIsT0FBYixLQUF5QkEsT0FIdkMsRUFJRTtBQUNBZSxjQUFNLENBQUNMLElBQVAsQ0FBWVcsU0FBUyxDQUFDRSxDQUFELENBQXJCO0FBQ0Q7QUFDRixLQVRJLENBV0w7QUFDQTtBQUNBOzs7QUFDQSxRQUFJUixNQUFNLENBQUNVLE1BQVgsRUFBbUIsS0FBS2pCLE9BQUwsQ0FBYUQsR0FBYixJQUFvQlEsTUFBTSxDQUFDVSxNQUFQLEtBQWtCLENBQWxCLEdBQXNCVixNQUFNLENBQUMsQ0FBRCxDQUE1QixHQUFrQ0EsTUFBdEQsQ0FBbkIsS0FDS0osVUFBVSxDQUFDLElBQUQsRUFBT0osR0FBUCxDQUFWO0FBQ047O0FBRUQsU0FBTyxJQUFQO0FBQ0QsQ0F0Q0Q7QUF3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBSyxZQUFZLENBQUNwQixTQUFiLENBQXVCbUQsa0JBQXZCLEdBQTRDLFNBQVNBLGtCQUFULENBQTRCdkMsS0FBNUIsRUFBbUM7QUFDN0UsTUFBSUcsR0FBSjs7QUFFQSxNQUFJSCxLQUFKLEVBQVc7QUFDVEcsT0FBRyxHQUFHYixNQUFNLEdBQUdBLE1BQU0sR0FBR1UsS0FBWixHQUFvQkEsS0FBaEM7QUFDQSxRQUFJLEtBQUtJLE9BQUwsQ0FBYUQsR0FBYixDQUFKLEVBQXVCSSxVQUFVLENBQUMsSUFBRCxFQUFPSixHQUFQLENBQVY7QUFDeEIsR0FIRCxNQUdPO0FBQ0wsU0FBS0MsT0FBTCxHQUFlLElBQUliLE1BQUosRUFBZjtBQUNBLFNBQUtjLFlBQUwsR0FBb0IsQ0FBcEI7QUFDRDs7QUFFRCxTQUFPLElBQVA7QUFDRCxDQVpELEMsQ0FjQTtBQUNBO0FBQ0E7OztBQUNBRyxZQUFZLENBQUNwQixTQUFiLENBQXVCb0QsR0FBdkIsR0FBNkJoQyxZQUFZLENBQUNwQixTQUFiLENBQXVCOEMsY0FBcEQ7QUFDQTFCLFlBQVksQ0FBQ3BCLFNBQWIsQ0FBdUJVLFdBQXZCLEdBQXFDVSxZQUFZLENBQUNwQixTQUFiLENBQXVCa0QsRUFBNUQsQyxDQUVBO0FBQ0E7QUFDQTs7QUFDQTlCLFlBQVksQ0FBQ2lDLFFBQWIsR0FBd0JuRCxNQUF4QixDLENBRUE7QUFDQTtBQUNBOztBQUNBa0IsWUFBWSxDQUFDQSxZQUFiLEdBQTRCQSxZQUE1QixDLENBRUE7QUFDQTtBQUNBOztBQUNBLElBQUksSUFBSixFQUFtQztBQUNqQ2tDLFFBQU0sQ0FBQ0MsT0FBUCxHQUFpQm5DLFlBQWpCO0FBQ0QiLCJmaWxlIjoiNDIzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4238\n");
/***/ }),
/***/ 578:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("var root = __webpack_require__(8548);\n/** Built-in value references. */\n\n\nvar _Symbol = root.Symbol;\nmodule.exports = _Symbol;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanM/OWU2OSJdLCJuYW1lcyI6WyJyb290IiwicmVxdWlyZSIsIlN5bWJvbCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLElBQUksR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQWxCO0FBRUE7OztBQUNBLElBQUlDLE9BQU0sR0FBR0YsSUFBSSxDQUFDRSxNQUFsQjtBQUVBQyxNQUFNLENBQUNDLE9BQVAsR0FBaUJGLE9BQWpCIiwiZmlsZSI6IjU3OC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2w7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///578\n");
/***/ }),
/***/ 5515:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("var _Symbol = __webpack_require__(578),\n getRawTag = __webpack_require__(7778),\n objectToString = __webpack_require__(5610);\n/** `Object#toString` result references. */\n\n\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n/** Built-in value references. */\n\nvar symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n\n return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);\n}\n\nmodule.exports = baseGetTag;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzPzM3MjkiXSwibmFtZXMiOlsiU3ltYm9sIiwicmVxdWlyZSIsImdldFJhd1RhZyIsIm9iamVjdFRvU3RyaW5nIiwibnVsbFRhZyIsInVuZGVmaW5lZFRhZyIsInN5bVRvU3RyaW5nVGFnIiwidG9TdHJpbmdUYWciLCJ1bmRlZmluZWQiLCJiYXNlR2V0VGFnIiwidmFsdWUiLCJPYmplY3QiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxPQUFNLEdBQUdDLG1CQUFPLENBQUMsR0FBRCxDQUFwQjtBQUFBLElBQ0lDLFNBQVMsR0FBR0QsbUJBQU8sQ0FBQyxJQUFELENBRHZCO0FBQUEsSUFFSUUsY0FBYyxHQUFHRixtQkFBTyxDQUFDLElBQUQsQ0FGNUI7QUFJQTs7O0FBQ0EsSUFBSUcsT0FBTyxHQUFHLGVBQWQ7QUFBQSxJQUNJQyxZQUFZLEdBQUcsb0JBRG5CO0FBR0E7O0FBQ0EsSUFBSUMsY0FBYyxHQUFHTixPQUFNLEdBQUdBLE9BQU0sQ0FBQ08sV0FBVixHQUF3QkMsU0FBbkQ7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxTQUFTQyxVQUFULENBQW9CQyxLQUFwQixFQUEyQjtBQUN6QixNQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtBQUNqQixXQUFPQSxLQUFLLEtBQUtGLFNBQVYsR0FBc0JILFlBQXRCLEdBQXFDRCxPQUE1QztBQUNEOztBQUNELFNBQVFFLGNBQWMsSUFBSUEsY0FBYyxJQUFJSyxNQUFNLENBQUNELEtBQUQsQ0FBM0MsR0FDSFIsU0FBUyxDQUFDUSxLQUFELENBRE4sR0FFSFAsY0FBYyxDQUFDTyxLQUFELENBRmxCO0FBR0Q7O0FBRURFLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQkosVUFBakIiLCJmaWxlIjoiNTUxNS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBnZXRSYXdUYWcgPSByZXF1aXJlKCcuL19nZXRSYXdUYWcnKSxcbiAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmUoJy4vX29iamVjdFRvU3RyaW5nJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRUYWc7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5515\n");
/***/ }),
/***/ 3070:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = (typeof __webpack_require__.g === \"undefined\" ? \"undefined\" : _typeof(__webpack_require__.g)) == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;\nmodule.exports = freeGlobal;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzPzU4NWEiXSwibmFtZXMiOlsiZnJlZUdsb2JhbCIsImdsb2JhbCIsIk9iamVjdCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQSxJQUFJQSxVQUFVLEdBQUcsUUFBT0MscUJBQVAseUNBQU9BLHFCQUFQLE1BQWlCLFFBQWpCLElBQTZCQSxxQkFBN0IsSUFBdUNBLHFCQUFNLENBQUNDLE1BQVAsS0FBa0JBLE1BQXpELElBQW1FRCxxQkFBcEY7QUFFQUUsTUFBTSxDQUFDQyxPQUFQLEdBQWlCSixVQUFqQiIsImZpbGUiOiIzMDcwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmcmVlR2xvYmFsO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3070\n");
/***/ }),
/***/ 7778:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("var _Symbol = __webpack_require__(578);\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n\nvar nativeObjectToString = objectProto.toString;\n/** Built-in value references. */\n\nvar symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n\n return result;\n}\n\nmodule.exports = getRawTag;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRSYXdUYWcuanM/MDBmZCJdLCJuYW1lcyI6WyJTeW1ib2wiLCJyZXF1aXJlIiwib2JqZWN0UHJvdG8iLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsIm5hdGl2ZU9iamVjdFRvU3RyaW5nIiwidG9TdHJpbmciLCJzeW1Ub1N0cmluZ1RhZyIsInRvU3RyaW5nVGFnIiwidW5kZWZpbmVkIiwiZ2V0UmF3VGFnIiwidmFsdWUiLCJpc093biIsImNhbGwiLCJ0YWciLCJ1bm1hc2tlZCIsImUiLCJyZXN1bHQiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxPQUFNLEdBQUdDLG1CQUFPLENBQUMsR0FBRCxDQUFwQjtBQUVBOzs7QUFDQSxJQUFJQyxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsU0FBekI7QUFFQTs7QUFDQSxJQUFJQyxjQUFjLEdBQUdILFdBQVcsQ0FBQ0csY0FBakM7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLElBQUlDLG9CQUFvQixHQUFHSixXQUFXLENBQUNLLFFBQXZDO0FBRUE7O0FBQ0EsSUFBSUMsY0FBYyxHQUFHUixPQUFNLEdBQUdBLE9BQU0sQ0FBQ1MsV0FBVixHQUF3QkMsU0FBbkQ7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxTQUFTQyxTQUFULENBQW1CQyxLQUFuQixFQUEwQjtBQUN4QixNQUFJQyxLQUFLLEdBQUdSLGNBQWMsQ0FBQ1MsSUFBZixDQUFvQkYsS0FBcEIsRUFBMkJKLGNBQTNCLENBQVo7QUFBQSxNQUNJTyxHQUFHLEdBQUdILEtBQUssQ0FBQ0osY0FBRCxDQURmOztBQUdBLE1BQUk7QUFDRkksU0FBSyxDQUFDSixjQUFELENBQUwsR0FBd0JFLFNBQXhCO0FBQ0EsUUFBSU0sUUFBUSxHQUFHLElBQWY7QUFDRCxHQUhELENBR0UsT0FBT0MsQ0FBUCxFQUFVLENBQUU7O0FBRWQsTUFBSUMsTUFBTSxHQUFHWixvQkFBb0IsQ0FBQ1EsSUFBckIsQ0FBMEJGLEtBQTFCLENBQWI7O0FBQ0EsTUFBSUksUUFBSixFQUFjO0FBQ1osUUFBSUgsS0FBSixFQUFXO0FBQ1RELFdBQUssQ0FBQ0osY0FBRCxDQUFMLEdBQXdCTyxHQUF4QjtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU9ILEtBQUssQ0FBQ0osY0FBRCxDQUFaO0FBQ0Q7QUFDRjs7QUFDRCxTQUFPVSxNQUFQO0FBQ0Q7O0FBRURDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQlQsU0FBakIiLCJmaWxlIjoiNzc3OC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7778\n");
/***/ }),
/***/ 5610:
/***/ ((module) => {
eval("/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n\nvar nativeObjectToString = objectProto.toString;\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcz8yOWYzIl0sIm5hbWVzIjpbIm9iamVjdFByb3RvIiwiT2JqZWN0IiwicHJvdG90eXBlIiwibmF0aXZlT2JqZWN0VG9TdHJpbmciLCJ0b1N0cmluZyIsIm9iamVjdFRvU3RyaW5nIiwidmFsdWUiLCJjYWxsIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxJQUFJQSxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsU0FBekI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLElBQUlDLG9CQUFvQixHQUFHSCxXQUFXLENBQUNJLFFBQXZDO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsU0FBU0MsY0FBVCxDQUF3QkMsS0FBeEIsRUFBK0I7QUFDN0IsU0FBT0gsb0JBQW9CLENBQUNJLElBQXJCLENBQTBCRCxLQUExQixDQUFQO0FBQ0Q7O0FBRURFLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQkosY0FBakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvYmplY3RUb1N0cmluZztcbiJdLCJmaWxlIjoiNTYxMC5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5610\n");
/***/ }),
/***/ 8548:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar freeGlobal = __webpack_require__(3070);\n/** Detect free variable `self`. */\n\n\nvar freeSelf = (typeof self === \"undefined\" ? \"undefined\" : _typeof(self)) == 'object' && self && self.Object === Object && self;\n/** Used as a reference to the global object. */\n\nvar root = freeGlobal || freeSelf || Function('return this')();\nmodule.exports = root;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzPzJiM2UiXSwibmFtZXMiOlsiZnJlZUdsb2JhbCIsInJlcXVpcmUiLCJmcmVlU2VsZiIsInNlbGYiLCJPYmplY3QiLCJyb290IiwiRnVuY3Rpb24iLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQUlBLFVBQVUsR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQXhCO0FBRUE7OztBQUNBLElBQUlDLFFBQVEsR0FBRyxRQUFPQyxJQUFQLHlDQUFPQSxJQUFQLE1BQWUsUUFBZixJQUEyQkEsSUFBM0IsSUFBbUNBLElBQUksQ0FBQ0MsTUFBTCxLQUFnQkEsTUFBbkQsSUFBNkRELElBQTVFO0FBRUE7O0FBQ0EsSUFBSUUsSUFBSSxHQUFHTCxVQUFVLElBQUlFLFFBQWQsSUFBMEJJLFFBQVEsQ0FBQyxhQUFELENBQVIsRUFBckM7QUFFQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCSCxJQUFqQiIsImZpbGUiOiI4NTQ4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByb290O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8548\n");
/***/ }),
/***/ 9397:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("var isObject = __webpack_require__(1556),\n now = __webpack_require__(8595),\n toNumber = __webpack_require__(917);\n/** Error message constants. */\n\n\nvar FUNC_ERROR_TEXT = 'Expected a function';\n/* Built-in method references for those with the same name as other `lodash` methods. */\n\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\n\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n wait = toNumber(wait) || 0;\n\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time; // Start the timer for the trailing edge.\n\n timerId = setTimeout(timerExpired, wait); // Invoke the leading edge.\n\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n\n return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;\n }\n\n function timerExpired() {\n var time = now();\n\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n } // Restart the timer.\n\n\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n\n return result;\n }\n\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2RlYm91bmNlLmpzP2IwNDciXSwibmFtZXMiOlsiaXNPYmplY3QiLCJyZXF1aXJlIiwibm93IiwidG9OdW1iZXIiLCJGVU5DX0VSUk9SX1RFWFQiLCJuYXRpdmVNYXgiLCJNYXRoIiwibWF4IiwibmF0aXZlTWluIiwibWluIiwiZGVib3VuY2UiLCJmdW5jIiwid2FpdCIsIm9wdGlvbnMiLCJsYXN0QXJncyIsImxhc3RUaGlzIiwibWF4V2FpdCIsInJlc3VsdCIsInRpbWVySWQiLCJsYXN0Q2FsbFRpbWUiLCJsYXN0SW52b2tlVGltZSIsImxlYWRpbmciLCJtYXhpbmciLCJ0cmFpbGluZyIsIlR5cGVFcnJvciIsImludm9rZUZ1bmMiLCJ0aW1lIiwiYXJncyIsInRoaXNBcmciLCJ1bmRlZmluZWQiLCJhcHBseSIsImxlYWRpbmdFZGdlIiwic2V0VGltZW91dCIsInRpbWVyRXhwaXJlZCIsInJlbWFpbmluZ1dhaXQiLCJ0aW1lU2luY2VMYXN0Q2FsbCIsInRpbWVTaW5jZUxhc3RJbnZva2UiLCJ0aW1lV2FpdGluZyIsInNob3VsZEludm9rZSIsInRyYWlsaW5nRWRnZSIsImNhbmNlbCIsImNsZWFyVGltZW91dCIsImZsdXNoIiwiZGVib3VuY2VkIiwiaXNJbnZva2luZyIsImFyZ3VtZW50cyIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLFFBQVEsR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQXRCO0FBQUEsSUFDSUMsR0FBRyxHQUFHRCxtQkFBTyxDQUFDLElBQUQsQ0FEakI7QUFBQSxJQUVJRSxRQUFRLEdBQUdGLG1CQUFPLENBQUMsR0FBRCxDQUZ0QjtBQUlBOzs7QUFDQSxJQUFJRyxlQUFlLEdBQUcscUJBQXRCO0FBRUE7O0FBQ0EsSUFBSUMsU0FBUyxHQUFHQyxJQUFJLENBQUNDLEdBQXJCO0FBQUEsSUFDSUMsU0FBUyxHQUFHRixJQUFJLENB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R0FBRyxFQUFkO0FBQUEsUUFDSTBDLFVBQVUsR0FBR04sWUFBWSxDQUFDWixJQUFELENBRDdCO0FBR0FaLFlBQVEsR0FBRytCLFNBQVg7QUFDQTlCLFlBQVEsR0FBRyxJQUFYO0FBQ0FJLGdCQUFZLEdBQUdPLElBQWY7O0FBRUEsUUFBSWtCLFVBQUosRUFBZ0I7QUFDZCxVQUFJMUIsT0FBTyxLQUFLVyxTQUFoQixFQUEyQjtBQUN6QixlQUFPRSxXQUFXLENBQUNaLFlBQUQsQ0FBbEI7QUFDRDs7QUFDRCxVQUFJRyxNQUFKLEVBQVk7QUFDVjtBQUNBbUIsb0JBQVksQ0FBQ3ZCLE9BQUQsQ0FBWjtBQUNBQSxlQUFPLEdBQUdjLFVBQVUsQ0FBQ0MsWUFBRCxFQUFlckIsSUFBZixDQUFwQjtBQUNBLGVBQU9hLFVBQVUsQ0FBQ04sWUFBRCxDQUFqQjtBQUNEO0FBQ0Y7O0FBQ0QsUUFBSUQsT0FBTyxLQUFLVyxTQUFoQixFQUEyQjtBQUN6QlgsYUFBTyxHQUFHYyxVQUFVLENBQUNDLFlBQUQsRUFBZXJCLElBQWYsQ0FBcEI7QUFDRDs7QUFDRCxXQUFPSyxNQUFQO0FBQ0Q7O0FBQ0QwQixXQUFTLENBQUNILE1BQVYsR0FBbUJBLE1BQW5CO0FBQ0FHLFdBQVMsQ0FBQ0QsS0FBVixHQUFrQkEsS0FBbEI7QUFDQSxTQUFPQyxTQUFQO0FBQ0Q7O0FBRURHLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnJDLFFBQWpCIiwiZmlsZSI6IjkzOTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgbm93ID0gcmVxdWlyZSgnLi9ub3cnKSxcbiAgICB0b051bWJlciA9IHJlcXVpcmUoJy4vdG9OdW1iZXInKTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHRpbWVXYWl0aW5nID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgcmV0dXJuIG1heGluZ1xuICAgICAgPyBuYXRpdmVNaW4odGltZVdhaXRpbmcsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKVxuICAgICAgOiB0aW1lV2FpdGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVib3VuY2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9397\n");
/***/ }),
/***/ 1556:
/***/ ((module) => {
eval("function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = _typeof(value);\n\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0LmpzPzFhOGMiXSwibmFtZXMiOlsiaXNPYmplY3QiLCJ2YWx1ZSIsInR5cGUiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsUUFBVCxDQUFrQkMsS0FBbEIsRUFBeUI7QUFDdkIsTUFBSUMsSUFBSSxXQUFVRCxLQUFWLENBQVI7O0FBQ0EsU0FBT0EsS0FBSyxJQUFJLElBQVQsS0FBa0JDLElBQUksSUFBSSxRQUFSLElBQW9CQSxJQUFJLElBQUksVUFBOUMsQ0FBUDtBQUNEOztBQUVEQyxNQUFNLENBQUNDLE9BQVAsR0FBaUJKLFFBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iXSwiZmlsZSI6IjE1NTYuanMiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1556\n");
/***/ }),
/***/ 235:
/***/ ((module) => {
eval("function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && _typeof(value) == 'object';\n}\n\nmodule.exports = isObjectLike;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcz8xMzEwIl0sIm5hbWVzIjpbImlzT2JqZWN0TGlrZSIsInZhbHVlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxZQUFULENBQXNCQyxLQUF0QixFQUE2QjtBQUMzQixTQUFPQSxLQUFLLElBQUksSUFBVCxJQUFpQixRQUFPQSxLQUFQLEtBQWdCLFFBQXhDO0FBQ0Q7O0FBRURDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQkgsWUFBakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iXSwiZmlsZSI6IjIzNS5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///235\n");
/***/ }),
/***/ 7930:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar baseGetTag = __webpack_require__(5515),\n isObjectLike = __webpack_require__(235);\n/** `Object#toString` result references. */\n\n\nvar symbolTag = '[object Symbol]';\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n\nfunction isSymbol(value) {\n return _typeof(value) == 'symbol' || isObjectLike(value) && baseGetTag(value) == symbolTag;\n}\n\nmodule.exports = isSymbol;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3ltYm9sLmpzP2ZmZDYiXSwibmFtZXMiOlsiYmFzZUdldFRhZyIsInJlcXVpcmUiLCJpc09iamVjdExpa2UiLCJzeW1ib2xUYWciLCJpc1N5bWJvbCIsInZhbHVlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFJQSxVQUFVLEdBQUdDLG1CQUFPLENBQUMsSUFBRCxDQUF4QjtBQUFBLElBQ0lDLFlBQVksR0FBR0QsbUJBQU8sQ0FBQyxHQUFELENBRDFCO0FBR0E7OztBQUNBLElBQUlFLFNBQVMsR0FBRyxpQkFBaEI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLFNBQVNDLFFBQVQsQ0FBa0JDLEtBQWxCLEVBQXlCO0FBQ3ZCLFNBQU8sUUFBT0EsS0FBUCxLQUFnQixRQUFoQixJQUNKSCxZQUFZLENBQUNHLEtBQUQsQ0FBWixJQUF1QkwsVUFBVSxDQUFDSyxLQUFELENBQVYsSUFBcUJGLFNBRC9DO0FBRUQ7O0FBRURHLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQkgsUUFBakIiLCJmaWxlIjoiNzkzMC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N5bWJvbDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7930\n");
/***/ }),
/***/ 9450:
/***/ (function(module, exports, __webpack_require__) {
eval("/* module decorator */ module = __webpack_require__.nmd(module);\nvar __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj){\"@babel/helpers - typeof\";if(typeof Symbol===\"function\"&&typeof Symbol.iterator===\"symbol\"){_typeof=function _typeof(obj){return typeof obj;};}else{_typeof=function _typeof(obj){return obj&&typeof Symbol===\"function\"&&obj.constructor===Symbol&&obj!==Symbol.prototype?\"symbol\":typeof obj;};}return _typeof(obj);}/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */;(function(){/** Used as a safe reference for `undefined` in pre-ES5 environments. */var undefined;/** Used as the semantic version number. */var VERSION='4.17.20';/** Used as the size to enable large array optimizations. */var LARGE_ARRAY_SIZE=200;/** Error message constants. */var CORE_ERROR_TEXT='Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',FUNC_ERROR_TEXT='Expected a function';/** Used to stand-in for `undefined` hash values. */var HASH_UNDEFINED='__lodash_hash_undefined__';/** Used as the maximum memoize cache size. */var MAX_MEMOIZE_SIZE=500;/** Used as the internal argument placeholder. */var PLACEHOLDER='__lodash_placeholder__';/** Used to compose bitmasks for cloning. */var CLONE_DEEP_FLAG=1,CLONE_FLAT_FLAG=2,CLONE_SYMBOLS_FLAG=4;/** Used to compose bitmasks for value comparisons. */var COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2;/** Used to compose bitmasks for function metadata. */var WRAP_BIND_FLAG=1,WRAP_BIND_KEY_FLAG=2,WRAP_CURRY_BOUND_FLAG=4,WRAP_CURRY_FLAG=8,WRAP_CURRY_RIGHT_FLAG=16,WRAP_PARTIAL_FLAG=32,WRAP_PARTIAL_RIGHT_FLAG=64,WRAP_ARY_FLAG=128,WRAP_REARG_FLAG=256,WRAP_FLIP_FLAG=512;/** Used as default options for `_.truncate`. */var DEFAULT_TRUNC_LENGTH=30,DEFAULT_TRUNC_OMISSION='...';/** Used to detect hot functions by number of calls within a span of milliseconds. */var HOT_COUNT=800,HOT_SPAN=16;/** Used to indicate the type of lazy iteratees. */var LAZY_FILTER_FLAG=1,LAZY_MAP_FLAG=2,LAZY_WHILE_FLAG=3;/** Used as references for various `Number` constants. */var INFINITY=1/0,MAX_SAFE_INTEGER=9007199254740991,MAX_INTEGER=1.7976931348623157e+308,NAN=0/0;/** Used as references for the maximum length and index of an array. */var MAX_ARRAY_LENGTH=4294967295,MAX_ARRAY_INDEX=MAX_ARRAY_LENGTH-1,HALF_MAX_ARRAY_LENGTH=MAX_ARRAY_LENGTH>>>1;/** Used to associate wrap methods with their bit flags. */var wrapFlags=[['ary',WRAP_ARY_FLAG],['bind',WRAP_BIND_FLAG],['bindKey',WRAP_BIND_KEY_FLAG],['curry',WRAP_CURRY_FLAG],['curryRight',WRAP_CURRY_RIGHT_FLAG],['flip',WRAP_FLIP_FLAG],['partial',WRAP_PARTIAL_FLAG],['partialRight',WRAP_PARTIAL_RIGHT_FLAG],['rearg',WRAP_REARG_FLAG]];/** `Object#toString` result references. */var argsTag='[object Arguments]',arrayTag='[object Array]',asyncTag='[object AsyncFunction]',boolTag='[object Boolean]',dateTag='[object Date]',domExcTag='[object DOMException]',errorTag='[object Error]',funcTag='[object Function]',genTag='[object GeneratorFunction]',mapTag='[object Map]',numberTag='[object Number]',nullTag='[object Null]',objectTag='[object Object]',promiseTag='[object Promise]',proxyTag='[object Proxy]',regexpTag='[object RegExp]',setTag='[object Set]',stringTag='[object String]',symbolTag='[object Symbol]',undefinedTag='[object Undefined]',weakMapTag='[object WeakMap]',weakSetTag='[object WeakSet]';var arrayBufferTag='[object ArrayBuffer]',dataViewTag='[object DataView]',float32Tag='[object Float32Array]',float64Tag='[object Float64Array]',int8Tag='[object Int8Array]',int16Tag='[object Int16Array]',int32Tag='[object Int32Array]',uint8Tag='[object Uint8Array]',uint8ClampedTag='[object Uint8ClampedArray]',uint16Tag='[object Uint16Array]',uint32Tag='[object Uint32Array]';/** Used to match empty string literals in compiled template source. */var reEmptyStringLeading=/\\b__p \\+= '';/g,reEmptyStringMiddle=/\\b(__p \\+=) '' \\+/g,reEmptyStringTrailing=/(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;/** Used to match HTML entities and HTML characters. */var reEscapedHtml=/&(?:amp|lt|gt|quot|#39);/g,reUnescapedHtml=/[&<>\"']/g,reHasEscapedHtml=RegExp(reEscapedHtml.source),reHasUnescapedHtml=RegExp(reUnescapedHtml.source);/** Used to match template delimiters. */var reEscape=/<%-([\\s\\S]+?)%>/g,reEvaluate=/<%([\\s\\S]+?)%>/g,reInterpolate=/<%=([\\s\\S]+?)%>/g;/** Used to match property names within property paths. */var reIsDeepProp=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,reIsPlainProp=/^\\w*$/,rePropName=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */var reRegExpChar=/[\\\\^$.*+?()[\\]{}|]/g,reHasRegExpChar=RegExp(reRegExpChar.source);/** Used to match leading and trailing whitespace. */var reTrim=/^\\s+|\\s+$/g,reTrimStart=/^\\s+/,reTrimEnd=/\\s+$/;/** Used to match wrap detail comments. */var reWrapComment=/\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,reWrapDetails=/\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,reSplitDetails=/,? & /;/** Used to match words composed of alphanumeric characters. */var reAsciiWord=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;/** Used to match backslashes in property paths. */var reEscapeChar=/\\\\(\\\\)?/g;/**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */var reEsTemplate=/\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;/** Used to match `RegExp` flags from their coerced string values. */var reFlags=/\\w*$/;/** Used to detect bad signed hexadecimal string values. */var reIsBadHex=/^[-+]0x[0-9a-f]+$/i;/** Used to detect binary string values. */var reIsBinary=/^0b[01]+$/i;/** Used to detect host constructors (Safari). */var reIsHostCtor=/^\\[object .+?Constructor\\]$/;/** Used to detect octal string values. */var reIsOctal=/^0o[0-7]+$/i;/** Used to detect unsigned integer values. */var reIsUint=/^(?:0|[1-9]\\d*)$/;/** Used to match Latin Unicode letters (excluding mathematical operators). */var reLatin=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;/** Used to ensure capturing order of template delimiters. */var reNoMatch=/($^)/;/** Used to match unescaped characters in compiled string literals. */var reUnescapedString=/['\\n\\r\\u2028\\u2029\\\\]/g;/** Used to compose unicode character classes. */var rsAstralRange=\"\\\\ud800-\\\\udfff\",rsComboMarksRange=\"\\\\u0300-\\\\u036f\",reComboHalfMarksRange=\"\\\\ufe20-\\\\ufe2f\",rsComboSymbolsRange=\"\\\\u20d0-\\\\u20ff\",rsComboRange=rsComboMarksRange+reComboHalfMarksRange+rsComboSymbolsRange,rsDingbatRange=\"\\\\u2700-\\\\u27bf\",rsLowerRange='a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',rsMathOpRange='\\\\xac\\\\xb1\\\\xd7\\\\xf7',rsNonCharRange='\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',rsPunctuationRange=\"\\\\u2000-\\\\u206f\",rsSpaceRange=\" \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",rsUpperRange='A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',rsVarRange=\"\\\\ufe0e\\\\ufe0f\",rsBreakRange=rsMathOpRange+rsNonCharRange+rsPunctuationRange+rsSpaceRange;/** Used to compose unicode capture groups. */var rsApos=\"['\\u2019]\",rsAstral='['+rsAstralRange+']',rsBreak='['+rsBreakRange+']',rsCombo='['+rsComboRange+']',rsDigits='\\\\d+',rsDingbat='['+rsDingbatRange+']',rsLower='['+rsLowerRange+']',rsMisc='[^'+rsAstralRange+rsBreakRange+rsDigits+rsDingbatRange+rsLowerRange+rsUpperRange+']',rsFitz=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",rsModifier='(?:'+rsCombo+'|'+rsFitz+')',rsNonAstral='[^'+rsAstralRange+']',rsRegional=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",rsSurrPair=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",rsUpper='['+rsUpperRange+']',rsZWJ=\"\\\\u200d\";/** Used to compose unicode regexes. */var rsMiscLower='(?:'+rsLower+'|'+rsMisc+')',rsMiscUpper='(?:'+rsUpper+'|'+rsMisc+')',rsOptContrLower='(?:'+rsApos+'(?:d|ll|m|re|s|t|ve))?',rsOptContrUpper='(?:'+rsApos+'(?:D|LL|M|RE|S|T|VE))?',reOptMod=rsModifier+'?',rsOptVar='['+rsVarRange+']?',rsOptJoin='(?:'+rsZWJ+'(?:'+[rsNonAstral,rsRegional,rsSurrPair].join('|')+')'+rsOptVar+reOptMod+')*',rsOrdLower='\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',rsOrdUpper='\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',rsSeq=rsOptVar+reOptMod+rsOptJoin,rsEmoji='(?:'+[rsDingbat,rsRegional,rsSurrPair].join('|')+')'+rsSeq,rsSymbol='(?:'+[rsNonAstral+rsCombo+'?',rsCombo,rsRegional,rsSurrPair,rsAstral].join('|')+')';/** Used to match apostrophes. */var reApos=RegExp(rsApos,'g');/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */var reComboMark=RegExp(rsCombo,'g');/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */var reUnicode=RegExp(rsFitz+'(?='+rsFitz+')|'+rsSymbol+rsSeq,'g');/** Used to match complex or compound words. */var reUnicodeWord=RegExp([rsUpper+'?'+rsLower+'+'+rsOptContrLower+'(?='+[rsBreak,rsUpper,'$'].join('|')+')',rsMiscUpper+'+'+rsOptContrUpper+'(?='+[rsBreak,rsUpper+rsMiscLower,'$'].join('|')+')',rsUpper+'?'+rsMiscLower+'+'+rsOptContrLower,rsUpper+'+'+rsOptContrUpper,rsOrdUpper,rsOrdLower,rsDigits,rsEmoji].join('|'),'g');/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */var reHasUnicode=RegExp('['+rsZWJ+rsAstralRange+rsComboRange+rsVarRange+']');/** Used to detect strings that need a more robust regexp to match words. */var reHasUnicodeWord=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;/** Used to assign default `context` object properties. */var contextProps=['Array','Buffer','DataView','Date','Error','Float32Array','Float64Array','Function','Int8Array','Int16Array','Int32Array','Map','Math','Object','Promise','RegExp','Set','String','Symbol','TypeError','Uint8Array','Uint8ClampedArray','Uint16Array','Uint32Array','WeakMap','_','clearTimeout','isFinite','parseInt','setTimeout'];/** Used to make template sourceURLs easier to identify. */var templateCounter=-1;/** Used to identify `toStringTag` values of typed arrays. */var typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=true;typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=false;/** Used to identify `toStringTag` values supported by `_.clone`. */var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[dataViewTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[mapTag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[setTag]=cloneableTags[stringTag]=cloneableTags[symbolTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=true;cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[weakMapTag]=false;/** Used to map Latin Unicode letters to basic Latin letters. */var deburredLetters={// Latin-1 Supplement block.\n'\\xc0':'A','\\xc1':'A','\\xc2':'A','\\xc3':'A','\\xc4':'A','\\xc5':'A','\\xe0':'a','\\xe1':'a','\\xe2':'a','\\xe3':'a','\\xe4':'a','\\xe5':'a','\\xc7':'C','\\xe7':'c','\\xd0':'D','\\xf0':'d','\\xc8':'E','\\xc9':'E','\\xca':'E','\\xcb':'E','\\xe8':'e','\\xe9':'e','\\xea':'e','\\xeb':'e','\\xcc':'I','\\xcd':'I','\\xce':'I','\\xcf':'I','\\xec':'i','\\xed':'i','\\xee':'i','\\xef':'i','\\xd1':'N','\\xf1':'n','\\xd2':'O','\\xd3':'O','\\xd4':'O','\\xd5':'O','\\xd6':'O','\\xd8':'O','\\xf2':'o','\\xf3':'o','\\xf4':'o','\\xf5':'o','\\xf6':'o','\\xf8':'o','\\xd9':'U','\\xda':'U','\\xdb':'U','\\xdc':'U','\\xf9':'u','\\xfa':'u','\\xfb':'u','\\xfc':'u','\\xdd':'Y','\\xfd':'y','\\xff':'y','\\xc6':'Ae','\\xe6':'ae','\\xde':'Th','\\xfe':'th','\\xdf':'ss',// Latin Extended-A block.\n\"\\u0100\":'A',\"\\u0102\":'A',\"\\u0104\":'A',\"\\u0101\":'a',\"\\u0103\":'a',\"\\u0105\":'a',\"\\u0106\":'C',\"\\u0108\":'C',\"\\u010A\":'C',\"\\u010C\":'C',\"\\u0107\":'c',\"\\u0109\":'c',\"\\u010B\":'c',\"\\u010D\":'c',\"\\u010E\":'D',\"\\u0110\":'D',\"\\u010F\":'d',\"\\u0111\":'d',\"\\u0112\":'E',\"\\u0114\":'E',\"\\u0116\":'E',\"\\u0118\":'E',\"\\u011A\":'E',\"\\u0113\":'e',\"\\u0115\":'e',\"\\u0117\":'e',\"\\u0119\":'e',\"\\u011B\":'e',\"\\u011C\":'G',\"\\u011E\":'G',\"\\u0120\":'G',\"\\u0122\":'G',\"\\u011D\":'g',\"\\u011F\":'g',\"\\u0121\":'g',\"\\u0123\":'g',\"\\u0124\":'H',\"\\u0126\":'H',\"\\u0125\":'h',\"\\u0127\":'h',\"\\u0128\":'I',\"\\u012A\":'I',\"\\u012C\":'I',\"\\u012E\":'I',\"\\u0130\":'I',\"\\u0129\":'i',\"\\u012B\":'i',\"\\u012D\":'i',\"\\u012F\":'i',\"\\u0131\":'i',\"\\u0134\":'J',\"\\u0135\":'j',\"\\u0136\":'K',\"\\u0137\":'k',\"\\u0138\":'k',\"\\u0139\":'L',\"\\u013B\":'L',\"\\u013D\":'L',\"\\u013F\":'L',\"\\u0141\":'L',\"\\u013A\":'l',\"\\u013C\":'l',\"\\u013E\":'l',\"\\u0140\":'l',\"\\u0142\":'l',\"\\u0143\":'N',\"\\u0145\":'N',\"\\u0147\":'N',\"\\u014A\":'N',\"\\u0144\":'n',\"\\u0146\":'n',\"\\u0148\":'n',\"\\u014B\":'n',\"\\u014C\":'O',\"\\u014E\":'O',\"\\u0150\":'O',\"\\u014D\":'o',\"\\u014F\":'o',\"\\u0151\":'o',\"\\u0154\":'R',\"\\u0156\":'R',\"\\u0158\":'R',\"\\u0155\":'r',\"\\u0157\":'r',\"\\u0159\":'r',\"\\u015A\":'S',\"\\u015C\":'S',\"\\u015E\":'S',\"\\u0160\":'S',\"\\u015B\":'s',\"\\u015D\":'s',\"\\u015F\":'s',\"\\u0161\":'s',\"\\u0162\":'T',\"\\u0164\":'T',\"\\u0166\":'T',\"\\u0163\":'t',\"\\u0165\":'t',\"\\u0167\":'t',\"\\u0168\":'U',\"\\u016A\":'U',\"\\u016C\":'U',\"\\u016E\":'U',\"\\u0170\":'U',\"\\u0172\":'U',\"\\u0169\":'u',\"\\u016B\":'u',\"\\u016D\":'u',\"\\u016F\":'u',\"\\u0171\":'u',\"\\u0173\":'u',\"\\u0174\":'W',\"\\u0175\":'w',\"\\u0176\":'Y',\"\\u0177\":'y',\"\\u0178\":'Y',\"\\u0179\":'Z',\"\\u017B\":'Z',\"\\u017D\":'Z',\"\\u017A\":'z',\"\\u017C\":'z',\"\\u017E\":'z',\"\\u0132\":'IJ',\"\\u0133\":'ij',\"\\u0152\":'Oe',\"\\u0153\":'oe',\"\\u0149\":\"'n\",\"\\u017F\":'s'};/** Used to map characters to HTML entities. */var htmlEscapes={'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'};/** Used to map HTML entities to characters. */var htmlUnescapes={'&amp;':'&','&lt;':'<','&gt;':'>','&quot;':'\"','&#39;':\"'\"};/** Used to escape characters for inclusion in compiled string literals. */var stringEscapes={'\\\\':'\\\\',\"'\":\"'\",'\\n':'n','\\r':'r',\"\\u2028\":'u2028',\"\\u2029\":'u2029'};/** Built-in method references without a dependency on `root`. */var freeParseFloat=parseFloat,freeParseInt=parseInt;/** Detect free variable `global` from Node.js. */var freeGlobal=(typeof __webpack_require__.g===\"undefined\"?\"undefined\":_typeof(__webpack_require__.g))=='object'&&__webpack_require__.g&&__webpack_require__.g.Object===Object&&__webpack_require__.g;/** Detect free variable `self`. */var freeSelf=(typeof self===\"undefined\"?\"undefined\":_typeof(self))=='object'&&self&&self.Object===Object&&self;/** Used as a reference to the global object. */var root=freeGlobal||freeSelf||Function('return this')();/** Detect free variable `exports`. */var freeExports=( false?0:_typeof(exports))=='object'&&exports&&!exports.nodeType&&exports;/** Detect free variable `module`. */var freeModule=freeExports&&( false?0:_typeof(module))=='object'&&module&&!module.nodeType&&module;/** Detect the popular CommonJS extension `module.exports`. */var moduleExports=freeModule&&freeModule.exports===freeExports;/** Detect free variable `process` from Node.js. */var freeProcess=moduleExports&&freeGlobal.process;/** Used to access faster Node.js helpers. */var nodeUtil=function(){try{// Use `util.types` for Node.js 10+.\nvar types=freeModule&&freeModule.require&&freeModule.require('util').types;if(types){return types;}// Legacy `process.binding('util')` for Node.js < 10.\nreturn freeProcess&&freeProcess.binding&&freeProcess.binding('util');}catch(e){}}();/* Node.js helper references. */var nodeIsArrayBuffer=nodeUtil&&nodeUtil.isArrayBuffer,nodeIsDate=nodeUtil&&nodeUtil.isDate,nodeIsMap=nodeUtil&&nodeUtil.isMap,nodeIsRegExp=nodeUtil&&nodeUtil.isRegExp,nodeIsSet=nodeUtil&&nodeUtil.isSet,nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray;/*--------------------------------------------------------------------------*/ /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */function apply(func,thisArg,args){switch(args.length){case 0:return func.call(thisArg);case 1:return func.call(thisArg,args[0]);case 2:return func.call(thisArg,args[0],args[1]);case 3:return func.call(thisArg,args[0],args[1],args[2]);}return func.apply(thisArg,args);}/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */function arrayAggregator(array,setter,iteratee,accumulator){var index=-1,length=array==null?0:array.length;while(++index<length){var value=array[index];setter(accumulator,value,iteratee(value),array);}return accumulator;}/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */function arrayEach(array,iteratee){var index=-1,length=array==null?0:array.length;while(++index<length){if(iteratee(array[index],index,array)===false){break;}}return array;}/**\n * A specialized version of `_.forEachRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */function arrayEachRight(array,iteratee){var length=array==null?0:array.length;while(length--){if(iteratee(array[length],length,array)===false){break;}}return array;}/**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */function arrayEvery(array,predicate){var index=-1,length=array==null?0:array.length;while(++index<length){if(!predicate(array[index],index,array)){return false;}}return true;}/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */function arrayFilter(array,predicate){var index=-1,length=array==null?0:array.length,resIndex=0,result=[];while(++index<length){var value=array[index];if(predicate(value,index,array)){result[resIndex++]=value;}}return result;}/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */function arrayIncludes(array,value){var length=array==null?0:array.length;return!!length&&baseIndexOf(array,value,0)>-1;}/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */function arrayIncludesWith(array,value,comparator){var index=-1,length=array==null?0:array.length;while(++index<length){if(comparator(value,array[index])){return true;}}return false;}/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */function arrayMap(array,iteratee){var index=-1,length=array==null?0:array.length,result=Array(length);while(++index<length){result[index]=iteratee(array[index],index,array);}return result;}/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */function arrayPush(array,values){var index=-1,length=values.length,offset=array.length;while(++index<length){array[offset+index]=values[index];}return array;}/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */function arrayReduce(array,iteratee,accumulator,initAccum){var index=-1,length=array==null?0:array.length;if(initAccum&&length){accumulator=array[++index];}while(++index<length){accumulator=iteratee(accumulator,array[index],index,array);}return accumulator;}/**\n * A specialized version of `_.reduceRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the last element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */function arrayReduceRight(array,iteratee,accumulator,initAccum){var length=array==null?0:array.length;if(initAccum&&length){accumulator=array[--length];}while(length--){accumulator=iteratee(accumulator,array[length],length,array);}return accumulator;}/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */function arraySome(array,predicate){var index=-1,length=array==null?0:array.length;while(++index<length){if(predicate(array[index],index,array)){return true;}}return false;}/**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */var asciiSize=baseProperty('length');/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */function asciiToArray(string){return string.split('');}/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */function asciiWords(string){return string.match(reAsciiWord)||[];}/**\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n * without support for iteratee shorthands, which iterates over `collection`\n * using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */function baseFindKey(collection,predicate,eachFunc){var result;eachFunc(collection,function(value,key,collection){if(predicate(value,key,collection)){result=key;return false;}});return result;}/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */function baseFindIndex(array,predicate,fromIndex,fromRight){var length=array.length,index=fromIndex+(fromRight?1:-1);while(fromRight?index--:++index<length){if(predicate(array[index],index,array)){return index;}}return-1;}/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */function baseIndexOf(array,value,fromIndex){return value===value?strictIndexOf(array,value,fromIndex):baseFindIndex(array,baseIsNaN,fromIndex);}/**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */function baseIndexOfWith(array,value,fromIndex,comparator){var index=fromIndex-1,length=array.length;while(++index<length){if(comparator(array[index],value)){return index;}}return-1;}/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */function baseIsNaN(value){return value!==value;}/**\n * The base implementation of `_.mean` and `_.meanBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the mean.\n */function baseMean(array,iteratee){var length=array==null?0:array.length;return length?baseSum(array,iteratee)/length:NAN;}/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */function baseProperty(key){return function(object){return object==null?undefined:object[key];};}/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */function basePropertyOf(object){return function(key){return object==null?undefined:object[key];};}/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */function baseReduce(collection,iteratee,accumulator,initAccum,eachFunc){eachFunc(collection,function(value,index,collection){accumulator=initAccum?(initAccum=false,value):iteratee(accumulator,value,index,collection);});return accumulator;}/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */function baseSortBy(array,comparer){var length=array.length;array.sort(comparer);while(length--){array[length]=array[length].value;}return array;}/**\n * The base implementation of `_.sum` and `_.sumBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */function baseSum(array,iteratee){var result,index=-1,length=array.length;while(++index<length){var current=iteratee(array[index]);if(current!==undefined){result=result===undefined?current:result+current;}}return result;}/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */function baseTimes(n,iteratee){var index=-1,result=Array(n);while(++index<n){result[index]=iteratee(index);}return result;}/**\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n * of key-value pairs for `object` corresponding to the property names of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the key-value pairs.\n */function baseToPairs(object,props){return arrayMap(props,function(key){return[key,object[key]];});}/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */function baseUnary(func){return function(value){return func(value);};}/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */function baseValues(object,props){return arrayMap(props,function(key){return object[key];});}/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */function cacheHas(cache,key){return cache.has(key);}/**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */function charsStartIndex(strSymbols,chrSymbols){var index=-1,length=strSymbols.length;while(++index<length&&baseIndexOf(chrSymbols,strSymbols[index],0)>-1){}return index;}/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */function charsEndIndex(strSymbols,chrSymbols){var index=strSymbols.length;while(index--&&baseIndexOf(chrSymbols,strSymbols[index],0)>-1){}return index;}/**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */function countHolders(array,placeholder){var length=array.length,result=0;while(length--){if(array[length]===placeholder){++result;}}return result;}/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */var deburrLetter=basePropertyOf(deburredLetters);/**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */var escapeHtmlChar=basePropertyOf(htmlEscapes);/**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */function escapeStringChar(chr){return'\\\\'+stringEscapes[chr];}/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */function getValue(object,key){return object==null?undefined:object[key];}/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */function hasUnicode(string){return reHasUnicode.test(string);}/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */function hasUnicodeWord(string){return reHasUnicodeWord.test(string);}/**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */function iteratorToArray(iterator){var data,result=[];while(!(data=iterator.next()).done){result.push(data.value);}return result;}/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */function mapToArray(map){var index=-1,result=Array(map.size);map.forEach(function(value,key){result[++index]=[key,value];});return result;}/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */function overArg(func,transform){return function(arg){return func(transform(arg));};}/**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */function replaceHolders(array,placeholder){var index=-1,length=array.length,resIndex=0,result=[];while(++index<length){var value=array[index];if(value===placeholder||value===PLACEHOLDER){array[index]=PLACEHOLDER;result[resIndex++]=index;}}return result;}/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */function setToArray(set){var index=-1,result=Array(set.size);set.forEach(function(value){result[++index]=value;});return result;}/**\n * Converts `set` to its value-value pairs.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the value-value pairs.\n */function setToPairs(set){var index=-1,result=Array(set.size);set.forEach(function(value){result[++index]=[value,value];});return result;}/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */function strictIndexOf(array,value,fromIndex){var index=fromIndex-1,length=array.length;while(++index<length){if(array[index]===value){return index;}}return-1;}/**\n * A specialized version of `_.lastIndexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */function strictLastIndexOf(array,value,fromIndex){var index=fromIndex+1;while(index--){if(array[index]===value){return index;}}return index;}/**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */function stringSize(string){return hasUnicode(string)?unicodeSize(string):asciiSize(string);}/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */function stringToArray(string){return hasUnicode(string)?unicodeToArray(string):asciiToArray(string);}/**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */var unescapeHtmlChar=basePropertyOf(htmlUnescapes);/**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */function unicodeSize(string){var result=reUnicode.lastIndex=0;while(reUnicode.test(string)){++result;}return result;}/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */function unicodeToArray(string){return string.match(reUnicode)||[];}/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */function unicodeWords(string){return string.match(reUnicodeWord)||[];}/*--------------------------------------------------------------------------*/ /**\n * Create a new pristine `lodash` function using the `context` object.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Util\n * @param {Object} [context=root] The context object.\n * @returns {Function} Returns a new `lodash` function.\n * @example\n *\n * _.mixin({ 'foo': _.constant('foo') });\n *\n * var lodash = _.runInContext();\n * lodash.mixin({ 'bar': lodash.constant('bar') });\n *\n * _.isFunction(_.foo);\n * // => true\n * _.isFunction(_.bar);\n * // => false\n *\n * lodash.isFunction(lodash.foo);\n * // => false\n * lodash.isFunction(lodash.bar);\n * // => true\n *\n * // Create a suped-up `defer` in Node.js.\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n */var runInContext=function runInContext(context){context=context==null?root:_.defaults(root.Object(),context,_.pick(root,contextProps));/** Built-in constructor references. */var Array=context.Array,Date=context.Date,Error=context.Error,Function=context.Function,Math=context.Math,Object=context.Object,RegExp=context.RegExp,String=context.String,TypeError=context.TypeError;/** Used for built-in method references. */var arrayProto=Array.prototype,funcProto=Function.prototype,objectProto=Object.prototype;/** Used to detect overreaching core-js shims. */var coreJsData=context['__core-js_shared__'];/** Used to resolve the decompiled source of functions. */var funcToString=funcProto.toString;/** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty;/** Used to generate unique IDs. */var idCounter=0;/** Used to detect methods masquerading as native. */var maskSrcKey=function(){var uid=/[^.]+$/.exec(coreJsData&&coreJsData.keys&&coreJsData.keys.IE_PROTO||'');return uid?'Symbol(src)_1.'+uid:'';}();/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */var nativeObjectToString=objectProto.toString;/** Used to infer the `Object` constructor. */var objectCtorString=funcToString.call(Object);/** Used to restore the original `_` reference in `_.noConflict`. */var oldDash=root._;/** Used to detect if a method is native. */var reIsNative=RegExp('^'+funcToString.call(hasOwnProperty).replace(reRegExpChar,'\\\\$&').replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,'$1.*?')+'$');/** Built-in value references. */var Buffer=moduleExports?context.Buffer:undefined,_Symbol=context.Symbol,Uint8Array=context.Uint8Array,allocUnsafe=Buffer?Buffer.allocUnsafe:undefined,getPrototype=overArg(Object.getPrototypeOf,Object),objectCreate=Object.create,propertyIsEnumerable=objectProto.propertyIsEnumerable,splice=arrayProto.splice,spreadableSymbol=_Symbol?_Symbol.isConcatSpreadable:undefined,symIterator=_Symbol?_Symbol.iterator:undefined,symToStringTag=_Symbol?_Symbol.toStringTag:undefined;var defineProperty=function(){try{var func=getNative(Object,'defineProperty');func({},'',{});return func;}catch(e){}}();/** Mocked built-ins. */var ctxClearTimeout=context.clearTimeout!==root.clearTimeout&&context.clearTimeout,ctxNow=Date&&Date.now!==root.Date.now&&Date.now,ctxSetTimeout=context.setTimeout!==root.setTimeout&&context.setTimeout;/* Built-in method references for those with the same name as other `lodash` methods. */var nativeCeil=Math.ceil,nativeFloor=Math.floor,nativeGetSymbols=Object.getOwnPropertySymbols,nativeIsBuffer=Buffer?Buffer.isBuffer:undefined,nativeIsFinite=context.isFinite,nativeJoin=arrayProto.join,nativeKeys=overArg(Object.keys,Object),nativeMax=Math.max,nativeMin=Math.min,nativeNow=Date.now,nativeParseInt=context.parseInt,nativeRandom=Math.random,nativeReverse=arrayProto.reverse;/* Built-in method references that are verified to be native. */var DataView=getNative(context,'DataView'),Map=getNative(context,'Map'),Promise=getNative(context,'Promise'),Set=getNative(context,'Set'),WeakMap=getNative(context,'WeakMap'),nativeCreate=getNative(Object,'create');/** Used to store function metadata. */var metaMap=WeakMap&&new WeakMap();/** Used to lookup unminified function names. */var realNames={};/** Used to detect maps, sets, and weakmaps. */var dataViewCtorString=toSource(DataView),mapCtorString=toSource(Map),promiseCtorString=toSource(Promise),setCtorString=toSource(Set),weakMapCtorString=toSource(WeakMap);/** Used to convert symbols to primitives and strings. */var symbolProto=_Symbol?_Symbol.prototype:undefined,symbolValueOf=symbolProto?symbolProto.valueOf:undefined,symbolToString=symbolProto?symbolProto.toString:undefined;/*------------------------------------------------------------------------*/ /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */function lodash(value){if(isObjectLike(value)&&!isArray(value)&&!(value instanceof LazyWrapper)){if(value instanceof LodashWrapper){return value;}if(hasOwnProperty.call(value,'__wrapped__')){return wrapperClone(value);}}return new LodashWrapper(value);}/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */var baseCreate=function(){function object(){}return function(proto){if(!isObject(proto)){return{};}if(objectCreate){return objectCreate(proto);}object.prototype=proto;var result=new object();object.prototype=undefined;return result;};}();/**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */function baseLodash(){// No operation performed.\n}/**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */function LodashWrapper(value,chainAll){this.__wrapped__=value;this.__actions__=[];this.__chain__=!!chainAll;this.__index__=0;this.__values__=undefined;}/**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */lodash.templateSettings={/**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */'escape':reEscape,/**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */'evaluate':reEvaluate,/**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */'interpolate':reInterpolate,/**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type {string}\n */'variable':'',/**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type {Object}\n */'imports':{/**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */'_':lodash}};// Ensure wrappers are instances of `baseLodash`.\nlodash.prototype=baseLodash.prototype;lodash.prototype.constructor=lodash;LodashWrapper.prototype=baseCreate(baseLodash.prototype);LodashWrapper.prototype.constructor=LodashWrapper;/*------------------------------------------------------------------------*/ /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */function LazyWrapper(value){this.__wrapped__=value;this.__actions__=[];this.__dir__=1;this.__filtered__=false;this.__iteratees__=[];this.__takeCount__=MAX_ARRAY_LENGTH;this.__views__=[];}/**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */function lazyClone(){var result=new LazyWrapper(this.__wrapped__);result.__actions__=copyArray(this.__actions__);result.__dir__=this.__dir__;result.__filtered__=this.__filtered__;result.__iteratees__=copyArray(this.__iteratees__);result.__takeCount__=this.__takeCount__;result.__views__=copyArray(this.__views__);return result;}/**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */function lazyReverse(){if(this.__filtered__){var result=new LazyWrapper(this);result.__dir__=-1;result.__filtered__=true;}else{result=this.clone();result.__dir__*=-1;}return result;}/**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */function lazyValue(){var array=this.__wrapped__.value(),dir=this.__dir__,isArr=isArray(array),isRight=dir<0,arrLength=isArr?array.length:0,view=getView(0,arrLength,this.__views__),start=view.start,end=view.end,length=end-start,index=isRight?end:start-1,iteratees=this.__iteratees__,iterLength=iteratees.length,resIndex=0,takeCount=nativeMin(length,this.__takeCount__);if(!isArr||!isRight&&arrLength==length&&takeCount==length){return baseWrapperValue(array,this.__actions__);}var result=[];outer:while(length--&&resIndex<takeCount){index+=dir;var iterIndex=-1,value=array[index];while(++iterIndex<iterLength){var data=iteratees[iterIndex],iteratee=data.iteratee,type=data.type,computed=iteratee(value);if(type==LAZY_MAP_FLAG){value=computed;}else if(!computed){if(type==LAZY_FILTER_FLAG){continue outer;}else{break outer;}}}result[resIndex++]=value;}return result;}// Ensure `LazyWrapper` is an instance of `baseLodash`.\nLazyWrapper.prototype=baseCreate(baseLodash.prototype);LazyWrapper.prototype.constructor=LazyWrapper;/*------------------------------------------------------------------------*/ /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */function Hash(entries){var index=-1,length=entries==null?0:entries.length;this.clear();while(++index<length){var entry=entries[index];this.set(entry[0],entry[1]);}}/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */function hashClear(){this.__data__=nativeCreate?nativeCreate(null):{};this.size=0;}/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */function hashDelete(key){var result=this.has(key)&&delete this.__data__[key];this.size-=result?1:0;return result;}/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */function hashGet(key){var data=this.__data__;if(nativeCreate){var result=data[key];return result===HASH_UNDEFINED?undefined:result;}return hasOwnProperty.call(data,key)?data[key]:undefined;}/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */function hashHas(key){var data=this.__data__;return nativeCreate?data[key]!==undefined:hasOwnProperty.call(data,key);}/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */function hashSet(key,value){var data=this.__data__;this.size+=this.has(key)?0:1;data[key]=nativeCreate&&value===undefined?HASH_UNDEFINED:value;return this;}// Add methods to `Hash`.\nHash.prototype.clear=hashClear;Hash.prototype['delete']=hashDelete;Hash.prototype.get=hashGet;Hash.prototype.has=hashHas;Hash.prototype.set=hashSet;/*------------------------------------------------------------------------*/ /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */function ListCache(entries){var index=-1,length=entries==null?0:entries.length;this.clear();while(++index<length){var entry=entries[index];this.set(entry[0],entry[1]);}}/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */function listCacheClear(){this.__data__=[];this.size=0;}/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */function listCacheDelete(key){var data=this.__data__,index=assocIndexOf(data,key);if(index<0){return false;}var lastIndex=data.length-1;if(index==lastIndex){data.pop();}else{splice.call(data,index,1);}--this.size;return true;}/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */function listCacheGet(key){var data=this.__data__,index=assocIndexOf(data,key);return index<0?undefined:data[index][1];}/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */function listCacheHas(key){return assocIndexOf(this.__data__,key)>-1;}/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */function listCacheSet(key,value){var data=this.__data__,index=assocIndexOf(data,key);if(index<0){++this.size;data.push([key,value]);}else{data[index][1]=value;}return this;}// Add methods to `ListCache`.\nListCache.prototype.clear=listCacheClear;ListCache.prototype['delete']=listCacheDelete;ListCache.prototype.get=listCacheGet;ListCache.prototype.has=listCacheHas;ListCache.prototype.set=listCacheSet;/*------------------------------------------------------------------------*/ /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */function MapCache(entries){var index=-1,length=entries==null?0:entries.length;this.clear();while(++index<length){var entry=entries[index];this.set(entry[0],entry[1]);}}/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */function mapCacheClear(){this.size=0;this.__data__={'hash':new Hash(),'map':new(Map||ListCache)(),'string':new Hash()};}/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */function mapCacheDelete(key){var result=getMapData(this,key)['delete'](key);this.size-=result?1:0;return result;}/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */function mapCacheGet(key){return getMapData(this,key).get(key);}/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */function mapCacheHas(key){return getMapData(this,key).has(key);}/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */function mapCacheSet(key,value){var data=getMapData(this,key),size=data.size;data.set(key,value);this.size+=data.size==size?0:1;return this;}// Add methods to `MapCache`.\nMapCache.prototype.clear=mapCacheClear;MapCache.prototype['delete']=mapCacheDelete;MapCache.prototype.get=mapCacheGet;MapCache.prototype.has=mapCacheHas;MapCache.prototype.set=mapCacheSet;/*------------------------------------------------------------------------*/ /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */function SetCache(values){var index=-1,length=values==null?0:values.length;this.__data__=new MapCache();while(++index<length){this.add(values[index]);}}/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */function setCacheAdd(value){this.__data__.set(value,HASH_UNDEFINED);return this;}/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */function setCacheHas(value){return this.__data__.has(value);}// Add methods to `SetCache`.\nSetCache.prototype.add=SetCache.prototype.push=setCacheAdd;SetCache.prototype.has=setCacheHas;/*------------------------------------------------------------------------*/ /**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */function Stack(entries){var data=this.__data__=new ListCache(entries);this.size=data.size;}/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */function stackClear(){this.__data__=new ListCache();this.size=0;}/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */function stackDelete(key){var data=this.__data__,result=data['delete'](key);this.size=data.size;return result;}/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */function stackGet(key){return this.__data__.get(key);}/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */function stackHas(key){return this.__data__.has(key);}/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */function stackSet(key,value){var data=this.__data__;if(data instanceof ListCache){var pairs=data.__data__;if(!Map||pairs.length<LARGE_ARRAY_SIZE-1){pairs.push([key,value]);this.size=++data.size;return this;}data=this.__data__=new MapCache(pairs);}data.set(key,value);this.size=data.size;return this;}// Add methods to `Stack`.\nStack.prototype.clear=stackClear;Stack.prototype['delete']=stackDelete;Stack.prototype.get=stackGet;Stack.prototype.has=stackHas;Stack.prototype.set=stackSet;/*------------------------------------------------------------------------*/ /**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */function arrayLikeKeys(value,inherited){var isArr=isArray(value),isArg=!isArr&&isArguments(value),isBuff=!isArr&&!isArg&&isBuffer(value),isType=!isArr&&!isArg&&!isBuff&&isTypedArray(value),skipIndexes=isArr||isArg||isBuff||isType,result=skipIndexes?baseTimes(value.length,String):[],length=result.length;for(var key in value){if((inherited||hasOwnProperty.call(value,key))&&!(skipIndexes&&(// Safari 9 has enumerable `arguments.length` in strict mode.\nkey=='length'||// Node.js 0.10 has enumerable non-index properties on buffers.\nisBuff&&(key=='offset'||key=='parent')||// PhantomJS 2 has enumerable non-index properties on typed arrays.\nisType&&(key=='buffer'||key=='byteLength'||key=='byteOffset')||// Skip index properties.\nisIndex(key,length)))){result.push(key);}}return result;}/**\n * A specialized version of `_.sample` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @returns {*} Returns the random element.\n */function arraySample(array){var length=array.length;return length?array[baseRandom(0,length-1)]:undefined;}/**\n * A specialized version of `_.sampleSize` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */function arraySampleSize(array,n){return shuffleSelf(copyArray(array),baseClamp(n,0,array.length));}/**\n * A specialized version of `_.shuffle` for arrays.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */function arrayShuffle(array){return shuffleSelf(copyArray(array));}/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */function assignMergeValue(object,key,value){if(value!==undefined&&!eq(object[key],value)||value===undefined&&!(key in object)){baseAssignValue(object,key,value);}}/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */function assignValue(object,key,value){var objValue=object[key];if(!(hasOwnProperty.call(object,key)&&eq(objValue,value))||value===undefined&&!(key in object)){baseAssignValue(object,key,value);}}/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */function assocIndexOf(array,key){var length=array.length;while(length--){if(eq(array[length][0],key)){return length;}}return-1;}/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */function baseAggregator(collection,setter,iteratee,accumulator){baseEach(collection,function(value,key,collection){setter(accumulator,value,iteratee(value),collection);});return accumulator;}/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */function baseAssign(object,source){return object&&copyObject(source,keys(source),object);}/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */function baseAssignIn(object,source){return object&&copyObject(source,keysIn(source),object);}/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */function baseAssignValue(object,key,value){if(key=='__proto__'&&defineProperty){defineProperty(object,key,{'configurable':true,'enumerable':true,'value':value,'writable':true});}else{object[key]=value;}}/**\n * The base implementation of `_.at` without support for individual paths.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {string[]} paths The property paths to pick.\n * @returns {Array} Returns the picked elements.\n */function baseAt(object,paths){var index=-1,length=paths.length,result=Array(length),skip=object==null;while(++index<length){result[index]=skip?undefined:get(object,paths[index]);}return result;}/**\n * The base implementation of `_.clamp` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */function baseClamp(number,lower,upper){if(number===number){if(upper!==undefined){number=number<=upper?number:upper;}if(lower!==undefined){number=number>=lower?number:lower;}}return number;}/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */function baseClone(value,bitmask,customizer,key,object,stack){var result,isDeep=bitmask&CLONE_DEEP_FLAG,isFlat=bitmask&CLONE_FLAT_FLAG,isFull=bitmask&CLONE_SYMBOLS_FLAG;if(customizer){result=object?customizer(value,key,object,stack):customizer(value);}if(result!==undefined){return result;}if(!isObject(value)){return value;}var isArr=isArray(value);if(isArr){result=initCloneArray(value);if(!isDeep){return copyArray(value,result);}}else{var tag=getTag(value),isFunc=tag==funcTag||tag==genTag;if(isBuffer(value)){return cloneBuffer(value,isDeep);}if(tag==objectTag||tag==argsTag||isFunc&&!object){result=isFlat||isFunc?{}:initCloneObject(value);if(!isDeep){return isFlat?copySymbolsIn(value,baseAssignIn(result,value)):copySymbols(value,baseAssign(result,value));}}else{if(!cloneableTags[tag]){return object?value:{};}result=initCloneByTag(value,tag,isDeep);}}// Check for circular references and return its corresponding clone.\nstack||(stack=new Stack());var stacked=stack.get(value);if(stacked){return stacked;}stack.set(value,result);if(isSet(value)){value.forEach(function(subValue){result.add(baseClone(subValue,bitmask,customizer,subValue,value,stack));});}else if(isMap(value)){value.forEach(function(subValue,key){result.set(key,baseClone(subValue,bitmask,customizer,key,value,stack));});}var keysFunc=isFull?isFlat?getAllKeysIn:getAllKeys:isFlat?keysIn:keys;var props=isArr?undefined:keysFunc(value);arrayEach(props||value,function(subValue,key){if(props){key=subValue;subValue=value[key];}// Recursively populate clone (susceptible to call stack limits).\nassignValue(result,key,baseClone(subValue,bitmask,customizer,key,value,stack));});return result;}/**\n * The base implementation of `_.conforms` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n */function baseConforms(source){var props=keys(source);return function(object){return baseConformsTo(object,source,props);};}/**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */function baseConformsTo(object,source,props){var length=props.length;if(object==null){return!length;}object=Object(object);while(length--){var key=props[length],predicate=source[key],value=object[key];if(value===undefined&&!(key in object)||!predicate(value)){return false;}}return true;}/**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */function baseDelay(func,wait,args){if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}return setTimeout(function(){func.apply(undefined,args);},wait);}/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */function baseDifference(array,values,iteratee,comparator){var index=-1,includes=arrayIncludes,isCommon=true,length=array.length,result=[],valuesLength=values.length;if(!length){return result;}if(iteratee){values=arrayMap(values,baseUnary(iteratee));}if(comparator){includes=arrayIncludesWith;isCommon=false;}else if(values.length>=LARGE_ARRAY_SIZE){includes=cacheHas;isCommon=false;values=new SetCache(values);}outer:while(++index<length){var value=array[index],computed=iteratee==null?value:iteratee(value);value=comparator||value!==0?value:0;if(isCommon&&computed===computed){var valuesIndex=valuesLength;while(valuesIndex--){if(values[valuesIndex]===computed){continue outer;}}result.push(value);}else if(!includes(values,computed,comparator)){result.push(value);}}return result;}/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */var baseEach=createBaseEach(baseForOwn);/**\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */var baseEachRight=createBaseEach(baseForOwnRight,true);/**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */function baseEvery(collection,predicate){var result=true;baseEach(collection,function(value,index,collection){result=!!predicate(value,index,collection);return result;});return result;}/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */function baseExtremum(array,iteratee,comparator){var index=-1,length=array.length;while(++index<length){var value=array[index],current=iteratee(value);if(current!=null&&(computed===undefined?current===current&&!isSymbol(current):comparator(current,computed))){var computed=current,result=value;}}return result;}/**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */function baseFill(array,value,start,end){var length=array.length;start=toInteger(start);if(start<0){start=-start>length?0:length+start;}end=end===undefined||end>length?length:toInteger(end);if(end<0){end+=length;}end=start>end?0:toLength(end);while(start<end){array[start++]=value;}return array;}/**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */function baseFilter(collection,predicate){var result=[];baseEach(collection,function(value,index,collection){if(predicate(value,index,collection)){result.push(value);}});return result;}/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */function baseFlatten(array,depth,predicate,isStrict,result){var index=-1,length=array.length;predicate||(predicate=isFlattenable);result||(result=[]);while(++index<length){var value=array[index];if(depth>0&&predicate(value)){if(depth>1){// Recursively flatten arrays (susceptible to call stack limits).\nbaseFlatten(value,depth-1,predicate,isStrict,result);}else{arrayPush(result,value);}}else if(!isStrict){result[result.length]=value;}}return result;}/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */var baseFor=createBaseFor();/**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */var baseForRight=createBaseFor(true);/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */function baseForOwn(object,iteratee){return object&&baseFor(object,iteratee,keys);}/**\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */function baseForOwnRight(object,iteratee){return object&&baseForRight(object,iteratee,keys);}/**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from `props`.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the function names.\n */function baseFunctions(object,props){return arrayFilter(props,function(key){return isFunction(object[key]);});}/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */function baseGet(object,path){path=castPath(path,object);var index=0,length=path.length;while(object!=null&&index<length){object=object[toKey(path[index++])];}return index&&index==length?object:undefined;}/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */function baseGetAllKeys(object,keysFunc,symbolsFunc){var result=keysFunc(object);return isArray(object)?result:arrayPush(result,symbolsFunc(object));}/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */function baseGetTag(value){if(value==null){return value===undefined?undefinedTag:nullTag;}return symToStringTag&&symToStringTag in Object(value)?getRawTag(value):objectToString(value);}/**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */function baseGt(value,other){return value>other;}/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */function baseHas(object,key){return object!=null&&hasOwnProperty.call(object,key);}/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */function baseHasIn(object,key){return object!=null&&key in Object(object);}/**\n * The base implementation of `_.inRange` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */function baseInRange(number,start,end){return number>=nativeMin(start,end)&&number<nativeMax(start,end);}/**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */function baseIntersection(arrays,iteratee,comparator){var includes=comparator?arrayIncludesWith:arrayIncludes,length=arrays[0].length,othLength=arrays.length,othIndex=othLength,caches=Array(othLength),maxLength=Infinity,result=[];while(othIndex--){var array=arrays[othIndex];if(othIndex&&iteratee){array=arrayMap(array,baseUnary(iteratee));}maxLength=nativeMin(array.length,maxLength);caches[othIndex]=!comparator&&(iteratee||length>=120&&array.length>=120)?new SetCache(othIndex&&array):undefined;}array=arrays[0];var index=-1,seen=caches[0];outer:while(++index<length&&result.length<maxLength){var value=array[index],computed=iteratee?iteratee(value):value;value=comparator||value!==0?value:0;if(!(seen?cacheHas(seen,computed):includes(result,computed,comparator))){othIndex=othLength;while(--othIndex){var cache=caches[othIndex];if(!(cache?cacheHas(cache,computed):includes(arrays[othIndex],computed,comparator))){continue outer;}}if(seen){seen.push(computed);}result.push(value);}}return result;}/**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */function baseInverter(object,setter,iteratee,accumulator){baseForOwn(object,function(value,key,object){setter(accumulator,iteratee(value),key,object);});return accumulator;}/**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */function baseInvoke(object,path,args){path=castPath(path,object);object=parent(object,path);var func=object==null?object:object[toKey(last(path))];return func==null?undefined:apply(func,object,args);}/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */function baseIsArguments(value){return isObjectLike(value)&&baseGetTag(value)==argsTag;}/**\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n */function baseIsArrayBuffer(value){return isObjectLike(value)&&baseGetTag(value)==arrayBufferTag;}/**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */function baseIsDate(value){return isObjectLike(value)&&baseGetTag(value)==dateTag;}/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */function baseIsEqual(value,other,bitmask,customizer,stack){if(value===other){return true;}if(value==null||other==null||!isObjectLike(value)&&!isObjectLike(other)){return value!==value&&other!==other;}return baseIsEqualDeep(value,other,bitmask,customizer,baseIsEqual,stack);}/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */function baseIsEqualDeep(object,other,bitmask,customizer,equalFunc,stack){var objIsArr=isArray(object),othIsArr=isArray(other),objTag=objIsArr?arrayTag:getTag(object),othTag=othIsArr?arrayTag:getTag(other);objTag=objTag==argsTag?objectTag:objTag;othTag=othTag==argsTag?objectTag:othTag;var objIsObj=objTag==objectTag,othIsObj=othTag==objectTag,isSameTag=objTag==othTag;if(isSameTag&&isBuffer(object)){if(!isBuffer(other)){return false;}objIsArr=true;objIsObj=false;}if(isSameTag&&!objIsObj){stack||(stack=new Stack());return objIsArr||isTypedArray(object)?equalArrays(object,other,bitmask,customizer,equalFunc,stack):equalByTag(object,other,objTag,bitmask,customizer,equalFunc,stack);}if(!(bitmask&COMPARE_PARTIAL_FLAG)){var objIsWrapped=objIsObj&&hasOwnProperty.call(object,'__wrapped__'),othIsWrapped=othIsObj&&hasOwnProperty.call(other,'__wrapped__');if(objIsWrapped||othIsWrapped){var objUnwrapped=objIsWrapped?object.value():object,othUnwrapped=othIsWrapped?other.value():other;stack||(stack=new Stack());return equalFunc(objUnwrapped,othUnwrapped,bitmask,customizer,stack);}}if(!isSameTag){return false;}stack||(stack=new Stack());return equalObjects(object,other,bitmask,customizer,equalFunc,stack);}/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */function baseIsMap(value){return isObjectLike(value)&&getTag(value)==mapTag;}/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */function baseIsMatch(object,source,matchData,customizer){var index=matchData.length,length=index,noCustomizer=!customizer;if(object==null){return!length;}object=Object(object);while(index--){var data=matchData[index];if(noCustomizer&&data[2]?data[1]!==object[data[0]]:!(data[0]in object)){return false;}}while(++index<length){data=matchData[index];var key=data[0],objValue=object[key],srcValue=data[1];if(noCustomizer&&data[2]){if(objValue===undefined&&!(key in object)){return false;}}else{var stack=new Stack();if(customizer){var result=customizer(objValue,srcValue,key,object,source,stack);}if(!(result===undefined?baseIsEqual(srcValue,objValue,COMPARE_PARTIAL_FLAG|COMPARE_UNORDERED_FLAG,customizer,stack):result)){return false;}}}return true;}/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */function baseIsNative(value){if(!isObject(value)||isMasked(value)){return false;}var pattern=isFunction(value)?reIsNative:reIsHostCtor;return pattern.test(toSource(value));}/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */function baseIsRegExp(value){return isObjectLike(value)&&baseGetTag(value)==regexpTag;}/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */function baseIsSet(value){return isObjectLike(value)&&getTag(value)==setTag;}/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */function baseIsTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[baseGetTag(value)];}/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */function baseIteratee(value){// Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n// See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\nif(typeof value=='function'){return value;}if(value==null){return identity;}if(_typeof(value)=='object'){return isArray(value)?baseMatchesProperty(value[0],value[1]):baseMatches(value);}return property(value);}/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */function baseKeys(object){if(!isPrototype(object)){return nativeKeys(object);}var result=[];for(var key in Object(object)){if(hasOwnProperty.call(object,key)&&key!='constructor'){result.push(key);}}return result;}/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */function baseKeysIn(object){if(!isObject(object)){return nativeKeysIn(object);}var isProto=isPrototype(object),result=[];for(var key in object){if(!(key=='constructor'&&(isProto||!hasOwnProperty.call(object,key)))){result.push(key);}}return result;}/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */function baseLt(value,other){return value<other;}/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */function baseMap(collection,iteratee){var index=-1,result=isArrayLike(collection)?Array(collection.length):[];baseEach(collection,function(value,key,collection){result[++index]=iteratee(value,key,collection);});return result;}/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */function baseMatches(source){var matchData=getMatchData(source);if(matchData.length==1&&matchData[0][2]){return matchesStrictComparable(matchData[0][0],matchData[0][1]);}return function(object){return object===source||baseIsMatch(object,source,matchData);};}/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */function baseMatchesProperty(path,srcValue){if(isKey(path)&&isStrictComparable(srcValue)){return matchesStrictComparable(toKey(path),srcValue);}return function(object){var objValue=get(object,path);return objValue===undefined&&objValue===srcValue?hasIn(object,path):baseIsEqual(srcValue,objValue,COMPARE_PARTIAL_FLAG|COMPARE_UNORDERED_FLAG);};}/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */function baseMerge(object,source,srcIndex,customizer,stack){if(object===source){return;}baseFor(source,function(srcValue,key){stack||(stack=new Stack());if(isObject(srcValue)){baseMergeDeep(object,source,key,srcIndex,baseMerge,customizer,stack);}else{var newValue=customizer?customizer(safeGet(object,key),srcValue,key+'',object,source,stack):undefined;if(newValue===undefined){newValue=srcValue;}assignMergeValue(object,key,newValue);}},keysIn);}/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */function baseMergeDeep(object,source,key,srcIndex,mergeFunc,customizer,stack){var objValue=safeGet(object,key),srcValue=safeGet(source,key),stacked=stack.get(srcValue);if(stacked){assignMergeValue(object,key,stacked);return;}var newValue=customizer?customizer(objValue,srcValue,key+'',object,source,stack):undefined;var isCommon=newValue===undefined;if(isCommon){var isArr=isArray(srcValue),isBuff=!isArr&&isBuffer(srcValue),isTyped=!isArr&&!isBuff&&isTypedArray(srcValue);newValue=srcValue;if(isArr||isBuff||isTyped){if(isArray(objValue)){newValue=objValue;}else if(isArrayLikeObject(objValue)){newValue=copyArray(objValue);}else if(isBuff){isCommon=false;newValue=cloneBuffer(srcValue,true);}else if(isTyped){isCommon=false;newValue=cloneTypedArray(srcValue,true);}else{newValue=[];}}else if(isPlainObject(srcValue)||isArguments(srcValue)){newValue=objValue;if(isArguments(objValue)){newValue=toPlainObject(objValue);}else if(!isObject(objValue)||isFunction(objValue)){newValue=initCloneObject(srcValue);}}else{isCommon=false;}}if(isCommon){// Recursively merge objects and arrays (susceptible to call stack limits).\nstack.set(srcValue,newValue);mergeFunc(newValue,srcValue,srcIndex,customizer,stack);stack['delete'](srcValue);}assignMergeValue(object,key,newValue);}/**\n * The base implementation of `_.nth` which doesn't coerce arguments.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {number} n The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n */function baseNth(array,n){var length=array.length;if(!length){return;}n+=n<0?length:0;return isIndex(n,length)?array[n]:undefined;}/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */function baseOrderBy(collection,iteratees,orders){if(iteratees.length){iteratees=arrayMap(iteratees,function(iteratee){if(isArray(iteratee)){return function(value){return baseGet(value,iteratee.length===1?iteratee[0]:iteratee);};}return iteratee;});}else{iteratees=[identity];}var index=-1;iteratees=arrayMap(iteratees,baseUnary(getIteratee()));var result=baseMap(collection,function(value,key,collection){var criteria=arrayMap(iteratees,function(iteratee){return iteratee(value);});return{'criteria':criteria,'index':++index,'value':value};});return baseSortBy(result,function(object,other){return compareMultiple(object,other,orders);});}/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */function basePick(object,paths){return basePickBy(object,paths,function(value,path){return hasIn(object,path);});}/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */function basePickBy(object,paths,predicate){var index=-1,length=paths.length,result={};while(++index<length){var path=paths[index],value=baseGet(object,path);if(predicate(value,path)){baseSet(result,castPath(path,object),value);}}return result;}/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */function basePropertyDeep(path){return function(object){return baseGet(object,path);};}/**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */function basePullAll(array,values,iteratee,comparator){var indexOf=comparator?baseIndexOfWith:baseIndexOf,index=-1,length=values.length,seen=array;if(array===values){values=copyArray(values);}if(iteratee){seen=arrayMap(array,baseUnary(iteratee));}while(++index<length){var fromIndex=0,value=values[index],computed=iteratee?iteratee(value):value;while((fromIndex=indexOf(seen,computed,fromIndex,comparator))>-1){if(seen!==array){splice.call(seen,fromIndex,1);}splice.call(array,fromIndex,1);}}return array;}/**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */function basePullAt(array,indexes){var length=array?indexes.length:0,lastIndex=length-1;while(length--){var index=indexes[length];if(length==lastIndex||index!==previous){var previous=index;if(isIndex(index)){splice.call(array,index,1);}else{baseUnset(array,index);}}}return array;}/**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */function baseRandom(lower,upper){return lower+nativeFloor(nativeRandom()*(upper-lower+1));}/**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */function baseRange(start,end,step,fromRight){var index=-1,length=nativeMax(nativeCeil((end-start)/(step||1)),0),result=Array(length);while(length--){result[fromRight?length:++index]=start;start+=step;}return result;}/**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */function baseRepeat(string,n){var result='';if(!string||n<1||n>MAX_SAFE_INTEGER){return result;}// Leverage the exponentiation by squaring algorithm for a faster repeat.\n// See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\ndo{if(n%2){result+=string;}n=nativeFloor(n/2);if(n){string+=string;}}while(n);return result;}/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */function baseRest(func,start){return setToString(overRest(func,start,identity),func+'');}/**\n * The base implementation of `_.sample`.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n */function baseSample(collection){return arraySample(values(collection));}/**\n * The base implementation of `_.sampleSize` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */function baseSampleSize(collection,n){var array=values(collection);return shuffleSelf(array,baseClamp(n,0,array.length));}/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */function baseSet(object,path,value,customizer){if(!isObject(object)){return object;}path=castPath(path,object);var index=-1,length=path.length,lastIndex=length-1,nested=object;while(nested!=null&&++index<length){var key=toKey(path[index]),newValue=value;if(key==='__proto__'||key==='constructor'||key==='prototype'){return object;}if(index!=lastIndex){var objValue=nested[key];newValue=customizer?customizer(objValue,key,nested):undefined;if(newValue===undefined){newValue=isObject(objValue)?objValue:isIndex(path[index+1])?[]:{};}}assignValue(nested,key,newValue);nested=nested[key];}return object;}/**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */var baseSetData=!metaMap?identity:function(func,data){metaMap.set(func,data);return func;};/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */var baseSetToString=!defineProperty?identity:function(func,string){return defineProperty(func,'toString',{'configurable':true,'enumerable':false,'value':constant(string),'writable':true});};/**\n * The base implementation of `_.shuffle`.\n *\n * @private\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */function baseShuffle(collection){return shuffleSelf(values(collection));}/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */function baseSlice(array,start,end){var index=-1,length=array.length;if(start<0){start=-start>length?0:length+start;}end=end>length?length:end;if(end<0){end+=length;}length=start>end?0:end-start>>>0;start>>>=0;var result=Array(length);while(++index<length){result[index]=array[index+start];}return result;}/**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */function baseSome(collection,predicate){var result;baseEach(collection,function(value,index,collection){result=predicate(value,index,collection);return!result;});return!!result;}/**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */function baseSortedIndex(array,value,retHighest){var low=0,high=array==null?low:array.length;if(typeof value=='number'&&value===value&&high<=HALF_MAX_ARRAY_LENGTH){while(low<high){var mid=low+high>>>1,computed=array[mid];if(computed!==null&&!isSymbol(computed)&&(retHighest?computed<=value:computed<value)){low=mid+1;}else{high=mid;}}return high;}return baseSortedIndexBy(array,value,identity,retHighest);}/**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */function baseSortedIndexBy(array,value,iteratee,retHighest){var low=0,high=array==null?0:array.length;if(high===0){return 0;}value=iteratee(value);var valIsNaN=value!==value,valIsNull=value===null,valIsSymbol=isSymbol(value),valIsUndefined=value===undefined;while(low<high){var mid=nativeFloor((low+high)/2),computed=iteratee(array[mid]),othIsDefined=computed!==undefined,othIsNull=computed===null,othIsReflexive=computed===computed,othIsSymbol=isSymbol(computed);if(valIsNaN){var setLow=retHighest||othIsReflexive;}else if(valIsUndefined){setLow=othIsReflexive&&(retHighest||othIsDefined);}else if(valIsNull){setLow=othIsReflexive&&othIsDefined&&(retHighest||!othIsNull);}else if(valIsSymbol){setLow=othIsReflexive&&othIsDefined&&!othIsNull&&(retHighest||!othIsSymbol);}else if(othIsNull||othIsSymbol){setLow=false;}else{setLow=retHighest?computed<=value:computed<value;}if(setLow){low=mid+1;}else{high=mid;}}return nativeMin(high,MAX_ARRAY_INDEX);}/**\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */function baseSortedUniq(array,iteratee){var index=-1,length=array.length,resIndex=0,result=[];while(++index<length){var value=array[index],computed=iteratee?iteratee(value):value;if(!index||!eq(computed,seen)){var seen=computed;result[resIndex++]=value===0?0:value;}}return result;}/**\n * The base implementation of `_.toNumber` which doesn't ensure correct\n * conversions of binary, hexadecimal, or octal string values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n */function baseToNumber(value){if(typeof value=='number'){return value;}if(isSymbol(value)){return NAN;}return+value;}/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */function baseToString(value){// Exit early for strings to avoid a performance hit in some environments.\nif(typeof value=='string'){return value;}if(isArray(value)){// Recursively convert values (susceptible to call stack limits).\nreturn arrayMap(value,baseToString)+'';}if(isSymbol(value)){return symbolToString?symbolToString.call(value):'';}var result=value+'';return result=='0'&&1/value==-INFINITY?'-0':result;}/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */function baseUniq(array,iteratee,comparator){var index=-1,includes=arrayIncludes,length=array.length,isCommon=true,result=[],seen=result;if(comparator){isCommon=false;includes=arrayIncludesWith;}else if(length>=LARGE_ARRAY_SIZE){var set=iteratee?null:createSet(array);if(set){return setToArray(set);}isCommon=false;includes=cacheHas;seen=new SetCache();}else{seen=iteratee?[]:result;}outer:while(++index<length){var value=array[index],computed=iteratee?iteratee(value):value;value=comparator||value!==0?value:0;if(isCommon&&computed===computed){var seenIndex=seen.length;while(seenIndex--){if(seen[seenIndex]===computed){continue outer;}}if(iteratee){seen.push(computed);}result.push(value);}else if(!includes(seen,computed,comparator)){if(seen!==result){seen.push(computed);}result.push(value);}}return result;}/**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */function baseUnset(object,path){path=castPath(path,object);object=parent(object,path);return object==null||delete object[toKey(last(path))];}/**\n * The base implementation of `_.update`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to update.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */function baseUpdate(object,path,updater,customizer){return baseSet(object,path,updater(baseGet(object,path)),customizer);}/**\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n * without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */function baseWhile(array,predicate,isDrop,fromRight){var length=array.length,index=fromRight?length:-1;while((fromRight?index--:++index<length)&&predicate(array[index],index,array)){}return isDrop?baseSlice(array,fromRight?0:index,fromRight?index+1:length):baseSlice(array,fromRight?index+1:0,fromRight?length:index);}/**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */function baseWrapperValue(value,actions){var result=value;if(result instanceof LazyWrapper){result=result.value();}return arrayReduce(actions,function(result,action){return action.func.apply(action.thisArg,arrayPush([result],action.args));},result);}/**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */function baseXor(arrays,iteratee,comparator){var length=arrays.length;if(length<2){return length?baseUniq(arrays[0]):[];}var index=-1,result=Array(length);while(++index<length){var array=arrays[index],othIndex=-1;while(++othIndex<length){if(othIndex!=index){result[index]=baseDifference(result[index]||array,arrays[othIndex],iteratee,comparator);}}}return baseUniq(baseFlatten(result,1),iteratee,comparator);}/**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */function baseZipObject(props,values,assignFunc){var index=-1,length=props.length,valsLength=values.length,result={};while(++index<length){var value=index<valsLength?values[index]:undefined;assignFunc(result,props[index],value);}return result;}/**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */function castArrayLikeObject(value){return isArrayLikeObject(value)?value:[];}/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */function castFunction(value){return typeof value=='function'?value:identity;}/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */function castPath(value,object){if(isArray(value)){return value;}return isKey(value,object)?[value]:stringToPath(toString(value));}/**\n * A `baseRest` alias which can be replaced with `identity` by module\n * replacement plugins.\n *\n * @private\n * @type {Function}\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */var castRest=baseRest;/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */function castSlice(array,start,end){var length=array.length;end=end===undefined?length:end;return!start&&end>=length?array:baseSlice(array,start,end);}/**\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n *\n * @private\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\n */var clearTimeout=ctxClearTimeout||function(id){return root.clearTimeout(id);};/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */function cloneBuffer(buffer,isDeep){if(isDeep){return buffer.slice();}var length=buffer.length,result=allocUnsafe?allocUnsafe(length):new buffer.constructor(length);buffer.copy(result);return result;}/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */function cloneArrayBuffer(arrayBuffer){var result=new arrayBuffer.constructor(arrayBuffer.byteLength);new Uint8Array(result).set(new Uint8Array(arrayBuffer));return result;}/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */function cloneDataView(dataView,isDeep){var buffer=isDeep?cloneArrayBuffer(dataView.buffer):dataView.buffer;return new dataView.constructor(buffer,dataView.byteOffset,dataView.byteLength);}/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */function cloneRegExp(regexp){var result=new regexp.constructor(regexp.source,reFlags.exec(regexp));result.lastIndex=regexp.lastIndex;return result;}/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */function cloneSymbol(symbol){return symbolValueOf?Object(symbolValueOf.call(symbol)):{};}/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */function cloneTypedArray(typedArray,isDeep){var buffer=isDeep?cloneArrayBuffer(typedArray.buffer):typedArray.buffer;return new typedArray.constructor(buffer,typedArray.byteOffset,typedArray.length);}/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */function compareAscending(value,other){if(value!==other){var valIsDefined=value!==undefined,valIsNull=value===null,valIsReflexive=value===value,valIsSymbol=isSymbol(value);var othIsDefined=other!==undefined,othIsNull=other===null,othIsReflexive=other===other,othIsSymbol=isSymbol(other);if(!othIsNull&&!othIsSymbol&&!valIsSymbol&&value>other||valIsSymbol&&othIsDefined&&othIsReflexive&&!othIsNull&&!othIsSymbol||valIsNull&&othIsDefined&&othIsReflexive||!valIsDefined&&othIsReflexive||!valIsReflexive){return 1;}if(!valIsNull&&!valIsSymbol&&!othIsSymbol&&value<other||othIsSymbol&&valIsDefined&&valIsReflexive&&!valIsNull&&!valIsSymbol||othIsNull&&valIsDefined&&valIsReflexive||!othIsDefined&&valIsReflexive||!othIsReflexive){return-1;}}return 0;}/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */function compareMultiple(object,other,orders){var index=-1,objCriteria=object.criteria,othCriteria=other.criteria,length=objCriteria.length,ordersLength=orders.length;while(++index<length){var result=compareAscending(objCriteria[index],othCriteria[index]);if(result){if(index>=ordersLength){return result;}var order=orders[index];return result*(order=='desc'?-1:1);}}// Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n// that causes it, under certain circumstances, to provide the same value for\n// `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n// for more details.\n//\n// This also ensures a stable sort in V8 and other engines.\n// See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\nreturn object.index-other.index;}/**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */function composeArgs(args,partials,holders,isCurried){var argsIndex=-1,argsLength=args.length,holdersLength=holders.length,leftIndex=-1,leftLength=partials.length,rangeLength=nativeMax(argsLength-holdersLength,0),result=Array(leftLength+rangeLength),isUncurried=!isCurried;while(++leftIndex<leftLength){result[leftIndex]=partials[leftIndex];}while(++argsIndex<holdersLength){if(isUncurried||argsIndex<argsLength){result[holders[argsIndex]]=args[argsIndex];}}while(rangeLength--){result[leftIndex++]=args[argsIndex++];}return result;}/**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */function composeArgsRight(args,partials,holders,isCurried){var argsIndex=-1,argsLength=args.length,holdersIndex=-1,holdersLength=holders.length,rightIndex=-1,rightLength=partials.length,rangeLength=nativeMax(argsLength-holdersLength,0),result=Array(rangeLength+rightLength),isUncurried=!isCurried;while(++argsIndex<rangeLength){result[argsIndex]=args[argsIndex];}var offset=argsIndex;while(++rightIndex<rightLength){result[offset+rightIndex]=partials[rightIndex];}while(++holdersIndex<holdersLength){if(isUncurried||argsIndex<argsLength){result[offset+holders[holdersIndex]]=args[argsIndex++];}}return result;}/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */function copyArray(source,array){var index=-1,length=source.length;array||(array=Array(length));while(++index<length){array[index]=source[index];}return array;}/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */function copyObject(source,props,object,customizer){var isNew=!object;object||(object={});var index=-1,length=props.length;while(++index<length){var key=props[index];var newValue=customizer?customizer(object[key],source[key],key,object,source):undefined;if(newValue===undefined){newValue=source[key];}if(isNew){baseAssignValue(object,key,newValue);}else{assignValue(object,key,newValue);}}return object;}/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */function copySymbols(source,object){return copyObject(source,getSymbols(source),object);}/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */function copySymbolsIn(source,object){return copyObject(source,getSymbolsIn(source),object);}/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */function createAggregator(setter,initializer){return function(collection,iteratee){var func=isArray(collection)?arrayAggregator:baseAggregator,accumulator=initializer?initializer():{};return func(collection,setter,getIteratee(iteratee,2),accumulator);};}/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */function createAssigner(assigner){return baseRest(function(object,sources){var index=-1,length=sources.length,customizer=length>1?sources[length-1]:undefined,guard=length>2?sources[2]:undefined;customizer=assigner.length>3&&typeof customizer=='function'?(length--,customizer):undefined;if(guard&&isIterateeCall(sources[0],sources[1],guard)){customizer=length<3?undefined:customizer;length=1;}object=Object(object);while(++index<length){var source=sources[index];if(source){assigner(object,source,index,customizer);}}return object;});}/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */function createBaseEach(eachFunc,fromRight){return function(collection,iteratee){if(collection==null){return collection;}if(!isArrayLike(collection)){return eachFunc(collection,iteratee);}var length=collection.length,index=fromRight?length:-1,iterable=Object(collection);while(fromRight?index--:++index<length){if(iteratee(iterable[index],index,iterable)===false){break;}}return collection;};}/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */function createBaseFor(fromRight){return function(object,iteratee,keysFunc){var index=-1,iterable=Object(object),props=keysFunc(object),length=props.length;while(length--){var key=props[fromRight?length:++index];if(iteratee(iterable[key],key,iterable)===false){break;}}return object;};}/**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */function createBind(func,bitmask,thisArg){var isBind=bitmask&WRAP_BIND_FLAG,Ctor=createCtor(func);function wrapper(){var fn=this&&this!==root&&this instanceof wrapper?Ctor:func;return fn.apply(isBind?thisArg:this,arguments);}return wrapper;}/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */function createCaseFirst(methodName){return function(string){string=toString(string);var strSymbols=hasUnicode(string)?stringToArray(string):undefined;var chr=strSymbols?strSymbols[0]:string.charAt(0);var trailing=strSymbols?castSlice(strSymbols,1).join(''):string.slice(1);return chr[methodName]()+trailing;};}/**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */function createCompounder(callback){return function(string){return arrayReduce(words(deburr(string).replace(reApos,'')),callback,'');};}/**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */function createCtor(Ctor){return function(){// Use a `switch` statement to work with class constructors. See\n// http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n// for more details.\nvar args=arguments;switch(args.length){case 0:return new Ctor();case 1:return new Ctor(args[0]);case 2:return new Ctor(args[0],args[1]);case 3:return new Ctor(args[0],args[1],args[2]);case 4:return new Ctor(args[0],args[1],args[2],args[3]);case 5:return new Ctor(args[0],args[1],args[2],args[3],args[4]);case 6:return new Ctor(args[0],args[1],args[2],args[3],args[4],args[5]);case 7:return new Ctor(args[0],args[1],args[2],args[3],args[4],args[5],args[6]);}var thisBinding=baseCreate(Ctor.prototype),result=Ctor.apply(thisBinding,args);// Mimic the constructor's `return` behavior.\n// See https://es5.github.io/#x13.2.2 for more details.\nreturn isObject(result)?result:thisBinding;};}/**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */function createCurry(func,bitmask,arity){var Ctor=createCtor(func);function wrapper(){var length=arguments.length,args=Array(length),index=length,placeholder=getHolder(wrapper);while(index--){args[index]=arguments[index];}var holders=length<3&&args[0]!==placeholder&&args[length-1]!==placeholder?[]:replaceHolders(args,placeholder);length-=holders.length;if(length<arity){return createRecurry(func,bitmask,createHybrid,wrapper.placeholder,undefined,args,holders,undefined,undefined,arity-length);}var fn=this&&this!==root&&this instanceof wrapper?Ctor:func;return apply(fn,this,args);}return wrapper;}/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */function createFind(findIndexFunc){return function(collection,predicate,fromIndex){var iterable=Object(collection);if(!isArrayLike(collection)){var iteratee=getIteratee(predicate,3);collection=keys(collection);predicate=function predicate(key){return iteratee(iterable[key],key,iterable);};}var index=findIndexFunc(collection,predicate,fromIndex);return index>-1?iterable[iteratee?collection[index]:index]:undefined;};}/**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */function createFlow(fromRight){return flatRest(function(funcs){var length=funcs.length,index=length,prereq=LodashWrapper.prototype.thru;if(fromRight){funcs.reverse();}while(index--){var func=funcs[index];if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}if(prereq&&!wrapper&&getFuncName(func)=='wrapper'){var wrapper=new LodashWrapper([],true);}}index=wrapper?index:length;while(++index<length){func=funcs[index];var funcName=getFuncName(func),data=funcName=='wrapper'?getData(func):undefined;if(data&&isLaziable(data[0])&&data[1]==(WRAP_ARY_FLAG|WRAP_CURRY_FLAG|WRAP_PARTIAL_FLAG|WRAP_REARG_FLAG)&&!data[4].length&&data[9]==1){wrapper=wrapper[getFuncName(data[0])].apply(wrapper,data[3]);}else{wrapper=func.length==1&&isLaziable(func)?wrapper[funcName]():wrapper.thru(func);}}return function(){var args=arguments,value=args[0];if(wrapper&&args.length==1&&isArray(value)){return wrapper.plant(value).value();}var index=0,result=length?funcs[index].apply(this,args):value;while(++index<length){result=funcs[index].call(this,result);}return result;};});}/**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */function createHybrid(func,bitmask,thisArg,partials,holders,partialsRight,holdersRight,argPos,ary,arity){var isAry=bitmask&WRAP_ARY_FLAG,isBind=bitmask&WRAP_BIND_FLAG,isBindKey=bitmask&WRAP_BIND_KEY_FLAG,isCurried=bitmask&(WRAP_CURRY_FLAG|WRAP_CURRY_RIGHT_FLAG),isFlip=bitmask&WRAP_FLIP_FLAG,Ctor=isBindKey?undefined:createCtor(func);function wrapper(){var length=arguments.length,args=Array(length),index=length;while(index--){args[index]=arguments[index];}if(isCurried){var placeholder=getHolder(wrapper),holdersCount=countHolders(args,placeholder);}if(partials){args=composeArgs(args,partials,holders,isCurried);}if(partialsRight){args=composeArgsRight(args,partialsRight,holdersRight,isCurried);}length-=holdersCount;if(isCurried&&length<arity){var newHolders=replaceHolders(args,placeholder);return createRecurry(func,bitmask,createHybrid,wrapper.placeholder,thisArg,args,newHolders,argPos,ary,arity-length);}var thisBinding=isBind?thisArg:this,fn=isBindKey?thisBinding[func]:func;length=args.length;if(argPos){args=reorder(args,argPos);}else if(isFlip&&length>1){args.reverse();}if(isAry&&ary<length){args.length=ary;}if(this&&this!==root&&this instanceof wrapper){fn=Ctor||createCtor(fn);}return fn.apply(thisBinding,args);}return wrapper;}/**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */function createInverter(setter,toIteratee){return function(object,iteratee){return baseInverter(object,setter,toIteratee(iteratee),{});};}/**\n * Creates a function that performs a mathematical operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @param {number} [defaultValue] The value used for `undefined` arguments.\n * @returns {Function} Returns the new mathematical operation function.\n */function createMathOperation(operator,defaultValue){return function(value,other){var result;if(value===undefined&&other===undefined){return defaultValue;}if(value!==undefined){result=value;}if(other!==undefined){if(result===undefined){return other;}if(typeof value=='string'||typeof other=='string'){value=baseToString(value);other=baseToString(other);}else{value=baseToNumber(value);other=baseToNumber(other);}result=operator(value,other);}return result;};}/**\n * Creates a function like `_.over`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over iteratees.\n * @returns {Function} Returns the new over function.\n */function createOver(arrayFunc){return flatRest(function(iteratees){iteratees=arrayMap(iteratees,baseUnary(getIteratee()));return baseRest(function(args){var thisArg=this;return arrayFunc(iteratees,function(iteratee){return apply(iteratee,thisArg,args);});});});}/**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */function createPadding(length,chars){chars=chars===undefined?' ':baseToString(chars);var charsLength=chars.length;if(charsLength<2){return charsLength?baseRepeat(chars,length):chars;}var result=baseRepeat(chars,nativeCeil(length/stringSize(chars)));return hasUnicode(chars)?castSlice(stringToArray(result),0,length).join(''):result.slice(0,length);}/**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */function createPartial(func,bitmask,thisArg,partials){var isBind=bitmask&WRAP_BIND_FLAG,Ctor=createCtor(func);function wrapper(){var argsIndex=-1,argsLength=arguments.length,leftIndex=-1,leftLength=partials.length,args=Array(leftLength+argsLength),fn=this&&this!==root&&this instanceof wrapper?Ctor:func;while(++leftIndex<leftLength){args[leftIndex]=partials[leftIndex];}while(argsLength--){args[leftIndex++]=arguments[++argsIndex];}return apply(fn,isBind?thisArg:this,args);}return wrapper;}/**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */function createRange(fromRight){return function(start,end,step){if(step&&typeof step!='number'&&isIterateeCall(start,end,step)){end=step=undefined;}// Ensure the sign of `-0` is preserved.\nstart=toFinite(start);if(end===undefined){end=start;start=0;}else{end=toFinite(end);}step=step===undefined?start<end?1:-1:toFinite(step);return baseRange(start,end,step,fromRight);};}/**\n * Creates a function that performs a relational operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @returns {Function} Returns the new relational operation function.\n */function createRelationalOperation(operator){return function(value,other){if(!(typeof value=='string'&&typeof other=='string')){value=toNumber(value);other=toNumber(other);}return operator(value,other);};}/**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */function createRecurry(func,bitmask,wrapFunc,placeholder,thisArg,partials,holders,argPos,ary,arity){var isCurry=bitmask&WRAP_CURRY_FLAG,newHolders=isCurry?holders:undefined,newHoldersRight=isCurry?undefined:holders,newPartials=isCurry?partials:undefined,newPartialsRight=isCurry?undefined:partials;bitmask|=isCurry?WRAP_PARTIAL_FLAG:WRAP_PARTIAL_RIGHT_FLAG;bitmask&=~(isCurry?WRAP_PARTIAL_RIGHT_FLAG:WRAP_PARTIAL_FLAG);if(!(bitmask&WRAP_CURRY_BOUND_FLAG)){bitmask&=~(WRAP_BIND_FLAG|WRAP_BIND_KEY_FLAG);}var newData=[func,bitmask,thisArg,newPartials,newHolders,newPartialsRight,newHoldersRight,argPos,ary,arity];var result=wrapFunc.apply(undefined,newData);if(isLaziable(func)){setData(result,newData);}result.placeholder=placeholder;return setWrapToString(result,func,bitmask);}/**\n * Creates a function like `_.round`.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */function createRound(methodName){var func=Math[methodName];return function(number,precision){number=toNumber(number);precision=precision==null?0:nativeMin(toInteger(precision),292);if(precision&&nativeIsFinite(number)){// Shift with exponential notation to avoid floating-point issues.\n// See [MDN](https://mdn.io/round#Examples) for more details.\nvar pair=(toString(number)+'e').split('e'),value=func(pair[0]+'e'+(+pair[1]+precision));pair=(toString(value)+'e').split('e');return+(pair[0]+'e'+(+pair[1]-precision));}return func(number);};}/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */var createSet=!(Set&&1/setToArray(new Set([,-0]))[1]==INFINITY)?noop:function(values){return new Set(values);};/**\n * Creates a `_.toPairs` or `_.toPairsIn` function.\n *\n * @private\n * @param {Function} keysFunc The function to get the keys of a given object.\n * @returns {Function} Returns the new pairs function.\n */function createToPairs(keysFunc){return function(object){var tag=getTag(object);if(tag==mapTag){return mapToArray(object);}if(tag==setTag){return setToPairs(object);}return baseToPairs(object,keysFunc(object));};}/**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */function createWrap(func,bitmask,thisArg,partials,holders,argPos,ary,arity){var isBindKey=bitmask&WRAP_BIND_KEY_FLAG;if(!isBindKey&&typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}var length=partials?partials.length:0;if(!length){bitmask&=~(WRAP_PARTIAL_FLAG|WRAP_PARTIAL_RIGHT_FLAG);partials=holders=undefined;}ary=ary===undefined?ary:nativeMax(toInteger(ary),0);arity=arity===undefined?arity:toInteger(arity);length-=holders?holders.length:0;if(bitmask&WRAP_PARTIAL_RIGHT_FLAG){var partialsRight=partials,holdersRight=holders;partials=holders=undefined;}var data=isBindKey?undefined:getData(func);var newData=[func,bitmask,thisArg,partials,holders,partialsRight,holdersRight,argPos,ary,arity];if(data){mergeData(newData,data);}func=newData[0];bitmask=newData[1];thisArg=newData[2];partials=newData[3];holders=newData[4];arity=newData[9]=newData[9]===undefined?isBindKey?0:func.length:nativeMax(newData[9]-length,0);if(!arity&&bitmask&(WRAP_CURRY_FLAG|WRAP_CURRY_RIGHT_FLAG)){bitmask&=~(WRAP_CURRY_FLAG|WRAP_CURRY_RIGHT_FLAG);}if(!bitmask||bitmask==WRAP_BIND_FLAG){var result=createBind(func,bitmask,thisArg);}else if(bitmask==WRAP_CURRY_FLAG||bitmask==WRAP_CURRY_RIGHT_FLAG){result=createCurry(func,bitmask,arity);}else if((bitmask==WRAP_PARTIAL_FLAG||bitmask==(WRAP_BIND_FLAG|WRAP_PARTIAL_FLAG))&&!holders.length){result=createPartial(func,bitmask,thisArg,partials);}else{result=createHybrid.apply(undefined,newData);}var setter=data?baseSetData:setData;return setWrapToString(setter(result,newData),func,bitmask);}/**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */function customDefaultsAssignIn(objValue,srcValue,key,object){if(objValue===undefined||eq(objValue,objectProto[key])&&!hasOwnProperty.call(object,key)){return srcValue;}return objValue;}/**\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n * objects into destination objects that are passed thru.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to merge.\n * @param {Object} object The parent object of `objValue`.\n * @param {Object} source The parent object of `srcValue`.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n * @returns {*} Returns the value to assign.\n */function customDefaultsMerge(objValue,srcValue,key,object,source,stack){if(isObject(objValue)&&isObject(srcValue)){// Recursively merge objects and arrays (susceptible to call stack limits).\nstack.set(srcValue,objValue);baseMerge(objValue,srcValue,undefined,customDefaultsMerge,stack);stack['delete'](srcValue);}return objValue;}/**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */function customOmitClone(value){return isPlainObject(value)?undefined:value;}/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */function equalArrays(array,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,arrLength=array.length,othLength=other.length;if(arrLength!=othLength&&!(isPartial&&othLength>arrLength)){return false;}// Check that cyclic values are equal.\nvar arrStacked=stack.get(array);var othStacked=stack.get(other);if(arrStacked&&othStacked){return arrStacked==other&&othStacked==array;}var index=-1,result=true,seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache():undefined;stack.set(array,other);stack.set(other,array);// Ignore non-index properties.\nwhile(++index<arrLength){var arrValue=array[index],othValue=other[index];if(customizer){var compared=isPartial?customizer(othValue,arrValue,index,other,array,stack):customizer(arrValue,othValue,index,array,other,stack);}if(compared!==undefined){if(compared){continue;}result=false;break;}// Recursively compare arrays (susceptible to call stack limits).\nif(seen){if(!arraySome(other,function(othValue,othIndex){if(!cacheHas(seen,othIndex)&&(arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack))){return seen.push(othIndex);}})){result=false;break;}}else if(!(arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack))){result=false;break;}}stack['delete'](array);stack['delete'](other);return result;}/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */function equalByTag(object,other,tag,bitmask,customizer,equalFunc,stack){switch(tag){case dataViewTag:if(object.byteLength!=other.byteLength||object.byteOffset!=other.byteOffset){return false;}object=object.buffer;other=other.buffer;case arrayBufferTag:if(object.byteLength!=other.byteLength||!equalFunc(new Uint8Array(object),new Uint8Array(other))){return false;}return true;case boolTag:case dateTag:case numberTag:// Coerce booleans to `1` or `0` and dates to milliseconds.\n// Invalid dates are coerced to `NaN`.\nreturn eq(+object,+other);case errorTag:return object.name==other.name&&object.message==other.message;case regexpTag:case stringTag:// Coerce regexes to strings and treat strings, primitives and objects,\n// as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n// for more details.\nreturn object==other+'';case mapTag:var convert=mapToArray;case setTag:var isPartial=bitmask&COMPARE_PARTIAL_FLAG;convert||(convert=setToArray);if(object.size!=other.size&&!isPartial){return false;}// Assume cyclic values are equal.\nvar stacked=stack.get(object);if(stacked){return stacked==other;}bitmask|=COMPARE_UNORDERED_FLAG;// Recursively compare objects (susceptible to call stack limits).\nstack.set(object,other);var result=equalArrays(convert(object),convert(other),bitmask,customizer,equalFunc,stack);stack['delete'](object);return result;case symbolTag:if(symbolValueOf){return symbolValueOf.call(object)==symbolValueOf.call(other);}}return false;}/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */function equalObjects(object,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,objProps=getAllKeys(object),objLength=objProps.length,othProps=getAllKeys(other),othLength=othProps.length;if(objLength!=othLength&&!isPartial){return false;}var index=objLength;while(index--){var key=objProps[index];if(!(isPartial?key in other:hasOwnProperty.call(other,key))){return false;}}// Check that cyclic values are equal.\nvar objStacked=stack.get(object);var othStacked=stack.get(other);if(objStacked&&othStacked){return objStacked==other&&othStacked==object;}var result=true;stack.set(object,other);stack.set(other,object);var skipCtor=isPartial;while(++index<objLength){key=objProps[index];var objValue=object[key],othValue=other[key];if(customizer){var compared=isPartial?customizer(othValue,objValue,key,other,object,stack):customizer(objValue,othValue,key,object,other,stack);}// Recursively compare objects (susceptible to call stack limits).\nif(!(compared===undefined?objValue===othValue||equalFunc(objValue,othValue,bitmask,customizer,stack):compared)){result=false;break;}skipCtor||(skipCtor=key=='constructor');}if(result&&!skipCtor){var objCtor=object.constructor,othCtor=other.constructor;// Non `Object` object instances with different constructors are not equal.\nif(objCtor!=othCtor&&'constructor'in object&&'constructor'in other&&!(typeof objCtor=='function'&&objCtor instanceof objCtor&&typeof othCtor=='function'&&othCtor instanceof othCtor)){result=false;}}stack['delete'](object);stack['delete'](other);return result;}/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */function flatRest(func){return setToString(overRest(func,undefined,flatten),func+'');}/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */function getAllKeys(object){return baseGetAllKeys(object,keys,getSymbols);}/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */function getAllKeysIn(object){return baseGetAllKeys(object,keysIn,getSymbolsIn);}/**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */var getData=!metaMap?noop:function(func){return metaMap.get(func);};/**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */function getFuncName(func){var result=func.name+'',array=realNames[result],length=hasOwnProperty.call(realNames,result)?array.length:0;while(length--){var data=array[length],otherFunc=data.func;if(otherFunc==null||otherFunc==func){return data.name;}}return result;}/**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */function getHolder(func){var object=hasOwnProperty.call(lodash,'placeholder')?lodash:func;return object.placeholder;}/**\n * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n * this function returns the custom method, otherwise it returns `baseIteratee`.\n * If arguments are provided, the chosen function is invoked with them and\n * its result is returned.\n *\n * @private\n * @param {*} [value] The value to convert to an iteratee.\n * @param {number} [arity] The arity of the created iteratee.\n * @returns {Function} Returns the chosen function or its result.\n */function getIteratee(){var result=lodash.iteratee||iteratee;result=result===iteratee?baseIteratee:result;return arguments.length?result(arguments[0],arguments[1]):result;}/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */function getMapData(map,key){var data=map.__data__;return isKeyable(key)?data[typeof key=='string'?'string':'hash']:data.map;}/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */function getMatchData(object){var result=keys(object),length=result.length;while(length--){var key=result[length],value=object[key];result[length]=[key,value,isStrictComparable(value)];}return result;}/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */function getNative(object,key){var value=getValue(object,key);return baseIsNative(value)?value:undefined;}/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */function getRawTag(value){var isOwn=hasOwnProperty.call(value,symToStringTag),tag=value[symToStringTag];try{value[symToStringTag]=undefined;var unmasked=true;}catch(e){}var result=nativeObjectToString.call(value);if(unmasked){if(isOwn){value[symToStringTag]=tag;}else{delete value[symToStringTag];}}return result;}/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */var getSymbols=!nativeGetSymbols?stubArray:function(object){if(object==null){return[];}object=Object(object);return arrayFilter(nativeGetSymbols(object),function(symbol){return propertyIsEnumerable.call(object,symbol);});};/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */var getSymbolsIn=!nativeGetSymbols?stubArray:function(object){var result=[];while(object){arrayPush(result,getSymbols(object));object=getPrototype(object);}return result;};/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */var getTag=baseGetTag;// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif(DataView&&getTag(new DataView(new ArrayBuffer(1)))!=dataViewTag||Map&&getTag(new Map())!=mapTag||Promise&&getTag(Promise.resolve())!=promiseTag||Set&&getTag(new Set())!=setTag||WeakMap&&getTag(new WeakMap())!=weakMapTag){getTag=function getTag(value){var result=baseGetTag(value),Ctor=result==objectTag?value.constructor:undefined,ctorString=Ctor?toSource(Ctor):'';if(ctorString){switch(ctorString){case dataViewCtorString:return dataViewTag;case mapCtorString:return mapTag;case promiseCtorString:return promiseTag;case setCtorString:return setTag;case weakMapCtorString:return weakMapTag;}}return result;};}/**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n * positions of the view.\n */function getView(start,end,transforms){var index=-1,length=transforms.length;while(++index<length){var data=transforms[index],size=data.size;switch(data.type){case'drop':start+=size;break;case'dropRight':end-=size;break;case'take':end=nativeMin(end,start+size);break;case'takeRight':start=nativeMax(start,end-size);break;}}return{'start':start,'end':end};}/**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */function getWrapDetails(source){var match=source.match(reWrapDetails);return match?match[1].split(reSplitDetails):[];}/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */function hasPath(object,path,hasFunc){path=castPath(path,object);var index=-1,length=path.length,result=false;while(++index<length){var key=toKey(path[index]);if(!(result=object!=null&&hasFunc(object,key))){break;}object=object[key];}if(result||++index!=length){return result;}length=object==null?0:object.length;return!!length&&isLength(length)&&isIndex(key,length)&&(isArray(object)||isArguments(object));}/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */function initCloneArray(array){var length=array.length,result=new array.constructor(length);// Add properties assigned by `RegExp#exec`.\nif(length&&typeof array[0]=='string'&&hasOwnProperty.call(array,'index')){result.index=array.index;result.input=array.input;}return result;}/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */function initCloneObject(object){return typeof object.constructor=='function'&&!isPrototype(object)?baseCreate(getPrototype(object)):{};}/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */function initCloneByTag(object,tag,isDeep){var Ctor=object.constructor;switch(tag){case arrayBufferTag:return cloneArrayBuffer(object);case boolTag:case dateTag:return new Ctor(+object);case dataViewTag:return cloneDataView(object,isDeep);case float32Tag:case float64Tag:case int8Tag:case int16Tag:case int32Tag:case uint8Tag:case uint8ClampedTag:case uint16Tag:case uint32Tag:return cloneTypedArray(object,isDeep);case mapTag:return new Ctor();case numberTag:case stringTag:return new Ctor(object);case regexpTag:return cloneRegExp(object);case setTag:return new Ctor();case symbolTag:return cloneSymbol(object);}}/**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */function insertWrapDetails(source,details){var length=details.length;if(!length){return source;}var lastIndex=length-1;details[lastIndex]=(length>1?'& ':'')+details[lastIndex];details=details.join(length>2?', ':' ');return source.replace(reWrapComment,'{\\n/* [wrapped with '+details+'] */\\n');}/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */function isFlattenable(value){return isArray(value)||isArguments(value)||!!(spreadableSymbol&&value&&value[spreadableSymbol]);}/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */function isIndex(value,length){var type=_typeof(value);length=length==null?MAX_SAFE_INTEGER:length;return!!length&&(type=='number'||type!='symbol'&&reIsUint.test(value))&&value>-1&&value%1==0&&value<length;}/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */function isIterateeCall(value,index,object){if(!isObject(object)){return false;}var type=_typeof(index);if(type=='number'?isArrayLike(object)&&isIndex(index,object.length):type=='string'&&index in object){return eq(object[index],value);}return false;}/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */function isKey(value,object){if(isArray(value)){return false;}var type=_typeof(value);if(type=='number'||type=='symbol'||type=='boolean'||value==null||isSymbol(value)){return true;}return reIsPlainProp.test(value)||!reIsDeepProp.test(value)||object!=null&&value in Object(object);}/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */function isKeyable(value){var type=_typeof(value);return type=='string'||type=='number'||type=='symbol'||type=='boolean'?value!=='__proto__':value===null;}/**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */function isLaziable(func){var funcName=getFuncName(func),other=lodash[funcName];if(typeof other!='function'||!(funcName in LazyWrapper.prototype)){return false;}if(func===other){return true;}var data=getData(other);return!!data&&func===data[0];}/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */function isMasked(func){return!!maskSrcKey&&maskSrcKey in func;}/**\n * Checks if `func` is capable of being masked.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n */var isMaskable=coreJsData?isFunction:stubFalse;/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */function isPrototype(value){var Ctor=value&&value.constructor,proto=typeof Ctor=='function'&&Ctor.prototype||objectProto;return value===proto;}/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */function isStrictComparable(value){return value===value&&!isObject(value);}/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */function matchesStrictComparable(key,srcValue){return function(object){if(object==null){return false;}return object[key]===srcValue&&(srcValue!==undefined||key in Object(object));};}/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */function memoizeCapped(func){var result=memoize(func,function(key){if(cache.size===MAX_MEMOIZE_SIZE){cache.clear();}return key;});var cache=result.cache;return result;}/**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */function mergeData(data,source){var bitmask=data[1],srcBitmask=source[1],newBitmask=bitmask|srcBitmask,isCommon=newBitmask<(WRAP_BIND_FLAG|WRAP_BIND_KEY_FLAG|WRAP_ARY_FLAG);var isCombo=srcBitmask==WRAP_ARY_FLAG&&bitmask==WRAP_CURRY_FLAG||srcBitmask==WRAP_ARY_FLAG&&bitmask==WRAP_REARG_FLAG&&data[7].length<=source[8]||srcBitmask==(WRAP_ARY_FLAG|WRAP_REARG_FLAG)&&source[7].length<=source[8]&&bitmask==WRAP_CURRY_FLAG;// Exit early if metadata can't be merged.\nif(!(isCommon||isCombo)){return data;}// Use source `thisArg` if available.\nif(srcBitmask&WRAP_BIND_FLAG){data[2]=source[2];// Set when currying a bound function.\nnewBitmask|=bitmask&WRAP_BIND_FLAG?0:WRAP_CURRY_BOUND_FLAG;}// Compose partial arguments.\nvar value=source[3];if(value){var partials=data[3];data[3]=partials?composeArgs(partials,value,source[4]):value;data[4]=partials?replaceHolders(data[3],PLACEHOLDER):source[4];}// Compose partial right arguments.\nvalue=source[5];if(value){partials=data[5];data[5]=partials?composeArgsRight(partials,value,source[6]):value;data[6]=partials?replaceHolders(data[5],PLACEHOLDER):source[6];}// Use source `argPos` if available.\nvalue=source[7];if(value){data[7]=value;}// Use source `ary` if it's smaller.\nif(srcBitmask&WRAP_ARY_FLAG){data[8]=data[8]==null?source[8]:nativeMin(data[8],source[8]);}// Use source `arity` if one is not provided.\nif(data[9]==null){data[9]=source[9];}// Use source `func` and merge bitmasks.\ndata[0]=source[0];data[1]=newBitmask;return data;}/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */function nativeKeysIn(object){var result=[];if(object!=null){for(var key in Object(object)){result.push(key);}}return result;}/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */function objectToString(value){return nativeObjectToString.call(value);}/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */function overRest(func,start,transform){start=nativeMax(start===undefined?func.length-1:start,0);return function(){var args=arguments,index=-1,length=nativeMax(args.length-start,0),array=Array(length);while(++index<length){array[index]=args[start+index];}index=-1;var otherArgs=Array(start+1);while(++index<start){otherArgs[index]=args[index];}otherArgs[start]=transform(array);return apply(func,this,otherArgs);};}/**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */function parent(object,path){return path.length<2?object:baseGet(object,baseSlice(path,0,-1));}/**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */function reorder(array,indexes){var arrLength=array.length,length=nativeMin(indexes.length,arrLength),oldArray=copyArray(array);while(length--){var index=indexes[length];array[length]=isIndex(index,arrLength)?oldArray[index]:undefined;}return array;}/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */function safeGet(object,key){if(key==='constructor'&&typeof object[key]==='function'){return;}if(key=='__proto__'){return;}return object[key];}/**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */var setData=shortOut(baseSetData);/**\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @returns {number|Object} Returns the timer id or timeout object.\n */var setTimeout=ctxSetTimeout||function(func,wait){return root.setTimeout(func,wait);};/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */var setToString=shortOut(baseSetToString);/**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */function setWrapToString(wrapper,reference,bitmask){var source=reference+'';return setToString(wrapper,insertWrapDetails(source,updateWrapDetails(getWrapDetails(source),bitmask)));}/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */function shortOut(func){var count=0,lastCalled=0;return function(){var stamp=nativeNow(),remaining=HOT_SPAN-(stamp-lastCalled);lastCalled=stamp;if(remaining>0){if(++count>=HOT_COUNT){return arguments[0];}}else{count=0;}return func.apply(undefined,arguments);};}/**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */function shuffleSelf(array,size){var index=-1,length=array.length,lastIndex=length-1;size=size===undefined?length:size;while(++index<size){var rand=baseRandom(index,lastIndex),value=array[rand];array[rand]=array[index];array[index]=value;}array.length=size;return array;}/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */var stringToPath=memoizeCapped(function(string){var result=[];if(string.charCodeAt(0)===46/* . */){result.push('');}string.replace(rePropName,function(match,number,quote,subString){result.push(quote?subString.replace(reEscapeChar,'$1'):number||match);});return result;});/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */function toKey(value){if(typeof value=='string'||isSymbol(value)){return value;}var result=value+'';return result=='0'&&1/value==-INFINITY?'-0':result;}/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */function toSource(func){if(func!=null){try{return funcToString.call(func);}catch(e){}try{return func+'';}catch(e){}}return'';}/**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */function updateWrapDetails(details,bitmask){arrayEach(wrapFlags,function(pair){var value='_.'+pair[0];if(bitmask&pair[1]&&!arrayIncludes(details,value)){details.push(value);}});return details.sort();}/**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */function wrapperClone(wrapper){if(wrapper instanceof LazyWrapper){return wrapper.clone();}var result=new LodashWrapper(wrapper.__wrapped__,wrapper.__chain__);result.__actions__=copyArray(wrapper.__actions__);result.__index__=wrapper.__index__;result.__values__=wrapper.__values__;return result;}/*------------------------------------------------------------------------*/ /**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */function chunk(array,size,guard){if(guard?isIterateeCall(array,size,guard):size===undefined){size=1;}else{size=nativeMax(toInteger(size),0);}var length=array==null?0:array.length;if(!length||size<1){return[];}var index=0,resIndex=0,result=Array(nativeCeil(length/size));while(index<length){result[resIndex++]=baseSlice(array,index,index+=size);}return result;}/**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */function compact(array){var index=-1,length=array==null?0:array.length,resIndex=0,result=[];while(++index<length){var value=array[index];if(value){result[resIndex++]=value;}}return result;}/**\n * Creates a new array concatenating `array` with any additional arrays\n * and/or values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to concatenate.\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var other = _.concat(array, 2, [3], [[4]]);\n *\n * console.log(other);\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */function concat(){var length=arguments.length;if(!length){return[];}var args=Array(length-1),array=arguments[0],index=length;while(index--){args[index-1]=arguments[index];}return arrayPush(isArray(array)?copyArray(array):[array],baseFlatten(args,1));}/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */var difference=baseRest(function(array,values){return isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,true)):[];});/**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */var differenceBy=baseRest(function(array,values){var iteratee=last(values);if(isArrayLikeObject(iteratee)){iteratee=undefined;}return isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,true),getIteratee(iteratee,2)):[];});/**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n *\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }]\n */var differenceWith=baseRest(function(array,values){var comparator=last(values);if(isArrayLikeObject(comparator)){comparator=undefined;}return isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,true),undefined,comparator):[];});/**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */function drop(array,n,guard){var length=array==null?0:array.length;if(!length){return[];}n=guard||n===undefined?1:toInteger(n);return baseSlice(array,n<0?0:n,length);}/**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */function dropRight(array,n,guard){var length=array==null?0:array.length;if(!length){return[];}n=guard||n===undefined?1:toInteger(n);n=length-n;return baseSlice(array,0,n<0?0:n);}/**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.dropRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropRightWhile(users, ['active', false]);\n * // => objects for ['barney']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropRightWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */function dropRightWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),true,true):[];}/**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.dropWhile(users, function(o) { return !o.active; });\n * // => objects for ['pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropWhile(users, ['active', false]);\n * // => objects for ['pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */function dropWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),true):[];}/**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8, 10], '*', 1, 3);\n * // => [4, '*', '*', 10]\n */function fill(array,value,start,end){var length=array==null?0:array.length;if(!length){return[];}if(start&&typeof start!='number'&&isIterateeCall(array,value,start)){start=0;end=length;}return baseFill(array,value,start,end);}/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */function findIndex(array,predicate,fromIndex){var length=array==null?0:array.length;if(!length){return-1;}var index=fromIndex==null?0:toInteger(fromIndex);if(index<0){index=nativeMax(length+index,0);}return baseFindIndex(array,getIteratee(predicate,3),index);}/**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */function findLastIndex(array,predicate,fromIndex){var length=array==null?0:array.length;if(!length){return-1;}var index=length-1;if(fromIndex!==undefined){index=toInteger(fromIndex);index=fromIndex<0?nativeMax(length+index,0):nativeMin(index,length-1);}return baseFindIndex(array,getIteratee(predicate,3),index,true);}/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */function flatten(array){var length=array==null?0:array.length;return length?baseFlatten(array,1):[];}/**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */function flattenDeep(array){var length=array==null?0:array.length;return length?baseFlatten(array,INFINITY):[];}/**\n * Recursively flatten `array` up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * var array = [1, [2, [3, [4]], 5]];\n *\n * _.flattenDepth(array, 1);\n * // => [1, 2, [3, [4]], 5]\n *\n * _.flattenDepth(array, 2);\n * // => [1, 2, 3, [4], 5]\n */function flattenDepth(array,depth){var length=array==null?0:array.length;if(!length){return[];}depth=depth===undefined?1:toInteger(depth);return baseFlatten(array,depth);}/**\n * The inverse of `_.toPairs`; this method returns an object composed\n * from key-value `pairs`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} pairs The key-value pairs.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.fromPairs([['a', 1], ['b', 2]]);\n * // => { 'a': 1, 'b': 2 }\n */function fromPairs(pairs){var index=-1,length=pairs==null?0:pairs.length,result={};while(++index<length){var pair=pairs[index];result[pair[0]]=pair[1];}return result;}/**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */function head(array){return array&&array.length?array[0]:undefined;}/**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */function indexOf(array,value,fromIndex){var length=array==null?0:array.length;if(!length){return-1;}var index=fromIndex==null?0:toInteger(fromIndex);if(index<0){index=nativeMax(length+index,0);}return baseIndexOf(array,value,index);}/**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */function initial(array){var length=array==null?0:array.length;return length?baseSlice(array,0,-1):[];}/**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */var intersection=baseRest(function(arrays){var mapped=arrayMap(arrays,castArrayLikeObject);return mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped):[];});/**\n * This method is like `_.intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [2.1]\n *\n * // The `_.property` iteratee shorthand.\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }]\n */var intersectionBy=baseRest(function(arrays){var iteratee=last(arrays),mapped=arrayMap(arrays,castArrayLikeObject);if(iteratee===last(mapped)){iteratee=undefined;}else{mapped.pop();}return mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped,getIteratee(iteratee,2)):[];});/**\n * This method is like `_.intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.intersectionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }]\n */var intersectionWith=baseRest(function(arrays){var comparator=last(arrays),mapped=arrayMap(arrays,castArrayLikeObject);comparator=typeof comparator=='function'?comparator:undefined;if(comparator){mapped.pop();}return mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped,undefined,comparator):[];});/**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=','] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join(['a', 'b', 'c'], '~');\n * // => 'a~b~c'\n */function join(array,separator){return array==null?'':nativeJoin.call(array,separator);}/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */function last(array){var length=array==null?0:array.length;return length?array[length-1]:undefined;}/**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // Search from the `fromIndex`.\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n */function lastIndexOf(array,value,fromIndex){var length=array==null?0:array.length;if(!length){return-1;}var index=length;if(fromIndex!==undefined){index=toInteger(fromIndex);index=index<0?nativeMax(length+index,0):nativeMin(index,length-1);}return value===value?strictLastIndexOf(array,value,index):baseFindIndex(array,baseIsNaN,index,true);}/**\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\n * element from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.11.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=0] The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n *\n * _.nth(array, 1);\n * // => 'b'\n *\n * _.nth(array, -2);\n * // => 'c';\n */function nth(array,n){return array&&array.length?baseNth(array,toInteger(n)):undefined;}/**\n * Removes all given values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n * to remove elements from an array by predicate.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pull(array, 'a', 'c');\n * console.log(array);\n * // => ['b', 'b']\n */var pull=baseRest(pullAll);/**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */function pullAll(array,values){return array&&array.length&&values&&values.length?basePullAll(array,values):array;}/**\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\n * invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The iteratee is invoked with one argument: (value).\n *\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n *\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n * console.log(array);\n * // => [{ 'x': 2 }]\n */function pullAllBy(array,values,iteratee){return array&&array.length&&values&&values.length?basePullAll(array,values,getIteratee(iteratee,2)):array;}/**\n * This method is like `_.pullAll` except that it accepts `comparator` which\n * is invoked to compare elements of `array` to `values`. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n *\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n * console.log(array);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n */function pullAllWith(array,values,comparator){return array&&array.length&&values&&values.length?basePullAll(array,values,undefined,comparator):array;}/**\n * Removes elements from `array` corresponding to `indexes` and returns an\n * array of removed elements.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n * var pulled = _.pullAt(array, [1, 3]);\n *\n * console.log(array);\n * // => ['a', 'c']\n *\n * console.log(pulled);\n * // => ['b', 'd']\n */var pullAt=flatRest(function(array,indexes){var length=array==null?0:array.length,result=baseAt(array,indexes);basePullAt(array,arrayMap(indexes,function(index){return isIndex(index,length)?+index:index;}).sort(compareAscending));return result;});/**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */function remove(array,predicate){var result=[];if(!(array&&array.length)){return result;}var index=-1,indexes=[],length=array.length;predicate=getIteratee(predicate,3);while(++index<length){var value=array[index];if(predicate(value,index,array)){result.push(value);indexes.push(index);}}basePullAt(array,indexes);return result;}/**\n * Reverses `array` so that the first element becomes the last, the second\n * element becomes the second to last, and so on.\n *\n * **Note:** This method mutates `array` and is based on\n * [`Array#reverse`](https://mdn.io/Array/reverse).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.reverse(array);\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */function reverse(array){return array==null?array:nativeReverse.call(array);}/**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n * returned.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */function slice(array,start,end){var length=array==null?0:array.length;if(!length){return[];}if(end&&typeof end!='number'&&isIterateeCall(array,start,end)){start=0;end=length;}else{start=start==null?0:toInteger(start);end=end===undefined?length:toInteger(end);}return baseSlice(array,start,end);}/**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */function sortedIndex(array,value){return baseSortedIndex(array,value);}/**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */function sortedIndexBy(array,value,iteratee){return baseSortedIndexBy(array,value,getIteratee(iteratee,2));}/**\n * This method is like `_.indexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n * // => 1\n */function sortedIndexOf(array,value){var length=array==null?0:array.length;if(length){var index=baseSortedIndex(array,value);if(index<length&&eq(array[index],value)){return index;}}return-1;}/**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n * // => 4\n */function sortedLastIndex(array,value){return baseSortedIndex(array,value,true);}/**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n * // => 1\n */function sortedLastIndexBy(array,value,iteratee){return baseSortedIndexBy(array,value,getIteratee(iteratee,2),true);}/**\n * This method is like `_.lastIndexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n * // => 3\n */function sortedLastIndexOf(array,value){var length=array==null?0:array.length;if(length){var index=baseSortedIndex(array,value,true)-1;if(eq(array[index],value)){return index;}}return-1;}/**\n * This method is like `_.uniq` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniq([1, 1, 2]);\n * // => [1, 2]\n */function sortedUniq(array){return array&&array.length?baseSortedUniq(array):[];}/**\n * This method is like `_.uniqBy` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n * // => [1.1, 2.3]\n */function sortedUniqBy(array,iteratee){return array&&array.length?baseSortedUniq(array,getIteratee(iteratee,2)):[];}/**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.tail([1, 2, 3]);\n * // => [2, 3]\n */function tail(array){var length=array==null?0:array.length;return length?baseSlice(array,1,length):[];}/**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */function take(array,n,guard){if(!(array&&array.length)){return[];}n=guard||n===undefined?1:toInteger(n);return baseSlice(array,0,n<0?0:n);}/**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */function takeRight(array,n,guard){var length=array==null?0:array.length;if(!length){return[];}n=guard||n===undefined?1:toInteger(n);n=length-n;return baseSlice(array,n<0?0:n,length);}/**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, ['active', false]);\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, 'active');\n * // => []\n */function takeRightWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),false,true):[];}/**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.takeWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeWhile(users, ['active', false]);\n * // => objects for ['barney', 'fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeWhile(users, 'active');\n * // => []\n */function takeWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3)):[];}/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */var union=baseRest(function(arrays){return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,true));});/**\n * This method is like `_.union` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which uniqueness is computed. Result values are chosen from the first\n * array in which the value occurs. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */var unionBy=baseRest(function(arrays){var iteratee=last(arrays);if(isArrayLikeObject(iteratee)){iteratee=undefined;}return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,true),getIteratee(iteratee,2));});/**\n * This method is like `_.union` except that it accepts `comparator` which\n * is invoked to compare elements of `arrays`. Result values are chosen from\n * the first array in which the value occurs. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.unionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */var unionWith=baseRest(function(arrays){var comparator=last(arrays);comparator=typeof comparator=='function'?comparator:undefined;return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,true),undefined,comparator);});/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */function uniq(array){return array&&array.length?baseUniq(array):[];}/**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */function uniqBy(array,iteratee){return array&&array.length?baseUniq(array,getIteratee(iteratee,2)):[];}/**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */function uniqWith(array,comparator){comparator=typeof comparator=='function'?comparator:undefined;return array&&array.length?baseUniq(array,undefined,comparator):[];}/**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */function unzip(array){if(!(array&&array.length)){return[];}var length=0;array=arrayFilter(array,function(group){if(isArrayLikeObject(group)){length=nativeMax(group.length,length);return true;}});return baseTimes(length,function(index){return arrayMap(array,baseProperty(index));});}/**\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * regrouped values.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */function unzipWith(array,iteratee){if(!(array&&array.length)){return[];}var result=unzip(array);if(iteratee==null){return result;}return arrayMap(result,function(group){return apply(iteratee,undefined,group);});}/**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */var without=baseRest(function(array,values){return isArrayLikeObject(array)?baseDifference(array,values):[];});/**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */var xor=baseRest(function(arrays){return baseXor(arrayFilter(arrays,isArrayLikeObject));});/**\n * This method is like `_.xor` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which by which they're compared. The order of result values is determined\n * by the order they occur in the arrays. The iteratee is invoked with one\n * argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2, 3.4]\n *\n * // The `_.property` iteratee shorthand.\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */var xorBy=baseRest(function(arrays){var iteratee=last(arrays);if(isArrayLikeObject(iteratee)){iteratee=undefined;}return baseXor(arrayFilter(arrays,isArrayLikeObject),getIteratee(iteratee,2));});/**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */var xorWith=baseRest(function(arrays){var comparator=last(arrays);comparator=typeof comparator=='function'?comparator:undefined;return baseXor(arrayFilter(arrays,isArrayLikeObject),undefined,comparator);});/**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */var zip=baseRest(unzip);/**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */function zipObject(props,values){return baseZipObject(props||[],values||[],assignValue);}/**\n * This method is like `_.zipObject` except that it supports property paths.\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n */function zipObjectDeep(props,values){return baseZipObject(props||[],values||[],baseSet);}/**\n * This method is like `_.zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * grouped values.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n * return a + b + c;\n * });\n * // => [111, 222]\n */var zipWith=baseRest(function(arrays){var length=arrays.length,iteratee=length>1?arrays[length-1]:undefined;iteratee=typeof iteratee=='function'?(arrays.pop(),iteratee):undefined;return unzipWith(arrays,iteratee);});/*------------------------------------------------------------------------*/ /**\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n * chain sequences enabled. The result of such sequences must be unwrapped\n * with `_#value`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Seq\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _\n * .chain(users)\n * .sortBy('age')\n * .map(function(o) {\n * return o.user + ' is ' + o.age;\n * })\n * .head()\n * .value();\n * // => 'pebbles is 1'\n */function chain(value){var result=lodash(value);result.__chain__=true;return result;}/**\n * This method invokes `interceptor` and returns `value`. The interceptor\n * is invoked with one argument; (value). The purpose of this method is to\n * \"tap into\" a method chain sequence in order to modify intermediate results.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * // Mutate input array.\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */function tap(value,interceptor){interceptor(value);return value;}/**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n * The purpose of this method is to \"pass thru\" values replacing intermediate\n * results in a method chain sequence.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(' abc ')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => ['abc']\n */function thru(value,interceptor){return interceptor(value);}/**\n * This method is the wrapper version of `_.at`.\n *\n * @name at\n * @memberOf _\n * @since 1.0.0\n * @category Seq\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _(object).at(['a[0].b.c', 'a[1]']).value();\n * // => [3, 4]\n */var wrapperAt=flatRest(function(paths){var length=paths.length,start=length?paths[0]:0,value=this.__wrapped__,interceptor=function interceptor(object){return baseAt(object,paths);};if(length>1||this.__actions__.length||!(value instanceof LazyWrapper)||!isIndex(start)){return this.thru(interceptor);}value=value.slice(start,+start+(length?1:0));value.__actions__.push({'func':thru,'args':[interceptor],'thisArg':undefined});return new LodashWrapper(value,this.__chain__).thru(function(array){if(length&&!array.length){array.push(undefined);}return array;});});/**\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n *\n * @name chain\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // A sequence without explicit chaining.\n * _(users).head();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // A sequence with explicit chaining.\n * _(users)\n * .chain()\n * .head()\n * .pick('user')\n * .value();\n * // => { 'user': 'barney' }\n */function wrapperChain(){return chain(this);}/**\n * Executes the chain sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */function wrapperCommit(){return new LodashWrapper(this.value(),this.__chain__);}/**\n * Gets the next value on a wrapped object following the\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n *\n * @name next\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the next iterator value.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 1 }\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 2 }\n *\n * wrapped.next();\n * // => { 'done': true, 'value': undefined }\n */function wrapperNext(){if(this.__values__===undefined){this.__values__=toArray(this.value());}var done=this.__index__>=this.__values__.length,value=done?undefined:this.__values__[this.__index__++];return{'done':done,'value':value};}/**\n * Enables the wrapper to be iterable.\n *\n * @name Symbol.iterator\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the wrapper object.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped[Symbol.iterator]() === wrapped;\n * // => true\n *\n * Array.from(wrapped);\n * // => [1, 2]\n */function wrapperToIterator(){return this;}/**\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @param {*} value The value to plant.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2]).map(square);\n * var other = wrapped.plant([3, 4]);\n *\n * other.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */function wrapperPlant(value){var result,parent=this;while(parent instanceof baseLodash){var clone=wrapperClone(parent);clone.__index__=0;clone.__values__=undefined;if(result){previous.__wrapped__=clone;}else{result=clone;}var previous=clone;parent=parent.__wrapped__;}previous.__wrapped__=value;return result;}/**\n * This method is the wrapper version of `_.reverse`.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */function wrapperReverse(){var value=this.__wrapped__;if(value instanceof LazyWrapper){var wrapped=value;if(this.__actions__.length){wrapped=new LazyWrapper(this);}wrapped=wrapped.reverse();wrapped.__actions__.push({'func':thru,'args':[reverse],'thisArg':undefined});return new LodashWrapper(wrapped,this.__chain__);}return this.thru(reverse);}/**\n * Executes the chain sequence to resolve the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @since 0.1.0\n * @alias toJSON, valueOf\n * @category Seq\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */function wrapperValue(){return baseWrapperValue(this.__wrapped__,this.__actions__);}/*------------------------------------------------------------------------*/ /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': 1, '6': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */var countBy=createAggregator(function(result,value,key){if(hasOwnProperty.call(result,key)){++result[key];}else{baseAssignValue(result,key,1);}});/**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */function every(collection,predicate,guard){var func=isArray(collection)?arrayEvery:baseEvery;if(guard&&isIterateeCall(collection,predicate,guard)){predicate=undefined;}return func(collection,getIteratee(predicate,3));}/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */function filter(collection,predicate){var func=isArray(collection)?arrayFilter:baseFilter;return func(collection,getIteratee(predicate,3));}/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */var find=createFind(findIndex);/**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */var findLast=createFind(findLastIndex);/**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */function flatMap(collection,iteratee){return baseFlatten(map(collection,iteratee),1);}/**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDeep([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */function flatMapDeep(collection,iteratee){return baseFlatten(map(collection,iteratee),INFINITY);}/**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDepth([1, 2], duplicate, 2);\n * // => [[1, 1], [2, 2]]\n */function flatMapDepth(collection,iteratee,depth){depth=depth===undefined?1:toInteger(depth);return baseFlatten(map(collection,iteratee),depth);}/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */function forEach(collection,iteratee){var func=isArray(collection)?arrayEach:baseEach;return func(collection,getIteratee(iteratee,3));}/**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @alias eachRight\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEach\n * @example\n *\n * _.forEachRight([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `2` then `1`.\n */function forEachRight(collection,iteratee){var func=isArray(collection)?arrayEachRight:baseEachRight;return func(collection,getIteratee(iteratee,3));}/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */var groupBy=createAggregator(function(result,value,key){if(hasOwnProperty.call(result,key)){result[key].push(value);}else{baseAssignValue(result,key,[value]);}});/**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */function includes(collection,value,fromIndex,guard){collection=isArrayLike(collection)?collection:values(collection);fromIndex=fromIndex&&!guard?toInteger(fromIndex):0;var length=collection.length;if(fromIndex<0){fromIndex=nativeMax(length+fromIndex,0);}return isString(collection)?fromIndex<=length&&collection.indexOf(value,fromIndex)>-1:!!length&&baseIndexOf(collection,value,fromIndex)>-1;}/**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */var invokeMap=baseRest(function(collection,path,args){var index=-1,isFunc=typeof path=='function',result=isArrayLike(collection)?Array(collection.length):[];baseEach(collection,function(value){result[++index]=isFunc?apply(path,value,args):baseInvoke(value,path,args);});return result;});/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n * return String.fromCharCode(o.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.keyBy(array, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n */var keyBy=createAggregator(function(result,value,key){baseAssignValue(result,key,value);});/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */function map(collection,iteratee){var func=isArray(collection)?arrayMap:baseMap;return func(collection,getIteratee(iteratee,3));}/**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */function orderBy(collection,iteratees,orders,guard){if(collection==null){return[];}if(!isArray(iteratees)){iteratees=iteratees==null?[]:[iteratees];}orders=guard?undefined:orders;if(!isArray(orders)){orders=orders==null?[]:[orders];}return baseOrderBy(collection,iteratees,orders);}/**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */var partition=createAggregator(function(result,value,key){result[key?0:1].push(value);},function(){return[[],[]];});/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */function reduce(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduce:baseReduce,initAccum=arguments.length<3;return func(collection,getIteratee(iteratee,4),accumulator,initAccum,baseEach);}/**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduce\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */function reduceRight(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduceRight:baseReduce,initAccum=arguments.length<3;return func(collection,getIteratee(iteratee,4),accumulator,initAccum,baseEachRight);}/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */function reject(collection,predicate){var func=isArray(collection)?arrayFilter:baseFilter;return func(collection,negate(getIteratee(predicate,3)));}/**\n * Gets a random element from `collection`.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n */function sample(collection){var func=isArray(collection)?arraySample:baseSample;return func(collection);}/**\n * Gets `n` random elements at unique keys from `collection` up to the\n * size of `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @param {number} [n=1] The number of elements to sample.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the random elements.\n * @example\n *\n * _.sampleSize([1, 2, 3], 2);\n * // => [3, 1]\n *\n * _.sampleSize([1, 2, 3], 4);\n * // => [2, 3, 1]\n */function sampleSize(collection,n,guard){if(guard?isIterateeCall(collection,n,guard):n===undefined){n=1;}else{n=toInteger(n);}var func=isArray(collection)?arraySampleSize:baseSampleSize;return func(collection,n);}/**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */function shuffle(collection){var func=isArray(collection)?arrayShuffle:baseShuffle;return func(collection);}/**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */function size(collection){if(collection==null){return 0;}if(isArrayLike(collection)){return isString(collection)?stringSize(collection):collection.length;}var tag=getTag(collection);if(tag==mapTag||tag==setTag){return collection.size;}return baseKeys(collection).length;}/**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */function some(collection,predicate,guard){var func=isArray(collection)?arraySome:baseSome;if(guard&&isIterateeCall(collection,predicate,guard)){predicate=undefined;}return func(collection,getIteratee(predicate,3));}/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */var sortBy=baseRest(function(collection,iteratees){if(collection==null){return[];}var length=iteratees.length;if(length>1&&isIterateeCall(collection,iteratees[0],iteratees[1])){iteratees=[];}else if(length>2&&isIterateeCall(iteratees[0],iteratees[1],iteratees[2])){iteratees=[iteratees[0]];}return baseOrderBy(collection,baseFlatten(iteratees,1),[]);});/*------------------------------------------------------------------------*/ /**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */var now=ctxNow||function(){return root.Date.now();};/*------------------------------------------------------------------------*/ /**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it's called `n` or more times.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => Logs 'done saving!' after the two async saves have completed.\n */function after(n,func){if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}n=toInteger(n);return function(){if(--n<1){return func.apply(this,arguments);}};}/**\n * Creates a function that invokes `func`, with up to `n` arguments,\n * ignoring any additional arguments.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */function ary(func,n,guard){n=guard?undefined:n;n=func&&n==null?func.length:n;return createWrap(func,WRAP_ARY_FLAG,undefined,undefined,undefined,undefined,n);}/**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery(element).on('click', _.before(5, addContactToList));\n * // => Allows adding up to 4 contacts to the list.\n */function before(n,func){var result;if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}n=toInteger(n);return function(){if(--n>0){result=func.apply(this,arguments);}if(n<=1){func=undefined;}return result;};}/**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and `partials` prepended to the arguments it receives.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * function greet(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */var bind=baseRest(function(func,thisArg,partials){var bitmask=WRAP_BIND_FLAG;if(partials.length){var holders=replaceHolders(partials,getHolder(bind));bitmask|=WRAP_PARTIAL_FLAG;}return createWrap(func,bitmask,thisArg,partials,holders);});/**\n * Creates a function that invokes the method at `object[key]` with `partials`\n * prepended to the arguments it receives.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist. See\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Function\n * @param {Object} object The object to invoke the method on.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'user': 'fred',\n * 'greet': function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */var bindKey=baseRest(function(object,key,partials){var bitmask=WRAP_BIND_FLAG|WRAP_BIND_KEY_FLAG;if(partials.length){var holders=replaceHolders(partials,getHolder(bindKey));bitmask|=WRAP_PARTIAL_FLAG;}return createWrap(key,bitmask,object,partials,holders);});/**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */function curry(func,arity,guard){arity=guard?undefined:arity;var result=createWrap(func,WRAP_CURRY_FLAG,undefined,undefined,undefined,undefined,undefined,arity);result.placeholder=curry.placeholder;return result;}/**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */function curryRight(func,arity,guard){arity=guard?undefined:arity;var result=createWrap(func,WRAP_CURRY_RIGHT_FLAG,undefined,undefined,undefined,undefined,undefined,arity);result.placeholder=curryRight.placeholder;return result;}/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */function debounce(func,wait,options){var lastArgs,lastThis,maxWait,result,timerId,lastCallTime,lastInvokeTime=0,leading=false,maxing=false,trailing=true;if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}wait=toNumber(wait)||0;if(isObject(options)){leading=!!options.leading;maxing='maxWait'in options;maxWait=maxing?nativeMax(toNumber(options.maxWait)||0,wait):maxWait;trailing='trailing'in options?!!options.trailing:trailing;}function invokeFunc(time){var args=lastArgs,thisArg=lastThis;lastArgs=lastThis=undefined;lastInvokeTime=time;result=func.apply(thisArg,args);return result;}function leadingEdge(time){// Reset any `maxWait` timer.\nlastInvokeTime=time;// Start the timer for the trailing edge.\ntimerId=setTimeout(timerExpired,wait);// Invoke the leading edge.\nreturn leading?invokeFunc(time):result;}function remainingWait(time){var timeSinceLastCall=time-lastCallTime,timeSinceLastInvoke=time-lastInvokeTime,timeWaiting=wait-timeSinceLastCall;return maxing?nativeMin(timeWaiting,maxWait-timeSinceLastInvoke):timeWaiting;}function shouldInvoke(time){var timeSinceLastCall=time-lastCallTime,timeSinceLastInvoke=time-lastInvokeTime;// Either this is the first call, activity has stopped and we're at the\n// trailing edge, the system time has gone backwards and we're treating\n// it as the trailing edge, or we've hit the `maxWait` limit.\nreturn lastCallTime===undefined||timeSinceLastCall>=wait||timeSinceLastCall<0||maxing&&timeSinceLastInvoke>=maxWait;}function timerExpired(){var time=now();if(shouldInvoke(time)){return trailingEdge(time);}// Restart the timer.\ntimerId=setTimeout(timerExpired,remainingWait(time));}function trailingEdge(time){timerId=undefined;// Only invoke if we have `lastArgs` which means `func` has been\n// debounced at least once.\nif(trailing&&lastArgs){return invokeFunc(time);}lastArgs=lastThis=undefined;return result;}function cancel(){if(timerId!==undefined){clearTimeout(timerId);}lastInvokeTime=0;lastArgs=lastCallTime=lastThis=timerId=undefined;}function flush(){return timerId===undefined?result:trailingEdge(now());}function debounced(){var time=now(),isInvoking=shouldInvoke(time);lastArgs=arguments;lastThis=this;lastCallTime=time;if(isInvoking){if(timerId===undefined){return leadingEdge(lastCallTime);}if(maxing){// Handle invocations in a tight loop.\nclearTimeout(timerId);timerId=setTimeout(timerExpired,wait);return invokeFunc(lastCallTime);}}if(timerId===undefined){timerId=setTimeout(timerExpired,wait);}return result;}debounced.cancel=cancel;debounced.flush=flush;return debounced;}/**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // => Logs 'deferred' after one millisecond.\n */var defer=baseRest(function(func,args){return baseDelay(func,1,args);});/**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, 'later');\n * // => Logs 'later' after one second.\n */var delay=baseRest(function(func,wait,args){return baseDelay(func,toNumber(wait)||0,args);});/**\n * Creates a function that invokes `func` with arguments reversed.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to flip arguments for.\n * @returns {Function} Returns the new flipped function.\n * @example\n *\n * var flipped = _.flip(function() {\n * return _.toArray(arguments);\n * });\n *\n * flipped('a', 'b', 'c', 'd');\n * // => ['d', 'c', 'b', 'a']\n */function flip(func){return createWrap(func,WRAP_FLIP_FLAG);}/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */function memoize(func,resolver){if(typeof func!='function'||resolver!=null&&typeof resolver!='function'){throw new TypeError(FUNC_ERROR_TEXT);}var memoized=function memoized(){var args=arguments,key=resolver?resolver.apply(this,args):args[0],cache=memoized.cache;if(cache.has(key)){return cache.get(key);}var result=func.apply(this,args);memoized.cache=cache.set(key,result)||cache;return result;};memoized.cache=new(memoize.Cache||MapCache)();return memoized;}// Expose `MapCache`.\nmemoize.Cache=MapCache;/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */function negate(predicate){if(typeof predicate!='function'){throw new TypeError(FUNC_ERROR_TEXT);}return function(){var args=arguments;switch(args.length){case 0:return!predicate.call(this);case 1:return!predicate.call(this,args[0]);case 2:return!predicate.call(this,args[0],args[1]);case 3:return!predicate.call(this,args[0],args[1],args[2]);}return!predicate.apply(this,args);};}/**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */function once(func){return before(2,func);}/**\n * Creates a function that invokes `func` with its arguments transformed.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms=[_.identity]]\n * The argument transforms.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var func = _.overArgs(function(x, y) {\n * return [x, y];\n * }, [square, doubled]);\n *\n * func(9, 3);\n * // => [81, 6]\n *\n * func(10, 5);\n * // => [100, 10]\n */var overArgs=castRest(function(func,transforms){transforms=transforms.length==1&&isArray(transforms[0])?arrayMap(transforms[0],baseUnary(getIteratee())):arrayMap(baseFlatten(transforms,1),baseUnary(getIteratee()));var funcsLength=transforms.length;return baseRest(function(args){var index=-1,length=nativeMin(args.length,funcsLength);while(++index<length){args[index]=transforms[index].call(this,args[index]);}return apply(func,this,args);});});/**\n * Creates a function that invokes `func` with `partials` prepended to the\n * arguments it receives. This method is like `_.bind` except it does **not**\n * alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 0.2.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */var partial=baseRest(function(func,partials){var holders=replaceHolders(partials,getHolder(partial));return createWrap(func,WRAP_PARTIAL_FLAG,undefined,partials,holders);});/**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to the arguments it receives.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // Partially applied with placeholders.\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */var partialRight=baseRest(function(func,partials){var holders=replaceHolders(partials,getHolder(partialRight));return createWrap(func,WRAP_PARTIAL_RIGHT_FLAG,undefined,partials,holders);});/**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified `indexes` where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, [2, 0, 1]);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n */var rearg=flatRest(function(func,indexes){return createWrap(func,WRAP_REARG_FLAG,undefined,undefined,undefined,indexes);});/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */function rest(func,start){if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}start=start===undefined?start:toInteger(start);return baseRest(func,start);}/**\n * Creates a function that invokes `func` with the `this` binding of the\n * create function and an array of arguments much like\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n *\n * **Note:** This method is based on the\n * [spread operator](https://mdn.io/spread_operator).\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @param {number} [start=0] The start position of the spread.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */function spread(func,start){if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}start=start==null?0:nativeMax(toInteger(start),0);return baseRest(function(args){var array=args[start],otherArgs=castSlice(args,0,start);if(array){arrayPush(otherArgs,array);}return apply(func,this,otherArgs);});}/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */function throttle(func,wait,options){var leading=true,trailing=true;if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}if(isObject(options)){leading='leading'in options?!!options.leading:leading;trailing='trailing'in options?!!options.trailing:trailing;}return debounce(func,wait,{'leading':leading,'maxWait':wait,'trailing':trailing});}/**\n * Creates a function that accepts up to one argument, ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.unary(parseInt));\n * // => [6, 8, 10]\n */function unary(func){return ary(func,1);}/**\n * Creates a function that provides `value` to `wrapper` as its first\n * argument. Any additional arguments provided to the function are appended\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n * binding of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} [wrapper=identity] The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '<p>' + func(text) + '</p>';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '<p>fred, barney, &amp; pebbles</p>'\n */function wrap(value,wrapper){return partial(castFunction(wrapper),value);}/*------------------------------------------------------------------------*/ /**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */function castArray(){if(!arguments.length){return[];}var value=arguments[0];return isArray(value)?value:[value];}/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */function clone(value){return baseClone(value,CLONE_SYMBOLS_FLAG);}/**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 0\n */function cloneWith(value,customizer){customizer=typeof customizer=='function'?customizer:undefined;return baseClone(value,CLONE_SYMBOLS_FLAG,customizer);}/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */function cloneDeep(value){return baseClone(value,CLONE_DEEP_FLAG|CLONE_SYMBOLS_FLAG);}/**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */function cloneDeepWith(value,customizer){customizer=typeof customizer=='function'?customizer:undefined;return baseClone(value,CLONE_DEEP_FLAG|CLONE_SYMBOLS_FLAG,customizer);}/**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */function conformsTo(object,source){return source==null||baseConformsTo(object,source,keys(source));}/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */function eq(value,other){return value===other||value!==value&&other!==other;}/**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */var gt=createRelationalOperation(baseGt);/**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n * `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */var gte=createRelationalOperation(function(value,other){return value>=other;});/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */var isArguments=baseIsArguments(function(){return arguments;}())?baseIsArguments:function(value){return isObjectLike(value)&&hasOwnProperty.call(value,'callee')&&!propertyIsEnumerable.call(value,'callee');};/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */var isArray=Array.isArray;/**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */var isArrayBuffer=nodeIsArrayBuffer?baseUnary(nodeIsArrayBuffer):baseIsArrayBuffer;/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */function isArrayLike(value){return value!=null&&isLength(value.length)&&!isFunction(value);}/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */function isArrayLikeObject(value){return isObjectLike(value)&&isArrayLike(value);}/**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */function isBoolean(value){return value===true||value===false||isObjectLike(value)&&baseGetTag(value)==boolTag;}/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */var isBuffer=nativeIsBuffer||stubFalse;/**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */var isDate=nodeIsDate?baseUnary(nodeIsDate):baseIsDate;/**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('<body>');\n * // => false\n */function isElement(value){return isObjectLike(value)&&value.nodeType===1&&!isPlainObject(value);}/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */function isEmpty(value){if(value==null){return true;}if(isArrayLike(value)&&(isArray(value)||typeof value=='string'||typeof value.splice=='function'||isBuffer(value)||isTypedArray(value)||isArguments(value))){return!value.length;}var tag=getTag(value);if(tag==mapTag||tag==setTag){return!value.size;}if(isPrototype(value)){return!baseKeys(value).length;}for(var key in value){if(hasOwnProperty.call(value,key)){return false;}}return true;}/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */function isEqual(value,other){return baseIsEqual(value,other);}/**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */function isEqualWith(value,other,customizer){customizer=typeof customizer=='function'?customizer:undefined;var result=customizer?customizer(value,other):undefined;return result===undefined?baseIsEqual(value,other,undefined,customizer):!!result;}/**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */function isError(value){if(!isObjectLike(value)){return false;}var tag=baseGetTag(value);return tag==errorTag||tag==domExcTag||typeof value.message=='string'&&typeof value.name=='string'&&!isPlainObject(value);}/**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */function isFinite(value){return typeof value=='number'&&nativeIsFinite(value);}/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */function isFunction(value){if(!isObject(value)){return false;}// The use of `Object#toString` avoids issues with the `typeof` operator\n// in Safari 9 which returns 'object' for typed arrays and other constructors.\nvar tag=baseGetTag(value);return tag==funcTag||tag==genTag||tag==asyncTag||tag==proxyTag;}/**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */function isInteger(value){return typeof value=='number'&&value==toInteger(value);}/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */function isLength(value){return typeof value=='number'&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER;}/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */function isObject(value){var type=_typeof(value);return value!=null&&(type=='object'||type=='function');}/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */function isObjectLike(value){return value!=null&&_typeof(value)=='object';}/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */var isMap=nodeIsMap?baseUnary(nodeIsMap):baseIsMap;/**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.isMatch(object, { 'b': 2 });\n * // => true\n *\n * _.isMatch(object, { 'b': 1 });\n * // => false\n */function isMatch(object,source){return object===source||baseIsMatch(object,source,getMatchData(source));}/**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\n * return true;\n * }\n * }\n *\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */function isMatchWith(object,source,customizer){customizer=typeof customizer=='function'?customizer:undefined;return baseIsMatch(object,source,getMatchData(source),customizer);}/**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */function isNaN(value){// An `NaN` primitive is the only value that is not equal to itself.\n// Perform the `toStringTag` check first to avoid errors with some\n// ActiveX objects in IE.\nreturn isNumber(value)&&value!=+value;}/**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can't reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we're left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */function isNative(value){if(isMaskable(value)){throw new Error(CORE_ERROR_TEXT);}return baseIsNative(value);}/**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */function isNull(value){return value===null;}/**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */function isNil(value){return value==null;}/**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */function isNumber(value){return typeof value=='number'||isObjectLike(value)&&baseGetTag(value)==numberTag;}/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */function isPlainObject(value){if(!isObjectLike(value)||baseGetTag(value)!=objectTag){return false;}var proto=getPrototype(value);if(proto===null){return true;}var Ctor=hasOwnProperty.call(proto,'constructor')&&proto.constructor;return typeof Ctor=='function'&&Ctor instanceof Ctor&&funcToString.call(Ctor)==objectCtorString;}/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */var isRegExp=nodeIsRegExp?baseUnary(nodeIsRegExp):baseIsRegExp;/**\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n * double precision number which isn't the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger('3');\n * // => false\n */function isSafeInteger(value){return isInteger(value)&&value>=-MAX_SAFE_INTEGER&&value<=MAX_SAFE_INTEGER;}/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */var isSet=nodeIsSet?baseUnary(nodeIsSet):baseIsSet;/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */function isString(value){return typeof value=='string'||!isArray(value)&&isObjectLike(value)&&baseGetTag(value)==stringTag;}/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */function isSymbol(value){return _typeof(value)=='symbol'||isObjectLike(value)&&baseGetTag(value)==symbolTag;}/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */var isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray;/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */function isUndefined(value){return value===undefined;}/**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */function isWeakMap(value){return isObjectLike(value)&&getTag(value)==weakMapTag;}/**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */function isWeakSet(value){return isObjectLike(value)&&baseGetTag(value)==weakSetTag;}/**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */var lt=createRelationalOperation(baseLt);/**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n * `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */var lte=createRelationalOperation(function(value,other){return value<=other;});/**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */function toArray(value){if(!value){return[];}if(isArrayLike(value)){return isString(value)?stringToArray(value):copyArray(value);}if(symIterator&&value[symIterator]){return iteratorToArray(value[symIterator]());}var tag=getTag(value),func=tag==mapTag?mapToArray:tag==setTag?setToArray:values;return func(value);}/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */function toFinite(value){if(!value){return value===0?value:0;}value=toNumber(value);if(value===INFINITY||value===-INFINITY){var sign=value<0?-1:1;return sign*MAX_INTEGER;}return value===value?value:0;}/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */function toInteger(value){var result=toFinite(value),remainder=result%1;return result===result?remainder?result-remainder:result:0;}/**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength('3.2');\n * // => 3\n */function toLength(value){return value?baseClamp(toInteger(value),0,MAX_ARRAY_LENGTH):0;}/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */function toNumber(value){if(typeof value=='number'){return value;}if(isSymbol(value)){return NAN;}if(isObject(value)){var other=typeof value.valueOf=='function'?value.valueOf():value;value=isObject(other)?other+'':other;}if(typeof value!='string'){return value===0?value:+value;}value=value.replace(reTrim,'');var isBinary=reIsBinary.test(value);return isBinary||reIsOctal.test(value)?freeParseInt(value.slice(2),isBinary?2:8):reIsBadHex.test(value)?NAN:+value;}/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */function toPlainObject(value){return copyObject(value,keysIn(value));}/**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger('3.2');\n * // => 3\n */function toSafeInteger(value){return value?baseClamp(toInteger(value),-MAX_SAFE_INTEGER,MAX_SAFE_INTEGER):value===0?value:0;}/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */function toString(value){return value==null?'':baseToString(value);}/*------------------------------------------------------------------------*/ /**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */var assign=createAssigner(function(object,source){if(isPrototype(source)||isArrayLike(source)){copyObject(source,keys(source),object);return;}for(var key in source){if(hasOwnProperty.call(source,key)){assignValue(object,key,source[key]);}}});/**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */var assignIn=createAssigner(function(object,source){copyObject(source,keysIn(source),object);});/**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */var assignInWith=createAssigner(function(object,source,srcIndex,customizer){copyObject(source,keysIn(source),object,customizer);});/**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */var assignWith=createAssigner(function(object,source,srcIndex,customizer){copyObject(source,keys(source),object,customizer);});/**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _.at(object, ['a[0].b.c', 'a[1]']);\n * // => [3, 4]\n */var at=flatRest(baseAt);/**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */function create(prototype,properties){var result=baseCreate(prototype);return properties==null?result:baseAssign(result,properties);}/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */var defaults=baseRest(function(object,sources){object=Object(object);var index=-1;var length=sources.length;var guard=length>2?sources[2]:undefined;if(guard&&isIterateeCall(sources[0],sources[1],guard)){length=1;}while(++index<length){var source=sources[index];var props=keysIn(source);var propsIndex=-1;var propsLength=props.length;while(++propsIndex<propsLength){var key=props[propsIndex];var value=object[key];if(value===undefined||eq(value,objectProto[key])&&!hasOwnProperty.call(object,key)){object[key]=source[key];}}}return object;});/**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n * // => { 'a': { 'b': 2, 'c': 3 } }\n */var defaultsDeep=baseRest(function(args){args.push(undefined,customDefaultsMerge);return apply(mergeWith,undefined,args);});/**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, 'active');\n * // => 'barney'\n */function findKey(object,predicate){return baseFindKey(object,getIteratee(predicate,3),baseForOwn);}/**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */function findLastKey(object,predicate){return baseFindKey(object,getIteratee(predicate,3),baseForOwnRight);}/**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */function forIn(object,iteratee){return object==null?object:baseFor(object,getIteratee(iteratee,3),keysIn);}/**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n */function forInRight(object,iteratee){return object==null?object:baseForRight(object,getIteratee(iteratee,3),keysIn);}/**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */function forOwn(object,iteratee){return object&&baseForOwn(object,getIteratee(iteratee,3));}/**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n */function forOwnRight(object,iteratee){return object&&baseForOwnRight(object,getIteratee(iteratee,3));}/**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functions(new Foo);\n * // => ['a', 'b']\n */function functions(object){return object==null?[]:baseFunctions(object,keys(object));}/**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functionsIn(new Foo);\n * // => ['a', 'b', 'c']\n */function functionsIn(object){return object==null?[]:baseFunctions(object,keysIn(object));}/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */function get(object,path,defaultValue){var result=object==null?undefined:baseGet(object,path);return result===undefined?defaultValue:result;}/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */function has(object,path){return object!=null&&hasPath(object,path,baseHas);}/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */function hasIn(object,path){return object!=null&&hasPath(object,path,baseHasIn);}/**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */var invert=createInverter(function(result,value,key){if(value!=null&&typeof value.toString!='function'){value=nativeObjectToString.call(value);}result[value]=key;},constant(identity));/**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invertBy(object);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n *\n * _.invertBy(object, function(value) {\n * return 'group' + value;\n * });\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n */var invertBy=createInverter(function(result,value,key){if(value!=null&&typeof value.toString!='function'){value=nativeObjectToString.call(value);}if(hasOwnProperty.call(result,value)){result[value].push(key);}else{result[value]=[key];}},getIteratee);/**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n * // => [2, 3]\n */var invoke=baseRest(baseInvoke);/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */function keys(object){return isArrayLike(object)?arrayLikeKeys(object):baseKeys(object);}/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */function keysIn(object){return isArrayLike(object)?arrayLikeKeys(object,true):baseKeysIn(object);}/**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */function mapKeys(object,iteratee){var result={};iteratee=getIteratee(iteratee,3);baseForOwn(object,function(value,key,object){baseAssignValue(result,iteratee(value,key,object),value);});return result;}/**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */function mapValues(object,iteratee){var result={};iteratee=getIteratee(iteratee,3);baseForOwn(object,function(value,key,object){baseAssignValue(result,key,iteratee(value,key,object));});return result;}/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */var merge=createAssigner(function(object,source,srcIndex){baseMerge(object,source,srcIndex);});/**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */var mergeWith=createAssigner(function(object,source,srcIndex,customizer){baseMerge(object,source,srcIndex,customizer);});/**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */var omit=flatRest(function(object,paths){var result={};if(object==null){return result;}var isDeep=false;paths=arrayMap(paths,function(path){path=castPath(path,object);isDeep||(isDeep=path.length>1);return path;});copyObject(object,getAllKeysIn(object),result);if(isDeep){result=baseClone(result,CLONE_DEEP_FLAG|CLONE_FLAT_FLAG|CLONE_SYMBOLS_FLAG,customOmitClone);}var length=paths.length;while(length--){baseUnset(result,paths[length]);}return result;});/**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn't return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { 'b': '2' }\n */function omitBy(object,predicate){return pickBy(object,negate(getIteratee(predicate)));}/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */var pick=flatRest(function(object,paths){return object==null?{}:basePick(object,paths);});/**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */function pickBy(object,predicate){if(object==null){return{};}var props=arrayMap(getAllKeysIn(object),function(prop){return[prop];});predicate=getIteratee(predicate);return basePickBy(object,props,function(value,path){return predicate(value,path[0]);});}/**\n * This method is like `_.get` except that if the resolved value is a\n * function it's invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a[0].b.c3', 'default');\n * // => 'default'\n *\n * _.result(object, 'a[0].b.c3', _.constant('default'));\n * // => 'default'\n */function result(object,path,defaultValue){path=castPath(path,object);var index=-1,length=path.length;// Ensure the loop is entered when path is empty.\nif(!length){length=1;object=undefined;}while(++index<length){var value=object==null?undefined:object[toKey(path[index])];if(value===undefined){index=length;value=defaultValue;}object=isFunction(value)?value.call(object):value;}return object;}/**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */function set(object,path,value){return object==null?object:baseSet(object,path,value);}/**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, '[0][1]', 'a', Object);\n * // => { '0': { '1': 'a' } }\n */function setWith(object,path,value,customizer){customizer=typeof customizer=='function'?customizer:undefined;return object==null?object:baseSet(object,path,value,customizer);}/**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n */var toPairs=createToPairs(keys);/**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */var toPairsIn=createToPairs(keysIn);/**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */function transform(object,iteratee,accumulator){var isArr=isArray(object),isArrLike=isArr||isBuffer(object)||isTypedArray(object);iteratee=getIteratee(iteratee,4);if(accumulator==null){var Ctor=object&&object.constructor;if(isArrLike){accumulator=isArr?new Ctor():[];}else if(isObject(object)){accumulator=isFunction(Ctor)?baseCreate(getPrototype(object)):{};}else{accumulator={};}}(isArrLike?arrayEach:baseForOwn)(object,function(value,index,object){return iteratee(accumulator,value,index,object);});return accumulator;}/**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */function unset(object,path){return object==null?true:baseUnset(object,path);}/**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */function update(object,path,updater){return object==null?object:baseUpdate(object,path,castFunction(updater));}/**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n * // => { '0': { '1': 'a' } }\n */function updateWith(object,path,updater,customizer){customizer=typeof customizer=='function'?customizer:undefined;return object==null?object:baseUpdate(object,path,castFunction(updater),customizer);}/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */function values(object){return object==null?[]:baseValues(object,keys(object));}/**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */function valuesIn(object){return object==null?[]:baseValues(object,keysIn(object));}/*------------------------------------------------------------------------*/ /**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */function clamp(number,lower,upper){if(upper===undefined){upper=lower;lower=undefined;}if(upper!==undefined){upper=toNumber(upper);upper=upper===upper?upper:0;}if(lower!==undefined){lower=toNumber(lower);lower=lower===lower?lower:0;}return baseClamp(toNumber(number),lower,upper);}/**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */function inRange(number,start,end){start=toFinite(start);if(end===undefined){end=start;start=0;}else{end=toFinite(end);}number=toNumber(number);return baseInRange(number,start,end);}/**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */function random(lower,upper,floating){if(floating&&typeof floating!='boolean'&&isIterateeCall(lower,upper,floating)){upper=floating=undefined;}if(floating===undefined){if(typeof upper=='boolean'){floating=upper;upper=undefined;}else if(typeof lower=='boolean'){floating=lower;lower=undefined;}}if(lower===undefined&&upper===undefined){lower=0;upper=1;}else{lower=toFinite(lower);if(upper===undefined){upper=lower;lower=0;}else{upper=toFinite(upper);}}if(lower>upper){var temp=lower;lower=upper;upper=temp;}if(floating||lower%1||upper%1){var rand=nativeRandom();return nativeMin(lower+rand*(upper-lower+freeParseFloat('1e-'+((rand+'').length-1))),upper);}return baseRandom(lower,upper);}/*------------------------------------------------------------------------*/ /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */var camelCase=createCompounder(function(result,word,index){word=word.toLowerCase();return result+(index?capitalize(word):word);});/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */function capitalize(string){return upperFirst(toString(string).toLowerCase());}/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */function deburr(string){string=toString(string);return string&&string.replace(reLatin,deburrLetter).replace(reComboMark,'');}/**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n * else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */function endsWith(string,target,position){string=toString(string);target=baseToString(target);var length=string.length;position=position===undefined?length:baseClamp(toInteger(position),0,length);var end=position;position-=target.length;return position>=0&&string.slice(position,end)==target;}/**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, &amp; pebbles'\n */function escape(string){string=toString(string);return string&&reHasUnescapedHtml.test(string)?string.replace(reUnescapedHtml,escapeHtmlChar):string;}/**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */function escapeRegExp(string){string=toString(string);return string&&reHasRegExpChar.test(string)?string.replace(reRegExpChar,'\\\\$&'):string;}/**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__FOO_BAR__');\n * // => 'foo-bar'\n */var kebabCase=createCompounder(function(result,word,index){return result+(index?'-':'')+word.toLowerCase();});/**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */var lowerCase=createCompounder(function(result,word,index){return result+(index?' ':'')+word.toLowerCase();});/**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */var lowerFirst=createCaseFirst('toLowerCase');/**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */function pad(string,length,chars){string=toString(string);length=toInteger(length);var strLength=length?stringSize(string):0;if(!length||strLength>=length){return string;}var mid=(length-strLength)/2;return createPadding(nativeFloor(mid),chars)+string+createPadding(nativeCeil(mid),chars);}/**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */function padEnd(string,length,chars){string=toString(string);length=toInteger(length);var strLength=length?stringSize(string):0;return length&&strLength<length?string+createPadding(length-strLength,chars):string;}/**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padStart('abc', 6);\n * // => ' abc'\n *\n * _.padStart('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padStart('abc', 3);\n * // => 'abc'\n */function padStart(string,length,chars){string=toString(string);length=toInteger(length);var strLength=length?stringSize(string):0;return length&&strLength<length?createPadding(length-strLength,chars)+string:string;}/**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */function parseInt(string,radix,guard){if(guard||radix==null){radix=0;}else if(radix){radix=+radix;}return nativeParseInt(toString(string).replace(reTrimStart,''),radix||0);}/**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */function repeat(string,n,guard){if(guard?isIterateeCall(string,n,guard):n===undefined){n=1;}else{n=toInteger(n);}return baseRepeat(toString(string),n);}/**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */function replace(){var args=arguments,string=toString(args[0]);return args.length<3?string:string.replace(args[1],args[2]);}/**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--FOO-BAR--');\n * // => 'foo_bar'\n */var snakeCase=createCompounder(function(result,word,index){return result+(index?'_':'')+word.toLowerCase();});/**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split('a-b-c', '-', 2);\n * // => ['a', 'b']\n */function split(string,separator,limit){if(limit&&typeof limit!='number'&&isIterateeCall(string,separator,limit)){separator=limit=undefined;}limit=limit===undefined?MAX_ARRAY_LENGTH:limit>>>0;if(!limit){return[];}string=toString(string);if(string&&(typeof separator=='string'||separator!=null&&!isRegExp(separator))){separator=baseToString(separator);if(!separator&&hasUnicode(string)){return castSlice(stringToArray(string),0,limit);}}return string.split(separator,limit);}/**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */var startCase=createCompounder(function(result,word,index){return result+(index?' ':'')+upperFirst(word);});/**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n * else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */function startsWith(string,target,position){string=toString(string);position=position==null?0:baseClamp(toInteger(position),0,string.length);target=baseToString(target);return string.slice(position,position+target.length)==target;}/**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<b><%- value %></b>');\n * compiled({ 'value': '<script>' });\n * // => '<b>&lt;script&gt;</b>'\n *\n * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the internal `print` function in \"evaluate\" delimiters.\n * var compiled = _.template('<% print(\"hello \" + user); %>!');\n * compiled({ 'user': 'barney' });\n * // => 'hello barney!'\n *\n * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n * // Disable support by replacing the \"interpolate\" delimiter.\n * var compiled = _.template('hello ${ user }!');\n * compiled({ 'user': 'pebbles' });\n * // => 'hello pebbles!'\n *\n * // Use backslashes to treat delimiters as plain text.\n * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n * compiled({ 'value': 'ignored' });\n * // => '<%- value %>'\n *\n * // Use the `imports` option to import `jQuery` as `jq`.\n * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n * compiled(data);\n * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n *\n * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n * compiled.source;\n * // => function(data) {\n * // var __t, __p = '';\n * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n * // return __p;\n * // }\n *\n * // Use custom template delimiters.\n * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n * var compiled = _.template('hello {{ user }}!');\n * compiled({ 'user': 'mustache' });\n * // => 'hello mustache!'\n *\n * // Use the `source` property to inline compiled templates for meaningful\n * // line numbers in error messages and stack traces.\n * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n * var JST = {\\\n * \"main\": ' + _.template(mainText).source + '\\\n * };\\\n * ');\n */function template(string,options,guard){// Based on John Resig's `tmpl` implementation\n// (http://ejohn.org/blog/javascript-micro-templating/)\n// and Laura Doktorova's doT.js (https://github.com/olado/doT).\nvar settings=lodash.templateSettings;if(guard&&isIterateeCall(string,options,guard)){options=undefined;}string=toString(string);options=assignInWith({},options,settings,customDefaultsAssignIn);var imports=assignInWith({},options.imports,settings.imports,customDefaultsAssignIn),importsKeys=keys(imports),importsValues=baseValues(imports,importsKeys);var isEscaping,isEvaluating,index=0,interpolate=options.interpolate||reNoMatch,source=\"__p += '\";// Compile the regexp to match each delimiter.\nvar reDelimiters=RegExp((options.escape||reNoMatch).source+'|'+interpolate.source+'|'+(interpolate===reInterpolate?reEsTemplate:reNoMatch).source+'|'+(options.evaluate||reNoMatch).source+'|$','g');// Use a sourceURL for easier debugging.\n// The sourceURL gets injected into the source that's eval-ed, so be careful\n// to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n// and escape the comment, thus injecting code that gets evaled.\nvar sourceURL='//# sourceURL='+(hasOwnProperty.call(options,'sourceURL')?(options.sourceURL+'').replace(/\\s/g,' '):'lodash.templateSources['+ ++templateCounter+']')+'\\n';string.replace(reDelimiters,function(match,escapeValue,interpolateValue,esTemplateValue,evaluateValue,offset){interpolateValue||(interpolateValue=esTemplateValue);// Escape characters that can't be included in string literals.\nsource+=string.slice(index,offset).replace(reUnescapedString,escapeStringChar);// Replace delimiters with snippets.\nif(escapeValue){isEscaping=true;source+=\"' +\\n__e(\"+escapeValue+\") +\\n'\";}if(evaluateValue){isEvaluating=true;source+=\"';\\n\"+evaluateValue+\";\\n__p += '\";}if(interpolateValue){source+=\"' +\\n((__t = (\"+interpolateValue+\")) == null ? '' : __t) +\\n'\";}index=offset+match.length;// The JS engine embedded in Adobe products needs `match` returned in\n// order to produce the correct `offset` value.\nreturn match;});source+=\"';\\n\";// If `variable` is not specified wrap a with-statement around the generated\n// code to add the data object to the top of the scope chain.\nvar variable=hasOwnProperty.call(options,'variable')&&options.variable;if(!variable){source='with (obj) {\\n'+source+'\\n}\\n';}// Cleanup code by stripping empty strings.\nsource=(isEvaluating?source.replace(reEmptyStringLeading,''):source).replace(reEmptyStringMiddle,'$1').replace(reEmptyStringTrailing,'$1;');// Frame code as the function body.\nsource='function('+(variable||'obj')+') {\\n'+(variable?'':'obj || (obj = {});\\n')+\"var __t, __p = ''\"+(isEscaping?', __e = _.escape':'')+(isEvaluating?', __j = Array.prototype.join;\\n'+\"function print() { __p += __j.call(arguments, '') }\\n\":';\\n')+source+'return __p\\n}';var result=attempt(function(){return Function(importsKeys,sourceURL+'return '+source).apply(undefined,importsValues);});// Provide the compiled function's source by its `toString` method or\n// the `source` property as a convenience for inlining compiled templates.\nresult.source=source;if(isError(result)){throw result;}return result;}/**\n * Converts `string`, as a whole, to lower case just like\n * [String#toLowerCase](https://mdn.io/toLowerCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.toLower('--Foo-Bar--');\n * // => '--foo-bar--'\n *\n * _.toLower('fooBar');\n * // => 'foobar'\n *\n * _.toLower('__FOO_BAR__');\n * // => '__foo_bar__'\n */function toLower(value){return toString(value).toLowerCase();}/**\n * Converts `string`, as a whole, to upper case just like\n * [String#toUpperCase](https://mdn.io/toUpperCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.toUpper('--foo-bar--');\n * // => '--FOO-BAR--'\n *\n * _.toUpper('fooBar');\n * // => 'FOOBAR'\n *\n * _.toUpper('__foo_bar__');\n * // => '__FOO_BAR__'\n */function toUpper(value){return toString(value).toUpperCase();}/**\n * Removes leading and trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trim(' abc ');\n * // => 'abc'\n *\n * _.trim('-_-abc-_-', '_-');\n * // => 'abc'\n *\n * _.map([' foo ', ' bar '], _.trim);\n * // => ['foo', 'bar']\n */function trim(string,chars,guard){string=toString(string);if(string&&(guard||chars===undefined)){return string.replace(reTrim,'');}if(!string||!(chars=baseToString(chars))){return string;}var strSymbols=stringToArray(string),chrSymbols=stringToArray(chars),start=charsStartIndex(strSymbols,chrSymbols),end=charsEndIndex(strSymbols,chrSymbols)+1;return castSlice(strSymbols,start,end).join('');}/**\n * Removes trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimEnd(' abc ');\n * // => ' abc'\n *\n * _.trimEnd('-_-abc-_-', '_-');\n * // => '-_-abc'\n */function trimEnd(string,chars,guard){string=toString(string);if(string&&(guard||chars===undefined)){return string.replace(reTrimEnd,'');}if(!string||!(chars=baseToString(chars))){return string;}var strSymbols=stringToArray(string),end=charsEndIndex(strSymbols,stringToArray(chars))+1;return castSlice(strSymbols,0,end).join('');}/**\n * Removes leading whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimStart(' abc ');\n * // => 'abc '\n *\n * _.trimStart('-_-abc-_-', '_-');\n * // => 'abc-_-'\n */function trimStart(string,chars,guard){string=toString(string);if(string&&(guard||chars===undefined)){return string.replace(reTrimStart,'');}if(!string||!(chars=baseToString(chars))){return string;}var strSymbols=stringToArray(string),start=charsStartIndex(strSymbols,stringToArray(chars));return castSlice(strSymbols,start).join('');}/**\n * Truncates `string` if it's longer than the given maximum string length.\n * The last characters of the truncated string are replaced with the omission\n * string which defaults to \"...\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to truncate.\n * @param {Object} [options={}] The options object.\n * @param {number} [options.length=30] The maximum string length.\n * @param {string} [options.omission='...'] The string to indicate text is omitted.\n * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n * @returns {string} Returns the truncated string.\n * @example\n *\n * _.truncate('hi-diddly-ho there, neighborino');\n * // => 'hi-diddly-ho there, neighbo...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': ' '\n * });\n * // => 'hi-diddly-ho there,...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': /,? +/\n * });\n * // => 'hi-diddly-ho there...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'omission': ' [...]'\n * });\n * // => 'hi-diddly-ho there, neig [...]'\n */function truncate(string,options){var length=DEFAULT_TRUNC_LENGTH,omission=DEFAULT_TRUNC_OMISSION;if(isObject(options)){var separator='separator'in options?options.separator:separator;length='length'in options?toInteger(options.length):length;omission='omission'in options?baseToString(options.omission):omission;}string=toString(string);var strLength=string.length;if(hasUnicode(string)){var strSymbols=stringToArray(string);strLength=strSymbols.length;}if(length>=strLength){return string;}var end=length-stringSize(omission);if(end<1){return omission;}var result=strSymbols?castSlice(strSymbols,0,end).join(''):string.slice(0,end);if(separator===undefined){return result+omission;}if(strSymbols){end+=result.length-end;}if(isRegExp(separator)){if(string.slice(end).search(separator)){var match,substring=result;if(!separator.global){separator=RegExp(separator.source,toString(reFlags.exec(separator))+'g');}separator.lastIndex=0;while(match=separator.exec(substring)){var newEnd=match.index;}result=result.slice(0,newEnd===undefined?end:newEnd);}}else if(string.indexOf(baseToString(separator),end)!=end){var index=result.lastIndexOf(separator);if(index>-1){result=result.slice(0,index);}}return result+omission;}/**\n * The inverse of `_.escape`; this method converts the HTML entities\n * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @static\n * @memberOf _\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @example\n *\n * _.unescape('fred, barney, &amp; pebbles');\n * // => 'fred, barney, & pebbles'\n */function unescape(string){string=toString(string);return string&&reHasEscapedHtml.test(string)?string.replace(reEscapedHtml,unescapeHtmlChar):string;}/**\n * Converts `string`, as space separated words, to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.upperCase('--foo-bar');\n * // => 'FOO BAR'\n *\n * _.upperCase('fooBar');\n * // => 'FOO BAR'\n *\n * _.upperCase('__foo_bar__');\n * // => 'FOO BAR'\n */var upperCase=createCompounder(function(result,word,index){return result+(index?' ':'')+word.toUpperCase();});/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */var upperFirst=createCaseFirst('toUpperCase');/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */function words(string,pattern,guard){string=toString(string);pattern=guard?undefined:pattern;if(pattern===undefined){return hasUnicodeWord(string)?unicodeWords(string):asciiWords(string);}return string.match(pattern)||[];}/*------------------------------------------------------------------------*/ /**\n * Attempts to invoke `func`, returning either the result or the caught error\n * object. Any additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Function} func The function to attempt.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {*} Returns the `func` result or error object.\n * @example\n *\n * // Avoid throwing errors for invalid selectors.\n * var elements = _.attempt(function(selector) {\n * return document.querySelectorAll(selector);\n * }, '>_>');\n *\n * if (_.isError(elements)) {\n * elements = [];\n * }\n */var attempt=baseRest(function(func,args){try{return apply(func,undefined,args);}catch(e){return isError(e)?e:new Error(e);}});/**\n * Binds methods of an object to the object itself, overwriting the existing\n * method.\n *\n * **Note:** This method doesn't set the \"length\" property of bound functions.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {Object} object The object to bind and assign the bound methods to.\n * @param {...(string|string[])} methodNames The object method names to bind.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var view = {\n * 'label': 'docs',\n * 'click': function() {\n * console.log('clicked ' + this.label);\n * }\n * };\n *\n * _.bindAll(view, ['click']);\n * jQuery(element).on('click', view.click);\n * // => Logs 'clicked docs' when clicked.\n */var bindAll=flatRest(function(object,methodNames){arrayEach(methodNames,function(key){key=toKey(key);baseAssignValue(object,key,bind(object[key],object));});return object;});/**\n * Creates a function that iterates over `pairs` and invokes the corresponding\n * function of the first predicate to return truthy. The predicate-function\n * pairs are invoked with the `this` binding and arguments of the created\n * function.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {Array} pairs The predicate-function pairs.\n * @returns {Function} Returns the new composite function.\n * @example\n *\n * var func = _.cond([\n * [_.matches({ 'a': 1 }), _.constant('matches A')],\n * [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n * [_.stubTrue, _.constant('no match')]\n * ]);\n *\n * func({ 'a': 1, 'b': 2 });\n * // => 'matches A'\n *\n * func({ 'a': 0, 'b': 1 });\n * // => 'matches B'\n *\n * func({ 'a': '1', 'b': '2' });\n * // => 'no match'\n */function cond(pairs){var length=pairs==null?0:pairs.length,toIteratee=getIteratee();pairs=!length?[]:arrayMap(pairs,function(pair){if(typeof pair[1]!='function'){throw new TypeError(FUNC_ERROR_TEXT);}return[toIteratee(pair[0]),pair[1]];});return baseRest(function(args){var index=-1;while(++index<length){var pair=pairs[index];if(apply(pair[0],this,args)){return apply(pair[1],this,args);}}});}/**\n * Creates a function that invokes the predicate properties of `source` with\n * the corresponding property values of a given object, returning `true` if\n * all predicates return truthy, else `false`.\n *\n * **Note:** The created function is equivalent to `_.conformsTo` with\n * `source` partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 2, 'b': 1 },\n * { 'a': 1, 'b': 2 }\n * ];\n *\n * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n * // => [{ 'a': 1, 'b': 2 }]\n */function conforms(source){return baseConforms(baseClone(source,CLONE_DEEP_FLAG));}/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */function constant(value){return function(){return value;};}/**\n * Checks `value` to determine whether a default value should be returned in\n * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n * or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Util\n * @param {*} value The value to check.\n * @param {*} defaultValue The default value.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * _.defaultTo(1, 10);\n * // => 1\n *\n * _.defaultTo(undefined, 10);\n * // => 10\n */function defaultTo(value,defaultValue){return value==null||value!==value?defaultValue:value;}/**\n * Creates a function that returns the result of invoking the given functions\n * with the `this` binding of the created function, where each successive\n * invocation is supplied the return value of the previous.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flowRight\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flow([_.add, square]);\n * addSquare(1, 2);\n * // => 9\n */var flow=createFlow();/**\n * This method is like `_.flow` except that it creates a function that\n * invokes the given functions from right to left.\n *\n * @static\n * @since 3.0.0\n * @memberOf _\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flow\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flowRight([square, _.add]);\n * addSquare(1, 2);\n * // => 9\n */var flowRight=createFlow(true);/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */function identity(value){return value;}/**\n * Creates a function that invokes `func` with the arguments of the created\n * function. If `func` is a property name, the created function returns the\n * property value for a given element. If `func` is an array or object, the\n * created function returns `true` for elements that contain the equivalent\n * source properties, otherwise it returns `false`.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Util\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @returns {Function} Returns the callback.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, _.iteratee(['user', 'fred']));\n * // => [{ 'user': 'fred', 'age': 40 }]\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, _.iteratee('user'));\n * // => ['barney', 'fred']\n *\n * // Create custom iteratee shorthands.\n * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n * return !_.isRegExp(func) ? iteratee(func) : function(string) {\n * return func.test(string);\n * };\n * });\n *\n * _.filter(['abc', 'def'], /ef/);\n * // => ['def']\n */function iteratee(func){return baseIteratee(typeof func=='function'?func:baseClone(func,CLONE_DEEP_FLAG));}/**\n * Creates a function that performs a partial deep comparison between a given\n * object and `source`, returning `true` if the given object has equivalent\n * property values, else `false`.\n *\n * **Note:** The created function is equivalent to `_.isMatch` with `source`\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * **Note:** Multiple values can be checked by combining several matchers\n * using `_.overSome`\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 1, 'b': 2, 'c': 3 },\n * { 'a': 4, 'b': 5, 'c': 6 }\n * ];\n *\n * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n *\n * // Checking for several possible values\n * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n */function matches(source){return baseMatches(baseClone(source,CLONE_DEEP_FLAG));}/**\n * Creates a function that performs a partial deep comparison between the\n * value at `path` of a given object to `srcValue`, returning `true` if the\n * object value is equivalent, else `false`.\n *\n * **Note:** Partial comparisons will match empty array and empty object\n * `srcValue` values against any array or object value, respectively. See\n * `_.isEqual` for a list of supported value comparisons.\n *\n * **Note:** Multiple values can be checked by combining several matchers\n * using `_.overSome`\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 1, 'b': 2, 'c': 3 },\n * { 'a': 4, 'b': 5, 'c': 6 }\n * ];\n *\n * _.find(objects, _.matchesProperty('a', 4));\n * // => { 'a': 4, 'b': 5, 'c': 6 }\n *\n * // Checking for several possible values\n * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n */function matchesProperty(path,srcValue){return baseMatchesProperty(path,baseClone(srcValue,CLONE_DEEP_FLAG));}/**\n * Creates a function that invokes the method at `path` of a given object.\n * Any additional arguments are provided to the invoked method.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Util\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Function} Returns the new invoker function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': _.constant(2) } },\n * { 'a': { 'b': _.constant(1) } }\n * ];\n *\n * _.map(objects, _.method('a.b'));\n * // => [2, 1]\n *\n * _.map(objects, _.method(['a', 'b']));\n * // => [2, 1]\n */var method=baseRest(function(path,args){return function(object){return baseInvoke(object,path,args);};});/**\n * The opposite of `_.method`; this method creates a function that invokes\n * the method at a given path of `object`. Any additional arguments are\n * provided to the invoked method.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Util\n * @param {Object} object The object to query.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Function} Returns the new invoker function.\n * @example\n *\n * var array = _.times(3, _.constant),\n * object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n * // => [2, 0]\n */var methodOf=baseRest(function(object,args){return function(path){return baseInvoke(object,path,args);};});/**\n * Adds all own enumerable string keyed function properties of a source\n * object to the destination object. If `object` is a function, then methods\n * are added to its prototype as well.\n *\n * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n * avoid conflicts caused by modifying the original.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {Function|Object} [object=lodash] The destination object.\n * @param {Object} source The object of functions to add.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n * @returns {Function|Object} Returns `object`.\n * @example\n *\n * function vowels(string) {\n * return _.filter(string, function(v) {\n * return /[aeiou]/i.test(v);\n * });\n * }\n *\n * _.mixin({ 'vowels': vowels });\n * _.vowels('fred');\n * // => ['e']\n *\n * _('fred').vowels().value();\n * // => ['e']\n *\n * _.mixin({ 'vowels': vowels }, { 'chain': false });\n * _('fred').vowels();\n * // => ['e']\n */function mixin(object,source,options){var props=keys(source),methodNames=baseFunctions(source,props);if(options==null&&!(isObject(source)&&(methodNames.length||!props.length))){options=source;source=object;object=this;methodNames=baseFunctions(source,keys(source));}var chain=!(isObject(options)&&'chain'in options)||!!options.chain,isFunc=isFunction(object);arrayEach(methodNames,function(methodName){var func=source[methodName];object[methodName]=func;if(isFunc){object.prototype[methodName]=function(){var chainAll=this.__chain__;if(chain||chainAll){var result=object(this.__wrapped__),actions=result.__actions__=copyArray(this.__actions__);actions.push({'func':func,'args':arguments,'thisArg':object});result.__chain__=chainAll;return result;}return func.apply(object,arrayPush([this.value()],arguments));};}});return object;}/**\n * Reverts the `_` variable to its previous value and returns a reference to\n * the `lodash` function.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @returns {Function} Returns the `lodash` function.\n * @example\n *\n * var lodash = _.noConflict();\n */function noConflict(){if(root._===this){root._=oldDash;}return this;}/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */function noop(){// No operation performed.\n}/**\n * Creates a function that gets the argument at index `n`. If `n` is negative,\n * the nth argument from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {number} [n=0] The index of the argument to return.\n * @returns {Function} Returns the new pass-thru function.\n * @example\n *\n * var func = _.nthArg(1);\n * func('a', 'b', 'c', 'd');\n * // => 'b'\n *\n * var func = _.nthArg(-2);\n * func('a', 'b', 'c', 'd');\n * // => 'c'\n */function nthArg(n){n=toInteger(n);return baseRest(function(args){return baseNth(args,n);});}/**\n * Creates a function that invokes `iteratees` with the arguments it receives\n * and returns their results.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to invoke.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.over([Math.max, Math.min]);\n *\n * func(1, 2, 3, 4);\n * // => [4, 1]\n */var over=createOver(arrayMap);/**\n * Creates a function that checks if **all** of the `predicates` return\n * truthy when invoked with the arguments it receives.\n *\n * Following shorthands are possible for providing predicates.\n * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [predicates=[_.identity]]\n * The predicates to check.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.overEvery([Boolean, isFinite]);\n *\n * func('1');\n * // => true\n *\n * func(null);\n * // => false\n *\n * func(NaN);\n * // => false\n */var overEvery=createOver(arrayEvery);/**\n * Creates a function that checks if **any** of the `predicates` return\n * truthy when invoked with the arguments it receives.\n *\n * Following shorthands are possible for providing predicates.\n * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [predicates=[_.identity]]\n * The predicates to check.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.overSome([Boolean, isFinite]);\n *\n * func('1');\n * // => true\n *\n * func(null);\n * // => true\n *\n * func(NaN);\n * // => false\n *\n * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n */var overSome=createOver(arraySome);/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */function property(path){return isKey(path)?baseProperty(toKey(path)):basePropertyDeep(path);}/**\n * The opposite of `_.property`; this method creates a function that returns\n * the value at a given path of `object`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var array = [0, 1, 2],\n * object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n * // => [2, 0]\n */function propertyOf(object){return function(path){return object==null?undefined:baseGet(object,path);};}/**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n * `start` is specified without an `end` or `step`. If `end` is not specified,\n * it's set to `start` with `start` then set to `0`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */var range=createRange();/**\n * This method is like `_.range` except that it populates values in\n * descending order.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.range\n * @example\n *\n * _.rangeRight(4);\n * // => [3, 2, 1, 0]\n *\n * _.rangeRight(-4);\n * // => [-3, -2, -1, 0]\n *\n * _.rangeRight(1, 5);\n * // => [4, 3, 2, 1]\n *\n * _.rangeRight(0, 20, 5);\n * // => [15, 10, 5, 0]\n *\n * _.rangeRight(0, -4, -1);\n * // => [-3, -2, -1, 0]\n *\n * _.rangeRight(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.rangeRight(0);\n * // => []\n */var rangeRight=createRange(true);/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */function stubArray(){return[];}/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */function stubFalse(){return false;}/**\n * This method returns a new empty object.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Object} Returns the new empty object.\n * @example\n *\n * var objects = _.times(2, _.stubObject);\n *\n * console.log(objects);\n * // => [{}, {}]\n *\n * console.log(objects[0] === objects[1]);\n * // => false\n */function stubObject(){return{};}/**\n * This method returns an empty string.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {string} Returns the empty string.\n * @example\n *\n * _.times(2, _.stubString);\n * // => ['', '']\n */function stubString(){return'';}/**\n * This method returns `true`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `true`.\n * @example\n *\n * _.times(2, _.stubTrue);\n * // => [true, true]\n */function stubTrue(){return true;}/**\n * Invokes the iteratee `n` times, returning an array of the results of\n * each invocation. The iteratee is invoked with one argument; (index).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.times(3, String);\n * // => ['0', '1', '2']\n *\n * _.times(4, _.constant(0));\n * // => [0, 0, 0, 0]\n */function times(n,iteratee){n=toInteger(n);if(n<1||n>MAX_SAFE_INTEGER){return[];}var index=MAX_ARRAY_LENGTH,length=nativeMin(n,MAX_ARRAY_LENGTH);iteratee=getIteratee(iteratee);n-=MAX_ARRAY_LENGTH;var result=baseTimes(length,iteratee);while(++index<n){iteratee(index);}return result;}/**\n * Converts `value` to a property path array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {*} value The value to convert.\n * @returns {Array} Returns the new property path array.\n * @example\n *\n * _.toPath('a.b.c');\n * // => ['a', 'b', 'c']\n *\n * _.toPath('a[0].b.c');\n * // => ['a', '0', 'b', 'c']\n */function toPath(value){if(isArray(value)){return arrayMap(value,toKey);}return isSymbol(value)?[value]:copyArray(stringToPath(toString(value)));}/**\n * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {string} [prefix=''] The value to prefix the ID with.\n * @returns {string} Returns the unique ID.\n * @example\n *\n * _.uniqueId('contact_');\n * // => 'contact_104'\n *\n * _.uniqueId();\n * // => '105'\n */function uniqueId(prefix){var id=++idCounter;return toString(prefix)+id;}/*------------------------------------------------------------------------*/ /**\n * Adds two numbers.\n *\n * @static\n * @memberOf _\n * @since 3.4.0\n * @category Math\n * @param {number} augend The first number in an addition.\n * @param {number} addend The second number in an addition.\n * @returns {number} Returns the total.\n * @example\n *\n * _.add(6, 4);\n * // => 10\n */var add=createMathOperation(function(augend,addend){return augend+addend;},0);/**\n * Computes `number` rounded up to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round up.\n * @param {number} [precision=0] The precision to round up to.\n * @returns {number} Returns the rounded up number.\n * @example\n *\n * _.ceil(4.006);\n * // => 5\n *\n * _.ceil(6.004, 2);\n * // => 6.01\n *\n * _.ceil(6040, -2);\n * // => 6100\n */var ceil=createRound('ceil');/**\n * Divide two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {number} dividend The first number in a division.\n * @param {number} divisor The second number in a division.\n * @returns {number} Returns the quotient.\n * @example\n *\n * _.divide(6, 4);\n * // => 1.5\n */var divide=createMathOperation(function(dividend,divisor){return dividend/divisor;},1);/**\n * Computes `number` rounded down to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round down.\n * @param {number} [precision=0] The precision to round down to.\n * @returns {number} Returns the rounded down number.\n * @example\n *\n * _.floor(4.006);\n * // => 4\n *\n * _.floor(0.046, 2);\n * // => 0.04\n *\n * _.floor(4060, -2);\n * // => 4000\n */var floor=createRound('floor');/**\n * Computes the maximum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */function max(array){return array&&array.length?baseExtremum(array,identity,baseGt):undefined;}/**\n * This method is like `_.max` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.maxBy(objects, function(o) { return o.n; });\n * // => { 'n': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.maxBy(objects, 'n');\n * // => { 'n': 2 }\n */function maxBy(array,iteratee){return array&&array.length?baseExtremum(array,getIteratee(iteratee,2),baseGt):undefined;}/**\n * Computes the mean of the values in `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the mean.\n * @example\n *\n * _.mean([4, 2, 8, 6]);\n * // => 5\n */function mean(array){return baseMean(array,identity);}/**\n * This method is like `_.mean` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the value to be averaged.\n * The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the mean.\n * @example\n *\n * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n *\n * _.meanBy(objects, function(o) { return o.n; });\n * // => 5\n *\n * // The `_.property` iteratee shorthand.\n * _.meanBy(objects, 'n');\n * // => 5\n */function meanBy(array,iteratee){return baseMean(array,getIteratee(iteratee,2));}/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */function min(array){return array&&array.length?baseExtremum(array,identity,baseLt):undefined;}/**\n * This method is like `_.min` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.minBy(objects, function(o) { return o.n; });\n * // => { 'n': 1 }\n *\n * // The `_.property` iteratee shorthand.\n * _.minBy(objects, 'n');\n * // => { 'n': 1 }\n */function minBy(array,iteratee){return array&&array.length?baseExtremum(array,getIteratee(iteratee,2),baseLt):undefined;}/**\n * Multiply two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {number} multiplier The first number in a multiplication.\n * @param {number} multiplicand The second number in a multiplication.\n * @returns {number} Returns the product.\n * @example\n *\n * _.multiply(6, 4);\n * // => 24\n */var multiply=createMathOperation(function(multiplier,multiplicand){return multiplier*multiplicand;},1);/**\n * Computes `number` rounded to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round.\n * @param {number} [precision=0] The precision to round to.\n * @returns {number} Returns the rounded number.\n * @example\n *\n * _.round(4.006);\n * // => 4\n *\n * _.round(4.006, 2);\n * // => 4.01\n *\n * _.round(4060, -2);\n * // => 4100\n */var round=createRound('round');/**\n * Subtract two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {number} minuend The first number in a subtraction.\n * @param {number} subtrahend The second number in a subtraction.\n * @returns {number} Returns the difference.\n * @example\n *\n * _.subtract(6, 4);\n * // => 2\n */var subtract=createMathOperation(function(minuend,subtrahend){return minuend-subtrahend;},0);/**\n * Computes the sum of the values in `array`.\n *\n * @static\n * @memberOf _\n * @since 3.4.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the sum.\n * @example\n *\n * _.sum([4, 2, 8, 6]);\n * // => 20\n */function sum(array){return array&&array.length?baseSum(array,identity):0;}/**\n * This method is like `_.sum` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the value to be summed.\n * The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the sum.\n * @example\n *\n * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n *\n * _.sumBy(objects, function(o) { return o.n; });\n * // => 20\n *\n * // The `_.property` iteratee shorthand.\n * _.sumBy(objects, 'n');\n * // => 20\n */function sumBy(array,iteratee){return array&&array.length?baseSum(array,getIteratee(iteratee,2)):0;}/*------------------------------------------------------------------------*/ // Add methods that return wrapped values in chain sequences.\nlodash.after=after;lodash.ary=ary;lodash.assign=assign;lodash.assignIn=assignIn;lodash.assignInWith=assignInWith;lodash.assignWith=assignWith;lodash.at=at;lodash.before=before;lodash.bind=bind;lodash.bindAll=bindAll;lodash.bindKey=bindKey;lodash.castArray=castArray;lodash.chain=chain;lodash.chunk=chunk;lodash.compact=compact;lodash.concat=concat;lodash.cond=cond;lodash.conforms=conforms;lodash.constant=constant;lodash.countBy=countBy;lodash.create=create;lodash.curry=curry;lodash.curryRight=curryRight;lodash.debounce=debounce;lodash.defaults=defaults;lodash.defaultsDeep=defaultsDeep;lodash.defer=defer;lodash.delay=delay;lodash.difference=difference;lodash.differenceBy=differenceBy;lodash.differenceWith=differenceWith;lodash.drop=drop;lodash.dropRight=dropRight;lodash.dropRightWhile=dropRightWhile;lodash.dropWhile=dropWhile;lodash.fill=fill;lodash.filter=filter;lodash.flatMap=flatMap;lodash.flatMapDeep=flatMapDeep;lodash.flatMapDepth=flatMapDepth;lodash.flatten=flatten;lodash.flattenDeep=flattenDeep;lodash.flattenDepth=flattenDepth;lodash.flip=flip;lodash.flow=flow;lodash.flowRight=flowRight;lodash.fromPairs=fromPairs;lodash.functions=functions;lodash.functionsIn=functionsIn;lodash.groupBy=groupBy;lodash.initial=initial;lodash.intersection=intersection;lodash.intersectionBy=intersectionBy;lodash.intersectionWith=intersectionWith;lodash.invert=invert;lodash.invertBy=invertBy;lodash.invokeMap=invokeMap;lodash.iteratee=iteratee;lodash.keyBy=keyBy;lodash.keys=keys;lodash.keysIn=keysIn;lodash.map=map;lodash.mapKeys=mapKeys;lodash.mapValues=mapValues;lodash.matches=matches;lodash.matchesProperty=matchesProperty;lodash.memoize=memoize;lodash.merge=merge;lodash.mergeWith=mergeWith;lodash.method=method;lodash.methodOf=methodOf;lodash.mixin=mixin;lodash.negate=negate;lodash.nthArg=nthArg;lodash.omit=omit;lodash.omitBy=omitBy;lodash.once=once;lodash.orderBy=orderBy;lodash.over=over;lodash.overArgs=overArgs;lodash.overEvery=overEvery;lodash.overSome=overSome;lodash.partial=partial;lodash.partialRight=partialRight;lodash.partition=partition;lodash.pick=pick;lodash.pickBy=pickBy;lodash.property=property;lodash.propertyOf=propertyOf;lodash.pull=pull;lodash.pullAll=pullAll;lodash.pullAllBy=pullAllBy;lodash.pullAllWith=pullAllWith;lodash.pullAt=pullAt;lodash.range=range;lodash.rangeRight=rangeRight;lodash.rearg=rearg;lodash.reject=reject;lodash.remove=remove;lodash.rest=rest;lodash.reverse=reverse;lodash.sampleSize=sampleSize;lodash.set=set;lodash.setWith=setWith;lodash.shuffle=shuffle;lodash.slice=slice;lodash.sortBy=sortBy;lodash.sortedUniq=sortedUniq;lodash.sortedUniqBy=sortedUniqBy;lodash.split=split;lodash.spread=spread;lodash.tail=tail;lodash.take=take;lodash.takeRight=takeRight;lodash.takeRightWhile=takeRightWhile;lodash.takeWhile=takeWhile;lodash.tap=tap;lodash.throttle=throttle;lodash.thru=thru;lodash.toArray=toArray;lodash.toPairs=toPairs;lodash.toPairsIn=toPairsIn;lodash.toPath=toPath;lodash.toPlainObject=toPlainObject;lodash.transform=transform;lodash.unary=unary;lodash.union=union;lodash.unionBy=unionBy;lodash.unionWith=unionWith;lodash.uniq=uniq;lodash.uniqBy=uniqBy;lodash.uniqWith=uniqWith;lodash.unset=unset;lodash.unzip=unzip;lodash.unzipWith=unzipWith;lodash.update=update;lodash.updateWith=updateWith;lodash.values=values;lodash.valuesIn=valuesIn;lodash.without=without;lodash.words=words;lodash.wrap=wrap;lodash.xor=xor;lodash.xorBy=xorBy;lodash.xorWith=xorWith;lodash.zip=zip;lodash.zipObject=zipObject;lodash.zipObjectDeep=zipObjectDeep;lodash.zipWith=zipWith;// Add aliases.\nlodash.entries=toPairs;lodash.entriesIn=toPairsIn;lodash.extend=assignIn;lodash.extendWith=assignInWith;// Add methods to `lodash.prototype`.\nmixin(lodash,lodash);/*------------------------------------------------------------------------*/ // Add methods that return unwrapped values in chain sequences.\nlodash.add=add;lodash.attempt=attempt;lodash.camelCase=camelCase;lodash.capitalize=capitalize;lodash.ceil=ceil;lodash.clamp=clamp;lodash.clone=clone;lodash.cloneDeep=cloneDeep;lodash.cloneDeepWith=cloneDeepWith;lodash.cloneWith=cloneWith;lodash.conformsTo=conformsTo;lodash.deburr=deburr;lodash.defaultTo=defaultTo;lodash.divide=divide;lodash.endsWith=endsWith;lodash.eq=eq;lodash.escape=escape;lodash.escapeRegExp=escapeRegExp;lodash.every=every;lodash.find=find;lodash.findIndex=findIndex;lodash.findKey=findKey;lodash.findLast=findLast;lodash.findLastIndex=findLastIndex;lodash.findLastKey=findLastKey;lodash.floor=floor;lodash.forEach=forEach;lodash.forEachRight=forEachRight;lodash.forIn=forIn;lodash.forInRight=forInRight;lodash.forOwn=forOwn;lodash.forOwnRight=forOwnRight;lodash.get=get;lodash.gt=gt;lodash.gte=gte;lodash.has=has;lodash.hasIn=hasIn;lodash.head=head;lodash.identity=identity;lodash.includes=includes;lodash.indexOf=indexOf;lodash.inRange=inRange;lodash.invoke=invoke;lodash.isArguments=isArguments;lodash.isArray=isArray;lodash.isArrayBuffer=isArrayBuffer;lodash.isArrayLike=isArrayLike;lodash.isArrayLikeObject=isArrayLikeObject;lodash.isBoolean=isBoolean;lodash.isBuffer=isBuffer;lodash.isDate=isDate;lodash.isElement=isElement;lodash.isEmpty=isEmpty;lodash.isEqual=isEqual;lodash.isEqualWith=isEqualWith;lodash.isError=isError;lodash.isFinite=isFinite;lodash.isFunction=isFunction;lodash.isInteger=isInteger;lodash.isLength=isLength;lodash.isMap=isMap;lodash.isMatch=isMatch;lodash.isMatchWith=isMatchWith;lodash.isNaN=isNaN;lodash.isNative=isNative;lodash.isNil=isNil;lodash.isNull=isNull;lodash.isNumber=isNumber;lodash.isObject=isObject;lodash.isObjectLike=isObjectLike;lodash.isPlainObject=isPlainObject;lodash.isRegExp=isRegExp;lodash.isSafeInteger=isSafeInteger;lodash.isSet=isSet;lodash.isString=isString;lodash.isSymbol=isSymbol;lodash.isTypedArray=isTypedArray;lodash.isUndefined=isUndefined;lodash.isWeakMap=isWeakMap;lodash.isWeakSet=isWeakSet;lodash.join=join;lodash.kebabCase=kebabCase;lodash.last=last;lodash.lastIndexOf=lastIndexOf;lodash.lowerCase=lowerCase;lodash.lowerFirst=lowerFirst;lodash.lt=lt;lodash.lte=lte;lodash.max=max;lodash.maxBy=maxBy;lodash.mean=mean;lodash.meanBy=meanBy;lodash.min=min;lodash.minBy=minBy;lodash.stubArray=stubArray;lodash.stubFalse=stubFalse;lodash.stubObject=stubObject;lodash.stubString=stubString;lodash.stubTrue=stubTrue;lodash.multiply=multiply;lodash.nth=nth;lodash.noConflict=noConflict;lodash.noop=noop;lodash.now=now;lodash.pad=pad;lodash.padEnd=padEnd;lodash.padStart=padStart;lodash.parseInt=parseInt;lodash.random=random;lodash.reduce=reduce;lodash.reduceRight=reduceRight;lodash.repeat=repeat;lodash.replace=replace;lodash.result=result;lodash.round=round;lodash.runInContext=runInContext;lodash.sample=sample;lodash.size=size;lodash.snakeCase=snakeCase;lodash.some=some;lodash.sortedIndex=sortedIndex;lodash.sortedIndexBy=sortedIndexBy;lodash.sortedIndexOf=sortedIndexOf;lodash.sortedLastIndex=sortedLastIndex;lodash.sortedLastIndexBy=sortedLastIndexBy;lodash.sortedLastIndexOf=sortedLastIndexOf;lodash.startCase=startCase;lodash.startsWith=startsWith;lodash.subtract=subtract;lodash.sum=sum;lodash.sumBy=sumBy;lodash.template=template;lodash.times=times;lodash.toFinite=toFinite;lodash.toInteger=toInteger;lodash.toLength=toLength;lodash.toLower=toLower;lodash.toNumber=toNumber;lodash.toSafeInteger=toSafeInteger;lodash.toString=toString;lodash.toUpper=toUpper;lodash.trim=trim;lodash.trimEnd=trimEnd;lodash.trimStart=trimStart;lodash.truncate=truncate;lodash.unescape=unescape;lodash.uniqueId=uniqueId;lodash.upperCase=upperCase;lodash.upperFirst=upperFirst;// Add aliases.\nlodash.each=forEach;lodash.eachRight=forEachRight;lodash.first=head;mixin(lodash,function(){var source={};baseForOwn(lodash,function(func,methodName){if(!hasOwnProperty.call(lodash.prototype,methodName)){source[methodName]=func;}});return source;}(),{'chain':false});/*------------------------------------------------------------------------*/ /**\n * The semantic version number.\n *\n * @static\n * @memberOf _\n * @type {string}\n */lodash.VERSION=VERSION;// Assign default placeholders.\narrayEach(['bind','bindKey','curry','curryRight','partial','partialRight'],function(methodName){lodash[methodName].placeholder=lodash;});// Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\narrayEach(['drop','take'],function(methodName,index){LazyWrapper.prototype[methodName]=function(n){n=n===undefined?1:nativeMax(toInteger(n),0);var result=this.__filtered__&&!index?new LazyWrapper(this):this.clone();if(result.__filtered__){result.__takeCount__=nativeMin(n,result.__takeCount__);}else{result.__views__.push({'size':nativeMin(n,MAX_ARRAY_LENGTH),'type':methodName+(result.__dir__<0?'Right':'')});}return result;};LazyWrapper.prototype[methodName+'Right']=function(n){return this.reverse()[methodName](n).reverse();};});// Add `LazyWrapper` methods that accept an `iteratee` value.\narrayEach(['filter','map','takeWhile'],function(methodName,index){var type=index+1,isFilter=type==LAZY_FILTER_FLAG||type==LAZY_WHILE_FLAG;LazyWrapper.prototype[methodName]=function(iteratee){var result=this.clone();result.__iteratees__.push({'iteratee':getIteratee(iteratee,3),'type':type});result.__filtered__=result.__filtered__||isFilter;return result;};});// Add `LazyWrapper` methods for `_.head` and `_.last`.\narrayEach(['head','last'],function(methodName,index){var takeName='take'+(index?'Right':'');LazyWrapper.prototype[methodName]=function(){return this[takeName](1).value()[0];};});// Add `LazyWrapper` methods for `_.initial` and `_.tail`.\narrayEach(['initial','tail'],function(methodName,index){var dropName='drop'+(index?'':'Right');LazyWrapper.prototype[methodName]=function(){return this.__filtered__?new LazyWrapper(this):this[dropName](1);};});LazyWrapper.prototype.compact=function(){return this.filter(identity);};LazyWrapper.prototype.find=function(predicate){return this.filter(predicate).head();};LazyWrapper.prototype.findLast=function(predicate){return this.reverse().find(predicate);};LazyWrapper.prototype.invokeMap=baseRest(function(path,args){if(typeof path=='function'){return new LazyWrapper(this);}return this.map(function(value){return baseInvoke(value,path,args);});});LazyWrapper.prototype.reject=function(predicate){return this.filter(negate(getIteratee(predicate)));};LazyWrapper.prototype.slice=function(start,end){start=toInteger(start);var result=this;if(result.__filtered__&&(start>0||end<0)){return new LazyWrapper(result);}if(start<0){result=result.takeRight(-start);}else if(start){result=result.drop(start);}if(end!==undefined){end=toInteger(end);result=end<0?result.dropRight(-end):result.take(end-start);}return result;};LazyWrapper.prototype.takeRightWhile=function(predicate){return this.reverse().takeWhile(predicate).reverse();};LazyWrapper.prototype.toArray=function(){return this.take(MAX_ARRAY_LENGTH);};// Add `LazyWrapper` methods to `lodash.prototype`.\nbaseForOwn(LazyWrapper.prototype,function(func,methodName){var checkIteratee=/^(?:filter|find|map|reject)|While$/.test(methodName),isTaker=/^(?:head|last)$/.test(methodName),lodashFunc=lodash[isTaker?'take'+(methodName=='last'?'Right':''):methodName],retUnwrapped=isTaker||/^find/.test(methodName);if(!lodashFunc){return;}lodash.prototype[methodName]=function(){var value=this.__wrapped__,args=isTaker?[1]:arguments,isLazy=value instanceof LazyWrapper,iteratee=args[0],useLazy=isLazy||isArray(value);var interceptor=function interceptor(value){var result=lodashFunc.apply(lodash,arrayPush([value],args));return isTaker&&chainAll?result[0]:result;};if(useLazy&&checkIteratee&&typeof iteratee=='function'&&iteratee.length!=1){// Avoid lazy use if the iteratee has a \"length\" value other than `1`.\nisLazy=useLazy=false;}var chainAll=this.__chain__,isHybrid=!!this.__actions__.length,isUnwrapped=retUnwrapped&&!chainAll,onlyLazy=isLazy&&!isHybrid;if(!retUnwrapped&&useLazy){value=onlyLazy?value:new LazyWrapper(this);var result=func.apply(value,args);result.__actions__.push({'func':thru,'args':[interceptor],'thisArg':undefined});return new LodashWrapper(result,chainAll);}if(isUnwrapped&&onlyLazy){return func.apply(this,args);}result=this.thru(interceptor);return isUnwrapped?isTaker?result.value()[0]:result.value():result;};});// Add `Array` methods to `lodash.prototype`.\narrayEach(['pop','push','shift','sort','splice','unshift'],function(methodName){var func=arrayProto[methodName],chainName=/^(?:push|sort|unshift)$/.test(methodName)?'tap':'thru',retUnwrapped=/^(?:pop|shift)$/.test(methodName);lodash.prototype[methodName]=function(){var args=arguments;if(retUnwrapped&&!this.__chain__){var value=this.value();return func.apply(isArray(value)?value:[],args);}return this[chainName](function(value){return func.apply(isArray(value)?value:[],args);});};});// Map minified method names to their real names.\nbaseForOwn(LazyWrapper.prototype,function(func,methodName){var lodashFunc=lodash[methodName];if(lodashFunc){var key=lodashFunc.name+'';if(!hasOwnProperty.call(realNames,key)){realNames[key]=[];}realNames[key].push({'name':methodName,'func':lodashFunc});}});realNames[createHybrid(undefined,WRAP_BIND_KEY_FLAG).name]=[{'name':'wrapper','func':undefined}];// Add methods to `LazyWrapper`.\nLazyWrapper.prototype.clone=lazyClone;LazyWrapper.prototype.reverse=lazyReverse;LazyWrapper.prototype.value=lazyValue;// Add chain sequence methods to the `lodash` wrapper.\nlodash.prototype.at=wrapperAt;lodash.prototype.chain=wrapperChain;lodash.prototype.commit=wrapperCommit;lodash.prototype.next=wrapperNext;lodash.prototype.plant=wrapperPlant;lodash.prototype.reverse=wrapperReverse;lodash.prototype.toJSON=lodash.prototype.valueOf=lodash.prototype.value=wrapperValue;// Add lazy aliases.\nlodash.prototype.first=lodash.prototype.head;if(symIterator){lodash.prototype[symIterator]=wrapperToIterator;}return lodash;};/*--------------------------------------------------------------------------*/ // Export lodash.\nvar _=runInContext();// Some AMD build optimizers, like r.js, check for condition patterns like:\nif( true&&_typeof(__webpack_require__.amdO)=='object'&&__webpack_require__.amdO){// Expose Lodash on the global object to prevent errors when Lodash is\n// loaded by a script tag in the presence of an AMD loader.\n// See http://requirejs.org/docs/errors.html#mismatch for more details.\n// Use `_.noConflict` to remove Lodash from the global object.\nroot._=_;// Define as an anonymous module so, through path mapping, it can be\n// referenced as the \"underscore\" module.\n!(__WEBPACK_AMD_DEFINE_RESULT__ = (function(){return _;}).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));}// Check for `exports` after `define` in case a build optimizer adds it.\nelse if(freeModule){// Export for Node.js.\n(freeModule.exports=_)._=_;// Export for CommonJS support.\nfreeExports._=_;}else{// Export to the global object.\nroot._=_;}}).call(this);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2xvZGFzaC5qcz8yZWYwIl0sIm5hbWVzIjpbInVuZGVmaW5lZCIsIlZFUlNJT04iLCJMQVJHRV9BUlJBWV9TSVpFIiwiQ09SRV9FUlJPUl9URVhUIiwiRlVOQ19FUlJPUl9URVhUIiwiSEFTSF9VTkRFRklORUQiLCJNQVhfTUVNT0laRV9TSVpFIiwiUExBQ0VIT0xERVIiLCJDTE9ORV9ERUVQX0ZMQUciLCJDTE9ORV9GTEFUX0ZMQUciLCJDTE9ORV9TWU1CT0xTX0ZMQUciLCJDT01QQVJFX1BBUlRJQUxfRkxBRyIsIkNPTVBBUkVfVU5PUkRFUkVEX0ZMQUciLCJXUkFQX0JJTkRfRkxBRyIsIldSQVBfQklORF9LRVlfRkxBRyIsIldSQVBfQ1VSUllfQk9VTkRfRkxBRyIsIldSQVBfQ1VSUllfRkxBRyIsIldSQVBfQ1VSUllfUklHSFRfRkxBRyIsIldSQVBfUEFSVElBTF9GTEFHIiwiV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUciLCJXUkFQX0FSWV9GTEFHIiwiV1JBUF9SRUFSR19GTEFHIiwiV1JBUF9GTElQX0ZMQUciLCJERUZBVUxUX1RSVU5DX0xFTkdUSCIsIkRFRkFVTFRfVFJVTkNfT01JU1NJT04iLCJIT1RfQ09VTlQiLCJIT1RfU1BBTiIsIkxBWllfRklMVEVSX0ZMQUciLCJMQVpZX01BUF9GTEFHIiwiTEFaWV9XSElMRV9GTEFHIiwiSU5GSU5JVFkiLCJNQVhfU0FGRV9JTlRFR0VSIiwiTUFYX0lOVEVHRVIiLCJOQU4iLCJNQVhfQVJSQVlfTEVOR1RIIiwiTUFYX0FSUkFZX0lOREVYIiwiSEFMRl9NQVhfQVJSQVlfTEVOR1RIIiwid3JhcEZsYWdzIiwiYXJnc1RhZyIsImFycmF5VGFnIiwiYXN5bmNUYWciLCJib29sVGFnIiwiZGF0ZVRhZyIsImRvbUV4Y1RhZyIsImVycm9yVGFnIiwiZnVuY1RhZyIsImdlblRhZyIsIm1hcFRhZyIsIm51bWJlclRhZyIsIm51bGxUYWciLCJvYmplY3RUYWciLCJwcm9taXNlVGFnIiwicHJveHlUYWciLCJyZWdleHBUYWciLCJzZXRUYWciLCJzdHJpbmdUYWciLCJzeW1ib2xUYWciLCJ1bmRlZmluZWRUYWciLCJ3ZWFrTWFwVGFnIiwid2Vha1NldFRhZyIsImFycmF5QnVmZmVyVGFnIiwiZGF0YVZpZXdUYWciLCJmbG9hdDMyVGFnIiwiZmxvYXQ2NFRhZyIsImludDhUYWciLCJpbnQxNlRhZyIsImludDMyVGFnIiwidWludDhUYWciLCJ1aW50OENsYW1wZWRUYWciLCJ1aW50MTZUYWciLCJ1aW50MzJUYWciLCJyZUVtcHR5U3RyaW5nTGVhZGluZyIsInJlRW1wdHlTdHJpbmdNaWRkbGUiLCJyZUVtcHR5U3RyaW5nVHJhaWxpbmciLCJyZUVzY2FwZWRIdG1sIiwicmVVbmVzY2FwZWRIdG1sIiwicmVIYXNFc2NhcGVkSHRtbCIsIlJlZ0V4cCIsInNvdXJjZSIsInJlSGFzVW5lc2NhcGVkSHRtbCIsInJlRXNjYXBlIiwicmVFdmFsdWF0ZSIsInJlSW50ZXJwb2xhdGUiLCJyZUlzRGVlcFByb3AiLCJyZUlzUGxhaW5Qcm9wIiwicmVQcm9wTmFtZSIsInJlUmVnRXhwQ2hhciIsInJlSGFzUmVnRXhwQ2hhciIsInJlVHJpbSIsInJlVHJpbVN0YXJ0IiwicmVUcmltRW5kIiwicmVXcmFwQ29tbWVudCIsInJlV3JhcERldGFpbHMiLCJyZVNwbGl0RGV0YWlscyIsInJlQXNjaWlXb3JkIiwicmVFc2NhcGVDaGFyIiwicmVFc1RlbXBsYXRlIiwicmVGbGFncyIsInJlSXNCYWRIZXgiLCJyZUlzQmluYXJ5IiwicmVJc0hvc3RDdG9yIiwicmVJc09jdGFsIiwicmVJc1VpbnQiLCJyZUxhdGluIiwicmVOb01hdGNoIiwicmVVbmVzY2FwZWRTdHJpbmciLCJyc0FzdHJhbFJhbmdlIiwicnNDb21ib01hcmtzUmFuZ2UiLCJyZUNvbWJvSGFsZk1hcmtzUmFuZ2UiLCJyc0NvbWJvU3ltYm9sc1JhbmdlIiwicnNDb21ib1JhbmdlIiwicnNEaW5nYmF0UmFuZ2UiLCJyc0xvd2VyUmFuZ2UiLCJyc01hdGhPcFJhbmdlIiwicnNOb25DaGFyUmFuZ2UiLCJyc1B1bmN0dWF0aW9uUmFuZ2UiLCJyc1NwYWNlUmFuZ2UiLCJyc1VwcGVyUmFuZ2UiLCJyc1ZhclJhbmdlIiwicnNCcmVha1JhbmdlIiwicnNBcG9zIiwicnNBc3RyYWwiLCJyc0JyZWFrIiwicnNDb21ibyIsInJzRGlnaXRzIiwicnNEaW5nYmF0IiwicnNMb3dlciIsInJzTWlzYyIsInJzRml0eiIsInJzTW9kaWZpZXIiLCJyc05vbkFzdHJhbCIsInJzUmVnaW9uYWwiLCJyc1N1cnJQYWlyIiwicnNVcHBlciIsInJzWldKIiwicnNNaXNjTG93ZXIiLCJyc01pc2NVcHBlciIsInJzT3B0Q29udHJMb3dlciIsInJzT3B0Q29udHJVcHBlciIsInJlT3B0TW9kIiwicnNPcHRWYXIiLCJyc09wdEpvaW4iLCJqb2luIiwicnNPcmRMb3dlciIsInJzT3JkVXBwZXIiLCJyc1NlcSIsInJzRW1vamkiLCJyc1N5bWJvbCIsInJlQXBvcyIsInJlQ29tYm9NYXJrIiwicmVVbmljb2RlIiwicmVVbmljb2RlV29yZCIsInJlSGFzVW5pY29kZSIsInJlSGFzVW5pY29kZVdvcmQiLCJjb250ZXh0UHJvcHMiLCJ0ZW1wbGF0ZUNvdW50ZXIiLCJ0eXBlZEFycmF5VGFncyIsImNsb25lYWJsZVRhZ3MiLCJkZWJ1cnJlZExldHRlcnMiLCJodG1sRXNjYXBlcyIsImh0bWxVbmVzY2FwZXMiLCJzdHJpbmdFc2NhcGVzIiwiZnJlZVBhcnNlRmxvYXQiLCJwYXJzZUZsb2F0IiwiZnJlZVBhcnNlSW50IiwicGFyc2VJbnQiLCJmcmVlR2xvYmFsIiwiZ2xvYmFsIiwiT2JqZWN0IiwiZnJlZVNlbGYiLCJzZWxmIiwicm9vdCIsIkZ1bmN0aW9uIiwiZnJlZUV4cG9ydHMiLCJleHBvcnRzIiwibm9kZVR5cGUiLCJmcmVlTW9kdWxlIiwibW9kdWxlIiwibW9kdWxlRXhwb3J0cyIsImZyZWVQcm9jZXNzIiwicHJvY2VzcyIsIm5vZGVVdGlsIiwidHlwZXMiLCJyZXF1aXJlIiwiYmluZGluZyIsImUiLCJub2RlSXNBcnJheUJ1ZmZlciIsImlzQXJyYXlCdWZmZXIiLCJub2RlSXNEYXRlIiwiaXNEYXRlIiwibm9kZUlzTWFwIiwiaXNNYXAiLCJub2RlSXNSZWdFeHAiLCJpc1JlZ0V4cCIsIm5vZGVJc1NldCIsImlzU2V0Iiwibm9kZUlzVHlwZWRBcnJheSIsImlzVHlwZWRBcnJheSIsImFwcGx5IiwiZnVuYyIsInRoaXNBcmciLCJhcmdzIiwibGVuZ3RoIiwiY2FsbCIsImFycmF5QWdncmVnYXRvciIsImFycmF5Iiwic2V0dGVyIiwiaXRlcmF0ZWUiLCJhY2N1bXVsYXRvciIsImluZGV4IiwidmFsdWUiLCJhcnJheUVhY2giLCJhcnJheUVhY2hSaWdodCIsImFycmF5RXZlcnkiLCJwcmVkaWNhdGUiLCJhcnJheUZpbHRlciIsInJlc0luZGV4IiwicmVzdWx0IiwiYXJyYXlJbmNsdWRlcyIsImJhc2VJbmRleE9mIiwiYXJyYXlJbmNsdWRlc1dpdGgiLCJjb21wYXJhdG9yIiwiYXJyYXlNYXAiLCJBcnJheSIsImFycmF5UHVzaCIsInZhbHVlcyIsIm9mZnNldCIsImFycmF5UmVkdWNlIiwiaW5pdEFjY3VtIiwiYXJyYXlSZWR1Y2VSaWdodCIsImFycmF5U29tZSIsImFzY2lpU2l6ZSIsImJhc2VQcm9wZXJ0eSIsImFzY2lpVG9BcnJheSIsInN0cmluZyIsInNwbGl0IiwiYXNjaWlXb3JkcyIsIm1hdGNoIiwiYmFzZUZpbmRLZXkiLCJjb2xsZWN0aW9uIiwiZWFjaEZ1bmMiLCJrZXkiLCJiYXNlRmluZEluZGV4IiwiZnJvbUluZGV4IiwiZnJvbVJpZ2h0Iiwic3RyaWN0SW5kZXhPZiIsImJhc2VJc05hTiIsImJhc2VJbmRleE9mV2l0aCIsImJhc2VNZWFuIiwiYmFzZVN1bSIsIm9iamVjdCIsImJhc2VQcm9wZXJ0eU9mIiwiYmFzZVJlZHVjZSIsImJhc2VTb3J0QnkiLCJjb21wYXJlciIsInNvcnQiLCJjdXJyZW50IiwiYmFzZVRpbWVzIiwibiIsImJhc2VUb1BhaXJzIiwicHJvcHMiLCJiYXNlVW5hcnkiLCJiYXNlVmFsdWVzIiwiY2FjaGVIYXMiLCJjYWNoZSIsImhhcyIsImNoYXJzU3RhcnRJbmRleCIsInN0clN5bWJvbHMiLCJjaHJTeW1ib2xzIiwiY2hhcnNFbmRJbmRleCIsImNvdW50SG9sZGVycyIsInBsYWNlaG9sZGVyIiwiZGVidXJyTGV0dGVyIiwiZXNjYXBlSHRtbENoYXIiLCJlc2NhcGVTdHJpbmdDaGFyIiwiY2hyIiwiZ2V0VmFsdWUiLCJoYXNVbmljb2RlIiwidGVzdCIsImhhc1VuaWNvZGVXb3JkIiwiaXRlcmF0b3JUb0FycmF5IiwiaXRlcmF0b3IiLCJkYXRhIiwibmV4dCIsImRvbmUiLCJwdXNoIiwibWFwVG9BcnJheSIsIm1hcCIsInNpemUiLCJmb3JFYWNoIiwib3ZlckFyZyIsInRyYW5zZm9ybSIsImFyZyIsInJlcGxhY2VIb2xkZXJzIiwic2V0VG9BcnJheSIsInNldCIsInNldFRvUGFpcnMiLCJzdHJpY3RMYXN0SW5kZXhPZiIsInN0cmluZ1NpemUiLCJ1bmljb2RlU2l6ZSIsInN0cmluZ1RvQXJyYXkiLCJ1bmljb2RlVG9BcnJheSIsInVuZXNjYXBlSHRtbENoYXIiLCJsYXN0SW5kZXgiLCJ1bmljb2RlV29yZHMiLCJydW5JbkNvbnRleHQiLCJjb250ZXh0IiwiXyIsImRlZmF1bHRzIiwicGljayIsIkRhdGUiLCJFcnJvciIsIk1hdGgiLCJTdHJpbmciLCJUeXBlRXJyb3IiLCJhcnJheVByb3RvIiwicHJvdG90eXBlIiwiZnVuY1Byb3RvIiwib2JqZWN0UHJvdG8iLCJjb3JlSnNEYXRhIiwiZnVuY1RvU3RyaW5nIiwidG9TdHJpbmciLCJoYXNPd25Qcm9wZXJ0eSIsImlkQ291bnRlciIsIm1hc2tTcmNLZXkiLCJ1aWQiLCJleGVjIiwia2V5cyIsIklFX1BST1RPIiwibmF0aXZlT2JqZWN0VG9TdHJpbmciLCJvYmplY3RDdG9yU3RyaW5nIiwib2xkRGFzaCIsInJlSXNOYXRpdmUiLCJyZXBsYWNlIiwiQnVmZmVyIiwiU3ltYm9sIiwiVWludDhBcnJheSIsImFsbG9jVW5zYWZlIiwiZ2V0UHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJvYmplY3RDcmVhdGUiLCJjcmVhdGUiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInNwbGljZSIsInNwcmVhZGFibGVTeW1ib2wiLCJpc0NvbmNhdFNwcmVhZGFibGUiLCJzeW1JdGVyYXRvciIsInN5bVRvU3RyaW5nVGFnIiwidG9TdHJpbmdUYWciLCJkZWZpbmVQcm9wZXJ0eSIsImdldE5hdGl2ZSIsImN0eENsZWFyVGltZW91dCIsImNsZWFyVGltZW91dCIsImN0eE5vdyIsIm5vdyIsImN0eFNldFRpbWVvdXQiLCJzZXRUaW1lb3V0IiwibmF0aXZlQ2VpbCIsImNlaWwiLCJuYXRpdmVGbG9vciIsImZsb29yIiwibmF0aXZlR2V0U3ltYm9scyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm5hdGl2ZUlzQnVmZmVyIiwiaXNCdWZmZXIiLCJuYXRpdmVJc0Zpbml0ZSIsImlzRmluaXRlIiwibmF0aXZlSm9pbiIsIm5hdGl2ZUtleXMiLCJuYXRpdmVNYXgiLCJtYXgiLCJuYXRpdmVNaW4iLCJtaW4iLCJuYXRpdmVOb3ciLCJuYXRpdmVQYXJzZUludCIsIm5hdGl2ZVJhbmRvbSIsInJhbmRvbSIsIm5hdGl2ZVJldmVyc2UiLCJyZXZlcnNlIiwiRGF0YVZpZXciLCJNYXAiLCJQcm9taXNlIiwiU2V0IiwiV2Vha01hcCIsIm5hdGl2ZUNyZWF0ZSIsIm1ldGFNYXAiLCJyZWFsTmFtZXMiLCJkYXRhVmlld0N0b3JTdHJpbmciLCJ0b1NvdXJjZSIsIm1hcEN0b3JTdHJpbmciLCJwcm9taXNlQ3RvclN0cmluZyIsInNldEN0b3JTdHJpbmciLCJ3ZWFrTWFwQ3RvclN0cmluZyIsInN5bWJvbFByb3RvIiwic3ltYm9sVmFsdWVPZiIsInZhbHVlT2YiLCJzeW1ib2xUb1N0cmluZyIsImxvZGFzaCIsImlzT2JqZWN0TGlrZSIsImlzQXJyYXkiLCJMYXp5V3JhcHBlciIsIkxvZGFzaFdyYXBwZXIiLCJ3cmFwcGVyQ2xvbmUiLCJiYXNlQ3JlYXRlIiwicHJvdG8iLCJpc09iamVjdCIsImJhc2VMb2Rhc2giLCJjaGFpbkFsbCIsIl9fd3JhcHBlZF9fIiwiX19hY3Rpb25zX18iLCJfX2NoYWluX18iLCJfX2luZGV4X18iLCJfX3ZhbHVlc19fIiwidGVtcGxhdGVTZXR0aW5ncyIsImNvbnN0cnVjdG9yIiwiX19kaXJfXyIsIl9fZmlsdGVyZWRfXyIsIl9faXRlcmF0ZWVzX18iLCJfX3Rha2VDb3VudF9fIiwiX192aWV3c19fIiwibGF6eUNsb25lIiwiY29weUFycmF5IiwibGF6eVJldmVyc2UiLCJjbG9uZSIsImxhenlWYWx1ZSIsImRpciIsImlzQXJyIiwiaXNSaWdodCIsImFyckxlbmd0aCIsInZpZXciLCJnZXRWaWV3Iiwic3RhcnQiLCJlbmQiLCJpdGVyYXRlZXMiLCJpdGVyTGVuZ3RoIiwidGFrZUNvdW50IiwiYmFzZVdyYXBwZXJWYWx1ZSIsIm91dGVyIiwiaXRlckluZGV4IiwidHlwZSIsImNvbXB1dGVkIiwiSGFzaCIsImVudHJpZXMiLCJjbGVhciIsImVudHJ5IiwiaGFzaENsZWFyIiwiX19kYXRhX18iLCJoYXNoRGVsZXRlIiwiaGFzaEdldCIsImhhc2hIYXMiLCJoYXNoU2V0IiwiZ2V0IiwiTGlzdENhY2hlIiwibGlzdENhY2hlQ2xlYXIiLCJsaXN0Q2FjaGVEZWxldGUiLCJhc3NvY0luZGV4T2YiLCJwb3AiLCJsaXN0Q2FjaGVHZXQiLCJsaXN0Q2FjaGVIYXMiLCJsaXN0Q2FjaGVTZXQiLCJNYXBDYWNoZSIsIm1hcENhY2hlQ2xlYXIiLCJtYXBDYWNoZURlbGV0ZSIsImdldE1hcERhdGEiLCJtYXBDYWNoZUdldCIsIm1hcENhY2hlSGFzIiwibWFwQ2FjaGVTZXQiLCJTZXRDYWNoZSIsImFkZCIsInNldENhY2hlQWRkIiwic2V0Q2FjaGVIYXMiLCJTdGFjayIsInN0YWNrQ2xlYXIiLCJzdGFja0RlbGV0ZSIsInN0YWNrR2V0Iiwic3RhY2tIYXMiLCJzdGFja1NldCIsInBhaXJzIiwiYXJyYXlMaWtlS2V5cyIsImluaGVyaXRlZCIsImlzQXJnIiwiaXNBcmd1bWVudHMiLCJpc0J1ZmYiLCJpc1R5cGUiLCJza2lwSW5kZXhlcyIsImlzSW5kZXgiLCJhcnJheVNhbXBsZSIsImJhc2VSYW5kb20iLCJhcnJheVNhbXBsZVNpemUiLCJzaHVmZmxlU2VsZiIsImJhc2VDbGFtcCIsImFycmF5U2h1ZmZsZSIsImFzc2lnbk1lcmdlVmFsdWUiLCJlcSIsImJhc2VBc3NpZ25WYWx1ZSIsImFzc2lnblZhbHVlIiwib2JqVmFsdWUiLCJiYXNlQWdncmVnYXRvciIsImJhc2VFYWNoIiwiYmFzZUFzc2lnbiIsImNvcHlPYmplY3QiLCJiYXNlQXNzaWduSW4iLCJrZXlzSW4iLCJiYXNlQXQiLCJwYXRocyIsInNraXAiLCJudW1iZXIiLCJsb3dlciIsInVwcGVyIiwiYmFzZUNsb25lIiwiYml0bWFzayIsImN1c3RvbWl6ZXIiLCJzdGFjayIsImlzRGVlcCIsImlzRmxhdCIsImlzRnVsbCIsImluaXRDbG9uZUFycmF5IiwidGFnIiwiZ2V0VGFnIiwiaXNGdW5jIiwiY2xvbmVCdWZmZXIiLCJpbml0Q2xvbmVPYmplY3QiLCJjb3B5U3ltYm9sc0luIiwiY29weVN5bWJvbHMiLCJpbml0Q2xvbmVCeVRhZyIsInN0YWNrZWQiLCJzdWJWYWx1ZSIsImtleXNGdW5jIiwiZ2V0QWxsS2V5c0luIiwiZ2V0QWxsS2V5cyIsImJhc2VDb25mb3JtcyIsImJhc2VDb25mb3Jtc1RvIiwiYmFzZURlbGF5Iiwid2FpdCIsImJhc2VEaWZmZXJlbmNlIiwiaW5jbHVkZXMiLCJpc0NvbW1vbiIsInZhbHVlc0xlbmd0aCIsInZhbHVlc0luZGV4IiwiY3JlYXRlQmFzZUVhY2giLCJiYXNlRm9yT3duIiwiYmFzZUVhY2hSaWdodCIsImJhc2VGb3JPd25SaWdodCIsImJhc2VFdmVyeSIsImJhc2VFeHRyZW11bSIsImlzU3ltYm9sIiwiYmFzZUZpbGwiLCJ0b0ludGVnZXIiLCJ0b0xlbmd0aCIsImJhc2VGaWx0ZXIiLCJiYXNlRmxhdHRlbiIsImRlcHRoIiwiaXNTdHJpY3QiLCJpc0ZsYXR0ZW5hYmxlIiwiYmFzZUZvciIsImNyZWF0ZUJhc2VGb3IiLCJiYXNlRm9yUmlnaHQiLCJiYXNlRnVuY3Rpb25zIiwiaXNGdW5jdGlvbiIsImJhc2VHZXQiLCJwYXRoIiwiY2FzdFBhdGgiLCJ0b0tleSIsImJhc2VHZXRBbGxLZXlzIiwic3ltYm9sc0Z1bmMiLCJiYXNlR2V0VGFnIiwiZ2V0UmF3VGFnIiwib2JqZWN0VG9TdHJpbmciLCJiYXNlR3QiLCJvdGhlciIsImJhc2VIYXMiLCJiYXNlSGFzSW4iLCJiYXNlSW5SYW5nZSIsImJhc2VJbnRlcnNlY3Rpb24iLCJhcnJheXMiLCJvdGhMZW5ndGgiLCJvdGhJbmRleCIsImNhY2hlcyIsIm1heExlbmd0aCIsIkluZmluaXR5Iiwic2VlbiIsImJhc2VJbnZlcnRlciIsImJhc2VJbnZva2UiLCJwYXJlbnQiLCJsYXN0IiwiYmFzZUlzQXJndW1lbnRzIiwiYmFzZUlzQXJyYXlCdWZmZXIiLCJiYXNlSXNEYXRlIiwiYmFzZUlzRXF1YWwiLCJiYXNlSXNFcXVhbERlZXAiLCJlcXVhbEZ1bmMiLCJvYmpJc0FyciIsIm90aElzQXJyIiwib2JqVGFnIiwib3RoVGFnIiwib2JqSXNPYmoiLCJvdGhJc09iaiIsImlzU2FtZVRhZyIsImVxdWFsQXJyYXlzIiwiZXF1YWxCeVRhZyIsIm9iaklzV3JhcHBlZCIsIm90aElzV3JhcHBlZCIsIm9ialVud3JhcHBlZCIsIm90aFVud3JhcHBlZCIsImVxdWFsT2JqZWN0cyIsImJhc2VJc01hcCIsImJhc2VJc01hdGNoIiwibWF0Y2hEYXRhIiwibm9DdXN0b21pemVyIiwic3JjVmFsdWUiLCJiYXNlSXNOYXRpdmUiLCJpc01hc2tlZCIsInBhdHRlcm4iLCJiYXNlSXNSZWdFeHAiLCJiYXNlSXNTZXQiLCJiYXNlSXNUeXBlZEFycmF5IiwiaXNMZW5ndGgiLCJiYXNlSXRlcmF0ZWUiLCJpZGVudGl0eSIsImJhc2VNYXRjaGVzUHJvcGVydHkiLCJiYXNlTWF0Y2hlcyIsInByb3BlcnR5IiwiYmFzZUtleXMiLCJpc1Byb3RvdHlwZSIsImJhc2VLZXlzSW4iLCJuYXRpdmVLZXlzSW4iLCJpc1Byb3RvIiwiYmFzZUx0IiwiYmFzZU1hcCIsImlzQXJyYXlMaWtlIiwiZ2V0TWF0Y2hEYXRhIiwibWF0Y2hlc1N0cmljdENvbXBhcmFibGUiLCJpc0tleSIsImlzU3RyaWN0Q29tcGFyYWJsZSIsImhhc0luIiwiYmFzZU1lcmdlIiwic3JjSW5kZXgiLCJiYXNlTWVyZ2VEZWVwIiwibmV3VmFsdWUiLCJzYWZlR2V0IiwibWVyZ2VGdW5jIiwiaXNUeXBlZCIsImlzQXJyYXlMaWtlT2JqZWN0IiwiY2xvbmVUeXBlZEFycmF5IiwiaXNQbGFpbk9iamVjdCIsInRvUGxhaW5PYmplY3QiLCJiYXNlTnRoIiwiYmFzZU9yZGVyQnkiLCJvcmRlcnMiLCJnZXRJdGVyYXRlZSIsImNyaXRlcmlhIiwiY29tcGFyZU11bHRpcGxlIiwiYmFzZVBpY2siLCJiYXNlUGlja0J5IiwiYmFzZVNldCIsImJhc2VQcm9wZXJ0eURlZXAiLCJiYXNlUHVsbEFsbCIsImluZGV4T2YiLCJiYXNlUHVsbEF0IiwiaW5kZXhlcyIsInByZXZpb3VzIiwiYmFzZVVuc2V0IiwiYmFzZVJhbmdlIiwic3RlcCIsImJhc2VSZXBlYXQiLCJiYXNlUmVzdCIsInNldFRvU3RyaW5nIiwib3ZlclJlc3QiLCJiYXNlU2FtcGxlIiwiYmFzZVNhbXBsZVNpemUiLCJuZXN0ZWQiLCJiYXNlU2V0RGF0YSIsImJhc2VTZXRUb1N0cmluZyIsImNvbnN0YW50IiwiYmFzZVNodWZmbGUiLCJiYXNlU2xpY2UiLCJiYXNlU29tZSIsImJhc2VTb3J0ZWRJbmRleCIsInJldEhpZ2hlc3QiLCJsb3ciLCJoaWdoIiwibWlkIiwiYmFzZVNvcnRlZEluZGV4QnkiLCJ2YWxJc05hTiIsInZhbElzTnVsbCIsInZhbElzU3ltYm9sIiwidmFsSXNVbmRlZmluZWQiLCJvdGhJc0RlZmluZWQiLCJvdGhJc051bGwiLCJvdGhJc1JlZmxleGl2ZSIsIm90aElzU3ltYm9sIiwic2V0TG93IiwiYmFzZVNvcnRlZFVuaXEiLCJiYXNlVG9OdW1iZXIiLCJiYXNlVG9TdHJpbmciLCJiYXNlVW5pcSIsImNyZWF0ZVNldCIsInNlZW5JbmRleCIsImJhc2VVcGRhdGUiLCJ1cGRhdGVyIiwiYmFzZVdoaWxlIiwiaXNEcm9wIiwiYWN0aW9ucyIsImFjdGlvbiIsImJhc2VYb3IiLCJiYXNlWmlwT2JqZWN0IiwiYXNzaWduRnVuYyIsInZhbHNMZW5ndGgiLCJjYXN0QXJyYXlMaWtlT2JqZWN0IiwiY2FzdEZ1bmN0aW9uIiwic3RyaW5nVG9QYXRoIiwiY2FzdFJlc3QiLCJjYXN0U2xpY2UiLCJpZCIsImJ1ZmZlciIsInNsaWNlIiwiY29weSIsImNsb25lQXJyYXlCdWZmZXIiLCJhcnJheUJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJjbG9uZURhdGFWaWV3IiwiZGF0YVZpZXciLCJieXRlT2Zmc2V0IiwiY2xvbmVSZWdFeHAiLCJyZWdleHAiLCJjbG9uZVN5bWJvbCIsInN5bWJvbCIsInR5cGVkQXJyYXkiLCJjb21wYXJlQXNjZW5kaW5nIiwidmFsSXNEZWZpbmVkIiwidmFsSXNSZWZsZXhpdmUiLCJvYmpDcml0ZXJpYSIsIm90aENyaXRlcmlhIiwib3JkZXJzTGVuZ3RoIiwib3JkZXIiLCJjb21wb3NlQXJncyIsInBhcnRpYWxzIiwiaG9sZGVycyIsImlzQ3VycmllZCIsImFyZ3NJbmRleCIsImFyZ3NMZW5ndGgiLCJob2xkZXJzTGVuZ3RoIiwibGVmdEluZGV4IiwibGVmdExlbmd0aCIsInJhbmdlTGVuZ3RoIiwiaXNVbmN1cnJpZWQiLCJjb21wb3NlQXJnc1JpZ2h0IiwiaG9sZGVyc0luZGV4IiwicmlnaHRJbmRleCIsInJpZ2h0TGVuZ3RoIiwiaXNOZXciLCJnZXRTeW1ib2xzIiwiZ2V0U3ltYm9sc0luIiwiY3JlYXRlQWdncmVnYXRvciIsImluaXRpYWxpemVyIiwiY3JlYXRlQXNzaWduZXIiLCJhc3NpZ25lciIsInNvdXJjZXMiLCJndWFyZCIsImlzSXRlcmF0ZWVDYWxsIiwiaXRlcmFibGUiLCJjcmVhdGVCaW5kIiwiaXNCaW5kIiwiQ3RvciIsImNyZWF0ZUN0b3IiLCJ3cmFwcGVyIiwiZm4iLCJhcmd1bWVudHMiLCJjcmVhdGVDYXNlRmlyc3QiLCJtZXRob2ROYW1lIiwiY2hhckF0IiwidHJhaWxpbmciLCJjcmVhdGVDb21wb3VuZGVyIiwiY2FsbGJhY2siLCJ3b3JkcyIsImRlYnVyciIsInRoaXNCaW5kaW5nIiwiY3JlYXRlQ3VycnkiLCJhcml0eSIsImdldEhvbGRlciIsImNyZWF0ZVJlY3VycnkiLCJjcmVhdGVIeWJyaWQiLCJjcmVhdGVGaW5kIiwiZmluZEluZGV4RnVuYyIsImNyZWF0ZUZsb3ciLCJmbGF0UmVzdCIsImZ1bmNzIiwicHJlcmVxIiwidGhydSIsImdldEZ1bmNOYW1lIiwiZnVuY05hbWUiLCJnZXREYXRhIiwiaXNMYXppYWJsZSIsInBsYW50IiwicGFydGlhbHNSaWdodCIsImhvbGRlcnNSaWdodCIsImFyZ1BvcyIsImFyeSIsImlzQXJ5IiwiaXNCaW5kS2V5IiwiaXNGbGlwIiwiaG9sZGVyc0NvdW50IiwibmV3SG9sZGVycyIsInJlb3JkZXIiLCJjcmVhdGVJbnZlcnRlciIsInRvSXRlcmF0ZWUiLCJjcmVhdGVNYXRoT3BlcmF0aW9uIiwib3BlcmF0b3IiLCJkZWZhdWx0VmFsdWUiLCJjcmVhdGVPdmVyIiwiYXJyYXlGdW5jIiwiY3JlYXRlUGFkZGluZyIsImNoYXJzIiwiY2hhcnNMZW5ndGgiLCJjcmVhdGVQYXJ0aWFsIiwiY3JlYXRlUmFuZ2UiLCJ0b0Zpbml0ZSIsImNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24iLCJ0b051bWJlciIsIndyYXBGdW5jIiwiaXNDdXJyeSIsIm5ld0hvbGRlcnNSaWdodCIsIm5ld1BhcnRpYWxzIiwibmV3UGFydGlhbHNSaWdodCIsIm5ld0RhdGEiLCJzZXREYXRhIiwic2V0V3JhcFRvU3RyaW5nIiwiY3JlYXRlUm91bmQiLCJwcmVjaXNpb24iLCJwYWlyIiwibm9vcCIsImNyZWF0ZVRvUGFpcnMiLCJjcmVhdGVXcmFwIiwibWVyZ2VEYXRhIiwiY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiIsImN1c3RvbURlZmF1bHRzTWVyZ2UiLCJjdXN0b21PbWl0Q2xvbmUiLCJpc1BhcnRpYWwiLCJhcnJTdGFja2VkIiwib3RoU3RhY2tlZCIsImFyclZhbHVlIiwib3RoVmFsdWUiLCJjb21wYXJlZCIsIm5hbWUiLCJtZXNzYWdlIiwiY29udmVydCIsIm9ialByb3BzIiwib2JqTGVuZ3RoIiwib3RoUHJvcHMiLCJvYmpTdGFja2VkIiwic2tpcEN0b3IiLCJvYmpDdG9yIiwib3RoQ3RvciIsImZsYXR0ZW4iLCJvdGhlckZ1bmMiLCJpc0tleWFibGUiLCJpc093biIsInVubWFza2VkIiwic3R1YkFycmF5IiwiQXJyYXlCdWZmZXIiLCJyZXNvbHZlIiwiY3RvclN0cmluZyIsInRyYW5zZm9ybXMiLCJnZXRXcmFwRGV0YWlscyIsImhhc1BhdGgiLCJoYXNGdW5jIiwiaW5wdXQiLCJpbnNlcnRXcmFwRGV0YWlscyIsImRldGFpbHMiLCJpc01hc2thYmxlIiwic3R1YkZhbHNlIiwibWVtb2l6ZUNhcHBlZCIsIm1lbW9pemUiLCJzcmNCaXRtYXNrIiwibmV3Qml0bWFzayIsImlzQ29tYm8iLCJvdGhlckFyZ3MiLCJvbGRBcnJheSIsInNob3J0T3V0IiwicmVmZXJlbmNlIiwidXBkYXRlV3JhcERldGFpbHMiLCJjb3VudCIsImxhc3RDYWxsZWQiLCJzdGFtcCIsInJlbWFpbmluZyIsInJhbmQiLCJjaGFyQ29kZUF0IiwicXVvdGUiLCJzdWJTdHJpbmciLCJjaHVuayIsImNvbXBhY3QiLCJjb25jYXQiLCJkaWZmZXJlbmNlIiwiZGlmZmVyZW5jZUJ5IiwiZGlmZmVyZW5jZVdpdGgiLCJkcm9wIiwiZHJvcFJpZ2h0IiwiZHJvcFJpZ2h0V2hpbGUiLCJkcm9wV2hpbGUiLCJmaWxsIiwiZmluZEluZGV4IiwiZmluZExhc3RJbmRleCIsImZsYXR0ZW5EZWVwIiwiZmxhdHRlbkRlcHRoIiwiZnJvbVBhaXJzIiwiaGVhZCIsImluaXRpYWwiLCJpbnRlcnNlY3Rpb24iLCJtYXBwZWQiLCJpbnRlcnNlY3Rpb25CeSIsImludGVyc2VjdGlvbldpdGgiLCJzZXBhcmF0b3IiLCJsYXN0SW5kZXhPZiIsIm50aCIsInB1bGwiLCJwdWxsQWxsIiwicHVsbEFsbEJ5IiwicHVsbEFsbFdpdGgiLCJwdWxsQXQiLCJyZW1vdmUiLCJzb3J0ZWRJbmRleCIsInNvcnRlZEluZGV4QnkiLCJzb3J0ZWRJbmRleE9mIiwic29ydGVkTGFzdEluZGV4Iiwic29ydGVkTGFzdEluZGV4QnkiLCJzb3J0ZWRMYXN0SW5kZXhPZiIsInNvcnRlZFVuaXEiLCJzb3J0ZWRVbmlxQnkiLCJ0YWlsIiwidGFrZSIsInRha2VSaWdodCIsInRha2VSaWdodFdoaWxlIiwidGFrZVdoaWxlIiwidW5pb24iLCJ1bmlvbkJ5IiwidW5pb25XaXRoIiwidW5pcSIsInVuaXFCeSIsInVuaXFXaXRoIiwidW56aXAiLCJncm91cCIsInVuemlwV2l0aCIsIndpdGhvdXQiLCJ4b3IiLCJ4b3JCeSIsInhvcldpdGgiLCJ6aXAiLCJ6aXBPYmplY3QiLCJ6aXBPYmplY3REZWVwIiwiemlwV2l0aCIsImNoYWluIiwidGFwIiwiaW50ZXJjZXB0b3IiLCJ3cmFwcGVyQXQiLCJ3cmFwcGVyQ2hhaW4iLCJ3cmFwcGVyQ29tbWl0Iiwid3JhcHBlck5leHQiLCJ0b0FycmF5Iiwid3JhcHBlclRvSXRlcmF0b3IiLCJ3cmFwcGVyUGxhbnQiLCJ3cmFwcGVyUmV2ZXJzZSIsIndyYXBwZWQiLCJ3cmFwcGVyVmFsdWUiLCJjb3VudEJ5IiwiZXZlcnkiLCJmaWx0ZXIiLCJmaW5kIiwiZmluZExhc3QiLCJmbGF0TWFwIiwiZmxhdE1hcERlZXAiLCJmbGF0TWFwRGVwdGgiLCJmb3JFYWNoUmlnaHQiLCJncm91cEJ5IiwiaXNTdHJpbmciLCJpbnZva2VNYXAiLCJrZXlCeSIsIm9yZGVyQnkiLCJwYXJ0aXRpb24iLCJyZWR1Y2UiLCJyZWR1Y2VSaWdodCIsInJlamVjdCIsIm5lZ2F0ZSIsInNhbXBsZSIsInNhbXBsZVNpemUiLCJzaHVmZmxlIiwic29tZSIsInNvcnRCeSIsImFmdGVyIiwiYmVmb3JlIiwiYmluZCIsImJpbmRLZXkiLCJjdXJyeSIsImN1cnJ5UmlnaHQiLCJkZWJvdW5jZSIsIm9wdGlvbnMiLCJsYXN0QXJncyIsImxhc3RUaGlzIiwibWF4V2FpdCIsInRpbWVySWQiLCJsYXN0Q2FsbFRpbWUiLCJsYXN0SW52b2tlVGltZSIsImxlYWRpbmciLCJtYXhpbmciLCJpbnZva2VGdW5jIiwidGltZSIsImxlYWRpbmdFZGdlIiwidGltZXJFeHBpcmVkIiwicmVtYWluaW5nV2FpdCIsInRpbWVTaW5jZUxhc3RDYWxsIiwidGltZVNpbmNlTGFzdEludm9rZSIsInRpbWVXYWl0aW5nIiwic2hvdWxkSW52b2tlIiwidHJhaWxpbmdFZGdlIiwiY2FuY2VsIiwiZmx1c2giLCJkZWJvdW5jZWQiLCJpc0ludm9raW5nIiwiZGVmZXIiLCJkZWxheSIsImZsaXAiLCJyZXNvbHZlciIsIm1lbW9pemVkIiwiQ2FjaGUiLCJvbmNlIiwib3ZlckFyZ3MiLCJmdW5jc0xlbmd0aCIsInBhcnRpYWwiLCJwYXJ0aWFsUmlnaHQiLCJyZWFyZyIsInJlc3QiLCJzcHJlYWQiLCJ0aHJvdHRsZSIsInVuYXJ5Iiwid3JhcCIsImNhc3RBcnJheSIsImNsb25lV2l0aCIsImNsb25lRGVlcCIsImNsb25lRGVlcFdpdGgiLCJjb25mb3Jtc1RvIiwiZ3QiLCJndGUiLCJpc0Jvb2xlYW4iLCJpc0VsZW1lbnQiLCJpc0VtcHR5IiwiaXNFcXVhbCIsImlzRXF1YWxXaXRoIiwiaXNFcnJvciIsImlzSW50ZWdlciIsImlzTWF0Y2giLCJpc01hdGNoV2l0aCIsImlzTmFOIiwiaXNOdW1iZXIiLCJpc05hdGl2ZSIsImlzTnVsbCIsImlzTmlsIiwiaXNTYWZlSW50ZWdlciIsImlzVW5kZWZpbmVkIiwiaXNXZWFrTWFwIiwiaXNXZWFrU2V0IiwibHQiLCJsdGUiLCJzaWduIiwicmVtYWluZGVyIiwiaXNCaW5hcnkiLCJ0b1NhZmVJbnRlZ2VyIiwiYXNzaWduIiwiYXNzaWduSW4iLCJhc3NpZ25JbldpdGgiLCJhc3NpZ25XaXRoIiwiYXQiLCJwcm9wZXJ0aWVzIiwicHJvcHNJbmRleCIsInByb3BzTGVuZ3RoIiwiZGVmYXVsdHNEZWVwIiwibWVyZ2VXaXRoIiwiZmluZEtleSIsImZpbmRMYXN0S2V5IiwiZm9ySW4iLCJmb3JJblJpZ2h0IiwiZm9yT3duIiwiZm9yT3duUmlnaHQiLCJmdW5jdGlvbnMiLCJmdW5jdGlvbnNJbiIsImludmVydCIsImludmVydEJ5IiwiaW52b2tlIiwibWFwS2V5cyIsIm1hcFZhbHVlcyIsIm1lcmdlIiwib21pdCIsIm9taXRCeSIsInBpY2tCeSIsInByb3AiLCJzZXRXaXRoIiwidG9QYWlycyIsInRvUGFpcnNJbiIsImlzQXJyTGlrZSIsInVuc2V0IiwidXBkYXRlIiwidXBkYXRlV2l0aCIsInZhbHVlc0luIiwiY2xhbXAiLCJpblJhbmdlIiwiZmxvYXRpbmciLCJ0ZW1wIiwiY2FtZWxDYXNlIiwid29yZCIsInRvTG93ZXJDYXNlIiwiY2FwaXRhbGl6ZSIsInVwcGVyRmlyc3QiLCJlbmRzV2l0aCIsInRhcmdldCIsInBvc2l0aW9uIiwiZXNjYXBlIiwiZXNjYXBlUmVnRXhwIiwia2ViYWJDYXNlIiwibG93ZXJDYXNlIiwibG93ZXJGaXJzdCIsInBhZCIsInN0ckxlbmd0aCIsInBhZEVuZCIsInBhZFN0YXJ0IiwicmFkaXgiLCJyZXBlYXQiLCJzbmFrZUNhc2UiLCJsaW1pdCIsInN0YXJ0Q2FzZSIsInN0YXJ0c1dpdGgiLCJ0ZW1wbGF0ZSIsInNldHRpbmdzIiwiaW1wb3J0cyIsImltcG9ydHNLZXlzIiwiaW1wb3J0c1ZhbHVlcyIsImlzRXNjYXBpbmciLCJpc0V2YWx1YXRpbmciLCJpbnRlcnBvbGF0ZSIsInJlRGVsaW1pdGVycyIsImV2YWx1YXRlIiwic291cmNlVVJMIiwiZXNjYXBlVmFsdWUiLCJpbnRlcnBvbGF0ZVZhbHVlIiwiZXNUZW1wbGF0ZVZhbHVlIiwiZXZhbHVhdGVWYWx1ZSIsInZhcmlhYmxlIiwiYXR0ZW1wdCIsInRvTG93ZXIiLCJ0b1VwcGVyIiwidG9VcHBlckNhc2UiLCJ0cmltIiwidHJpbUVuZCIsInRyaW1TdGFydCIsInRydW5jYXRlIiwib21pc3Npb24iLCJzZWFyY2giLCJzdWJzdHJpbmciLCJuZXdFbmQiLCJ1bmVzY2FwZSIsInVwcGVyQ2FzZSIsImJpbmRBbGwiLCJtZXRob2ROYW1lcyIsImNvbmQiLCJjb25mb3JtcyIsImRlZmF1bHRUbyIsImZsb3ciLCJmbG93UmlnaHQiLCJtYXRjaGVzIiwibWF0Y2hlc1Byb3BlcnR5IiwibWV0aG9kIiwibWV0aG9kT2YiLCJtaXhpbiIsIm5vQ29uZmxpY3QiLCJudGhBcmciLCJvdmVyIiwib3ZlckV2ZXJ5Iiwib3ZlclNvbWUiLCJwcm9wZXJ0eU9mIiwicmFuZ2UiLCJyYW5nZVJpZ2h0Iiwic3R1Yk9iamVjdCIsInN0dWJTdHJpbmciLCJzdHViVHJ1ZSIsInRpbWVzIiwidG9QYXRoIiwidW5pcXVlSWQiLCJwcmVmaXgiLCJhdWdlbmQiLCJhZGRlbmQiLCJkaXZpZGUiLCJkaXZpZGVuZCIsImRpdmlzb3IiLCJtYXhCeSIsIm1lYW4iLCJtZWFuQnkiLCJtaW5CeSIsIm11bHRpcGx5IiwibXVsdGlwbGllciIsIm11bHRpcGxpY2FuZCIsInJvdW5kIiwic3VidHJhY3QiLCJtaW51ZW5kIiwic3VidHJhaGVuZCIsInN1bSIsInN1bUJ5IiwiZW50cmllc0luIiwiZXh0ZW5kIiwiZXh0ZW5kV2l0aCIsImVhY2giLCJlYWNoUmlnaHQiLCJmaXJzdCIsImlzRmlsdGVyIiwidGFrZU5hbWUiLCJkcm9wTmFtZSIsImNoZWNrSXRlcmF0ZWUiLCJpc1Rha2VyIiwibG9kYXNoRnVuYyIsInJldFVud3JhcHBlZCIsImlzTGF6eSIsInVzZUxhenkiLCJpc0h5YnJpZCIsImlzVW53cmFwcGVkIiwib25seUxhenkiLCJjaGFpbk5hbWUiLCJjb21taXQiLCJ0b0pTT04iLCJkZWZpbmUiXSwibWFwcGluZ3MiOiI7K1dBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUNBLENBQUUsV0FBVyxDQUVYLHdFQUNBLEdBQUlBLFVB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Q0Fnd2hCSyxJQWh3aEJMLENBQUQiLCJmaWxlIjoiOTQ1MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIENvcHlyaWdodCBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL29wZW5qc2Yub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuOyhmdW5jdGlvbigpIHtcblxuICAvKiogVXNlZCBhcyBhIHNhZmUgcmVmZXJlbmNlIGZvciBgdW5kZWZpbmVkYCBpbiBwcmUtRVM1IGVudmlyb25tZW50cy4gKi9cbiAgdmFyIHVuZGVmaW5lZDtcblxuICAvKiogVXNlZCBhcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuICovXG4gIHZhciBWRVJTSU9OID0gJzQuMTcuMjAnO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xuICB2YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuICAvKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG4gIHZhciBDT1JFX0VSUk9SX1RFWFQgPSAnVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuJyxcbiAgICAgIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuICAvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG4gIHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuICAvKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG4gIHZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbiAgdmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG4gIHZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG4gIHZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgdmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICAgIFdSQVBfQklORF9LRVlfRkxBRyA9IDIsXG4gICAgICBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcgPSA0LFxuICAgICAgV1JBUF9DVVJSWV9GTEFHID0gOCxcbiAgICAgIFdSQVBfQ1VSUllfUklHSFRfRkxBRyA9IDE2LFxuICAgICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMixcbiAgICAgIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgICBXUkFQX0FSWV9GTEFHID0gMTI4LFxuICAgICAgV1JBUF9SRUFSR19GTEFHID0gMjU2LFxuICAgICAgV1JBUF9GTElQX0ZMQUcgPSA1MTI7XG5cbiAgLyoqIFVzZWQgYXMgZGVmYXVsdCBvcHRpb25zIGZvciBgXy50cnVuY2F0ZWAuICovXG4gIHZhciBERUZBVUxUX1RSVU5DX0xFTkdUSCA9IDMwLFxuICAgICAgREVGQVVMVF9UUlVOQ19PTUlTU0lPTiA9ICcuLi4nO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbiAgdmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICAgIEhPVF9TUEFOID0gMTY7XG5cbiAgLyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovXG4gIHZhciBMQVpZX0ZJTFRFUl9GTEFHID0gMSxcbiAgICAgIExBWllfTUFQX0ZMQUcgPSAyLFxuICAgICAgTEFaWV9XSElMRV9GTEFHID0gMztcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbiAgdmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgICBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MSxcbiAgICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgICBOQU4gPSAwIC8gMDtcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqL1xuICB2YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTUsXG4gICAgICBNQVhfQVJSQVlfSU5ERVggPSBNQVhfQVJSQVlfTEVOR1RIIC0gMSxcbiAgICAgIEhBTEZfTUFYX0FSUkFZX0xFTkdUSCA9IE1BWF9BUlJBWV9MRU5HVEggPj4+IDE7XG5cbiAgLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbiAgdmFyIHdyYXBGbGFncyA9IFtcbiAgICBbJ2FyeScsIFdSQVBfQVJZX0ZMQUddLFxuICAgIFsnYmluZCcsIFdSQVBfQklORF9GTEFHXSxcbiAgICBbJ2JpbmRLZXknLCBXUkFQX0JJTkRfS0VZX0ZMQUddLFxuICAgIFsnY3VycnknLCBXUkFQX0NVUlJZX0ZMQUddLFxuICAgIFsnY3VycnlSaWdodCcsIFdSQVBfQ1VSUllfUklHSFRfRkxBR10sXG4gICAgWydmbGlwJywgV1JBUF9GTElQX0ZMQUddLFxuICAgIFsncGFydGlhbCcsIFdSQVBfUEFSVElBTF9GTEFHXSxcbiAgICBbJ3BhcnRpYWxSaWdodCcsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSxcbiAgICBbJ3JlYXJnJywgV1JBUF9SRUFSR19GTEFHXVxuICBdO1xuXG4gIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICAgIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgICBkb21FeGNUYWcgPSAnW29iamVjdCBET01FeGNlcHRpb25dJyxcbiAgICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgICBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nLFxuICAgICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJyxcbiAgICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXScsXG4gICAgICB3ZWFrU2V0VGFnID0gJ1tvYmplY3QgV2Vha1NldF0nO1xuXG4gIHZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggZW1wdHkgc3RyaW5nIGxpdGVyYWxzIGluIGNvbXBpbGVkIHRlbXBsYXRlIHNvdXJjZS4gKi9cbiAgdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nID0gL1xcYl9fcCBcXCs9ICcnOy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cXGIoX19wIFxcKz0pICcnIFxcKy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ1RyYWlsaW5nID0gLyhfX2VcXCguKj9cXCl8XFxiX190XFwpKSBcXCtcXG4nJzsvZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMuICovXG4gIHZhciByZUVzY2FwZWRIdG1sID0gLyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFxuICAgICAgcmVVbmVzY2FwZWRIdG1sID0gL1smPD5cIiddL2csXG4gICAgICByZUhhc0VzY2FwZWRIdG1sID0gUmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxcbiAgICAgIHJlSGFzVW5lc2NhcGVkSHRtbCA9IFJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGUgPSAvPCUtKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlRXZhbHVhdGUgPSAvPCUoW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVJbnRlcnBvbGF0ZSA9IC88JT0oW1xcc1xcU10rPyklPi9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbiAgdmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC8sXG4gICAgICByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gICAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICAgKi9cbiAgdmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxcbiAgICAgIHJlSGFzUmVnRXhwQ2hhciA9IFJlZ0V4cChyZVJlZ0V4cENoYXIuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xuICB2YXIgcmVUcmltID0gL15cXHMrfFxccyskL2csXG4gICAgICByZVRyaW1TdGFydCA9IC9eXFxzKy8sXG4gICAgICByZVRyaW1FbmQgPSAvXFxzKyQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdyYXAgZGV0YWlsIGNvbW1lbnRzLiAqL1xuICB2YXIgcmVXcmFwQ29tbWVudCA9IC9cXHsoPzpcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoIC4rXFxdIFxcKlxcLyk/XFxuPy8sXG4gICAgICByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgICAgcmVTcGxpdERldGFpbHMgPSAvLD8gJiAvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdvcmRzIGNvbXBvc2VkIG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgcmVBc2NpaVdvcmQgPSAvW15cXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHg3Zl0rL2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaFxuICAgKiBbRVMgdGVtcGxhdGUgZGVsaW1pdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdGVtcGxhdGUtbGl0ZXJhbC1sZXhpY2FsLWNvbXBvbmVudHMpLlxuICAgKi9cbiAgdmFyIHJlRXNUZW1wbGF0ZSA9IC9cXCRcXHsoW15cXFxcfV0qKD86XFxcXC5bXlxcXFx9XSopKilcXH0vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlRmxhZ3MgPSAvXFx3KiQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG4gIHZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG4gIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggTGF0aW4gVW5pY29kZSBsZXR0ZXJzIChleGNsdWRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdG9ycykuICovXG4gIHZhciByZUxhdGluID0gL1tcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx4ZmZcXHUwMTAwLVxcdTAxN2ZdL2c7XG5cbiAgLyoqIFVzZWQgdG8gZW5zdXJlIGNhcHR1cmluZyBvcmRlciBvZiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVOb01hdGNoID0gLygkXikvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHVuZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHJlVW5lc2NhcGVkU3RyaW5nID0gL1snXFxuXFxyXFx1MjAyOFxcdTIwMjlcXFxcXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbiAgdmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgICByc0RpbmdiYXRSYW5nZSA9ICdcXFxcdTI3MDAtXFxcXHUyN2JmJyxcbiAgICAgIHJzTG93ZXJSYW5nZSA9ICdhLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmYnLFxuICAgICAgcnNNYXRoT3BSYW5nZSA9ICdcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3JyxcbiAgICAgIHJzTm9uQ2hhclJhbmdlID0gJ1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZicsXG4gICAgICByc1B1bmN0dWF0aW9uUmFuZ2UgPSAnXFxcXHUyMDAwLVxcXFx1MjA2ZicsXG4gICAgICByc1NwYWNlUmFuZ2UgPSAnIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDAnLFxuICAgICAgcnNVcHBlclJhbmdlID0gJ0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZScsXG4gICAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZicsXG4gICAgICByc0JyZWFrUmFuZ2UgPSByc01hdGhPcFJhbmdlICsgcnNOb25DaGFyUmFuZ2UgKyByc1B1bmN0dWF0aW9uUmFuZ2UgKyByc1NwYWNlUmFuZ2U7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xuICB2YXIgcnNBcG9zID0gXCJbJ1xcdTIwMTldXCIsXG4gICAgICByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgICByc0JyZWFrID0gJ1snICsgcnNCcmVha1JhbmdlICsgJ10nLFxuICAgICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICAgIHJzRGlnaXRzID0gJ1xcXFxkKycsXG4gICAgICByc0RpbmdiYXQgPSAnWycgKyByc0RpbmdiYXRSYW5nZSArICddJyxcbiAgICAgIHJzTG93ZXIgPSAnWycgKyByc0xvd2VyUmFuZ2UgKyAnXScsXG4gICAgICByc01pc2MgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArIHJzQnJlYWtSYW5nZSArIHJzRGlnaXRzICsgcnNEaW5nYmF0UmFuZ2UgKyByc0xvd2VyUmFuZ2UgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgICByc05vbkFzdHJhbCA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICAgIHJzVXBwZXIgPSAnWycgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSByZWdleGVzLiAqL1xuICB2YXIgcnNNaXNjTG93ZXIgPSAnKD86JyArIHJzTG93ZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc01pc2NVcHBlciA9ICcoPzonICsgcnNVcHBlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICAgIHJzT3B0Q29udHJMb3dlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OmR8bGx8bXxyZXxzfHR8dmUpKT8nLFxuICAgICAgcnNPcHRDb250clVwcGVyID0gJyg/OicgKyByc0Fwb3MgKyAnKD86RHxMTHxNfFJFfFN8VHxWRSkpPycsXG4gICAgICByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgICByc09wdFZhciA9ICdbJyArIHJzVmFyUmFuZ2UgKyAnXT8nLFxuICAgICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICAgIHJzT3JkTG93ZXIgPSAnXFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pJyxcbiAgICAgIHJzT3JkVXBwZXIgPSAnXFxcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxcXGRUSCkoPz1cXFxcYnxbYS16X10pJyxcbiAgICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICAgIHJzRW1vamkgPSAnKD86JyArIFtyc0RpbmdiYXQsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzU2VxLFxuICAgICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYXBvc3Ryb3BoZXMuICovXG4gIHZhciByZUFwb3MgPSBSZWdFeHAocnNBcG9zLCAnZycpO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykgYW5kXG4gICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3MgZm9yIHN5bWJvbHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19mb3JfU3ltYm9scykuXG4gICAqL1xuICB2YXIgcmVDb21ib01hcmsgPSBSZWdFeHAocnNDb21ibywgJ2cnKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBbc3RyaW5nIHN5bWJvbHNdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUpLiAqL1xuICB2YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggY29tcGxleCBvciBjb21wb3VuZCB3b3Jkcy4gKi9cbiAgdmFyIHJlVW5pY29kZVdvcmQgPSBSZWdFeHAoW1xuICAgIHJzVXBwZXIgKyAnPycgKyByc0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gICAgcnNNaXNjVXBwZXIgKyAnKycgKyByc09wdENvbnRyVXBwZXIgKyAnKD89JyArIFtyc0JyZWFrLCByc1VwcGVyICsgcnNNaXNjTG93ZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzVXBwZXIgKyAnPycgKyByc01pc2NMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlcixcbiAgICByc1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyLFxuICAgIHJzT3JkVXBwZXIsXG4gICAgcnNPcmRMb3dlcixcbiAgICByc0RpZ2l0cyxcbiAgICByc0Vtb2ppXG4gIF0uam9pbignfCcpLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB0aGF0IG5lZWQgYSBtb3JlIHJvYnVzdCByZWdleHAgdG8gbWF0Y2ggd29yZHMuICovXG4gIHZhciByZUhhc1VuaWNvZGVXb3JkID0gL1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS87XG5cbiAgLyoqIFVzZWQgdG8gYXNzaWduIGRlZmF1bHQgYGNvbnRleHRgIG9iamVjdCBwcm9wZXJ0aWVzLiAqL1xuICB2YXIgY29udGV4dFByb3BzID0gW1xuICAgICdBcnJheScsICdCdWZmZXInLCAnRGF0YVZpZXcnLCAnRGF0ZScsICdFcnJvcicsICdGbG9hdDMyQXJyYXknLCAnRmxvYXQ2NEFycmF5JyxcbiAgICAnRnVuY3Rpb24nLCAnSW50OEFycmF5JywgJ0ludDE2QXJyYXknLCAnSW50MzJBcnJheScsICdNYXAnLCAnTWF0aCcsICdPYmplY3QnLFxuICAgICdQcm9taXNlJywgJ1JlZ0V4cCcsICdTZXQnLCAnU3RyaW5nJywgJ1N5bWJvbCcsICdUeXBlRXJyb3InLCAnVWludDhBcnJheScsXG4gICAgJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ1VpbnQxNkFycmF5JywgJ1VpbnQzMkFycmF5JywgJ1dlYWtNYXAnLFxuICAgICdfJywgJ2NsZWFyVGltZW91dCcsICdpc0Zpbml0ZScsICdwYXJzZUludCcsICdzZXRUaW1lb3V0J1xuICBdO1xuXG4gIC8qKiBVc2VkIHRvIG1ha2UgdGVtcGxhdGUgc291cmNlVVJMcyBlYXNpZXIgdG8gaWRlbnRpZnkuICovXG4gIHZhciB0ZW1wbGF0ZUNvdW50ZXIgPSAtMTtcblxuICAvKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG4gIHZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xuICB0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuICB0eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbiAgdmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbiAgY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbiAgY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBMYXRpbiBVbmljb2RlIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy4gKi9cbiAgdmFyIGRlYnVycmVkTGV0dGVycyA9IHtcbiAgICAvLyBMYXRpbi0xIFN1cHBsZW1lbnQgYmxvY2suXG4gICAgJ1xceGMwJzogJ0EnLCAgJ1xceGMxJzogJ0EnLCAnXFx4YzInOiAnQScsICdcXHhjMyc6ICdBJywgJ1xceGM0JzogJ0EnLCAnXFx4YzUnOiAnQScsXG4gICAgJ1xceGUwJzogJ2EnLCAgJ1xceGUxJzogJ2EnLCAnXFx4ZTInOiAnYScsICdcXHhlMyc6ICdhJywgJ1xceGU0JzogJ2EnLCAnXFx4ZTUnOiAnYScsXG4gICAgJ1xceGM3JzogJ0MnLCAgJ1xceGU3JzogJ2MnLFxuICAgICdcXHhkMCc6ICdEJywgICdcXHhmMCc6ICdkJyxcbiAgICAnXFx4YzgnOiAnRScsICAnXFx4YzknOiAnRScsICdcXHhjYSc6ICdFJywgJ1xceGNiJzogJ0UnLFxuICAgICdcXHhlOCc6ICdlJywgICdcXHhlOSc6ICdlJywgJ1xceGVhJzogJ2UnLCAnXFx4ZWInOiAnZScsXG4gICAgJ1xceGNjJzogJ0knLCAgJ1xceGNkJzogJ0knLCAnXFx4Y2UnOiAnSScsICdcXHhjZic6ICdJJyxcbiAgICAnXFx4ZWMnOiAnaScsICAnXFx4ZWQnOiAnaScsICdcXHhlZSc6ICdpJywgJ1xceGVmJzogJ2knLFxuICAgICdcXHhkMSc6ICdOJywgICdcXHhmMSc6ICduJyxcbiAgICAnXFx4ZDInOiAnTycsICAnXFx4ZDMnOiAnTycsICdcXHhkNCc6ICdPJywgJ1xceGQ1JzogJ08nLCAnXFx4ZDYnOiAnTycsICdcXHhkOCc6ICdPJyxcbiAgICAnXFx4ZjInOiAnbycsICAnXFx4ZjMnOiAnbycsICdcXHhmNCc6ICdvJywgJ1xceGY1JzogJ28nLCAnXFx4ZjYnOiAnbycsICdcXHhmOCc6ICdvJyxcbiAgICAnXFx4ZDknOiAnVScsICAnXFx4ZGEnOiAnVScsICdcXHhkYic6ICdVJywgJ1xceGRjJzogJ1UnLFxuICAgICdcXHhmOSc6ICd1JywgICdcXHhmYSc6ICd1JywgJ1xceGZiJzogJ3UnLCAnXFx4ZmMnOiAndScsXG4gICAgJ1xceGRkJzogJ1knLCAgJ1xceGZkJzogJ3knLCAnXFx4ZmYnOiAneScsXG4gICAgJ1xceGM2JzogJ0FlJywgJ1xceGU2JzogJ2FlJyxcbiAgICAnXFx4ZGUnOiAnVGgnLCAnXFx4ZmUnOiAndGgnLFxuICAgICdcXHhkZic6ICdzcycsXG4gICAgLy8gTGF0aW4gRXh0ZW5kZWQtQSBibG9jay5cbiAgICAnXFx1MDEwMCc6ICdBJywgICdcXHUwMTAyJzogJ0EnLCAnXFx1MDEwNCc6ICdBJyxcbiAgICAnXFx1MDEwMSc6ICdhJywgICdcXHUwMTAzJzogJ2EnLCAnXFx1MDEwNSc6ICdhJyxcbiAgICAnXFx1MDEwNic6ICdDJywgICdcXHUwMTA4JzogJ0MnLCAnXFx1MDEwYSc6ICdDJywgJ1xcdTAxMGMnOiAnQycsXG4gICAgJ1xcdTAxMDcnOiAnYycsICAnXFx1MDEwOSc6ICdjJywgJ1xcdTAxMGInOiAnYycsICdcXHUwMTBkJzogJ2MnLFxuICAgICdcXHUwMTBlJzogJ0QnLCAgJ1xcdTAxMTAnOiAnRCcsICdcXHUwMTBmJzogJ2QnLCAnXFx1MDExMSc6ICdkJyxcbiAgICAnXFx1MDExMic6ICdFJywgICdcXHUwMTE0JzogJ0UnLCAnXFx1MDExNic6ICdFJywgJ1xcdTAxMTgnOiAnRScsICdcXHUwMTFhJzogJ0UnLFxuICAgICdcXHUwMTEzJzogJ2UnLCAgJ1xcdTAxMTUnOiAnZScsICdcXHUwMTE3JzogJ2UnLCAnXFx1MDExOSc6ICdlJywgJ1xcdTAxMWInOiAnZScsXG4gICAgJ1xcdTAxMWMnOiAnRycsICAnXFx1MDExZSc6ICdHJywgJ1xcdTAxMjAnOiAnRycsICdcXHUwMTIyJzogJ0cnLFxuICAgICdcXHUwMTFkJzogJ2cnLCAgJ1xcdTAxMWYnOiAnZycsICdcXHUwMTIxJzogJ2cnLCAnXFx1MDEyMyc6ICdnJyxcbiAgICAnXFx1MDEyNCc6ICdIJywgICdcXHUwMTI2JzogJ0gnLCAnXFx1MDEyNSc6ICdoJywgJ1xcdTAxMjcnOiAnaCcsXG4gICAgJ1xcdTAxMjgnOiAnSScsICAnXFx1MDEyYSc6ICdJJywgJ1xcdTAxMmMnOiAnSScsICdcXHUwMTJlJzogJ0knLCAnXFx1MDEzMCc6ICdJJyxcbiAgICAnXFx1MDEyOSc6ICdpJywgICdcXHUwMTJiJzogJ2knLCAnXFx1MDEyZCc6ICdpJywgJ1xcdTAxMmYnOiAnaScsICdcXHUwMTMxJzogJ2knLFxuICAgICdcXHUwMTM0JzogJ0onLCAgJ1xcdTAxMzUnOiAnaicsXG4gICAgJ1xcdTAxMzYnOiAnSycsICAnXFx1MDEzNyc6ICdrJywgJ1xcdTAxMzgnOiAnaycsXG4gICAgJ1xcdTAxMzknOiAnTCcsICAnXFx1MDEzYic6ICdMJywgJ1xcdTAxM2QnOiAnTCcsICdcXHUwMTNmJzogJ0wnLCAnXFx1MDE0MSc6ICdMJyxcbiAgICAnXFx1MDEzYSc6ICdsJywgICdcXHUwMTNjJzogJ2wnLCAnXFx1MDEzZSc6ICdsJywgJ1xcdTAxNDAnOiAnbCcsICdcXHUwMTQyJzogJ2wnLFxuICAgICdcXHUwMTQzJzogJ04nLCAgJ1xcdTAxNDUnOiAnTicsICdcXHUwMTQ3JzogJ04nLCAnXFx1MDE0YSc6ICdOJyxcbiAgICAnXFx1MDE0NCc6ICduJywgICdcXHUwMTQ2JzogJ24nLCAnXFx1MDE0OCc6ICduJywgJ1xcdTAxNGInOiAnbicsXG4gICAgJ1xcdTAxNGMnOiAnTycsICAnXFx1MDE0ZSc6ICdPJywgJ1xcdTAxNTAnOiAnTycsXG4gICAgJ1xcdTAxNGQnOiAnbycsICAnXFx1MDE0Zic6ICdvJywgJ1xcdTAxNTEnOiAnbycsXG4gICAgJ1xcdTAxNTQnOiAnUicsICAnXFx1MDE1Nic6ICdSJywgJ1xcdTAxNTgnOiAnUicsXG4gICAgJ1xcdTAxNTUnOiAncicsICAnXFx1MDE1Nyc6ICdyJywgJ1xcdTAxNTknOiAncicsXG4gICAgJ1xcdTAxNWEnOiAnUycsICAnXFx1MDE1Yyc6ICdTJywgJ1xcdTAxNWUnOiAnUycsICdcXHUwMTYwJzogJ1MnLFxuICAgICdcXHUwMTViJzogJ3MnLCAgJ1xcdTAxNWQnOiAncycsICdcXHUwMTVmJzogJ3MnLCAnXFx1MDE2MSc6ICdzJyxcbiAgICAnXFx1MDE2Mic6ICdUJywgICdcXHUwMTY0JzogJ1QnLCAnXFx1MDE2Nic6ICdUJyxcbiAgICAnXFx1MDE2Myc6ICd0JywgICdcXHUwMTY1JzogJ3QnLCAnXFx1MDE2Nyc6ICd0JyxcbiAgICAnXFx1MDE2OCc6ICdVJywgICdcXHUwMTZhJzogJ1UnLCAnXFx1MDE2Yyc6ICdVJywgJ1xcdTAxNmUnOiAnVScsICdcXHUwMTcwJzogJ1UnLCAnXFx1MDE3Mic6ICdVJyxcbiAgICAnXFx1MDE2OSc6ICd1JywgICdcXHUwMTZiJzogJ3UnLCAnXFx1MDE2ZCc6ICd1JywgJ1xcdTAxNmYnOiAndScsICdcXHUwMTcxJzogJ3UnLCAnXFx1MDE3Myc6ICd1JyxcbiAgICAnXFx1MDE3NCc6ICdXJywgICdcXHUwMTc1JzogJ3cnLFxuICAgICdcXHUwMTc2JzogJ1knLCAgJ1xcdTAxNzcnOiAneScsICdcXHUwMTc4JzogJ1knLFxuICAgICdcXHUwMTc5JzogJ1onLCAgJ1xcdTAxN2InOiAnWicsICdcXHUwMTdkJzogJ1onLFxuICAgICdcXHUwMTdhJzogJ3onLCAgJ1xcdTAxN2MnOiAneicsICdcXHUwMTdlJzogJ3onLFxuICAgICdcXHUwMTMyJzogJ0lKJywgJ1xcdTAxMzMnOiAnaWonLFxuICAgICdcXHUwMTUyJzogJ09lJywgJ1xcdTAxNTMnOiAnb2UnLFxuICAgICdcXHUwMTQ5JzogXCInblwiLCAnXFx1MDE3Zic6ICdzJ1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuICovXG4gIHZhciBodG1sRXNjYXBlcyA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgaHRtbFVuZXNjYXBlcyA9IHtcbiAgICAnJmFtcDsnOiAnJicsXG4gICAgJyZsdDsnOiAnPCcsXG4gICAgJyZndDsnOiAnPicsXG4gICAgJyZxdW90Oyc6ICdcIicsXG4gICAgJyYjMzk7JzogXCInXCJcbiAgfTtcblxuICAvKiogVXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHN0cmluZ0VzY2FwZXMgPSB7XG4gICAgJ1xcXFwnOiAnXFxcXCcsXG4gICAgXCInXCI6IFwiJ1wiLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xccic6ICdyJyxcbiAgICAnXFx1MjAyOCc6ICd1MjAyOCcsXG4gICAgJ1xcdTIwMjknOiAndTIwMjknXG4gIH07XG5cbiAgLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbiAgdmFyIGZyZWVQYXJzZUZsb2F0ID0gcGFyc2VGbG9hdCxcbiAgICAgIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xuICB2YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuICAvKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbiAgdmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbiAgdmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbiAgdmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuICAvKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xuICB2YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbiAgdmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbiAgLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG4gIHZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgICAgaWYgKHR5cGVzKSB7XG4gICAgICAgIHJldHVybiB0eXBlcztcbiAgICAgIH1cblxuICAgICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9KCkpO1xuXG4gIC8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG4gIHZhciBub2RlSXNBcnJheUJ1ZmZlciA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzQXJyYXlCdWZmZXIsXG4gICAgICBub2RlSXNEYXRlID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNEYXRlLFxuICAgICAgbm9kZUlzTWFwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNNYXAsXG4gICAgICBub2RlSXNSZWdFeHAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1JlZ0V4cCxcbiAgICAgIG5vZGVJc1NldCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzU2V0LFxuICAgICAgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUFnZ3JlZ2F0b3JgIGZvciBhcnJheXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5QWdncmVnYXRvcihhcnJheSwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZXZlcnlgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICogIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RXZlcnkoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoIXByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBhcnJheVsrK2luZGV4XTtcbiAgICB9XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbLS1sZW5ndGhdO1xuICAgIH1cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIHZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBBU0NJSSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcuc3BsaXQoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhbiBBU0NJSSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmZpbmRLZXlgIGFuZCBgXy5maW5kTGFzdEtleWAsXG4gICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmBcbiAgICogdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCBvciBpdHMga2V5LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRLZXkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYykge1xuICAgIHZhciByZXN1bHQ7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICByZXN1bHQgPSBrZXk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgPyBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KVxuICAgICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlSW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUluZGV4T2ZXaXRoKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4LCBjb21wYXJhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVhbmAgYW5kIGBfLm1lYW5CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiBsZW5ndGggPyAoYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIC8gbGVuZ3RoKSA6IE5BTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eU9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0XG4gICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYCB1c2luZyBgZWFjaEZ1bmNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdEFjY3VtIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBvZlxuICAgKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgZWFjaEZ1bmMpIHtcbiAgICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICAgID8gKGluaXRBY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgICAgOiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICAgKiBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nXG4gICAqIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICBhcnJheS5zb3J0KGNvbXBhcmVyKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFycmF5W2xlbmd0aF0gPSBhcnJheVtsZW5ndGhdLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc3VtYCBhbmQgYF8uc3VtQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgcmVzdWx0LFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpdGVyYXRlZShhcnJheVtpbmRleF0pO1xuICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGN1cnJlbnQgOiAocmVzdWx0ICsgY3VycmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICAgKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvUGFpcnNgIGFuZCBgXy50b1BhaXJzSW5gIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXlcbiAgICogb2Yga2V5LXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBgcHJvcHNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAgICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gICAqIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbVN0YXJ0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgY291bnQuXG4gICAqL1xuICBmdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gMDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGFycmF5W2xlbmd0aF0gPT09IHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICsrcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZGVidXJyYCB0byBjb252ZXJ0IExhdGluLTEgU3VwcGxlbWVudCBhbmQgTGF0aW4gRXh0ZW5kZWQtQVxuICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXIgVGhlIG1hdGNoZWQgbGV0dGVyIHRvIGRlYnVyci5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgbGV0dGVyLlxuICAgKi9cbiAgdmFyIGRlYnVyckxldHRlciA9IGJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZXNjYXBlYCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciBlc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy50ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocikge1xuICAgIHJldHVybiAnXFxcXCcgKyBzdHJpbmdFc2NhcGVzW2Nocl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgd29yZCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3IpIHtcbiAgICB2YXIgZGF0YSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoIShkYXRhID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaChkYXRhLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGl0cyB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb1BhaXJzKHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW3ZhbHVlLCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubGFzdEluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVRvQXJyYXkoc3RyaW5nKVxuICAgICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnVuZXNjYXBlYCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gdW5lc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgdW5lc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxVbmVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gICAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwO1xuICAgIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgICArK3Jlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYSBVbmljb2RlIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHVzaW5nIHRoZSBgY29udGV4dGAgb2JqZWN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBfXG4gICAqIEBzaW5jZSAxLjEuMFxuICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHQ9cm9vdF0gVGhlIGNvbnRleHQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYSBuZXcgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIF8ubWl4aW4oeyAnZm9vJzogXy5jb25zdGFudCgnZm9vJykgfSk7XG4gICAqXG4gICAqIHZhciBsb2Rhc2ggPSBfLnJ1bkluQ29udGV4dCgpO1xuICAgKiBsb2Rhc2gubWl4aW4oeyAnYmFyJzogbG9kYXNoLmNvbnN0YW50KCdiYXInKSB9KTtcbiAgICpcbiAgICogXy5pc0Z1bmN0aW9uKF8uZm9vKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKiBfLmlzRnVuY3Rpb24oXy5iYXIpO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKlxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guZm9vKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmJhcik7XG4gICAqIC8vID0+IHRydWVcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgc3VwZWQtdXAgYGRlZmVyYCBpbiBOb2RlLmpzLlxuICAgKiB2YXIgZGVmZXIgPSBfLnJ1bkluQ29udGV4dCh7ICdzZXRUaW1lb3V0Jzogc2V0SW1tZWRpYXRlIH0pLmRlZmVyO1xuICAgKi9cbiAgdmFyIHJ1bkluQ29udGV4dCA9IChmdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCkge1xuICAgIGNvbnRleHQgPSBjb250ZXh0ID09IG51bGwgPyByb290IDogXy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLCBjb250ZXh0LCBfLnBpY2socm9vdCwgY29udGV4dFByb3BzKSk7XG5cbiAgICAvKiogQnVpbHQtaW4gY29uc3RydWN0b3IgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFycmF5LFxuICAgICAgICBEYXRlID0gY29udGV4dC5EYXRlLFxuICAgICAgICBFcnJvciA9IGNvbnRleHQuRXJyb3IsXG4gICAgICAgIEZ1bmN0aW9uID0gY29udGV4dC5GdW5jdGlvbixcbiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCxcbiAgICAgICAgT2JqZWN0ID0gY29udGV4dC5PYmplY3QsXG4gICAgICAgIFJlZ0V4cCA9IGNvbnRleHQuUmVnRXhwLFxuICAgICAgICBTdHJpbmcgPSBjb250ZXh0LlN0cmluZyxcbiAgICAgICAgVHlwZUVycm9yID0gY29udGV4dC5UeXBlRXJyb3I7XG5cbiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsXG4gICAgICAgIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xuICAgIHZhciBjb3JlSnNEYXRhID0gY29udGV4dFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG4gICAgdmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xuICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4gICAgLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi9cbiAgICB2YXIgaWRDb3VudGVyID0gMDtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG4gICAgdmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICAgICAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gICAgICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gICAgICogb2YgdmFsdWVzLlxuICAgICAqL1xuICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xuICAgIHZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGBfYCByZWZlcmVuY2UgaW4gYF8ubm9Db25mbGljdGAuICovXG4gICAgdmFyIG9sZERhc2ggPSByb290Ll87XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xuICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gICAgICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4gICAgKTtcblxuICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gY29udGV4dC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIFN5bWJvbCA9IGNvbnRleHQuU3ltYm9sLFxuICAgICAgICBVaW50OEFycmF5ID0gY29udGV4dC5VaW50OEFycmF5LFxuICAgICAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCksXG4gICAgICAgIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUsXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlLFxuICAgICAgICBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltSXRlcmF0b3IgPSBTeW1ib2wgPyBTeW1ib2wuaXRlcmF0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4gICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICAgICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH0oKSk7XG5cbiAgICAvKiogTW9ja2VkIGJ1aWx0LWlucy4gKi9cbiAgICB2YXIgY3R4Q2xlYXJUaW1lb3V0ID0gY29udGV4dC5jbGVhclRpbWVvdXQgIT09IHJvb3QuY2xlYXJUaW1lb3V0ICYmIGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBjdHhOb3cgPSBEYXRlICYmIERhdGUubm93ICE9PSByb290LkRhdGUubm93ICYmIERhdGUubm93LFxuICAgICAgICBjdHhTZXRUaW1lb3V0ID0gY29udGV4dC5zZXRUaW1lb3V0ICE9PSByb290LnNldFRpbWVvdXQgJiYgY29udGV4dC5zZXRUaW1lb3V0O1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xuICAgIHZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgICAgICBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsXG4gICAgICAgIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICAgICAgICBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmF0aXZlSXNGaW5pdGUgPSBjb250ZXh0LmlzRmluaXRlLFxuICAgICAgICBuYXRpdmVKb2luID0gYXJyYXlQcm90by5qb2luLFxuICAgICAgICBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLFxuICAgICAgICBuYXRpdmVOb3cgPSBEYXRlLm5vdyxcbiAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LFxuICAgICAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbSxcbiAgICAgICAgbmF0aXZlUmV2ZXJzZSA9IGFycmF5UHJvdG8ucmV2ZXJzZTtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbiAgICB2YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUoY29udGV4dCwgJ0RhdGFWaWV3JyksXG4gICAgICAgIE1hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnTWFwJyksXG4gICAgICAgIFByb21pc2UgPSBnZXROYXRpdmUoY29udGV4dCwgJ1Byb21pc2UnKSxcbiAgICAgICAgU2V0ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdTZXQnKSxcbiAgICAgICAgV2Vha01hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnV2Vha01hcCcpLFxuICAgICAgICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbiAgICAvKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgICB2YXIgbWV0YU1hcCA9IFdlYWtNYXAgJiYgbmV3IFdlYWtNYXA7XG5cbiAgICAvKiogVXNlZCB0byBsb29rdXAgdW5taW5pZmllZCBmdW5jdGlvbiBuYW1lcy4gKi9cbiAgICB2YXIgcmVhbE5hbWVzID0ge307XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xuICAgIHZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgICAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgICAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICAgICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuICAgIC8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xuICAgIHZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgaW1wbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzLiBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBhbmQgcmV0dXJuIGFycmF5cywgY29sbGVjdGlvbnMsXG4gICAgICogYW5kIGZ1bmN0aW9ucyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgc2luZ2xlIHZhbHVlXG4gICAgICogb3IgbWF5IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSBjaGFpbiBzZXF1ZW5jZVxuICAgICAqIGFuZCByZXR1cm4gdGhlIHVud3JhcHBlZCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEV4cGxpY2l0IGNoYWluIHNlcXVlbmNlcywgd2hpY2ggbXVzdCBiZSB1bndyYXBwZWQgd2l0aCBgXyN2YWx1ZWAsIG1heSBiZVxuICAgICAqIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLlxuICAgICAqXG4gICAgICogVGhlIGV4ZWN1dGlvbiBvZiBjaGFpbmVkIG1ldGhvZHMgaXMgbGF6eSwgdGhhdCBpcywgaXQncyBkZWZlcnJlZCB1bnRpbFxuICAgICAqIGBfI3ZhbHVlYCBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqXG4gICAgICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uXG4gICAgICogU2hvcnRjdXQgZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiB0byBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBhdm9pZHNcbiAgICAgKiB0aGUgY3JlYXRpb24gb2YgaW50ZXJtZWRpYXRlIGFycmF5cyBhbmQgY2FuIGdyZWF0bHkgcmVkdWNlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBpdGVyYXRlZSBleGVjdXRpb25zLiBTZWN0aW9ucyBvZiBhIGNoYWluIHNlcXVlbmNlIHF1YWxpZnkgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlmIHRoZSBzZWN0aW9uIGlzIGFwcGxpZWQgdG8gYW4gYXJyYXkgYW5kIGl0ZXJhdGVlcyBhY2NlcHQgb25seVxuICAgICAqIG9uZSBhcmd1bWVudC4gVGhlIGhldXJpc3RpYyBmb3Igd2hldGhlciBhIHNlY3Rpb24gcXVhbGlmaWVzIGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpcyBzdWJqZWN0IHRvIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGBfI3ZhbHVlYCBtZXRob2QgaXNcbiAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIGxvZGFzaCBtZXRob2RzLCB3cmFwcGVycyBoYXZlIGBBcnJheWAgYW5kIGBTdHJpbmdgIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGBzaGlmdGAsIGBzb3J0YCwgYHNwbGljZWAsIGFuZCBgdW5zaGlmdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBTdHJpbmdgIG1ldGhvZHMgYXJlOlxuICAgICAqIGByZXBsYWNlYCBhbmQgYHNwbGl0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uIGFyZTpcbiAgICAgKiBgYXRgLCBgY29tcGFjdGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBkcm9wV2hpbGVgLCBgZmlsdGVyYCwgYGZpbmRgLFxuICAgICAqIGBmaW5kTGFzdGAsIGBoZWFkYCwgYGluaXRpYWxgLCBgbGFzdGAsIGBtYXBgLCBgcmVqZWN0YCwgYHJldmVyc2VgLCBgc2xpY2VgLFxuICAgICAqIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGFuZCBgdG9BcnJheWBcbiAgICAgKlxuICAgICAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZTpcbiAgICAgKiBgYWZ0ZXJgLCBgYXJ5YCwgYGFzc2lnbmAsIGBhc3NpZ25JbmAsIGBhc3NpZ25JbldpdGhgLCBgYXNzaWduV2l0aGAsIGBhdGAsXG4gICAgICogYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsIGBjYXN0QXJyYXlgLCBgY2hhaW5gLCBgY2h1bmtgLFxuICAgICAqIGBjb21taXRgLCBgY29tcGFjdGAsIGBjb25jYXRgLCBgY29uZm9ybXNgLCBgY29uc3RhbnRgLCBgY291bnRCeWAsIGBjcmVhdGVgLFxuICAgICAqIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgZGVmZXJgLCBgZGVsYXlgLFxuICAgICAqIGBkaWZmZXJlbmNlYCwgYGRpZmZlcmVuY2VCeWAsIGBkaWZmZXJlbmNlV2l0aGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsXG4gICAgICogYGRyb3BSaWdodFdoaWxlYCwgYGRyb3BXaGlsZWAsIGBleHRlbmRgLCBgZXh0ZW5kV2l0aGAsIGBmaWxsYCwgYGZpbHRlcmAsXG4gICAgICogYGZsYXRNYXBgLCBgZmxhdE1hcERlZXBgLCBgZmxhdE1hcERlcHRoYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLFxuICAgICAqIGBmbGF0dGVuRGVwdGhgLCBgZmxpcGAsIGBmbG93YCwgYGZsb3dSaWdodGAsIGBmcm9tUGFpcnNgLCBgZnVuY3Rpb25zYCxcbiAgICAgKiBgZnVuY3Rpb25zSW5gLCBgZ3JvdXBCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnRlcnNlY3Rpb25CeWAsXG4gICAgICogYGludGVyc2VjdGlvbldpdGhgLCBgaW52ZXJ0YCwgYGludmVydEJ5YCwgYGludm9rZU1hcGAsIGBpdGVyYXRlZWAsIGBrZXlCeWAsXG4gICAgICogYGtleXNgLCBga2V5c0luYCwgYG1hcGAsIGBtYXBLZXlzYCwgYG1hcFZhbHVlc2AsIGBtYXRjaGVzYCwgYG1hdGNoZXNQcm9wZXJ0eWAsXG4gICAgICogYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWVyZ2VXaXRoYCwgYG1ldGhvZGAsIGBtZXRob2RPZmAsIGBtaXhpbmAsIGBuZWdhdGVgLFxuICAgICAqIGBudGhBcmdgLCBgb21pdGAsIGBvbWl0QnlgLCBgb25jZWAsIGBvcmRlckJ5YCwgYG92ZXJgLCBgb3ZlckFyZ3NgLFxuICAgICAqIGBvdmVyRXZlcnlgLCBgb3ZlclNvbWVgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLCBgcGFydGl0aW9uYCwgYHBpY2tgLFxuICAgICAqIGBwaWNrQnlgLCBgcGxhbnRgLCBgcHJvcGVydHlgLCBgcHJvcGVydHlPZmAsIGBwdWxsYCwgYHB1bGxBbGxgLCBgcHVsbEFsbEJ5YCxcbiAgICAgKiBgcHVsbEFsbFdpdGhgLCBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZWFyZ2AsIGByZWplY3RgLFxuICAgICAqIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwgYHNhbXBsZVNpemVgLCBgc2V0YCwgYHNldFdpdGhgLCBgc2h1ZmZsZWAsXG4gICAgICogYHNsaWNlYCwgYHNvcnRgLCBgc29ydEJ5YCwgYHNwbGljZWAsIGBzcHJlYWRgLCBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0b0FycmF5YCxcbiAgICAgKiBgdG9QYWlyc2AsIGB0b1BhaXJzSW5gLCBgdG9QYXRoYCwgYHRvUGxhaW5PYmplY3RgLCBgdHJhbnNmb3JtYCwgYHVuYXJ5YCxcbiAgICAgKiBgdW5pb25gLCBgdW5pb25CeWAsIGB1bmlvbldpdGhgLCBgdW5pcWAsIGB1bmlxQnlgLCBgdW5pcVdpdGhgLCBgdW5zZXRgLFxuICAgICAqIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHVuemlwV2l0aGAsIGB1cGRhdGVgLCBgdXBkYXRlV2l0aGAsIGB2YWx1ZXNgLFxuICAgICAqIGB2YWx1ZXNJbmAsIGB3aXRob3V0YCwgYHdyYXBgLCBgeG9yYCwgYHhvckJ5YCwgYHhvcldpdGhgLCBgemlwYCxcbiAgICAgKiBgemlwT2JqZWN0YCwgYHppcE9iamVjdERlZXBgLCBhbmQgYHppcFdpdGhgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgYXJlICoqbm90KiogY2hhaW5hYmxlIGJ5IGRlZmF1bHQgYXJlOlxuICAgICAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjZWlsYCwgYGNsYW1wYCwgYGNsb25lYCxcbiAgICAgKiBgY2xvbmVEZWVwYCwgYGNsb25lRGVlcFdpdGhgLCBgY2xvbmVXaXRoYCwgYGNvbmZvcm1zVG9gLCBgZGVidXJyYCxcbiAgICAgKiBgZGVmYXVsdFRvYCwgYGRpdmlkZWAsIGBlYWNoYCwgYGVhY2hSaWdodGAsIGBlbmRzV2l0aGAsIGBlcWAsIGBlc2NhcGVgLFxuICAgICAqIGBlc2NhcGVSZWdFeHBgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLCBgZmluZEtleWAsIGBmaW5kTGFzdGAsXG4gICAgICogYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmlyc3RgLCBgZmxvb3JgLCBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLFxuICAgICAqIGBmb3JJbmAsIGBmb3JJblJpZ2h0YCwgYGZvck93bmAsIGBmb3JPd25SaWdodGAsIGBnZXRgLCBgZ3RgLCBgZ3RlYCwgYGhhc2AsXG4gICAgICogYGhhc0luYCwgYGhlYWRgLCBgaWRlbnRpdHlgLCBgaW5jbHVkZXNgLCBgaW5kZXhPZmAsIGBpblJhbmdlYCwgYGludm9rZWAsXG4gICAgICogYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNBcnJheUJ1ZmZlcmAsIGBpc0FycmF5TGlrZWAsIGBpc0FycmF5TGlrZU9iamVjdGAsXG4gICAgICogYGlzQm9vbGVhbmAsIGBpc0J1ZmZlcmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCwgYGlzRW1wdHlgLCBgaXNFcXVhbGAsXG4gICAgICogYGlzRXF1YWxXaXRoYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgLCBgaXNGdW5jdGlvbmAsIGBpc0ludGVnZXJgLCBgaXNMZW5ndGhgLFxuICAgICAqIGBpc01hcGAsIGBpc01hdGNoYCwgYGlzTWF0Y2hXaXRoYCwgYGlzTmFOYCwgYGlzTmF0aXZlYCwgYGlzTmlsYCwgYGlzTnVsbGAsXG4gICAgICogYGlzTnVtYmVyYCwgYGlzT2JqZWN0YCwgYGlzT2JqZWN0TGlrZWAsIGBpc1BsYWluT2JqZWN0YCwgYGlzUmVnRXhwYCxcbiAgICAgKiBgaXNTYWZlSW50ZWdlcmAsIGBpc1NldGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBpc1R5cGVkQXJyYXlgLFxuICAgICAqIGBpc1dlYWtNYXBgLCBgaXNXZWFrU2V0YCwgYGpvaW5gLCBga2ViYWJDYXNlYCwgYGxhc3RgLCBgbGFzdEluZGV4T2ZgLFxuICAgICAqIGBsb3dlckNhc2VgLCBgbG93ZXJGaXJzdGAsIGBsdGAsIGBsdGVgLCBgbWF4YCwgYG1heEJ5YCwgYG1lYW5gLCBgbWVhbkJ5YCxcbiAgICAgKiBgbWluYCwgYG1pbkJ5YCwgYG11bHRpcGx5YCwgYG5vQ29uZmxpY3RgLCBgbm9vcGAsIGBub3dgLCBgbnRoYCwgYHBhZGAsXG4gICAgICogYHBhZEVuZGAsIGBwYWRTdGFydGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsXG4gICAgICogYHJlcGVhdGAsIGByZXN1bHRgLCBgcm91bmRgLCBgcnVuSW5Db250ZXh0YCwgYHNhbXBsZWAsIGBzaGlmdGAsIGBzaXplYCxcbiAgICAgKiBgc25ha2VDYXNlYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgc29ydGVkSW5kZXhCeWAsIGBzb3J0ZWRMYXN0SW5kZXhgLFxuICAgICAqIGBzb3J0ZWRMYXN0SW5kZXhCeWAsIGBzdGFydENhc2VgLCBgc3RhcnRzV2l0aGAsIGBzdHViQXJyYXlgLCBgc3R1YkZhbHNlYCxcbiAgICAgKiBgc3R1Yk9iamVjdGAsIGBzdHViU3RyaW5nYCwgYHN0dWJUcnVlYCwgYHN1YnRyYWN0YCwgYHN1bWAsIGBzdW1CeWAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRpbWVzYCwgYHRvRmluaXRlYCwgYHRvSW50ZWdlcmAsIGB0b0pTT05gLCBgdG9MZW5ndGhgLFxuICAgICAqIGB0b0xvd2VyYCwgYHRvTnVtYmVyYCwgYHRvU2FmZUludGVnZXJgLCBgdG9TdHJpbmdgLCBgdG9VcHBlcmAsIGB0cmltYCxcbiAgICAgKiBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBgdHJ1bmNhdGVgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBgdXBwZXJDYXNlYCxcbiAgICAgKiBgdXBwZXJGaXJzdGAsIGB2YWx1ZWAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAbmFtZSBfXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIHdyYXBwZWQucmVkdWNlKF8uYWRkKTtcbiAgICAgKiAvLyA9PiA2XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKHNxdWFyZSk7XG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb2Rhc2godmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdExpa2UodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvZGFzaFdyYXBwZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXJDbG9uZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGNoYWluIHNlcXVlbmNlIHdyYXBwZXJzIGluaGVyaXQgZnJvbS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUxvZGFzaCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFpbkFsbF0gRW5hYmxlIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbiAgICAgIHRoaXMuX19pbmRleF9fID0gMDtcbiAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IGxvZGFzaCBhcmUgbGlrZSB0aG9zZSBpblxuICAgICAqIGVtYmVkZGVkIFJ1YnkgKEVSQikgYXMgd2VsbCBhcyBFUzIwMTUgdGVtcGxhdGUgc3RyaW5ncy4gQ2hhbmdlIHRoZVxuICAgICAqIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBiZSBIVE1MLWVzY2FwZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2VzY2FwZSc6IHJlRXNjYXBlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdldmFsdWF0ZSc6IHJlRXZhbHVhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2ludGVycG9sYXRlJzogcmVJbnRlcnBvbGF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIHJlZmVyZW5jZSB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIHRlbXBsYXRlIHRleHQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAqL1xuICAgICAgJ3ZhcmlhYmxlJzogJycsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgKi9cbiAgICAgICdpbXBvcnRzJzoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c1xuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICAnXyc6IGxvZGFzaFxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFbnN1cmUgd3JhcHBlcnMgYXJlIGluc3RhbmNlcyBvZiBgYmFzZUxvZGFzaGAuXG4gICAgbG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBsb2Rhc2g7XG5cbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2Rpcl9fID0gMTtcbiAgICAgIHRoaXMuX19maWx0ZXJlZF9fID0gZmFsc2U7XG4gICAgICB0aGlzLl9faXRlcmF0ZWVzX18gPSBbXTtcbiAgICAgIHRoaXMuX190YWtlQ291bnRfXyA9IE1BWF9BUlJBWV9MRU5HVEg7XG4gICAgICB0aGlzLl9fdmlld3NfXyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgbGF6eSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eUNsb25lKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fO1xuICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRoaXMuX19maWx0ZXJlZF9fO1xuICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18gPSBjb3B5QXJyYXkodGhpcy5fX2l0ZXJhdGVlc19fKTtcbiAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fO1xuICAgICAgcmVzdWx0Ll9fdmlld3NfXyA9IGNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgbGF6eSBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgcmV2ZXJzZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVJldmVyc2UoKSB7XG4gICAgICBpZiAodGhpcy5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gPSAtMTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fICo9IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgdW53cmFwcGVkIHZhbHVlIGZyb20gaXRzIGxhenkgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlWYWx1ZSgpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX193cmFwcGVkX18udmFsdWUoKSxcbiAgICAgICAgICBkaXIgPSB0aGlzLl9fZGlyX18sXG4gICAgICAgICAgaXNBcnIgPSBpc0FycmF5KGFycmF5KSxcbiAgICAgICAgICBpc1JpZ2h0ID0gZGlyIDwgMCxcbiAgICAgICAgICBhcnJMZW5ndGggPSBpc0FyciA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgdmlldyA9IGdldFZpZXcoMCwgYXJyTGVuZ3RoLCB0aGlzLl9fdmlld3NfXyksXG4gICAgICAgICAgc3RhcnQgPSB2aWV3LnN0YXJ0LFxuICAgICAgICAgIGVuZCA9IHZpZXcuZW5kLFxuICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0LFxuICAgICAgICAgIGluZGV4ID0gaXNSaWdodCA/IGVuZCA6IChzdGFydCAtIDEpLFxuICAgICAgICAgIGl0ZXJhdGVlcyA9IHRoaXMuX19pdGVyYXRlZXNfXyxcbiAgICAgICAgICBpdGVyTGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgdGFrZUNvdW50ID0gbmF0aXZlTWluKGxlbmd0aCwgdGhpcy5fX3Rha2VDb3VudF9fKTtcblxuICAgICAgaWYgKCFpc0FyciB8fCAoIWlzUmlnaHQgJiYgYXJyTGVuZ3RoID09IGxlbmd0aCAmJiB0YWtlQ291bnQgPT0gbGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSwgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKGxlbmd0aC0tICYmIHJlc0luZGV4IDwgdGFrZUNvdW50KSB7XG4gICAgICAgIGluZGV4ICs9IGRpcjtcblxuICAgICAgICB2YXIgaXRlckluZGV4ID0gLTEsXG4gICAgICAgICAgICB2YWx1ZSA9IGFycmF5W2luZGV4XTtcblxuICAgICAgICB3aGlsZSAoKytpdGVySW5kZXggPCBpdGVyTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBpdGVyYXRlZXNbaXRlckluZGV4XSxcbiAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBkYXRhLml0ZXJhdGVlLFxuICAgICAgICAgICAgICB0eXBlID0gZGF0YS50eXBlLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICAgIGlmICh0eXBlID09IExBWllfTUFQX0ZMQUcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29tcHV0ZWQ7XG4gICAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09IExBWllfRklMVEVSX0ZMQUcpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBgTGF6eVdyYXBwZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXp5V3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgICAgIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuICAgIEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG4gICAgSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuICAgIEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgZGF0YS5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIC0tdGhpcy5zaXplO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICsrdGhpcy5zaXplO1xuICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAgICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAgICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuICAgIE1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGFkZFxuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBhbGlhcyBwdXNoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgICAgIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICAgICAgfVxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG4gICAgU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuICAgIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcbiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG4gICAgU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgICAgICkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtiYXNlUmFuZG9tKDAsIGxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlU2l6ZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSkge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gICAgICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZ2dyZWdhdGVzIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBvbiBgYWNjdW11bGF0b3JgIHdpdGgga2V5cyB0cmFuc2Zvcm1lZFxuICAgICAqIGJ5IGBpdGVyYXRlZWAgYW5kIHZhbHVlcyBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBZ2dyZWdhdG9yKGNvbGxlY3Rpb24sIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAgICAgKiB2YWx1ZSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXQob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgc2tpcCA9IG9iamVjdCA9PSBudWxsO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gc2tpcCA/IHVuZGVmaW5lZCA6IGdldChvYmplY3QsIHBhdGhzW2luZGV4XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsYW1wYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmIChudW1iZXIgPT09IG51bWJlcikge1xuICAgICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICAgICAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBEZWVwIGNsb25lXG4gICAgICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gICAgICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgICAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQ7XG4gICAgICB9XG4gICAgICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgICAgIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXlzRnVuYyA9IGlzRnVsbFxuICAgICAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgICAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICAgICAgdmFyIHByb3BzID0gaXNBcnIgPyB1bmRlZmluZWQgOiBrZXlzRnVuYyh2YWx1ZSk7XG4gICAgICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgICAga2V5ID0gc3ViVmFsdWU7XG4gICAgICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXMoc291cmNlKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc1RvYCB3aGljaCBhY2NlcHRzIGBwcm9wc2AgdG8gY2hlY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2xlbmd0aF0sXG4gICAgICAgICAgICBwcmVkaWNhdGUgPSBzb3VyY2Vba2V5XSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHx8ICFwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5kZWxheWAgYW5kIGBfLmRlZmVyYCB3aGljaCBhY2NlcHRzIGBhcmdzYFxuICAgICAqIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURlbGF5KGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7IH0sIHdhaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kaWZmZXJlbmNlYCB3aXRob3V0IHN1cHBvcnRcbiAgICAgKiBmb3IgZXhjbHVkaW5nIG11bHRpcGxlIGFycmF5cyBvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgICB2YWx1ZXNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhbHVlcyA9IGFycmF5TWFwKHZhbHVlcywgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBTZXRDYWNoZSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID09IG51bGwgPyB2YWx1ZSA6IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIHZhciB2YWx1ZXNJbmRleCA9IHZhbHVlc0xlbmd0aDtcbiAgICAgICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlc1t2YWx1ZXNJbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHZhbHVlcywgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoUmlnaHQgPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZXZlcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSAhIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5tYXhgIGFuZCBgXy5taW5gIHdoaWNoIGFjY2VwdHMgYVxuICAgICAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAoY29tcHV0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICAgICAgOiBjb21wYXJhdG9yKGN1cnJlbnQsIGNvbXB1dGVkKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbGxgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpO1xuICAgICAgfVxuICAgICAgZW5kID0gKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IGxlbmd0aCkgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKTtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbmQgPSBzdGFydCA+IGVuZCA/IDAgOiB0b0xlbmd0aChlbmQpO1xuICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICAgIGFycmF5W3N0YXJ0KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsdGVyYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICAgICAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAgICAgKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgdmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VGb3JgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllc1xuICAgICAqIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvclJpZ2h0ID0gY3JlYXRlQmFzZUZvcih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25SaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yUmlnaHQob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZnVuY3Rpb25zYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5IG9mXG4gICAgICogYG9iamVjdGAgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZmlsdGVyZWQgZnJvbSBgcHJvcHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZmlsdGVyLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZ1bmN0aW9ucyhvYmplY3QsIHByb3BzKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5nZXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICAgICAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gICAgICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgICAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR3QodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBrZXkgaW4gT2JqZWN0KG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5SYW5nZWAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gbnVtYmVyID49IG5hdGl2ZU1pbihzdGFydCwgZW5kKSAmJiBudW1iZXIgPCBuYXRpdmVNYXgoc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmludGVyc2VjdGlvbmAsIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnRlcnNlY3Rpb24oYXJyYXlzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluY2x1ZGVzID0gY29tcGFyYXRvciA/IGFycmF5SW5jbHVkZXNXaXRoIDogYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheXNbMF0ubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGgsXG4gICAgICAgICAgY2FjaGVzID0gQXJyYXkob3RoTGVuZ3RoKSxcbiAgICAgICAgICBtYXhMZW5ndGggPSBJbmZpbml0eSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKG90aEluZGV4LS0pIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJyYXlzW290aEluZGV4XTtcbiAgICAgICAgaWYgKG90aEluZGV4ICYmIGl0ZXJhdGVlKSB7XG4gICAgICAgICAgYXJyYXkgPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgbWF4TGVuZ3RoID0gbmF0aXZlTWluKGFycmF5Lmxlbmd0aCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgY2FjaGVzW290aEluZGV4XSA9ICFjb21wYXJhdG9yICYmIChpdGVyYXRlZSB8fCAobGVuZ3RoID49IDEyMCAmJiBhcnJheS5sZW5ndGggPj0gMTIwKSlcbiAgICAgICAgICA/IG5ldyBTZXRDYWNoZShvdGhJbmRleCAmJiBhcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFycmF5ID0gYXJyYXlzWzBdO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBzZWVuID0gY2FjaGVzWzBdO1xuXG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPCBtYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoIShzZWVuXG4gICAgICAgICAgICAgID8gY2FjaGVIYXMoc2VlbiwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgIDogaW5jbHVkZXMocmVzdWx0LCBjb21wdXRlZCwgY29tcGFyYXRvcilcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoLS1vdGhJbmRleCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzW290aEluZGV4XTtcbiAgICAgICAgICAgIGlmICghKGNhY2hlXG4gICAgICAgICAgICAgICAgICA/IGNhY2hlSGFzKGNhY2hlLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgICAgIDogaW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZlcnRgIGFuZCBgXy5pbnZlcnRCeWAgd2hpY2ggaW52ZXJ0c1xuICAgICAqIGBvYmplY3RgIHdpdGggdmFsdWVzIHRyYW5zZm9ybWVkIGJ5IGBpdGVyYXRlZWAgYW5kIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgaXRlcmF0ZWUodmFsdWUpLCBrZXksIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZva2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIG1ldGhvZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncykge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHZhciBmdW5jID0gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO1xuICAgICAgcmV0dXJuIGZ1bmMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFwcGx5KGZ1bmMsIG9iamVjdCwgYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJyYXlCdWZmZXJgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcnJheUJ1ZmZlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJyYXlCdWZmZXJUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNEYXRlYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0RhdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGRhdGVUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2hpY2ggc3VwcG9ydHMgcGFydGlhbCBjb21wYXJpc29uc1xuICAgICAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICAgICAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIGNvbXBhcmVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgICAgICBvYmpUYWcgPSBvYmpJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG9iamVjdCksXG4gICAgICAgICAgb3RoVGFnID0gb3RoSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvdGhlcik7XG5cbiAgICAgIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICAgICAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG5cbiAgICAgIHZhciBvYmpJc09iaiA9IG9ialRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgaXNCdWZmZXIob2JqZWN0KSkge1xuICAgICAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgICAgIG9iaklzT2JqID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICByZXR1cm4gKG9iaklzQXJyIHx8IGlzVHlwZWRBcnJheShvYmplY3QpKVxuICAgICAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICAgICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgICAgIG90aElzV3JhcHBlZCA9IG90aElzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpO1xuXG4gICAgICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgICAgICBvdGhVbndyYXBwZWQgPSBvdGhJc1dyYXBwZWQgPyBvdGhlci52YWx1ZSgpIDogb3RoZXI7XG5cbiAgICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXRjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhLCBjdXN0b21pemVyKSB7XG4gICAgICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xuXG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICAgICAgOiAhKGRhdGFbMF0gaW4gb2JqZWN0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgc3JjVmFsdWUgPSBkYXRhWzFdO1xuXG4gICAgICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gbmV3IFN0YWNrO1xuICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICAgICA6IHJlc3VsdFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNSZWdFeHBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gcmVnZXhwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gc2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgICAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBpdGVyYXRlZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgICAgIC8vIERvbid0IHN0b3JlIHRoZSBgdHlwZW9mYCByZXN1bHQgaW4gYSB2YXJpYWJsZSB0byBhdm9pZCBhIEpJVCBidWcgaW4gU2FmYXJpIDkuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSlcbiAgICAgICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgICAgIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTHQodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICAgICAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgICAgIGlmIChpc0tleShwYXRoKSAmJiBpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG9ialZhbHVlID09PSBzcmNWYWx1ZSlcbiAgICAgICAgICA/IGhhc0luKG9iamVjdCwgcGF0aClcbiAgICAgICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgaWYgKG9iamVjdCA9PT0gc291cmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJhc2VGb3Ioc291cmNlLCBmdW5jdGlvbihzcmNWYWx1ZSwga2V5KSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIGlmIChpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBiYXNlTWVyZ2UsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBzYWZlR2V0KG9iamVjdCwga2V5KSxcbiAgICAgICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IGlzRnVuY3Rpb24ob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubnRoYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksIG4pIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuICs9IG4gPCAwID8gbGVuZ3RoIDogMDtcbiAgICAgIHJldHVybiBpc0luZGV4KG4sIGxlbmd0aCkgPyBhcnJheVtuXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5vcmRlckJ5YCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICAgICAgaWYgKGl0ZXJhdGVlcy5sZW5ndGgpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdGVlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpZGVudGl0eV07XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHZhciBjcml0ZXJpYSA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogY3JpdGVyaWEsICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VTb3J0QnkocmVzdWx0LCBmdW5jdGlvbihvYmplY3QsIG90aGVyKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQWxsQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICAgKiBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXhPZiA9IGNvbXBhcmF0b3IgPyBiYXNlSW5kZXhPZldpdGggOiBiYXNlSW5kZXhPZixcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgc2VlbiA9IGFycmF5O1xuXG4gICAgICBpZiAoYXJyYXkgPT09IHZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBjb3B5QXJyYXkodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGZyb21JbmRleCA9IDAsXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tSW5kZXggPSBpbmRleE9mKHNlZW4sIGNvbXB1dGVkLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpKSA+IC0xKSB7XG4gICAgICAgICAgaWYgKHNlZW4gIT09IGFycmF5KSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChzZWVuLCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgZnJvbUluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogaW5kZXhlcyBvciBjYXB0dXJpbmcgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gaW5kZXhlcyBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gaW5kZXhlcy5sZW5ndGggOiAwLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgICAgIGlmIChsZW5ndGggPT0gbGFzdEluZGV4IHx8IGluZGV4ICE9PSBwcmV2aW91cykge1xuICAgICAgICAgIHZhciBwcmV2aW91cyA9IGluZGV4O1xuICAgICAgICAgIGlmIChpc0luZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmFzZVVuc2V0KGFycmF5LCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZG9tYCB3aXRob3V0IHN1cHBvcnQgZm9yIHJldHVybmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dlciBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKSB7XG4gICAgICByZXR1cm4gbG93ZXIgKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICAgICAqIGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICAgICAgc3RhcnQgKz0gc3RlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVwZWF0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlcGVhdChzdHJpbmcsIG4pIHtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIGlmICghc3RyaW5nIHx8IG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBMZXZlcmFnZSB0aGUgZXhwb25lbnRpYXRpb24gYnkgc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBhIGZhc3RlciByZXBlYXQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXhwb25lbnRpYXRpb25fYnlfc3F1YXJpbmcgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG4gJSAyKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBuID0gbmF0aXZlRmxvb3IobiAvIDIpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIHN0cmluZyArPSBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKG4pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVTaXplYCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4pIHtcbiAgICAgIHZhciBhcnJheSA9IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihhcnJheSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgICAgIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0RGF0YWAgd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBiYXNlU2V0RGF0YSA9ICFtZXRhTWFwID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBkYXRhKSB7XG4gICAgICBtZXRhTWFwLnNldChmdW5jLCBkYXRhKTtcbiAgICAgIHJldHVybiBmdW5jO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAgICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNodWZmbGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZih2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICAgICAgc3RhcnQgPj4+PSAwO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleCArIHN0YXJ0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvbWUoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhgIHdoaWNoXG4gICAgICogcGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIG9mIGBhcnJheWAgdG8gZGV0ZXJtaW5lIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyBsb3cgOiBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT09IHZhbHVlICYmIGhpZ2ggPD0gSEFMRl9NQVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgdmFyIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMSxcbiAgICAgICAgICAgICAgY29tcHV0ZWQgPSBhcnJheVttaWRdO1xuXG4gICAgICAgICAgaWYgKGNvbXB1dGVkICE9PSBudWxsICYmICFpc1N5bWJvbChjb21wdXRlZCkgJiZcbiAgICAgICAgICAgICAgKHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpKSkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZ2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpZGVudGl0eSwgcmV0SGlnaGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhCeWAgYW5kIGBfLnNvcnRlZExhc3RJbmRleEJ5YFxuICAgICAqIHdoaWNoIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZVxuICAgICAqIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHJldEhpZ2hlc3QpIHtcbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IGl0ZXJhdGVlKHZhbHVlKTtcbiAgICAgIHZhciB2YWxJc05hTiA9IHZhbHVlICE9PSB2YWx1ZSxcbiAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKSxcbiAgICAgICAgICB2YWxJc1VuZGVmaW5lZCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksXG4gICAgICAgICAgICBvdGhJc0RlZmluZWQgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gY29tcHV0ZWQgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZCxcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2woY29tcHV0ZWQpO1xuXG4gICAgICAgIGlmICh2YWxJc05hTikge1xuICAgICAgICAgIHZhciBzZXRMb3cgPSByZXRIaWdoZXN0IHx8IG90aElzUmVmbGV4aXZlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgb3RoSXNEZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzTnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgIW90aElzTnVsbCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNTeW1ib2wpO1xuICAgICAgICB9IGVsc2UgaWYgKG90aElzTnVsbCB8fCBvdGhJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldExvdyA9IHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXRMb3cpIHtcbiAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0XG4gICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFlcShjb21wdXRlZCwgc2VlbikpIHtcbiAgICAgICAgICB2YXIgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvTnVtYmVyYCB3aGljaCBkb2Vzbid0IGVuc3VyZSBjb3JyZWN0XG4gICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIHJldHVybiArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gICAgICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgZGVsZXRlIG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gYmFzZVNldChvYmplY3QsIHBhdGgsIHVwZGF0ZXIoYmFzZUdldChvYmplY3QsIHBhdGgpKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAgICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIGlzRHJvcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpICYmXG4gICAgICAgIHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHt9XG5cbiAgICAgIHJldHVybiBpc0Ryb3BcbiAgICAgICAgPyBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyAwIDogaW5kZXgpLCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogbGVuZ3RoKSlcbiAgICAgICAgOiBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiAwKSwgKGZyb21SaWdodCA/IGxlbmd0aCA6IGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHdyYXBwZXJWYWx1ZWAgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mXG4gICAgICogcGVyZm9ybWluZyBhIHNlcXVlbmNlIG9mIGFjdGlvbnMgb24gdGhlIHVud3JhcHBlZCBgdmFsdWVgLCB3aGVyZSBlYWNoXG4gICAgICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhY3Rpb25zIEFjdGlvbnMgdG8gcGVyZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsIGFjdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLCBmdW5jdGlvbihyZXN1bHQsIGFjdGlvbikge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsIGFycmF5UHVzaChbcmVzdWx0XSwgYWN0aW9uLmFyZ3MpKTtcbiAgICAgIH0sIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlVW5pcShhcnJheXNbMF0pIDogW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaW5kZXhdLFxuICAgICAgICAgICAgb3RoSW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytvdGhJbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChvdGhJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF0gfHwgYXJyYXksIGFycmF5c1tvdGhJbmRleF0sIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihyZXN1bHQsIDEpLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsIHZhbHVlcywgYXNzaWduRnVuYykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA8IHZhbHNMZW5ndGggPyB2YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gZW1wdHkgYXJyYXkgaWYgaXQncyBub3QgYW4gYXJyYXkgbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGBiYXNlUmVzdGAgYWxpYXMgd2hpY2ggY2FuIGJlIHJlcGxhY2VkIHdpdGggYGlkZW50aXR5YCBieSBtb2R1bGVcbiAgICAgKiByZXBsYWNlbWVudCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgY2FzdFJlc3QgPSBiYXNlUmVzdDtcblxuICAgIC8qKlxuICAgICAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICAgICAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYGNsZWFyVGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL2NsZWFyVGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfE9iamVjdH0gaWQgVGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0IG9mIHRoZSB0aW1lciB0byBjbGVhci5cbiAgICAgKi9cbiAgICB2YXIgY2xlYXJUaW1lb3V0ID0gY3R4Q2xlYXJUaW1lb3V0IHx8IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgYHN5bWJvbGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3ltYm9sIFRoZSBzeW1ib2wgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCkge1xuICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgICAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICAgICAqXG4gICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gICAgICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0luZGV4ID0gLTEsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgc2V0dGVyLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICAgICAgPyBzdHJpbmdUb0FycmF5KHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gc3RyU3ltYm9sc1swXVxuICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgICAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMSkuam9pbignJylcbiAgICAgICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgICAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gICAgICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgICAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmdzLCBob2xkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkgLSBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgICAgICBpZiAoZnJvbVJpZ2h0KSB7XG4gICAgICAgICAgZnVuY3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gbmV3IExvZGFzaFdyYXBwZXIoW10sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IHdyYXBwZXIgPyBpbmRleCA6IGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgICAgIGRhdGEgPSBmdW5jTmFtZSA9PSAnd3JhcHBlcicgPyBnZXREYXRhKGZ1bmMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgICAgIGRhdGFbMV0gPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykgJiZcbiAgICAgICAgICAgICAgICAhZGF0YVs0XS5sZW5ndGggJiYgZGF0YVs5XSA9PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpXG4gICAgICAgICAgICAgIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzUmlnaHRdIFRoZSBgcGFydGlhbHNSaWdodGAgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgV1JBUF9BUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRyxcbiAgICAgICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKSxcbiAgICAgICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnNDb3VudDtcbiAgICAgICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnUG9zKSB7XG4gICAgICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgb3ZlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcykge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgdmFyIHRoaXNBcmcgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gICAgICogaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gICAgICB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7XG4gICAgICBpZiAoY2hhcnNMZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlUmVwZWF0KGNoYXJzLCBuYXRpdmVDZWlsKGxlbmd0aCAvIHN0cmluZ1NpemUoY2hhcnMpKSk7XG4gICAgICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLCAwLCBsZW5ndGgpLmpvaW4oJycpXG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICAgICAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgICAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgICAgIG5ld0hvbGRlcnMgPSBpc0N1cnJ5ID8gaG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IHBhcnRpYWxzO1xuXG4gICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gICAgICBpZiAoIShiaXRtYXNrICYgV1JBUF9DVVJSWV9CT1VORF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgICAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5yb3VuZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgTWF0aGAgbWV0aG9kIHRvIHVzZSB3aGVuIHJvdW5kaW5nLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgICAgIGlmIChwcmVjaXNpb24gJiYgbmF0aXZlSXNGaW5pdGUobnVtYmVyKSkge1xuICAgICAgICAgIC8vIFNoaWZ0IHdpdGggZXhwb25lbnRpYWwgbm90YXRpb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgaXNzdWVzLlxuICAgICAgICAgIC8vIFNlZSBbTUROXShodHRwczovL21kbi5pby9yb3VuZCNFeGFtcGxlcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICB2YXIgcGFpciA9ICh0b1N0cmluZyhudW1iZXIpICsgJ2UnKS5zcGxpdCgnZScpLFxuICAgICAgICAgICAgICB2YWx1ZSA9IGZ1bmMocGFpclswXSArICdlJyArICgrcGFpclsxXSArIHByZWNpc2lvbikpO1xuXG4gICAgICAgICAgcGFpciA9ICh0b1N0cmluZyh2YWx1ZSkgKyAnZScpLnNwbGl0KCdlJyk7XG4gICAgICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jKG51bWJlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICAgICAqL1xuICAgIHZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8udG9QYWlyc2Agb3IgYF8udG9QYWlyc0luYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYWlycyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcob2JqZWN0KTtcbiAgICAgICAgaWYgKHRhZyA9PSBtYXBUYWcpIHtcbiAgICAgICAgICByZXR1cm4gbWFwVG9BcnJheShvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LCBrZXlzRnVuYyhvYmplY3QpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZWl0aGVyIGN1cnJpZXMgb3IgaW52b2tlcyBgZnVuY2Agd2l0aCBvcHRpb25hbFxuICAgICAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAgIDEgLSBgXy5iaW5kYFxuICAgICAqICAgIDIgLSBgXy5iaW5kS2V5YFxuICAgICAqICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICAgICAqICAgIDggLSBgXy5jdXJyeWBcbiAgICAgKiAgIDE2IC0gYF8uY3VycnlSaWdodGBcbiAgICAgKiAgIDMyIC0gYF8ucGFydGlhbGBcbiAgICAgKiAgIDY0IC0gYF8ucGFydGlhbFJpZ2h0YFxuICAgICAqICAxMjggLSBgXy5yZWFyZ2BcbiAgICAgKiAgMjU2IC0gYF8uYXJ5YFxuICAgICAqICA1MTIgLSBgXy5mbGlwYFxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFyeSA9IGFyeSA9PT0gdW5kZWZpbmVkID8gYXJ5IDogbmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLCAwKTtcbiAgICAgIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgICAgIGxlbmd0aCAtPSBob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAoYml0bWFzayAmIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsXG4gICAgICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogZ2V0RGF0YShmdW5jKTtcblxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsXG4gICAgICAgIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgbWVyZ2VEYXRhKG5ld0RhdGEsIGRhdGEpO1xuICAgICAgfVxuICAgICAgZnVuYyA9IG5ld0RhdGFbMF07XG4gICAgICBiaXRtYXNrID0gbmV3RGF0YVsxXTtcbiAgICAgIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICAgICAgcGFydGlhbHMgPSBuZXdEYXRhWzNdO1xuICAgICAgaG9sZGVycyA9IG5ld0RhdGFbNF07XG4gICAgICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgICAgICA6IG5hdGl2ZU1heChuZXdEYXRhWzldIC0gbGVuZ3RoLCAwKTtcblxuICAgICAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRykpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7XG4gICAgICB9XG4gICAgICBpZiAoIWJpdG1hc2sgfHwgYml0bWFzayA9PSBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKTtcbiAgICAgIH0gZWxzZSBpZiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcgfHwgYml0bWFzayA9PSBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpO1xuICAgICAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBXUkFQX1BBUlRJQUxfRkxBRyB8fCBiaXRtYXNrID09IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgc2V0dGVyID0gZGF0YSA/IGJhc2VTZXREYXRhIDogc2V0RGF0YTtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCwgbmV3RGF0YSksIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZSB0byBhc3NpZ24gcHJvcGVydGllc1xuICAgICAqIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcShvYmpWYWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c0RlZXBgIHRvIGN1c3RvbWl6ZSBpdHMgYF8ubWVyZ2VgIHVzZSB0byBtZXJnZSBzb3VyY2VcbiAgICAgKiBvYmplY3RzIGludG8gZGVzdGluYXRpb24gb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdGhydS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHBhcmVudCBvYmplY3Qgb2YgYHNyY1ZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c01lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spIHtcbiAgICAgIGlmIChpc09iamVjdChvYmpWYWx1ZSkgJiYgaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG9ialZhbHVlKTtcbiAgICAgICAgYmFzZU1lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwgdW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vbWl0YCB0byBjdXN0b21pemUgaXRzIGBfLmNsb25lRGVlcGAgdXNlIHRvIG9ubHkgY2xvbmUgcGxhaW5cbiAgICAgKiBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW5jbG9uZWQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgdG8gZGVmZXIgY2xvbmluZyB0byBgXy5jbG9uZURlZXBgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICAgICAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIGFyclN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKGFyclN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gYXJyU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IGFycmF5O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICAgICAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gICAgICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAgICAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAgICAgKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICAgICAgY2FzZSBlcnJvclRhZzpcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gICAgICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgICAgIGlmIChvYmpTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICAgICAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICAgICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgICAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICAgICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuKSwgZnVuYyArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBnZXREYXRhID0gIW1ldGFNYXAgPyBub29wIDogZnVuY3Rpb24oZnVuYykge1xuICAgICAgcmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKGZ1bmMubmFtZSArICcnKSxcbiAgICAgICAgICBhcnJheSA9IHJlYWxOYW1lc1tyZXN1bHRdLFxuICAgICAgICAgIGxlbmd0aCA9IGhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCByZXN1bHQpID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXJyYXlbbGVuZ3RoXSxcbiAgICAgICAgICAgIG90aGVyRnVuYyA9IGRhdGEuZnVuYztcbiAgICAgICAgaWYgKG90aGVyRnVuYyA9PSBudWxsIHx8IG90aGVyRnVuYyA9PSBmdW5jKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykge1xuICAgICAgdmFyIG9iamVjdCA9IGhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCAncGxhY2Vob2xkZXInKSA/IGxvZGFzaCA6IGZ1bmM7XG4gICAgICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIFwiaXRlcmF0ZWVcIiBmdW5jdGlvbi4gSWYgYF8uaXRlcmF0ZWVgIGlzIGN1c3RvbWl6ZWQsXG4gICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgYmFzZUl0ZXJhdGVlYC5cbiAgICAgKiBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY2hvc2VuIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGVtIGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgdGhlIGNyZWF0ZWQgaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjaG9zZW4gZnVuY3Rpb24gb3IgaXRzIHJlc3VsdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRlZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2guaXRlcmF0ZWUgfHwgaXRlcmF0ZWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQgPT09IGl0ZXJhdGVlID8gYmFzZUl0ZXJhdGVlIDogcmVzdWx0O1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByZXN1bHQoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICAgICAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gICAgICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICAgICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICAgICAgOiBkYXRhLm1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIHJlc3VsdFtsZW5ndGhdID0gW2tleSwgdmFsdWUsIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICAgIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIGlmICh1bm1hc2tlZCkge1xuICAgICAgICBpZiAoaXNPd24pIHtcbiAgICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgd2hpbGUgKG9iamVjdCkge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuICAgIC8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbiAgICBpZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAgICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgICAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgICAgIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICAgICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2aWV3LCBhcHBseWluZyBhbnkgYHRyYW5zZm9ybXNgIHRvIHRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHRyYW5zZm9ybXMgVGhlIHRyYW5zZm9ybWF0aW9ucyB0byBhcHBseSB0byB0aGUgdmlldy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBgc3RhcnRgIGFuZCBgZW5kYFxuICAgICAqICBwb3NpdGlvbnMgb2YgdGhlIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VmlldyhzdGFydCwgZW5kLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1zW2luZGV4XSxcbiAgICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkcm9wJzogICAgICBzdGFydCArPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICdkcm9wUmlnaHQnOiBlbmQgLT0gc2l6ZTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZSc6ICAgICAgZW5kID0gbmF0aXZlTWluKGVuZCwgc3RhcnQgKyBzaXplKTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZVJpZ2h0Jzogc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQsIGVuZCAtIHNpemUpOyBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgJ3N0YXJ0Jzogc3RhcnQsICdlbmQnOiBlbmQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB3cmFwcGVyIGRldGFpbHMgZnJvbSB0aGUgYHNvdXJjZWAgYm9keSBjb21tZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdyYXBwZXIgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNvdXJjZS5tYXRjaChyZVdyYXBEZXRhaWxzKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICAgICAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHtcbiAgICAgICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gICAgICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICAgICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA6IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgICAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICAgICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOlxuICAgICAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBzZXRUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzb3VyY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCBkZXRhaWxzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZGV0YWlscy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gICAgICBkZXRhaWxzID0gZGV0YWlscy5qb2luKGxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgIHJldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCAne1xcbi8qIFt3cmFwcGVkIHdpdGggJyArIGRldGFpbHMgKyAnXSAqL1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAgICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAgICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgICAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgICAgIDogKHZhbHVlID09PSBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYykge1xuICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgb3RoZXIgPSBsb2Rhc2hbZnVuY05hbWVdO1xuXG4gICAgICBpZiAodHlwZW9mIG90aGVyICE9ICdmdW5jdGlvbicgfHwgIShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChmdW5jID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gZ2V0RGF0YShvdGhlcik7XG4gICAgICByZXR1cm4gISFkYXRhICYmIGZ1bmMgPT09IGRhdGFbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICAgICAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGlzIGNhcGFibGUgb2YgYmVpbmcgbWFza2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2thYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgdmFyIGlzTWFza2FibGUgPSBjb3JlSnNEYXRhID8gaXNGdW5jdGlvbiA6IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgICAgIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICAgICAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICAgICAqIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBzcmNWYWx1ZSAmJlxuICAgICAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICAgICAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyB0aGUgZnVuY3Rpb24gbWV0YWRhdGEgb2YgYHNvdXJjZWAgaW50byBgZGF0YWAuXG4gICAgICpcbiAgICAgKiBNZXJnaW5nIG1ldGFkYXRhIHJlZHVjZXMgdGhlIG51bWJlciBvZiB3cmFwcGVycyB1c2VkIHRvIGludm9rZSBhIGZ1bmN0aW9uLlxuICAgICAqIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBtZXRob2RzIGxpa2UgYF8uYmluZGAsIGBfLmN1cnJ5YCwgYW5kIGBfLnBhcnRpYWxgXG4gICAgICogbWF5IGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBleGVjdXRpb24gb3JkZXIuIE1ldGhvZHMgbGlrZSBgXy5hcnlgIGFuZFxuICAgICAqIGBfLnJlYXJnYCBtb2RpZnkgZnVuY3Rpb24gYXJndW1lbnRzLCBtYWtpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlXG4gICAgICogZXhlY3V0ZWQgaW1wb3J0YW50LCBwcmV2ZW50aW5nIHRoZSBtZXJnaW5nIG9mIG1ldGFkYXRhLiBIb3dldmVyLCB3ZSBtYWtlXG4gICAgICogYW4gZXhjZXB0aW9uIGZvciBhIHNhZmUgY29tYmluZWQgY2FzZSB3aGVyZSBjdXJyaWVkIGZ1bmN0aW9ucyBoYXZlIGBfLmFyeWBcbiAgICAgKiBhbmQgb3IgYF8ucmVhcmdgIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgVGhlIGRlc3RpbmF0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgc291cmNlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGF0YWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2VEYXRhKGRhdGEsIHNvdXJjZSkge1xuICAgICAgdmFyIGJpdG1hc2sgPSBkYXRhWzFdLFxuICAgICAgICAgIHNyY0JpdG1hc2sgPSBzb3VyY2VbMV0sXG4gICAgICAgICAgbmV3Qml0bWFzayA9IGJpdG1hc2sgfCBzcmNCaXRtYXNrLFxuICAgICAgICAgIGlzQ29tbW9uID0gbmV3Qml0bWFzayA8IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyB8IFdSQVBfQVJZX0ZMQUcpO1xuXG4gICAgICB2YXIgaXNDb21ibyA9XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9SRUFSR19GTEFHKSAmJiAoZGF0YVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSkgfHxcbiAgICAgICAgKChzcmNCaXRtYXNrID09IChXUkFQX0FSWV9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSkgJiYgKHNvdXJjZVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKTtcblxuICAgICAgLy8gRXhpdCBlYXJseSBpZiBtZXRhZGF0YSBjYW4ndCBiZSBtZXJnZWQuXG4gICAgICBpZiAoIShpc0NvbW1vbiB8fCBpc0NvbWJvKSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYHRoaXNBcmdgIGlmIGF2YWlsYWJsZS5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICAgICAgZGF0YVsyXSA9IHNvdXJjZVsyXTtcbiAgICAgICAgLy8gU2V0IHdoZW4gY3VycnlpbmcgYSBib3VuZCBmdW5jdGlvbi5cbiAgICAgICAgbmV3Qml0bWFzayB8PSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcgPyAwIDogV1JBUF9DVVJSWV9CT1VORF9GTEFHO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIGFyZ3VtZW50cy5cbiAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVszXTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YXIgcGFydGlhbHMgPSBkYXRhWzNdO1xuICAgICAgICBkYXRhWzNdID0gcGFydGlhbHMgPyBjb21wb3NlQXJncyhwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs0XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs0XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVszXSwgUExBQ0VIT0xERVIpIDogc291cmNlWzRdO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIHJpZ2h0IGFyZ3VtZW50cy5cbiAgICAgIHZhbHVlID0gc291cmNlWzVdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHBhcnRpYWxzID0gZGF0YVs1XTtcbiAgICAgICAgZGF0YVs1XSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs2XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs2XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVs1XSwgUExBQ0VIT0xERVIpIDogc291cmNlWzZdO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuXG4gICAgICB2YWx1ZSA9IHNvdXJjZVs3XTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkYXRhWzddID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcnlgIGlmIGl0J3Mgc21hbGxlci5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9BUllfRkxBRykge1xuICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSA9PSBudWxsID8gc291cmNlWzhdIDogbmF0aXZlTWluKGRhdGFbOF0sIHNvdXJjZVs4XSk7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcml0eWAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbiAgICAgIGlmIChkYXRhWzldID09IG51bGwpIHtcbiAgICAgICAgZGF0YVs5XSA9IHNvdXJjZVs5XTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGZ1bmNgIGFuZCBtZXJnZSBiaXRtYXNrcy5cbiAgICAgIGRhdGFbMF0gPSBzb3VyY2VbMF07XG4gICAgICBkYXRhWzFdID0gbmV3Qml0bWFzaztcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gICAgICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgICAgIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBhcmVudCB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIGdldCB0aGUgcGFyZW50IHZhbHVlIG9mLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwYXJlbnQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyZW50KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGgubGVuZ3RoIDwgMiA/IG9iamVjdCA6IGJhc2VHZXQob2JqZWN0LCBiYXNlU2xpY2UocGF0aCwgMCwgLTEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAgICAgKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLFxuICAgICAgICAgIG9sZEFycmF5ID0gY29weUFycmF5KGFycmF5KTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgYXJyYXlbbGVuZ3RoXSA9IGlzSW5kZXgoaW5kZXgsIGFyckxlbmd0aCkgPyBvbGRBcnJheVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiIG9yIFwiY29uc3RydWN0b3JcIi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InICYmIHR5cGVvZiBvYmplY3Rba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBob3QsIGkuZS4gaXMgaW52b2tlZCBhIGxvdCBpbiBhIHNob3J0XG4gICAgICogcGVyaW9kIG9mIHRpbWUsIGl0IHdpbGwgdHJpcCBpdHMgYnJlYWtlciBhbmQgdHJhbnNpdGlvbiB0byBhbiBpZGVudGl0eVxuICAgICAqIGZ1bmN0aW9uIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBwYXVzZXMgaW4gVjguIFNlZVxuICAgICAqIFtWOCBpc3N1ZSAyMDcwXShodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDcwKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgc2V0RGF0YSA9IHNob3J0T3V0KGJhc2VTZXREYXRhKTtcblxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgW2BzZXRUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vc2V0VGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBzZXRUaW1lb3V0ID0gY3R4U2V0VGltZW91dCB8fCBmdW5jdGlvbihmdW5jLCB3YWl0KSB7XG4gICAgICByZXR1cm4gcm9vdC5zZXRUaW1lb3V0KGZ1bmMsIHdhaXQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICAgICAqIHdpdGggd3JhcHBlciBkZXRhaWxzIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcHBlciBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZmVyZW5jZSBUaGUgcmVmZXJlbmNlIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGB3cmFwcGVyYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlciwgcmVmZXJlbmNlLCBiaXRtYXNrKSB7XG4gICAgICB2YXIgc291cmNlID0gKHJlZmVyZW5jZSArICcnKTtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyh3cmFwcGVyLCBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gICAgICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gICAgICogbWlsbGlzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2hvcnRPdXQoZnVuYykge1xuICAgICAgdmFyIGNvdW50ID0gMCxcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIHdoaWNoIG11dGF0ZXMgYW5kIHNldHMgdGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPWFycmF5Lmxlbmd0aF0gVGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHNpemUgPSBzaXplID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBzaXplO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBzaXplKSB7XG4gICAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbcmFuZF07XG5cbiAgICAgICAgYXJyYXlbcmFuZF0gPSBhcnJheVtpbmRleF07XG4gICAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgYXJyYXkubGVuZ3RoID0gc2l6ZTtcbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICB2YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgICAgICByZXN1bHQucHVzaCgnJyk7XG4gICAgICB9XG4gICAgICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICAgICAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRldGFpbHNgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsIGJpdG1hc2spIHtcbiAgICAgIGFycmF5RWFjaCh3cmFwRmxhZ3MsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgICAgIGlmICgoYml0bWFzayAmIHBhaXJbMV0pICYmICFhcnJheUluY2x1ZGVzKGRldGFpbHMsIHZhbHVlKSkge1xuICAgICAgICAgIGRldGFpbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRldGFpbHMuc29ydCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgd3JhcHBlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB3cmFwcGVyIFRoZSB3cmFwcGVyIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB3cmFwcGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKSB7XG4gICAgICBpZiAod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJldHVybiB3cmFwcGVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXywgd3JhcHBlci5fX2NoYWluX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9faW5kZXhfXyAgPSB3cmFwcGVyLl9faW5kZXhfXztcbiAgICAgIHJlc3VsdC5fX3ZhbHVlc19fID0gd3JhcHBlci5fX3ZhbHVlc19fO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gZ3JvdXBzIHRoZSBsZW5ndGggb2YgYHNpemVgLlxuICAgICAqIElmIGBhcnJheWAgY2FuJ3QgYmUgc3BsaXQgZXZlbmx5LCB0aGUgZmluYWwgY2h1bmsgd2lsbCBiZSB0aGUgcmVtYWluaW5nXG4gICAgICogZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gVGhlIGxlbmd0aCBvZiBlYWNoIGNodW5rXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjaHVua3MuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDIpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbJ2MnLCAnZCddXVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMyk7XG4gICAgICogLy8gPT4gW1snYScsICdiJywgJ2MnXSwgWydkJ11dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2h1bmsoYXJyYXksIHNpemUsIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoYXJyYXksIHNpemUsIGd1YXJkKSA6IHNpemUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplID0gbmF0aXZlTWF4KHRvSW50ZWdlcihzaXplKSwgMCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShuYXRpdmVDZWlsKGxlbmd0aCAvIHNpemUpKTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGJhc2VTbGljZShhcnJheSwgaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFsc2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCxcbiAgICAgKiBgMGAsIGBcIlwiYCwgYHVuZGVmaW5lZGAsIGFuZCBgTmFOYCBhcmUgZmFsc2V5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvbXBhY3QoWzAsIDEsIGZhbHNlLCAyLCAnJywgM10pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGFycmF5IGNvbmNhdGVuYXRpbmcgYGFycmF5YCB3aXRoIGFueSBhZGRpdGlvbmFsIGFycmF5c1xuICAgICAqIGFuZC9vciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNvbmNhdGVuYXRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGNvbmNhdGVuYXRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzFdO1xuICAgICAqIHZhciBvdGhlciA9IF8uY29uY2F0KGFycmF5LCAyLCBbM10sIFtbNF1dKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmNhdCgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBBcnJheShsZW5ndGggLSAxKSxcbiAgICAgICAgICBhcnJheSA9IGFyZ3VtZW50c1swXSxcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgYXJnc1tpbmRleCAtIDFdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSkgPyBjb3B5QXJyYXkoYXJyYXkpIDogW2FycmF5XSwgYmFzZUZsYXR0ZW4oYXJncywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxCeWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZGlmZmVyZW5jZUJ5KFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgW3sgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgb3JkZXIgYW5kXG4gICAgICogcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbFdpdGhgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlV2l0aChvYmplY3RzLCBbeyAneCc6IDEsICd5JzogMiB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdCh2YWx1ZXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGNvbXBhcmF0b3IpKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3AoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIG4gPSBsZW5ndGggLSBuO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxscyBlbGVtZW50cyBvZiBgYXJyYXlgIHdpdGggYHZhbHVlYCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3RcbiAgICAgKiBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXy5maWxsKGFycmF5LCAnYScpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYScsICdhJ11cbiAgICAgKlxuICAgICAqIF8uZmlsbChBcnJheSgzKSwgMik7XG4gICAgICogLy8gPT4gWzIsIDIsIDJdXG4gICAgICpcbiAgICAgKiBfLmZpbGwoWzQsIDYsIDgsIDEwXSwgJyonLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbNCwgJyonLCAnKicsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgJiYgdHlwZW9mIHN0YXJ0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAnYmFybmV5JzsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzXG4gICAgICogb2YgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdwZWJibGVzJzsgfSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGZyb21JbmRleCA8IDBcbiAgICAgICAgICA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMClcbiAgICAgICAgICA6IG5hdGl2ZU1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVucyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDQsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgSU5GSU5JVFkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbiBgYXJyYXlgIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCBbMiwgWzMsIFs0XV0sIDVdXTtcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XSwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksIGRlcHRoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBkZXB0aCA9IGRlcHRoID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoKTtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZFxuICAgICAqIGZyb20ga2V5LXZhbHVlIGBwYWlyc2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZnJvbVBhaXJzKFtbJ2EnLCAxXSwgWydiJywgMl1dKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0W3BhaXJbMF1dID0gcGFpclsxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGZpcnN0XG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaGVhZChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uaGVhZChbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGVhZChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVlYCBpcyBmb3VuZCBpbiBgYXJyYXlgXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXMgdGhlXG4gICAgICogb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAwLCAtMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzJdXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjFdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpLFxuICAgICAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgICAgIGlmIChpdGVyYXRlZSA9PT0gbGFzdChtYXBwZWQpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlc1xuICAgICAqIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbGwgZWxlbWVudHMgaW4gYGFycmF5YCBpbnRvIGEgc3RyaW5nIHNlcGFyYXRlZCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScsJ10gVGhlIGVsZW1lbnQgc2VwYXJhdG9yLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGpvaW5lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uam9pbihbJ2EnLCAnYicsICdjJ10sICd+Jyk7XG4gICAgICogLy8gPT4gJ2F+Yn5jJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGpvaW4oYXJyYXksIHNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyAnJyA6IG5hdGl2ZUpvaW4uY2FsbChhcnJheSwgc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGFycmF5YCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgICAgPyBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KVxuICAgICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVsZW1lbnQgYXQgaW5kZXggYG5gIG9mIGBhcnJheWAuIElmIGBuYCBpcyBuZWdhdGl2ZSwgdGhlIG50aFxuICAgICAqIGVsZW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgMSk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgLTIpO1xuICAgICAqIC8vID0+ICdjJztcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGgoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VOdGgoYXJyYXksIHRvSW50ZWdlcihuKSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgZ2l2ZW4gdmFsdWVzIGZyb20gYGFycmF5YCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy53aXRob3V0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucmVtb3ZlYFxuICAgICAqIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHByZWRpY2F0ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsKGFycmF5LCAnYScsICdjJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbCA9IGJhc2VSZXN0KHB1bGxBbGwpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsKGFycmF5LCBbJ2EnLCAnYyddKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGwoYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VCeWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAzIH0sIHsgJ3gnOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsQnkoYXJyYXksIFt7ICd4JzogMSB9LCB7ICd4JzogMyB9XSwgJ3gnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbEJ5KGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlV2l0aGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMywgJ3knOiA0IH0sIHsgJ3gnOiA1LCAneSc6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxXaXRoKGFycmF5LCBbeyAneCc6IDMsICd5JzogNCB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDUsICd5JzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGxXaXRoKGFycmF5LCB2YWx1ZXMsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gYGFycmF5YCBjb3JyZXNwb25kaW5nIHRvIGBpbmRleGVzYCBhbmQgcmV0dXJucyBhblxuICAgICAqIGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmF0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBbaW5kZXhlc10gVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAqIHZhciBwdWxsZWQgPSBfLnB1bGxBdChhcnJheSwgWzEsIDNdKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYyddXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhwdWxsZWQpO1xuICAgICAqIC8vID0+IFsnYicsICdkJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbEF0ID0gZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBiYXNlQXQoYXJyYXksIGluZGV4ZXMpO1xuXG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBhcnJheU1hcChpbmRleGVzLCBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gaXNJbmRleChpbmRleCwgbGVuZ3RoKSA/ICtpbmRleCA6IGluZGV4O1xuICAgICAgfSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGBhcnJheWAgdGhhdCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3JcbiAgICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZmlsdGVyYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucHVsbGBcbiAgICAgKiB0byBwdWxsIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgMywgNF07XG4gICAgICogdmFyIGV2ZW5zID0gXy5yZW1vdmUoYXJyYXksIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZXZlbnMpO1xuICAgICAqIC8vID0+IFsyLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlbW92ZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmRleGVzID0gW10sXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyBgYXJyYXlgIHNvIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgbGFzdCwgdGhlIHNlY29uZFxuICAgICAqIGVsZW1lbnQgYmVjb21lcyB0aGUgc2Vjb25kIHRvIGxhc3QsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAgYW5kIGlzIGJhc2VkIG9uXG4gICAgICogW2BBcnJheSNyZXZlcnNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvcmV2ZXJzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLnJldmVyc2UoYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJldmVyc2UoYXJyYXkpIHtcbiAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gYXJyYXkgOiBuYXRpdmVSZXZlcnNlLmNhbGwoYXJyYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW5zdGVhZCBvZlxuICAgICAqIFtgQXJyYXkjc2xpY2VgXShodHRwczovL21kbi5pby9BcnJheS9zbGljZSkgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmVcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoZW5kICYmIHR5cGVvZiBlbmQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHN0YXJ0LCBlbmQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlcyBhIGJpbmFyeSBzZWFyY2ggdG8gZGV0ZXJtaW5lIHRoZSBsb3dlc3QgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFszMCwgNTBdLCA0MCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaGlnaGVzdFxuICAgICAqIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0b1xuICAgICAqIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXgoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkTGFzdEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5sYXN0SW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSkgLSAxO1xuICAgICAgICBpZiAoZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcShbMSwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5KVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcUJ5YCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcUJ5KFsxLjEsIDEuMiwgMi4zLCAyLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4xLCAyLjNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFpbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhaWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDEsIGxlbmd0aCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLiBFbGVtZW50cyBhcmVcbiAgICAgKiB0YWtlbiB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgZmFsc2UsIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuIEVsZW1lbnRzXG4gICAgICogYXJlIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgKiB3aGljaCB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbSB0aGUgZmlyc3RcbiAgICAgKiBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb25CeShbMi4xXSwgWzEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB1bmlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tXG4gICAgICogdGhlIGZpcnN0IGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGVsZW1lbnRcbiAgICAgKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gICAgICogaW4gdGhlIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcShbMiwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlXG4gICAgICogb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcUJ5KFsyLjEsIDEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlxQnkoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LlRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaXFXaXRoKG9iamVjdHMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFXaXRoKGFycmF5LCBjb21wYXJhdG9yKSB7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIGdyb3VwZWRcbiAgICAgKiBlbGVtZW50cyBhbmQgY3JlYXRlcyBhbiBhcnJheSByZWdyb3VwaW5nIHRoZSBlbGVtZW50cyB0byB0aGVpciBwcmUtemlwXG4gICAgICogY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAgICAgKlxuICAgICAqIF8udW56aXAoemlwcGVkKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwKGFycmF5KSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSAwO1xuICAgICAgYXJyYXkgPSBhcnJheUZpbHRlcihhcnJheSwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSkge1xuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChncm91cC5sZW5ndGgsIGxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJhc2VUaW1lcyhsZW5ndGgsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcChhcnJheSwgYmFzZVByb3BlcnR5KGluZGV4KSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAqIGhvdyByZWdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgKiAgcmVncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdKTtcbiAgICAgKiAvLyA9PiBbWzEsIDEwLCAxMDBdLCBbMiwgMjAsIDIwMF1dXG4gICAgICpcbiAgICAgKiBfLnVuemlwV2l0aCh6aXBwZWQsIF8uYWRkKTtcbiAgICAgKiAvLyA9PiBbMywgMzAsIDMwMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcFdpdGgoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB1bnppcChhcnJheSk7XG4gICAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5TWFwKHJlc3VsdCwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB1bmRlZmluZWQsIGdyb3VwKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCBnaXZlbiB2YWx1ZXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ueG9yXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud2l0aG91dChbMiwgMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqL1xuICAgIHZhciB3aXRob3V0ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBpcyB0aGVcbiAgICAgKiBbc3ltbWV0cmljIGRpZmZlcmVuY2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N5bW1ldHJpY19kaWZmZXJlbmNlKVxuICAgICAqIG9mIHRoZSBnaXZlbiBhcnJheXMuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyXG4gICAgICogdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy53aXRob3V0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKi9cbiAgICB2YXIgeG9yID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWRcbiAgICAgKiBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMiwgMy40XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy54b3JCeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXNcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnhvcldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgICAqIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogc2Vjb25kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqL1xuICAgIHZhciB6aXAgPSBiYXNlUmVzdCh1bnppcCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICAgICAqIG9uZSBvZiBwcm9wZXJ0eSBpZGVudGlmaWVycyBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBhc3NpZ25WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBPYmplY3RgIGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIHByb3BlcnR5IHBhdGhzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdERlZXAoWydhLmJbMF0uYycsICdhLmJbMV0uZCddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogW3sgJ2MnOiAxIH0sIHsgJ2QnOiAyIH1dIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYmFzZVNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IGdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICBncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcFdpdGgoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSwgZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIGEgKyBiICsgYztcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMTExLCAyMjJdXG4gICAgICovXG4gICAgdmFyIHppcFdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIGl0ZXJhdGVlID0gbGVuZ3RoID4gMSA/IGFycmF5c1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaXRlcmF0ZWUgPSB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyA/IChhcnJheXMucG9wKCksIGl0ZXJhdGVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB1bnppcFdpdGgoYXJyYXlzLCBpdGVyYXRlZSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB0aGF0IHdyYXBzIGB2YWx1ZWAgd2l0aCBleHBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC4gVGhlIHJlc3VsdCBvZiBzdWNoIHNlcXVlbmNlcyBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIHZhciB5b3VuZ2VzdCA9IF9cbiAgICAgKiAgIC5jaGFpbih1c2VycylcbiAgICAgKiAgIC5zb3J0QnkoJ2FnZScpXG4gICAgICogICAubWFwKGZ1bmN0aW9uKG8pIHtcbiAgICAgKiAgICAgcmV0dXJuIG8udXNlciArICcgaXMgJyArIG8uYWdlO1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5oZWFkKClcbiAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAqIC8vID0+ICdwZWJibGVzIGlzIDEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hhaW4odmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2godmFsdWUpO1xuICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IHRydWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgYGludGVyY2VwdG9yYCBhbmQgcmV0dXJucyBgdmFsdWVgLiBUaGUgaW50ZXJjZXB0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0b1xuICAgICAqIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZSBpbiBvcmRlciB0byBtb2RpZnkgaW50ZXJtZWRpYXRlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pXG4gICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgKiAgICAvLyBNdXRhdGUgaW5wdXQgYXJyYXkuXG4gICAgICogICAgYXJyYXkucG9wKCk7XG4gICAgICogIH0pXG4gICAgICogIC5yZXZlcnNlKClcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udGFwYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInBhc3MgdGhydVwiIHZhbHVlcyByZXBsYWNpbmcgaW50ZXJtZWRpYXRlXG4gICAgICogcmVzdWx0cyBpbiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oJyAgYWJjICAnKVxuICAgICAqICAuY2hhaW4oKVxuICAgICAqICAudHJpbSgpXG4gICAgICogIC50aHJ1KGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgICogIH0pXG4gICAgICogIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJ1KHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgd3JhcHBlciB2ZXJzaW9uIG9mIGBfLmF0YC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGF0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8ob2JqZWN0KS5hdChbJ2FbMF0uYi5jJywgJ2FbMV0nXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgd3JhcHBlckF0ID0gZmxhdFJlc3QoZnVuY3Rpb24ocGF0aHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgc3RhcnQgPSBsZW5ndGggPyBwYXRoc1swXSA6IDAsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICAgIGludGVyY2VwdG9yID0gZnVuY3Rpb24ob2JqZWN0KSB7IHJldHVybiBiYXNlQXQob2JqZWN0LCBwYXRocyk7IH07XG5cbiAgICAgIGlmIChsZW5ndGggPiAxIHx8IHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoIHx8XG4gICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB8fCAhaXNJbmRleChzdGFydCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0LCArc3RhcnQgKyAobGVuZ3RoID8gMSA6IDApKTtcbiAgICAgIHZhbHVlLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICdhcmdzJzogW2ludGVyY2VwdG9yXSxcbiAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLCB0aGlzLl9fY2hhaW5fXykudGhydShmdW5jdGlvbihhcnJheSkge1xuICAgICAgICBpZiAobGVuZ3RoICYmICFhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB3aXRoIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNoYWluXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aG91dCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgKiBfKHVzZXJzKS5oZWFkKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRoIGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpXG4gICAgICogICAuY2hhaW4oKVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnBpY2soJ3VzZXInKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKSB7XG4gICAgICByZXR1cm4gY2hhaW4odGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIGFuZCByZXR1cm5zIHRoZSB3cmFwcGVkIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNvbW1pdFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMl07XG4gICAgICogdmFyIHdyYXBwZWQgPSBfKGFycmF5KS5wdXNoKDMpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogd3JhcHBlZCA9IHdyYXBwZWQuY29tbWl0KCk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogd3JhcHBlZC5sYXN0KCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDb21taXQoKSB7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodGhpcy52YWx1ZSgpLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBvbiBhIHdyYXBwZWQgb2JqZWN0IGZvbGxvd2luZyB0aGVcbiAgICAgKiBbaXRlcmF0b3IgcHJvdG9jb2xdKGh0dHBzOi8vbWRuLmlvL2l0ZXJhdGlvbl9wcm90b2NvbHMjaXRlcmF0b3IpLlxuICAgICAqXG4gICAgICogQG5hbWUgbmV4dFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5leHQgaXRlcmF0b3IgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAxIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMiB9XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogdHJ1ZSwgJ3ZhbHVlJzogdW5kZWZpbmVkIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyTmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLl9fdmFsdWVzX18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9fdmFsdWVzX18gPSB0b0FycmF5KHRoaXMudmFsdWUoKSk7XG4gICAgICB9XG4gICAgICB2YXIgZG9uZSA9IHRoaXMuX19pbmRleF9fID49IHRoaXMuX192YWx1ZXNfXy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWUgPSBkb25lID8gdW5kZWZpbmVkIDogdGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdO1xuXG4gICAgICByZXR1cm4geyAnZG9uZSc6IGRvbmUsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgd3JhcHBlciB0byBiZSBpdGVyYWJsZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIFN5bWJvbC5pdGVyYXRvclxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHdyYXBwZXIgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgKlxuICAgICAqIHdyYXBwZWRbU3ltYm9sLml0ZXJhdG9yXSgpID09PSB3cmFwcGVkO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIEFycmF5LmZyb20od3JhcHBlZCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGNoYWluIHNlcXVlbmNlIHBsYW50aW5nIGB2YWx1ZWAgYXMgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBwbGFudFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBsYW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pLm1hcChzcXVhcmUpO1xuICAgICAqIHZhciBvdGhlciA9IHdyYXBwZWQucGxhbnQoWzMsIDRdKTtcbiAgICAgKlxuICAgICAqIG90aGVyLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzksIDE2XVxuICAgICAqXG4gICAgICogd3JhcHBlZC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzO1xuXG4gICAgICB3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCkge1xuICAgICAgICB2YXIgY2xvbmUgPSB3cmFwcGVyQ2xvbmUocGFyZW50KTtcbiAgICAgICAgY2xvbmUuX19pbmRleF9fID0gMDtcbiAgICAgICAgY2xvbmUuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gY2xvbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gY2xvbmU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXZpb3VzID0gY2xvbmU7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5fX3dyYXBwZWRfXztcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8ucmV2ZXJzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyB0aGUgd3JhcHBlZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXyhhcnJheSkucmV2ZXJzZSgpLnZhbHVlKClcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX187XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICB2YXIgd3JhcHBlZCA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpIHtcbiAgICAgICAgICB3cmFwcGVkID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZWQgPSB3cmFwcGVkLnJldmVyc2UoKTtcbiAgICAgICAgd3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICAgJ2FyZ3MnOiBbcmV2ZXJzZV0sXG4gICAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVkLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50aHJ1KHJldmVyc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbiBzZXF1ZW5jZSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIHRvSlNPTiwgdmFsdWVPZlxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVmFsdWUoKSB7XG4gICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBrZXkgd2FzIHJldHVybmVkIGJ5IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiAxLCAnNic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5jb3VudEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4geyAnMyc6IDIsICc1JzogMSB9XG4gICAgICovXG4gICAgdmFyIGNvdW50QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7XG4gICAgICAgICsrcmVzdWx0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFsbCoqIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGZvclxuICAgICAqIFtlbXB0eSBjb2xsZWN0aW9uc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1wdHlfc2V0KSBiZWNhdXNlXG4gICAgICogW2V2ZXJ5dGhpbmcgaXMgdHJ1ZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFjdW91c190cnV0aCkgb2ZcbiAgICAgKiBlbGVtZW50cyBvZiBlbXB0eSBjb2xsZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RXZlcnkgOiBiYXNlRXZlcnk7XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkpIHtcbiAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQHNlZSBfLnJlamVjdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIENvbWJpbmluZyBzZXZlcmFsIHByZWRpY2F0ZXMgdXNpbmcgYF8ub3ZlckV2ZXJ5YCBvciBgXy5vdmVyU29tZWAuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgKi9cbiAgICB2YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWNvbGxlY3Rpb24ubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIHZhciBmaW5kTGFzdCA9IGNyZWF0ZUZpbmQoZmluZExhc3RJbmRleCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmxhdHRlbmVkIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aHJ1IGBpdGVyYXRlZWAgYW5kIGZsYXR0ZW5pbmcgdGhlIG1hcHBlZCByZXN1bHRzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW24sIG5dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZWVwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIElORklOSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICAgICAqIG1hcHBlZCByZXN1bHRzIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZXB0aChbMSwgMl0sIGR1cGxpY2F0ZSwgMik7XG4gICAgICogLy8gPT4gW1sxLCAxXSwgWzIsIDJdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgZGVwdGgpIHtcbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICAgICAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBlYWNoXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQHNlZSBfLmZvckVhY2hSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JFYWNoYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBhbGlhcyBlYWNoUmlnaHRcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2hSaWdodChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMmAgdGhlbiBgMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2hSaWdodCA6IGJhc2VFYWNoUmlnaHQ7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgb3JkZXIgb2YgZ3JvdXBlZCB2YWx1ZXNcbiAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIGBjb2xsZWN0aW9uYC4gVGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiB2YWx1ZSBvZiBlYWNoIGtleSBpcyBhbiBhcnJheSBvZiBlbGVtZW50cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGVcbiAgICAgKiBrZXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi4zXSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmdyb3VwQnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH1cbiAgICAgKi9cbiAgICB2YXIgZ3JvdXBCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIFt2YWx1ZV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAgICAgKiBjaGVja2VkIGZvciBhIHN1YnN0cmluZyBvZiBgdmFsdWVgLCBvdGhlcndpc2VcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCAmJiAhZ3VhcmQpID8gdG9JbnRlZ2VyKGZyb21JbmRleCkgOiAwO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgICAgICBmcm9tSW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgICAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKVxuICAgICAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAsIHJldHVybmluZ1xuICAgICAqIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqIGFyZSBwcm92aWRlZCB0byBlYWNoIGludm9rZWQgbWV0aG9kLiBJZiBgcGF0aGAgaXMgYSBmdW5jdGlvbiwgaXQncyBpbnZva2VkXG4gICAgICogZm9yLCBhbmQgYHRoaXNgIGJvdW5kIHRvLCBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgKiAgdGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBlYWNoIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnZva2VNYXAoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAgICAgKiAvLyA9PiBbWzEsIDUsIDddLCBbMSwgMiwgM11dXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwgWyc0JywgJzUnLCAnNiddXVxuICAgICAqL1xuICAgIHZhciBpbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBwYXRoLCBhcmdzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGlzRnVuYyA/IGFwcGx5KHBhdGgsIHZhbHVlLCBhcmdzKSA6IGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbXG4gICAgICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSxcbiAgICAgKiAgIHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5rZXlCeShhcnJheSwgZnVuY3Rpb24obykge1xuICAgICAqICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoby5jb2RlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCAnZGlyJyk7XG4gICAgICogLy8gPT4geyAnbGVmdCc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKi9cbiAgICB2YXIga2V5QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAgICAgKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAgICAgKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAgICAgKiAvLyA9PiBbMTYsIDY0XVxuICAgICAqXG4gICAgICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0QnlgIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBzb3J0XG4gICAgICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXNcbiAgICAgKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvclxuICAgICAqIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXIgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5W118RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3JkZXJzXSBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gU29ydCBieSBgdXNlcmAgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBieSBgYWdlYCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIF8ub3JkZXJCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddLCBbJ2FzYycsICdkZXNjJ10pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMsIGd1YXJkKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheShpdGVyYXRlZXMpKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGl0ZXJhdGVlcyA9PSBudWxsID8gW10gOiBbaXRlcmF0ZWVzXTtcbiAgICAgIH1cbiAgICAgIG9yZGVycyA9IGd1YXJkID8gdW5kZWZpbmVkIDogb3JkZXJzO1xuICAgICAgaWYgKCFpc0FycmF5KG9yZGVycykpIHtcbiAgICAgICAgb3JkZXJzID0gb3JkZXJzID09IG51bGwgPyBbXSA6IFtvcmRlcnNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB0aGUgc2Vjb25kIG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkgZm9yLiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1sncGViYmxlcyddLCBbJ2Jhcm5leScsICdmcmVkJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAncGViYmxlcyddLCBbJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICovXG4gICAgdmFyIHBhcnRpdGlvbiA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRba2V5ID8gMCA6IDFdLnB1c2godmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkgeyByZXR1cm4gW1tdLCBbXV07IH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVkdWNlcyBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICAgICAqIGlzIG5vdCBnaXZlbiwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxcbiAgICAgKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAgICAgKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICAgICAqIGFuZCBgc29ydEJ5YFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBuO1xuICAgICAqIH0sIDApO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dO1xuICAgICAqXG4gICAgICogXy5yZWR1Y2VSaWdodChhcnJheSwgZnVuY3Rpb24oZmxhdHRlbmVkLCBvdGhlcikge1xuICAgICAqICAgcmV0dXJuIGZsYXR0ZW5lZC5jb25jYXQob3RoZXIpO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlUmlnaHQgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5maWx0ZXJgOyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8uZmlsdGVyXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGUgOiBiYXNlU2FtcGxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBgbmAgcmFuZG9tIGVsZW1lbnRzIGF0IHVuaXF1ZSBrZXlzIGZyb20gYGNvbGxlY3Rpb25gIHVwIHRvIHRoZVxuICAgICAqIHNpemUgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszLCAxXVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgNCk7XG4gICAgICogLy8gPT4gWzIsIDMsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZVxuICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMsIDRdKTtcbiAgICAgKiAvLyA9PiBbNCwgMSwgMywgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2h1ZmZsZSA6IGJhc2VTaHVmZmxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAgICAgKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiA3XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbnkqKiBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29tZShbbnVsbCwgMCwgJ3llcycsIGZhbHNlXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNvbWUgOiBiYXNlU29tZTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gICAgICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAgICAgKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgMzBdXVxuICAgICAqXG4gICAgICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0OF1dXG4gICAgICovXG4gICAgdmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAgICAgKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBEYXRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICAgICAqIH0sIF8ubm93KCkpO1xuICAgICAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gICAgICovXG4gICAgdmFyIG5vdyA9IGN0eE5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByb290LkRhdGUubm93KCk7XG4gICAgfTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5iZWZvcmVgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogYGZ1bmNgIG9uY2UgaXQncyBjYWxsZWQgYG5gIG9yIG1vcmUgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGJlZm9yZSBgZnVuY2AgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTtcbiAgICAgKlxuICAgICAqIHZhciBkb25lID0gXy5hZnRlcihzYXZlcy5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ2RvbmUgc2F2aW5nIScpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6IGRvbmUgfSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnZG9uZSBzYXZpbmchJyBhZnRlciB0aGUgdHdvIGFzeW5jIHNhdmVzIGhhdmUgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFmdGVyKG4sIGZ1bmMpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPCAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB1cCB0byBgbmAgYXJndW1lbnRzLFxuICAgICAqIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IGNhcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy5hcnkocGFyc2VJbnQsIDEpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJ5KGZ1bmMsIG4sIGd1YXJkKSB7XG4gICAgICBuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgbiA9IChmdW5jICYmIG4gPT0gbnVsbCkgPyBmdW5jLmxlbmd0aCA6IG47XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0FSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggYGZ1bmNgIGlzIG5vIGxvbmdlciBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gICAgICogLy8gPT4gQWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPD0gMSkge1xuICAgICAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgXG4gICAgICogYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIG5hdGl2ZSBgRnVuY3Rpb24jYmluZGAsIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kKSk7XG4gICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYCB3aXRoIGBwYXJ0aWFsc2BcbiAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG8gcmVmZXJlbmNlXG4gICAgICogbWV0aG9kcyB0aGF0IG1heSBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LiBTZWVcbiAgICAgKiBbUGV0ZXIgTWljaGF1eCdzIGFydGljbGVdKGh0dHA6Ly9wZXRlci5taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24tZGVmaW5pdGlvbi1wYXR0ZXJuKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZEtleS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ3VzZXInOiAnZnJlZCcsXG4gICAgICogICAnZ3JlZXQnOiBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAneWEgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKi9cbiAgICB2YXIgYmluZEtleSA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwga2V5LCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmRLZXkpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGtleSwgYml0bWFzaywgb2JqZWN0LCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gICAgICogYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhdCBsZWFzdCBgYXJpdHlgIG51bWJlciBvZiBhcmd1bWVudHMgaGF2ZVxuICAgICAqIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHJlbWFpbmluZyBgZnVuY2BcbiAgICAgKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAgICAgKiBpcyBub3Qgc3VmZmljaWVudC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeShhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgxKSgyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMikoMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDEpKF8sIDMpKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY3VycnlgIGV4Y2VwdCB0aGF0IGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byBgZnVuY2BcbiAgICAgKiBpbiB0aGUgbWFubmVyIG9mIGBfLnBhcnRpYWxSaWdodGAgaW5zdGVhZCBvZiBgXy5wYXJ0aWFsYC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5UmlnaHQoYWJjKTtcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMykoMikoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDIsIDMpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogY3VycmllZCgzKSgxLCBfKSgyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnlSaWdodC5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gICAgICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gICAgICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICAgICAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICAgICAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICAgICAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAgICAgKiBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAgICAgKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KSk7XG4gICAgICpcbiAgICAgKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICAgICAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICAgICAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAgICAgKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsYXN0QXJncyxcbiAgICAgICAgICBsYXN0VGhpcyxcbiAgICAgICAgICBtYXhXYWl0LFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICB0aW1lcklkLFxuICAgICAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgICAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICAgICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAgICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICAgICAgcmV0dXJuIG1heGluZ1xuICAgICAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgICAgICA6IHRpbWVXYWl0aW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgICAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgICAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgICAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgICAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgICAgIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICAgICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVmZXIuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgJ2RlZmVycmVkJyk7XG4gICAgICogLy8gPT4gTG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBtaWxsaXNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVmZXIgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIDEsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyBgZnVuY2AgYWZ0ZXIgYHdhaXRgIG1pbGxpc2Vjb25kcy4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgMTAwMCwgJ2xhdGVyJyk7XG4gICAgICogLy8gPT4gTG9ncyAnbGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlbGF5ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCB0b051bWJlcih3YWl0KSB8fCAwLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIHJldmVyc2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZmxpcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsaXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmbGlwcGVkID0gXy5mbGlwKGZ1bmN0aW9uKCkge1xuICAgICAqICAgcmV0dXJuIF8udG9BcnJheShhcmd1bWVudHMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogZmxpcHBlZCgnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+IFsnZCcsICdjJywgJ2InLCAnYSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxpcChmdW5jKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0ZMSVBfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAgICAgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gICAgICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAgICAgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICAgICAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gICAgICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAgICAgKlxuICAgICAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogdmFsdWVzKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKlxuICAgICAqIG9iamVjdC5hID0gMjtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICAgICAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICpcbiAgICAgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICAgICAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gICAgICByZXR1cm4gbWVtb2l6ZWQ7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG4gICAgbWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgYGZ1bmNgLiBUaGVcbiAgICAgKiBgZnVuY2AgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgdG8gbmVnYXRlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG5lZ2F0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbMSwgMiwgMywgNCwgNSwgNl0sIF8ubmVnYXRlKGlzRXZlbikpO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5lZ2F0ZShwcmVkaWNhdGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gICAgICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICAgICAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudHMgdHJhbnNmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbdHJhbnNmb3Jtcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm1zLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkb3VibGVkKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyQXJncyhmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4gW3gsIHldO1xuICAgICAqIH0sIFtzcXVhcmUsIGRvdWJsZWRdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoOSwgMyk7XG4gICAgICogLy8gPT4gWzgxLCA2XVxuICAgICAqXG4gICAgICogZnVuYygxMCwgNSk7XG4gICAgICogLy8gPT4gWzEwMCwgMTBdXG4gICAgICovXG4gICAgdmFyIG92ZXJBcmdzID0gY2FzdFJlc3QoZnVuY3Rpb24oZnVuYywgdHJhbnNmb3Jtcykge1xuICAgICAgdHJhbnNmb3JtcyA9ICh0cmFuc2Zvcm1zLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodHJhbnNmb3Jtc1swXSkpXG4gICAgICAgID8gYXJyYXlNYXAodHJhbnNmb3Jtc1swXSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKVxuICAgICAgICA6IGFycmF5TWFwKGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMsIDEpLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgZnVuY3NMZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGFyZ3MubGVuZ3RoLCBmdW5jc0xlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IHRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcywgYXJnc1tpbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGVcbiAgICAgKiBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYmluZGAgZXhjZXB0IGl0IGRvZXMgKipub3QqKlxuICAgICAqIGFsdGVyIHRoZSBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsKGdyZWV0LCBfLCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wYXJ0aWFsYCBleGNlcHQgdGhhdCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHNcbiAgICAgKiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsUmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdoZWxsbycsIF8pO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbFJpZ2h0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIGFycmFuZ2VkIGFjY29yZGluZ1xuICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgc2Vjb25kIGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVhcnJhbmdlIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHJlYXJnZWQgPSBfLnJlYXJnKGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfSwgWzIsIDAsIDFdKTtcbiAgICAgKlxuICAgICAqIHJlYXJnZWQoJ2InLCAnYycsICdhJylcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICB2YXIgcmVhcmcgPSBmbGF0UmVzdChmdW5jdGlvbihmdW5jLCBpbmRleGVzKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1JFQVJHX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGluZGV4ZXMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGZyb20gYHN0YXJ0YCBhbmQgYmV5b25kIHByb3ZpZGVkIGFzXG4gICAgICogYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3Jlc3QgcGFyYW1ldGVyXShodHRwczovL21kbi5pby9yZXN0X3BhcmFtZXRlcnMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnJlc3QoZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAgICAgKiAgIHJldHVybiB3aGF0ICsgJyAnICsgXy5pbml0aWFsKG5hbWVzKS5qb2luKCcsICcpICtcbiAgICAgKiAgICAgKF8uc2l6ZShuYW1lcykgPiAxID8gJywgJiAnIDogJycpICsgXy5sYXN0KG5hbWVzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheSgnaGVsbG8nLCAnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcycpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09PSB1bmRlZmluZWQgPyBzdGFydCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuYywgc3RhcnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZSBmdW5jdGlvbiBhbmQgYW4gYXJyYXkgb2YgYXJndW1lbnRzIG11Y2ggbGlrZVxuICAgICAqIFtgRnVuY3Rpb24jYXBwbHlgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3ByZWFkIG9wZXJhdG9yXShodHRwczovL21kbi5pby9zcHJlYWRfb3BlcmF0b3IpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzcHJlYWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHtcbiAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pO1xuICAgICAqIC8vID0+ICdmcmVkIHNheXMgaGVsbG8nXG4gICAgICpcbiAgICAgKiB2YXIgbnVtYmVycyA9IFByb21pc2UuYWxsKFtcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSg0MCksXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoMzYpXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBudW1iZXJzLnRoZW4oXy5zcHJlYWQoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIHggKyB5O1xuICAgICAqIH0pKTtcbiAgICAgKiAvLyA9PiBhIFByb21pc2Ugb2YgNzZcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcHJlYWQoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwgMCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcmdzW3N0YXJ0XSxcbiAgICAgICAgICAgIG90aGVyQXJncyA9IGNhc3RTbGljZShhcmdzLCAwLCBzdGFydCk7XG5cbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKG90aGVyQXJncywgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICAgICAqIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgXG4gICAgICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICAgICAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICAgICAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGBcbiAgICAgKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gICAgICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICAgICAqIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRocm90dGxlZCBmdW5jdGlvblxuICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAgICAgKlxuICAgICAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwgeyAndHJhaWxpbmcnOiBmYWxzZSB9KTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgdGhyb3R0bGVkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAgICAgJ21heFdhaXQnOiB3YWl0LFxuICAgICAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB1cCB0byBvbmUgYXJndW1lbnQsIGlnbm9yaW5nIGFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLnVuYXJ5KHBhcnNlSW50KSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuYXJ5KGZ1bmMpIHtcbiAgICAgIHJldHVybiBhcnkoZnVuYywgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYHZhbHVlYCB0byBgd3JhcHBlcmAgYXMgaXRzIGZpcnN0XG4gICAgICogYXJndW1lbnQuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkXG4gICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGB3cmFwcGVyYC4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbd3JhcHBlcj1pZGVudGl0eV0gVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7XG4gICAgICogICByZXR1cm4gJzxwPicgKyBmdW5jKHRleHQpICsgJzwvcD4nO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogcCgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnPHA+ZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzPC9wPidcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwKHZhbHVlLCB3cmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIGFzIGFuIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KDEpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW251bGxdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWRdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICogY29uc29sZS5sb2coXy5jYXN0QXJyYXkoYXJyYXkpID09PSBhcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheSgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbMF07XG4gICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gICAgICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLFxuICAgICAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICAgICAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gICAgICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaFxuICAgICAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZS4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gICAgICogY2xvbmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB1cCB0byBmb3VyIGFyZ3VtZW50czsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coZGVlcFswXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZVdpdGhgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lRGVlcFdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG9iamVjdGAgY29uZm9ybXMgdG8gYHNvdXJjZWAgYnkgaW52b2tpbmcgdGhlIHByZWRpY2F0ZVxuICAgICAqIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDI7IH0gfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcShOYU4sIE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZ3QoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3QgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlCdWZmZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXlCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXlCdWZmZXIgPSBub2RlSXNBcnJheUJ1ZmZlciA/IGJhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcikgOiBiYXNlSXNBcnJheUJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAgICAgKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICAgICAqIGlzIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKGZhbHNlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBib29sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRGF0ZWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZSgnTW9uIEFwcmlsIDIzIDIwMTInKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0RhdGUgPSBub2RlSXNEYXRlID8gYmFzZVVuYXJ5KG5vZGVJc0RhdGUpIDogYmFzZUlzRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KCc8Ym9keT4nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgdmFsdWUubm9kZVR5cGUgPT09IDEgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gICAgICpcbiAgICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gICAgICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICAgICAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHRydWUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSgxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmVcbiAgICAgKiBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLFxuICAgICAqIGRhdGUgb2JqZWN0cywgZXJyb3Igb2JqZWN0cywgbWFwcywgbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcyxcbiAgICAgKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICAgICAqIGJ5IHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGdW5jdGlvbnMgYW5kIERPTVxuICAgICAqIG5vZGVzIGFyZSBjb21wYXJlZCBieSBzdHJpY3QgZXF1YWxpdHksIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIG9iamVjdCA9PT0gb3RoZXI7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0VxdWFsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggdXAgdG9cbiAgICAgKiBzaXggYXJndW1lbnRzOiAob2JqVmFsdWUsIG90aFZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKG90aFZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBbJ2hpJywgJ2dvb2RieWUnXTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsIG90aGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIodmFsdWUsIG90aGVyKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgdW5kZWZpbmVkLCBjdXN0b21pemVyKSA6ICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIGBFdmFsRXJyb3JgLCBgUmFuZ2VFcnJvcmAsIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAgICogYFN5bnRheEVycm9yYCwgYFR5cGVFcnJvcmAsIG9yIGBVUklFcnJvcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBlcnJvciBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKG5ldyBFcnJvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKEVycm9yKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGVycm9yVGFnIHx8IHRhZyA9PSBkb21FeGNUYWcgfHxcbiAgICAgICAgKHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS5uYW1lID09ICdzdHJpbmcnICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzRmluaXRlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgbmF0aXZlSXNGaW5pdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oXyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAgICAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAgICAgKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICAgICAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2Uoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYG9iamVjdGAgYW5kIGBzb3VyY2VgIHRvXG4gICAgICogZGV0ZXJtaW5lIGlmIGBvYmplY3RgIGNvbnRhaW5zIGVxdWl2YWxlbnQgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8ubWF0Y2hlc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIGZpdmVcbiAgICAgKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKHNyY1ZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnZ3JlZXRpbmcnOiAnaGVsbG8nIH07XG4gICAgICogdmFyIHNvdXJjZSA9IHsgJ2dyZWV0aW5nJzogJ2hpJyB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzTmFOKSBhbmQgaXMgbm90IHRoZSBzYW1lIGFzXG4gICAgICogZ2xvYmFsIFtgaXNOYU5gXShodHRwczovL21kbi5pby9pc05hTikgd2hpY2ggcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogYHVuZGVmaW5lZGAgYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTihuZXcgTnVtYmVyKE5hTikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAgIC8vIEFuIGBOYU5gIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBgdG9TdHJpbmdUYWdgIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWVcbiAgICAgIC8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbiAgICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgIT0gK3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJpc3RpbmUgbmF0aXZlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZVxuICAgICAqIG9mIHRoZSBjb3JlLWpzIHBhY2thZ2UgYmVjYXVzZSBjb3JlLWpzIGNpcmN1bXZlbnRzIHRoaXMga2luZCBvZiBkZXRlY3Rpb24uXG4gICAgICogRGVzcGl0ZSBtdWx0aXBsZSByZXF1ZXN0cywgdGhlIGNvcmUtanMgbWFpbnRhaW5lciBoYXMgbWFkZSBpdCBjbGVhcjogYW55XG4gICAgICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0XG4gICAgICogd2l0aCBsaXR0bGUgY2hvaWNlIGJ1dCB0byB0aHJvdyBhbiBlcnJvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGFmZmVjdHNcbiAgICAgKiBwYWNrYWdlcywgbGlrZSBbYmFiZWwtcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBvbHlmaWxsKSxcbiAgICAgKiB3aGljaCByZWx5IG9uIGNvcmUtanMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoXyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKGlzTWFza2FibGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bGwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bGwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmVcbiAgICAgKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjguMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICAgIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgICAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgUmVnRXhwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoL2FiYy8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoJy9hYmMvJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNSZWdFeHAgPSBub2RlSXNSZWdFeHAgPyBiYXNlVW5hcnkobm9kZUlzUmVnRXhwKSA6IGJhc2VJc1JlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLiBBbiBpbnRlZ2VyIGlzIHNhZmUgaWYgaXQncyBhbiBJRUVFLTc1NFxuICAgICAqIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIHdoaWNoIGlzbid0IHRoZSByZXN1bHQgb2YgYSByb3VuZGVkIHVuc2FmZSBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNTYWZlSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc1NhZmVJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtTUFYX1NBRkVfSU5URUdFUiAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBiYXNlVW5hcnkobm9kZUlzU2V0KSA6IGJhc2VJc1NldDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHdlYWtNYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSB3ZWFrU2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdCgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlTHQpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdGUoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHRlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9BcnJheSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyBzdHJpbmdUb0FycmF5KHZhbHVlKSA6IGNvcHlBcnJheSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3ltSXRlcmF0b3IgJiYgdmFsdWVbc3ltSXRlcmF0b3JdKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgZnVuYyA9IHRhZyA9PSBtYXBUYWcgPyBtYXBUb0FycmF5IDogKHRhZyA9PSBzZXRUYWcgPyBzZXRUb0FycmF5IDogdmFsdWVzKTtcblxuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTIuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgICAgIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgbGVuZ3RoIG9mIGFuXG4gICAgICogYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA0Mjk0OTY3Mjk1XG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAwLCBNQVhfQVJSQVlfTEVOR1RIKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBJbmZpbml0eVxuICAgICAqXG4gICAgICogXy50b051bWJlcignMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICAgICAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgICAgIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgICAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICAgICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICAgICAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBwbGFpbiBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIG5ldyBGb28pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgXy50b1BsYWluT2JqZWN0KG5ldyBGb28pKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc2FmZSBpbnRlZ2VyLiBBIHNhZmUgaW50ZWdlciBjYW4gYmUgY29tcGFyZWQgYW5kXG4gICAgICogcmVwcmVzZW50ZWQgY29ycmVjdGx5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA5MDA3MTk5MjU0NzQwOTkxXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgPyBiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwgLU1BWF9TQUZFX0lOVEVHRVIsIE1BWF9TQUZFX0lOVEVHRVIpXG4gICAgICAgIDogKHZhbHVlID09PSAwID8gdmFsdWUgOiAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIGBudWxsYFxuICAgICAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcobnVsbCk7XG4gICAgICogLy8gPT4gJydcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcoLTApO1xuICAgICAqIC8vID0+ICctMCdcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAnMSwyLDMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlXG4gICAgICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gICAgICogU3Vic2VxdWVudCBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAgYW5kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYE9iamVjdC5hc3NpZ25gXShodHRwczovL21kbi5pby9PYmplY3QvYXNzaWduKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbkluXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQmFyKCkge1xuICAgICAqICAgdGhpcy5jID0gMztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIGlmIChpc1Byb3RvdHlwZShzb3VyY2UpIHx8IGlzQXJyYXlMaWtlKHNvdXJjZSkpIHtcbiAgICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBvd24gYW5kXG4gICAgICogaW5oZXJpdGVkIHNvdXJjZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZXh0ZW5kXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICogICB0aGlzLmMgPSAzO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAgICAgKlxuICAgICAqIF8uYXNzaWduSW4oeyAnYSc6IDAgfSwgbmV3IEZvbywgbmV3IEJhcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzLCAnZCc6IDQgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25JbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbkluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGV4dGVuZFdpdGhcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbkluV2l0aCwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduSW5XaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCwgYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiBfLmlzVW5kZWZpbmVkKG9ialZhbHVlKSA/IHNyY1ZhbHVlIDogb2JqVmFsdWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGRlZmF1bHRzID0gXy5wYXJ0aWFsUmlnaHQoXy5hc3NpZ25XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25XaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBgcGF0aHNgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH0sIDRdIH07XG4gICAgICpcbiAgICAgKiBfLmF0KG9iamVjdCwgWydhWzBdLmIuYycsICdhWzFdJ10pO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqL1xuICAgIHZhciBhdCA9IGZsYXRSZXN0KGJhc2VBdCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhlIGBwcm90b3R5cGVgIG9iamVjdC4gSWYgYVxuICAgICAqIGBwcm9wZXJ0aWVzYCBvYmplY3QgaXMgZ2l2ZW4sIGl0cyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllc1xuICAgICAqIGFyZSBhc3NpZ25lZCB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXNdIFRoZSBwcm9wZXJ0aWVzIHRvIGFzc2lnbiB0byB0aGUgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIFNoYXBlKCkge1xuICAgICAqICAgdGhpcy54ID0gMDtcbiAgICAgKiAgIHRoaXMueSA9IDA7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQ2lyY2xlKCkge1xuICAgICAqICAgU2hhcGUuY2FsbCh0aGlzKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBDaXJjbGUucHJvdG90eXBlID0gXy5jcmVhdGUoU2hhcGUucHJvdG90eXBlLCB7XG4gICAgICogICAnY29uc3RydWN0b3InOiBDaXJjbGVcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHZhciBjaXJjbGUgPSBuZXcgQ2lyY2xlO1xuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIENpcmNsZTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBTaGFwZTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykge1xuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VDcmVhdGUocHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBwcm9wZXJ0aWVzID09IG51bGwgPyByZXN1bHQgOiBiYXNlQXNzaWduKHJlc3VsdCwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZVxuICAgICAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICAgICAqIHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgKiBPbmNlIGEgcHJvcGVydHkgaXMgc2V0LCBhZGRpdGlvbmFsIHZhbHVlcyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBhcmUgaWdub3JlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5kZWZhdWx0c0RlZXBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHMgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgIHZhciBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aDtcbiAgICAgIHZhciBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgdmFyIHByb3BzID0ga2V5c0luKHNvdXJjZSk7XG4gICAgICAgIHZhciBwcm9wc0luZGV4ID0gLTE7XG4gICAgICAgIHZhciBwcm9wc0xlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoKytwcm9wc0luZGV4IDwgcHJvcHNMZW5ndGgpIHtcbiAgICAgICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07XG4gICAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAoZXEodmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgICAgIG9iamVjdFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRlZmF1bHRzYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBhc3NpZ25zXG4gICAgICogZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5kZWZhdWx0c1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzRGVlcCh7ICdhJzogeyAnYic6IDIgfSB9LCB7ICdhJzogeyAnYic6IDEsICdjJzogMyB9IH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogMiwgJ2MnOiAzIH0gfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0c0RlZXAgPSBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICBhcmdzLnB1c2godW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlKTtcbiAgICAgIHJldHVybiBhcHBseShtZXJnZVdpdGgsIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGtleSBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFJldHVybnMgdGhlIGtleSBvZiB0aGUgbWF0Y2hlZCBlbGVtZW50LFxuICAgICAqICBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnYmFybmV5JzogIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgJ2ZyZWQnOiAgICB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8uZmluZEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leScgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+ICdiYXJuZXknXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93bik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kS2V5YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYSBjb2xsZWN0aW9uIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFJldHVybnMgdGhlIGtleSBvZiB0aGUgbWF0Y2hlZCBlbGVtZW50LFxuICAgICAqICBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnYmFybmV5JzogIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgJ2ZyZWQnOiAgICB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+IHJldHVybnMgJ3BlYmJsZXMnIGFzc3VtaW5nIGBfLmZpbmRLZXlgIHJldHVybnMgJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0S2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhblxuICAgICAqIG9iamVjdCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0XG4gICAgICogaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JJblJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvckluKG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYScsICdiJywgdGhlbiAnYycgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ySW4ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDogYmFzZUZvcihvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckluYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXMgb2ZcbiAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JJblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JJblJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYycsICdiJywgdGhlbiAnYScgYXNzdW1pbmcgYF8uZm9ySW5gIGxvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckluUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDogYmFzZUZvclJpZ2h0KG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFuZFxuICAgICAqIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb25cbiAgICAgKiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9yT3duUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9yT3duKG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYScgdGhlbiAnYicgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvck93bihvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JPd25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvck93blxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JPd25SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2InIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvck93bmAgbG9ncyAnYScgdGhlbiAnYicuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZnJvbSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzXG4gICAgICogb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKiBAc2VlIF8uZnVuY3Rpb25zSW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gXy5jb25zdGFudCgnYScpO1xuICAgICAqICAgdGhpcy5iID0gXy5jb25zdGFudCgnYicpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IF8uY29uc3RhbnQoJ2MnKTtcbiAgICAgKlxuICAgICAqIF8uZnVuY3Rpb25zKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VGdW5jdGlvbnMob2JqZWN0LCBrZXlzKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZnJvbSBvd24gYW5kIGluaGVyaXRlZFxuICAgICAqIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIEBzZWUgXy5mdW5jdGlvbnNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gXy5jb25zdGFudCgnYScpO1xuICAgICAqICAgdGhpcy5iID0gXy5jb25zdGFudCgnYicpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IF8uY29uc3RhbnQoJ2MnKTtcbiAgICAgKlxuICAgICAqIF8uZnVuY3Rpb25zSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VGdW5jdGlvbnMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3QgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogeyAnYic6IDIgfSB9O1xuICAgICAqIHZhciBvdGhlciA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsICdhLmInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG90aGVyLCAnYScpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzKG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGludmVydGVkIGtleXMgYW5kIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKiBJZiBgb2JqZWN0YCBjb250YWlucyBkdXBsaWNhdGUgdmFsdWVzLCBzdWJzZXF1ZW50IHZhbHVlcyBvdmVyd3JpdGVcbiAgICAgKiBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydChvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzEnOiAnYycsICcyJzogJ2InIH1cbiAgICAgKi9cbiAgICB2YXIgaW52ZXJ0ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdFt2YWx1ZV0gPSBrZXk7XG4gICAgfSwgY29uc3RhbnQoaWRlbnRpdHkpKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW52ZXJ0YCBleGNlcHQgdGhhdCB0aGUgaW52ZXJ0ZWQgb2JqZWN0IGlzIGdlbmVyYXRlZFxuICAgICAqIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZyBlYWNoIGVsZW1lbnQgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGVcbiAgICAgKiBjb3JyZXNwb25kaW5nIGludmVydGVkIHZhbHVlIG9mIGVhY2ggaW52ZXJ0ZWQga2V5IGlzIGFuIGFycmF5IG9mIGtleXNcbiAgICAgKiByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgaW52ZXJ0ZWQgdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0Qnkob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuICdncm91cCcgKyB2YWx1ZTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdncm91cDEnOiBbJ2EnLCAnYyddLCAnZ3JvdXAyJzogWydiJ10gfVxuICAgICAqL1xuICAgIHZhciBpbnZlcnRCeSA9IGNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIHZhbHVlKSkge1xuICAgICAgICByZXN1bHRbdmFsdWVdLnB1c2goa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0gPSBba2V5XTtcbiAgICAgIH1cbiAgICB9LCBnZXRJdGVyYXRlZSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogWzEsIDIsIDMsIDRdIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uaW52b2tlKG9iamVjdCwgJ2FbMF0uYi5jLnNsaWNlJywgMSwgMyk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgdmFyIGludm9rZSA9IGJhc2VSZXN0KGJhc2VJbnZva2UpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICAgICAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5rZXlzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIF8ua2V5cygnaGknKTtcbiAgICAgKiAvLyA9PiBbJzAnLCAnMSddXG4gICAgICovXG4gICAgZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0LCB0cnVlKSA6IGJhc2VLZXlzSW4ob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWFwVmFsdWVzYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICAgKiBzYW1lIHZhbHVlcyBhcyBgb2JqZWN0YCBhbmQga2V5cyBnZW5lcmF0ZWQgYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlXG4gICAgICogc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwVmFsdWVzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwS2V5cyh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIHJldHVybiBrZXkgKyB2YWx1ZTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhMSc6IDEsICdiMic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcEtleXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBgb2JqZWN0YCBhbmQgdmFsdWVzIGdlbmVyYXRlZFxuICAgICAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gICAgICogQHNlZSBfLm1hcEtleXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2ZyZWQnOiAgICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2U7IH0pO1xuICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCAnYWdlJyk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBtZXJnZXMgb3duIGFuZFxuICAgICAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gICAgICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2UgcHJvcGVydGllcyB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAgYXJlXG4gICAgICogc2tpcHBlZCBpZiBhIGRlc3RpbmF0aW9uIHZhbHVlIGV4aXN0cy4gQXJyYXkgYW5kIHBsYWluIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAgICAgKiBhc3NpZ25tZW50LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuIFN1YnNlcXVlbnRcbiAgICAgKiBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAnYSc6IFt7ICdiJzogMiB9LCB7ICdkJzogNCB9XVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgb3RoZXIgPSB7XG4gICAgICogICAnYSc6IFt7ICdjJzogMyB9LCB7ICdlJzogNSB9XVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAgICAgKi9cbiAgICB2YXIgbWVyZ2UgPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZXJnZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG1lcmdlZCB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2VcbiAgICAgKiBwcm9wZXJ0aWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgbWVyZ2luZyBpcyBoYW5kbGVkIGJ5IHRoZVxuICAgICAqIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCBzaXggYXJndW1lbnRzOlxuICAgICAqIChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIG9ialZhbHVlLmNvbmNhdChzcmNWYWx1ZSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbMV0sICdiJzogWzJdIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYSc6IFszXSwgJ2InOiBbNF0gfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2VXaXRoKG9iamVjdCwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbMSwgM10sICdiJzogWzIsIDRdIH1cbiAgICAgKi9cbiAgICB2YXIgbWVyZ2VXaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlXG4gICAgICogb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBwYXRocyBvZiBgb2JqZWN0YCB0aGF0IGFyZSBub3Qgb21pdHRlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgc2xvd2VyIHRoYW4gYF8ucGlja2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBvbWl0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0KG9iamVjdCwgWydhJywgJ2MnXSk7XG4gICAgICogLy8gPT4geyAnYic6ICcyJyB9XG4gICAgICovXG4gICAgdmFyIG9taXQgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpc0RlZXAgPSBmYWxzZTtcbiAgICAgIHBhdGhzID0gYXJyYXlNYXAocGF0aHMsIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICAgIGlzRGVlcCB8fCAoaXNEZWVwID0gcGF0aC5sZW5ndGggPiAxKTtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9KTtcbiAgICAgIGNvcHlPYmplY3Qob2JqZWN0LCBnZXRBbGxLZXlzSW4ob2JqZWN0KSwgcmVzdWx0KTtcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgcmVzdWx0ID0gYmFzZUNsb25lKHJlc3VsdCwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfRkxBVF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21PbWl0Q2xvbmUpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBiYXNlVW5zZXQocmVzdWx0LCBwYXRoc1tsZW5ndGhdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja0J5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2ZcbiAgICAgKiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBgb2JqZWN0YCB0aGF0XG4gICAgICogYHByZWRpY2F0ZWAgZG9lc24ndCByZXR1cm4gdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ub21pdEJ5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICogLy8gPT4geyAnYic6ICcyJyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gb21pdEJ5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gcGlja0J5KG9iamVjdCwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5waWNrKG9iamVjdCwgWydhJywgJ2MnXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgdmFyIHBpY2sgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB7fSA6IGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGBvYmplY3RgIHByb3BlcnRpZXMgYHByZWRpY2F0ZWAgcmV0dXJuc1xuICAgICAqIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5waWNrQnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwaWNrQnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICB2YXIgcHJvcHMgPSBhcnJheU1hcChnZXRBbGxLZXlzSW4ob2JqZWN0KSwgZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gW3Byb3BdO1xuICAgICAgfSk7XG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUpO1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwcm9wcywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHByZWRpY2F0ZSh2YWx1ZSwgcGF0aFswXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmdldGAgZXhjZXB0IHRoYXQgaWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzIGFcbiAgICAgKiBmdW5jdGlvbiBpdCdzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgaXRzIHBhcmVudCBvYmplY3QgYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHJlc29sdmUuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjMSc6IDMsICdjMic6IF8uY29uc3RhbnQoNCkgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMxJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMyJyk7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMycsIF8uY29uc3RhbnQoJ2RlZmF1bHQnKSk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzdWx0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgbG9vcCBpcyBlbnRlcmVkIHdoZW4gcGF0aCBpcyBlbXB0eS5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICAgIG9iamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXhdKV07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG4gICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZS5jYWxsKG9iamVjdCkgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiBhIHBvcnRpb24gb2YgYHBhdGhgIGRvZXNuJ3QgZXhpc3QsXG4gICAgICogaXQncyBjcmVhdGVkLiBBcnJheXMgYXJlIGNyZWF0ZWQgZm9yIG1pc3NpbmcgaW5kZXggcHJvcGVydGllcyB3aGlsZSBvYmplY3RzXG4gICAgICogYXJlIGNyZWF0ZWQgZm9yIGFsbCBvdGhlciBtaXNzaW5nIHByb3BlcnRpZXMuIFVzZSBgXy5zZXRXaXRoYCB0byBjdXN0b21pemVcbiAgICAgKiBgcGF0aGAgY3JlYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsICdhWzBdLmIuYycsIDQpO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5zZXQob2JqZWN0LCBbJ3gnLCAnMCcsICd5JywgJ3onXSwgNSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7fTtcbiAgICAgKlxuICAgICAqIF8uc2V0V2l0aChvYmplY3QsICdbMF1bMV0nLCAnYScsIE9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0V2l0aChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YFxuICAgICAqIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcCBvciBzZXQsIGl0c1xuICAgICAqIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy50b1BhaXJzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl1dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgdmFyIHRvUGFpcnMgPSBjcmVhdGVUb1BhaXJzKGtleXMpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZC12YWx1ZSBwYWlyc1xuICAgICAqIGZvciBgb2JqZWN0YCB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXBcbiAgICAgKiBvciBzZXQsIGl0cyBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBlbnRyaWVzSW5cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy50b1BhaXJzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM11dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgdmFyIHRvUGFpcnNJbiA9IGNyZWF0ZVRvUGFpcnMoa2V5c0luKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIGBfLnJlZHVjZWA7IHRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgYG9iamVjdGAgdG8gYSBuZXdcbiAgICAgKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gICAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyB0aHJ1IGBpdGVyYXRlZWAsIHdpdGggZWFjaCBpbnZvY2F0aW9uXG4gICAgICogcG90ZW50aWFsbHkgbXV0YXRpbmcgdGhlIGBhY2N1bXVsYXRvcmAgb2JqZWN0LiBJZiBgYWNjdW11bGF0b3JgIGlzIG5vdFxuICAgICAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJhbnNmb3JtKFsyLCAzLCA0XSwgZnVuY3Rpb24ocmVzdWx0LCBuKSB7XG4gICAgICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA5XVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiB9LCB7fSk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICAgICAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHtcbiAgICAgICAgdmFyIEN0b3IgPSBvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0FyciA/IG5ldyBDdG9yIDogW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXNGdW5jdGlvbihDdG9yKSA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpIDoge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKGlzQXJyTGlrZSA/IGFycmF5RWFjaCA6IGJhc2VGb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1bnNldC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiA3IH0gfV0gfTtcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICAgICAqXG4gICAgICogXy51bnNldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5zZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB0cnVlIDogYmFzZVVuc2V0KG9iamVjdCwgcGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGFjY2VwdHMgYHVwZGF0ZXJgIHRvIHByb2R1Y2UgdGhlXG4gICAgICogdmFsdWUgdG8gc2V0LiBVc2UgYF8udXBkYXRlV2l0aGAgdG8gY3VzdG9taXplIGBwYXRoYCBjcmVhdGlvbi4gVGhlIGB1cGRhdGVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy51cGRhdGUob2JqZWN0LCAnYVswXS5iLmMnLCBmdW5jdGlvbihuKSB7IHJldHVybiBuICogbjsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICd4WzBdLnkueicsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPyBuICsgMSA6IDA7IH0pO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udXBkYXRlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICAgICAqIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy51cGRhdGVXaXRoKG9iamVjdCwgJ1swXVsxXScsIF8uY29uc3RhbnQoJ2EnKSwgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGVXaXRoKG9iamVjdCwgcGF0aCwgdXBkYXRlciwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy52YWx1ZXMoJ2hpJyk7XG4gICAgICogLy8gPT4gWydoJywgJ2knXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHlcbiAgICAgKiB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnZhbHVlc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENsYW1wcyBgbnVtYmVyYCB3aXRoaW4gdGhlIGluY2x1c2l2ZSBgbG93ZXJgIGFuZCBgdXBwZXJgIGJvdW5kcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2xhbXAoLTEwLCAtNSwgNSk7XG4gICAgICogLy8gPT4gLTVcbiAgICAgKlxuICAgICAqIF8uY2xhbXAoMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwcGVyID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSB0b051bWJlcih1cHBlcik7XG4gICAgICAgIHVwcGVyID0gdXBwZXIgPT09IHVwcGVyID8gdXBwZXIgOiAwO1xuICAgICAgfVxuICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSB0b051bWJlcihsb3dlcik7XG4gICAgICAgIGxvd2VyID0gbG93ZXIgPT09IGxvd2VyID8gbG93ZXIgOiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VDbGFtcCh0b051bWJlcihudW1iZXIpLCBsb3dlciwgdXBwZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgbmAgaXMgYmV0d2VlbiBgc3RhcnRgIGFuZCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBJZlxuICAgICAqIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKiBJZiBgc3RhcnRgIGlzIGdyZWF0ZXIgdGhhbiBgZW5kYCB0aGUgcGFyYW1zIGFyZSBzd2FwcGVkIHRvIHN1cHBvcnRcbiAgICAgKiBuZWdhdGl2ZSByYW5nZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ucmFuZ2UsIF8ucmFuZ2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMywgMiwgNCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDgpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg0LCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDIsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMS4yLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNS4yLCA0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKC0zLCAtMiwgLTYpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCA9IHRvRmluaXRlKGVuZCk7XG4gICAgICB9XG4gICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgcmV0dXJuIGJhc2VJblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvZHVjZXMgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gdGhlIGluY2x1c2l2ZSBgbG93ZXJgIGFuZCBgdXBwZXJgIGJvdW5kcy5cbiAgICAgKiBJZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCBhIG51bWJlciBiZXR3ZWVuIGAwYCBhbmQgdGhlIGdpdmVuIG51bWJlclxuICAgICAqIGlzIHJldHVybmVkLiBJZiBgZmxvYXRpbmdgIGlzIGB0cnVlYCwgb3IgZWl0aGVyIGBsb3dlcmAgb3IgYHVwcGVyYCBhcmVcbiAgICAgKiBmbG9hdHMsIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNy4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXI9MF0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdXBwZXI9MV0gVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zsb2F0aW5nXSBTcGVjaWZ5IHJldHVybmluZyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSgwLCA1KTtcbiAgICAgKiAvLyA9PiBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oNSk7XG4gICAgICogLy8gPT4gYWxzbyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oNSwgdHJ1ZSk7XG4gICAgICogLy8gPT4gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSgxLjIsIDUuMik7XG4gICAgICogLy8gPT4gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYmV0d2VlbiAxLjIgYW5kIDUuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJhbmRvbShsb3dlciwgdXBwZXIsIGZsb2F0aW5nKSB7XG4gICAgICBpZiAoZmxvYXRpbmcgJiYgdHlwZW9mIGZsb2F0aW5nICE9ICdib29sZWFuJyAmJiBpc0l0ZXJhdGVlQ2FsbChsb3dlciwgdXBwZXIsIGZsb2F0aW5nKSkge1xuICAgICAgICB1cHBlciA9IGZsb2F0aW5nID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB1cHBlciA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IHVwcGVyO1xuICAgICAgICAgIHVwcGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsb3dlciA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IGxvd2VyO1xuICAgICAgICAgIGxvd2VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgPT09IHVuZGVmaW5lZCAmJiB1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvd2VyID0gMDtcbiAgICAgICAgdXBwZXIgPSAxO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGxvd2VyID0gdG9GaW5pdGUobG93ZXIpO1xuICAgICAgICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHVwcGVyID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVwcGVyID0gdG9GaW5pdGUodXBwZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgPiB1cHBlcikge1xuICAgICAgICB2YXIgdGVtcCA9IGxvd2VyO1xuICAgICAgICBsb3dlciA9IHVwcGVyO1xuICAgICAgICB1cHBlciA9IHRlbXA7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgfHwgbG93ZXIgJSAxIHx8IHVwcGVyICUgMSkge1xuICAgICAgICB2YXIgcmFuZCA9IG5hdGl2ZVJhbmRvbSgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlTWluKGxvd2VyICsgKHJhbmQgKiAodXBwZXIgLSBsb3dlciArIGZyZWVQYXJzZUZsb2F0KCcxZS0nICsgKChyYW5kICsgJycpLmxlbmd0aCAtIDEpKSkpLCB1cHBlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIFtjYW1lbCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYW1lbENhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FtZWwgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKi9cbiAgICB2YXIgY2FtZWxDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICB3b3JkID0gd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/IGNhcGl0YWxpemUod29yZCkgOiB3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZSBhbmQgdGhlIHJlbWFpbmluZ1xuICAgICAqIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY2FwaXRhbGl6ZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYXBpdGFsaXplZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FwaXRhbGl6ZSgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdGcmVkJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gICAgICByZXR1cm4gdXBwZXJGaXJzdCh0b1N0cmluZyhzdHJpbmcpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlYnVycnMgYHN0cmluZ2AgYnkgY29udmVydGluZ1xuICAgICAqIFtMYXRpbi0xIFN1cHBsZW1lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluLTFfU3VwcGxlbWVudF8oVW5pY29kZV9ibG9jaykjQ2hhcmFjdGVyX3RhYmxlKVxuICAgICAqIGFuZCBbTGF0aW4gRXh0ZW5kZWQtQV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fRXh0ZW5kZWQtQSlcbiAgICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMgYW5kIHJlbW92aW5nXG4gICAgICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBkZWJ1cnIuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlYnVycignZMOpasOgIHZ1Jyk7XG4gICAgICogLy8gPT4gJ2RlamEgdnUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVidXJyKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiBzdHJpbmcgJiYgc3RyaW5nLnJlcGxhY2UocmVMYXRpbiwgZGVidXJyTGV0dGVyKS5yZXBsYWNlKHJlQ29tYm9NYXJrLCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj1zdHJpbmcubGVuZ3RoXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nYCBlbmRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2MnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbmRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcblxuICAgICAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBsZW5ndGhcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgbGVuZ3RoKTtcblxuICAgICAgdmFyIGVuZCA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICAgIHJldHVybiBwb3NpdGlvbiA+PSAwICYmIHN0cmluZy5zbGljZShwb3NpdGlvbiwgZW5kKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgXCImXCIsIFwiPFwiLCBcIj5cIiwgJ1wiJywgYW5kIFwiJ1wiIGluIGBzdHJpbmdgIHRvIHRoZWlyXG4gICAgICogY29ycmVzcG9uZGluZyBIVE1MIGVudGl0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQuIFRvIGVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogY2hhcmFjdGVycyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBUaG91Z2ggdGhlIFwiPlwiIGNoYXJhY3RlciBpcyBlc2NhcGVkIGZvciBzeW1tZXRyeSwgY2hhcmFjdGVycyBsaWtlXG4gICAgICogXCI+XCIgYW5kIFwiL1wiIGRvbid0IG5lZWQgZXNjYXBpbmcgaW4gSFRNTCBhbmQgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmdcbiAgICAgKiB1bmxlc3MgdGhleSdyZSBwYXJ0IG9mIGEgdGFnIG9yIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gU2VlXG4gICAgICogW01hdGhpYXMgQnluZW5zJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzKVxuICAgICAqICh1bmRlciBcInNlbWktcmVsYXRlZCBmdW4gZmFjdFwiKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogV2hlbiB3b3JraW5nIHdpdGggSFRNTCB5b3Ugc2hvdWxkIGFsd2F5c1xuICAgICAqIFtxdW90ZSBhdHRyaWJ1dGUgdmFsdWVzXShodHRwOi8vd29ua28uY29tL3Bvc3QvaHRtbC1lc2NhcGluZykgdG8gcmVkdWNlXG4gICAgICogWFNTIHZlY3RvcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc1VuZXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlVW5lc2NhcGVkSHRtbCwgZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgdGhlIGBSZWdFeHBgIHNwZWNpYWwgY2hhcmFjdGVycyBcIl5cIiwgXCIkXCIsIFwiXFxcIiwgXCIuXCIsIFwiKlwiLCBcIitcIixcbiAgICAgKiBcIj9cIiwgXCIoXCIsIFwiKVwiLCBcIltcIiwgXCJdXCIsIFwie1wiLCBcIn1cIiwgYW5kIFwifFwiIGluIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGVSZWdFeHAoJ1tsb2Rhc2hdKGh0dHBzOi8vbG9kYXNoLmNvbS8pJyk7XG4gICAgICogLy8gPT4gJ1xcW2xvZGFzaFxcXVxcKGh0dHBzOi8vbG9kYXNoXFwuY29tL1xcKSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNSZWdFeHBDaGFyLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtrZWJhYiBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTcGVjaWFsX2Nhc2Vfc3R5bGVzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGtlYmFiIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqL1xuICAgIHZhciBrZWJhYkNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnLScgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIF8ubG93ZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdmUkVEJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b0xvd2VyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuXG4gICAgICogUGFkZGluZyBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBjYW4ndCBiZSBldmVubHkgZGl2aWRlZCBieSBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgOCk7XG4gICAgICogLy8gPT4gJyAgYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgsICdfLScpO1xuICAgICAqIC8vID0+ICdfLWFiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzdHJMZW5ndGggPj0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbWlkID0gKGxlbmd0aCAtIHN0ckxlbmd0aCkgLyAyO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVGbG9vcihtaWQpLCBjaGFycykgK1xuICAgICAgICBzdHJpbmcgK1xuICAgICAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUNlaWwobWlkKSwgY2hhcnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIHJpZ2h0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYpO1xuICAgICAqIC8vID0+ICdhYmMgICAnXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZEVuZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpXG4gICAgICAgID8gKHN0cmluZyArIGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnICAgYWJjJ1xuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ18tX2FiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkU3RhcnQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpICsgc3RyaW5nKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXguIElmIGByYWRpeGAgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCBvciBgMGAsIGEgYHJhZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIGB2YWx1ZWAgaXMgYVxuICAgICAqIGhleGFkZWNpbWFsLCBpbiB3aGljaCBjYXNlIGEgYHJhZGl4YCBvZiBgMTZgIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgYWxpZ25zIHdpdGggdGhlXG4gICAgICogW0VTNSBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjIpIG9mIGBwYXJzZUludGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpeD0xMF0gVGhlIHJhZGl4IHRvIGludGVycHJldCBgdmFsdWVgIGJ5LlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFyc2VJbnQoJzA4Jyk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzA4JywgJzEwJ10sIF8ucGFyc2VJbnQpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4LCBndWFyZCkge1xuICAgICAgaWYgKGd1YXJkIHx8IHJhZGl4ID09IG51bGwpIHtcbiAgICAgICAgcmFkaXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChyYWRpeCkge1xuICAgICAgICByYWRpeCA9ICtyYWRpeDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludCh0b1N0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKSwgcmFkaXggfHwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwZWF0cyB0aGUgZ2l2ZW4gc3RyaW5nIGBuYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmcuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCcqJywgMyk7XG4gICAgICogLy8gPT4gJyoqKidcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAyKTtcbiAgICAgKiAvLyA9PiAnYWJjYWJjJ1xuICAgICAqXG4gICAgICogXy5yZXBlYXQoJ2FiYycsIDApO1xuICAgICAqIC8vID0+ICcnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgbWF0Y2hlcyBmb3IgYHBhdHRlcm5gIGluIGBzdHJpbmdgIHdpdGggYHJlcGxhY2VtZW50YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3JlcGxhY2VgXShodHRwczovL21kbi5pby9TdHJpbmcvcmVwbGFjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gcGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSByZXBsYWNlbWVudCBUaGUgbWF0Y2ggcmVwbGFjZW1lbnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGxhY2UoJ0hpIEZyZWQnLCAnRnJlZCcsICdCYXJuZXknKTtcbiAgICAgKiAvLyA9PiAnSGkgQmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UoKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhhcmdzWzBdKTtcblxuICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoIDwgMyA/IHN0cmluZyA6IHN0cmluZy5yZXBsYWNlKGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW3NuYWtlIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc25ha2UgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJy0tRk9PLUJBUi0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICovXG4gICAgdmFyIHNuYWtlQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICdfJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3NwbGl0YF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3NwbGl0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBzcGxpdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHNlcGFyYXRvciBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gc3BsaXQgYnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gVGhlIGxlbmd0aCB0byB0cnVuY2F0ZSByZXN1bHRzIHRvLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc3RyaW5nIHNlZ21lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNwbGl0KCdhLWItYycsICctJywgMik7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwbGl0KHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgaWYgKGxpbWl0ICYmIHR5cGVvZiBsaW1pdCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpKSB7XG4gICAgICAgIHNlcGFyYXRvciA9IGxpbWl0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgbGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX0FSUkFZX0xFTkdUSCA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKCFsaW1pdCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoXG4gICAgICAgICAgICB0eXBlb2Ygc2VwYXJhdG9yID09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAoc2VwYXJhdG9yICE9IG51bGwgJiYgIWlzUmVnRXhwKHNlcGFyYXRvcikpXG4gICAgICAgICAgKSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKCFzZXBhcmF0b3IgJiYgaGFzVW5pY29kZShzdHJpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksIDAsIGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzdGFydCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTdHlsaXN0aWNfb3Jfc3BlY2lhbGlzZWRfdXNhZ2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RhcnQgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciBzdGFydENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB1cHBlckZpcnN0KHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPTBdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPT0gbnVsbFxuICAgICAgICA/IDBcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgc3RyaW5nLmxlbmd0aCk7XG5cbiAgICAgIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHN0cmluZy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyB0YXJnZXQubGVuZ3RoKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGludGVycG9sYXRlIGRhdGEgcHJvcGVydGllc1xuICAgICAqIGluIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXJzLCBIVE1MLWVzY2FwZSBpbnRlcnBvbGF0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluXG4gICAgICogXCJlc2NhcGVcIiBkZWxpbWl0ZXJzLCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLiBEYXRhXG4gICAgICogcHJvcGVydGllcyBtYXkgYmUgYWNjZXNzZWQgYXMgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIHRlbXBsYXRlLiBJZiBhIHNldHRpbmdcbiAgICAgKiBvYmplY3QgaXMgZ2l2ZW4sIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgXy50ZW1wbGF0ZVNldHRpbmdzYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSW4gdGhlIGRldmVsb3BtZW50IGJ1aWxkIGBfLnRlbXBsYXRlYCB1dGlsaXplc1xuICAgICAqIFtzb3VyY2VVUkxzXShodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9zb3VyY2VtYXBzLyN0b2Mtc291cmNldXJsKVxuICAgICAqIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJlY29tcGlsaW5nIHRlbXBsYXRlcyBzZWVcbiAgICAgKiBbbG9kYXNoJ3MgY3VzdG9tIGJ1aWxkcyBkb2N1bWVudGF0aW9uXShodHRwczovL2xvZGFzaC5jb20vY3VzdG9tLWJ1aWxkcykuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJvbWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWVcbiAgICAgKiBbQ2hyb21lJ3MgZXh0ZW5zaW9ucyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvc2FuZGJveGluZ0V2YWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgdGVtcGxhdGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5lc2NhcGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmVzY2FwZV1cbiAgICAgKiAgVGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmV2YWx1YXRlPV8udGVtcGxhdGVTZXR0aW5ncy5ldmFsdWF0ZV1cbiAgICAgKiAgVGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmltcG9ydHM9Xy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNdXG4gICAgICogIEFuIG9iamVjdCB0byBpbXBvcnQgaW50byB0aGUgdGVtcGxhdGUgYXMgZnJlZSB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmludGVycG9sYXRlPV8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZV1cbiAgICAgKiAgVGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNvdXJjZVVSTD0nbG9kYXNoLnRlbXBsYXRlU291cmNlc1tuXSddXG4gICAgICogIFRoZSBzb3VyY2VVUkwgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy52YXJpYWJsZT0nb2JqJ11cbiAgICAgKiAgVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIgdG8gY3JlYXRlIGEgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdmcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIgdG8gZXNjYXBlIGRhdGEgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzxiPjwlLSB2YWx1ZSAlPjwvYj4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICc8c2NyaXB0PicgfSk7XG4gICAgICogLy8gPT4gJzxiPiZsdDtzY3JpcHQmZ3Q7PC9iPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlciB0byBleGVjdXRlIEphdmFTY3JpcHQgYW5kIGdlbmVyYXRlIEhUTUwuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgXy5mb3JFYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgaW50ZXJuYWwgYHByaW50YCBmdW5jdGlvbiBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBwcmludChcImhlbGxvIFwiICsgdXNlcik7ICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnYmFybmV5JyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gYmFybmV5ISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgRVMgdGVtcGxhdGUgbGl0ZXJhbCBkZWxpbWl0ZXIgYXMgYW4gXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiAvLyBEaXNhYmxlIHN1cHBvcnQgYnkgcmVwbGFjaW5nIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvICR7IHVzZXIgfSEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ3BlYmJsZXMnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBwZWJibGVzISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSBiYWNrc2xhc2hlcyB0byB0cmVhdCBkZWxpbWl0ZXJzIGFzIHBsYWluIHRleHQuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCU9IFwiXFxcXDwlLSB2YWx1ZSAlXFxcXD5cIiAlPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJ2lnbm9yZWQnIH0pO1xuICAgICAqIC8vID0+ICc8JS0gdmFsdWUgJT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBpbXBvcnRzYCBvcHRpb24gdG8gaW1wb3J0IGBqUXVlcnlgIGFzIGBqcWAuXG4gICAgICogdmFyIHRleHQgPSAnPCUganEuZWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+JztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKHRleHQsIHsgJ2ltcG9ydHMnOiB7ICdqcSc6IGpRdWVyeSB9IH0pO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXJzJzogWydmcmVkJywgJ2Jhcm5leSddIH0pO1xuICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwvbGk+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8gc3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gdXNlciAlPiEnLCB7ICdzb3VyY2VVUkwnOiAnL2Jhc2ljL2dyZWV0aW5nLmpzdCcgfSk7XG4gICAgICogY29tcGlsZWQoZGF0YSk7XG4gICAgICogLy8gPT4gRmluZCB0aGUgc291cmNlIG9mIFwiZ3JlZXRpbmcuanN0XCIgdW5kZXIgdGhlIFNvdXJjZXMgdGFiIG9yIFJlc291cmNlcyBwYW5lbCBvZiB0aGUgd2ViIGluc3BlY3Rvci5cbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGkgPCU9IGRhdGEudXNlciAlPiEnLCB7ICd2YXJpYWJsZSc6ICdkYXRhJyB9KTtcbiAgICAgKiBjb21waWxlZC5zb3VyY2U7XG4gICAgICogLy8gPT4gZnVuY3Rpb24oZGF0YSkge1xuICAgICAqIC8vICAgdmFyIF9fdCwgX19wID0gJyc7XG4gICAgICogLy8gICBfX3AgKz0gJ2hpICcgKyAoKF9fdCA9ICggZGF0YS51c2VyICkpID09IG51bGwgPyAnJyA6IF9fdCkgKyAnISc7XG4gICAgICogLy8gICByZXR1cm4gX19wO1xuICAgICAqIC8vIH1cbiAgICAgKlxuICAgICAqIC8vIFVzZSBjdXN0b20gdGVtcGxhdGUgZGVsaW1pdGVycy5cbiAgICAgKiBfLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGUgPSAve3soW1xcc1xcU10rPyl9fS9nO1xuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIHt7IHVzZXIgfX0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdtdXN0YWNoZScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIG11c3RhY2hlISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZWAgcHJvcGVydHkgdG8gaW5saW5lIGNvbXBpbGVkIHRlbXBsYXRlcyBmb3IgbWVhbmluZ2Z1bFxuICAgICAqIC8vIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzLlxuICAgICAqIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdqc3QuanMnKSwgJ1xcXG4gICAgICogICB2YXIgSlNUID0ge1xcXG4gICAgICogICAgIFwibWFpblwiOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsgJ1xcXG4gICAgICogICB9O1xcXG4gICAgICogJyk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkge1xuICAgICAgLy8gQmFzZWQgb24gSm9obiBSZXNpZydzIGB0bXBsYCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gKGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvKVxuICAgICAgLy8gYW5kIExhdXJhIERva3Rvcm92YSdzIGRvVC5qcyAoaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVCkuXG4gICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgb3B0aW9ucyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucywgc2V0dGluZ3MsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pO1xuXG4gICAgICB2YXIgaW1wb3J0cyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKSxcbiAgICAgICAgICBpbXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksXG4gICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IGJhc2VWYWx1ZXMoaW1wb3J0cywgaW1wb3J0c0tleXMpO1xuXG4gICAgICB2YXIgaXNFc2NhcGluZyxcbiAgICAgICAgICBpc0V2YWx1YXRpbmcsXG4gICAgICAgICAgaW5kZXggPSAwLFxuICAgICAgICAgIGludGVycG9sYXRlID0gb3B0aW9ucy5pbnRlcnBvbGF0ZSB8fCByZU5vTWF0Y2gsXG4gICAgICAgICAgc291cmNlID0gXCJfX3AgKz0gJ1wiO1xuXG4gICAgICAvLyBDb21waWxlIHRoZSByZWdleHAgdG8gbWF0Y2ggZWFjaCBkZWxpbWl0ZXIuXG4gICAgICB2YXIgcmVEZWxpbWl0ZXJzID0gUmVnRXhwKFxuICAgICAgICAob3B0aW9ucy5lc2NhcGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICBpbnRlcnBvbGF0ZS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAoaW50ZXJwb2xhdGUgPT09IHJlSW50ZXJwb2xhdGUgPyByZUVzVGVtcGxhdGUgOiByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArXG4gICAgICAgIChvcHRpb25zLmV2YWx1YXRlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wkJ1xuICAgICAgLCAnZycpO1xuXG4gICAgICAvLyBVc2UgYSBzb3VyY2VVUkwgZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgICAvLyBUaGUgc291cmNlVVJMIGdldHMgaW5qZWN0ZWQgaW50byB0aGUgc291cmNlIHRoYXQncyBldmFsLWVkLCBzbyBiZSBjYXJlZnVsXG4gICAgICAvLyB0byBub3JtYWxpemUgYWxsIGtpbmRzIG9mIHdoaXRlc3BhY2UsIHNvIGUuZy4gbmV3bGluZXMgKGFuZCB1bmljb2RlIHZlcnNpb25zIG9mIGl0KSBjYW4ndCBzbmVhayBpblxuICAgICAgLy8gYW5kIGVzY2FwZSB0aGUgY29tbWVudCwgdGh1cyBpbmplY3RpbmcgY29kZSB0aGF0IGdldHMgZXZhbGVkLlxuICAgICAgdmFyIHNvdXJjZVVSTCA9ICcvLyMgc291cmNlVVJMPScgK1xuICAgICAgICAoaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAnc291cmNlVVJMJylcbiAgICAgICAgICA/IChvcHRpb25zLnNvdXJjZVVSTCArICcnKS5yZXBsYWNlKC9cXHMvZywgJyAnKVxuICAgICAgICAgIDogKCdsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWycgKyAoKyt0ZW1wbGF0ZUNvdW50ZXIpICsgJ10nKVxuICAgICAgICApICsgJ1xcbic7XG5cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlRGVsaW1pdGVycywgZnVuY3Rpb24obWF0Y2gsIGVzY2FwZVZhbHVlLCBpbnRlcnBvbGF0ZVZhbHVlLCBlc1RlbXBsYXRlVmFsdWUsIGV2YWx1YXRlVmFsdWUsIG9mZnNldCkge1xuICAgICAgICBpbnRlcnBvbGF0ZVZhbHVlIHx8IChpbnRlcnBvbGF0ZVZhbHVlID0gZXNUZW1wbGF0ZVZhbHVlKTtcblxuICAgICAgICAvLyBFc2NhcGUgY2hhcmFjdGVycyB0aGF0IGNhbid0IGJlIGluY2x1ZGVkIGluIHN0cmluZyBsaXRlcmFscy5cbiAgICAgICAgc291cmNlICs9IHN0cmluZy5zbGljZShpbmRleCwgb2Zmc2V0KS5yZXBsYWNlKHJlVW5lc2NhcGVkU3RyaW5nLCBlc2NhcGVTdHJpbmdDaGFyKTtcblxuICAgICAgICAvLyBSZXBsYWNlIGRlbGltaXRlcnMgd2l0aCBzbmlwcGV0cy5cbiAgICAgICAgaWYgKGVzY2FwZVZhbHVlKSB7XG4gICAgICAgICAgaXNFc2NhcGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuX19lKFwiICsgZXNjYXBlVmFsdWUgKyBcIikgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXZhbHVhdGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJztcXG5cIiArIGV2YWx1YXRlVmFsdWUgKyBcIjtcXG5fX3AgKz0gJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcnBvbGF0ZVZhbHVlKSB7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuKChfX3QgPSAoXCIgKyBpbnRlcnBvbGF0ZVZhbHVlICsgXCIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgICAgLy8gVGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBwcm9kdWN0cyBuZWVkcyBgbWF0Y2hgIHJldHVybmVkIGluXG4gICAgICAgIC8vIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3QgYG9mZnNldGAgdmFsdWUuXG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH0pO1xuXG4gICAgICBzb3VyY2UgKz0gXCInO1xcblwiO1xuXG4gICAgICAvLyBJZiBgdmFyaWFibGVgIGlzIG5vdCBzcGVjaWZpZWQgd3JhcCBhIHdpdGgtc3RhdGVtZW50IGFyb3VuZCB0aGUgZ2VuZXJhdGVkXG4gICAgICAvLyBjb2RlIHRvIGFkZCB0aGUgZGF0YSBvYmplY3QgdG8gdGhlIHRvcCBvZiB0aGUgc2NvcGUgY2hhaW4uXG4gICAgICB2YXIgdmFyaWFibGUgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICd2YXJpYWJsZScpICYmIG9wdGlvbnMudmFyaWFibGU7XG4gICAgICBpZiAoIXZhcmlhYmxlKSB7XG4gICAgICAgIHNvdXJjZSA9ICd3aXRoIChvYmopIHtcXG4nICsgc291cmNlICsgJ1xcbn1cXG4nO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW51cCBjb2RlIGJ5IHN0cmlwcGluZyBlbXB0eSBzdHJpbmdzLlxuICAgICAgc291cmNlID0gKGlzRXZhbHVhdGluZyA/IHNvdXJjZS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdMZWFkaW5nLCAnJykgOiBzb3VyY2UpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsICckMScpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdUcmFpbGluZywgJyQxOycpO1xuXG4gICAgICAvLyBGcmFtZSBjb2RlIGFzIHRoZSBmdW5jdGlvbiBib2R5LlxuICAgICAgc291cmNlID0gJ2Z1bmN0aW9uKCcgKyAodmFyaWFibGUgfHwgJ29iaicpICsgJykge1xcbicgK1xuICAgICAgICAodmFyaWFibGVcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiAnb2JqIHx8IChvYmogPSB7fSk7XFxuJ1xuICAgICAgICApICtcbiAgICAgICAgXCJ2YXIgX190LCBfX3AgPSAnJ1wiICtcbiAgICAgICAgKGlzRXNjYXBpbmdcbiAgICAgICAgICAgPyAnLCBfX2UgPSBfLmVzY2FwZSdcbiAgICAgICAgICAgOiAnJ1xuICAgICAgICApICtcbiAgICAgICAgKGlzRXZhbHVhdGluZ1xuICAgICAgICAgID8gJywgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XFxuJyArXG4gICAgICAgICAgICBcImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxcblwiXG4gICAgICAgICAgOiAnO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIHNvdXJjZSArXG4gICAgICAgICdyZXR1cm4gX19wXFxufSc7XG5cbiAgICAgIHZhciByZXN1bHQgPSBhdHRlbXB0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb24oaW1wb3J0c0tleXMsIHNvdXJjZVVSTCArICdyZXR1cm4gJyArIHNvdXJjZSlcbiAgICAgICAgICAuYXBwbHkodW5kZWZpbmVkLCBpbXBvcnRzVmFsdWVzKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBmdW5jdGlvbidzIHNvdXJjZSBieSBpdHMgYHRvU3RyaW5nYCBtZXRob2Qgb3JcbiAgICAgIC8vIHRoZSBgc291cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvciBpbmxpbmluZyBjb21waWxlZCB0ZW1wbGF0ZXMuXG4gICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgaWYgKGlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byBsb3dlciBjYXNlIGp1c3QgbGlrZVxuICAgICAqIFtTdHJpbmcjdG9Mb3dlckNhc2VdKGh0dHBzOi8vbWRuLmlvL3RvTG93ZXJDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0xvd2VyKCctLUZvby1CYXItLScpO1xuICAgICAqIC8vID0+ICctLWZvby1iYXItLSdcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb2JhcidcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnX19mb29fYmFyX18nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byB1cHBlciBjYXNlIGp1c3QgbGlrZVxuICAgICAqIFtTdHJpbmcjdG9VcHBlckNhc2VdKGh0dHBzOi8vbWRuLmlvL3RvVXBwZXJDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVwcGVyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1VwcGVyKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICctLUZPTy1CQVItLSdcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPT0JBUidcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnX19GT09fQkFSX18nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9VcHBlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbSgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICpcbiAgICAgKiBfLm1hcChbJyAgZm9vICAnLCAnICBiYXIgICddLCBfLnRyaW0pO1xuICAgICAqIC8vID0+IFsnZm9vJywgJ2JhciddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbShzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgY2hyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoY2hhcnMpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykgKyAxO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0LCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICcgIGFiYydcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJy1fLWFiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltRW5kKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbUVuZCwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBlbmQgPSBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbVN0YXJ0KCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYyAgJ1xuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMtXy0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1bmNhdGVzIGBzdHJpbmdgIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZSB0cnVuY2F0ZWQgc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbWlzc2lvblxuICAgICAqIHN0cmluZyB3aGljaCBkZWZhdWx0cyB0byBcIi4uLlwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRydW5jYXRlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sZW5ndGg9MzBdIFRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9taXNzaW9uPScuLi4nXSBUaGUgc3RyaW5nIHRvIGluZGljYXRlIHRleHQgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtvcHRpb25zLnNlcGFyYXRvcl0gVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHRydW5jYXRlIHRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nKTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAnICdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLC4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogLyw/ICsvXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZS4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnb21pc3Npb24nOiAnIFsuLi5dJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWcgWy4uLl0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gREVGQVVMVF9UUlVOQ19MRU5HVEgsXG4gICAgICAgICAgb21pc3Npb24gPSBERUZBVUxUX1RSVU5DX09NSVNTSU9OO1xuXG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9ICdzZXBhcmF0b3InIGluIG9wdGlvbnMgPyBvcHRpb25zLnNlcGFyYXRvciA6IHNlcGFyYXRvcjtcbiAgICAgICAgbGVuZ3RoID0gJ2xlbmd0aCcgaW4gb3B0aW9ucyA/IHRvSW50ZWdlcihvcHRpb25zLmxlbmd0aCkgOiBsZW5ndGg7XG4gICAgICAgIG9taXNzaW9uID0gJ29taXNzaW9uJyBpbiBvcHRpb25zID8gYmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pIDogb21pc3Npb247XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIGlmIChoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyk7XG4gICAgICAgIHN0ckxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGxlbmd0aCA+PSBzdHJMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBlbmQgPSBsZW5ndGggLSBzdHJpbmdTaXplKG9taXNzaW9uKTtcbiAgICAgIGlmIChlbmQgPCAxKSB7XG4gICAgICAgIHJldHVybiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBzdHJTeW1ib2xzXG4gICAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJylcbiAgICAgICAgOiBzdHJpbmcuc2xpY2UoMCwgZW5kKTtcblxuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJTeW1ib2xzKSB7XG4gICAgICAgIGVuZCArPSAocmVzdWx0Lmxlbmd0aCAtIGVuZCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICBpZiAoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgICB2YXIgbWF0Y2gsXG4gICAgICAgICAgICAgIHN1YnN0cmluZyA9IHJlc3VsdDtcblxuICAgICAgICAgIGlmICghc2VwYXJhdG9yLmdsb2JhbCkge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIHRvU3RyaW5nKHJlRmxhZ3MuZXhlYyhzZXBhcmF0b3IpKSArICdnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcGFyYXRvci5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBzZXBhcmF0b3IuZXhlYyhzdWJzdHJpbmcpKSkge1xuICAgICAgICAgICAgdmFyIG5ld0VuZCA9IG1hdGNoLmluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbmV3RW5kID09PSB1bmRlZmluZWQgPyBlbmQgOiBuZXdFbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLCBlbmQpICE9IGVuZCkge1xuICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8uZXNjYXBlYDsgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXNcbiAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvXG4gICAgICogdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIEhUTUwgZW50aXRpZXMgYXJlIHVuZXNjYXBlZC4gVG8gdW5lc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIEhUTUwgZW50aXRpZXMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNi4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnLS1mb28tYmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRlJFRCdcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcGF0dGVybiA9IGd1YXJkID8gdW5kZWZpbmVkIDogcGF0dGVybjtcblxuICAgICAgaWYgKHBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSA/IHVuaWNvZGVXb3JkcyhzdHJpbmcpIDogYXNjaWlXb3JkcyhzdHJpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byBpbnZva2UgYGZ1bmNgLCByZXR1cm5pbmcgZWl0aGVyIHRoZSByZXN1bHQgb3IgdGhlIGNhdWdodCBlcnJvclxuICAgICAqIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGF0dGVtcHQuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGBmdW5jYCByZXN1bHQgb3IgZXJyb3Igb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCB0aHJvd2luZyBlcnJvcnMgZm9yIGludmFsaWQgc2VsZWN0b3JzLlxuICAgICAqIHZhciBlbGVtZW50cyA9IF8uYXR0ZW1wdChmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAqICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAqIH0sICc+Xz4nKTtcbiAgICAgKlxuICAgICAqIGlmIChfLmlzRXJyb3IoZWxlbWVudHMpKSB7XG4gICAgICogICBlbGVtZW50cyA9IFtdO1xuICAgICAqIH1cbiAgICAgKi9cbiAgICB2YXIgYXR0ZW1wdCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBtZXRob2RzIG9mIGFuIG9iamVjdCB0byB0aGUgb2JqZWN0IGl0c2VsZiwgb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nXG4gICAgICogbWV0aG9kLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBtZXRob2ROYW1lcyBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0byBiaW5kLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLFxuICAgICAqICAgJ2NsaWNrJzogZnVuY3Rpb24oKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5iaW5kQWxsKHZpZXcsIFsnY2xpY2snXSk7XG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHZpZXcuY2xpY2spO1xuICAgICAqIC8vID0+IExvZ3MgJ2NsaWNrZWQgZG9jcycgd2hlbiBjbGlja2VkLlxuICAgICAqL1xuICAgIHZhciBiaW5kQWxsID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBtZXRob2ROYW1lcykge1xuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAga2V5ID0gdG9LZXkoa2V5KTtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBiaW5kKG9iamVjdFtrZXldLCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGl0ZXJhdGVzIG92ZXIgYHBhaXJzYCBhbmQgaW52b2tlcyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAqIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBwcmVkaWNhdGUgdG8gcmV0dXJuIHRydXRoeS4gVGhlIHByZWRpY2F0ZS1mdW5jdGlvblxuICAgICAqIHBhaXJzIGFyZSBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIHByZWRpY2F0ZS1mdW5jdGlvbiBwYWlycy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5jb25kKFtcbiAgICAgKiAgIFtfLm1hdGNoZXMoeyAnYSc6IDEgfSksICAgICAgICAgICBfLmNvbnN0YW50KCdtYXRjaGVzIEEnKV0sXG4gICAgICogICBbXy5jb25mb3Jtcyh7ICdiJzogXy5pc051bWJlciB9KSwgXy5jb25zdGFudCgnbWF0Y2hlcyBCJyldLFxuICAgICAqICAgW18uc3R1YlRydWUsICAgICAgICAgICAgICAgICAgICAgIF8uY29uc3RhbnQoJ25vIG1hdGNoJyldXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gJ21hdGNoZXMgQSdcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDAsICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBCJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogJzEnLCAnYic6ICcyJyB9KTtcbiAgICAgKiAvLyA9PiAnbm8gbWF0Y2gnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZChwYWlycykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHRvSXRlcmF0ZWUgPSBnZXRJdGVyYXRlZSgpO1xuXG4gICAgICBwYWlycyA9ICFsZW5ndGggPyBbXSA6IGFycmF5TWFwKHBhaXJzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFpclsxXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdG9JdGVyYXRlZShwYWlyWzBdKSwgcGFpclsxXV07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICAgICAgaWYgKGFwcGx5KHBhaXJbMF0sIHRoaXMsIGFyZ3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkocGFpclsxXSwgdGhpcywgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBwcmVkaWNhdGUgcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoXG4gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGEgZ2l2ZW4gb2JqZWN0LCByZXR1cm5pbmcgYHRydWVgIGlmXG4gICAgICogYWxsIHByZWRpY2F0ZXMgcmV0dXJuIHRydXRoeSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNUb2Agd2l0aFxuICAgICAqIGBzb3VyY2VgIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDIsICdiJzogMSB9LFxuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8uY29uZm9ybXMoeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VDb25mb3JtcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGB2YWx1ZWAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZCBpblxuICAgICAqIGl0cyBwbGFjZS4gVGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGBudWxsYCxcbiAgICAgKiBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8oMSwgMTApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdFRvKHVuZGVmaW5lZCwgMTApO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVmYXVsdFRvKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUpID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBnaXZlbiBmdW5jdGlvbnNcbiAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBzZWUgXy5mbG93UmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93KFtfLmFkZCwgc3F1YXJlXSk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvdyA9IGNyZWF0ZUZsb3coKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxvd2AgZXhjZXB0IHRoYXQgaXQgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXRcbiAgICAgKiBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93UmlnaHQoW3NxdWFyZSwgXy5hZGRdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93UmlnaHQgPSBjcmVhdGVGbG93KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIHRoZVxuICAgICAqIHByb3BlcnR5IHZhbHVlIGZvciBhIGdpdmVuIGVsZW1lbnQuIElmIGBmdW5jYCBpcyBhbiBhcnJheSBvciBvYmplY3QsIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudFxuICAgICAqIHNvdXJjZSBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IFtmdW5jPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZSh7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0pKTtcbiAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH1dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoWyd1c2VyJywgJ2ZyZWQnXSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCBfLml0ZXJhdGVlKCd1c2VyJykpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gQ3JlYXRlIGN1c3RvbSBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqIF8uaXRlcmF0ZWUgPSBfLndyYXAoXy5pdGVyYXRlZSwgZnVuY3Rpb24oaXRlcmF0ZWUsIGZ1bmMpIHtcbiAgICAgKiAgIHJldHVybiAhXy5pc1JlZ0V4cChmdW5jKSA/IGl0ZXJhdGVlKGZ1bmMpIDogZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICogICAgIHJldHVybiBmdW5jLnRlc3Qoc3RyaW5nKTtcbiAgICAgKiAgIH07XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbJ2FiYycsICdkZWYnXSwgL2VmLyk7XG4gICAgICogLy8gPT4gWydkZWYnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGl0ZXJhdGVlKGZ1bmMpIHtcbiAgICAgIHJldHVybiBiYXNlSXRlcmF0ZWUodHlwZW9mIGZ1bmMgPT0gJ2Z1bmN0aW9uJyA/IGZ1bmMgOiBiYXNlQ2xvbmUoZnVuYywgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGEgZ2l2ZW5cbiAgICAgKiBvYmplY3QgYW5kIGBzb3VyY2VgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIGVxdWl2YWxlbnRcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmlzTWF0Y2hgIHdpdGggYHNvdXJjZWBcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5tYXRjaGVzKHsgJ2EnOiA0LCAnYyc6IDYgfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKlxuICAgICAqIC8vIENoZWNraW5nIGZvciBzZXZlcmFsIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ub3ZlclNvbWUoW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgXy5tYXRjaGVzKHsgJ2EnOiA0IH0pXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdGhlXG4gICAgICogdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0IHRvIGBzcmNWYWx1ZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlXG4gICAgICogb2JqZWN0IHZhbHVlIGlzIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdFxuICAgICAqIGBzcmNWYWx1ZWAgdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWVcbiAgICAgKiBgXy5pc0VxdWFsYCBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKG9iamVjdHMsIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCkpO1xuICAgICAqIC8vID0+IHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICpcbiAgICAgKiAvLyBDaGVja2luZyBmb3Igc2V2ZXJhbCBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm92ZXJTb21lKFtfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDEpLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBiYXNlQ2xvbmUoc3JjVmFsdWUsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICogQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgyKSB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMSkgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKCdhLmInKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZChbJ2EnLCAnYiddKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWV0aG9kYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIHRoZSBtZXRob2QgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IF8udGltZXMoMywgXy5jb25zdGFudCksXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kT2YgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbGwgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIGZ1bmN0aW9uIHByb3BlcnRpZXMgb2YgYSBzb3VyY2VcbiAgICAgKiBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiwgdGhlbiBtZXRob2RzXG4gICAgICogYXJlIGFkZGVkIHRvIGl0cyBwcm90b3R5cGUgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVc2UgYF8ucnVuSW5Db250ZXh0YCB0byBjcmVhdGUgYSBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB0b1xuICAgICAqIGF2b2lkIGNvbmZsaWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IFtvYmplY3Q9bG9kYXNoXSBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBmdW5jdGlvbnMgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIG1peGlucyBhcmUgY2hhaW5hYmxlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHZvd2VscyhzdHJpbmcpIHtcbiAgICAgKiAgIHJldHVybiBfLmZpbHRlcihzdHJpbmcsIGZ1bmN0aW9uKHYpIHtcbiAgICAgKiAgICAgcmV0dXJuIC9bYWVpb3VdL2kudGVzdCh2KTtcbiAgICAgKiAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0pO1xuICAgICAqIF8udm93ZWxzKCdmcmVkJyk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9LCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1peGluKG9iamVjdCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSksXG4gICAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwgcHJvcHMpO1xuXG4gICAgICBpZiAob3B0aW9ucyA9PSBudWxsICYmXG4gICAgICAgICAgIShpc09iamVjdChzb3VyY2UpICYmIChtZXRob2ROYW1lcy5sZW5ndGggfHwgIXByb3BzLmxlbmd0aCkpKSB7XG4gICAgICAgIG9wdGlvbnMgPSBzb3VyY2U7XG4gICAgICAgIHNvdXJjZSA9IG9iamVjdDtcbiAgICAgICAgb2JqZWN0ID0gdGhpcztcbiAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGFpbiA9ICEoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NoYWluJyBpbiBvcHRpb25zKSB8fCAhIW9wdGlvbnMuY2hhaW4sXG4gICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihvYmplY3QpO1xuXG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBzb3VyY2VbbWV0aG9kTmFtZV07XG4gICAgICAgIG9iamVjdFttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIGlmIChpc0Z1bmMpIHtcbiAgICAgICAgICBvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXztcbiAgICAgICAgICAgIGlmIChjaGFpbiB8fCBjaGFpbkFsbCkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0KHRoaXMuX193cmFwcGVkX18pLFxuICAgICAgICAgICAgICAgICAgYWN0aW9ucyA9IHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcblxuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goeyAnZnVuYyc6IGZ1bmMsICdhcmdzJzogYXJndW1lbnRzLCAndGhpc0FyZyc6IG9iamVjdCB9KTtcbiAgICAgICAgICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IGNoYWluQWxsO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LCBhcnJheVB1c2goW3RoaXMudmFsdWUoKV0sIGFyZ3VtZW50cykpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVydHMgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG9cbiAgICAgKiB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsb2Rhc2ggPSBfLm5vQ29uZmxpY3QoKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkge1xuICAgICAgaWYgKHJvb3QuXyA9PT0gdGhpcykge1xuICAgICAgICByb290Ll8gPSBvbGREYXNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAgICAgKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9vcCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgYXJndW1lbnQgYXQgaW5kZXggYG5gLiBJZiBgbmAgaXMgbmVnYXRpdmUsXG4gICAgICogdGhlIG50aCBhcmd1bWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXNzLXRocnUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoMSk7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygtMik7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aEFyZyhuKSB7XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VOdGgoYXJncywgbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBpdGVyYXRlZXNgIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlc1xuICAgICAqIGFuZCByZXR1cm5zIHRoZWlyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyKFtNYXRoLm1heCwgTWF0aC5taW5dKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoMSwgMiwgMywgNCk7XG4gICAgICogLy8gPT4gWzQsIDFdXG4gICAgICovXG4gICAgdmFyIG92ZXIgPSBjcmVhdGVPdmVyKGFycmF5TWFwKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFsbCoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJFdmVyeShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlckV2ZXJ5ID0gY3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFueSoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJTb21lKFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiB2YXIgbWF0Y2hlc0Z1bmMgPSBfLm92ZXJTb21lKFt7ICdhJzogMSB9LCB7ICdhJzogMiB9XSlcbiAgICAgKiB2YXIgbWF0Y2hlc1Byb3BlcnR5RnVuYyA9IF8ub3ZlclNvbWUoW1snYScsIDFdLCBbJ2EnLCAyXV0pXG4gICAgICovXG4gICAgdmFyIG92ZXJTb21lID0gY3JlYXRlT3ZlcihhcnJheVNvbWUpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IDEgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xuICAgICAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnByb3BlcnR5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAqIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzAsIDEsIDJdLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gICAgICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBBIHN0ZXAgb2YgYC0xYCBpcyB1c2VkIGlmIGEgbmVnYXRpdmVcbiAgICAgKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAgICAgKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoNCk7XG4gICAgICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKC00KTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA0LCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2UgPSBjcmVhdGVSYW5nZSgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yYW5nZWAgZXhjZXB0IHRoYXQgaXQgcG9wdWxhdGVzIHZhbHVlcyBpblxuICAgICAqIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDQpO1xuICAgICAqIC8vID0+IFszLCAyLCAxLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KC00KTtcbiAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgxLCA1KTtcbiAgICAgKiAvLyA9PiBbNCwgMywgMiwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzE1LCAxMCwgNSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgdmFyIHJhbmdlUmlnaHQgPSBjcmVhdGVSYW5nZSh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5cyA9IF8udGltZXMoMiwgXy5zdHViQXJyYXkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAgICAgKiAvLyA9PiBbW10sIFtdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICAgICAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uc3R1Yk9iamVjdCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgKiAvLyA9PiBbe30sIHt9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlN0cmluZyk7XG4gICAgICogLy8gPT4gWycnLCAnJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlRydWUpO1xuICAgICAqIC8vID0+IFt0cnVlLCB0cnVlXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJUcnVlKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgaXRlcmF0ZWUgYG5gIHRpbWVzLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBlYWNoIGludm9jYXRpb24uIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAoaW5kZXgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygzLCBTdHJpbmcpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJywgJzInXVxuICAgICAqXG4gICAgICogIF8udGltZXMoNCwgXy5jb25zdGFudCgwKSk7XG4gICAgICogLy8gPT4gWzAsIDAsIDAsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICBpZiAobiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gTUFYX0FSUkFZX0xFTkdUSCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUpO1xuICAgICAgbiAtPSBNQVhfQVJSQVlfTEVOR1RIO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZVRpbWVzKGxlbmd0aCwgaXRlcmF0ZWUpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICAgIGl0ZXJhdGVlKGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1BhdGgoJ2EuYi5jJyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgdG9LZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3ltYm9sKHZhbHVlKSA/IFt2YWx1ZV0gOiBjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgZ2l2ZW4sIHRoZSBJRCBpcyBhcHBlbmRlZCB0byBpdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9JyddIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICAgICAqIC8vID0+ICdjb250YWN0XzEwNCdcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoKTtcbiAgICAgKiAvLyA9PiAnMTA1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7XG4gICAgICByZXR1cm4gdG9TdHJpbmcocHJlZml4KSArIGlkO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdWdlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRvdGFsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmFkZCg2LCA0KTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqL1xuICAgIHZhciBhZGQgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGF1Z2VuZCwgYWRkZW5kKSB7XG4gICAgICByZXR1cm4gYXVnZW5kICsgYWRkZW5kO1xuICAgIH0sIDApO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB1cCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZCB1cC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgdXAgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNC4wMDYpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg2LjAwNCwgMik7XG4gICAgICogLy8gPT4gNi4wMVxuICAgICAqXG4gICAgICogXy5jZWlsKDYwNDAsIC0yKTtcbiAgICAgKiAvLyA9PiA2MTAwXG4gICAgICovXG4gICAgdmFyIGNlaWwgPSBjcmVhdGVSb3VuZCgnY2VpbCcpO1xuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aWRlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc29yIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcXVvdGllbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGl2aWRlKDYsIDQpO1xuICAgICAqIC8vID0+IDEuNVxuICAgICAqL1xuICAgIHZhciBkaXZpZGUgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLCBkaXZpc29yKSB7XG4gICAgICByZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCBkb3duIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIGRvd24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCBkb3duIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgZG93biBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoMC4wNDYsIDIpO1xuICAgICAqIC8vID0+IDAuMDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQwMDBcbiAgICAgKi9cbiAgICB2YXIgZmxvb3IgPSBjcmVhdGVSb3VuZCgnZmxvb3InKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWF4KFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXgoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tYXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5tYXhCeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWF4Qnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4QnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWVhbiBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tZWFuKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lYW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgaWRlbnRpdHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVhbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIGF2ZXJhZ2VkLlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8ubWluKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VMdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5taW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpZXIgVGhlIGZpcnN0IG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWNhbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwcm9kdWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm11bHRpcGx5KDYsIDQpO1xuICAgICAqIC8vID0+IDI0XG4gICAgICovXG4gICAgdmFyIG11bHRpcGx5ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtdWx0aXBsaWVyLCBtdWx0aXBsaWNhbmQpIHtcbiAgICAgIHJldHVybiBtdWx0aXBsaWVyICogbXVsdGlwbGljYW5kO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2LCAyKTtcbiAgICAgKiAvLyA9PiA0LjAxXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQwNjAsIC0yKTtcbiAgICAgKiAvLyA9PiA0MTAwXG4gICAgICovXG4gICAgdmFyIHJvdW5kID0gY3JlYXRlUm91bmQoJ3JvdW5kJyk7XG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnVlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdWJ0cmFoZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdWJ0cmFjdCg2LCA0KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgdmFyIHN1YnRyYWN0ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtaW51ZW5kLCBzdWJ0cmFoZW5kKSB7XG4gICAgICByZXR1cm4gbWludWVuZCAtIHN1YnRyYWhlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdW0oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGlkZW50aXR5KVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zdW1gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBzdW1tZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnN1bUJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyO1xuICAgIGxvZGFzaC5hcnkgPSBhcnk7XG4gICAgbG9kYXNoLmFzc2lnbiA9IGFzc2lnbjtcbiAgICBsb2Rhc2guYXNzaWduSW4gPSBhc3NpZ25JbjtcbiAgICBsb2Rhc2guYXNzaWduSW5XaXRoID0gYXNzaWduSW5XaXRoO1xuICAgIGxvZGFzaC5hc3NpZ25XaXRoID0gYXNzaWduV2l0aDtcbiAgICBsb2Rhc2guYXQgPSBhdDtcbiAgICBsb2Rhc2guYmVmb3JlID0gYmVmb3JlO1xuICAgIGxvZGFzaC5iaW5kID0gYmluZDtcbiAgICBsb2Rhc2guYmluZEFsbCA9IGJpbmRBbGw7XG4gICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5O1xuICAgIGxvZGFzaC5jYXN0QXJyYXkgPSBjYXN0QXJyYXk7XG4gICAgbG9kYXNoLmNoYWluID0gY2hhaW47XG4gICAgbG9kYXNoLmNodW5rID0gY2h1bms7XG4gICAgbG9kYXNoLmNvbXBhY3QgPSBjb21wYWN0O1xuICAgIGxvZGFzaC5jb25jYXQgPSBjb25jYXQ7XG4gICAgbG9kYXNoLmNvbmQgPSBjb25kO1xuICAgIGxvZGFzaC5jb25mb3JtcyA9IGNvbmZvcm1zO1xuICAgIGxvZGFzaC5jb25zdGFudCA9IGNvbnN0YW50O1xuICAgIGxvZGFzaC5jb3VudEJ5ID0gY291bnRCeTtcbiAgICBsb2Rhc2guY3JlYXRlID0gY3JlYXRlO1xuICAgIGxvZGFzaC5jdXJyeSA9IGN1cnJ5O1xuICAgIGxvZGFzaC5jdXJyeVJpZ2h0ID0gY3VycnlSaWdodDtcbiAgICBsb2Rhc2guZGVib3VuY2UgPSBkZWJvdW5jZTtcbiAgICBsb2Rhc2guZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICBsb2Rhc2guZGVmYXVsdHNEZWVwID0gZGVmYXVsdHNEZWVwO1xuICAgIGxvZGFzaC5kZWZlciA9IGRlZmVyO1xuICAgIGxvZGFzaC5kZWxheSA9IGRlbGF5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlID0gZGlmZmVyZW5jZTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZUJ5ID0gZGlmZmVyZW5jZUJ5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlV2l0aCA9IGRpZmZlcmVuY2VXaXRoO1xuICAgIGxvZGFzaC5kcm9wID0gZHJvcDtcbiAgICBsb2Rhc2guZHJvcFJpZ2h0ID0gZHJvcFJpZ2h0O1xuICAgIGxvZGFzaC5kcm9wUmlnaHRXaGlsZSA9IGRyb3BSaWdodFdoaWxlO1xuICAgIGxvZGFzaC5kcm9wV2hpbGUgPSBkcm9wV2hpbGU7XG4gICAgbG9kYXNoLmZpbGwgPSBmaWxsO1xuICAgIGxvZGFzaC5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgbG9kYXNoLmZsYXRNYXAgPSBmbGF0TWFwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVlcCA9IGZsYXRNYXBEZWVwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVwdGggPSBmbGF0TWFwRGVwdGg7XG4gICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVlcCA9IGZsYXR0ZW5EZWVwO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVwdGggPSBmbGF0dGVuRGVwdGg7XG4gICAgbG9kYXNoLmZsaXAgPSBmbGlwO1xuICAgIGxvZGFzaC5mbG93ID0gZmxvdztcbiAgICBsb2Rhc2guZmxvd1JpZ2h0ID0gZmxvd1JpZ2h0O1xuICAgIGxvZGFzaC5mcm9tUGFpcnMgPSBmcm9tUGFpcnM7XG4gICAgbG9kYXNoLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2guZnVuY3Rpb25zSW4gPSBmdW5jdGlvbnNJbjtcbiAgICBsb2Rhc2guZ3JvdXBCeSA9IGdyb3VwQnk7XG4gICAgbG9kYXNoLmluaXRpYWwgPSBpbml0aWFsO1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rpb247XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbkJ5ID0gaW50ZXJzZWN0aW9uQnk7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbldpdGggPSBpbnRlcnNlY3Rpb25XaXRoO1xuICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgbG9kYXNoLmludmVydEJ5ID0gaW52ZXJ0Qnk7XG4gICAgbG9kYXNoLmludm9rZU1hcCA9IGludm9rZU1hcDtcbiAgICBsb2Rhc2guaXRlcmF0ZWUgPSBpdGVyYXRlZTtcbiAgICBsb2Rhc2gua2V5QnkgPSBrZXlCeTtcbiAgICBsb2Rhc2gua2V5cyA9IGtleXM7XG4gICAgbG9kYXNoLmtleXNJbiA9IGtleXNJbjtcbiAgICBsb2Rhc2gubWFwID0gbWFwO1xuICAgIGxvZGFzaC5tYXBLZXlzID0gbWFwS2V5cztcbiAgICBsb2Rhc2gubWFwVmFsdWVzID0gbWFwVmFsdWVzO1xuICAgIGxvZGFzaC5tYXRjaGVzID0gbWF0Y2hlcztcbiAgICBsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5ID0gbWF0Y2hlc1Byb3BlcnR5O1xuICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTtcbiAgICBsb2Rhc2gubWVyZ2UgPSBtZXJnZTtcbiAgICBsb2Rhc2gubWVyZ2VXaXRoID0gbWVyZ2VXaXRoO1xuICAgIGxvZGFzaC5tZXRob2QgPSBtZXRob2Q7XG4gICAgbG9kYXNoLm1ldGhvZE9mID0gbWV0aG9kT2Y7XG4gICAgbG9kYXNoLm1peGluID0gbWl4aW47XG4gICAgbG9kYXNoLm5lZ2F0ZSA9IG5lZ2F0ZTtcbiAgICBsb2Rhc2gubnRoQXJnID0gbnRoQXJnO1xuICAgIGxvZGFzaC5vbWl0ID0gb21pdDtcbiAgICBsb2Rhc2gub21pdEJ5ID0gb21pdEJ5O1xuICAgIGxvZGFzaC5vbmNlID0gb25jZTtcbiAgICBsb2Rhc2gub3JkZXJCeSA9IG9yZGVyQnk7XG4gICAgbG9kYXNoLm92ZXIgPSBvdmVyO1xuICAgIGxvZGFzaC5vdmVyQXJncyA9IG92ZXJBcmdzO1xuICAgIGxvZGFzaC5vdmVyRXZlcnkgPSBvdmVyRXZlcnk7XG4gICAgbG9kYXNoLm92ZXJTb21lID0gb3ZlclNvbWU7XG4gICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsO1xuICAgIGxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHQ7XG4gICAgbG9kYXNoLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjtcbiAgICBsb2Rhc2gucGljayA9IHBpY2s7XG4gICAgbG9kYXNoLnBpY2tCeSA9IHBpY2tCeTtcbiAgICBsb2Rhc2gucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICBsb2Rhc2gucHJvcGVydHlPZiA9IHByb3BlcnR5T2Y7XG4gICAgbG9kYXNoLnB1bGwgPSBwdWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsID0gcHVsbEFsbDtcbiAgICBsb2Rhc2gucHVsbEFsbEJ5ID0gcHVsbEFsbEJ5O1xuICAgIGxvZGFzaC5wdWxsQWxsV2l0aCA9IHB1bGxBbGxXaXRoO1xuICAgIGxvZGFzaC5wdWxsQXQgPSBwdWxsQXQ7XG4gICAgbG9kYXNoLnJhbmdlID0gcmFuZ2U7XG4gICAgbG9kYXNoLnJhbmdlUmlnaHQgPSByYW5nZVJpZ2h0O1xuICAgIGxvZGFzaC5yZWFyZyA9IHJlYXJnO1xuICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7XG4gICAgbG9kYXNoLnJlbW92ZSA9IHJlbW92ZTtcbiAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7XG4gICAgbG9kYXNoLnJldmVyc2UgPSByZXZlcnNlO1xuICAgIGxvZGFzaC5zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTtcbiAgICBsb2Rhc2guc2V0ID0gc2V0O1xuICAgIGxvZGFzaC5zZXRXaXRoID0gc2V0V2l0aDtcbiAgICBsb2Rhc2guc2h1ZmZsZSA9IHNodWZmbGU7XG4gICAgbG9kYXNoLnNsaWNlID0gc2xpY2U7XG4gICAgbG9kYXNoLnNvcnRCeSA9IHNvcnRCeTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcSA9IHNvcnRlZFVuaXE7XG4gICAgbG9kYXNoLnNvcnRlZFVuaXFCeSA9IHNvcnRlZFVuaXFCeTtcbiAgICBsb2Rhc2guc3BsaXQgPSBzcGxpdDtcbiAgICBsb2Rhc2guc3ByZWFkID0gc3ByZWFkO1xuICAgIGxvZGFzaC50YWlsID0gdGFpbDtcbiAgICBsb2Rhc2gudGFrZSA9IHRha2U7XG4gICAgbG9kYXNoLnRha2VSaWdodCA9IHRha2VSaWdodDtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0V2hpbGUgPSB0YWtlUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2gudGFrZVdoaWxlID0gdGFrZVdoaWxlO1xuICAgIGxvZGFzaC50YXAgPSB0YXA7XG4gICAgbG9kYXNoLnRocm90dGxlID0gdGhyb3R0bGU7XG4gICAgbG9kYXNoLnRocnUgPSB0aHJ1O1xuICAgIGxvZGFzaC50b0FycmF5ID0gdG9BcnJheTtcbiAgICBsb2Rhc2gudG9QYWlycyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLnRvUGFpcnNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2gudG9QYXRoID0gdG9QYXRoO1xuICAgIGxvZGFzaC50b1BsYWluT2JqZWN0ID0gdG9QbGFpbk9iamVjdDtcbiAgICBsb2Rhc2gudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIGxvZGFzaC51bmFyeSA9IHVuYXJ5O1xuICAgIGxvZGFzaC51bmlvbiA9IHVuaW9uO1xuICAgIGxvZGFzaC51bmlvbkJ5ID0gdW5pb25CeTtcbiAgICBsb2Rhc2gudW5pb25XaXRoID0gdW5pb25XaXRoO1xuICAgIGxvZGFzaC51bmlxID0gdW5pcTtcbiAgICBsb2Rhc2gudW5pcUJ5ID0gdW5pcUJ5O1xuICAgIGxvZGFzaC51bmlxV2l0aCA9IHVuaXFXaXRoO1xuICAgIGxvZGFzaC51bnNldCA9IHVuc2V0O1xuICAgIGxvZGFzaC51bnppcCA9IHVuemlwO1xuICAgIGxvZGFzaC51bnppcFdpdGggPSB1bnppcFdpdGg7XG4gICAgbG9kYXNoLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICBsb2Rhc2gudXBkYXRlV2l0aCA9IHVwZGF0ZVdpdGg7XG4gICAgbG9kYXNoLnZhbHVlcyA9IHZhbHVlcztcbiAgICBsb2Rhc2gudmFsdWVzSW4gPSB2YWx1ZXNJbjtcbiAgICBsb2Rhc2gud2l0aG91dCA9IHdpdGhvdXQ7XG4gICAgbG9kYXNoLndvcmRzID0gd29yZHM7XG4gICAgbG9kYXNoLndyYXAgPSB3cmFwO1xuICAgIGxvZGFzaC54b3IgPSB4b3I7XG4gICAgbG9kYXNoLnhvckJ5ID0geG9yQnk7XG4gICAgbG9kYXNoLnhvcldpdGggPSB4b3JXaXRoO1xuICAgIGxvZGFzaC56aXAgPSB6aXA7XG4gICAgbG9kYXNoLnppcE9iamVjdCA9IHppcE9iamVjdDtcbiAgICBsb2Rhc2guemlwT2JqZWN0RGVlcCA9IHppcE9iamVjdERlZXA7XG4gICAgbG9kYXNoLnppcFdpdGggPSB6aXBXaXRoO1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVudHJpZXMgPSB0b1BhaXJzO1xuICAgIGxvZGFzaC5lbnRyaWVzSW4gPSB0b1BhaXJzSW47XG4gICAgbG9kYXNoLmV4dGVuZCA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5leHRlbmRXaXRoID0gYXNzaWduSW5XaXRoO1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIG1peGluKGxvZGFzaCwgbG9kYXNoKTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHVud3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZGQgPSBhZGQ7XG4gICAgbG9kYXNoLmF0dGVtcHQgPSBhdHRlbXB0O1xuICAgIGxvZGFzaC5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG4gICAgbG9kYXNoLmNhcGl0YWxpemUgPSBjYXBpdGFsaXplO1xuICAgIGxvZGFzaC5jZWlsID0gY2VpbDtcbiAgICBsb2Rhc2guY2xhbXAgPSBjbGFtcDtcbiAgICBsb2Rhc2guY2xvbmUgPSBjbG9uZTtcbiAgICBsb2Rhc2guY2xvbmVEZWVwID0gY2xvbmVEZWVwO1xuICAgIGxvZGFzaC5jbG9uZURlZXBXaXRoID0gY2xvbmVEZWVwV2l0aDtcbiAgICBsb2Rhc2guY2xvbmVXaXRoID0gY2xvbmVXaXRoO1xuICAgIGxvZGFzaC5jb25mb3Jtc1RvID0gY29uZm9ybXNUbztcbiAgICBsb2Rhc2guZGVidXJyID0gZGVidXJyO1xuICAgIGxvZGFzaC5kZWZhdWx0VG8gPSBkZWZhdWx0VG87XG4gICAgbG9kYXNoLmRpdmlkZSA9IGRpdmlkZTtcbiAgICBsb2Rhc2guZW5kc1dpdGggPSBlbmRzV2l0aDtcbiAgICBsb2Rhc2guZXEgPSBlcTtcbiAgICBsb2Rhc2guZXNjYXBlID0gZXNjYXBlO1xuICAgIGxvZGFzaC5lc2NhcGVSZWdFeHAgPSBlc2NhcGVSZWdFeHA7XG4gICAgbG9kYXNoLmV2ZXJ5ID0gZXZlcnk7XG4gICAgbG9kYXNoLmZpbmQgPSBmaW5kO1xuICAgIGxvZGFzaC5maW5kSW5kZXggPSBmaW5kSW5kZXg7XG4gICAgbG9kYXNoLmZpbmRLZXkgPSBmaW5kS2V5O1xuICAgIGxvZGFzaC5maW5kTGFzdCA9IGZpbmRMYXN0O1xuICAgIGxvZGFzaC5maW5kTGFzdEluZGV4ID0gZmluZExhc3RJbmRleDtcbiAgICBsb2Rhc2guZmluZExhc3RLZXkgPSBmaW5kTGFzdEtleTtcbiAgICBsb2Rhc2guZmxvb3IgPSBmbG9vcjtcbiAgICBsb2Rhc2guZm9yRWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmZvckVhY2hSaWdodCA9IGZvckVhY2hSaWdodDtcbiAgICBsb2Rhc2guZm9ySW4gPSBmb3JJbjtcbiAgICBsb2Rhc2guZm9ySW5SaWdodCA9IGZvckluUmlnaHQ7XG4gICAgbG9kYXNoLmZvck93biA9IGZvck93bjtcbiAgICBsb2Rhc2guZm9yT3duUmlnaHQgPSBmb3JPd25SaWdodDtcbiAgICBsb2Rhc2guZ2V0ID0gZ2V0O1xuICAgIGxvZGFzaC5ndCA9IGd0O1xuICAgIGxvZGFzaC5ndGUgPSBndGU7XG4gICAgbG9kYXNoLmhhcyA9IGhhcztcbiAgICBsb2Rhc2guaGFzSW4gPSBoYXNJbjtcbiAgICBsb2Rhc2guaGVhZCA9IGhlYWQ7XG4gICAgbG9kYXNoLmlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgbG9kYXNoLmluY2x1ZGVzID0gaW5jbHVkZXM7XG4gICAgbG9kYXNoLmluZGV4T2YgPSBpbmRleE9mO1xuICAgIGxvZGFzaC5pblJhbmdlID0gaW5SYW5nZTtcbiAgICBsb2Rhc2guaW52b2tlID0gaW52b2tlO1xuICAgIGxvZGFzaC5pc0FyZ3VtZW50cyA9IGlzQXJndW1lbnRzO1xuICAgIGxvZGFzaC5pc0FycmF5ID0gaXNBcnJheTtcbiAgICBsb2Rhc2guaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlID0gaXNBcnJheUxpa2U7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0ID0gaXNBcnJheUxpa2VPYmplY3Q7XG4gICAgbG9kYXNoLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcbiAgICBsb2Rhc2guaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbiAgICBsb2Rhc2guaXNEYXRlID0gaXNEYXRlO1xuICAgIGxvZGFzaC5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG4gICAgbG9kYXNoLmlzRW1wdHkgPSBpc0VtcHR5O1xuICAgIGxvZGFzaC5pc0VxdWFsID0gaXNFcXVhbDtcbiAgICBsb2Rhc2guaXNFcXVhbFdpdGggPSBpc0VxdWFsV2l0aDtcbiAgICBsb2Rhc2guaXNFcnJvciA9IGlzRXJyb3I7XG4gICAgbG9kYXNoLmlzRmluaXRlID0gaXNGaW5pdGU7XG4gICAgbG9kYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuICAgIGxvZGFzaC5pc0ludGVnZXIgPSBpc0ludGVnZXI7XG4gICAgbG9kYXNoLmlzTGVuZ3RoID0gaXNMZW5ndGg7XG4gICAgbG9kYXNoLmlzTWFwID0gaXNNYXA7XG4gICAgbG9kYXNoLmlzTWF0Y2ggPSBpc01hdGNoO1xuICAgIGxvZGFzaC5pc01hdGNoV2l0aCA9IGlzTWF0Y2hXaXRoO1xuICAgIGxvZGFzaC5pc05hTiA9IGlzTmFOO1xuICAgIGxvZGFzaC5pc05hdGl2ZSA9IGlzTmF0aXZlO1xuICAgIGxvZGFzaC5pc05pbCA9IGlzTmlsO1xuICAgIGxvZGFzaC5pc051bGwgPSBpc051bGw7XG4gICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7XG4gICAgbG9kYXNoLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG4gICAgbG9kYXNoLmlzT2JqZWN0TGlrZSA9IGlzT2JqZWN0TGlrZTtcbiAgICBsb2Rhc2guaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLmlzUmVnRXhwID0gaXNSZWdFeHA7XG4gICAgbG9kYXNoLmlzU2FmZUludGVnZXIgPSBpc1NhZmVJbnRlZ2VyO1xuICAgIGxvZGFzaC5pc1NldCA9IGlzU2V0O1xuICAgIGxvZGFzaC5pc1N0cmluZyA9IGlzU3RyaW5nO1xuICAgIGxvZGFzaC5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuICAgIGxvZGFzaC5pc1R5cGVkQXJyYXkgPSBpc1R5cGVkQXJyYXk7XG4gICAgbG9kYXNoLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4gICAgbG9kYXNoLmlzV2Vha01hcCA9IGlzV2Vha01hcDtcbiAgICBsb2Rhc2guaXNXZWFrU2V0ID0gaXNXZWFrU2V0O1xuICAgIGxvZGFzaC5qb2luID0gam9pbjtcbiAgICBsb2Rhc2gua2ViYWJDYXNlID0ga2ViYWJDYXNlO1xuICAgIGxvZGFzaC5sYXN0ID0gbGFzdDtcbiAgICBsb2Rhc2gubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2gubG93ZXJDYXNlID0gbG93ZXJDYXNlO1xuICAgIGxvZGFzaC5sb3dlckZpcnN0ID0gbG93ZXJGaXJzdDtcbiAgICBsb2Rhc2gubHQgPSBsdDtcbiAgICBsb2Rhc2gubHRlID0gbHRlO1xuICAgIGxvZGFzaC5tYXggPSBtYXg7XG4gICAgbG9kYXNoLm1heEJ5ID0gbWF4Qnk7XG4gICAgbG9kYXNoLm1lYW4gPSBtZWFuO1xuICAgIGxvZGFzaC5tZWFuQnkgPSBtZWFuQnk7XG4gICAgbG9kYXNoLm1pbiA9IG1pbjtcbiAgICBsb2Rhc2gubWluQnkgPSBtaW5CeTtcbiAgICBsb2Rhc2guc3R1YkFycmF5ID0gc3R1YkFycmF5O1xuICAgIGxvZGFzaC5zdHViRmFsc2UgPSBzdHViRmFsc2U7XG4gICAgbG9kYXNoLnN0dWJPYmplY3QgPSBzdHViT2JqZWN0O1xuICAgIGxvZGFzaC5zdHViU3RyaW5nID0gc3R1YlN0cmluZztcbiAgICBsb2Rhc2guc3R1YlRydWUgPSBzdHViVHJ1ZTtcbiAgICBsb2Rhc2gubXVsdGlwbHkgPSBtdWx0aXBseTtcbiAgICBsb2Rhc2gubnRoID0gbnRoO1xuICAgIGxvZGFzaC5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgICBsb2Rhc2gubm9vcCA9IG5vb3A7XG4gICAgbG9kYXNoLm5vdyA9IG5vdztcbiAgICBsb2Rhc2gucGFkID0gcGFkO1xuICAgIGxvZGFzaC5wYWRFbmQgPSBwYWRFbmQ7XG4gICAgbG9kYXNoLnBhZFN0YXJ0ID0gcGFkU3RhcnQ7XG4gICAgbG9kYXNoLnBhcnNlSW50ID0gcGFyc2VJbnQ7XG4gICAgbG9kYXNoLnJhbmRvbSA9IHJhbmRvbTtcbiAgICBsb2Rhc2gucmVkdWNlID0gcmVkdWNlO1xuICAgIGxvZGFzaC5yZWR1Y2VSaWdodCA9IHJlZHVjZVJpZ2h0O1xuICAgIGxvZGFzaC5yZXBlYXQgPSByZXBlYXQ7XG4gICAgbG9kYXNoLnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIGxvZGFzaC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgbG9kYXNoLnJvdW5kID0gcm91bmQ7XG4gICAgbG9kYXNoLnJ1bkluQ29udGV4dCA9IHJ1bkluQ29udGV4dDtcbiAgICBsb2Rhc2guc2FtcGxlID0gc2FtcGxlO1xuICAgIGxvZGFzaC5zaXplID0gc2l6ZTtcbiAgICBsb2Rhc2guc25ha2VDYXNlID0gc25ha2VDYXNlO1xuICAgIGxvZGFzaC5zb21lID0gc29tZTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXggPSBzb3J0ZWRJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhCeSA9IHNvcnRlZEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4T2YgPSBzb3J0ZWRJbmRleE9mO1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXggPSBzb3J0ZWRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5ID0gc29ydGVkTGFzdEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleE9mID0gc29ydGVkTGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLnN0YXJ0Q2FzZSA9IHN0YXJ0Q2FzZTtcbiAgICBsb2Rhc2guc3RhcnRzV2l0aCA9IHN0YXJ0c1dpdGg7XG4gICAgbG9kYXNoLnN1YnRyYWN0ID0gc3VidHJhY3Q7XG4gICAgbG9kYXNoLnN1bSA9IHN1bTtcbiAgICBsb2Rhc2guc3VtQnkgPSBzdW1CeTtcbiAgICBsb2Rhc2gudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBsb2Rhc2gudGltZXMgPSB0aW1lcztcbiAgICBsb2Rhc2gudG9GaW5pdGUgPSB0b0Zpbml0ZTtcbiAgICBsb2Rhc2gudG9JbnRlZ2VyID0gdG9JbnRlZ2VyO1xuICAgIGxvZGFzaC50b0xlbmd0aCA9IHRvTGVuZ3RoO1xuICAgIGxvZGFzaC50b0xvd2VyID0gdG9Mb3dlcjtcbiAgICBsb2Rhc2gudG9OdW1iZXIgPSB0b051bWJlcjtcbiAgICBsb2Rhc2gudG9TYWZlSW50ZWdlciA9IHRvU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgbG9kYXNoLnRvVXBwZXIgPSB0b1VwcGVyO1xuICAgIGxvZGFzaC50cmltID0gdHJpbTtcbiAgICBsb2Rhc2gudHJpbUVuZCA9IHRyaW1FbmQ7XG4gICAgbG9kYXNoLnRyaW1TdGFydCA9IHRyaW1TdGFydDtcbiAgICBsb2Rhc2gudHJ1bmNhdGUgPSB0cnVuY2F0ZTtcbiAgICBsb2Rhc2gudW5lc2NhcGUgPSB1bmVzY2FwZTtcbiAgICBsb2Rhc2gudW5pcXVlSWQgPSB1bmlxdWVJZDtcbiAgICBsb2Rhc2gudXBwZXJDYXNlID0gdXBwZXJDYXNlO1xuICAgIGxvZGFzaC51cHBlckZpcnN0ID0gdXBwZXJGaXJzdDtcblxuICAgIC8vIEFkZCBhbGlhc2VzLlxuICAgIGxvZGFzaC5lYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5maXJzdCA9IGhlYWQ7XG5cbiAgICBtaXhpbihsb2Rhc2gsIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB7fTtcbiAgICAgIGJhc2VGb3JPd24obG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLCBtZXRob2ROYW1lKSkge1xuICAgICAgICAgIHNvdXJjZVttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9KCkpLCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsb2Rhc2guVkVSU0lPTiA9IFZFUlNJT047XG5cbiAgICAvLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG4gICAgYXJyYXlFYWNoKFsnYmluZCcsICdiaW5kS2V5JywgJ2N1cnJ5JywgJ2N1cnJ5UmlnaHQnLCAncGFydGlhbCcsICdwYXJ0aWFsUmlnaHQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgbG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyID0gbG9kYXNoO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uZHJvcGAgYW5kIGBfLnRha2VgIHZhcmlhbnRzLlxuICAgIGFycmF5RWFjaChbJ2Ryb3AnLCAndGFrZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24obikge1xuICAgICAgICBuID0gbiA9PT0gdW5kZWZpbmVkID8gMSA6IG5hdGl2ZU1heCh0b0ludGVnZXIobiksIDApO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSAodGhpcy5fX2ZpbHRlcmVkX18gJiYgIWluZGV4KVxuICAgICAgICAgID8gbmV3IExhenlXcmFwcGVyKHRoaXMpXG4gICAgICAgICAgOiB0aGlzLmNsb25lKCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IG5hdGl2ZU1pbihuLCByZXN1bHQuX190YWtlQ291bnRfXyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHtcbiAgICAgICAgICAgICdzaXplJzogbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpLFxuICAgICAgICAgICAgJ3R5cGUnOiBtZXRob2ROYW1lICsgKHJlc3VsdC5fX2Rpcl9fIDwgMCA/ICdSaWdodCcgOiAnJylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUgKyAnUmlnaHQnXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRoYXQgYWNjZXB0IGFuIGBpdGVyYXRlZWAgdmFsdWUuXG4gICAgYXJyYXlFYWNoKFsnZmlsdGVyJywgJ21hcCcsICd0YWtlV2hpbGUnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0eXBlID0gaW5kZXggKyAxLFxuICAgICAgICAgIGlzRmlsdGVyID0gdHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHIHx8IHR5cGUgPT0gTEFaWV9XSElMRV9GTEFHO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuX19pdGVyYXRlZXNfXy5wdXNoKHtcbiAgICAgICAgICAnaXRlcmF0ZWUnOiBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksXG4gICAgICAgICAgJ3R5cGUnOiB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gcmVzdWx0Ll9fZmlsdGVyZWRfXyB8fCBpc0ZpbHRlcjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5oZWFkYCBhbmQgYF8ubGFzdGAuXG4gICAgYXJyYXlFYWNoKFsnaGVhZCcsICdsYXN0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdGFrZU5hbWUgPSAndGFrZScgKyAoaW5kZXggPyAnUmlnaHQnIDogJycpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF07XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaW5pdGlhbGAgYW5kIGBfLnRhaWxgLlxuICAgIGFycmF5RWFjaChbJ2luaXRpYWwnLCAndGFpbCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIGRyb3BOYW1lID0gJ2Ryb3AnICsgKGluZGV4ID8gJycgOiAnUmlnaHQnKTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fZmlsdGVyZWRfXyA/IG5ldyBMYXp5V3JhcHBlcih0aGlzKSA6IHRoaXNbZHJvcE5hbWVdKDEpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5pbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHRoaXM7XG4gICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXyAmJiAoc3RhcnQgPiAwIHx8IGVuZCA8IDApKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGFydCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuZHJvcChzdGFydCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gdG9JbnRlZ2VyKGVuZCk7XG4gICAgICAgIHJlc3VsdCA9IGVuZCA8IDAgPyByZXN1bHQuZHJvcFJpZ2h0KC1lbmQpIDogcmVzdWx0LnRha2UoZW5kIC0gc3RhcnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRha2VSaWdodFdoaWxlID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBjaGVja0l0ZXJhdGVlID0gL14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgaXNUYWtlciA9IC9eKD86aGVhZHxsYXN0KSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgbG9kYXNoRnVuYyA9IGxvZGFzaFtpc1Rha2VyID8gKCd0YWtlJyArIChtZXRob2ROYW1lID09ICdsYXN0JyA/ICdSaWdodCcgOiAnJykpIDogbWV0aG9kTmFtZV0sXG4gICAgICAgICAgcmV0VW53cmFwcGVkID0gaXNUYWtlciB8fCAvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGlmICghbG9kYXNoRnVuYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgICBhcmdzID0gaXNUYWtlciA/IFsxXSA6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGlzTGF6eSA9IHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIsXG4gICAgICAgICAgICBpdGVyYXRlZSA9IGFyZ3NbMF0sXG4gICAgICAgICAgICB1c2VMYXp5ID0gaXNMYXp5IHx8IGlzQXJyYXkodmFsdWUpO1xuXG4gICAgICAgIHZhciBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLCBhcnJheVB1c2goW3ZhbHVlXSwgYXJncykpO1xuICAgICAgICAgIHJldHVybiAoaXNUYWtlciAmJiBjaGFpbkFsbCkgPyByZXN1bHRbMF0gOiByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHVzZUxhenkgJiYgY2hlY2tJdGVyYXRlZSAmJiB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyAmJiBpdGVyYXRlZS5sZW5ndGggIT0gMSkge1xuICAgICAgICAgIC8vIEF2b2lkIGxhenkgdXNlIGlmIHRoZSBpdGVyYXRlZSBoYXMgYSBcImxlbmd0aFwiIHZhbHVlIG90aGVyIHRoYW4gYDFgLlxuICAgICAgICAgIGlzTGF6eSA9IHVzZUxhenkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXyxcbiAgICAgICAgICAgIGlzSHlicmlkID0gISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxcbiAgICAgICAgICAgIGlzVW53cmFwcGVkID0gcmV0VW53cmFwcGVkICYmICFjaGFpbkFsbCxcbiAgICAgICAgICAgIG9ubHlMYXp5ID0gaXNMYXp5ICYmICFpc0h5YnJpZDtcblxuICAgICAgICBpZiAoIXJldFVud3JhcHBlZCAmJiB1c2VMYXp5KSB7XG4gICAgICAgICAgdmFsdWUgPSBvbmx5TGF6eSA/IHZhbHVlIDogbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICAgICAgICByZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ICdmdW5jJzogdGhydSwgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLCAndGhpc0FyZyc6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW53cmFwcGVkICYmIG9ubHlMYXp5KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgICAgcmV0dXJuIGlzVW53cmFwcGVkID8gKGlzVGFrZXIgPyByZXN1bHQudmFsdWUoKVswXSA6IHJlc3VsdC52YWx1ZSgpKSA6IHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYEFycmF5YCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBhcnJheUVhY2goWydwb3AnLCAncHVzaCcsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gYXJyYXlQcm90b1ttZXRob2ROYW1lXSxcbiAgICAgICAgICBjaGFpbk5hbWUgPSAvXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSkgPyAndGFwJyA6ICd0aHJ1JyxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSAvXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBpZiAocmV0VW53cmFwcGVkICYmICF0aGlzLl9fY2hhaW5fXykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBNYXAgbWluaWZpZWQgbWV0aG9kIG5hbWVzIHRvIHRoZWlyIHJlYWwgbmFtZXMuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBsb2Rhc2hGdW5jID0gbG9kYXNoW21ldGhvZE5hbWVdO1xuICAgICAgaWYgKGxvZGFzaEZ1bmMpIHtcbiAgICAgICAgdmFyIGtleSA9IGxvZGFzaEZ1bmMubmFtZSArICcnO1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCBrZXkpKSB7XG4gICAgICAgICAgcmVhbE5hbWVzW2tleV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZWFsTmFtZXNba2V5XS5wdXNoKHsgJ25hbWUnOiBtZXRob2ROYW1lLCAnZnVuYyc6IGxvZGFzaEZ1bmMgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCwgV1JBUF9CSU5EX0tFWV9GTEFHKS5uYW1lXSA9IFt7XG4gICAgICAnbmFtZSc6ICd3cmFwcGVyJyxcbiAgICAgICdmdW5jJzogdW5kZWZpbmVkXG4gICAgfV07XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGF6eVdyYXBwZXJgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jbG9uZSA9IGxhenlDbG9uZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZSA9IGxhenlSZXZlcnNlO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZSA9IGxhenlWYWx1ZTtcblxuICAgIC8vIEFkZCBjaGFpbiBzZXF1ZW5jZSBtZXRob2RzIHRvIHRoZSBgbG9kYXNoYCB3cmFwcGVyLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuYXQgPSB3cmFwcGVyQXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHdyYXBwZXJDaGFpbjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbW1pdCA9IHdyYXBwZXJDb21taXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5uZXh0ID0gd3JhcHBlck5leHQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5wbGFudCA9IHdyYXBwZXJQbGFudDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnJldmVyc2UgPSB3cmFwcGVyUmV2ZXJzZTtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnRvSlNPTiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWVPZiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWU7XG5cbiAgICAvLyBBZGQgbGF6eSBhbGlhc2VzLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuZmlyc3QgPSBsb2Rhc2gucHJvdG90eXBlLmhlYWQ7XG5cbiAgICBpZiAoc3ltSXRlcmF0b3IpIHtcbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdID0gd3JhcHBlclRvSXRlcmF0b3I7XG4gICAgfVxuICAgIHJldHVybiBsb2Rhc2g7XG4gIH0pO1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8vIEV4cG9ydCBsb2Rhc2guXG4gIHZhciBfID0gcnVuSW5Db250ZXh0KCk7XG5cbiAgLy8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2U6XG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEV4cG9zZSBMb2Rhc2ggb24gdGhlIGdsb2JhbCBvYmplY3QgdG8gcHJldmVudCBlcnJvcnMgd2hlbiBMb2Rhc2ggaXNcbiAgICAvLyBsb2FkZWQgYnkgYSBzY3JpcHQgdGFnIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTUQgbG9hZGVyLlxuICAgIC8vIFNlZSBodHRwOi8vcmVxdWlyZWpzLm9yZy9kb2NzL2Vycm9ycy5odG1sI21pc21hdGNoIGZvciBtb3JlIGRldGFpbHMuXG4gICAgLy8gVXNlIGBfLm5vQ29uZmxpY3RgIHRvIHJlbW92ZSBMb2Rhc2ggZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuXG4gICAgLy8gRGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmVcbiAgICAvLyByZWZlcmVuY2VkIGFzIHRoZSBcInVuZGVyc2NvcmVcIiBtb2R1bGUuXG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGBleHBvcnRzYCBhZnRlciBgZGVmaW5lYCBpbiBjYXNlIGEgYnVpbGQgb3B0aW1pemVyIGFkZHMgaXQuXG4gIGVsc2UgaWYgKGZyZWVNb2R1bGUpIHtcbiAgICAvLyBFeHBvcnQgZm9yIE5vZGUuanMuXG4gICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IF8pLl8gPSBfO1xuICAgIC8vIEV4cG9ydCBmb3IgQ29tbW9uSlMgc3VwcG9ydC5cbiAgICBmcmVlRXhwb3J0cy5fID0gXztcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBFeHBvcnQgdG8gdGhlIGdsb2JhbCBvYmplY3QuXG4gICAgcm9vdC5fID0gXztcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9450\n");
/***/ }),
/***/ 8595:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("var root = __webpack_require__(8548);\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\n\n\nvar now = function now() {\n return root.Date.now();\n};\n\nmodule.exports = now;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL25vdy5qcz80MDhjIl0sIm5hbWVzIjpbInJvb3QiLCJyZXF1aXJlIiwibm93IiwiRGF0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLElBQUksR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQWxCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLElBQUlDLEdBQUcsR0FBRyxTQUFOQSxHQUFNLEdBQVc7QUFDbkIsU0FBT0YsSUFBSSxDQUFDRyxJQUFMLENBQVVELEdBQVYsRUFBUDtBQUNELENBRkQ7O0FBSUFFLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQkgsR0FBakIiLCJmaWxlIjoiODU5NS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vdztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8595\n");
/***/ }),
/***/ 4970:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("var debounce = __webpack_require__(9397),\n isObject = __webpack_require__(1556);\n/** Error message constants. */\n\n\nvar FUNC_ERROR_TEXT = 'Expected a function';\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\n\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nmodule.exports = throttle;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3Rocm90dGxlLmpzPzBmMzIiXSwibmFtZXMiOlsiZGVib3VuY2UiLCJyZXF1aXJlIiwiaXNPYmplY3QiLCJGVU5DX0VSUk9SX1RFWFQiLCJ0aHJvdHRsZSIsImZ1bmMiLCJ3YWl0Iiwib3B0aW9ucyIsImxlYWRpbmciLCJ0cmFpbGluZyIsIlR5cGVFcnJvciIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLFFBQVEsR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQXRCO0FBQUEsSUFDSUMsUUFBUSxHQUFHRCxtQkFBTyxDQUFDLElBQUQsQ0FEdEI7QUFHQTs7O0FBQ0EsSUFBSUUsZUFBZSxHQUFHLHFCQUF0QjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsU0FBU0MsUUFBVCxDQUFrQkMsSUFBbEIsRUFBd0JDLElBQXhCLEVBQThCQyxPQUE5QixFQUF1QztBQUNyQyxNQUFJQyxPQUFPLEdBQUcsSUFBZDtBQUFBLE1BQ0lDLFFBQVEsR0FBRyxJQURmOztBQUdBLE1BQUksT0FBT0osSUFBUCxJQUFlLFVBQW5CLEVBQStCO0FBQzdCLFVBQU0sSUFBSUssU0FBSixDQUFjUCxlQUFkLENBQU47QUFDRDs7QUFDRCxNQUFJRCxRQUFRLENBQUNLLE9BQUQsQ0FBWixFQUF1QjtBQUNyQkMsV0FBTyxHQUFHLGFBQWFELE9BQWIsR0FBdUIsQ0FBQyxDQUFDQSxPQUFPLENBQUNDLE9BQWpDLEdBQTJDQSxPQUFyRDtBQUNBQyxZQUFRLEdBQUcsY0FBY0YsT0FBZCxHQUF3QixDQUFDLENBQUNBLE9BQU8sQ0FBQ0UsUUFBbEMsR0FBNkNBLFFBQXhEO0FBQ0Q7O0FBQ0QsU0FBT1QsUUFBUSxDQUFDSyxJQUFELEVBQU9DLElBQVAsRUFBYTtBQUMxQixlQUFXRSxPQURlO0FBRTFCLGVBQVdGLElBRmU7QUFHMUIsZ0JBQVlHO0FBSGMsR0FBYixDQUFmO0FBS0Q7O0FBRURFLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQlIsUUFBakIiLCJmaWxlIjoiNDk3MC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBkZWJvdW5jZSA9IHJlcXVpcmUoJy4vZGVib3VuY2UnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0aHJvdHRsZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4970\n");
/***/ }),
/***/ 917:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("var isObject = __webpack_require__(1556),\n isSymbol = __webpack_require__(7930);\n/** Used as references for various `Number` constants. */\n\n\nvar NAN = 0 / 0;\n/** Used to match leading and trailing whitespace. */\n\nvar reTrim = /^\\s+|\\s+$/g;\n/** Used to detect bad signed hexadecimal string values. */\n\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n/** Used to detect binary string values. */\n\nvar reIsBinary = /^0b[01]+$/i;\n/** Used to detect octal string values. */\n\nvar reIsOctal = /^0o[0-7]+$/i;\n/** Built-in method references without a dependency on `root`. */\n\nvar freeParseInt = parseInt;\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\n\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n\n if (isSymbol(value)) {\n return NAN;\n }\n\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? other + '' : other;\n }\n\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;\n}\n\nmodule.exports = toNumber;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzP2I0YjAiXSwibmFtZXMiOlsiaXNPYmplY3QiLCJyZXF1aXJlIiwiaXNTeW1ib2wiLCJOQU4iLCJyZVRyaW0iLCJyZUlzQmFkSGV4IiwicmVJc0JpbmFyeSIsInJlSXNPY3RhbCIsImZyZWVQYXJzZUludCIsInBhcnNlSW50IiwidG9OdW1iZXIiLCJ2YWx1ZSIsIm90aGVyIiwidmFsdWVPZiIsInJlcGxhY2UiLCJpc0JpbmFyeSIsInRlc3QiLCJzbGljZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLFFBQVEsR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQXRCO0FBQUEsSUFDSUMsUUFBUSxHQUFHRCxtQkFBTyxDQUFDLElBQUQsQ0FEdEI7QUFHQTs7O0FBQ0EsSUFBSUUsR0FBRyxHQUFHLElBQUksQ0FBZDtBQUVBOztBQUNBLElBQUlDLE1BQU0sR0FBRyxZQUFiO0FBRUE7O0FBQ0EsSUFBSUMsVUFBVSxHQUFHLG9CQUFqQjtBQUVBOztBQUNBLElBQUlDLFVBQVUsR0FBRyxZQUFqQjtBQUVBOztBQUNBLElBQUlDLFNBQVMsR0FBRyxhQUFoQjtBQUVBOztBQUNBLElBQUlDLFlBQVksR0FBR0MsUUFBbkI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLFNBQVNDLFFBQVQsQ0FBa0JDLEtBQWxCLEVBQXlCO0FBQ3ZCLE1BQUksT0FBT0EsS0FBUCxJQUFnQixRQUFwQixFQUE4QjtBQUM1QixXQUFPQSxLQUFQO0FBQ0Q7O0FBQ0QsTUFBSVQsUUFBUSxDQUFDUyxLQUFELENBQVosRUFBcUI7QUFDbkIsV0FBT1IsR0FBUDtBQUNEOztBQUNELE1BQUlILFFBQVEsQ0FBQ1csS0FBRCxDQUFaLEVBQXFCO0FBQ25CLFFBQUlDLEtBQUssR0FBRyxPQUFPRCxLQUFLLENBQUNFLE9BQWIsSUFBd0IsVUFBeEIsR0FBcUNGLEtBQUssQ0FBQ0UsT0FBTixFQUFyQyxHQUF1REYsS0FBbkU7QUFDQUEsU0FBSyxHQUFHWCxRQUFRLENBQUNZLEtBQUQsQ0FBUixHQUFtQkEsS0FBSyxHQUFHLEVBQTNCLEdBQWlDQSxLQUF6QztBQUNEOztBQUNELE1BQUksT0FBT0QsS0FBUCxJQUFnQixRQUFwQixFQUE4QjtBQUM1QixXQUFPQSxLQUFLLEtBQUssQ0FBVixHQUFjQSxLQUFkLEdBQXNCLENBQUNBLEtBQTlCO0FBQ0Q7O0FBQ0RBLE9BQUssR0FBR0EsS0FBSyxDQUFDRyxPQUFOLENBQWNWLE1BQWQsRUFBc0IsRUFBdEIsQ0FBUjtBQUNBLE1BQUlXLFFBQVEsR0FBR1QsVUFBVSxDQUFDVSxJQUFYLENBQWdCTCxLQUFoQixDQUFmO0FBQ0EsU0FBUUksUUFBUSxJQUFJUixTQUFTLENBQUNTLElBQVYsQ0FBZUwsS0FBZixDQUFiLEdBQ0hILFlBQVksQ0FBQ0csS0FBSyxDQUFDTSxLQUFOLENBQVksQ0FBWixDQUFELEVBQWlCRixRQUFRLEdBQUcsQ0FBSCxHQUFPLENBQWhDLENBRFQsR0FFRlYsVUFBVSxDQUFDVyxJQUFYLENBQWdCTCxLQUFoQixJQUF5QlIsR0FBekIsR0FBK0IsQ0FBQ1EsS0FGckM7QUFHRDs7QUFFRE8sTUFBTSxDQUFDQyxPQUFQLEdBQWlCVCxRQUFqQiIsImZpbGUiOiI5MTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b051bWJlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///917\n");
/***/ }),
/***/ 665:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
eval("var __webpack_unused_export__;\n\n\nfunction _typeof2(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\n__webpack_unused_export__ = ({\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n return _typeof2(obj);\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n};\n\nfunction plugin(Vue) {\n // Exit if the plugin has already been installed.\n if (plugin.installed) return; // Create a `vm` to serve as our global event bus.\n\n var events = new Vue({\n methods: {\n /**\n * Emit the given event.\n *\n * @param {string|object} event\n * @param {...*} args\n */\n emit: function emit(event) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n this.$emit.apply(this, [event].concat(args));\n },\n\n /**\n * Emit the given event.\n *\n * @param {string|object} event\n * @param {...*} args\n */\n fire: function fire(event) {\n for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n this.emit.apply(this, [event].concat(args));\n },\n\n /**\n * Listen for the given event.\n *\n * @param {string} event\n * @param {function} callback\n */\n on: function on(event, callback) {\n this.$on(event, callback);\n },\n\n /**\n * Listen for the given event.\n *\n * @param {string} event\n * @param {function} callback\n */\n listen: function listen(event, callback) {\n this.on(event, callback);\n },\n\n /**\n * Listen for the given event once.\n *\n * @param {string} event\n * @param {function} callback\n */\n once: function once(event, callback) {\n this.$once(event, callback);\n },\n\n /**\n * Remove one or more event listeners.\n *\n * @param {string} event\n * @param {function} callback\n */\n off: function off(event, callback) {\n this.$off(event, callback);\n },\n\n /**\n * Remove one or more event listeners.\n *\n * @param {string} event\n * @param {function} callback\n */\n remove: function remove(event, callback) {\n this.off(event, callback);\n }\n }\n }); // Extend `Vue.prototype` to include our global event bus.\n\n Object.defineProperty(Vue.prototype, '$events', {\n get: function get() {\n return events;\n }\n }); // Register a mixin that adds an `events` option to Vue 2.0 components.\n\n Vue.mixin({\n // Hook into the Vue 2.0 `beforeCreate` life-cycle event.\n beforeCreate: function beforeCreate() {\n // Exit if there's no `events` option.\n if (_typeof(this.$options.events) !== 'object') return; // Cache of events to bound functions for automatic unsubscriptions\n\n var eventMap = {}; // Loop through each event.\n\n for (var key in this.$options.events) {\n // Assign event type and bound function to map\n eventMap[key] = this.$options.events[key].bind(this);\n } // Listen for the `hook:beforeMount` Vue 2.0 life-cycle event.\n\n\n this.$once('hook:beforeMount', function () {\n // Loop through each event.\n for (var key in eventMap) {\n // Register a listener for the event.\n events.$on(key, eventMap[key]);\n }\n }); // Listen for the `hook:beforeDestroy` Vue 2.0 life-cycle event.\n\n this.$once('hook:beforeDestroy', function () {\n // Loop through each event.\n for (var key in eventMap) {\n // Register a listener for the event.\n events.$off(key, eventMap[key]);\n } // Release cache\n\n\n eventMap = null;\n });\n }\n });\n} // Check for `window.Vue`\n\n\nif (typeof window !== 'undefined' && window.Vue) {\n // Install plugin automatically.\n window.Vue.use(plugin);\n}\n\nexports.Z = plugin;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVlLWV2ZW50cy9kaXN0L2luZGV4LmpzP2FhM2EiXSwibmFtZXMiOlsiT2JqZWN0IiwidmFsdWUiLCJfdHlwZW9mIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJvYmoiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsInBsdWdpbiIsIlZ1ZSIsImluc3RhbGxlZCIsImV2ZW50cyIsIm1ldGhvZHMiLCJlbWl0IiwiZXZlbnQiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsIiRlbWl0IiwiYXBwbHkiLCJjb25jYXQiLCJmaXJlIiwiX2xlbjIiLCJfa2V5MiIsIm9uIiwiY2FsbGJhY2siLCIkb24iLCJsaXN0ZW4iLCJvbmNlIiwiJG9uY2UiLCJvZmYiLCIkb2ZmIiwicmVtb3ZlIiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJtaXhpbiIsImJlZm9yZUNyZWF0ZSIsIiRvcHRpb25zIiwiZXZlbnRNYXAiLCJrZXkiLCJiaW5kIiwid2luZG93IiwidXNlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IjtBQUFhOzs7O0FBRWJBLDZCQUE2QztBQUMzQ0MsT0FBSyxFQUFFO0FBRG9DLENBQTdDOztBQUlBLElBQUlDLE9BQU8sR0FBRyxPQUFPQyxNQUFQLEtBQWtCLFVBQWxCLElBQWdDLFNBQU9BLE1BQU0sQ0FBQ0MsUUFBZCxNQUEyQixRQUEzRCxHQUFzRSxVQUFVQyxHQUFWLEVBQWU7QUFBRSxrQkFBY0EsR0FBZDtBQUFvQixDQUEzRyxHQUE4RyxVQUFVQSxHQUFWLEVBQWU7QUFBRSxTQUFPQSxHQUFHLElBQUksT0FBT0YsTUFBUCxLQUFrQixVQUF6QixJQUF1Q0UsR0FBRyxDQUFDQyxXQUFKLEtBQW9CSCxNQUEzRCxJQUFxRUUsR0FBRyxLQUFLRixNQUFNLENBQUNJLFNBQXBGLEdBQWdHLFFBQWhHLFlBQWtIRixHQUFsSCxDQUFQO0FBQStILENBQTVROztBQUVB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QUFnQ0QsQyxDQUVEOzs7QUFDQSxJQUFJLE9BQU9HLE1BQVAsS0FBa0IsV0FBbEIsSUFBaUNBLE1BQU0sQ0FBQ25DLEdBQTVDLEVBQWlEO0FBQy9DO0FBQ0FtQyxRQUFNLENBQUNuQyxHQUFQLENBQVdvQyxHQUFYLENBQWVyQyxNQUFmO0FBQ0Q7O0FBRURzQyxTQUFBLEdBQWtCdEMsTUFBbEIiLCJmaWxlIjoiNjY1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmZ1bmN0aW9uIHBsdWdpbihWdWUpIHtcblxuICAvLyBFeGl0IGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBpbnN0YWxsZWQuXG4gIGlmIChwbHVnaW4uaW5zdGFsbGVkKSByZXR1cm47XG5cbiAgLy8gQ3JlYXRlIGEgYHZtYCB0byBzZXJ2ZSBhcyBvdXIgZ2xvYmFsIGV2ZW50IGJ1cy5cbiAgdmFyIGV2ZW50cyA9IG5ldyBWdWUoe1xuICAgIG1ldGhvZHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogRW1pdCB0aGUgZ2l2ZW4gZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBldmVudFxuICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzXG4gICAgICAgKi9cbiAgICAgIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiRlbWl0LmFwcGx5KHRoaXMsIFtldmVudF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgIH0sXG5cblxuICAgICAgLyoqXG4gICAgICAgKiBFbWl0IHRoZSBnaXZlbiBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IGV2ZW50XG4gICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3NcbiAgICAgICAqL1xuICAgICAgZmlyZTogZnVuY3Rpb24gZmlyZShldmVudCkge1xuICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBbZXZlbnRdLmNvbmNhdChhcmdzKSk7XG4gICAgICB9LFxuXG5cbiAgICAgIC8qKlxuICAgICAgICogTGlzdGVuIGZvciB0aGUgZ2l2ZW4gZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAgICovXG4gICAgICBvbjogZnVuY3Rpb24gb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuJG9uKGV2ZW50LCBjYWxsYmFjayk7XG4gICAgICB9LFxuXG5cbiAgICAgIC8qKlxuICAgICAgICogTGlzdGVuIGZvciB0aGUgZ2l2ZW4gZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAgICovXG4gICAgICBsaXN0ZW46IGZ1bmN0aW9uIGxpc3RlbihldmVudCwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vbihldmVudCwgY2FsbGJhY2spO1xuICAgICAgfSxcblxuXG4gICAgICAvKipcbiAgICAgICAqIExpc3RlbiBmb3IgdGhlIGdpdmVuIGV2ZW50IG9uY2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAgICovXG4gICAgICBvbmNlOiBmdW5jdGlvbiBvbmNlKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLiRvbmNlKGV2ZW50LCBjYWxsYmFjayk7XG4gICAgICB9LFxuXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIG9uZSBvciBtb3JlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICAgKi9cbiAgICAgIG9mZjogZnVuY3Rpb24gb2ZmKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLiRvZmYoZXZlbnQsIGNhbGxiYWNrKTtcbiAgICAgIH0sXG5cblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgb25lIG9yIG1vcmUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgICAqL1xuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMub2ZmKGV2ZW50LCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBFeHRlbmQgYFZ1ZS5wcm90b3R5cGVgIHRvIGluY2x1ZGUgb3VyIGdsb2JhbCBldmVudCBidXMuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGV2ZW50cycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBldmVudHM7XG4gICAgfVxuICB9KTtcblxuICAvLyBSZWdpc3RlciBhIG1peGluIHRoYXQgYWRkcyBhbiBgZXZlbnRzYCBvcHRpb24gdG8gVnVlIDIuMCBjb21wb25lbnRzLlxuICBWdWUubWl4aW4oe1xuICAgIC8vIEhvb2sgaW50byB0aGUgVnVlIDIuMCBgYmVmb3JlQ3JlYXRlYCBsaWZlLWN5Y2xlIGV2ZW50LlxuICAgIGJlZm9yZUNyZWF0ZTogZnVuY3Rpb24gYmVmb3JlQ3JlYXRlKCkge1xuICAgICAgLy8gRXhpdCBpZiB0aGVyZSdzIG5vIGBldmVudHNgIG9wdGlvbi5cbiAgICAgIGlmIChfdHlwZW9mKHRoaXMuJG9wdGlvbnMuZXZlbnRzKSAhPT0gJ29iamVjdCcpIHJldHVybjtcbiAgICAgIC8vIENhY2hlIG9mIGV2ZW50cyB0byBib3VuZCBmdW5jdGlvbnMgZm9yIGF1dG9tYXRpYyB1bnN1YnNjcmlwdGlvbnNcbiAgICAgIHZhciBldmVudE1hcCA9IHt9O1xuICAgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggZXZlbnQuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy4kb3B0aW9ucy5ldmVudHMpIHtcbiAgICAgICAgLy8gQXNzaWduIGV2ZW50IHR5cGUgYW5kIGJvdW5kIGZ1bmN0aW9uIHRvIG1hcFxuICAgICAgICBldmVudE1hcFtrZXldID0gdGhpcy4kb3B0aW9ucy5ldmVudHNba2V5XS5iaW5kKHRoaXMpO1xuICAgICAgfVxuICAgICAgLy8gTGlzdGVuIGZvciB0aGUgYGhvb2s6YmVmb3JlTW91bnRgIFZ1ZSAyLjAgbGlmZS1jeWNsZSBldmVudC5cbiAgICAgIHRoaXMuJG9uY2UoJ2hvb2s6YmVmb3JlTW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGV2ZW50LlxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZXZlbnRNYXApIHtcbiAgICAgICAgICAvLyBSZWdpc3RlciBhIGxpc3RlbmVyIGZvciB0aGUgZXZlbnQuXG4gICAgICAgICAgZXZlbnRzLiRvbihrZXksIGV2ZW50TWFwW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIExpc3RlbiBmb3IgdGhlIGBob29rOmJlZm9yZURlc3Ryb3lgIFZ1ZSAyLjAgbGlmZS1jeWNsZSBldmVudC5cbiAgICAgIHRoaXMuJG9uY2UoJ2hvb2s6YmVmb3JlRGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggZXZlbnQuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBldmVudE1hcCkge1xuICAgICAgICAgIC8vIFJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yIHRoZSBldmVudC5cbiAgICAgICAgICBldmVudHMuJG9mZihrZXksIGV2ZW50TWFwW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbGVhc2UgY2FjaGVcbiAgICAgICAgZXZlbnRNYXAgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gQ2hlY2sgZm9yIGB3aW5kb3cuVnVlYFxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5WdWUpIHtcbiAgLy8gSW5zdGFsbCBwbHVnaW4gYXV0b21hdGljYWxseS5cbiAgd2luZG93LlZ1ZS51c2UocGx1Z2luKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gcGx1Z2luOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///665\n");
/***/ }),
/***/ 9213:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("module.exports = __webpack_require__(916);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanM/MmEyYiJdLCJuYW1lcyI6WyJtb2R1bGUiXSwibWFwcGluZ3MiOiJBQUFBQSx5Q0FBQSIsImZpbGUiOiI5MjEzLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9heGlvcycpOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9213\n");
/***/ }),
/***/ 3721:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(5457);\n\nvar settle = __webpack_require__(4662);\n\nvar buildURL = __webpack_require__(8383);\n\nvar parseHeaders = __webpack_require__(1946);\n\nvar isURLSameOrigin = __webpack_require__(7025);\n\nvar createError = __webpack_require__(9723);\n\nvar btoa = typeof window !== 'undefined' && window.btoa && window.btoa.bind(window) || __webpack_require__(431);\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n var loadEvent = 'onreadystatechange';\n var xDomain = false; // For IE 8/9 CORS support\n // Only supports POST and GET calls and doesn't returns the response headers.\n // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.\n\n if ( true && typeof window !== 'undefined' && window.XDomainRequest && !('withCredentials' in request) && !isURLSameOrigin(config.url)) {\n request = new window.XDomainRequest();\n loadEvent = 'onload';\n xDomain = true;\n\n request.onprogress = function handleProgress() {};\n\n request.ontimeout = function handleTimeout() {};\n } // HTTP basic authentication\n\n\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password || '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true); // Set the request timeout in MS\n\n request.timeout = config.timeout; // Listen for ready state\n\n request[loadEvent] = function handleLoad() {\n if (!request || request.readyState !== 4 && !xDomain) {\n return;\n } // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n\n\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n } // Prepare the response\n\n\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n var response = {\n data: responseData,\n // IE sends 1223 instead of 204 (https://github.com/mzabriskie/axios/issues/201)\n status: request.status === 1223 ? 204 : request.status,\n statusText: request.status === 1223 ? 'No Content' : request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n settle(resolve, reject, response); // Clean up request\n\n request = null;\n }; // Handle low level network errors\n\n\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config)); // Clean up request\n\n request = null;\n }; // Handle timeout\n\n\n request.ontimeout = function handleTimeout() {\n reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED')); // Clean up request\n\n request = null;\n }; // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n\n if (utils.isStandardBrowserEnv()) {\n var cookies = __webpack_require__(9555); // Add xsrf header\n\n\n var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ? cookies.read(config.xsrfCookieName) : undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n } // Add headers to the request\n\n\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n } // Add withCredentials to request if needed\n\n\n if (config.withCredentials) {\n request.withCredentials = true;\n } // Add responseType to request if needed\n\n\n if (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n if (request.responseType !== 'json') {\n throw e;\n }\n }\n } // Handle progress if needed\n\n\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n } // Not all browsers support upload events\n\n\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel); // Clean up request\n\n request = null;\n });\n }\n\n if (requestData === undefined) {\n requestData = null;\n } // Send the request\n\n\n request.send(requestData);\n });\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcz84NmNjIl0sIm5hbWVzIjpbInV0aWxzIiwicmVxdWlyZSIsInNldHRsZSIsImJ1aWxkVVJMIiwicGFyc2VIZWFkZXJzIiwiaXNVUkxTYW1lT3JpZ2luIiwiY3JlYXRlRXJyb3IiLCJidG9hIiwid2luZG93IiwiYmluZCIsIm1vZHVsZSIsImV4cG9ydHMiLCJ4aHJBZGFwdGVyIiwiY29uZmlnIiwiUHJvbWlzZSIsImRpc3BhdGNoWGhyUmVxdWVzdCIsInJlc29sdmUiLCJyZWplY3QiLCJyZXF1ZXN0RGF0YSIsImRhdGEiLCJyZXF1ZXN0SGVhZGVycyIsImhlYWRlcnMiLCJpc0Zvcm1EYXRhIiwicmVxdWVzdCIsIlhNTEh0dHBSZXF1ZXN0IiwibG9hZEV2ZW50IiwieERvbWFpbiIsInByb2Nlc3MiLCJYRG9tYWluUmVxdWVzdCIsInVybCIsIm9ucHJvZ3Jlc3MiLCJoYW5kbGVQcm9ncmVzcyIsIm9udGltZW91dCIsImhhbmRsZVRpbWVvdXQiLCJhdXRoIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsIkF1dGhvcml6YXRpb24iLCJvcGVuIiwibWV0aG9kIiwidG9VcHBlckNhc2UiLCJwYXJhbXMiLCJwYXJhbXNTZXJpYWxpemVyIiwidGltZW91dCIsImhhbmRsZUxvYWQiLCJyZWFkeVN0YXRlIiwic3RhdHVzIiwicmVzcG9uc2VVUkwiLCJpbmRleE9mIiwicmVzcG9uc2VIZWFkZXJzIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwicmVzcG9uc2VEYXRhIiwicmVzcG9uc2VUeXBlIiwicmVzcG9uc2VUZXh0IiwicmVzcG9uc2UiLCJzdGF0dXNUZXh0Iiwib25lcnJvciIsImhhbmRsZUVycm9yIiwiaXNTdGFuZGFyZEJyb3dzZXJFbnYiLCJjb29raWVzIiwieHNyZlZhbHVlIiwid2l0aENyZWRlbnRpYWxzIiwieHNyZkNvb2tpZU5hbWUiLCJyZWFkIiwidW5kZWZpbmVkIiwieHNyZkhlYWRlck5hbWUiLCJmb3JFYWNoIiwic2V0UmVxdWVzdEhlYWRlciIsInZhbCIsImtleSIsInRvTG93ZXJDYXNlIiwiZSIsIm9uRG93bmxvYWRQcm9ncmVzcyIsImFkZEV2ZW50TGlzdGVuZXIiLCJvblVwbG9hZFByb2dyZXNzIiwidXBsb2FkIiwiY2FuY2VsVG9rZW4iLCJwcm9taXNlIiwidGhlbiIsIm9uQ2FuY2VsZWQiLCJjYW5jZWwiLCJhYm9ydCIsInNlbmQiXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUlBLEtBQUssR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQW5COztBQUNBLElBQUlDLE1BQU0sR0FBR0QsbUJBQU8sQ0FBQyxJQUFELENBQXBCOztBQUNBLElBQUlFLFFBQVEsR0FBR0YsbUJBQU8sQ0FBQyxJQUFELENBQXRCOztBQUNBLElBQUlHLFlBQVksR0FBR0gsbUJBQU8sQ0FBQyxJQUFELENBQTFCOztBQUNBLElBQUlJLGVBQWUsR0FBR0osbUJBQU8sQ0FBQyxJQUFELENBQTdCOztBQUNBLElBQUlLLFdBQVcsR0FBR0wsbUJBQU8sQ0FBQyxJQUFELENBQXpCOztBQUNBLElBQUlNLElBQUksR0FBSSxPQUFPQyxNQUFQLEtBQWtCLFdBQWxCLElBQWlDQSxNQUFNLENBQUNELElBQXhDLElBQWdEQyxNQUFNLENBQUNELElBQVAsQ0FBWUUsSUFBWixDQUFpQkQsTUFBakIsQ0FBakQsSUFBOEVQLG1CQUFPLENBQUMsR0FBRCxDQUFoRzs7QUFFQVMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCLFNBQVNDLFVBQVQsQ0FBb0JDLE1BQXBCLEVBQTRCO0FBQzNDLFNBQU8sSUFBSUMsT0FBSixDQUFZLFNBQVNDLGtCQUFULENBQTRCQyxPQUE1QixFQUFxQ0MsTUFBckMsRUFBNkM7QUFDOUQsUUFBSUMsV0FBVyxHQUFHTCxNQUFNLENBQUNNLElBQXpCO0FBQ0EsUUFBSUMsY0FBYyxHQUFHUCxNQUFNLENBQUNRLE9BQTVCOztBQUVB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QUFxQzVELE1BQU0sQ0FBQzJELGtCQUE1QztBQUNELEtBekk2RCxDQTJJOUQ7OztBQUNBLFFBQUksT0FBTzNELE1BQU0sQ0FBQzZELGdCQUFkLEtBQW1DLFVBQW5DLElBQWlEbkQsT0FBTyxDQUFDb0QsTUFBN0QsRUFBcUU7QUFDbkVwRCxhQUFPLENBQUNvRCxNQUFSLENBQWVGLGdCQUFmLENBQWdDLFVBQWhDLEVBQTRDNUQsTUFBTSxDQUFDNkQsZ0JBQW5EO0FBQ0Q7O0FBRUQsUUFBSTdELE1BQU0sQ0FBQytELFdBQVgsRUFBd0I7QUFDdEI7QUFDQS9ELFlBQU0sQ0FBQytELFdBQVAsQ0FBbUJDLE9BQW5CLENBQTJCQyxJQUEzQixDQUFnQyxTQUFTQyxVQUFULENBQW9CQyxNQUFwQixFQUE0QjtBQUMxRCxZQUFJLENBQUN6RCxPQUFMLEVBQWM7QUFDWjtBQUNEOztBQUVEQSxlQUFPLENBQUMwRCxLQUFSO0FBQ0FoRSxjQUFNLENBQUMrRCxNQUFELENBQU4sQ0FOMEQsQ0FPMUQ7O0FBQ0F6RCxlQUFPLEdBQUcsSUFBVjtBQUNELE9BVEQ7QUFVRDs7QUFFRCxRQUFJTCxXQUFXLEtBQUs4QyxTQUFwQixFQUErQjtBQUM3QjlDLGlCQUFXLEdBQUcsSUFBZDtBQUNELEtBaEs2RCxDQWtLOUQ7OztBQUNBSyxXQUFPLENBQUMyRCxJQUFSLENBQWFoRSxXQUFiO0FBQ0QsR0FwS00sQ0FBUDtBQXFLRCxDQXRLRCIsImZpbGUiOiIzNzIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgc2V0dGxlID0gcmVxdWlyZSgnLi8uLi9jb3JlL3NldHRsZScpO1xudmFyIGJ1aWxkVVJMID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2J1aWxkVVJMJyk7XG52YXIgcGFyc2VIZWFkZXJzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL3BhcnNlSGVhZGVycycpO1xudmFyIGlzVVJMU2FtZU9yaWdpbiA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9pc1VSTFNhbWVPcmlnaW4nKTtcbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4uL2NvcmUvY3JlYXRlRXJyb3InKTtcbnZhciBidG9hID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5idG9hICYmIHdpbmRvdy5idG9hLmJpbmQod2luZG93KSkgfHwgcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2J0b2EnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4aHJBZGFwdGVyKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuICAgIHZhciByZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuXG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEocmVxdWVzdERhdGEpKSB7XG4gICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddOyAvLyBMZXQgdGhlIGJyb3dzZXIgc2V0IGl0XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgbG9hZEV2ZW50ID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG4gICAgdmFyIHhEb21haW4gPSBmYWxzZTtcblxuICAgIC8vIEZvciBJRSA4LzkgQ09SUyBzdXBwb3J0XG4gICAgLy8gT25seSBzdXBwb3J0cyBQT1NUIGFuZCBHRVQgY2FsbHMgYW5kIGRvZXNuJ3QgcmV0dXJucyB0aGUgcmVzcG9uc2UgaGVhZGVycy5cbiAgICAvLyBET04nVCBkbyB0aGlzIGZvciB0ZXN0aW5nIGIvYyBYTUxIdHRwUmVxdWVzdCBpcyBtb2NrZWQsIG5vdCBYRG9tYWluUmVxdWVzdC5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyAmJlxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICB3aW5kb3cuWERvbWFpblJlcXVlc3QgJiYgISgnd2l0aENyZWRlbnRpYWxzJyBpbiByZXF1ZXN0KSAmJlxuICAgICAgICAhaXNVUkxTYW1lT3JpZ2luKGNvbmZpZy51cmwpKSB7XG4gICAgICByZXF1ZXN0ID0gbmV3IHdpbmRvdy5YRG9tYWluUmVxdWVzdCgpO1xuICAgICAgbG9hZEV2ZW50ID0gJ29ubG9hZCc7XG4gICAgICB4RG9tYWluID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3Qub25wcm9ncmVzcyA9IGZ1bmN0aW9uIGhhbmRsZVByb2dyZXNzKCkge307XG4gICAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7fTtcbiAgICB9XG5cbiAgICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gICAgaWYgKGNvbmZpZy5hdXRoKSB7XG4gICAgICB2YXIgdXNlcm5hbWUgPSBjb25maWcuYXV0aC51c2VybmFtZSB8fCAnJztcbiAgICAgIHZhciBwYXNzd29yZCA9IGNvbmZpZy5hdXRoLnBhc3N3b3JkIHx8ICcnO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBidWlsZFVSTChjb25maWcudXJsLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplciksIHRydWUpO1xuXG4gICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgaW4gTVNcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBjb25maWcudGltZW91dDtcblxuICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGVcbiAgICByZXF1ZXN0W2xvYWRFdmVudF0gPSBmdW5jdGlvbiBoYW5kbGVMb2FkKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0IHx8IChyZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQgJiYgIXhEb21haW4pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHJlcXVlc3QgZXJyb3JlZCBvdXQgYW5kIHdlIGRpZG4ndCBnZXQgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlXG4gICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgIC8vIHdpbGwgcmV0dXJuIHN0YXR1cyBhcyAwIGV2ZW4gdGhvdWdoIGl0J3MgYSBzdWNjZXNzZnVsIHJlcXVlc3RcbiAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCA/IHBhcnNlSGVhZGVycyhyZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSA6IG51bGw7XG4gICAgICB2YXIgcmVzcG9uc2VEYXRhID0gIWNvbmZpZy5yZXNwb25zZVR5cGUgfHwgY29uZmlnLnJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnID8gcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIC8vIElFIHNlbmRzIDEyMjMgaW5zdGVhZCBvZiAyMDQgKGh0dHBzOi8vZ2l0aHViLmNvbS9temFicmlza2llL2F4aW9zL2lzc3Vlcy8yMDEpXG4gICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXMgPT09IDEyMjMgPyAnTm8gQ29udGVudCcgOiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RcbiAgICAgIH07XG5cbiAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcbiAgICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgICAgLy8gb25lcnJvciBzaG91bGQgb25seSBmaXJlIGlmIGl0J3MgYSBuZXR3b3JrIGVycm9yXG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBjb25maWcpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKCd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcsIGNvbmZpZywgJ0VDT05OQUJPUlRFRCcpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgIC8vIFRoaXMgaXMgb25seSBkb25lIGlmIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50LlxuICAgIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXG4gICAgaWYgKHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpIHtcbiAgICAgIHZhciBjb29raWVzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2Nvb2tpZXMnKTtcblxuICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICB2YXIgeHNyZlZhbHVlID0gKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgfHwgaXNVUkxTYW1lT3JpZ2luKGNvbmZpZy51cmwpKSAmJiBjb25maWcueHNyZkNvb2tpZU5hbWUgP1xuICAgICAgICAgIGNvb2tpZXMucmVhZChjb25maWcueHNyZkNvb2tpZU5hbWUpIDpcbiAgICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbY29uZmlnLnhzcmZIZWFkZXJOYW1lXSA9IHhzcmZWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycywgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3REYXRhID09PSAndW5kZWZpbmVkJyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBoZWFkZXIgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVR5cGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHJlcXVlc3QucmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHByb2dyZXNzIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIC8vIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB1cGxvYWQgZXZlbnRzXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25VcGxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25VcGxvYWRQcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgY29uZmlnLmNhbmNlbFRva2VuLnByb21pc2UudGhlbihmdW5jdGlvbiBvbkNhbmNlbGVkKGNhbmNlbCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlamVjdChjYW5jZWwpO1xuICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3REYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3REYXRhID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgcmVxdWVzdC5zZW5kKHJlcXVlc3REYXRhKTtcbiAgfSk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3721\n");
/***/ }),
/***/ 916:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(5457);\n\nvar bind = __webpack_require__(7823);\n\nvar Axios = __webpack_require__(2832);\n\nvar defaults = __webpack_require__(7414);\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\n\n\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context); // Copy axios.prototype to instance\n\n utils.extend(instance, Axios.prototype, context); // Copy context to instance\n\n utils.extend(instance, context);\n return instance;\n} // Create the default instance to be exported\n\n\nvar axios = createInstance(defaults); // Expose Axios class to allow class inheritance\n\naxios.Axios = Axios; // Factory for creating new instances\n\naxios.create = function create(instanceConfig) {\n return createInstance(utils.merge(defaults, instanceConfig));\n}; // Expose Cancel & CancelToken\n\n\naxios.Cancel = __webpack_require__(4039);\naxios.CancelToken = __webpack_require__(2648);\naxios.isCancel = __webpack_require__(328); // Expose all/spread\n\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = __webpack_require__(4445);\nmodule.exports = axios; // Allow use of default import syntax in TypeScript\n\nmodule.exports.default = axios;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzPzg3MTkiXSwibmFtZXMiOlsidXRpbHMiLCJyZXF1aXJlIiwiYmluZCIsIkF4aW9zIiwiZGVmYXVsdHMiLCJjcmVhdGVJbnN0YW5jZSIsImRlZmF1bHRDb25maWciLCJjb250ZXh0IiwiaW5zdGFuY2UiLCJwcm90b3R5cGUiLCJyZXF1ZXN0IiwiZXh0ZW5kIiwiYXhpb3MiLCJjcmVhdGUiLCJpbnN0YW5jZUNvbmZpZyIsIm1lcmdlIiwiQ2FuY2VsIiwiQ2FuY2VsVG9rZW4iLCJpc0NhbmNlbCIsImFsbCIsInByb21pc2VzIiwiUHJvbWlzZSIsInNwcmVhZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUlBLEtBQUssR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQW5COztBQUNBLElBQUlDLElBQUksR0FBR0QsbUJBQU8sQ0FBQyxJQUFELENBQWxCOztBQUNBLElBQUlFLEtBQUssR0FBR0YsbUJBQU8sQ0FBQyxJQUFELENBQW5COztBQUNBLElBQUlHLFFBQVEsR0FBR0gsbUJBQU8sQ0FBQyxJQUFELENBQXRCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTSSxjQUFULENBQXdCQyxhQUF4QixFQUF1QztBQUNyQyxNQUFJQyxPQUFPLEdBQUcsSUFBSUosS0FBSixDQUFVRyxhQUFWLENBQWQ7QUFDQSxNQUFJRSxRQUFRLEdBQUdOLElBQUksQ0FBQ0MsS0FBSyxDQUFDTSxTQUFOLENBQWdCQyxPQUFqQixFQUEwQkgsT0FBMUIsQ0FBbkIsQ0FGcUMsQ0FJckM7O0FBQ0FQLE9BQUssQ0FBQ1csTUFBTixDQUFhSCxRQUFiLEVBQXVCTCxLQUFLLENBQUNNLFNBQTdCLEVBQXdDRixPQUF4QyxFQUxxQyxDQU9yQzs7QUFDQVAsT0FBSyxDQUFDVyxNQUFOLENBQWFILFFBQWIsRUFBdUJELE9BQXZCO0FBRUEsU0FBT0MsUUFBUDtBQUNELEMsQ0FFRDs7O0FBQ0EsSUFBSUksS0FBSyxHQUFHUCxjQUFjLENBQUNELFFBQUQsQ0FBMUIsQyxDQUVBOztBQUNBUSxLQUFLLENBQUNULEtBQU4sR0FBY0EsS0FBZCxDLENBRUE7O0FBQ0FTLEtBQUssQ0FBQ0MsTUFBTixHQUFlLFNBQVNBLE1BQVQsQ0FBZ0JDLGNBQWhCLEVBQWdDO0FBQzdDLFNBQU9ULGNBQWMsQ0FBQ0wsS0FBSyxDQUFDZSxLQUFOLENBQVlYLFFBQVosRUFBc0JVLGNBQXRCLENBQUQsQ0FBckI7QUFDRCxDQUZELEMsQ0FJQTs7O0FBQ0FGLEtBQUssQ0FBQ0ksTUFBTixHQUFlZixtQkFBTyxDQUFDLElBQUQsQ0FBdEI7QUFDQVcsS0FBSyxDQUFDSyxXQUFOLEdBQW9CaEIsbUJBQU8sQ0FBQyxJQUFELENBQTNCO0FBQ0FXLEtBQUssQ0FBQ00sUUFBTixHQUFpQmpCLG1CQUFPLENBQUMsR0FBRCxDQUF4QixDLENBRUE7O0FBQ0FXLEtBQUssQ0FBQ08sR0FBTixHQUFZLFNBQVNBLEdBQVQsQ0FBYUMsUUFBYixFQUF1QjtBQUNqQyxTQUFPQyxPQUFPLENBQUNGLEdBQVIsQ0FBWUMsUUFBWixDQUFQO0FBQ0QsQ0FGRDs7QUFHQVIsS0FBSyxDQUFDVSxNQUFOLEdBQWVyQixtQkFBTyxDQUFDLElBQUQsQ0FBdEI7QUFFQXNCLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQlosS0FBakIsQyxDQUVBOztBQUNBVyxzQkFBQSxHQUF5QlgsS0FBekIiLCJmaWxlIjoiOTE2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9iaW5kJyk7XG52YXIgQXhpb3MgPSByZXF1aXJlKCcuL2NvcmUvQXhpb3MnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICogQHJldHVybiB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcbiAgdmFyIGNvbnRleHQgPSBuZXcgQXhpb3MoZGVmYXVsdENvbmZpZyk7XG4gIHZhciBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MucHJvdG90eXBlLCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGNvbnRleHQgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0KTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxudmFyIGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbmF4aW9zLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpbnN0YW5jZUNvbmZpZykge1xuICByZXR1cm4gY3JlYXRlSW5zdGFuY2UodXRpbHMubWVyZ2UoZGVmYXVsdHMsIGluc3RhbmNlQ29uZmlnKSk7XG59O1xuXG4vLyBFeHBvc2UgQ2FuY2VsICYgQ2FuY2VsVG9rZW5cbmF4aW9zLkNhbmNlbCA9IHJlcXVpcmUoJy4vY2FuY2VsL0NhbmNlbCcpO1xuYXhpb3MuQ2FuY2VsVG9rZW4gPSByZXF1aXJlKCcuL2NhbmNlbC9DYW5jZWxUb2tlbicpO1xuYXhpb3MuaXNDYW5jZWwgPSByZXF1aXJlKCcuL2NhbmNlbC9pc0NhbmNlbCcpO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuYXhpb3Muc3ByZWFkID0gcmVxdWlyZSgnLi9oZWxwZXJzL3NwcmVhZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGF4aW9zO1xuXG4vLyBBbGxvdyB1c2Ugb2YgZGVmYXVsdCBpbXBvcnQgc3ludGF4IGluIFR5cGVTY3JpcHRcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBheGlvcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///916\n");
/***/ }),
/***/ 4039:
/***/ ((module) => {
"use strict";
eval("\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\n\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\nmodule.exports = Cancel;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanM/ZmIzNCJdLCJuYW1lcyI6WyJDYW5jZWwiLCJtZXNzYWdlIiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJfX0NBTkNFTF9fIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQWE7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsU0FBU0EsTUFBVCxDQUFnQkMsT0FBaEIsRUFBeUI7QUFDdkIsT0FBS0EsT0FBTCxHQUFlQSxPQUFmO0FBQ0Q7O0FBRURELE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQkMsUUFBakIsR0FBNEIsU0FBU0EsUUFBVCxHQUFvQjtBQUM5QyxTQUFPLFlBQVksS0FBS0YsT0FBTCxHQUFlLE9BQU8sS0FBS0EsT0FBM0IsR0FBcUMsRUFBakQsQ0FBUDtBQUNELENBRkQ7O0FBSUFELE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQkUsVUFBakIsR0FBOEIsSUFBOUI7QUFFQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCTixNQUFqQiIsImZpbGUiOiI0MDM5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEEgYENhbmNlbGAgaXMgYW4gb2JqZWN0IHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGNhbmNlbGVkLlxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBDYW5jZWwobWVzc2FnZSkge1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xufVxuXG5DYW5jZWwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnQ2FuY2VsJyArICh0aGlzLm1lc3NhZ2UgPyAnOiAnICsgdGhpcy5tZXNzYWdlIDogJycpO1xufTtcblxuQ2FuY2VsLnByb3RvdHlwZS5fX0NBTkNFTF9fID0gdHJ1ZTtcblxubW9kdWxlLmV4cG9ydHMgPSBDYW5jZWw7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4039\n");
/***/ }),
/***/ 2648:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar Cancel = __webpack_require__(4039);\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\n\n\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\n\n\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n\n\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcz9lYzhkIl0sIm5hbWVzIjpbIkNhbmNlbCIsInJlcXVpcmUiLCJDYW5jZWxUb2tlbiIsImV4ZWN1dG9yIiwiVHlwZUVycm9yIiwicmVzb2x2ZVByb21pc2UiLCJwcm9taXNlIiwiUHJvbWlzZSIsInByb21pc2VFeGVjdXRvciIsInJlc29sdmUiLCJ0b2tlbiIsImNhbmNlbCIsIm1lc3NhZ2UiLCJyZWFzb24iLCJwcm90b3R5cGUiLCJ0aHJvd0lmUmVxdWVzdGVkIiwic291cmNlIiwiYyIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUlBLE1BQU0sR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQXBCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTQyxXQUFULENBQXFCQyxRQUFyQixFQUErQjtBQUM3QixNQUFJLE9BQU9BLFFBQVAsS0FBb0IsVUFBeEIsRUFBb0M7QUFDbEMsVUFBTSxJQUFJQyxTQUFKLENBQWMsOEJBQWQsQ0FBTjtBQUNEOztBQUVELE1BQUlDLGNBQUo7QUFDQSxPQUFLQyxPQUFMLEdBQWUsSUFBSUMsT0FBSixDQUFZLFNBQVNDLGVBQVQsQ0FBeUJDLE9BQXpCLEVBQWtDO0FBQzNESixrQkFBYyxHQUFHSSxPQUFqQjtBQUNELEdBRmMsQ0FBZjtBQUlBLE1BQUlDLEtBQUssR0FBRyxJQUFaO0FBQ0FQLFVBQVEsQ0FBQyxTQUFTUSxNQUFULENBQWdCQyxPQUFoQixFQUF5QjtBQUNoQyxRQUFJRixLQUFLLENBQUNHLE1BQVYsRUFBa0I7QUFDaEI7QUFDQTtBQUNEOztBQUVESCxTQUFLLENBQUNHLE1BQU4sR0FBZSxJQUFJYixNQUFKLENBQVdZLE9BQVgsQ0FBZjtBQUNBUCxrQkFBYyxDQUFDSyxLQUFLLENBQUNHLE1BQVAsQ0FBZDtBQUNELEdBUk8sQ0FBUjtBQVNEO0FBRUQ7QUFDQTtBQUNBOzs7QUFDQVgsV0FBVyxDQUFDWSxTQUFaLENBQXNCQyxnQkFBdEIsR0FBeUMsU0FBU0EsZ0JBQVQsR0FBNEI7QUFDbkUsTUFBSSxLQUFLRixNQUFULEVBQWlCO0FBQ2YsVUFBTSxLQUFLQSxNQUFYO0FBQ0Q7QUFDRixDQUpEO0FBTUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBWCxXQUFXLENBQUNjLE1BQVosR0FBcUIsU0FBU0EsTUFBVCxHQUFrQjtBQUNyQyxNQUFJTCxNQUFKO0FBQ0EsTUFBSUQsS0FBSyxHQUFHLElBQUlSLFdBQUosQ0FBZ0IsU0FBU0MsUUFBVCxDQUFrQmMsQ0FBbEIsRUFBcUI7QUFDL0NOLFVBQU0sR0FBR00sQ0FBVDtBQUNELEdBRlcsQ0FBWjtBQUdBLFNBQU87QUFDTFAsU0FBSyxFQUFFQSxLQURGO0FBRUxDLFVBQU0sRUFBRUE7QUFGSCxHQUFQO0FBSUQsQ0FURDs7QUFXQU8sTUFBTSxDQUFDQyxPQUFQLEdBQWlCakIsV0FBakIiLCJmaWxlIjoiMjY0OC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4vQ2FuY2VsJyk7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsVG9rZW4oZXhlY3V0b3IpIHtcbiAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHZhciByZXNvbHZlUHJvbWlzZTtcbiAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gIH0pO1xuXG4gIHZhciB0b2tlbiA9IHRoaXM7XG4gIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlKSB7XG4gICAgaWYgKHRva2VuLnJlYXNvbikge1xuICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbChtZXNzYWdlKTtcbiAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5DYW5jZWxUb2tlbi5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZCA9IGZ1bmN0aW9uIHRocm93SWZSZXF1ZXN0ZWQoKSB7XG4gIGlmICh0aGlzLnJlYXNvbikge1xuICAgIHRocm93IHRoaXMucmVhc29uO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBuZXcgYENhbmNlbFRva2VuYCBhbmQgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCxcbiAqIGNhbmNlbHMgdGhlIGBDYW5jZWxUb2tlbmAuXG4gKi9cbkNhbmNlbFRva2VuLnNvdXJjZSA9IGZ1bmN0aW9uIHNvdXJjZSgpIHtcbiAgdmFyIGNhbmNlbDtcbiAgdmFyIHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICBjYW5jZWwgPSBjO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB0b2tlbjogdG9rZW4sXG4gICAgY2FuY2VsOiBjYW5jZWxcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FuY2VsVG9rZW47XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2648\n");
/***/ }),
/***/ 328:
/***/ ((module) => {
"use strict";
eval("\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcz9lYWMwIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJpc0NhbmNlbCIsInZhbHVlIiwiX19DQU5DRUxfXyJdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWJBLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQixTQUFTQyxRQUFULENBQWtCQyxLQUFsQixFQUF5QjtBQUN4QyxTQUFPLENBQUMsRUFBRUEsS0FBSyxJQUFJQSxLQUFLLENBQUNDLFVBQWpCLENBQVI7QUFDRCxDQUZEIiwiZmlsZSI6IjMyOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///328\n");
/***/ }),
/***/ 2832:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar defaults = __webpack_require__(7414);\n\nvar utils = __webpack_require__(5457);\n\nvar InterceptorManager = __webpack_require__(9722);\n\nvar dispatchRequest = __webpack_require__(8187);\n\nvar isAbsoluteURL = __webpack_require__(2857);\n\nvar combineURLs = __webpack_require__(7700);\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\n\n\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\n\n\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = utils.merge({\n url: arguments[0]\n }, arguments[1]);\n }\n\n config = utils.merge(defaults, this.defaults, {\n method: 'get'\n }, config); // Support baseURL config\n\n if (config.baseURL && !isAbsoluteURL(config.url)) {\n config.url = combineURLs(config.baseURL, config.url);\n } // Hook up interceptors middleware\n\n\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n}; // Provide aliases for supported request methods\n\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function (url, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url\n }));\n };\n});\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function (url, data, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\nmodule.exports = Axios;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3MuanM/Y2Y4OSJdLCJuYW1lcyI6WyJkZWZhdWx0cyIsInJlcXVpcmUiLCJ1dGlscyIsIkludGVyY2VwdG9yTWFuYWdlciIsImRpc3BhdGNoUmVxdWVzdCIsImlzQWJzb2x1dGVVUkwiLCJjb21iaW5lVVJMcyIsIkF4aW9zIiwiaW5zdGFuY2VDb25maWciLCJpbnRlcmNlcHRvcnMiLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJwcm90b3R5cGUiLCJjb25maWciLCJtZXJnZSIsInVybCIsImFyZ3VtZW50cyIsIm1ldGhvZCIsImJhc2VVUkwiLCJjaGFpbiIsInVuZGVmaW5lZCIsInByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImZvckVhY2giLCJ1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyIsImludGVyY2VwdG9yIiwidW5zaGlmdCIsImZ1bGZpbGxlZCIsInJlamVjdGVkIiwicHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzIiwicHVzaCIsImxlbmd0aCIsInRoZW4iLCJzaGlmdCIsImZvckVhY2hNZXRob2ROb0RhdGEiLCJmb3JFYWNoTWV0aG9kV2l0aERhdGEiLCJkYXRhIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsSUFBSUEsUUFBUSxHQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsS0FBSyxHQUFHRCxtQkFBTyxDQUFDLElBQUQsQ0FBbkI7O0FBQ0EsSUFBSUUsa0JBQWtCLEdBQUdGLG1CQUFPLENBQUMsSUFBRCxDQUFoQzs7QUFDQSxJQUFJRyxlQUFlLEdBQUdILG1CQUFPLENBQUMsSUFBRCxDQUE3Qjs7QUFDQSxJQUFJSSxhQUFhLEdBQUdKLG1CQUFPLENBQUMsSUFBRCxDQUEzQjs7QUFDQSxJQUFJSyxXQUFXLEdBQUdMLG1CQUFPLENBQUMsSUFB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LE1BQS9CLEVBQXVDO0FBQzdFO0FBQ0FWLE9BQUssQ0FBQ0ssU0FBTixDQUFnQkssTUFBaEIsSUFBMEIsVUFBU0YsR0FBVCxFQUFjc0IsSUFBZCxFQUFvQnhCLE1BQXBCLEVBQTRCO0FBQ3BELFdBQU8sS0FBS0gsT0FBTCxDQUFhUixLQUFLLENBQUNZLEtBQU4sQ0FBWUQsTUFBTSxJQUFJLEVBQXRCLEVBQTBCO0FBQzVDSSxZQUFNLEVBQUVBLE1BRG9DO0FBRTVDRixTQUFHLEVBQUVBLEdBRnVDO0FBRzVDc0IsVUFBSSxFQUFFQTtBQUhzQyxLQUExQixDQUFiLENBQVA7QUFLRCxHQU5EO0FBT0QsQ0FURDtBQVdBQyxNQUFNLENBQUNDLE9BQVAsR0FBaUJoQyxLQUFqQiIsImZpbGUiOiIyODMyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLy4uL2RlZmF1bHRzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyID0gcmVxdWlyZSgnLi9JbnRlcmNlcHRvck1hbmFnZXInKTtcbnZhciBkaXNwYXRjaFJlcXVlc3QgPSByZXF1aXJlKCcuL2Rpc3BhdGNoUmVxdWVzdCcpO1xudmFyIGlzQWJzb2x1dGVVUkwgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTCcpO1xudmFyIGNvbWJpbmVVUkxzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2NvbWJpbmVVUkxzJyk7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlQ29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIEF4aW9zKGluc3RhbmNlQ29uZmlnKSB7XG4gIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZztcbiAgdGhpcy5pbnRlcmNlcHRvcnMgPSB7XG4gICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpLFxuICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKClcbiAgfTtcbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgc3BlY2lmaWMgZm9yIHRoaXMgcmVxdWVzdCAobWVyZ2VkIHdpdGggdGhpcy5kZWZhdWx0cylcbiAqL1xuQXhpb3MucHJvdG90eXBlLnJlcXVlc3QgPSBmdW5jdGlvbiByZXF1ZXN0KGNvbmZpZykge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgLy8gQWxsb3cgZm9yIGF4aW9zKCdleGFtcGxlL3VybCdbLCBjb25maWddKSBhIGxhIGZldGNoIEFQSVxuICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25maWcgPSB1dGlscy5tZXJnZSh7XG4gICAgICB1cmw6IGFyZ3VtZW50c1swXVxuICAgIH0sIGFyZ3VtZW50c1sxXSk7XG4gIH1cblxuICBjb25maWcgPSB1dGlscy5tZXJnZShkZWZhdWx0cywgdGhpcy5kZWZhdWx0cywgeyBtZXRob2Q6ICdnZXQnIH0sIGNvbmZpZyk7XG5cbiAgLy8gU3VwcG9ydCBiYXNlVVJMIGNvbmZpZ1xuICBpZiAoY29uZmlnLmJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwoY29uZmlnLnVybCkpIHtcbiAgICBjb25maWcudXJsID0gY29tYmluZVVSTHMoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwpO1xuICB9XG5cbiAgLy8gSG9vayB1cCBpbnRlcmNlcHRvcnMgbWlkZGxld2FyZVxuICB2YXIgY2hhaW4gPSBbZGlzcGF0Y2hSZXF1ZXN0LCB1bmRlZmluZWRdO1xuICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjb25maWcpO1xuXG4gIHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiB1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgIGNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gIH0pO1xuXG4gIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgY2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgd2hpbGUgKGNoYWluLmxlbmd0aCkge1xuICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oY2hhaW4uc2hpZnQoKSwgY2hhaW4uc2hpZnQoKSk7XG4gIH1cblxuICByZXR1cm4gcHJvbWlzZTtcbn07XG5cbi8vIFByb3ZpZGUgYWxpYXNlcyBmb3Igc3VwcG9ydGVkIHJlcXVlc3QgbWV0aG9kc1xudXRpbHMuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCh1dGlscy5tZXJnZShjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgdXJsOiB1cmxcbiAgICB9KSk7XG4gIH07XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGRhdGEsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QodXRpbHMubWVyZ2UoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pKTtcbiAgfTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF4aW9zO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2832\n");
/***/ }),
/***/ 9722:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(5457);\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n\n\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n};\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\n\n\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\n\n\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzP2E2YmIiXSwibmFtZXMiOlsidXRpbHMiLCJyZXF1aXJlIiwiSW50ZXJjZXB0b3JNYW5hZ2VyIiwiaGFuZGxlcnMiLCJwcm90b3R5cGUiLCJ1c2UiLCJmdWxmaWxsZWQiLCJyZWplY3RlZCIsInB1c2giLCJsZW5ndGgiLCJlamVjdCIsImlkIiwiZm9yRWFjaCIsImZuIiwiZm9yRWFjaEhhbmRsZXIiLCJoIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsSUFBSUEsS0FBSyxHQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBbkI7O0FBRUEsU0FBU0Msa0JBQVQsR0FBOEI7QUFDNUIsT0FBS0MsUUFBTCxHQUFnQixFQUFoQjtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0FELGtCQUFrQixDQUFDRSxTQUFuQixDQUE2QkMsR0FBN0IsR0FBbUMsU0FBU0EsR0FBVCxDQUFhQyxTQUFiLEVBQXdCQyxRQUF4QixFQUFrQztBQUNuRSxPQUFLSixRQUFMLENBQWNLLElBQWQsQ0FBbUI7QUFDakJGLGFBQVMsRUFBRUEsU0FETTtBQUVqQkMsWUFBUSxFQUFFQTtBQUZPLEdBQW5CO0FBSUEsU0FBTyxLQUFLSixRQUFMLENBQWNNLE1BQWQsR0FBdUIsQ0FBOUI7QUFDRCxDQU5EO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0FQLGtCQUFrQixDQUFDRSxTQUFuQixDQUE2Qk0sS0FBN0IsR0FBcUMsU0FBU0EsS0FBVCxDQUFlQyxFQUFmLEVBQW1CO0FBQ3RELE1BQUksS0FBS1IsUUFBTCxDQUFjUSxFQUFkLENBQUosRUFBdUI7QUFDckIsU0FBS1IsUUFBTCxDQUFjUSxFQUFkLElBQW9CLElBQXBCO0FBQ0Q7QUFDRixDQUpEO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0FULGtCQUFrQixDQUFDRSxTQUFuQixDQUE2QlEsT0FBN0IsR0FBdUMsU0FBU0EsT0FBVCxDQUFpQkMsRUFBakIsRUFBcUI7QUFDMURiLE9BQUssQ0FBQ1ksT0FBTixDQUFjLEtBQUtULFFBQW5CLEVBQTZCLFNBQVNXLGNBQVQsQ0FBd0JDLENBQXhCLEVBQTJCO0FBQ3RELFFBQUlBLENBQUMsS0FBSyxJQUFWLEVBQWdCO0FBQ2RGLFFBQUUsQ0FBQ0UsQ0FBRCxDQUFGO0FBQ0Q7QUFDRixHQUpEO0FBS0QsQ0FORDs7QUFRQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCZixrQkFBakIiLCJmaWxlIjoiOTcyMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBJbnRlcmNlcHRvck1hbmFnZXIoKSB7XG4gIHRoaXMuaGFuZGxlcnMgPSBbXTtcbn1cblxuLyoqXG4gKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCxcbiAgICByZWplY3RlZDogcmVqZWN0ZWRcbiAgfSk7XG4gIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5lamVjdCA9IGZ1bmN0aW9uIGVqZWN0KGlkKSB7XG4gIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgfVxufTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7XG4gIHV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICBmbihoKTtcbiAgICB9XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbnRlcmNlcHRvck1hbmFnZXI7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9722\n");
/***/ }),
/***/ 9723:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar enhanceError = __webpack_require__(9343);\n/**\n * Create an Error with the specified message, config, error code, and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n @ @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\n\n\nmodule.exports = function createError(message, config, code, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, response);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvY3JlYXRlRXJyb3IuanM/N2EwYiJdLCJuYW1lcyI6WyJlbmhhbmNlRXJyb3IiLCJyZXF1aXJlIiwibW9kdWxlIiwiZXhwb3J0cyIsImNyZWF0ZUVycm9yIiwibWVzc2FnZSIsImNvbmZpZyIsImNvZGUiLCJyZXNwb25zZSIsImVycm9yIiwiRXJyb3IiXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUlBLFlBQVksR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQTFCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCLFNBQVNDLFdBQVQsQ0FBcUJDLE9BQXJCLEVBQThCQyxNQUE5QixFQUFzQ0MsSUFBdEMsRUFBNENDLFFBQTVDLEVBQXNEO0FBQ3JFLE1BQUlDLEtBQUssR0FBRyxJQUFJQyxLQUFKLENBQVVMLE9BQVYsQ0FBWjtBQUNBLFNBQU9MLFlBQVksQ0FBQ1MsS0FBRCxFQUFRSCxNQUFSLEVBQWdCQyxJQUFoQixFQUFzQkMsUUFBdEIsQ0FBbkI7QUFDRCxDQUhEIiwiZmlsZSI6Ijk3MjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBlbmhhbmNlRXJyb3IgPSByZXF1aXJlKCcuL2VuaGFuY2VFcnJvcicpO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBFcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSwgY29uZmlnLCBlcnJvciBjb2RlLCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuIEAgQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxuICogQHJldHVybnMge0Vycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGVFcnJvcihtZXNzYWdlLCBjb25maWcsIGNvZGUsIHJlc3BvbnNlKSB7XG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGVuaGFuY2VFcnJvcihlcnJvciwgY29uZmlnLCBjb2RlLCByZXNwb25zZSk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9723\n");
/***/ }),
/***/ 8187:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(5457);\n\nvar transformData = __webpack_require__(489);\n\nvar isCancel = __webpack_require__(328);\n\nvar defaults = __webpack_require__(7414);\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\n\n\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\n\n\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config); // Ensure headers exist\n\n config.headers = config.headers || {}; // Transform request data\n\n config.data = transformData(config.data, config.headers, config.transformRequest); // Flatten headers\n\n config.headers = utils.merge(config.headers.common || {}, config.headers[config.method] || {}, config.headers || {});\n utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], function cleanHeaderConfig(method) {\n delete config.headers[method];\n });\n var adapter = config.adapter || defaults.adapter;\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config); // Transform response data\n\n response.data = transformData(response.data, response.headers, config.transformResponse);\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config); // Transform response data\n\n if (reason && reason.response) {\n reason.response.data = transformData(reason.response.data, reason.response.headers, config.transformResponse);\n }\n }\n\n return Promise.reject(reason);\n });\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzPzZmZWYiXSwibmFtZXMiOlsidXRpbHMiLCJyZXF1aXJlIiwidHJhbnNmb3JtRGF0YSIsImlzQ2FuY2VsIiwiZGVmYXVsdHMiLCJ0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkIiwiY29uZmlnIiwiY2FuY2VsVG9rZW4iLCJ0aHJvd0lmUmVxdWVzdGVkIiwibW9kdWxlIiwiZXhwb3J0cyIsImRpc3BhdGNoUmVxdWVzdCIsImhlYWRlcnMiLCJkYXRhIiwidHJhbnNmb3JtUmVxdWVzdCIsIm1lcmdlIiwiY29tbW9uIiwibWV0aG9kIiwiZm9yRWFjaCIsImNsZWFuSGVhZGVyQ29uZmlnIiwiYWRhcHRlciIsInRoZW4iLCJvbkFkYXB0ZXJSZXNvbHV0aW9uIiwicmVzcG9uc2UiLCJ0cmFuc2Zvcm1SZXNwb25zZSIsIm9uQWRhcHRlclJlamVjdGlvbiIsInJlYXNvbiIsIlByb21pc2UiLCJyZWplY3QiXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUlBLEtBQUssR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQW5COztBQUNBLElBQUlDLGFBQWEsR0FBR0QsbUJBQU8sQ0FBQyxHQUFELENBQTNCOztBQUNBLElBQUlFLFFBQVEsR0FBR0YsbUJBQU8sQ0FBQyxHQUFELENBQXRCOztBQUNBLElBQUlHLFFBQVEsR0FBR0gsbUJBQU8sQ0FBQyxJQUFELENBQXRCO0FBRUE7QUFDQTtBQUNBOzs7QUFDQSxTQUFTSSw0QkFBVCxDQUFzQ0MsTUFBdEMsRUFBOEM7QUFDNUMsTUFBSUEsTUFBTSxDQUFDQyxXQUFYLEVBQXdCO0FBQ3RCRCxVQUFNLENBQUNDLFdBQVAsQ0FBbUJDLGdCQUFuQjtBQUNEO0FBQ0Y7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBQyxNQUFNLENBQUNDLE9BQVAsR0FBaUIsU0FBU0MsZUFBVCxDQUF5QkwsTUFBekIsRUFBaUM7QUFDaERELDhCQUE0QixDQUFDQyxNQUFELENBQTVCLENBRGdELENBR2hEOztBQUNBQSxRQUFNLENBQUNNLE9BQVAsR0FBaUJOLE1BQU0sQ0FBQ00sT0FBUCxJQUFrQixFQUFuQyxDQUpnRCxDQU1oRDs7QUFDQU4sUUFBTSxDQUFDTyxJQUFQLEdBQWNYLGFBQWEsQ0FDekJJLE1BQU0sQ0FBQ08sSUFEa0IsRUFFekJQLE1BQU0sQ0FBQ00sT0FGa0IsRUFHekJOLE1BQU0sQ0FBQ1EsZ0JBSGtCLENBQTNCLENBUGdELENBYWhEOztBQUNBUixRQUFNLENBQUNNLE9BQVAsR0FBaUJaLEtBQUssQ0FBQ2UsS0FBTixDQUNmVCxNQUFNLENBQUNNLE9BQVAsQ0FBZUksTUFBZixJQUF5QixFQURWLEVBRWZWLE1BQU0sQ0FBQ00sT0FBUCxDQUFlTixNQUFNLENBQUNXLE1BQXRCLEtBQWlDLEVBRmxCLEVBR2ZYLE1BQU0sQ0FBQ00sT0FBUCxJQUFrQixFQUhILENBQWpCO0FBTUFaLE9BQUssQ0FBQ2tCLE9BQU4sQ0FDRSxDQUFDLFFBQUQsRUFBVyxLQUFYLEVBQWtCLE1BQWxCLEVBQTBCLE1BQTFCLEVBQWtDLEtBQWxDLEVBQXlDLE9BQXpDLEVBQWtELFFBQWxELENBREYsRUFFRSxTQUFTQyxpQkFBVCxDQUEyQkYsTUFBM0IsRUFBbUM7QUFDakMsV0FBT1gsTUFBTSxDQUFDTSxPQUFQLENBQWVLLE1BQWYsQ0FBUDtBQUNELEdBSkg7QUFPQSxNQUFJRyxPQUFPLEdBQUdkLE1BQU0sQ0FBQ2MsT0FBUCxJQUFrQmhCLFFBQVEsQ0FBQ2dCLE9BQXpDO0FBRUEsU0FBT0EsT0FBTyxDQUFDZCxNQUFELENBQVAsQ0FBZ0JlLElBQWhCLENBQXFCLFNBQVNDLG1CQUFULENBQTZCQyxRQUE3QixFQUF1QztBQUNqRWxCLGdDQUE0QixDQUFDQyxNQUFELENBQTVCLENBRGlFLENBR2pFOztBQUNBaUIsWUFBUSxDQUFDVixJQUFULEdBQWdCWCxhQUFhLENBQzNCcUIsUUFBUSxDQUFDVixJQURrQixFQUUzQlUsUUFBUSxDQUFDWCxPQUZrQixFQUczQk4sTUFBTSxDQUFDa0IsaUJBSG9CLENBQTdCO0FBTUEsV0FBT0QsUUFBUDtBQUNELEdBWE0sRUFXSixTQUFTRSxrQkFBVCxDQUE0QkMsTUFBNUIsRUFBb0M7QUFDckMsUUFBSSxDQUFDdkIsUUFBUSxDQUFDdUIsTUFBRCxDQUFiLEVBQXVCO0FBQ3JCckIsa0NBQTRCLENBQUNDLE1BQUQsQ0FBNUIsQ0FEcUIsQ0FHckI7O0FBQ0EsVUFBSW9CLE1BQU0sSUFBSUEsTUFBTSxDQUFDSCxRQUFyQixFQUErQjtBQUM3QkcsY0FBTSxDQUFDSCxRQUFQLENBQWdCVixJQUFoQixHQUF1QlgsYUFBYSxDQUNsQ3dCLE1BQU0sQ0FBQ0gsUUFBUCxDQUFnQlYsSUFEa0IsRUFFbENhLE1BQU0sQ0FBQ0gsUUFBUCxDQUFnQlgsT0FGa0IsRUFHbENOLE1BQU0sQ0FBQ2tCLGlCQUgyQixDQUFwQztBQUtEO0FBQ0Y7O0FBRUQsV0FBT0csT0FBTyxDQUFDQyxNQUFSLENBQWVGLE1BQWYsQ0FBUDtBQUNELEdBMUJNLENBQVA7QUEyQkQsQ0F4REQiLCJmaWxlIjoiODE4Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIHRyYW5zZm9ybURhdGEgPSByZXF1aXJlKCcuL3RyYW5zZm9ybURhdGEnKTtcbnZhciBpc0NhbmNlbCA9IHJlcXVpcmUoJy4uL2NhbmNlbC9pc0NhbmNlbCcpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi4vZGVmYXVsdHMnKTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAvLyBFbnN1cmUgaGVhZGVycyBleGlzdFxuICBjb25maWcuaGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzIHx8IHt9O1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgIGNvbmZpZy5kYXRhLFxuICAgIGNvbmZpZy5oZWFkZXJzLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gIGNvbmZpZy5oZWFkZXJzID0gdXRpbHMubWVyZ2UoXG4gICAgY29uZmlnLmhlYWRlcnMuY29tbW9uIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzW2NvbmZpZy5tZXRob2RdIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzIHx8IHt9XG4gICk7XG5cbiAgdXRpbHMuZm9yRWFjaChcbiAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICBmdW5jdGlvbiBjbGVhbkhlYWRlckNvbmZpZyhtZXRob2QpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuaGVhZGVyc1ttZXRob2RdO1xuICAgIH1cbiAgKTtcblxuICB2YXIgYWRhcHRlciA9IGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXI7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgICAgcmVzcG9uc2UuZGF0YSxcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8187\n");
/***/ }),
/***/ 9343:
/***/ ((module) => {
"use strict";
eval("\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n @ @param {Object} [response] The response.\n * @returns {Error} The error.\n */\n\nmodule.exports = function enhanceError(error, config, code, response) {\n error.config = config;\n\n if (code) {\n error.code = code;\n }\n\n error.response = response;\n return error;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZW5oYW5jZUVycm9yLmpzPzZhNWEiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsImVuaGFuY2VFcnJvciIsImVycm9yIiwiY29uZmlnIiwiY29kZSIsInJlc3BvbnNlIl0sIm1hcHBpbmdzIjoiQUFBYTtBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQUEsTUFBTSxDQUFDQyxPQUFQLEdBQWlCLFNBQVNDLFlBQVQsQ0FBc0JDLEtBQXRCLEVBQTZCQyxNQUE3QixFQUFxQ0MsSUFBckMsRUFBMkNDLFFBQTNDLEVBQXFEO0FBQ3BFSCxPQUFLLENBQUNDLE1BQU4sR0FBZUEsTUFBZjs7QUFDQSxNQUFJQyxJQUFKLEVBQVU7QUFDUkYsU0FBSyxDQUFDRSxJQUFOLEdBQWFBLElBQWI7QUFDRDs7QUFDREYsT0FBSyxDQUFDRyxRQUFOLEdBQWlCQSxRQUFqQjtBQUNBLFNBQU9ILEtBQVA7QUFDRCxDQVBEIiwiZmlsZSI6IjkzNDMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXBkYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWcsIGVycm9yIGNvZGUsIGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBUaGUgZXJyb3IgdG8gdXBkYXRlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiBAIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGVycm9yLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVuaGFuY2VFcnJvcihlcnJvciwgY29uZmlnLCBjb2RlLCByZXNwb25zZSkge1xuICBlcnJvci5jb25maWcgPSBjb25maWc7XG4gIGlmIChjb2RlKSB7XG4gICAgZXJyb3IuY29kZSA9IGNvZGU7XG4gIH1cbiAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgcmV0dXJuIGVycm9yO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9343\n");
/***/ }),
/***/ 4662:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar createError = __webpack_require__(9723);\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\n\n\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus; // Note: status is not exposed by XDomainRequest\n\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError('Request failed with status code ' + response.status, response.config, null, response));\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzP2YyMjIiXSwibmFtZXMiOlsiY3JlYXRlRXJyb3IiLCJyZXF1aXJlIiwibW9kdWxlIiwiZXhwb3J0cyIsInNldHRsZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZXNwb25zZSIsInZhbGlkYXRlU3RhdHVzIiwiY29uZmlnIiwic3RhdHVzIl0sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJQSxXQUFXLEdBQUdDLG1CQUFPLENBQUMsSUFBRCxDQUF6QjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCLFNBQVNDLE1BQVQsQ0FBZ0JDLE9BQWhCLEVBQXlCQyxNQUF6QixFQUFpQ0MsUUFBakMsRUFBMkM7QUFDMUQsTUFBSUMsY0FBYyxHQUFHRCxRQUFRLENBQUNFLE1BQVQsQ0FBZ0JELGNBQXJDLENBRDBELENBRTFEOztBQUNBLE1BQUksQ0FBQ0QsUUFBUSxDQUFDRyxNQUFWLElBQW9CLENBQUNGLGNBQXJCLElBQXVDQSxjQUFjLENBQUNELFFBQVEsQ0FBQ0csTUFBVixDQUF6RCxFQUE0RTtBQUMxRUwsV0FBTyxDQUFDRSxRQUFELENBQVA7QUFDRCxHQUZELE1BRU87QUFDTEQsVUFBTSxDQUFDTixXQUFXLENBQ2hCLHFDQUFxQ08sUUFBUSxDQUFDRyxNQUQ5QixFQUVoQkgsUUFBUSxDQUFDRSxNQUZPLEVBR2hCLElBSGdCLEVBSWhCRixRQUpnQixDQUFaLENBQU47QUFNRDtBQUNGLENBYkQiLCJmaWxlIjoiNDY2Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnLi9jcmVhdGVFcnJvcicpO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIHZhciB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgLy8gTm90ZTogc3RhdHVzIGlzIG5vdCBleHBvc2VkIGJ5IFhEb21haW5SZXF1ZXN0XG4gIGlmICghcmVzcG9uc2Uuc3RhdHVzIHx8ICF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KGNyZWF0ZUVycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIG51bGwsXG4gICAgICByZXNwb25zZVxuICAgICkpO1xuICB9XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4662\n");
/***/ }),
/***/ 489:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(5457);\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\n\n\nmodule.exports = function transformData(data, headers, fns) {\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n return data;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcz9lYzI5Il0sIm5hbWVzIjpbInV0aWxzIiwicmVxdWlyZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJ0cmFuc2Zvcm1EYXRhIiwiZGF0YSIsImhlYWRlcnMiLCJmbnMiLCJmb3JFYWNoIiwidHJhbnNmb3JtIiwiZm4iXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUlBLEtBQUssR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQW5CO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0FDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQixTQUFTQyxhQUFULENBQXVCQyxJQUF2QixFQUE2QkMsT0FBN0IsRUFBc0NDLEdBQXRDLEVBQTJDO0FBQzFEO0FBQ0FQLE9BQUssQ0FBQ1EsT0FBTixDQUFjRCxHQUFkLEVBQW1CLFNBQVNFLFNBQVQsQ0FBbUJDLEVBQW5CLEVBQXVCO0FBQ3hDTCxRQUFJLEdBQUdLLEVBQUUsQ0FBQ0wsSUFBRCxFQUFPQyxPQUFQLENBQVQ7QUFDRCxHQUZEO0FBSUEsU0FBT0QsSUFBUDtBQUNELENBUEQiLCJmaWxlIjoiNDg5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBiZSB0cmFuc2Zvcm1lZFxuICogQHBhcmFtIHtBcnJheX0gaGVhZGVycyBUaGUgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2VcbiAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGRhdGEsIGhlYWRlcnMsIGZucykge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgdXRpbHMuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIGRhdGEgPSBmbihkYXRhLCBoZWFkZXJzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///489\n");
/***/ }),
/***/ 7414:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(5457);\n\nvar normalizeHeaderName = __webpack_require__(4026);\n\nvar PROTECTION_PREFIX = /^\\)\\]\\}',?\\n/;\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = __webpack_require__(3721);\n } else if (typeof process !== 'undefined') {\n // For node use HTTP adapter\n adapter = __webpack_require__(3721);\n }\n\n return adapter;\n}\n\nvar defaults = {\n adapter: getDefaultAdapter(),\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Content-Type');\n\n if (utils.isFormData(data) || utils.isArrayBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data)) {\n return data;\n }\n\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n\n if (utils.isObject(data)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n\n return data;\n }],\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n data = data.replace(PROTECTION_PREFIX, '');\n\n try {\n data = JSON.parse(data);\n } catch (e) {\n /* Ignore */\n }\n }\n\n return data;\n }],\n timeout: 0,\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n maxContentLength: -1,\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\nutils.forEach(['delete', 'get', 'head'], function forEachMehtodNoData(method) {\n defaults.headers[method] = {};\n});\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\nmodule.exports = defaults;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzPzYwZmMiXSwibmFtZXMiOlsidXRpbHMiLCJyZXF1aXJlIiwibm9ybWFsaXplSGVhZGVyTmFtZSIsIlBST1RFQ1RJT05fUFJFRklYIiwiREVGQVVMVF9DT05URU5UX1RZUEUiLCJzZXRDb250ZW50VHlwZUlmVW5zZXQiLCJoZWFkZXJzIiwidmFsdWUiLCJpc1VuZGVmaW5lZCIsImdldERlZmF1bHRBZGFwdGVyIiwiYWRhcHRlciIsIlhNTEh0dHBSZXF1ZXN0IiwicHJvY2VzcyIsImRlZmF1bHRzIiwidHJhbnNmb3JtUmVxdWVzdCIsImRhdGEiLCJpc0Zvcm1EYXRhIiwiaXNBcnJheUJ1ZmZlciIsImlzU3RyZWFtIiwiaXNGaWxlIiwiaXNCbG9iIiwiaXNBcnJheUJ1ZmZlclZpZXciLCJidWZmZXIiLCJpc1VSTFNlYXJjaFBhcmFtcyIsInRvU3RyaW5nIiwiaXNPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5IiwidHJhbnNmb3JtUmVzcG9uc2UiLCJyZXBsYWNlIiwicGFyc2UiLCJlIiwidGltZW91dCIsInhzcmZDb29raWVOYW1lIiwieHNyZkhlYWRlck5hbWUiLCJtYXhDb250ZW50TGVuZ3RoIiwidmFsaWRhdGVTdGF0dXMiLCJzdGF0dXMiLCJjb21tb24iLCJmb3JFYWNoIiwiZm9yRWFjaE1laHRvZE5vRGF0YSIsIm1ldGhvZCIsImZvckVhY2hNZXRob2RXaXRoRGF0YSIsIm1lcmdlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsSUFBSUEsS0FBSyxHQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBbkI7O0FBQ0EsSUFBSUMsbUJBQW1CLEdBQUdELG1CQUFPLENBQUMsSUFBRCxDQUFqQzs7QUFFQSxJQUFJRSxpQkFBaUIsR0FBRyxjQUF4QjtBQUNBLElBQUlDLG9CQUFvQixHQUFH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UUFBUSxDQUFDUCxPQUFULEdBQW1CO0FBQ2pCZ0MsUUFBTSxFQUFFO0FBQ04sY0FBVTtBQURKO0FBRFMsQ0FBbkI7QUFNQXRDLEtBQUssQ0FBQ3VDLE9BQU4sQ0FBYyxDQUFDLFFBQUQsRUFBVyxLQUFYLEVBQWtCLE1BQWxCLENBQWQsRUFBeUMsU0FBU0MsbUJBQVQsQ0FBNkJDLE1BQTdCLEVBQXFDO0FBQzVFNUIsVUFBUSxDQUFDUCxPQUFULENBQWlCbUMsTUFBakIsSUFBMkIsRUFBM0I7QUFDRCxDQUZEO0FBSUF6QyxLQUFLLENBQUN1QyxPQUFOLENBQWMsQ0FBQyxNQUFELEVBQVMsS0FBVCxFQUFnQixPQUFoQixDQUFkLEVBQXdDLFNBQVNHLHFCQUFULENBQStCRCxNQUEvQixFQUF1QztBQUM3RTVCLFVBQVEsQ0FBQ1AsT0FBVCxDQUFpQm1DLE1BQWpCLElBQTJCekMsS0FBSyxDQUFDMkMsS0FBTixDQUFZdkMsb0JBQVosQ0FBM0I7QUFDRCxDQUZEO0FBSUF3QyxNQUFNLENBQUNDLE9BQVAsR0FBaUJoQyxRQUFqQiIsImZpbGUiOiI3NDE0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgbm9ybWFsaXplSGVhZGVyTmFtZSA9IHJlcXVpcmUoJy4vaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lJyk7XG5cbnZhciBQUk9URUNUSU9OX1BSRUZJWCA9IC9eXFwpXFxdXFx9Jyw/XFxuLztcbnZhciBERUZBVUxUX0NPTlRFTlRfVFlQRSA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG59O1xuXG5mdW5jdGlvbiBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgdmFsdWUpIHtcbiAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzKSAmJiB1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzWydDb250ZW50LVR5cGUnXSkpIHtcbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRBZGFwdGVyKCkge1xuICB2YXIgYWRhcHRlcjtcbiAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBGb3IgYnJvd3NlcnMgdXNlIFhIUiBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4vYWRhcHRlcnMveGhyJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gRm9yIG5vZGUgdXNlIEhUVFAgYWRhcHRlclxuICAgIGFkYXB0ZXIgPSByZXF1aXJlKCcuL2FkYXB0ZXJzL2h0dHAnKTtcbiAgfVxuICByZXR1cm4gYWRhcHRlcjtcbn1cblxudmFyIGRlZmF1bHRzID0ge1xuICBhZGFwdGVyOiBnZXREZWZhdWx0QWRhcHRlcigpLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKTtcbiAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNTdHJlYW0oZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzRmlsZShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCbG9iKGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhkYXRhKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcpO1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZShQUk9URUNUSU9OX1BSRUZJWCwgJycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIElnbm9yZSAqLyB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcblxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xuICB9XG59O1xuXG5kZWZhdWx0cy5oZWFkZXJzID0ge1xuICBjb21tb246IHtcbiAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcbiAgfVxufTtcblxudXRpbHMuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCddLCBmdW5jdGlvbiBmb3JFYWNoTWVodG9kTm9EYXRhKG1ldGhvZCkge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB7fTtcbn0pO1xuXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB1dGlscy5tZXJnZShERUZBVUxUX0NPTlRFTlRfVFlQRSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZhdWx0cztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7414\n");
/***/ }),
/***/ 7823:
/***/ ((module) => {
"use strict";
eval("\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n\n return fn.apply(thisArg, args);\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcz9hMjYzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJiaW5kIiwiZm4iLCJ0aGlzQXJnIiwid3JhcCIsImFyZ3MiLCJBcnJheSIsImFyZ3VtZW50cyIsImxlbmd0aCIsImkiLCJhcHBseSJdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWJBLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQixTQUFTQyxJQUFULENBQWNDLEVBQWQsRUFBa0JDLE9BQWxCLEVBQTJCO0FBQzFDLFNBQU8sU0FBU0MsSUFBVCxHQUFnQjtBQUNyQixRQUFJQyxJQUFJLEdBQUcsSUFBSUMsS0FBSixDQUFVQyxTQUFTLENBQUNDLE1BQXBCLENBQVg7O0FBQ0EsU0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHSixJQUFJLENBQUNHLE1BQXpCLEVBQWlDQyxDQUFDLEVBQWxDLEVBQXNDO0FBQ3BDSixVQUFJLENBQUNJLENBQUQsQ0FBSixHQUFVRixTQUFTLENBQUNFLENBQUQsQ0FBbkI7QUFDRDs7QUFDRCxXQUFPUCxFQUFFLENBQUNRLEtBQUgsQ0FBU1AsT0FBVCxFQUFrQkUsSUFBbEIsQ0FBUDtBQUNELEdBTkQ7QUFPRCxDQVJEIiwiZmlsZSI6Ijc4MjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7823\n");
/***/ }),
/***/ 431:
/***/ ((module) => {
"use strict";
eval(" // btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js\n\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\nfunction E() {\n this.message = 'String contains an invalid character';\n}\n\nE.prototype = new Error();\nE.prototype.code = 5;\nE.prototype.name = 'InvalidCharacterError';\n\nfunction btoa(input) {\n var str = String(input);\n var output = '';\n\n for ( // initialize result and counter\n var block, charCode, idx = 0, map = chars; // if the next str index does not exist:\n // change the mapping table to \"=\"\n // check if d has no fractional digits\n str.charAt(idx | 0) || (map = '=', idx % 1); // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n output += map.charAt(63 & block >> 8 - idx % 1 * 8)) {\n charCode = str.charCodeAt(idx += 3 / 4);\n\n if (charCode > 0xFF) {\n throw new E();\n }\n\n block = block << 8 | charCode;\n }\n\n return output;\n}\n\nmodule.exports = btoa;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnRvYS5qcz9kODMzIl0sIm5hbWVzIjpbImNoYXJzIiwiRSIsIm1lc3NhZ2UiLCJwcm90b3R5cGUiLCJFcnJvciIsImNvZGUiLCJuYW1lIiwiYnRvYSIsImlucHV0Iiwic3RyIiwiU3RyaW5nIiwib3V0cHV0IiwiYmxvY2siLCJjaGFyQ29kZSIsImlkeCIsIm1hcCIsImNoYXJBdCIsImNoYXJDb2RlQXQiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQ0FFQTs7QUFFQSxJQUFJQSxLQUFLLEdBQUcsbUVBQVo7O0FBRUEsU0FBU0MsQ0FBVCxHQUFhO0FBQ1gsT0FBS0MsT0FBTCxHQUFlLHNDQUFmO0FBQ0Q7O0FBQ0RELENBQUMsQ0FBQ0UsU0FBRixHQUFjLElBQUlDLEtBQUosRUFBZDtBQUNBSCxDQUFDLENBQUNFLFNBQUYsQ0FBWUUsSUFBWixHQUFtQixDQUFuQjtBQUNBSixDQUFDLENBQUNFLFNBQUYsQ0FBWUcsSUFBWixHQUFtQix1QkFBbkI7O0FBRUEsU0FBU0MsSUFBVCxDQUFjQyxLQUFkLEVBQXFCO0FBQ25CLE1BQUlDLEdBQUcsR0FBR0MsTUFBTSxDQUFDRixLQUFELENBQWhCO0FBQ0EsTUFBSUcsTUFBTSxHQUFHLEVBQWI7O0FBQ0EsUUFDRTtBQUNBLE1BQUlDLEtBQUosRUFBV0MsUUFBWCxFQUFxQkMsR0FBRyxHQUFHLENBQTNCLEVBQThCQyxHQUFHLEdBQUdmLEtBRnRDLEVBR0U7QUFDQTtBQUNBO0FBQ0FTLEtBQUcsQ0FBQ08sTUFBSixDQUFXRixHQUFHLEdBQUcsQ0FBakIsTUFBd0JDLEdBQUcsR0FBRyxHQUFOLEVBQVdELEdBQUcsR0FBRyxDQUF6QyxDQU5GLEVBT0U7QUFDQUgsUUFBTSxJQUFJSSxHQUFHLENBQUNDLE1BQUosQ0FBVyxLQUFLSixLQUFLLElBQUksSUFBSUUsR0FBRyxHQUFHLENBQU4sR0FBVSxDQUF2QyxDQVJaLEVBU0U7QUFDQUQsWUFBUSxHQUFHSixHQUFHLENBQUNRLFVBQUosQ0FBZUgsR0FBRyxJQUFJLElBQUksQ0FBMUIsQ0FBWDs7QUFDQSxRQUFJRCxRQUFRLEdBQUcsSUFBZixFQUFxQjtBQUNuQixZQUFNLElBQUlaLENBQUosRUFBTjtBQUNEOztBQUNEVyxTQUFLLEdBQUdBLEtBQUssSUFBSSxDQUFULEdBQWFDLFFBQXJCO0FBQ0Q7O0FBQ0QsU0FBT0YsTUFBUDtBQUNEOztBQUVETyxNQUFNLENBQUNDLE9BQVAsR0FBaUJaLElBQWpCIiwiZmlsZSI6IjQzMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gYnRvYSBwb2x5ZmlsbCBmb3IgSUU8MTAgY291cnRlc3kgaHR0cHM6Ly9naXRodWIuY29tL2RhdmlkY2hhbWJlcnMvQmFzZTY0LmpzXG5cbnZhciBjaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XG5cbmZ1bmN0aW9uIEUoKSB7XG4gIHRoaXMubWVzc2FnZSA9ICdTdHJpbmcgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXInO1xufVxuRS5wcm90b3R5cGUgPSBuZXcgRXJyb3I7XG5FLnByb3RvdHlwZS5jb2RlID0gNTtcbkUucHJvdG90eXBlLm5hbWUgPSAnSW52YWxpZENoYXJhY3RlckVycm9yJztcblxuZnVuY3Rpb24gYnRvYShpbnB1dCkge1xuICB2YXIgc3RyID0gU3RyaW5nKGlucHV0KTtcbiAgdmFyIG91dHB1dCA9ICcnO1xuICBmb3IgKFxuICAgIC8vIGluaXRpYWxpemUgcmVzdWx0IGFuZCBjb3VudGVyXG4gICAgdmFyIGJsb2NrLCBjaGFyQ29kZSwgaWR4ID0gMCwgbWFwID0gY2hhcnM7XG4gICAgLy8gaWYgdGhlIG5leHQgc3RyIGluZGV4IGRvZXMgbm90IGV4aXN0OlxuICAgIC8vICAgY2hhbmdlIHRoZSBtYXBwaW5nIHRhYmxlIHRvIFwiPVwiXG4gICAgLy8gICBjaGVjayBpZiBkIGhhcyBubyBmcmFjdGlvbmFsIGRpZ2l0c1xuICAgIHN0ci5jaGFyQXQoaWR4IHwgMCkgfHwgKG1hcCA9ICc9JywgaWR4ICUgMSk7XG4gICAgLy8gXCI4IC0gaWR4ICUgMSAqIDhcIiBnZW5lcmF0ZXMgdGhlIHNlcXVlbmNlIDIsIDQsIDYsIDhcbiAgICBvdXRwdXQgKz0gbWFwLmNoYXJBdCg2MyAmIGJsb2NrID4+IDggLSBpZHggJSAxICogOClcbiAgKSB7XG4gICAgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpZHggKz0gMyAvIDQpO1xuICAgIGlmIChjaGFyQ29kZSA+IDB4RkYpIHtcbiAgICAgIHRocm93IG5ldyBFKCk7XG4gICAgfVxuICAgIGJsb2NrID0gYmxvY2sgPDwgOCB8IGNoYXJDb2RlO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYnRvYTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///431\n");
/***/ }),
/***/ 8383:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(5457);\n\nfunction encode(val) {\n return encodeURIComponent(val).replace(/%40/gi, '@').replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']');\n}\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\n\n\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n }\n\n if (!utils.isArray(val)) {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanM/Y2QyZSJdLCJuYW1lcyI6WyJ1dGlscyIsInJlcXVpcmUiLCJlbmNvZGUiLCJ2YWwiLCJlbmNvZGVVUklDb21wb25lbnQiLCJyZXBsYWNlIiwibW9kdWxlIiwiZXhwb3J0cyIsImJ1aWxkVVJMIiwidXJsIiwicGFyYW1zIiwicGFyYW1zU2VyaWFsaXplciIsInNlcmlhbGl6ZWRQYXJhbXMiLCJpc1VSTFNlYXJjaFBhcmFtcyIsInRvU3RyaW5nIiwicGFydHMiLCJmb3JFYWNoIiwic2VyaWFsaXplIiwia2V5IiwiaXNBcnJheSIsInBhcnNlVmFsdWUiLCJ2IiwiaXNEYXRlIiwidG9JU09TdHJpbmciLCJpc09iamVjdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJwdXNoIiwiam9pbiIsImluZGV4T2YiXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUlBLEtBQUssR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQW5COztBQUVBLFNBQVNDLE1BQVQsQ0FBZ0JDLEdBQWhCLEVBQXFCO0FBQ25CLFNBQU9DLGtCQUFrQixDQUFDRCxHQUFELENBQWxCLENBQ0xFLE9BREssQ0FDRyxPQURILEVBQ1ksR0FEWixFQUVMQSxPQUZLLENBRUcsT0FGSCxFQUVZLEdBRlosRUFHTEEsT0FISyxDQUdHLE1BSEgsRUFHVyxHQUhYLEVBSUxBLE9BSkssQ0FJRyxPQUpILEVBSVksR0FKWixFQUtMQSxPQUxLLENBS0csTUFMSCxFQUtXLEdBTFgsRUFNTEEsT0FOSyxDQU1HLE9BTkgsRUFNWSxHQU5aLEVBT0xBLE9BUEssQ0FPRyxPQVBILEVBT1ksR0FQWixDQUFQO0FBUUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0FDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQixTQUFTQyxRQUFULENBQWtCQyxHQUFsQixFQUF1QkMsTUFBdkIsRUFBK0JDLGdCQUEvQixFQUFpRDtBQUNoRTtBQUNBLE1BQUksQ0FBQ0QsTUFBTCxFQUFhO0FBQ1gsV0FBT0QsR0FBUDtBQUNEOztBQUVELE1BQUlHLGdCQUFKOztBQUNBLE1BQUlELGdCQUFKLEVBQXNCO0FBQ3BCQyxvQkFBZ0IsR0FBR0QsZ0JBQWdCLENBQUNELE1BQUQsQ0FBbkM7QUFDRCxHQUZELE1BRU8sSUFBSVYsS0FBSyxDQUFDYSxpQkFBTixDQUF3QkgsTUFBeEIsQ0FBSixFQUFxQztBQUMxQ0Usb0JBQWdCLEdBQUdGLE1BQU0sQ0FBQ0ksUUFBUCxFQUFuQjtBQUNELEdBRk0sTUFFQTtBQUNMLFFBQUlDLEtBQUssR0FBRyxFQUFaO0FBRUFmLFNBQUssQ0FBQ2dCLE9BQU4sQ0FBY04sTUFBZCxFQUFzQixTQUFTTyxTQUFULENBQW1CZCxHQUFuQixFQUF3QmUsR0FBeEIsRUFBNkI7QUFDakQsVUFBSWYsR0FBRyxLQUFLLElBQVIsSUFBZ0IsT0FBT0EsR0FBUCxLQUFlLFdBQW5DLEVBQWdEO0FBQzlDO0FBQ0Q7O0FBRUQsVUFBSUgsS0FBSyxDQUFDbUIsT0FBTixDQUFjaEIsR0FBZCxDQUFKLEVBQXdCO0FBQ3RCZSxXQUFHLEdBQUdBLEdBQUcsR0FBRyxJQUFaO0FBQ0Q7O0FBRUQsVUFBSSxDQUFDbEIsS0FBSyxDQUFDbUIsT0FBTixDQUFjaEIsR0FBZCxDQUFMLEVBQXlCO0FBQ3ZCQSxXQUFHLEdBQUcsQ0FBQ0EsR0FBRCxDQUFOO0FBQ0Q7O0FBRURILFdBQUssQ0FBQ2dCLE9BQU4sQ0FBY2IsR0FBZCxFQUFtQixTQUFTaUIsVUFBVCxDQUFvQkMsQ0FBcEIsRUFBdUI7QUFDeEMsWUFBSXJCLEtBQUssQ0FBQ3NCLE1BQU4sQ0FBYUQsQ0FBYixDQUFKLEVBQXFCO0FBQ25CQSxXQUFDLEdBQUdBLENBQUMsQ0FBQ0UsV0FBRixFQUFKO0FBQ0QsU0FGRCxNQUVPLElBQUl2QixLQUFLLENBQUN3QixRQUFOLENBQWVILENBQWYsQ0FBSixFQUF1QjtBQUM1QkEsV0FBQyxHQUFHSSxJQUFJLENBQUNDLFNBQUwsQ0FBZUwsQ0FBZixDQUFKO0FBQ0Q7O0FBQ0ROLGFBQUssQ0FBQ1ksSUFBTixDQUFXekIsTUFBTSxDQUFDZ0IsR0FBRCxDQUFOLEdBQWMsR0FBZCxHQUFvQmhCLE1BQU0sQ0FBQ21CLENBQUQsQ0FBckM7QUFDRCxPQVBEO0FBUUQsS0FyQkQ7QUF1QkFULG9CQUFnQixHQUFHRyxLQUFLLENBQUNhLElBQU4sQ0FBVyxHQUFYLENBQW5CO0FBQ0Q7O0FBRUQsTUFBSWhCLGdCQUFKLEVBQXNCO0FBQ3BCSCxPQUFHLElBQUksQ0FBQ0EsR0FBRyxDQUFDb0IsT0FBSixDQUFZLEdBQVosTUFBcUIsQ0FBQyxDQUF0QixHQUEwQixHQUExQixHQUFnQyxHQUFqQyxJQUF3Q2pCLGdCQUEvQztBQUNEOztBQUVELFNBQU9ILEdBQVA7QUFDRCxDQTdDRCIsImZpbGUiOiI4MzgzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIGVuY29kZSh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgIHJlcGxhY2UoLyU0MC9naSwgJ0AnKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBidWlsZFVSTCh1cmwsIHBhcmFtcywgcGFyYW1zU2VyaWFsaXplcikge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdmFyIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIGlmIChwYXJhbXNTZXJpYWxpemVyKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtc1NlcmlhbGl6ZXIocGFyYW1zKTtcbiAgfSBlbHNlIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtcy50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuXG4gICAgdXRpbHMuZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uIHNlcmlhbGl6ZSh2YWwsIGtleSkge1xuICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh1dGlscy5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAga2V5ID0ga2V5ICsgJ1tdJztcbiAgICAgIH1cblxuICAgICAgaWYgKCF1dGlscy5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFsID0gW3ZhbF07XG4gICAgICB9XG5cbiAgICAgIHV0aWxzLmZvckVhY2godmFsLCBmdW5jdGlvbiBwYXJzZVZhbHVlKHYpIHtcbiAgICAgICAgaWYgKHV0aWxzLmlzRGF0ZSh2KSkge1xuICAgICAgICAgIHYgPSB2LnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodXRpbHMuaXNPYmplY3QodikpIHtcbiAgICAgICAgICB2ID0gSlNPTi5zdHJpbmdpZnkodik7XG4gICAgICAgIH1cbiAgICAgICAgcGFydHMucHVzaChlbmNvZGUoa2V5KSArICc9JyArIGVuY29kZSh2KSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJ0cy5qb2luKCcmJyk7XG4gIH1cblxuICBpZiAoc2VyaWFsaXplZFBhcmFtcykge1xuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8383\n");
/***/ }),
/***/ 7700:
/***/ ((module) => {
"use strict";
eval("\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\n\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '');\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanM/YjM4YSJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwiY29tYmluZVVSTHMiLCJiYXNlVVJMIiwicmVsYXRpdmVVUkwiLCJyZXBsYWNlIl0sIm1hcHBpbmdzIjoiQUFBYTtBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBQSxNQUFNLENBQUNDLE9BQVAsR0FBaUIsU0FBU0MsV0FBVCxDQUFxQkMsT0FBckIsRUFBOEJDLFdBQTlCLEVBQTJDO0FBQzFELFNBQU9ELE9BQU8sQ0FBQ0UsT0FBUixDQUFnQixNQUFoQixFQUF3QixFQUF4QixJQUE4QixHQUE5QixHQUFvQ0QsV0FBVyxDQUFDQyxPQUFaLENBQW9CLE1BQXBCLEVBQTRCLEVBQTVCLENBQTNDO0FBQ0QsQ0FGRCIsImZpbGUiOiI3NzAwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIGJhc2VVUkwucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7700\n");
/***/ }),
/***/ 9555:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(5457);\n\nmodule.exports = utils.isStandardBrowserEnv() ? // Standard browser envs support document.cookie\nfunction standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return match ? decodeURIComponent(match[3]) : null;\n },\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n}() : // Non standard browser env (web workers, react-native) lack needed support.\nfunction nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() {\n return null;\n },\n remove: function remove() {}\n };\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcz9lMjRlIl0sIm5hbWVzIjpbInV0aWxzIiwicmVxdWlyZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJpc1N0YW5kYXJkQnJvd3NlckVudiIsInN0YW5kYXJkQnJvd3NlckVudiIsIndyaXRlIiwibmFtZSIsInZhbHVlIiwiZXhwaXJlcyIsInBhdGgiLCJkb21haW4iLCJzZWN1cmUiLCJjb29raWUiLCJwdXNoIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaXNOdW1iZXIiLCJEYXRlIiwidG9HTVRTdHJpbmciLCJpc1N0cmluZyIsImRvY3VtZW50Iiwiam9pbiIsInJlYWQiLCJtYXRjaCIsIlJlZ0V4cCIsImRlY29kZVVSSUNvbXBvbmVudCIsInJlbW92ZSIsIm5vdyIsIm5vblN0YW5kYXJkQnJvd3NlckVudiJdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsSUFBSUEsS0FBSyxHQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBbkI7O0FBRUFDLE1BQU0sQ0FBQ0MsT0FBUCxHQUNFSCxLQUFLLENBQUNJLG9CQUFOLEtBRUE7QUFDQyxTQUFTQyxrQkFBVCxHQUE4QjtBQUM3QixTQUFPO0FBQ0xDLFNBQUssRUFBRSxTQUFTQSxLQUFULENBQWVDLElBQWYsRUFBcUJDLEtBQXJCLEVBQTRCQyxPQUE1QixFQUFxQ0MsSUFBckMsRUFBMkNDLE1BQTNDLEVBQW1EQyxNQUFuRCxFQUEyRDtBQUNoRSxVQUFJQyxNQUFNLEdBQUcsRUFBYjtBQUNBQSxZQUFNLENBQUNDLElBQVAsQ0FBWVAsSUFBSSxHQUFHLEdBQVAsR0FBYVEsa0JBQWtCLENBQUNQLEtBQUQsQ0FBM0M7O0FBRUEsVUFBSVIsS0FBSyxDQUFDZ0IsUUFBTixDQUFlUCxPQUFmLENBQUosRUFBNkI7QUFDM0JJLGNBQU0sQ0FBQ0MsSUFBUCxDQUFZLGFBQWEsSUFBSUcsSUFBSixDQUFTUixPQUFULEVBQWtCUyxXQUFsQixFQUF6QjtBQUNEOztBQUVELFVBQUlsQixLQUFLLENBQUNtQixRQUFOLENBQWVULElBQWYsQ0FBSixFQUEwQjtBQUN4QkcsY0FBTSxDQUFDQyxJQUFQLENBQVksVUFBVUosSUFBdEI7QUFDRDs7QUFFRCxVQUFJVixLQUFLLENBQUNtQixRQUFOLENBQWVSLE1BQWYsQ0FBSixFQUE0QjtBQUMxQkUsY0FBTSxDQUFDQyxJQUFQLENBQVksWUFBWUgsTUFBeEI7QUFDRDs7QUFFRCxVQUFJQyxNQUFNLEtBQUssSUFBZixFQUFxQjtBQUNuQkMsY0FBTSxDQUFDQyxJQUFQLENBQVksUUFBWjtBQUNEOztBQUVETSxjQUFRLENBQUNQLE1BQVQsR0FBa0JBLE1BQU0sQ0FBQ1EsSUFBUCxDQUFZLElBQVosQ0FBbEI7QUFDRCxLQXRCSTtBQXdCTEMsUUFBSSxFQUFFLFNBQVNBLElBQVQsQ0FBY2YsSUFBZCxFQUFvQjtBQUN4QixVQUFJZ0IsS0FBSyxHQUFHSCxRQUFRLENBQUNQLE1BQVQsQ0FBZ0JVLEtBQWhCLENBQXNCLElBQUlDLE1BQUosQ0FBVyxlQUFlakIsSUFBZixHQUFzQixXQUFqQyxDQUF0QixDQUFaO0FBQ0EsYUFBUWdCLEtBQUssR0FBR0Usa0JBQWtCLENBQUNGLEtBQUssQ0FBQyxDQUFELENBQU4sQ0FBckIsR0FBa0MsSUFBL0M7QUFDRCxLQTNCSTtBQTZCTEcsVUFBTSxFQUFFLFNBQVNBLE1BQVQsQ0FBZ0JuQixJQUFoQixFQUFzQjtBQUM1QixXQUFLRCxLQUFMLENBQVdDLElBQVgsRUFBaUIsRUFBakIsRUFBcUJVLElBQUksQ0FBQ1UsR0FBTCxLQUFhLFFBQWxDO0FBQ0Q7QUEvQkksR0FBUDtBQWlDRCxDQWxDRCxFQUhBLEdBdUNBO0FBQ0MsU0FBU0MscUJBQVQsR0FBaUM7QUFDaEMsU0FBTztBQUNMdEIsU0FBSyxFQUFFLFNBQVNBLEtBQVQsR0FBaUIsQ0FBRSxDQURyQjtBQUVMZ0IsUUFBSSxFQUFFLFNBQVNBLElBQVQsR0FBZ0I7QUFBRSxhQUFPLElBQVA7QUFBYyxLQUZqQztBQUdMSSxVQUFNLEVBQUUsU0FBU0EsTUFBVCxHQUFrQixDQUFFO0FBSHZCLEdBQVA7QUFLRCxDQU5ELEVBekNGIiwiZmlsZSI6Ijk1NTUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoXG4gIHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxuICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIHJldHVybiB7XG4gICAgICB3cml0ZTogZnVuY3Rpb24gd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgICAgIHZhciBjb29raWUgPSBbXTtcbiAgICAgICAgY29va2llLnB1c2gobmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuXG4gICAgICAgIGlmICh1dGlscy5pc051bWJlcihleHBpcmVzKSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscy5pc1N0cmluZyhwYXRoKSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscy5pc1N0cmluZyhkb21haW4pKSB7XG4gICAgICAgICAgY29va2llLnB1c2goJ2RvbWFpbj0nICsgZG9tYWluKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWN1cmUgPT09IHRydWUpIHtcbiAgICAgICAgICBjb29raWUucHVzaCgnc2VjdXJlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICAgIH0sXG5cbiAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQobmFtZSkge1xuICAgICAgICB2YXIgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58O1xcXFxzKikoJyArIG5hbWUgKyAnKT0oW147XSopJykpO1xuICAgICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgICAgfSxcblxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUobmFtZSkge1xuICAgICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuICAgICAgfVxuICAgIH07XG4gIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKCkge30sXG4gICAgICByZWFkOiBmdW5jdGlvbiByZWFkKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICB9O1xuICB9KSgpXG4pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9555\n");
/***/ }),
/***/ 2857:
/***/ ((module) => {
"use strict";
eval("\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\n\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcz82ZWNkIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJpc0Fic29sdXRlVVJMIiwidXJsIiwidGVzdCJdLCJtYXBwaW5ncyI6IkFBQWE7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0FBLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQixTQUFTQyxhQUFULENBQXVCQyxHQUF2QixFQUE0QjtBQUMzQztBQUNBO0FBQ0E7QUFDQSxTQUFPLGdDQUFnQ0MsSUFBaEMsQ0FBcUNELEdBQXJDLENBQVA7QUFDRCxDQUxEIiwiZmlsZSI6IjI4NTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZFxcK1xcLVxcLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2857\n");
/***/ }),
/***/ 7025:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(5457);\n\nmodule.exports = utils.isStandardBrowserEnv() ? // Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\nfunction standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href); // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n\n return function isURLSameOrigin(requestURL) {\n var parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;\n return parsed.protocol === originURL.protocol && parsed.host === originURL.host;\n };\n}() : // Non standard browser envs (web workers, react-native) lack needed support.\nfunction nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzP2M1MmUiXSwibmFtZXMiOlsidXRpbHMiLCJyZXF1aXJlIiwibW9kdWxlIiwiZXhwb3J0cyIsImlzU3RhbmRhcmRCcm93c2VyRW52Iiwic3RhbmRhcmRCcm93c2VyRW52IiwibXNpZSIsInRlc3QiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ1cmxQYXJzaW5nTm9kZSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsIm9yaWdpblVSTCIsInJlc29sdmVVUkwiLCJ1cmwiLCJocmVmIiwic2V0QXR0cmlidXRlIiwicHJvdG9jb2wiLCJyZXBsYWNlIiwiaG9zdCIsInNlYXJjaCIsImhhc2giLCJob3N0bmFtZSIsInBvcnQiLCJwYXRobmFtZSIsImNoYXJBdCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaXNVUkxTYW1lT3JpZ2luIiwicmVxdWVzdFVSTCIsInBhcnNlZCIsImlzU3RyaW5nIiwibm9uU3RhbmRhcmRCcm93c2VyRW52Il0sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJQSxLQUFLLEdBQUdDLG1CQUFPLENBQUMsSUFBRCxDQUFuQjs7QUFFQUMsTUFBTSxDQUFDQyxPQUFQLEdBQ0VILEtBQUssQ0FBQ0ksb0JBQU4sS0FFQTtBQUNBO0FBQ0MsU0FBU0Msa0JBQVQsR0FBOEI7QUFDN0IsTUFBSUMsSUFBSSxHQUFHLGtCQUFrQkMsSUFBbEIsQ0FBdUJDLFNBQVMsQ0FBQ0MsU0FBakMsQ0FBWDtBQUNBLE1BQUlDLGNBQWMsR0FBR0MsUUFBUSxDQUFDQyxhQUFULENBQXVCLEdBQXZCLENBQXJCO0FBQ0EsTUFBSUMsU0FBSjtBQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDSSxXQUFTQyxVQUFULENBQW9CQyxHQUFwQixFQUF5QjtBQUN2QixRQUFJQyxJQUFJLEdBQUdELEdBQVg7O0FBRUEsUUFBSVQsSUFBSixFQUFVO0FBQ1I7QUFDQUksb0JBQWMsQ0FBQ08sWUFBZixDQUE0QixNQUE1QixFQUFvQ0QsSUFBcEM7QUFDQUEsVUFBSSxHQUFHTixjQUFjLENBQUNNLElBQXRCO0FBQ0Q7O0FBRUROLGtCQUFjLENBQUNPLFlBQWYsQ0FBNEIsTUFBNUIsRUFBb0NELElBQXBDLEVBVHVCLENBV3ZCOztBQUNBLFdBQU87QUFDTEEsVUFBSSxFQUFFTixjQUFjLENBQUNNLElBRGhCO0FBRUxFLGNBQVEsRUFBRVIsY0FBYyxDQUFDUSxRQUFmLEdBQTBCUixjQUFjLENBQUNRLFFBQWYsQ0FBd0JDLE9BQXhCLENBQWdDLElBQWhDLEVBQXNDLEVBQXRDLENBQTFCLEdBQXNFLEVBRjNFO0FBR0xDLFVBQUksRUFBRVYsY0FBYyxDQUFDVSxJQUhoQjtBQUlMQyxZQUFNLEVBQUVYLGNBQWMsQ0FBQ1csTUFBZixHQUF3QlgsY0FBYyxDQUFDVyxNQUFmLENBQXNCRixPQUF0QixDQUE4QixLQUE5QixFQUFxQyxFQUFyQyxDQUF4QixHQUFtRSxFQUp0RTtBQUtMRyxVQUFJLEVBQUVaLGNBQWMsQ0FBQ1ksSUFBZixHQUFzQlosY0FBYyxDQUFDWSxJQUFmLENBQW9CSCxPQUFwQixDQUE0QixJQUE1QixFQUFrQyxFQUFsQyxDQUF0QixHQUE4RCxFQUwvRDtBQU1MSSxjQUFRLEVBQUViLGNBQWMsQ0FBQ2EsUUFOcEI7QUFPTEMsVUFBSSxFQUFFZCxjQUFjLENBQUNjLElBUGhCO0FBUUxDLGNBQVEsRUFBR2YsY0FBYyxDQUFDZSxRQUFmLENBQXdCQyxNQUF4QixDQUErQixDQUEvQixNQUFzQyxHQUF2QyxHQUNBaEIsY0FBYyxDQUFDZSxRQURmLEdBRUEsTUFBTWYsY0FBYyxDQUFDZTtBQVYxQixLQUFQO0FBWUQ7O0FBRURaLFdBQVMsR0FBR0MsVUFBVSxDQUFDYSxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JaLElBQWpCLENBQXRCO0FBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNJLFNBQU8sU0FBU2EsZUFBVCxDQUF5QkMsVUFBekIsRUFBcUM7QUFDMUMsUUFBSUMsTUFBTSxHQUFJL0IsS0FBSyxDQUFDZ0MsUUFBTixDQUFlRixVQUFmLENBQUQsR0FBK0JoQixVQUFVLENBQUNnQixVQUFELENBQXpDLEdBQXdEQSxVQUFyRTtBQUNBLFdBQVFDLE1BQU0sQ0FBQ2IsUUFBUCxLQUFvQkwsU0FBUyxDQUFDSyxRQUE5QixJQUNGYSxNQUFNLENBQUNYLElBQVAsS0FBZ0JQLFNBQVMsQ0FBQ08sSUFEaEM7QUFFRCxHQUpEO0FBS0QsQ0FsREQsRUFKQSxHQXdEQTtBQUNDLFNBQVNhLHFCQUFULEdBQWlDO0FBQ2hDLFNBQU8sU0FBU0osZUFBVCxHQUEyQjtBQUNoQyxXQUFPLElBQVA7QUFDRCxHQUZEO0FBR0QsQ0FKRCxFQTFERiIsImZpbGUiOiI3MDI1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgaGF2ZSBmdWxsIHN1cHBvcnQgb2YgdGhlIEFQSXMgbmVlZGVkIHRvIHRlc3RcbiAgLy8gd2hldGhlciB0aGUgcmVxdWVzdCBVUkwgaXMgb2YgdGhlIHNhbWUgb3JpZ2luIGFzIGN1cnJlbnQgbG9jYXRpb24uXG4gIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgdmFyIG1zaWUgPSAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIHZhciB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB2YXIgb3JpZ2luVVJMO1xuXG4gICAgLyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdCdzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICAgIHZhciBocmVmID0gdXJsO1xuXG4gICAgICBpZiAobXNpZSkge1xuICAgICAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgICAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgICAgIH1cblxuICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgICAgIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICAgICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgICAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgICAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgICAgICAgICAnLycgKyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBvcmlnaW5VUkwgPSByZXNvbHZlVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblxuICAgIC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGN1cnJlbnQgbG9jYXRpb25cbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdFVSTCBUaGUgVVJMIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4ocmVxdWVzdFVSTCkge1xuICAgICAgdmFyIHBhcnNlZCA9ICh1dGlscy5pc1N0cmluZyhyZXF1ZXN0VVJMKSkgPyByZXNvbHZlVVJMKHJlcXVlc3RVUkwpIDogcmVxdWVzdFVSTDtcbiAgICAgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiZcbiAgICAgICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VUkwuaG9zdCk7XG4gICAgfTtcbiAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52cyAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfSkoKVxuKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7025\n");
/***/ }),
/***/ 4026:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(5457);\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZS5qcz9kNjIxIl0sIm5hbWVzIjpbInV0aWxzIiwicmVxdWlyZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJub3JtYWxpemVIZWFkZXJOYW1lIiwiaGVhZGVycyIsIm5vcm1hbGl6ZWROYW1lIiwiZm9yRWFjaCIsInByb2Nlc3NIZWFkZXIiLCJ2YWx1ZSIsIm5hbWUiLCJ0b1VwcGVyQ2FzZSJdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsSUFBSUEsS0FBSyxHQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBbkI7O0FBRUFDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQixTQUFTQyxtQkFBVCxDQUE2QkMsT0FBN0IsRUFBc0NDLGNBQXRDLEVBQXNEO0FBQ3JFTixPQUFLLENBQUNPLE9BQU4sQ0FBY0YsT0FBZCxFQUF1QixTQUFTRyxhQUFULENBQXVCQyxLQUF2QixFQUE4QkMsSUFBOUIsRUFBb0M7QUFDekQsUUFBSUEsSUFBSSxLQUFLSixjQUFULElBQTJCSSxJQUFJLENBQUNDLFdBQUwsT0FBdUJMLGNBQWMsQ0FBQ0ssV0FBZixFQUF0RCxFQUFvRjtBQUNsRk4sYUFBTyxDQUFDQyxjQUFELENBQVAsR0FBMEJHLEtBQTFCO0FBQ0EsYUFBT0osT0FBTyxDQUFDSyxJQUFELENBQWQ7QUFDRDtBQUNGLEdBTEQ7QUFNRCxDQVBEIiwiZmlsZSI6IjQwMjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCBub3JtYWxpemVkTmFtZSkge1xuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uIHByb2Nlc3NIZWFkZXIodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAobmFtZSAhPT0gbm9ybWFsaXplZE5hbWUgJiYgbmFtZS50b1VwcGVyQ2FzZSgpID09PSBub3JtYWxpemVkTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWROYW1lXSA9IHZhbHVlO1xuICAgICAgZGVsZXRlIGhlYWRlcnNbbmFtZV07XG4gICAgfVxuICB9KTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4026\n");
/***/ }),
/***/ 1946:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(5457);\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\n\n\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) {\n return parsed;\n }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n return parsed;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzP2Y4YmQiXSwibmFtZXMiOlsidXRpbHMiLCJyZXF1aXJlIiwibW9kdWxlIiwiZXhwb3J0cyIsInBhcnNlSGVhZGVycyIsImhlYWRlcnMiLCJwYXJzZWQiLCJrZXkiLCJ2YWwiLCJpIiwiZm9yRWFjaCIsInNwbGl0IiwicGFyc2VyIiwibGluZSIsImluZGV4T2YiLCJ0cmltIiwic3Vic3RyIiwidG9Mb3dlckNhc2UiXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUlBLEtBQUssR0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQW5CO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBQyxNQUFNLENBQUNDLE9BQVAsR0FBaUIsU0FBU0MsWUFBVCxDQUFzQkMsT0FBdEIsRUFBK0I7QUFDOUMsTUFBSUMsTUFBTSxHQUFHLEVBQWI7QUFDQSxNQUFJQyxHQUFKO0FBQ0EsTUFBSUMsR0FBSjtBQUNBLE1BQUlDLENBQUo7O0FBRUEsTUFBSSxDQUFDSixPQUFMLEVBQWM7QUFBRSxXQUFPQyxNQUFQO0FBQWdCOztBQUVoQ04sT0FBSyxDQUFDVSxPQUFOLENBQWNMLE9BQU8sQ0FBQ00sS0FBUixDQUFjLElBQWQsQ0FBZCxFQUFtQyxTQUFTQyxNQUFULENBQWdCQyxJQUFoQixFQUFzQjtBQUN2REosS0FBQyxHQUFHSSxJQUFJLENBQUNDLE9BQUwsQ0FBYSxHQUFiLENBQUo7QUFDQVAsT0FBRyxHQUFHUCxLQUFLLENBQUNlLElBQU4sQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLENBQVksQ0FBWixFQUFlUCxDQUFmLENBQVgsRUFBOEJRLFdBQTlCLEVBQU47QUFDQVQsT0FBRyxHQUFHUixLQUFLLENBQUNlLElBQU4sQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLENBQVlQLENBQUMsR0FBRyxDQUFoQixDQUFYLENBQU47O0FBRUEsUUFBSUYsR0FBSixFQUFTO0FBQ1BELFlBQU0sQ0FBQ0MsR0FBRCxDQUFOLEdBQWNELE1BQU0sQ0FBQ0MsR0FBRCxDQUFOLEdBQWNELE1BQU0sQ0FBQ0MsR0FBRCxDQUFOLEdBQWMsSUFBZCxHQUFxQkMsR0FBbkMsR0FBeUNBLEdBQXZEO0FBQ0Q7QUFDRixHQVJEO0FBVUEsU0FBT0YsTUFBUDtBQUNELENBbkJEIiwiZmlsZSI6IjE5NDYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZUhlYWRlcnMoaGVhZGVycykge1xuICB2YXIgcGFyc2VkID0ge307XG4gIHZhciBrZXk7XG4gIHZhciB2YWw7XG4gIHZhciBpO1xuXG4gIGlmICghaGVhZGVycykgeyByZXR1cm4gcGFyc2VkOyB9XG5cbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLnNwbGl0KCdcXG4nKSwgZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cigwLCBpKSkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKGkgKyAxKSk7XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1946\n");
/***/ }),
/***/ 4445:
/***/ ((module) => {
"use strict";
eval("\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\n\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzPzI0OGYiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsInNwcmVhZCIsImNhbGxiYWNrIiwid3JhcCIsImFyciIsImFwcGx5Il0sIm1hcHBpbmdzIjoiQUFBYTtBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0FBLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQixTQUFTQyxNQUFULENBQWdCQyxRQUFoQixFQUEwQjtBQUN6QyxTQUFPLFNBQVNDLElBQVQsQ0FBY0MsR0FBZCxFQUFtQjtBQUN4QixXQUFPRixRQUFRLENBQUNHLEtBQVQsQ0FBZSxJQUFmLEVBQXFCRCxHQUFyQixDQUFQO0FBQ0QsR0FGRDtBQUdELENBSkQiLCJmaWxlIjoiNDQ0NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIHZhciBhcmdzID0gWzEsIDIsIDNdO1xuICogIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gKiAgYGBgXG4gKlxuICogV2l0aCBgc3ByZWFkYCB0aGlzIGV4YW1wbGUgY2FuIGJlIHJlLXdyaXR0ZW4uXG4gKlxuICogIGBgYGpzXG4gKiAgc3ByZWFkKGZ1bmN0aW9uKHgsIHksIHopIHt9KShbMSwgMiwgM10pO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4445\n");
/***/ }),
/***/ 5457:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar bind = __webpack_require__(7823);\n/*global toString:true*/\n// utils is a library of generic helper functions non-specific to axios\n\n\nvar toString = Object.prototype.toString;\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\n\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\n\n\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\n\n\nfunction isFormData(val) {\n return typeof FormData !== 'undefined' && val instanceof FormData;\n}\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\n\n\nfunction isArrayBufferView(val) {\n var result;\n\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {\n result = ArrayBuffer.isView(val);\n } else {\n result = val && val.buffer && val.buffer instanceof ArrayBuffer;\n }\n\n return result;\n}\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\n\n\nfunction isString(val) {\n return typeof val === 'string';\n}\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\n\n\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\n\n\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\n\n\nfunction isObject(val) {\n return val !== null && _typeof(val) === 'object';\n}\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\n\n\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\n\n\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\n\n\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\n\n\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\n\n\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\n\n\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\n\n\nfunction trim(str) {\n return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n}\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * typeof document.createElement -> undefined\n */\n\n\nfunction isStandardBrowserEnv() {\n return typeof window !== 'undefined' && typeof document !== 'undefined' && typeof document.createElement === 'function';\n}\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\n\n\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n } // Force an array if not already something iterable\n\n\n if (_typeof(obj) !== 'object' && !isArray(obj)) {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\n\n\nfunction merge()\n/* obj1, obj2, obj3, ... */\n{\n var result = {};\n\n function assignValue(val, key) {\n if (_typeof(result[key]) === 'object' && _typeof(val) === 'object') {\n result[key] = merge(result[key], val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n\n return result;\n}\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\n\n\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzPzc4MWIiXSwibmFtZXMiOlsiYmluZCIsInJlcXVpcmUiLCJ0b1N0cmluZyIsIk9iamVjdCIsInByb3RvdHlwZSIsImlzQXJyYXkiLCJ2YWwiLCJjYWxsIiwiaXNBcnJheUJ1ZmZlciIsImlzRm9ybURhdGEiLCJGb3JtRGF0YSIsImlzQXJyYXlCdWZmZXJWaWV3IiwicmVzdWx0IiwiQXJyYXlCdWZmZXIiLCJpc1ZpZXciLCJidWZmZXIiLCJpc1N0cmluZyIsImlzTnVtYmVyIiwiaXNVbmRlZmluZWQiLCJpc09iamVjdCIsImlzRGF0ZSIsImlzRmlsZSIsImlzQmxvYiIsImlzRnVuY3Rpb24iLCJpc1N0cmVhbSIsInBpcGUiLCJpc1VSTFNlYXJjaFBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInRyaW0iLCJzdHIiLCJyZXBsYWNlIiwiaXNTdGFuZGFyZEJyb3dzZXJFbnYiLCJ3aW5kb3ciLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJmb3JFYWNoIiwib2JqIiwiZm4iLCJpIiwibCIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwibWVyZ2UiLCJhc3NpZ25WYWx1ZSIsImFyZ3VtZW50cyIsImV4dGVuZCIsImEiLCJiIiwidGhpc0FyZyIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFhOzs7O0FBRWIsSUFBSUEsSUFBSSxHQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBbEI7QUFFQTtBQUVBOzs7QUFFQSxJQUFJQyxRQUFRLEdBQUdDLE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkYsUUFBaEM7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsU0FBU0csT0FBVCxDQUFpQkMsR0FBakIsRUFBc0I7QUFDcEIsU0FBT0osUUFBUSxDQUFDSyxJQUFULENBQWNELEdBQWQsTUFBdUIs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akIiLCJmaWxlIjoiNTQ1Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvYmluZCcpO1xuXG4vKmdsb2JhbCB0b1N0cmluZzp0cnVlKi9cblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbCkge1xuICByZXR1cm4gKHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcpICYmICh2YWwgaW5zdGFuY2VvZiBGb3JtRGF0YSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKHZhbC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIERhdGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0ZpbGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZpbGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJsb2JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jsb2IodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEJsb2JdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyZWFtKHZhbCkge1xuICByZXR1cm4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VSTFNlYXJjaFBhcmFtcyh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnICYmIHZhbCBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcztcbn1cblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiB0cmltKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpLnJlcGxhY2UoL1xccyokLywgJycpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IC0+IHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBpc1N0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbikge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgJiYgIWlzQXJyYXkob2JqKSkge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIG9iaiA9IFtvYmpdO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhcnJheSB2YWx1ZXNcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XG4gICAgaWYgKHR5cGVvZiByZXN1bHRba2V5XSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2UocmVzdWx0W2tleV0sIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZChhLCBiLCB0aGlzQXJnKSB7XG4gIGZvckVhY2goYiwgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodGhpc0FyZyAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gYTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQXJyYXk6IGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXI6IGlzQXJyYXlCdWZmZXIsXG4gIGlzRm9ybURhdGE6IGlzRm9ybURhdGEsXG4gIGlzQXJyYXlCdWZmZXJWaWV3OiBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuICBpc051bWJlcjogaXNOdW1iZXIsXG4gIGlzT2JqZWN0OiBpc09iamVjdCxcbiAgaXNVbmRlZmluZWQ6IGlzVW5kZWZpbmVkLFxuICBpc0RhdGU6IGlzRGF0ZSxcbiAgaXNGaWxlOiBpc0ZpbGUsXG4gIGlzQmxvYjogaXNCbG9iLFxuICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uLFxuICBpc1N0cmVhbTogaXNTdHJlYW0sXG4gIGlzVVJMU2VhcmNoUGFyYW1zOiBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNTdGFuZGFyZEJyb3dzZXJFbnY6IGlzU3RhbmRhcmRCcm93c2VyRW52LFxuICBmb3JFYWNoOiBmb3JFYWNoLFxuICBtZXJnZTogbWVyZ2UsXG4gIGV4dGVuZDogZXh0ZW5kLFxuICB0cmltOiB0cmltXG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5457\n");
/***/ }),
/***/ 1429:
/***/ ((module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Z\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5507);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9422);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.search-wrapper[data-v-5e195a32] {\\n display: flex;\\n}\\n.search-wrapper select[data-v-5e195a32] {\\n margin-bottom: 0;\\n margin-left: 1rem;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./app/list/components/FilterBar.vue\"],\"names\":[],\"mappings\":\";AAyDA;IACA,aAAA;AACA;AAEA;IACA,gBAAA;IACA,iBAAA;AACA\",\"sourcesContent\":[\"<template>\\n <div class=\\\"search-wrapper\\\">\\n <input type=\\\"text\\\" class=\\\"search\\\" :placeholder=\\\"store.searchPlaceholder\\\" v-model.trim=\\\"filterText\\\" @input=\\\"doFilter\\\">\\n <select class=\\\"filter-perPage\\\" v-model=\\\"store.perPage\\\" @change=\\\"changePerPage\\\">\\n <option v-for=\\\"(value, title) in this.perPageOptions\\\"\\n :value=\\\"value\\\"\\n :selected=\\\"store.perPage === value\\\">{{ title }}</option>\\n </select>\\n </div>\\n</template>\\n\\n<script>\\n import { debounce } from 'lodash';\\n\\n export default {\\n props: ['store'],\\n data: () => ({\\n filterText: '',\\n searchPlaceholder: 'Filter...',\\n selected: ''\\n }),\\n computed: {\\n perPageOptions() {\\n const options = {\\n '25': 25,\\n '50': 50,\\n '100': 100,\\n '200': 200,\\n 'All': ''\\n };\\n\\n if (!options[this.store.perPage]) {\\n options[this.store.perPage] = this.store.perPage;\\n }\\n\\n return options;\\n }\\n },\\n created() {\\n this.doFilter = debounce(() => {\\n this.$events.fire('filter-set', this.filterText);\\n }, 250, { leading: false });\\n\\n this.changePerPage = () => {\\n this.$events.fire('filter-perPage', this.store.perPage);\\n };\\n },\\n methods: {\\n resetFilter() {\\n this.filterText = '';\\n this.$events.fire('filter-reset');\\n }\\n }\\n }\\n</script>\\n\\n<style scoped>\\n .search-wrapper {\\n display: flex;\\n }\\n\\n .search-wrapper select {\\n margin-bottom: 0;\\n margin-left: 1rem;\\n }\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9hcHAvbGlzdC9jb21wb25lbnRzL0ZpbHRlckJhci52dWU/MDM5NiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDNEg7QUFDN0I7QUFDL0YsOEJBQThCLG1GQUEyQixDQUFDLHdHQUFxQztBQUMvRjtBQUNBLDhFQUE4RSxvQkFBb0IsR0FBRywyQ0FBMkMsdUJBQXVCLHdCQUF3QixHQUFHLFNBQVMsZ0dBQWdHLE1BQU0sVUFBVSxLQUFLLEtBQUssV0FBVyxXQUFXLHdkQUF3ZCxTQUFTLCtFQUErRSxXQUFXLGVBQWUsd0JBQXdCLG1EQUFtRCwrR0FBK0csdUJBQXVCLGdDQUFnQyxtQ0FBbUMsbUxBQW1MLHVEQUF1RCx1RUFBdUUsbUJBQW1CLG1DQUFtQyxlQUFlLFdBQVcsc0JBQXNCLDhDQUE4QyxtRUFBbUUsZUFBZSxRQUFRLGlCQUFpQixFQUFFLDRDQUE0QywwRUFBMEUsZ0JBQWdCLFdBQVcscUJBQXFCLDZCQUE2Qix1Q0FBdUMsb0RBQW9ELGVBQWUsV0FBVyxPQUFPLG9EQUFvRCx3QkFBd0IsT0FBTyxnQ0FBZ0MsMkJBQTJCLDRCQUE0QixPQUFPLCtCQUErQjtBQUMxdkU7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQyIsImZpbGUiOiIxNDI5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uc2VhcmNoLXdyYXBwZXJbZGF0YS12LTVlMTk1YTMyXSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxufVxcbi5zZWFyY2gtd3JhcHBlciBzZWxlY3RbZGF0YS12LTVlMTk1YTMyXSB7XFxuICAgIG1hcmdpbi1ib3R0b206IDA7XFxuICAgIG1hcmdpbi1sZWZ0OiAxcmVtO1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9hcHAvbGlzdC9jb21wb25lbnRzL0ZpbHRlckJhci52dWVcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXlEQTtJQUNBLGFBQUE7QUFDQTtBQUVBO0lBQ0EsZ0JBQUE7SUFDQSxpQkFBQTtBQUNBXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXG4gICAgPGRpdiBjbGFzcz1cXFwic2VhcmNoLXdyYXBwZXJcXFwiPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcInRleHRcXFwiIGNsYXNzPVxcXCJzZWFyY2hcXFwiIDpwbGFjZWhvbGRlcj1cXFwic3RvcmUuc2VhcmNoUGxhY2Vob2xkZXJcXFwiIHYtbW9kZWwudHJpbT1cXFwiZmlsdGVyVGV4dFxcXCIgQGlucHV0PVxcXCJkb0ZpbHRlclxcXCI+XFxuICAgICAgICA8c2VsZWN0IGNsYXNzPVxcXCJmaWx0ZXItcGVyUGFnZVxcXCIgdi1tb2RlbD1cXFwic3RvcmUucGVyUGFnZVxcXCIgQGNoYW5nZT1cXFwiY2hhbmdlUGVyUGFnZVxcXCI+XFxuICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cXFwiKHZhbHVlLCB0aXRsZSkgaW4gdGhpcy5wZXJQYWdlT3B0aW9uc1xcXCJcXG4gICAgICAgICAgICAgICAgICAgIDp2YWx1ZT1cXFwidmFsdWVcXFwiXFxuICAgICAgICAgICAgICAgICAgICA6c2VsZWN0ZWQ9XFxcInN0b3JlLnBlclBhZ2UgPT09IHZhbHVlXFxcIj57eyB0aXRsZSB9fTwvb3B0aW9uPlxcbiAgICAgICAgPC9zZWxlY3Q+XFxuICAgIDwvZGl2PlxcbjwvdGVtcGxhdGU+XFxuXFxuPHNjcmlwdD5cXG4gICAgaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICdsb2Rhc2gnO1xcblxcbiAgICBleHBvcnQgZGVmYXVsdCB7XFxuICAgICAgICBwcm9wczogWydzdG9yZSddLFxcbiAgICAgICAgZGF0YTogKCkgPT4gKHtcXG4gICAgICAgICAgICBmaWx0ZXJUZXh0OiAnJyxcXG4gICAgICAgICAgICBzZWFyY2hQbGFjZWhvbGRlcjogJ0ZpbHRlci4uLicsXFxuICAgICAgICAgICAgc2VsZWN0ZWQ6ICcnXFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbXB1dGVkOiB7XFxuICAgICAgICAgICAgcGVyUGFnZU9wdGlvbnMoKSB7XFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XFxuICAgICAgICAgICAgICAgICAgICAnMjUnOiAyNSxcXG4gICAgICAgICAgICAgICAgICAgICc1MCc6IDUwLFxcbiAgICAgICAgICAgICAgICAgICAgJzEwMCc6IDEwMCxcXG4gICAgICAgICAgICAgICAgICAgICcyMDAnOiAyMDAsXFxuICAgICAgICAgICAgICAgICAgICAnQWxsJzogJydcXG4gICAgICAgICAgICAgICAgfTtcXG5cXG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zW3RoaXMuc3RvcmUucGVyUGFnZV0pIHtcXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbdGhpcy5zdG9yZS5wZXJQYWdlXSA9IHRoaXMuc3RvcmUucGVyUGFnZTtcXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgICAgY3JlYXRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLmRvRmlsdGVyID0gZGVib3VuY2UoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRldmVudHMuZmlyZSgnZmlsdGVyLXNldCcsIHRoaXMuZmlsdGVyVGV4dCk7XFxuICAgICAgICAgICAgfSwgMjUwLCB7IGxlYWRpbmc6IGZhbHNlIH0pO1xcblxcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlUGVyUGFnZSA9ICgpID0+IHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kZXZlbnRzLmZpcmUoJ2ZpbHRlci1wZXJQYWdlJywgdGhpcy5zdG9yZS5wZXJQYWdlKTtcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgfSxcXG4gICAgICAgIG1ldGhvZHM6IHtcXG4gICAgICAgICAgICByZXNldEZpbHRlcigpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJUZXh0ID0gJyc7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGV2ZW50cy5maXJlKCdmaWx0ZXItcmVzZXQnKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG48L3NjcmlwdD5cXG5cXG48c3R5bGUgc2NvcGVkPlxcbiAgICAuc2VhcmNoLXdyYXBwZXIge1xcbiAgICAgICAgZGlzcGxheTogZmxleDtcXG4gICAgfVxcblxcbiAgICAuc2VhcmNoLXdyYXBwZXIgc2VsZWN0IHtcXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XFxuICAgICAgICBtYXJnaW4tbGVmdDogMXJlbTtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1429\n");
/***/ }),
/***/ 7392:
/***/ ((module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Z\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var _css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5507);\n/* harmony import */ var _css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9422);\n/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n[v-cloak][data-v-15965e3b] {\\n display: none;\\n}\\n.vuetable th.sortable[data-v-15965e3b]:hover {\\n color: #2185d0;\\n cursor: pointer;\\n}\\n.vuetable-body-wrapper[data-v-15965e3b] {\\n position:relative;\\n overflow-y:auto;\\n}\\n.vuetable-head-wrapper[data-v-15965e3b] {\\n overflow-x: hidden;\\n}\\n.vuetable-actions[data-v-15965e3b] {\\n width: 15%;\\n padding: 12px 0px;\\n text-align: center;\\n}\\n.vuetable-pagination[data-v-15965e3b] {\\n background: #f9fafb !important;\\n}\\n.vuetable-pagination-info[data-v-15965e3b] {\\n margin-top: auto;\\n margin-bottom: auto;\\n}\\n.vuetable-empty-result[data-v-15965e3b] {\\n text-align: center;\\n}\\n.vuetable-clip-text[data-v-15965e3b] {\\n white-space: pre-wrap;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n display: block;\\n}\\n.vuetable-semantic-no-top[data-v-15965e3b] {\\n border-top:none !important;\\n margin-top:0 !important;\\n}\\n.vuetable-fixed-layout[data-v-15965e3b] {\\n table-layout: fixed;\\n}\\n.vuetable-gutter-col[data-v-15965e3b] {\\n padding: 0 !important;\\n border-left: none !important;\\n border-right: none !important;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/vuetable-2/src/components/Vuetable.vue\"],\"names\":[],\"mappings\":\";AAgxCA;EACA,aAAA;AACA;AACA;EACA,cAAA;EACA,eAAA;AACA;AACA;EACA,iBAAA;EACA,eAAA;AACA;AACA;EACA,kBAAA;AACA;AACA;EACA,UAAA;EACA,iBAAA;EACA,kBAAA;AACA;AACA;EACA,8BAAA;AACA;AACA;EACA,gBAAA;EACA,mBAAA;AACA;AACA;EACA,kBAAA;AACA;AACA;EACA,qBAAA;EACA,uBAAA;EACA,gBAAA;EACA,cAAA;AACA;AACA;EACA,0BAAA;EACA,uBAAA;AACA;AACA;EACA,mBAAA;AACA;AACA;EACA,qBAAA;EACA,6BAAA;EACA,8BAAA;AACA\",\"sourcesContent\":[\"<template>\\r\\n<div v-if=\\\"isFixedHeader\\\">\\r\\n <div class=\\\"vuetable-head-wrapper\\\">\\r\\n <table :class=\\\"['vuetable', css.tableClass, css.tableHeaderClass]\\\">\\r\\n <thead>\\r\\n <tr>\\r\\n <template v-for=\\\"(field, fieldIndex) in tableFields\\\">\\r\\n <template v-if=\\\"field.visible\\\">\\r\\n <template v-if=\\\"isSpecialField(field.name)\\\">\\r\\n <th v-if=\\\"extractName(field.name) == '__checkbox'\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-checkbox-'+trackBy, field.titleClass]\\\"\\r\\n >\\r\\n <input type=\\\"checkbox\\\" @change=\\\"toggleAllCheckboxes(field.name, $event)\\\"\\r\\n :checked=\\\"checkCheckboxesState(field.name)\\\">\\r\\n </th>\\r\\n <th v-if=\\\"extractName(field.name) == '__component'\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-component-'+trackBy, field.titleClass, sortClass(field), {'sortable': isSortable(field)}]\\\"\\r\\n v-html=\\\"renderTitle(field)\\\"\\r\\n @click=\\\"orderBy(field, $event)\\\"\\r\\n ></th>\\r\\n <th v-if=\\\"extractName(field.name) == '__slot'\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-slot-'+extractArgs(field.name), field.titleClass, sortClass(field), {'sortable': isSortable(field)}]\\\"\\r\\n v-html=\\\"renderTitle(field)\\\"\\r\\n @click=\\\"orderBy(field, $event)\\\"\\r\\n ></th>\\r\\n <th v-if=\\\"extractName(field.name) == '__sequence'\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-sequence', field.titleClass || '']\\\" v-html=\\\"renderTitle(field)\\\">\\r\\n </th>\\r\\n <th v-if=\\\"notIn(extractName(field.name), ['__sequence', '__checkbox', '__component', '__slot'])\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-'+field.name, field.titleClass || '']\\\" v-html=\\\"renderTitle(field)\\\">\\r\\n </th>\\r\\n </template>\\r\\n <template v-else>\\r\\n <th @click=\\\"orderBy(field, $event)\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :id=\\\"'_' + field.name\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-'+field.name, field.titleClass, sortClass(field), {'sortable': isSortable(field)}]\\\"\\r\\n v-html=\\\"renderTitle(field)\\\"\\r\\n ></th>\\r\\n </template>\\r\\n </template>\\r\\n </template>\\r\\n <th v-if=\\\"scrollVisible\\\" :style=\\\"{width: scrollBarWidth}\\\" class=\\\"vuetable-gutter-col\\\"></th>\\r\\n </tr>\\r\\n </thead>\\r\\n </table>\\r\\n </div>\\r\\n <div class=\\\"vuetable-body-wrapper\\\" :style=\\\"{height: tableHeight}\\\">\\r\\n <table :class=\\\"['vuetable', css.tableClass, css.tableBodyClass]\\\">\\r\\n <colgroup>\\r\\n <template v-for=\\\"(field, fieldIndex) in tableFields\\\">\\r\\n <template v-if=\\\"field.visible\\\">\\r\\n <col\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :id=\\\"'_col_' + field.name\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-'+field.name, field.titleClass]\\\"\\r\\n />\\r\\n </template>\\r\\n </template>\\r\\n </colgroup>\\r\\n <tbody v-cloak class=\\\"vuetable-body\\\">\\r\\n <template v-for=\\\"(item, itemIndex) in tableData\\\">\\r\\n <tr \\r\\n :key=\\\"itemIndex\\\"\\r\\n :item-index=\\\"itemIndex\\\" \\r\\n :render=\\\"onRowChanged(item)\\\" \\r\\n :class=\\\"onRowClass(item, itemIndex)\\\"\\r\\n @click=\\\"onRowClicked(item, $event)\\\" \\r\\n @dblclick=\\\"onRowDoubleClicked(item, $event)\\\" \\r\\n >\\r\\n <template v-for=\\\"(field, fieldIndex) in tableFields\\\">\\r\\n <template v-if=\\\"field.visible\\\">\\r\\n <template v-if=\\\"isSpecialField(field.name)\\\">\\r\\n <td v-if=\\\"extractName(field.name) == '__sequence'\\\" \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"['vuetable-sequence', field.dataClass]\\\"\\r\\n v-html=\\\"renderSequence(itemIndex)\\\">\\r\\n </td>\\r\\n <td v-if=\\\"extractName(field.name) == '__handle'\\\" \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"['vuetable-handle', field.dataClass]\\\"\\r\\n v-html=\\\"renderIconTag(['handle-icon', css.handleIcon])\\\"\\r\\n ></td>\\r\\n <td v-if=\\\"extractName(field.name) == '__checkbox'\\\" \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"['vuetable-checkboxes', field.dataClass]\\\"\\r\\n >\\r\\n <input type=\\\"checkbox\\\"\\r\\n @change=\\\"toggleCheckbox(item, field.name, $event)\\\"\\r\\n :checked=\\\"rowSelected(item, field.name)\\\">\\r\\n </td>\\r\\n <td v-if=\\\"extractName(field.name) === '__component'\\\" \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"['vuetable-component', field.dataClass]\\\"\\r\\n >\\r\\n <component :is=\\\"extractArgs(field.name)\\\"\\r\\n :row-data=\\\"item\\\" :row-index=\\\"itemIndex\\\" :row-field=\\\"field.sortField\\\"\\r\\n ></component>\\r\\n </td>\\r\\n <td v-if=\\\"extractName(field.name) === '__slot'\\\" \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"['vuetable-slot', field.dataClass]\\\"\\r\\n >\\r\\n <slot :name=\\\"extractArgs(field.name)\\\"\\r\\n :row-data=\\\"item\\\" :row-index=\\\"itemIndex\\\" :row-field=\\\"field.sortField\\\"\\r\\n ></slot>\\r\\n </td>\\r\\n </template>\\r\\n <template v-else>\\r\\n <td :class=\\\"field.dataClass\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n v-html=\\\"renderNormalField(field, item)\\\"\\r\\n @click=\\\"onCellClicked(item, field, $event)\\\"\\r\\n @dblclick=\\\"onCellDoubleClicked(item, field, $event)\\\"\\r\\n @contextmenu=\\\"onCellRightClicked(item, field, $event)\\\"\\r\\n ></td>\\r\\n </template>\\r\\n </template>\\r\\n </template>\\r\\n </tr>\\r\\n <template v-if=\\\"useDetailRow\\\">\\r\\n <transition :name=\\\"detailRowTransition\\\" :key=\\\"itemIndex\\\">\\r\\n <tr v-if=\\\"isVisibleDetailRow(item[trackBy])\\\"\\r\\n :class=\\\"[css.detailRowClass]\\\"\\r\\n @click=\\\"onDetailRowClick(item, $event)\\\"\\r\\n >\\r\\n <td :colspan=\\\"countVisibleFields\\\">\\r\\n <component :is=\\\"detailRowComponent\\\" :row-data=\\\"item\\\" :row-index=\\\"itemIndex\\\"></component>\\r\\n </td>\\r\\n </tr>\\r\\n </transition>\\r\\n </template>\\r\\n </template>\\r\\n <template v-if=\\\"displayEmptyDataRow\\\">\\r\\n <tr>\\r\\n <td :colspan=\\\"countVisibleFields\\\" class=\\\"vuetable-empty-result\\\" v-html=\\\"noDataTemplate\\\"></td>\\r\\n </tr>\\r\\n </template>\\r\\n <template v-if=\\\"lessThanMinRows\\\">\\r\\n <tr v-for=\\\"i in blankRows\\\" class=\\\"blank-row\\\" :key=\\\"i\\\">\\r\\n <template v-for=\\\"(field, fieldIndex) in tableFields\\\">\\r\\n <td v-if=\\\"field.visible\\\" :key=\\\"fieldIndex\\\">&nbsp;</td>\\r\\n </template>\\r\\n </tr>\\r\\n </template>\\r\\n </tbody>\\r\\n </table>\\r\\n </div>\\r\\n</div>\\r\\n<table v-else :class=\\\"['vuetable', css.tableClass]\\\"> <!-- no fixed header - regular table -->\\r\\n <thead>\\r\\n <tr>\\r\\n <template v-for=\\\"(field, fieldIndex) in tableFields\\\">\\r\\n <template v-if=\\\"field.visible\\\">\\r\\n <template v-if=\\\"isSpecialField(field.name)\\\">\\r\\n <th v-if=\\\"extractName(field.name) == '__checkbox'\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-checkbox-'+trackBy, field.titleClass]\\\"\\r\\n >\\r\\n <input type=\\\"checkbox\\\" @change=\\\"toggleAllCheckboxes(field.name, $event)\\\"\\r\\n :checked=\\\"checkCheckboxesState(field.name)\\\">\\r\\n </th>\\r\\n <th v-if=\\\"extractName(field.name) == '__component'\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-component-'+trackBy, field.titleClass, sortClass(field), {'sortable': isSortable(field)}]\\\"\\r\\n v-html=\\\"renderTitle(field)\\\"\\r\\n @click=\\\"orderBy(field, $event)\\\"\\r\\n ></th>\\r\\n <th v-if=\\\"extractName(field.name) == '__slot'\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-slot-'+extractArgs(field.name), field.titleClass, sortClass(field), {'sortable': isSortable(field)}]\\\"\\r\\n v-html=\\\"renderTitle(field)\\\"\\r\\n @click=\\\"orderBy(field, $event)\\\"\\r\\n ></th>\\r\\n <th v-if=\\\"extractName(field.name) == '__sequence'\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-sequence', field.titleClass || '', sortClass(field)]\\\" v-html=\\\"renderTitle(field)\\\"\\r\\n ></th>\\r\\n <th v-if=\\\"notIn(extractName(field.name), ['__sequence', '__checkbox', '__component', '__slot'])\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-'+field.name, field.titleClass || '', sortClass(field)]\\\" v-html=\\\"renderTitle(field)\\\"\\r\\n ></th>\\r\\n </template>\\r\\n <template v-else>\\r\\n <th @click=\\\"orderBy(field, $event)\\\"\\r\\n :key=\\\"fieldIndex\\\"\\r\\n :id=\\\"'_' + field.name\\\"\\r\\n :style=\\\"{width: field.width}\\\"\\r\\n :class=\\\"['vuetable-th-'+field.name, field.titleClass, sortClass(field), {'sortable': isSortable(field)}]\\\"\\r\\n v-html=\\\"renderTitle(field)\\\"\\r\\n ></th>\\r\\n </template>\\r\\n </template>\\r\\n </template>\\r\\n </tr>\\r\\n </thead>\\r\\n <tbody v-cloak class=\\\"vuetable-body\\\">\\r\\n <template v-for=\\\"(item, itemIndex) in tableData\\\">\\r\\n <tr @dblclick=\\\"onRowDoubleClicked(item, $event)\\\" \\r\\n :key=\\\"itemIndex\\\"\\r\\n :item-index=\\\"itemIndex\\\" \\r\\n :render=\\\"onRowChanged(item)\\\" \\r\\n :class=\\\"onRowClass(item, itemIndex)\\\"\\r\\n @click=\\\"onRowClicked(item, $event)\\\" \\r\\n >\\r\\n <template v-for=\\\"(field, fieldIndex) in tableFields\\\">\\r\\n <template v-if=\\\"field.visible\\\">\\r\\n <template v-if=\\\"isSpecialField(field.name)\\\">\\r\\n <td v-if=\\\"extractName(field.name) == '__sequence'\\\" \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"['vuetable-sequence', field.dataClass]\\\"\\r\\n v-html=\\\"renderSequence(itemIndex)\\\"\\r\\n ></td>\\r\\n <td v-if=\\\"extractName(field.name) == '__handle'\\\" \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"['vuetable-handle', field.dataClass]\\\"\\r\\n v-html=\\\"renderIconTag(['handle-icon', css.handleIcon])\\\"\\r\\n ></td>\\r\\n <td v-if=\\\"extractName(field.name) == '__checkbox'\\\" \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"['vuetable-checkboxes', field.dataClass]\\\"\\r\\n >\\r\\n <input type=\\\"checkbox\\\"\\r\\n @change=\\\"toggleCheckbox(item, field.name, $event)\\\"\\r\\n :checked=\\\"rowSelected(item, field.name)\\\">\\r\\n </td>\\r\\n <td v-if=\\\"extractName(field.name) === '__component'\\\" \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"['vuetable-component', field.dataClass]\\\"\\r\\n >\\r\\n <component :is=\\\"extractArgs(field.name)\\\"\\r\\n :row-data=\\\"item\\\" :row-index=\\\"itemIndex\\\" :row-field=\\\"field.sortField\\\"\\r\\n ></component>\\r\\n </td>\\r\\n <td v-if=\\\"extractName(field.name) === '__slot'\\\" \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"['vuetable-slot', field.dataClass]\\\"\\r\\n >\\r\\n <slot :name=\\\"extractArgs(field.name)\\\"\\r\\n :row-data=\\\"item\\\" :row-index=\\\"itemIndex\\\" :row-field=\\\"field.sortField\\\"\\r\\n ></slot>\\r\\n </td>\\r\\n </template>\\r\\n <template v-else>\\r\\n <td v-if=\\\"hasCallback(field)\\\" \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"field.dataClass\\\"\\r\\n v-html=\\\"callCallback(field, item)\\\"\\r\\n @click=\\\"onCellClicked(item, field, $event)\\\"\\r\\n @dblclick=\\\"onCellDoubleClicked(item, field, $event)\\\"\\r\\n @contextmenu=\\\"onCellRightClicked(item, field, $event)\\\"\\r\\n ></td>\\r\\n <td v-else \\r\\n :key=\\\"fieldIndex\\\"\\r\\n :class=\\\"field.dataClass\\\"\\r\\n v-html=\\\"getObjectValue(item, field.name, '')\\\"\\r\\n @click=\\\"onCellClicked(item, field, $event)\\\"\\r\\n @dblclick=\\\"onCellDoubleClicked(item, field, $event)\\\"\\r\\n @contextmenu=\\\"onCellRightClicked(item, field, $event)\\\"\\r\\n ></td>\\r\\n </template>\\r\\n </template>\\r\\n </template>\\r\\n </tr>\\r\\n <template v-if=\\\"useDetailRow\\\">\\r\\n <transition :name=\\\"detailRowTransition\\\" :key=\\\"itemIndex\\\">\\r\\n <tr v-if=\\\"isVisibleDetailRow(item[trackBy])\\\"\\r\\n :class=\\\"[css.detailRowClass]\\\"\\r\\n @click=\\\"onDetailRowClick(item, $event)\\\"\\r\\n >\\r\\n <td :colspan=\\\"countVisibleFields\\\">\\r\\n <component :is=\\\"detailRowComponent\\\" :row-data=\\\"item\\\" :row-index=\\\"itemIndex\\\"></component>\\r\\n </td>\\r\\n </tr>\\r\\n </transition>\\r\\n </template>\\r\\n </template>\\r\\n <template v-if=\\\"displayEmptyDataRow\\\">\\r\\n <tr>\\r\\n <td :colspan=\\\"countVisibleFields\\\" class=\\\"vuetable-empty-result\\\" v-html=\\\"noDataTemplate\\\"></td>\\r\\n </tr>\\r\\n </template>\\r\\n <template v-if=\\\"lessThanMinRows\\\">\\r\\n <tr v-for=\\\"i in blankRows\\\" class=\\\"blank-row\\\" :key=\\\"i\\\">\\r\\n <template v-for=\\\"(field, fieldIndex) in tableFields\\\">\\r\\n <td v-if=\\\"field.visible\\\" :key=\\\"fieldIndex\\\">&nbsp;</td>\\r\\n </template>\\r\\n </tr>\\r\\n </template>\\r\\n </tbody>\\r\\n</table>\\r\\n</template>\\r\\n\\r\\n<script>\\r\\nimport axios from 'axios'\\r\\n\\r\\nexport default {\\r\\n props: {\\r\\n fields: {\\r\\n type: Array,\\r\\n required: true\\r\\n },\\r\\n loadOnStart: {\\r\\n type: Boolean,\\r\\n default: true\\r\\n },\\r\\n apiUrl: {\\r\\n type: String,\\r\\n default: ''\\r\\n },\\r\\n httpMethod: {\\r\\n type: String,\\r\\n default: 'get',\\r\\n validator: (value) => {\\r\\n return ['get', 'post'].indexOf(value) > -1\\r\\n }\\r\\n },\\r\\n reactiveApiUrl: {\\r\\n type: Boolean,\\r\\n default: true\\r\\n },\\r\\n apiMode: {\\r\\n type: Boolean,\\r\\n default: true\\r\\n },\\r\\n data: {\\r\\n type: [Array, Object],\\r\\n default: null\\r\\n },\\r\\n dataTotal: {\\r\\n type: Number,\\r\\n default: 0\\r\\n },\\r\\n dataManager: {\\r\\n type: Function,\\r\\n default: null\\r\\n },\\r\\n dataPath: {\\r\\n type: String,\\r\\n default: 'data'\\r\\n },\\r\\n paginationPath: {\\r\\n type: [String],\\r\\n default: 'links.pagination'\\r\\n },\\r\\n queryParams: {\\r\\n type: [Object, Function],\\r\\n default () {\\r\\n return {\\r\\n sort: 'sort',\\r\\n page: 'page',\\r\\n perPage: 'per_page'\\r\\n }\\r\\n }\\r\\n },\\r\\n appendParams: {\\r\\n type: Object,\\r\\n default () {\\r\\n return {}\\r\\n }\\r\\n },\\r\\n httpOptions: {\\r\\n type: Object,\\r\\n default () {\\r\\n return {}\\r\\n }\\r\\n },\\r\\n httpFetch: {\\r\\n type: Function,\\r\\n default: null\\r\\n },\\r\\n perPage: {\\r\\n type: Number,\\r\\n default: 10\\r\\n },\\r\\n initialPage: {\\r\\n type: Number,\\r\\n default: 1\\r\\n },\\r\\n sortOrder: {\\r\\n type: Array,\\r\\n default () {\\r\\n return []\\r\\n }\\r\\n },\\r\\n multiSort: {\\r\\n type: Boolean,\\r\\n default () {\\r\\n return false\\r\\n }\\r\\n },\\r\\n tableHeight: {\\r\\n type: String,\\r\\n default: null\\r\\n },\\r\\n /*\\r\\n * physical key that will trigger multi-sort option\\r\\n * possible values: 'alt', 'ctrl', 'meta', 'shift'\\r\\n * 'ctrl' might not work as expected on Mac\\r\\n */\\r\\n multiSortKey: {\\r\\n type: String,\\r\\n default: 'alt'\\r\\n },\\r\\n /* deprecated */\\r\\n rowClassCallback: {\\r\\n type: [String, Function],\\r\\n default: ''\\r\\n },\\r\\n rowClass: {\\r\\n type: [String, Function],\\r\\n default: ''\\r\\n },\\r\\n detailRowComponent: {\\r\\n type: String,\\r\\n default: ''\\r\\n },\\r\\n detailRowTransition: {\\r\\n type: String,\\r\\n default: ''\\r\\n },\\r\\n trackBy: {\\r\\n type: String,\\r\\n default: 'id'\\r\\n },\\r\\n css: {\\r\\n type: Object,\\r\\n default () {\\r\\n return {\\r\\n tableClass: 'ui blue selectable celled stackable attached table',\\r\\n loadingClass: 'loading',\\r\\n ascendingIcon: 'blue chevron up icon',\\r\\n descendingIcon: 'blue chevron down icon',\\r\\n ascendingClass: 'sorted-asc',\\r\\n descendingClass: 'sorted-desc',\\r\\n sortableIcon: '',\\r\\n detailRowClass: 'vuetable-detail-row',\\r\\n handleIcon: 'grey sidebar icon',\\r\\n tableBodyClass: 'vuetable-semantic-no-top vuetable-fixed-layout',\\r\\n tableHeaderClass: 'vuetable-fixed-layout'\\r\\n }\\r\\n }\\r\\n },\\r\\n minRows: {\\r\\n type: Number,\\r\\n default: 0\\r\\n },\\r\\n silent: {\\r\\n type: Boolean,\\r\\n default: false\\r\\n },\\r\\n noDataTemplate: {\\r\\n type: String,\\r\\n default() {\\r\\n return 'No Data Available'\\r\\n }\\r\\n },\\r\\n showSortIcons: {\\r\\n type: Boolean,\\r\\n default: true\\r\\n }\\r\\n },\\r\\n data () {\\r\\n return {\\r\\n eventPrefix: 'vuetable:',\\r\\n tableFields: [],\\r\\n tableData: null,\\r\\n tablePagination: null,\\r\\n currentPage: this.initialPage,\\r\\n selectedTo: [],\\r\\n visibleDetailRows: [],\\r\\n lastScrollPosition: 0,\\r\\n scrollBarWidth: '17px', //chrome default\\r\\n scrollVisible: false,\\r\\n }\\r\\n },\\r\\n mounted () {\\r\\n this.normalizeFields()\\r\\n this.normalizeSortOrder()\\r\\n if (this.isFixedHeader) {\\r\\n this.scrollBarWidth = this.getScrollBarWidth() + 'px';\\r\\n }\\r\\n this.$nextTick(function() {\\r\\n this.fireEvent('initialized', this.tableFields)\\r\\n })\\r\\n\\r\\n if (this.loadOnStart) {\\r\\n this.loadData()\\r\\n }\\r\\n if (this.isFixedHeader) {\\r\\n let elem = this.$el.getElementsByClassName('vuetable-body-wrapper')[0];\\r\\n if (elem != null) {\\r\\n elem.addEventListener('scroll', this.handleScroll);\\r\\n }\\r\\n }\\r\\n },\\r\\n destroyed () {\\r\\n let elem = this.$el.getElementsByClassName('vuetable-body-wrapper')[0];\\r\\n if (elem != null) {\\r\\n elem.removeEventListener('scroll', this.handleScroll);\\r\\n }\\r\\n },\\r\\n computed: {\\r\\n version: () => VERSION,\\r\\n useDetailRow () {\\r\\n if (this.tableData && this.tableData[0] && this.detailRowComponent !== '' && typeof this.tableData[0][this.trackBy] === 'undefined') {\\r\\n this.warn('You need to define unique row identifier in order for detail-row feature to work. Use `track-by` prop to define one!')\\r\\n return false\\r\\n }\\r\\n\\r\\n return this.detailRowComponent !== ''\\r\\n },\\r\\n countVisibleFields () {\\r\\n return this.tableFields.filter(function(field) {\\r\\n return field.visible\\r\\n }).length\\r\\n },\\r\\n countTableData () {\\r\\n if (this.tableData === null) {\\r\\n return 0\\r\\n }\\r\\n return this.tableData.length\\r\\n },\\r\\n displayEmptyDataRow () {\\r\\n return this.countTableData === 0 && this.noDataTemplate.length > 0\\r\\n },\\r\\n lessThanMinRows () {\\r\\n if (this.tableData === null || this.tableData.length === 0) {\\r\\n return true\\r\\n }\\r\\n return this.tableData.length < this.minRows\\r\\n },\\r\\n blankRows () {\\r\\n if (this.tableData === null || this.tableData.length === 0) {\\r\\n return this.minRows\\r\\n }\\r\\n if (this.tableData.length >= this.minRows) {\\r\\n return 0\\r\\n }\\r\\n\\r\\n return this.minRows - this.tableData.length\\r\\n },\\r\\n isApiMode () {\\r\\n return this.apiMode\\r\\n },\\r\\n isDataMode () {\\r\\n return ! this.apiMode\\r\\n },\\r\\n isFixedHeader () {\\r\\n return this.tableHeight != null\\r\\n }\\r\\n },\\r\\n methods: {\\r\\n getScrollBarWidth () {\\r\\n const outer = document.createElement('div');\\r\\n const inner = document.createElement('div');\\r\\n\\r\\n outer.style.visibility = 'hidden';\\r\\n outer.style.width = '100px';\\r\\n\\r\\n inner.style.width = '100%';\\r\\n\\r\\n\\r\\n outer.appendChild(inner);\\r\\n document.body.appendChild(outer);\\r\\n\\r\\n\\r\\n const widthWithoutScrollbar = outer.offsetWidth;\\r\\n\\r\\n outer.style.overflow = 'scroll';\\r\\n\\r\\n const widthWithScrollbar = inner.offsetWidth;\\r\\n\\r\\n\\r\\n document.body.removeChild(outer);\\r\\n\\r\\n\\r\\n return (widthWithoutScrollbar - widthWithScrollbar);\\r\\n },\\r\\n handleScroll (e) { //make sure that the header and the body are aligned when scrolling horizontally on a table that is wider than the viewport\\r\\n let horizontal = e.currentTarget.scrollLeft;\\r\\n if (horizontal != this.lastScrollPosition) { //don't modify header scroll if we are scrolling vertically\\r\\n let header = this.$el.getElementsByClassName('vuetable-head-wrapper')[0]\\r\\n if (header != null) {\\r\\n header.scrollLeft = horizontal;\\r\\n }\\r\\n this.lastScrollPosition = horizontal;\\r\\n }\\r\\n\\r\\n },\\r\\n normalizeFields () {\\r\\n if (typeof(this.fields) === 'undefined') {\\r\\n this.warn('You need to provide \\\"fields\\\" prop.')\\r\\n return\\r\\n }\\r\\n\\r\\n this.tableFields = []\\r\\n let self = this\\r\\n let obj\\r\\n this.fields.forEach(function(field, i) {\\r\\n if (typeof (field) === 'string') {\\r\\n obj = {\\r\\n name: field,\\r\\n title: self.setTitle(field),\\r\\n titleClass: '',\\r\\n dataClass: '',\\r\\n callback: null,\\r\\n visible: true,\\r\\n }\\r\\n } else {\\r\\n obj = {\\r\\n name: field.name,\\r\\n width: field.width,\\r\\n title: (field.title === undefined) ? self.setTitle(field.name) : field.title,\\r\\n sortField: field.sortField,\\r\\n titleClass: (field.titleClass === undefined) ? '' : field.titleClass,\\r\\n dataClass: (field.dataClass === undefined) ? '' : field.dataClass,\\r\\n callback: (field.callback === undefined) ? '' : field.callback,\\r\\n visible: (field.visible === undefined) ? true : field.visible,\\r\\n }\\r\\n }\\r\\n self.tableFields.push(obj)\\r\\n })\\r\\n },\\r\\n setData (data) {\\r\\n if (data === null || typeof(data) === 'undefined') return\\r\\n\\r\\n this.fireEvent('loading')\\r\\n\\r\\n if (Array.isArray(data)) {\\r\\n this.tableData = data\\r\\n this.fireEvent('loaded')\\r\\n return\\r\\n }\\r\\n\\r\\n this.tableData = this.getObjectValue(data, this.dataPath, null)\\r\\n this.tablePagination = this.getObjectValue(data, this.paginationPath, null)\\r\\n\\r\\n this.$nextTick(function() {\\r\\n this.fixHeader()\\r\\n this.fireEvent('pagination-data', this.tablePagination)\\r\\n this.fireEvent('loaded')\\r\\n })\\r\\n },\\r\\n setTitle (str) {\\r\\n if (this.isSpecialField(str)) {\\r\\n return ''\\r\\n }\\r\\n\\r\\n return this.titleCase(str)\\r\\n },\\r\\n getTitle (field) {\\r\\n if (typeof(field.title) === 'function') return field.title()\\r\\n\\r\\n return typeof(field.title) === 'undefined'\\r\\n ? field.name.replace('.', ' ')\\r\\n : field.title\\r\\n },\\r\\n renderTitle (field) {\\r\\n let title = this.getTitle(field)\\r\\n\\r\\n if (title.length > 0 && this.isInCurrentSortGroup(field) || this.hasSortableIcon(field)) {\\r\\n let style = `opacity:${this.sortIconOpacity(field)};position:relative;float:right`\\r\\n let iconTag = this.showSortIcons ? this.renderIconTag(['sort-icon', this.sortIcon(field)], `style=\\\"${style}\\\"`) : ''\\r\\n return title + ' ' + iconTag\\r\\n }\\r\\n\\r\\n return title\\r\\n },\\r\\n renderSequence (index) {\\r\\n return this.tablePagination\\r\\n ? this.tablePagination.from + index\\r\\n : index\\r\\n },\\r\\n renderNormalField (field, item) {\\r\\n return this.hasCallback(field)\\r\\n ? this.callCallback(field, item)\\r\\n : this.getObjectValue(item, field.name, '')\\r\\n },\\r\\n isSpecialField (fieldName) {\\r\\n return fieldName.slice(0, 2) === '__'\\r\\n },\\r\\n titleCase (str) {\\r\\n return str.replace(/\\\\w+/g, function(txt) {\\r\\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()\\r\\n })\\r\\n },\\r\\n camelCase (str, delimiter = '_') {\\r\\n let self = this\\r\\n return str.split(delimiter).map(function(item) {\\r\\n return self.titleCase(item)\\r\\n }).join('')\\r\\n },\\r\\n notIn (str, arr) {\\r\\n return arr.indexOf(str) === -1\\r\\n },\\r\\n loadData (success = this.loadSuccess, failed = this.loadFailed) {\\r\\n if (this.isDataMode) {\\r\\n this.callDataManager()\\r\\n return\\r\\n }\\r\\n\\r\\n this.fireEvent('loading')\\r\\n\\r\\n this.httpOptions['params'] = this.getAppendParams( this.getAllQueryParams() )\\r\\n\\r\\n return this.fetch(this.apiUrl, this.httpOptions).then(\\r\\n success,\\r\\n failed\\r\\n ).catch(() => failed())\\r\\n },\\r\\n fetch (apiUrl, httpOptions) {\\r\\n return this.httpFetch\\r\\n ? this.httpFetch(apiUrl, httpOptions)\\r\\n : axios[this.httpMethod](apiUrl, httpOptions)\\r\\n },\\r\\n loadSuccess (response) {\\r\\n this.fireEvent('load-success', response)\\r\\n\\r\\n let body = this.transform(response.data)\\r\\n\\r\\n this.tableData = this.getObjectValue(body, this.dataPath, null)\\r\\n this.tablePagination = this.getObjectValue(body, this.paginationPath, null)\\r\\n\\r\\n if (this.tablePagination === null) {\\r\\n this.warn('vuetable: pagination-path \\\"' + this.paginationPath + '\\\" not found. '\\r\\n + 'It looks like the data returned from the sever does not have pagination information '\\r\\n + \\\"or you may have set it incorrectly.\\\\n\\\"\\r\\n + 'You can explicitly suppress this warning by setting pagination-path=\\\"\\\".'\\r\\n )\\r\\n }\\r\\n\\r\\n this.$nextTick(function() {\\r\\n this.fixHeader()\\r\\n this.fireEvent('pagination-data', this.tablePagination)\\r\\n this.fireEvent('loaded')\\r\\n })\\r\\n },\\r\\n fixHeader() {\\r\\n if (!this.isFixedHeader) {\\r\\n return;\\r\\n }\\r\\n\\r\\n let elem = this.$el.getElementsByClassName('vuetable-body-wrapper')[0]\\r\\n if (elem != null) {\\r\\n if (elem.scrollHeight > elem.clientHeight) {\\r\\n this.scrollVisible = true;\\r\\n }\\r\\n else {\\r\\n this.scrollVisible = false;\\r\\n }\\r\\n }\\r\\n },\\r\\n loadFailed (response) {\\r\\n console.error('load-error', response)\\r\\n this.fireEvent('load-error', response)\\r\\n this.fireEvent('loaded')\\r\\n },\\r\\n transform (data) {\\r\\n let func = 'transform'\\r\\n\\r\\n if (this.parentFunctionExists(func)) {\\r\\n return this.$parent[func].call(this.$parent, data)\\r\\n }\\r\\n\\r\\n return data\\r\\n },\\r\\n parentFunctionExists (func) {\\r\\n return (func !== '' && typeof this.$parent[func] === 'function')\\r\\n },\\r\\n callParentFunction (func, args, defaultValue = null) {\\r\\n if (this.parentFunctionExists(func)) {\\r\\n return this.$parent[func].call(this.$parent, args)\\r\\n }\\r\\n\\r\\n return defaultValue\\r\\n },\\r\\n fireEvent (eventName, args) {\\r\\n this.$emit(this.eventPrefix + eventName, args)\\r\\n },\\r\\n warn (msg) {\\r\\n if (!this.silent) {\\r\\n console.warn(msg)\\r\\n }\\r\\n },\\r\\n getAllQueryParams () {\\r\\n let params = {}\\r\\n\\r\\n if (typeof(this.queryParams) === 'function') {\\r\\n params = this.queryParams(this.sortOrder, this.currentPage, this.perPage)\\r\\n return typeof(params) !== 'object' ? {} : params\\r\\n }\\r\\n\\r\\n params[this.queryParams.sort] = this.getSortParam()\\r\\n params[this.queryParams.page] = this.currentPage\\r\\n params[this.queryParams.perPage] = this.perPage\\r\\n\\r\\n return params\\r\\n },\\r\\n getSortParam () {\\r\\n if (!this.sortOrder || this.sortOrder.field == '') {\\r\\n return ''\\r\\n }\\r\\n\\r\\n if (typeof this.$parent['getSortParam'] === 'function') {\\r\\n return this.$parent['getSortParam'].call(this.$parent, this.sortOrder)\\r\\n }\\r\\n\\r\\n return this.getDefaultSortParam()\\r\\n },\\r\\n getDefaultSortParam () {\\r\\n let result = '';\\r\\n\\r\\n for (let i = 0; i < this.sortOrder.length; i++) {\\r\\n let fieldName = (typeof this.sortOrder[i].sortField === 'undefined')\\r\\n ? this.sortOrder[i].field\\r\\n : this.sortOrder[i].sortField;\\r\\n\\r\\n result += fieldName + '|' + this.sortOrder[i].direction + ((i+1) < this.sortOrder.length ? ',' : '');\\r\\n }\\r\\n return result;\\r\\n },\\r\\n getAppendParams (params) {\\r\\n for (let x in this.appendParams) {\\r\\n params[x] = this.appendParams[x]\\r\\n }\\r\\n\\r\\n return params\\r\\n },\\r\\n extractName (string) {\\r\\n return string.split(':')[0].trim()\\r\\n },\\r\\n extractArgs (string) {\\r\\n return string.split(':')[1]\\r\\n },\\r\\n isSortable (field) {\\r\\n return !(typeof field.sortField === 'undefined')\\r\\n },\\r\\n isInCurrentSortGroup (field) {\\r\\n return this.currentSortOrderPosition(field) !== false;\\r\\n },\\r\\n hasSortableIcon (field) {\\r\\n return this.isSortable(field) && this.css.sortableIcon != ''\\r\\n },\\r\\n currentSortOrderPosition (field) {\\r\\n if ( ! this.isSortable(field)) {\\r\\n return false\\r\\n }\\r\\n\\r\\n for (let i = 0; i < this.sortOrder.length; i++) {\\r\\n if (this.fieldIsInSortOrderPosition(field, i)) {\\r\\n return i;\\r\\n }\\r\\n }\\r\\n\\r\\n return false;\\r\\n },\\r\\n fieldIsInSortOrderPosition (field, i) {\\r\\n return this.sortOrder[i].field === field.name && this.sortOrder[i].sortField === field.sortField\\r\\n },\\r\\n orderBy (field, event) {\\r\\n if ( ! this.isSortable(field) ) return\\r\\n\\r\\n let key = this.multiSortKey.toLowerCase() + 'Key'\\r\\n\\r\\n if (this.multiSort && event[key]) { //adding column to multisort\\r\\n this.multiColumnSort(field)\\r\\n } else {\\r\\n //no multisort, or resetting sort\\r\\n this.singleColumnSort(field)\\r\\n }\\r\\n\\r\\n this.currentPage = 1 // reset page index\\r\\n if (this.apiMode || this.dataManager) {\\r\\n this.loadData()\\r\\n }\\r\\n },\\r\\n multiColumnSort (field) {\\r\\n let i = this.currentSortOrderPosition(field);\\r\\n\\r\\n if(i === false) { //this field is not in the sort array yet\\r\\n this.sortOrder.push({\\r\\n field: field.name,\\r\\n sortField: field.sortField,\\r\\n direction: 'asc'\\r\\n });\\r\\n } else { //this field is in the sort array, now we change its state\\r\\n if(this.sortOrder[i].direction === 'asc') {\\r\\n // switch direction\\r\\n this.sortOrder[i].direction = 'desc'\\r\\n } else {\\r\\n //remove sort condition\\r\\n this.sortOrder.splice(i, 1);\\r\\n }\\r\\n }\\r\\n },\\r\\n singleColumnSort (field) {\\r\\n if (this.sortOrder.length === 0) {\\r\\n this.clearSortOrder()\\r\\n }\\r\\n\\r\\n this.sortOrder.splice(1); //removes additional columns\\r\\n\\r\\n if (this.fieldIsInSortOrderPosition(field, 0)) {\\r\\n // change sort direction\\r\\n this.sortOrder[0].direction = this.sortOrder[0].direction === 'asc' ? 'desc' : 'asc'\\r\\n } else {\\r\\n // reset sort direction\\r\\n this.sortOrder[0].direction = 'asc'\\r\\n }\\r\\n this.sortOrder[0].field = field.name\\r\\n this.sortOrder[0].sortField = field.sortField\\r\\n },\\r\\n clearSortOrder () {\\r\\n this.sortOrder.push({\\r\\n field: '',\\r\\n sortField: '',\\r\\n direction: 'asc'\\r\\n });\\r\\n },\\r\\n sortClass (field) {\\r\\n let cls = ''\\r\\n let i = this.currentSortOrderPosition(field)\\r\\n\\r\\n if (i !== false) {\\r\\n cls = (this.sortOrder[i].direction == 'asc') ? this.css.ascendingClass : this.css.descendingClass\\r\\n }\\r\\n\\r\\n return cls\\r\\n },\\r\\n sortIcon (field) {\\r\\n let cls = this.css.sortableIcon\\r\\n let i = this.currentSortOrderPosition(field)\\r\\n\\r\\n if (i !== false) {\\r\\n cls = (this.sortOrder[i].direction == 'asc') ? this.css.ascendingIcon : this.css.descendingIcon\\r\\n }\\r\\n\\r\\n return cls;\\r\\n },\\r\\n sortIconOpacity (field) {\\r\\n /*\\r\\n * fields with stronger precedence have darker color\\r\\n *\\r\\n * if there are few fields, we go down by 0.3\\r\\n * ex. 2 fields are selected: 1.0, 0.7\\r\\n *\\r\\n * if there are more we go down evenly on the given spectrum\\r\\n * ex. 6 fields are selected: 1.0, 0.86, 0.72, 0.58, 0.44, 0.3\\r\\n */\\r\\n let max = 1.0,\\r\\n min = 0.3,\\r\\n step = 0.3\\r\\n\\r\\n let count = this.sortOrder.length;\\r\\n let current = this.currentSortOrderPosition(field)\\r\\n\\r\\n\\r\\n if(max - count * step < min) {\\r\\n step = (max - min) / (count-1)\\r\\n }\\r\\n\\r\\n let opacity = max - current * step\\r\\n\\r\\n return opacity\\r\\n },\\r\\n hasCallback (item) {\\r\\n return item.callback ? true : false\\r\\n },\\r\\n callCallback (field, item) {\\r\\n if ( ! this.hasCallback(field)) return\\r\\n\\r\\n if(typeof(field.callback) == 'function') {\\r\\n return field.callback(this.getObjectValue(item, field.name))\\r\\n }\\r\\n\\r\\n let args = field.callback.split('|')\\r\\n let func = args.shift()\\r\\n\\r\\n if (typeof this.$parent[func] === 'function') {\\r\\n let value = this.getObjectValue(item, field.name)\\r\\n\\r\\n return (args.length > 0)\\r\\n ? this.$parent[func].apply(this.$parent, [value].concat(args))\\r\\n : this.$parent[func].call(this.$parent, value)\\r\\n }\\r\\n\\r\\n return null\\r\\n },\\r\\n getObjectValue (object, path, defaultValue) {\\r\\n defaultValue = (typeof defaultValue === 'undefined') ? null : defaultValue\\r\\n\\r\\n let obj = object\\r\\n if (path.trim() != '') {\\r\\n let keys = path.split('.')\\r\\n keys.forEach(function(key) {\\r\\n if (obj !== null && typeof obj[key] !== 'undefined' && obj[key] !== null) {\\r\\n obj = obj[key]\\r\\n } else {\\r\\n obj = defaultValue\\r\\n return\\r\\n }\\r\\n })\\r\\n }\\r\\n return obj\\r\\n },\\r\\n toggleCheckbox (dataItem, fieldName, event) {\\r\\n let isChecked = event.target.checked\\r\\n let idColumn = this.trackBy\\r\\n\\r\\n if (dataItem[idColumn] === undefined) {\\r\\n this.warn('__checkbox field: The \\\"'+this.trackBy+'\\\" field does not exist! Make sure the field you specify in \\\"track-by\\\" prop does exist.')\\r\\n return\\r\\n }\\r\\n\\r\\n let key = dataItem[idColumn]\\r\\n if (isChecked) {\\r\\n this.selectId(key)\\r\\n } else {\\r\\n this.unselectId(key)\\r\\n }\\r\\n this.$emit('vuetable:checkbox-toggled', isChecked, dataItem)\\r\\n },\\r\\n selectId (key) {\\r\\n if ( ! this.isSelectedRow(key)) {\\r\\n this.selectedTo.push(key)\\r\\n }\\r\\n },\\r\\n unselectId (key) {\\r\\n this.selectedTo = this.selectedTo.filter(function(item) {\\r\\n return item !== key\\r\\n })\\r\\n },\\r\\n isSelectedRow (key) {\\r\\n return this.selectedTo.indexOf(key) >= 0\\r\\n },\\r\\n rowSelected (dataItem, fieldName){\\r\\n let idColumn = this.trackBy\\r\\n let key = dataItem[idColumn]\\r\\n\\r\\n return this.isSelectedRow(key)\\r\\n },\\r\\n checkCheckboxesState (fieldName) {\\r\\n if (! this.tableData) return\\r\\n\\r\\n let self = this\\r\\n let idColumn = this.trackBy\\r\\n let selector = 'th.vuetable-th-checkbox-' + idColumn + ' input[type=checkbox]'\\r\\n let els = document.querySelectorAll(selector)\\r\\n\\r\\n //fixed:document.querySelectorAll return the typeof nodeList not array\\r\\n if (els.forEach===undefined)\\r\\n els.forEach=function(cb){\\r\\n [].forEach.call(els, cb);\\r\\n }\\r\\n\\r\\n // count how many checkbox row in the current page has been checked\\r\\n let selected = this.tableData.filter(function(item) {\\r\\n return self.selectedTo.indexOf(item[idColumn]) >= 0\\r\\n })\\r\\n\\r\\n // count == 0, clear the checkbox\\r\\n if (selected.length <= 0) {\\r\\n els.forEach(function(el) {\\r\\n el.indeterminate = false\\r\\n })\\r\\n return false\\r\\n }\\r\\n // count > 0 and count < perPage, set checkbox state to 'indeterminate'\\r\\n else if (selected.length < this.perPage) {\\r\\n els.forEach(function(el) {\\r\\n el.indeterminate = true\\r\\n })\\r\\n return true\\r\\n }\\r\\n // count == perPage, set checkbox state to 'checked'\\r\\n else {\\r\\n els.forEach(function(el) {\\r\\n el.indeterminate = false\\r\\n })\\r\\n return true\\r\\n }\\r\\n },\\r\\n toggleAllCheckboxes (fieldName, event) {\\r\\n let self = this\\r\\n let isChecked = event.target.checked\\r\\n let idColumn = this.trackBy\\r\\n\\r\\n if (isChecked) {\\r\\n this.tableData.forEach(function(dataItem) {\\r\\n self.selectId(dataItem[idColumn])\\r\\n })\\r\\n } else {\\r\\n this.tableData.forEach(function(dataItem) {\\r\\n self.unselectId(dataItem[idColumn])\\r\\n })\\r\\n }\\r\\n this.$emit('vuetable:checkbox-toggled-all', isChecked)\\r\\n },\\r\\n gotoPreviousPage () {\\r\\n if (this.currentPage > 1) {\\r\\n this.currentPage--\\r\\n this.loadData()\\r\\n }\\r\\n },\\r\\n gotoNextPage () {\\r\\n if (this.currentPage < this.tablePagination.last_page) {\\r\\n this.currentPage++\\r\\n this.loadData()\\r\\n }\\r\\n },\\r\\n gotoPage (page) {\\r\\n if (page != this.currentPage && (page > 0 && page <= this.tablePagination.last_page)) {\\r\\n this.currentPage = page\\r\\n this.loadData()\\r\\n }\\r\\n },\\r\\n isVisibleDetailRow (rowId) {\\r\\n return this.visibleDetailRows.indexOf( rowId ) >= 0\\r\\n },\\r\\n showDetailRow (rowId) {\\r\\n if (!this.isVisibleDetailRow(rowId)) {\\r\\n this.visibleDetailRows.push(rowId)\\r\\n }\\r\\n },\\r\\n hideDetailRow (rowId) {\\r\\n if (this.isVisibleDetailRow(rowId)) {\\r\\n this.visibleDetailRows.splice(\\r\\n this.visibleDetailRows.indexOf(rowId),\\r\\n 1\\r\\n )\\r\\n }\\r\\n },\\r\\n toggleDetailRow (rowId) {\\r\\n if (this.isVisibleDetailRow(rowId)) {\\r\\n this.hideDetailRow(rowId)\\r\\n } else {\\r\\n this.showDetailRow(rowId)\\r\\n }\\r\\n },\\r\\n showField (index) {\\r\\n if (index < 0 || index > this.tableFields.length) return\\r\\n\\r\\n this.tableFields[index].visible = true\\r\\n },\\r\\n hideField (index) {\\r\\n if (index < 0 || index > this.tableFields.length) return\\r\\n\\r\\n this.tableFields[index].visible = false\\r\\n },\\r\\n toggleField (index) {\\r\\n if (index < 0 || index > this.tableFields.length) return\\r\\n\\r\\n this.tableFields[index].visible = ! this.tableFields[index].visible\\r\\n },\\r\\n renderIconTag (classes, options = '') {\\r\\n return typeof(this.css.renderIcon) === 'undefined'\\r\\n ? `<i class=\\\"${classes.join(' ')}\\\" ${options}></i>`\\r\\n : this.css.renderIcon(classes, options)\\r\\n },\\r\\n makePagination (total = null, perPage = null, currentPage = null) {\\r\\n let pagination = {}\\r\\n total = total === null ? this.dataTotal : total\\r\\n perPage = perPage === null ? this.perPage : perPage\\r\\n currentPage = currentPage === null ? this.currentPage : currentPage\\r\\n\\r\\n return {\\r\\n 'total': total,\\r\\n 'per_page': perPage,\\r\\n 'current_page': currentPage,\\r\\n 'last_page': Math.ceil(total / perPage) || 0,\\r\\n 'next_page_url': '',\\r\\n 'prev_page_url': '',\\r\\n 'from': (currentPage -1) * perPage +1,\\r\\n 'to': Math.min(currentPage * perPage, total)\\r\\n }\\r\\n },\\r\\n normalizeSortOrder () {\\r\\n this.sortOrder.forEach(function(item) {\\r\\n item.sortField = item.sortField || item.field\\r\\n })\\r\\n },\\r\\n callDataManager () {\\r\\n if (this.dataManager === null && this.data === null) return\\r\\n\\r\\n if (Array.isArray(this.data)) {\\r\\n return this.setData(this.data)\\r\\n } \\r\\n \\r\\n this.normalizeSortOrder()\\r\\n\\r\\n return this.setData(\\r\\n this.dataManager\\r\\n ? this.dataManager(this.sortOrder, this.makePagination())\\r\\n : this.data\\r\\n )\\r\\n },\\r\\n onRowClass (dataItem, index) {\\r\\n if (this.rowClassCallback !== '') {\\r\\n this.warn('\\\"row-class-callback\\\" prop is deprecated, please use \\\"row-class\\\" prop instead.')\\r\\n return\\r\\n }\\r\\n\\r\\n if (typeof(this.rowClass) === 'function') {\\r\\n return this.rowClass(dataItem, index)\\r\\n }\\r\\n\\r\\n return this.rowClass\\r\\n },\\r\\n onRowChanged (dataItem) {\\r\\n this.fireEvent('row-changed', dataItem)\\r\\n return true\\r\\n },\\r\\n onRowClicked (dataItem, event) {\\r\\n this.$emit(this.eventPrefix + 'row-clicked', dataItem, event)\\r\\n return true\\r\\n },\\r\\n onRowDoubleClicked (dataItem, event) {\\r\\n this.$emit(this.eventPrefix + 'row-dblclicked', dataItem, event)\\r\\n },\\r\\n onDetailRowClick (dataItem, event) {\\r\\n this.$emit(this.eventPrefix + 'detail-row-clicked', dataItem, event)\\r\\n },\\r\\n onCellClicked (dataItem, field, event) {\\r\\n this.$emit(this.eventPrefix + 'cell-clicked', dataItem, field, event)\\r\\n },\\r\\n onCellDoubleClicked (dataItem, field, event) {\\r\\n this.$emit(this.eventPrefix + 'cell-dblclicked', dataItem, field, event)\\r\\n },\\r\\n onCellRightClicked (dataItem, field, event) {\\r\\n this.$emit(this.eventPrefix + 'cell-rightclicked', dataItem, field, event)\\r\\n },\\r\\n /*\\r\\n * API for externals\\r\\n */\\r\\n changePage (page) {\\r\\n if (page === 'prev') {\\r\\n this.gotoPreviousPage()\\r\\n } else if (page === 'next') {\\r\\n this.gotoNextPage()\\r\\n } else {\\r\\n this.gotoPage(page)\\r\\n }\\r\\n },\\r\\n reload () {\\r\\n return this.loadData()\\r\\n },\\r\\n refresh () {\\r\\n this.currentPage = 1\\r\\n return this.loadData()\\r\\n },\\r\\n resetData () {\\r\\n this.tableData = null\\r\\n this.tablePagination = null\\r\\n this.fireEvent('data-reset')\\r\\n }\\r\\n }, // end: methods\\r\\n watch: {\\r\\n 'multiSort' (newVal, oldVal) {\\r\\n if (newVal === false && this.sortOrder.length > 1) {\\r\\n this.sortOrder.splice(1);\\r\\n this.loadData();\\r\\n }\\r\\n },\\r\\n 'apiUrl' (newVal, oldVal) {\\r\\n if(this.reactiveApiUrl && newVal !== oldVal)\\r\\n this.refresh()\\r\\n },\\r\\n 'data' (newVal, oldVal) {\\r\\n this.setData(newVal)\\r\\n },\\r\\n 'tableHeight' (newVal, oldVal) {\\r\\n this.fixHeader()\\r\\n }\\r\\n },\\r\\n}\\r\\n</script>\\r\\n\\r\\n<style scoped>\\r\\n [v-cloak] {\\r\\n display: none;\\r\\n }\\r\\n .vuetable th.sortable:hover {\\r\\n color: #2185d0;\\r\\n cursor: pointer;\\r\\n }\\r\\n .vuetable-body-wrapper {\\r\\n position:relative;\\r\\n overflow-y:auto;\\r\\n }\\r\\n .vuetable-head-wrapper {\\r\\n overflow-x: hidden;\\r\\n }\\r\\n .vuetable-actions {\\r\\n width: 15%;\\r\\n padding: 12px 0px;\\r\\n text-align: center;\\r\\n }\\r\\n .vuetable-pagination {\\r\\n background: #f9fafb !important;\\r\\n }\\r\\n .vuetable-pagination-info {\\r\\n margin-top: auto;\\r\\n margin-bottom: auto;\\r\\n }\\r\\n .vuetable-empty-result {\\r\\n text-align: center;\\r\\n }\\r\\n .vuetable-clip-text {\\r\\n white-space: pre-wrap;\\r\\n text-overflow: ellipsis;\\r\\n overflow: hidden;\\r\\n display: block;\\r\\n }\\r\\n .vuetable-semantic-no-top {\\r\\n border-top:none !important;\\r\\n margin-top:0 !important;\\r\\n }\\r\\n .vuetable-fixed-layout {\\r\\n table-layout: fixed;\\r\\n }\\r\\n .vuetable-gutter-col {\\r\\n padding: 0 !important;\\r\\n border-left: none !important;\\r\\n border-right: none !important;\\r\\n }\\r\\n</style>\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9zcmMvY29tcG9uZW50cy9WdWV0YWJsZS52dWU/NDY2YSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDK0c7QUFDN0I7QUFDbEYsOEJBQThCLHNFQUEyQixDQUFDLDJGQUFxQztBQUMvRjtBQUNBLHdFQUF3RSxrQkFBa0IsR0FBRyxnREFBZ0QsbUJBQW1CLG9CQUFvQixHQUFHLDJDQUEyQyxzQkFBc0Isb0JBQW9CLEdBQUcsMkNBQTJDLHVCQUF1QixHQUFHLHNDQUFzQyxlQUFlLHNCQUFzQix1QkFBdUIsR0FBRyx5Q0FBeUMsbUNBQW1DLEdBQUcsOENBQThDLHFCQUFxQix3QkFBd0IsR0FBRywyQ0FBMkMsdUJBQXVCLEdBQUcsd0NBQXdDLDBCQUEwQiw0QkFBNEIscUJBQXFCLG1CQUFtQixHQUFHLDhDQUE4QywrQkFBK0IsNEJBQTRCLEdBQUcsMkNBQTJDLHdCQUF3QixHQUFHLHlDQUF5QywwQkFBMEIsa0NBQWtDLG1DQUFtQyxHQUFHLFNBQVMsa0hBQWtILE9BQU8sVUFBVSxLQUFLLEtBQUssVUFBVSxVQUFVLEtBQUssS0FBSyxXQUFXLFVBQVUsS0FBSyxLQUFLLFdBQVcsS0FBSyxLQUFLLFVBQVUsV0FBVyxXQUFXLEtBQUssS0FBSyxXQUFXLEtBQUssS0FBSyxXQUFXLFdBQVcsS0FBSyxLQUFLLFdBQVcsS0FBSyxLQUFLLFdBQVcsV0FBVyxXQUFXLFVBQVUsS0FBSyxLQUFLLFdBQVcsV0FBVyxLQUFLLEtBQUssV0FBVyxLQUFLLEtBQUssV0FBVyxXQUFXLFdBQVcsbWhCQUFtaEIsbUJBQW1CLDhhQUE4YSxtQkFBbUIsdUdBQXVHLDhCQUE4Qix3UUFBd1EsbUJBQW1CLGtIQUFrSCw4QkFBOEIsNFFBQTRRLG1CQUFtQixnVUFBZ1UsbUJBQW1CLDhXQUE4VyxtQkFBbUIsZ0dBQWdHLDhCQUE4Qix3TUFBd00sc0JBQXNCLHNKQUFzSixvQkFBb0Is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QXVFLHVCQUF1QixtSEFBbUgsT0FBTywrQkFBK0Isc0NBQXNDLDhEQUE4RCxxQ0FBcUMsNEJBQTRCLFdBQVcsU0FBUyxxQ0FBcUMseUZBQXlGLGtDQUFrQyx1Q0FBdUMseUNBQXlDLG1DQUFtQyxPQUFPLE1BQU0sb0RBQW9ELHNCQUFzQixPQUFPLG1DQUFtQyx1QkFBdUIsd0JBQXdCLE9BQU8sOEJBQThCLDBCQUEwQix3QkFBd0IsT0FBTyw4QkFBOEIsMkJBQTJCLE9BQU8seUJBQXlCLG1CQUFtQiwwQkFBMEIsMkJBQTJCLE9BQU8sNEJBQTRCLHVDQUF1QyxPQUFPLGlDQUFpQyx5QkFBeUIsNEJBQTRCLE9BQU8sOEJBQThCLDJCQUEyQixPQUFPLDJCQUEyQiw4QkFBOEIsZ0NBQWdDLHlCQUF5Qix1QkFBdUIsT0FBTyxpQ0FBaUMsbUNBQW1DLGdDQUFnQyxPQUFPLDhCQUE4Qiw0QkFBNEIsT0FBTyw0QkFBNEIsOEJBQThCLHNDQUFzQyx1Q0FBdUMsT0FBTyxtQ0FBbUM7QUFDbnA5QztBQUNBLGlFQUFlLHVCQUF1QixFQUFDIiwiZmlsZSI6IjczOTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCJcXG5bdi1jbG9ha11bZGF0YS12LTE1OTY1ZTNiXSB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG4udnVldGFibGUgdGguc29ydGFibGVbZGF0YS12LTE1OTY1ZTNiXTpob3ZlciB7XFxuICBjb2xvcjogIzIxODVkMDtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnZ1ZXRhYmxlLWJvZHktd3JhcHBlcltkYXRhLXYtMTU5NjVlM2JdIHtcXG4gIHBvc2l0aW9uOnJlbGF0aXZlO1xcbiAgb3ZlcmZsb3cteTphdXRvO1xcbn1cXG4udnVldGFibGUtaGVhZC13cmFwcGVyW2RhdGEtdi0xNTk2NWUzYl0ge1xcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xcbn1cXG4udnVldGFibGUtYWN0aW9uc1tkYXRhLXYtMTU5NjVlM2JdIHtcXG4gIHdpZHRoOiAxNSU7XFxuICBwYWRkaW5nOiAxMnB4IDBweDtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLnZ1ZXRhYmxlLXBhZ2luYXRpb25bZGF0YS12LTE1OTY1ZTNiXSB7XFxuICBiYWNrZ3JvdW5kOiAjZjlmYWZiICFpbXBvcnRhbnQ7XFxufVxcbi52dWV0YWJsZS1wYWdpbmF0aW9uLWluZm9bZGF0YS12LTE1OTY1ZTNiXSB7XFxuICBtYXJnaW4tdG9wOiBhdXRvO1xcbiAgbWFyZ2luLWJvdHRvbTogYXV0bztcXG59XFxuLnZ1ZXRhYmxlLWVtcHR5LXJlc3VsdFtkYXRhLXYtMTU5NjVlM2JdIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLnZ1ZXRhYmxlLWNsaXAtdGV4dFtkYXRhLXYtMTU5NjVlM2JdIHtcXG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG4udnVldGFibGUtc2VtYW50aWMtbm8tdG9wW2RhdGEtdi0xNTk2NWUzYl0ge1xcbiAgYm9yZGVyLXRvcDpub25lICFpbXBvcnRhbnQ7XFxuICBtYXJnaW4tdG9wOjAgIWltcG9ydGFudDtcXG59XFxuLnZ1ZXRhYmxlLWZpeGVkLWxheW91dFtkYXRhLXYtMTU5NjVlM2JdIHtcXG4gIHRhYmxlLWxheW91dDogZml4ZWQ7XFxufVxcbi52dWV0YWJsZS1ndXR0ZXItY29sW2RhdGEtdi0xNTk2NWUzYl0ge1xcbiAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xcbiAgYm9yZGVyLWxlZnQ6IG5vbmUgICFpbXBvcnRhbnQ7XFxuICBib3JkZXItcmlnaHQ6IG5vbmUgICFpbXBvcnRhbnQ7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy92dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlLnZ1ZVwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBZ3hDQTtFQUNBLGFBQUE7QUFDQTtBQUNBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7QUFDQTtBQUNBO0VBQ0EsaUJBQUE7RUFDQSxlQUFBO0FBQ0E7QUFDQTtFQUNBLGtCQUFBO0FBQ0E7QUFDQTtFQUNBLFVBQUE7RUFDQSxpQkFBQTtFQUNBLGtCQUFBO0FBQ0E7QUFDQTtFQUNBLDhCQUFBO0FBQ0E7QUFDQTtFQUNBLGdCQUFBO0VBQ0EsbUJBQUE7QUFDQTtBQUNBO0VBQ0Esa0JBQUE7QUFDQTtBQUNBO0VBQ0EscUJBQUE7RUFDQSx1QkFBQTtFQUNBLGdCQUFBO0VBQ0EsY0FBQTtBQUNBO0FBQ0E7RUFDQSwwQkFBQTtFQUNBLHVCQUFBO0FBQ0E7QUFDQTtFQUNBLG1CQUFBO0FBQ0E7QUFDQTtFQUNBLHFCQUFBO0VBQ0EsNkJBQUE7RUFDQSw4QkFBQTtBQUNBXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG48ZGl2IHYtaWY9XFxcImlzRml4ZWRIZWFkZXJcXFwiPlxcclxcbiAgPGRpdiBjbGFzcz1cXFwidnVldGFibGUtaGVhZC13cmFwcGVyXFxcIj5cXHJcXG4gICAgPHRhYmxlIDpjbGFzcz1cXFwiWyd2dWV0YWJsZScsIGNzcy50YWJsZUNsYXNzLCBjc3MudGFibGVIZWFkZXJDbGFzc11cXFwiPlxcclxcbiAgICA8dGhlYWQ+XFxyXFxuICAgICAgPHRyPlxcclxcbiAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVxcXCIoZmllbGQsIGZpZWxkSW5kZXgpIGluIHRhYmxlRmllbGRzXFxcIj5cXHJcXG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XFxcImZpZWxkLnZpc2libGVcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVxcXCJpc1NwZWNpYWxGaWVsZChmaWVsZC5uYW1lKVxcXCI+XFxyXFxuICAgICAgICAgICAgICA8dGggdi1pZj1cXFwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fY2hlY2tib3gnXFxcIlxcclxcbiAgICAgICAgICAgICAgICA6a2V5PVxcXCJmaWVsZEluZGV4XFxcIlxcclxcbiAgICAgICAgICAgICAgICA6c3R5bGU9XFxcInt3aWR0aDogZmllbGQud2lkdGh9XFxcIlxcclxcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtdGgtY2hlY2tib3gtJyt0cmFja0J5LCBmaWVsZC50aXRsZUNsYXNzXVxcXCJcXHJcXG4gICAgICAgICAgICAgID5cXHJcXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBAY2hhbmdlPVxcXCJ0b2dnbGVBbGxDaGVja2JveGVzKGZpZWxkLm5hbWUsICRldmVudClcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgOmNoZWNrZWQ9XFxcImNoZWNrQ2hlY2tib3hlc1N0YXRlKGZpZWxkLm5hbWUpXFxcIj5cXHJcXG4gICAgICAgICAgICAgIDwvdGg+XFxyXFxuICAgICAgICAgICAgICA8dGggdi1pZj1cXFwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fY29tcG9uZW50J1xcXCJcXHJcXG4gICAgICAgICAgICAgICAgOmtleT1cXFwiZmllbGRJbmRleFxcXCJcXHJcXG4gICAgICAgICAgICAgICAgOnN0eWxlPVxcXCJ7d2lkdGg6IGZpZWxkLndpZHRofVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgOmNsYXNzPVxcXCJbJ3Z1ZXRhYmxlLXRoLWNvbXBvbmVudC0nK3RyYWNrQnksIGZpZWxkLnRpdGxlQ2xhc3MsIHNvcnRDbGFzcyhmaWVsZCksIHsnc29ydGFibGUnOiBpc1NvcnRhYmxlKGZpZWxkKX1dXFxcIlxcclxcbiAgICAgICAgICAgICAgICB2LWh0bWw9XFxcInJlbmRlclRpdGxlKGZpZWxkKVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgQGNsaWNrPVxcXCJvcmRlckJ5KGZpZWxkLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgICAgPjwvdGg+XFxyXFxuICAgICAgICAgICAgICA8dGggdi1pZj1cXFwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fc2xvdCdcXFwiXFxyXFxuICAgICAgICAgICAgICAgIDprZXk9XFxcImZpZWxkSW5kZXhcXFwiXFxyXFxuICAgICAgICAgICAgICAgIDpzdHlsZT1cXFwie3dpZHRoOiBmaWVsZC53aWR0aH1cXFwiXFxyXFxuICAgICAgICAgICAgICAgIDpjbGFzcz1cXFwiWyd2dWV0YWJsZS10aC1zbG90LScrZXh0cmFjdEFyZ3MoZmllbGQubmFtZSksIGZpZWxkLnRpdGxlQ2xhc3MsIHNvcnRDbGFzcyhmaWVsZCksIHsnc29ydGFibGUnOiBpc1NvcnRhYmxlKGZpZWxkKX1dXFxcIlxcclxcbiAgICAgICAgICAgICAgICB2LWh0bWw9XFxcInJlbmRlclRpdGxlKGZpZWxkKVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgQGNsaWNrPVxcXCJvcmRlckJ5KGZpZWxkLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgICAgPjwvdGg+XFxyXFxuICAgICAgICAgICAgICA8dGggdi1pZj1cXFwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fc2VxdWVuY2UnXFxcIlxcclxcbiAgICAgICAgICAgICAgICA6a2V5PVxcXCJmaWVsZEluZGV4XFxcIlxcclxcbiAgICAgICAgICAgICAgICA6c3R5bGU9XFxcInt3aWR0aDogZmllbGQud2lkdGh9XFxcIlxcclxcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtdGgtc2VxdWVuY2UnLCBmaWVsZC50aXRsZUNsYXNzIHx8ICcnXVxcXCIgdi1odG1sPVxcXCJyZW5kZXJUaXRsZShmaWVsZClcXFwiPlxcclxcbiAgICAgICAgICAgICAgPC90aD5cXHJcXG4gICAgICAgICAgICAgIDx0aCB2LWlmPVxcXCJub3RJbihleHRyYWN0TmFtZShmaWVsZC5uYW1lKSwgWydfX3NlcXVlbmNlJywgJ19fY2hlY2tib3gnLCAnX19jb21wb25lbnQnLCAnX19zbG90J10pXFxcIlxcclxcbiAgICAgICAgICAgICAgICA6a2V5PVxcXCJmaWVsZEluZGV4XFxcIlxcclxcbiAgICAgICAgICAgICAgICA6c3R5bGU9XFxcInt3aWR0aDogZmllbGQud2lkdGh9XFxcIlxcclxcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtdGgtJytmaWVsZC5uYW1lLCBmaWVsZC50aXRsZUNsYXNzIHx8ICcnXVxcXCIgdi1odG1sPVxcXCJyZW5kZXJUaXRsZShmaWVsZClcXFwiPlxcclxcbiAgICAgICAgICAgICAgPC90aD5cXHJcXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XFxyXFxuICAgICAgICAgICAgICA8dGggQGNsaWNrPVxcXCJvcmRlckJ5KGZpZWxkLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgICAgICA6a2V5PVxcXCJmaWVsZEluZGV4XFxcIlxcclxcbiAgICAgICAgICAgICAgICA6aWQ9XFxcIidfJyArIGZpZWxkLm5hbWVcXFwiXFxyXFxuICAgICAgICAgICAgICAgIDpzdHlsZT1cXFwie3dpZHRoOiBmaWVsZC53aWR0aH1cXFwiXFxyXFxuICAgICAgICAgICAgICAgIDpjbGFzcz1cXFwiWyd2dWV0YWJsZS10aC0nK2ZpZWxkLm5hbWUsIGZpZWxkLnRpdGxlQ2xhc3MsIHNvcnRDbGFzcyhmaWVsZCksIHsnc29ydGFibGUnOiBpc1NvcnRhYmxlKGZpZWxkKX1dXFxcIlxcclxcbiAgICAgICAgICAgICAgICB2LWh0bWw9XFxcInJlbmRlclRpdGxlKGZpZWxkKVxcXCJcXHJcXG4gICAgICAgICAgICAgID48L3RoPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgPHRoIHYtaWY9XFxcInNjcm9sbFZpc2libGVcXFwiIDpzdHlsZT1cXFwie3dpZHRoOiBzY3JvbGxCYXJXaWR0aH1cXFwiIGNsYXNzPVxcXCJ2dWV0YWJsZS1ndXR0ZXItY29sXFxcIj48L3RoPlxcclxcbiAgICAgIDwvdHI+XFxyXFxuICAgIDwvdGhlYWQ+XFxyXFxuICAgIDwvdGFibGU+XFxyXFxuICA8L2Rpdj5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcInZ1ZXRhYmxlLWJvZHktd3JhcHBlclxcXCIgOnN0eWxlPVxcXCJ7aGVpZ2h0OiB0YWJsZUhlaWdodH1cXFwiPlxcclxcbiAgICA8dGFibGUgOmNsYXNzPVxcXCJbJ3Z1ZXRhYmxlJywgY3NzLnRhYmxlQ2xhc3MsIGNzcy50YWJsZUJvZHlDbGFzc11cXFwiPlxcclxcbiAgICAgIDxjb2xncm91cD5cXHJcXG4gICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiKGZpZWxkLCBmaWVsZEluZGV4KSBpbiB0YWJsZUZpZWxkc1xcXCI+XFxyXFxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVxcXCJmaWVsZC52aXNpYmxlXFxcIj5cXHJcXG4gICAgICAgICAgICA8Y29sXFxyXFxuICAgICAgICAgICAgICA6a2V5PVxcXCJmaWVsZEluZGV4XFxcIlxcclxcbiAgICAgICAgICAgICAgOmlkPVxcXCInX2NvbF8nICsgZmllbGQubmFtZVxcXCJcXHJcXG4gICAgICAgICAgICAgIDpzdHlsZT1cXFwie3dpZHRoOiBmaWVsZC53aWR0aH1cXFwiXFxyXFxuICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtdGgtJytmaWVsZC5uYW1lLCBmaWVsZC50aXRsZUNsYXNzXVxcXCJcXHJcXG4gICAgICAgICAgICAvPlxcclxcbiAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICA8L2NvbGdyb3VwPlxcclxcbiAgICAgIDx0Ym9keSB2LWNsb2FrIGNsYXNzPVxcXCJ2dWV0YWJsZS1ib2R5XFxcIj5cXHJcXG4gICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiKGl0ZW0sIGl0ZW1JbmRleCkgaW4gdGFibGVEYXRhXFxcIj5cXHJcXG4gICAgICAgICAgPHRyIFxcclxcbiAgICAgICAgICAgIDprZXk9XFxcIml0ZW1JbmRleFxcXCJcXHJcXG4gICAgICAgICAgICA6aXRlbS1pbmRleD1cXFwiaXRlbUluZGV4XFxcIiBcXHJcXG4gICAgICAgICAgICA6cmVuZGVyPVxcXCJvblJvd0NoYW5nZWQoaXRlbSlcXFwiIFxcclxcbiAgICAgICAgICAgIDpjbGFzcz1cXFwib25Sb3dDbGFzcyhpdGVtLCBpdGVtSW5kZXgpXFxcIlxcclxcbiAgICAgICAgICAgIEBjbGljaz1cXFwib25Sb3dDbGlja2VkKGl0ZW0sICRldmVudClcXFwiIFxcclxcbiAgICAgICAgICAgIEBkYmxjbGljaz1cXFwib25Sb3dEb3VibGVDbGlja2VkKGl0ZW0sICRldmVudClcXFwiIFxcclxcbiAgICAgICAgICA+XFxyXFxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVxcXCIoZmllbGQsIGZpZWxkSW5kZXgpIGluIHRhYmxlRmllbGRzXFxcIj5cXHJcXG4gICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVxcXCJmaWVsZC52aXNpYmxlXFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XFxcImlzU3BlY2lhbEZpZWxkKGZpZWxkLm5hbWUpXFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICA8dGQgdi1pZj1cXFwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fc2VxdWVuY2UnXFxcIiBcXHJcXG4gICAgICAgICAgICAgICAgICAgIDprZXk9XFxcImZpZWxkSW5kZXhcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtc2VxdWVuY2UnLCBmaWVsZC5kYXRhQ2xhc3NdXFxcIlxcclxcbiAgICAgICAgICAgICAgICAgICAgdi1odG1sPVxcXCJyZW5kZXJTZXF1ZW5jZShpdGVtSW5kZXgpXFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICA8L3RkPlxcclxcbiAgICAgICAgICAgICAgICAgIDx0ZCB2LWlmPVxcXCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSAnX19oYW5kbGUnXFxcIiBcXHJcXG4gICAgICAgICAgICAgICAgICAgIDprZXk9XFxcImZpZWxkSW5kZXhcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtaGFuZGxlJywgZmllbGQuZGF0YUNsYXNzXVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICAgIHYtaHRtbD1cXFwicmVuZGVySWNvblRhZyhbJ2hhbmRsZS1pY29uJywgY3NzLmhhbmRsZUljb25dKVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICA+PC90ZD5cXHJcXG4gICAgICAgICAgICAgICAgICA8dGQgdi1pZj1cXFwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fY2hlY2tib3gnXFxcIiBcXHJcXG4gICAgICAgICAgICAgICAgICAgIDprZXk9XFxcImZpZWxkSW5kZXhcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtY2hlY2tib3hlcycsIGZpZWxkLmRhdGFDbGFzc11cXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIlxcclxcbiAgICAgICAgICAgICAgICAgICAgICBAY2hhbmdlPVxcXCJ0b2dnbGVDaGVja2JveChpdGVtLCBmaWVsZC5uYW1lLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgICAgICAgICAgICA6Y2hlY2tlZD1cXFwicm93U2VsZWN0ZWQoaXRlbSwgZmllbGQubmFtZSlcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XFxyXFxuICAgICAgICAgICAgICAgICAgPHRkIHYtaWY9XFxcImV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09PSAnX19jb21wb25lbnQnXFxcIiBcXHJcXG4gICAgICAgICAgICAgICAgICAgIDprZXk9XFxcImZpZWxkSW5kZXhcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtY29tcG9uZW50JywgZmllbGQuZGF0YUNsYXNzXVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICA+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cXFwiZXh0cmFjdEFyZ3MoZmllbGQubmFtZSlcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgICAgIDpyb3ctZGF0YT1cXFwiaXRlbVxcXCIgOnJvdy1pbmRleD1cXFwiaXRlbUluZGV4XFxcIiA6cm93LWZpZWxkPVxcXCJmaWVsZC5zb3J0RmllbGRcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgICA+PC9jb21wb25lbnQ+XFxyXFxuICAgICAgICAgICAgICAgICAgPC90ZD5cXHJcXG4gICAgICAgICAgICAgICAgICA8dGQgdi1pZj1cXFwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT09ICdfX3Nsb3QnXFxcIiBcXHJcXG4gICAgICAgICAgICAgICAgICAgIDprZXk9XFxcImZpZWxkSW5kZXhcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtc2xvdCcsIGZpZWxkLmRhdGFDbGFzc11cXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPHNsb3QgOm5hbWU9XFxcImV4dHJhY3RBcmdzKGZpZWxkLm5hbWUpXFxcIlxcclxcbiAgICAgICAgICAgICAgICAgICAgICA6cm93LWRhdGE9XFxcIml0ZW1cXFwiIDpyb3ctaW5kZXg9XFxcIml0ZW1JbmRleFxcXCIgOnJvdy1maWVsZD1cXFwiZmllbGQuc29ydEZpZWxkXFxcIlxcclxcbiAgICAgICAgICAgICAgICAgICAgPjwvc2xvdD5cXHJcXG4gICAgICAgICAgICAgICAgICA8L3RkPlxcclxcbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxcclxcbiAgICAgICAgICAgICAgICAgIDx0ZCA6Y2xhc3M9XFxcImZpZWxkLmRhdGFDbGFzc1xcXCJcXHJcXG4gICAgICAgICAgICAgICAgICAgIDprZXk9XFxcImZpZWxkSW5kZXhcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgICB2LWh0bWw9XFxcInJlbmRlck5vcm1hbEZpZWxkKGZpZWxkLCBpdGVtKVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICAgIEBjbGljaz1cXFwib25DZWxsQ2xpY2tlZChpdGVtLCBmaWVsZCwgJGV2ZW50KVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICAgIEBkYmxjbGljaz1cXFwib25DZWxsRG91YmxlQ2xpY2tlZChpdGVtLCBmaWVsZCwgJGV2ZW50KVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICAgIEBjb250ZXh0bWVudT1cXFwib25DZWxsUmlnaHRDbGlja2VkKGl0ZW0sIGZpZWxkLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgICAgICAgID48L3RkPlxcclxcbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICA8L3RyPlxcclxcbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cXFwidXNlRGV0YWlsUm93XFxcIj5cXHJcXG4gICAgICAgICAgICA8dHJhbnNpdGlvbiA6bmFtZT1cXFwiZGV0YWlsUm93VHJhbnNpdGlvblxcXCIgOmtleT1cXFwiaXRlbUluZGV4XFxcIj5cXHJcXG4gICAgICAgICAgICAgIDx0ciB2LWlmPVxcXCJpc1Zpc2libGVEZXRhaWxSb3coaXRlbVt0cmFja0J5XSlcXFwiXFxyXFxuICAgICAgICAgICAgICAgIDpjbGFzcz1cXFwiW2Nzcy5kZXRhaWxSb3dDbGFzc11cXFwiXFxyXFxuICAgICAgICAgICAgICAgIEBjbGljaz1cXFwib25EZXRhaWxSb3dDbGljayhpdGVtLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgICAgPlxcclxcbiAgICAgICAgICAgICAgICA8dGQgOmNvbHNwYW49XFxcImNvdW50VmlzaWJsZUZpZWxkc1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XFxcImRldGFpbFJvd0NvbXBvbmVudFxcXCIgOnJvdy1kYXRhPVxcXCJpdGVtXFxcIiA6cm93LWluZGV4PVxcXCJpdGVtSW5kZXhcXFwiPjwvY29tcG9uZW50PlxcclxcbiAgICAgICAgICAgICAgICA8L3RkPlxcclxcbiAgICAgICAgICAgICAgPC90cj5cXHJcXG4gICAgICAgICAgICA8L3RyYW5zaXRpb24+XFxyXFxuICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XFxcImRpc3BsYXlFbXB0eURhdGFSb3dcXFwiPlxcclxcbiAgICAgICAgICA8dHI+XFxyXFxuICAgICAgICAgICAgPHRkIDpjb2xzcGFuPVxcXCJjb3VudFZpc2libGVGaWVsZHNcXFwiIGNsYXNzPVxcXCJ2dWV0YWJsZS1lbXB0eS1yZXN1bHRcXFwiIHYtaHRtbD1cXFwibm9EYXRhVGVtcGxhdGVcXFwiPjwvdGQ+XFxyXFxuICAgICAgICAgIDwvdHI+XFxyXFxuICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XFxcImxlc3NUaGFuTWluUm93c1xcXCI+XFxyXFxuICAgICAgICAgIDx0ciB2LWZvcj1cXFwiaSBpbiBibGFua1Jvd3NcXFwiIGNsYXNzPVxcXCJibGFuay1yb3dcXFwiIDprZXk9XFxcImlcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiKGZpZWxkLCBmaWVsZEluZGV4KSBpbiB0YWJsZUZpZWxkc1xcXCI+XFxyXFxuICAgICAgICAgICAgICA8dGQgdi1pZj1cXFwiZmllbGQudmlzaWJsZVxcXCIgOmtleT1cXFwiZmllbGRJbmRleFxcXCI+Jm5ic3A7PC90ZD5cXHJcXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICA8L3RyPlxcclxcbiAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICA8L3Rib2R5PlxcclxcbiAgICA8L3RhYmxlPlxcclxcbiAgPC9kaXY+XFxyXFxuPC9kaXY+XFxyXFxuPHRhYmxlIHYtZWxzZSA6Y2xhc3M9XFxcIlsndnVldGFibGUnLCBjc3MudGFibGVDbGFzc11cXFwiPiA8IS0tIG5vIGZpeGVkIGhlYWRlciAtIHJlZ3VsYXIgdGFibGUgLS0+XFxyXFxuICA8dGhlYWQ+XFxyXFxuICAgIDx0cj5cXHJcXG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XFxcIihmaWVsZCwgZmllbGRJbmRleCkgaW4gdGFibGVGaWVsZHNcXFwiPlxcclxcbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XFxcImZpZWxkLnZpc2libGVcXFwiPlxcclxcbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cXFwiaXNTcGVjaWFsRmllbGQoZmllbGQubmFtZSlcXFwiPlxcclxcbiAgICAgICAgICAgIDx0aCB2LWlmPVxcXCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSAnX19jaGVja2JveCdcXFwiXFxyXFxuICAgICAgICAgICAgICA6a2V5PVxcXCJmaWVsZEluZGV4XFxcIlxcclxcbiAgICAgICAgICAgICAgOnN0eWxlPVxcXCJ7d2lkdGg6IGZpZWxkLndpZHRofVxcXCJcXHJcXG4gICAgICAgICAgICAgIDpjbGFzcz1cXFwiWyd2dWV0YWJsZS10aC1jaGVja2JveC0nK3RyYWNrQnksIGZpZWxkLnRpdGxlQ2xhc3NdXFxcIlxcclxcbiAgICAgICAgICAgID5cXHJcXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgQGNoYW5nZT1cXFwidG9nZ2xlQWxsQ2hlY2tib3hlcyhmaWVsZC5uYW1lLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgICAgICA6Y2hlY2tlZD1cXFwiY2hlY2tDaGVja2JveGVzU3RhdGUoZmllbGQubmFtZSlcXFwiPlxcclxcbiAgICAgICAgICAgIDwvdGg+XFxyXFxuICAgICAgICAgICAgPHRoIHYtaWY9XFxcImV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09ICdfX2NvbXBvbmVudCdcXFwiXFxyXFxuICAgICAgICAgICAgICA6a2V5PVxcXCJmaWVsZEluZGV4XFxcIlxcclxcbiAgICAgICAgICAgICAgOnN0eWxlPVxcXCJ7d2lkdGg6IGZpZWxkLndpZHRofVxcXCJcXHJcXG4gICAgICAgICAgICAgIDpjbGFzcz1cXFwiWyd2dWV0YWJsZS10aC1jb21wb25lbnQtJyt0cmFja0J5LCBmaWVsZC50aXRsZUNsYXNzLCBzb3J0Q2xhc3MoZmllbGQpLCB7J3NvcnRhYmxlJzogaXNTb3J0YWJsZShmaWVsZCl9XVxcXCJcXHJcXG4gICAgICAgICAgICAgIHYtaHRtbD1cXFwicmVuZGVyVGl0bGUoZmllbGQpXFxcIlxcclxcbiAgICAgICAgICAgICAgQGNsaWNrPVxcXCJvcmRlckJ5KGZpZWxkLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgID48L3RoPlxcclxcbiAgICAgICAgICAgIDx0aCB2LWlmPVxcXCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSAnX19zbG90J1xcXCJcXHJcXG4gICAgICAgICAgICAgIDprZXk9XFxcImZpZWxkSW5kZXhcXFwiXFxyXFxuICAgICAgICAgICAgICA6c3R5bGU9XFxcInt3aWR0aDogZmllbGQud2lkdGh9XFxcIlxcclxcbiAgICAgICAgICAgICAgOmNsYXNzPVxcXCJbJ3Z1ZXRhYmxlLXRoLXNsb3QtJytleHRyYWN0QXJncyhmaWVsZC5uYW1lKSwgZmllbGQudGl0bGVDbGFzcywgc29ydENsYXNzKGZpZWxkKSwgeydzb3J0YWJsZSc6IGlzU29ydGFibGUoZmllbGQpfV1cXFwiXFxyXFxuICAgICAgICAgICAgICB2LWh0bWw9XFxcInJlbmRlclRpdGxlKGZpZWxkKVxcXCJcXHJcXG4gICAgICAgICAgICAgIEBjbGljaz1cXFwib3JkZXJCeShmaWVsZCwgJGV2ZW50KVxcXCJcXHJcXG4gICAgICAgICAgICA+PC90aD5cXHJcXG4gICAgICAgICAgICA8dGggdi1pZj1cXFwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fc2VxdWVuY2UnXFxcIlxcclxcbiAgICAgICAgICAgICAgOmtleT1cXFwiZmllbGRJbmRleFxcXCJcXHJcXG4gICAgICAgICAgICAgIDpzdHlsZT1cXFwie3dpZHRoOiBmaWVsZC53aWR0aH1cXFwiXFxyXFxuICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtdGgtc2VxdWVuY2UnLCBmaWVsZC50aXRsZUNsYXNzIHx8ICcnLCBzb3J0Q2xhc3MoZmllbGQpXVxcXCIgdi1odG1sPVxcXCJyZW5kZXJUaXRsZShmaWVsZClcXFwiXFxyXFxuICAgICAgICAgICAgPjwvdGg+XFxyXFxuICAgICAgICAgICAgPHRoIHYtaWY9XFxcIm5vdEluKGV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpLCBbJ19fc2VxdWVuY2UnLCAnX19jaGVja2JveCcsICdfX2NvbXBvbmVudCcsICdfX3Nsb3QnXSlcXFwiXFxyXFxuICAgICAgICAgICAgICA6a2V5PVxcXCJmaWVsZEluZGV4XFxcIlxcclxcbiAgICAgICAgICAgICAgOnN0eWxlPVxcXCJ7d2lkdGg6IGZpZWxkLndpZHRofVxcXCJcXHJcXG4gICAgICAgICAgICAgIDpjbGFzcz1cXFwiWyd2dWV0YWJsZS10aC0nK2ZpZWxkLm5hbWUsIGZpZWxkLnRpdGxlQ2xhc3MgfHwgJycsIHNvcnRDbGFzcyhmaWVsZCldXFxcIiB2LWh0bWw9XFxcInJlbmRlclRpdGxlKGZpZWxkKVxcXCJcXHJcXG4gICAgICAgICAgICA+PC90aD5cXHJcXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cXHJcXG4gICAgICAgICAgICA8dGggQGNsaWNrPVxcXCJvcmRlckJ5KGZpZWxkLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgICAgOmtleT1cXFwiZmllbGRJbmRleFxcXCJcXHJcXG4gICAgICAgICAgICAgIDppZD1cXFwiJ18nICsgZmllbGQubmFtZVxcXCJcXHJcXG4gICAgICAgICAgICAgIDpzdHlsZT1cXFwie3dpZHRoOiBmaWVsZC53aWR0aH1cXFwiXFxyXFxuICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtdGgtJytmaWVsZC5uYW1lLCBmaWVsZC50aXRsZUNsYXNzLCBzb3J0Q2xhc3MoZmllbGQpLCAgeydzb3J0YWJsZSc6IGlzU29ydGFibGUoZmllbGQpfV1cXFwiXFxyXFxuICAgICAgICAgICAgICB2LWh0bWw9XFxcInJlbmRlclRpdGxlKGZpZWxkKVxcXCJcXHJcXG4gICAgICAgICAgICA+PC90aD5cXHJcXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPC90cj5cXHJcXG4gIDwvdGhlYWQ+XFxyXFxuICA8dGJvZHkgdi1jbG9hayBjbGFzcz1cXFwidnVldGFibGUtYm9keVxcXCI+XFxyXFxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiKGl0ZW0sIGl0ZW1JbmRleCkgaW4gdGFibGVEYXRhXFxcIj5cXHJcXG4gICAgICA8dHIgQGRibGNsaWNrPVxcXCJvblJvd0RvdWJsZUNsaWNrZWQoaXRlbSwgJGV2ZW50KVxcXCIgXFxyXFxuICAgICAgICA6a2V5PVxcXCJpdGVtSW5kZXhcXFwiXFxyXFxuICAgICAgICA6aXRlbS1pbmRleD1cXFwiaXRlbUluZGV4XFxcIiBcXHJcXG4gICAgICAgIDpyZW5kZXI9XFxcIm9uUm93Q2hhbmdlZChpdGVtKVxcXCIgXFxyXFxuICAgICAgICA6Y2xhc3M9XFxcIm9uUm93Q2xhc3MoaXRlbSwgaXRlbUluZGV4KVxcXCJcXHJcXG4gICAgICAgIEBjbGljaz1cXFwib25Sb3dDbGlja2VkKGl0ZW0sICRldmVudClcXFwiIFxcclxcbiAgICAgID5cXHJcXG4gICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiKGZpZWxkLCBmaWVsZEluZGV4KSBpbiB0YWJsZUZpZWxkc1xcXCI+XFxyXFxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVxcXCJmaWVsZC52aXNpYmxlXFxcIj5cXHJcXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cXFwiaXNTcGVjaWFsRmllbGQoZmllbGQubmFtZSlcXFwiPlxcclxcbiAgICAgICAgICAgICAgPHRkIHYtaWY9XFxcImV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09ICdfX3NlcXVlbmNlJ1xcXCIgXFxyXFxuICAgICAgICAgICAgICAgIDprZXk9XFxcImZpZWxkSW5kZXhcXFwiXFxyXFxuICAgICAgICAgICAgICAgIDpjbGFzcz1cXFwiWyd2dWV0YWJsZS1zZXF1ZW5jZScsIGZpZWxkLmRhdGFDbGFzc11cXFwiXFxyXFxuICAgICAgICAgICAgICAgIHYtaHRtbD1cXFwicmVuZGVyU2VxdWVuY2UoaXRlbUluZGV4KVxcXCJcXHJcXG4gICAgICAgICAgICAgID48L3RkPlxcclxcbiAgICAgICAgICAgICAgPHRkIHYtaWY9XFxcImV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09ICdfX2hhbmRsZSdcXFwiIFxcclxcbiAgICAgICAgICAgICAgICA6a2V5PVxcXCJmaWVsZEluZGV4XFxcIlxcclxcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtaGFuZGxlJywgZmllbGQuZGF0YUNsYXNzXVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgdi1odG1sPVxcXCJyZW5kZXJJY29uVGFnKFsnaGFuZGxlLWljb24nLCBjc3MuaGFuZGxlSWNvbl0pXFxcIlxcclxcbiAgICAgICAgICAgICAgPjwvdGQ+XFxyXFxuICAgICAgICAgICAgICA8dGQgdi1pZj1cXFwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fY2hlY2tib3gnXFxcIiBcXHJcXG4gICAgICAgICAgICAgICAgOmtleT1cXFwiZmllbGRJbmRleFxcXCJcXHJcXG4gICAgICAgICAgICAgICAgOmNsYXNzPVxcXCJbJ3Z1ZXRhYmxlLWNoZWNrYm94ZXMnLCBmaWVsZC5kYXRhQ2xhc3NdXFxcIlxcclxcbiAgICAgICAgICAgICAgPlxcclxcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgQGNoYW5nZT1cXFwidG9nZ2xlQ2hlY2tib3goaXRlbSwgZmllbGQubmFtZSwgJGV2ZW50KVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICA6Y2hlY2tlZD1cXFwicm93U2VsZWN0ZWQoaXRlbSwgZmllbGQubmFtZSlcXFwiPlxcclxcbiAgICAgICAgICAgICAgPC90ZD5cXHJcXG4gICAgICAgICAgICAgIDx0ZCB2LWlmPVxcXCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PT0gJ19fY29tcG9uZW50J1xcXCIgXFxyXFxuICAgICAgICAgICAgICAgIDprZXk9XFxcImZpZWxkSW5kZXhcXFwiXFxyXFxuICAgICAgICAgICAgICAgIDpjbGFzcz1cXFwiWyd2dWV0YWJsZS1jb21wb25lbnQnLCBmaWVsZC5kYXRhQ2xhc3NdXFxcIlxcclxcbiAgICAgICAgICAgICAgPlxcclxcbiAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cXFwiZXh0cmFjdEFyZ3MoZmllbGQubmFtZSlcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgOnJvdy1kYXRhPVxcXCJpdGVtXFxcIiA6cm93LWluZGV4PVxcXCJpdGVtSW5kZXhcXFwiIDpyb3ctZmllbGQ9XFxcImZpZWxkLnNvcnRGaWVsZFxcXCJcXHJcXG4gICAgICAgICAgICAgICAgPjwvY29tcG9uZW50PlxcclxcbiAgICAgICAgICAgICAgPC90ZD5cXHJcXG4gICAgICAgICAgICAgIDx0ZCB2LWlmPVxcXCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PT0gJ19fc2xvdCdcXFwiIFxcclxcbiAgICAgICAgICAgICAgICA6a2V5PVxcXCJmaWVsZEluZGV4XFxcIlxcclxcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XFxcIlsndnVldGFibGUtc2xvdCcsIGZpZWxkLmRhdGFDbGFzc11cXFwiXFxyXFxuICAgICAgICAgICAgICA+XFxyXFxuICAgICAgICAgICAgICAgIDxzbG90IDpuYW1lPVxcXCJleHRyYWN0QXJncyhmaWVsZC5uYW1lKVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICA6cm93LWRhdGE9XFxcIml0ZW1cXFwiIDpyb3ctaW5kZXg9XFxcIml0ZW1JbmRleFxcXCIgOnJvdy1maWVsZD1cXFwiZmllbGQuc29ydEZpZWxkXFxcIlxcclxcbiAgICAgICAgICAgICAgICA+PC9zbG90PlxcclxcbiAgICAgICAgICAgICAgPC90ZD5cXHJcXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XFxyXFxuICAgICAgICAgICAgICA8dGQgdi1pZj1cXFwiaGFzQ2FsbGJhY2soZmllbGQpXFxcIiBcXHJcXG4gICAgICAgICAgICAgICAgOmtleT1cXFwiZmllbGRJbmRleFxcXCJcXHJcXG4gICAgICAgICAgICAgICAgOmNsYXNzPVxcXCJmaWVsZC5kYXRhQ2xhc3NcXFwiXFxyXFxuICAgICAgICAgICAgICAgIHYtaHRtbD1cXFwiY2FsbENhbGxiYWNrKGZpZWxkLCBpdGVtKVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgQGNsaWNrPVxcXCJvbkNlbGxDbGlja2VkKGl0ZW0sIGZpZWxkLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgICAgICBAZGJsY2xpY2s9XFxcIm9uQ2VsbERvdWJsZUNsaWNrZWQoaXRlbSwgZmllbGQsICRldmVudClcXFwiXFxyXFxuICAgICAgICAgICAgICAgIEBjb250ZXh0bWVudT1cXFwib25DZWxsUmlnaHRDbGlja2VkKGl0ZW0sIGZpZWxkLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgICAgPjwvdGQ+XFxyXFxuICAgICAgICAgICAgICA8dGQgdi1lbHNlIFxcclxcbiAgICAgICAgICAgICAgICA6a2V5PVxcXCJmaWVsZEluZGV4XFxcIlxcclxcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XFxcImZpZWxkLmRhdGFDbGFzc1xcXCJcXHJcXG4gICAgICAgICAgICAgICAgdi1odG1sPVxcXCJnZXRPYmplY3RWYWx1ZShpdGVtLCBmaWVsZC5uYW1lLCAnJylcXFwiXFxyXFxuICAgICAgICAgICAgICAgIEBjbGljaz1cXFwib25DZWxsQ2xpY2tlZChpdGVtLCBmaWVsZCwgJGV2ZW50KVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgQGRibGNsaWNrPVxcXCJvbkNlbGxEb3VibGVDbGlja2VkKGl0ZW0sIGZpZWxkLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICAgICAgICBAY29udGV4dG1lbnU9XFxcIm9uQ2VsbFJpZ2h0Q2xpY2tlZChpdGVtLCBmaWVsZCwgJGV2ZW50KVxcXCJcXHJcXG4gICAgICAgICAgICAgID48L3RkPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgIDwvdHI+XFxyXFxuICAgICAgPHRlbXBsYXRlIHYtaWY9XFxcInVzZURldGFpbFJvd1xcXCI+XFxyXFxuICAgICAgICA8dHJhbnNpdGlvbiA6bmFtZT1cXFwiZGV0YWlsUm93VHJhbnNpdGlvblxcXCIgOmtleT1cXFwiaXRlbUluZGV4XFxcIj5cXHJcXG4gICAgICAgICAgPHRyIHYtaWY9XFxcImlzVmlzaWJsZURldGFpbFJvdyhpdGVtW3RyYWNrQnldKVxcXCJcXHJcXG4gICAgICAgICAgICA6Y2xhc3M9XFxcIltjc3MuZGV0YWlsUm93Q2xhc3NdXFxcIlxcclxcbiAgICAgICAgICAgIEBjbGljaz1cXFwib25EZXRhaWxSb3dDbGljayhpdGVtLCAkZXZlbnQpXFxcIlxcclxcbiAgICAgICAgICA+XFxyXFxuICAgICAgICAgICAgPHRkIDpjb2xzcGFuPVxcXCJjb3VudFZpc2libGVGaWVsZHNcXFwiPlxcclxcbiAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XFxcImRldGFpbFJvd0NvbXBvbmVudFxcXCIgOnJvdy1kYXRhPVxcXCJpdGVtXFxcIiA6cm93LWluZGV4PVxcXCJpdGVtSW5kZXhcXFwiPjwvY29tcG9uZW50PlxcclxcbiAgICAgICAgICAgIDwvdGQ+XFxyXFxuICAgICAgICAgIDwvdHI+XFxyXFxuICAgICAgICA8L3RyYW5zaXRpb24+XFxyXFxuICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPHRlbXBsYXRlIHYtaWY9XFxcImRpc3BsYXlFbXB0eURhdGFSb3dcXFwiPlxcclxcbiAgICAgIDx0cj5cXHJcXG4gICAgICAgIDx0ZCA6Y29sc3Bhbj1cXFwiY291bnRWaXNpYmxlRmllbGRzXFxcIiBjbGFzcz1cXFwidnVldGFibGUtZW1wdHktcmVzdWx0XFxcIiB2LWh0bWw9XFxcIm5vRGF0YVRlbXBsYXRlXFxcIj48L3RkPlxcclxcbiAgICAgIDwvdHI+XFxyXFxuICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgIDx0ZW1wbGF0ZSB2LWlmPVxcXCJsZXNzVGhhbk1pblJvd3NcXFwiPlxcclxcbiAgICAgIDx0ciB2LWZvcj1cXFwiaSBpbiBibGFua1Jvd3NcXFwiIGNsYXNzPVxcXCJibGFuay1yb3dcXFwiIDprZXk9XFxcImlcXFwiPlxcclxcbiAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVxcXCIoZmllbGQsIGZpZWxkSW5kZXgpIGluIHRhYmxlRmllbGRzXFxcIj5cXHJcXG4gICAgICAgICAgPHRkIHYtaWY9XFxcImZpZWxkLnZpc2libGVcXFwiIDprZXk9XFxcImZpZWxkSW5kZXhcXFwiPiZuYnNwOzwvdGQ+XFxyXFxuICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgIDwvdHI+XFxyXFxuICAgIDwvdGVtcGxhdGU+XFxyXFxuICA8L3Rib2R5PlxcclxcbjwvdGFibGU+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBmaWVsZHM6IHtcXHJcXG4gICAgICB0eXBlOiBBcnJheSxcXHJcXG4gICAgICByZXF1aXJlZDogdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBsb2FkT25TdGFydDoge1xcclxcbiAgICAgIHR5cGU6IEJvb2xlYW4sXFxyXFxuICAgICAgZGVmYXVsdDogdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBhcGlVcmw6IHtcXHJcXG4gICAgICAgIHR5cGU6IFN0cmluZyxcXHJcXG4gICAgICAgIGRlZmF1bHQ6ICcnXFxyXFxuICAgIH0sXFxyXFxuICAgIGh0dHBNZXRob2Q6IHtcXHJcXG4gICAgICAgIHR5cGU6IFN0cmluZyxcXHJcXG4gICAgICAgIGRlZmF1bHQ6ICdnZXQnLFxcclxcbiAgICAgICAgdmFsaWRhdG9yOiAodmFsdWUpID0+IHtcXHJcXG4gICAgICAgICAgcmV0dXJuIFsnZ2V0JywgJ3Bvc3QnXS5pbmRleE9mKHZhbHVlKSA+IC0xXFxyXFxuICAgICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHJlYWN0aXZlQXBpVXJsOiB7XFxyXFxuICAgICAgICB0eXBlOiBCb29sZWFuLFxcclxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBhcGlNb2RlOiB7XFxyXFxuICAgICAgdHlwZTogQm9vbGVhbixcXHJcXG4gICAgICBkZWZhdWx0OiB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIGRhdGE6IHtcXHJcXG4gICAgICB0eXBlOiBbQXJyYXksIE9iamVjdF0sXFxyXFxuICAgICAgZGVmYXVsdDogbnVsbFxcclxcbiAgICB9LFxcclxcbiAgICBkYXRhVG90YWw6IHtcXHJcXG4gICAgICB0eXBlOiBOdW1iZXIsXFxyXFxuICAgICAgZGVmYXVsdDogMFxcclxcbiAgICB9LFxcclxcbiAgICBkYXRhTWFuYWdlcjoge1xcclxcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxcclxcbiAgICAgIGRlZmF1bHQ6IG51bGxcXHJcXG4gICAgfSxcXHJcXG4gICAgZGF0YVBhdGg6IHtcXHJcXG4gICAgICAgIHR5cGU6IFN0cmluZyxcXHJcXG4gICAgICAgIGRlZmF1bHQ6ICdkYXRhJ1xcclxcbiAgICB9LFxcclxcbiAgICBwYWdpbmF0aW9uUGF0aDoge1xcclxcbiAgICAgICAgdHlwZTogW1N0cmluZ10sXFxyXFxuICAgICAgICBkZWZhdWx0OiAnbGlua3MucGFnaW5hdGlvbidcXHJcXG4gICAgfSxcXHJcXG4gICAgcXVlcnlQYXJhbXM6IHtcXHJcXG4gICAgICB0eXBlOiBbT2JqZWN0LCBGdW5jdGlvbl0sXFxyXFxuICAgICAgZGVmYXVsdCAoKSB7XFxyXFxuICAgICAgICByZXR1cm4ge1xcclxcbiAgICAgICAgICBzb3J0OiAnc29ydCcsXFxyXFxuICAgICAgICAgIHBhZ2U6ICdwYWdlJyxcXHJcXG4gICAgICAgICAgcGVyUGFnZTogJ3Blcl9wYWdlJ1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgYXBwZW5kUGFyYW1zOiB7XFxyXFxuICAgICAgdHlwZTogT2JqZWN0LFxcclxcbiAgICAgIGRlZmF1bHQgKCkge1xcclxcbiAgICAgICAgcmV0dXJuIHt9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBodHRwT3B0aW9uczoge1xcclxcbiAgICAgIHR5cGU6IE9iamVjdCxcXHJcXG4gICAgICBkZWZhdWx0ICgpIHtcXHJcXG4gICAgICAgIHJldHVybiB7fVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgaHR0cEZldGNoOiB7XFxyXFxuICAgICAgdHlwZTogRnVuY3Rpb24sXFxyXFxuICAgICAgZGVmYXVsdDogbnVsbFxcclxcbiAgICB9LFxcclxcbiAgICBwZXJQYWdlOiB7XFxyXFxuICAgICAgICB0eXBlOiBOdW1iZXIsXFxyXFxuICAgICAgICBkZWZhdWx0OiAxMFxcclxcbiAgICB9LFxcclxcbiAgICBpbml0aWFsUGFnZToge1xcclxcbiAgICAgIHR5cGU6IE51bWJlcixcXHJcXG4gICAgICBkZWZhdWx0OiAxXFxyXFxuICAgIH0sXFxyXFxuICAgIHNvcnRPcmRlcjoge1xcclxcbiAgICAgIHR5cGU6IEFycmF5LFxcclxcbiAgICAgIGRlZmF1bHQgKCkge1xcclxcbiAgICAgICAgcmV0dXJuIFtdXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBtdWx0aVNvcnQ6IHtcXHJcXG4gICAgICB0eXBlOiBCb29sZWFuLFxcclxcbiAgICAgIGRlZmF1bHQgKCkge1xcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB0YWJsZUhlaWdodDoge1xcclxcbiAgICAgIHR5cGU6IFN0cmluZyxcXHJcXG4gICAgICBkZWZhdWx0OiBudWxsXFxyXFxuICAgIH0sXFxyXFxuICAgIC8qXFxyXFxuICAgICAqIHBoeXNpY2FsIGtleSB0aGF0IHdpbGwgdHJpZ2dlciBtdWx0aS1zb3J0IG9wdGlvblxcclxcbiAgICAgKiBwb3NzaWJsZSB2YWx1ZXM6ICdhbHQnLCAnY3RybCcsICdtZXRhJywgJ3NoaWZ0J1xcclxcbiAgICAgKiAnY3RybCcgbWlnaHQgbm90IHdvcmsgYXMgZXhwZWN0ZWQgb24gTWFjXFxyXFxuICAgICAqL1xcclxcbiAgICBtdWx0aVNvcnRLZXk6IHtcXHJcXG4gICAgICB0eXBlOiBTdHJpbmcsXFxyXFxuICAgICAgZGVmYXVsdDogJ2FsdCdcXHJcXG4gICAgfSxcXHJcXG4gICAgLyogZGVwcmVjYXRlZCAqL1xcclxcbiAgICByb3dDbGFzc0NhbGxiYWNrOiB7XFxyXFxuICAgICAgdHlwZTogW1N0cmluZywgRnVuY3Rpb25dLFxcclxcbiAgICAgIGRlZmF1bHQ6ICcnXFxyXFxuICAgIH0sXFxyXFxuICAgIHJvd0NsYXNzOiB7XFxyXFxuICAgICAgdHlwZTogW1N0cmluZywgRnVuY3Rpb25dLFxcclxcbiAgICAgIGRlZmF1bHQ6ICcnXFxyXFxuICAgIH0sXFxyXFxuICAgIGRldGFpbFJvd0NvbXBvbmVudDoge1xcclxcbiAgICAgIHR5cGU6IFN0cmluZyxcXHJcXG4gICAgICBkZWZhdWx0OiAnJ1xcclxcbiAgICB9LFxcclxcbiAgICBkZXRhaWxSb3dUcmFuc2l0aW9uOiB7XFxyXFxuICAgICAgdHlwZTogU3RyaW5nLFxcclxcbiAgICAgIGRlZmF1bHQ6ICcnXFxyXFxuICAgIH0sXFxyXFxuICAgIHRyYWNrQnk6IHtcXHJcXG4gICAgICB0eXBlOiBTdHJpbmcsXFxyXFxuICAgICAgZGVmYXVsdDogJ2lkJ1xcclxcbiAgICB9LFxcclxcbiAgICBjc3M6IHtcXHJcXG4gICAgICB0eXBlOiBPYmplY3QsXFxyXFxuICAgICAgZGVmYXVsdCAoKSB7XFxyXFxuICAgICAgICByZXR1cm4ge1xcclxcbiAgICAgICAgICB0YWJsZUNsYXNzOiAndWkgYmx1ZSBzZWxlY3RhYmxlIGNlbGxlZCBzdGFja2FibGUgYXR0YWNoZWQgdGFibGUnLFxcclxcbiAgICAgICAgICBsb2FkaW5nQ2xhc3M6ICdsb2FkaW5nJyxcXHJcXG4gICAgICAgICAgYXNjZW5kaW5nSWNvbjogJ2JsdWUgY2hldnJvbiB1cCBpY29uJyxcXHJcXG4gICAgICAgICAgZGVzY2VuZGluZ0ljb246ICdibHVlIGNoZXZyb24gZG93biBpY29uJyxcXHJcXG4gICAgICAgICAgYXNjZW5kaW5nQ2xhc3M6ICdzb3J0ZWQtYXNjJyxcXHJcXG4gICAgICAgICAgZGVzY2VuZGluZ0NsYXNzOiAnc29ydGVkLWRlc2MnLFxcclxcbiAgICAgICAgICBzb3J0YWJsZUljb246ICcnLFxcclxcbiAgICAgICAgICBkZXRhaWxSb3dDbGFzczogJ3Z1ZXRhYmxlLWRldGFpbC1yb3cnLFxcclxcbiAgICAgICAgICBoYW5kbGVJY29uOiAnZ3JleSBzaWRlYmFyIGljb24nLFxcclxcbiAgICAgICAgICB0YWJsZUJvZHlDbGFzczogJ3Z1ZXRhYmxlLXNlbWFudGljLW5vLXRvcCB2dWV0YWJsZS1maXhlZC1sYXlvdXQnLFxcclxcbiAgICAgICAgICB0YWJsZUhlYWRlckNsYXNzOiAndnVldGFibGUtZml4ZWQtbGF5b3V0J1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgbWluUm93czoge1xcclxcbiAgICAgIHR5cGU6IE51bWJlcixcXHJcXG4gICAgICBkZWZhdWx0OiAwXFxyXFxuICAgIH0sXFxyXFxuICAgIHNpbGVudDoge1xcclxcbiAgICAgIHR5cGU6IEJvb2xlYW4sXFxyXFxuICAgICAgZGVmYXVsdDogZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgbm9EYXRhVGVtcGxhdGU6IHtcXHJcXG4gICAgICB0eXBlOiBTdHJpbmcsXFxyXFxuICAgICAgZGVmYXVsdCgpIHtcXHJcXG4gICAgICAgIHJldHVybiAnTm8gRGF0YSBBdmFpbGFibGUnXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzaG93U29ydEljb25zOiB7XFxyXFxuICAgICAgdHlwZTogQm9vbGVhbixcXHJcXG4gICAgICBkZWZhdWx0OiB0cnVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBldmVudFByZWZpeDogJ3Z1ZXRhYmxlOicsXFxyXFxuICAgICAgdGFibGVGaWVsZHM6IFtdLFxcclxcbiAgICAgIHRhYmxlRGF0YTogbnVsbCxcXHJcXG4gICAgICB0YWJsZVBhZ2luYXRpb246IG51bGwsXFxyXFxuICAgICAgY3VycmVudFBhZ2U6IHRoaXMuaW5pdGlhbFBhZ2UsXFxyXFxuICAgICAgc2VsZWN0ZWRUbzogW10sXFxyXFxuICAgICAgdmlzaWJsZURldGFpbFJvd3M6IFtdLFxcclxcbiAgICAgIGxhc3RTY3JvbGxQb3NpdGlvbjogMCxcXHJcXG4gICAgICBzY3JvbGxCYXJXaWR0aDogJzE3cHgnLCAvL2Nocm9tZSBkZWZhdWx0XFxyXFxuICAgICAgc2Nyb2xsVmlzaWJsZTogZmFsc2UsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgdGhpcy5ub3JtYWxpemVGaWVsZHMoKVxcclxcbiAgICB0aGlzLm5vcm1hbGl6ZVNvcnRPcmRlcigpXFxyXFxuICAgIGlmICh0aGlzLmlzRml4ZWRIZWFkZXIpIHtcXHJcXG4gICAgICB0aGlzLnNjcm9sbEJhcldpZHRoID0gdGhpcy5nZXRTY3JvbGxCYXJXaWR0aCgpICsgJ3B4JztcXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpIHtcXHJcXG4gICAgICB0aGlzLmZpcmVFdmVudCgnaW5pdGlhbGl6ZWQnLCB0aGlzLnRhYmxlRmllbGRzKVxcclxcbiAgICB9KVxcclxcblxcclxcbiAgICBpZiAodGhpcy5sb2FkT25TdGFydCkge1xcclxcbiAgICAgIHRoaXMubG9hZERhdGEoKVxcclxcbiAgICB9XFxyXFxuICAgIGlmICh0aGlzLmlzRml4ZWRIZWFkZXIpIHtcXHJcXG4gICAgICBsZXQgZWxlbSA9IHRoaXMuJGVsLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3Z1ZXRhYmxlLWJvZHktd3JhcHBlcicpWzBdO1xcclxcbiAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcXHJcXG4gICAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVTY3JvbGwpO1xcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGRlc3Ryb3llZCAoKSB7XFxyXFxuICAgIGxldCBlbGVtID0gdGhpcy4kZWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndnVldGFibGUtYm9keS13cmFwcGVyJylbMF07XFxyXFxuICAgIGlmIChlbGVtICE9IG51bGwpIHtcXHJcXG4gICAgICBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlU2Nyb2xsKTtcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIHZlcnNpb246ICgpID0+IFZFUlNJT04sXFxyXFxuICAgIHVzZURldGFpbFJvdyAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhWzBdICYmIHRoaXMuZGV0YWlsUm93Q29tcG9uZW50ICE9PSAnJyAmJiB0eXBlb2YgdGhpcy50YWJsZURhdGFbMF1bdGhpcy50cmFja0J5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcXHJcXG4gICAgICAgIHRoaXMud2FybignWW91IG5lZWQgdG8gZGVmaW5lIHVuaXF1ZSByb3cgaWRlbnRpZmllciBpbiBvcmRlciBmb3IgZGV0YWlsLXJvdyBmZWF0dXJlIHRvIHdvcmsuIFVzZSBgdHJhY2stYnlgIHByb3AgdG8gZGVmaW5lIG9uZSEnKVxcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIHJldHVybiB0aGlzLmRldGFpbFJvd0NvbXBvbmVudCAhPT0gJydcXHJcXG4gICAgfSxcXHJcXG4gICAgY291bnRWaXNpYmxlRmllbGRzICgpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy50YWJsZUZpZWxkcy5maWx0ZXIoZnVuY3Rpb24oZmllbGQpIHtcXHJcXG4gICAgICAgIHJldHVybiBmaWVsZC52aXNpYmxlXFxyXFxuICAgICAgfSkubGVuZ3RoXFxyXFxuICAgIH0sXFxyXFxuICAgIGNvdW50VGFibGVEYXRhICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy50YWJsZURhdGEgPT09IG51bGwpIHtcXHJcXG4gICAgICAgIHJldHVybiAwXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlRGF0YS5sZW5ndGhcXHJcXG4gICAgfSxcXHJcXG4gICAgZGlzcGxheUVtcHR5RGF0YVJvdyAoKSB7XFxyXFxuICAgICAgcmV0dXJuIHRoaXMuY291bnRUYWJsZURhdGEgPT09IDAgJiYgdGhpcy5ub0RhdGFUZW1wbGF0ZS5sZW5ndGggPiAwXFxyXFxuICAgIH0sXFxyXFxuICAgIGxlc3NUaGFuTWluUm93cyAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMudGFibGVEYXRhID09PSBudWxsIHx8IHRoaXMudGFibGVEYXRhLmxlbmd0aCA9PT0gMCkge1xcclxcbiAgICAgICAgcmV0dXJuIHRydWVcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIHRoaXMudGFibGVEYXRhLmxlbmd0aCA8IHRoaXMubWluUm93c1xcclxcbiAgICB9LFxcclxcbiAgICBibGFua1Jvd3MgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLnRhYmxlRGF0YSA9PT0gbnVsbCB8fCB0aGlzLnRhYmxlRGF0YS5sZW5ndGggPT09IDApIHtcXHJcXG4gICAgICAgIHJldHVybiB0aGlzLm1pblJvd3NcXHJcXG4gICAgICB9XFxyXFxuICAgICAgaWYgKHRoaXMudGFibGVEYXRhLmxlbmd0aCA+PSB0aGlzLm1pblJvd3MpIHtcXHJcXG4gICAgICAgIHJldHVybiAwXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIHJldHVybiB0aGlzLm1pblJvd3MgLSB0aGlzLnRhYmxlRGF0YS5sZW5ndGhcXHJcXG4gICAgfSxcXHJcXG4gICAgaXNBcGlNb2RlICgpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy5hcGlNb2RlXFxyXFxuICAgIH0sXFxyXFxuICAgIGlzRGF0YU1vZGUgKCkge1xcclxcbiAgICAgIHJldHVybiAhIHRoaXMuYXBpTW9kZVxcclxcbiAgICB9LFxcclxcbiAgICBpc0ZpeGVkSGVhZGVyICgpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy50YWJsZUhlaWdodCAhPSBudWxsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGdldFNjcm9sbEJhcldpZHRoICgpIHtcXHJcXG4gICAgICBjb25zdCBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xcclxcbiAgICAgIGNvbnN0IGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XFxyXFxuXFxyXFxuICAgICAgb3V0ZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xcclxcbiAgICAgIG91dGVyLnN0eWxlLndpZHRoID0gJzEwMHB4JztcXHJcXG5cXHJcXG4gICAgICBpbm5lci5zdHlsZS53aWR0aCA9ICcxMDAlJztcXHJcXG5cXHJcXG5cXHJcXG4gICAgICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7XFxyXFxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdXRlcik7XFxyXFxuXFxyXFxuXFxyXFxuICAgICAgY29uc3Qgd2lkdGhXaXRob3V0U2Nyb2xsYmFyID0gb3V0ZXIub2Zmc2V0V2lkdGg7XFxyXFxuXFxyXFxuICAgICAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcXHJcXG5cXHJcXG4gICAgICBjb25zdCB3aWR0aFdpdGhTY3JvbGxiYXIgPSBpbm5lci5vZmZzZXRXaWR0aDtcXHJcXG5cXHJcXG5cXHJcXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG91dGVyKTtcXHJcXG5cXHJcXG5cXHJcXG4gICAgICByZXR1cm4gKHdpZHRoV2l0aG91dFNjcm9sbGJhciAtIHdpZHRoV2l0aFNjcm9sbGJhcik7XFxyXFxuICAgIH0sXFxyXFxuICAgIGhhbmRsZVNjcm9sbCAoZSkgeyAvL21ha2Ugc3VyZSB0aGF0IHRoZSBoZWFkZXIgYW5kIHRoZSBib2R5IGFyZSBhbGlnbmVkIHdoZW4gc2Nyb2xsaW5nIGhvcml6b250YWxseSBvbiBhIHRhYmxlIHRoYXQgaXMgd2lkZXIgdGhhbiB0aGUgdmlld3BvcnRcXHJcXG4gICAgICBsZXQgaG9yaXpvbnRhbCA9IGUuY3VycmVudFRhcmdldC5zY3JvbGxMZWZ0O1xcclxcbiAgICAgIGlmIChob3Jpem9udGFsICE9IHRoaXMubGFzdFNjcm9sbFBvc2l0aW9uKSB7IC8vZG9uJ3QgbW9kaWZ5IGhlYWRlciBzY3JvbGwgaWYgd2UgYXJlIHNjcm9sbGluZyB2ZXJ0aWNhbGx5XFxyXFxuICAgICAgICBsZXQgaGVhZGVyID0gdGhpcy4kZWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndnVldGFibGUtaGVhZC13cmFwcGVyJylbMF1cXHJcXG4gICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkge1xcclxcbiAgICAgICAgICBoZWFkZXIuc2Nyb2xsTGVmdCA9IGhvcml6b250YWw7XFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICB0aGlzLmxhc3RTY3JvbGxQb3NpdGlvbiA9IGhvcml6b250YWw7XFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICB9LFxcclxcbiAgICBub3JtYWxpemVGaWVsZHMgKCkge1xcclxcbiAgICAgIGlmICh0eXBlb2YodGhpcy5maWVsZHMpID09PSAndW5kZWZpbmVkJykge1xcclxcbiAgICAgICAgdGhpcy53YXJuKCdZb3UgbmVlZCB0byBwcm92aWRlIFxcXCJmaWVsZHNcXFwiIHByb3AuJylcXHJcXG4gICAgICAgIHJldHVyblxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICB0aGlzLnRhYmxlRmllbGRzID0gW11cXHJcXG4gICAgICBsZXQgc2VsZiA9IHRoaXNcXHJcXG4gICAgICBsZXQgb2JqXFxyXFxuICAgICAgdGhpcy5maWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCwgaSkge1xcclxcbiAgICAgICAgaWYgKHR5cGVvZiAoZmllbGQpID09PSAnc3RyaW5nJykge1xcclxcbiAgICAgICAgICBvYmogPSB7XFxyXFxuICAgICAgICAgICAgbmFtZTogZmllbGQsXFxyXFxuICAgICAgICAgICAgdGl0bGU6IHNlbGYuc2V0VGl0bGUoZmllbGQpLFxcclxcbiAgICAgICAgICAgIHRpdGxlQ2xhc3M6ICcnLFxcclxcbiAgICAgICAgICAgIGRhdGFDbGFzczogJycsXFxyXFxuICAgICAgICAgICAgY2FsbGJhY2s6IG51bGwsXFxyXFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcXHJcXG4gICAgICAgICAgfVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgb2JqID0ge1xcclxcbiAgICAgICAgICAgIG5hbWU6IGZpZWxkLm5hbWUsXFxyXFxuICAgICAgICAgICAgd2lkdGg6IGZpZWxkLndpZHRoLFxcclxcbiAgICAgICAgICAgIHRpdGxlOiAoZmllbGQudGl0bGUgPT09IHVuZGVmaW5lZCkgPyBzZWxmLnNldFRpdGxlKGZpZWxkLm5hbWUpIDogZmllbGQudGl0bGUsXFxyXFxuICAgICAgICAgICAgc29ydEZpZWxkOiBmaWVsZC5zb3J0RmllbGQsXFxyXFxuICAgICAgICAgICAgdGl0bGVDbGFzczogKGZpZWxkLnRpdGxlQ2xhc3MgPT09IHVuZGVmaW5lZCkgPyAnJyA6IGZpZWxkLnRpdGxlQ2xhc3MsXFxyXFxuICAgICAgICAgICAgZGF0YUNsYXNzOiAoZmllbGQuZGF0YUNsYXNzID09PSB1bmRlZmluZWQpID8gJycgOiBmaWVsZC5kYXRhQ2xhc3MsXFxyXFxuICAgICAgICAgICAgY2FsbGJhY2s6IChmaWVsZC5jYWxsYmFjayA9PT0gdW5kZWZpbmVkKSA/ICcnIDogZmllbGQuY2FsbGJhY2ssXFxyXFxuICAgICAgICAgICAgdmlzaWJsZTogKGZpZWxkLnZpc2libGUgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogZmllbGQudmlzaWJsZSxcXHJcXG4gICAgICAgICAgfVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgc2VsZi50YWJsZUZpZWxkcy5wdXNoKG9iailcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LFxcclxcbiAgICBzZXREYXRhIChkYXRhKSB7XFxyXFxuICAgICAgaWYgKGRhdGEgPT09IG51bGwgfHwgdHlwZW9mKGRhdGEpID09PSAndW5kZWZpbmVkJykgcmV0dXJuXFxyXFxuXFxyXFxuICAgICAgdGhpcy5maXJlRXZlbnQoJ2xvYWRpbmcnKVxcclxcblxcclxcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XFxyXFxuICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IGRhdGFcXHJcXG4gICAgICAgIHRoaXMuZmlyZUV2ZW50KCdsb2FkZWQnKVxcclxcbiAgICAgICAgcmV0dXJuXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIHRoaXMudGFibGVEYXRhID0gdGhpcy5nZXRPYmplY3RWYWx1ZShkYXRhLCB0aGlzLmRhdGFQYXRoLCBudWxsKVxcclxcbiAgICAgIHRoaXMudGFibGVQYWdpbmF0aW9uID0gdGhpcy5nZXRPYmplY3RWYWx1ZShkYXRhLCB0aGlzLnBhZ2luYXRpb25QYXRoLCBudWxsKVxcclxcblxcclxcbiAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCkge1xcclxcbiAgICAgICAgdGhpcy5maXhIZWFkZXIoKVxcclxcbiAgICAgICAgdGhpcy5maXJlRXZlbnQoJ3BhZ2luYXRpb24tZGF0YScsIHRoaXMudGFibGVQYWdpbmF0aW9uKVxcclxcbiAgICAgICAgdGhpcy5maXJlRXZlbnQoJ2xvYWRlZCcpXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgc2V0VGl0bGUgKHN0cikge1xcclxcbiAgICAgIGlmICh0aGlzLmlzU3BlY2lhbEZpZWxkKHN0cikpIHtcXHJcXG4gICAgICAgIHJldHVybiAnJ1xcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICByZXR1cm4gdGhpcy50aXRsZUNhc2Uoc3RyKVxcclxcbiAgICB9LFxcclxcbiAgICBnZXRUaXRsZSAoZmllbGQpIHtcXHJcXG4gICAgICBpZiAodHlwZW9mKGZpZWxkLnRpdGxlKSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZpZWxkLnRpdGxlKClcXHJcXG5cXHJcXG4gICAgICByZXR1cm4gdHlwZW9mKGZpZWxkLnRpdGxlKSA9PT0gJ3VuZGVmaW5lZCdcXHJcXG4gICAgICAgID8gZmllbGQubmFtZS5yZXBsYWNlKCcuJywgJyAnKVxcclxcbiAgICAgICAgOiBmaWVsZC50aXRsZVxcclxcbiAgICB9LFxcclxcbiAgICByZW5kZXJUaXRsZSAoZmllbGQpIHtcXHJcXG4gICAgICBsZXQgdGl0bGUgPSB0aGlzLmdldFRpdGxlKGZpZWxkKVxcclxcblxcclxcbiAgICAgIGlmICh0aXRsZS5sZW5ndGggPiAwICYmIHRoaXMuaXNJbkN1cnJlbnRTb3J0R3JvdXAoZmllbGQpIHx8IHRoaXMuaGFzU29ydGFibGVJY29uKGZpZWxkKSkge1xcclxcbiAgICAgICAgbGV0IHN0eWxlID0gYG9wYWNpdHk6JHt0aGlzLnNvcnRJY29uT3BhY2l0eShmaWVsZCl9O3Bvc2l0aW9uOnJlbGF0aXZlO2Zsb2F0OnJpZ2h0YFxcclxcbiAgICAgICAgbGV0IGljb25UYWcgPSB0aGlzLnNob3dTb3J0SWNvbnMgPyB0aGlzLnJlbmRlckljb25UYWcoWydzb3J0LWljb24nLCB0aGlzLnNvcnRJY29uKGZpZWxkKV0sIGBzdHlsZT1cXFwiJHtzdHlsZX1cXFwiYCkgOiAnJ1xcclxcbiAgICAgICAgcmV0dXJuIHRpdGxlICsgJyAnICsgaWNvblRhZ1xcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICByZXR1cm4gdGl0bGVcXHJcXG4gICAgfSxcXHJcXG4gICAgcmVuZGVyU2VxdWVuY2UgKGluZGV4KSB7XFxyXFxuICAgICAgcmV0dXJuIHRoaXMudGFibGVQYWdpbmF0aW9uXFxyXFxuICAgICAgICA/IHRoaXMudGFibGVQYWdpbmF0aW9uLmZyb20gKyBpbmRleFxcclxcbiAgICAgICAgOiBpbmRleFxcclxcbiAgICB9LFxcclxcbiAgICByZW5kZXJOb3JtYWxGaWVsZCAoZmllbGQsIGl0ZW0pIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy5oYXNDYWxsYmFjayhmaWVsZClcXHJcXG4gICAgICAgID8gdGhpcy5jYWxsQ2FsbGJhY2soZmllbGQsIGl0ZW0pXFxyXFxuICAgICAgICA6IHRoaXMuZ2V0T2JqZWN0VmFsdWUoaXRlbSwgZmllbGQubmFtZSwgJycpXFxyXFxuICAgIH0sXFxyXFxuICAgIGlzU3BlY2lhbEZpZWxkIChmaWVsZE5hbWUpIHtcXHJcXG4gICAgICByZXR1cm4gZmllbGROYW1lLnNsaWNlKDAsIDIpID09PSAnX18nXFxyXFxuICAgIH0sXFxyXFxuICAgIHRpdGxlQ2FzZSAoc3RyKSB7XFxyXFxuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXFxcdysvZywgZnVuY3Rpb24odHh0KSB7XFxyXFxuICAgICAgICByZXR1cm4gdHh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdHh0LnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgY2FtZWxDYXNlIChzdHIsIGRlbGltaXRlciA9ICdfJykge1xcclxcbiAgICAgIGxldCBzZWxmID0gdGhpc1xcclxcbiAgICAgIHJldHVybiBzdHIuc3BsaXQoZGVsaW1pdGVyKS5tYXAoZnVuY3Rpb24oaXRlbSkge1xcclxcbiAgICAgICAgcmV0dXJuIHNlbGYudGl0bGVDYXNlKGl0ZW0pXFxyXFxuICAgICAgfSkuam9pbignJylcXHJcXG4gICAgfSxcXHJcXG4gICAgbm90SW4gKHN0ciwgYXJyKSB7XFxyXFxuICAgICAgcmV0dXJuIGFyci5pbmRleE9mKHN0cikgPT09IC0xXFxyXFxuICAgIH0sXFxyXFxuICAgIGxvYWREYXRhIChzdWNjZXNzID0gdGhpcy5sb2FkU3VjY2VzcywgZmFpbGVkID0gdGhpcy5sb2FkRmFpbGVkKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuaXNEYXRhTW9kZSkge1xcclxcbiAgICAgICAgdGhpcy5jYWxsRGF0YU1hbmFnZXIoKVxcclxcbiAgICAgICAgcmV0dXJuXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIHRoaXMuZmlyZUV2ZW50KCdsb2FkaW5nJylcXHJcXG5cXHJcXG4gICAgICB0aGlzLmh0dHBPcHRpb25zWydwYXJhbXMnXSA9IHRoaXMuZ2V0QXBwZW5kUGFyYW1zKCB0aGlzLmdldEFsbFF1ZXJ5UGFyYW1zKCkgKVxcclxcblxcclxcbiAgICAgIHJldHVybiB0aGlzLmZldGNoKHRoaXMuYXBpVXJsLCB0aGlzLmh0dHBPcHRpb25zKS50aGVuKFxcclxcbiAgICAgICAgICBzdWNjZXNzLFxcclxcbiAgICAgICAgICBmYWlsZWRcXHJcXG4gICAgICApLmNhdGNoKCgpID0+IGZhaWxlZCgpKVxcclxcbiAgICB9LFxcclxcbiAgICBmZXRjaCAoYXBpVXJsLCBodHRwT3B0aW9ucykge1xcclxcbiAgICAgIHJldHVybiB0aGlzLmh0dHBGZXRjaFxcclxcbiAgICAgICAgICA/IHRoaXMuaHR0cEZldGNoKGFwaVVybCwgaHR0cE9wdGlvbnMpXFxyXFxuICAgICAgICAgIDogYXhpb3NbdGhpcy5odHRwTWV0aG9kXShhcGlVcmwsIGh0dHBPcHRpb25zKVxcclxcbiAgICB9LFxcclxcbiAgICBsb2FkU3VjY2VzcyAocmVzcG9uc2UpIHtcXHJcXG4gICAgICB0aGlzLmZpcmVFdmVudCgnbG9hZC1zdWNjZXNzJywgcmVzcG9uc2UpXFxyXFxuXFxyXFxuICAgICAgbGV0IGJvZHkgPSB0aGlzLnRyYW5zZm9ybShyZXNwb25zZS5kYXRhKVxcclxcblxcclxcbiAgICAgIHRoaXMudGFibGVEYXRhID0gdGhpcy5nZXRPYmplY3RWYWx1ZShib2R5LCB0aGlzLmRhdGFQYXRoLCBudWxsKVxcclxcbiAgICAgIHRoaXMudGFibGVQYWdpbmF0aW9uID0gdGhpcy5nZXRPYmplY3RWYWx1ZShib2R5LCB0aGlzLnBhZ2luYXRpb25QYXRoLCBudWxsKVxcclxcblxcclxcbiAgICAgIGlmICh0aGlzLnRhYmxlUGFnaW5hdGlvbiA9PT0gbnVsbCkge1xcclxcbiAgICAgICAgdGhpcy53YXJuKCd2dWV0YWJsZTogcGFnaW5hdGlvbi1wYXRoIFxcXCInICsgdGhpcy5wYWdpbmF0aW9uUGF0aCArICdcXFwiIG5vdCBmb3VuZC4gJ1xcclxcbiAgICAgICAgICArICdJdCBsb29rcyBsaWtlIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIHNldmVyIGRvZXMgbm90IGhhdmUgcGFnaW5hdGlvbiBpbmZvcm1hdGlvbiAnXFxyXFxuICAgICAgICAgICsgXFxcIm9yIHlvdSBtYXkgaGF2ZSBzZXQgaXQgaW5jb3JyZWN0bHkuXFxcXG5cXFwiXFxyXFxuICAgICAgICAgICsgJ1lvdSBjYW4gZXhwbGljaXRseSBzdXBwcmVzcyB0aGlzIHdhcm5pbmcgYnkgc2V0dGluZyBwYWdpbmF0aW9uLXBhdGg9XFxcIlxcXCIuJ1xcclxcbiAgICAgICAgKVxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpIHtcXHJcXG4gICAgICAgIHRoaXMuZml4SGVhZGVyKClcXHJcXG4gICAgICAgIHRoaXMuZmlyZUV2ZW50KCdwYWdpbmF0aW9uLWRhdGEnLCB0aGlzLnRhYmxlUGFnaW5hdGlvbilcXHJcXG4gICAgICAgIHRoaXMuZmlyZUV2ZW50KCdsb2FkZWQnKVxcclxcbiAgICAgIH0pXFxyXFxuICAgIH0sXFxyXFxuICAgIGZpeEhlYWRlcigpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuaXNGaXhlZEhlYWRlcikge1xcclxcbiAgICAgICAgcmV0dXJuO1xcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICBsZXQgZWxlbSA9IHRoaXMuJGVsLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3Z1ZXRhYmxlLWJvZHktd3JhcHBlcicpWzBdXFxyXFxuICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xcclxcbiAgICAgICAgaWYgKGVsZW0uc2Nyb2xsSGVpZ2h0ID4gZWxlbS5jbGllbnRIZWlnaHQpIHtcXHJcXG4gICAgICAgICAgdGhpcy5zY3JvbGxWaXNpYmxlID0gdHJ1ZTtcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIGVsc2Uge1xcclxcbiAgICAgICAgICB0aGlzLnNjcm9sbFZpc2libGUgPSBmYWxzZTtcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGxvYWRGYWlsZWQgKHJlc3BvbnNlKSB7XFxyXFxuICAgICAgY29uc29sZS5lcnJvcignbG9hZC1lcnJvcicsIHJlc3BvbnNlKVxcclxcbiAgICAgIHRoaXMuZmlyZUV2ZW50KCdsb2FkLWVycm9yJywgcmVzcG9uc2UpXFxyXFxuICAgICAgdGhpcy5maXJlRXZlbnQoJ2xvYWRlZCcpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRyYW5zZm9ybSAoZGF0YSkge1xcclxcbiAgICAgIGxldCBmdW5jID0gJ3RyYW5zZm9ybSdcXHJcXG5cXHJcXG4gICAgICBpZiAodGhpcy5wYXJlbnRGdW5jdGlvbkV4aXN0cyhmdW5jKSkge1xcclxcbiAgICAgICAgICByZXR1cm4gdGhpcy4kcGFyZW50W2Z1bmNdLmNhbGwodGhpcy4kcGFyZW50LCBkYXRhKVxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICByZXR1cm4gZGF0YVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJlbnRGdW5jdGlvbkV4aXN0cyAoZnVuYykge1xcclxcbiAgICAgIHJldHVybiAoZnVuYyAhPT0gJycgJiYgdHlwZW9mIHRoaXMuJHBhcmVudFtmdW5jXSA9PT0gJ2Z1bmN0aW9uJylcXHJcXG4gICAgfSxcXHJcXG4gICAgY2FsbFBhcmVudEZ1bmN0aW9uIChmdW5jLCBhcmdzLCBkZWZhdWx0VmFsdWUgPSBudWxsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMucGFyZW50RnVuY3Rpb25FeGlzdHMoZnVuYykpIHtcXHJcXG4gICAgICAgIHJldHVybiB0aGlzLiRwYXJlbnRbZnVuY10uY2FsbCh0aGlzLiRwYXJlbnQsIGFyZ3MpXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcXHJcXG4gICAgfSxcXHJcXG4gICAgZmlyZUV2ZW50IChldmVudE5hbWUsIGFyZ3MpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KHRoaXMuZXZlbnRQcmVmaXggKyBldmVudE5hbWUsIGFyZ3MpXFxyXFxuICAgIH0sXFxyXFxuICAgIHdhcm4gKG1zZykge1xcclxcbiAgICAgIGlmICghdGhpcy5zaWxlbnQpIHtcXHJcXG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBnZXRBbGxRdWVyeVBhcmFtcyAoKSB7XFxyXFxuICAgICAgbGV0IHBhcmFtcyA9IHt9XFxyXFxuXFxyXFxuICAgICAgaWYgKHR5cGVvZih0aGlzLnF1ZXJ5UGFyYW1zKSA9PT0gJ2Z1bmN0aW9uJykge1xcclxcbiAgICAgICAgcGFyYW1zID0gdGhpcy5xdWVyeVBhcmFtcyh0aGlzLnNvcnRPcmRlciwgdGhpcy5jdXJyZW50UGFnZSwgdGhpcy5wZXJQYWdlKVxcclxcbiAgICAgICAgcmV0dXJuIHR5cGVvZihwYXJhbXMpICE9PSAnb2JqZWN0JyA/IHt9IDogcGFyYW1zXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIHBhcmFtc1t0aGlzLnF1ZXJ5UGFyYW1zLnNvcnRdID0gdGhpcy5nZXRTb3J0UGFyYW0oKVxcclxcbiAgICAgIHBhcmFtc1t0aGlzLnF1ZXJ5UGFyYW1zLnBhZ2VdID0gdGhpcy5jdXJyZW50UGFnZVxcclxcbiAgICAgIHBhcmFtc1t0aGlzLnF1ZXJ5UGFyYW1zLnBlclBhZ2VdID0gdGhpcy5wZXJQYWdlXFxyXFxuXFxyXFxuICAgICAgcmV0dXJuIHBhcmFtc1xcclxcbiAgICB9LFxcclxcbiAgICBnZXRTb3J0UGFyYW0gKCkge1xcclxcbiAgICAgIGlmICghdGhpcy5zb3J0T3JkZXIgfHwgdGhpcy5zb3J0T3JkZXIuZmllbGQgPT0gJycpIHtcXHJcXG4gICAgICAgIHJldHVybiAnJ1xcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICBpZiAodHlwZW9mIHRoaXMuJHBhcmVudFsnZ2V0U29ydFBhcmFtJ10gPT09ICdmdW5jdGlvbicpIHtcXHJcXG4gICAgICAgIHJldHVybiB0aGlzLiRwYXJlbnRbJ2dldFNvcnRQYXJhbSddLmNhbGwodGhpcy4kcGFyZW50LCB0aGlzLnNvcnRPcmRlcilcXHJcXG4gICAgICB9XFxyXFxuXFxyXFxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFNvcnRQYXJhbSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldERlZmF1bHRTb3J0UGFyYW0gKCkge1xcclxcbiAgICAgIGxldCByZXN1bHQgPSAnJztcXHJcXG5cXHJcXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc29ydE9yZGVyLmxlbmd0aDsgaSsrKSB7XFxyXFxuICAgICAgICBsZXQgZmllbGROYW1lID0gKHR5cGVvZiB0aGlzLnNvcnRPcmRlcltpXS5zb3J0RmllbGQgPT09ICd1bmRlZmluZWQnKVxcclxcbiAgICAgICAgICA/IHRoaXMuc29ydE9yZGVyW2ldLmZpZWxkXFxyXFxuICAgICAgICAgIDogdGhpcy5zb3J0T3JkZXJbaV0uc29ydEZpZWxkO1xcclxcblxcclxcbiAgICAgICAgcmVzdWx0ICs9IGZpZWxkTmFtZSArICd8JyArIHRoaXMuc29ydE9yZGVyW2ldLmRpcmVjdGlvbiArICgoaSsxKSA8IHRoaXMuc29ydE9yZGVyLmxlbmd0aCA/ICcsJyA6ICcnKTtcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIHJlc3VsdDtcXHJcXG4gICAgfSxcXHJcXG4gICAgZ2V0QXBwZW5kUGFyYW1zIChwYXJhbXMpIHtcXHJcXG4gICAgICBmb3IgKGxldCB4IGluIHRoaXMuYXBwZW5kUGFyYW1zKSB7XFxyXFxuICAgICAgICBwYXJhbXNbeF0gPSB0aGlzLmFwcGVuZFBhcmFtc1t4XVxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICByZXR1cm4gcGFyYW1zXFxyXFxuICAgIH0sXFxyXFxuICAgIGV4dHJhY3ROYW1lIChzdHJpbmcpIHtcXHJcXG4gICAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCc6JylbMF0udHJpbSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIGV4dHJhY3RBcmdzIChzdHJpbmcpIHtcXHJcXG4gICAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCc6JylbMV1cXHJcXG4gICAgfSxcXHJcXG4gICAgaXNTb3J0YWJsZSAoZmllbGQpIHtcXHJcXG4gICAgICByZXR1cm4gISh0eXBlb2YgZmllbGQuc29ydEZpZWxkID09PSAndW5kZWZpbmVkJylcXHJcXG4gICAgfSxcXHJcXG4gICAgaXNJbkN1cnJlbnRTb3J0R3JvdXAgKGZpZWxkKSB7XFxyXFxuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnRPcmRlclBvc2l0aW9uKGZpZWxkKSAhPT0gZmFsc2U7XFxyXFxuICAgIH0sXFxyXFxuICAgIGhhc1NvcnRhYmxlSWNvbiAoZmllbGQpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy5pc1NvcnRhYmxlKGZpZWxkKSAmJiB0aGlzLmNzcy5zb3J0YWJsZUljb24gIT0gJydcXHJcXG4gICAgfSxcXHJcXG4gICAgY3VycmVudFNvcnRPcmRlclBvc2l0aW9uIChmaWVsZCkge1xcclxcbiAgICAgIGlmICggISB0aGlzLmlzU29ydGFibGUoZmllbGQpKSB7XFxyXFxuICAgICAgICByZXR1cm4gZmFsc2VcXHJcXG4gICAgICB9XFxyXFxuXFxyXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvcnRPcmRlci5sZW5ndGg7IGkrKykge1xcclxcbiAgICAgICAgaWYgKHRoaXMuZmllbGRJc0luU29ydE9yZGVyUG9zaXRpb24oZmllbGQsIGkpKSB7XFxyXFxuICAgICAgICAgIHJldHVybiBpO1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICByZXR1cm4gZmFsc2U7XFxyXFxuICAgIH0sXFxyXFxuICAgIGZpZWxkSXNJblNvcnRPcmRlclBvc2l0aW9uIChmaWVsZCwgaSkge1xcclxcbiAgICAgIHJldHVybiB0aGlzLnNvcnRPcmRlcltpXS5maWVsZCA9PT0gZmllbGQubmFtZSAmJiB0aGlzLnNvcnRPcmRlcltpXS5zb3J0RmllbGQgPT09IGZpZWxkLnNvcnRGaWVsZFxcclxcbiAgICB9LFxcclxcbiAgICBvcmRlckJ5IChmaWVsZCwgZXZlbnQpIHtcXHJcXG4gICAgICBpZiAoICEgdGhpcy5pc1NvcnRhYmxlKGZpZWxkKSApIHJldHVyblxcclxcblxcclxcbiAgICAgIGxldCBrZXkgPSB0aGlzLm11bHRpU29ydEtleS50b0xvd2VyQ2FzZSgpICsgJ0tleSdcXHJcXG5cXHJcXG4gICAgICBpZiAodGhpcy5tdWx0aVNvcnQgJiYgZXZlbnRba2V5XSkgeyAvL2FkZGluZyBjb2x1bW4gdG8gbXVsdGlzb3J0XFxyXFxuICAgICAgICB0aGlzLm11bHRpQ29sdW1uU29ydChmaWVsZClcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgLy9ubyBtdWx0aXNvcnQsIG9yIHJlc2V0dGluZyBzb3J0XFxyXFxuICAgICAgICB0aGlzLnNpbmdsZUNvbHVtblNvcnQoZmllbGQpXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxICAgIC8vIHJlc2V0IHBhZ2UgaW5kZXhcXHJcXG4gICAgICBpZiAodGhpcy5hcGlNb2RlIHx8IHRoaXMuZGF0YU1hbmFnZXIpIHtcXHJcXG4gICAgICAgIHRoaXMubG9hZERhdGEoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgbXVsdGlDb2x1bW5Tb3J0IChmaWVsZCkge1xcclxcbiAgICAgIGxldCBpID0gdGhpcy5jdXJyZW50U29ydE9yZGVyUG9zaXRpb24oZmllbGQpO1xcclxcblxcclxcbiAgICAgIGlmKGkgPT09IGZhbHNlKSB7IC8vdGhpcyBmaWVsZCBpcyBub3QgaW4gdGhlIHNvcnQgYXJyYXkgeWV0XFxyXFxuICAgICAgICB0aGlzLnNvcnRPcmRlci5wdXNoKHtcXHJcXG4gICAgICAgICAgZmllbGQ6IGZpZWxkLm5hbWUsXFxyXFxuICAgICAgICAgIHNvcnRGaWVsZDogZmllbGQuc29ydEZpZWxkLFxcclxcbiAgICAgICAgICBkaXJlY3Rpb246ICdhc2MnXFxyXFxuICAgICAgICB9KTtcXHJcXG4gICAgICB9IGVsc2UgeyAvL3RoaXMgZmllbGQgaXMgaW4gdGhlIHNvcnQgYXJyYXksIG5vdyB3ZSBjaGFuZ2UgaXRzIHN0YXRlXFxyXFxuICAgICAgICBpZih0aGlzLnNvcnRPcmRlcltpXS5kaXJlY3Rpb24gPT09ICdhc2MnKSB7XFxyXFxuICAgICAgICAgIC8vIHN3aXRjaCBkaXJlY3Rpb25cXHJcXG4gICAgICAgICAgdGhpcy5zb3J0T3JkZXJbaV0uZGlyZWN0aW9uID0gJ2Rlc2MnXFxyXFxuICAgICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgICAvL3JlbW92ZSBzb3J0IGNvbmRpdGlvblxcclxcbiAgICAgICAgICB0aGlzLnNvcnRPcmRlci5zcGxpY2UoaSwgMSk7XFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzaW5nbGVDb2x1bW5Tb3J0IChmaWVsZCkge1xcclxcbiAgICAgIGlmICh0aGlzLnNvcnRPcmRlci5sZW5ndGggPT09IDApIHtcXHJcXG4gICAgICAgIHRoaXMuY2xlYXJTb3J0T3JkZXIoKVxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICB0aGlzLnNvcnRPcmRlci5zcGxpY2UoMSk7IC8vcmVtb3ZlcyBhZGRpdGlvbmFsIGNvbHVtbnNcXHJcXG5cXHJcXG4gICAgICBpZiAodGhpcy5maWVsZElzSW5Tb3J0T3JkZXJQb3NpdGlvbihmaWVsZCwgMCkpIHtcXHJcXG4gICAgICAgIC8vIGNoYW5nZSBzb3J0IGRpcmVjdGlvblxcclxcbiAgICAgICAgdGhpcy5zb3J0T3JkZXJbMF0uZGlyZWN0aW9uID0gdGhpcy5zb3J0T3JkZXJbMF0uZGlyZWN0aW9uID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIC8vIHJlc2V0IHNvcnQgZGlyZWN0aW9uXFxyXFxuICAgICAgICB0aGlzLnNvcnRPcmRlclswXS5kaXJlY3Rpb24gPSAnYXNjJ1xcclxcbiAgICAgIH1cXHJcXG4gICAgICB0aGlzLnNvcnRPcmRlclswXS5maWVsZCA9IGZpZWxkLm5hbWVcXHJcXG4gICAgICB0aGlzLnNvcnRPcmRlclswXS5zb3J0RmllbGQgPSBmaWVsZC5zb3J0RmllbGRcXHJcXG4gICAgfSxcXHJcXG4gICAgY2xlYXJTb3J0T3JkZXIgKCkge1xcclxcbiAgICAgIHRoaXMuc29ydE9yZGVyLnB1c2goe1xcclxcbiAgICAgICAgZmllbGQ6ICcnLFxcclxcbiAgICAgICAgc29ydEZpZWxkOiAnJyxcXHJcXG4gICAgICAgIGRpcmVjdGlvbjogJ2FzYydcXHJcXG4gICAgICB9KTtcXHJcXG4gICAgfSxcXHJcXG4gICAgc29ydENsYXNzIChmaWVsZCkge1xcclxcbiAgICAgIGxldCBjbHMgPSAnJ1xcclxcbiAgICAgIGxldCBpID0gdGhpcy5jdXJyZW50U29ydE9yZGVyUG9zaXRpb24oZmllbGQpXFxyXFxuXFxyXFxuICAgICAgaWYgKGkgIT09IGZhbHNlKSB7XFxyXFxuICAgICAgICBjbHMgPSAodGhpcy5zb3J0T3JkZXJbaV0uZGlyZWN0aW9uID09ICdhc2MnKSA/IHRoaXMuY3NzLmFzY2VuZGluZ0NsYXNzIDogdGhpcy5jc3MuZGVzY2VuZGluZ0NsYXNzXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIHJldHVybiBjbHNcXHJcXG4gICAgfSxcXHJcXG4gICAgc29ydEljb24gKGZpZWxkKSB7XFxyXFxuICAgICAgbGV0IGNscyA9IHRoaXMuY3NzLnNvcnRhYmxlSWNvblxcclxcbiAgICAgIGxldCBpID0gdGhpcy5jdXJyZW50U29ydE9yZGVyUG9zaXRpb24oZmllbGQpXFxyXFxuXFxyXFxuICAgICAgaWYgKGkgIT09IGZhbHNlKSB7XFxyXFxuICAgICAgICBjbHMgPSAodGhpcy5zb3J0T3JkZXJbaV0uZGlyZWN0aW9uID09ICdhc2MnKSA/IHRoaXMuY3NzLmFzY2VuZGluZ0ljb24gOiB0aGlzLmNzcy5kZXNjZW5kaW5nSWNvblxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICByZXR1cm4gY2xzO1xcclxcbiAgICB9LFxcclxcbiAgICBzb3J0SWNvbk9wYWNpdHkgKGZpZWxkKSB7XFxyXFxuICAgICAgLypcXHJcXG4gICAgICAgKiBmaWVsZHMgd2l0aCBzdHJvbmdlciBwcmVjZWRlbmNlIGhhdmUgZGFya2VyIGNvbG9yXFxyXFxuICAgICAgICpcXHJcXG4gICAgICAgKiBpZiB0aGVyZSBhcmUgZmV3IGZpZWxkcywgd2UgZ28gZG93biBieSAwLjNcXHJcXG4gICAgICAgKiBleC4gMiBmaWVsZHMgYXJlIHNlbGVjdGVkOiAxLjAsIDAuN1xcclxcbiAgICAgICAqXFxyXFxuICAgICAgICogaWYgdGhlcmUgYXJlIG1vcmUgd2UgZ28gZG93biBldmVubHkgb24gdGhlIGdpdmVuIHNwZWN0cnVtXFxyXFxuICAgICAgICogZXguIDYgZmllbGRzIGFyZSBzZWxlY3RlZDogMS4wLCAwLjg2LCAwLjcyLCAwLjU4LCAwLjQ0LCAwLjNcXHJcXG4gICAgICAgKi9cXHJcXG4gICAgICBsZXQgbWF4ID0gMS4wLFxcclxcbiAgICAgICAgICBtaW4gPSAwLjMsXFxyXFxuICAgICAgICAgIHN0ZXAgPSAwLjNcXHJcXG5cXHJcXG4gICAgICBsZXQgY291bnQgPSB0aGlzLnNvcnRPcmRlci5sZW5ndGg7XFxyXFxuICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRTb3J0T3JkZXJQb3NpdGlvbihmaWVsZClcXHJcXG5cXHJcXG5cXHJcXG4gICAgICBpZihtYXggLSBjb3VudCAqIHN0ZXAgPCBtaW4pIHtcXHJcXG4gICAgICAgIHN0ZXAgPSAobWF4IC0gbWluKSAvIChjb3VudC0xKVxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICBsZXQgb3BhY2l0eSA9IG1heCAtIGN1cnJlbnQgKiBzdGVwXFxyXFxuXFxyXFxuICAgICAgcmV0dXJuIG9wYWNpdHlcXHJcXG4gICAgfSxcXHJcXG4gICAgaGFzQ2FsbGJhY2sgKGl0ZW0pIHtcXHJcXG4gICAgICByZXR1cm4gaXRlbS5jYWxsYmFjayA/IHRydWUgOiBmYWxzZVxcclxcbiAgICB9LFxcclxcbiAgICBjYWxsQ2FsbGJhY2sgKGZpZWxkLCBpdGVtKSB7XFxyXFxuICAgICAgaWYgKCAhIHRoaXMuaGFzQ2FsbGJhY2soZmllbGQpKSByZXR1cm5cXHJcXG5cXHJcXG4gICAgICBpZih0eXBlb2YoZmllbGQuY2FsbGJhY2spID09ICdmdW5jdGlvbicpIHtcXHJcXG4gICAgICAgcmV0dXJuIGZpZWxkLmNhbGxiYWNrKHRoaXMuZ2V0T2JqZWN0VmFsdWUoaXRlbSwgZmllbGQubmFtZSkpXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGxldCBhcmdzID0gZmllbGQuY2FsbGJhY2suc3BsaXQoJ3wnKVxcclxcbiAgICAgIGxldCBmdW5jID0gYXJncy5zaGlmdCgpXFxyXFxuXFxyXFxuICAgICAgaWYgKHR5cGVvZiB0aGlzLiRwYXJlbnRbZnVuY10gPT09ICdmdW5jdGlvbicpIHtcXHJcXG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuZ2V0T2JqZWN0VmFsdWUoaXRlbSwgZmllbGQubmFtZSlcXHJcXG5cXHJcXG4gICAgICAgIHJldHVybiAoYXJncy5sZW5ndGggPiAwKVxcclxcbiAgICAgICAgICA/IHRoaXMuJHBhcmVudFtmdW5jXS5hcHBseSh0aGlzLiRwYXJlbnQsIFt2YWx1ZV0uY29uY2F0KGFyZ3MpKVxcclxcbiAgICAgICAgICA6IHRoaXMuJHBhcmVudFtmdW5jXS5jYWxsKHRoaXMuJHBhcmVudCwgdmFsdWUpXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIHJldHVybiBudWxsXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldE9iamVjdFZhbHVlIChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xcclxcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICh0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAndW5kZWZpbmVkJykgPyBudWxsIDogZGVmYXVsdFZhbHVlXFxyXFxuXFxyXFxuICAgICAgbGV0IG9iaiA9IG9iamVjdFxcclxcbiAgICAgIGlmIChwYXRoLnRyaW0oKSAhPSAnJykge1xcclxcbiAgICAgICAgbGV0IGtleXMgPSBwYXRoLnNwbGl0KCcuJylcXHJcXG4gICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcXHJcXG4gICAgICAgICAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqW2tleV0gIT09ICd1bmRlZmluZWQnICYmIG9ialtrZXldICE9PSBudWxsKSB7XFxyXFxuICAgICAgICAgICAgb2JqID0gb2JqW2tleV1cXHJcXG4gICAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgICBvYmogPSBkZWZhdWx0VmFsdWVcXHJcXG4gICAgICAgICAgICByZXR1cm5cXHJcXG4gICAgICAgICAgfVxcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIG9ialxcclxcbiAgICB9LFxcclxcbiAgICB0b2dnbGVDaGVja2JveCAoZGF0YUl0ZW0sIGZpZWxkTmFtZSwgZXZlbnQpIHtcXHJcXG4gICAgICBsZXQgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWRcXHJcXG4gICAgICBsZXQgaWRDb2x1bW4gPSB0aGlzLnRyYWNrQnlcXHJcXG5cXHJcXG4gICAgICBpZiAoZGF0YUl0ZW1baWRDb2x1bW5dID09PSB1bmRlZmluZWQpIHtcXHJcXG4gICAgICAgIHRoaXMud2FybignX19jaGVja2JveCBmaWVsZDogVGhlIFxcXCInK3RoaXMudHJhY2tCeSsnXFxcIiBmaWVsZCBkb2VzIG5vdCBleGlzdCEgTWFrZSBzdXJlIHRoZSBmaWVsZCB5b3Ugc3BlY2lmeSBpbiBcXFwidHJhY2stYnlcXFwiIHByb3AgZG9lcyBleGlzdC4nKVxcclxcbiAgICAgICAgcmV0dXJuXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGxldCBrZXkgPSBkYXRhSXRlbVtpZENvbHVtbl1cXHJcXG4gICAgICBpZiAoaXNDaGVja2VkKSB7XFxyXFxuICAgICAgICB0aGlzLnNlbGVjdElkKGtleSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy51bnNlbGVjdElkKGtleSlcXHJcXG4gICAgICB9XFxyXFxuICAgICAgdGhpcy4kZW1pdCgndnVldGFibGU6Y2hlY2tib3gtdG9nZ2xlZCcsIGlzQ2hlY2tlZCwgZGF0YUl0ZW0pXFxyXFxuICAgIH0sXFxyXFxuICAgIHNlbGVjdElkIChrZXkpIHtcXHJcXG4gICAgICBpZiAoICEgdGhpcy5pc1NlbGVjdGVkUm93KGtleSkpIHtcXHJcXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUby5wdXNoKGtleSlcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHVuc2VsZWN0SWQgKGtleSkge1xcclxcbiAgICAgIHRoaXMuc2VsZWN0ZWRUbyA9IHRoaXMuc2VsZWN0ZWRUby5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xcclxcbiAgICAgICAgcmV0dXJuIGl0ZW0gIT09IGtleVxcclxcbiAgICAgIH0pXFxyXFxuICAgIH0sXFxyXFxuICAgIGlzU2VsZWN0ZWRSb3cgKGtleSkge1xcclxcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVG8uaW5kZXhPZihrZXkpID49IDBcXHJcXG4gICAgfSxcXHJcXG4gICAgcm93U2VsZWN0ZWQgKGRhdGFJdGVtLCBmaWVsZE5hbWUpe1xcclxcbiAgICAgIGxldCBpZENvbHVtbiA9IHRoaXMudHJhY2tCeVxcclxcbiAgICAgIGxldCBrZXkgPSBkYXRhSXRlbVtpZENvbHVtbl1cXHJcXG5cXHJcXG4gICAgICByZXR1cm4gdGhpcy5pc1NlbGVjdGVkUm93KGtleSlcXHJcXG4gICAgfSxcXHJcXG4gICAgY2hlY2tDaGVja2JveGVzU3RhdGUgKGZpZWxkTmFtZSkge1xcclxcbiAgICAgIGlmICghIHRoaXMudGFibGVEYXRhKSByZXR1cm5cXHJcXG5cXHJcXG4gICAgICBsZXQgc2VsZiA9IHRoaXNcXHJcXG4gICAgICBsZXQgaWRDb2x1bW4gPSB0aGlzLnRyYWNrQnlcXHJcXG4gICAgICBsZXQgc2VsZWN0b3IgPSAndGgudnVldGFibGUtdGgtY2hlY2tib3gtJyArIGlkQ29sdW1uICsgJyBpbnB1dFt0eXBlPWNoZWNrYm94XSdcXHJcXG4gICAgICBsZXQgZWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcXHJcXG5cXHJcXG4gICAgICAvL2ZpeGVkOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgcmV0dXJuIHRoZSB0eXBlb2Ygbm9kZUxpc3Qgbm90IGFycmF5XFxyXFxuICAgICAgaWYgKGVscy5mb3JFYWNoPT09dW5kZWZpbmVkKVxcclxcbiAgICAgICAgZWxzLmZvckVhY2g9ZnVuY3Rpb24oY2Ipe1xcclxcbiAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoZWxzLCBjYik7XFxyXFxuICAgICAgICB9XFxyXFxuXFxyXFxuICAgICAgLy8gY291bnQgaG93IG1hbnkgY2hlY2tib3ggcm93IGluIHRoZSBjdXJyZW50IHBhZ2UgaGFzIGJlZW4gY2hlY2tlZFxcclxcbiAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMudGFibGVEYXRhLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XFxyXFxuICAgICAgICByZXR1cm4gc2VsZi5zZWxlY3RlZFRvLmluZGV4T2YoaXRlbVtpZENvbHVtbl0pID49IDBcXHJcXG4gICAgICB9KVxcclxcblxcclxcbiAgICAgIC8vIGNvdW50ID09IDAsIGNsZWFyIHRoZSBjaGVja2JveFxcclxcbiAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPD0gMCkge1xcclxcbiAgICAgICAgZWxzLmZvckVhY2goZnVuY3Rpb24oZWwpIHtcXHJcXG4gICAgICAgICAgZWwuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlXFxyXFxuICAgICAgICB9KVxcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfVxcclxcbiAgICAgIC8vIGNvdW50ID4gMCBhbmQgY291bnQgPCBwZXJQYWdlLCBzZXQgY2hlY2tib3ggc3RhdGUgdG8gJ2luZGV0ZXJtaW5hdGUnXFxyXFxuICAgICAgZWxzZSBpZiAoc2VsZWN0ZWQubGVuZ3RoIDwgdGhpcy5wZXJQYWdlKSB7XFxyXFxuICAgICAgICBlbHMuZm9yRWFjaChmdW5jdGlvbihlbCkge1xcclxcbiAgICAgICAgICBlbC5pbmRldGVybWluYXRlID0gdHJ1ZVxcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICAgIHJldHVybiB0cnVlXFxyXFxuICAgICAgfVxcclxcbiAgICAgIC8vIGNvdW50ID09IHBlclBhZ2UsIHNldCBjaGVja2JveCBzdGF0ZSB0byAnY2hlY2tlZCdcXHJcXG4gICAgICBlbHNlIHtcXHJcXG4gICAgICAgIGVscy5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7XFxyXFxuICAgICAgICAgIGVsLmluZGV0ZXJtaW5hdGUgPSBmYWxzZVxcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICAgIHJldHVybiB0cnVlXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB0b2dnbGVBbGxDaGVja2JveGVzIChmaWVsZE5hbWUsIGV2ZW50KSB7XFxyXFxuICAgICAgbGV0IHNlbGYgPSB0aGlzXFxyXFxuICAgICAgbGV0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkXFxyXFxuICAgICAgbGV0IGlkQ29sdW1uID0gdGhpcy50cmFja0J5XFxyXFxuXFxyXFxuICAgICAgaWYgKGlzQ2hlY2tlZCkge1xcclxcbiAgICAgICAgdGhpcy50YWJsZURhdGEuZm9yRWFjaChmdW5jdGlvbihkYXRhSXRlbSkge1xcclxcbiAgICAgICAgICBzZWxmLnNlbGVjdElkKGRhdGFJdGVtW2lkQ29sdW1uXSlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMudGFibGVEYXRhLmZvckVhY2goZnVuY3Rpb24oZGF0YUl0ZW0pIHtcXHJcXG4gICAgICAgICAgc2VsZi51bnNlbGVjdElkKGRhdGFJdGVtW2lkQ29sdW1uXSlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ3Z1ZXRhYmxlOmNoZWNrYm94LXRvZ2dsZWQtYWxsJywgaXNDaGVja2VkKVxcclxcbiAgICB9LFxcclxcbiAgICBnb3RvUHJldmlvdXNQYWdlICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA+IDEpIHtcXHJcXG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UtLVxcclxcbiAgICAgICAgdGhpcy5sb2FkRGF0YSgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBnb3RvTmV4dFBhZ2UgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlIDwgdGhpcy50YWJsZVBhZ2luYXRpb24ubGFzdF9wYWdlKSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlKytcXHJcXG4gICAgICAgIHRoaXMubG9hZERhdGEoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgZ290b1BhZ2UgKHBhZ2UpIHtcXHJcXG4gICAgICBpZiAocGFnZSAhPSB0aGlzLmN1cnJlbnRQYWdlICYmIChwYWdlID4gMCAmJiBwYWdlIDw9IHRoaXMudGFibGVQYWdpbmF0aW9uLmxhc3RfcGFnZSkpIHtcXHJcXG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlXFxyXFxuICAgICAgICB0aGlzLmxvYWREYXRhKClcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGlzVmlzaWJsZURldGFpbFJvdyAocm93SWQpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy52aXNpYmxlRGV0YWlsUm93cy5pbmRleE9mKCByb3dJZCApID49IDBcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvd0RldGFpbFJvdyAocm93SWQpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlRGV0YWlsUm93KHJvd0lkKSkge1xcclxcbiAgICAgICAgdGhpcy52aXNpYmxlRGV0YWlsUm93cy5wdXNoKHJvd0lkKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgaGlkZURldGFpbFJvdyAocm93SWQpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pc1Zpc2libGVEZXRhaWxSb3cocm93SWQpKSB7XFxyXFxuICAgICAgICB0aGlzLnZpc2libGVEZXRhaWxSb3dzLnNwbGljZShcXHJcXG4gICAgICAgICAgdGhpcy52aXNpYmxlRGV0YWlsUm93cy5pbmRleE9mKHJvd0lkKSxcXHJcXG4gICAgICAgICAgMVxcclxcbiAgICAgICAgKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdG9nZ2xlRGV0YWlsUm93IChyb3dJZCkge1xcclxcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZURldGFpbFJvdyhyb3dJZCkpIHtcXHJcXG4gICAgICAgIHRoaXMuaGlkZURldGFpbFJvdyhyb3dJZClcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5zaG93RGV0YWlsUm93KHJvd0lkKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvd0ZpZWxkIChpbmRleCkge1xcclxcbiAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLnRhYmxlRmllbGRzLmxlbmd0aCkgcmV0dXJuXFxyXFxuXFxyXFxuICAgICAgdGhpcy50YWJsZUZpZWxkc1tpbmRleF0udmlzaWJsZSA9IHRydWVcXHJcXG4gICAgfSxcXHJcXG4gICAgaGlkZUZpZWxkIChpbmRleCkge1xcclxcbiAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLnRhYmxlRmllbGRzLmxlbmd0aCkgcmV0dXJuXFxyXFxuXFxyXFxuICAgICAgdGhpcy50YWJsZUZpZWxkc1tpbmRleF0udmlzaWJsZSA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZUZpZWxkIChpbmRleCkge1xcclxcbiAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLnRhYmxlRmllbGRzLmxlbmd0aCkgcmV0dXJuXFxyXFxuXFxyXFxuICAgICAgdGhpcy50YWJsZUZpZWxkc1tpbmRleF0udmlzaWJsZSA9ICEgdGhpcy50YWJsZUZpZWxkc1tpbmRleF0udmlzaWJsZVxcclxcbiAgICB9LFxcclxcbiAgICByZW5kZXJJY29uVGFnIChjbGFzc2VzLCBvcHRpb25zID0gJycpIHtcXHJcXG4gICAgICByZXR1cm4gdHlwZW9mKHRoaXMuY3NzLnJlbmRlckljb24pID09PSAndW5kZWZpbmVkJ1xcclxcbiAgICAgICAgPyBgPGkgY2xhc3M9XFxcIiR7Y2xhc3Nlcy5qb2luKCcgJyl9XFxcIiAke29wdGlvbnN9PjwvaT5gXFxyXFxuICAgICAgICA6IHRoaXMuY3NzLnJlbmRlckljb24oY2xhc3Nlcywgb3B0aW9ucylcXHJcXG4gICAgfSxcXHJcXG4gICAgbWFrZVBhZ2luYXRpb24gKHRvdGFsID0gbnVsbCwgcGVyUGFnZSA9IG51bGwsIGN1cnJlbnRQYWdlID0gbnVsbCkge1xcclxcbiAgICAgIGxldCBwYWdpbmF0aW9uID0ge31cXHJcXG4gICAgICB0b3RhbCA9IHRvdGFsID09PSBudWxsID8gdGhpcy5kYXRhVG90YWwgOiB0b3RhbFxcclxcbiAgICAgIHBlclBhZ2UgPSBwZXJQYWdlID09PSBudWxsID8gdGhpcy5wZXJQYWdlIDogcGVyUGFnZVxcclxcbiAgICAgIGN1cnJlbnRQYWdlID0gY3VycmVudFBhZ2UgPT09IG51bGwgPyB0aGlzLmN1cnJlbnRQYWdlIDogY3VycmVudFBhZ2VcXHJcXG5cXHJcXG4gICAgICByZXR1cm4ge1xcclxcbiAgICAgICAgJ3RvdGFsJzogdG90YWwsXFxyXFxuICAgICAgICAncGVyX3BhZ2UnOiBwZXJQYWdlLFxcclxcbiAgICAgICAgJ2N1cnJlbnRfcGFnZSc6IGN1cnJlbnRQYWdlLFxcclxcbiAgICAgICAgJ2xhc3RfcGFnZSc6IE1hdGguY2VpbCh0b3RhbCAvIHBlclBhZ2UpIHx8IDAsXFxyXFxuICAgICAgICAnbmV4dF9wYWdlX3VybCc6ICcnLFxcclxcbiAgICAgICAgJ3ByZXZfcGFnZV91cmwnOiAnJyxcXHJcXG4gICAgICAgICdmcm9tJzogKGN1cnJlbnRQYWdlIC0xKSAqIHBlclBhZ2UgKzEsXFxyXFxuICAgICAgICAndG8nOiBNYXRoLm1pbihjdXJyZW50UGFnZSAqIHBlclBhZ2UsIHRvdGFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgbm9ybWFsaXplU29ydE9yZGVyICgpIHtcXHJcXG4gICAgICB0aGlzLnNvcnRPcmRlci5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcXHJcXG4gICAgICAgIGl0ZW0uc29ydEZpZWxkID0gaXRlbS5zb3J0RmllbGQgfHwgaXRlbS5maWVsZFxcclxcbiAgICAgIH0pXFxyXFxuICAgIH0sXFxyXFxuICAgIGNhbGxEYXRhTWFuYWdlciAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGF0YU1hbmFnZXIgPT09IG51bGwgJiYgdGhpcy5kYXRhID09PSBudWxsKSByZXR1cm5cXHJcXG5cXHJcXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEpKSB7XFxyXFxuICAgICAgICByZXR1cm4gdGhpcy5zZXREYXRhKHRoaXMuZGF0YSlcXHJcXG4gICAgICB9IFxcclxcbiAgICAgIFxcclxcbiAgICAgIHRoaXMubm9ybWFsaXplU29ydE9yZGVyKClcXHJcXG5cXHJcXG4gICAgICByZXR1cm4gdGhpcy5zZXREYXRhKFxcclxcbiAgICAgICAgdGhpcy5kYXRhTWFuYWdlclxcclxcbiAgICAgICAgICA/IHRoaXMuZGF0YU1hbmFnZXIodGhpcy5zb3J0T3JkZXIsIHRoaXMubWFrZVBhZ2luYXRpb24oKSlcXHJcXG4gICAgICAgICAgOiB0aGlzLmRhdGFcXHJcXG4gICAgICApXFxyXFxuICAgIH0sXFxyXFxuICAgIG9uUm93Q2xhc3MgKGRhdGFJdGVtLCBpbmRleCkge1xcclxcbiAgICAgIGlmICh0aGlzLnJvd0NsYXNzQ2FsbGJhY2sgIT09ICcnKSB7XFxyXFxuICAgICAgICB0aGlzLndhcm4oJ1xcXCJyb3ctY2xhc3MtY2FsbGJhY2tcXFwiIHByb3AgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBcXFwicm93LWNsYXNzXFxcIiBwcm9wIGluc3RlYWQuJylcXHJcXG4gICAgICAgIHJldHVyblxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICBpZiAodHlwZW9mKHRoaXMucm93Q2xhc3MpID09PSAnZnVuY3Rpb24nKSB7XFxyXFxuICAgICAgICByZXR1cm4gdGhpcy5yb3dDbGFzcyhkYXRhSXRlbSwgaW5kZXgpXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIHJldHVybiB0aGlzLnJvd0NsYXNzXFxyXFxuICAgIH0sXFxyXFxuICAgIG9uUm93Q2hhbmdlZCAoZGF0YUl0ZW0pIHtcXHJcXG4gICAgICB0aGlzLmZpcmVFdmVudCgncm93LWNoYW5nZWQnLCBkYXRhSXRlbSlcXHJcXG4gICAgICByZXR1cm4gdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBvblJvd0NsaWNrZWQgKGRhdGFJdGVtLCBldmVudCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQodGhpcy5ldmVudFByZWZpeCArICdyb3ctY2xpY2tlZCcsIGRhdGFJdGVtLCBldmVudClcXHJcXG4gICAgICByZXR1cm4gdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBvblJvd0RvdWJsZUNsaWNrZWQgKGRhdGFJdGVtLCBldmVudCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQodGhpcy5ldmVudFByZWZpeCArICdyb3ctZGJsY2xpY2tlZCcsIGRhdGFJdGVtLCBldmVudClcXHJcXG4gICAgfSxcXHJcXG4gICAgb25EZXRhaWxSb3dDbGljayAoZGF0YUl0ZW0sIGV2ZW50KSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCh0aGlzLmV2ZW50UHJlZml4ICsgJ2RldGFpbC1yb3ctY2xpY2tlZCcsIGRhdGFJdGVtLCBldmVudClcXHJcXG4gICAgfSxcXHJcXG4gICAgb25DZWxsQ2xpY2tlZCAoZGF0YUl0ZW0sIGZpZWxkLCBldmVudCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQodGhpcy5ldmVudFByZWZpeCArICdjZWxsLWNsaWNrZWQnLCBkYXRhSXRlbSwgZmllbGQsIGV2ZW50KVxcclxcbiAgICB9LFxcclxcbiAgICBvbkNlbGxEb3VibGVDbGlja2VkIChkYXRhSXRlbSwgZmllbGQsIGV2ZW50KSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCh0aGlzLmV2ZW50UHJlZml4ICsgJ2NlbGwtZGJsY2xpY2tlZCcsIGRhdGFJdGVtLCBmaWVsZCwgZXZlbnQpXFxyXFxuICAgIH0sXFxyXFxuICAgIG9uQ2VsbFJpZ2h0Q2xpY2tlZCAoZGF0YUl0ZW0sIGZpZWxkLCBldmVudCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQodGhpcy5ldmVudFByZWZpeCArICdjZWxsLXJpZ2h0Y2xpY2tlZCcsIGRhdGFJdGVtLCBmaWVsZCwgZXZlbnQpXFxyXFxuICAgIH0sXFxyXFxuICAgIC8qXFxyXFxuICAgICAqIEFQSSBmb3IgZXh0ZXJuYWxzXFxyXFxuICAgICAqL1xcclxcbiAgICBjaGFuZ2VQYWdlIChwYWdlKSB7XFxyXFxuICAgICAgaWYgKHBhZ2UgPT09ICdwcmV2Jykge1xcclxcbiAgICAgICAgdGhpcy5nb3RvUHJldmlvdXNQYWdlKClcXHJcXG4gICAgICB9IGVsc2UgaWYgKHBhZ2UgPT09ICduZXh0Jykge1xcclxcbiAgICAgICAgdGhpcy5nb3RvTmV4dFBhZ2UoKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmdvdG9QYWdlKHBhZ2UpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICByZWxvYWQgKCkge1xcclxcbiAgICAgIHJldHVybiB0aGlzLmxvYWREYXRhKClcXHJcXG4gICAgfSxcXHJcXG4gICAgcmVmcmVzaCAoKSB7XFxyXFxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDFcXHJcXG4gICAgICByZXR1cm4gdGhpcy5sb2FkRGF0YSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHJlc2V0RGF0YSAoKSB7XFxyXFxuICAgICAgdGhpcy50YWJsZURhdGEgPSBudWxsXFxyXFxuICAgICAgdGhpcy50YWJsZVBhZ2luYXRpb24gPSBudWxsXFxyXFxuICAgICAgdGhpcy5maXJlRXZlbnQoJ2RhdGEtcmVzZXQnKVxcclxcbiAgICB9XFxyXFxuICB9LCAvLyBlbmQ6IG1ldGhvZHNcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgICdtdWx0aVNvcnQnIChuZXdWYWwsIG9sZFZhbCkge1xcclxcbiAgICAgIGlmIChuZXdWYWwgPT09IGZhbHNlICYmIHRoaXMuc29ydE9yZGVyLmxlbmd0aCA+IDEpIHtcXHJcXG4gICAgICAgIHRoaXMuc29ydE9yZGVyLnNwbGljZSgxKTtcXHJcXG4gICAgICAgIHRoaXMubG9hZERhdGEoKTtcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgICdhcGlVcmwnICAobmV3VmFsLCBvbGRWYWwpIHtcXHJcXG4gICAgICBpZih0aGlzLnJlYWN0aXZlQXBpVXJsICYmIG5ld1ZhbCAhPT0gb2xkVmFsKVxcclxcbiAgICAgICAgdGhpcy5yZWZyZXNoKClcXHJcXG4gICAgfSxcXHJcXG4gICAgJ2RhdGEnIChuZXdWYWwsIG9sZFZhbCkge1xcclxcbiAgICAgIHRoaXMuc2V0RGF0YShuZXdWYWwpXFxyXFxuICAgIH0sXFxyXFxuICAgICd0YWJsZUhlaWdodCcgKG5ld1ZhbCwgb2xkVmFsKSB7XFxyXFxuICAgICAgdGhpcy5maXhIZWFkZXIoKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbiAgW3YtY2xvYWtdIHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gIH1cXHJcXG4gIC52dWV0YWJsZSB0aC5zb3J0YWJsZTpob3ZlciB7XFxyXFxuICAgIGNvbG9yOiAjMjE4NWQwO1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICB9XFxyXFxuICAudnVldGFibGUtYm9keS13cmFwcGVyIHtcXHJcXG4gICAgcG9zaXRpb246cmVsYXRpdmU7XFxyXFxuICAgIG92ZXJmbG93LXk6YXV0bztcXHJcXG4gIH1cXHJcXG4gIC52dWV0YWJsZS1oZWFkLXdyYXBwZXIge1xcclxcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XFxyXFxuICB9XFxyXFxuICAudnVldGFibGUtYWN0aW9ucyB7XFxyXFxuICAgIHdpZHRoOiAxNSU7XFxyXFxuICAgIHBhZGRpbmc6IDEycHggMHB4O1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICB9XFxyXFxuICAudnVldGFibGUtcGFnaW5hdGlvbiB7XFxyXFxuICAgIGJhY2tncm91bmQ6ICNmOWZhZmIgIWltcG9ydGFudDtcXHJcXG4gIH1cXHJcXG4gIC52dWV0YWJsZS1wYWdpbmF0aW9uLWluZm8ge1xcclxcbiAgICBtYXJnaW4tdG9wOiBhdXRvO1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiBhdXRvO1xcclxcbiAgfVxcclxcbiAgLnZ1ZXRhYmxlLWVtcHR5LXJlc3VsdCB7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIH1cXHJcXG4gIC52dWV0YWJsZS1jbGlwLXRleHQge1xcclxcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XFxyXFxuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIH1cXHJcXG4gIC52dWV0YWJsZS1zZW1hbnRpYy1uby10b3Age1xcclxcbiAgICBib3JkZXItdG9wOm5vbmUgIWltcG9ydGFudDtcXHJcXG4gICAgbWFyZ2luLXRvcDowICFpbXBvcnRhbnQ7XFxyXFxuICB9XFxyXFxuICAudnVldGFibGUtZml4ZWQtbGF5b3V0IHtcXHJcXG4gICAgdGFibGUtbGF5b3V0OiBmaXhlZDtcXHJcXG4gIH1cXHJcXG4gIC52dWV0YWJsZS1ndXR0ZXItY29sIHtcXHJcXG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xcclxcbiAgICBib3JkZXItbGVmdDogbm9uZSAgIWltcG9ydGFudDtcXHJcXG4gICAgYm9yZGVyLXJpZ2h0OiBub25lICAhaW1wb3J0YW50O1xcclxcbiAgfVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7392\n");
/***/ }),
/***/ 3890:
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3379);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_FilterBar_vue_vue_type_style_index_0_id_5e195a32_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1429);\n\n \n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_FilterBar_vue_vue_type_style_index_0_id_5e195a32_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_1__/* .default */ .Z, options);\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_FilterBar_vue_vue_type_style_index_0_id_5e195a32_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_1__/* .default.locals */ .Z.locals || {});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9hcHAvbGlzdC9jb21wb25lbnRzL0ZpbHRlckJhci52dWU/MWRkNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQStGO0FBQy9GLFlBQTRSOztBQUU1Ujs7QUFFQTtBQUNBOztBQUVBLGFBQWEsMEdBQUcsQ0FBQyx3UUFBTzs7OztBQUl4QixpRUFBZSxzUkFBYyxNQUFNIiwiZmlsZSI6IjM4OTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9GaWx0ZXJCYXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NWUxOTVhMzImc2NvcGVkPXRydWUmbGFuZz1jc3MmXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3890\n");
/***/ }),
/***/ 1301:
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3379);\n/* harmony import */ var _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _css_loader_dist_cjs_js_vue_loader_lib_loaders_stylePostLoader_js_vue_loader_lib_index_js_vue_loader_options_Vuetable_vue_vue_type_style_index_0_id_15965e3b_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7392);\n\n \n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_css_loader_dist_cjs_js_vue_loader_lib_loaders_stylePostLoader_js_vue_loader_lib_index_js_vue_loader_options_Vuetable_vue_vue_type_style_index_0_id_15965e3b_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_1__/* .default */ .Z, options);\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_css_loader_dist_cjs_js_vue_loader_lib_loaders_stylePostLoader_js_vue_loader_lib_index_js_vue_loader_options_Vuetable_vue_vue_type_style_index_0_id_15965e3b_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_1__/* .default.locals */ .Z.locals || {});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9zcmMvY29tcG9uZW50cy9WdWV0YWJsZS52dWU/ZGQwYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQWtGO0FBQ2xGLFlBQW9QOztBQUVwUDs7QUFFQTtBQUNBOztBQUVBLGFBQWEsNkZBQUcsQ0FBQyxnT0FBTzs7OztBQUl4QixpRUFBZSw4T0FBYyxNQUFNIiwiZmlsZSI6IjEzMDEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL1Z1ZXRhYmxlLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTE1OTY1ZTNiJnNjb3BlZD10cnVlJmxhbmc9Y3NzJlwiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1301\n");
/***/ }),
/***/ 3379:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar isOldIE = function isOldIE() {\n var memo;\n return function memorize() {\n if (typeof memo === 'undefined') {\n // Test for IE <= 9 as proposed by Browserhacks\n // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n // Tests for existence of standard globals is to allow style-loader\n // to operate correctly into non-standard environments\n // @see https://github.com/webpack-contrib/style-loader/issues/177\n memo = Boolean(window && document && document.all && !window.atob);\n }\n\n return memo;\n };\n}();\n\nvar getTarget = function getTarget() {\n var memo = {};\n return function memorize(target) {\n if (typeof memo[target] === 'undefined') {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n\n for (var i = 0; i < stylesInDom.length; i++) {\n if (stylesInDom[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n\n return result;\n}\n\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var index = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3]\n };\n\n if (index !== -1) {\n stylesInDom[index].references++;\n stylesInDom[index].updater(obj);\n } else {\n stylesInDom.push({\n identifier: identifier,\n updater: addStyle(obj, options),\n references: 1\n });\n }\n\n identifiers.push(identifier);\n }\n\n return identifiers;\n}\n\nfunction insertStyleElement(options) {\n var style = document.createElement('style');\n var attributes = options.attributes || {};\n\n if (typeof attributes.nonce === 'undefined') {\n var nonce = true ? __webpack_require__.nc : 0;\n\n if (nonce) {\n attributes.nonce = nonce;\n }\n }\n\n Object.keys(attributes).forEach(function (key) {\n style.setAttribute(key, attributes[key]);\n });\n\n if (typeof options.insert === 'function') {\n options.insert(style);\n } else {\n var target = getTarget(options.insert || 'head');\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n }\n\n return style;\n}\n\nfunction removeStyleElement(style) {\n // istanbul ignore if\n if (style.parentNode === null) {\n return false;\n }\n\n style.parentNode.removeChild(style);\n}\n/* istanbul ignore next */\n\n\nvar replaceText = function replaceText() {\n var textStore = [];\n return function replace(index, replacement) {\n textStore[index] = replacement;\n return textStore.filter(Boolean).join('\\n');\n };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n /* istanbul ignore if */\n\n if (style.styleSheet) {\n style.styleSheet.cssText = replaceText(index, css);\n } else {\n var cssNode = document.createTextNode(css);\n var childNodes = style.childNodes;\n\n if (childNodes[index]) {\n style.removeChild(childNodes[index]);\n }\n\n if (childNodes.length) {\n style.insertBefore(cssNode, childNodes[index]);\n } else {\n style.appendChild(cssNode);\n }\n }\n}\n\nfunction applyToTag(style, options, obj) {\n var css = obj.css;\n var media = obj.media;\n var sourceMap = obj.sourceMap;\n\n if (media) {\n style.setAttribute('media', media);\n } else {\n style.removeAttribute('media');\n }\n\n if (sourceMap && typeof btoa !== 'undefined') {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n while (style.firstChild) {\n style.removeChild(style.firstChild);\n }\n\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n var style;\n var update;\n var remove;\n\n if (options.singleton) {\n var styleIndex = singletonCounter++;\n style = singleton || (singleton = insertStyleElement(options));\n update = applyToSingletonTag.bind(null, style, styleIndex, false);\n remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n } else {\n style = insertStyleElement(options);\n update = applyToTag.bind(null, style, options);\n\n remove = function remove() {\n removeStyleElement(style);\n };\n }\n\n update(obj);\n return function updateStyle(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n return;\n }\n\n update(obj = newObj);\n } else {\n remove();\n }\n };\n}\n\nmodule.exports = function (list, options) {\n options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n // tags it will allow on a page\n\n if (!options.singleton && typeof options.singleton !== 'boolean') {\n options.singleton = isOldIE();\n }\n\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n\n if (Object.prototype.toString.call(newList) !== '[object Array]') {\n return;\n }\n\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDom[index].references--;\n }\n\n var newLastIdentifiers = modulesToDom(newList, options);\n\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n\n var _index = getIndexByIdentifier(_identifier);\n\n if (stylesInDom[_index].references === 0) {\n stylesInDom[_index].updater();\n\n stylesInDom.splice(_index, 1);\n }\n }\n\n lastIdentifiers = newLastIdentifiers;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanM/MmRiYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsd0JBQXdCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLGlCQUFpQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLEtBQXdDLEdBQUcsc0JBQWlCLEdBQUcsQ0FBSTs7QUFFbkY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EscUVBQXFFLHFCQUFxQixhQUFhOztBQUV2Rzs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0EseURBQXlEO0FBQ3pELEdBQUc7O0FBRUg7OztBQUdBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsNEJBQTRCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG9CQUFvQiw2QkFBNkI7QUFDakQ7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6IjMzNzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIGlzT2xkSUUgPSBmdW5jdGlvbiBpc09sZElFKCkge1xuICB2YXIgbWVtbztcbiAgcmV0dXJuIGZ1bmN0aW9uIG1lbW9yaXplKCkge1xuICAgIGlmICh0eXBlb2YgbWVtbyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFRlc3QgZm9yIElFIDw9IDkgYXMgcHJvcG9zZWQgYnkgQnJvd3NlcmhhY2tzXG4gICAgICAvLyBAc2VlIGh0dHA6Ly9icm93c2VyaGFja3MuY29tLyNoYWNrLWU3MWQ4NjkyZjY1MzM0MTczZmVlNzE1YzIyMmNiODA1XG4gICAgICAvLyBUZXN0cyBmb3IgZXhpc3RlbmNlIG9mIHN0YW5kYXJkIGdsb2JhbHMgaXMgdG8gYWxsb3cgc3R5bGUtbG9hZGVyXG4gICAgICAvLyB0byBvcGVyYXRlIGNvcnJlY3RseSBpbnRvIG5vbi1zdGFuZGFyZCBlbnZpcm9ubWVudHNcbiAgICAgIC8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2stY29udHJpYi9zdHlsZS1sb2FkZXIvaXNzdWVzLzE3N1xuICAgICAgbWVtbyA9IEJvb2xlYW4od2luZG93ICYmIGRvY3VtZW50ICYmIGRvY3VtZW50LmFsbCAmJiAhd2luZG93LmF0b2IpO1xuICAgIH1cblxuICAgIHJldHVybiBtZW1vO1xuICB9O1xufSgpO1xuXG52YXIgZ2V0VGFyZ2V0ID0gZnVuY3Rpb24gZ2V0VGFyZ2V0KCkge1xuICB2YXIgbWVtbyA9IHt9O1xuICByZXR1cm4gZnVuY3Rpb24gbWVtb3JpemUodGFyZ2V0KSB7XG4gICAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7IC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG5cbiAgICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICAgIH1cblxuICAgIHJldHVybiBtZW1vW3RhcmdldF07XG4gIH07XG59KCk7XG5cbnZhciBzdHlsZXNJbkRvbSA9IFtdO1xuXG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRG9tLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRG9tW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM11cbiAgICB9O1xuXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5Eb21baW5kZXhdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRG9tW2luZGV4XS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlc0luRG9tLnB1c2goe1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiBhZGRTdHlsZShvYmosIG9wdGlvbnMpLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICB2YXIgYXR0cmlidXRlcyA9IG9wdGlvbnMuYXR0cmlidXRlcyB8fCB7fTtcblxuICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMubm9uY2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSAndW5kZWZpbmVkJyA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcblxuICAgIGlmIChub25jZSkge1xuICAgICAgYXR0cmlidXRlcy5ub25jZSA9IG5vbmNlO1xuICAgIH1cbiAgfVxuXG4gIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHN0eWxlLnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSk7XG4gIH0pO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pbnNlcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRpb25zLmluc2VydChzdHlsZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHRhcmdldCA9IGdldFRhcmdldChvcHRpb25zLmluc2VydCB8fCAnaGVhZCcpO1xuXG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gICAgfVxuXG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgfVxuXG4gIHJldHVybiBzdHlsZTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlKSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuICBpZiAoc3R5bGUucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0eWxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGUpO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5cblxudmFyIHJlcGxhY2VUZXh0ID0gZnVuY3Rpb24gcmVwbGFjZVRleHQoKSB7XG4gIHZhciB0ZXh0U3RvcmUgPSBbXTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHJlcGxhY2UoaW5kZXgsIHJlcGxhY2VtZW50KSB7XG4gICAgdGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50O1xuICAgIHJldHVybiB0ZXh0U3RvcmUuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpO1xuICB9O1xufSgpO1xuXG5mdW5jdGlvbiBhcHBseVRvU2luZ2xldG9uVGFnKHN0eWxlLCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcbiAgdmFyIGNzcyA9IHJlbW92ZSA/ICcnIDogb2JqLm1lZGlhID8gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKS5jb25jYXQob2JqLmNzcywgXCJ9XCIpIDogb2JqLmNzczsgLy8gRm9yIG9sZCBJRVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cblxuICBpZiAoc3R5bGUuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBjc3NOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKTtcbiAgICB2YXIgY2hpbGROb2RlcyA9IHN0eWxlLmNoaWxkTm9kZXM7XG5cbiAgICBpZiAoY2hpbGROb2Rlc1tpbmRleF0pIHtcbiAgICAgIHN0eWxlLnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKTtcbiAgICB9XG5cbiAgICBpZiAoY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgIHN0eWxlLmluc2VydEJlZm9yZShjc3NOb2RlLCBjaGlsZE5vZGVzW2luZGV4XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGNzc05vZGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseVRvVGFnKHN0eWxlLCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IG9iai5jc3M7XG4gIHZhciBtZWRpYSA9IG9iai5tZWRpYTtcbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG5cbiAgaWYgKG1lZGlhKSB7XG4gICAgc3R5bGUuc2V0QXR0cmlidXRlKCdtZWRpYScsIG1lZGlhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoJ21lZGlhJyk7XG4gIH1cblxuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSksIFwiICovXCIpO1xuICB9IC8vIEZvciBvbGQgSUVcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG5cblxuICBpZiAoc3R5bGUuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGUuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGUucmVtb3ZlQ2hpbGQoc3R5bGUuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cblxudmFyIHNpbmdsZXRvbiA9IG51bGw7XG52YXIgc2luZ2xldG9uQ291bnRlciA9IDA7XG5cbmZ1bmN0aW9uIGFkZFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgc3R5bGU7XG4gIHZhciB1cGRhdGU7XG4gIHZhciByZW1vdmU7XG5cbiAgaWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XG4gICAgdmFyIHN0eWxlSW5kZXggPSBzaW5nbGV0b25Db3VudGVyKys7XG4gICAgc3R5bGUgPSBzaW5nbGV0b24gfHwgKHNpbmdsZXRvbiA9IGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSk7XG4gICAgdXBkYXRlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlLCBzdHlsZUluZGV4LCBmYWxzZSk7XG4gICAgcmVtb3ZlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlLCBzdHlsZUluZGV4LCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBzdHlsZSA9IGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgICB1cGRhdGUgPSBhcHBseVRvVGFnLmJpbmQobnVsbCwgc3R5bGUsIG9wdGlvbnMpO1xuXG4gICAgcmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlKTtcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlKG9iaik7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGVTdHlsZShuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsgLy8gRm9yY2Ugc2luZ2xlLXRhZyBzb2x1dGlvbiBvbiBJRTYtOSwgd2hpY2ggaGFzIGEgaGFyZCBsaW1pdCBvbiB0aGUgIyBvZiA8c3R5bGU+XG4gIC8vIHRhZ3MgaXQgd2lsbCBhbGxvdyBvbiBhIHBhZ2VcblxuICBpZiAoIW9wdGlvbnMuc2luZ2xldG9uICYmIHR5cGVvZiBvcHRpb25zLnNpbmdsZXRvbiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgb3B0aW9ucy5zaW5nbGV0b24gPSBpc09sZElFKCk7XG4gIH1cblxuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ld0xpc3QpICE9PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRvbVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cblxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcblxuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcblxuICAgICAgaWYgKHN0eWxlc0luRG9tW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRvbVtfaW5kZXhdLnVwZGF0ZXIoKTtcblxuICAgICAgICBzdHlsZXNJbkRvbS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3379\n");
/***/ }),
/***/ 4387:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(3890);\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(814)/* .default */ .Z\nvar update = add(\"1b78a411\", content, false, {});\n// Hot Module Replacement\nif(false) {}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9hcHAvbGlzdC9jb21wb25lbnRzL0ZpbHRlckJhci52dWU/MWViOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBLGNBQWMsbUJBQU8sQ0FBQyxJQUEwUztBQUNoVTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHlDQUFpRjtBQUMzRiwrQ0FBK0M7QUFDL0M7QUFDQSxHQUFHLEtBQVUsRUFBRSIsImZpbGUiOiI0Mzg3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblxuLy8gbG9hZCB0aGUgc3R5bGVzXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vRmlsdGVyQmFyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTVlMTk1YTMyJnNjb3BlZD10cnVlJmxhbmc9Y3NzJlwiKTtcbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgYWRkID0gcmVxdWlyZShcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCIxYjc4YTQxMVwiLCBjb250ZW50LCBmYWxzZSwge30pO1xuLy8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuaWYobW9kdWxlLmhvdCkge1xuIC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG4gaWYoIWNvbnRlbnQubG9jYWxzKSB7XG4gICBtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9GaWx0ZXJCYXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NWUxOTVhMzImc2NvcGVkPXRydWUmbGFuZz1jc3MmXCIsIGZ1bmN0aW9uKCkge1xuICAgICB2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vRmlsdGVyQmFyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTVlMTk1YTMyJnNjb3BlZD10cnVlJmxhbmc9Y3NzJlwiKTtcbiAgICAgaWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG4gICAgIHVwZGF0ZShuZXdDb250ZW50KTtcbiAgIH0pO1xuIH1cbiAvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG4gbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4387\n");
/***/ }),
/***/ 1219:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(1301);\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(814)/* .default */ .Z\nvar update = add(\"feac4c16\", content, false, {});\n// Hot Module Replacement\nif(false) {}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9zcmMvY29tcG9uZW50cy9WdWV0YWJsZS52dWU/OWM3ZiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBLGNBQWMsbUJBQU8sQ0FBQyxJQUFxUDtBQUMzUTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHlDQUFvRTtBQUM5RSwrQ0FBK0M7QUFDL0M7QUFDQSxHQUFHLEtBQVUsRUFBRSIsImZpbGUiOiIxMjE5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblxuLy8gbG9hZCB0aGUgc3R5bGVzXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uLy4uL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9WdWV0YWJsZS52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0xNTk2NWUzYiZzY29wZWQ9dHJ1ZSZsYW5nPWNzcyZcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCJmZWFjNGMxNlwiLCBjb250ZW50LCBmYWxzZSwge30pO1xuLy8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuaWYobW9kdWxlLmhvdCkge1xuIC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG4gaWYoIWNvbnRlbnQubG9jYWxzKSB7XG4gICBtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL1Z1ZXRhYmxlLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTE1OTY1ZTNiJnNjb3BlZD10cnVlJmxhbmc9Y3NzJlwiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vVnVldGFibGUudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MTU5NjVlM2Imc2NvcGVkPXRydWUmbGFuZz1jc3MmXCIpO1xuICAgICBpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcbiAgICAgdXBkYXRlKG5ld0NvbnRlbnQpO1xuICAgfSk7XG4gfVxuIC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3NcbiBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1219\n");
/***/ }),
/***/ 814:
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Z\": () => /* binding */ addStylesClient\n});\n\n;// CONCATENATED MODULE: ./node_modules/vue-style-loader/lib/listToStyles.js\n/**\n * Translates the list format produced by css-loader into something\n * easier to manipulate.\n */\nfunction listToStyles(parentId, list) {\n var styles = [];\n var newStyles = {};\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = item[0];\n var css = item[1];\n var media = item[2];\n var sourceMap = item[3];\n var part = {\n id: parentId + ':' + i,\n css: css,\n media: media,\n sourceMap: sourceMap\n };\n\n if (!newStyles[id]) {\n styles.push(newStyles[id] = {\n id: id,\n parts: [part]\n });\n } else {\n newStyles[id].parts.push(part);\n }\n }\n\n return styles;\n}\n;// CONCATENATED MODULE: ./node_modules/vue-style-loader/lib/addStylesClient.js\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n Modified by Evan You @yyx990803\n*/\n\n\n\nvar hasDocument = typeof document !== 'undefined'\n\nif (typeof DEBUG !== 'undefined' && DEBUG) {\n if (!hasDocument) {\n throw new Error(\n 'vue-style-loader cannot be used in a non-browser environment. ' +\n \"Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\"\n ) }\n}\n\n/*\ntype StyleObject = {\n id: number;\n parts: Array<StyleObjectPart>\n}\n\ntype StyleObjectPart = {\n css: string;\n media: string;\n sourceMap: ?string\n}\n*/\n\nvar stylesInDom = {/*\n [id: number]: {\n id: number,\n refs: number,\n parts: Array<(obj?: StyleObjectPart) => void>\n }\n*/}\n\nvar head = hasDocument && (document.head || document.getElementsByTagName('head')[0])\nvar singletonElement = null\nvar singletonCounter = 0\nvar isProduction = false\nvar noop = function () {}\nvar options = null\nvar ssrIdKey = 'data-vue-ssr-id'\n\n// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n// tags it will allow on a page\nvar isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\\b/.test(navigator.userAgent.toLowerCase())\n\nfunction addStylesClient (parentId, list, _isProduction, _options) {\n isProduction = _isProduction\n\n options = _options || {}\n\n var styles = listToStyles(parentId, list)\n addStylesToDom(styles)\n\n return function update (newList) {\n var mayRemove = []\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i]\n var domStyle = stylesInDom[item.id]\n domStyle.refs--\n mayRemove.push(domStyle)\n }\n if (newList) {\n styles = listToStyles(parentId, newList)\n addStylesToDom(styles)\n } else {\n styles = []\n }\n for (var i = 0; i < mayRemove.length; i++) {\n var domStyle = mayRemove[i]\n if (domStyle.refs === 0) {\n for (var j = 0; j < domStyle.parts.length; j++) {\n domStyle.parts[j]()\n }\n delete stylesInDom[domStyle.id]\n }\n }\n }\n}\n\nfunction addStylesToDom (styles /* Array<StyleObject> */) {\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i]\n var domStyle = stylesInDom[item.id]\n if (domStyle) {\n domStyle.refs++\n for (var j = 0; j < domStyle.parts.length; j++) {\n domStyle.parts[j](item.parts[j])\n }\n for (; j < item.parts.length; j++) {\n domStyle.parts.push(addStyle(item.parts[j]))\n }\n if (domStyle.parts.length > item.parts.length) {\n domStyle.parts.length = item.parts.length\n }\n } else {\n var parts = []\n for (var j = 0; j < item.parts.length; j++) {\n parts.push(addStyle(item.parts[j]))\n }\n stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }\n }\n }\n}\n\nfunction createStyleElement () {\n var styleElement = document.createElement('style')\n styleElement.type = 'text/css'\n head.appendChild(styleElement)\n return styleElement\n}\n\nfunction addStyle (obj /* StyleObjectPart */) {\n var update, remove\n var styleElement = document.querySelector('style[' + ssrIdKey + '~=\"' + obj.id + '\"]')\n\n if (styleElement) {\n if (isProduction) {\n // has SSR styles and in production mode.\n // simply do nothing.\n return noop\n } else {\n // has SSR styles but in dev mode.\n // for some reason Chrome can't handle source map in server-rendered\n // style tags - source maps in <style> only works if the style tag is\n // created and inserted dynamically. So we remove the server rendered\n // styles and inject new ones.\n styleElement.parentNode.removeChild(styleElement)\n }\n }\n\n if (isOldIE) {\n // use singleton mode for IE9.\n var styleIndex = singletonCounter++\n styleElement = singletonElement || (singletonElement = createStyleElement())\n update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)\n remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)\n } else {\n // use multi-style-tag mode in all other cases\n styleElement = createStyleElement()\n update = applyToTag.bind(null, styleElement)\n remove = function () {\n styleElement.parentNode.removeChild(styleElement)\n }\n }\n\n update(obj)\n\n return function updateStyle (newObj /* StyleObjectPart */) {\n if (newObj) {\n if (newObj.css === obj.css &&\n newObj.media === obj.media &&\n newObj.sourceMap === obj.sourceMap) {\n return\n }\n update(obj = newObj)\n } else {\n remove()\n }\n }\n}\n\nvar replaceText = (function () {\n var textStore = []\n\n return function (index, replacement) {\n textStore[index] = replacement\n return textStore.filter(Boolean).join('\\n')\n }\n})()\n\nfunction applyToSingletonTag (styleElement, index, remove, obj) {\n var css = remove ? '' : obj.css\n\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = replaceText(index, css)\n } else {\n var cssNode = document.createTextNode(css)\n var childNodes = styleElement.childNodes\n if (childNodes[index]) styleElement.removeChild(childNodes[index])\n if (childNodes.length) {\n styleElement.insertBefore(cssNode, childNodes[index])\n } else {\n styleElement.appendChild(cssNode)\n }\n }\n}\n\nfunction applyToTag (styleElement, obj) {\n var css = obj.css\n var media = obj.media\n var sourceMap = obj.sourceMap\n\n if (media) {\n styleElement.setAttribute('media', media)\n }\n if (options.ssrId) {\n styleElement.setAttribute(ssrIdKey, obj.id)\n }\n\n if (sourceMap) {\n // https://developer.chrome.com/devtools/docs/javascript-debugging\n // this makes source maps inside style tags work properly in Chrome\n css += '\\n/*# sourceURL=' + sourceMap.sources[0] + ' */'\n // http://stackoverflow.com/a/26603875\n css += '\\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'\n }\n\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild)\n }\n styleElement.appendChild(document.createTextNode(css))\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVlLXN0eWxlLWxvYWRlci9saWIvbGlzdFRvU3R5bGVzLmpzPzliYmMiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vbm9kZV9tb2R1bGVzL3Z1ZS1zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlc0NsaWVudC5qcz80OTllIl0sIm5hbWVzIjpbImxpc3RUb1N0eWxlcyIsInBhcmVudElkIiwibGlzdCIsInN0eWxlcyIsIm5ld1N0eWxlcyIsImkiLCJsZW5ndGgiLCJpdGVtIiwiaWQiLCJjc3MiLCJtZWRpYSIsInNvdXJjZU1hcCIsInBhcnQiLCJwdXNoIiwicGFydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLFNBQVNBLFlBQVQsQ0FBdUJDLFFBQXZCLEVBQWlDQyxJQUFqQyxFQUF1QztBQUNwRCxNQUFJQyxNQUFNLEdBQUcsRUFBYjtBQUNBLE1BQUlDLFNBQVMsR0FBRyxFQUFoQjs7QUFDQSxPQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdILElBQUksQ0FBQ0ksTUFBekIsRUFBaUNELENBQUMsRUFBbEMsRUFBc0M7QUFDcEMsUUFBSUUsSUFBSSxHQUFHTCxJQUFJLENBQUNHLENBQUQsQ0FBZjtBQUNBLFFBQUlHLEVBQUUsR0FBR0QsSUFBSSxDQUFDLENBQUQsQ0FBYjtBQUNBLFFBQUlFLEdBQUcsR0FBR0YsSUFBSSxDQUFDLENBQUQsQ0FBZDtBQUNBLFFBQUlHLEtBQUssR0FBR0gsSUFBSSxDQUFDLENBQUQsQ0FBaEI7QUFDQSxRQUFJSSxTQUFTLEdBQUdKLElBQUksQ0FBQyxDQUFELENBQXBCO0FBQ0EsUUFBSUssSUFBSSxHQUFHO0FBQ1RKLFFBQUUsRUFBRVAsUUFBUSxHQUFHLEdBQVgsR0FBaUJJLENBRFo7QUFFVEksU0FBRyxFQUFFQSxHQUZJO0FBR1RDLFdBQUssRUFBRUEsS0FIRTtBQUlUQyxlQUFTLEVBQUVBO0FBSkYsS0FBWDs7QUFNQSxRQUFJLENBQUNQLFNBQVMsQ0FBQ0ksRUFBRCxDQUFkLEVBQW9CO0FBQ2xCTCxZQUFNLENBQUNVLElBQVAsQ0FBWVQsU0FBUyxDQUFDSSxFQUFELENBQVQsR0FBZ0I7QUFBRUEsVUFBRSxFQUFFQSxFQUFOO0FBQVVNLGFBQUssRUFBRSxDQUFDRixJQUFEO0FBQWpCLE9BQTVCO0FBQ0QsS0FGRCxNQUVPO0FBQ0xSLGVBQVMsQ0FBQ0ksRUFBRCxDQUFULENBQWNNLEtBQWQsQ0FBb0JELElBQXBCLENBQXlCRCxJQUF6QjtBQUNEO0FBQ0Y7O0FBQ0QsU0FBT1QsTUFBUDtBQUNELEM7O0FDMUJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRXlDOztBQUV6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsaUJBQWlCO0FBQzNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjs7QUFFQTs7QUFFQSxlQUFlLFlBQVk7QUFDM0I7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixtQkFBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQkFBbUIsc0JBQXNCO0FBQ3pDO0FBQ0E7QUFDQSx1QkFBdUIsMkJBQTJCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLG1CQUFtQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiwyQkFBMkI7QUFDaEQ7QUFDQTtBQUNBLFlBQVksdUJBQXVCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxxQkFBcUIsdUJBQXVCO0FBQzVDO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjgxNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNsYXRlcyB0aGUgbGlzdCBmb3JtYXQgcHJvZHVjZWQgYnkgY3NzLWxvYWRlciBpbnRvIHNvbWV0aGluZ1xuICogZWFzaWVyIHRvIG1hbmlwdWxhdGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RUb1N0eWxlcyAocGFyZW50SWQsIGxpc3QpIHtcbiAgdmFyIHN0eWxlcyA9IFtdXG4gIHZhciBuZXdTdHlsZXMgPSB7fVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV1cbiAgICB2YXIgaWQgPSBpdGVtWzBdXG4gICAgdmFyIGNzcyA9IGl0ZW1bMV1cbiAgICB2YXIgbWVkaWEgPSBpdGVtWzJdXG4gICAgdmFyIHNvdXJjZU1hcCA9IGl0ZW1bM11cbiAgICB2YXIgcGFydCA9IHtcbiAgICAgIGlkOiBwYXJlbnRJZCArICc6JyArIGksXG4gICAgICBjc3M6IGNzcyxcbiAgICAgIG1lZGlhOiBtZWRpYSxcbiAgICAgIHNvdXJjZU1hcDogc291cmNlTWFwXG4gICAgfVxuICAgIGlmICghbmV3U3R5bGVzW2lkXSkge1xuICAgICAgc3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHsgaWQ6IGlkLCBwYXJ0czogW3BhcnRdIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1N0eWxlc1tpZF0ucGFydHMucHVzaChwYXJ0KVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3R5bGVzXG59XG4iLCIvKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4gIE1vZGlmaWVkIGJ5IEV2YW4gWW91IEB5eXg5OTA4MDNcbiovXG5cbmltcG9ydCBsaXN0VG9TdHlsZXMgZnJvbSAnLi9saXN0VG9TdHlsZXMnXG5cbnZhciBoYXNEb2N1bWVudCA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcblxuaWYgKHR5cGVvZiBERUJVRyAhPT0gJ3VuZGVmaW5lZCcgJiYgREVCVUcpIHtcbiAgaWYgKCFoYXNEb2N1bWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAndnVlLXN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50LiAnICtcbiAgICBcIlVzZSB7IHRhcmdldDogJ25vZGUnIH0gaW4geW91ciBXZWJwYWNrIGNvbmZpZyB0byBpbmRpY2F0ZSBhIHNlcnZlci1yZW5kZXJpbmcgZW52aXJvbm1lbnQuXCJcbiAgKSB9XG59XG5cbi8qXG50eXBlIFN0eWxlT2JqZWN0ID0ge1xuICBpZDogbnVtYmVyO1xuICBwYXJ0czogQXJyYXk8U3R5bGVPYmplY3RQYXJ0PlxufVxuXG50eXBlIFN0eWxlT2JqZWN0UGFydCA9IHtcbiAgY3NzOiBzdHJpbmc7XG4gIG1lZGlhOiBzdHJpbmc7XG4gIHNvdXJjZU1hcDogP3N0cmluZ1xufVxuKi9cblxudmFyIHN0eWxlc0luRG9tID0gey8qXG4gIFtpZDogbnVtYmVyXToge1xuICAgIGlkOiBudW1iZXIsXG4gICAgcmVmczogbnVtYmVyLFxuICAgIHBhcnRzOiBBcnJheTwob2JqPzogU3R5bGVPYmplY3RQYXJ0KSA9PiB2b2lkPlxuICB9XG4qL31cblxudmFyIGhlYWQgPSBoYXNEb2N1bWVudCAmJiAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdKVxudmFyIHNpbmdsZXRvbkVsZW1lbnQgPSBudWxsXG52YXIgc2luZ2xldG9uQ291bnRlciA9IDBcbnZhciBpc1Byb2R1Y3Rpb24gPSBmYWxzZVxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fVxudmFyIG9wdGlvbnMgPSBudWxsXG52YXIgc3NySWRLZXkgPSAnZGF0YS12dWUtc3NyLWlkJ1xuXG4vLyBGb3JjZSBzaW5nbGUtdGFnIHNvbHV0aW9uIG9uIElFNi05LCB3aGljaCBoYXMgYSBoYXJkIGxpbWl0IG9uIHRoZSAjIG9mIDxzdHlsZT5cbi8vIHRhZ3MgaXQgd2lsbCBhbGxvdyBvbiBhIHBhZ2VcbnZhciBpc09sZElFID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgL21zaWUgWzYtOV1cXGIvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRTdHlsZXNDbGllbnQgKHBhcmVudElkLCBsaXN0LCBfaXNQcm9kdWN0aW9uLCBfb3B0aW9ucykge1xuICBpc1Byb2R1Y3Rpb24gPSBfaXNQcm9kdWN0aW9uXG5cbiAgb3B0aW9ucyA9IF9vcHRpb25zIHx8IHt9XG5cbiAgdmFyIHN0eWxlcyA9IGxpc3RUb1N0eWxlcyhwYXJlbnRJZCwgbGlzdClcbiAgYWRkU3R5bGVzVG9Eb20oc3R5bGVzKVxuXG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUgKG5ld0xpc3QpIHtcbiAgICB2YXIgbWF5UmVtb3ZlID0gW11cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSBzdHlsZXNbaV1cbiAgICAgIHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdXG4gICAgICBkb21TdHlsZS5yZWZzLS1cbiAgICAgIG1heVJlbW92ZS5wdXNoKGRvbVN0eWxlKVxuICAgIH1cbiAgICBpZiAobmV3TGlzdCkge1xuICAgICAgc3R5bGVzID0gbGlzdFRvU3R5bGVzKHBhcmVudElkLCBuZXdMaXN0KVxuICAgICAgYWRkU3R5bGVzVG9Eb20oc3R5bGVzKVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZXMgPSBbXVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1heVJlbW92ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRvbVN0eWxlID0gbWF5UmVtb3ZlW2ldXG4gICAgICBpZiAoZG9tU3R5bGUucmVmcyA9PT0gMCkge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgZG9tU3R5bGUucGFydHNbal0oKVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBzdHlsZXNJbkRvbVtkb21TdHlsZS5pZF1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkU3R5bGVzVG9Eb20gKHN0eWxlcyAvKiBBcnJheTxTdHlsZU9iamVjdD4gKi8pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IHN0eWxlc1tpXVxuICAgIHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdXG4gICAgaWYgKGRvbVN0eWxlKSB7XG4gICAgICBkb21TdHlsZS5yZWZzKytcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgZG9tU3R5bGUucGFydHNbal0oaXRlbS5wYXJ0c1tqXSlcbiAgICAgIH1cbiAgICAgIGZvciAoOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgICBkb21TdHlsZS5wYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0pKVxuICAgICAgfVxuICAgICAgaWYgKGRvbVN0eWxlLnBhcnRzLmxlbmd0aCA+IGl0ZW0ucGFydHMubGVuZ3RoKSB7XG4gICAgICAgIGRvbVN0eWxlLnBhcnRzLmxlbmd0aCA9IGl0ZW0ucGFydHMubGVuZ3RoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwYXJ0cyA9IFtdXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgcGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdKSlcbiAgICAgIH1cbiAgICAgIHN0eWxlc0luRG9tW2l0ZW0uaWRdID0geyBpZDogaXRlbS5pZCwgcmVmczogMSwgcGFydHM6IHBhcnRzIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50ICgpIHtcbiAgdmFyIHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcbiAgc3R5bGVFbGVtZW50LnR5cGUgPSAndGV4dC9jc3MnXG4gIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KVxuICByZXR1cm4gc3R5bGVFbGVtZW50XG59XG5cbmZ1bmN0aW9uIGFkZFN0eWxlIChvYmogLyogU3R5bGVPYmplY3RQYXJ0ICovKSB7XG4gIHZhciB1cGRhdGUsIHJlbW92ZVxuICB2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc3R5bGVbJyArIHNzcklkS2V5ICsgJ349XCInICsgb2JqLmlkICsgJ1wiXScpXG5cbiAgaWYgKHN0eWxlRWxlbWVudCkge1xuICAgIGlmIChpc1Byb2R1Y3Rpb24pIHtcbiAgICAgIC8vIGhhcyBTU1Igc3R5bGVzIGFuZCBpbiBwcm9kdWN0aW9uIG1vZGUuXG4gICAgICAvLyBzaW1wbHkgZG8gbm90aGluZy5cbiAgICAgIHJldHVybiBub29wXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGhhcyBTU1Igc3R5bGVzIGJ1dCBpbiBkZXYgbW9kZS5cbiAgICAgIC8vIGZvciBzb21lIHJlYXNvbiBDaHJvbWUgY2FuJ3QgaGFuZGxlIHNvdXJjZSBtYXAgaW4gc2VydmVyLXJlbmRlcmVkXG4gICAgICAvLyBzdHlsZSB0YWdzIC0gc291cmNlIG1hcHMgaW4gPHN0eWxlPiBvbmx5IHdvcmtzIGlmIHRoZSBzdHlsZSB0YWcgaXNcbiAgICAgIC8vIGNyZWF0ZWQgYW5kIGluc2VydGVkIGR5bmFtaWNhbGx5LiBTbyB3ZSByZW1vdmUgdGhlIHNlcnZlciByZW5kZXJlZFxuICAgICAgLy8gc3R5bGVzIGFuZCBpbmplY3QgbmV3IG9uZXMuXG4gICAgICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpXG4gICAgfVxuICB9XG5cbiAgaWYgKGlzT2xkSUUpIHtcbiAgICAvLyB1c2Ugc2luZ2xldG9uIG1vZGUgZm9yIElFOS5cbiAgICB2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrK1xuICAgIHN0eWxlRWxlbWVudCA9IHNpbmdsZXRvbkVsZW1lbnQgfHwgKHNpbmdsZXRvbkVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQoKSlcbiAgICB1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCBmYWxzZSlcbiAgICByZW1vdmUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50LCBzdHlsZUluZGV4LCB0cnVlKVxuICB9IGVsc2Uge1xuICAgIC8vIHVzZSBtdWx0aS1zdHlsZS10YWcgbW9kZSBpbiBhbGwgb3RoZXIgY2FzZXNcbiAgICBzdHlsZUVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQoKVxuICAgIHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQpXG4gICAgcmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZShvYmopXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVN0eWxlIChuZXdPYmogLyogU3R5bGVPYmplY3RQYXJ0ICovKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiZcbiAgICAgICAgICBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJlxuICAgICAgICAgIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB1cGRhdGUob2JqID0gbmV3T2JqKVxuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmUoKVxuICAgIH1cbiAgfVxufVxuXG52YXIgcmVwbGFjZVRleHQgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgdGV4dFN0b3JlID0gW11cblxuICByZXR1cm4gZnVuY3Rpb24gKGluZGV4LCByZXBsYWNlbWVudCkge1xuICAgIHRleHRTdG9yZVtpbmRleF0gPSByZXBsYWNlbWVudFxuICAgIHJldHVybiB0ZXh0U3RvcmUuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpXG4gIH1cbn0pKClcblxuZnVuY3Rpb24gYXBwbHlUb1NpbmdsZXRvblRhZyAoc3R5bGVFbGVtZW50LCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcbiAgdmFyIGNzcyA9IHJlbW92ZSA/ICcnIDogb2JqLmNzc1xuXG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSByZXBsYWNlVGV4dChpbmRleCwgY3NzKVxuICB9IGVsc2Uge1xuICAgIHZhciBjc3NOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKVxuICAgIHZhciBjaGlsZE5vZGVzID0gc3R5bGVFbGVtZW50LmNoaWxkTm9kZXNcbiAgICBpZiAoY2hpbGROb2Rlc1tpbmRleF0pIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZE5vZGVzW2luZGV4XSlcbiAgICBpZiAoY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5pbnNlcnRCZWZvcmUoY3NzTm9kZSwgY2hpbGROb2Rlc1tpbmRleF0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChjc3NOb2RlKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseVRvVGFnIChzdHlsZUVsZW1lbnQsIG9iaikge1xuICB2YXIgY3NzID0gb2JqLmNzc1xuICB2YXIgbWVkaWEgPSBvYmoubWVkaWFcbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXBcblxuICBpZiAobWVkaWEpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdtZWRpYScsIG1lZGlhKVxuICB9XG4gIGlmIChvcHRpb25zLnNzcklkKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShzc3JJZEtleSwgb2JqLmlkKVxuICB9XG5cbiAgaWYgKHNvdXJjZU1hcCkge1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZGV2dG9vbHMvZG9jcy9qYXZhc2NyaXB0LWRlYnVnZ2luZ1xuICAgIC8vIHRoaXMgbWFrZXMgc291cmNlIG1hcHMgaW5zaWRlIHN0eWxlIHRhZ3Mgd29yayBwcm9wZXJseSBpbiBDaHJvbWVcbiAgICBjc3MgKz0gJ1xcbi8qIyBzb3VyY2VVUkw9JyArIHNvdXJjZU1hcC5zb3VyY2VzWzBdICsgJyAqLydcbiAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNjYwMzg3NVxuICAgIGNzcyArPSAnXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCwnICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSArICcgKi8nXG4gIH1cblxuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzXG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpXG4gICAgfVxuICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKVxuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///814\n");
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(__webpack_module_cache__[moduleId]) {
/******/ return __webpack_module_cache__[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ id: moduleId,
/******/ loaded: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/amd options */
/******/ (() => {
/******/ __webpack_require__.amdO = {};
/******/ })();
/******/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => module['default'] :
/******/ () => module;
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/global */
/******/ (() => {
/******/ __webpack_require__.g = (function() {
/******/ if (typeof globalThis === 'object') return globalThis;
/******/ try {
/******/ return this || new Function('return this')();
/******/ } catch (e) {
/******/ if (typeof window === 'object') return window;
/******/ }
/******/ })();
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/node module decorator */
/******/ (() => {
/******/ __webpack_require__.nmd = (module) => {
/******/ module.paths = [];
/******/ if (!module.children) module.children = [];
/******/ return module;
/******/ };
/******/ })();
/******/
/************************************************************************/
(() => {
"use strict";
eval("\n;// CONCATENATED MODULE: ./node_modules/vue/dist/vue.runtime.esm.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*!\n * Vue.js v2.6.12\n * (c) 2014-2020 Evan You\n * Released under the MIT License.\n */\n\n/* */\nvar emptyObject = Object.freeze({}); // These helpers produce better VM code in JS engines due to their\n// explicitness and function inlining.\n\nfunction isUndef(v) {\n return v === undefined || v === null;\n}\n\nfunction isDef(v) {\n return v !== undefined && v !== null;\n}\n\nfunction isTrue(v) {\n return v === true;\n}\n\nfunction isFalse(v) {\n return v === false;\n}\n/**\n * Check if value is primitive.\n */\n\n\nfunction isPrimitive(value) {\n return typeof value === 'string' || typeof value === 'number' || // $flow-disable-line\n _typeof(value) === 'symbol' || typeof value === 'boolean';\n}\n/**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n */\n\n\nfunction isObject(obj) {\n return obj !== null && _typeof(obj) === 'object';\n}\n/**\n * Get the raw type string of a value, e.g., [object Object].\n */\n\n\nvar _toString = Object.prototype.toString;\n\nfunction toRawType(value) {\n return _toString.call(value).slice(8, -1);\n}\n/**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n */\n\n\nfunction isPlainObject(obj) {\n return _toString.call(obj) === '[object Object]';\n}\n\nfunction isRegExp(v) {\n return _toString.call(v) === '[object RegExp]';\n}\n/**\n * Check if val is a valid array index.\n */\n\n\nfunction isValidArrayIndex(val) {\n var n = parseFloat(String(val));\n return n >= 0 && Math.floor(n) === n && isFinite(val);\n}\n\nfunction isPromise(val) {\n return isDef(val) && typeof val.then === 'function' && typeof val.catch === 'function';\n}\n/**\n * Convert a value to a string that is actually rendered.\n */\n\n\nfunction vue_runtime_esm_toString(val) {\n return val == null ? '' : Array.isArray(val) || isPlainObject(val) && val.toString === _toString ? JSON.stringify(val, null, 2) : String(val);\n}\n/**\n * Convert an input value to a number for persistence.\n * If the conversion fails, return original string.\n */\n\n\nfunction toNumber(val) {\n var n = parseFloat(val);\n return isNaN(n) ? val : n;\n}\n/**\n * Make a map and return a function for checking if a key\n * is in that map.\n */\n\n\nfunction makeMap(str, expectsLowerCase) {\n var map = Object.create(null);\n var list = str.split(',');\n\n for (var i = 0; i < list.length; i++) {\n map[list[i]] = true;\n }\n\n return expectsLowerCase ? function (val) {\n return map[val.toLowerCase()];\n } : function (val) {\n return map[val];\n };\n}\n/**\n * Check if a tag is a built-in tag.\n */\n\n\nvar isBuiltInTag = makeMap('slot,component', true);\n/**\n * Check if an attribute is a reserved attribute.\n */\n\nvar isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');\n/**\n * Remove an item from an array.\n */\n\nfunction remove(arr, item) {\n if (arr.length) {\n var index = arr.indexOf(item);\n\n if (index > -1) {\n return arr.splice(index, 1);\n }\n }\n}\n/**\n * Check whether an object has the property.\n */\n\n\nvar vue_runtime_esm_hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction hasOwn(obj, key) {\n return vue_runtime_esm_hasOwnProperty.call(obj, key);\n}\n/**\n * Create a cached version of a pure function.\n */\n\n\nfunction cached(fn) {\n var cache = Object.create(null);\n return function cachedFn(str) {\n var hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n}\n/**\n * Camelize a hyphen-delimited string.\n */\n\n\nvar camelizeRE = /-(\\w)/g;\nvar camelize = cached(function (str) {\n return str.replace(camelizeRE, function (_, c) {\n return c ? c.toUpperCase() : '';\n });\n});\n/**\n * Capitalize a string.\n */\n\nvar capitalize = cached(function (str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\n/**\n * Hyphenate a camelCase string.\n */\n\nvar hyphenateRE = /\\B([A-Z])/g;\nvar hyphenate = cached(function (str) {\n return str.replace(hyphenateRE, '-$1').toLowerCase();\n});\n/**\n * Simple bind polyfill for environments that do not support it,\n * e.g., PhantomJS 1.x. Technically, we don't need this anymore\n * since native bind is now performant enough in most browsers.\n * But removing it would mean breaking code that was able to run in\n * PhantomJS 1.x, so this must be kept for backward compatibility.\n */\n\n/* istanbul ignore next */\n\nfunction polyfillBind(fn, ctx) {\n function boundFn(a) {\n var l = arguments.length;\n return l ? l > 1 ? fn.apply(ctx, arguments) : fn.call(ctx, a) : fn.call(ctx);\n }\n\n boundFn._length = fn.length;\n return boundFn;\n}\n\nfunction nativeBind(fn, ctx) {\n return fn.bind(ctx);\n}\n\nvar bind = Function.prototype.bind ? nativeBind : polyfillBind;\n/**\n * Convert an Array-like object to a real Array.\n */\n\nfunction toArray(list, start) {\n start = start || 0;\n var i = list.length - start;\n var ret = new Array(i);\n\n while (i--) {\n ret[i] = list[i + start];\n }\n\n return ret;\n}\n/**\n * Mix properties into target object.\n */\n\n\nfunction extend(to, _from) {\n for (var key in _from) {\n to[key] = _from[key];\n }\n\n return to;\n}\n/**\n * Merge an Array of Objects into a single Object.\n */\n\n\nfunction toObject(arr) {\n var res = {};\n\n for (var i = 0; i < arr.length; i++) {\n if (arr[i]) {\n extend(res, arr[i]);\n }\n }\n\n return res;\n}\n/* eslint-disable no-unused-vars */\n\n/**\n * Perform no operation.\n * Stubbing args to make Flow happy without leaving useless transpiled code\n * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).\n */\n\n\nfunction noop(a, b, c) {}\n/**\n * Always return false.\n */\n\n\nvar no = function no(a, b, c) {\n return false;\n};\n/* eslint-enable no-unused-vars */\n\n/**\n * Return the same value.\n */\n\n\nvar identity = function identity(_) {\n return _;\n};\n/**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n */\n\n\nfunction looseEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n var isObjectA = isObject(a);\n var isObjectB = isObject(b);\n\n if (isObjectA && isObjectB) {\n try {\n var isArrayA = Array.isArray(a);\n var isArrayB = Array.isArray(b);\n\n if (isArrayA && isArrayB) {\n return a.length === b.length && a.every(function (e, i) {\n return looseEqual(e, b[i]);\n });\n } else if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n } else if (!isArrayA && !isArrayB) {\n var keysA = Object.keys(a);\n var keysB = Object.keys(b);\n return keysA.length === keysB.length && keysA.every(function (key) {\n return looseEqual(a[key], b[key]);\n });\n } else {\n /* istanbul ignore next */\n return false;\n }\n } catch (e) {\n /* istanbul ignore next */\n return false;\n }\n } else if (!isObjectA && !isObjectB) {\n return String(a) === String(b);\n } else {\n return false;\n }\n}\n/**\n * Return the first index at which a loosely equal value can be\n * found in the array (if value is a plain object, the array must\n * contain an object of the same shape), or -1 if it is not present.\n */\n\n\nfunction looseIndexOf(arr, val) {\n for (var i = 0; i < arr.length; i++) {\n if (looseEqual(arr[i], val)) {\n return i;\n }\n }\n\n return -1;\n}\n/**\n * Ensure a function is called only once.\n */\n\n\nfunction once(fn) {\n var called = false;\n return function () {\n if (!called) {\n called = true;\n fn.apply(this, arguments);\n }\n };\n}\n\nvar SSR_ATTR = 'data-server-rendered';\nvar ASSET_TYPES = ['component', 'directive', 'filter'];\nvar LIFECYCLE_HOOKS = ['beforeCreate', 'created', 'beforeMount', 'mounted', 'beforeUpdate', 'updated', 'beforeDestroy', 'destroyed', 'activated', 'deactivated', 'errorCaptured', 'serverPrefetch'];\n/* */\n\nvar config = {\n /**\n * Option merge strategies (used in core/util/options)\n */\n // $flow-disable-line\n optionMergeStrategies: Object.create(null),\n\n /**\n * Whether to suppress warnings.\n */\n silent: false,\n\n /**\n * Show production mode tip message on boot?\n */\n productionTip: \"production\" !== 'production',\n\n /**\n * Whether to enable devtools\n */\n devtools: \"production\" !== 'production',\n\n /**\n * Whether to record perf\n */\n performance: false,\n\n /**\n * Error handler for watcher errors\n */\n errorHandler: null,\n\n /**\n * Warn handler for watcher warns\n */\n warnHandler: null,\n\n /**\n * Ignore certain custom elements\n */\n ignoredElements: [],\n\n /**\n * Custom user key aliases for v-on\n */\n // $flow-disable-line\n keyCodes: Object.create(null),\n\n /**\n * Check if a tag is reserved so that it cannot be registered as a\n * component. This is platform-dependent and may be overwritten.\n */\n isReservedTag: no,\n\n /**\n * Check if an attribute is reserved so that it cannot be used as a component\n * prop. This is platform-dependent and may be overwritten.\n */\n isReservedAttr: no,\n\n /**\n * Check if a tag is an unknown element.\n * Platform-dependent.\n */\n isUnknownElement: no,\n\n /**\n * Get the namespace of an element\n */\n getTagNamespace: noop,\n\n /**\n * Parse the real tag name for the specific platform.\n */\n parsePlatformTagName: identity,\n\n /**\n * Check if an attribute must be bound using property, e.g. value\n * Platform-dependent.\n */\n mustUseProp: no,\n\n /**\n * Perform updates asynchronously. Intended to be used by Vue Test Utils\n * This will significantly reduce performance if set to false.\n */\n async: true,\n\n /**\n * Exposed for legacy reasons\n */\n _lifecycleHooks: LIFECYCLE_HOOKS\n};\n/* */\n\n/**\n * unicode letters used for parsing html tags, component names and property paths.\n * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname\n * skipping \\u10000-\\uEFFFF due to it freezing up PhantomJS\n */\n\nvar unicodeRegExp = /a-zA-Z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD/;\n/**\n * Check if a string starts with $ or _\n */\n\nfunction isReserved(str) {\n var c = (str + '').charCodeAt(0);\n return c === 0x24 || c === 0x5F;\n}\n/**\n * Define a property.\n */\n\n\nfunction def(obj, key, val, enumerable) {\n Object.defineProperty(obj, key, {\n value: val,\n enumerable: !!enumerable,\n writable: true,\n configurable: true\n });\n}\n/**\n * Parse simple path.\n */\n\n\nvar bailRE = new RegExp(\"[^\" + unicodeRegExp.source + \".$_\\\\d]\");\n\nfunction parsePath(path) {\n if (bailRE.test(path)) {\n return;\n }\n\n var segments = path.split('.');\n return function (obj) {\n for (var i = 0; i < segments.length; i++) {\n if (!obj) {\n return;\n }\n\n obj = obj[segments[i]];\n }\n\n return obj;\n };\n}\n/* */\n// can we use __proto__?\n\n\nvar hasProto = ('__proto__' in {}); // Browser environment sniffing\n\nvar inBrowser = typeof window !== 'undefined';\nvar inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;\nvar weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();\nvar UA = inBrowser && window.navigator.userAgent.toLowerCase();\nvar isIE = UA && /msie|trident/.test(UA);\nvar isIE9 = UA && UA.indexOf('msie 9.0') > 0;\nvar isEdge = UA && UA.indexOf('edge/') > 0;\nvar isAndroid = UA && UA.indexOf('android') > 0 || weexPlatform === 'android';\nvar isIOS = UA && /iphone|ipad|ipod|ios/.test(UA) || weexPlatform === 'ios';\nvar isChrome = UA && /chrome\\/\\d+/.test(UA) && !isEdge;\nvar isPhantomJS = UA && /phantomjs/.test(UA);\nvar isFF = UA && UA.match(/firefox\\/(\\d+)/); // Firefox has a \"watch\" function on Object.prototype...\n\nvar nativeWatch = {}.watch;\nvar supportsPassive = false;\n\nif (inBrowser) {\n try {\n var opts = {};\n Object.defineProperty(opts, 'passive', {\n get: function get() {\n /* istanbul ignore next */\n supportsPassive = true;\n }\n }); // https://github.com/facebook/flow/issues/285\n\n window.addEventListener('test-passive', null, opts);\n } catch (e) {}\n} // this needs to be lazy-evaled because vue may be required before\n// vue-server-renderer can set VUE_ENV\n\n\nvar _isServer;\n\nvar isServerRendering = function isServerRendering() {\n if (_isServer === undefined) {\n /* istanbul ignore if */\n if (!inBrowser && !inWeex && typeof __webpack_require__.g !== 'undefined') {\n // detect presence of vue-server-renderer and avoid\n // Webpack shimming the process\n _isServer = __webpack_require__.g['process'] && __webpack_require__.g['process'].env.VUE_ENV === 'server';\n } else {\n _isServer = false;\n }\n }\n\n return _isServer;\n}; // detect devtools\n\n\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n/* istanbul ignore next */\n\nfunction isNative(Ctor) {\n return typeof Ctor === 'function' && /native code/.test(Ctor.toString());\n}\n\nvar hasSymbol = typeof Symbol !== 'undefined' && isNative(Symbol) && typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);\n\nvar _Set;\n/* istanbul ignore if */\n// $flow-disable-line\n\n\nif (typeof Set !== 'undefined' && isNative(Set)) {\n // use native Set when available.\n _Set = Set;\n} else {\n // a non-standard Set polyfill that only works with primitive keys.\n _Set = /*@__PURE__*/function () {\n function Set() {\n this.set = Object.create(null);\n }\n\n Set.prototype.has = function has(key) {\n return this.set[key] === true;\n };\n\n Set.prototype.add = function add(key) {\n this.set[key] = true;\n };\n\n Set.prototype.clear = function clear() {\n this.set = Object.create(null);\n };\n\n return Set;\n }();\n}\n/* */\n\n\nvar warn = noop;\nvar tip = (/* unused pure expression or super */ null && (noop));\nvar generateComponentTrace = (/* unused pure expression or super */ null && (noop)); // work around flow check\n\nvar formatComponentName = (/* unused pure expression or super */ null && (noop));\n\nif (false) { var repeat, classify, classifyRE, hasConsole; }\n/* */\n\n\nvar uid = 0;\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n */\n\nvar Dep = function Dep() {\n this.id = uid++;\n this.subs = [];\n};\n\nDep.prototype.addSub = function addSub(sub) {\n this.subs.push(sub);\n};\n\nDep.prototype.removeSub = function removeSub(sub) {\n remove(this.subs, sub);\n};\n\nDep.prototype.depend = function depend() {\n if (Dep.target) {\n Dep.target.addDep(this);\n }\n};\n\nDep.prototype.notify = function notify() {\n // stabilize the subscriber list first\n var subs = this.subs.slice();\n\n if (false) {}\n\n for (var i = 0, l = subs.length; i < l; i++) {\n subs[i].update();\n }\n}; // The current target watcher being evaluated.\n// This is globally unique because only one watcher\n// can be evaluated at a time.\n\n\nDep.target = null;\nvar targetStack = [];\n\nfunction pushTarget(target) {\n targetStack.push(target);\n Dep.target = target;\n}\n\nfunction popTarget() {\n targetStack.pop();\n Dep.target = targetStack[targetStack.length - 1];\n}\n/* */\n\n\nvar VNode = function VNode(tag, data, children, text, elm, context, componentOptions, asyncFactory) {\n this.tag = tag;\n this.data = data;\n this.children = children;\n this.text = text;\n this.elm = elm;\n this.ns = undefined;\n this.context = context;\n this.fnContext = undefined;\n this.fnOptions = undefined;\n this.fnScopeId = undefined;\n this.key = data && data.key;\n this.componentOptions = componentOptions;\n this.componentInstance = undefined;\n this.parent = undefined;\n this.raw = false;\n this.isStatic = false;\n this.isRootInsert = true;\n this.isComment = false;\n this.isCloned = false;\n this.isOnce = false;\n this.asyncFactory = asyncFactory;\n this.asyncMeta = undefined;\n this.isAsyncPlaceholder = false;\n};\n\nvar prototypeAccessors = {\n child: {\n configurable: true\n }\n}; // DEPRECATED: alias for componentInstance for backwards compat.\n\n/* istanbul ignore next */\n\nprototypeAccessors.child.get = function () {\n return this.componentInstance;\n};\n\nObject.defineProperties(VNode.prototype, prototypeAccessors);\n\nvar createEmptyVNode = function createEmptyVNode(text) {\n if (text === void 0) text = '';\n var node = new VNode();\n node.text = text;\n node.isComment = true;\n return node;\n};\n\nfunction createTextVNode(val) {\n return new VNode(undefined, undefined, undefined, String(val));\n} // optimized shallow clone\n// used for static nodes and slot nodes because they may be reused across\n// multiple renders, cloning them avoids errors when DOM manipulations rely\n// on their elm reference.\n\n\nfunction cloneVNode(vnode) {\n var cloned = new VNode(vnode.tag, vnode.data, // #7975\n // clone children array to avoid mutating original in case of cloning\n // a child.\n vnode.children && vnode.children.slice(), vnode.text, vnode.elm, vnode.context, vnode.componentOptions, vnode.asyncFactory);\n cloned.ns = vnode.ns;\n cloned.isStatic = vnode.isStatic;\n cloned.key = vnode.key;\n cloned.isComment = vnode.isComment;\n cloned.fnContext = vnode.fnContext;\n cloned.fnOptions = vnode.fnOptions;\n cloned.fnScopeId = vnode.fnScopeId;\n cloned.asyncMeta = vnode.asyncMeta;\n cloned.isCloned = true;\n return cloned;\n}\n/*\n * not type checking this file because flow doesn't play well with\n * dynamically accessing methods on Array prototype\n */\n\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto);\nvar methodsToPatch = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];\n/**\n * Intercept mutating methods and emit events\n */\n\nmethodsToPatch.forEach(function (method) {\n // cache original method\n var original = arrayProto[method];\n def(arrayMethods, method, function mutator() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var result = original.apply(this, args);\n var ob = this.__ob__;\n var inserted;\n\n switch (method) {\n case 'push':\n case 'unshift':\n inserted = args;\n break;\n\n case 'splice':\n inserted = args.slice(2);\n break;\n }\n\n if (inserted) {\n ob.observeArray(inserted);\n } // notify change\n\n\n ob.dep.notify();\n return result;\n });\n});\n/* */\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n/**\n * In some cases we may want to disable observation inside a component's\n * update computation.\n */\n\nvar shouldObserve = true;\n\nfunction toggleObserving(value) {\n shouldObserve = value;\n}\n/**\n * Observer class that is attached to each observed\n * object. Once attached, the observer converts the target\n * object's property keys into getter/setters that\n * collect dependencies and dispatch updates.\n */\n\n\nvar Observer = function Observer(value) {\n this.value = value;\n this.dep = new Dep();\n this.vmCount = 0;\n def(value, '__ob__', this);\n\n if (Array.isArray(value)) {\n if (hasProto) {\n protoAugment(value, arrayMethods);\n } else {\n copyAugment(value, arrayMethods, arrayKeys);\n }\n\n this.observeArray(value);\n } else {\n this.walk(value);\n }\n};\n/**\n * Walk through all properties and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n */\n\n\nObserver.prototype.walk = function walk(obj) {\n var keys = Object.keys(obj);\n\n for (var i = 0; i < keys.length; i++) {\n defineReactive$$1(obj, keys[i]);\n }\n};\n/**\n * Observe a list of Array items.\n */\n\n\nObserver.prototype.observeArray = function observeArray(items) {\n for (var i = 0, l = items.length; i < l; i++) {\n observe(items[i]);\n }\n}; // helpers\n\n/**\n * Augment a target Object or Array by intercepting\n * the prototype chain using __proto__\n */\n\n\nfunction protoAugment(target, src) {\n /* eslint-disable no-proto */\n target.__proto__ = src;\n /* eslint-enable no-proto */\n}\n/**\n * Augment a target Object or Array by defining\n * hidden properties.\n */\n\n/* istanbul ignore next */\n\n\nfunction copyAugment(target, src, keys) {\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n def(target, key, src[key]);\n }\n}\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n */\n\n\nfunction observe(value, asRootData) {\n if (!isObject(value) || value instanceof VNode) {\n return;\n }\n\n var ob;\n\n if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n ob = value.__ob__;\n } else if (shouldObserve && !isServerRendering() && (Array.isArray(value) || isPlainObject(value)) && Object.isExtensible(value) && !value._isVue) {\n ob = new Observer(value);\n }\n\n if (asRootData && ob) {\n ob.vmCount++;\n }\n\n return ob;\n}\n/**\n * Define a reactive property on an Object.\n */\n\n\nfunction defineReactive$$1(obj, key, val, customSetter, shallow) {\n var dep = new Dep();\n var property = Object.getOwnPropertyDescriptor(obj, key);\n\n if (property && property.configurable === false) {\n return;\n } // cater for pre-defined getter/setters\n\n\n var getter = property && property.get;\n var setter = property && property.set;\n\n if ((!getter || setter) && arguments.length === 2) {\n val = obj[key];\n }\n\n var childOb = !shallow && observe(val);\n Object.defineProperty(obj, key, {\n enumerable: true,\n configurable: true,\n get: function reactiveGetter() {\n var value = getter ? getter.call(obj) : val;\n\n if (Dep.target) {\n dep.depend();\n\n if (childOb) {\n childOb.dep.depend();\n\n if (Array.isArray(value)) {\n dependArray(value);\n }\n }\n }\n\n return value;\n },\n set: function reactiveSetter(newVal) {\n var value = getter ? getter.call(obj) : val;\n /* eslint-disable no-self-compare */\n\n if (newVal === value || newVal !== newVal && value !== value) {\n return;\n }\n /* eslint-enable no-self-compare */\n\n\n if (false) {} // #7981: for accessor properties without setter\n\n\n if (getter && !setter) {\n return;\n }\n\n if (setter) {\n setter.call(obj, newVal);\n } else {\n val = newVal;\n }\n\n childOb = !shallow && observe(newVal);\n dep.notify();\n }\n });\n}\n/**\n * Set a property on an object. Adds the new property and\n * triggers change notification if the property doesn't\n * already exist.\n */\n\n\nfunction set(target, key, val) {\n if (false) {}\n\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.length = Math.max(target.length, key);\n target.splice(key, 1, val);\n return val;\n }\n\n if (key in target && !(key in Object.prototype)) {\n target[key] = val;\n return val;\n }\n\n var ob = target.__ob__;\n\n if (target._isVue || ob && ob.vmCount) {\n false && 0;\n return val;\n }\n\n if (!ob) {\n target[key] = val;\n return val;\n }\n\n defineReactive$$1(ob.value, key, val);\n ob.dep.notify();\n return val;\n}\n/**\n * Delete a property and trigger change if necessary.\n */\n\n\nfunction del(target, key) {\n if (false) {}\n\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.splice(key, 1);\n return;\n }\n\n var ob = target.__ob__;\n\n if (target._isVue || ob && ob.vmCount) {\n false && 0;\n return;\n }\n\n if (!hasOwn(target, key)) {\n return;\n }\n\n delete target[key];\n\n if (!ob) {\n return;\n }\n\n ob.dep.notify();\n}\n/**\n * Collect dependencies on array elements when the array is touched, since\n * we cannot intercept array element access like property getters.\n */\n\n\nfunction dependArray(value) {\n for (var e = void 0, i = 0, l = value.length; i < l; i++) {\n e = value[i];\n e && e.__ob__ && e.__ob__.dep.depend();\n\n if (Array.isArray(e)) {\n dependArray(e);\n }\n }\n}\n/* */\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n */\n\n\nvar strats = config.optionMergeStrategies;\n/**\n * Options with restrictions\n */\n\nif (false) {}\n/**\n * Helper that recursively merges two data objects together.\n */\n\n\nfunction mergeData(to, from) {\n if (!from) {\n return to;\n }\n\n var key, toVal, fromVal;\n var keys = hasSymbol ? Reflect.ownKeys(from) : Object.keys(from);\n\n for (var i = 0; i < keys.length; i++) {\n key = keys[i]; // in case the object is already observed...\n\n if (key === '__ob__') {\n continue;\n }\n\n toVal = to[key];\n fromVal = from[key];\n\n if (!hasOwn(to, key)) {\n set(to, key, fromVal);\n } else if (toVal !== fromVal && isPlainObject(toVal) && isPlainObject(fromVal)) {\n mergeData(toVal, fromVal);\n }\n }\n\n return to;\n}\n/**\n * Data\n */\n\n\nfunction mergeDataOrFn(parentVal, childVal, vm) {\n if (!vm) {\n // in a Vue.extend merge, both should be functions\n if (!childVal) {\n return parentVal;\n }\n\n if (!parentVal) {\n return childVal;\n } // when parentVal & childVal are both present,\n // we need to return a function that returns the\n // merged result of both functions... no need to\n // check if parentVal is a function here because\n // it has to be a function to pass previous merges.\n\n\n return function mergedDataFn() {\n return mergeData(typeof childVal === 'function' ? childVal.call(this, this) : childVal, typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal);\n };\n } else {\n return function mergedInstanceDataFn() {\n // instance merge\n var instanceData = typeof childVal === 'function' ? childVal.call(vm, vm) : childVal;\n var defaultData = typeof parentVal === 'function' ? parentVal.call(vm, vm) : parentVal;\n\n if (instanceData) {\n return mergeData(instanceData, defaultData);\n } else {\n return defaultData;\n }\n };\n }\n}\n\nstrats.data = function (parentVal, childVal, vm) {\n if (!vm) {\n if (childVal && typeof childVal !== 'function') {\n false && 0;\n return parentVal;\n }\n\n return mergeDataOrFn(parentVal, childVal);\n }\n\n return mergeDataOrFn(parentVal, childVal, vm);\n};\n/**\n * Hooks and props are merged as arrays.\n */\n\n\nfunction mergeHook(parentVal, childVal) {\n var res = childVal ? parentVal ? parentVal.concat(childVal) : Array.isArray(childVal) ? childVal : [childVal] : parentVal;\n return res ? dedupeHooks(res) : res;\n}\n\nfunction dedupeHooks(hooks) {\n var res = [];\n\n for (var i = 0; i < hooks.length; i++) {\n if (res.indexOf(hooks[i]) === -1) {\n res.push(hooks[i]);\n }\n }\n\n return res;\n}\n\nLIFECYCLE_HOOKS.forEach(function (hook) {\n strats[hook] = mergeHook;\n});\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\n\nfunction mergeAssets(parentVal, childVal, vm, key) {\n var res = Object.create(parentVal || null);\n\n if (childVal) {\n false && 0;\n return extend(res, childVal);\n } else {\n return res;\n }\n}\n\nASSET_TYPES.forEach(function (type) {\n strats[type + 's'] = mergeAssets;\n});\n/**\n * Watchers.\n *\n * Watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\n\nstrats.watch = function (parentVal, childVal, vm, key) {\n // work around Firefox's Object.prototype.watch...\n if (parentVal === nativeWatch) {\n parentVal = undefined;\n }\n\n if (childVal === nativeWatch) {\n childVal = undefined;\n }\n /* istanbul ignore if */\n\n\n if (!childVal) {\n return Object.create(parentVal || null);\n }\n\n if (false) {}\n\n if (!parentVal) {\n return childVal;\n }\n\n var ret = {};\n extend(ret, parentVal);\n\n for (var key$1 in childVal) {\n var parent = ret[key$1];\n var child = childVal[key$1];\n\n if (parent && !Array.isArray(parent)) {\n parent = [parent];\n }\n\n ret[key$1] = parent ? parent.concat(child) : Array.isArray(child) ? child : [child];\n }\n\n return ret;\n};\n/**\n * Other object hashes.\n */\n\n\nstrats.props = strats.methods = strats.inject = strats.computed = function (parentVal, childVal, vm, key) {\n if (childVal && \"production\" !== 'production') {\n assertObjectType(key, childVal, vm);\n }\n\n if (!parentVal) {\n return childVal;\n }\n\n var ret = Object.create(null);\n extend(ret, parentVal);\n\n if (childVal) {\n extend(ret, childVal);\n }\n\n return ret;\n};\n\nstrats.provide = mergeDataOrFn;\n/**\n * Default strategy.\n */\n\nvar defaultStrat = function defaultStrat(parentVal, childVal) {\n return childVal === undefined ? parentVal : childVal;\n};\n/**\n * Validate component names\n */\n\n\nfunction checkComponents(options) {\n for (var key in options.components) {\n validateComponentName(key);\n }\n}\n\nfunction validateComponentName(name) {\n if (!new RegExp(\"^[a-zA-Z][\\\\-\\\\.0-9_\" + unicodeRegExp.source + \"]*$\").test(name)) {\n warn('Invalid component name: \"' + name + '\". Component names ' + 'should conform to valid custom element name in html5 specification.');\n }\n\n if (isBuiltInTag(name) || config.isReservedTag(name)) {\n warn('Do not use built-in or reserved HTML elements as component ' + 'id: ' + name);\n }\n}\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n */\n\n\nfunction normalizeProps(options, vm) {\n var props = options.props;\n\n if (!props) {\n return;\n }\n\n var res = {};\n var i, val, name;\n\n if (Array.isArray(props)) {\n i = props.length;\n\n while (i--) {\n val = props[i];\n\n if (typeof val === 'string') {\n name = camelize(val);\n res[name] = {\n type: null\n };\n } else if (false) {}\n }\n } else if (isPlainObject(props)) {\n for (var key in props) {\n val = props[key];\n name = camelize(key);\n res[name] = isPlainObject(val) ? val : {\n type: val\n };\n }\n } else if (false) {}\n\n options.props = res;\n}\n/**\n * Normalize all injections into Object-based format\n */\n\n\nfunction normalizeInject(options, vm) {\n var inject = options.inject;\n\n if (!inject) {\n return;\n }\n\n var normalized = options.inject = {};\n\n if (Array.isArray(inject)) {\n for (var i = 0; i < inject.length; i++) {\n normalized[inject[i]] = {\n from: inject[i]\n };\n }\n } else if (isPlainObject(inject)) {\n for (var key in inject) {\n var val = inject[key];\n normalized[key] = isPlainObject(val) ? extend({\n from: key\n }, val) : {\n from: val\n };\n }\n } else if (false) {}\n}\n/**\n * Normalize raw function directives into object format.\n */\n\n\nfunction normalizeDirectives(options) {\n var dirs = options.directives;\n\n if (dirs) {\n for (var key in dirs) {\n var def$$1 = dirs[key];\n\n if (typeof def$$1 === 'function') {\n dirs[key] = {\n bind: def$$1,\n update: def$$1\n };\n }\n }\n }\n}\n\nfunction assertObjectType(name, value, vm) {\n if (!isPlainObject(value)) {\n warn(\"Invalid value for option \\\"\" + name + \"\\\": expected an Object, \" + \"but got \" + toRawType(value) + \".\", vm);\n }\n}\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n */\n\n\nfunction mergeOptions(parent, child, vm) {\n if (false) {}\n\n if (typeof child === 'function') {\n child = child.options;\n }\n\n normalizeProps(child, vm);\n normalizeInject(child, vm);\n normalizeDirectives(child); // Apply extends and mixins on the child options,\n // but only if it is a raw options object that isn't\n // the result of another mergeOptions call.\n // Only merged options has the _base property.\n\n if (!child._base) {\n if (child.extends) {\n parent = mergeOptions(parent, child.extends, vm);\n }\n\n if (child.mixins) {\n for (var i = 0, l = child.mixins.length; i < l; i++) {\n parent = mergeOptions(parent, child.mixins[i], vm);\n }\n }\n }\n\n var options = {};\n var key;\n\n for (key in parent) {\n mergeField(key);\n }\n\n for (key in child) {\n if (!hasOwn(parent, key)) {\n mergeField(key);\n }\n }\n\n function mergeField(key) {\n var strat = strats[key] || defaultStrat;\n options[key] = strat(parent[key], child[key], vm, key);\n }\n\n return options;\n}\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n */\n\n\nfunction resolveAsset(options, type, id, warnMissing) {\n /* istanbul ignore if */\n if (typeof id !== 'string') {\n return;\n }\n\n var assets = options[type]; // check local registration variations first\n\n if (hasOwn(assets, id)) {\n return assets[id];\n }\n\n var camelizedId = camelize(id);\n\n if (hasOwn(assets, camelizedId)) {\n return assets[camelizedId];\n }\n\n var PascalCaseId = capitalize(camelizedId);\n\n if (hasOwn(assets, PascalCaseId)) {\n return assets[PascalCaseId];\n } // fallback to prototype chain\n\n\n var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n\n if (false) {}\n\n return res;\n}\n/* */\n\n\nfunction validateProp(key, propOptions, propsData, vm) {\n var prop = propOptions[key];\n var absent = !hasOwn(propsData, key);\n var value = propsData[key]; // boolean casting\n\n var booleanIndex = getTypeIndex(Boolean, prop.type);\n\n if (booleanIndex > -1) {\n if (absent && !hasOwn(prop, 'default')) {\n value = false;\n } else if (value === '' || value === hyphenate(key)) {\n // only cast empty string / same name to boolean if\n // boolean has higher priority\n var stringIndex = getTypeIndex(String, prop.type);\n\n if (stringIndex < 0 || booleanIndex < stringIndex) {\n value = true;\n }\n }\n } // check default value\n\n\n if (value === undefined) {\n value = getPropDefaultValue(vm, prop, key); // since the default value is a fresh copy,\n // make sure to observe it.\n\n var prevShouldObserve = shouldObserve;\n toggleObserving(true);\n observe(value);\n toggleObserving(prevShouldObserve);\n }\n\n if (false) {}\n\n return value;\n}\n/**\n * Get the default value of a prop.\n */\n\n\nfunction getPropDefaultValue(vm, prop, key) {\n // no default, return undefined\n if (!hasOwn(prop, 'default')) {\n return undefined;\n }\n\n var def = prop.default; // warn against non-factory defaults for Object & Array\n\n if (false) {} // the raw prop value was also undefined from previous render,\n // return previous default value to avoid unnecessary watcher trigger\n\n\n if (vm && vm.$options.propsData && vm.$options.propsData[key] === undefined && vm._props[key] !== undefined) {\n return vm._props[key];\n } // call factory function for non-Function types\n // a value is Function if its prototype is function even across different execution context\n\n\n return typeof def === 'function' && getType(prop.type) !== 'Function' ? def.call(vm) : def;\n}\n/**\n * Assert whether a prop is valid.\n */\n\n\nfunction assertProp(prop, name, value, vm, absent) {\n if (prop.required && absent) {\n warn('Missing required prop: \"' + name + '\"', vm);\n return;\n }\n\n if (value == null && !prop.required) {\n return;\n }\n\n var type = prop.type;\n var valid = !type || type === true;\n var expectedTypes = [];\n\n if (type) {\n if (!Array.isArray(type)) {\n type = [type];\n }\n\n for (var i = 0; i < type.length && !valid; i++) {\n var assertedType = assertType(value, type[i]);\n expectedTypes.push(assertedType.expectedType || '');\n valid = assertedType.valid;\n }\n }\n\n if (!valid) {\n warn(getInvalidTypeMessage(name, value, expectedTypes), vm);\n return;\n }\n\n var validator = prop.validator;\n\n if (validator) {\n if (!validator(value)) {\n warn('Invalid prop: custom validator check failed for prop \"' + name + '\".', vm);\n }\n }\n}\n\nvar simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;\n\nfunction assertType(value, type) {\n var valid;\n var expectedType = getType(type);\n\n if (simpleCheckRE.test(expectedType)) {\n var t = _typeof(value);\n\n valid = t === expectedType.toLowerCase(); // for primitive wrapper objects\n\n if (!valid && t === 'object') {\n valid = value instanceof type;\n }\n } else if (expectedType === 'Object') {\n valid = isPlainObject(value);\n } else if (expectedType === 'Array') {\n valid = Array.isArray(value);\n } else {\n valid = value instanceof type;\n }\n\n return {\n valid: valid,\n expectedType: expectedType\n };\n}\n/**\n * Use function string name to check built-in types,\n * because a simple equality check will fail when running\n * across different vms / iframes.\n */\n\n\nfunction getType(fn) {\n var match = fn && fn.toString().match(/^\\s*function (\\w+)/);\n return match ? match[1] : '';\n}\n\nfunction isSameType(a, b) {\n return getType(a) === getType(b);\n}\n\nfunction getTypeIndex(type, expectedTypes) {\n if (!Array.isArray(expectedTypes)) {\n return isSameType(expectedTypes, type) ? 0 : -1;\n }\n\n for (var i = 0, len = expectedTypes.length; i < len; i++) {\n if (isSameType(expectedTypes[i], type)) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction getInvalidTypeMessage(name, value, expectedTypes) {\n var message = \"Invalid prop: type check failed for prop \\\"\" + name + \"\\\".\" + \" Expected \" + expectedTypes.map(capitalize).join(', ');\n var expectedType = expectedTypes[0];\n var receivedType = toRawType(value);\n var expectedValue = styleValue(value, expectedType);\n var receivedValue = styleValue(value, receivedType); // check if we need to specify expected value\n\n if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {\n message += \" with value \" + expectedValue;\n }\n\n message += \", got \" + receivedType + \" \"; // check if we need to specify received value\n\n if (isExplicable(receivedType)) {\n message += \"with value \" + receivedValue + \".\";\n }\n\n return message;\n}\n\nfunction styleValue(value, type) {\n if (type === 'String') {\n return \"\\\"\" + value + \"\\\"\";\n } else if (type === 'Number') {\n return \"\" + Number(value);\n } else {\n return \"\" + value;\n }\n}\n\nfunction isExplicable(value) {\n var explicitTypes = ['string', 'number', 'boolean'];\n return explicitTypes.some(function (elem) {\n return value.toLowerCase() === elem;\n });\n}\n\nfunction isBoolean() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return args.some(function (elem) {\n return elem.toLowerCase() === 'boolean';\n });\n}\n/* */\n\n\nfunction handleError(err, vm, info) {\n // Deactivate deps tracking while processing error handler to avoid possible infinite rendering.\n // See: https://github.com/vuejs/vuex/issues/1505\n pushTarget();\n\n try {\n if (vm) {\n var cur = vm;\n\n while (cur = cur.$parent) {\n var hooks = cur.$options.errorCaptured;\n\n if (hooks) {\n for (var i = 0; i < hooks.length; i++) {\n try {\n var capture = hooks[i].call(cur, err, vm, info) === false;\n\n if (capture) {\n return;\n }\n } catch (e) {\n globalHandleError(e, cur, 'errorCaptured hook');\n }\n }\n }\n }\n }\n\n globalHandleError(err, vm, info);\n } finally {\n popTarget();\n }\n}\n\nfunction invokeWithErrorHandling(handler, context, args, vm, info) {\n var res;\n\n try {\n res = args ? handler.apply(context, args) : handler.call(context);\n\n if (res && !res._isVue && isPromise(res) && !res._handled) {\n res.catch(function (e) {\n return handleError(e, vm, info + \" (Promise/async)\");\n }); // issue #9511\n // avoid catch triggering multiple times when nested calls\n\n res._handled = true;\n }\n } catch (e) {\n handleError(e, vm, info);\n }\n\n return res;\n}\n\nfunction globalHandleError(err, vm, info) {\n if (config.errorHandler) {\n try {\n return config.errorHandler.call(null, err, vm, info);\n } catch (e) {\n // if the user intentionally throws the original error in the handler,\n // do not log it twice\n if (e !== err) {\n logError(e, null, 'config.errorHandler');\n }\n }\n }\n\n logError(err, vm, info);\n}\n\nfunction logError(err, vm, info) {\n if (false) {}\n /* istanbul ignore else */\n\n\n if ((inBrowser || inWeex) && typeof console !== 'undefined') {\n console.error(err);\n } else {\n throw err;\n }\n}\n/* */\n\n\nvar isUsingMicroTask = false;\nvar callbacks = [];\nvar pending = false;\n\nfunction flushCallbacks() {\n pending = false;\n var copies = callbacks.slice(0);\n callbacks.length = 0;\n\n for (var i = 0; i < copies.length; i++) {\n copies[i]();\n }\n} // Here we have async deferring wrappers using microtasks.\n// In 2.5 we used (macro) tasks (in combination with microtasks).\n// However, it has subtle problems when state is changed right before repaint\n// (e.g. #6813, out-in transitions).\n// Also, using (macro) tasks in event handler would cause some weird behaviors\n// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).\n// So we now use microtasks everywhere, again.\n// A major drawback of this tradeoff is that there are some scenarios\n// where microtasks have too high a priority and fire in between supposedly\n// sequential events (e.g. #4521, #6690, which have workarounds)\n// or even between bubbling of the same event (#6566).\n\n\nvar timerFunc; // The nextTick behavior leverages the microtask queue, which can be accessed\n// via either native Promise.then or MutationObserver.\n// MutationObserver has wider support, however it is seriously bugged in\n// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It\n// completely stops working after triggering a few times... so, if native\n// Promise is available, we will use it:\n\n/* istanbul ignore next, $flow-disable-line */\n\nif (typeof Promise !== 'undefined' && isNative(Promise)) {\n var p = Promise.resolve();\n\n timerFunc = function timerFunc() {\n p.then(flushCallbacks); // In problematic UIWebViews, Promise.then doesn't completely break, but\n // it can get stuck in a weird state where callbacks are pushed into the\n // microtask queue but the queue isn't being flushed, until the browser\n // needs to do some other work, e.g. handle a timer. Therefore we can\n // \"force\" the microtask queue to be flushed by adding an empty timer.\n\n if (isIOS) {\n setTimeout(noop);\n }\n };\n\n isUsingMicroTask = true;\n} else if (!isIE && typeof MutationObserver !== 'undefined' && (isNative(MutationObserver) || // PhantomJS and iOS 7.x\nMutationObserver.toString() === '[object MutationObserverConstructor]')) {\n // Use MutationObserver where native Promise is not available,\n // e.g. PhantomJS, iOS7, Android 4.4\n // (#6466 MutationObserver is unreliable in IE11)\n var counter = 1;\n var observer = new MutationObserver(flushCallbacks);\n var textNode = document.createTextNode(String(counter));\n observer.observe(textNode, {\n characterData: true\n });\n\n timerFunc = function timerFunc() {\n counter = (counter + 1) % 2;\n textNode.data = String(counter);\n };\n\n isUsingMicroTask = true;\n} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {\n // Fallback to setImmediate.\n // Technically it leverages the (macro) task queue,\n // but it is still a better choice than setTimeout.\n timerFunc = function timerFunc() {\n setImmediate(flushCallbacks);\n };\n} else {\n // Fallback to setTimeout.\n timerFunc = function timerFunc() {\n setTimeout(flushCallbacks, 0);\n };\n}\n\nfunction nextTick(cb, ctx) {\n var _resolve;\n\n callbacks.push(function () {\n if (cb) {\n try {\n cb.call(ctx);\n } catch (e) {\n handleError(e, ctx, 'nextTick');\n }\n } else if (_resolve) {\n _resolve(ctx);\n }\n });\n\n if (!pending) {\n pending = true;\n timerFunc();\n } // $flow-disable-line\n\n\n if (!cb && typeof Promise !== 'undefined') {\n return new Promise(function (resolve) {\n _resolve = resolve;\n });\n }\n}\n/* */\n\n/* not type checking this file because flow doesn't play well with Proxy */\n\n\nvar initProxy;\n\nif (false) { var getHandler, hasHandler, isBuiltInModifier, hasProxy, warnReservedPrefix, warnNonPresent, allowedGlobals; }\n/* */\n\n\nvar seenObjects = new _Set();\n/**\n * Recursively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n */\n\nfunction traverse(val) {\n _traverse(val, seenObjects);\n\n seenObjects.clear();\n}\n\nfunction _traverse(val, seen) {\n var i, keys;\n var isA = Array.isArray(val);\n\n if (!isA && !isObject(val) || Object.isFrozen(val) || val instanceof VNode) {\n return;\n }\n\n if (val.__ob__) {\n var depId = val.__ob__.dep.id;\n\n if (seen.has(depId)) {\n return;\n }\n\n seen.add(depId);\n }\n\n if (isA) {\n i = val.length;\n\n while (i--) {\n _traverse(val[i], seen);\n }\n } else {\n keys = Object.keys(val);\n i = keys.length;\n\n while (i--) {\n _traverse(val[keys[i]], seen);\n }\n }\n}\n\nvar mark;\nvar measure;\n\nif (false) { var perf; }\n/* */\n\n\nvar normalizeEvent = cached(function (name) {\n var passive = name.charAt(0) === '&';\n name = passive ? name.slice(1) : name;\n var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n\n name = once$$1 ? name.slice(1) : name;\n var capture = name.charAt(0) === '!';\n name = capture ? name.slice(1) : name;\n return {\n name: name,\n once: once$$1,\n capture: capture,\n passive: passive\n };\n});\n\nfunction createFnInvoker(fns, vm) {\n function invoker() {\n var arguments$1 = arguments;\n var fns = invoker.fns;\n\n if (Array.isArray(fns)) {\n var cloned = fns.slice();\n\n for (var i = 0; i < cloned.length; i++) {\n invokeWithErrorHandling(cloned[i], null, arguments$1, vm, \"v-on handler\");\n }\n } else {\n // return handler return value for single handlers\n return invokeWithErrorHandling(fns, null, arguments, vm, \"v-on handler\");\n }\n }\n\n invoker.fns = fns;\n return invoker;\n}\n\nfunction updateListeners(on, oldOn, add, remove$$1, createOnceHandler, vm) {\n var name, def$$1, cur, old, event;\n\n for (name in on) {\n def$$1 = cur = on[name];\n old = oldOn[name];\n event = normalizeEvent(name);\n\n if (isUndef(cur)) {\n false && 0;\n } else if (isUndef(old)) {\n if (isUndef(cur.fns)) {\n cur = on[name] = createFnInvoker(cur, vm);\n }\n\n if (isTrue(event.once)) {\n cur = on[name] = createOnceHandler(event.name, cur, event.capture);\n }\n\n add(event.name, cur, event.capture, event.passive, event.params);\n } else if (cur !== old) {\n old.fns = cur;\n on[name] = old;\n }\n }\n\n for (name in oldOn) {\n if (isUndef(on[name])) {\n event = normalizeEvent(name);\n remove$$1(event.name, oldOn[name], event.capture);\n }\n }\n}\n/* */\n\n\nfunction mergeVNodeHook(def, hookKey, hook) {\n if (def instanceof VNode) {\n def = def.data.hook || (def.data.hook = {});\n }\n\n var invoker;\n var oldHook = def[hookKey];\n\n function wrappedHook() {\n hook.apply(this, arguments); // important: remove merged hook to ensure it's called only once\n // and prevent memory leak\n\n remove(invoker.fns, wrappedHook);\n }\n\n if (isUndef(oldHook)) {\n // no existing hook\n invoker = createFnInvoker([wrappedHook]);\n } else {\n /* istanbul ignore if */\n if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {\n // already a merged invoker\n invoker = oldHook;\n invoker.fns.push(wrappedHook);\n } else {\n // existing plain hook\n invoker = createFnInvoker([oldHook, wrappedHook]);\n }\n }\n\n invoker.merged = true;\n def[hookKey] = invoker;\n}\n/* */\n\n\nfunction extractPropsFromVNodeData(data, Ctor, tag) {\n // we are only extracting raw values here.\n // validation and default values are handled in the child\n // component itself.\n var propOptions = Ctor.options.props;\n\n if (isUndef(propOptions)) {\n return;\n }\n\n var res = {};\n var attrs = data.attrs;\n var props = data.props;\n\n if (isDef(attrs) || isDef(props)) {\n for (var key in propOptions) {\n var altKey = hyphenate(key);\n\n if (false) { var keyInLowerCase; }\n\n checkProp(res, props, key, altKey, true) || checkProp(res, attrs, key, altKey, false);\n }\n }\n\n return res;\n}\n\nfunction checkProp(res, hash, key, altKey, preserve) {\n if (isDef(hash)) {\n if (hasOwn(hash, key)) {\n res[key] = hash[key];\n\n if (!preserve) {\n delete hash[key];\n }\n\n return true;\n } else if (hasOwn(hash, altKey)) {\n res[key] = hash[altKey];\n\n if (!preserve) {\n delete hash[altKey];\n }\n\n return true;\n }\n }\n\n return false;\n}\n/* */\n// The template compiler attempts to minimize the need for normalization by\n// statically analyzing the template at compile time.\n//\n// For plain HTML markup, normalization can be completely skipped because the\n// generated render function is guaranteed to return Array<VNode>. There are\n// two cases where extra normalization is needed:\n// 1. When the children contains components - because a functional component\n// may return an Array instead of a single root. In this case, just a simple\n// normalization is needed - if any child is an Array, we flatten the whole\n// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n// because functional components already normalize their own children.\n\n\nfunction simpleNormalizeChildren(children) {\n for (var i = 0; i < children.length; i++) {\n if (Array.isArray(children[i])) {\n return Array.prototype.concat.apply([], children);\n }\n }\n\n return children;\n} // 2. When the children contains constructs that always generated nested Arrays,\n// e.g. <template>, <slot>, v-for, or when the children is provided by user\n// with hand-written render functions / JSX. In such cases a full normalization\n// is needed to cater to all possible types of children values.\n\n\nfunction normalizeChildren(children) {\n return isPrimitive(children) ? [createTextVNode(children)] : Array.isArray(children) ? normalizeArrayChildren(children) : undefined;\n}\n\nfunction isTextNode(node) {\n return isDef(node) && isDef(node.text) && isFalse(node.isComment);\n}\n\nfunction normalizeArrayChildren(children, nestedIndex) {\n var res = [];\n var i, c, lastIndex, last;\n\n for (i = 0; i < children.length; i++) {\n c = children[i];\n\n if (isUndef(c) || typeof c === 'boolean') {\n continue;\n }\n\n lastIndex = res.length - 1;\n last = res[lastIndex]; // nested\n\n if (Array.isArray(c)) {\n if (c.length > 0) {\n c = normalizeArrayChildren(c, (nestedIndex || '') + \"_\" + i); // merge adjacent text nodes\n\n if (isTextNode(c[0]) && isTextNode(last)) {\n res[lastIndex] = createTextVNode(last.text + c[0].text);\n c.shift();\n }\n\n res.push.apply(res, c);\n }\n } else if (isPrimitive(c)) {\n if (isTextNode(last)) {\n // merge adjacent text nodes\n // this is necessary for SSR hydration because text nodes are\n // essentially merged when rendered to HTML strings\n res[lastIndex] = createTextVNode(last.text + c);\n } else if (c !== '') {\n // convert primitive to vnode\n res.push(createTextVNode(c));\n }\n } else {\n if (isTextNode(c) && isTextNode(last)) {\n // merge adjacent text nodes\n res[lastIndex] = createTextVNode(last.text + c.text);\n } else {\n // default key for nested array children (likely generated by v-for)\n if (isTrue(children._isVList) && isDef(c.tag) && isUndef(c.key) && isDef(nestedIndex)) {\n c.key = \"__vlist\" + nestedIndex + \"_\" + i + \"__\";\n }\n\n res.push(c);\n }\n }\n }\n\n return res;\n}\n/* */\n\n\nfunction initProvide(vm) {\n var provide = vm.$options.provide;\n\n if (provide) {\n vm._provided = typeof provide === 'function' ? provide.call(vm) : provide;\n }\n}\n\nfunction initInjections(vm) {\n var result = resolveInject(vm.$options.inject, vm);\n\n if (result) {\n toggleObserving(false);\n Object.keys(result).forEach(function (key) {\n /* istanbul ignore else */\n if (false) {} else {\n defineReactive$$1(vm, key, result[key]);\n }\n });\n toggleObserving(true);\n }\n}\n\nfunction resolveInject(inject, vm) {\n if (inject) {\n // inject is :any because flow is not smart enough to figure out cached\n var result = Object.create(null);\n var keys = hasSymbol ? Reflect.ownKeys(inject) : Object.keys(inject);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i]; // #6574 in case the inject object is observed...\n\n if (key === '__ob__') {\n continue;\n }\n\n var provideKey = inject[key].from;\n var source = vm;\n\n while (source) {\n if (source._provided && hasOwn(source._provided, provideKey)) {\n result[key] = source._provided[provideKey];\n break;\n }\n\n source = source.$parent;\n }\n\n if (!source) {\n if ('default' in inject[key]) {\n var provideDefault = inject[key].default;\n result[key] = typeof provideDefault === 'function' ? provideDefault.call(vm) : provideDefault;\n } else if (false) {}\n }\n }\n\n return result;\n }\n}\n/* */\n\n/**\n * Runtime helper for resolving raw children VNodes into a slot object.\n */\n\n\nfunction resolveSlots(children, context) {\n if (!children || !children.length) {\n return {};\n }\n\n var slots = {};\n\n for (var i = 0, l = children.length; i < l; i++) {\n var child = children[i];\n var data = child.data; // remove slot attribute if the node is resolved as a Vue slot node\n\n if (data && data.attrs && data.attrs.slot) {\n delete data.attrs.slot;\n } // named slots should only be respected if the vnode was rendered in the\n // same context.\n\n\n if ((child.context === context || child.fnContext === context) && data && data.slot != null) {\n var name = data.slot;\n var slot = slots[name] || (slots[name] = []);\n\n if (child.tag === 'template') {\n slot.push.apply(slot, child.children || []);\n } else {\n slot.push(child);\n }\n } else {\n (slots.default || (slots.default = [])).push(child);\n }\n } // ignore slots that contains only whitespace\n\n\n for (var name$1 in slots) {\n if (slots[name$1].every(isWhitespace)) {\n delete slots[name$1];\n }\n }\n\n return slots;\n}\n\nfunction isWhitespace(node) {\n return node.isComment && !node.asyncFactory || node.text === ' ';\n}\n/* */\n\n\nfunction normalizeScopedSlots(slots, normalSlots, prevSlots) {\n var res;\n var hasNormalSlots = Object.keys(normalSlots).length > 0;\n var isStable = slots ? !!slots.$stable : !hasNormalSlots;\n var key = slots && slots.$key;\n\n if (!slots) {\n res = {};\n } else if (slots._normalized) {\n // fast path 1: child component re-render only, parent did not change\n return slots._normalized;\n } else if (isStable && prevSlots && prevSlots !== emptyObject && key === prevSlots.$key && !hasNormalSlots && !prevSlots.$hasNormal) {\n // fast path 2: stable scoped slots w/ no normal slots to proxy,\n // only need to normalize once\n return prevSlots;\n } else {\n res = {};\n\n for (var key$1 in slots) {\n if (slots[key$1] && key$1[0] !== '$') {\n res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);\n }\n }\n } // expose normal slots on scopedSlots\n\n\n for (var key$2 in normalSlots) {\n if (!(key$2 in res)) {\n res[key$2] = proxyNormalSlot(normalSlots, key$2);\n }\n } // avoriaz seems to mock a non-extensible $scopedSlots object\n // and when that is passed down this would cause an error\n\n\n if (slots && Object.isExtensible(slots)) {\n slots._normalized = res;\n }\n\n def(res, '$stable', isStable);\n def(res, '$key', key);\n def(res, '$hasNormal', hasNormalSlots);\n return res;\n}\n\nfunction normalizeScopedSlot(normalSlots, key, fn) {\n var normalized = function normalized() {\n var res = arguments.length ? fn.apply(null, arguments) : fn({});\n res = res && _typeof(res) === 'object' && !Array.isArray(res) ? [res] // single vnode\n : normalizeChildren(res);\n return res && (res.length === 0 || res.length === 1 && res[0].isComment // #9658\n ) ? undefined : res;\n }; // this is a slot using the new v-slot syntax without scope. although it is\n // compiled as a scoped slot, render fn users would expect it to be present\n // on this.$slots because the usage is semantically a normal slot.\n\n\n if (fn.proxy) {\n Object.defineProperty(normalSlots, key, {\n get: normalized,\n enumerable: true,\n configurable: true\n });\n }\n\n return normalized;\n}\n\nfunction proxyNormalSlot(slots, key) {\n return function () {\n return slots[key];\n };\n}\n/* */\n\n/**\n * Runtime helper for rendering v-for lists.\n */\n\n\nfunction renderList(val, render) {\n var ret, i, l, keys, key;\n\n if (Array.isArray(val) || typeof val === 'string') {\n ret = new Array(val.length);\n\n for (i = 0, l = val.length; i < l; i++) {\n ret[i] = render(val[i], i);\n }\n } else if (typeof val === 'number') {\n ret = new Array(val);\n\n for (i = 0; i < val; i++) {\n ret[i] = render(i + 1, i);\n }\n } else if (isObject(val)) {\n if (hasSymbol && val[Symbol.iterator]) {\n ret = [];\n var iterator = val[Symbol.iterator]();\n var result = iterator.next();\n\n while (!result.done) {\n ret.push(render(result.value, ret.length));\n result = iterator.next();\n }\n } else {\n keys = Object.keys(val);\n ret = new Array(keys.length);\n\n for (i = 0, l = keys.length; i < l; i++) {\n key = keys[i];\n ret[i] = render(val[key], key, i);\n }\n }\n }\n\n if (!isDef(ret)) {\n ret = [];\n }\n\n ret._isVList = true;\n return ret;\n}\n/* */\n\n/**\n * Runtime helper for rendering <slot>\n */\n\n\nfunction renderSlot(name, fallback, props, bindObject) {\n var scopedSlotFn = this.$scopedSlots[name];\n var nodes;\n\n if (scopedSlotFn) {\n // scoped slot\n props = props || {};\n\n if (bindObject) {\n if (false) {}\n\n props = extend(extend({}, bindObject), props);\n }\n\n nodes = scopedSlotFn(props) || fallback;\n } else {\n nodes = this.$slots[name] || fallback;\n }\n\n var target = props && props.slot;\n\n if (target) {\n return this.$createElement('template', {\n slot: target\n }, nodes);\n } else {\n return nodes;\n }\n}\n/* */\n\n/**\n * Runtime helper for resolving filters\n */\n\n\nfunction resolveFilter(id) {\n return resolveAsset(this.$options, 'filters', id, true) || identity;\n}\n/* */\n\n\nfunction isKeyNotMatch(expect, actual) {\n if (Array.isArray(expect)) {\n return expect.indexOf(actual) === -1;\n } else {\n return expect !== actual;\n }\n}\n/**\n * Runtime helper for checking keyCodes from config.\n * exposed as Vue.prototype._k\n * passing in eventKeyName as last argument separately for backwards compat\n */\n\n\nfunction checkKeyCodes(eventKeyCode, key, builtInKeyCode, eventKeyName, builtInKeyName) {\n var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;\n\n if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {\n return isKeyNotMatch(builtInKeyName, eventKeyName);\n } else if (mappedKeyCode) {\n return isKeyNotMatch(mappedKeyCode, eventKeyCode);\n } else if (eventKeyName) {\n return hyphenate(eventKeyName) !== key;\n }\n}\n/* */\n\n/**\n * Runtime helper for merging v-bind=\"object\" into a VNode's data.\n */\n\n\nfunction bindObjectProps(data, tag, value, asProp, isSync) {\n if (value) {\n if (!isObject(value)) {\n false && 0;\n } else {\n if (Array.isArray(value)) {\n value = toObject(value);\n }\n\n var hash;\n\n var loop = function loop(key) {\n if (key === 'class' || key === 'style' || isReservedAttribute(key)) {\n hash = data;\n } else {\n var type = data.attrs && data.attrs.type;\n hash = asProp || config.mustUseProp(tag, type, key) ? data.domProps || (data.domProps = {}) : data.attrs || (data.attrs = {});\n }\n\n var camelizedKey = camelize(key);\n var hyphenatedKey = hyphenate(key);\n\n if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {\n hash[key] = value[key];\n\n if (isSync) {\n var on = data.on || (data.on = {});\n\n on[\"update:\" + key] = function ($event) {\n value[key] = $event;\n };\n }\n }\n };\n\n for (var key in value) {\n loop(key);\n }\n }\n }\n\n return data;\n}\n/* */\n\n/**\n * Runtime helper for rendering static trees.\n */\n\n\nfunction renderStatic(index, isInFor) {\n var cached = this._staticTrees || (this._staticTrees = []);\n var tree = cached[index]; // if has already-rendered static tree and not inside v-for,\n // we can reuse the same tree.\n\n if (tree && !isInFor) {\n return tree;\n } // otherwise, render a fresh tree.\n\n\n tree = cached[index] = this.$options.staticRenderFns[index].call(this._renderProxy, null, this // for render fns generated for functional component templates\n );\n markStatic(tree, \"__static__\" + index, false);\n return tree;\n}\n/**\n * Runtime helper for v-once.\n * Effectively it means marking the node as static with a unique key.\n */\n\n\nfunction markOnce(tree, index, key) {\n markStatic(tree, \"__once__\" + index + (key ? \"_\" + key : \"\"), true);\n return tree;\n}\n\nfunction markStatic(tree, key, isOnce) {\n if (Array.isArray(tree)) {\n for (var i = 0; i < tree.length; i++) {\n if (tree[i] && typeof tree[i] !== 'string') {\n markStaticNode(tree[i], key + \"_\" + i, isOnce);\n }\n }\n } else {\n markStaticNode(tree, key, isOnce);\n }\n}\n\nfunction markStaticNode(node, key, isOnce) {\n node.isStatic = true;\n node.key = key;\n node.isOnce = isOnce;\n}\n/* */\n\n\nfunction bindObjectListeners(data, value) {\n if (value) {\n if (!isPlainObject(value)) {\n false && 0;\n } else {\n var on = data.on = data.on ? extend({}, data.on) : {};\n\n for (var key in value) {\n var existing = on[key];\n var ours = value[key];\n on[key] = existing ? [].concat(existing, ours) : ours;\n }\n }\n }\n\n return data;\n}\n/* */\n\n\nfunction resolveScopedSlots(fns, // see flow/vnode\nres, // the following are added in 2.6\nhasDynamicKeys, contentHashKey) {\n res = res || {\n $stable: !hasDynamicKeys\n };\n\n for (var i = 0; i < fns.length; i++) {\n var slot = fns[i];\n\n if (Array.isArray(slot)) {\n resolveScopedSlots(slot, res, hasDynamicKeys);\n } else if (slot) {\n // marker for reverse proxying v-slot without scope on this.$slots\n if (slot.proxy) {\n slot.fn.proxy = true;\n }\n\n res[slot.key] = slot.fn;\n }\n }\n\n if (contentHashKey) {\n res.$key = contentHashKey;\n }\n\n return res;\n}\n/* */\n\n\nfunction bindDynamicKeys(baseObj, values) {\n for (var i = 0; i < values.length; i += 2) {\n var key = values[i];\n\n if (typeof key === 'string' && key) {\n baseObj[values[i]] = values[i + 1];\n } else if (false) {}\n }\n\n return baseObj;\n} // helper to dynamically append modifier runtime markers to event names.\n// ensure only append when value is already string, otherwise it will be cast\n// to string and cause the type check to miss.\n\n\nfunction prependModifier(value, symbol) {\n return typeof value === 'string' ? symbol + value : value;\n}\n/* */\n\n\nfunction installRenderHelpers(target) {\n target._o = markOnce;\n target._n = toNumber;\n target._s = vue_runtime_esm_toString;\n target._l = renderList;\n target._t = renderSlot;\n target._q = looseEqual;\n target._i = looseIndexOf;\n target._m = renderStatic;\n target._f = resolveFilter;\n target._k = checkKeyCodes;\n target._b = bindObjectProps;\n target._v = createTextVNode;\n target._e = createEmptyVNode;\n target._u = resolveScopedSlots;\n target._g = bindObjectListeners;\n target._d = bindDynamicKeys;\n target._p = prependModifier;\n}\n/* */\n\n\nfunction FunctionalRenderContext(data, props, children, parent, Ctor) {\n var this$1 = this;\n var options = Ctor.options; // ensure the createElement function in functional components\n // gets a unique context - this is necessary for correct named slot check\n\n var contextVm;\n\n if (hasOwn(parent, '_uid')) {\n contextVm = Object.create(parent); // $flow-disable-line\n\n contextVm._original = parent;\n } else {\n // the context vm passed in is a functional context as well.\n // in this case we want to make sure we are able to get a hold to the\n // real context instance.\n contextVm = parent; // $flow-disable-line\n\n parent = parent._original;\n }\n\n var isCompiled = isTrue(options._compiled);\n var needNormalization = !isCompiled;\n this.data = data;\n this.props = props;\n this.children = children;\n this.parent = parent;\n this.listeners = data.on || emptyObject;\n this.injections = resolveInject(options.inject, parent);\n\n this.slots = function () {\n if (!this$1.$slots) {\n normalizeScopedSlots(data.scopedSlots, this$1.$slots = resolveSlots(children, parent));\n }\n\n return this$1.$slots;\n };\n\n Object.defineProperty(this, 'scopedSlots', {\n enumerable: true,\n get: function get() {\n return normalizeScopedSlots(data.scopedSlots, this.slots());\n }\n }); // support for compiled functional template\n\n if (isCompiled) {\n // exposing $options for renderStatic()\n this.$options = options; // pre-resolve slots for renderSlot()\n\n this.$slots = this.slots();\n this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);\n }\n\n if (options._scopeId) {\n this._c = function (a, b, c, d) {\n var vnode = createElement(contextVm, a, b, c, d, needNormalization);\n\n if (vnode && !Array.isArray(vnode)) {\n vnode.fnScopeId = options._scopeId;\n vnode.fnContext = parent;\n }\n\n return vnode;\n };\n } else {\n this._c = function (a, b, c, d) {\n return createElement(contextVm, a, b, c, d, needNormalization);\n };\n }\n}\n\ninstallRenderHelpers(FunctionalRenderContext.prototype);\n\nfunction createFunctionalComponent(Ctor, propsData, data, contextVm, children) {\n var options = Ctor.options;\n var props = {};\n var propOptions = options.props;\n\n if (isDef(propOptions)) {\n for (var key in propOptions) {\n props[key] = validateProp(key, propOptions, propsData || emptyObject);\n }\n } else {\n if (isDef(data.attrs)) {\n mergeProps(props, data.attrs);\n }\n\n if (isDef(data.props)) {\n mergeProps(props, data.props);\n }\n }\n\n var renderContext = new FunctionalRenderContext(data, props, children, contextVm, Ctor);\n var vnode = options.render.call(null, renderContext._c, renderContext);\n\n if (vnode instanceof VNode) {\n return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext);\n } else if (Array.isArray(vnode)) {\n var vnodes = normalizeChildren(vnode) || [];\n var res = new Array(vnodes.length);\n\n for (var i = 0; i < vnodes.length; i++) {\n res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);\n }\n\n return res;\n }\n}\n\nfunction cloneAndMarkFunctionalResult(vnode, data, contextVm, options, renderContext) {\n // #7817 clone node before setting fnContext, otherwise if the node is reused\n // (e.g. it was from a cached normal slot) the fnContext causes named slots\n // that should not be matched to match.\n var clone = cloneVNode(vnode);\n clone.fnContext = contextVm;\n clone.fnOptions = options;\n\n if (false) {}\n\n if (data.slot) {\n (clone.data || (clone.data = {})).slot = data.slot;\n }\n\n return clone;\n}\n\nfunction mergeProps(to, from) {\n for (var key in from) {\n to[camelize(key)] = from[key];\n }\n}\n/* */\n\n/* */\n\n/* */\n\n/* */\n// inline hooks to be invoked on component VNodes during patch\n\n\nvar componentVNodeHooks = {\n init: function init(vnode, hydrating) {\n if (vnode.componentInstance && !vnode.componentInstance._isDestroyed && vnode.data.keepAlive) {\n // kept-alive components, treat as a patch\n var mountedNode = vnode; // work around flow\n\n componentVNodeHooks.prepatch(mountedNode, mountedNode);\n } else {\n var child = vnode.componentInstance = createComponentInstanceForVnode(vnode, activeInstance);\n child.$mount(hydrating ? vnode.elm : undefined, hydrating);\n }\n },\n prepatch: function prepatch(oldVnode, vnode) {\n var options = vnode.componentOptions;\n var child = vnode.componentInstance = oldVnode.componentInstance;\n updateChildComponent(child, options.propsData, // updated props\n options.listeners, // updated listeners\n vnode, // new parent vnode\n options.children // new children\n );\n },\n insert: function insert(vnode) {\n var context = vnode.context;\n var componentInstance = vnode.componentInstance;\n\n if (!componentInstance._isMounted) {\n componentInstance._isMounted = true;\n callHook(componentInstance, 'mounted');\n }\n\n if (vnode.data.keepAlive) {\n if (context._isMounted) {\n // vue-router#1212\n // During updates, a kept-alive component's child components may\n // change, so directly walking the tree here may call activated hooks\n // on incorrect children. Instead we push them into a queue which will\n // be processed after the whole patch process ended.\n queueActivatedComponent(componentInstance);\n } else {\n activateChildComponent(componentInstance, true\n /* direct */\n );\n }\n }\n },\n destroy: function destroy(vnode) {\n var componentInstance = vnode.componentInstance;\n\n if (!componentInstance._isDestroyed) {\n if (!vnode.data.keepAlive) {\n componentInstance.$destroy();\n } else {\n deactivateChildComponent(componentInstance, true\n /* direct */\n );\n }\n }\n }\n};\nvar hooksToMerge = Object.keys(componentVNodeHooks);\n\nfunction createComponent(Ctor, data, context, children, tag) {\n if (isUndef(Ctor)) {\n return;\n }\n\n var baseCtor = context.$options._base; // plain options object: turn it into a constructor\n\n if (isObject(Ctor)) {\n Ctor = baseCtor.extend(Ctor);\n } // if at this stage it's not a constructor or an async component factory,\n // reject.\n\n\n if (typeof Ctor !== 'function') {\n if (false) {}\n\n return;\n } // async component\n\n\n var asyncFactory;\n\n if (isUndef(Ctor.cid)) {\n asyncFactory = Ctor;\n Ctor = resolveAsyncComponent(asyncFactory, baseCtor);\n\n if (Ctor === undefined) {\n // return a placeholder node for async component, which is rendered\n // as a comment node but preserves all the raw information for the node.\n // the information will be used for async server-rendering and hydration.\n return createAsyncPlaceholder(asyncFactory, data, context, children, tag);\n }\n }\n\n data = data || {}; // resolve constructor options in case global mixins are applied after\n // component constructor creation\n\n resolveConstructorOptions(Ctor); // transform component v-model data into props & events\n\n if (isDef(data.model)) {\n transformModel(Ctor.options, data);\n } // extract props\n\n\n var propsData = extractPropsFromVNodeData(data, Ctor, tag); // functional component\n\n if (isTrue(Ctor.options.functional)) {\n return createFunctionalComponent(Ctor, propsData, data, context, children);\n } // extract listeners, since these needs to be treated as\n // child component listeners instead of DOM listeners\n\n\n var listeners = data.on; // replace with listeners with .native modifier\n // so it gets processed during parent component patch.\n\n data.on = data.nativeOn;\n\n if (isTrue(Ctor.options.abstract)) {\n // abstract components do not keep anything\n // other than props & listeners & slot\n // work around flow\n var slot = data.slot;\n data = {};\n\n if (slot) {\n data.slot = slot;\n }\n } // install component management hooks onto the placeholder node\n\n\n installComponentHooks(data); // return a placeholder vnode\n\n var name = Ctor.options.name || tag;\n var vnode = new VNode(\"vue-component-\" + Ctor.cid + (name ? \"-\" + name : ''), data, undefined, undefined, undefined, context, {\n Ctor: Ctor,\n propsData: propsData,\n listeners: listeners,\n tag: tag,\n children: children\n }, asyncFactory);\n return vnode;\n}\n\nfunction createComponentInstanceForVnode(vnode, // we know it's MountedComponentVNode but flow doesn't\nparent // activeInstance in lifecycle state\n) {\n var options = {\n _isComponent: true,\n _parentVnode: vnode,\n parent: parent\n }; // check inline-template render functions\n\n var inlineTemplate = vnode.data.inlineTemplate;\n\n if (isDef(inlineTemplate)) {\n options.render = inlineTemplate.render;\n options.staticRenderFns = inlineTemplate.staticRenderFns;\n }\n\n return new vnode.componentOptions.Ctor(options);\n}\n\nfunction installComponentHooks(data) {\n var hooks = data.hook || (data.hook = {});\n\n for (var i = 0; i < hooksToMerge.length; i++) {\n var key = hooksToMerge[i];\n var existing = hooks[key];\n var toMerge = componentVNodeHooks[key];\n\n if (existing !== toMerge && !(existing && existing._merged)) {\n hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;\n }\n }\n}\n\nfunction mergeHook$1(f1, f2) {\n var merged = function merged(a, b) {\n // flow complains about extra args which is why we use any\n f1(a, b);\n f2(a, b);\n };\n\n merged._merged = true;\n return merged;\n} // transform component v-model info (value and callback) into\n// prop and event handler respectively.\n\n\nfunction transformModel(options, data) {\n var prop = options.model && options.model.prop || 'value';\n var event = options.model && options.model.event || 'input';\n (data.attrs || (data.attrs = {}))[prop] = data.model.value;\n var on = data.on || (data.on = {});\n var existing = on[event];\n var callback = data.model.callback;\n\n if (isDef(existing)) {\n if (Array.isArray(existing) ? existing.indexOf(callback) === -1 : existing !== callback) {\n on[event] = [callback].concat(existing);\n }\n } else {\n on[event] = callback;\n }\n}\n/* */\n\n\nvar SIMPLE_NORMALIZE = 1;\nvar ALWAYS_NORMALIZE = 2; // wrapper function for providing a more flexible interface\n// without getting yelled at by flow\n\nfunction createElement(context, tag, data, children, normalizationType, alwaysNormalize) {\n if (Array.isArray(data) || isPrimitive(data)) {\n normalizationType = children;\n children = data;\n data = undefined;\n }\n\n if (isTrue(alwaysNormalize)) {\n normalizationType = ALWAYS_NORMALIZE;\n }\n\n return _createElement(context, tag, data, children, normalizationType);\n}\n\nfunction _createElement(context, tag, data, children, normalizationType) {\n if (isDef(data) && isDef(data.__ob__)) {\n false && 0;\n return createEmptyVNode();\n } // object syntax in v-bind\n\n\n if (isDef(data) && isDef(data.is)) {\n tag = data.is;\n }\n\n if (!tag) {\n // in case of component :is set to falsy value\n return createEmptyVNode();\n } // warn against non-primitive key\n\n\n if (false) {} // support single function children as default scoped slot\n\n\n if (Array.isArray(children) && typeof children[0] === 'function') {\n data = data || {};\n data.scopedSlots = {\n default: children[0]\n };\n children.length = 0;\n }\n\n if (normalizationType === ALWAYS_NORMALIZE) {\n children = normalizeChildren(children);\n } else if (normalizationType === SIMPLE_NORMALIZE) {\n children = simpleNormalizeChildren(children);\n }\n\n var vnode, ns;\n\n if (typeof tag === 'string') {\n var Ctor;\n ns = context.$vnode && context.$vnode.ns || config.getTagNamespace(tag);\n\n if (config.isReservedTag(tag)) {\n // platform built-in elements\n if (false) {}\n\n vnode = new VNode(config.parsePlatformTagName(tag), data, children, undefined, undefined, context);\n } else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {\n // component\n vnode = createComponent(Ctor, data, context, children, tag);\n } else {\n // unknown or unlisted namespaced elements\n // check at runtime because it may get assigned a namespace when its\n // parent normalizes children\n vnode = new VNode(tag, data, children, undefined, undefined, context);\n }\n } else {\n // direct component options / constructor\n vnode = createComponent(tag, data, context, children);\n }\n\n if (Array.isArray(vnode)) {\n return vnode;\n } else if (isDef(vnode)) {\n if (isDef(ns)) {\n applyNS(vnode, ns);\n }\n\n if (isDef(data)) {\n registerDeepBindings(data);\n }\n\n return vnode;\n } else {\n return createEmptyVNode();\n }\n}\n\nfunction applyNS(vnode, ns, force) {\n vnode.ns = ns;\n\n if (vnode.tag === 'foreignObject') {\n // use default namespace inside foreignObject\n ns = undefined;\n force = true;\n }\n\n if (isDef(vnode.children)) {\n for (var i = 0, l = vnode.children.length; i < l; i++) {\n var child = vnode.children[i];\n\n if (isDef(child.tag) && (isUndef(child.ns) || isTrue(force) && child.tag !== 'svg')) {\n applyNS(child, ns, force);\n }\n }\n }\n} // ref #5318\n// necessary to ensure parent re-render when deep bindings like :style and\n// :class are used on slot nodes\n\n\nfunction registerDeepBindings(data) {\n if (isObject(data.style)) {\n traverse(data.style);\n }\n\n if (isObject(data.class)) {\n traverse(data.class);\n }\n}\n/* */\n\n\nfunction initRender(vm) {\n vm._vnode = null; // the root of the child tree\n\n vm._staticTrees = null; // v-once cached trees\n\n var options = vm.$options;\n var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree\n\n var renderContext = parentVnode && parentVnode.context;\n vm.$slots = resolveSlots(options._renderChildren, renderContext);\n vm.$scopedSlots = emptyObject; // bind the createElement fn to this instance\n // so that we get proper render context inside it.\n // args order: tag, data, children, normalizationType, alwaysNormalize\n // internal version is used by render functions compiled from templates\n\n vm._c = function (a, b, c, d) {\n return createElement(vm, a, b, c, d, false);\n }; // normalization is always applied for the public version, used in\n // user-written render functions.\n\n\n vm.$createElement = function (a, b, c, d) {\n return createElement(vm, a, b, c, d, true);\n }; // $attrs & $listeners are exposed for easier HOC creation.\n // they need to be reactive so that HOCs using them are always updated\n\n\n var parentData = parentVnode && parentVnode.data;\n /* istanbul ignore else */\n\n if (false) {} else {\n defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true);\n defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, null, true);\n }\n}\n\nvar currentRenderingInstance = null;\n\nfunction renderMixin(Vue) {\n // install runtime convenience helpers\n installRenderHelpers(Vue.prototype);\n\n Vue.prototype.$nextTick = function (fn) {\n return nextTick(fn, this);\n };\n\n Vue.prototype._render = function () {\n var vm = this;\n var ref = vm.$options;\n var render = ref.render;\n var _parentVnode = ref._parentVnode;\n\n if (_parentVnode) {\n vm.$scopedSlots = normalizeScopedSlots(_parentVnode.data.scopedSlots, vm.$slots, vm.$scopedSlots);\n } // set parent vnode. this allows render functions to have access\n // to the data on the placeholder node.\n\n\n vm.$vnode = _parentVnode; // render self\n\n var vnode;\n\n try {\n // There's no need to maintain a stack because all render fns are called\n // separately from one another. Nested component's render fns are called\n // when parent component is patched.\n currentRenderingInstance = vm;\n vnode = render.call(vm._renderProxy, vm.$createElement);\n } catch (e) {\n handleError(e, vm, \"render\"); // return error render result,\n // or previous vnode to prevent render error causing blank component\n\n /* istanbul ignore else */\n\n if (false) {} else {\n vnode = vm._vnode;\n }\n } finally {\n currentRenderingInstance = null;\n } // if the returned array contains only a single node, allow it\n\n\n if (Array.isArray(vnode) && vnode.length === 1) {\n vnode = vnode[0];\n } // return empty vnode in case the render function errored out\n\n\n if (!(vnode instanceof VNode)) {\n if (false) {}\n\n vnode = createEmptyVNode();\n } // set parent\n\n\n vnode.parent = _parentVnode;\n return vnode;\n };\n}\n/* */\n\n\nfunction ensureCtor(comp, base) {\n if (comp.__esModule || hasSymbol && comp[Symbol.toStringTag] === 'Module') {\n comp = comp.default;\n }\n\n return isObject(comp) ? base.extend(comp) : comp;\n}\n\nfunction createAsyncPlaceholder(factory, data, context, children, tag) {\n var node = createEmptyVNode();\n node.asyncFactory = factory;\n node.asyncMeta = {\n data: data,\n context: context,\n children: children,\n tag: tag\n };\n return node;\n}\n\nfunction resolveAsyncComponent(factory, baseCtor) {\n if (isTrue(factory.error) && isDef(factory.errorComp)) {\n return factory.errorComp;\n }\n\n if (isDef(factory.resolved)) {\n return factory.resolved;\n }\n\n var owner = currentRenderingInstance;\n\n if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {\n // already pending\n factory.owners.push(owner);\n }\n\n if (isTrue(factory.loading) && isDef(factory.loadingComp)) {\n return factory.loadingComp;\n }\n\n if (owner && !isDef(factory.owners)) {\n var owners = factory.owners = [owner];\n var sync = true;\n var timerLoading = null;\n var timerTimeout = null;\n owner.$on('hook:destroyed', function () {\n return remove(owners, owner);\n });\n\n var forceRender = function forceRender(renderCompleted) {\n for (var i = 0, l = owners.length; i < l; i++) {\n owners[i].$forceUpdate();\n }\n\n if (renderCompleted) {\n owners.length = 0;\n\n if (timerLoading !== null) {\n clearTimeout(timerLoading);\n timerLoading = null;\n }\n\n if (timerTimeout !== null) {\n clearTimeout(timerTimeout);\n timerTimeout = null;\n }\n }\n };\n\n var resolve = once(function (res) {\n // cache resolved\n factory.resolved = ensureCtor(res, baseCtor); // invoke callbacks only if this is not a synchronous resolve\n // (async resolves are shimmed as synchronous during SSR)\n\n if (!sync) {\n forceRender(true);\n } else {\n owners.length = 0;\n }\n });\n var reject = once(function (reason) {\n false && 0;\n\n if (isDef(factory.errorComp)) {\n factory.error = true;\n forceRender(true);\n }\n });\n var res = factory(resolve, reject);\n\n if (isObject(res)) {\n if (isPromise(res)) {\n // () => Promise\n if (isUndef(factory.resolved)) {\n res.then(resolve, reject);\n }\n } else if (isPromise(res.component)) {\n res.component.then(resolve, reject);\n\n if (isDef(res.error)) {\n factory.errorComp = ensureCtor(res.error, baseCtor);\n }\n\n if (isDef(res.loading)) {\n factory.loadingComp = ensureCtor(res.loading, baseCtor);\n\n if (res.delay === 0) {\n factory.loading = true;\n } else {\n timerLoading = setTimeout(function () {\n timerLoading = null;\n\n if (isUndef(factory.resolved) && isUndef(factory.error)) {\n factory.loading = true;\n forceRender(false);\n }\n }, res.delay || 200);\n }\n }\n\n if (isDef(res.timeout)) {\n timerTimeout = setTimeout(function () {\n timerTimeout = null;\n\n if (isUndef(factory.resolved)) {\n reject( false ? 0 : null);\n }\n }, res.timeout);\n }\n }\n }\n\n sync = false; // return in case resolved synchronously\n\n return factory.loading ? factory.loadingComp : factory.resolved;\n }\n}\n/* */\n\n\nfunction isAsyncPlaceholder(node) {\n return node.isComment && node.asyncFactory;\n}\n/* */\n\n\nfunction getFirstComponentChild(children) {\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n var c = children[i];\n\n if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {\n return c;\n }\n }\n }\n}\n/* */\n\n/* */\n\n\nfunction initEvents(vm) {\n vm._events = Object.create(null);\n vm._hasHookEvent = false; // init parent attached events\n\n var listeners = vm.$options._parentListeners;\n\n if (listeners) {\n updateComponentListeners(vm, listeners);\n }\n}\n\nvar target;\n\nfunction add(event, fn) {\n target.$on(event, fn);\n}\n\nfunction remove$1(event, fn) {\n target.$off(event, fn);\n}\n\nfunction createOnceHandler(event, fn) {\n var _target = target;\n return function onceHandler() {\n var res = fn.apply(null, arguments);\n\n if (res !== null) {\n _target.$off(event, onceHandler);\n }\n };\n}\n\nfunction updateComponentListeners(vm, listeners, oldListeners) {\n target = vm;\n updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);\n target = undefined;\n}\n\nfunction eventsMixin(Vue) {\n var hookRE = /^hook:/;\n\n Vue.prototype.$on = function (event, fn) {\n var vm = this;\n\n if (Array.isArray(event)) {\n for (var i = 0, l = event.length; i < l; i++) {\n vm.$on(event[i], fn);\n }\n } else {\n (vm._events[event] || (vm._events[event] = [])).push(fn); // optimize hook:event cost by using a boolean flag marked at registration\n // instead of a hash lookup\n\n if (hookRE.test(event)) {\n vm._hasHookEvent = true;\n }\n }\n\n return vm;\n };\n\n Vue.prototype.$once = function (event, fn) {\n var vm = this;\n\n function on() {\n vm.$off(event, on);\n fn.apply(vm, arguments);\n }\n\n on.fn = fn;\n vm.$on(event, on);\n return vm;\n };\n\n Vue.prototype.$off = function (event, fn) {\n var vm = this; // all\n\n if (!arguments.length) {\n vm._events = Object.create(null);\n return vm;\n } // array of events\n\n\n if (Array.isArray(event)) {\n for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {\n vm.$off(event[i$1], fn);\n }\n\n return vm;\n } // specific event\n\n\n var cbs = vm._events[event];\n\n if (!cbs) {\n return vm;\n }\n\n if (!fn) {\n vm._events[event] = null;\n return vm;\n } // specific handler\n\n\n var cb;\n var i = cbs.length;\n\n while (i--) {\n cb = cbs[i];\n\n if (cb === fn || cb.fn === fn) {\n cbs.splice(i, 1);\n break;\n }\n }\n\n return vm;\n };\n\n Vue.prototype.$emit = function (event) {\n var vm = this;\n\n if (false) { var lowerCaseEvent; }\n\n var cbs = vm._events[event];\n\n if (cbs) {\n cbs = cbs.length > 1 ? toArray(cbs) : cbs;\n var args = toArray(arguments, 1);\n var info = \"event handler for \\\"\" + event + \"\\\"\";\n\n for (var i = 0, l = cbs.length; i < l; i++) {\n invokeWithErrorHandling(cbs[i], vm, args, vm, info);\n }\n }\n\n return vm;\n };\n}\n/* */\n\n\nvar activeInstance = null;\nvar isUpdatingChildComponent = false;\n\nfunction setActiveInstance(vm) {\n var prevActiveInstance = activeInstance;\n activeInstance = vm;\n return function () {\n activeInstance = prevActiveInstance;\n };\n}\n\nfunction initLifecycle(vm) {\n var options = vm.$options; // locate first non-abstract parent\n\n var parent = options.parent;\n\n if (parent && !options.abstract) {\n while (parent.$options.abstract && parent.$parent) {\n parent = parent.$parent;\n }\n\n parent.$children.push(vm);\n }\n\n vm.$parent = parent;\n vm.$root = parent ? parent.$root : vm;\n vm.$children = [];\n vm.$refs = {};\n vm._watcher = null;\n vm._inactive = null;\n vm._directInactive = false;\n vm._isMounted = false;\n vm._isDestroyed = false;\n vm._isBeingDestroyed = false;\n}\n\nfunction lifecycleMixin(Vue) {\n Vue.prototype._update = function (vnode, hydrating) {\n var vm = this;\n var prevEl = vm.$el;\n var prevVnode = vm._vnode;\n var restoreActiveInstance = setActiveInstance(vm);\n vm._vnode = vnode; // Vue.prototype.__patch__ is injected in entry points\n // based on the rendering backend used.\n\n if (!prevVnode) {\n // initial render\n vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false\n /* removeOnly */\n );\n } else {\n // updates\n vm.$el = vm.__patch__(prevVnode, vnode);\n }\n\n restoreActiveInstance(); // update __vue__ reference\n\n if (prevEl) {\n prevEl.__vue__ = null;\n }\n\n if (vm.$el) {\n vm.$el.__vue__ = vm;\n } // if parent is an HOC, update its $el as well\n\n\n if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {\n vm.$parent.$el = vm.$el;\n } // updated hook is called by the scheduler to ensure that children are\n // updated in a parent's updated hook.\n\n };\n\n Vue.prototype.$forceUpdate = function () {\n var vm = this;\n\n if (vm._watcher) {\n vm._watcher.update();\n }\n };\n\n Vue.prototype.$destroy = function () {\n var vm = this;\n\n if (vm._isBeingDestroyed) {\n return;\n }\n\n callHook(vm, 'beforeDestroy');\n vm._isBeingDestroyed = true; // remove self from parent\n\n var parent = vm.$parent;\n\n if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {\n remove(parent.$children, vm);\n } // teardown watchers\n\n\n if (vm._watcher) {\n vm._watcher.teardown();\n }\n\n var i = vm._watchers.length;\n\n while (i--) {\n vm._watchers[i].teardown();\n } // remove reference from data ob\n // frozen object may not have observer.\n\n\n if (vm._data.__ob__) {\n vm._data.__ob__.vmCount--;\n } // call the last hook...\n\n\n vm._isDestroyed = true; // invoke destroy hooks on current rendered tree\n\n vm.__patch__(vm._vnode, null); // fire destroyed hook\n\n\n callHook(vm, 'destroyed'); // turn off all instance listeners.\n\n vm.$off(); // remove __vue__ reference\n\n if (vm.$el) {\n vm.$el.__vue__ = null;\n } // release circular reference (#6759)\n\n\n if (vm.$vnode) {\n vm.$vnode.parent = null;\n }\n };\n}\n\nfunction mountComponent(vm, el, hydrating) {\n vm.$el = el;\n\n if (!vm.$options.render) {\n vm.$options.render = createEmptyVNode;\n\n if (false) {}\n }\n\n callHook(vm, 'beforeMount');\n var updateComponent;\n /* istanbul ignore if */\n\n if (false) {} else {\n updateComponent = function updateComponent() {\n vm._update(vm._render(), hydrating);\n };\n } // we set this to vm._watcher inside the watcher's constructor\n // since the watcher's initial patch may call $forceUpdate (e.g. inside child\n // component's mounted hook), which relies on vm._watcher being already defined\n\n\n new Watcher(vm, updateComponent, noop, {\n before: function before() {\n if (vm._isMounted && !vm._isDestroyed) {\n callHook(vm, 'beforeUpdate');\n }\n }\n }, true\n /* isRenderWatcher */\n );\n hydrating = false; // manually mounted instance, call mounted on self\n // mounted is called for render-created child components in its inserted hook\n\n if (vm.$vnode == null) {\n vm._isMounted = true;\n callHook(vm, 'mounted');\n }\n\n return vm;\n}\n\nfunction updateChildComponent(vm, propsData, listeners, parentVnode, renderChildren) {\n if (false) {} // determine whether component has slot children\n // we need to do this before overwriting $options._renderChildren.\n // check if there are dynamic scopedSlots (hand-written or compiled but with\n // dynamic slot names). Static scoped slots compiled from template has the\n // \"$stable\" marker.\n\n\n var newScopedSlots = parentVnode.data.scopedSlots;\n var oldScopedSlots = vm.$scopedSlots;\n var hasDynamicScopedSlot = !!(newScopedSlots && !newScopedSlots.$stable || oldScopedSlots !== emptyObject && !oldScopedSlots.$stable || newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key); // Any static slot children from the parent may have changed during parent's\n // update. Dynamic scoped slots may also have changed. In such cases, a forced\n // update is necessary to ensure correctness.\n\n var needsForceUpdate = !!(renderChildren || // has new static slots\n vm.$options._renderChildren || // has old static slots\n hasDynamicScopedSlot);\n vm.$options._parentVnode = parentVnode;\n vm.$vnode = parentVnode; // update vm's placeholder node without re-render\n\n if (vm._vnode) {\n // update child tree's parent\n vm._vnode.parent = parentVnode;\n }\n\n vm.$options._renderChildren = renderChildren; // update $attrs and $listeners hash\n // these are also reactive so they may trigger child update if the child\n // used them during render\n\n vm.$attrs = parentVnode.data.attrs || emptyObject;\n vm.$listeners = listeners || emptyObject; // update props\n\n if (propsData && vm.$options.props) {\n toggleObserving(false);\n var props = vm._props;\n var propKeys = vm.$options._propKeys || [];\n\n for (var i = 0; i < propKeys.length; i++) {\n var key = propKeys[i];\n var propOptions = vm.$options.props; // wtf flow?\n\n props[key] = validateProp(key, propOptions, propsData, vm);\n }\n\n toggleObserving(true); // keep a copy of raw propsData\n\n vm.$options.propsData = propsData;\n } // update listeners\n\n\n listeners = listeners || emptyObject;\n var oldListeners = vm.$options._parentListeners;\n vm.$options._parentListeners = listeners;\n updateComponentListeners(vm, listeners, oldListeners); // resolve slots + force update if has children\n\n if (needsForceUpdate) {\n vm.$slots = resolveSlots(renderChildren, parentVnode.context);\n vm.$forceUpdate();\n }\n\n if (false) {}\n}\n\nfunction isInInactiveTree(vm) {\n while (vm && (vm = vm.$parent)) {\n if (vm._inactive) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction activateChildComponent(vm, direct) {\n if (direct) {\n vm._directInactive = false;\n\n if (isInInactiveTree(vm)) {\n return;\n }\n } else if (vm._directInactive) {\n return;\n }\n\n if (vm._inactive || vm._inactive === null) {\n vm._inactive = false;\n\n for (var i = 0; i < vm.$children.length; i++) {\n activateChildComponent(vm.$children[i]);\n }\n\n callHook(vm, 'activated');\n }\n}\n\nfunction deactivateChildComponent(vm, direct) {\n if (direct) {\n vm._directInactive = true;\n\n if (isInInactiveTree(vm)) {\n return;\n }\n }\n\n if (!vm._inactive) {\n vm._inactive = true;\n\n for (var i = 0; i < vm.$children.length; i++) {\n deactivateChildComponent(vm.$children[i]);\n }\n\n callHook(vm, 'deactivated');\n }\n}\n\nfunction callHook(vm, hook) {\n // #7573 disable dep collection when invoking lifecycle hooks\n pushTarget();\n var handlers = vm.$options[hook];\n var info = hook + \" hook\";\n\n if (handlers) {\n for (var i = 0, j = handlers.length; i < j; i++) {\n invokeWithErrorHandling(handlers[i], vm, null, vm, info);\n }\n }\n\n if (vm._hasHookEvent) {\n vm.$emit('hook:' + hook);\n }\n\n popTarget();\n}\n/* */\n\n\nvar MAX_UPDATE_COUNT = 100;\nvar queue = [];\nvar activatedChildren = [];\nvar has = {};\nvar circular = {};\nvar waiting = false;\nvar flushing = false;\nvar index = 0;\n/**\n * Reset the scheduler's state.\n */\n\nfunction resetSchedulerState() {\n index = queue.length = activatedChildren.length = 0;\n has = {};\n\n if (false) {}\n\n waiting = flushing = false;\n} // Async edge case #6566 requires saving the timestamp when event listeners are\n// attached. However, calling performance.now() has a perf overhead especially\n// if the page has thousands of event listeners. Instead, we take a timestamp\n// every time the scheduler flushes and use that for all event listeners\n// attached during that flush.\n\n\nvar currentFlushTimestamp = 0; // Async edge case fix requires storing an event listener's attach timestamp.\n\nvar getNow = Date.now; // Determine what event timestamp the browser is using. Annoyingly, the\n// timestamp can either be hi-res (relative to page load) or low-res\n// (relative to UNIX epoch), so in order to compare time we have to use the\n// same timestamp type when saving the flush timestamp.\n// All IE versions use low-res event timestamps, and have problematic clock\n// implementations (#9632)\n\nif (inBrowser && !isIE) {\n var performance = window.performance;\n\n if (performance && typeof performance.now === 'function' && getNow() > document.createEvent('Event').timeStamp) {\n // if the event timestamp, although evaluated AFTER the Date.now(), is\n // smaller than it, it means the event is using a hi-res timestamp,\n // and we need to use the hi-res version for event listener timestamps as\n // well.\n getNow = function getNow() {\n return performance.now();\n };\n }\n}\n/**\n * Flush both queues and run the watchers.\n */\n\n\nfunction flushSchedulerQueue() {\n currentFlushTimestamp = getNow();\n flushing = true;\n var watcher, id; // Sort queue before flush.\n // This ensures that:\n // 1. Components are updated from parent to child. (because parent is always\n // created before the child)\n // 2. A component's user watchers are run before its render watcher (because\n // user watchers are created before the render watcher)\n // 3. If a component is destroyed during a parent component's watcher run,\n // its watchers can be skipped.\n\n queue.sort(function (a, b) {\n return a.id - b.id;\n }); // do not cache length because more watchers might be pushed\n // as we run existing watchers\n\n for (index = 0; index < queue.length; index++) {\n watcher = queue[index];\n\n if (watcher.before) {\n watcher.before();\n }\n\n id = watcher.id;\n has[id] = null;\n watcher.run(); // in dev build, check and stop circular updates.\n\n if (false) {}\n } // keep copies of post queues before resetting state\n\n\n var activatedQueue = activatedChildren.slice();\n var updatedQueue = queue.slice();\n resetSchedulerState(); // call component updated and activated hooks\n\n callActivatedHooks(activatedQueue);\n callUpdatedHooks(updatedQueue); // devtool hook\n\n /* istanbul ignore if */\n\n if (devtools && config.devtools) {\n devtools.emit('flush');\n }\n}\n\nfunction callUpdatedHooks(queue) {\n var i = queue.length;\n\n while (i--) {\n var watcher = queue[i];\n var vm = watcher.vm;\n\n if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {\n callHook(vm, 'updated');\n }\n }\n}\n/**\n * Queue a kept-alive component that was activated during patch.\n * The queue will be processed after the entire tree has been patched.\n */\n\n\nfunction queueActivatedComponent(vm) {\n // setting _inactive to false here so that a render function can\n // rely on checking whether it's in an inactive tree (e.g. router-view)\n vm._inactive = false;\n activatedChildren.push(vm);\n}\n\nfunction callActivatedHooks(queue) {\n for (var i = 0; i < queue.length; i++) {\n queue[i]._inactive = true;\n activateChildComponent(queue[i], true\n /* true */\n );\n }\n}\n/**\n * Push a watcher into the watcher queue.\n * Jobs with duplicate IDs will be skipped unless it's\n * pushed when the queue is being flushed.\n */\n\n\nfunction queueWatcher(watcher) {\n var id = watcher.id;\n\n if (has[id] == null) {\n has[id] = true;\n\n if (!flushing) {\n queue.push(watcher);\n } else {\n // if already flushing, splice the watcher based on its id\n // if already past its id, it will be run next immediately.\n var i = queue.length - 1;\n\n while (i > index && queue[i].id > watcher.id) {\n i--;\n }\n\n queue.splice(i + 1, 0, watcher);\n } // queue the flush\n\n\n if (!waiting) {\n waiting = true;\n\n if (false) {}\n\n nextTick(flushSchedulerQueue);\n }\n }\n}\n/* */\n\n\nvar uid$2 = 0;\n/**\n * A watcher parses an expression, collects dependencies,\n * and fires callback when the expression value changes.\n * This is used for both the $watch() api and directives.\n */\n\nvar Watcher = function Watcher(vm, expOrFn, cb, options, isRenderWatcher) {\n this.vm = vm;\n\n if (isRenderWatcher) {\n vm._watcher = this;\n }\n\n vm._watchers.push(this); // options\n\n\n if (options) {\n this.deep = !!options.deep;\n this.user = !!options.user;\n this.lazy = !!options.lazy;\n this.sync = !!options.sync;\n this.before = options.before;\n } else {\n this.deep = this.user = this.lazy = this.sync = false;\n }\n\n this.cb = cb;\n this.id = ++uid$2; // uid for batching\n\n this.active = true;\n this.dirty = this.lazy; // for lazy watchers\n\n this.deps = [];\n this.newDeps = [];\n this.depIds = new _Set();\n this.newDepIds = new _Set();\n this.expression = false ? 0 : ''; // parse expression for getter\n\n if (typeof expOrFn === 'function') {\n this.getter = expOrFn;\n } else {\n this.getter = parsePath(expOrFn);\n\n if (!this.getter) {\n this.getter = noop;\n false && 0;\n }\n }\n\n this.value = this.lazy ? undefined : this.get();\n};\n/**\n * Evaluate the getter, and re-collect dependencies.\n */\n\n\nWatcher.prototype.get = function get() {\n pushTarget(this);\n var value;\n var vm = this.vm;\n\n try {\n value = this.getter.call(vm, vm);\n } catch (e) {\n if (this.user) {\n handleError(e, vm, \"getter for watcher \\\"\" + this.expression + \"\\\"\");\n } else {\n throw e;\n }\n } finally {\n // \"touch\" every property so they are all tracked as\n // dependencies for deep watching\n if (this.deep) {\n traverse(value);\n }\n\n popTarget();\n this.cleanupDeps();\n }\n\n return value;\n};\n/**\n * Add a dependency to this directive.\n */\n\n\nWatcher.prototype.addDep = function addDep(dep) {\n var id = dep.id;\n\n if (!this.newDepIds.has(id)) {\n this.newDepIds.add(id);\n this.newDeps.push(dep);\n\n if (!this.depIds.has(id)) {\n dep.addSub(this);\n }\n }\n};\n/**\n * Clean up for dependency collection.\n */\n\n\nWatcher.prototype.cleanupDeps = function cleanupDeps() {\n var i = this.deps.length;\n\n while (i--) {\n var dep = this.deps[i];\n\n if (!this.newDepIds.has(dep.id)) {\n dep.removeSub(this);\n }\n }\n\n var tmp = this.depIds;\n this.depIds = this.newDepIds;\n this.newDepIds = tmp;\n this.newDepIds.clear();\n tmp = this.deps;\n this.deps = this.newDeps;\n this.newDeps = tmp;\n this.newDeps.length = 0;\n};\n/**\n * Subscriber interface.\n * Will be called when a dependency changes.\n */\n\n\nWatcher.prototype.update = function update() {\n /* istanbul ignore else */\n if (this.lazy) {\n this.dirty = true;\n } else if (this.sync) {\n this.run();\n } else {\n queueWatcher(this);\n }\n};\n/**\n * Scheduler job interface.\n * Will be called by the scheduler.\n */\n\n\nWatcher.prototype.run = function run() {\n if (this.active) {\n var value = this.get();\n\n if (value !== this.value || // Deep watchers and watchers on Object/Arrays should fire even\n // when the value is the same, because the value may\n // have mutated.\n isObject(value) || this.deep) {\n // set new value\n var oldValue = this.value;\n this.value = value;\n\n if (this.user) {\n try {\n this.cb.call(this.vm, value, oldValue);\n } catch (e) {\n handleError(e, this.vm, \"callback for watcher \\\"\" + this.expression + \"\\\"\");\n }\n } else {\n this.cb.call(this.vm, value, oldValue);\n }\n }\n }\n};\n/**\n * Evaluate the value of the watcher.\n * This only gets called for lazy watchers.\n */\n\n\nWatcher.prototype.evaluate = function evaluate() {\n this.value = this.get();\n this.dirty = false;\n};\n/**\n * Depend on all deps collected by this watcher.\n */\n\n\nWatcher.prototype.depend = function depend() {\n var i = this.deps.length;\n\n while (i--) {\n this.deps[i].depend();\n }\n};\n/**\n * Remove self from all dependencies' subscriber list.\n */\n\n\nWatcher.prototype.teardown = function teardown() {\n if (this.active) {\n // remove self from vm's watcher list\n // this is a somewhat expensive operation so we skip it\n // if the vm is being destroyed.\n if (!this.vm._isBeingDestroyed) {\n remove(this.vm._watchers, this);\n }\n\n var i = this.deps.length;\n\n while (i--) {\n this.deps[i].removeSub(this);\n }\n\n this.active = false;\n }\n};\n/* */\n\n\nvar sharedPropertyDefinition = {\n enumerable: true,\n configurable: true,\n get: noop,\n set: noop\n};\n\nfunction proxy(target, sourceKey, key) {\n sharedPropertyDefinition.get = function proxyGetter() {\n return this[sourceKey][key];\n };\n\n sharedPropertyDefinition.set = function proxySetter(val) {\n this[sourceKey][key] = val;\n };\n\n Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction initState(vm) {\n vm._watchers = [];\n var opts = vm.$options;\n\n if (opts.props) {\n initProps(vm, opts.props);\n }\n\n if (opts.methods) {\n initMethods(vm, opts.methods);\n }\n\n if (opts.data) {\n initData(vm);\n } else {\n observe(vm._data = {}, true\n /* asRootData */\n );\n }\n\n if (opts.computed) {\n initComputed(vm, opts.computed);\n }\n\n if (opts.watch && opts.watch !== nativeWatch) {\n initWatch(vm, opts.watch);\n }\n}\n\nfunction initProps(vm, propsOptions) {\n var propsData = vm.$options.propsData || {};\n var props = vm._props = {}; // cache prop keys so that future props updates can iterate using Array\n // instead of dynamic object key enumeration.\n\n var keys = vm.$options._propKeys = [];\n var isRoot = !vm.$parent; // root instance props should be converted\n\n if (!isRoot) {\n toggleObserving(false);\n }\n\n var loop = function loop(key) {\n keys.push(key);\n var value = validateProp(key, propsOptions, propsData, vm);\n /* istanbul ignore else */\n\n if (false) { var hyphenatedKey; } else {\n defineReactive$$1(props, key, value);\n } // static props are already proxied on the component's prototype\n // during Vue.extend(). We only need to proxy props defined at\n // instantiation here.\n\n\n if (!(key in vm)) {\n proxy(vm, \"_props\", key);\n }\n };\n\n for (var key in propsOptions) {\n loop(key);\n }\n\n toggleObserving(true);\n}\n\nfunction initData(vm) {\n var data = vm.$options.data;\n data = vm._data = typeof data === 'function' ? getData(data, vm) : data || {};\n\n if (!isPlainObject(data)) {\n data = {};\n false && 0;\n } // proxy data on instance\n\n\n var keys = Object.keys(data);\n var props = vm.$options.props;\n var methods = vm.$options.methods;\n var i = keys.length;\n\n while (i--) {\n var key = keys[i];\n\n if (false) {}\n\n if (props && hasOwn(props, key)) {\n false && 0;\n } else if (!isReserved(key)) {\n proxy(vm, \"_data\", key);\n }\n } // observe data\n\n\n observe(data, true\n /* asRootData */\n );\n}\n\nfunction getData(data, vm) {\n // #7573 disable dep collection when invoking data getters\n pushTarget();\n\n try {\n return data.call(vm, vm);\n } catch (e) {\n handleError(e, vm, \"data()\");\n return {};\n } finally {\n popTarget();\n }\n}\n\nvar computedWatcherOptions = {\n lazy: true\n};\n\nfunction initComputed(vm, computed) {\n // $flow-disable-line\n var watchers = vm._computedWatchers = Object.create(null); // computed properties are just getters during SSR\n\n var isSSR = isServerRendering();\n\n for (var key in computed) {\n var userDef = computed[key];\n var getter = typeof userDef === 'function' ? userDef : userDef.get;\n\n if (false) {}\n\n if (!isSSR) {\n // create internal watcher for the computed property.\n watchers[key] = new Watcher(vm, getter || noop, noop, computedWatcherOptions);\n } // component-defined computed properties are already defined on the\n // component prototype. We only need to define computed properties defined\n // at instantiation here.\n\n\n if (!(key in vm)) {\n defineComputed(vm, key, userDef);\n } else if (false) {}\n }\n}\n\nfunction defineComputed(target, key, userDef) {\n var shouldCache = !isServerRendering();\n\n if (typeof userDef === 'function') {\n sharedPropertyDefinition.get = shouldCache ? createComputedGetter(key) : createGetterInvoker(userDef);\n sharedPropertyDefinition.set = noop;\n } else {\n sharedPropertyDefinition.get = userDef.get ? shouldCache && userDef.cache !== false ? createComputedGetter(key) : createGetterInvoker(userDef.get) : noop;\n sharedPropertyDefinition.set = userDef.set || noop;\n }\n\n if (false) {}\n\n Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction createComputedGetter(key) {\n return function computedGetter() {\n var watcher = this._computedWatchers && this._computedWatchers[key];\n\n if (watcher) {\n if (watcher.dirty) {\n watcher.evaluate();\n }\n\n if (Dep.target) {\n watcher.depend();\n }\n\n return watcher.value;\n }\n };\n}\n\nfunction createGetterInvoker(fn) {\n return function computedGetter() {\n return fn.call(this, this);\n };\n}\n\nfunction initMethods(vm, methods) {\n var props = vm.$options.props;\n\n for (var key in methods) {\n if (false) {}\n\n vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);\n }\n}\n\nfunction initWatch(vm, watch) {\n for (var key in watch) {\n var handler = watch[key];\n\n if (Array.isArray(handler)) {\n for (var i = 0; i < handler.length; i++) {\n createWatcher(vm, key, handler[i]);\n }\n } else {\n createWatcher(vm, key, handler);\n }\n }\n}\n\nfunction createWatcher(vm, expOrFn, handler, options) {\n if (isPlainObject(handler)) {\n options = handler;\n handler = handler.handler;\n }\n\n if (typeof handler === 'string') {\n handler = vm[handler];\n }\n\n return vm.$watch(expOrFn, handler, options);\n}\n\nfunction stateMixin(Vue) {\n // flow somehow has problems with directly declared definition object\n // when using Object.defineProperty, so we have to procedurally build up\n // the object here.\n var dataDef = {};\n\n dataDef.get = function () {\n return this._data;\n };\n\n var propsDef = {};\n\n propsDef.get = function () {\n return this._props;\n };\n\n if (false) {}\n\n Object.defineProperty(Vue.prototype, '$data', dataDef);\n Object.defineProperty(Vue.prototype, '$props', propsDef);\n Vue.prototype.$set = set;\n Vue.prototype.$delete = del;\n\n Vue.prototype.$watch = function (expOrFn, cb, options) {\n var vm = this;\n\n if (isPlainObject(cb)) {\n return createWatcher(vm, expOrFn, cb, options);\n }\n\n options = options || {};\n options.user = true;\n var watcher = new Watcher(vm, expOrFn, cb, options);\n\n if (options.immediate) {\n try {\n cb.call(vm, watcher.value);\n } catch (error) {\n handleError(error, vm, \"callback for immediate watcher \\\"\" + watcher.expression + \"\\\"\");\n }\n }\n\n return function unwatchFn() {\n watcher.teardown();\n };\n };\n}\n/* */\n\n\nvar uid$3 = 0;\n\nfunction initMixin(Vue) {\n Vue.prototype._init = function (options) {\n var vm = this; // a uid\n\n vm._uid = uid$3++;\n var startTag, endTag;\n /* istanbul ignore if */\n\n if (false) {} // a flag to avoid this being observed\n\n\n vm._isVue = true; // merge options\n\n if (options && options._isComponent) {\n // optimize internal component instantiation\n // since dynamic options merging is pretty slow, and none of the\n // internal component options needs special treatment.\n initInternalComponent(vm, options);\n } else {\n vm.$options = mergeOptions(resolveConstructorOptions(vm.constructor), options || {}, vm);\n }\n /* istanbul ignore else */\n\n\n if (false) {} else {\n vm._renderProxy = vm;\n } // expose real self\n\n\n vm._self = vm;\n initLifecycle(vm);\n initEvents(vm);\n initRender(vm);\n callHook(vm, 'beforeCreate');\n initInjections(vm); // resolve injections before data/props\n\n initState(vm);\n initProvide(vm); // resolve provide after data/props\n\n callHook(vm, 'created');\n /* istanbul ignore if */\n\n if (false) {}\n\n if (vm.$options.el) {\n vm.$mount(vm.$options.el);\n }\n };\n}\n\nfunction initInternalComponent(vm, options) {\n var opts = vm.$options = Object.create(vm.constructor.options); // doing this because it's faster than dynamic enumeration.\n\n var parentVnode = options._parentVnode;\n opts.parent = options.parent;\n opts._parentVnode = parentVnode;\n var vnodeComponentOptions = parentVnode.componentOptions;\n opts.propsData = vnodeComponentOptions.propsData;\n opts._parentListeners = vnodeComponentOptions.listeners;\n opts._renderChildren = vnodeComponentOptions.children;\n opts._componentTag = vnodeComponentOptions.tag;\n\n if (options.render) {\n opts.render = options.render;\n opts.staticRenderFns = options.staticRenderFns;\n }\n}\n\nfunction resolveConstructorOptions(Ctor) {\n var options = Ctor.options;\n\n if (Ctor.super) {\n var superOptions = resolveConstructorOptions(Ctor.super);\n var cachedSuperOptions = Ctor.superOptions;\n\n if (superOptions !== cachedSuperOptions) {\n // super option changed,\n // need to resolve new options.\n Ctor.superOptions = superOptions; // check if there are any late-modified/attached options (#4976)\n\n var modifiedOptions = resolveModifiedOptions(Ctor); // update base extend options\n\n if (modifiedOptions) {\n extend(Ctor.extendOptions, modifiedOptions);\n }\n\n options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);\n\n if (options.name) {\n options.components[options.name] = Ctor;\n }\n }\n }\n\n return options;\n}\n\nfunction resolveModifiedOptions(Ctor) {\n var modified;\n var latest = Ctor.options;\n var sealed = Ctor.sealedOptions;\n\n for (var key in latest) {\n if (latest[key] !== sealed[key]) {\n if (!modified) {\n modified = {};\n }\n\n modified[key] = latest[key];\n }\n }\n\n return modified;\n}\n\nfunction Vue(options) {\n if (false) {}\n\n this._init(options);\n}\n\ninitMixin(Vue);\nstateMixin(Vue);\neventsMixin(Vue);\nlifecycleMixin(Vue);\nrenderMixin(Vue);\n/* */\n\nfunction initUse(Vue) {\n Vue.use = function (plugin) {\n var installedPlugins = this._installedPlugins || (this._installedPlugins = []);\n\n if (installedPlugins.indexOf(plugin) > -1) {\n return this;\n } // additional parameters\n\n\n var args = toArray(arguments, 1);\n args.unshift(this);\n\n if (typeof plugin.install === 'function') {\n plugin.install.apply(plugin, args);\n } else if (typeof plugin === 'function') {\n plugin.apply(null, args);\n }\n\n installedPlugins.push(plugin);\n return this;\n };\n}\n/* */\n\n\nfunction initMixin$1(Vue) {\n Vue.mixin = function (mixin) {\n this.options = mergeOptions(this.options, mixin);\n return this;\n };\n}\n/* */\n\n\nfunction initExtend(Vue) {\n /**\n * Each instance constructor, including Vue, has a unique\n * cid. This enables us to create wrapped \"child\n * constructors\" for prototypal inheritance and cache them.\n */\n Vue.cid = 0;\n var cid = 1;\n /**\n * Class inheritance\n */\n\n Vue.extend = function (extendOptions) {\n extendOptions = extendOptions || {};\n var Super = this;\n var SuperId = Super.cid;\n var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});\n\n if (cachedCtors[SuperId]) {\n return cachedCtors[SuperId];\n }\n\n var name = extendOptions.name || Super.options.name;\n\n if (false) {}\n\n var Sub = function VueComponent(options) {\n this._init(options);\n };\n\n Sub.prototype = Object.create(Super.prototype);\n Sub.prototype.constructor = Sub;\n Sub.cid = cid++;\n Sub.options = mergeOptions(Super.options, extendOptions);\n Sub['super'] = Super; // For props and computed properties, we define the proxy getters on\n // the Vue instances at extension time, on the extended prototype. This\n // avoids Object.defineProperty calls for each instance created.\n\n if (Sub.options.props) {\n initProps$1(Sub);\n }\n\n if (Sub.options.computed) {\n initComputed$1(Sub);\n } // allow further extension/mixin/plugin usage\n\n\n Sub.extend = Super.extend;\n Sub.mixin = Super.mixin;\n Sub.use = Super.use; // create asset registers, so extended classes\n // can have their private assets too.\n\n ASSET_TYPES.forEach(function (type) {\n Sub[type] = Super[type];\n }); // enable recursive self-lookup\n\n if (name) {\n Sub.options.components[name] = Sub;\n } // keep a reference to the super options at extension time.\n // later at instantiation we can check if Super's options have\n // been updated.\n\n\n Sub.superOptions = Super.options;\n Sub.extendOptions = extendOptions;\n Sub.sealedOptions = extend({}, Sub.options); // cache constructor\n\n cachedCtors[SuperId] = Sub;\n return Sub;\n };\n}\n\nfunction initProps$1(Comp) {\n var props = Comp.options.props;\n\n for (var key in props) {\n proxy(Comp.prototype, \"_props\", key);\n }\n}\n\nfunction initComputed$1(Comp) {\n var computed = Comp.options.computed;\n\n for (var key in computed) {\n defineComputed(Comp.prototype, key, computed[key]);\n }\n}\n/* */\n\n\nfunction initAssetRegisters(Vue) {\n /**\n * Create asset registration methods.\n */\n ASSET_TYPES.forEach(function (type) {\n Vue[type] = function (id, definition) {\n if (!definition) {\n return this.options[type + 's'][id];\n } else {\n /* istanbul ignore if */\n if (false) {}\n\n if (type === 'component' && isPlainObject(definition)) {\n definition.name = definition.name || id;\n definition = this.options._base.extend(definition);\n }\n\n if (type === 'directive' && typeof definition === 'function') {\n definition = {\n bind: definition,\n update: definition\n };\n }\n\n this.options[type + 's'][id] = definition;\n return definition;\n }\n };\n });\n}\n/* */\n\n\nfunction getComponentName(opts) {\n return opts && (opts.Ctor.options.name || opts.tag);\n}\n\nfunction matches(pattern, name) {\n if (Array.isArray(pattern)) {\n return pattern.indexOf(name) > -1;\n } else if (typeof pattern === 'string') {\n return pattern.split(',').indexOf(name) > -1;\n } else if (isRegExp(pattern)) {\n return pattern.test(name);\n }\n /* istanbul ignore next */\n\n\n return false;\n}\n\nfunction pruneCache(keepAliveInstance, filter) {\n var cache = keepAliveInstance.cache;\n var keys = keepAliveInstance.keys;\n var _vnode = keepAliveInstance._vnode;\n\n for (var key in cache) {\n var cachedNode = cache[key];\n\n if (cachedNode) {\n var name = getComponentName(cachedNode.componentOptions);\n\n if (name && !filter(name)) {\n pruneCacheEntry(cache, key, keys, _vnode);\n }\n }\n }\n}\n\nfunction pruneCacheEntry(cache, key, keys, current) {\n var cached$$1 = cache[key];\n\n if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {\n cached$$1.componentInstance.$destroy();\n }\n\n cache[key] = null;\n remove(keys, key);\n}\n\nvar patternTypes = [String, RegExp, Array];\nvar KeepAlive = {\n name: 'keep-alive',\n abstract: true,\n props: {\n include: patternTypes,\n exclude: patternTypes,\n max: [String, Number]\n },\n created: function created() {\n this.cache = Object.create(null);\n this.keys = [];\n },\n destroyed: function destroyed() {\n for (var key in this.cache) {\n pruneCacheEntry(this.cache, key, this.keys);\n }\n },\n mounted: function mounted() {\n var this$1 = this;\n this.$watch('include', function (val) {\n pruneCache(this$1, function (name) {\n return matches(val, name);\n });\n });\n this.$watch('exclude', function (val) {\n pruneCache(this$1, function (name) {\n return !matches(val, name);\n });\n });\n },\n render: function render() {\n var slot = this.$slots.default;\n var vnode = getFirstComponentChild(slot);\n var componentOptions = vnode && vnode.componentOptions;\n\n if (componentOptions) {\n // check pattern\n var name = getComponentName(componentOptions);\n var ref = this;\n var include = ref.include;\n var exclude = ref.exclude;\n\n if ( // not included\n include && (!name || !matches(include, name)) || // excluded\n exclude && name && matches(exclude, name)) {\n return vnode;\n }\n\n var ref$1 = this;\n var cache = ref$1.cache;\n var keys = ref$1.keys;\n var key = vnode.key == null // same constructor may get registered as different local components\n // so cid alone is not enough (#3269)\n ? componentOptions.Ctor.cid + (componentOptions.tag ? \"::\" + componentOptions.tag : '') : vnode.key;\n\n if (cache[key]) {\n vnode.componentInstance = cache[key].componentInstance; // make current key freshest\n\n remove(keys, key);\n keys.push(key);\n } else {\n cache[key] = vnode;\n keys.push(key); // prune oldest entry\n\n if (this.max && keys.length > parseInt(this.max)) {\n pruneCacheEntry(cache, keys[0], keys, this._vnode);\n }\n }\n\n vnode.data.keepAlive = true;\n }\n\n return vnode || slot && slot[0];\n }\n};\nvar builtInComponents = {\n KeepAlive: KeepAlive\n};\n/* */\n\nfunction initGlobalAPI(Vue) {\n // config\n var configDef = {};\n\n configDef.get = function () {\n return config;\n };\n\n if (false) {}\n\n Object.defineProperty(Vue, 'config', configDef); // exposed util methods.\n // NOTE: these are not considered part of the public API - avoid relying on\n // them unless you are aware of the risk.\n\n Vue.util = {\n warn: warn,\n extend: extend,\n mergeOptions: mergeOptions,\n defineReactive: defineReactive$$1\n };\n Vue.set = set;\n Vue.delete = del;\n Vue.nextTick = nextTick; // 2.6 explicit observable API\n\n Vue.observable = function (obj) {\n observe(obj);\n return obj;\n };\n\n Vue.options = Object.create(null);\n ASSET_TYPES.forEach(function (type) {\n Vue.options[type + 's'] = Object.create(null);\n }); // this is used to identify the \"base\" constructor to extend all plain-object\n // components with in Weex's multi-instance scenarios.\n\n Vue.options._base = Vue;\n extend(Vue.options.components, builtInComponents);\n initUse(Vue);\n initMixin$1(Vue);\n initExtend(Vue);\n initAssetRegisters(Vue);\n}\n\ninitGlobalAPI(Vue);\nObject.defineProperty(Vue.prototype, '$isServer', {\n get: isServerRendering\n});\nObject.defineProperty(Vue.prototype, '$ssrContext', {\n get: function get() {\n /* istanbul ignore next */\n return this.$vnode && this.$vnode.ssrContext;\n }\n}); // expose FunctionalRenderContext for ssr runtime helper installation\n\nObject.defineProperty(Vue, 'FunctionalRenderContext', {\n value: FunctionalRenderContext\n});\nVue.version = '2.6.12';\n/* */\n// these are reserved for web because they are directly compiled away\n// during template compilation\n\nvar isReservedAttr = makeMap('style,class'); // attributes that should be using props for binding\n\nvar acceptValue = makeMap('input,textarea,option,select,progress');\n\nvar mustUseProp = function mustUseProp(tag, type, attr) {\n return attr === 'value' && acceptValue(tag) && type !== 'button' || attr === 'selected' && tag === 'option' || attr === 'checked' && tag === 'input' || attr === 'muted' && tag === 'video';\n};\n\nvar isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');\nvar isValidContentEditableValue = makeMap('events,caret,typing,plaintext-only');\n\nvar convertEnumeratedValue = function convertEnumeratedValue(key, value) {\n return isFalsyAttrValue(value) || value === 'false' ? 'false' // allow arbitrary string value for contenteditable\n : key === 'contenteditable' && isValidContentEditableValue(value) ? value : 'true';\n};\n\nvar isBooleanAttr = makeMap('allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' + 'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' + 'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' + 'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' + 'required,reversed,scoped,seamless,selected,sortable,translate,' + 'truespeed,typemustmatch,visible');\nvar xlinkNS = 'http://www.w3.org/1999/xlink';\n\nvar isXlink = function isXlink(name) {\n return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink';\n};\n\nvar getXlinkProp = function getXlinkProp(name) {\n return isXlink(name) ? name.slice(6, name.length) : '';\n};\n\nvar isFalsyAttrValue = function isFalsyAttrValue(val) {\n return val == null || val === false;\n};\n/* */\n\n\nfunction genClassForVnode(vnode) {\n var data = vnode.data;\n var parentNode = vnode;\n var childNode = vnode;\n\n while (isDef(childNode.componentInstance)) {\n childNode = childNode.componentInstance._vnode;\n\n if (childNode && childNode.data) {\n data = mergeClassData(childNode.data, data);\n }\n }\n\n while (isDef(parentNode = parentNode.parent)) {\n if (parentNode && parentNode.data) {\n data = mergeClassData(data, parentNode.data);\n }\n }\n\n return renderClass(data.staticClass, data.class);\n}\n\nfunction mergeClassData(child, parent) {\n return {\n staticClass: concat(child.staticClass, parent.staticClass),\n class: isDef(child.class) ? [child.class, parent.class] : parent.class\n };\n}\n\nfunction renderClass(staticClass, dynamicClass) {\n if (isDef(staticClass) || isDef(dynamicClass)) {\n return concat(staticClass, stringifyClass(dynamicClass));\n }\n /* istanbul ignore next */\n\n\n return '';\n}\n\nfunction concat(a, b) {\n return a ? b ? a + ' ' + b : a : b || '';\n}\n\nfunction stringifyClass(value) {\n if (Array.isArray(value)) {\n return stringifyArray(value);\n }\n\n if (isObject(value)) {\n return stringifyObject(value);\n }\n\n if (typeof value === 'string') {\n return value;\n }\n /* istanbul ignore next */\n\n\n return '';\n}\n\nfunction stringifyArray(value) {\n var res = '';\n var stringified;\n\n for (var i = 0, l = value.length; i < l; i++) {\n if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {\n if (res) {\n res += ' ';\n }\n\n res += stringified;\n }\n }\n\n return res;\n}\n\nfunction stringifyObject(value) {\n var res = '';\n\n for (var key in value) {\n if (value[key]) {\n if (res) {\n res += ' ';\n }\n\n res += key;\n }\n }\n\n return res;\n}\n/* */\n\n\nvar namespaceMap = {\n svg: 'http://www.w3.org/2000/svg',\n math: 'http://www.w3.org/1998/Math/MathML'\n};\nvar isHTMLTag = makeMap('html,body,base,head,link,meta,style,title,' + 'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' + 'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' + 'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' + 's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' + 'embed,object,param,source,canvas,script,noscript,del,ins,' + 'caption,col,colgroup,table,thead,tbody,td,th,tr,' + 'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' + 'output,progress,select,textarea,' + 'details,dialog,menu,menuitem,summary,' + 'content,element,shadow,template,blockquote,iframe,tfoot'); // this map is intentionally selective, only covering SVG elements that may\n// contain child elements.\n\nvar isSVG = makeMap('svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' + 'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' + 'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view', true);\n\nvar isReservedTag = function isReservedTag(tag) {\n return isHTMLTag(tag) || isSVG(tag);\n};\n\nfunction getTagNamespace(tag) {\n if (isSVG(tag)) {\n return 'svg';\n } // basic support for MathML\n // note it doesn't support other MathML elements being component roots\n\n\n if (tag === 'math') {\n return 'math';\n }\n}\n\nvar unknownElementCache = Object.create(null);\n\nfunction isUnknownElement(tag) {\n /* istanbul ignore if */\n if (!inBrowser) {\n return true;\n }\n\n if (isReservedTag(tag)) {\n return false;\n }\n\n tag = tag.toLowerCase();\n /* istanbul ignore if */\n\n if (unknownElementCache[tag] != null) {\n return unknownElementCache[tag];\n }\n\n var el = document.createElement(tag);\n\n if (tag.indexOf('-') > -1) {\n // http://stackoverflow.com/a/28210364/1070244\n return unknownElementCache[tag] = el.constructor === window.HTMLUnknownElement || el.constructor === window.HTMLElement;\n } else {\n return unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString());\n }\n}\n\nvar isTextInputType = makeMap('text,number,password,search,email,tel,url');\n/* */\n\n/**\n * Query an element selector if it's not an element already.\n */\n\nfunction query(el) {\n if (typeof el === 'string') {\n var selected = document.querySelector(el);\n\n if (!selected) {\n false && 0;\n return document.createElement('div');\n }\n\n return selected;\n } else {\n return el;\n }\n}\n/* */\n\n\nfunction createElement$1(tagName, vnode) {\n var elm = document.createElement(tagName);\n\n if (tagName !== 'select') {\n return elm;\n } // false or null will remove the attribute but undefined will not\n\n\n if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {\n elm.setAttribute('multiple', 'multiple');\n }\n\n return elm;\n}\n\nfunction createElementNS(namespace, tagName) {\n return document.createElementNS(namespaceMap[namespace], tagName);\n}\n\nfunction createTextNode(text) {\n return document.createTextNode(text);\n}\n\nfunction createComment(text) {\n return document.createComment(text);\n}\n\nfunction insertBefore(parentNode, newNode, referenceNode) {\n parentNode.insertBefore(newNode, referenceNode);\n}\n\nfunction removeChild(node, child) {\n node.removeChild(child);\n}\n\nfunction appendChild(node, child) {\n node.appendChild(child);\n}\n\nfunction parentNode(node) {\n return node.parentNode;\n}\n\nfunction nextSibling(node) {\n return node.nextSibling;\n}\n\nfunction tagName(node) {\n return node.tagName;\n}\n\nfunction setTextContent(node, text) {\n node.textContent = text;\n}\n\nfunction setStyleScope(node, scopeId) {\n node.setAttribute(scopeId, '');\n}\n\nvar nodeOps = /*#__PURE__*/Object.freeze({\n createElement: createElement$1,\n createElementNS: createElementNS,\n createTextNode: createTextNode,\n createComment: createComment,\n insertBefore: insertBefore,\n removeChild: removeChild,\n appendChild: appendChild,\n parentNode: parentNode,\n nextSibling: nextSibling,\n tagName: tagName,\n setTextContent: setTextContent,\n setStyleScope: setStyleScope\n});\n/* */\n\nvar ref = {\n create: function create(_, vnode) {\n registerRef(vnode);\n },\n update: function update(oldVnode, vnode) {\n if (oldVnode.data.ref !== vnode.data.ref) {\n registerRef(oldVnode, true);\n registerRef(vnode);\n }\n },\n destroy: function destroy(vnode) {\n registerRef(vnode, true);\n }\n};\n\nfunction registerRef(vnode, isRemoval) {\n var key = vnode.data.ref;\n\n if (!isDef(key)) {\n return;\n }\n\n var vm = vnode.context;\n var ref = vnode.componentInstance || vnode.elm;\n var refs = vm.$refs;\n\n if (isRemoval) {\n if (Array.isArray(refs[key])) {\n remove(refs[key], ref);\n } else if (refs[key] === ref) {\n refs[key] = undefined;\n }\n } else {\n if (vnode.data.refInFor) {\n if (!Array.isArray(refs[key])) {\n refs[key] = [ref];\n } else if (refs[key].indexOf(ref) < 0) {\n // $flow-disable-line\n refs[key].push(ref);\n }\n } else {\n refs[key] = ref;\n }\n }\n}\n/**\n * Virtual DOM patching algorithm based on Snabbdom by\n * Simon Friis Vindum (@paldepind)\n * Licensed under the MIT License\n * https://github.com/paldepind/snabbdom/blob/master/LICENSE\n *\n * modified by Evan You (@yyx990803)\n *\n * Not type-checking this because this file is perf-critical and the cost\n * of making flow understand it is not worth it.\n */\n\n\nvar emptyNode = new VNode('', {}, []);\nvar hooks = ['create', 'activate', 'update', 'remove', 'destroy'];\n\nfunction sameVnode(a, b) {\n return a.key === b.key && (a.tag === b.tag && a.isComment === b.isComment && isDef(a.data) === isDef(b.data) && sameInputType(a, b) || isTrue(a.isAsyncPlaceholder) && a.asyncFactory === b.asyncFactory && isUndef(b.asyncFactory.error));\n}\n\nfunction sameInputType(a, b) {\n if (a.tag !== 'input') {\n return true;\n }\n\n var i;\n var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;\n var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;\n return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB);\n}\n\nfunction createKeyToOldIdx(children, beginIdx, endIdx) {\n var i, key;\n var map = {};\n\n for (i = beginIdx; i <= endIdx; ++i) {\n key = children[i].key;\n\n if (isDef(key)) {\n map[key] = i;\n }\n }\n\n return map;\n}\n\nfunction createPatchFunction(backend) {\n var i, j;\n var cbs = {};\n var modules = backend.modules;\n var nodeOps = backend.nodeOps;\n\n for (i = 0; i < hooks.length; ++i) {\n cbs[hooks[i]] = [];\n\n for (j = 0; j < modules.length; ++j) {\n if (isDef(modules[j][hooks[i]])) {\n cbs[hooks[i]].push(modules[j][hooks[i]]);\n }\n }\n }\n\n function emptyNodeAt(elm) {\n return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm);\n }\n\n function createRmCb(childElm, listeners) {\n function remove$$1() {\n if (--remove$$1.listeners === 0) {\n removeNode(childElm);\n }\n }\n\n remove$$1.listeners = listeners;\n return remove$$1;\n }\n\n function removeNode(el) {\n var parent = nodeOps.parentNode(el); // element may have already been removed due to v-html / v-text\n\n if (isDef(parent)) {\n nodeOps.removeChild(parent, el);\n }\n }\n\n function isUnknownElement$$1(vnode, inVPre) {\n return !inVPre && !vnode.ns && !(config.ignoredElements.length && config.ignoredElements.some(function (ignore) {\n return isRegExp(ignore) ? ignore.test(vnode.tag) : ignore === vnode.tag;\n })) && config.isUnknownElement(vnode.tag);\n }\n\n var creatingElmInVPre = 0;\n\n function createElm(vnode, insertedVnodeQueue, parentElm, refElm, nested, ownerArray, index) {\n if (isDef(vnode.elm) && isDef(ownerArray)) {\n // This vnode was used in a previous render!\n // now it's used as a new node, overwriting its elm would cause\n // potential patch errors down the road when it's used as an insertion\n // reference node. Instead, we clone the node on-demand before creating\n // associated DOM element for it.\n vnode = ownerArray[index] = cloneVNode(vnode);\n }\n\n vnode.isRootInsert = !nested; // for transition enter check\n\n if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {\n return;\n }\n\n var data = vnode.data;\n var children = vnode.children;\n var tag = vnode.tag;\n\n if (isDef(tag)) {\n if (false) {}\n\n vnode.elm = vnode.ns ? nodeOps.createElementNS(vnode.ns, tag) : nodeOps.createElement(tag, vnode);\n setScope(vnode);\n /* istanbul ignore if */\n\n {\n createChildren(vnode, children, insertedVnodeQueue);\n\n if (isDef(data)) {\n invokeCreateHooks(vnode, insertedVnodeQueue);\n }\n\n insert(parentElm, vnode.elm, refElm);\n }\n\n if (false) {}\n } else if (isTrue(vnode.isComment)) {\n vnode.elm = nodeOps.createComment(vnode.text);\n insert(parentElm, vnode.elm, refElm);\n } else {\n vnode.elm = nodeOps.createTextNode(vnode.text);\n insert(parentElm, vnode.elm, refElm);\n }\n }\n\n function createComponent(vnode, insertedVnodeQueue, parentElm, refElm) {\n var i = vnode.data;\n\n if (isDef(i)) {\n var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;\n\n if (isDef(i = i.hook) && isDef(i = i.init)) {\n i(vnode, false\n /* hydrating */\n );\n } // after calling the init hook, if the vnode is a child component\n // it should've created a child instance and mounted it. the child\n // component also has set the placeholder vnode's elm.\n // in that case we can just return the element and be done.\n\n\n if (isDef(vnode.componentInstance)) {\n initComponent(vnode, insertedVnodeQueue);\n insert(parentElm, vnode.elm, refElm);\n\n if (isTrue(isReactivated)) {\n reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);\n }\n\n return true;\n }\n }\n }\n\n function initComponent(vnode, insertedVnodeQueue) {\n if (isDef(vnode.data.pendingInsert)) {\n insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);\n vnode.data.pendingInsert = null;\n }\n\n vnode.elm = vnode.componentInstance.$el;\n\n if (isPatchable(vnode)) {\n invokeCreateHooks(vnode, insertedVnodeQueue);\n setScope(vnode);\n } else {\n // empty component root.\n // skip all element-related modules except for ref (#3455)\n registerRef(vnode); // make sure to invoke the insert hook\n\n insertedVnodeQueue.push(vnode);\n }\n }\n\n function reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm) {\n var i; // hack for #4339: a reactivated component with inner transition\n // does not trigger because the inner node's created hooks are not called\n // again. It's not ideal to involve module-specific logic in here but\n // there doesn't seem to be a better way to do it.\n\n var innerNode = vnode;\n\n while (innerNode.componentInstance) {\n innerNode = innerNode.componentInstance._vnode;\n\n if (isDef(i = innerNode.data) && isDef(i = i.transition)) {\n for (i = 0; i < cbs.activate.length; ++i) {\n cbs.activate[i](emptyNode, innerNode);\n }\n\n insertedVnodeQueue.push(innerNode);\n break;\n }\n } // unlike a newly created component,\n // a reactivated keep-alive component doesn't insert itself\n\n\n insert(parentElm, vnode.elm, refElm);\n }\n\n function insert(parent, elm, ref$$1) {\n if (isDef(parent)) {\n if (isDef(ref$$1)) {\n if (nodeOps.parentNode(ref$$1) === parent) {\n nodeOps.insertBefore(parent, elm, ref$$1);\n }\n } else {\n nodeOps.appendChild(parent, elm);\n }\n }\n }\n\n function createChildren(vnode, children, insertedVnodeQueue) {\n if (Array.isArray(children)) {\n if (false) {}\n\n for (var i = 0; i < children.length; ++i) {\n createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);\n }\n } else if (isPrimitive(vnode.text)) {\n nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));\n }\n }\n\n function isPatchable(vnode) {\n while (vnode.componentInstance) {\n vnode = vnode.componentInstance._vnode;\n }\n\n return isDef(vnode.tag);\n }\n\n function invokeCreateHooks(vnode, insertedVnodeQueue) {\n for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n cbs.create[i$1](emptyNode, vnode);\n }\n\n i = vnode.data.hook; // Reuse variable\n\n if (isDef(i)) {\n if (isDef(i.create)) {\n i.create(emptyNode, vnode);\n }\n\n if (isDef(i.insert)) {\n insertedVnodeQueue.push(vnode);\n }\n }\n } // set scope id attribute for scoped CSS.\n // this is implemented as a special case to avoid the overhead\n // of going through the normal attribute patching process.\n\n\n function setScope(vnode) {\n var i;\n\n if (isDef(i = vnode.fnScopeId)) {\n nodeOps.setStyleScope(vnode.elm, i);\n } else {\n var ancestor = vnode;\n\n while (ancestor) {\n if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {\n nodeOps.setStyleScope(vnode.elm, i);\n }\n\n ancestor = ancestor.parent;\n }\n } // for slot content they should also get the scopeId from the host instance.\n\n\n if (isDef(i = activeInstance) && i !== vnode.context && i !== vnode.fnContext && isDef(i = i.$options._scopeId)) {\n nodeOps.setStyleScope(vnode.elm, i);\n }\n }\n\n function addVnodes(parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {\n for (; startIdx <= endIdx; ++startIdx) {\n createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx);\n }\n }\n\n function invokeDestroyHook(vnode) {\n var i, j;\n var data = vnode.data;\n\n if (isDef(data)) {\n if (isDef(i = data.hook) && isDef(i = i.destroy)) {\n i(vnode);\n }\n\n for (i = 0; i < cbs.destroy.length; ++i) {\n cbs.destroy[i](vnode);\n }\n }\n\n if (isDef(i = vnode.children)) {\n for (j = 0; j < vnode.children.length; ++j) {\n invokeDestroyHook(vnode.children[j]);\n }\n }\n }\n\n function removeVnodes(vnodes, startIdx, endIdx) {\n for (; startIdx <= endIdx; ++startIdx) {\n var ch = vnodes[startIdx];\n\n if (isDef(ch)) {\n if (isDef(ch.tag)) {\n removeAndInvokeRemoveHook(ch);\n invokeDestroyHook(ch);\n } else {\n // Text node\n removeNode(ch.elm);\n }\n }\n }\n }\n\n function removeAndInvokeRemoveHook(vnode, rm) {\n if (isDef(rm) || isDef(vnode.data)) {\n var i;\n var listeners = cbs.remove.length + 1;\n\n if (isDef(rm)) {\n // we have a recursively passed down rm callback\n // increase the listeners count\n rm.listeners += listeners;\n } else {\n // directly removing\n rm = createRmCb(vnode.elm, listeners);\n } // recursively invoke hooks on child component root node\n\n\n if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {\n removeAndInvokeRemoveHook(i, rm);\n }\n\n for (i = 0; i < cbs.remove.length; ++i) {\n cbs.remove[i](vnode, rm);\n }\n\n if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {\n i(vnode, rm);\n } else {\n rm();\n }\n } else {\n removeNode(vnode.elm);\n }\n }\n\n function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {\n var oldStartIdx = 0;\n var newStartIdx = 0;\n var oldEndIdx = oldCh.length - 1;\n var oldStartVnode = oldCh[0];\n var oldEndVnode = oldCh[oldEndIdx];\n var newEndIdx = newCh.length - 1;\n var newStartVnode = newCh[0];\n var newEndVnode = newCh[newEndIdx];\n var oldKeyToIdx, idxInOld, vnodeToMove, refElm; // removeOnly is a special flag used only by <transition-group>\n // to ensure removed elements stay in correct relative positions\n // during leaving transitions\n\n var canMove = !removeOnly;\n\n if (false) {}\n\n while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n if (isUndef(oldStartVnode)) {\n oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left\n } else if (isUndef(oldEndVnode)) {\n oldEndVnode = oldCh[--oldEndIdx];\n } else if (sameVnode(oldStartVnode, newStartVnode)) {\n patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n oldStartVnode = oldCh[++oldStartIdx];\n newStartVnode = newCh[++newStartIdx];\n } else if (sameVnode(oldEndVnode, newEndVnode)) {\n patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n oldEndVnode = oldCh[--oldEndIdx];\n newEndVnode = newCh[--newEndIdx];\n } else if (sameVnode(oldStartVnode, newEndVnode)) {\n // Vnode moved right\n patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));\n oldStartVnode = oldCh[++oldStartIdx];\n newEndVnode = newCh[--newEndIdx];\n } else if (sameVnode(oldEndVnode, newStartVnode)) {\n // Vnode moved left\n patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n oldEndVnode = oldCh[--oldEndIdx];\n newStartVnode = newCh[++newStartIdx];\n } else {\n if (isUndef(oldKeyToIdx)) {\n oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);\n }\n\n idxInOld = isDef(newStartVnode.key) ? oldKeyToIdx[newStartVnode.key] : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);\n\n if (isUndef(idxInOld)) {\n // New element\n createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n } else {\n vnodeToMove = oldCh[idxInOld];\n\n if (sameVnode(vnodeToMove, newStartVnode)) {\n patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n oldCh[idxInOld] = undefined;\n canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);\n } else {\n // same key but different element. treat as new element\n createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n }\n }\n\n newStartVnode = newCh[++newStartIdx];\n }\n }\n\n if (oldStartIdx > oldEndIdx) {\n refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;\n addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\n } else if (newStartIdx > newEndIdx) {\n removeVnodes(oldCh, oldStartIdx, oldEndIdx);\n }\n }\n\n function checkDuplicateKeys(children) {\n var seenKeys = {};\n\n for (var i = 0; i < children.length; i++) {\n var vnode = children[i];\n var key = vnode.key;\n\n if (isDef(key)) {\n if (seenKeys[key]) {\n warn(\"Duplicate keys detected: '\" + key + \"'. This may cause an update error.\", vnode.context);\n } else {\n seenKeys[key] = true;\n }\n }\n }\n }\n\n function findIdxInOld(node, oldCh, start, end) {\n for (var i = start; i < end; i++) {\n var c = oldCh[i];\n\n if (isDef(c) && sameVnode(node, c)) {\n return i;\n }\n }\n }\n\n function patchVnode(oldVnode, vnode, insertedVnodeQueue, ownerArray, index, removeOnly) {\n if (oldVnode === vnode) {\n return;\n }\n\n if (isDef(vnode.elm) && isDef(ownerArray)) {\n // clone reused vnode\n vnode = ownerArray[index] = cloneVNode(vnode);\n }\n\n var elm = vnode.elm = oldVnode.elm;\n\n if (isTrue(oldVnode.isAsyncPlaceholder)) {\n if (isDef(vnode.asyncFactory.resolved)) {\n hydrate(oldVnode.elm, vnode, insertedVnodeQueue);\n } else {\n vnode.isAsyncPlaceholder = true;\n }\n\n return;\n } // reuse element for static trees.\n // note we only do this if the vnode is cloned -\n // if the new node is not cloned it means the render functions have been\n // reset by the hot-reload-api and we need to do a proper re-render.\n\n\n if (isTrue(vnode.isStatic) && isTrue(oldVnode.isStatic) && vnode.key === oldVnode.key && (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))) {\n vnode.componentInstance = oldVnode.componentInstance;\n return;\n }\n\n var i;\n var data = vnode.data;\n\n if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {\n i(oldVnode, vnode);\n }\n\n var oldCh = oldVnode.children;\n var ch = vnode.children;\n\n if (isDef(data) && isPatchable(vnode)) {\n for (i = 0; i < cbs.update.length; ++i) {\n cbs.update[i](oldVnode, vnode);\n }\n\n if (isDef(i = data.hook) && isDef(i = i.update)) {\n i(oldVnode, vnode);\n }\n }\n\n if (isUndef(vnode.text)) {\n if (isDef(oldCh) && isDef(ch)) {\n if (oldCh !== ch) {\n updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly);\n }\n } else if (isDef(ch)) {\n if (false) {}\n\n if (isDef(oldVnode.text)) {\n nodeOps.setTextContent(elm, '');\n }\n\n addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\n } else if (isDef(oldCh)) {\n removeVnodes(oldCh, 0, oldCh.length - 1);\n } else if (isDef(oldVnode.text)) {\n nodeOps.setTextContent(elm, '');\n }\n } else if (oldVnode.text !== vnode.text) {\n nodeOps.setTextContent(elm, vnode.text);\n }\n\n if (isDef(data)) {\n if (isDef(i = data.hook) && isDef(i = i.postpatch)) {\n i(oldVnode, vnode);\n }\n }\n }\n\n function invokeInsertHook(vnode, queue, initial) {\n // delay insert hooks for component root nodes, invoke them after the\n // element is really inserted\n if (isTrue(initial) && isDef(vnode.parent)) {\n vnode.parent.data.pendingInsert = queue;\n } else {\n for (var i = 0; i < queue.length; ++i) {\n queue[i].data.hook.insert(queue[i]);\n }\n }\n }\n\n var hydrationBailed = false; // list of modules that can skip create hook during hydration because they\n // are already rendered on the client or has no need for initialization\n // Note: style is excluded because it relies on initial clone for future\n // deep updates (#7063).\n\n var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key'); // Note: this is a browser-only function so we can assume elms are DOM nodes.\n\n function hydrate(elm, vnode, insertedVnodeQueue, inVPre) {\n var i;\n var tag = vnode.tag;\n var data = vnode.data;\n var children = vnode.children;\n inVPre = inVPre || data && data.pre;\n vnode.elm = elm;\n\n if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {\n vnode.isAsyncPlaceholder = true;\n return true;\n } // assert node match\n\n\n if (false) {}\n\n if (isDef(data)) {\n if (isDef(i = data.hook) && isDef(i = i.init)) {\n i(vnode, true\n /* hydrating */\n );\n }\n\n if (isDef(i = vnode.componentInstance)) {\n // child component. it should have hydrated its own tree.\n initComponent(vnode, insertedVnodeQueue);\n return true;\n }\n }\n\n if (isDef(tag)) {\n if (isDef(children)) {\n // empty element, allow client to pick up and populate children\n if (!elm.hasChildNodes()) {\n createChildren(vnode, children, insertedVnodeQueue);\n } else {\n // v-html and domProps: innerHTML\n if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {\n if (i !== elm.innerHTML) {\n /* istanbul ignore if */\n if (false) {}\n\n return false;\n }\n } else {\n // iterate and compare children lists\n var childrenMatch = true;\n var childNode = elm.firstChild;\n\n for (var i$1 = 0; i$1 < children.length; i$1++) {\n if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {\n childrenMatch = false;\n break;\n }\n\n childNode = childNode.nextSibling;\n } // if childNode is not null, it means the actual childNodes list is\n // longer than the virtual children list.\n\n\n if (!childrenMatch || childNode) {\n /* istanbul ignore if */\n if (false) {}\n\n return false;\n }\n }\n }\n }\n\n if (isDef(data)) {\n var fullInvoke = false;\n\n for (var key in data) {\n if (!isRenderedModule(key)) {\n fullInvoke = true;\n invokeCreateHooks(vnode, insertedVnodeQueue);\n break;\n }\n }\n\n if (!fullInvoke && data['class']) {\n // ensure collecting deps for deep class bindings for future updates\n traverse(data['class']);\n }\n }\n } else if (elm.data !== vnode.text) {\n elm.data = vnode.text;\n }\n\n return true;\n }\n\n function assertNodeMatch(node, vnode, inVPre) {\n if (isDef(vnode.tag)) {\n return vnode.tag.indexOf('vue-component') === 0 || !isUnknownElement$$1(vnode, inVPre) && vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase());\n } else {\n return node.nodeType === (vnode.isComment ? 8 : 3);\n }\n }\n\n return function patch(oldVnode, vnode, hydrating, removeOnly) {\n if (isUndef(vnode)) {\n if (isDef(oldVnode)) {\n invokeDestroyHook(oldVnode);\n }\n\n return;\n }\n\n var isInitialPatch = false;\n var insertedVnodeQueue = [];\n\n if (isUndef(oldVnode)) {\n // empty mount (likely as component), create new root element\n isInitialPatch = true;\n createElm(vnode, insertedVnodeQueue);\n } else {\n var isRealElement = isDef(oldVnode.nodeType);\n\n if (!isRealElement && sameVnode(oldVnode, vnode)) {\n // patch existing root node\n patchVnode(oldVnode, vnode, insertedVnodeQueue, null, null, removeOnly);\n } else {\n if (isRealElement) {\n // mounting to a real element\n // check if this is server-rendered content and if we can perform\n // a successful hydration.\n if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {\n oldVnode.removeAttribute(SSR_ATTR);\n hydrating = true;\n }\n\n if (isTrue(hydrating)) {\n if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {\n invokeInsertHook(vnode, insertedVnodeQueue, true);\n return oldVnode;\n } else if (false) {}\n } // either not server-rendered, or hydration failed.\n // create an empty node and replace it\n\n\n oldVnode = emptyNodeAt(oldVnode);\n } // replacing existing element\n\n\n var oldElm = oldVnode.elm;\n var parentElm = nodeOps.parentNode(oldElm); // create new node\n\n createElm(vnode, insertedVnodeQueue, // extremely rare edge case: do not insert if old element is in a\n // leaving transition. Only happens when combining transition +\n // keep-alive + HOCs. (#4590)\n oldElm._leaveCb ? null : parentElm, nodeOps.nextSibling(oldElm)); // update parent placeholder node element, recursively\n\n if (isDef(vnode.parent)) {\n var ancestor = vnode.parent;\n var patchable = isPatchable(vnode);\n\n while (ancestor) {\n for (var i = 0; i < cbs.destroy.length; ++i) {\n cbs.destroy[i](ancestor);\n }\n\n ancestor.elm = vnode.elm;\n\n if (patchable) {\n for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n cbs.create[i$1](emptyNode, ancestor);\n } // #6513\n // invoke insert hooks that may have been merged by create hooks.\n // e.g. for directives that uses the \"inserted\" hook.\n\n\n var insert = ancestor.data.hook.insert;\n\n if (insert.merged) {\n // start at index 1 to avoid re-invoking component mounted hook\n for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {\n insert.fns[i$2]();\n }\n }\n } else {\n registerRef(ancestor);\n }\n\n ancestor = ancestor.parent;\n }\n } // destroy old node\n\n\n if (isDef(parentElm)) {\n removeVnodes([oldVnode], 0, 0);\n } else if (isDef(oldVnode.tag)) {\n invokeDestroyHook(oldVnode);\n }\n }\n }\n\n invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\n return vnode.elm;\n };\n}\n/* */\n\n\nvar directives = {\n create: updateDirectives,\n update: updateDirectives,\n destroy: function unbindDirectives(vnode) {\n updateDirectives(vnode, emptyNode);\n }\n};\n\nfunction updateDirectives(oldVnode, vnode) {\n if (oldVnode.data.directives || vnode.data.directives) {\n _update(oldVnode, vnode);\n }\n}\n\nfunction _update(oldVnode, vnode) {\n var isCreate = oldVnode === emptyNode;\n var isDestroy = vnode === emptyNode;\n var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\n var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\n var dirsWithInsert = [];\n var dirsWithPostpatch = [];\n var key, oldDir, dir;\n\n for (key in newDirs) {\n oldDir = oldDirs[key];\n dir = newDirs[key];\n\n if (!oldDir) {\n // new directive, bind\n callHook$1(dir, 'bind', vnode, oldVnode);\n\n if (dir.def && dir.def.inserted) {\n dirsWithInsert.push(dir);\n }\n } else {\n // existing directive, update\n dir.oldValue = oldDir.value;\n dir.oldArg = oldDir.arg;\n callHook$1(dir, 'update', vnode, oldVnode);\n\n if (dir.def && dir.def.componentUpdated) {\n dirsWithPostpatch.push(dir);\n }\n }\n }\n\n if (dirsWithInsert.length) {\n var callInsert = function callInsert() {\n for (var i = 0; i < dirsWithInsert.length; i++) {\n callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\n }\n };\n\n if (isCreate) {\n mergeVNodeHook(vnode, 'insert', callInsert);\n } else {\n callInsert();\n }\n }\n\n if (dirsWithPostpatch.length) {\n mergeVNodeHook(vnode, 'postpatch', function () {\n for (var i = 0; i < dirsWithPostpatch.length; i++) {\n callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\n }\n });\n }\n\n if (!isCreate) {\n for (key in oldDirs) {\n if (!newDirs[key]) {\n // no longer present, unbind\n callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);\n }\n }\n }\n}\n\nvar emptyModifiers = Object.create(null);\n\nfunction normalizeDirectives$1(dirs, vm) {\n var res = Object.create(null);\n\n if (!dirs) {\n // $flow-disable-line\n return res;\n }\n\n var i, dir;\n\n for (i = 0; i < dirs.length; i++) {\n dir = dirs[i];\n\n if (!dir.modifiers) {\n // $flow-disable-line\n dir.modifiers = emptyModifiers;\n }\n\n res[getRawDirName(dir)] = dir;\n dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\n } // $flow-disable-line\n\n\n return res;\n}\n\nfunction getRawDirName(dir) {\n return dir.rawName || dir.name + \".\" + Object.keys(dir.modifiers || {}).join('.');\n}\n\nfunction callHook$1(dir, hook, vnode, oldVnode, isDestroy) {\n var fn = dir.def && dir.def[hook];\n\n if (fn) {\n try {\n fn(vnode.elm, dir, vnode, oldVnode, isDestroy);\n } catch (e) {\n handleError(e, vnode.context, \"directive \" + dir.name + \" \" + hook + \" hook\");\n }\n }\n}\n\nvar baseModules = [ref, directives];\n/* */\n\nfunction updateAttrs(oldVnode, vnode) {\n var opts = vnode.componentOptions;\n\n if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {\n return;\n }\n\n if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {\n return;\n }\n\n var key, cur, old;\n var elm = vnode.elm;\n var oldAttrs = oldVnode.data.attrs || {};\n var attrs = vnode.data.attrs || {}; // clone observed objects, as the user probably wants to mutate it\n\n if (isDef(attrs.__ob__)) {\n attrs = vnode.data.attrs = extend({}, attrs);\n }\n\n for (key in attrs) {\n cur = attrs[key];\n old = oldAttrs[key];\n\n if (old !== cur) {\n setAttr(elm, key, cur);\n }\n } // #4391: in IE9, setting type can reset value for input[type=radio]\n // #6666: IE/Edge forces progress value down to 1 before setting a max\n\n /* istanbul ignore if */\n\n\n if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {\n setAttr(elm, 'value', attrs.value);\n }\n\n for (key in oldAttrs) {\n if (isUndef(attrs[key])) {\n if (isXlink(key)) {\n elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\n } else if (!isEnumeratedAttr(key)) {\n elm.removeAttribute(key);\n }\n }\n }\n}\n\nfunction setAttr(el, key, value) {\n if (el.tagName.indexOf('-') > -1) {\n baseSetAttr(el, key, value);\n } else if (isBooleanAttr(key)) {\n // set attribute for blank value\n // e.g. <option disabled>Select one</option>\n if (isFalsyAttrValue(value)) {\n el.removeAttribute(key);\n } else {\n // technically allowfullscreen is a boolean attribute for <iframe>,\n // but Flash expects a value of \"true\" when used on <embed> tag\n value = key === 'allowfullscreen' && el.tagName === 'EMBED' ? 'true' : key;\n el.setAttribute(key, value);\n }\n } else if (isEnumeratedAttr(key)) {\n el.setAttribute(key, convertEnumeratedValue(key, value));\n } else if (isXlink(key)) {\n if (isFalsyAttrValue(value)) {\n el.removeAttributeNS(xlinkNS, getXlinkProp(key));\n } else {\n el.setAttributeNS(xlinkNS, key, value);\n }\n } else {\n baseSetAttr(el, key, value);\n }\n}\n\nfunction baseSetAttr(el, key, value) {\n if (isFalsyAttrValue(value)) {\n el.removeAttribute(key);\n } else {\n // #7138: IE10 & 11 fires input event when setting placeholder on\n // <textarea>... block the first input event and remove the blocker\n // immediately.\n\n /* istanbul ignore if */\n if (isIE && !isIE9 && el.tagName === 'TEXTAREA' && key === 'placeholder' && value !== '' && !el.__ieph) {\n var blocker = function blocker(e) {\n e.stopImmediatePropagation();\n el.removeEventListener('input', blocker);\n };\n\n el.addEventListener('input', blocker); // $flow-disable-line\n\n el.__ieph = true;\n /* IE placeholder patched */\n }\n\n el.setAttribute(key, value);\n }\n}\n\nvar attrs = {\n create: updateAttrs,\n update: updateAttrs\n};\n/* */\n\nfunction updateClass(oldVnode, vnode) {\n var el = vnode.elm;\n var data = vnode.data;\n var oldData = oldVnode.data;\n\n if (isUndef(data.staticClass) && isUndef(data.class) && (isUndef(oldData) || isUndef(oldData.staticClass) && isUndef(oldData.class))) {\n return;\n }\n\n var cls = genClassForVnode(vnode); // handle transition classes\n\n var transitionClass = el._transitionClasses;\n\n if (isDef(transitionClass)) {\n cls = concat(cls, stringifyClass(transitionClass));\n } // set the class\n\n\n if (cls !== el._prevClass) {\n el.setAttribute('class', cls);\n el._prevClass = cls;\n }\n}\n\nvar klass = {\n create: updateClass,\n update: updateClass\n};\n/* */\n\n/* */\n\n/* */\n\n/* */\n// in some cases, the event used has to be determined at runtime\n// so we used some reserved tokens during compile.\n\nvar RANGE_TOKEN = '__r';\nvar CHECKBOX_RADIO_TOKEN = '__c';\n/* */\n// normalize v-model event tokens that can only be determined at runtime.\n// it's important to place the event as the first in the array because\n// the whole point is ensuring the v-model callback gets called before\n// user-attached handlers.\n\nfunction normalizeEvents(on) {\n /* istanbul ignore if */\n if (isDef(on[RANGE_TOKEN])) {\n // IE input[type=range] only supports `change` event\n var event = isIE ? 'change' : 'input';\n on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);\n delete on[RANGE_TOKEN];\n } // This was originally intended to fix #4521 but no longer necessary\n // after 2.5. Keeping it for backwards compat with generated code from < 2.4\n\n /* istanbul ignore if */\n\n\n if (isDef(on[CHECKBOX_RADIO_TOKEN])) {\n on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || []);\n delete on[CHECKBOX_RADIO_TOKEN];\n }\n}\n\nvar target$1;\n\nfunction createOnceHandler$1(event, handler, capture) {\n var _target = target$1; // save current target element in closure\n\n return function onceHandler() {\n var res = handler.apply(null, arguments);\n\n if (res !== null) {\n remove$2(event, onceHandler, capture, _target);\n }\n };\n} // #9446: Firefox <= 53 (in particular, ESR 52) has incorrect Event.timeStamp\n// implementation and does not fire microtasks in between event propagation, so\n// safe to exclude.\n\n\nvar useMicrotaskFix = isUsingMicroTask && !(isFF && Number(isFF[1]) <= 53);\n\nfunction add$1(name, handler, capture, passive) {\n // async edge case #6566: inner click event triggers patch, event handler\n // attached to outer element during patch, and triggered again. This\n // happens because browsers fire microtask ticks between event propagation.\n // the solution is simple: we save the timestamp when a handler is attached,\n // and the handler would only fire if the event passed to it was fired\n // AFTER it was attached.\n if (useMicrotaskFix) {\n var attachedTimestamp = currentFlushTimestamp;\n var original = handler;\n\n handler = original._wrapper = function (e) {\n if ( // no bubbling, should always fire.\n // this is just a safety net in case event.timeStamp is unreliable in\n // certain weird environments...\n e.target === e.currentTarget || // event is fired after handler attachment\n e.timeStamp >= attachedTimestamp || // bail for environments that have buggy event.timeStamp implementations\n // #9462 iOS 9 bug: event.timeStamp is 0 after history.pushState\n // #9681 QtWebEngine event.timeStamp is negative value\n e.timeStamp <= 0 || // #9448 bail if event is fired in another document in a multi-page\n // electron/nw.js app, since event.timeStamp will be using a different\n // starting reference\n e.target.ownerDocument !== document) {\n return original.apply(this, arguments);\n }\n };\n }\n\n target$1.addEventListener(name, handler, supportsPassive ? {\n capture: capture,\n passive: passive\n } : capture);\n}\n\nfunction remove$2(name, handler, capture, _target) {\n (_target || target$1).removeEventListener(name, handler._wrapper || handler, capture);\n}\n\nfunction updateDOMListeners(oldVnode, vnode) {\n if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {\n return;\n }\n\n var on = vnode.data.on || {};\n var oldOn = oldVnode.data.on || {};\n target$1 = vnode.elm;\n normalizeEvents(on);\n updateListeners(on, oldOn, add$1, remove$2, createOnceHandler$1, vnode.context);\n target$1 = undefined;\n}\n\nvar events = {\n create: updateDOMListeners,\n update: updateDOMListeners\n};\n/* */\n\nvar svgContainer;\n\nfunction updateDOMProps(oldVnode, vnode) {\n if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {\n return;\n }\n\n var key, cur;\n var elm = vnode.elm;\n var oldProps = oldVnode.data.domProps || {};\n var props = vnode.data.domProps || {}; // clone observed objects, as the user probably wants to mutate it\n\n if (isDef(props.__ob__)) {\n props = vnode.data.domProps = extend({}, props);\n }\n\n for (key in oldProps) {\n if (!(key in props)) {\n elm[key] = '';\n }\n }\n\n for (key in props) {\n cur = props[key]; // ignore children if the node has textContent or innerHTML,\n // as these will throw away existing DOM nodes and cause removal errors\n // on subsequent patches (#3360)\n\n if (key === 'textContent' || key === 'innerHTML') {\n if (vnode.children) {\n vnode.children.length = 0;\n }\n\n if (cur === oldProps[key]) {\n continue;\n } // #6601 work around Chrome version <= 55 bug where single textNode\n // replaced by innerHTML/textContent retains its parentNode property\n\n\n if (elm.childNodes.length === 1) {\n elm.removeChild(elm.childNodes[0]);\n }\n }\n\n if (key === 'value' && elm.tagName !== 'PROGRESS') {\n // store value as _value as well since\n // non-string values will be stringified\n elm._value = cur; // avoid resetting cursor position when value is the same\n\n var strCur = isUndef(cur) ? '' : String(cur);\n\n if (shouldUpdateValue(elm, strCur)) {\n elm.value = strCur;\n }\n } else if (key === 'innerHTML' && isSVG(elm.tagName) && isUndef(elm.innerHTML)) {\n // IE doesn't support innerHTML for SVG elements\n svgContainer = svgContainer || document.createElement('div');\n svgContainer.innerHTML = \"<svg>\" + cur + \"</svg>\";\n var svg = svgContainer.firstChild;\n\n while (elm.firstChild) {\n elm.removeChild(elm.firstChild);\n }\n\n while (svg.firstChild) {\n elm.appendChild(svg.firstChild);\n }\n } else if ( // skip the update if old and new VDOM state is the same.\n // `value` is handled separately because the DOM value may be temporarily\n // out of sync with VDOM state due to focus, composition and modifiers.\n // This #4521 by skipping the unnecessary `checked` update.\n cur !== oldProps[key]) {\n // some property updates can throw\n // e.g. `value` on <progress> w/ non-finite value\n try {\n elm[key] = cur;\n } catch (e) {}\n }\n }\n} // check platforms/web/util/attrs.js acceptValue\n\n\nfunction shouldUpdateValue(elm, checkVal) {\n return !elm.composing && (elm.tagName === 'OPTION' || isNotInFocusAndDirty(elm, checkVal) || isDirtyWithModifiers(elm, checkVal));\n}\n\nfunction isNotInFocusAndDirty(elm, checkVal) {\n // return true when textbox (.number and .trim) loses focus and its value is\n // not equal to the updated value\n var notInFocus = true; // #6157\n // work around IE bug when accessing document.activeElement in an iframe\n\n try {\n notInFocus = document.activeElement !== elm;\n } catch (e) {}\n\n return notInFocus && elm.value !== checkVal;\n}\n\nfunction isDirtyWithModifiers(elm, newVal) {\n var value = elm.value;\n var modifiers = elm._vModifiers; // injected by v-model runtime\n\n if (isDef(modifiers)) {\n if (modifiers.number) {\n return toNumber(value) !== toNumber(newVal);\n }\n\n if (modifiers.trim) {\n return value.trim() !== newVal.trim();\n }\n }\n\n return value !== newVal;\n}\n\nvar domProps = {\n create: updateDOMProps,\n update: updateDOMProps\n};\n/* */\n\nvar parseStyleText = cached(function (cssText) {\n var res = {};\n var listDelimiter = /;(?![^(]*\\))/g;\n var propertyDelimiter = /:(.+)/;\n cssText.split(listDelimiter).forEach(function (item) {\n if (item) {\n var tmp = item.split(propertyDelimiter);\n tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return res;\n}); // merge static and dynamic style data on the same vnode\n\nfunction normalizeStyleData(data) {\n var style = normalizeStyleBinding(data.style); // static style is pre-processed into an object during compilation\n // and is always a fresh object, so it's safe to merge into it\n\n return data.staticStyle ? extend(data.staticStyle, style) : style;\n} // normalize possible array / string values into Object\n\n\nfunction normalizeStyleBinding(bindingStyle) {\n if (Array.isArray(bindingStyle)) {\n return toObject(bindingStyle);\n }\n\n if (typeof bindingStyle === 'string') {\n return parseStyleText(bindingStyle);\n }\n\n return bindingStyle;\n}\n/**\n * parent component style should be after child's\n * so that parent component's style could override it\n */\n\n\nfunction getStyle(vnode, checkChild) {\n var res = {};\n var styleData;\n\n if (checkChild) {\n var childNode = vnode;\n\n while (childNode.componentInstance) {\n childNode = childNode.componentInstance._vnode;\n\n if (childNode && childNode.data && (styleData = normalizeStyleData(childNode.data))) {\n extend(res, styleData);\n }\n }\n }\n\n if (styleData = normalizeStyleData(vnode.data)) {\n extend(res, styleData);\n }\n\n var parentNode = vnode;\n\n while (parentNode = parentNode.parent) {\n if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {\n extend(res, styleData);\n }\n }\n\n return res;\n}\n/* */\n\n\nvar cssVarRE = /^--/;\nvar importantRE = /\\s*!important$/;\n\nvar setProp = function setProp(el, name, val) {\n /* istanbul ignore if */\n if (cssVarRE.test(name)) {\n el.style.setProperty(name, val);\n } else if (importantRE.test(val)) {\n el.style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important');\n } else {\n var normalizedName = normalize(name);\n\n if (Array.isArray(val)) {\n // Support values array created by autoprefixer, e.g.\n // {display: [\"-webkit-box\", \"-ms-flexbox\", \"flex\"]}\n // Set them one by one, and the browser will only set those it can recognize\n for (var i = 0, len = val.length; i < len; i++) {\n el.style[normalizedName] = val[i];\n }\n } else {\n el.style[normalizedName] = val;\n }\n }\n};\n\nvar vendorNames = ['Webkit', 'Moz', 'ms'];\nvar emptyStyle;\nvar normalize = cached(function (prop) {\n emptyStyle = emptyStyle || document.createElement('div').style;\n prop = camelize(prop);\n\n if (prop !== 'filter' && prop in emptyStyle) {\n return prop;\n }\n\n var capName = prop.charAt(0).toUpperCase() + prop.slice(1);\n\n for (var i = 0; i < vendorNames.length; i++) {\n var name = vendorNames[i] + capName;\n\n if (name in emptyStyle) {\n return name;\n }\n }\n});\n\nfunction updateStyle(oldVnode, vnode) {\n var data = vnode.data;\n var oldData = oldVnode.data;\n\n if (isUndef(data.staticStyle) && isUndef(data.style) && isUndef(oldData.staticStyle) && isUndef(oldData.style)) {\n return;\n }\n\n var cur, name;\n var el = vnode.elm;\n var oldStaticStyle = oldData.staticStyle;\n var oldStyleBinding = oldData.normalizedStyle || oldData.style || {}; // if static style exists, stylebinding already merged into it when doing normalizeStyleData\n\n var oldStyle = oldStaticStyle || oldStyleBinding;\n var style = normalizeStyleBinding(vnode.data.style) || {}; // store normalized style under a different key for next diff\n // make sure to clone it if it's reactive, since the user likely wants\n // to mutate it.\n\n vnode.data.normalizedStyle = isDef(style.__ob__) ? extend({}, style) : style;\n var newStyle = getStyle(vnode, true);\n\n for (name in oldStyle) {\n if (isUndef(newStyle[name])) {\n setProp(el, name, '');\n }\n }\n\n for (name in newStyle) {\n cur = newStyle[name];\n\n if (cur !== oldStyle[name]) {\n // ie9 setting to null has no effect, must use empty string\n setProp(el, name, cur == null ? '' : cur);\n }\n }\n}\n\nvar style = {\n create: updateStyle,\n update: updateStyle\n};\n/* */\n\nvar whitespaceRE = /\\s+/;\n/**\n * Add class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\n\nfunction addClass(el, cls) {\n /* istanbul ignore if */\n if (!cls || !(cls = cls.trim())) {\n return;\n }\n /* istanbul ignore else */\n\n\n if (el.classList) {\n if (cls.indexOf(' ') > -1) {\n cls.split(whitespaceRE).forEach(function (c) {\n return el.classList.add(c);\n });\n } else {\n el.classList.add(cls);\n }\n } else {\n var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n\n if (cur.indexOf(' ' + cls + ' ') < 0) {\n el.setAttribute('class', (cur + cls).trim());\n }\n }\n}\n/**\n * Remove class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\n\n\nfunction removeClass(el, cls) {\n /* istanbul ignore if */\n if (!cls || !(cls = cls.trim())) {\n return;\n }\n /* istanbul ignore else */\n\n\n if (el.classList) {\n if (cls.indexOf(' ') > -1) {\n cls.split(whitespaceRE).forEach(function (c) {\n return el.classList.remove(c);\n });\n } else {\n el.classList.remove(cls);\n }\n\n if (!el.classList.length) {\n el.removeAttribute('class');\n }\n } else {\n var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n var tar = ' ' + cls + ' ';\n\n while (cur.indexOf(tar) >= 0) {\n cur = cur.replace(tar, ' ');\n }\n\n cur = cur.trim();\n\n if (cur) {\n el.setAttribute('class', cur);\n } else {\n el.removeAttribute('class');\n }\n }\n}\n/* */\n\n\nfunction resolveTransition(def$$1) {\n if (!def$$1) {\n return;\n }\n /* istanbul ignore else */\n\n\n if (_typeof(def$$1) === 'object') {\n var res = {};\n\n if (def$$1.css !== false) {\n extend(res, autoCssTransition(def$$1.name || 'v'));\n }\n\n extend(res, def$$1);\n return res;\n } else if (typeof def$$1 === 'string') {\n return autoCssTransition(def$$1);\n }\n}\n\nvar autoCssTransition = cached(function (name) {\n return {\n enterClass: name + \"-enter\",\n enterToClass: name + \"-enter-to\",\n enterActiveClass: name + \"-enter-active\",\n leaveClass: name + \"-leave\",\n leaveToClass: name + \"-leave-to\",\n leaveActiveClass: name + \"-leave-active\"\n };\n});\nvar hasTransition = inBrowser && !isIE9;\nvar TRANSITION = 'transition';\nvar ANIMATION = 'animation'; // Transition property/event sniffing\n\nvar transitionProp = 'transition';\nvar transitionEndEvent = 'transitionend';\nvar animationProp = 'animation';\nvar animationEndEvent = 'animationend';\n\nif (hasTransition) {\n /* istanbul ignore if */\n if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) {\n transitionProp = 'WebkitTransition';\n transitionEndEvent = 'webkitTransitionEnd';\n }\n\n if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) {\n animationProp = 'WebkitAnimation';\n animationEndEvent = 'webkitAnimationEnd';\n }\n} // binding to window is necessary to make hot reload work in IE in strict mode\n\n\nvar raf = inBrowser ? window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : setTimeout :\n/* istanbul ignore next */\nfunction (fn) {\n return fn();\n};\n\nfunction nextFrame(fn) {\n raf(function () {\n raf(fn);\n });\n}\n\nfunction addTransitionClass(el, cls) {\n var transitionClasses = el._transitionClasses || (el._transitionClasses = []);\n\n if (transitionClasses.indexOf(cls) < 0) {\n transitionClasses.push(cls);\n addClass(el, cls);\n }\n}\n\nfunction removeTransitionClass(el, cls) {\n if (el._transitionClasses) {\n remove(el._transitionClasses, cls);\n }\n\n removeClass(el, cls);\n}\n\nfunction whenTransitionEnds(el, expectedType, cb) {\n var ref = getTransitionInfo(el, expectedType);\n var type = ref.type;\n var timeout = ref.timeout;\n var propCount = ref.propCount;\n\n if (!type) {\n return cb();\n }\n\n var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;\n var ended = 0;\n\n var end = function end() {\n el.removeEventListener(event, onEnd);\n cb();\n };\n\n var onEnd = function onEnd(e) {\n if (e.target === el) {\n if (++ended >= propCount) {\n end();\n }\n }\n };\n\n setTimeout(function () {\n if (ended < propCount) {\n end();\n }\n }, timeout + 1);\n el.addEventListener(event, onEnd);\n}\n\nvar transformRE = /\\b(transform|all)(,|$)/;\n\nfunction getTransitionInfo(el, expectedType) {\n var styles = window.getComputedStyle(el); // JSDOM may return undefined for transition properties\n\n var transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', ');\n var transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', ');\n var transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n var animationDelays = (styles[animationProp + 'Delay'] || '').split(', ');\n var animationDurations = (styles[animationProp + 'Duration'] || '').split(', ');\n var animationTimeout = getTimeout(animationDelays, animationDurations);\n var type;\n var timeout = 0;\n var propCount = 0;\n /* istanbul ignore if */\n\n if (expectedType === TRANSITION) {\n if (transitionTimeout > 0) {\n type = TRANSITION;\n timeout = transitionTimeout;\n propCount = transitionDurations.length;\n }\n } else if (expectedType === ANIMATION) {\n if (animationTimeout > 0) {\n type = ANIMATION;\n timeout = animationTimeout;\n propCount = animationDurations.length;\n }\n } else {\n timeout = Math.max(transitionTimeout, animationTimeout);\n type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null;\n propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0;\n }\n\n var hasTransform = type === TRANSITION && transformRE.test(styles[transitionProp + 'Property']);\n return {\n type: type,\n timeout: timeout,\n propCount: propCount,\n hasTransform: hasTransform\n };\n}\n\nfunction getTimeout(delays, durations) {\n /* istanbul ignore next */\n while (delays.length < durations.length) {\n delays = delays.concat(delays);\n }\n\n return Math.max.apply(null, durations.map(function (d, i) {\n return toMs(d) + toMs(delays[i]);\n }));\n} // Old versions of Chromium (below 61.0.3163.100) formats floating pointer numbers\n// in a locale-dependent way, using a comma instead of a dot.\n// If comma is not replaced with a dot, the input will be rounded down (i.e. acting\n// as a floor function) causing unexpected behaviors\n\n\nfunction toMs(s) {\n return Number(s.slice(0, -1).replace(',', '.')) * 1000;\n}\n/* */\n\n\nfunction enter(vnode, toggleDisplay) {\n var el = vnode.elm; // call leave callback now\n\n if (isDef(el._leaveCb)) {\n el._leaveCb.cancelled = true;\n\n el._leaveCb();\n }\n\n var data = resolveTransition(vnode.data.transition);\n\n if (isUndef(data)) {\n return;\n }\n /* istanbul ignore if */\n\n\n if (isDef(el._enterCb) || el.nodeType !== 1) {\n return;\n }\n\n var css = data.css;\n var type = data.type;\n var enterClass = data.enterClass;\n var enterToClass = data.enterToClass;\n var enterActiveClass = data.enterActiveClass;\n var appearClass = data.appearClass;\n var appearToClass = data.appearToClass;\n var appearActiveClass = data.appearActiveClass;\n var beforeEnter = data.beforeEnter;\n var enter = data.enter;\n var afterEnter = data.afterEnter;\n var enterCancelled = data.enterCancelled;\n var beforeAppear = data.beforeAppear;\n var appear = data.appear;\n var afterAppear = data.afterAppear;\n var appearCancelled = data.appearCancelled;\n var duration = data.duration; // activeInstance will always be the <transition> component managing this\n // transition. One edge case to check is when the <transition> is placed\n // as the root node of a child component. In that case we need to check\n // <transition>'s parent for appear check.\n\n var context = activeInstance;\n var transitionNode = activeInstance.$vnode;\n\n while (transitionNode && transitionNode.parent) {\n context = transitionNode.context;\n transitionNode = transitionNode.parent;\n }\n\n var isAppear = !context._isMounted || !vnode.isRootInsert;\n\n if (isAppear && !appear && appear !== '') {\n return;\n }\n\n var startClass = isAppear && appearClass ? appearClass : enterClass;\n var activeClass = isAppear && appearActiveClass ? appearActiveClass : enterActiveClass;\n var toClass = isAppear && appearToClass ? appearToClass : enterToClass;\n var beforeEnterHook = isAppear ? beforeAppear || beforeEnter : beforeEnter;\n var enterHook = isAppear ? typeof appear === 'function' ? appear : enter : enter;\n var afterEnterHook = isAppear ? afterAppear || afterEnter : afterEnter;\n var enterCancelledHook = isAppear ? appearCancelled || enterCancelled : enterCancelled;\n var explicitEnterDuration = toNumber(isObject(duration) ? duration.enter : duration);\n\n if (false) {}\n\n var expectsCSS = css !== false && !isIE9;\n var userWantsControl = getHookArgumentsLength(enterHook);\n var cb = el._enterCb = once(function () {\n if (expectsCSS) {\n removeTransitionClass(el, toClass);\n removeTransitionClass(el, activeClass);\n }\n\n if (cb.cancelled) {\n if (expectsCSS) {\n removeTransitionClass(el, startClass);\n }\n\n enterCancelledHook && enterCancelledHook(el);\n } else {\n afterEnterHook && afterEnterHook(el);\n }\n\n el._enterCb = null;\n });\n\n if (!vnode.data.show) {\n // remove pending leave element on enter by injecting an insert hook\n mergeVNodeHook(vnode, 'insert', function () {\n var parent = el.parentNode;\n var pendingNode = parent && parent._pending && parent._pending[vnode.key];\n\n if (pendingNode && pendingNode.tag === vnode.tag && pendingNode.elm._leaveCb) {\n pendingNode.elm._leaveCb();\n }\n\n enterHook && enterHook(el, cb);\n });\n } // start enter transition\n\n\n beforeEnterHook && beforeEnterHook(el);\n\n if (expectsCSS) {\n addTransitionClass(el, startClass);\n addTransitionClass(el, activeClass);\n nextFrame(function () {\n removeTransitionClass(el, startClass);\n\n if (!cb.cancelled) {\n addTransitionClass(el, toClass);\n\n if (!userWantsControl) {\n if (isValidDuration(explicitEnterDuration)) {\n setTimeout(cb, explicitEnterDuration);\n } else {\n whenTransitionEnds(el, type, cb);\n }\n }\n }\n });\n }\n\n if (vnode.data.show) {\n toggleDisplay && toggleDisplay();\n enterHook && enterHook(el, cb);\n }\n\n if (!expectsCSS && !userWantsControl) {\n cb();\n }\n}\n\nfunction leave(vnode, rm) {\n var el = vnode.elm; // call enter callback now\n\n if (isDef(el._enterCb)) {\n el._enterCb.cancelled = true;\n\n el._enterCb();\n }\n\n var data = resolveTransition(vnode.data.transition);\n\n if (isUndef(data) || el.nodeType !== 1) {\n return rm();\n }\n /* istanbul ignore if */\n\n\n if (isDef(el._leaveCb)) {\n return;\n }\n\n var css = data.css;\n var type = data.type;\n var leaveClass = data.leaveClass;\n var leaveToClass = data.leaveToClass;\n var leaveActiveClass = data.leaveActiveClass;\n var beforeLeave = data.beforeLeave;\n var leave = data.leave;\n var afterLeave = data.afterLeave;\n var leaveCancelled = data.leaveCancelled;\n var delayLeave = data.delayLeave;\n var duration = data.duration;\n var expectsCSS = css !== false && !isIE9;\n var userWantsControl = getHookArgumentsLength(leave);\n var explicitLeaveDuration = toNumber(isObject(duration) ? duration.leave : duration);\n\n if (false) {}\n\n var cb = el._leaveCb = once(function () {\n if (el.parentNode && el.parentNode._pending) {\n el.parentNode._pending[vnode.key] = null;\n }\n\n if (expectsCSS) {\n removeTransitionClass(el, leaveToClass);\n removeTransitionClass(el, leaveActiveClass);\n }\n\n if (cb.cancelled) {\n if (expectsCSS) {\n removeTransitionClass(el, leaveClass);\n }\n\n leaveCancelled && leaveCancelled(el);\n } else {\n rm();\n afterLeave && afterLeave(el);\n }\n\n el._leaveCb = null;\n });\n\n if (delayLeave) {\n delayLeave(performLeave);\n } else {\n performLeave();\n }\n\n function performLeave() {\n // the delayed leave may have already been cancelled\n if (cb.cancelled) {\n return;\n } // record leaving element\n\n\n if (!vnode.data.show && el.parentNode) {\n (el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode;\n }\n\n beforeLeave && beforeLeave(el);\n\n if (expectsCSS) {\n addTransitionClass(el, leaveClass);\n addTransitionClass(el, leaveActiveClass);\n nextFrame(function () {\n removeTransitionClass(el, leaveClass);\n\n if (!cb.cancelled) {\n addTransitionClass(el, leaveToClass);\n\n if (!userWantsControl) {\n if (isValidDuration(explicitLeaveDuration)) {\n setTimeout(cb, explicitLeaveDuration);\n } else {\n whenTransitionEnds(el, type, cb);\n }\n }\n }\n });\n }\n\n leave && leave(el, cb);\n\n if (!expectsCSS && !userWantsControl) {\n cb();\n }\n }\n} // only used in dev mode\n\n\nfunction checkDuration(val, name, vnode) {\n if (typeof val !== 'number') {\n warn(\"<transition> explicit \" + name + \" duration is not a valid number - \" + \"got \" + JSON.stringify(val) + \".\", vnode.context);\n } else if (isNaN(val)) {\n warn(\"<transition> explicit \" + name + \" duration is NaN - \" + 'the duration expression might be incorrect.', vnode.context);\n }\n}\n\nfunction isValidDuration(val) {\n return typeof val === 'number' && !isNaN(val);\n}\n/**\n * Normalize a transition hook's argument length. The hook may be:\n * - a merged hook (invoker) with the original in .fns\n * - a wrapped component method (check ._length)\n * - a plain function (.length)\n */\n\n\nfunction getHookArgumentsLength(fn) {\n if (isUndef(fn)) {\n return false;\n }\n\n var invokerFns = fn.fns;\n\n if (isDef(invokerFns)) {\n // invoker\n return getHookArgumentsLength(Array.isArray(invokerFns) ? invokerFns[0] : invokerFns);\n } else {\n return (fn._length || fn.length) > 1;\n }\n}\n\nfunction _enter(_, vnode) {\n if (vnode.data.show !== true) {\n enter(vnode);\n }\n}\n\nvar transition = inBrowser ? {\n create: _enter,\n activate: _enter,\n remove: function remove$$1(vnode, rm) {\n /* istanbul ignore else */\n if (vnode.data.show !== true) {\n leave(vnode, rm);\n } else {\n rm();\n }\n }\n} : {};\nvar platformModules = [attrs, klass, events, domProps, style, transition];\n/* */\n// the directive module should be applied last, after all\n// built-in modules have been applied.\n\nvar modules = platformModules.concat(baseModules);\nvar patch = createPatchFunction({\n nodeOps: nodeOps,\n modules: modules\n});\n/**\n * Not type checking this file because flow doesn't like attaching\n * properties to Elements.\n */\n\n/* istanbul ignore if */\n\nif (isIE9) {\n // http://www.matts411.com/post/internet-explorer-9-oninput/\n document.addEventListener('selectionchange', function () {\n var el = document.activeElement;\n\n if (el && el.vmodel) {\n trigger(el, 'input');\n }\n });\n}\n\nvar directive = {\n inserted: function inserted(el, binding, vnode, oldVnode) {\n if (vnode.tag === 'select') {\n // #6903\n if (oldVnode.elm && !oldVnode.elm._vOptions) {\n mergeVNodeHook(vnode, 'postpatch', function () {\n directive.componentUpdated(el, binding, vnode);\n });\n } else {\n setSelected(el, binding, vnode.context);\n }\n\n el._vOptions = [].map.call(el.options, getValue);\n } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {\n el._vModifiers = binding.modifiers;\n\n if (!binding.modifiers.lazy) {\n el.addEventListener('compositionstart', onCompositionStart);\n el.addEventListener('compositionend', onCompositionEnd); // Safari < 10.2 & UIWebView doesn't fire compositionend when\n // switching focus before confirming composition choice\n // this also fixes the issue where some browsers e.g. iOS Chrome\n // fires \"change\" instead of \"input\" on autocomplete.\n\n el.addEventListener('change', onCompositionEnd);\n /* istanbul ignore if */\n\n if (isIE9) {\n el.vmodel = true;\n }\n }\n }\n },\n componentUpdated: function componentUpdated(el, binding, vnode) {\n if (vnode.tag === 'select') {\n setSelected(el, binding, vnode.context); // in case the options rendered by v-for have changed,\n // it's possible that the value is out-of-sync with the rendered options.\n // detect such cases and filter out values that no longer has a matching\n // option in the DOM.\n\n var prevOptions = el._vOptions;\n var curOptions = el._vOptions = [].map.call(el.options, getValue);\n\n if (curOptions.some(function (o, i) {\n return !looseEqual(o, prevOptions[i]);\n })) {\n // trigger change event if\n // no matching option found for at least one value\n var needReset = el.multiple ? binding.value.some(function (v) {\n return hasNoMatchingOption(v, curOptions);\n }) : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions);\n\n if (needReset) {\n trigger(el, 'change');\n }\n }\n }\n }\n};\n\nfunction setSelected(el, binding, vm) {\n actuallySetSelected(el, binding, vm);\n /* istanbul ignore if */\n\n if (isIE || isEdge) {\n setTimeout(function () {\n actuallySetSelected(el, binding, vm);\n }, 0);\n }\n}\n\nfunction actuallySetSelected(el, binding, vm) {\n var value = binding.value;\n var isMultiple = el.multiple;\n\n if (isMultiple && !Array.isArray(value)) {\n false && 0;\n return;\n }\n\n var selected, option;\n\n for (var i = 0, l = el.options.length; i < l; i++) {\n option = el.options[i];\n\n if (isMultiple) {\n selected = looseIndexOf(value, getValue(option)) > -1;\n\n if (option.selected !== selected) {\n option.selected = selected;\n }\n } else {\n if (looseEqual(getValue(option), value)) {\n if (el.selectedIndex !== i) {\n el.selectedIndex = i;\n }\n\n return;\n }\n }\n }\n\n if (!isMultiple) {\n el.selectedIndex = -1;\n }\n}\n\nfunction hasNoMatchingOption(value, options) {\n return options.every(function (o) {\n return !looseEqual(o, value);\n });\n}\n\nfunction getValue(option) {\n return '_value' in option ? option._value : option.value;\n}\n\nfunction onCompositionStart(e) {\n e.target.composing = true;\n}\n\nfunction onCompositionEnd(e) {\n // prevent triggering an input event for no reason\n if (!e.target.composing) {\n return;\n }\n\n e.target.composing = false;\n trigger(e.target, 'input');\n}\n\nfunction trigger(el, type) {\n var e = document.createEvent('HTMLEvents');\n e.initEvent(type, true, true);\n el.dispatchEvent(e);\n}\n/* */\n// recursively search for possible transition defined inside the component root\n\n\nfunction locateNode(vnode) {\n return vnode.componentInstance && (!vnode.data || !vnode.data.transition) ? locateNode(vnode.componentInstance._vnode) : vnode;\n}\n\nvar show = {\n bind: function bind(el, ref, vnode) {\n var value = ref.value;\n vnode = locateNode(vnode);\n var transition$$1 = vnode.data && vnode.data.transition;\n var originalDisplay = el.__vOriginalDisplay = el.style.display === 'none' ? '' : el.style.display;\n\n if (value && transition$$1) {\n vnode.data.show = true;\n enter(vnode, function () {\n el.style.display = originalDisplay;\n });\n } else {\n el.style.display = value ? originalDisplay : 'none';\n }\n },\n update: function update(el, ref, vnode) {\n var value = ref.value;\n var oldValue = ref.oldValue;\n /* istanbul ignore if */\n\n if (!value === !oldValue) {\n return;\n }\n\n vnode = locateNode(vnode);\n var transition$$1 = vnode.data && vnode.data.transition;\n\n if (transition$$1) {\n vnode.data.show = true;\n\n if (value) {\n enter(vnode, function () {\n el.style.display = el.__vOriginalDisplay;\n });\n } else {\n leave(vnode, function () {\n el.style.display = 'none';\n });\n }\n } else {\n el.style.display = value ? el.__vOriginalDisplay : 'none';\n }\n },\n unbind: function unbind(el, binding, vnode, oldVnode, isDestroy) {\n if (!isDestroy) {\n el.style.display = el.__vOriginalDisplay;\n }\n }\n};\nvar platformDirectives = {\n model: directive,\n show: show\n};\n/* */\n\nvar transitionProps = {\n name: String,\n appear: Boolean,\n css: Boolean,\n mode: String,\n type: String,\n enterClass: String,\n leaveClass: String,\n enterToClass: String,\n leaveToClass: String,\n enterActiveClass: String,\n leaveActiveClass: String,\n appearClass: String,\n appearActiveClass: String,\n appearToClass: String,\n duration: [Number, String, Object]\n}; // in case the child is also an abstract component, e.g. <keep-alive>\n// we want to recursively retrieve the real component to be rendered\n\nfunction getRealChild(vnode) {\n var compOptions = vnode && vnode.componentOptions;\n\n if (compOptions && compOptions.Ctor.options.abstract) {\n return getRealChild(getFirstComponentChild(compOptions.children));\n } else {\n return vnode;\n }\n}\n\nfunction extractTransitionData(comp) {\n var data = {};\n var options = comp.$options; // props\n\n for (var key in options.propsData) {\n data[key] = comp[key];\n } // events.\n // extract listeners and pass them directly to the transition methods\n\n\n var listeners = options._parentListeners;\n\n for (var key$1 in listeners) {\n data[camelize(key$1)] = listeners[key$1];\n }\n\n return data;\n}\n\nfunction placeholder(h, rawChild) {\n if (/\\d-keep-alive$/.test(rawChild.tag)) {\n return h('keep-alive', {\n props: rawChild.componentOptions.propsData\n });\n }\n}\n\nfunction hasParentTransition(vnode) {\n while (vnode = vnode.parent) {\n if (vnode.data.transition) {\n return true;\n }\n }\n}\n\nfunction isSameChild(child, oldChild) {\n return oldChild.key === child.key && oldChild.tag === child.tag;\n}\n\nvar isNotTextNode = function isNotTextNode(c) {\n return c.tag || isAsyncPlaceholder(c);\n};\n\nvar isVShowDirective = function isVShowDirective(d) {\n return d.name === 'show';\n};\n\nvar Transition = {\n name: 'transition',\n props: transitionProps,\n abstract: true,\n render: function render(h) {\n var this$1 = this;\n var children = this.$slots.default;\n\n if (!children) {\n return;\n } // filter out text nodes (possible whitespaces)\n\n\n children = children.filter(isNotTextNode);\n /* istanbul ignore if */\n\n if (!children.length) {\n return;\n } // warn multiple elements\n\n\n if (false) {}\n\n var mode = this.mode; // warn invalid mode\n\n if (false) {}\n\n var rawChild = children[0]; // if this is a component root node and the component's\n // parent container node also has transition, skip.\n\n if (hasParentTransition(this.$vnode)) {\n return rawChild;\n } // apply transition data to child\n // use getRealChild() to ignore abstract components e.g. keep-alive\n\n\n var child = getRealChild(rawChild);\n /* istanbul ignore if */\n\n if (!child) {\n return rawChild;\n }\n\n if (this._leaving) {\n return placeholder(h, rawChild);\n } // ensure a key that is unique to the vnode type and to this transition\n // component instance. This key will be used to remove pending leaving nodes\n // during entering.\n\n\n var id = \"__transition-\" + this._uid + \"-\";\n child.key = child.key == null ? child.isComment ? id + 'comment' : id + child.tag : isPrimitive(child.key) ? String(child.key).indexOf(id) === 0 ? child.key : id + child.key : child.key;\n var data = (child.data || (child.data = {})).transition = extractTransitionData(this);\n var oldRawChild = this._vnode;\n var oldChild = getRealChild(oldRawChild); // mark v-show\n // so that the transition module can hand over the control to the directive\n\n if (child.data.directives && child.data.directives.some(isVShowDirective)) {\n child.data.show = true;\n }\n\n if (oldChild && oldChild.data && !isSameChild(child, oldChild) && !isAsyncPlaceholder(oldChild) && // #6687 component root is a comment node\n !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)) {\n // replace old child transition data with fresh one\n // important for dynamic transitions!\n var oldData = oldChild.data.transition = extend({}, data); // handle transition mode\n\n if (mode === 'out-in') {\n // return placeholder node and queue update when leave finishes\n this._leaving = true;\n mergeVNodeHook(oldData, 'afterLeave', function () {\n this$1._leaving = false;\n this$1.$forceUpdate();\n });\n return placeholder(h, rawChild);\n } else if (mode === 'in-out') {\n if (isAsyncPlaceholder(child)) {\n return oldRawChild;\n }\n\n var delayedLeave;\n\n var performLeave = function performLeave() {\n delayedLeave();\n };\n\n mergeVNodeHook(data, 'afterEnter', performLeave);\n mergeVNodeHook(data, 'enterCancelled', performLeave);\n mergeVNodeHook(oldData, 'delayLeave', function (leave) {\n delayedLeave = leave;\n });\n }\n }\n\n return rawChild;\n }\n};\n/* */\n\nvar props = extend({\n tag: String,\n moveClass: String\n}, transitionProps);\ndelete props.mode;\nvar TransitionGroup = {\n props: props,\n beforeMount: function beforeMount() {\n var this$1 = this;\n var update = this._update;\n\n this._update = function (vnode, hydrating) {\n var restoreActiveInstance = setActiveInstance(this$1); // force removing pass\n\n this$1.__patch__(this$1._vnode, this$1.kept, false, // hydrating\n true // removeOnly (!important, avoids unnecessary moves)\n );\n\n this$1._vnode = this$1.kept;\n restoreActiveInstance();\n update.call(this$1, vnode, hydrating);\n };\n },\n render: function render(h) {\n var tag = this.tag || this.$vnode.data.tag || 'span';\n var map = Object.create(null);\n var prevChildren = this.prevChildren = this.children;\n var rawChildren = this.$slots.default || [];\n var children = this.children = [];\n var transitionData = extractTransitionData(this);\n\n for (var i = 0; i < rawChildren.length; i++) {\n var c = rawChildren[i];\n\n if (c.tag) {\n if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {\n children.push(c);\n map[c.key] = c;\n (c.data || (c.data = {})).transition = transitionData;\n } else if (false) { var name, opts; }\n }\n }\n\n if (prevChildren) {\n var kept = [];\n var removed = [];\n\n for (var i$1 = 0; i$1 < prevChildren.length; i$1++) {\n var c$1 = prevChildren[i$1];\n c$1.data.transition = transitionData;\n c$1.data.pos = c$1.elm.getBoundingClientRect();\n\n if (map[c$1.key]) {\n kept.push(c$1);\n } else {\n removed.push(c$1);\n }\n }\n\n this.kept = h(tag, null, kept);\n this.removed = removed;\n }\n\n return h(tag, null, children);\n },\n updated: function updated() {\n var children = this.prevChildren;\n var moveClass = this.moveClass || (this.name || 'v') + '-move';\n\n if (!children.length || !this.hasMove(children[0].elm, moveClass)) {\n return;\n } // we divide the work into three loops to avoid mixing DOM reads and writes\n // in each iteration - which helps prevent layout thrashing.\n\n\n children.forEach(callPendingCbs);\n children.forEach(recordPosition);\n children.forEach(applyTranslation); // force reflow to put everything in position\n // assign to this to avoid being removed in tree-shaking\n // $flow-disable-line\n\n this._reflow = document.body.offsetHeight;\n children.forEach(function (c) {\n if (c.data.moved) {\n var el = c.elm;\n var s = el.style;\n addTransitionClass(el, moveClass);\n s.transform = s.WebkitTransform = s.transitionDuration = '';\n el.addEventListener(transitionEndEvent, el._moveCb = function cb(e) {\n if (e && e.target !== el) {\n return;\n }\n\n if (!e || /transform$/.test(e.propertyName)) {\n el.removeEventListener(transitionEndEvent, cb);\n el._moveCb = null;\n removeTransitionClass(el, moveClass);\n }\n });\n }\n });\n },\n methods: {\n hasMove: function hasMove(el, moveClass) {\n /* istanbul ignore if */\n if (!hasTransition) {\n return false;\n }\n /* istanbul ignore if */\n\n\n if (this._hasMove) {\n return this._hasMove;\n } // Detect whether an element with the move class applied has\n // CSS transitions. Since the element may be inside an entering\n // transition at this very moment, we make a clone of it and remove\n // all other transition classes applied to ensure only the move class\n // is applied.\n\n\n var clone = el.cloneNode();\n\n if (el._transitionClasses) {\n el._transitionClasses.forEach(function (cls) {\n removeClass(clone, cls);\n });\n }\n\n addClass(clone, moveClass);\n clone.style.display = 'none';\n this.$el.appendChild(clone);\n var info = getTransitionInfo(clone);\n this.$el.removeChild(clone);\n return this._hasMove = info.hasTransform;\n }\n }\n};\n\nfunction callPendingCbs(c) {\n /* istanbul ignore if */\n if (c.elm._moveCb) {\n c.elm._moveCb();\n }\n /* istanbul ignore if */\n\n\n if (c.elm._enterCb) {\n c.elm._enterCb();\n }\n}\n\nfunction recordPosition(c) {\n c.data.newPos = c.elm.getBoundingClientRect();\n}\n\nfunction applyTranslation(c) {\n var oldPos = c.data.pos;\n var newPos = c.data.newPos;\n var dx = oldPos.left - newPos.left;\n var dy = oldPos.top - newPos.top;\n\n if (dx || dy) {\n c.data.moved = true;\n var s = c.elm.style;\n s.transform = s.WebkitTransform = \"translate(\" + dx + \"px,\" + dy + \"px)\";\n s.transitionDuration = '0s';\n }\n}\n\nvar platformComponents = {\n Transition: Transition,\n TransitionGroup: TransitionGroup\n};\n/* */\n// install platform specific utils\n\nVue.config.mustUseProp = mustUseProp;\nVue.config.isReservedTag = isReservedTag;\nVue.config.isReservedAttr = isReservedAttr;\nVue.config.getTagNamespace = getTagNamespace;\nVue.config.isUnknownElement = isUnknownElement; // install platform runtime directives & components\n\nextend(Vue.options.directives, platformDirectives);\nextend(Vue.options.components, platformComponents); // install platform patch function\n\nVue.prototype.__patch__ = inBrowser ? patch : noop; // public mount method\n\nVue.prototype.$mount = function (el, hydrating) {\n el = el && inBrowser ? query(el) : undefined;\n return mountComponent(this, el, hydrating);\n}; // devtools global hook\n\n/* istanbul ignore next */\n\n\nif (inBrowser) {\n setTimeout(function () {\n if (config.devtools) {\n if (devtools) {\n devtools.emit('init', Vue);\n } else if (false) {}\n }\n\n if (false) {}\n }, 0);\n}\n/* */\n\n\n/* harmony default export */ const vue_runtime_esm = (Vue);\n// EXTERNAL MODULE: ./node_modules/vue-events/dist/index.js\nvar dist = __webpack_require__(665);\n;// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./app/list/App.vue?vue&type=template&id=54b110cc&\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _c(\"flex-filter-bar\", { attrs: { store: _vm.store } }),\n _vm._v(\" \"),\n _c(\"flex-content-loader\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.loading,\n expression: \"loading\"\n }\n ],\n attrs: { store: _vm.store }\n }),\n _vm._v(\" \"),\n _c(\"flex-table\", {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: !_vm.loading,\n expression: \"!loading\"\n }\n ],\n attrs: { store: _vm.store },\n model: {\n value: _vm.loading,\n callback: function($$v) {\n _vm.loading = $$v\n },\n expression: \"loading\"\n }\n })\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n;// CONCATENATED MODULE: ./app/list/App.vue?vue&type=template&id=54b110cc&\n\n;// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./app/list/components/Table.vue?vue&type=template&id=13dedc8c&\nvar Tablevue_type_template_id_13dedc8c_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _c(\"vuetable\", {\n ref: \"vuetable\",\n attrs: {\n css: _vm.css.table,\n fields: _vm.store.fields || [],\n searchFields: _vm.store.searchFields || [],\n sortOrder: _vm.store.sortOrder,\n \"multi-sort\": true,\n \"api-mode\": true,\n \"api-url\": _vm.store.api,\n \"per-page\": _vm.perPage,\n \"append-params\": _vm.extraParams,\n \"pagination-path\": \"links.pagination\",\n \"show-sort-icons\": true\n },\n on: {\n \"vuetable:pagination-data\": _vm.onPaginationData,\n \"vuetable:loading\": _vm.onVuetableLoading,\n \"vuetable:load-success\": _vm.onVueTableLoadSuccess\n }\n }),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"flex-list-pagination\" },\n [\n _c(\"vuetable-pagination-info\", {\n ref: \"paginationInfo\",\n attrs: {\n \"info-template\": _vm.store.paginationInfo,\n \"info-no-data-template\": _vm.store.emptyResult,\n css: _vm.css.paginationInfo\n }\n }),\n _vm._v(\" \"),\n _c(\"vuetable-pagination\", {\n ref: \"pagination\",\n attrs: { css: _vm.css.pagination },\n on: { \"vuetable-pagination:change-page\": _vm.onChangePage }\n })\n ],\n 1\n )\n ],\n 1\n )\n}\nvar Tablevue_type_template_id_13dedc8c_staticRenderFns = []\nTablevue_type_template_id_13dedc8c_render._withStripped = true\n\n\n;// CONCATENATED MODULE: ./app/list/components/Table.vue?vue&type=template&id=13dedc8c&\n\n;// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./node_modules/vuetable-2/src/components/Vuetable.vue?vue&type=template&id=15965e3b&scoped=true&\nvar Vuetablevue_type_template_id_15965e3b_scoped_true_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _vm.isFixedHeader\n ? _c(\"div\", [\n _c(\"div\", { staticClass: \"vuetable-head-wrapper\" }, [\n _c(\n \"table\",\n {\n class: [\"vuetable\", _vm.css.tableClass, _vm.css.tableHeaderClass]\n },\n [\n _c(\"thead\", [\n _c(\n \"tr\",\n [\n _vm._l(_vm.tableFields, function(field, fieldIndex) {\n return [\n field.visible\n ? [\n _vm.isSpecialField(field.name)\n ? [\n _vm.extractName(field.name) == \"__checkbox\"\n ? _c(\n \"th\",\n {\n key: fieldIndex,\n class: [\n \"vuetable-th-checkbox-\" +\n _vm.trackBy,\n field.titleClass\n ],\n style: { width: field.width }\n },\n [\n _c(\"input\", {\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: _vm.checkCheckboxesState(\n field.name\n )\n },\n on: {\n change: function($event) {\n return _vm.toggleAllCheckboxes(\n field.name,\n $event\n )\n }\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) == \"__component\"\n ? _c(\"th\", {\n key: fieldIndex,\n class: [\n \"vuetable-th-component-\" +\n _vm.trackBy,\n field.titleClass,\n _vm.sortClass(field),\n { sortable: _vm.isSortable(field) }\n ],\n style: { width: field.width },\n domProps: {\n innerHTML: _vm._s(\n _vm.renderTitle(field)\n )\n },\n on: {\n click: function($event) {\n return _vm.orderBy(field, $event)\n }\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) == \"__slot\"\n ? _c(\"th\", {\n key: fieldIndex,\n class: [\n \"vuetable-th-slot-\" +\n _vm.extractArgs(field.name),\n field.titleClass,\n _vm.sortClass(field),\n { sortable: _vm.isSortable(field) }\n ],\n style: { width: field.width },\n domProps: {\n innerHTML: _vm._s(\n _vm.renderTitle(field)\n )\n },\n on: {\n click: function($event) {\n return _vm.orderBy(field, $event)\n }\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) == \"__sequence\"\n ? _c(\"th\", {\n key: fieldIndex,\n class: [\n \"vuetable-th-sequence\",\n field.titleClass || \"\"\n ],\n style: { width: field.width },\n domProps: {\n innerHTML: _vm._s(\n _vm.renderTitle(field)\n )\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.notIn(_vm.extractName(field.name), [\n \"__sequence\",\n \"__checkbox\",\n \"__component\",\n \"__slot\"\n ])\n ? _c(\"th\", {\n key: fieldIndex,\n class: [\n \"vuetable-th-\" + field.name,\n field.titleClass || \"\"\n ],\n style: { width: field.width },\n domProps: {\n innerHTML: _vm._s(\n _vm.renderTitle(field)\n )\n }\n })\n : _vm._e()\n ]\n : [\n _c(\"th\", {\n key: fieldIndex,\n class: [\n \"vuetable-th-\" + field.name,\n field.titleClass,\n _vm.sortClass(field),\n { sortable: _vm.isSortable(field) }\n ],\n style: { width: field.width },\n attrs: { id: \"_\" + field.name },\n domProps: {\n innerHTML: _vm._s(\n _vm.renderTitle(field)\n )\n },\n on: {\n click: function($event) {\n return _vm.orderBy(field, $event)\n }\n }\n })\n ]\n ]\n : _vm._e()\n ]\n }),\n _vm._v(\" \"),\n _vm.scrollVisible\n ? _c(\"th\", {\n staticClass: \"vuetable-gutter-col\",\n style: { width: _vm.scrollBarWidth }\n })\n : _vm._e()\n ],\n 2\n )\n ])\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"vuetable-body-wrapper\",\n style: { height: _vm.tableHeight }\n },\n [\n _c(\n \"table\",\n {\n class: [\"vuetable\", _vm.css.tableClass, _vm.css.tableBodyClass]\n },\n [\n _c(\n \"colgroup\",\n [\n _vm._l(_vm.tableFields, function(field, fieldIndex) {\n return [\n field.visible\n ? [\n _c(\"col\", {\n key: fieldIndex,\n class: [\n \"vuetable-th-\" + field.name,\n field.titleClass\n ],\n style: { width: field.width },\n attrs: { id: \"_col_\" + field.name }\n })\n ]\n : _vm._e()\n ]\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _c(\n \"tbody\",\n { staticClass: \"vuetable-body\" },\n [\n _vm._l(_vm.tableData, function(item, itemIndex) {\n return [\n _c(\n \"tr\",\n {\n key: itemIndex,\n class: _vm.onRowClass(item, itemIndex),\n attrs: {\n \"item-index\": itemIndex,\n render: _vm.onRowChanged(item)\n },\n on: {\n click: function($event) {\n return _vm.onRowClicked(item, $event)\n },\n dblclick: function($event) {\n return _vm.onRowDoubleClicked(item, $event)\n }\n }\n },\n [\n _vm._l(_vm.tableFields, function(\n field,\n fieldIndex\n ) {\n return [\n field.visible\n ? [\n _vm.isSpecialField(field.name)\n ? [\n _vm.extractName(field.name) ==\n \"__sequence\"\n ? _c(\"td\", {\n key: fieldIndex,\n class: [\n \"vuetable-sequence\",\n field.dataClass\n ],\n domProps: {\n innerHTML: _vm._s(\n _vm.renderSequence(\n itemIndex\n )\n )\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) ==\n \"__handle\"\n ? _c(\"td\", {\n key: fieldIndex,\n class: [\n \"vuetable-handle\",\n field.dataClass\n ],\n domProps: {\n innerHTML: _vm._s(\n _vm.renderIconTag([\n \"handle-icon\",\n _vm.css.handleIcon\n ])\n )\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) ==\n \"__checkbox\"\n ? _c(\n \"td\",\n {\n key: fieldIndex,\n class: [\n \"vuetable-checkboxes\",\n field.dataClass\n ]\n },\n [\n _c(\"input\", {\n attrs: {\n type: \"checkbox\"\n },\n domProps: {\n checked: _vm.rowSelected(\n item,\n field.name\n )\n },\n on: {\n change: function(\n $event\n ) {\n return _vm.toggleCheckbox(\n item,\n field.name,\n $event\n )\n }\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) ===\n \"__component\"\n ? _c(\n \"td\",\n {\n key: fieldIndex,\n class: [\n \"vuetable-component\",\n field.dataClass\n ]\n },\n [\n _c(\n _vm.extractArgs(\n field.name\n ),\n {\n tag: \"component\",\n attrs: {\n \"row-data\": item,\n \"row-index\": itemIndex,\n \"row-field\":\n field.sortField\n }\n }\n )\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) ===\n \"__slot\"\n ? _c(\n \"td\",\n {\n key: fieldIndex,\n class: [\n \"vuetable-slot\",\n field.dataClass\n ]\n },\n [\n _vm._t(\n _vm.extractArgs(\n field.name\n ),\n null,\n {\n rowData: item,\n rowIndex: itemIndex,\n rowField:\n field.sortField\n }\n )\n ],\n 2\n )\n : _vm._e()\n ]\n : [\n _c(\"td\", {\n key: fieldIndex,\n class: field.dataClass,\n domProps: {\n innerHTML: _vm._s(\n _vm.renderNormalField(\n field,\n item\n )\n )\n },\n on: {\n click: function($event) {\n return _vm.onCellClicked(\n item,\n field,\n $event\n )\n },\n dblclick: function($event) {\n return _vm.onCellDoubleClicked(\n item,\n field,\n $event\n )\n },\n contextmenu: function($event) {\n return _vm.onCellRightClicked(\n item,\n field,\n $event\n )\n }\n }\n })\n ]\n ]\n : _vm._e()\n ]\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _vm.useDetailRow\n ? [\n _c(\n \"transition\",\n {\n key: itemIndex,\n attrs: { name: _vm.detailRowTransition }\n },\n [\n _vm.isVisibleDetailRow(item[_vm.trackBy])\n ? _c(\n \"tr\",\n {\n class: [_vm.css.detailRowClass],\n on: {\n click: function($event) {\n return _vm.onDetailRowClick(\n item,\n $event\n )\n }\n }\n },\n [\n _c(\n \"td\",\n {\n attrs: {\n colspan: _vm.countVisibleFields\n }\n },\n [\n _c(_vm.detailRowComponent, {\n tag: \"component\",\n attrs: {\n \"row-data\": item,\n \"row-index\": itemIndex\n }\n })\n ],\n 1\n )\n ]\n )\n : _vm._e()\n ]\n )\n ]\n : _vm._e()\n ]\n }),\n _vm._v(\" \"),\n _vm.displayEmptyDataRow\n ? [\n _c(\"tr\", [\n _c(\"td\", {\n staticClass: \"vuetable-empty-result\",\n attrs: { colspan: _vm.countVisibleFields },\n domProps: {\n innerHTML: _vm._s(_vm.noDataTemplate)\n }\n })\n ])\n ]\n : _vm._e(),\n _vm._v(\" \"),\n _vm.lessThanMinRows\n ? _vm._l(_vm.blankRows, function(i) {\n return _c(\n \"tr\",\n { key: i, staticClass: \"blank-row\" },\n [\n _vm._l(_vm.tableFields, function(\n field,\n fieldIndex\n ) {\n return [\n field.visible\n ? _c(\"td\", { key: fieldIndex }, [\n _vm._v(\" \")\n ])\n : _vm._e()\n ]\n })\n ],\n 2\n )\n })\n : _vm._e()\n ],\n 2\n )\n ]\n )\n ]\n )\n ])\n : _c(\"table\", { class: [\"vuetable\", _vm.css.tableClass] }, [\n _c(\"thead\", [\n _c(\n \"tr\",\n [\n _vm._l(_vm.tableFields, function(field, fieldIndex) {\n return [\n field.visible\n ? [\n _vm.isSpecialField(field.name)\n ? [\n _vm.extractName(field.name) == \"__checkbox\"\n ? _c(\n \"th\",\n {\n key: fieldIndex,\n class: [\n \"vuetable-th-checkbox-\" + _vm.trackBy,\n field.titleClass\n ],\n style: { width: field.width }\n },\n [\n _c(\"input\", {\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: _vm.checkCheckboxesState(\n field.name\n )\n },\n on: {\n change: function($event) {\n return _vm.toggleAllCheckboxes(\n field.name,\n $event\n )\n }\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) == \"__component\"\n ? _c(\"th\", {\n key: fieldIndex,\n class: [\n \"vuetable-th-component-\" + _vm.trackBy,\n field.titleClass,\n _vm.sortClass(field),\n { sortable: _vm.isSortable(field) }\n ],\n style: { width: field.width },\n domProps: {\n innerHTML: _vm._s(_vm.renderTitle(field))\n },\n on: {\n click: function($event) {\n return _vm.orderBy(field, $event)\n }\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) == \"__slot\"\n ? _c(\"th\", {\n key: fieldIndex,\n class: [\n \"vuetable-th-slot-\" +\n _vm.extractArgs(field.name),\n field.titleClass,\n _vm.sortClass(field),\n { sortable: _vm.isSortable(field) }\n ],\n style: { width: field.width },\n domProps: {\n innerHTML: _vm._s(_vm.renderTitle(field))\n },\n on: {\n click: function($event) {\n return _vm.orderBy(field, $event)\n }\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) == \"__sequence\"\n ? _c(\"th\", {\n key: fieldIndex,\n class: [\n \"vuetable-th-sequence\",\n field.titleClass || \"\",\n _vm.sortClass(field)\n ],\n style: { width: field.width },\n domProps: {\n innerHTML: _vm._s(_vm.renderTitle(field))\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.notIn(_vm.extractName(field.name), [\n \"__sequence\",\n \"__checkbox\",\n \"__component\",\n \"__slot\"\n ])\n ? _c(\"th\", {\n key: fieldIndex,\n class: [\n \"vuetable-th-\" + field.name,\n field.titleClass || \"\",\n _vm.sortClass(field)\n ],\n style: { width: field.width },\n domProps: {\n innerHTML: _vm._s(_vm.renderTitle(field))\n }\n })\n : _vm._e()\n ]\n : [\n _c(\"th\", {\n key: fieldIndex,\n class: [\n \"vuetable-th-\" + field.name,\n field.titleClass,\n _vm.sortClass(field),\n { sortable: _vm.isSortable(field) }\n ],\n style: { width: field.width },\n attrs: { id: \"_\" + field.name },\n domProps: {\n innerHTML: _vm._s(_vm.renderTitle(field))\n },\n on: {\n click: function($event) {\n return _vm.orderBy(field, $event)\n }\n }\n })\n ]\n ]\n : _vm._e()\n ]\n })\n ],\n 2\n )\n ]),\n _vm._v(\" \"),\n _c(\n \"tbody\",\n { staticClass: \"vuetable-body\" },\n [\n _vm._l(_vm.tableData, function(item, itemIndex) {\n return [\n _c(\n \"tr\",\n {\n key: itemIndex,\n class: _vm.onRowClass(item, itemIndex),\n attrs: {\n \"item-index\": itemIndex,\n render: _vm.onRowChanged(item)\n },\n on: {\n dblclick: function($event) {\n return _vm.onRowDoubleClicked(item, $event)\n },\n click: function($event) {\n return _vm.onRowClicked(item, $event)\n }\n }\n },\n [\n _vm._l(_vm.tableFields, function(field, fieldIndex) {\n return [\n field.visible\n ? [\n _vm.isSpecialField(field.name)\n ? [\n _vm.extractName(field.name) == \"__sequence\"\n ? _c(\"td\", {\n key: fieldIndex,\n class: [\n \"vuetable-sequence\",\n field.dataClass\n ],\n domProps: {\n innerHTML: _vm._s(\n _vm.renderSequence(itemIndex)\n )\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) == \"__handle\"\n ? _c(\"td\", {\n key: fieldIndex,\n class: [\n \"vuetable-handle\",\n field.dataClass\n ],\n domProps: {\n innerHTML: _vm._s(\n _vm.renderIconTag([\n \"handle-icon\",\n _vm.css.handleIcon\n ])\n )\n }\n })\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) == \"__checkbox\"\n ? _c(\n \"td\",\n {\n key: fieldIndex,\n class: [\n \"vuetable-checkboxes\",\n field.dataClass\n ]\n },\n [\n _c(\"input\", {\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: _vm.rowSelected(\n item,\n field.name\n )\n },\n on: {\n change: function($event) {\n return _vm.toggleCheckbox(\n item,\n field.name,\n $event\n )\n }\n }\n })\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) ===\n \"__component\"\n ? _c(\n \"td\",\n {\n key: fieldIndex,\n class: [\n \"vuetable-component\",\n field.dataClass\n ]\n },\n [\n _c(_vm.extractArgs(field.name), {\n tag: \"component\",\n attrs: {\n \"row-data\": item,\n \"row-index\": itemIndex,\n \"row-field\": field.sortField\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.extractName(field.name) === \"__slot\"\n ? _c(\n \"td\",\n {\n key: fieldIndex,\n class: [\n \"vuetable-slot\",\n field.dataClass\n ]\n },\n [\n _vm._t(\n _vm.extractArgs(field.name),\n null,\n {\n rowData: item,\n rowIndex: itemIndex,\n rowField: field.sortField\n }\n )\n ],\n 2\n )\n : _vm._e()\n ]\n : [\n _vm.hasCallback(field)\n ? _c(\"td\", {\n key: fieldIndex,\n class: field.dataClass,\n domProps: {\n innerHTML: _vm._s(\n _vm.callCallback(field, item)\n )\n },\n on: {\n click: function($event) {\n return _vm.onCellClicked(\n item,\n field,\n $event\n )\n },\n dblclick: function($event) {\n return _vm.onCellDoubleClicked(\n item,\n field,\n $event\n )\n },\n contextmenu: function($event) {\n return _vm.onCellRightClicked(\n item,\n field,\n $event\n )\n }\n }\n })\n : _c(\"td\", {\n key: fieldIndex,\n class: field.dataClass,\n domProps: {\n innerHTML: _vm._s(\n _vm.getObjectValue(\n item,\n field.name,\n \"\"\n )\n )\n },\n on: {\n click: function($event) {\n return _vm.onCellClicked(\n item,\n field,\n $event\n )\n },\n dblclick: function($event) {\n return _vm.onCellDoubleClicked(\n item,\n field,\n $event\n )\n },\n contextmenu: function($event) {\n return _vm.onCellRightClicked(\n item,\n field,\n $event\n )\n }\n }\n })\n ]\n ]\n : _vm._e()\n ]\n })\n ],\n 2\n ),\n _vm._v(\" \"),\n _vm.useDetailRow\n ? [\n _c(\n \"transition\",\n {\n key: itemIndex,\n attrs: { name: _vm.detailRowTransition }\n },\n [\n _vm.isVisibleDetailRow(item[_vm.trackBy])\n ? _c(\n \"tr\",\n {\n class: [_vm.css.detailRowClass],\n on: {\n click: function($event) {\n return _vm.onDetailRowClick(item, $event)\n }\n }\n },\n [\n _c(\n \"td\",\n {\n attrs: { colspan: _vm.countVisibleFields }\n },\n [\n _c(_vm.detailRowComponent, {\n tag: \"component\",\n attrs: {\n \"row-data\": item,\n \"row-index\": itemIndex\n }\n })\n ],\n 1\n )\n ]\n )\n : _vm._e()\n ]\n )\n ]\n : _vm._e()\n ]\n }),\n _vm._v(\" \"),\n _vm.displayEmptyDataRow\n ? [\n _c(\"tr\", [\n _c(\"td\", {\n staticClass: \"vuetable-empty-result\",\n attrs: { colspan: _vm.countVisibleFields },\n domProps: { innerHTML: _vm._s(_vm.noDataTemplate) }\n })\n ])\n ]\n : _vm._e(),\n _vm._v(\" \"),\n _vm.lessThanMinRows\n ? _vm._l(_vm.blankRows, function(i) {\n return _c(\n \"tr\",\n { key: i, staticClass: \"blank-row\" },\n [\n _vm._l(_vm.tableFields, function(field, fieldIndex) {\n return [\n field.visible\n ? _c(\"td\", { key: fieldIndex }, [_vm._v(\" \")])\n : _vm._e()\n ]\n })\n ],\n 2\n )\n })\n : _vm._e()\n ],\n 2\n )\n ])\n}\nvar Vuetablevue_type_template_id_15965e3b_scoped_true_staticRenderFns = []\nVuetablevue_type_template_id_15965e3b_scoped_true_render._withStripped = true\n\n\n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/Vuetable.vue?vue&type=template&id=15965e3b&scoped=true&\n\n// EXTERNAL MODULE: ./node_modules/vuetable-2/node_modules/axios/index.js\nvar axios = __webpack_require__(9213);\nvar axios_default = /*#__PURE__*/__webpack_require__.n(axios);\n;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-4[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./node_modules/vuetable-2/src/components/Vuetable.vue?vue&type=script&lang=js&\nfunction Vuetablevue_type_script_lang_js_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { Vuetablevue_type_script_lang_js_typeof = function _typeof(obj) { return typeof obj; }; } else { Vuetablevue_type_script_lang_js_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return Vuetablevue_type_script_lang_js_typeof(obj); }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ const Vuetablevue_type_script_lang_js_ = ({\n props: {\n fields: {\n type: Array,\n required: true\n },\n loadOnStart: {\n type: Boolean,\n default: true\n },\n apiUrl: {\n type: String,\n default: ''\n },\n httpMethod: {\n type: String,\n default: 'get',\n validator: function validator(value) {\n return ['get', 'post'].indexOf(value) > -1;\n }\n },\n reactiveApiUrl: {\n type: Boolean,\n default: true\n },\n apiMode: {\n type: Boolean,\n default: true\n },\n data: {\n type: [Array, Object],\n default: null\n },\n dataTotal: {\n type: Number,\n default: 0\n },\n dataManager: {\n type: Function,\n default: null\n },\n dataPath: {\n type: String,\n default: 'data'\n },\n paginationPath: {\n type: [String],\n default: 'links.pagination'\n },\n queryParams: {\n type: [Object, Function],\n default: function _default() {\n return {\n sort: 'sort',\n page: 'page',\n perPage: 'per_page'\n };\n }\n },\n appendParams: {\n type: Object,\n default: function _default() {\n return {};\n }\n },\n httpOptions: {\n type: Object,\n default: function _default() {\n return {};\n }\n },\n httpFetch: {\n type: Function,\n default: null\n },\n perPage: {\n type: Number,\n default: 10\n },\n initialPage: {\n type: Number,\n default: 1\n },\n sortOrder: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n multiSort: {\n type: Boolean,\n default: function _default() {\n return false;\n }\n },\n tableHeight: {\n type: String,\n default: null\n },\n\n /*\r\n * physical key that will trigger multi-sort option\r\n * possible values: 'alt', 'ctrl', 'meta', 'shift'\r\n * 'ctrl' might not work as expected on Mac\r\n */\n multiSortKey: {\n type: String,\n default: 'alt'\n },\n\n /* deprecated */\n rowClassCallback: {\n type: [String, Function],\n default: ''\n },\n rowClass: {\n type: [String, Function],\n default: ''\n },\n detailRowComponent: {\n type: String,\n default: ''\n },\n detailRowTransition: {\n type: String,\n default: ''\n },\n trackBy: {\n type: String,\n default: 'id'\n },\n css: {\n type: Object,\n default: function _default() {\n return {\n tableClass: 'ui blue selectable celled stackable attached table',\n loadingClass: 'loading',\n ascendingIcon: 'blue chevron up icon',\n descendingIcon: 'blue chevron down icon',\n ascendingClass: 'sorted-asc',\n descendingClass: 'sorted-desc',\n sortableIcon: '',\n detailRowClass: 'vuetable-detail-row',\n handleIcon: 'grey sidebar icon',\n tableBodyClass: 'vuetable-semantic-no-top vuetable-fixed-layout',\n tableHeaderClass: 'vuetable-fixed-layout'\n };\n }\n },\n minRows: {\n type: Number,\n default: 0\n },\n silent: {\n type: Boolean,\n default: false\n },\n noDataTemplate: {\n type: String,\n default: function _default() {\n return 'No Data Available';\n }\n },\n showSortIcons: {\n type: Boolean,\n default: true\n }\n },\n data: function data() {\n return {\n eventPrefix: 'vuetable:',\n tableFields: [],\n tableData: null,\n tablePagination: null,\n currentPage: this.initialPage,\n selectedTo: [],\n visibleDetailRows: [],\n lastScrollPosition: 0,\n scrollBarWidth: '17px',\n //chrome default\n scrollVisible: false\n };\n },\n mounted: function mounted() {\n this.normalizeFields();\n this.normalizeSortOrder();\n\n if (this.isFixedHeader) {\n this.scrollBarWidth = this.getScrollBarWidth() + 'px';\n }\n\n this.$nextTick(function () {\n this.fireEvent('initialized', this.tableFields);\n });\n\n if (this.loadOnStart) {\n this.loadData();\n }\n\n if (this.isFixedHeader) {\n var elem = this.$el.getElementsByClassName('vuetable-body-wrapper')[0];\n\n if (elem != null) {\n elem.addEventListener('scroll', this.handleScroll);\n }\n }\n },\n destroyed: function destroyed() {\n var elem = this.$el.getElementsByClassName('vuetable-body-wrapper')[0];\n\n if (elem != null) {\n elem.removeEventListener('scroll', this.handleScroll);\n }\n },\n computed: {\n version: function version() {\n return VERSION;\n },\n useDetailRow: function useDetailRow() {\n if (this.tableData && this.tableData[0] && this.detailRowComponent !== '' && typeof this.tableData[0][this.trackBy] === 'undefined') {\n this.warn('You need to define unique row identifier in order for detail-row feature to work. Use `track-by` prop to define one!');\n return false;\n }\n\n return this.detailRowComponent !== '';\n },\n countVisibleFields: function countVisibleFields() {\n return this.tableFields.filter(function (field) {\n return field.visible;\n }).length;\n },\n countTableData: function countTableData() {\n if (this.tableData === null) {\n return 0;\n }\n\n return this.tableData.length;\n },\n displayEmptyDataRow: function displayEmptyDataRow() {\n return this.countTableData === 0 && this.noDataTemplate.length > 0;\n },\n lessThanMinRows: function lessThanMinRows() {\n if (this.tableData === null || this.tableData.length === 0) {\n return true;\n }\n\n return this.tableData.length < this.minRows;\n },\n blankRows: function blankRows() {\n if (this.tableData === null || this.tableData.length === 0) {\n return this.minRows;\n }\n\n if (this.tableData.length >= this.minRows) {\n return 0;\n }\n\n return this.minRows - this.tableData.length;\n },\n isApiMode: function isApiMode() {\n return this.apiMode;\n },\n isDataMode: function isDataMode() {\n return !this.apiMode;\n },\n isFixedHeader: function isFixedHeader() {\n return this.tableHeight != null;\n }\n },\n methods: {\n getScrollBarWidth: function getScrollBarWidth() {\n var outer = document.createElement('div');\n var inner = document.createElement('div');\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n inner.style.width = '100%';\n outer.appendChild(inner);\n document.body.appendChild(outer);\n var widthWithoutScrollbar = outer.offsetWidth;\n outer.style.overflow = 'scroll';\n var widthWithScrollbar = inner.offsetWidth;\n document.body.removeChild(outer);\n return widthWithoutScrollbar - widthWithScrollbar;\n },\n handleScroll: function handleScroll(e) {\n //make sure that the header and the body are aligned when scrolling horizontally on a table that is wider than the viewport\n var horizontal = e.currentTarget.scrollLeft;\n\n if (horizontal != this.lastScrollPosition) {\n //don't modify header scroll if we are scrolling vertically\n var header = this.$el.getElementsByClassName('vuetable-head-wrapper')[0];\n\n if (header != null) {\n header.scrollLeft = horizontal;\n }\n\n this.lastScrollPosition = horizontal;\n }\n },\n normalizeFields: function normalizeFields() {\n if (typeof this.fields === 'undefined') {\n this.warn('You need to provide \"fields\" prop.');\n return;\n }\n\n this.tableFields = [];\n var self = this;\n var obj;\n this.fields.forEach(function (field, i) {\n if (typeof field === 'string') {\n obj = {\n name: field,\n title: self.setTitle(field),\n titleClass: '',\n dataClass: '',\n callback: null,\n visible: true\n };\n } else {\n obj = {\n name: field.name,\n width: field.width,\n title: field.title === undefined ? self.setTitle(field.name) : field.title,\n sortField: field.sortField,\n titleClass: field.titleClass === undefined ? '' : field.titleClass,\n dataClass: field.dataClass === undefined ? '' : field.dataClass,\n callback: field.callback === undefined ? '' : field.callback,\n visible: field.visible === undefined ? true : field.visible\n };\n }\n\n self.tableFields.push(obj);\n });\n },\n setData: function setData(data) {\n if (data === null || typeof data === 'undefined') return;\n this.fireEvent('loading');\n\n if (Array.isArray(data)) {\n this.tableData = data;\n this.fireEvent('loaded');\n return;\n }\n\n this.tableData = this.getObjectValue(data, this.dataPath, null);\n this.tablePagination = this.getObjectValue(data, this.paginationPath, null);\n this.$nextTick(function () {\n this.fixHeader();\n this.fireEvent('pagination-data', this.tablePagination);\n this.fireEvent('loaded');\n });\n },\n setTitle: function setTitle(str) {\n if (this.isSpecialField(str)) {\n return '';\n }\n\n return this.titleCase(str);\n },\n getTitle: function getTitle(field) {\n if (typeof field.title === 'function') return field.title();\n return typeof field.title === 'undefined' ? field.name.replace('.', ' ') : field.title;\n },\n renderTitle: function renderTitle(field) {\n var title = this.getTitle(field);\n\n if (title.length > 0 && this.isInCurrentSortGroup(field) || this.hasSortableIcon(field)) {\n var style = \"opacity:\".concat(this.sortIconOpacity(field), \";position:relative;float:right\");\n var iconTag = this.showSortIcons ? this.renderIconTag(['sort-icon', this.sortIcon(field)], \"style=\\\"\".concat(style, \"\\\"\")) : '';\n return title + ' ' + iconTag;\n }\n\n return title;\n },\n renderSequence: function renderSequence(index) {\n return this.tablePagination ? this.tablePagination.from + index : index;\n },\n renderNormalField: function renderNormalField(field, item) {\n return this.hasCallback(field) ? this.callCallback(field, item) : this.getObjectValue(item, field.name, '');\n },\n isSpecialField: function isSpecialField(fieldName) {\n return fieldName.slice(0, 2) === '__';\n },\n titleCase: function titleCase(str) {\n return str.replace(/\\w+/g, function (txt) {\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n });\n },\n camelCase: function camelCase(str) {\n var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '_';\n var self = this;\n return str.split(delimiter).map(function (item) {\n return self.titleCase(item);\n }).join('');\n },\n notIn: function notIn(str, arr) {\n return arr.indexOf(str) === -1;\n },\n loadData: function loadData() {\n var success = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.loadSuccess;\n var failed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.loadFailed;\n\n if (this.isDataMode) {\n this.callDataManager();\n return;\n }\n\n this.fireEvent('loading');\n this.httpOptions['params'] = this.getAppendParams(this.getAllQueryParams());\n return this.fetch(this.apiUrl, this.httpOptions).then(success, failed).catch(function () {\n return failed();\n });\n },\n fetch: function fetch(apiUrl, httpOptions) {\n return this.httpFetch ? this.httpFetch(apiUrl, httpOptions) : (axios_default())[this.httpMethod](apiUrl, httpOptions);\n },\n loadSuccess: function loadSuccess(response) {\n this.fireEvent('load-success', response);\n var body = this.transform(response.data);\n this.tableData = this.getObjectValue(body, this.dataPath, null);\n this.tablePagination = this.getObjectValue(body, this.paginationPath, null);\n\n if (this.tablePagination === null) {\n this.warn('vuetable: pagination-path \"' + this.paginationPath + '\" not found. ' + 'It looks like the data returned from the sever does not have pagination information ' + \"or you may have set it incorrectly.\\n\" + 'You can explicitly suppress this warning by setting pagination-path=\"\".');\n }\n\n this.$nextTick(function () {\n this.fixHeader();\n this.fireEvent('pagination-data', this.tablePagination);\n this.fireEvent('loaded');\n });\n },\n fixHeader: function fixHeader() {\n if (!this.isFixedHeader) {\n return;\n }\n\n var elem = this.$el.getElementsByClassName('vuetable-body-wrapper')[0];\n\n if (elem != null) {\n if (elem.scrollHeight > elem.clientHeight) {\n this.scrollVisible = true;\n } else {\n this.scrollVisible = false;\n }\n }\n },\n loadFailed: function loadFailed(response) {\n console.error('load-error', response);\n this.fireEvent('load-error', response);\n this.fireEvent('loaded');\n },\n transform: function transform(data) {\n var func = 'transform';\n\n if (this.parentFunctionExists(func)) {\n return this.$parent[func].call(this.$parent, data);\n }\n\n return data;\n },\n parentFunctionExists: function parentFunctionExists(func) {\n return func !== '' && typeof this.$parent[func] === 'function';\n },\n callParentFunction: function callParentFunction(func, args) {\n var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n if (this.parentFunctionExists(func)) {\n return this.$parent[func].call(this.$parent, args);\n }\n\n return defaultValue;\n },\n fireEvent: function fireEvent(eventName, args) {\n this.$emit(this.eventPrefix + eventName, args);\n },\n warn: function warn(msg) {\n if (!this.silent) {\n console.warn(msg);\n }\n },\n getAllQueryParams: function getAllQueryParams() {\n var params = {};\n\n if (typeof this.queryParams === 'function') {\n params = this.queryParams(this.sortOrder, this.currentPage, this.perPage);\n return Vuetablevue_type_script_lang_js_typeof(params) !== 'object' ? {} : params;\n }\n\n params[this.queryParams.sort] = this.getSortParam();\n params[this.queryParams.page] = this.currentPage;\n params[this.queryParams.perPage] = this.perPage;\n return params;\n },\n getSortParam: function getSortParam() {\n if (!this.sortOrder || this.sortOrder.field == '') {\n return '';\n }\n\n if (typeof this.$parent['getSortParam'] === 'function') {\n return this.$parent['getSortParam'].call(this.$parent, this.sortOrder);\n }\n\n return this.getDefaultSortParam();\n },\n getDefaultSortParam: function getDefaultSortParam() {\n var result = '';\n\n for (var i = 0; i < this.sortOrder.length; i++) {\n var fieldName = typeof this.sortOrder[i].sortField === 'undefined' ? this.sortOrder[i].field : this.sortOrder[i].sortField;\n result += fieldName + '|' + this.sortOrder[i].direction + (i + 1 < this.sortOrder.length ? ',' : '');\n }\n\n return result;\n },\n getAppendParams: function getAppendParams(params) {\n for (var x in this.appendParams) {\n params[x] = this.appendParams[x];\n }\n\n return params;\n },\n extractName: function extractName(string) {\n return string.split(':')[0].trim();\n },\n extractArgs: function extractArgs(string) {\n return string.split(':')[1];\n },\n isSortable: function isSortable(field) {\n return !(typeof field.sortField === 'undefined');\n },\n isInCurrentSortGroup: function isInCurrentSortGroup(field) {\n return this.currentSortOrderPosition(field) !== false;\n },\n hasSortableIcon: function hasSortableIcon(field) {\n return this.isSortable(field) && this.css.sortableIcon != '';\n },\n currentSortOrderPosition: function currentSortOrderPosition(field) {\n if (!this.isSortable(field)) {\n return false;\n }\n\n for (var i = 0; i < this.sortOrder.length; i++) {\n if (this.fieldIsInSortOrderPosition(field, i)) {\n return i;\n }\n }\n\n return false;\n },\n fieldIsInSortOrderPosition: function fieldIsInSortOrderPosition(field, i) {\n return this.sortOrder[i].field === field.name && this.sortOrder[i].sortField === field.sortField;\n },\n orderBy: function orderBy(field, event) {\n if (!this.isSortable(field)) return;\n var key = this.multiSortKey.toLowerCase() + 'Key';\n\n if (this.multiSort && event[key]) {\n //adding column to multisort\n this.multiColumnSort(field);\n } else {\n //no multisort, or resetting sort\n this.singleColumnSort(field);\n }\n\n this.currentPage = 1; // reset page index\n\n if (this.apiMode || this.dataManager) {\n this.loadData();\n }\n },\n multiColumnSort: function multiColumnSort(field) {\n var i = this.currentSortOrderPosition(field);\n\n if (i === false) {\n //this field is not in the sort array yet\n this.sortOrder.push({\n field: field.name,\n sortField: field.sortField,\n direction: 'asc'\n });\n } else {\n //this field is in the sort array, now we change its state\n if (this.sortOrder[i].direction === 'asc') {\n // switch direction\n this.sortOrder[i].direction = 'desc';\n } else {\n //remove sort condition\n this.sortOrder.splice(i, 1);\n }\n }\n },\n singleColumnSort: function singleColumnSort(field) {\n if (this.sortOrder.length === 0) {\n this.clearSortOrder();\n }\n\n this.sortOrder.splice(1); //removes additional columns\n\n if (this.fieldIsInSortOrderPosition(field, 0)) {\n // change sort direction\n this.sortOrder[0].direction = this.sortOrder[0].direction === 'asc' ? 'desc' : 'asc';\n } else {\n // reset sort direction\n this.sortOrder[0].direction = 'asc';\n }\n\n this.sortOrder[0].field = field.name;\n this.sortOrder[0].sortField = field.sortField;\n },\n clearSortOrder: function clearSortOrder() {\n this.sortOrder.push({\n field: '',\n sortField: '',\n direction: 'asc'\n });\n },\n sortClass: function sortClass(field) {\n var cls = '';\n var i = this.currentSortOrderPosition(field);\n\n if (i !== false) {\n cls = this.sortOrder[i].direction == 'asc' ? this.css.ascendingClass : this.css.descendingClass;\n }\n\n return cls;\n },\n sortIcon: function sortIcon(field) {\n var cls = this.css.sortableIcon;\n var i = this.currentSortOrderPosition(field);\n\n if (i !== false) {\n cls = this.sortOrder[i].direction == 'asc' ? this.css.ascendingIcon : this.css.descendingIcon;\n }\n\n return cls;\n },\n sortIconOpacity: function sortIconOpacity(field) {\n /*\r\n * fields with stronger precedence have darker color\r\n *\r\n * if there are few fields, we go down by 0.3\r\n * ex. 2 fields are selected: 1.0, 0.7\r\n *\r\n * if there are more we go down evenly on the given spectrum\r\n * ex. 6 fields are selected: 1.0, 0.86, 0.72, 0.58, 0.44, 0.3\r\n */\n var max = 1.0,\n min = 0.3,\n step = 0.3;\n var count = this.sortOrder.length;\n var current = this.currentSortOrderPosition(field);\n\n if (max - count * step < min) {\n step = (max - min) / (count - 1);\n }\n\n var opacity = max - current * step;\n return opacity;\n },\n hasCallback: function hasCallback(item) {\n return item.callback ? true : false;\n },\n callCallback: function callCallback(field, item) {\n if (!this.hasCallback(field)) return;\n\n if (typeof field.callback == 'function') {\n return field.callback(this.getObjectValue(item, field.name));\n }\n\n var args = field.callback.split('|');\n var func = args.shift();\n\n if (typeof this.$parent[func] === 'function') {\n var value = this.getObjectValue(item, field.name);\n return args.length > 0 ? this.$parent[func].apply(this.$parent, [value].concat(args)) : this.$parent[func].call(this.$parent, value);\n }\n\n return null;\n },\n getObjectValue: function getObjectValue(object, path, defaultValue) {\n defaultValue = typeof defaultValue === 'undefined' ? null : defaultValue;\n var obj = object;\n\n if (path.trim() != '') {\n var keys = path.split('.');\n keys.forEach(function (key) {\n if (obj !== null && typeof obj[key] !== 'undefined' && obj[key] !== null) {\n obj = obj[key];\n } else {\n obj = defaultValue;\n return;\n }\n });\n }\n\n return obj;\n },\n toggleCheckbox: function toggleCheckbox(dataItem, fieldName, event) {\n var isChecked = event.target.checked;\n var idColumn = this.trackBy;\n\n if (dataItem[idColumn] === undefined) {\n this.warn('__checkbox field: The \"' + this.trackBy + '\" field does not exist! Make sure the field you specify in \"track-by\" prop does exist.');\n return;\n }\n\n var key = dataItem[idColumn];\n\n if (isChecked) {\n this.selectId(key);\n } else {\n this.unselectId(key);\n }\n\n this.$emit('vuetable:checkbox-toggled', isChecked, dataItem);\n },\n selectId: function selectId(key) {\n if (!this.isSelectedRow(key)) {\n this.selectedTo.push(key);\n }\n },\n unselectId: function unselectId(key) {\n this.selectedTo = this.selectedTo.filter(function (item) {\n return item !== key;\n });\n },\n isSelectedRow: function isSelectedRow(key) {\n return this.selectedTo.indexOf(key) >= 0;\n },\n rowSelected: function rowSelected(dataItem, fieldName) {\n var idColumn = this.trackBy;\n var key = dataItem[idColumn];\n return this.isSelectedRow(key);\n },\n checkCheckboxesState: function checkCheckboxesState(fieldName) {\n if (!this.tableData) return;\n var self = this;\n var idColumn = this.trackBy;\n var selector = 'th.vuetable-th-checkbox-' + idColumn + ' input[type=checkbox]';\n var els = document.querySelectorAll(selector); //fixed:document.querySelectorAll return the typeof nodeList not array\n\n if (els.forEach === undefined) els.forEach = function (cb) {\n [].forEach.call(els, cb);\n }; // count how many checkbox row in the current page has been checked\n\n var selected = this.tableData.filter(function (item) {\n return self.selectedTo.indexOf(item[idColumn]) >= 0;\n }); // count == 0, clear the checkbox\n\n if (selected.length <= 0) {\n els.forEach(function (el) {\n el.indeterminate = false;\n });\n return false;\n } // count > 0 and count < perPage, set checkbox state to 'indeterminate'\n else if (selected.length < this.perPage) {\n els.forEach(function (el) {\n el.indeterminate = true;\n });\n return true;\n } // count == perPage, set checkbox state to 'checked'\n else {\n els.forEach(function (el) {\n el.indeterminate = false;\n });\n return true;\n }\n },\n toggleAllCheckboxes: function toggleAllCheckboxes(fieldName, event) {\n var self = this;\n var isChecked = event.target.checked;\n var idColumn = this.trackBy;\n\n if (isChecked) {\n this.tableData.forEach(function (dataItem) {\n self.selectId(dataItem[idColumn]);\n });\n } else {\n this.tableData.forEach(function (dataItem) {\n self.unselectId(dataItem[idColumn]);\n });\n }\n\n this.$emit('vuetable:checkbox-toggled-all', isChecked);\n },\n gotoPreviousPage: function gotoPreviousPage() {\n if (this.currentPage > 1) {\n this.currentPage--;\n this.loadData();\n }\n },\n gotoNextPage: function gotoNextPage() {\n if (this.currentPage < this.tablePagination.last_page) {\n this.currentPage++;\n this.loadData();\n }\n },\n gotoPage: function gotoPage(page) {\n if (page != this.currentPage && page > 0 && page <= this.tablePagination.last_page) {\n this.currentPage = page;\n this.loadData();\n }\n },\n isVisibleDetailRow: function isVisibleDetailRow(rowId) {\n return this.visibleDetailRows.indexOf(rowId) >= 0;\n },\n showDetailRow: function showDetailRow(rowId) {\n if (!this.isVisibleDetailRow(rowId)) {\n this.visibleDetailRows.push(rowId);\n }\n },\n hideDetailRow: function hideDetailRow(rowId) {\n if (this.isVisibleDetailRow(rowId)) {\n this.visibleDetailRows.splice(this.visibleDetailRows.indexOf(rowId), 1);\n }\n },\n toggleDetailRow: function toggleDetailRow(rowId) {\n if (this.isVisibleDetailRow(rowId)) {\n this.hideDetailRow(rowId);\n } else {\n this.showDetailRow(rowId);\n }\n },\n showField: function showField(index) {\n if (index < 0 || index > this.tableFields.length) return;\n this.tableFields[index].visible = true;\n },\n hideField: function hideField(index) {\n if (index < 0 || index > this.tableFields.length) return;\n this.tableFields[index].visible = false;\n },\n toggleField: function toggleField(index) {\n if (index < 0 || index > this.tableFields.length) return;\n this.tableFields[index].visible = !this.tableFields[index].visible;\n },\n renderIconTag: function renderIconTag(classes) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n return typeof this.css.renderIcon === 'undefined' ? \"<i class=\\\"\".concat(classes.join(' '), \"\\\" \").concat(options, \"></i>\") : this.css.renderIcon(classes, options);\n },\n makePagination: function makePagination() {\n var total = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var perPage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var currentPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var pagination = {};\n total = total === null ? this.dataTotal : total;\n perPage = perPage === null ? this.perPage : perPage;\n currentPage = currentPage === null ? this.currentPage : currentPage;\n return {\n 'total': total,\n 'per_page': perPage,\n 'current_page': currentPage,\n 'last_page': Math.ceil(total / perPage) || 0,\n 'next_page_url': '',\n 'prev_page_url': '',\n 'from': (currentPage - 1) * perPage + 1,\n 'to': Math.min(currentPage * perPage, total)\n };\n },\n normalizeSortOrder: function normalizeSortOrder() {\n this.sortOrder.forEach(function (item) {\n item.sortField = item.sortField || item.field;\n });\n },\n callDataManager: function callDataManager() {\n if (this.dataManager === null && this.data === null) return;\n\n if (Array.isArray(this.data)) {\n return this.setData(this.data);\n }\n\n this.normalizeSortOrder();\n return this.setData(this.dataManager ? this.dataManager(this.sortOrder, this.makePagination()) : this.data);\n },\n onRowClass: function onRowClass(dataItem, index) {\n if (this.rowClassCallback !== '') {\n this.warn('\"row-class-callback\" prop is deprecated, please use \"row-class\" prop instead.');\n return;\n }\n\n if (typeof this.rowClass === 'function') {\n return this.rowClass(dataItem, index);\n }\n\n return this.rowClass;\n },\n onRowChanged: function onRowChanged(dataItem) {\n this.fireEvent('row-changed', dataItem);\n return true;\n },\n onRowClicked: function onRowClicked(dataItem, event) {\n this.$emit(this.eventPrefix + 'row-clicked', dataItem, event);\n return true;\n },\n onRowDoubleClicked: function onRowDoubleClicked(dataItem, event) {\n this.$emit(this.eventPrefix + 'row-dblclicked', dataItem, event);\n },\n onDetailRowClick: function onDetailRowClick(dataItem, event) {\n this.$emit(this.eventPrefix + 'detail-row-clicked', dataItem, event);\n },\n onCellClicked: function onCellClicked(dataItem, field, event) {\n this.$emit(this.eventPrefix + 'cell-clicked', dataItem, field, event);\n },\n onCellDoubleClicked: function onCellDoubleClicked(dataItem, field, event) {\n this.$emit(this.eventPrefix + 'cell-dblclicked', dataItem, field, event);\n },\n onCellRightClicked: function onCellRightClicked(dataItem, field, event) {\n this.$emit(this.eventPrefix + 'cell-rightclicked', dataItem, field, event);\n },\n\n /*\r\n * API for externals\r\n */\n changePage: function changePage(page) {\n if (page === 'prev') {\n this.gotoPreviousPage();\n } else if (page === 'next') {\n this.gotoNextPage();\n } else {\n this.gotoPage(page);\n }\n },\n reload: function reload() {\n return this.loadData();\n },\n refresh: function refresh() {\n this.currentPage = 1;\n return this.loadData();\n },\n resetData: function resetData() {\n this.tableData = null;\n this.tablePagination = null;\n this.fireEvent('data-reset');\n }\n },\n // end: methods\n watch: {\n 'multiSort': function multiSort(newVal, oldVal) {\n if (newVal === false && this.sortOrder.length > 1) {\n this.sortOrder.splice(1);\n this.loadData();\n }\n },\n 'apiUrl': function apiUrl(newVal, oldVal) {\n if (this.reactiveApiUrl && newVal !== oldVal) this.refresh();\n },\n 'data': function data(newVal, oldVal) {\n this.setData(newVal);\n },\n 'tableHeight': function tableHeight(newVal, oldVal) {\n this.fixHeader();\n }\n }\n});\n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/Vuetable.vue?vue&type=script&lang=js&\n /* harmony default export */ const components_Vuetablevue_type_script_lang_js_ = (Vuetablevue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-style-loader/index.js!./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./node_modules/vuetable-2/src/components/Vuetable.vue?vue&type=style&index=0&id=15965e3b&scoped=true&lang=css&\nvar Vuetablevue_type_style_index_0_id_15965e3b_scoped_true_lang_css_ = __webpack_require__(1219);\n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/Vuetable.vue?vue&type=style&index=0&id=15965e3b&scoped=true&lang=css&\n\n;// CONCATENATED MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\n/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nfunction normalizeComponent (\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier, /* server only */\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () {\n injectStyles.call(\n this,\n (options.functional ? this.parent : this).$root.$options.shadowRoot\n )\n }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functional component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/Vuetable.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar component = normalizeComponent(\n components_Vuetablevue_type_script_lang_js_,\n Vuetablevue_type_template_id_15965e3b_scoped_true_render,\n Vuetablevue_type_template_id_15965e3b_scoped_true_staticRenderFns,\n false,\n null,\n \"15965e3b\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"node_modules/vuetable-2/src/components/Vuetable.vue\"\n/* harmony default export */ const Vuetable = (component.exports);\n;// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./node_modules/vuetable-2/src/components/VuetablePagination.vue?vue&type=template&id=3efdd596&\nvar VuetablePaginationvue_type_template_id_3efdd596_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.tablePagination && _vm.tablePagination.last_page > 1,\n expression: \"tablePagination && tablePagination.last_page > 1\"\n }\n ],\n class: _vm.css.wrapperClass\n },\n [\n _c(\n \"a\",\n {\n class: [\n \"btn-nav\",\n _vm.css.linkClass,\n _vm.isOnFirstPage ? _vm.css.disabledClass : \"\"\n ],\n on: {\n click: function($event) {\n return _vm.loadPage(1)\n }\n }\n },\n [\n _vm.css.icons.first != \"\"\n ? _c(\"i\", { class: [_vm.css.icons.first] })\n : _c(\"span\", [_vm._v(\"«\")])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"a\",\n {\n class: [\n \"btn-nav\",\n _vm.css.linkClass,\n _vm.isOnFirstPage ? _vm.css.disabledClass : \"\"\n ],\n on: {\n click: function($event) {\n return _vm.loadPage(\"prev\")\n }\n }\n },\n [\n _vm.css.icons.next != \"\"\n ? _c(\"i\", { class: [_vm.css.icons.prev] })\n : _c(\"span\", [_vm._v(\" \")])\n ]\n ),\n _vm._v(\" \"),\n _vm.notEnoughPages\n ? [\n _vm._l(_vm.totalPage, function(n) {\n return [\n _c(\"a\", {\n class: [\n _vm.css.pageClass,\n _vm.isCurrentPage(n) ? _vm.css.activeClass : \"\"\n ],\n domProps: { innerHTML: _vm._s(n) },\n on: {\n click: function($event) {\n return _vm.loadPage(n)\n }\n }\n })\n ]\n })\n ]\n : [\n _vm._l(_vm.windowSize, function(n) {\n return [\n _c(\"a\", {\n class: [\n _vm.css.pageClass,\n _vm.isCurrentPage(_vm.windowStart + n - 1)\n ? _vm.css.activeClass\n : \"\"\n ],\n domProps: { innerHTML: _vm._s(_vm.windowStart + n - 1) },\n on: {\n click: function($event) {\n return _vm.loadPage(_vm.windowStart + n - 1)\n }\n }\n })\n ]\n })\n ],\n _vm._v(\" \"),\n _c(\n \"a\",\n {\n class: [\n \"btn-nav\",\n _vm.css.linkClass,\n _vm.isOnLastPage ? _vm.css.disabledClass : \"\"\n ],\n on: {\n click: function($event) {\n return _vm.loadPage(\"next\")\n }\n }\n },\n [\n _vm.css.icons.next != \"\"\n ? _c(\"i\", { class: [_vm.css.icons.next] })\n : _c(\"span\", [_vm._v(\" \")])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"a\",\n {\n class: [\n \"btn-nav\",\n _vm.css.linkClass,\n _vm.isOnLastPage ? _vm.css.disabledClass : \"\"\n ],\n on: {\n click: function($event) {\n return _vm.loadPage(_vm.totalPage)\n }\n }\n },\n [\n _vm.css.icons.last != \"\"\n ? _c(\"i\", { class: [_vm.css.icons.last] })\n : _c(\"span\", [_vm._v(\"»\")])\n ]\n )\n ],\n 2\n )\n}\nvar VuetablePaginationvue_type_template_id_3efdd596_staticRenderFns = []\nVuetablePaginationvue_type_template_id_3efdd596_render._withStripped = true\n\n\n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/VuetablePagination.vue?vue&type=template&id=3efdd596&\n\n;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-4[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./node_modules/vuetable-2/src/components/VuetablePaginationMixin.vue?vue&type=script&lang=js&\n/* harmony default export */ const VuetablePaginationMixinvue_type_script_lang_js_ = ({\n props: {\n css: {\n type: Object,\n default: function _default() {\n return {\n wrapperClass: 'ui right floated pagination menu',\n activeClass: 'active large',\n disabledClass: 'disabled',\n pageClass: 'item',\n linkClass: 'icon item',\n paginationClass: 'ui bottom attached segment grid',\n paginationInfoClass: 'left floated left aligned six wide column',\n dropdownClass: 'ui search dropdown',\n icons: {\n first: 'angle double left icon',\n prev: 'left chevron icon',\n next: 'right chevron icon',\n last: 'angle double right icon'\n }\n };\n }\n },\n onEachSide: {\n type: Number,\n default: function _default() {\n return 2;\n }\n }\n },\n data: function data() {\n return {\n eventPrefix: 'vuetable-pagination:',\n tablePagination: null\n };\n },\n computed: {\n totalPage: function totalPage() {\n return this.tablePagination === null ? 0 : this.tablePagination.last_page;\n },\n isOnFirstPage: function isOnFirstPage() {\n return this.tablePagination === null ? false : this.tablePagination.current_page === 1;\n },\n isOnLastPage: function isOnLastPage() {\n return this.tablePagination === null ? false : this.tablePagination.current_page === this.tablePagination.last_page;\n },\n notEnoughPages: function notEnoughPages() {\n return this.totalPage < this.onEachSide * 2 + 4;\n },\n windowSize: function windowSize() {\n return this.onEachSide * 2 + 1;\n },\n windowStart: function windowStart() {\n if (!this.tablePagination || this.tablePagination.current_page <= this.onEachSide) {\n return 1;\n } else if (this.tablePagination.current_page >= this.totalPage - this.onEachSide) {\n return this.totalPage - this.onEachSide * 2;\n }\n\n return this.tablePagination.current_page - this.onEachSide;\n }\n },\n methods: {\n loadPage: function loadPage(page) {\n this.$emit(this.eventPrefix + 'change-page', page);\n },\n isCurrentPage: function isCurrentPage(page) {\n return page === this.tablePagination.current_page;\n },\n setPaginationData: function setPaginationData(tablePagination) {\n this.tablePagination = tablePagination;\n },\n resetData: function resetData() {\n this.tablePagination = null;\n }\n }\n});\n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/VuetablePaginationMixin.vue?vue&type=script&lang=js&\n /* harmony default export */ const components_VuetablePaginationMixinvue_type_script_lang_js_ = (VuetablePaginationMixinvue_type_script_lang_js_); \n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/VuetablePaginationMixin.vue\nvar VuetablePaginationMixin_render, VuetablePaginationMixin_staticRenderFns\n;\n\n\n\n/* normalize component */\n;\nvar VuetablePaginationMixin_component = normalizeComponent(\n components_VuetablePaginationMixinvue_type_script_lang_js_,\n VuetablePaginationMixin_render,\n VuetablePaginationMixin_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var VuetablePaginationMixin_api; }\nVuetablePaginationMixin_component.options.__file = \"node_modules/vuetable-2/src/components/VuetablePaginationMixin.vue\"\n/* harmony default export */ const VuetablePaginationMixin = (VuetablePaginationMixin_component.exports);\n;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-4[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./node_modules/vuetable-2/src/components/VuetablePagination.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ const VuetablePaginationvue_type_script_lang_js_ = ({\n mixins: [VuetablePaginationMixin]\n});\n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/VuetablePagination.vue?vue&type=script&lang=js&\n /* harmony default export */ const components_VuetablePaginationvue_type_script_lang_js_ = (VuetablePaginationvue_type_script_lang_js_); \n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/VuetablePagination.vue\n\n\n\n\n\n/* normalize component */\n;\nvar VuetablePagination_component = normalizeComponent(\n components_VuetablePaginationvue_type_script_lang_js_,\n VuetablePaginationvue_type_template_id_3efdd596_render,\n VuetablePaginationvue_type_template_id_3efdd596_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var VuetablePagination_api; }\nVuetablePagination_component.options.__file = \"node_modules/vuetable-2/src/components/VuetablePagination.vue\"\n/* harmony default export */ const VuetablePagination = (VuetablePagination_component.exports);\n;// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./node_modules/vuetable-2/src/components/VuetablePaginationInfo.vue?vue&type=template&id=17724083&\nvar VuetablePaginationInfovue_type_template_id_17724083_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", {\n class: [\"vuetable-pagination-info\", _vm.css.infoClass],\n domProps: { innerHTML: _vm._s(_vm.paginationInfo) }\n })\n}\nvar VuetablePaginationInfovue_type_template_id_17724083_staticRenderFns = []\nVuetablePaginationInfovue_type_template_id_17724083_render._withStripped = true\n\n\n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/VuetablePaginationInfo.vue?vue&type=template&id=17724083&\n\n;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-4[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./node_modules/vuetable-2/src/components/VuetablePaginationInfoMixin.vue?vue&type=script&lang=js&\n/* harmony default export */ const VuetablePaginationInfoMixinvue_type_script_lang_js_ = ({\n props: {\n css: {\n type: Object,\n default: function _default() {\n return {\n infoClass: 'left floated left aligned six wide column'\n };\n }\n },\n infoTemplate: {\n type: String,\n default: function _default() {\n return \"Displaying {from} to {to} of {total} items\";\n }\n },\n noDataTemplate: {\n type: String,\n default: function _default() {\n return 'No relevant data';\n }\n }\n },\n data: function data() {\n return {\n tablePagination: null\n };\n },\n computed: {\n paginationInfo: function paginationInfo() {\n if (this.tablePagination == null || this.tablePagination.total == 0) {\n return this.noDataTemplate;\n }\n\n return this.infoTemplate.replace('{from}', this.tablePagination.from || 0).replace('{to}', this.tablePagination.to || 0).replace('{total}', this.tablePagination.total || 0);\n }\n },\n methods: {\n setPaginationData: function setPaginationData(tablePagination) {\n this.tablePagination = tablePagination;\n },\n resetData: function resetData() {\n this.tablePagination = null;\n }\n }\n});\n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/VuetablePaginationInfoMixin.vue?vue&type=script&lang=js&\n /* harmony default export */ const components_VuetablePaginationInfoMixinvue_type_script_lang_js_ = (VuetablePaginationInfoMixinvue_type_script_lang_js_); \n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/VuetablePaginationInfoMixin.vue\nvar VuetablePaginationInfoMixin_render, VuetablePaginationInfoMixin_staticRenderFns\n;\n\n\n\n/* normalize component */\n;\nvar VuetablePaginationInfoMixin_component = normalizeComponent(\n components_VuetablePaginationInfoMixinvue_type_script_lang_js_,\n VuetablePaginationInfoMixin_render,\n VuetablePaginationInfoMixin_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var VuetablePaginationInfoMixin_api; }\nVuetablePaginationInfoMixin_component.options.__file = \"node_modules/vuetable-2/src/components/VuetablePaginationInfoMixin.vue\"\n/* harmony default export */ const VuetablePaginationInfoMixin = (VuetablePaginationInfoMixin_component.exports);\n;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-4[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./node_modules/vuetable-2/src/components/VuetablePaginationInfo.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ const VuetablePaginationInfovue_type_script_lang_js_ = ({\n mixins: [VuetablePaginationInfoMixin]\n});\n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/VuetablePaginationInfo.vue?vue&type=script&lang=js&\n /* harmony default export */ const components_VuetablePaginationInfovue_type_script_lang_js_ = (VuetablePaginationInfovue_type_script_lang_js_); \n;// CONCATENATED MODULE: ./node_modules/vuetable-2/src/components/VuetablePaginationInfo.vue\n\n\n\n\n\n/* normalize component */\n;\nvar VuetablePaginationInfo_component = normalizeComponent(\n components_VuetablePaginationInfovue_type_script_lang_js_,\n VuetablePaginationInfovue_type_template_id_17724083_render,\n VuetablePaginationInfovue_type_template_id_17724083_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var VuetablePaginationInfo_api; }\nVuetablePaginationInfo_component.options.__file = \"node_modules/vuetable-2/src/components/VuetablePaginationInfo.vue\"\n/* harmony default export */ const VuetablePaginationInfo = (VuetablePaginationInfo_component.exports);\n;// CONCATENATED MODULE: ./app/list/VuetableCssConfig.js\n/* harmony default export */ const VuetableCssConfig = ({\n table: {\n tableClass: 'table',\n loadingClass: 'loading',\n sortableIcon: '',\n ascendingIcon: 'fa fa-fw fa-chevron-up',\n descendingIcon: 'fa fa-fw fa-chevron-down',\n ascendingClass: '',\n descendingClass: '',\n handleIcon: 'fa fa-fw fa-bars',\n renderIcon: function renderIcon(classes, options) {\n return \"<i class=\\\"\".concat(classes.join(' '), \"\\\"></i>\");\n }\n },\n pagination: {\n wrapperClass: 'flex-objects-pagination',\n activeClass: 'button active',\n disabledClass: 'button disabled',\n pageClass: 'button page',\n linkClass: 'button link',\n icons: {\n first: 'fa fa-fw fa-angle-double-left',\n prev: 'fa fa-fw fa-chevron-left',\n next: 'fa fa-fw fa-chevron-right',\n last: 'fa fa-fw fa-angle-double-right'\n }\n },\n paginationInfo: {\n infoClass: ''\n }\n});\n// EXTERNAL MODULE: ./node_modules/lodash/lodash.js\nvar lodash = __webpack_require__(9450);\nvar lodash_default = /*#__PURE__*/__webpack_require__.n(lodash);\n;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-4[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./app/list/components/Table.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ const Tablevue_type_script_lang_js_ = ({\n props: ['store', 'value'],\n components: {\n Vuetable: Vuetable,\n VuetablePagination: VuetablePagination,\n VuetablePaginationInfo: VuetablePaginationInfo\n },\n data: function data() {\n return {\n css: VuetableCssConfig,\n perPage: 10,\n data: [],\n extraParams: {}\n };\n },\n created: function created() {\n this.perPage = this.store.perPage;\n this.data = Object.values(this.store.data);\n },\n mounted: function mounted() {\n var _this = this;\n\n this.$refs.vuetable.setData(this.store.data);\n this.$events.$on('filter-set', function (event) {\n return _this.onFilterSet(event);\n });\n this.$events.$on('filter-reset', function (event) {\n return _this.onFilterReset();\n });\n this.$events.$on('filter-perPage', function (event) {\n return _this.onFilterPerPage(event);\n });\n },\n methods: {\n onPaginationData: function onPaginationData(paginationData) {\n this.$refs.pagination.setPaginationData(paginationData);\n this.$refs.paginationInfo.setPaginationData(paginationData);\n },\n onFilterSet: function onFilterSet(filterText) {\n var _this2 = this;\n\n lodash_default().set(this.extraParams, 'filter', filterText);\n\n vue_runtime_esm.nextTick(function () {\n return _this2.$refs.vuetable.refresh();\n });\n },\n onFilterReset: function onFilterReset() {\n var _this3 = this;\n\n lodash_default().unset(this.extraParams, 'filter');\n\n vue_runtime_esm.nextTick(function () {\n return _this3.$refs.vuetable.refresh();\n });\n },\n onFilterPerPage: function onFilterPerPage(limit) {\n var _this4 = this;\n\n console.log('onFilterPerPage', limit, this.store.data);\n this.perPage = limit || this.$refs.paginationInfo.tablePagination.total; // this.$refs.vuetable.perPage = limit;\n\n vue_runtime_esm.nextTick(function () {\n return _this4.$refs.vuetable.refresh();\n });\n },\n onChangePage: function onChangePage(page) {\n this.$refs.vuetable.changePage(page);\n },\n onVuetableLoading: function onVuetableLoading() {\n this.$emit('input', true);\n },\n onVueTableLoadSuccess: function onVueTableLoadSuccess() {\n this.$emit('input', false);\n }\n }\n});\n;// CONCATENATED MODULE: ./app/list/components/Table.vue?vue&type=script&lang=js&\n /* harmony default export */ const components_Tablevue_type_script_lang_js_ = (Tablevue_type_script_lang_js_); \n;// CONCATENATED MODULE: ./app/list/components/Table.vue\n\n\n\n\n\n/* normalize component */\n;\nvar Table_component = normalizeComponent(\n components_Tablevue_type_script_lang_js_,\n Tablevue_type_template_id_13dedc8c_render,\n Tablevue_type_template_id_13dedc8c_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var Table_api; }\nTable_component.options.__file = \"app/list/components/Table.vue\"\n/* harmony default export */ const Table = (Table_component.exports);\n;// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./app/list/components/FilterBar.vue?vue&type=template&id=5e195a32&scoped=true&\nvar FilterBarvue_type_template_id_5e195a32_scoped_true_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"search-wrapper\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.trim\",\n value: _vm.filterText,\n expression: \"filterText\",\n modifiers: { trim: true }\n }\n ],\n staticClass: \"search\",\n attrs: { type: \"text\", placeholder: _vm.store.searchPlaceholder },\n domProps: { value: _vm.filterText },\n on: {\n input: [\n function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.filterText = $event.target.value.trim()\n },\n _vm.doFilter\n ],\n blur: function($event) {\n return _vm.$forceUpdate()\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.store.perPage,\n expression: \"store.perPage\"\n }\n ],\n staticClass: \"filter-perPage\",\n on: {\n change: [\n function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.store,\n \"perPage\",\n $event.target.multiple ? $$selectedVal : $$selectedVal[0]\n )\n },\n _vm.changePerPage\n ]\n }\n },\n _vm._l(this.perPageOptions, function(value, title) {\n return _c(\n \"option\",\n { domProps: { value: value, selected: _vm.store.perPage === value } },\n [_vm._v(_vm._s(title))]\n )\n }),\n 0\n )\n ])\n}\nvar FilterBarvue_type_template_id_5e195a32_scoped_true_staticRenderFns = []\nFilterBarvue_type_template_id_5e195a32_scoped_true_render._withStripped = true\n\n\n;// CONCATENATED MODULE: ./app/list/components/FilterBar.vue?vue&type=template&id=5e195a32&scoped=true&\n\n;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-4[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./app/list/components/FilterBar.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ const FilterBarvue_type_script_lang_js_ = ({\n props: ['store'],\n data: function data() {\n return {\n filterText: '',\n searchPlaceholder: 'Filter...',\n selected: ''\n };\n },\n computed: {\n perPageOptions: function perPageOptions() {\n var options = {\n '25': 25,\n '50': 50,\n '100': 100,\n '200': 200,\n 'All': ''\n };\n\n if (!options[this.store.perPage]) {\n options[this.store.perPage] = this.store.perPage;\n }\n\n return options;\n }\n },\n created: function created() {\n var _this = this;\n\n this.doFilter = (0,lodash.debounce)(function () {\n _this.$events.fire('filter-set', _this.filterText);\n }, 250, {\n leading: false\n });\n\n this.changePerPage = function () {\n _this.$events.fire('filter-perPage', _this.store.perPage);\n };\n },\n methods: {\n resetFilter: function resetFilter() {\n this.filterText = '';\n this.$events.fire('filter-reset');\n }\n }\n});\n;// CONCATENATED MODULE: ./app/list/components/FilterBar.vue?vue&type=script&lang=js&\n /* harmony default export */ const components_FilterBarvue_type_script_lang_js_ = (FilterBarvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-style-loader/index.js!./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./app/list/components/FilterBar.vue?vue&type=style&index=0&id=5e195a32&scoped=true&lang=css&\nvar FilterBarvue_type_style_index_0_id_5e195a32_scoped_true_lang_css_ = __webpack_require__(4387);\n;// CONCATENATED MODULE: ./app/list/components/FilterBar.vue?vue&type=style&index=0&id=5e195a32&scoped=true&lang=css&\n\n;// CONCATENATED MODULE: ./app/list/components/FilterBar.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar FilterBar_component = normalizeComponent(\n components_FilterBarvue_type_script_lang_js_,\n FilterBarvue_type_template_id_5e195a32_scoped_true_render,\n FilterBarvue_type_template_id_5e195a32_scoped_true_staticRenderFns,\n false,\n null,\n \"5e195a32\",\n null\n \n)\n\n/* hot reload */\nif (false) { var FilterBar_api; }\nFilterBar_component.options.__file = \"app/list/components/FilterBar.vue\"\n/* harmony default export */ const FilterBar = (FilterBar_component.exports);\n;// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./app/list/components/ContentLoader.vue?vue&type=template&id=6dda5650&\nvar ContentLoadervue_type_template_id_6dda5650_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _c(\"div\", { style: { height: 300, width: \"100%\" } }),\n _vm._v(\" \"),\n _c(\n \"content-loader\",\n {\n attrs: {\n height: _vm.fixedAmount * _vm.count,\n width: 1060,\n speed: 2,\n primaryColor: \"#d9d9d9\",\n secondaryColor: \"#ecebeb\"\n }\n },\n [\n _vm._l(_vm.count, function(index) {\n return [\n _c(\"rect\", {\n attrs: {\n x: \"13\",\n y: _vm.fixedAmount * index + _vm.offset,\n rx: \"6\",\n ry: \"6\",\n width: 200 * _vm.random(),\n height: \"12\"\n }\n }),\n _vm._v(\" \"),\n _c(\"rect\", {\n attrs: {\n x: \"533\",\n y: _vm.fixedAmount * index + _vm.offset,\n rx: \"6\",\n ry: \"6\",\n width: 63 * _vm.random(),\n height: \"12\"\n }\n }),\n _vm._v(\" \"),\n _c(\"rect\", {\n attrs: {\n x: \"653\",\n y: _vm.fixedAmount * index + _vm.offset,\n rx: \"6\",\n ry: \"6\",\n width: 78 * _vm.random(),\n height: \"12\"\n }\n }),\n _vm._v(\" \"),\n _c(\"rect\", {\n attrs: {\n x: \"755\",\n y: _vm.fixedAmount * index + _vm.offset,\n rx: \"6\",\n ry: \"6\",\n width: 117 * _vm.random(),\n height: \"12\"\n }\n }),\n _vm._v(\" \"),\n _c(\"rect\", {\n attrs: {\n x: \"938\",\n y: _vm.fixedAmount * index + _vm.offset,\n rx: \"6\",\n ry: \"6\",\n width: 83 * _vm.random(),\n height: \"12\"\n }\n }),\n _vm._v(\" \"),\n _c(\"rect\", {\n attrs: {\n x: \"0\",\n y: _vm.fixedAmount * index,\n rx: \"6\",\n ry: \"6\",\n width: \"1060\",\n height: \".3\"\n }\n })\n ]\n })\n ],\n 2\n )\n ],\n 1\n )\n}\nvar ContentLoadervue_type_template_id_6dda5650_staticRenderFns = []\nContentLoadervue_type_template_id_6dda5650_render._withStripped = true\n\n\n;// CONCATENATED MODULE: ./app/list/components/ContentLoader.vue?vue&type=template&id=6dda5650&\n\n// EXTERNAL MODULE: ./node_modules/babel-helper-vue-jsx-merge-props/index.js\nvar babel_helper_vue_jsx_merge_props = __webpack_require__(1720);\nvar babel_helper_vue_jsx_merge_props_default = /*#__PURE__*/__webpack_require__.n(babel_helper_vue_jsx_merge_props);\n;// CONCATENATED MODULE: ./node_modules/vue-content-loader/dist/vue-content-loader.es.js\n\n\nvar vue_content_loader_es_uid = function uid() {\n return Math.random().toString(36).substring(2);\n};\n\nvar ContentLoader = {\n name: 'ContentLoader',\n functional: true,\n props: {\n width: {\n type: [Number, String],\n \"default\": 400\n },\n height: {\n type: [Number, String],\n \"default\": 130\n },\n speed: {\n type: Number,\n \"default\": 2\n },\n preserveAspectRatio: {\n type: String,\n \"default\": 'xMidYMid meet'\n },\n baseUrl: {\n type: String,\n \"default\": ''\n },\n primaryColor: {\n type: String,\n \"default\": '#f9f9f9'\n },\n secondaryColor: {\n type: String,\n \"default\": '#ecebeb'\n },\n primaryOpacity: {\n type: Number,\n \"default\": 1\n },\n secondaryOpacity: {\n type: Number,\n \"default\": 1\n },\n uniqueKey: {\n type: String\n },\n animate: {\n type: Boolean,\n \"default\": true\n }\n },\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n var idClip = props.uniqueKey ? props.uniqueKey + \"-idClip\" : vue_content_loader_es_uid();\n var idGradient = props.uniqueKey ? props.uniqueKey + \"-idGradient\" : vue_content_loader_es_uid();\n return h(\"svg\", babel_helper_vue_jsx_merge_props_default()([data, {\n attrs: {\n viewBox: \"0 0 \" + props.width + \" \" + props.height,\n version: \"1.1\",\n preserveAspectRatio: props.preserveAspectRatio\n }\n }]), [h(\"rect\", {\n style: {\n fill: \"url(\" + props.baseUrl + \"#\" + idGradient + \")\"\n },\n attrs: {\n \"clip-path\": \"url(\" + props.baseUrl + \"#\" + idClip + \")\",\n x: \"0\",\n y: \"0\",\n width: props.width,\n height: props.height\n }\n }), h(\"defs\", [h(\"clipPath\", {\n attrs: {\n id: idClip\n }\n }, [children || h(\"rect\", {\n attrs: {\n x: \"0\",\n y: \"0\",\n rx: \"5\",\n ry: \"5\",\n width: props.width,\n height: props.height\n }\n })]), h(\"linearGradient\", {\n attrs: {\n id: idGradient\n }\n }, [h(\"stop\", {\n attrs: {\n offset: \"0%\",\n \"stop-color\": props.primaryColor,\n \"stop-opacity\": props.primaryOpacity\n }\n }, [props.animate ? h(\"animate\", {\n attrs: {\n attributeName: \"offset\",\n values: \"-2; 1\",\n dur: props.speed + \"s\",\n repeatCount: \"indefinite\"\n }\n }) : null]), h(\"stop\", {\n attrs: {\n offset: \"50%\",\n \"stop-color\": props.secondaryColor,\n \"stop-opacity\": props.secondaryOpacity\n }\n }, [props.animate ? h(\"animate\", {\n attrs: {\n attributeName: \"offset\",\n values: \"-1.5; 1.5\",\n dur: props.speed + \"s\",\n repeatCount: \"indefinite\"\n }\n }) : null]), h(\"stop\", {\n attrs: {\n offset: \"100%\",\n \"stop-color\": props.primaryColor,\n \"stop-opacity\": props.primaryOpacity\n }\n }, [props.animate ? h(\"animate\", {\n attrs: {\n attributeName: \"offset\",\n values: \"-1; 2\",\n dur: props.speed + \"s\",\n repeatCount: \"indefinite\"\n }\n }) : null])])])]);\n }\n};\nvar BulletListLoader = {\n name: 'BulletListLoader',\n functional: true,\n render: function render(h, _ref) {\n var data = _ref.data;\n return h(ContentLoader, data, [h(\"circle\", {\n attrs: {\n cx: \"10\",\n cy: \"20\",\n r: \"8\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"25\",\n y: \"15\",\n rx: \"5\",\n ry: \"5\",\n width: \"220\",\n height: \"10\"\n }\n }), h(\"circle\", {\n attrs: {\n cx: \"10\",\n cy: \"50\",\n r: \"8\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"25\",\n y: \"45\",\n rx: \"5\",\n ry: \"5\",\n width: \"220\",\n height: \"10\"\n }\n }), h(\"circle\", {\n attrs: {\n cx: \"10\",\n cy: \"80\",\n r: \"8\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"25\",\n y: \"75\",\n rx: \"5\",\n ry: \"5\",\n width: \"220\",\n height: \"10\"\n }\n }), h(\"circle\", {\n attrs: {\n cx: \"10\",\n cy: \"110\",\n r: \"8\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"25\",\n y: \"105\",\n rx: \"5\",\n ry: \"5\",\n width: \"220\",\n height: \"10\"\n }\n })]);\n }\n};\nvar CodeLoader = {\n name: 'CodeLoader',\n functional: true,\n render: function render(h, _ref) {\n var data = _ref.data;\n return h(ContentLoader, data, [h(\"rect\", {\n attrs: {\n x: \"0\",\n y: \"0\",\n rx: \"3\",\n ry: \"3\",\n width: \"70\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"80\",\n y: \"0\",\n rx: \"3\",\n ry: \"3\",\n width: \"100\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"190\",\n y: \"0\",\n rx: \"3\",\n ry: \"3\",\n width: \"10\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"15\",\n y: \"20\",\n rx: \"3\",\n ry: \"3\",\n width: \"130\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"155\",\n y: \"20\",\n rx: \"3\",\n ry: \"3\",\n width: \"130\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"15\",\n y: \"40\",\n rx: \"3\",\n ry: \"3\",\n width: \"90\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"115\",\n y: \"40\",\n rx: \"3\",\n ry: \"3\",\n width: \"60\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"185\",\n y: \"40\",\n rx: \"3\",\n ry: \"3\",\n width: \"60\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"0\",\n y: \"60\",\n rx: \"3\",\n ry: \"3\",\n width: \"30\",\n height: \"10\"\n }\n })]);\n }\n};\nvar FacebookLoader = {\n name: 'FacebookLoader',\n functional: true,\n render: function render(h, _ref) {\n var data = _ref.data;\n return h(ContentLoader, data, [h(\"rect\", {\n attrs: {\n x: \"70\",\n y: \"15\",\n rx: \"4\",\n ry: \"4\",\n width: \"117\",\n height: \"6.4\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"70\",\n y: \"35\",\n rx: \"3\",\n ry: \"3\",\n width: \"85\",\n height: \"6.4\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"0\",\n y: \"80\",\n rx: \"3\",\n ry: \"3\",\n width: \"350\",\n height: \"6.4\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"0\",\n y: \"100\",\n rx: \"3\",\n ry: \"3\",\n width: \"380\",\n height: \"6.4\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"0\",\n y: \"120\",\n rx: \"3\",\n ry: \"3\",\n width: \"201\",\n height: \"6.4\"\n }\n }), h(\"circle\", {\n attrs: {\n cx: \"30\",\n cy: \"30\",\n r: \"30\"\n }\n })]);\n }\n};\nvar ListLoader = {\n name: 'ListLoader',\n functional: true,\n render: function render(h, _ref) {\n var data = _ref.data;\n return h(ContentLoader, data, [h(\"rect\", {\n attrs: {\n x: \"0\",\n y: \"0\",\n rx: \"3\",\n ry: \"3\",\n width: \"250\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"20\",\n y: \"20\",\n rx: \"3\",\n ry: \"3\",\n width: \"220\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"20\",\n y: \"40\",\n rx: \"3\",\n ry: \"3\",\n width: \"170\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"0\",\n y: \"60\",\n rx: \"3\",\n ry: \"3\",\n width: \"250\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"20\",\n y: \"80\",\n rx: \"3\",\n ry: \"3\",\n width: \"200\",\n height: \"10\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"20\",\n y: \"100\",\n rx: \"3\",\n ry: \"3\",\n width: \"80\",\n height: \"10\"\n }\n })]);\n }\n};\nvar InstagramLoader = {\n name: 'InstagramLoader',\n functional: true,\n render: function render(h, _ref) {\n var data = _ref.data;\n return h(ContentLoader, babel_helper_vue_jsx_merge_props_default()([data, {\n attrs: {\n height: 480\n }\n }]), [h(\"circle\", {\n attrs: {\n cx: \"30\",\n cy: \"30\",\n r: \"30\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"75\",\n y: \"13\",\n rx: \"4\",\n ry: \"4\",\n width: \"100\",\n height: \"13\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"75\",\n y: \"37\",\n rx: \"4\",\n ry: \"4\",\n width: \"50\",\n height: \"8\"\n }\n }), h(\"rect\", {\n attrs: {\n x: \"0\",\n y: \"70\",\n rx: \"5\",\n ry: \"5\",\n width: \"400\",\n height: \"400\"\n }\n })]);\n }\n};\n\n;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-4[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./app/list/components/ContentLoader.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ const ContentLoadervue_type_script_lang_js_ = ({\n props: ['store'],\n data: function data() {\n return {\n fixedAmount: 31,\n offset: 10,\n steps: [0.7, 0.8, 0.9, 1]\n };\n },\n computed: {\n count: function count() {\n return this.store.perPage;\n }\n },\n methods: {\n random: function random() {\n return this.steps[Math.floor(Math.random() * this.steps.length)];\n }\n },\n components: {\n ContentLoader: ContentLoader\n }\n});\n;// CONCATENATED MODULE: ./app/list/components/ContentLoader.vue?vue&type=script&lang=js&\n /* harmony default export */ const components_ContentLoadervue_type_script_lang_js_ = (ContentLoadervue_type_script_lang_js_); \n;// CONCATENATED MODULE: ./app/list/components/ContentLoader.vue\n\n\n\n\n\n/* normalize component */\n;\nvar ContentLoader_component = normalizeComponent(\n components_ContentLoadervue_type_script_lang_js_,\n ContentLoadervue_type_template_id_6dda5650_render,\n ContentLoadervue_type_template_id_6dda5650_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var ContentLoader_api; }\nContentLoader_component.options.__file = \"app/list/components/ContentLoader.vue\"\n/* harmony default export */ const components_ContentLoader = (ContentLoader_component.exports);\n;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-4[0].rules[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./app/list/App.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ const Appvue_type_script_lang_js_ = ({\n props: ['initialStore'],\n components: {\n FlexTable: Table,\n FlexFilterBar: FilterBar,\n FlexContentLoader: components_ContentLoader\n },\n data: function data() {\n return {\n perPage: 10,\n loading: true\n };\n },\n computed: {\n store: function store() {\n return JSON.parse(this.initialStore || '{}');\n }\n }\n});\n;// CONCATENATED MODULE: ./app/list/App.vue?vue&type=script&lang=js&\n /* harmony default export */ const list_Appvue_type_script_lang_js_ = (Appvue_type_script_lang_js_); \n;// CONCATENATED MODULE: ./app/list/App.vue\n\n\n\n\n\n/* normalize component */\n;\nvar App_component = normalizeComponent(\n list_Appvue_type_script_lang_js_,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var App_api; }\nApp_component.options.__file = \"app/list/App.vue\"\n/* harmony default export */ const App = (App_component.exports);\n;// CONCATENATED MODULE: ./app/list/index.js\n\n\n\nvue_runtime_esm.use(dist/* default */.Z);\nvar ID = '#flex-objects-list';\nvar list_element = document.querySelector(ID);\n\nif (list_element) {\n var initialStore = list_element.dataset.initialStore;\n new vue_runtime_esm({\n // eslint-disable-line no-new\n el: ID,\n render: function render(h) {\n return h(App, {\n props: {\n initialStore: initialStore\n }\n });\n }\n });\n}\n;// CONCATENATED MODULE: external \"jQuery\"\nconst external_jQuery_namespaceObject = jQuery;\nvar external_jQuery_default = /*#__PURE__*/__webpack_require__.n(external_jQuery_namespaceObject);\n// EXTERNAL MODULE: ./node_modules/eventemitter3/index.js\nvar eventemitter3 = __webpack_require__(4238);\nvar eventemitter3_default = /*#__PURE__*/__webpack_require__.n(eventemitter3);\n;// CONCATENATED MODULE: ./app/utils/finder.js\nfunction finder_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { finder_typeof = function _typeof(obj) { return typeof obj; }; } else { finder_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return finder_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n * (c) Trilby Media, LLC\n * Author Djamil Legato\n *\n * Based on Mark Matyas's Finderjs\n * MIT License\n */\n\n\nvar DEFAULTS = {\n labelKey: 'name',\n valueKey: 'value',\n // new\n childKey: 'children',\n iconKey: 'icon',\n // new\n itemKey: 'item-key',\n // new\n itemTrigger: null,\n pathBar: true,\n className: {\n container: 'fjs-container',\n pathBar: 'fjs-path-bar',\n col: 'fjs-col',\n list: 'fjs-list',\n item: 'fjs-item',\n active: 'fjs-active',\n children: 'fjs-has-children',\n url: 'fjs-url',\n itemPrepend: 'fjs-item-prepend',\n itemContent: 'fjs-item-content',\n itemAppend: 'fjs-item-append'\n }\n};\n\nvar Finder = /*#__PURE__*/function () {\n function Finder(container, data, options) {\n var _this = this;\n\n _classCallCheck(this, Finder);\n\n this.$emitter = new (eventemitter3_default())();\n this.container = external_jQuery_default()(container);\n this.data = data;\n this.config = external_jQuery_default().extend(true, {}, DEFAULTS, options);\n this.container.off('click.finder keydown.finder'); // dom events\n\n this.container.on('click.finder', this.clickEvent.bind(this));\n this.container.on('keydown.finder', this.keydownEvent.bind(this)); // internal events\n\n this.$emitter.on('item-selected', this.itemSelected.bind(this));\n this.$emitter.on('create-column', this.addColumn.bind(this));\n this.$emitter.on('navigate', this.navigate.bind(this));\n this.$emitter.on('go-to', this.goTo.bind(this, this.data));\n this.container.addClass(this.config.className.container).attr('tabindex', 0);\n this.createColumn(this.data);\n\n if (this.config.pathBar) {\n this.pathBar = this.createPathBar();\n this.pathBar.on('click.finder', '[data-breadcrumb-node]', function (event) {\n event.preventDefault();\n var location = external_jQuery_default()(event.currentTarget).data('breadcrumbNode');\n\n _this.goTo(_this.data, location);\n });\n } // '' is <Root>\n\n\n if (this.config.defaultPath || this.config.defaultPath === '') {\n this.goTo(this.data, this.config.defaultPath);\n }\n }\n\n _createClass(Finder, [{\n key: \"reload\",\n value: function reload() {\n var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data;\n this.createColumn(data); // '' is <Root>\n\n if (this.config.defaultPath || this.config.defaultPath === '') {\n this.goTo(data, this.config.defaultPath);\n }\n }\n }, {\n key: \"createColumn\",\n value: function createColumn(data, parent) {\n var _this2 = this;\n\n var callback = function callback(data) {\n return _this2.createColumn(data, parent);\n };\n\n if (typeof data === 'function') {\n data.call(this, parent, callback);\n } else if (Array.isArray(data) || finder_typeof(data) === 'object') {\n if (finder_typeof(data) === 'object') {\n data = Array.from(data);\n }\n\n var list = this.config.createList || this.createList;\n var div = external_jQuery_default()('<div />');\n div.append(list.call(this, data)).addClass(this.config.className.col);\n this.$emitter.emit('create-column', div);\n return div;\n } else {\n throw new Error('Unknown data type');\n }\n }\n }, {\n key: \"createPathBar\",\n value: function createPathBar() {\n this.container.siblings(\".\".concat(this.config.className.pathBar)).remove();\n var pathBar = external_jQuery_default()(\"<div class=\\\"\".concat(this.config.className.pathBar, \"\\\" />\"));\n pathBar.insertAfter(this.container);\n return pathBar;\n }\n }, {\n key: \"clickEvent\",\n value: function clickEvent(event) {\n var target = external_jQuery_default()(event.target);\n var column = target.closest(\".\".concat(this.config.className.col));\n var item = target.closest(\".\".concat(this.config.className.item));\n var prevent = target.is('[data-flexpages-prevent]') ? target : target.closest('[data-flexpages-prevent]');\n\n if (prevent.data('flexpagesPrevent') === undefined) {\n return true;\n }\n\n if (this.config.itemTrigger) {\n if (target.is(this.config.itemTrigger) || target.closest(this.config.itemTrigger).length) {\n event.stopPropagation();\n event.preventDefault();\n this.$emitter.emit('item-selected', {\n column: column,\n item: item\n });\n }\n\n return true;\n }\n\n event.stopPropagation();\n event.preventDefault();\n\n if (item.length) {\n this.$emitter.emit('item-selected', {\n column: column,\n item: item\n });\n }\n }\n }, {\n key: \"keydownEvent\",\n value: function keydownEvent(event) {\n var codes = {\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 13: 'enter'\n };\n\n if (event.keyCode in codes) {\n event.stopPropagation();\n event.preventDefault();\n this.$emitter.emit('navigate', {\n direction: codes[event.keyCode]\n });\n }\n }\n }, {\n key: \"itemSelected\",\n value: function itemSelected(value) {\n var element = value.item;\n\n if (!element.length) {\n return false;\n }\n\n var item = element[0]._item;\n var column = value.column;\n var data = item[this.config.childKey] || this.data; // TODO: this.data for constant refresh\n\n var active = external_jQuery_default()(column).find(\".\".concat(this.config.className.active));\n\n if (active.length) {\n active.removeClass(this.config.className.active);\n }\n\n element.addClass(this.config.className.active);\n column.nextAll().remove(); // ?!?!?\n\n this.container[0].focus();\n window.scrollTo(window.pageXOffset, window.pageYOffset);\n this.updatePathBar();\n var newColumn;\n\n if (data) {\n newColumn = this.createColumn(data, item);\n this.$emitter.emit('interior-selected', item);\n } else {\n this.$emitter.emit('leaf-selected', item);\n }\n\n return newColumn;\n }\n }, {\n key: \"addColumn\",\n value: function addColumn(column) {\n this.container.append(column);\n this.$emitter.emit('column-created', column);\n }\n }, {\n key: \"navigate\",\n value: function navigate(value) {\n var active = this.findLastActive();\n var direction = value.direction;\n var column;\n var item;\n var target;\n\n if (active) {\n item = active.item;\n column = active.column;\n\n if (direction === 'up' && item.prev().length) {\n target = item.prev();\n } else if (direction === 'down' && item.next().length) {\n target = item.next();\n } else if (direction === 'right' && column.next().length) {\n column = column.next();\n target = column.find(\".\".concat(this.config.className.item)).first();\n } else if (direction === 'left' && column.prev().length) {\n column = column.prev();\n target = column.find(\".\".concat(this.config.className.active)).first() || column.find(\".\".concat(this.config.className.item));\n }\n } else {\n column = this.container.find(\".\".concat(this.config.className.col)).first();\n target = column.find(\".\".concat(this.config.className.item)).first();\n }\n\n if (active && direction === 'enter') {\n var href = active.item.find('a').prop('href');\n\n if (href) {\n window.location = href;\n }\n }\n\n if (target) {\n this.$emitter.emit('item-selected', {\n column: column,\n item: target\n });\n\n if (!this.isInView(target, column, true)) {\n this.scrollToView(target[0], column[0]);\n }\n }\n }\n }, {\n key: \"goTo\",\n value: function goTo(data, path) {\n var _this3 = this;\n\n path = Array.isArray(path) ? path : path.split('/').map(function (bit) {\n return bit.trim();\n }).filter(Boolean);\n\n if (path.length) {\n this.container.children().remove();\n }\n\n if (typeof data === 'function') {\n data.call(this, null, function (data) {\n return _this3.selectPath(path, data);\n });\n } else {\n this.selectPath(path, data);\n }\n }\n }, {\n key: \"selectPath\",\n value: function selectPath(path, data, column) {\n var _this4 = this;\n\n column = column || (path.length ? this.createColumn(data) : this.container.find(\"> .\".concat(this.config.className.col)));\n var current = path[0] || '';\n var children = data.find(function (item) {\n return item[_this4.config.itemKey] === current;\n });\n var item = column.find(\"[data-fjs-item=\\\"\".concat(current, \"\\\"]\")).first();\n var newColumn = this.itemSelected({\n column: column,\n item: item\n });\n\n if (!this.isInView(item, column, true)) {\n this.scrollToView(item[0], column[0]);\n }\n\n path.shift();\n\n if (path.length && children) {\n this.selectPath(path, children[this.config.childKey], newColumn);\n }\n }\n }, {\n key: \"findLastActive\",\n value: function findLastActive() {\n var active = this.container.find(\".\".concat(this.config.className.active));\n\n if (!active.length) {\n return null;\n }\n\n var item = active.last();\n var column = item.closest(\".\".concat(this.config.className.col));\n return {\n item: item,\n column: column\n };\n }\n }, {\n key: \"createList\",\n value: function createList(data) {\n var _this5 = this;\n\n var list = external_jQuery_default()('<ul />');\n var createItem = this.config.createItem || this.createItem;\n var items = data.map(function (item) {\n return createItem.call(_this5, item);\n });\n var fragments = items.reduce(function (fragment, current) {\n fragment.appendChild(current[0] || current);\n return fragment;\n }, document.createDocumentFragment());\n list.append(fragments).addClass(this.config.className.list);\n return list;\n }\n }, {\n key: \"createItem\",\n value: function createItem(item) {\n var listItem = external_jQuery_default()('<li />');\n var listItemClasses = [this.config.className.item];\n var link = external_jQuery_default()(\"<a href=\\\"\".concat(item.href || '', \"\\\" />\"));\n var createItemContent = this.config.createItemContent || this.createItemContent;\n var fragment = createItemContent.call(this, item);\n link.append(fragment).attr('href', '').attr('tabindex', -1);\n\n if (item.url) {\n link.attr('href', item.url);\n listItemClasses.push(item.className);\n }\n\n if (item[this.config.childKey]) {\n listItemClasses.push(this.config.className[this.config.childKey]);\n }\n\n listItem.addClass(listItemClasses.join(' '));\n listItem.append(link).attr('data-fjs-item', item[this.config.itemKey]);\n listItem[0]._item = item;\n return listItem;\n }\n }, {\n key: \"updatePathBar\",\n value: function updatePathBar() {\n var _this6 = this;\n\n if (!this.config.pathBar) {\n return false;\n }\n\n var activeItems = this.container.find(\".\".concat(this.config.className.active));\n var itemKeys = '';\n this.pathBar.empty();\n activeItems.each(function (index, activeItem) {\n var item = activeItem._item;\n var isLast = index + 1 === activeItems.length;\n itemKeys += \"/\".concat(item[_this6.config.itemKey]);\n\n _this6.pathBar.append(\"\\n <span class=\\\"breadcrumb-node \".concat(item.icon, \"\\\" \").concat(item.type === 'dir' || item.child_count > 0 ? \"data-breadcrumb-node=\\\"\".concat(itemKeys, \"\\\"\") : '', \">\\n <i class=\\\"\").concat(item.icon, \"\\\"></i>\\n <span class=\\\"breadcrumb-node-name\\\">\").concat(external_jQuery_default()('<div />').text(item[_this6.config.labelKey]).html(), \"</span>\\n \").concat(!isLast ? '<i class=\"fa fa-fw fa-chevron-right\"></i>' : '', \"\\n </span>\\n \"));\n });\n }\n }, {\n key: \"getIcon\",\n value: function getIcon(type) {\n switch (type) {\n case 'root':\n return 'fa-sitemap';\n\n case 'file':\n return 'fa-file-o';\n\n case 'dir':\n default:\n return 'fa-folder';\n }\n }\n }, {\n key: \"isInView\",\n value: function isInView(element, container, partial) {\n if (!element.length || !container.length) {\n return true;\n }\n\n var containerHeight = container.height();\n var elementTop = external_jQuery_default()(element).offset().top - container.offset().top;\n var elementBottom = elementTop + external_jQuery_default()(element).height();\n var isTotal = elementTop >= 0 && elementBottom <= containerHeight;\n var isPartial = (elementTop < 0 && elementBottom > 0 || elementTop > 0 && elementTop <= container.height()) && partial;\n return isTotal || isPartial;\n }\n }, {\n key: \"scrollToView\",\n value: function scrollToView(element, container) {\n var top = parseInt(container.getBoundingClientRect().top, 10);\n var bot = parseInt(container.getBoundingClientRect().bottom, 10);\n var now_top = parseInt(element.getBoundingClientRect().top, 10);\n var now_bot = parseInt(element.getBoundingClientRect().bottom, 10);\n var scroll_by = 0;\n\n if (now_top < top) {\n scroll_by = -(top - now_top);\n } else if (now_bot > bot) {\n scroll_by = now_bot - bot;\n }\n\n if (scroll_by !== 0) {\n container.scrollTop += scroll_by;\n }\n }\n }]);\n\n return Finder;\n}();\n\n/* harmony default export */ const finder = (Finder);\n;// CONCATENATED MODULE: ./app/columns/finder.js\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction finder_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction finder_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction finder_createClass(Constructor, protoProps, staticProps) { if (protoProps) finder_defineProperties(Constructor.prototype, protoProps); if (staticProps) finder_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n // import getFilters from '../utils/get-filters';\n\nvar XHRUUID = 0;\nvar GRAV_CONFIG = typeof __webpack_require__.g.GravConfig !== 'undefined' ? __webpack_require__.g.GravConfig : __webpack_require__.g.GravAdmin.config;\nvar Instances = {};\n\nvar isInViewport = function isInViewport(elem) {\n var bounding = elem.getBoundingClientRect();\n var titlebar = document.querySelector('#titlebar');\n var offset = titlebar ? titlebar.getBoundingClientRect().height : 0;\n return bounding.top >= offset && bounding.left >= 0 && bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) && bounding.right <= (window.innerWidth || document.documentElement.clientWidth);\n};\n\nvar FlexPages = /*#__PURE__*/function () {\n function FlexPages(container, data) {\n var _this = this;\n\n finder_classCallCheck(this, FlexPages);\n\n this.container = external_jQuery_default()(container);\n this.data = data;\n var dataLoad = this.dataLoad;\n this.finder = new finder(this.container, function (parent, callback) {\n return dataLoad.call(_this, parent, callback);\n }, {\n labelKey: 'title',\n defaultPath: getInitialRoute(),\n itemTrigger: '[data-flexpages-expand]',\n createItem: function createItem(item) {\n return FlexPages.createItem(this.config, item, this);\n },\n createItemContent: function createItemContent(item) {\n return FlexPages.createItemContent(this.config, item, this);\n }\n });\n this.finder.$emitter.on('leaf-selected', function (item) {\n setInitialRoute({\n route: item.route.raw\n });\n });\n this.finder.$emitter.on('interior-selected', function (item) {\n setInitialRoute({\n route: item.route.raw\n });\n });\n /*\n this.finder.$emitter.on('leaf-selected', (item) => {\n console.log('selected', item);\n this.finder.emit('create-column', () => this.createSimpleColumn(item));\n });\n this.finder.$emitter.on('item-selected', (selected) => {\n console.log('selected', selected);\n // for future use only - create column-card creation for file with details like in macOS finder\n // this.finder.$emitter('create-column', () => this.createSimpleColumn(selected));\n }); */\n\n this.finder.$emitter.on('column-created', function () {\n _this.container[0].scrollLeft = _this.container[0].scrollWidth - _this.container[0].clientWidth;\n });\n }\n\n finder_createClass(FlexPages, [{\n key: \"createSimpleColumn\",\n value: function createSimpleColumn(item) {}\n }, {\n key: \"dataLoad\",\n value: function dataLoad(parent, callback) {\n var _this2 = this;\n\n var filters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : getStore().filters || {};\n\n /* if (!parent && Object.keys(filters).length) {\n parent = { child_count: 1, route: { raw: '' } };\n }*/\n if (!parent) {\n return callback(this.data);\n }\n\n if (!parent.child_count) {\n return false;\n }\n\n var UUID = ++XHRUUID;\n this.startLoader();\n var withFilters = Object.keys(filters).length ? _objectSpread({}, filters) : {};\n external_jQuery_default().ajax({\n url: \"\".concat(GRAV_CONFIG.current_url),\n method: 'post',\n data: Object.assign({}, {\n route: b64_encode_unicode(parent.route.raw),\n action: 'listLevel'\n }, withFilters),\n success: function success(response) {\n _this2.stopLoader();\n\n if (response.status === 'error') {\n _this2.finder.$emitter.emit('create-column', FlexPages.createErrorColumn(response.message)[0]);\n\n return false;\n } // stale request\n\n\n if (UUID !== XHRUUID) {\n return false;\n }\n\n if (response.data.length) {\n parent.children = response.data;\n }\n\n return callback(response.data);\n }\n });\n }\n }, {\n key: \"startLoader\",\n value: function startLoader() {\n if (!this.finder) {\n return null;\n }\n\n this.loadingIndicator = FlexPages.createLoadingColumn();\n this.finder.$emitter.emit('create-column', this.loadingIndicator[0]);\n return this.loadingIndicator;\n }\n }, {\n key: \"stopLoader\",\n value: function stopLoader() {\n return this.loadingIndicator && this.loadingIndicator.remove();\n }\n }], [{\n key: \"createItem\",\n value: function createItem(config, item, finder) {\n var listItem = external_jQuery_default()('<li />');\n var listItemClasses = [config.className.item]; // const href = `${GRAV_CONFIG.current_url}/${item.route.raw}`.replace('//', '/');\n\n var link = external_jQuery_default()('<div class=\"fjs-item-wrapper\" />');\n var createItemContent = config.createItemContent || finder.createItemContent;\n var fragment = createItemContent.call(this, item);\n link.append(fragment) // .attr('href', href)\n .attr('tabindex', -1);\n\n if (item.url) {\n link.attr('href', item.url);\n listItemClasses.push(item.className);\n }\n\n if (item[config.childKey]) {\n listItemClasses.push(config.className[config.childKey]);\n }\n\n if (item.filters_hit) {\n listItemClasses.push('filters-hit');\n }\n\n listItem.addClass(listItemClasses.join(' '));\n listItem.append(link).attr('data-fjs-item', item[config.itemKey]);\n listItem[0]._item = item;\n return listItem;\n }\n }, {\n key: \"createItemContent\",\n value: function createItemContent(config, item) {\n var frag = document.createDocumentFragment();\n var route = \"\".concat(GRAV_CONFIG.current_url, \"/\").concat(item.route.raw).replace('//', '/');\n var title = external_jQuery_default()('<div class=\"fjs-title\" />');\n var link = external_jQuery_default()(\"<a href=\\\"\".concat(route, \"\\\" />\"));\n var icon = external_jQuery_default()(\"<span class=\\\"fjs-icon \".concat(item.icon, \" badge-\").concat(item.extras && item.extras.published ? 'published' : 'unpublished', \"\\\" />\"));\n\n if (item.extras && item.extras.lang) {\n var status = '';\n\n if (item.extras.translated) {\n status = 'translated';\n }\n\n if (item.extras.lang === 'n/a') {\n status = 'not-available';\n }\n\n var lang = external_jQuery_default()(\"<span class=\\\"badge-lang \".concat(status, \"\\\">\").concat(item.extras.lang, \"</span>\"));\n lang.appendTo(icon);\n }\n\n if (item.extras && item.extras && (item.extras.published_date || item.extras.unpublished_date)) {\n var clock = external_jQuery_default()('<span class=\"badge-clock\" />');\n clock.appendTo(icon);\n }\n\n var info = external_jQuery_default()(\"<span class=\\\"fjs-info\\\"><b title=\\\"\".concat(item.title, \"\\\">\").concat(item.title, \"</b> <em title=\\\"\").concat(item.route.display, \"\\\">\").concat(item.route.display, \"</em></span>\"));\n var actions = external_jQuery_default()('<span class=\"fjs-actions\" />');\n var dotdotdot = null;\n\n if (item.extras) {\n var LANG_URL = external_jQuery_default()('[data-lang-url]').data('langUrl');\n dotdotdot = external_jQuery_default()('<div class=\"button-group\" data-flexpages-dotx3 data-flexpages-prevent><button class=\"button dropdown-toggle\" data-toggle=\"dropdown\"><i class=\"fa fa-ellipsis-v fjs-action-toggle\"></i></button></div>');\n dotdotdot.on('click', function (event) {\n if (!dotdotdot.find('.dropdown-menu').length) {\n var tags = '';\n var langs = '';\n item.extras.tags.forEach(function (tag) {\n tags += \"<span class=\\\"badge tag tag-\".concat(tag, \"\\\">\").concat(tag, \"</span>\");\n });\n var translations = item.extras.langs || {};\n Object.keys(translations).forEach(function (lang) {\n var translated = translations[lang];\n langs += \"<a class=\\\"lang\\\" href=\\\"\".concat(LANG_URL.replace(/%LANG%/g, lang).replace('//', '/')).concat(item.route.raw, \"\\\"><span class=\\\"badge lang-\").concat(lang ? lang : 'default', \" lang-\").concat(translated ? 'translated' : 'non-translated', \"\\\"><i class=\\\"fa fa-fw fa-circle\\\"></i> \").concat(lang ? lang : 'default', \"</span></a>\");\n });\n var canPreview = item.extras.actions.includes('preview') && !(item.extras.tags.includes('non-routable') || item.extras.tags.includes('unpublished'));\n var canEdit = item.extras.actions.includes('edit');\n var canCopy = item.extras.actions.includes('copy');\n var canMove = false; // item.extras.actions.includes('move');\n\n var canDelete = item.extras.actions.includes('delete');\n var ul = external_jQuery_default()(\"<div class=\\\"dropdown-menu\\\">\\n <div class=\\\"action-bar\\\">\\n \".concat(canPreview ? \"<a href=\\\"\".concat(route, \"/:preview\\\" class=\\\"dropdown-item\\\" title=\\\"Preview\\\"><i class=\\\"fa fa-fw fa-eye\\\"></i></a>\") : '', \"\\n \").concat(canEdit ? \"<a href=\\\"\".concat(route, \"\\\" class=\\\"dropdown-item\\\" title=\\\"Edit\\\"><i class=\\\"fa fa-fw fa-pencil\\\"></i></a>\") : '', \"\\n \").concat(canCopy ? \"<a href=\\\"\".concat(route, \"/task:copy/admin-nonce:\").concat(GRAV_CONFIG.admin_nonce, \"\\\" class=\\\"dropdown-item\\\" title=\\\"Duplicate\\\"><i class=\\\"fa fa-fw fa-copy\\\"></i></a>\") : '', \"\\n \").concat(canMove ? '<a href=\"#\" class=\"dropdown-item\" title=\"Move (coming soon)\"><i class=\"fa fa-fw fa-arrows\"></i></a>' : '', \"\\n \").concat(canDelete ? \"<a href=\\\"#delete\\\" data-remodal-target=\\\"delete\\\" data-delete-url=\\\"\".concat(route, \"/task:delete/admin-nonce:\").concat(GRAV_CONFIG.admin_nonce, \"\\\" class=\\\"dropdown-item danger\\\" title=\\\"Delete\\\"><i class=\\\"fa fa-fw fa-trash-o\\\"></i></a>\") : '', \"\\n </div>\\n <div class=\\\"divider\\\"></div>\\n <div class=\\\"tags\\\">\").concat(tags, \"</div>\\n <div class=\\\"divider\\\"></div>\\n \").concat(item.extras.lang || typeof item.extras.langs !== 'undefined' ? \"<div class=\\\"langs\\\">\".concat(langs, \"</div><div class=\\\"divider\\\"></div>\") : '', \"\\n <div class=\\\"details\\\">\\n <div class=\\\"infos\\\">\\n <table>\\n <tr>\\n <td><b>route</b></td>\\n <td>\").concat(item.route.display, \"</td>\\n </tr>\\n <tr>\\n <td><b>template</b></td>\\n <td>\").concat(item.extras.template, \"</td>\\n </tr>\\n \").concat(item.extras && item.extras.published_date ? \"\\n <tr>\\n <td><b>publish</b></td>\\n <td>\".concat(item.extras.published_date, \"</td>\\n </tr>\\n \") : '', \"\\n \").concat(item.extras && item.extras.unpublished_date ? \"\\n <tr>\\n <td><b>unpublish</b></td>\\n <td>\".concat(item.extras.unpublished_date, \"</td>\\n </tr>\\n \") : '', \"\\n <tr>\\n <td><b>modified</b></td>\\n <td>\").concat(item.modified, \"</td>\\n </tr>\\n </table>\\n </div>\\n </div>\\n</div>\"));\n ul.appendTo(dotdotdot);\n }\n });\n }\n\n if (item.child_count) {\n var button = external_jQuery_default()('<button class=\"fjs-children\" data-flexpages-expand data-flexpages-prevent />');\n var count = external_jQuery_default()(\"<span class=\\\"badge child-count\\\">\".concat(typeof item.count !== 'undefined' ? \"\".concat(item.count, \" / \") : '').concat(item.child_count, \"</span>\"));\n var arrow = external_jQuery_default()('<i class=\"fa fa-chevron-right\"></i>');\n count.appendTo(button);\n arrow.appendTo(button);\n button.appendTo(actions);\n }\n\n icon.appendTo(title);\n dotdotdot.appendTo(title);\n link.appendTo(title);\n info.appendTo(link);\n title.appendTo(frag);\n actions.appendTo(frag);\n return frag;\n }\n }, {\n key: \"createLoadingColumn\",\n value: function createLoadingColumn() {\n return external_jQuery_default()(\"\\n <div class=\\\"fjs-col leaf-col\\\" style=\\\"overflow: hidden;\\\">\\n <div class=\\\"leaf-row\\\">\\n <div class=\\\"grav-loading\\\"><div class=\\\"grav-loader\\\">Loading...</div></div>\\n </div>\\n </div>\\n \");\n }\n }, {\n key: \"createErrorColumn\",\n value: function createErrorColumn(error) {\n return external_jQuery_default()(\"\\n <div class=\\\"fjs-col leaf-col\\\" style=\\\"overflow: hidden;\\\">\\n <div class=\\\"leaf-row error\\\">\\n <i class=\\\"fa fa-fw fa-warning\\\"></i>\\n <span>\".concat(error, \"</span>\\n </div>\\n </div>\\n \"));\n }\n }]);\n\n return FlexPages;\n}();\nvar b64_encode_unicode = function b64_encode_unicode(str) {\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) {\n return String.fromCharCode('0x' + p1);\n }));\n};\nvar b64_decode_unicode = function b64_decode_unicode(str) {\n return decodeURIComponent(atob(str).split('').map(function (c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n }).join(''));\n};\n\nvar updatePosition = function updatePosition(scrollingColumn, pageColumns) {\n var group = document.querySelector('#pages-columns .button-group.open');\n\n if (group) {\n var button = group.querySelector('[data-toggle=\"dropdown\"]');\n var dropdown = group.querySelector('.dropdown-menu');\n var buttonInView = isInViewport(button);\n\n if (button && dropdown) {\n if (!buttonInView) {\n external_jQuery_default()(dropdown).css({\n display: 'none'\n });\n } else {\n external_jQuery_default()(dropdown).css({\n display: 'inherit'\n });\n var buttonClientRect = button.getBoundingClientRect();\n var dropdownClientRect = dropdown.getBoundingClientRect();\n var scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n var top = buttonClientRect.height + buttonClientRect.top + scrollTop;\n var left = buttonClientRect.left + scrollLeft; // - dropdownClientRect.width\n\n if (left + dropdownClientRect.width > window.innerWidth) {\n left = window.innerWidth - dropdownClientRect.width - 5;\n }\n\n external_jQuery_default()(dropdown).css({\n top: top,\n left: left\n });\n\n if (scrollingColumn) {\n var targetClientRect = event.target.getBoundingClientRect();\n\n if (top < targetClientRect.top + scrollTop || top > targetClientRect.top + scrollTop + targetClientRect.height) {\n external_jQuery_default()(dropdown).css({\n display: 'none'\n });\n }\n }\n\n if (pageColumns) {\n var _targetClientRect = event.target.getBoundingClientRect();\n\n if (left < _targetClientRect.left + scrollLeft || left > _targetClientRect.left + scrollLeft + _targetClientRect.width) {\n external_jQuery_default()(dropdown).css({\n display: 'none'\n });\n }\n }\n }\n }\n }\n};\n\nvar closeGhostDropdowns = function closeGhostDropdowns() {\n var opened = document.querySelectorAll('#pages-columns .button-group:not(.open) .dropdown-menu') || [];\n opened.forEach(function (item) {\n item.style.display = 'none';\n });\n};\n\ndocument.addEventListener('scroll', function (event) {\n if (event.target && !event.target.classList) {\n return true;\n }\n\n var scrollingDocument = event.target.classList.contains('gm-scroll-view') || event.target.classList.contains('content-wrapper');\n var scrollingColumn = event.target.classList.contains('fjs-col');\n var pageColumns = event.target.id === 'pages-columns';\n\n if (scrollingDocument || scrollingColumn || pageColumns) {\n closeGhostDropdowns();\n updatePosition(scrollingColumn, pageColumns);\n }\n}, true);\ndocument.addEventListener('click', function (event) {\n closeGhostDropdowns();\n\n if (event.target.dataset.toggle || event.target.closest('[data-toggle=\"dropdown\"]')) {\n var containerScroller = document.querySelectorAll('.gm-scroll-view');\n ((containerScroller.length ? containerScroller : document.querySelectorAll('.content-wrapper')) || []).forEach(function (scroll) {\n var scrollEvent = new Event('scroll');\n scroll.dispatchEvent(scrollEvent);\n });\n }\n\n if (event.target.classList && event.target.classList.contains('dropdown-menu') || event.target.closest('.dropdown-menu')) {\n if (!external_jQuery_default()(event.target).closest('.dropdown-menu').find(event.target).length) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n}); // Prevent dropdowns from closing when clicking within\n\nexternal_jQuery_default()(document).on('click.bs.dropdown.data-api', '.fjs-item-wrapper .dropdown-menu', function (event) {\n event.stopPropagation();\n});\n;// CONCATENATED MODULE: ./node_modules/tiny-cookie/es/util.js\nfunction util_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { util_typeof = function _typeof(obj) { return typeof obj; }; } else { util_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return util_typeof(obj); }\n\nfunction util_hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n} // Escape special characters.\n\n\nfunction escapeRe(str) {\n return str.replace(/[.*+?^$|[\\](){}\\\\-]/g, '\\\\$&');\n} // Return a future date by the given string.\n\n\nfunction computeExpires(str) {\n var lastCh = str.charAt(str.length - 1);\n var value = parseInt(str, 10);\n var expires = new Date();\n\n switch (lastCh) {\n case 'Y':\n expires.setFullYear(expires.getFullYear() + value);\n break;\n\n case 'M':\n expires.setMonth(expires.getMonth() + value);\n break;\n\n case 'D':\n expires.setDate(expires.getDate() + value);\n break;\n\n case 'h':\n expires.setHours(expires.getHours() + value);\n break;\n\n case 'm':\n expires.setMinutes(expires.getMinutes() + value);\n break;\n\n case 's':\n expires.setSeconds(expires.getSeconds() + value);\n break;\n\n default:\n expires = new Date(str);\n }\n\n return expires;\n} // Convert an object to a cookie option string.\n\n\nfunction convert(opts) {\n var res = ''; // eslint-disable-next-line\n\n for (var key in opts) {\n if (util_hasOwn(opts, key)) {\n if (/^expires$/i.test(key)) {\n var expires = opts[key];\n\n if (util_typeof(expires) !== 'object') {\n expires += typeof expires === 'number' ? 'D' : '';\n expires = computeExpires(expires);\n }\n\n res += \";\" + key + \"=\" + expires.toUTCString();\n } else if (/^secure$/.test(key)) {\n if (opts[key]) {\n res += \";\" + key;\n }\n } else {\n res += \";\" + key + \"=\" + opts[key];\n }\n }\n }\n\n if (!util_hasOwn(opts, 'path')) {\n res += ';path=/';\n }\n\n return res;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/tiny-cookie/es/index.js\nfunction es_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { es_typeof = function _typeof(obj) { return typeof obj; }; } else { es_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return es_typeof(obj); }\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\n // Check if the browser cookie is enabled.\n\nfunction isEnabled() {\n var key = '@key@';\n var value = '1';\n var re = new RegExp(\"(?:^|; )\" + key + \"=\" + value + \"(?:;|$)\");\n document.cookie = key + \"=\" + value + \";path=/\";\n var enabled = re.test(document.cookie);\n\n if (enabled) {\n // eslint-disable-next-line\n es_remove(key);\n }\n\n return enabled;\n} // Get the cookie value by key.\n\n\nfunction get(key, decoder) {\n if (decoder === void 0) {\n decoder = decodeURIComponent;\n }\n\n if (typeof key !== 'string' || !key) {\n return null;\n }\n\n var reKey = new RegExp(\"(?:^|; )\" + escapeRe(key) + \"(?:=([^;]*))?(?:;|$)\");\n var match = reKey.exec(document.cookie);\n\n if (match === null) {\n return null;\n }\n\n return typeof decoder === 'function' ? decoder(match[1]) : match[1];\n} // The all cookies\n\n\nfunction getAll(decoder) {\n if (decoder === void 0) {\n decoder = decodeURIComponent;\n }\n\n var reKey = /(?:^|; )([^=]+?)(?:=([^;]*))?(?:;|$)/g;\n var cookies = {};\n var match;\n /* eslint-disable no-cond-assign */\n\n while (match = reKey.exec(document.cookie)) {\n reKey.lastIndex = match.index + match.length - 1;\n cookies[match[1]] = typeof decoder === 'function' ? decoder(match[2]) : match[2];\n }\n\n return cookies;\n} // Set a cookie.\n\n\nfunction es_set(key, value, encoder, options) {\n if (encoder === void 0) {\n encoder = encodeURIComponent;\n }\n\n if (es_typeof(encoder) === 'object' && encoder !== null) {\n /* eslint-disable no-param-reassign */\n options = encoder;\n encoder = encodeURIComponent;\n /* eslint-enable no-param-reassign */\n }\n\n var attrsStr = convert(options || {});\n var valueStr = typeof encoder === 'function' ? encoder(value) : value;\n var newCookie = key + \"=\" + valueStr + attrsStr;\n document.cookie = newCookie;\n} // Remove a cookie by the specified key.\n\n\nfunction es_remove(key, options) {\n var opts = {\n expires: -1\n };\n\n if (options) {\n opts = _extends({}, options, opts);\n }\n\n return es_set(key, 'a', opts);\n} // Get the cookie's value without decoding.\n\n\nfunction getRaw(key) {\n return get(key, null);\n} // Set a cookie without encoding the value.\n\n\nfunction setRaw(key, value, options) {\n return es_set(key, value, null, options);\n}\n\n\n;// CONCATENATED MODULE: ./app/utils/get-filters.js\n/* harmony default export */ const get_filters = (function () {\n var inputs = document.querySelectorAll('#pages-filters input[name]');\n var filters = {};\n var trackMulti = [];\n inputs.forEach(function (filter) {\n if (filter.type === 'checkbox') {\n if (filter.indeterminate || filter.checked) {\n if (filter.name.match(/\\[]$/)) {\n var name = filter.name.replace(/\\[]$/, '');\n\n if (!filters[name]) {\n filters[name] = [];\n }\n\n if (!trackMulti.includes(name)) {\n trackMulti.push(name);\n }\n\n filters[name].push(filter.value);\n } else {\n filters[filter.name] = filter.value;\n }\n }\n } else if (filter.value) {\n filters[filter.name] = filter.value;\n }\n });\n trackMulti.forEach(function (multi) {\n filters[multi] = filters[multi].join(',');\n });\n return filters;\n});\n;// CONCATENATED MODULE: ./app/columns/index.js\nfunction columns_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction columns_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { columns_ownKeys(Object(source), true).forEach(function (key) { columns_defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { columns_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction columns_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\nvar container = document.querySelector('#pages-content-wrapper');\nvar getStore = function getStore() {\n if (!isEnabled) {\n return '';\n }\n\n return JSON.parse(b64_decode_unicode(get('grav-admin-flexpages') || 'e30='));\n};\nvar setStore = function setStore() {\n var store = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n expires: '1Y',\n samesite: 'Lax'\n };\n\n if (!isEnabled) {\n return '';\n }\n\n return es_set('grav-admin-flexpages', b64_encode_unicode(JSON.stringify(store)), options);\n};\nvar getInitialRoute = function getInitialRoute() {\n var parsed = getStore();\n return parsed.route || '';\n};\nvar setInitialRoute = function setInitialRoute() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$route = _ref.route,\n route = _ref$route === void 0 ? '' : _ref$route,\n _ref$filters = _ref.filters,\n filters = _ref$filters === void 0 ? getStore().filters || {} : _ref$filters,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {\n expires: '1Y'\n } : _ref$options;\n\n return setStore({\n route: route,\n filters: filters\n }, options);\n};\nvar FlexPagesInstance = null;\nvar ReLoad = function ReLoad() {\n var fresh = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var search = document.querySelector('#pages-filters [name=\"filters[search]\"]');\n var loader = container.querySelector('.grav-loading');\n var content = container.querySelector('#pages-columns');\n var gravConfig = typeof __webpack_require__.g.GravConfig !== 'undefined' ? __webpack_require__.g.GravConfig : __webpack_require__.g.GravAdmin.config;\n\n if (fresh && search) {\n search.focus();\n }\n\n if (loader && content) {\n loader.style.display = 'block';\n content.innerHTML = '';\n var filters = fresh ? getStore().filters || {} : get_filters();\n var withFilters = Object.keys(filters).length ? columns_objectSpread(columns_objectSpread({}, filters), {}, {\n initial: true\n }) : {};\n var store = getStore();\n store.filters = filters;\n setStore(store);\n var isSearchFocused = false;\n\n if (search) {\n isSearchFocused = search === document.activeElement;\n }\n\n var contentWrapper = document.querySelector('.content-wrapper .gm-scroll-view');\n var scrollPosition = {\n top: contentWrapper ? contentWrapper.scrollTop : 0,\n left: contentWrapper ? contentWrapper.scrollLeft : 0\n };\n external_jQuery_default().ajax({\n url: \"\".concat(gravConfig.current_url),\n method: 'post',\n data: Object.assign({}, {\n route: b64_encode_unicode(getInitialRoute()),\n initial: true,\n action: 'listLevel'\n }, withFilters),\n success: function success(response) {\n loader.style.display = 'none';\n\n if (response.status === 'error') {\n content.innerHTML = response.message;\n return true;\n }\n\n FlexPagesInstance = null;\n FlexPagesInstance = new FlexPages(content, response.data);\n\n if (search && isSearchFocused) {\n search.focus();\n }\n\n if (contentWrapper) {\n contentWrapper.scrollTo(scrollPosition);\n }\n\n return FlexPagesInstance;\n }\n });\n }\n};\n\nif (container) {\n ReLoad(true);\n}\n// EXTERNAL MODULE: ./app/utils/indeterminate.js\nvar indeterminate = __webpack_require__(2850);\n// EXTERNAL MODULE: ./app/filters/panel.js\nvar panel = __webpack_require__(3897);\n// EXTERNAL MODULE: ./node_modules/lodash/throttle.js\nvar throttle = __webpack_require__(4970);\nvar throttle_default = /*#__PURE__*/__webpack_require__.n(throttle);\n;// CONCATENATED MODULE: ./app/filters/index.js\n\n\n\n\ndocument.addEventListener('click', function (event) {\n var filterType = event.target && event.target.dataset.filters;\n\n if (filterType === 'reset') {\n var filters = event.target.closest('#pages-filters');\n (filters.querySelectorAll('input[type=\"text\"]') || []).forEach(function (input) {\n input.value = '';\n });\n (filters.querySelectorAll('input[type=\"checkbox\"]') || []).forEach(function (input) {\n var wrapper = input.closest('.checkboxes');\n\n if (wrapper) {\n wrapper.classList.remove('status-checked', 'status-unchecked', 'status-indeterminate');\n wrapper.dataset._checkStatus = '0';\n wrapper.classList.add('status-unchecked');\n }\n\n input.indeterminate = false;\n input.checked = false;\n input.value = '';\n });\n return false;\n }\n\n if (filterType === 'apply') {\n ReLoad();\n return false;\n }\n});\nvar throttledReload = throttle_default()(function () {\n ReLoad();\n}, 350, {\n leading: false\n});\ndocument.addEventListener('input', function (event) {\n if (event.target.getAttribute && event.target.getAttribute('name') === 'filters[search]') {\n throttledReload.cancel();\n throttledReload();\n }\n});\n;// CONCATENATED MODULE: ./app/main.js\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVlL2Rpc3QvdnVlLnJ1bnRpbWUuZXNtLmpzPzJiMGUiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vYXBwL2xpc3QvQXBwLnZ1ZT8wMzEwIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL2FwcC9saXN0L2NvbXBvbmVudHMvVGFibGUudnVlPzY0NDkiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vbm9kZV9tb2R1bGVzL3Z1ZXRhYmxlLTIvc3JjL2NvbXBvbmVudHMvVnVldGFibGUudnVlPzg3M2IiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzL25vZGVfbW9kdWxlcy92dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlLnZ1ZT8zNTlkIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL25vZGVfbW9kdWxlcy92dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlLnZ1ZT9hMTE2Iiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanM/Mjg3NyIsIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9zcmMvY29tcG9uZW50cy9WdWV0YWJsZS52dWU/ZWIwYyIsIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9zcmMvY29tcG9uZW50cy9WdWV0YWJsZVBhZ2luYXRpb24udnVlPzNmYWQiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzL25vZGVfbW9kdWxlcy92dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlUGFnaW5hdGlvbk1peGluLnZ1ZT8zYWFmIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL25vZGVfbW9kdWxlcy92dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlUGFnaW5hdGlvbk1peGluLnZ1ZT8zNTYzIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL25vZGVfbW9kdWxlcy92dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlUGFnaW5hdGlvbk1peGluLnZ1ZT80YjY5Iiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9zcmMvY29tcG9uZW50cy9WdWV0YWJsZVBhZ2luYXRpb24udnVlP2IxMTgiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vbm9kZV9tb2R1bGVzL3Z1ZXRhYmxlLTIvc3JjL2NvbXBvbmVudHMvVnVldGFibGVQYWdpbmF0aW9uLnZ1ZT81M2QxIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL25vZGVfbW9kdWxlcy92dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlUGFnaW5hdGlvbi52dWU/ZDkzZiIsIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9zcmMvY29tcG9uZW50cy9WdWV0YWJsZVBhZ2luYXRpb25JbmZvLnZ1ZT8xMmFkIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9zcmMvY29tcG9uZW50cy9WdWV0YWJsZVBhZ2luYXRpb25JbmZvTWl4aW4udnVlP2NmZjMiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vbm9kZV9tb2R1bGVzL3Z1ZXRhYmxlLTIvc3JjL2NvbXBvbmVudHMvVnVldGFibGVQYWdpbmF0aW9uSW5mb01peGluLnZ1ZT80ZmRhIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL25vZGVfbW9kdWxlcy92dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlUGFnaW5hdGlvbkluZm9NaXhpbi52dWU/MDAyZiIsIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvbm9kZV9tb2R1bGVzL3Z1ZXRhYmxlLTIvc3JjL2NvbXBvbmVudHMvVnVldGFibGVQYWdpbmF0aW9uSW5mby52dWU/NTRjMCIsIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVldGFibGUtMi9zcmMvY29tcG9uZW50cy9WdWV0YWJsZVBhZ2luYXRpb25JbmZvLnZ1ZT9jY2Y2Iiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL25vZGVfbW9kdWxlcy92dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlUGFnaW5hdGlvbkluZm8udnVlPzE4ODgiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vYXBwL2xpc3QvVnVldGFibGVDc3NDb25maWcuanM/YzU2MiIsIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvYXBwL2xpc3QvY29tcG9uZW50cy9UYWJsZS52dWU/NTcxMSIsIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9hcHAvbGlzdC9jb21wb25lbnRzL1RhYmxlLnZ1ZT80OTZlIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL2FwcC9saXN0L2NvbXBvbmVudHMvVGFibGUudnVlPzNhZmIiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vYXBwL2xpc3QvY29tcG9uZW50cy9GaWx0ZXJCYXIudnVlPzIzYmUiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzL2FwcC9saXN0L2NvbXBvbmVudHMvRmlsdGVyQmFyLnZ1ZT8xMmQ3Iiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL2FwcC9saXN0L2NvbXBvbmVudHMvRmlsdGVyQmFyLnZ1ZT85MzI2Iiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL2FwcC9saXN0L2NvbXBvbmVudHMvRmlsdGVyQmFyLnZ1ZT83MTllIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL2FwcC9saXN0L2NvbXBvbmVudHMvQ29udGVudExvYWRlci52dWU/MmRiMyIsIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9ub2RlX21vZHVsZXMvdnVlLWNvbnRlbnQtbG9hZGVyL2Rpc3QvdnVlLWNvbnRlbnQtbG9hZGVyLmVzLmpzP2UzMzAiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzL2FwcC9saXN0L2NvbXBvbmVudHMvQ29udGVudExvYWRlci52dWU/OWI2YiIsIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9hcHAvbGlzdC9jb21wb25lbnRzL0NvbnRlbnRMb2FkZXIudnVlPzc0OTUiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vYXBwL2xpc3QvY29tcG9uZW50cy9Db250ZW50TG9hZGVyLnZ1ZT8yMmM1Iiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy9hcHAvbGlzdC9BcHAudnVlPzIwMWQiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vYXBwL2xpc3QvQXBwLnZ1ZT9kMTYzIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL2FwcC9saXN0L0FwcC52dWU/NTQ1MyIsIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9hcHAvbGlzdC9pbmRleC5qcz8wZWNlIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy9leHRlcm5hbCBcImpRdWVyeVwiP2NkMGMiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vYXBwL3V0aWxzL2ZpbmRlci5qcz8xMjIwIiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL2FwcC9jb2x1bW5zL2ZpbmRlci5qcz80OWU2Iiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL25vZGVfbW9kdWxlcy90aW55LWNvb2tpZS9lcy91dGlsLmpzPzFlYWMiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vbm9kZV9tb2R1bGVzL3RpbnktY29va2llL2VzL2luZGV4LmpzPzE5ZDUiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vYXBwL3V0aWxzL2dldC1maWx0ZXJzLmpzP2I4NDUiLCJ3ZWJwYWNrOi8vZmxleC1vYmplY3RzLy4vYXBwL2NvbHVtbnMvaW5kZXguanM/OWMzMiIsIndlYnBhY2s6Ly9mbGV4LW9iamVjdHMvLi9hcHAvZmlsdGVycy9pbmRleC5qcz80ZGY0Iiwid2VicGFjazovL2ZsZXgtb2JqZWN0cy8uL2FwcC9tYWluLmpzP2YxNjEiXSwibmFtZXMiOlsiZW1wdHlPYmplY3QiLCJPYmplY3QiLCJmcmVlemUiLCJpc1VuZGVmIiwidiIsInVuZGVmaW5lZCIsImlzRGVmIiwiaXNUcnVlIiwiaXNGYWxzZSIsImlzUHJpbWl0aXZlIiwidmFsdWUiLCJpc09iamVjdCIsIm9iaiIsIl90b1N0cmluZyIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwidG9SYXdUeXBlIiwiY2FsbCIsInNsaWNlIiwiaXNQbGFpbk9iamVjdCIsImlzUmVnRXhwIiwiaXNWYWxpZEFycmF5SW5kZXgiLCJ2YWwiLCJuIiwicGFyc2VGbG9hdCIsIlN0cmluZyIsIk1hdGgiLCJmbG9vciIsImlzRmluaXRlIiwiaXNQcm9taXNlIiwidGhlbiIsImNhdGNoIiwiQXJyYXkiLCJpc0FycmF5IiwiSlNPTiIsInN0cmluZ2lmeSIsInRvTnVtYmVyIiwiaXNOYU4iLCJtYWtlTWFwIiwic3RyIiwiZXhwZWN0c0xvd2VyQ2FzZSIsIm1hcCIsImNyZWF0ZSIsImxpc3QiLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJ0b0xvd2VyQ2FzZSIsImlzQnVpbHRJblRhZyIsImlzUmVzZXJ2ZWRBdHRyaWJ1dGUiLCJyZW1vdmUiLCJhcnIiLCJpdGVtIiwiaW5kZXgiLCJpbmRleE9mIiwic3BsaWNlIiwiaGFzT3duUHJvcGVydHkiLCJoYXNPd24iLCJrZXkiLCJjYWNoZWQiLCJmbiIsImNhY2hlIiwiY2FjaGVkRm4iLCJoaXQiLCJjYW1lbGl6ZVJFIiwiY2FtZWxpemUiLCJyZXBsYWNlIiwiXyIsImMiLCJ0b1VwcGVyQ2FzZSIsImNhcGl0YWxpemUiLCJjaGFyQXQiLCJoeXBoZW5hdGVSRSIsImh5cGhlbmF0ZSIsInBvbHlmaWxsQmluZCIsImN0eCIsImJvdW5kRm4iLCJhIiwibCIsImFyZ3VtZW50cyIsImFwcGx5IiwiX2xlbmd0aCIsIm5hdGl2ZUJpbmQiLCJiaW5kIiwiRnVuY3Rpb24iLCJ0b0FycmF5Iiwic3RhcnQiLCJyZXQiLCJleHRlbmQiLCJ0byIsIl9mcm9tIiwidG9PYmplY3QiLCJyZXMiLCJub29wIiwiYiIsIm5vIiwiaWRlbnRpdHkiLCJsb29zZUVxdWFsIiwiaXNPYmplY3RBIiwiaXNPYmplY3RCIiwiaXNBcnJheUEiLCJpc0FycmF5QiIsImV2ZXJ5IiwiZSIsIkRhdGUiLCJnZXRUaW1lIiwia2V5c0EiLCJrZXlzIiwia2V5c0IiLCJsb29zZUluZGV4T2YiLCJvbmNlIiwiY2FsbGVkIiwiU1NSX0FUVFIiLCJBU1NFVF9UWVBFUyIsIkxJRkVDWUNMRV9IT09LUyIsImNvbmZpZyIsIm9wdGlvbk1lcmdlU3RyYXRlZ2llcyIsInNpbGVudCIsInByb2R1Y3Rpb25UaXAiLCJwcm9jZXNzIiwiZGV2dG9vbHMiLCJwZXJmb3JtYW5jZSIsImVycm9ySGFuZGxlciIsIndhcm5IYW5kbGVyIiwiaWdub3JlZEVsZW1lbnRzIiwia2V5Q29kZXMiLCJpc1Jlc2VydmVkVGFnIiwiaXNSZXNlcnZlZEF0dHIiLCJpc1Vua25vd25FbGVtZW50IiwiZ2V0VGFnTmFtZXNwYWNlIiwicGFyc2VQbGF0Zm9ybVRhZ05hbWUiLCJtdXN0VXNlUHJvcCIsImFzeW5jIiwiX2xpZmVjeWNsZUhvb2tzIiwidW5pY29kZVJlZ0V4cCIsImlzUmVzZXJ2ZWQiLCJjaGFyQ29kZUF0IiwiZGVmIiwiZW51bWVyYWJsZSIsImRlZmluZVByb3BlcnR5Iiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJiYWlsUkUiLCJSZWdFeHAiLCJzb3VyY2UiLCJwYXJzZVBhdGgiLCJwYXRoIiwidGVzdCIsInNlZ21lbnRzIiwiaGFzUHJvdG8iLCJpbkJyb3dzZXIiLCJ3aW5kb3ciLCJpbldlZXgiLCJXWEVudmlyb25tZW50IiwicGxhdGZvcm0iLCJ3ZWV4UGxhdGZvcm0iLCJVQSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImlzSUUiLCJpc0lFOSIsImlzRWRnZSIsImlzQW5kcm9pZCIsImlzSU9TIiwiaXNDaHJvbWUiLCJpc1BoYW50b21KUyIsImlzRkYiLCJtYXRjaCIsIm5hdGl2ZVdhdGNoIiwid2F0Y2giLCJzdXBwb3J0c1Bhc3NpdmUiLCJvcHRzIiwiZ2V0IiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9pc1NlcnZlciIsImlzU2VydmVyUmVuZGVyaW5nIiwiZ2xvYmFsIiwiZW52IiwiVlVFX0VOViIsIl9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX18iLCJpc05hdGl2ZSIsIkN0b3IiLCJoYXNTeW1ib2wiLCJTeW1ib2wiLCJSZWZsZWN0Iiwib3duS2V5cyIsIl9TZXQiLCJTZXQiLCJzZXQiLCJoYXMiLCJhZGQiLCJjbGVhciIsIndhcm4iLCJ0aXAiLCJnZW5lcmF0ZUNvbXBvbmVudFRyYWNlIiwiZm9ybWF0Q29tcG9uZW50TmFtZSIsInVpZCIsIkRlcCIsImlkIiwic3VicyIsImFkZFN1YiIsInN1YiIsInB1c2giLCJyZW1vdmVTdWIiLCJkZXBlbmQiLCJ0YXJnZXQiLCJhZGREZXAiLCJub3RpZnkiLCJ1cGRhdGUiLCJ0YXJnZXRTdGFjayIsInB1c2hUYXJnZXQiLCJwb3BUYXJnZXQiLCJwb3AiLCJWTm9kZSIsInRhZyIsImRhdGEiLCJjaGlsZHJlbiIsInRleHQiLCJlbG0iLCJjb250ZXh0IiwiY29tcG9uZW50T3B0aW9ucyIsImFzeW5jRmFjdG9yeSIsIm5zIiwiZm5Db250ZXh0IiwiZm5PcHRpb25zIiwiZm5TY29wZUlkIiwiY29tcG9uZW50SW5zdGFuY2UiLCJwYXJlbnQiLCJyYXciLCJpc1N0YXRpYyIsImlzUm9vdEluc2VydCIsImlzQ29tbWVudCIsImlzQ2xvbmVkIiwiaXNPbmNlIiwiYXN5bmNNZXRhIiwiaXNBc3luY1BsYWNlaG9sZGVyIiwicHJvdG90eXBlQWNjZXNzb3JzIiwiY2hpbGQiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiY3JlYXRlRW1wdHlWTm9kZSIsIm5vZGUiLCJjcmVhdGVUZXh0Vk5vZGUiLCJjbG9uZVZOb2RlIiwidm5vZGUiLCJjbG9uZWQiLCJhcnJheVByb3RvIiwiYXJyYXlNZXRob2RzIiwibWV0aG9kc1RvUGF0Y2giLCJmb3JFYWNoIiwibWV0aG9kIiwib3JpZ2luYWwiLCJtdXRhdG9yIiwiYXJncyIsImxlbiIsInJlc3VsdCIsIm9iIiwiX19vYl9fIiwiaW5zZXJ0ZWQiLCJvYnNlcnZlQXJyYXkiLCJkZXAiLCJhcnJheUtleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwic2hvdWxkT2JzZXJ2ZSIsInRvZ2dsZU9ic2VydmluZyIsIk9ic2VydmVyIiwidm1Db3VudCIsInByb3RvQXVnbWVudCIsImNvcHlBdWdtZW50Iiwid2FsayIsImRlZmluZVJlYWN0aXZlJCQxIiwiaXRlbXMiLCJvYnNlcnZlIiwic3JjIiwiX19wcm90b19fIiwiYXNSb290RGF0YSIsImlzRXh0ZW5zaWJsZSIsIl9pc1Z1ZSIsImN1c3RvbVNldHRlciIsInNoYWxsb3ciLCJwcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldHRlciIsInNldHRlciIsImNoaWxkT2IiLCJyZWFjdGl2ZUdldHRlciIsImRlcGVuZEFycmF5IiwicmVhY3RpdmVTZXR0ZXIiLCJuZXdWYWwiLCJtYXgiLCJkZWwiLCJzdHJhdHMiLCJtZXJnZURhdGEiLCJmcm9tIiwidG9WYWwiLCJmcm9tVmFsIiwibWVyZ2VEYXRhT3JGbiIsInBhcmVudFZhbCIsImNoaWxkVmFsIiwidm0iLCJtZXJnZWREYXRhRm4iLCJtZXJnZWRJbnN0YW5jZURhdGFGbiIsImluc3RhbmNlRGF0YSIsImRlZmF1bHREYXRhIiwibWVyZ2VIb29rIiwiY29uY2F0IiwiZGVkdXBlSG9va3MiLCJob29rcyIsImhvb2siLCJtZXJnZUFzc2V0cyIsImFzc2VydE9iamVjdFR5cGUiLCJ0eXBlIiwia2V5JDEiLCJwcm9wcyIsIm1ldGhvZHMiLCJpbmplY3QiLCJjb21wdXRlZCIsInByb3ZpZGUiLCJkZWZhdWx0U3RyYXQiLCJjaGVja0NvbXBvbmVudHMiLCJvcHRpb25zIiwiY29tcG9uZW50cyIsInZhbGlkYXRlQ29tcG9uZW50TmFtZSIsIm5hbWUiLCJub3JtYWxpemVQcm9wcyIsIm5vcm1hbGl6ZUluamVjdCIsIm5vcm1hbGl6ZWQiLCJub3JtYWxpemVEaXJlY3RpdmVzIiwiZGlycyIsImRpcmVjdGl2ZXMiLCJkZWYkJDEiLCJtZXJnZU9wdGlvbnMiLCJfYmFzZSIsImV4dGVuZHMiLCJtaXhpbnMiLCJtZXJnZUZpZWxkIiwic3RyYXQiLCJyZXNvbHZlQXNzZXQiLCJ3YXJuTWlzc2luZyIsImFzc2V0cyIsImNhbWVsaXplZElkIiwiUGFzY2FsQ2FzZUlkIiwidmFsaWRhdGVQcm9wIiwicHJvcE9wdGlvbnMiLCJwcm9wc0RhdGEiLCJwcm9wIiwiYWJzZW50IiwiYm9vbGVhbkluZGV4IiwiZ2V0VHlwZUluZGV4IiwiQm9vbGVhbiIsInN0cmluZ0luZGV4IiwiZ2V0UHJvcERlZmF1bHRWYWx1ZSIsInByZXZTaG91bGRPYnNlcnZlIiwiZGVmYXVsdCIsIiRvcHRpb25zIiwiX3Byb3BzIiwiZ2V0VHlwZSIsImFzc2VydFByb3AiLCJyZXF1aXJlZCIsInZhbGlkIiwiZXhwZWN0ZWRUeXBlcyIsImFzc2VydGVkVHlwZSIsImFzc2VydFR5cGUiLCJleHBlY3RlZFR5cGUiLCJnZXRJbnZhbGlkVHlwZU1lc3NhZ2UiLCJ2YWxpZGF0b3IiLCJzaW1wbGVDaGVja1JFIiwidCIsImlzU2FtZVR5cGUiLCJtZXNzYWdlIiwiam9pbiIsInJlY2VpdmVkVHlwZSIsImV4cGVjdGVkVmFsdWUiLCJzdHlsZVZhbHVlIiwicmVjZWl2ZWRWYWx1ZSIsImlzRXhwbGljYWJsZSIsImlzQm9vbGVhbiIsIk51bWJlciIsImV4cGxpY2l0VHlwZXMiLCJzb21lIiwiZWxlbSIsImhhbmRsZUVycm9yIiwiZXJyIiwiaW5mbyIsImN1ciIsIiRwYXJlbnQiLCJlcnJvckNhcHR1cmVkIiwiY2FwdHVyZSIsImdsb2JhbEhhbmRsZUVycm9yIiwiaW52b2tlV2l0aEVycm9ySGFuZGxpbmciLCJoYW5kbGVyIiwiX2hhbmRsZWQiLCJsb2dFcnJvciIsImNvbnNvbGUiLCJlcnJvciIsImlzVXNpbmdNaWNyb1Rhc2siLCJjYWxsYmFja3MiLCJwZW5kaW5nIiwiZmx1c2hDYWxsYmFja3MiLCJjb3BpZXMiLCJ0aW1lckZ1bmMiLCJQcm9taXNlIiwicCIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiTXV0YXRpb25PYnNlcnZlciIsImNvdW50ZXIiLCJvYnNlcnZlciIsInRleHROb2RlIiwiZG9jdW1lbnQiLCJjcmVhdGVUZXh0Tm9kZSIsImNoYXJhY3RlckRhdGEiLCJzZXRJbW1lZGlhdGUiLCJuZXh0VGljayIsImNiIiwiX3Jlc29sdmUiLCJpbml0UHJveHkiLCJzZWVuT2JqZWN0cyIsInRyYXZlcnNlIiwiX3RyYXZlcnNlIiwic2VlbiIsImlzQSIsImlzRnJvemVuIiwiZGVwSWQiLCJtYXJrIiwibWVhc3VyZSIsIm5vcm1hbGl6ZUV2ZW50IiwicGFzc2l2ZSIsIm9uY2UkJDEiLCJjcmVhdGVGbkludm9rZXIiLCJmbnMiLCJpbnZva2VyIiwiYXJndW1lbnRzJDEiLCJ1cGRhdGVMaXN0ZW5lcnMiLCJvbiIsIm9sZE9uIiwicmVtb3ZlJCQxIiwiY3JlYXRlT25jZUhhbmRsZXIiLCJvbGQiLCJldmVudCIsInBhcmFtcyIsIm1lcmdlVk5vZGVIb29rIiwiaG9va0tleSIsIm9sZEhvb2siLCJ3cmFwcGVkSG9vayIsIm1lcmdlZCIsImV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEiLCJhdHRycyIsImFsdEtleSIsImNoZWNrUHJvcCIsImhhc2giLCJwcmVzZXJ2ZSIsInNpbXBsZU5vcm1hbGl6ZUNoaWxkcmVuIiwibm9ybWFsaXplQ2hpbGRyZW4iLCJub3JtYWxpemVBcnJheUNoaWxkcmVuIiwiaXNUZXh0Tm9kZSIsIm5lc3RlZEluZGV4IiwibGFzdEluZGV4IiwibGFzdCIsInNoaWZ0IiwiX2lzVkxpc3QiLCJpbml0UHJvdmlkZSIsIl9wcm92aWRlZCIsImluaXRJbmplY3Rpb25zIiwicmVzb2x2ZUluamVjdCIsInByb3ZpZGVLZXkiLCJwcm92aWRlRGVmYXVsdCIsInJlc29sdmVTbG90cyIsInNsb3RzIiwic2xvdCIsIm5hbWUkMSIsImlzV2hpdGVzcGFjZSIsIm5vcm1hbGl6ZVNjb3BlZFNsb3RzIiwibm9ybWFsU2xvdHMiLCJwcmV2U2xvdHMiLCJoYXNOb3JtYWxTbG90cyIsImlzU3RhYmxlIiwiJHN0YWJsZSIsIiRrZXkiLCJfbm9ybWFsaXplZCIsIiRoYXNOb3JtYWwiLCJub3JtYWxpemVTY29wZWRTbG90Iiwia2V5JDIiLCJwcm94eU5vcm1hbFNsb3QiLCJwcm94eSIsInJlbmRlckxpc3QiLCJyZW5kZXIiLCJpdGVyYXRvciIsIm5leHQiLCJkb25lIiwicmVuZGVyU2xvdCIsImZhbGxiYWNrIiwiYmluZE9iamVjdCIsInNjb3BlZFNsb3RGbiIsIiRzY29wZWRTbG90cyIsIm5vZGVzIiwiJHNsb3RzIiwiJGNyZWF0ZUVsZW1lbnQiLCJyZXNvbHZlRmlsdGVyIiwiaXNLZXlOb3RNYXRjaCIsImV4cGVjdCIsImFjdHVhbCIsImNoZWNrS2V5Q29kZXMiLCJldmVudEtleUNvZGUiLCJidWlsdEluS2V5Q29kZSIsImV2ZW50S2V5TmFtZSIsImJ1aWx0SW5LZXlOYW1lIiwibWFwcGVkS2V5Q29kZSIsImJpbmRPYmplY3RQcm9wcyIsImFzUHJvcCIsImlzU3luYyIsImxvb3AiLCJkb21Qcm9wcyIsImNhbWVsaXplZEtleSIsImh5cGhlbmF0ZWRLZXkiLCIkZXZlbnQiLCJyZW5kZXJTdGF0aWMiLCJpc0luRm9yIiwiX3N0YXRpY1RyZWVzIiwidHJlZSIsInN0YXRpY1JlbmRlckZucyIsIl9yZW5kZXJQcm94eSIsIm1hcmtTdGF0aWMiLCJtYXJrT25jZSIsIm1hcmtTdGF0aWNOb2RlIiwiYmluZE9iamVjdExpc3RlbmVycyIsImV4aXN0aW5nIiwib3VycyIsInJlc29sdmVTY29wZWRTbG90cyIsImhhc0R5bmFtaWNLZXlzIiwiY29udGVudEhhc2hLZXkiLCJiaW5kRHluYW1pY0tleXMiLCJiYXNlT2JqIiwidmFsdWVzIiwicHJlcGVuZE1vZGlmaWVyIiwic3ltYm9sIiwiaW5zdGFsbFJlbmRlckhlbHBlcnMiLCJfbyIsIl9uIiwiX3MiLCJfbCIsIl90IiwiX3EiLCJfaSIsIl9tIiwiX2YiLCJfayIsIl9iIiwiX3YiLCJfZSIsIl91IiwiX2ciLCJfZCIsIl9wIiwiRnVuY3Rpb25hbFJlbmRlckNvbnRleHQiLCJ0aGlzJDEiLCJjb250ZXh0Vm0iLCJfb3JpZ2luYWwiLCJpc0NvbXBpbGVkIiwiX2NvbXBpbGVkIiwibmVlZE5vcm1hbGl6YXRpb24iLCJsaXN0ZW5lcnMiLCJpbmplY3Rpb25zIiwic2NvcGVkU2xvdHMiLCJfc2NvcGVJZCIsIl9jIiwiZCIsImNyZWF0ZUVsZW1lbnQiLCJjcmVhdGVGdW5jdGlvbmFsQ29tcG9uZW50IiwibWVyZ2VQcm9wcyIsInJlbmRlckNvbnRleHQiLCJjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0Iiwidm5vZGVzIiwiY2xvbmUiLCJjb21wb25lbnRWTm9kZUhvb2tzIiwiaW5pdCIsImh5ZHJhdGluZyIsIl9pc0Rlc3Ryb3llZCIsImtlZXBBbGl2ZSIsIm1vdW50ZWROb2RlIiwicHJlcGF0Y2giLCJjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlIiwiYWN0aXZlSW5zdGFuY2UiLCIkbW91bnQiLCJvbGRWbm9kZSIsInVwZGF0ZUNoaWxkQ29tcG9uZW50IiwiaW5zZXJ0IiwiX2lzTW91bnRlZCIsImNhbGxIb29rIiwicXVldWVBY3RpdmF0ZWRDb21wb25lbnQiLCJhY3RpdmF0ZUNoaWxkQ29tcG9uZW50IiwiZGVzdHJveSIsIiRkZXN0cm95IiwiZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50IiwiaG9va3NUb01lcmdlIiwiY3JlYXRlQ29tcG9uZW50IiwiYmFzZUN0b3IiLCJjaWQiLCJyZXNvbHZlQXN5bmNDb21wb25lbnQiLCJjcmVhdGVBc3luY1BsYWNlaG9sZGVyIiwicmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyIsIm1vZGVsIiwidHJhbnNmb3JtTW9kZWwiLCJmdW5jdGlvbmFsIiwibmF0aXZlT24iLCJhYnN0cmFjdCIsImluc3RhbGxDb21wb25lbnRIb29rcyIsIl9pc0NvbXBvbmVudCIsIl9wYXJlbnRWbm9kZSIsImlubGluZVRlbXBsYXRlIiwidG9NZXJnZSIsIl9tZXJnZWQiLCJtZXJnZUhvb2skMSIsImYxIiwiZjIiLCJjYWxsYmFjayIsIlNJTVBMRV9OT1JNQUxJWkUiLCJBTFdBWVNfTk9STUFMSVpFIiwibm9ybWFsaXphdGlvblR5cGUiLCJhbHdheXNOb3JtYWxpemUiLCJfY3JlYXRlRWxlbWVudCIsImlzIiwiJHZub2RlIiwicHJlIiwiYXBwbHlOUyIsInJlZ2lzdGVyRGVlcEJpbmRpbmdzIiwiZm9yY2UiLCJzdHlsZSIsImNsYXNzIiwiaW5pdFJlbmRlciIsIl92bm9kZSIsInBhcmVudFZub2RlIiwiX3JlbmRlckNoaWxkcmVuIiwicGFyZW50RGF0YSIsIl9wYXJlbnRMaXN0ZW5lcnMiLCJjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UiLCJyZW5kZXJNaXhpbiIsIlZ1ZSIsIiRuZXh0VGljayIsIl9yZW5kZXIiLCJyZWYiLCJlbnN1cmVDdG9yIiwiY29tcCIsImJhc2UiLCJfX2VzTW9kdWxlIiwidG9TdHJpbmdUYWciLCJmYWN0b3J5IiwiZXJyb3JDb21wIiwicmVzb2x2ZWQiLCJvd25lciIsIm93bmVycyIsImxvYWRpbmciLCJsb2FkaW5nQ29tcCIsInN5bmMiLCJ0aW1lckxvYWRpbmciLCJ0aW1lclRpbWVvdXQiLCIkb24iLCJmb3JjZVJlbmRlciIsInJlbmRlckNvbXBsZXRlZCIsIiRmb3JjZVVwZGF0ZSIsImNsZWFyVGltZW91dCIsInJlamVjdCIsInJlYXNvbiIsImNvbXBvbmVudCIsImRlbGF5IiwidGltZW91dCIsImdldEZpcnN0Q29tcG9uZW50Q2hpbGQiLCJpbml0RXZlbnRzIiwiX2V2ZW50cyIsIl9oYXNIb29rRXZlbnQiLCJ1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnMiLCJyZW1vdmUkMSIsIiRvZmYiLCJfdGFyZ2V0Iiwib25jZUhhbmRsZXIiLCJvbGRMaXN0ZW5lcnMiLCJldmVudHNNaXhpbiIsImhvb2tSRSIsIiRvbmNlIiwiaSQxIiwiY2JzIiwiJGVtaXQiLCJpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQiLCJzZXRBY3RpdmVJbnN0YW5jZSIsInByZXZBY3RpdmVJbnN0YW5jZSIsImluaXRMaWZlY3ljbGUiLCIkY2hpbGRyZW4iLCIkcm9vdCIsIiRyZWZzIiwiX3dhdGNoZXIiLCJfaW5hY3RpdmUiLCJfZGlyZWN0SW5hY3RpdmUiLCJfaXNCZWluZ0Rlc3Ryb3llZCIsImxpZmVjeWNsZU1peGluIiwiX3VwZGF0ZSIsInByZXZFbCIsIiRlbCIsInByZXZWbm9kZSIsInJlc3RvcmVBY3RpdmVJbnN0YW5jZSIsIl9fcGF0Y2hfXyIsIl9fdnVlX18iLCJ0ZWFyZG93biIsIl93YXRjaGVycyIsIl9kYXRhIiwibW91bnRDb21wb25lbnQiLCJlbCIsInVwZGF0ZUNvbXBvbmVudCIsIldhdGNoZXIiLCJiZWZvcmUiLCJyZW5kZXJDaGlsZHJlbiIsIm5ld1Njb3BlZFNsb3RzIiwib2xkU2NvcGVkU2xvdHMiLCJoYXNEeW5hbWljU2NvcGVkU2xvdCIsIm5lZWRzRm9yY2VVcGRhdGUiLCIkYXR0cnMiLCIkbGlzdGVuZXJzIiwicHJvcEtleXMiLCJfcHJvcEtleXMiLCJpc0luSW5hY3RpdmVUcmVlIiwiZGlyZWN0IiwiaGFuZGxlcnMiLCJqIiwiTUFYX1VQREFURV9DT1VOVCIsInF1ZXVlIiwiYWN0aXZhdGVkQ2hpbGRyZW4iLCJjaXJjdWxhciIsIndhaXRpbmciLCJmbHVzaGluZyIsInJlc2V0U2NoZWR1bGVyU3RhdGUiLCJjdXJyZW50Rmx1c2hUaW1lc3RhbXAiLCJnZXROb3ciLCJub3ciLCJjcmVhdGVFdmVudCIsInRpbWVTdGFtcCIsImZsdXNoU2NoZWR1bGVyUXVldWUiLCJ3YXRjaGVyIiwic29ydCIsInJ1biIsImFjdGl2YXRlZFF1ZXVlIiwidXBkYXRlZFF1ZXVlIiwiY2FsbEFjdGl2YXRlZEhvb2tzIiwiY2FsbFVwZGF0ZWRIb29rcyIsImVtaXQiLCJxdWV1ZVdhdGNoZXIiLCJ1aWQkMiIsImV4cE9yRm4iLCJpc1JlbmRlcldhdGNoZXIiLCJkZWVwIiwidXNlciIsImxhenkiLCJhY3RpdmUiLCJkaXJ0eSIsImRlcHMiLCJuZXdEZXBzIiwiZGVwSWRzIiwibmV3RGVwSWRzIiwiZXhwcmVzc2lvbiIsImNsZWFudXBEZXBzIiwidG1wIiwib2xkVmFsdWUiLCJldmFsdWF0ZSIsInNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbiIsInNvdXJjZUtleSIsInByb3h5R2V0dGVyIiwicHJveHlTZXR0ZXIiLCJpbml0U3RhdGUiLCJpbml0UHJvcHMiLCJpbml0TWV0aG9kcyIsImluaXREYXRhIiwiaW5pdENvbXB1dGVkIiwiaW5pdFdhdGNoIiwicHJvcHNPcHRpb25zIiwiaXNSb290IiwiZ2V0RGF0YSIsImNvbXB1dGVkV2F0Y2hlck9wdGlvbnMiLCJ3YXRjaGVycyIsIl9jb21wdXRlZFdhdGNoZXJzIiwiaXNTU1IiLCJ1c2VyRGVmIiwiZGVmaW5lQ29tcHV0ZWQiLCJzaG91bGRDYWNoZSIsImNyZWF0ZUNvbXB1dGVkR2V0dGVyIiwiY3JlYXRlR2V0dGVySW52b2tlciIsImNvbXB1dGVkR2V0dGVyIiwiY3JlYXRlV2F0Y2hlciIsIiR3YXRjaCIsInN0YXRlTWl4aW4iLCJkYXRhRGVmIiwicHJvcHNEZWYiLCIkc2V0IiwiJGRlbGV0ZSIsImltbWVkaWF0ZSIsInVud2F0Y2hGbiIsInVpZCQzIiwiaW5pdE1peGluIiwiX2luaXQiLCJfdWlkIiwic3RhcnRUYWciLCJlbmRUYWciLCJpbml0SW50ZXJuYWxDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsIl9zZWxmIiwidm5vZGVDb21wb25lbnRPcHRpb25zIiwiX2NvbXBvbmVudFRhZyIsInN1cGVyIiwic3VwZXJPcHRpb25zIiwiY2FjaGVkU3VwZXJPcHRpb25zIiwibW9kaWZpZWRPcHRpb25zIiwicmVzb2x2ZU1vZGlmaWVkT3B0aW9ucyIsImV4dGVuZE9wdGlvbnMiLCJtb2RpZmllZCIsImxhdGVzdCIsInNlYWxlZCIsInNlYWxlZE9wdGlvbnMiLCJpbml0VXNlIiwidXNlIiwicGx1Z2luIiwiaW5zdGFsbGVkUGx1Z2lucyIsIl9pbnN0YWxsZWRQbHVnaW5zIiwidW5zaGlmdCIsImluc3RhbGwiLCJpbml0TWl4aW4kMSIsIm1peGluIiwiaW5pdEV4dGVuZCIsIlN1cGVyIiwiU3VwZXJJZCIsImNhY2hlZEN0b3JzIiwiX0N0b3IiLCJTdWIiLCJWdWVDb21wb25lbnQiLCJpbml0UHJvcHMkMSIsImluaXRDb21wdXRlZCQxIiwiQ29tcCIsImluaXRBc3NldFJlZ2lzdGVycyIsImRlZmluaXRpb24iLCJnZXRDb21wb25lbnROYW1lIiwibWF0Y2hlcyIsInBhdHRlcm4iLCJwcnVuZUNhY2hlIiwia2VlcEFsaXZlSW5zdGFuY2UiLCJmaWx0ZXIiLCJjYWNoZWROb2RlIiwicHJ1bmVDYWNoZUVudHJ5IiwiY3VycmVudCIsImNhY2hlZCQkMSIsInBhdHRlcm5UeXBlcyIsIktlZXBBbGl2ZSIsImluY2x1ZGUiLCJleGNsdWRlIiwiY3JlYXRlZCIsImRlc3Ryb3llZCIsIm1vdW50ZWQiLCJyZWYkMSIsInBhcnNlSW50IiwiYnVpbHRJbkNvbXBvbmVudHMiLCJpbml0R2xvYmFsQVBJIiwiY29uZmlnRGVmIiwidXRpbCIsImRlZmluZVJlYWN0aXZlIiwiZGVsZXRlIiwib2JzZXJ2YWJsZSIsInNzckNvbnRleHQiLCJ2ZXJzaW9uIiwiYWNjZXB0VmFsdWUiLCJhdHRyIiwiaXNFbnVtZXJhdGVkQXR0ciIsImlzVmFsaWRDb250ZW50RWRpdGFibGVWYWx1ZSIsImNvbnZlcnRFbnVtZXJhdGVkVmFsdWUiLCJpc0ZhbHN5QXR0clZhbHVlIiwiaXNCb29sZWFuQXR0ciIsInhsaW5rTlMiLCJpc1hsaW5rIiwiZ2V0WGxpbmtQcm9wIiwiZ2VuQ2xhc3NGb3JWbm9kZSIsInBhcmVudE5vZGUiLCJjaGlsZE5vZGUiLCJtZXJnZUNsYXNzRGF0YSIsInJlbmRlckNsYXNzIiwic3RhdGljQ2xhc3MiLCJkeW5hbWljQ2xhc3MiLCJzdHJpbmdpZnlDbGFzcyIsInN0cmluZ2lmeUFycmF5Iiwic3RyaW5naWZ5T2JqZWN0Iiwic3RyaW5naWZpZWQiLCJuYW1lc3BhY2VNYXAiLCJzdmciLCJtYXRoIiwiaXNIVE1MVGFnIiwiaXNTVkciLCJ1bmtub3duRWxlbWVudENhY2hlIiwiSFRNTFVua25vd25FbGVtZW50IiwiSFRNTEVsZW1lbnQiLCJpc1RleHRJbnB1dFR5cGUiLCJxdWVyeSIsInNlbGVjdGVkIiwicXVlcnlTZWxlY3RvciIsImNyZWF0ZUVsZW1lbnQkMSIsInRhZ05hbWUiLCJtdWx0aXBsZSIsInNldEF0dHJpYnV0ZSIsImNyZWF0ZUVsZW1lbnROUyIsIm5hbWVzcGFjZSIsImNyZWF0ZUNvbW1lbnQiLCJpbnNlcnRCZWZvcmUiLCJuZXdOb2RlIiwicmVmZXJlbmNlTm9kZSIsInJlbW92ZUNoaWxkIiwiYXBwZW5kQ2hpbGQiLCJuZXh0U2libGluZyIsInNldFRleHRDb250ZW50IiwidGV4dENvbnRlbnQiLCJzZXRTdHlsZVNjb3BlIiwic2NvcGVJZCIsIm5vZGVPcHMiLCJyZWdpc3RlclJlZiIsImlzUmVtb3ZhbCIsInJlZnMiLCJyZWZJbkZvciIsImVtcHR5Tm9kZSIsInNhbWVWbm9kZSIsInNhbWVJbnB1dFR5cGUiLCJ0eXBlQSIsInR5cGVCIiwiY3JlYXRlS2V5VG9PbGRJZHgiLCJiZWdpbklkeCIsImVuZElkeCIsImNyZWF0ZVBhdGNoRnVuY3Rpb24iLCJiYWNrZW5kIiwibW9kdWxlcyIsImVtcHR5Tm9kZUF0IiwiY3JlYXRlUm1DYiIsImNoaWxkRWxtIiwicmVtb3ZlTm9kZSIsImlzVW5rbm93bkVsZW1lbnQkJDEiLCJpblZQcmUiLCJpZ25vcmUiLCJjcmVhdGluZ0VsbUluVlByZSIsImNyZWF0ZUVsbSIsImluc2VydGVkVm5vZGVRdWV1ZSIsInBhcmVudEVsbSIsInJlZkVsbSIsIm5lc3RlZCIsIm93bmVyQXJyYXkiLCJzZXRTY29wZSIsImNyZWF0ZUNoaWxkcmVuIiwiaW52b2tlQ3JlYXRlSG9va3MiLCJpc1JlYWN0aXZhdGVkIiwiaW5pdENvbXBvbmVudCIsInJlYWN0aXZhdGVDb21wb25lbnQiLCJwZW5kaW5nSW5zZXJ0IiwiaXNQYXRjaGFibGUiLCJpbm5lck5vZGUiLCJ0cmFuc2l0aW9uIiwiYWN0aXZhdGUiLCJyZWYkJDEiLCJhbmNlc3RvciIsImFkZFZub2RlcyIsInN0YXJ0SWR4IiwiaW52b2tlRGVzdHJveUhvb2siLCJyZW1vdmVWbm9kZXMiLCJjaCIsInJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2siLCJybSIsInVwZGF0ZUNoaWxkcmVuIiwib2xkQ2giLCJuZXdDaCIsInJlbW92ZU9ubHkiLCJvbGRTdGFydElkeCIsIm5ld1N0YXJ0SWR4Iiwib2xkRW5kSWR4Iiwib2xkU3RhcnRWbm9kZSIsIm9sZEVuZFZub2RlIiwibmV3RW5kSWR4IiwibmV3U3RhcnRWbm9kZSIsIm5ld0VuZFZub2RlIiwib2xkS2V5VG9JZHgiLCJpZHhJbk9sZCIsInZub2RlVG9Nb3ZlIiwiY2FuTW92ZSIsInBhdGNoVm5vZGUiLCJmaW5kSWR4SW5PbGQiLCJjaGVja0R1cGxpY2F0ZUtleXMiLCJzZWVuS2V5cyIsImVuZCIsImh5ZHJhdGUiLCJwb3N0cGF0Y2giLCJpbnZva2VJbnNlcnRIb29rIiwiaW5pdGlhbCIsImh5ZHJhdGlvbkJhaWxlZCIsImlzUmVuZGVyZWRNb2R1bGUiLCJoYXNDaGlsZE5vZGVzIiwiaW5uZXJIVE1MIiwiY2hpbGRyZW5NYXRjaCIsImZpcnN0Q2hpbGQiLCJmdWxsSW52b2tlIiwiYXNzZXJ0Tm9kZU1hdGNoIiwibm9kZVR5cGUiLCJwYXRjaCIsImlzSW5pdGlhbFBhdGNoIiwiaXNSZWFsRWxlbWVudCIsImhhc0F0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsIm9sZEVsbSIsIl9sZWF2ZUNiIiwicGF0Y2hhYmxlIiwiaSQyIiwidXBkYXRlRGlyZWN0aXZlcyIsInVuYmluZERpcmVjdGl2ZXMiLCJpc0NyZWF0ZSIsImlzRGVzdHJveSIsIm9sZERpcnMiLCJub3JtYWxpemVEaXJlY3RpdmVzJDEiLCJuZXdEaXJzIiwiZGlyc1dpdGhJbnNlcnQiLCJkaXJzV2l0aFBvc3RwYXRjaCIsIm9sZERpciIsImRpciIsImNhbGxIb29rJDEiLCJvbGRBcmciLCJhcmciLCJjb21wb25lbnRVcGRhdGVkIiwiY2FsbEluc2VydCIsImVtcHR5TW9kaWZpZXJzIiwibW9kaWZpZXJzIiwiZ2V0UmF3RGlyTmFtZSIsInJhd05hbWUiLCJiYXNlTW9kdWxlcyIsInVwZGF0ZUF0dHJzIiwiaW5oZXJpdEF0dHJzIiwib2xkQXR0cnMiLCJzZXRBdHRyIiwicmVtb3ZlQXR0cmlidXRlTlMiLCJiYXNlU2V0QXR0ciIsInNldEF0dHJpYnV0ZU5TIiwiX19pZXBoIiwiYmxvY2tlciIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ1cGRhdGVDbGFzcyIsIm9sZERhdGEiLCJjbHMiLCJ0cmFuc2l0aW9uQ2xhc3MiLCJfdHJhbnNpdGlvbkNsYXNzZXMiLCJfcHJldkNsYXNzIiwia2xhc3MiLCJSQU5HRV9UT0tFTiIsIkNIRUNLQk9YX1JBRElPX1RPS0VOIiwibm9ybWFsaXplRXZlbnRzIiwiY2hhbmdlIiwidGFyZ2V0JDEiLCJjcmVhdGVPbmNlSGFuZGxlciQxIiwicmVtb3ZlJDIiLCJ1c2VNaWNyb3Rhc2tGaXgiLCJhZGQkMSIsImF0dGFjaGVkVGltZXN0YW1wIiwiX3dyYXBwZXIiLCJjdXJyZW50VGFyZ2V0Iiwib3duZXJEb2N1bWVudCIsInVwZGF0ZURPTUxpc3RlbmVycyIsImV2ZW50cyIsInN2Z0NvbnRhaW5lciIsInVwZGF0ZURPTVByb3BzIiwib2xkUHJvcHMiLCJjaGlsZE5vZGVzIiwiX3ZhbHVlIiwic3RyQ3VyIiwic2hvdWxkVXBkYXRlVmFsdWUiLCJjaGVja1ZhbCIsImNvbXBvc2luZyIsImlzTm90SW5Gb2N1c0FuZERpcnR5IiwiaXNEaXJ0eVdpdGhNb2RpZmllcnMiLCJub3RJbkZvY3VzIiwiYWN0aXZlRWxlbWVudCIsIl92TW9kaWZpZXJzIiwibnVtYmVyIiwidHJpbSIsInBhcnNlU3R5bGVUZXh0IiwiY3NzVGV4dCIsImxpc3REZWxpbWl0ZXIiLCJwcm9wZXJ0eURlbGltaXRlciIsIm5vcm1hbGl6ZVN0eWxlRGF0YSIsIm5vcm1hbGl6ZVN0eWxlQmluZGluZyIsInN0YXRpY1N0eWxlIiwiYmluZGluZ1N0eWxlIiwiZ2V0U3R5bGUiLCJjaGVja0NoaWxkIiwic3R5bGVEYXRhIiwiY3NzVmFyUkUiLCJpbXBvcnRhbnRSRSIsInNldFByb3AiLCJzZXRQcm9wZXJ0eSIsIm5vcm1hbGl6ZWROYW1lIiwibm9ybWFsaXplIiwidmVuZG9yTmFtZXMiLCJlbXB0eVN0eWxlIiwiY2FwTmFtZSIsInVwZGF0ZVN0eWxlIiwib2xkU3RhdGljU3R5bGUiLCJvbGRTdHlsZUJpbmRpbmciLCJub3JtYWxpemVkU3R5bGUiLCJvbGRTdHlsZSIsIm5ld1N0eWxlIiwid2hpdGVzcGFjZVJFIiwiYWRkQ2xhc3MiLCJjbGFzc0xpc3QiLCJnZXRBdHRyaWJ1dGUiLCJyZW1vdmVDbGFzcyIsInRhciIsInJlc29sdmVUcmFuc2l0aW9uIiwiY3NzIiwiYXV0b0Nzc1RyYW5zaXRpb24iLCJlbnRlckNsYXNzIiwiZW50ZXJUb0NsYXNzIiwiZW50ZXJBY3RpdmVDbGFzcyIsImxlYXZlQ2xhc3MiLCJsZWF2ZVRvQ2xhc3MiLCJsZWF2ZUFjdGl2ZUNsYXNzIiwiaGFzVHJhbnNpdGlvbiIsIlRSQU5TSVRJT04iLCJBTklNQVRJT04iLCJ0cmFuc2l0aW9uUHJvcCIsInRyYW5zaXRpb25FbmRFdmVudCIsImFuaW1hdGlvblByb3AiLCJhbmltYXRpb25FbmRFdmVudCIsIm9udHJhbnNpdGlvbmVuZCIsIm9ud2Via2l0dHJhbnNpdGlvbmVuZCIsIm9uYW5pbWF0aW9uZW5kIiwib253ZWJraXRhbmltYXRpb25lbmQiLCJyYWYiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJuZXh0RnJhbWUiLCJhZGRUcmFuc2l0aW9uQ2xhc3MiLCJ0cmFuc2l0aW9uQ2xhc3NlcyIsInJlbW92ZVRyYW5zaXRpb25DbGFzcyIsIndoZW5UcmFuc2l0aW9uRW5kcyIsImdldFRyYW5zaXRpb25JbmZvIiwicHJvcENvdW50IiwiZW5kZWQiLCJvbkVuZCIsInRyYW5zZm9ybVJFIiwic3R5bGVzIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInRyYW5zaXRpb25EZWxheXMiLCJ0cmFuc2l0aW9uRHVyYXRpb25zIiwidHJhbnNpdGlvblRpbWVvdXQiLCJnZXRUaW1lb3V0IiwiYW5pbWF0aW9uRGVsYXlzIiwiYW5pbWF0aW9uRHVyYXRpb25zIiwiYW5pbWF0aW9uVGltZW91dCIsImhhc1RyYW5zZm9ybSIsImRlbGF5cyIsImR1cmF0aW9ucyIsInRvTXMiLCJzIiwiZW50ZXIiLCJ0b2dnbGVEaXNwbGF5IiwiY2FuY2VsbGVkIiwiX2VudGVyQ2IiLCJhcHBlYXJDbGFzcyIsImFwcGVhclRvQ2xhc3MiLCJhcHBlYXJBY3RpdmVDbGFzcyIsImJlZm9yZUVudGVyIiwiYWZ0ZXJFbnRlciIsImVudGVyQ2FuY2VsbGVkIiwiYmVmb3JlQXBwZWFyIiwiYXBwZWFyIiwiYWZ0ZXJBcHBlYXIiLCJhcHBlYXJDYW5jZWxsZWQiLCJkdXJhdGlvbiIsInRyYW5zaXRpb25Ob2RlIiwiaXNBcHBlYXIiLCJzdGFydENsYXNzIiwiYWN0aXZlQ2xhc3MiLCJ0b0NsYXNzIiwiYmVmb3JlRW50ZXJIb29rIiwiZW50ZXJIb29rIiwiYWZ0ZXJFbnRlckhvb2siLCJlbnRlckNhbmNlbGxlZEhvb2siLCJleHBsaWNpdEVudGVyRHVyYXRpb24iLCJleHBlY3RzQ1NTIiwidXNlcldhbnRzQ29udHJvbCIsImdldEhvb2tBcmd1bWVudHNMZW5ndGgiLCJzaG93IiwicGVuZGluZ05vZGUiLCJfcGVuZGluZyIsImlzVmFsaWREdXJhdGlvbiIsImxlYXZlIiwiYmVmb3JlTGVhdmUiLCJhZnRlckxlYXZlIiwibGVhdmVDYW5jZWxsZWQiLCJkZWxheUxlYXZlIiwiZXhwbGljaXRMZWF2ZUR1cmF0aW9uIiwicGVyZm9ybUxlYXZlIiwiY2hlY2tEdXJhdGlvbiIsImludm9rZXJGbnMiLCJfZW50ZXIiLCJwbGF0Zm9ybU1vZHVsZXMiLCJ2bW9kZWwiLCJ0cmlnZ2VyIiwiZGlyZWN0aXZlIiwiYmluZGluZyIsIl92T3B0aW9ucyIsInNldFNlbGVjdGVkIiwiZ2V0VmFsdWUiLCJvbkNvbXBvc2l0aW9uU3RhcnQiLCJvbkNvbXBvc2l0aW9uRW5kIiwicHJldk9wdGlvbnMiLCJjdXJPcHRpb25zIiwibyIsIm5lZWRSZXNldCIsImhhc05vTWF0Y2hpbmdPcHRpb24iLCJhY3R1YWxseVNldFNlbGVjdGVkIiwiaXNNdWx0aXBsZSIsIm9wdGlvbiIsInNlbGVjdGVkSW5kZXgiLCJpbml0RXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwibG9jYXRlTm9kZSIsInRyYW5zaXRpb24kJDEiLCJvcmlnaW5hbERpc3BsYXkiLCJfX3ZPcmlnaW5hbERpc3BsYXkiLCJkaXNwbGF5IiwidW5iaW5kIiwicGxhdGZvcm1EaXJlY3RpdmVzIiwidHJhbnNpdGlvblByb3BzIiwibW9kZSIsImdldFJlYWxDaGlsZCIsImNvbXBPcHRpb25zIiwiZXh0cmFjdFRyYW5zaXRpb25EYXRhIiwicGxhY2Vob2xkZXIiLCJoIiwicmF3Q2hpbGQiLCJoYXNQYXJlbnRUcmFuc2l0aW9uIiwiaXNTYW1lQ2hpbGQiLCJvbGRDaGlsZCIsImlzTm90VGV4dE5vZGUiLCJpc1ZTaG93RGlyZWN0aXZlIiwiVHJhbnNpdGlvbiIsIl9sZWF2aW5nIiwib2xkUmF3Q2hpbGQiLCJkZWxheWVkTGVhdmUiLCJtb3ZlQ2xhc3MiLCJUcmFuc2l0aW9uR3JvdXAiLCJiZWZvcmVNb3VudCIsImtlcHQiLCJwcmV2Q2hpbGRyZW4iLCJyYXdDaGlsZHJlbiIsInRyYW5zaXRpb25EYXRhIiwicmVtb3ZlZCIsImMkMSIsInBvcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInVwZGF0ZWQiLCJoYXNNb3ZlIiwiY2FsbFBlbmRpbmdDYnMiLCJyZWNvcmRQb3NpdGlvbiIsImFwcGx5VHJhbnNsYXRpb24iLCJfcmVmbG93IiwiYm9keSIsIm9mZnNldEhlaWdodCIsIm1vdmVkIiwidHJhbnNmb3JtIiwiV2Via2l0VHJhbnNmb3JtIiwidHJhbnNpdGlvbkR1cmF0aW9uIiwiX21vdmVDYiIsInByb3BlcnR5TmFtZSIsIl9oYXNNb3ZlIiwiY2xvbmVOb2RlIiwibmV3UG9zIiwib2xkUG9zIiwiZHgiLCJsZWZ0IiwiZHkiLCJ0b3AiLCJwbGF0Zm9ybUNvbXBvbmVudHMiLCJ0YWJsZSIsInRhYmxlQ2xhc3MiLCJsb2FkaW5nQ2xhc3MiLCJzb3J0YWJsZUljb24iLCJhc2NlbmRpbmdJY29uIiwiZGVzY2VuZGluZ0ljb24iLCJhc2NlbmRpbmdDbGFzcyIsImRlc2NlbmRpbmdDbGFzcyIsImhhbmRsZUljb24iLCJyZW5kZXJJY29uIiwiY2xhc3NlcyIsInBhZ2luYXRpb24iLCJ3cmFwcGVyQ2xhc3MiLCJkaXNhYmxlZENsYXNzIiwicGFnZUNsYXNzIiwibGlua0NsYXNzIiwiaWNvbnMiLCJmaXJzdCIsInByZXYiLCJwYWdpbmF0aW9uSW5mbyIsImluZm9DbGFzcyIsInJhbmRvbSIsInN1YnN0cmluZyIsIkNvbnRlbnRMb2FkZXIiLCJ3aWR0aCIsImhlaWdodCIsInNwZWVkIiwicHJlc2VydmVBc3BlY3RSYXRpbyIsImJhc2VVcmwiLCJwcmltYXJ5Q29sb3IiLCJzZWNvbmRhcnlDb2xvciIsInByaW1hcnlPcGFjaXR5Iiwic2Vjb25kYXJ5T3BhY2l0eSIsInVuaXF1ZUtleSIsImFuaW1hdGUiLCJfcmVmIiwiaWRDbGlwIiwiaWRHcmFkaWVudCIsIl9tZXJnZUpTWFByb3BzIiwidmlld0JveCIsImZpbGwiLCJ4IiwieSIsInJ4IiwicnkiLCJvZmZzZXQiLCJhdHRyaWJ1dGVOYW1lIiwiZHVyIiwicmVwZWF0Q291bnQiLCJCdWxsZXRMaXN0TG9hZGVyIiwiY3giLCJjeSIsInIiLCJDb2RlTG9hZGVyIiwiRmFjZWJvb2tMb2FkZXIiLCJMaXN0TG9hZGVyIiwiSW5zdGFncmFtTG9hZGVyIiwiVnVlRXZlbnRzIiwiSUQiLCJlbGVtZW50IiwiaW5pdGlhbFN0b3JlIiwiZGF0YXNldCIsIkFwcCIsIkRFRkFVTFRTIiwibGFiZWxLZXkiLCJ2YWx1ZUtleSIsImNoaWxkS2V5IiwiaWNvbktleSIsIml0ZW1LZXkiLCJpdGVtVHJpZ2dlciIsInBhdGhCYXIiLCJjbGFzc05hbWUiLCJjb250YWluZXIiLCJjb2wiLCJ1cmwiLCJpdGVtUHJlcGVuZCIsIml0ZW1Db250ZW50IiwiaXRlbUFwcGVuZCIsIkZpbmRlciIsIiRlbWl0dGVyIiwiRXZlbnRFbWl0dGVyIiwiJCIsIm9mZiIsImNsaWNrRXZlbnQiLCJrZXlkb3duRXZlbnQiLCJpdGVtU2VsZWN0ZWQiLCJhZGRDb2x1bW4iLCJuYXZpZ2F0ZSIsImdvVG8iLCJjcmVhdGVDb2x1bW4iLCJjcmVhdGVQYXRoQmFyIiwicHJldmVudERlZmF1bHQiLCJsb2NhdGlvbiIsImRlZmF1bHRQYXRoIiwiY3JlYXRlTGlzdCIsImRpdiIsImFwcGVuZCIsIkVycm9yIiwic2libGluZ3MiLCJpbnNlcnRBZnRlciIsImNvbHVtbiIsImNsb3Nlc3QiLCJwcmV2ZW50Iiwic3RvcFByb3BhZ2F0aW9uIiwiY29kZXMiLCJrZXlDb2RlIiwiZGlyZWN0aW9uIiwiX2l0ZW0iLCJmaW5kIiwibmV4dEFsbCIsImZvY3VzIiwic2Nyb2xsVG8iLCJwYWdlWE9mZnNldCIsInBhZ2VZT2Zmc2V0IiwidXBkYXRlUGF0aEJhciIsIm5ld0NvbHVtbiIsImZpbmRMYXN0QWN0aXZlIiwiaHJlZiIsImlzSW5WaWV3Iiwic2Nyb2xsVG9WaWV3IiwiYml0Iiwic2VsZWN0UGF0aCIsImNyZWF0ZUl0ZW0iLCJmcmFnbWVudHMiLCJyZWR1Y2UiLCJmcmFnbWVudCIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJsaXN0SXRlbSIsImxpc3RJdGVtQ2xhc3NlcyIsImxpbmsiLCJjcmVhdGVJdGVtQ29udGVudCIsImFjdGl2ZUl0ZW1zIiwiaXRlbUtleXMiLCJlbXB0eSIsImVhY2giLCJhY3RpdmVJdGVtIiwiaXNMYXN0IiwiaWNvbiIsImNoaWxkX2NvdW50IiwiaHRtbCIsInBhcnRpYWwiLCJjb250YWluZXJIZWlnaHQiLCJlbGVtZW50VG9wIiwiZWxlbWVudEJvdHRvbSIsImlzVG90YWwiLCJpc1BhcnRpYWwiLCJib3QiLCJib3R0b20iLCJub3dfdG9wIiwibm93X2JvdCIsInNjcm9sbF9ieSIsInNjcm9sbFRvcCIsIlhIUlVVSUQiLCJHUkFWX0NPTkZJRyIsIkdyYXZDb25maWciLCJHcmF2QWRtaW4iLCJJbnN0YW5jZXMiLCJpc0luVmlld3BvcnQiLCJib3VuZGluZyIsInRpdGxlYmFyIiwiaW5uZXJIZWlnaHQiLCJkb2N1bWVudEVsZW1lbnQiLCJjbGllbnRIZWlnaHQiLCJyaWdodCIsImlubmVyV2lkdGgiLCJjbGllbnRXaWR0aCIsIkZsZXhQYWdlcyIsImRhdGFMb2FkIiwiZmluZGVyIiwiZ2V0SW5pdGlhbFJvdXRlIiwic2V0SW5pdGlhbFJvdXRlIiwicm91dGUiLCJzY3JvbGxMZWZ0Iiwic2Nyb2xsV2lkdGgiLCJmaWx0ZXJzIiwiZ2V0U3RvcmUiLCJVVUlEIiwic3RhcnRMb2FkZXIiLCJ3aXRoRmlsdGVycyIsImN1cnJlbnRfdXJsIiwiYXNzaWduIiwiYjY0X2VuY29kZV91bmljb2RlIiwiYWN0aW9uIiwic3VjY2VzcyIsInJlc3BvbnNlIiwic3RvcExvYWRlciIsInN0YXR1cyIsImNyZWF0ZUVycm9yQ29sdW1uIiwibG9hZGluZ0luZGljYXRvciIsImNyZWF0ZUxvYWRpbmdDb2x1bW4iLCJmaWx0ZXJzX2hpdCIsImZyYWciLCJ0aXRsZSIsImV4dHJhcyIsInB1Ymxpc2hlZCIsImxhbmciLCJ0cmFuc2xhdGVkIiwiYXBwZW5kVG8iLCJwdWJsaXNoZWRfZGF0ZSIsInVucHVibGlzaGVkX2RhdGUiLCJjbG9jayIsImFjdGlvbnMiLCJkb3Rkb3Rkb3QiLCJMQU5HX1VSTCIsInRhZ3MiLCJsYW5ncyIsInRyYW5zbGF0aW9ucyIsImNhblByZXZpZXciLCJpbmNsdWRlcyIsImNhbkVkaXQiLCJjYW5Db3B5IiwiY2FuRGVsZXRlIiwidWwiLCJhZG1pbl9ub25jZSIsInRlbXBsYXRlIiwiYnV0dG9uIiwiY291bnQiLCJhcnJvdyIsImJ0b2EiLCJlbmNvZGVVUklDb21wb25lbnQiLCJ0b1NvbGlkQnl0ZXMiLCJwMSIsImZyb21DaGFyQ29kZSIsImI2NF9kZWNvZGVfdW5pY29kZSIsImRlY29kZVVSSUNvbXBvbmVudCIsImF0b2IiLCJ1cGRhdGVQb3NpdGlvbiIsInNjcm9sbGluZ0NvbHVtbiIsInBhZ2VDb2x1bW5zIiwiZ3JvdXAiLCJkcm9wZG93biIsImJ1dHRvbkluVmlldyIsImJ1dHRvbkNsaWVudFJlY3QiLCJkcm9wZG93bkNsaWVudFJlY3QiLCJ0YXJnZXRDbGllbnRSZWN0IiwiY2xvc2VHaG9zdERyb3Bkb3ducyIsIm9wZW5lZCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJzY3JvbGxpbmdEb2N1bWVudCIsImNvbnRhaW5zIiwidG9nZ2xlIiwiY29udGFpbmVyU2Nyb2xsZXIiLCJzY3JvbGwiLCJzY3JvbGxFdmVudCIsIkV2ZW50IiwiZXNjYXBlUmUiLCJjb21wdXRlRXhwaXJlcyIsImxhc3RDaCIsImV4cGlyZXMiLCJzZXRGdWxsWWVhciIsImdldEZ1bGxZZWFyIiwic2V0TW9udGgiLCJnZXRNb250aCIsInNldERhdGUiLCJnZXREYXRlIiwic2V0SG91cnMiLCJnZXRIb3VycyIsInNldE1pbnV0ZXMiLCJnZXRNaW51dGVzIiwic2V0U2Vjb25kcyIsImdldFNlY29uZHMiLCJjb252ZXJ0IiwidG9VVENTdHJpbmciLCJfZXh0ZW5kcyIsImlzRW5hYmxlZCIsInJlIiwiY29va2llIiwiZW5hYmxlZCIsImRlY29kZXIiLCJyZUtleSIsImV4ZWMiLCJnZXRBbGwiLCJjb29raWVzIiwiZW5jb2RlciIsImF0dHJzU3RyIiwidmFsdWVTdHIiLCJuZXdDb29raWUiLCJnZXRSYXciLCJzZXRSYXciLCJpbnB1dHMiLCJ0cmFja011bHRpIiwiaW5kZXRlcm1pbmF0ZSIsImNoZWNrZWQiLCJtdWx0aSIsInBhcnNlIiwiZ2V0Q29va2llIiwic2V0U3RvcmUiLCJzdG9yZSIsInNhbWVzaXRlIiwic2V0Q29va2llIiwicGFyc2VkIiwiRmxleFBhZ2VzSW5zdGFuY2UiLCJSZUxvYWQiLCJmcmVzaCIsInNlYXJjaCIsImxvYWRlciIsImNvbnRlbnQiLCJncmF2Q29uZmlnIiwiZ2V0RmlsdGVycyIsImlzU2VhcmNoRm9jdXNlZCIsImNvbnRlbnRXcmFwcGVyIiwic2Nyb2xsUG9zaXRpb24iLCJmaWx0ZXJUeXBlIiwiaW5wdXQiLCJ3cmFwcGVyIiwiX2NoZWNrU3RhdHVzIiwi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YixDQUEwQixNQUExQixNQUFzQyxpQkFBdkUsRUFBMEY7QUFDdEY0ZCxtQkFBZSxDQUFDRyxNQUFoQjtBQUNBSCxtQkFBZTtBQUNsQjtBQUNKLENBTEQsRTs7QUN4Q0E7QUFDQSIsImZpbGUiOiI3NTEwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBWdWUuanMgdjIuNi4xMlxuICogKGMpIDIwMTQtMjAyMCBFdmFuIFlvdVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG4vKiAgKi9cblxudmFyIGVtcHR5T2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG5cbi8vIFRoZXNlIGhlbHBlcnMgcHJvZHVjZSBiZXR0ZXIgVk0gY29kZSBpbiBKUyBlbmdpbmVzIGR1ZSB0byB0aGVpclxuLy8gZXhwbGljaXRuZXNzIGFuZCBmdW5jdGlvbiBpbmxpbmluZy5cbmZ1bmN0aW9uIGlzVW5kZWYgKHYpIHtcbiAgcmV0dXJuIHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsXG59XG5cbmZ1bmN0aW9uIGlzRGVmICh2KSB7XG4gIHJldHVybiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbFxufVxuXG5mdW5jdGlvbiBpc1RydWUgKHYpIHtcbiAgcmV0dXJuIHYgPT09IHRydWVcbn1cblxuZnVuY3Rpb24gaXNGYWxzZSAodikge1xuICByZXR1cm4gdiA9PT0gZmFsc2Vcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2YWx1ZSBpcyBwcmltaXRpdmUuXG4gKi9cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlICh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8XG4gICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nXG4gIClcbn1cblxuLyoqXG4gKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGxcbiAqIE9iamVjdHMgZnJvbSBwcmltaXRpdmUgdmFsdWVzIHdoZW4gd2Uga25vdyB0aGUgdmFsdWVcbiAqIGlzIGEgSlNPTi1jb21wbGlhbnQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QgKG9iaikge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG59XG5cbi8qKlxuICogR2V0IHRoZSByYXcgdHlwZSBzdHJpbmcgb2YgYSB2YWx1ZSwgZS5nLiwgW29iamVjdCBPYmplY3RdLlxuICovXG52YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gdG9SYXdUeXBlICh2YWx1ZSkge1xuICByZXR1cm4gX3RvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKVxufVxuXG4vKipcbiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWVcbiAqIGZvciBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikge1xuICByZXR1cm4gX3RvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbn1cblxuZnVuY3Rpb24gaXNSZWdFeHAgKHYpIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHYpID09PSAnW29iamVjdCBSZWdFeHBdJ1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LlxuICovXG5mdW5jdGlvbiBpc1ZhbGlkQXJyYXlJbmRleCAodmFsKSB7XG4gIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodmFsKSk7XG4gIHJldHVybiBuID49IDAgJiYgTWF0aC5mbG9vcihuKSA9PT0gbiAmJiBpc0Zpbml0ZSh2YWwpXG59XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZSAodmFsKSB7XG4gIHJldHVybiAoXG4gICAgaXNEZWYodmFsKSAmJlxuICAgIHR5cGVvZiB2YWwudGhlbiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiB2YWwuY2F0Y2ggPT09ICdmdW5jdGlvbidcbiAgKVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLlxuICovXG5mdW5jdGlvbiB0b1N0cmluZyAodmFsKSB7XG4gIHJldHVybiB2YWwgPT0gbnVsbFxuICAgID8gJydcbiAgICA6IEFycmF5LmlzQXJyYXkodmFsKSB8fCAoaXNQbGFpbk9iamVjdCh2YWwpICYmIHZhbC50b1N0cmluZyA9PT0gX3RvU3RyaW5nKVxuICAgICAgPyBKU09OLnN0cmluZ2lmeSh2YWwsIG51bGwsIDIpXG4gICAgICA6IFN0cmluZyh2YWwpXG59XG5cbi8qKlxuICogQ29udmVydCBhbiBpbnB1dCB2YWx1ZSB0byBhIG51bWJlciBmb3IgcGVyc2lzdGVuY2UuXG4gKiBJZiB0aGUgY29udmVyc2lvbiBmYWlscywgcmV0dXJuIG9yaWdpbmFsIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIgKHZhbCkge1xuICB2YXIgbiA9IHBhcnNlRmxvYXQodmFsKTtcbiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogblxufVxuXG4vKipcbiAqIE1ha2UgYSBtYXAgYW5kIHJldHVybiBhIGZ1bmN0aW9uIGZvciBjaGVja2luZyBpZiBhIGtleVxuICogaXMgaW4gdGhhdCBtYXAuXG4gKi9cbmZ1bmN0aW9uIG1ha2VNYXAgKFxuICBzdHIsXG4gIGV4cGVjdHNMb3dlckNhc2Vcbikge1xuICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIGxpc3QgPSBzdHIuc3BsaXQoJywnKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgbWFwW2xpc3RbaV1dID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZXhwZWN0c0xvd2VyQ2FzZVxuICAgID8gZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbC50b0xvd2VyQ2FzZSgpXTsgfVxuICAgIDogZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbF07IH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHRhZyBpcyBhIGJ1aWx0LWluIHRhZy5cbiAqL1xudmFyIGlzQnVpbHRJblRhZyA9IG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50JywgdHJ1ZSk7XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuICovXG52YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzJyk7XG5cbi8qKlxuICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhbiBhcnJheS5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHtcbiAgaWYgKGFyci5sZW5ndGgpIHtcbiAgICB2YXIgaW5kZXggPSBhcnIuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgcmV0dXJuIGFyci5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhbiBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS5cbiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FjaGVkIHZlcnNpb24gb2YgYSBwdXJlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjYWNoZWQgKGZuKSB7XG4gIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiAoZnVuY3Rpb24gY2FjaGVkRm4gKHN0cikge1xuICAgIHZhciBoaXQgPSBjYWNoZVtzdHJdO1xuICAgIHJldHVybiBoaXQgfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKVxuICB9KVxufVxuXG4vKipcbiAqIENhbWVsaXplIGEgaHlwaGVuLWRlbGltaXRlZCBzdHJpbmcuXG4gKi9cbnZhciBjYW1lbGl6ZVJFID0gLy0oXFx3KS9nO1xudmFyIGNhbWVsaXplID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIGZ1bmN0aW9uIChfLCBjKSB7IHJldHVybiBjID8gYy50b1VwcGVyQ2FzZSgpIDogJyc7IH0pXG59KTtcblxuLyoqXG4gKiBDYXBpdGFsaXplIGEgc3RyaW5nLlxuICovXG52YXIgY2FwaXRhbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSlcbn0pO1xuXG4vKipcbiAqIEh5cGhlbmF0ZSBhIGNhbWVsQ2FzZSBzdHJpbmcuXG4gKi9cbnZhciBoeXBoZW5hdGVSRSA9IC9cXEIoW0EtWl0pL2c7XG52YXIgaHlwaGVuYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGh5cGhlbmF0ZVJFLCAnLSQxJykudG9Mb3dlckNhc2UoKVxufSk7XG5cbi8qKlxuICogU2ltcGxlIGJpbmQgcG9seWZpbGwgZm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBzdXBwb3J0IGl0LFxuICogZS5nLiwgUGhhbnRvbUpTIDEueC4gVGVjaG5pY2FsbHksIHdlIGRvbid0IG5lZWQgdGhpcyBhbnltb3JlXG4gKiBzaW5jZSBuYXRpdmUgYmluZCBpcyBub3cgcGVyZm9ybWFudCBlbm91Z2ggaW4gbW9zdCBicm93c2Vycy5cbiAqIEJ1dCByZW1vdmluZyBpdCB3b3VsZCBtZWFuIGJyZWFraW5nIGNvZGUgdGhhdCB3YXMgYWJsZSB0byBydW4gaW5cbiAqIFBoYW50b21KUyAxLngsIHNvIHRoaXMgbXVzdCBiZSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBwb2x5ZmlsbEJpbmQgKGZuLCBjdHgpIHtcbiAgZnVuY3Rpb24gYm91bmRGbiAoYSkge1xuICAgIHZhciBsID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICByZXR1cm4gbFxuICAgICAgPyBsID4gMVxuICAgICAgICA/IGZuLmFwcGx5KGN0eCwgYXJndW1lbnRzKVxuICAgICAgICA6IGZuLmNhbGwoY3R4LCBhKVxuICAgICAgOiBmbi5jYWxsKGN0eClcbiAgfVxuXG4gIGJvdW5kRm4uX2xlbmd0aCA9IGZuLmxlbmd0aDtcbiAgcmV0dXJuIGJvdW5kRm5cbn1cblxuZnVuY3Rpb24gbmF0aXZlQmluZCAoZm4sIGN0eCkge1xuICByZXR1cm4gZm4uYmluZChjdHgpXG59XG5cbnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcbiAgPyBuYXRpdmVCaW5kXG4gIDogcG9seWZpbGxCaW5kO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gQXJyYXktbGlrZSBvYmplY3QgdG8gYSByZWFsIEFycmF5LlxuICovXG5mdW5jdGlvbiB0b0FycmF5IChsaXN0LCBzdGFydCkge1xuICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gIHZhciBpID0gbGlzdC5sZW5ndGggLSBzdGFydDtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShpKTtcbiAgd2hpbGUgKGktLSkge1xuICAgIHJldFtpXSA9IGxpc3RbaSArIHN0YXJ0XTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbi8qKlxuICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBleHRlbmQgKHRvLCBfZnJvbSkge1xuICBmb3IgKHZhciBrZXkgaW4gX2Zyb20pIHtcbiAgICB0b1trZXldID0gX2Zyb21ba2V5XTtcbiAgfVxuICByZXR1cm4gdG9cbn1cblxuLyoqXG4gKiBNZXJnZSBhbiBBcnJheSBvZiBPYmplY3RzIGludG8gYSBzaW5nbGUgT2JqZWN0LlxuICovXG5mdW5jdGlvbiB0b09iamVjdCAoYXJyKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJyW2ldKSB7XG4gICAgICBleHRlbmQocmVzLCBhcnJbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cbi8qKlxuICogUGVyZm9ybSBubyBvcGVyYXRpb24uXG4gKiBTdHViYmluZyBhcmdzIHRvIG1ha2UgRmxvdyBoYXBweSB3aXRob3V0IGxlYXZpbmcgdXNlbGVzcyB0cmFuc3BpbGVkIGNvZGVcbiAqIHdpdGggLi4ucmVzdCAoaHR0cHM6Ly9mbG93Lm9yZy9ibG9nLzIwMTcvMDUvMDcvU3RyaWN0LUZ1bmN0aW9uLUNhbGwtQXJpdHkvKS5cbiAqL1xuZnVuY3Rpb24gbm9vcCAoYSwgYiwgYykge31cblxuLyoqXG4gKiBBbHdheXMgcmV0dXJuIGZhbHNlLlxuICovXG52YXIgbm8gPSBmdW5jdGlvbiAoYSwgYiwgYykgeyByZXR1cm4gZmFsc2U7IH07XG5cbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHNhbWUgdmFsdWUuXG4gKi9cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9O1xuXG4vKipcbiAqIENoZWNrIGlmIHR3byB2YWx1ZXMgYXJlIGxvb3NlbHkgZXF1YWwgLSB0aGF0IGlzLFxuICogaWYgdGhleSBhcmUgcGxhaW4gb2JqZWN0cywgZG8gdGhleSBoYXZlIHRoZSBzYW1lIHNoYXBlP1xuICovXG5mdW5jdGlvbiBsb29zZUVxdWFsIChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7IHJldHVybiB0cnVlIH1cbiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpO1xuICB2YXIgaXNPYmplY3RCID0gaXNPYmplY3QoYik7XG4gIGlmIChpc09iamVjdEEgJiYgaXNPYmplY3RCKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc0FycmF5QSA9IEFycmF5LmlzQXJyYXkoYSk7XG4gICAgICB2YXIgaXNBcnJheUIgPSBBcnJheS5pc0FycmF5KGIpO1xuICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7XG4gICAgICAgIHJldHVybiBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeShmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGUsIGJbaV0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKClcbiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5Qikge1xuICAgICAgICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgICAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMoYik7XG4gICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGxvb3NlRXF1YWwoYVtrZXldLCBiW2tleV0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9IGVsc2UgaWYgKCFpc09iamVjdEEgJiYgIWlzT2JqZWN0Qikge1xuICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBhdCB3aGljaCBhIGxvb3NlbHkgZXF1YWwgdmFsdWUgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgYXJyYXkgKGlmIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGUgYXJyYXkgbXVzdFxuICogY29udGFpbiBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgc2hhcGUpLCBvciAtMSBpZiBpdCBpcyBub3QgcHJlc2VudC5cbiAqL1xuZnVuY3Rpb24gbG9vc2VJbmRleE9mIChhcnIsIHZhbCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChsb29zZUVxdWFsKGFycltpXSwgdmFsKSkgeyByZXR1cm4gaSB9XG4gIH1cbiAgcmV0dXJuIC0xXG59XG5cbi8qKlxuICogRW5zdXJlIGEgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgb25jZS5cbiAqL1xuZnVuY3Rpb24gb25jZSAoZm4pIHtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghY2FsbGVkKSB7XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFNTUl9BVFRSID0gJ2RhdGEtc2VydmVyLXJlbmRlcmVkJztcblxudmFyIEFTU0VUX1RZUEVTID0gW1xuICAnY29tcG9uZW50JyxcbiAgJ2RpcmVjdGl2ZScsXG4gICdmaWx0ZXInXG5dO1xuXG52YXIgTElGRUNZQ0xFX0hPT0tTID0gW1xuICAnYmVmb3JlQ3JlYXRlJyxcbiAgJ2NyZWF0ZWQnLFxuICAnYmVmb3JlTW91bnQnLFxuICAnbW91bnRlZCcsXG4gICdiZWZvcmVVcGRhdGUnLFxuICAndXBkYXRlZCcsXG4gICdiZWZvcmVEZXN0cm95JyxcbiAgJ2Rlc3Ryb3llZCcsXG4gICdhY3RpdmF0ZWQnLFxuICAnZGVhY3RpdmF0ZWQnLFxuICAnZXJyb3JDYXB0dXJlZCcsXG4gICdzZXJ2ZXJQcmVmZXRjaCdcbl07XG5cbi8qICAqL1xuXG5cblxudmFyIGNvbmZpZyA9ICh7XG4gIC8qKlxuICAgKiBPcHRpb24gbWVyZ2Ugc3RyYXRlZ2llcyAodXNlZCBpbiBjb3JlL3V0aWwvb3B0aW9ucylcbiAgICovXG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICBvcHRpb25NZXJnZVN0cmF0ZWdpZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3VwcHJlc3Mgd2FybmluZ3MuXG4gICAqL1xuICBzaWxlbnQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290P1xuICAgKi9cbiAgcHJvZHVjdGlvblRpcDogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyxcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHNcbiAgICovXG4gIGRldnRvb2xzOiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmXG4gICAqL1xuICBwZXJmb3JtYW5jZTogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEVycm9yIGhhbmRsZXIgZm9yIHdhdGNoZXIgZXJyb3JzXG4gICAqL1xuICBlcnJvckhhbmRsZXI6IG51bGwsXG5cbiAgLyoqXG4gICAqIFdhcm4gaGFuZGxlciBmb3Igd2F0Y2hlciB3YXJuc1xuICAgKi9cbiAgd2FybkhhbmRsZXI6IG51bGwsXG5cbiAgLyoqXG4gICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50c1xuICAgKi9cbiAgaWdub3JlZEVsZW1lbnRzOiBbXSxcblxuICAvKipcbiAgICogQ3VzdG9tIHVzZXIga2V5IGFsaWFzZXMgZm9yIHYtb25cbiAgICovXG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICBrZXlDb2RlczogT2JqZWN0LmNyZWF0ZShudWxsKSxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgcmVzZXJ2ZWQgc28gdGhhdCBpdCBjYW5ub3QgYmUgcmVnaXN0ZXJlZCBhcyBhXG4gICAqIGNvbXBvbmVudC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIGlzUmVzZXJ2ZWRUYWc6IG5vLFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQgc28gdGhhdCBpdCBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbXBvbmVudFxuICAgKiBwcm9wLiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLlxuICAgKi9cbiAgaXNSZXNlcnZlZEF0dHI6IG5vLFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHRhZyBpcyBhbiB1bmtub3duIGVsZW1lbnQuXG4gICAqIFBsYXRmb3JtLWRlcGVuZGVudC5cbiAgICovXG4gIGlzVW5rbm93bkVsZW1lbnQ6IG5vLFxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5hbWVzcGFjZSBvZiBhbiBlbGVtZW50XG4gICAqL1xuICBnZXRUYWdOYW1lc3BhY2U6IG5vb3AsXG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSByZWFsIHRhZyBuYW1lIGZvciB0aGUgc3BlY2lmaWMgcGxhdGZvcm0uXG4gICAqL1xuICBwYXJzZVBsYXRmb3JtVGFnTmFtZTogaWRlbnRpdHksXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIGJvdW5kIHVzaW5nIHByb3BlcnR5LCBlLmcuIHZhbHVlXG4gICAqIFBsYXRmb3JtLWRlcGVuZGVudC5cbiAgICovXG4gIG11c3RVc2VQcm9wOiBubyxcblxuICAvKipcbiAgICogUGVyZm9ybSB1cGRhdGVzIGFzeW5jaHJvbm91c2x5LiBJbnRlbmRlZCB0byBiZSB1c2VkIGJ5IFZ1ZSBUZXN0IFV0aWxzXG4gICAqIFRoaXMgd2lsbCBzaWduaWZpY2FudGx5IHJlZHVjZSBwZXJmb3JtYW5jZSBpZiBzZXQgdG8gZmFsc2UuXG4gICAqL1xuICBhc3luYzogdHJ1ZSxcblxuICAvKipcbiAgICogRXhwb3NlZCBmb3IgbGVnYWN5IHJlYXNvbnNcbiAgICovXG4gIF9saWZlY3ljbGVIb29rczogTElGRUNZQ0xFX0hPT0tTXG59KTtcblxuLyogICovXG5cbi8qKlxuICogdW5pY29kZSBsZXR0ZXJzIHVzZWQgZm9yIHBhcnNpbmcgaHRtbCB0YWdzLCBjb21wb25lbnQgbmFtZXMgYW5kIHByb3BlcnR5IHBhdGhzLlxuICogdXNpbmcgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1My9zZW1hbnRpY3Mtc2NyaXB0aW5nLmh0bWwjcG90ZW50aWFsY3VzdG9tZWxlbWVudG5hbWVcbiAqIHNraXBwaW5nIFxcdTEwMDAwLVxcdUVGRkZGIGR1ZSB0byBpdCBmcmVlemluZyB1cCBQaGFudG9tSlNcbiAqL1xudmFyIHVuaWNvZGVSZWdFeHAgPSAvYS16QS1aXFx1MDBCN1xcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwM0YtXFx1MjA0MFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRC87XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfXG4gKi9cbmZ1bmN0aW9uIGlzUmVzZXJ2ZWQgKHN0cikge1xuICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTtcbiAgcmV0dXJuIGMgPT09IDB4MjQgfHwgYyA9PT0gMHg1RlxufVxuXG4vKipcbiAqIERlZmluZSBhIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBkZWYgKG9iaiwga2V5LCB2YWwsIGVudW1lcmFibGUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgdmFsdWU6IHZhbCxcbiAgICBlbnVtZXJhYmxlOiAhIWVudW1lcmFibGUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlIHNpbXBsZSBwYXRoLlxuICovXG52YXIgYmFpbFJFID0gbmV3IFJlZ0V4cCgoXCJbXlwiICsgKHVuaWNvZGVSZWdFeHAuc291cmNlKSArIFwiLiRfXFxcXGRdXCIpKTtcbmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkge1xuICBpZiAoYmFpbFJFLnRlc3QocGF0aCkpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFvYmopIHsgcmV0dXJuIH1cbiAgICAgIG9iaiA9IG9ialtzZWdtZW50c1tpXV07XG4gICAgfVxuICAgIHJldHVybiBvYmpcbiAgfVxufVxuXG4vKiAgKi9cblxuLy8gY2FuIHdlIHVzZSBfX3Byb3RvX18/XG52YXIgaGFzUHJvdG8gPSAnX19wcm90b19fJyBpbiB7fTtcblxuLy8gQnJvd3NlciBlbnZpcm9ubWVudCBzbmlmZmluZ1xudmFyIGluQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xudmFyIGluV2VleCA9IHR5cGVvZiBXWEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhIVdYRW52aXJvbm1lbnQucGxhdGZvcm07XG52YXIgd2VleFBsYXRmb3JtID0gaW5XZWV4ICYmIFdYRW52aXJvbm1lbnQucGxhdGZvcm0udG9Mb3dlckNhc2UoKTtcbnZhciBVQSA9IGluQnJvd3NlciAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xudmFyIGlzSUUgPSBVQSAmJiAvbXNpZXx0cmlkZW50Ly50ZXN0KFVBKTtcbnZhciBpc0lFOSA9IFVBICYmIFVBLmluZGV4T2YoJ21zaWUgOS4wJykgPiAwO1xudmFyIGlzRWRnZSA9IFVBICYmIFVBLmluZGV4T2YoJ2VkZ2UvJykgPiAwO1xudmFyIGlzQW5kcm9pZCA9IChVQSAmJiBVQS5pbmRleE9mKCdhbmRyb2lkJykgPiAwKSB8fCAod2VleFBsYXRmb3JtID09PSAnYW5kcm9pZCcpO1xudmFyIGlzSU9TID0gKFVBICYmIC9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChVQSkpIHx8ICh3ZWV4UGxhdGZvcm0gPT09ICdpb3MnKTtcbnZhciBpc0Nocm9tZSA9IFVBICYmIC9jaHJvbWVcXC9cXGQrLy50ZXN0KFVBKSAmJiAhaXNFZGdlO1xudmFyIGlzUGhhbnRvbUpTID0gVUEgJiYgL3BoYW50b21qcy8udGVzdChVQSk7XG52YXIgaXNGRiA9IFVBICYmIFVBLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLyk7XG5cbi8vIEZpcmVmb3ggaGFzIGEgXCJ3YXRjaFwiIGZ1bmN0aW9uIG9uIE9iamVjdC5wcm90b3R5cGUuLi5cbnZhciBuYXRpdmVXYXRjaCA9ICh7fSkud2F0Y2g7XG5cbnZhciBzdXBwb3J0c1Bhc3NpdmUgPSBmYWxzZTtcbmlmIChpbkJyb3dzZXIpIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0cyA9IHt9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcHRzLCAncGFzc2l2ZScsICh7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHN1cHBvcnRzUGFzc2l2ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSkpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMjg1XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QtcGFzc2l2ZScsIG51bGwsIG9wdHMpO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG4vLyB0aGlzIG5lZWRzIHRvIGJlIGxhenktZXZhbGVkIGJlY2F1c2UgdnVlIG1heSBiZSByZXF1aXJlZCBiZWZvcmVcbi8vIHZ1ZS1zZXJ2ZXItcmVuZGVyZXIgY2FuIHNldCBWVUVfRU5WXG52YXIgX2lzU2VydmVyO1xudmFyIGlzU2VydmVyUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkge1xuICBpZiAoX2lzU2VydmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWluQnJvd3NlciAmJiAhaW5XZWV4ICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBkZXRlY3QgcHJlc2VuY2Ugb2YgdnVlLXNlcnZlci1yZW5kZXJlciBhbmQgYXZvaWRcbiAgICAgIC8vIFdlYnBhY2sgc2hpbW1pbmcgdGhlIHByb2Nlc3NcbiAgICAgIF9pc1NlcnZlciA9IGdsb2JhbFsncHJvY2VzcyddICYmIGdsb2JhbFsncHJvY2VzcyddLmVudi5WVUVfRU5WID09PSAnc2VydmVyJztcbiAgICB9IGVsc2Uge1xuICAgICAgX2lzU2VydmVyID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBfaXNTZXJ2ZXJcbn07XG5cbi8vIGRldGVjdCBkZXZ0b29sc1xudmFyIGRldnRvb2xzID0gaW5Ccm93c2VyICYmIHdpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gaXNOYXRpdmUgKEN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09PSAnZnVuY3Rpb24nICYmIC9uYXRpdmUgY29kZS8udGVzdChDdG9yLnRvU3RyaW5nKCkpXG59XG5cbnZhciBoYXNTeW1ib2wgPVxuICB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShTeW1ib2wpICYmXG4gIHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShSZWZsZWN0Lm93bktleXMpO1xuXG52YXIgX1NldDtcbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLyAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbmlmICh0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShTZXQpKSB7XG4gIC8vIHVzZSBuYXRpdmUgU2V0IHdoZW4gYXZhaWxhYmxlLlxuICBfU2V0ID0gU2V0O1xufSBlbHNlIHtcbiAgLy8gYSBub24tc3RhbmRhcmQgU2V0IHBvbHlmaWxsIHRoYXQgb25seSB3b3JrcyB3aXRoIHByaW1pdGl2ZSBrZXlzLlxuICBfU2V0ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2V0ICgpIHtcbiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gICAgU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBoYXMgKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gPT09IHRydWVcbiAgICB9O1xuICAgIFNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkIChrZXkpIHtcbiAgICAgIHRoaXMuc2V0W2tleV0gPSB0cnVlO1xuICAgIH07XG4gICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFNldDtcbiAgfSgpKTtcbn1cblxuLyogICovXG5cbnZhciB3YXJuID0gbm9vcDtcbnZhciB0aXAgPSBub29wO1xudmFyIGdlbmVyYXRlQ29tcG9uZW50VHJhY2UgPSAobm9vcCk7IC8vIHdvcmsgYXJvdW5kIGZsb3cgY2hlY2tcbnZhciBmb3JtYXRDb21wb25lbnROYW1lID0gKG5vb3ApO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgaGFzQ29uc29sZSA9IHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJztcbiAgdmFyIGNsYXNzaWZ5UkUgPSAvKD86XnxbLV9dKShcXHcpL2c7XG4gIHZhciBjbGFzc2lmeSA9IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIHN0clxuICAgIC5yZXBsYWNlKGNsYXNzaWZ5UkUsIGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRvVXBwZXJDYXNlKCk7IH0pXG4gICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9O1xuXG4gIHdhcm4gPSBmdW5jdGlvbiAobXNnLCB2bSkge1xuICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJztcblxuICAgIGlmIChjb25maWcud2FybkhhbmRsZXIpIHtcbiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbVnVlIHdhcm5dOiBcIiArIG1zZyArIHRyYWNlKSk7XG4gICAgfVxuICB9O1xuXG4gIHRpcCA9IGZ1bmN0aW9uIChtc2csIHZtKSB7XG4gICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKFwiW1Z1ZSB0aXBdOiBcIiArIG1zZyArIChcbiAgICAgICAgdm0gPyBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlKHZtKSA6ICcnXG4gICAgICApKTtcbiAgICB9XG4gIH07XG5cbiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHtcbiAgICBpZiAodm0uJHJvb3QgPT09IHZtKSB7XG4gICAgICByZXR1cm4gJzxSb290PidcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygdm0gPT09ICdmdW5jdGlvbicgJiYgdm0uY2lkICE9IG51bGxcbiAgICAgID8gdm0ub3B0aW9uc1xuICAgICAgOiB2bS5faXNWdWVcbiAgICAgICAgPyB2bS4kb3B0aW9ucyB8fCB2bS5jb25zdHJ1Y3Rvci5vcHRpb25zXG4gICAgICAgIDogdm07XG4gICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnO1xuICAgIHZhciBmaWxlID0gb3B0aW9ucy5fX2ZpbGU7XG4gICAgaWYgKCFuYW1lICYmIGZpbGUpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwudnVlJC8pO1xuICAgICAgbmFtZSA9IG1hdGNoICYmIG1hdGNoWzFdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAobmFtZSA/IChcIjxcIiArIChjbGFzc2lmeShuYW1lKSkgKyBcIj5cIikgOiBcIjxBbm9ueW1vdXM+XCIpICtcbiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/IChcIiBhdCBcIiArIGZpbGUpIDogJycpXG4gICAgKVxuICB9O1xuXG4gIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHdoaWxlIChuKSB7XG4gICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfVxuICAgICAgaWYgKG4gPiAxKSB7IHN0ciArPSBzdHI7IH1cbiAgICAgIG4gPj49IDE7XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfTtcblxuICBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gZnVuY3Rpb24gKHZtKSB7XG4gICAgaWYgKHZtLl9pc1Z1ZSAmJiB2bS4kcGFyZW50KSB7XG4gICAgICB2YXIgdHJlZSA9IFtdO1xuICAgICAgdmFyIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA9IDA7XG4gICAgICB3aGlsZSAodm0pIHtcbiAgICAgICAgaWYgKHRyZWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciBsYXN0ID0gdHJlZVt0cmVlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChsYXN0LmNvbnN0cnVjdG9yID09PSB2bS5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlKys7XG4gICAgICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID4gMCkge1xuICAgICAgICAgICAgdHJlZVt0cmVlLmxlbmd0aCAtIDFdID0gW2xhc3QsIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZV07XG4gICAgICAgICAgICBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmVlLnB1c2godm0pO1xuICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ1xcblxcbmZvdW5kIGluXFxuXFxuJyArIHRyZWVcbiAgICAgICAgLm1hcChmdW5jdGlvbiAodm0sIGkpIHsgcmV0dXJuIChcIlwiICsgKGkgPT09IDAgPyAnLS0tPiAnIDogcmVwZWF0KCcgJywgNSArIGkgKiAyKSkgKyAoQXJyYXkuaXNBcnJheSh2bSlcbiAgICAgICAgICAgID8gKChmb3JtYXRDb21wb25lbnROYW1lKHZtWzBdKSkgKyBcIi4uLiAoXCIgKyAodm1bMV0pICsgXCIgcmVjdXJzaXZlIGNhbGxzKVwiKVxuICAgICAgICAgICAgOiBmb3JtYXRDb21wb25lbnROYW1lKHZtKSkpOyB9KVxuICAgICAgICAuam9pbignXFxuJylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIChcIlxcblxcbihmb3VuZCBpbiBcIiArIChmb3JtYXRDb21wb25lbnROYW1lKHZtKSkgKyBcIilcIilcbiAgICB9XG4gIH07XG59XG5cbi8qICAqL1xuXG52YXIgdWlkID0gMDtcblxuLyoqXG4gKiBBIGRlcCBpcyBhbiBvYnNlcnZhYmxlIHRoYXQgY2FuIGhhdmUgbXVsdGlwbGVcbiAqIGRpcmVjdGl2ZXMgc3Vic2NyaWJpbmcgdG8gaXQuXG4gKi9cbnZhciBEZXAgPSBmdW5jdGlvbiBEZXAgKCkge1xuICB0aGlzLmlkID0gdWlkKys7XG4gIHRoaXMuc3VicyA9IFtdO1xufTtcblxuRGVwLnByb3RvdHlwZS5hZGRTdWIgPSBmdW5jdGlvbiBhZGRTdWIgKHN1Yikge1xuICB0aGlzLnN1YnMucHVzaChzdWIpO1xufTtcblxuRGVwLnByb3RvdHlwZS5yZW1vdmVTdWIgPSBmdW5jdGlvbiByZW1vdmVTdWIgKHN1Yikge1xuICByZW1vdmUodGhpcy5zdWJzLCBzdWIpO1xufTtcblxuRGVwLnByb3RvdHlwZS5kZXBlbmQgPSBmdW5jdGlvbiBkZXBlbmQgKCkge1xuICBpZiAoRGVwLnRhcmdldCkge1xuICAgIERlcC50YXJnZXQuYWRkRGVwKHRoaXMpO1xuICB9XG59O1xuXG5EZXAucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uIG5vdGlmeSAoKSB7XG4gIC8vIHN0YWJpbGl6ZSB0aGUgc3Vic2NyaWJlciBsaXN0IGZpcnN0XG4gIHZhciBzdWJzID0gdGhpcy5zdWJzLnNsaWNlKCk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFjb25maWcuYXN5bmMpIHtcbiAgICAvLyBzdWJzIGFyZW4ndCBzb3J0ZWQgaW4gc2NoZWR1bGVyIGlmIG5vdCBydW5uaW5nIGFzeW5jXG4gICAgLy8gd2UgbmVlZCB0byBzb3J0IHRoZW0gbm93IHRvIG1ha2Ugc3VyZSB0aGV5IGZpcmUgaW4gY29ycmVjdFxuICAgIC8vIG9yZGVyXG4gICAgc3Vicy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmlkIC0gYi5pZDsgfSk7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzdWJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHN1YnNbaV0udXBkYXRlKCk7XG4gIH1cbn07XG5cbi8vIFRoZSBjdXJyZW50IHRhcmdldCB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZC5cbi8vIFRoaXMgaXMgZ2xvYmFsbHkgdW5pcXVlIGJlY2F1c2Ugb25seSBvbmUgd2F0Y2hlclxuLy8gY2FuIGJlIGV2YWx1YXRlZCBhdCBhIHRpbWUuXG5EZXAudGFyZ2V0ID0gbnVsbDtcbnZhciB0YXJnZXRTdGFjayA9IFtdO1xuXG5mdW5jdGlvbiBwdXNoVGFyZ2V0ICh0YXJnZXQpIHtcbiAgdGFyZ2V0U3RhY2sucHVzaCh0YXJnZXQpO1xuICBEZXAudGFyZ2V0ID0gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBwb3BUYXJnZXQgKCkge1xuICB0YXJnZXRTdGFjay5wb3AoKTtcbiAgRGVwLnRhcmdldCA9IHRhcmdldFN0YWNrW3RhcmdldFN0YWNrLmxlbmd0aCAtIDFdO1xufVxuXG4vKiAgKi9cblxudmFyIFZOb2RlID0gZnVuY3Rpb24gVk5vZGUgKFxuICB0YWcsXG4gIGRhdGEsXG4gIGNoaWxkcmVuLFxuICB0ZXh0LFxuICBlbG0sXG4gIGNvbnRleHQsXG4gIGNvbXBvbmVudE9wdGlvbnMsXG4gIGFzeW5jRmFjdG9yeVxuKSB7XG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmRhdGEgPSBkYXRhO1xuICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIHRoaXMudGV4dCA9IHRleHQ7XG4gIHRoaXMuZWxtID0gZWxtO1xuICB0aGlzLm5zID0gdW5kZWZpbmVkO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLmZuQ29udGV4dCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5mbk9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gIHRoaXMuZm5TY29wZUlkID0gdW5kZWZpbmVkO1xuICB0aGlzLmtleSA9IGRhdGEgJiYgZGF0YS5rZXk7XG4gIHRoaXMuY29tcG9uZW50T3B0aW9ucyA9IGNvbXBvbmVudE9wdGlvbnM7XG4gIHRoaXMuY29tcG9uZW50SW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkO1xuICB0aGlzLnJhdyA9IGZhbHNlO1xuICB0aGlzLmlzU3RhdGljID0gZmFsc2U7XG4gIHRoaXMuaXNSb290SW5zZXJ0ID0gdHJ1ZTtcbiAgdGhpcy5pc0NvbW1lbnQgPSBmYWxzZTtcbiAgdGhpcy5pc0Nsb25lZCA9IGZhbHNlO1xuICB0aGlzLmlzT25jZSA9IGZhbHNlO1xuICB0aGlzLmFzeW5jRmFjdG9yeSA9IGFzeW5jRmFjdG9yeTtcbiAgdGhpcy5hc3luY01ldGEgPSB1bmRlZmluZWQ7XG4gIHRoaXMuaXNBc3luY1BsYWNlaG9sZGVyID0gZmFsc2U7XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBjaGlsZDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4vLyBERVBSRUNBVEVEOiBhbGlhcyBmb3IgY29tcG9uZW50SW5zdGFuY2UgZm9yIGJhY2t3YXJkcyBjb21wYXQuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2Vcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWTm9kZS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG52YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIGlmICggdGV4dCA9PT0gdm9pZCAwICkgdGV4dCA9ICcnO1xuXG4gIHZhciBub2RlID0gbmV3IFZOb2RlKCk7XG4gIG5vZGUudGV4dCA9IHRleHQ7XG4gIG5vZGUuaXNDb21tZW50ID0gdHJ1ZTtcbiAgcmV0dXJuIG5vZGVcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7XG4gIHJldHVybiBuZXcgVk5vZGUodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgU3RyaW5nKHZhbCkpXG59XG5cbi8vIG9wdGltaXplZCBzaGFsbG93IGNsb25lXG4vLyB1c2VkIGZvciBzdGF0aWMgbm9kZXMgYW5kIHNsb3Qgbm9kZXMgYmVjYXVzZSB0aGV5IG1heSBiZSByZXVzZWQgYWNyb3NzXG4vLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHlcbi8vIG9uIHRoZWlyIGVsbSByZWZlcmVuY2UuXG5mdW5jdGlvbiBjbG9uZVZOb2RlICh2bm9kZSkge1xuICB2YXIgY2xvbmVkID0gbmV3IFZOb2RlKFxuICAgIHZub2RlLnRhZyxcbiAgICB2bm9kZS5kYXRhLFxuICAgIC8vICM3OTc1XG4gICAgLy8gY2xvbmUgY2hpbGRyZW4gYXJyYXkgdG8gYXZvaWQgbXV0YXRpbmcgb3JpZ2luYWwgaW4gY2FzZSBvZiBjbG9uaW5nXG4gICAgLy8gYSBjaGlsZC5cbiAgICB2bm9kZS5jaGlsZHJlbiAmJiB2bm9kZS5jaGlsZHJlbi5zbGljZSgpLFxuICAgIHZub2RlLnRleHQsXG4gICAgdm5vZGUuZWxtLFxuICAgIHZub2RlLmNvbnRleHQsXG4gICAgdm5vZGUuY29tcG9uZW50T3B0aW9ucyxcbiAgICB2bm9kZS5hc3luY0ZhY3RvcnlcbiAgKTtcbiAgY2xvbmVkLm5zID0gdm5vZGUubnM7XG4gIGNsb25lZC5pc1N0YXRpYyA9IHZub2RlLmlzU3RhdGljO1xuICBjbG9uZWQua2V5ID0gdm5vZGUua2V5O1xuICBjbG9uZWQuaXNDb21tZW50ID0gdm5vZGUuaXNDb21tZW50O1xuICBjbG9uZWQuZm5Db250ZXh0ID0gdm5vZGUuZm5Db250ZXh0O1xuICBjbG9uZWQuZm5PcHRpb25zID0gdm5vZGUuZm5PcHRpb25zO1xuICBjbG9uZWQuZm5TY29wZUlkID0gdm5vZGUuZm5TY29wZUlkO1xuICBjbG9uZWQuYXN5bmNNZXRhID0gdm5vZGUuYXN5bmNNZXRhO1xuICBjbG9uZWQuaXNDbG9uZWQgPSB0cnVlO1xuICByZXR1cm4gY2xvbmVkXG59XG5cbi8qXG4gKiBub3QgdHlwZSBjaGVja2luZyB0aGlzIGZpbGUgYmVjYXVzZSBmbG93IGRvZXNuJ3QgcGxheSB3ZWxsIHdpdGhcbiAqIGR5bmFtaWNhbGx5IGFjY2Vzc2luZyBtZXRob2RzIG9uIEFycmF5IHByb3RvdHlwZVxuICovXG5cbnZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xudmFyIGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90byk7XG5cbnZhciBtZXRob2RzVG9QYXRjaCA9IFtcbiAgJ3B1c2gnLFxuICAncG9wJyxcbiAgJ3NoaWZ0JyxcbiAgJ3Vuc2hpZnQnLFxuICAnc3BsaWNlJyxcbiAgJ3NvcnQnLFxuICAncmV2ZXJzZSdcbl07XG5cbi8qKlxuICogSW50ZXJjZXB0IG11dGF0aW5nIG1ldGhvZHMgYW5kIGVtaXQgZXZlbnRzXG4gKi9cbm1ldGhvZHNUb1BhdGNoLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAvLyBjYWNoZSBvcmlnaW5hbCBtZXRob2RcbiAgdmFyIG9yaWdpbmFsID0gYXJyYXlQcm90b1ttZXRob2RdO1xuICBkZWYoYXJyYXlNZXRob2RzLCBtZXRob2QsIGZ1bmN0aW9uIG11dGF0b3IgKCkge1xuICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgIHZhciByZXN1bHQgPSBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB2YXIgb2IgPSB0aGlzLl9fb2JfXztcbiAgICB2YXIgaW5zZXJ0ZWQ7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3B1c2gnOlxuICAgICAgY2FzZSAndW5zaGlmdCc6XG4gICAgICAgIGluc2VydGVkID0gYXJncztcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3NwbGljZSc6XG4gICAgICAgIGluc2VydGVkID0gYXJncy5zbGljZSgyKTtcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gICAgaWYgKGluc2VydGVkKSB7IG9iLm9ic2VydmVBcnJheShpbnNlcnRlZCk7IH1cbiAgICAvLyBub3RpZnkgY2hhbmdlXG4gICAgb2IuZGVwLm5vdGlmeSgpO1xuICAgIHJldHVybiByZXN1bHRcbiAgfSk7XG59KTtcblxuLyogICovXG5cbnZhciBhcnJheUtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhcnJheU1ldGhvZHMpO1xuXG4vKipcbiAqIEluIHNvbWUgY2FzZXMgd2UgbWF5IHdhbnQgdG8gZGlzYWJsZSBvYnNlcnZhdGlvbiBpbnNpZGUgYSBjb21wb25lbnQnc1xuICogdXBkYXRlIGNvbXB1dGF0aW9uLlxuICovXG52YXIgc2hvdWxkT2JzZXJ2ZSA9IHRydWU7XG5cbmZ1bmN0aW9uIHRvZ2dsZU9ic2VydmluZyAodmFsdWUpIHtcbiAgc2hvdWxkT2JzZXJ2ZSA9IHZhbHVlO1xufVxuXG4vKipcbiAqIE9ic2VydmVyIGNsYXNzIHRoYXQgaXMgYXR0YWNoZWQgdG8gZWFjaCBvYnNlcnZlZFxuICogb2JqZWN0LiBPbmNlIGF0dGFjaGVkLCB0aGUgb2JzZXJ2ZXIgY29udmVydHMgdGhlIHRhcmdldFxuICogb2JqZWN0J3MgcHJvcGVydHkga2V5cyBpbnRvIGdldHRlci9zZXR0ZXJzIHRoYXRcbiAqIGNvbGxlY3QgZGVwZW5kZW5jaWVzIGFuZCBkaXNwYXRjaCB1cGRhdGVzLlxuICovXG52YXIgT2JzZXJ2ZXIgPSBmdW5jdGlvbiBPYnNlcnZlciAodmFsdWUpIHtcbiAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB0aGlzLmRlcCA9IG5ldyBEZXAoKTtcbiAgdGhpcy52bUNvdW50ID0gMDtcbiAgZGVmKHZhbHVlLCAnX19vYl9fJywgdGhpcyk7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmIChoYXNQcm90bykge1xuICAgICAgcHJvdG9BdWdtZW50KHZhbHVlLCBhcnJheU1ldGhvZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3B5QXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpO1xuICAgIH1cbiAgICB0aGlzLm9ic2VydmVBcnJheSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy53YWxrKHZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBXYWxrIHRocm91Z2ggYWxsIHByb3BlcnRpZXMgYW5kIGNvbnZlcnQgdGhlbSBpbnRvXG4gKiBnZXR0ZXIvc2V0dGVycy4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW5cbiAqIHZhbHVlIHR5cGUgaXMgT2JqZWN0LlxuICovXG5PYnNlcnZlci5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIHdhbGsgKG9iaikge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKG9iaiwga2V5c1tpXSk7XG4gIH1cbn07XG5cbi8qKlxuICogT2JzZXJ2ZSBhIGxpc3Qgb2YgQXJyYXkgaXRlbXMuXG4gKi9cbk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgb2JzZXJ2ZShpdGVtc1tpXSk7XG4gIH1cbn07XG5cbi8vIGhlbHBlcnNcblxuLyoqXG4gKiBBdWdtZW50IGEgdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBpbnRlcmNlcHRpbmdcbiAqIHRoZSBwcm90b3R5cGUgY2hhaW4gdXNpbmcgX19wcm90b19fXG4gKi9cbmZ1bmN0aW9uIHByb3RvQXVnbWVudCAodGFyZ2V0LCBzcmMpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbiAgdGFyZ2V0Ll9fcHJvdG9fXyA9IHNyYztcbiAgLyogZXNsaW50LWVuYWJsZSBuby1wcm90byAqL1xufVxuXG4vKipcbiAqIEF1Z21lbnQgYSB0YXJnZXQgT2JqZWN0IG9yIEFycmF5IGJ5IGRlZmluaW5nXG4gKiBoaWRkZW4gcHJvcGVydGllcy5cbiAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGNvcHlBdWdtZW50ICh0YXJnZXQsIHNyYywga2V5cykge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgZGVmKHRhcmdldCwga2V5LCBzcmNba2V5XSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIGNyZWF0ZSBhbiBvYnNlcnZlciBpbnN0YW5jZSBmb3IgYSB2YWx1ZSxcbiAqIHJldHVybnMgdGhlIG5ldyBvYnNlcnZlciBpZiBzdWNjZXNzZnVsbHkgb2JzZXJ2ZWQsXG4gKiBvciB0aGUgZXhpc3Rpbmcgb2JzZXJ2ZXIgaWYgdGhlIHZhbHVlIGFscmVhZHkgaGFzIG9uZS5cbiAqL1xuZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIGFzUm9vdERhdGEpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBWTm9kZSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvYjtcbiAgaWYgKGhhc093bih2YWx1ZSwgJ19fb2JfXycpICYmIHZhbHVlLl9fb2JfXyBpbnN0YW5jZW9mIE9ic2VydmVyKSB7XG4gICAgb2IgPSB2YWx1ZS5fX29iX187XG4gIH0gZWxzZSBpZiAoXG4gICAgc2hvdWxkT2JzZXJ2ZSAmJlxuICAgICFpc1NlcnZlclJlbmRlcmluZygpICYmXG4gICAgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGlzUGxhaW5PYmplY3QodmFsdWUpKSAmJlxuICAgIE9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpICYmXG4gICAgIXZhbHVlLl9pc1Z1ZVxuICApIHtcbiAgICBvYiA9IG5ldyBPYnNlcnZlcih2YWx1ZSk7XG4gIH1cbiAgaWYgKGFzUm9vdERhdGEgJiYgb2IpIHtcbiAgICBvYi52bUNvdW50Kys7XG4gIH1cbiAgcmV0dXJuIG9iXG59XG5cbi8qKlxuICogRGVmaW5lIGEgcmVhY3RpdmUgcHJvcGVydHkgb24gYW4gT2JqZWN0LlxuICovXG5mdW5jdGlvbiBkZWZpbmVSZWFjdGl2ZSQkMSAoXG4gIG9iaixcbiAga2V5LFxuICB2YWwsXG4gIGN1c3RvbVNldHRlcixcbiAgc2hhbGxvd1xuKSB7XG4gIHZhciBkZXAgPSBuZXcgRGVwKCk7XG5cbiAgdmFyIHByb3BlcnR5ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSk7XG4gIGlmIChwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5jb25maWd1cmFibGUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBjYXRlciBmb3IgcHJlLWRlZmluZWQgZ2V0dGVyL3NldHRlcnNcbiAgdmFyIGdldHRlciA9IHByb3BlcnR5ICYmIHByb3BlcnR5LmdldDtcbiAgdmFyIHNldHRlciA9IHByb3BlcnR5ICYmIHByb3BlcnR5LnNldDtcbiAgaWYgKCghZ2V0dGVyIHx8IHNldHRlcikgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIHZhbCA9IG9ialtrZXldO1xuICB9XG5cbiAgdmFyIGNoaWxkT2IgPSAhc2hhbGxvdyAmJiBvYnNlcnZlKHZhbCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gcmVhY3RpdmVHZXR0ZXIgKCkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDtcbiAgICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICAgIGRlcC5kZXBlbmQoKTtcbiAgICAgICAgaWYgKGNoaWxkT2IpIHtcbiAgICAgICAgICBjaGlsZE9iLmRlcC5kZXBlbmQoKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXR0ZXIgPyBnZXR0ZXIuY2FsbChvYmopIDogdmFsO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlICovXG4gICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjdXN0b21TZXR0ZXIpIHtcbiAgICAgICAgY3VzdG9tU2V0dGVyKCk7XG4gICAgICB9XG4gICAgICAvLyAjNzk4MTogZm9yIGFjY2Vzc29yIHByb3BlcnRpZXMgd2l0aG91dCBzZXR0ZXJcbiAgICAgIGlmIChnZXR0ZXIgJiYgIXNldHRlcikgeyByZXR1cm4gfVxuICAgICAgaWYgKHNldHRlcikge1xuICAgICAgICBzZXR0ZXIuY2FsbChvYmosIG5ld1ZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBuZXdWYWw7XG4gICAgICB9XG4gICAgICBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZShuZXdWYWwpO1xuICAgICAgZGVwLm5vdGlmeSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kXG4gKiB0cmlnZ2VycyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0XG4gKiBhbHJlYWR5IGV4aXN0LlxuICovXG5mdW5jdGlvbiBzZXQgKHRhcmdldCwga2V5LCB2YWwpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAoaXNVbmRlZih0YXJnZXQpIHx8IGlzUHJpbWl0aXZlKHRhcmdldCkpXG4gICkge1xuICAgIHdhcm4oKFwiQ2Fubm90IHNldCByZWFjdGl2ZSBwcm9wZXJ0eSBvbiB1bmRlZmluZWQsIG51bGwsIG9yIHByaW1pdGl2ZSB2YWx1ZTogXCIgKyAoKHRhcmdldCkpKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBpc1ZhbGlkQXJyYXlJbmRleChrZXkpKSB7XG4gICAgdGFyZ2V0Lmxlbmd0aCA9IE1hdGgubWF4KHRhcmdldC5sZW5ndGgsIGtleSk7XG4gICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGlmIChrZXkgaW4gdGFyZ2V0ICYmICEoa2V5IGluIE9iamVjdC5wcm90b3R5cGUpKSB7XG4gICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIHZhciBvYiA9ICh0YXJnZXQpLl9fb2JfXztcbiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgJ0F2b2lkIGFkZGluZyByZWFjdGl2ZSBwcm9wZXJ0aWVzIHRvIGEgVnVlIGluc3RhbmNlIG9yIGl0cyByb290ICRkYXRhICcgK1xuICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLidcbiAgICApO1xuICAgIHJldHVybiB2YWxcbiAgfVxuICBpZiAoIW9iKSB7XG4gICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGRlZmluZVJlYWN0aXZlJCQxKG9iLnZhbHVlLCBrZXksIHZhbCk7XG4gIG9iLmRlcC5ub3RpZnkoKTtcbiAgcmV0dXJuIHZhbFxufVxuXG4vKipcbiAqIERlbGV0ZSBhIHByb3BlcnR5IGFuZCB0cmlnZ2VyIGNoYW5nZSBpZiBuZWNlc3NhcnkuXG4gKi9cbmZ1bmN0aW9uIGRlbCAodGFyZ2V0LCBrZXkpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAoaXNVbmRlZih0YXJnZXQpIHx8IGlzUHJpbWl0aXZlKHRhcmdldCkpXG4gICkge1xuICAgIHdhcm4oKFwiQ2Fubm90IGRlbGV0ZSByZWFjdGl2ZSBwcm9wZXJ0eSBvbiB1bmRlZmluZWQsIG51bGwsIG9yIHByaW1pdGl2ZSB2YWx1ZTogXCIgKyAoKHRhcmdldCkpKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBpc1ZhbGlkQXJyYXlJbmRleChrZXkpKSB7XG4gICAgdGFyZ2V0LnNwbGljZShrZXksIDEpO1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvYiA9ICh0YXJnZXQpLl9fb2JfXztcbiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArXG4gICAgICAnLSBqdXN0IHNldCBpdCB0byBudWxsLidcbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIGlmICghaGFzT3duKHRhcmdldCwga2V5KSkge1xuICAgIHJldHVyblxuICB9XG4gIGRlbGV0ZSB0YXJnZXRba2V5XTtcbiAgaWYgKCFvYikge1xuICAgIHJldHVyblxuICB9XG4gIG9iLmRlcC5ub3RpZnkoKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGRlcGVuZGVuY2llcyBvbiBhcnJheSBlbGVtZW50cyB3aGVuIHRoZSBhcnJheSBpcyB0b3VjaGVkLCBzaW5jZVxuICogd2UgY2Fubm90IGludGVyY2VwdCBhcnJheSBlbGVtZW50IGFjY2VzcyBsaWtlIHByb3BlcnR5IGdldHRlcnMuXG4gKi9cbmZ1bmN0aW9uIGRlcGVuZEFycmF5ICh2YWx1ZSkge1xuICBmb3IgKHZhciBlID0gKHZvaWQgMCksIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZSA9IHZhbHVlW2ldO1xuICAgIGUgJiYgZS5fX29iX18gJiYgZS5fX29iX18uZGVwLmRlcGVuZCgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICBkZXBlbmRBcnJheShlKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogT3B0aW9uIG92ZXJ3cml0aW5nIHN0cmF0ZWdpZXMgYXJlIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZVxuICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb25cbiAqIHZhbHVlIGludG8gdGhlIGZpbmFsIHZhbHVlLlxuICovXG52YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztcblxuLyoqXG4gKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zXG4gKi9cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHN0cmF0cy5lbCA9IHN0cmF0cy5wcm9wc0RhdGEgPSBmdW5jdGlvbiAocGFyZW50LCBjaGlsZCwgdm0sIGtleSkge1xuICAgIGlmICghdm0pIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwib3B0aW9uIFxcXCJcIiArIGtleSArIFwiXFxcIiBjYW4gb25seSBiZSB1c2VkIGR1cmluZyBpbnN0YW5jZSBcIiArXG4gICAgICAgICdjcmVhdGlvbiB3aXRoIHRoZSBgbmV3YCBrZXl3b3JkLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0U3RyYXQocGFyZW50LCBjaGlsZClcbiAgfTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VEYXRhICh0bywgZnJvbSkge1xuICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH1cbiAgdmFyIGtleSwgdG9WYWwsIGZyb21WYWw7XG5cbiAgdmFyIGtleXMgPSBoYXNTeW1ib2xcbiAgICA/IFJlZmxlY3Qub3duS2V5cyhmcm9tKVxuICAgIDogT2JqZWN0LmtleXMoZnJvbSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICAvLyBpbiBjYXNlIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBvYnNlcnZlZC4uLlxuICAgIGlmIChrZXkgPT09ICdfX29iX18nKSB7IGNvbnRpbnVlIH1cbiAgICB0b1ZhbCA9IHRvW2tleV07XG4gICAgZnJvbVZhbCA9IGZyb21ba2V5XTtcbiAgICBpZiAoIWhhc093bih0bywga2V5KSkge1xuICAgICAgc2V0KHRvLCBrZXksIGZyb21WYWwpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0b1ZhbCAhPT0gZnJvbVZhbCAmJlxuICAgICAgaXNQbGFpbk9iamVjdCh0b1ZhbCkgJiZcbiAgICAgIGlzUGxhaW5PYmplY3QoZnJvbVZhbClcbiAgICApIHtcbiAgICAgIG1lcmdlRGF0YSh0b1ZhbCwgZnJvbVZhbCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0b1xufVxuXG4vKipcbiAqIERhdGFcbiAqL1xuZnVuY3Rpb24gbWVyZ2VEYXRhT3JGbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtXG4pIHtcbiAgaWYgKCF2bSkge1xuICAgIC8vIGluIGEgVnVlLmV4dGVuZCBtZXJnZSwgYm90aCBzaG91bGQgYmUgZnVuY3Rpb25zXG4gICAgaWYgKCFjaGlsZFZhbCkge1xuICAgICAgcmV0dXJuIHBhcmVudFZhbFxuICAgIH1cbiAgICBpZiAoIXBhcmVudFZhbCkge1xuICAgICAgcmV0dXJuIGNoaWxkVmFsXG4gICAgfVxuICAgIC8vIHdoZW4gcGFyZW50VmFsICYgY2hpbGRWYWwgYXJlIGJvdGggcHJlc2VudCxcbiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGVcbiAgICAvLyBtZXJnZWQgcmVzdWx0IG9mIGJvdGggZnVuY3Rpb25zLi4uIG5vIG5lZWQgdG9cbiAgICAvLyBjaGVjayBpZiBwYXJlbnRWYWwgaXMgYSBmdW5jdGlvbiBoZXJlIGJlY2F1c2VcbiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy5cbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkRGF0YUZuICgpIHtcbiAgICAgIHJldHVybiBtZXJnZURhdGEoXG4gICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcywgdGhpcykgOiBjaGlsZFZhbCxcbiAgICAgICAgdHlwZW9mIHBhcmVudFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IHBhcmVudFZhbC5jYWxsKHRoaXMsIHRoaXMpIDogcGFyZW50VmFsXG4gICAgICApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWRJbnN0YW5jZURhdGFGbiAoKSB7XG4gICAgICAvLyBpbnN0YW5jZSBtZXJnZVxuICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IGNoaWxkVmFsLmNhbGwodm0sIHZtKVxuICAgICAgICA6IGNoaWxkVmFsO1xuICAgICAgdmFyIGRlZmF1bHREYXRhID0gdHlwZW9mIHBhcmVudFZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHBhcmVudFZhbC5jYWxsKHZtLCB2bSlcbiAgICAgICAgOiBwYXJlbnRWYWw7XG4gICAgICBpZiAoaW5zdGFuY2VEYXRhKSB7XG4gICAgICAgIHJldHVybiBtZXJnZURhdGEoaW5zdGFuY2VEYXRhLCBkZWZhdWx0RGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0RGF0YVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5zdHJhdHMuZGF0YSA9IGZ1bmN0aW9uIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm1cbikge1xuICBpZiAoIXZtKSB7XG4gICAgaWYgKGNoaWxkVmFsICYmIHR5cGVvZiBjaGlsZFZhbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAnVGhlIFwiZGF0YVwiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiAnICtcbiAgICAgICAgJ3RoYXQgcmV0dXJucyBhIHBlci1pbnN0YW5jZSB2YWx1ZSBpbiBjb21wb25lbnQgJyArXG4gICAgICAgICdkZWZpbml0aW9ucy4nLFxuICAgICAgICB2bVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHBhcmVudFZhbFxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VEYXRhT3JGbihwYXJlbnRWYWwsIGNoaWxkVmFsKVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCwgdm0pXG59O1xuXG4vKipcbiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VIb29rIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbFxuKSB7XG4gIHZhciByZXMgPSBjaGlsZFZhbFxuICAgID8gcGFyZW50VmFsXG4gICAgICA/IHBhcmVudFZhbC5jb25jYXQoY2hpbGRWYWwpXG4gICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpXG4gICAgICAgID8gY2hpbGRWYWxcbiAgICAgICAgOiBbY2hpbGRWYWxdXG4gICAgOiBwYXJlbnRWYWw7XG4gIHJldHVybiByZXNcbiAgICA/IGRlZHVwZUhvb2tzKHJlcylcbiAgICA6IHJlc1xufVxuXG5mdW5jdGlvbiBkZWR1cGVIb29rcyAoaG9va3MpIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlcy5pbmRleE9mKGhvb2tzW2ldKSA9PT0gLTEpIHtcbiAgICAgIHJlcy5wdXNoKGhvb2tzW2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5MSUZFQ1lDTEVfSE9PS1MuZm9yRWFjaChmdW5jdGlvbiAoaG9vaykge1xuICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7XG59KTtcblxuLyoqXG4gKiBBc3NldHNcbiAqXG4gKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvXG4gKiBhIHRocmVlLXdheSBtZXJnZSBiZXR3ZWVuIGNvbnN0cnVjdG9yIG9wdGlvbnMsIGluc3RhbmNlXG4gKiBvcHRpb25zIGFuZCBwYXJlbnQgb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VBc3NldHMgKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsLFxuICB2bSxcbiAga2V5XG4pIHtcbiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUocGFyZW50VmFsIHx8IG51bGwpO1xuICBpZiAoY2hpbGRWYWwpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICAgIHJldHVybiBleHRlbmQocmVzLCBjaGlsZFZhbClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cbn1cblxuQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0cztcbn0pO1xuXG4vKipcbiAqIFdhdGNoZXJzLlxuICpcbiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmVcbiAqIGFub3RoZXIsIHNvIHdlIG1lcmdlIHRoZW0gYXMgYXJyYXlzLlxuICovXG5zdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtLFxuICBrZXlcbikge1xuICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLlxuICBpZiAocGFyZW50VmFsID09PSBuYXRpdmVXYXRjaCkgeyBwYXJlbnRWYWwgPSB1bmRlZmluZWQ7IH1cbiAgaWYgKGNoaWxkVmFsID09PSBuYXRpdmVXYXRjaCkgeyBjaGlsZFZhbCA9IHVuZGVmaW5lZDsgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCFjaGlsZFZhbCkgeyByZXR1cm4gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCkgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICB9XG4gIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9XG4gIHZhciByZXQgPSB7fTtcbiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTtcbiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHtcbiAgICB2YXIgcGFyZW50ID0gcmV0W2tleSQxXTtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZFZhbFtrZXkkMV07XG4gICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7XG4gICAgICBwYXJlbnQgPSBbcGFyZW50XTtcbiAgICB9XG4gICAgcmV0W2tleSQxXSA9IHBhcmVudFxuICAgICAgPyBwYXJlbnQuY29uY2F0KGNoaWxkKVxuICAgICAgOiBBcnJheS5pc0FycmF5KGNoaWxkKSA/IGNoaWxkIDogW2NoaWxkXTtcbiAgfVxuICByZXR1cm4gcmV0XG59O1xuXG4vKipcbiAqIE90aGVyIG9iamVjdCBoYXNoZXMuXG4gKi9cbnN0cmF0cy5wcm9wcyA9XG5zdHJhdHMubWV0aG9kcyA9XG5zdHJhdHMuaW5qZWN0ID1cbnN0cmF0cy5jb21wdXRlZCA9IGZ1bmN0aW9uIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm0sXG4gIGtleVxuKSB7XG4gIGlmIChjaGlsZFZhbCAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7XG4gIH1cbiAgaWYgKCFwYXJlbnRWYWwpIHsgcmV0dXJuIGNoaWxkVmFsIH1cbiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7XG4gIGlmIChjaGlsZFZhbCkgeyBleHRlbmQocmV0LCBjaGlsZFZhbCk7IH1cbiAgcmV0dXJuIHJldFxufTtcbnN0cmF0cy5wcm92aWRlID0gbWVyZ2VEYXRhT3JGbjtcblxuLyoqXG4gKiBEZWZhdWx0IHN0cmF0ZWd5LlxuICovXG52YXIgZGVmYXVsdFN0cmF0ID0gZnVuY3Rpb24gKHBhcmVudFZhbCwgY2hpbGRWYWwpIHtcbiAgcmV0dXJuIGNoaWxkVmFsID09PSB1bmRlZmluZWRcbiAgICA/IHBhcmVudFZhbFxuICAgIDogY2hpbGRWYWxcbn07XG5cbi8qKlxuICogVmFsaWRhdGUgY29tcG9uZW50IG5hbWVzXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQ29tcG9uZW50cyAob3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5jb21wb25lbnRzKSB7XG4gICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb21wb25lbnROYW1lIChuYW1lKSB7XG4gIGlmICghbmV3IFJlZ0V4cCgoXCJeW2EtekEtWl1bXFxcXC1cXFxcLjAtOV9cIiArICh1bmljb2RlUmVnRXhwLnNvdXJjZSkgKyBcIl0qJFwiKSkudGVzdChuYW1lKSkge1xuICAgIHdhcm4oXG4gICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogXCInICsgbmFtZSArICdcIi4gQ29tcG9uZW50IG5hbWVzICcgK1xuICAgICAgJ3Nob3VsZCBjb25mb3JtIHRvIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUgaW4gaHRtbDUgc3BlY2lmaWNhdGlvbi4nXG4gICAgKTtcbiAgfVxuICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7XG4gICAgd2FybihcbiAgICAgICdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50ICcgK1xuICAgICAgJ2lkOiAnICsgbmFtZVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGVcbiAqIE9iamVjdC1iYXNlZCBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkge1xuICB2YXIgcHJvcHMgPSBvcHRpb25zLnByb3BzO1xuICBpZiAoIXByb3BzKSB7IHJldHVybiB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGksIHZhbCwgbmFtZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMpKSB7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2YWwgPSBwcm9wc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYW1lID0gY2FtZWxpemUodmFsKTtcbiAgICAgICAgcmVzW25hbWVdID0geyB0eXBlOiBudWxsIH07XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybigncHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LicpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHByb3BzKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFsID0gcHJvcHNba2V5XTtcbiAgICAgIG5hbWUgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpXG4gICAgICAgID8gdmFsXG4gICAgICAgIDogeyB0eXBlOiB2YWwgfTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwicHJvcHNcXFwiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsIFwiICtcbiAgICAgIFwiYnV0IGdvdCBcIiArICh0b1Jhd1R5cGUocHJvcHMpKSArIFwiLlwiLFxuICAgICAgdm1cbiAgICApO1xuICB9XG4gIG9wdGlvbnMucHJvcHMgPSByZXM7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFsbCBpbmplY3Rpb25zIGludG8gT2JqZWN0LWJhc2VkIGZvcm1hdFxuICovXG5mdW5jdGlvbiBub3JtYWxpemVJbmplY3QgKG9wdGlvbnMsIHZtKSB7XG4gIHZhciBpbmplY3QgPSBvcHRpb25zLmluamVjdDtcbiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH1cbiAgdmFyIG5vcm1hbGl6ZWQgPSBvcHRpb25zLmluamVjdCA9IHt9O1xuICBpZiAoQXJyYXkuaXNBcnJheShpbmplY3QpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vcm1hbGl6ZWRbaW5qZWN0W2ldXSA9IHsgZnJvbTogaW5qZWN0W2ldIH07XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkge1xuICAgIGZvciAodmFyIGtleSBpbiBpbmplY3QpIHtcbiAgICAgIHZhciB2YWwgPSBpbmplY3Rba2V5XTtcbiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKVxuICAgICAgICA/IGV4dGVuZCh7IGZyb206IGtleSB9LCB2YWwpXG4gICAgICAgIDogeyBmcm9tOiB2YWwgfTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwiaW5qZWN0XFxcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCBcIiArXG4gICAgICBcImJ1dCBnb3QgXCIgKyAodG9SYXdUeXBlKGluamVjdCkpICsgXCIuXCIsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGZ1bmN0aW9uIGRpcmVjdGl2ZXMgaW50byBvYmplY3QgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7XG4gIHZhciBkaXJzID0gb3B0aW9ucy5kaXJlY3RpdmVzO1xuICBpZiAoZGlycykge1xuICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7XG4gICAgICB2YXIgZGVmJCQxID0gZGlyc1trZXldO1xuICAgICAgaWYgKHR5cGVvZiBkZWYkJDEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYkJDEsIHVwZGF0ZTogZGVmJCQxIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgd2FybihcbiAgICAgIFwiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFxcXCJcIiArIG5hbWUgKyBcIlxcXCI6IGV4cGVjdGVkIGFuIE9iamVjdCwgXCIgK1xuICAgICAgXCJidXQgZ290IFwiICsgKHRvUmF3VHlwZSh2YWx1ZSkpICsgXCIuXCIsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXJnZSB0d28gb3B0aW9uIG9iamVjdHMgaW50byBhIG5ldyBvbmUuXG4gKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLlxuICovXG5mdW5jdGlvbiBtZXJnZU9wdGlvbnMgKFxuICBwYXJlbnQsXG4gIGNoaWxkLFxuICB2bVxuKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjaGlsZCA9IGNoaWxkLm9wdGlvbnM7XG4gIH1cblxuICBub3JtYWxpemVQcm9wcyhjaGlsZCwgdm0pO1xuICBub3JtYWxpemVJbmplY3QoY2hpbGQsIHZtKTtcbiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7XG5cbiAgLy8gQXBwbHkgZXh0ZW5kcyBhbmQgbWl4aW5zIG9uIHRoZSBjaGlsZCBvcHRpb25zLFxuICAvLyBidXQgb25seSBpZiBpdCBpcyBhIHJhdyBvcHRpb25zIG9iamVjdCB0aGF0IGlzbid0XG4gIC8vIHRoZSByZXN1bHQgb2YgYW5vdGhlciBtZXJnZU9wdGlvbnMgY2FsbC5cbiAgLy8gT25seSBtZXJnZWQgb3B0aW9ucyBoYXMgdGhlIF9iYXNlIHByb3BlcnR5LlxuICBpZiAoIWNoaWxkLl9iYXNlKSB7XG4gICAgaWYgKGNoaWxkLmV4dGVuZHMpIHtcbiAgICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGNoaWxkLmV4dGVuZHMsIHZtKTtcbiAgICB9XG4gICAgaWYgKGNoaWxkLm1peGlucykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZC5taXhpbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGNoaWxkLm1peGluc1tpXSwgdm0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBvcHRpb25zID0ge307XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIHBhcmVudCkge1xuICAgIG1lcmdlRmllbGQoa2V5KTtcbiAgfVxuICBmb3IgKGtleSBpbiBjaGlsZCkge1xuICAgIGlmICghaGFzT3duKHBhcmVudCwga2V5KSkge1xuICAgICAgbWVyZ2VGaWVsZChrZXkpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBtZXJnZUZpZWxkIChrZXkpIHtcbiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7XG4gICAgb3B0aW9uc1trZXldID0gc3RyYXQocGFyZW50W2tleV0sIGNoaWxkW2tleV0sIHZtLCBrZXkpO1xuICB9XG4gIHJldHVybiBvcHRpb25zXG59XG5cbi8qKlxuICogUmVzb2x2ZSBhbiBhc3NldC5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBiZWNhdXNlIGNoaWxkIGluc3RhbmNlcyBuZWVkIGFjY2Vzc1xuICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQXNzZXQgKFxuICBvcHRpb25zLFxuICB0eXBlLFxuICBpZCxcbiAgd2Fybk1pc3Npbmdcbikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTtcbiAgLy8gY2hlY2sgbG9jYWwgcmVnaXN0cmF0aW9uIHZhcmlhdGlvbnMgZmlyc3RcbiAgaWYgKGhhc093bihhc3NldHMsIGlkKSkgeyByZXR1cm4gYXNzZXRzW2lkXSB9XG4gIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTtcbiAgaWYgKGhhc093bihhc3NldHMsIGNhbWVsaXplZElkKSkgeyByZXR1cm4gYXNzZXRzW2NhbWVsaXplZElkXSB9XG4gIHZhciBQYXNjYWxDYXNlSWQgPSBjYXBpdGFsaXplKGNhbWVsaXplZElkKTtcbiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH1cbiAgLy8gZmFsbGJhY2sgdG8gcHJvdG90eXBlIGNoYWluXG4gIHZhciByZXMgPSBhc3NldHNbaWRdIHx8IGFzc2V0c1tjYW1lbGl6ZWRJZF0gfHwgYXNzZXRzW1Bhc2NhbENhc2VJZF07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm5NaXNzaW5nICYmICFyZXMpIHtcbiAgICB3YXJuKFxuICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3AgKFxuICBrZXksXG4gIHByb3BPcHRpb25zLFxuICBwcm9wc0RhdGEsXG4gIHZtXG4pIHtcbiAgdmFyIHByb3AgPSBwcm9wT3B0aW9uc1trZXldO1xuICB2YXIgYWJzZW50ID0gIWhhc093bihwcm9wc0RhdGEsIGtleSk7XG4gIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldO1xuICAvLyBib29sZWFuIGNhc3RpbmdcbiAgdmFyIGJvb2xlYW5JbmRleCA9IGdldFR5cGVJbmRleChCb29sZWFuLCBwcm9wLnR5cGUpO1xuICBpZiAoYm9vbGVhbkluZGV4ID4gLTEpIHtcbiAgICBpZiAoYWJzZW50ICYmICFoYXNPd24ocHJvcCwgJ2RlZmF1bHQnKSkge1xuICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpIHtcbiAgICAgIC8vIG9ubHkgY2FzdCBlbXB0eSBzdHJpbmcgLyBzYW1lIG5hbWUgdG8gYm9vbGVhbiBpZlxuICAgICAgLy8gYm9vbGVhbiBoYXMgaGlnaGVyIHByaW9yaXR5XG4gICAgICB2YXIgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpO1xuICAgICAgaWYgKHN0cmluZ0luZGV4IDwgMCB8fCBib29sZWFuSW5kZXggPCBzdHJpbmdJbmRleCkge1xuICAgICAgICB2YWx1ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWVcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB2YWx1ZSA9IGdldFByb3BEZWZhdWx0VmFsdWUodm0sIHByb3AsIGtleSk7XG4gICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LFxuICAgIC8vIG1ha2Ugc3VyZSB0byBvYnNlcnZlIGl0LlxuICAgIHZhciBwcmV2U2hvdWxkT2JzZXJ2ZSA9IHNob3VsZE9ic2VydmU7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpO1xuICAgIG9ic2VydmUodmFsdWUpO1xuICAgIHRvZ2dsZU9ic2VydmluZyhwcmV2U2hvdWxkT2JzZXJ2ZSk7XG4gIH1cbiAgaWYgKFxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAvLyBza2lwIHZhbGlkYXRpb24gZm9yIHdlZXggcmVjeWNsZS1saXN0IGNoaWxkIGNvbXBvbmVudCBwcm9wc1xuICAgICEoZmFsc2UpXG4gICkge1xuICAgIGFzc2VydFByb3AocHJvcCwga2V5LCB2YWx1ZSwgdm0sIGFic2VudCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgcHJvcC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvcERlZmF1bHRWYWx1ZSAodm0sIHByb3AsIGtleSkge1xuICAvLyBubyBkZWZhdWx0LCByZXR1cm4gdW5kZWZpbmVkXG4gIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDtcbiAgLy8gd2FybiBhZ2FpbnN0IG5vbi1mYWN0b3J5IGRlZmF1bHRzIGZvciBPYmplY3QgJiBBcnJheVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7XG4gICAgd2FybihcbiAgICAgICdJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIHByb3AgXCInICsga2V5ICsgJ1wiOiAnICtcbiAgICAgICdQcm9wcyB3aXRoIHR5cGUgT2JqZWN0L0FycmF5IG11c3QgdXNlIGEgZmFjdG9yeSBmdW5jdGlvbiAnICtcbiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICAvLyB0aGUgcmF3IHByb3AgdmFsdWUgd2FzIGFsc28gdW5kZWZpbmVkIGZyb20gcHJldmlvdXMgcmVuZGVyLFxuICAvLyByZXR1cm4gcHJldmlvdXMgZGVmYXVsdCB2YWx1ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSB3YXRjaGVyIHRyaWdnZXJcbiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJlxuICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YVtrZXldID09PSB1bmRlZmluZWQgJiZcbiAgICB2bS5fcHJvcHNba2V5XSAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybiB2bS5fcHJvcHNba2V5XVxuICB9XG4gIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzXG4gIC8vIGEgdmFsdWUgaXMgRnVuY3Rpb24gaWYgaXRzIHByb3RvdHlwZSBpcyBmdW5jdGlvbiBldmVuIGFjcm9zcyBkaWZmZXJlbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgcmV0dXJuIHR5cGVvZiBkZWYgPT09ICdmdW5jdGlvbicgJiYgZ2V0VHlwZShwcm9wLnR5cGUpICE9PSAnRnVuY3Rpb24nXG4gICAgPyBkZWYuY2FsbCh2bSlcbiAgICA6IGRlZlxufVxuXG4vKipcbiAqIEFzc2VydCB3aGV0aGVyIGEgcHJvcCBpcyB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0UHJvcCAoXG4gIHByb3AsXG4gIG5hbWUsXG4gIHZhbHVlLFxuICB2bSxcbiAgYWJzZW50XG4pIHtcbiAgaWYgKHByb3AucmVxdWlyZWQgJiYgYWJzZW50KSB7XG4gICAgd2FybihcbiAgICAgICdNaXNzaW5nIHJlcXVpcmVkIHByb3A6IFwiJyArIG5hbWUgKyAnXCInLFxuICAgICAgdm1cbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsICYmICFwcm9wLnJlcXVpcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHR5cGUgPSBwcm9wLnR5cGU7XG4gIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7XG4gIHZhciBleHBlY3RlZFR5cGVzID0gW107XG4gIGlmICh0eXBlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICB0eXBlID0gW3R5cGVdO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7XG4gICAgICB2YXIgYXNzZXJ0ZWRUeXBlID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZVtpXSk7XG4gICAgICBleHBlY3RlZFR5cGVzLnB1c2goYXNzZXJ0ZWRUeXBlLmV4cGVjdGVkVHlwZSB8fCAnJyk7XG4gICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDtcbiAgICB9XG4gIH1cblxuICBpZiAoIXZhbGlkKSB7XG4gICAgd2FybihcbiAgICAgIGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcyksXG4gICAgICB2bVxuICAgICk7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHZhbGlkYXRvciA9IHByb3AudmFsaWRhdG9yO1xuICBpZiAodmFsaWRhdG9yKSB7XG4gICAgaWYgKCF2YWxpZGF0b3IodmFsdWUpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcIicgKyBuYW1lICsgJ1wiLicsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG52YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87XG5cbmZ1bmN0aW9uIGFzc2VydFR5cGUgKHZhbHVlLCB0eXBlKSB7XG4gIHZhciB2YWxpZDtcbiAgdmFyIGV4cGVjdGVkVHlwZSA9IGdldFR5cGUodHlwZSk7XG4gIGlmIChzaW1wbGVDaGVja1JFLnRlc3QoZXhwZWN0ZWRUeXBlKSkge1xuICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlO1xuICAgIHZhbGlkID0gdCA9PT0gZXhwZWN0ZWRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gZm9yIHByaW1pdGl2ZSB3cmFwcGVyIG9iamVjdHNcbiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0Jykge1xuICAgIHZhbGlkID0gaXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnQXJyYXknKSB7XG4gICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZhbGlkOiB2YWxpZCxcbiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZVxuICB9XG59XG5cbi8qKlxuICogVXNlIGZ1bmN0aW9uIHN0cmluZyBuYW1lIHRvIGNoZWNrIGJ1aWx0LWluIHR5cGVzLFxuICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nXG4gKiBhY3Jvc3MgZGlmZmVyZW50IHZtcyAvIGlmcmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7XG4gIHZhciBtYXRjaCA9IGZuICYmIGZuLnRvU3RyaW5nKCkubWF0Y2goL15cXHMqZnVuY3Rpb24gKFxcdyspLyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogJydcbn1cblxuZnVuY3Rpb24gaXNTYW1lVHlwZSAoYSwgYikge1xuICByZXR1cm4gZ2V0VHlwZShhKSA9PT0gZ2V0VHlwZShiKVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlSW5kZXggKHR5cGUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVHlwZXMpKSB7XG4gICAgcmV0dXJuIGlzU2FtZVR5cGUoZXhwZWN0ZWRUeXBlcywgdHlwZSkgPyAwIDogLTFcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChpc1NhbWVUeXBlKGV4cGVjdGVkVHlwZXNbaV0sIHR5cGUpKSB7XG4gICAgICByZXR1cm4gaVxuICAgIH1cbiAgfVxuICByZXR1cm4gLTFcbn1cblxuZnVuY3Rpb24gZ2V0SW52YWxpZFR5cGVNZXNzYWdlIChuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykge1xuICB2YXIgbWVzc2FnZSA9IFwiSW52YWxpZCBwcm9wOiB0eXBlIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcXFwiXCIgKyBuYW1lICsgXCJcXFwiLlwiICtcbiAgICBcIiBFeHBlY3RlZCBcIiArIChleHBlY3RlZFR5cGVzLm1hcChjYXBpdGFsaXplKS5qb2luKCcsICcpKTtcbiAgdmFyIGV4cGVjdGVkVHlwZSA9IGV4cGVjdGVkVHlwZXNbMF07XG4gIHZhciByZWNlaXZlZFR5cGUgPSB0b1Jhd1R5cGUodmFsdWUpO1xuICB2YXIgZXhwZWN0ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIGV4cGVjdGVkVHlwZSk7XG4gIHZhciByZWNlaXZlZFZhbHVlID0gc3R5bGVWYWx1ZSh2YWx1ZSwgcmVjZWl2ZWRUeXBlKTtcbiAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBzcGVjaWZ5IGV4cGVjdGVkIHZhbHVlXG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgaXNFeHBsaWNhYmxlKGV4cGVjdGVkVHlwZSkgJiZcbiAgICAgICFpc0Jvb2xlYW4oZXhwZWN0ZWRUeXBlLCByZWNlaXZlZFR5cGUpKSB7XG4gICAgbWVzc2FnZSArPSBcIiB3aXRoIHZhbHVlIFwiICsgZXhwZWN0ZWRWYWx1ZTtcbiAgfVxuICBtZXNzYWdlICs9IFwiLCBnb3QgXCIgKyByZWNlaXZlZFR5cGUgKyBcIiBcIjtcbiAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBzcGVjaWZ5IHJlY2VpdmVkIHZhbHVlXG4gIGlmIChpc0V4cGxpY2FibGUocmVjZWl2ZWRUeXBlKSkge1xuICAgIG1lc3NhZ2UgKz0gXCJ3aXRoIHZhbHVlIFwiICsgcmVjZWl2ZWRWYWx1ZSArIFwiLlwiO1xuICB9XG4gIHJldHVybiBtZXNzYWdlXG59XG5cbmZ1bmN0aW9uIHN0eWxlVmFsdWUgKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh0eXBlID09PSAnU3RyaW5nJykge1xuICAgIHJldHVybiAoXCJcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIlwiKVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdOdW1iZXInKSB7XG4gICAgcmV0dXJuIChcIlwiICsgKE51bWJlcih2YWx1ZSkpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiAoXCJcIiArIHZhbHVlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzRXhwbGljYWJsZSAodmFsdWUpIHtcbiAgdmFyIGV4cGxpY2l0VHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddO1xuICByZXR1cm4gZXhwbGljaXRUeXBlcy5zb21lKGZ1bmN0aW9uIChlbGVtKSB7IHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBlbGVtOyB9KVxufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4gKCkge1xuICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gIHJldHVybiBhcmdzLnNvbWUoZnVuY3Rpb24gKGVsZW0pIHsgcmV0dXJuIGVsZW0udG9Mb3dlckNhc2UoKSA9PT0gJ2Jvb2xlYW4nOyB9KVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgLy8gRGVhY3RpdmF0ZSBkZXBzIHRyYWNraW5nIHdoaWxlIHByb2Nlc3NpbmcgZXJyb3IgaGFuZGxlciB0byBhdm9pZCBwb3NzaWJsZSBpbmZpbml0ZSByZW5kZXJpbmcuXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZXgvaXNzdWVzLzE1MDVcbiAgcHVzaFRhcmdldCgpO1xuICB0cnkge1xuICAgIGlmICh2bSkge1xuICAgICAgdmFyIGN1ciA9IHZtO1xuICAgICAgd2hpbGUgKChjdXIgPSBjdXIuJHBhcmVudCkpIHtcbiAgICAgICAgdmFyIGhvb2tzID0gY3VyLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7XG4gICAgICAgIGlmIChob29rcykge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhciBjYXB0dXJlID0gaG9va3NbaV0uY2FsbChjdXIsIGVyciwgdm0sIGluZm8pID09PSBmYWxzZTtcbiAgICAgICAgICAgICAgaWYgKGNhcHR1cmUpIHsgcmV0dXJuIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgZ2xvYmFsSGFuZGxlRXJyb3IoZSwgY3VyLCAnZXJyb3JDYXB0dXJlZCBob29rJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdsb2JhbEhhbmRsZUVycm9yKGVyciwgdm0sIGluZm8pO1xuICB9IGZpbmFsbHkge1xuICAgIHBvcFRhcmdldCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZVdpdGhFcnJvckhhbmRsaW5nIChcbiAgaGFuZGxlcixcbiAgY29udGV4dCxcbiAgYXJncyxcbiAgdm0sXG4gIGluZm9cbikge1xuICB2YXIgcmVzO1xuICB0cnkge1xuICAgIHJlcyA9IGFyZ3MgPyBoYW5kbGVyLmFwcGx5KGNvbnRleHQsIGFyZ3MpIDogaGFuZGxlci5jYWxsKGNvbnRleHQpO1xuICAgIGlmIChyZXMgJiYgIXJlcy5faXNWdWUgJiYgaXNQcm9taXNlKHJlcykgJiYgIXJlcy5faGFuZGxlZCkge1xuICAgICAgcmVzLmNhdGNoKGZ1bmN0aW9uIChlKSB7IHJldHVybiBoYW5kbGVFcnJvcihlLCB2bSwgaW5mbyArIFwiIChQcm9taXNlL2FzeW5jKVwiKTsgfSk7XG4gICAgICAvLyBpc3N1ZSAjOTUxMVxuICAgICAgLy8gYXZvaWQgY2F0Y2ggdHJpZ2dlcmluZyBtdWx0aXBsZSB0aW1lcyB3aGVuIG5lc3RlZCBjYWxsc1xuICAgICAgcmVzLl9oYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYW5kbGVFcnJvcihlLCB2bSwgaW5mbyk7XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBnbG9iYWxIYW5kbGVFcnJvciAoZXJyLCB2bSwgaW5mbykge1xuICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY29uZmlnLmVycm9ySGFuZGxlci5jYWxsKG51bGwsIGVyciwgdm0sIGluZm8pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWYgdGhlIHVzZXIgaW50ZW50aW9uYWxseSB0aHJvd3MgdGhlIG9yaWdpbmFsIGVycm9yIGluIHRoZSBoYW5kbGVyLFxuICAgICAgLy8gZG8gbm90IGxvZyBpdCB0d2ljZVxuICAgICAgaWYgKGUgIT09IGVycikge1xuICAgICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTtcbn1cblxuZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKChcIkVycm9yIGluIFwiICsgaW5mbyArIFwiOiBcXFwiXCIgKyAoZXJyLnRvU3RyaW5nKCkpICsgXCJcXFwiXCIpLCB2bSk7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKChpbkJyb3dzZXIgfHwgaW5XZWV4KSAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLyogICovXG5cbnZhciBpc1VzaW5nTWljcm9UYXNrID0gZmFsc2U7XG5cbnZhciBjYWxsYmFja3MgPSBbXTtcbnZhciBwZW5kaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsdXNoQ2FsbGJhY2tzICgpIHtcbiAgcGVuZGluZyA9IGZhbHNlO1xuICB2YXIgY29waWVzID0gY2FsbGJhY2tzLnNsaWNlKDApO1xuICBjYWxsYmFja3MubGVuZ3RoID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb3BpZXNbaV0oKTtcbiAgfVxufVxuXG4vLyBIZXJlIHdlIGhhdmUgYXN5bmMgZGVmZXJyaW5nIHdyYXBwZXJzIHVzaW5nIG1pY3JvdGFza3MuXG4vLyBJbiAyLjUgd2UgdXNlZCAobWFjcm8pIHRhc2tzIChpbiBjb21iaW5hdGlvbiB3aXRoIG1pY3JvdGFza3MpLlxuLy8gSG93ZXZlciwgaXQgaGFzIHN1YnRsZSBwcm9ibGVtcyB3aGVuIHN0YXRlIGlzIGNoYW5nZWQgcmlnaHQgYmVmb3JlIHJlcGFpbnRcbi8vIChlLmcuICM2ODEzLCBvdXQtaW4gdHJhbnNpdGlvbnMpLlxuLy8gQWxzbywgdXNpbmcgKG1hY3JvKSB0YXNrcyBpbiBldmVudCBoYW5kbGVyIHdvdWxkIGNhdXNlIHNvbWUgd2VpcmQgYmVoYXZpb3JzXG4vLyB0aGF0IGNhbm5vdCBiZSBjaXJjdW12ZW50ZWQgKGUuZy4gIzcxMDksICM3MTUzLCAjNzU0NiwgIzc4MzQsICM4MTA5KS5cbi8vIFNvIHdlIG5vdyB1c2UgbWljcm90YXNrcyBldmVyeXdoZXJlLCBhZ2Fpbi5cbi8vIEEgbWFqb3IgZHJhd2JhY2sgb2YgdGhpcyB0cmFkZW9mZiBpcyB0aGF0IHRoZXJlIGFyZSBzb21lIHNjZW5hcmlvc1xuLy8gd2hlcmUgbWljcm90YXNrcyBoYXZlIHRvbyBoaWdoIGEgcHJpb3JpdHkgYW5kIGZpcmUgaW4gYmV0d2VlbiBzdXBwb3NlZGx5XG4vLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTAsIHdoaWNoIGhhdmUgd29ya2Fyb3VuZHMpXG4vLyBvciBldmVuIGJldHdlZW4gYnViYmxpbmcgb2YgdGhlIHNhbWUgZXZlbnQgKCM2NTY2KS5cbnZhciB0aW1lckZ1bmM7XG5cbi8vIFRoZSBuZXh0VGljayBiZWhhdmlvciBsZXZlcmFnZXMgdGhlIG1pY3JvdGFzayBxdWV1ZSwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkXG4vLyB2aWEgZWl0aGVyIG5hdGl2ZSBQcm9taXNlLnRoZW4gb3IgTXV0YXRpb25PYnNlcnZlci5cbi8vIE11dGF0aW9uT2JzZXJ2ZXIgaGFzIHdpZGVyIHN1cHBvcnQsIGhvd2V2ZXIgaXQgaXMgc2VyaW91c2x5IGJ1Z2dlZCBpblxuLy8gVUlXZWJWaWV3IGluIGlPUyA+PSA5LjMuMyB3aGVuIHRyaWdnZXJlZCBpbiB0b3VjaCBldmVudCBoYW5kbGVycy4gSXRcbi8vIGNvbXBsZXRlbHkgc3RvcHMgd29ya2luZyBhZnRlciB0cmlnZ2VyaW5nIGEgZmV3IHRpbWVzLi4uIHNvLCBpZiBuYXRpdmVcbi8vIFByb21pc2UgaXMgYXZhaWxhYmxlLCB3ZSB3aWxsIHVzZSBpdDpcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0LCAkZmxvdy1kaXNhYmxlLWxpbmUgKi9cbmlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHtcbiAgdmFyIHAgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgdGltZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIHAudGhlbihmbHVzaENhbGxiYWNrcyk7XG4gICAgLy8gSW4gcHJvYmxlbWF0aWMgVUlXZWJWaWV3cywgUHJvbWlzZS50aGVuIGRvZXNuJ3QgY29tcGxldGVseSBicmVhaywgYnV0XG4gICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlXG4gICAgLy8gbWljcm90YXNrIHF1ZXVlIGJ1dCB0aGUgcXVldWUgaXNuJ3QgYmVpbmcgZmx1c2hlZCwgdW50aWwgdGhlIGJyb3dzZXJcbiAgICAvLyBuZWVkcyB0byBkbyBzb21lIG90aGVyIHdvcmssIGUuZy4gaGFuZGxlIGEgdGltZXIuIFRoZXJlZm9yZSB3ZSBjYW5cbiAgICAvLyBcImZvcmNlXCIgdGhlIG1pY3JvdGFzayBxdWV1ZSB0byBiZSBmbHVzaGVkIGJ5IGFkZGluZyBhbiBlbXB0eSB0aW1lci5cbiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfVxuICB9O1xuICBpc1VzaW5nTWljcm9UYXNrID0gdHJ1ZTtcbn0gZWxzZSBpZiAoIWlzSUUgJiYgdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnICYmIChcbiAgaXNOYXRpdmUoTXV0YXRpb25PYnNlcnZlcikgfHxcbiAgLy8gUGhhbnRvbUpTIGFuZCBpT1MgNy54XG4gIE11dGF0aW9uT2JzZXJ2ZXIudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgTXV0YXRpb25PYnNlcnZlckNvbnN0cnVjdG9yXSdcbikpIHtcbiAgLy8gVXNlIE11dGF0aW9uT2JzZXJ2ZXIgd2hlcmUgbmF0aXZlIFByb21pc2UgaXMgbm90IGF2YWlsYWJsZSxcbiAgLy8gZS5nLiBQaGFudG9tSlMsIGlPUzcsIEFuZHJvaWQgNC40XG4gIC8vICgjNjQ2NiBNdXRhdGlvbk9ic2VydmVyIGlzIHVucmVsaWFibGUgaW4gSUUxMSlcbiAgdmFyIGNvdW50ZXIgPSAxO1xuICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaENhbGxiYWNrcyk7XG4gIHZhciB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjb3VudGVyKSk7XG4gIG9ic2VydmVyLm9ic2VydmUodGV4dE5vZGUsIHtcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gIH0pO1xuICB0aW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgY291bnRlciA9IChjb3VudGVyICsgMSkgJSAyO1xuICAgIHRleHROb2RlLmRhdGEgPSBTdHJpbmcoY291bnRlcik7XG4gIH07XG4gIGlzVXNpbmdNaWNyb1Rhc2sgPSB0cnVlO1xufSBlbHNlIGlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShzZXRJbW1lZGlhdGUpKSB7XG4gIC8vIEZhbGxiYWNrIHRvIHNldEltbWVkaWF0ZS5cbiAgLy8gVGVjaG5pY2FsbHkgaXQgbGV2ZXJhZ2VzIHRoZSAobWFjcm8pIHRhc2sgcXVldWUsXG4gIC8vIGJ1dCBpdCBpcyBzdGlsbCBhIGJldHRlciBjaG9pY2UgdGhhbiBzZXRUaW1lb3V0LlxuICB0aW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgc2V0SW1tZWRpYXRlKGZsdXNoQ2FsbGJhY2tzKTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIEZhbGxiYWNrIHRvIHNldFRpbWVvdXQuXG4gIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBzZXRUaW1lb3V0KGZsdXNoQ2FsbGJhY2tzLCAwKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2sgKGNiLCBjdHgpIHtcbiAgdmFyIF9yZXNvbHZlO1xuICBjYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjYi5jYWxsKGN0eCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGUsIGN0eCwgJ25leHRUaWNrJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChfcmVzb2x2ZSkge1xuICAgICAgX3Jlc29sdmUoY3R4KTtcbiAgICB9XG4gIH0pO1xuICBpZiAoIXBlbmRpbmcpIHtcbiAgICBwZW5kaW5nID0gdHJ1ZTtcbiAgICB0aW1lckZ1bmMoKTtcbiAgfVxuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgaWYgKCFjYiAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIF9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9KVxuICB9XG59XG5cbi8qICAqL1xuXG4vKiBub3QgdHlwZSBjaGVja2luZyB0aGlzIGZpbGUgYmVjYXVzZSBmbG93IGRvZXNuJ3QgcGxheSB3ZWxsIHdpdGggUHJveHkgKi9cblxudmFyIGluaXRQcm94eTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGFsbG93ZWRHbG9iYWxzID0gbWFrZU1hcChcbiAgICAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTiwnICtcbiAgICAncGFyc2VGbG9hdCxwYXJzZUludCxkZWNvZGVVUkksZGVjb2RlVVJJQ29tcG9uZW50LGVuY29kZVVSSSxlbmNvZGVVUklDb21wb25lbnQsJyArXG4gICAgJ01hdGgsTnVtYmVyLERhdGUsQXJyYXksT2JqZWN0LEJvb2xlYW4sU3RyaW5nLFJlZ0V4cCxNYXAsU2V0LEpTT04sSW50bCwnICtcbiAgICAncmVxdWlyZScgLy8gZm9yIFdlYnBhY2svQnJvd3NlcmlmeVxuICApO1xuXG4gIHZhciB3YXJuTm9uUHJlc2VudCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgIHdhcm4oXG4gICAgICBcIlByb3BlcnR5IG9yIG1ldGhvZCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCBcIiArXG4gICAgICAncmVmZXJlbmNlZCBkdXJpbmcgcmVuZGVyLiBNYWtlIHN1cmUgdGhhdCB0aGlzIHByb3BlcnR5IGlzIHJlYWN0aXZlLCAnICtcbiAgICAgICdlaXRoZXIgaW4gdGhlIGRhdGEgb3B0aW9uLCBvciBmb3IgY2xhc3MtYmFzZWQgY29tcG9uZW50cywgYnkgJyArXG4gICAgICAnaW5pdGlhbGl6aW5nIHRoZSBwcm9wZXJ0eS4gJyArXG4gICAgICAnU2VlOiBodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9yZWFjdGl2aXR5Lmh0bWwjRGVjbGFyaW5nLVJlYWN0aXZlLVByb3BlcnRpZXMuJyxcbiAgICAgIHRhcmdldFxuICAgICk7XG4gIH07XG5cbiAgdmFyIHdhcm5SZXNlcnZlZFByZWZpeCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgIHdhcm4oXG4gICAgICBcIlByb3BlcnR5IFxcXCJcIiArIGtleSArIFwiXFxcIiBtdXN0IGJlIGFjY2Vzc2VkIHdpdGggXFxcIiRkYXRhLlwiICsga2V5ICsgXCJcXFwiIGJlY2F1c2UgXCIgK1xuICAgICAgJ3Byb3BlcnRpZXMgc3RhcnRpbmcgd2l0aCBcIiRcIiBvciBcIl9cIiBhcmUgbm90IHByb3hpZWQgaW4gdGhlIFZ1ZSBpbnN0YW5jZSB0byAnICtcbiAgICAgICdwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIFZ1ZSBpbnRlcm5hbHMuICcgK1xuICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvYXBpLyNkYXRhJyxcbiAgICAgIHRhcmdldFxuICAgICk7XG4gIH07XG5cbiAgdmFyIGhhc1Byb3h5ID1cbiAgICB0eXBlb2YgUHJveHkgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFByb3h5KTtcblxuICBpZiAoaGFzUHJveHkpIHtcbiAgICB2YXIgaXNCdWlsdEluTW9kaWZpZXIgPSBtYWtlTWFwKCdzdG9wLHByZXZlbnQsc2VsZixjdHJsLHNoaWZ0LGFsdCxtZXRhLGV4YWN0Jyk7XG4gICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2Rlcywge1xuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQgKHRhcmdldCwga2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoaXNCdWlsdEluTW9kaWZpZXIoa2V5KSkge1xuICAgICAgICAgIHdhcm4oKFwiQXZvaWQgb3ZlcndyaXRpbmcgYnVpbHQtaW4gbW9kaWZpZXIgaW4gY29uZmlnLmtleUNvZGVzOiAuXCIgKyBrZXkpKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHZhciBoYXNIYW5kbGVyID0ge1xuICAgIGhhczogZnVuY3Rpb24gaGFzICh0YXJnZXQsIGtleSkge1xuICAgICAgdmFyIGhhcyA9IGtleSBpbiB0YXJnZXQ7XG4gICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZEdsb2JhbHMoa2V5KSB8fFxuICAgICAgICAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5LmNoYXJBdCgwKSA9PT0gJ18nICYmICEoa2V5IGluIHRhcmdldC4kZGF0YSkpO1xuICAgICAgaWYgKCFoYXMgJiYgIWlzQWxsb3dlZCkge1xuICAgICAgICBpZiAoa2V5IGluIHRhcmdldC4kZGF0YSkgeyB3YXJuUmVzZXJ2ZWRQcmVmaXgodGFyZ2V0LCBrZXkpOyB9XG4gICAgICAgIGVsc2UgeyB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXMgfHwgIWlzQWxsb3dlZFxuICAgIH1cbiAgfTtcblxuICB2YXIgZ2V0SGFuZGxlciA9IHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCAodGFyZ2V0LCBrZXkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiAhKGtleSBpbiB0YXJnZXQpKSB7XG4gICAgICAgIGlmIChrZXkgaW4gdGFyZ2V0LiRkYXRhKSB7IHdhcm5SZXNlcnZlZFByZWZpeCh0YXJnZXQsIGtleSk7IH1cbiAgICAgICAgZWxzZSB7IHdhcm5Ob25QcmVzZW50KHRhcmdldCwga2V5KTsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgfVxuICB9O1xuXG4gIGluaXRQcm94eSA9IGZ1bmN0aW9uIGluaXRQcm94eSAodm0pIHtcbiAgICBpZiAoaGFzUHJveHkpIHtcbiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZVxuICAgICAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcbiAgICAgIHZhciBoYW5kbGVycyA9IG9wdGlvbnMucmVuZGVyICYmIG9wdGlvbnMucmVuZGVyLl93aXRoU3RyaXBwZWRcbiAgICAgICAgPyBnZXRIYW5kbGVyXG4gICAgICAgIDogaGFzSGFuZGxlcjtcbiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IG5ldyBQcm94eSh2bSwgaGFuZGxlcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bS5fcmVuZGVyUHJveHkgPSB2bTtcbiAgICB9XG4gIH07XG59XG5cbi8qICAqL1xuXG52YXIgc2Vlbk9iamVjdHMgPSBuZXcgX1NldCgpO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFuIG9iamVjdCB0byBldm9rZSBhbGwgY29udmVydGVkXG4gKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdFxuICogaXMgY29sbGVjdGVkIGFzIGEgXCJkZWVwXCIgZGVwZW5kZW5jeS5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2UgKHZhbCkge1xuICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7XG4gIHNlZW5PYmplY3RzLmNsZWFyKCk7XG59XG5cbmZ1bmN0aW9uIF90cmF2ZXJzZSAodmFsLCBzZWVuKSB7XG4gIHZhciBpLCBrZXlzO1xuICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpO1xuICBpZiAoKCFpc0EgJiYgIWlzT2JqZWN0KHZhbCkpIHx8IE9iamVjdC5pc0Zyb3plbih2YWwpIHx8IHZhbCBpbnN0YW5jZW9mIFZOb2RlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHZhbC5fX29iX18pIHtcbiAgICB2YXIgZGVwSWQgPSB2YWwuX19vYl9fLmRlcC5pZDtcbiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2Vlbi5hZGQoZGVwSWQpO1xuICB9XG4gIGlmIChpc0EpIHtcbiAgICBpID0gdmFsLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxbaV0sIHNlZW4pOyB9XG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgaSA9IGtleXMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtrZXlzW2ldXSwgc2Vlbik7IH1cbiAgfVxufVxuXG52YXIgbWFyaztcbnZhciBtZWFzdXJlO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgcGVyZiA9IGluQnJvd3NlciAmJiB3aW5kb3cucGVyZm9ybWFuY2U7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoXG4gICAgcGVyZiAmJlxuICAgIHBlcmYubWFyayAmJlxuICAgIHBlcmYubWVhc3VyZSAmJlxuICAgIHBlcmYuY2xlYXJNYXJrcyAmJlxuICAgIHBlcmYuY2xlYXJNZWFzdXJlc1xuICApIHtcbiAgICBtYXJrID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gcGVyZi5tYXJrKHRhZyk7IH07XG4gICAgbWVhc3VyZSA9IGZ1bmN0aW9uIChuYW1lLCBzdGFydFRhZywgZW5kVGFnKSB7XG4gICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7XG4gICAgICBwZXJmLmNsZWFyTWFya3Moc3RhcnRUYWcpO1xuICAgICAgcGVyZi5jbGVhck1hcmtzKGVuZFRhZyk7XG4gICAgICAvLyBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSlcbiAgICB9O1xuICB9XG59XG5cbi8qICAqL1xuXG52YXIgbm9ybWFsaXplRXZlbnQgPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIHBhc3NpdmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyYnO1xuICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICB2YXIgb25jZSQkMSA9IG5hbWUuY2hhckF0KDApID09PSAnfic7IC8vIFByZWZpeGVkIGxhc3QsIGNoZWNrZWQgZmlyc3RcbiAgbmFtZSA9IG9uY2UkJDEgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnO1xuICBuYW1lID0gY2FwdHVyZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgb25jZTogb25jZSQkMSxcbiAgICBjYXB0dXJlOiBjYXB0dXJlLFxuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZuSW52b2tlciAoZm5zLCB2bSkge1xuICBmdW5jdGlvbiBpbnZva2VyICgpIHtcbiAgICB2YXIgYXJndW1lbnRzJDEgPSBhcmd1bWVudHM7XG5cbiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm5zKSkge1xuICAgICAgdmFyIGNsb25lZCA9IGZucy5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW52b2tlV2l0aEVycm9ySGFuZGxpbmcoY2xvbmVkW2ldLCBudWxsLCBhcmd1bWVudHMkMSwgdm0sIFwidi1vbiBoYW5kbGVyXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVyc1xuICAgICAgcmV0dXJuIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGZucywgbnVsbCwgYXJndW1lbnRzLCB2bSwgXCJ2LW9uIGhhbmRsZXJcIilcbiAgICB9XG4gIH1cbiAgaW52b2tlci5mbnMgPSBmbnM7XG4gIHJldHVybiBpbnZva2VyXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxpc3RlbmVycyAoXG4gIG9uLFxuICBvbGRPbixcbiAgYWRkLFxuICByZW1vdmUkJDEsXG4gIGNyZWF0ZU9uY2VIYW5kbGVyLFxuICB2bVxuKSB7XG4gIHZhciBuYW1lLCBkZWYkJDEsIGN1ciwgb2xkLCBldmVudDtcbiAgZm9yIChuYW1lIGluIG9uKSB7XG4gICAgZGVmJCQxID0gY3VyID0gb25bbmFtZV07XG4gICAgb2xkID0gb2xkT25bbmFtZV07XG4gICAgZXZlbnQgPSBub3JtYWxpemVFdmVudChuYW1lKTtcbiAgICBpZiAoaXNVbmRlZihjdXIpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgIFwiSW52YWxpZCBoYW5kbGVyIGZvciBldmVudCBcXFwiXCIgKyAoZXZlbnQubmFtZSkgKyBcIlxcXCI6IGdvdCBcIiArIFN0cmluZyhjdXIpLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzVW5kZWYob2xkKSkge1xuICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHtcbiAgICAgICAgY3VyID0gb25bbmFtZV0gPSBjcmVhdGVGbkludm9rZXIoY3VyLCB2bSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNUcnVlKGV2ZW50Lm9uY2UpKSB7XG4gICAgICAgIGN1ciA9IG9uW25hbWVdID0gY3JlYXRlT25jZUhhbmRsZXIoZXZlbnQubmFtZSwgY3VyLCBldmVudC5jYXB0dXJlKTtcbiAgICAgIH1cbiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7XG4gICAgfSBlbHNlIGlmIChjdXIgIT09IG9sZCkge1xuICAgICAgb2xkLmZucyA9IGN1cjtcbiAgICAgIG9uW25hbWVdID0gb2xkO1xuICAgIH1cbiAgfVxuICBmb3IgKG5hbWUgaW4gb2xkT24pIHtcbiAgICBpZiAoaXNVbmRlZihvbltuYW1lXSkpIHtcbiAgICAgIGV2ZW50ID0gbm9ybWFsaXplRXZlbnQobmFtZSk7XG4gICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gbWVyZ2VWTm9kZUhvb2sgKGRlZiwgaG9va0tleSwgaG9vaykge1xuICBpZiAoZGVmIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pO1xuICB9XG4gIHZhciBpbnZva2VyO1xuICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTtcblxuICBmdW5jdGlvbiB3cmFwcGVkSG9vayAoKSB7XG4gICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIC8vIGltcG9ydGFudDogcmVtb3ZlIG1lcmdlZCBob29rIHRvIGVuc3VyZSBpdCdzIGNhbGxlZCBvbmx5IG9uY2VcbiAgICAvLyBhbmQgcHJldmVudCBtZW1vcnkgbGVha1xuICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spO1xuICB9XG5cbiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHtcbiAgICAvLyBubyBleGlzdGluZyBob29rXG4gICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbd3JhcHBlZEhvb2tdKTtcbiAgfSBlbHNlIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXNEZWYob2xkSG9vay5mbnMpICYmIGlzVHJ1ZShvbGRIb29rLm1lcmdlZCkpIHtcbiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlclxuICAgICAgaW52b2tlciA9IG9sZEhvb2s7XG4gICAgICBpbnZva2VyLmZucy5wdXNoKHdyYXBwZWRIb29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXhpc3RpbmcgcGxhaW4gaG9va1xuICAgICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbb2xkSG9vaywgd3JhcHBlZEhvb2tdKTtcbiAgICB9XG4gIH1cblxuICBpbnZva2VyLm1lcmdlZCA9IHRydWU7XG4gIGRlZltob29rS2V5XSA9IGludm9rZXI7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhIChcbiAgZGF0YSxcbiAgQ3RvcixcbiAgdGFnXG4pIHtcbiAgLy8gd2UgYXJlIG9ubHkgZXh0cmFjdGluZyByYXcgdmFsdWVzIGhlcmUuXG4gIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZFxuICAvLyBjb21wb25lbnQgaXRzZWxmLlxuICB2YXIgcHJvcE9wdGlvbnMgPSBDdG9yLm9wdGlvbnMucHJvcHM7XG4gIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGF0dHJzID0gZGF0YS5hdHRycztcbiAgdmFyIHByb3BzID0gZGF0YS5wcm9wcztcbiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHZhciBhbHRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhciBrZXlJbkxvd2VyQ2FzZSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ICE9PSBrZXlJbkxvd2VyQ2FzZSAmJlxuICAgICAgICAgIGF0dHJzICYmIGhhc093bihhdHRycywga2V5SW5Mb3dlckNhc2UpXG4gICAgICAgICkge1xuICAgICAgICAgIHRpcChcbiAgICAgICAgICAgIFwiUHJvcCBcXFwiXCIgKyBrZXlJbkxvd2VyQ2FzZSArIFwiXFxcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50IFwiICtcbiAgICAgICAgICAgIChmb3JtYXRDb21wb25lbnROYW1lKHRhZyB8fCBDdG9yKSkgKyBcIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXNcIiArXG4gICAgICAgICAgICBcIiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuIFwiICtcbiAgICAgICAgICAgIFwiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCBcIiArXG4gICAgICAgICAgICBcInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gXCIgK1xuICAgICAgICAgICAgXCJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFxcXCJcIiArIGFsdEtleSArIFwiXFxcIiBpbnN0ZWFkIG9mIFxcXCJcIiArIGtleSArIFwiXFxcIi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNoZWNrUHJvcChyZXMsIHByb3BzLCBrZXksIGFsdEtleSwgdHJ1ZSkgfHxcbiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcCAoXG4gIHJlcyxcbiAgaGFzaCxcbiAga2V5LFxuICBhbHRLZXksXG4gIHByZXNlcnZlXG4pIHtcbiAgaWYgKGlzRGVmKGhhc2gpKSB7XG4gICAgaWYgKGhhc093bihoYXNoLCBrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IGhhc2hba2V5XTtcbiAgICAgIGlmICghcHJlc2VydmUpIHtcbiAgICAgICAgZGVsZXRlIGhhc2hba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChoYXNPd24oaGFzaCwgYWx0S2V5KSkge1xuICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07XG4gICAgICBpZiAoIXByZXNlcnZlKSB7XG4gICAgICAgIGRlbGV0ZSBoYXNoW2FsdEtleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyogICovXG5cbi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieVxuLy8gc3RhdGljYWxseSBhbmFseXppbmcgdGhlIHRlbXBsYXRlIGF0IGNvbXBpbGUgdGltZS5cbi8vXG4vLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZVxuLy8gZ2VuZXJhdGVkIHJlbmRlciBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIHJldHVybiBBcnJheTxWTm9kZT4uIFRoZXJlIGFyZVxuLy8gdHdvIGNhc2VzIHdoZXJlIGV4dHJhIG5vcm1hbGl6YXRpb24gaXMgbmVlZGVkOlxuXG4vLyAxLiBXaGVuIHRoZSBjaGlsZHJlbiBjb250YWlucyBjb21wb25lbnRzIC0gYmVjYXVzZSBhIGZ1bmN0aW9uYWwgY29tcG9uZW50XG4vLyBtYXkgcmV0dXJuIGFuIEFycmF5IGluc3RlYWQgb2YgYSBzaW5nbGUgcm9vdC4gSW4gdGhpcyBjYXNlLCBqdXN0IGEgc2ltcGxlXG4vLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGVcbi8vIHRoaW5nIHdpdGggQXJyYXkucHJvdG90eXBlLmNvbmNhdC4gSXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvbmx5IDEtbGV2ZWwgZGVlcFxuLy8gYmVjYXVzZSBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYWxyZWFkeSBub3JtYWxpemUgdGhlaXIgb3duIGNoaWxkcmVuLlxuZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbltpXSkpIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuXG59XG5cbi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsXG4vLyBlLmcuIDx0ZW1wbGF0ZT4sIDxzbG90Piwgdi1mb3IsIG9yIHdoZW4gdGhlIGNoaWxkcmVuIGlzIHByb3ZpZGVkIGJ5IHVzZXJcbi8vIHdpdGggaGFuZC13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMgLyBKU1guIEluIHN1Y2ggY2FzZXMgYSBmdWxsIG5vcm1hbGl6YXRpb25cbi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLlxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIHJldHVybiBpc1ByaW1pdGl2ZShjaGlsZHJlbilcbiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXVxuICAgIDogQXJyYXkuaXNBcnJheShjaGlsZHJlbilcbiAgICAgID8gbm9ybWFsaXplQXJyYXlDaGlsZHJlbihjaGlsZHJlbilcbiAgICAgIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHtcbiAgcmV0dXJuIGlzRGVmKG5vZGUpICYmIGlzRGVmKG5vZGUudGV4dCkgJiYgaXNGYWxzZShub2RlLmlzQ29tbWVudClcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXlDaGlsZHJlbiAoY2hpbGRyZW4sIG5lc3RlZEluZGV4KSB7XG4gIHZhciByZXMgPSBbXTtcbiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDtcbiAgZm9yIChpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgYyA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfVxuICAgIGxhc3RJbmRleCA9IHJlcy5sZW5ndGggLSAxO1xuICAgIGxhc3QgPSByZXNbbGFzdEluZGV4XTtcbiAgICAvLyAgbmVzdGVkXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHtcbiAgICAgIGlmIChjLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyBcIl9cIiArIGkpKTtcbiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2Rlc1xuICAgICAgICBpZiAoaXNUZXh0Tm9kZShjWzBdKSAmJiBpc1RleHROb2RlKGxhc3QpKSB7XG4gICAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgKGNbMF0pLnRleHQpO1xuICAgICAgICAgIGMuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaC5hcHBseShyZXMsIGMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUoYykpIHtcbiAgICAgIGlmIChpc1RleHROb2RlKGxhc3QpKSB7XG4gICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgICAgLy8gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIFNTUiBoeWRyYXRpb24gYmVjYXVzZSB0ZXh0IG5vZGVzIGFyZVxuICAgICAgICAvLyBlc3NlbnRpYWxseSBtZXJnZWQgd2hlbiByZW5kZXJlZCB0byBIVE1MIHN0cmluZ3NcbiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7XG4gICAgICB9IGVsc2UgaWYgKGMgIT09ICcnKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgcHJpbWl0aXZlIHRvIHZub2RlXG4gICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHtcbiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2Rlc1xuICAgICAgICByZXNbbGFzdEluZGV4XSA9IGNyZWF0ZVRleHRWTm9kZShsYXN0LnRleHQgKyBjLnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZGVmYXVsdCBrZXkgZm9yIG5lc3RlZCBhcnJheSBjaGlsZHJlbiAobGlrZWx5IGdlbmVyYXRlZCBieSB2LWZvcilcbiAgICAgICAgaWYgKGlzVHJ1ZShjaGlsZHJlbi5faXNWTGlzdCkgJiZcbiAgICAgICAgICBpc0RlZihjLnRhZykgJiZcbiAgICAgICAgICBpc1VuZGVmKGMua2V5KSAmJlxuICAgICAgICAgIGlzRGVmKG5lc3RlZEluZGV4KSkge1xuICAgICAgICAgIGMua2V5ID0gXCJfX3ZsaXN0XCIgKyBuZXN0ZWRJbmRleCArIFwiX1wiICsgaSArIFwiX19cIjtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaChjKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFByb3ZpZGUgKHZtKSB7XG4gIHZhciBwcm92aWRlID0gdm0uJG9wdGlvbnMucHJvdmlkZTtcbiAgaWYgKHByb3ZpZGUpIHtcbiAgICB2bS5fcHJvdmlkZWQgPSB0eXBlb2YgcHJvdmlkZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBwcm92aWRlLmNhbGwodm0pXG4gICAgICA6IHByb3ZpZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdEluamVjdGlvbnMgKHZtKSB7XG4gIHZhciByZXN1bHQgPSByZXNvbHZlSW5qZWN0KHZtLiRvcHRpb25zLmluamVjdCwgdm0pO1xuICBpZiAocmVzdWx0KSB7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKGZhbHNlKTtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSBcIiArXG4gICAgICAgICAgICBcIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gXCIgK1xuICAgICAgICAgICAgXCJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXFxcIlwiICsga2V5ICsgXCJcXFwiXCIsXG4gICAgICAgICAgICB2bVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sIGtleSwgcmVzdWx0W2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlSW5qZWN0IChpbmplY3QsIHZtKSB7XG4gIGlmIChpbmplY3QpIHtcbiAgICAvLyBpbmplY3QgaXMgOmFueSBiZWNhdXNlIGZsb3cgaXMgbm90IHNtYXJ0IGVub3VnaCB0byBmaWd1cmUgb3V0IGNhY2hlZFxuICAgIHZhciByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXlzID0gaGFzU3ltYm9sXG4gICAgICA/IFJlZmxlY3Qub3duS2V5cyhpbmplY3QpXG4gICAgICA6IE9iamVjdC5rZXlzKGluamVjdCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgLy8gIzY1NzQgaW4gY2FzZSB0aGUgaW5qZWN0IG9iamVjdCBpcyBvYnNlcnZlZC4uLlxuICAgICAgaWYgKGtleSA9PT0gJ19fb2JfXycpIHsgY29udGludWUgfVxuICAgICAgdmFyIHByb3ZpZGVLZXkgPSBpbmplY3Rba2V5XS5mcm9tO1xuICAgICAgdmFyIHNvdXJjZSA9IHZtO1xuICAgICAgd2hpbGUgKHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlLl9wcm92aWRlZCAmJiBoYXNPd24oc291cmNlLl9wcm92aWRlZCwgcHJvdmlkZUtleSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDtcbiAgICAgIH1cbiAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIGlmICgnZGVmYXVsdCcgaW4gaW5qZWN0W2tleV0pIHtcbiAgICAgICAgICB2YXIgcHJvdmlkZURlZmF1bHQgPSBpbmplY3Rba2V5XS5kZWZhdWx0O1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdHlwZW9mIHByb3ZpZGVEZWZhdWx0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHByb3ZpZGVEZWZhdWx0LmNhbGwodm0pXG4gICAgICAgICAgICA6IHByb3ZpZGVEZWZhdWx0O1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuKChcIkluamVjdGlvbiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgbm90IGZvdW5kXCIpLCB2bSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbi8qICAqL1xuXG5cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVzb2x2aW5nIHJhdyBjaGlsZHJlbiBWTm9kZXMgaW50byBhIHNsb3Qgb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZXNvbHZlU2xvdHMgKFxuICBjaGlsZHJlbixcbiAgY29udGV4dFxuKSB7XG4gIGlmICghY2hpbGRyZW4gfHwgIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgIHJldHVybiB7fVxuICB9XG4gIHZhciBzbG90cyA9IHt9O1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIHZhciBkYXRhID0gY2hpbGQuZGF0YTtcbiAgICAvLyByZW1vdmUgc2xvdCBhdHRyaWJ1dGUgaWYgdGhlIG5vZGUgaXMgcmVzb2x2ZWQgYXMgYSBWdWUgc2xvdCBub2RlXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHtcbiAgICAgIGRlbGV0ZSBkYXRhLmF0dHJzLnNsb3Q7XG4gICAgfVxuICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZVxuICAgIC8vIHNhbWUgY29udGV4dC5cbiAgICBpZiAoKGNoaWxkLmNvbnRleHQgPT09IGNvbnRleHQgfHwgY2hpbGQuZm5Db250ZXh0ID09PSBjb250ZXh0KSAmJlxuICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbFxuICAgICkge1xuICAgICAgdmFyIG5hbWUgPSBkYXRhLnNsb3Q7XG4gICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpO1xuICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgICBzbG90LnB1c2guYXBwbHkoc2xvdCwgY2hpbGQuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2xvdC5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgKHNsb3RzLmRlZmF1bHQgfHwgKHNsb3RzLmRlZmF1bHQgPSBbXSkpLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuICAvLyBpZ25vcmUgc2xvdHMgdGhhdCBjb250YWlucyBvbmx5IHdoaXRlc3BhY2VcbiAgZm9yICh2YXIgbmFtZSQxIGluIHNsb3RzKSB7XG4gICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkge1xuICAgICAgZGVsZXRlIHNsb3RzW25hbWUkMV07XG4gICAgfVxuICB9XG4gIHJldHVybiBzbG90c1xufVxuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UgKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLmlzQ29tbWVudCAmJiAhbm9kZS5hc3luY0ZhY3RvcnkpIHx8IG5vZGUudGV4dCA9PT0gJyAnXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVTY29wZWRTbG90cyAoXG4gIHNsb3RzLFxuICBub3JtYWxTbG90cyxcbiAgcHJldlNsb3RzXG4pIHtcbiAgdmFyIHJlcztcbiAgdmFyIGhhc05vcm1hbFNsb3RzID0gT2JqZWN0LmtleXMobm9ybWFsU2xvdHMpLmxlbmd0aCA+IDA7XG4gIHZhciBpc1N0YWJsZSA9IHNsb3RzID8gISFzbG90cy4kc3RhYmxlIDogIWhhc05vcm1hbFNsb3RzO1xuICB2YXIga2V5ID0gc2xvdHMgJiYgc2xvdHMuJGtleTtcbiAgaWYgKCFzbG90cykge1xuICAgIHJlcyA9IHt9O1xuICB9IGVsc2UgaWYgKHNsb3RzLl9ub3JtYWxpemVkKSB7XG4gICAgLy8gZmFzdCBwYXRoIDE6IGNoaWxkIGNvbXBvbmVudCByZS1yZW5kZXIgb25seSwgcGFyZW50IGRpZCBub3QgY2hhbmdlXG4gICAgcmV0dXJuIHNsb3RzLl9ub3JtYWxpemVkXG4gIH0gZWxzZSBpZiAoXG4gICAgaXNTdGFibGUgJiZcbiAgICBwcmV2U2xvdHMgJiZcbiAgICBwcmV2U2xvdHMgIT09IGVtcHR5T2JqZWN0ICYmXG4gICAga2V5ID09PSBwcmV2U2xvdHMuJGtleSAmJlxuICAgICFoYXNOb3JtYWxTbG90cyAmJlxuICAgICFwcmV2U2xvdHMuJGhhc05vcm1hbFxuICApIHtcbiAgICAvLyBmYXN0IHBhdGggMjogc3RhYmxlIHNjb3BlZCBzbG90cyB3LyBubyBub3JtYWwgc2xvdHMgdG8gcHJveHksXG4gICAgLy8gb25seSBuZWVkIHRvIG5vcm1hbGl6ZSBvbmNlXG4gICAgcmV0dXJuIHByZXZTbG90c1xuICB9IGVsc2Uge1xuICAgIHJlcyA9IHt9O1xuICAgIGZvciAodmFyIGtleSQxIGluIHNsb3RzKSB7XG4gICAgICBpZiAoc2xvdHNba2V5JDFdICYmIGtleSQxWzBdICE9PSAnJCcpIHtcbiAgICAgICAgcmVzW2tleSQxXSA9IG5vcm1hbGl6ZVNjb3BlZFNsb3Qobm9ybWFsU2xvdHMsIGtleSQxLCBzbG90c1trZXkkMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBleHBvc2Ugbm9ybWFsIHNsb3RzIG9uIHNjb3BlZFNsb3RzXG4gIGZvciAodmFyIGtleSQyIGluIG5vcm1hbFNsb3RzKSB7XG4gICAgaWYgKCEoa2V5JDIgaW4gcmVzKSkge1xuICAgICAgcmVzW2tleSQyXSA9IHByb3h5Tm9ybWFsU2xvdChub3JtYWxTbG90cywga2V5JDIpO1xuICAgIH1cbiAgfVxuICAvLyBhdm9yaWF6IHNlZW1zIHRvIG1vY2sgYSBub24tZXh0ZW5zaWJsZSAkc2NvcGVkU2xvdHMgb2JqZWN0XG4gIC8vIGFuZCB3aGVuIHRoYXQgaXMgcGFzc2VkIGRvd24gdGhpcyB3b3VsZCBjYXVzZSBhbiBlcnJvclxuICBpZiAoc2xvdHMgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShzbG90cykpIHtcbiAgICAoc2xvdHMpLl9ub3JtYWxpemVkID0gcmVzO1xuICB9XG4gIGRlZihyZXMsICckc3RhYmxlJywgaXNTdGFibGUpO1xuICBkZWYocmVzLCAnJGtleScsIGtleSk7XG4gIGRlZihyZXMsICckaGFzTm9ybWFsJywgaGFzTm9ybWFsU2xvdHMpO1xuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNjb3BlZFNsb3Qobm9ybWFsU2xvdHMsIGtleSwgZm4pIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlcyA9IGFyZ3VtZW50cy5sZW5ndGggPyBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpIDogZm4oe30pO1xuICAgIHJlcyA9IHJlcyAmJiB0eXBlb2YgcmVzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXMpXG4gICAgICA/IFtyZXNdIC8vIHNpbmdsZSB2bm9kZVxuICAgICAgOiBub3JtYWxpemVDaGlsZHJlbihyZXMpO1xuICAgIHJldHVybiByZXMgJiYgKFxuICAgICAgcmVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKHJlcy5sZW5ndGggPT09IDEgJiYgcmVzWzBdLmlzQ29tbWVudCkgLy8gIzk2NThcbiAgICApID8gdW5kZWZpbmVkXG4gICAgICA6IHJlc1xuICB9O1xuICAvLyB0aGlzIGlzIGEgc2xvdCB1c2luZyB0aGUgbmV3IHYtc2xvdCBzeW50YXggd2l0aG91dCBzY29wZS4gYWx0aG91Z2ggaXQgaXNcbiAgLy8gY29tcGlsZWQgYXMgYSBzY29wZWQgc2xvdCwgcmVuZGVyIGZuIHVzZXJzIHdvdWxkIGV4cGVjdCBpdCB0byBiZSBwcmVzZW50XG4gIC8vIG9uIHRoaXMuJHNsb3RzIGJlY2F1c2UgdGhlIHVzYWdlIGlzIHNlbWFudGljYWxseSBhIG5vcm1hbCBzbG90LlxuICBpZiAoZm4ucHJveHkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9ybWFsU2xvdHMsIGtleSwge1xuICAgICAgZ2V0OiBub3JtYWxpemVkLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbmZ1bmN0aW9uIHByb3h5Tm9ybWFsU2xvdChzbG90cywga2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBzbG90c1trZXldOyB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZW5kZXJpbmcgdi1mb3IgbGlzdHMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckxpc3QgKFxuICB2YWwsXG4gIHJlbmRlclxuKSB7XG4gIHZhciByZXQsIGksIGwsIGtleXMsIGtleTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHJldCA9IG5ldyBBcnJheSh2YWwubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBsID0gdmFsLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7XG4gICAgZm9yIChpID0gMDsgaSA8IHZhbDsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXIoaSArIDEsIGkpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgaWYgKGhhc1N5bWJvbCAmJiB2YWxbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgcmV0ID0gW107XG4gICAgICB2YXIgaXRlcmF0b3IgPSB2YWxbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgcmV0LnB1c2gocmVuZGVyKHJlc3VsdC52YWx1ZSwgcmV0Lmxlbmd0aCkpO1xuICAgICAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghaXNEZWYocmV0KSkge1xuICAgIHJldCA9IFtdO1xuICB9XG4gIChyZXQpLl9pc1ZMaXN0ID0gdHJ1ZTtcbiAgcmV0dXJuIHJldFxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIDxzbG90PlxuICovXG5mdW5jdGlvbiByZW5kZXJTbG90IChcbiAgbmFtZSxcbiAgZmFsbGJhY2ssXG4gIHByb3BzLFxuICBiaW5kT2JqZWN0XG4pIHtcbiAgdmFyIHNjb3BlZFNsb3RGbiA9IHRoaXMuJHNjb3BlZFNsb3RzW25hbWVdO1xuICB2YXIgbm9kZXM7XG4gIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3RcbiAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChiaW5kT2JqZWN0KSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhaXNPYmplY3QoYmluZE9iamVjdCkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcHJvcHMgPSBleHRlbmQoZXh0ZW5kKHt9LCBiaW5kT2JqZWN0KSwgcHJvcHMpO1xuICAgIH1cbiAgICBub2RlcyA9IHNjb3BlZFNsb3RGbihwcm9wcykgfHwgZmFsbGJhY2s7XG4gIH0gZWxzZSB7XG4gICAgbm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXSB8fCBmYWxsYmFjaztcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSBwcm9wcyAmJiBwcm9wcy5zbG90O1xuICBpZiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5vZGVzXG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGaWx0ZXIgKGlkKSB7XG4gIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGlzS2V5Tm90TWF0Y2ggKGV4cGVjdCwgYWN0dWFsKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHtcbiAgICByZXR1cm4gZXhwZWN0LmluZGV4T2YoYWN0dWFsKSA9PT0gLTFcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWxcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBjaGVja2luZyBrZXlDb2RlcyBmcm9tIGNvbmZpZy5cbiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fa1xuICogcGFzc2luZyBpbiBldmVudEtleU5hbWUgYXMgbGFzdCBhcmd1bWVudCBzZXBhcmF0ZWx5IGZvciBiYWNrd2FyZHMgY29tcGF0XG4gKi9cbmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKFxuICBldmVudEtleUNvZGUsXG4gIGtleSxcbiAgYnVpbHRJbktleUNvZGUsXG4gIGV2ZW50S2V5TmFtZSxcbiAgYnVpbHRJbktleU5hbWVcbikge1xuICB2YXIgbWFwcGVkS2V5Q29kZSA9IGNvbmZpZy5rZXlDb2Rlc1trZXldIHx8IGJ1aWx0SW5LZXlDb2RlO1xuICBpZiAoYnVpbHRJbktleU5hbWUgJiYgZXZlbnRLZXlOYW1lICYmICFjb25maWcua2V5Q29kZXNba2V5XSkge1xuICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpXG4gIH0gZWxzZSBpZiAobWFwcGVkS2V5Q29kZSkge1xuICAgIHJldHVybiBpc0tleU5vdE1hdGNoKG1hcHBlZEtleUNvZGUsIGV2ZW50S2V5Q29kZSlcbiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHtcbiAgICByZXR1cm4gaHlwaGVuYXRlKGV2ZW50S2V5TmFtZSkgIT09IGtleVxuICB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBtZXJnaW5nIHYtYmluZD1cIm9iamVjdFwiIGludG8gYSBWTm9kZSdzIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoXG4gIGRhdGEsXG4gIHRhZyxcbiAgdmFsdWUsXG4gIGFzUHJvcCxcbiAgaXNTeW5jXG4pIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgJ3YtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IG9yIEFycmF5IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdG9PYmplY3QodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFyIGhhc2g7XG4gICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8XG4gICAgICAgICAga2V5ID09PSAnc3R5bGUnIHx8XG4gICAgICAgICAgaXNSZXNlcnZlZEF0dHJpYnV0ZShrZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGhhc2ggPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7XG4gICAgICAgICAgaGFzaCA9IGFzUHJvcCB8fCBjb25maWcubXVzdFVzZVByb3AodGFnLCB0eXBlLCBrZXkpXG4gICAgICAgICAgICA/IGRhdGEuZG9tUHJvcHMgfHwgKGRhdGEuZG9tUHJvcHMgPSB7fSlcbiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FtZWxpemVkS2V5ID0gY2FtZWxpemUoa2V5KTtcbiAgICAgICAgdmFyIGh5cGhlbmF0ZWRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgICAgaWYgKCEoY2FtZWxpemVkS2V5IGluIGhhc2gpICYmICEoaHlwaGVuYXRlZEtleSBpbiBoYXNoKSkge1xuICAgICAgICAgIGhhc2hba2V5XSA9IHZhbHVlW2tleV07XG5cbiAgICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgICB2YXIgb24gPSBkYXRhLm9uIHx8IChkYXRhLm9uID0ge30pO1xuICAgICAgICAgICAgb25bKFwidXBkYXRlOlwiICsga2V5KV0gPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclN0YXRpYyAoXG4gIGluZGV4LFxuICBpc0luRm9yXG4pIHtcbiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTtcbiAgdmFyIHRyZWUgPSBjYWNoZWRbaW5kZXhdO1xuICAvLyBpZiBoYXMgYWxyZWFkeS1yZW5kZXJlZCBzdGF0aWMgdHJlZSBhbmQgbm90IGluc2lkZSB2LWZvcixcbiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuXG4gIGlmICh0cmVlICYmICFpc0luRm9yKSB7XG4gICAgcmV0dXJuIHRyZWVcbiAgfVxuICAvLyBvdGhlcndpc2UsIHJlbmRlciBhIGZyZXNoIHRyZWUuXG4gIHRyZWUgPSBjYWNoZWRbaW5kZXhdID0gdGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbaW5kZXhdLmNhbGwoXG4gICAgdGhpcy5fcmVuZGVyUHJveHksXG4gICAgbnVsbCxcbiAgICB0aGlzIC8vIGZvciByZW5kZXIgZm5zIGdlbmVyYXRlZCBmb3IgZnVuY3Rpb25hbCBjb21wb25lbnQgdGVtcGxhdGVzXG4gICk7XG4gIG1hcmtTdGF0aWModHJlZSwgKFwiX19zdGF0aWNfX1wiICsgaW5kZXgpLCBmYWxzZSk7XG4gIHJldHVybiB0cmVlXG59XG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHYtb25jZS5cbiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LlxuICovXG5mdW5jdGlvbiBtYXJrT25jZSAoXG4gIHRyZWUsXG4gIGluZGV4LFxuICBrZXlcbikge1xuICBtYXJrU3RhdGljKHRyZWUsIChcIl9fb25jZV9fXCIgKyBpbmRleCArIChrZXkgPyAoXCJfXCIgKyBrZXkpIDogXCJcIikpLCB0cnVlKTtcbiAgcmV0dXJuIHRyZWVcbn1cblxuZnVuY3Rpb24gbWFya1N0YXRpYyAoXG4gIHRyZWUsXG4gIGtleSxcbiAgaXNPbmNlXG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHJlZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykge1xuICAgICAgICBtYXJrU3RhdGljTm9kZSh0cmVlW2ldLCAoa2V5ICsgXCJfXCIgKyBpKSwgaXNPbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWFya1N0YXRpY05vZGUodHJlZSwga2V5LCBpc09uY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGF0aWNOb2RlIChub2RlLCBrZXksIGlzT25jZSkge1xuICBub2RlLmlzU3RhdGljID0gdHJ1ZTtcbiAgbm9kZS5rZXkgPSBrZXk7XG4gIG5vZGUuaXNPbmNlID0gaXNPbmNlO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gYmluZE9iamVjdExpc3RlbmVycyAoZGF0YSwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9uID0gZGF0YS5vbiA9IGRhdGEub24gPyBleHRlbmQoe30sIGRhdGEub24pIDoge307XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTtcbiAgICAgICAgdmFyIG91cnMgPSB2YWx1ZVtrZXldO1xuICAgICAgICBvbltrZXldID0gZXhpc3RpbmcgPyBbXS5jb25jYXQoZXhpc3RpbmcsIG91cnMpIDogb3VycztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRTbG90cyAoXG4gIGZucywgLy8gc2VlIGZsb3cvdm5vZGVcbiAgcmVzLFxuICAvLyB0aGUgZm9sbG93aW5nIGFyZSBhZGRlZCBpbiAyLjZcbiAgaGFzRHluYW1pY0tleXMsXG4gIGNvbnRlbnRIYXNoS2V5XG4pIHtcbiAgcmVzID0gcmVzIHx8IHsgJHN0YWJsZTogIWhhc0R5bmFtaWNLZXlzIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNsb3QgPSBmbnNbaV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2xvdCkpIHtcbiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhzbG90LCByZXMsIGhhc0R5bmFtaWNLZXlzKTtcbiAgICB9IGVsc2UgaWYgKHNsb3QpIHtcbiAgICAgIC8vIG1hcmtlciBmb3IgcmV2ZXJzZSBwcm94eWluZyB2LXNsb3Qgd2l0aG91dCBzY29wZSBvbiB0aGlzLiRzbG90c1xuICAgICAgaWYgKHNsb3QucHJveHkpIHtcbiAgICAgICAgc2xvdC5mbi5wcm94eSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXNbc2xvdC5rZXldID0gc2xvdC5mbjtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbnRlbnRIYXNoS2V5KSB7XG4gICAgKHJlcykuJGtleSA9IGNvbnRlbnRIYXNoS2V5O1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGJpbmREeW5hbWljS2V5cyAoYmFzZU9iaiwgdmFsdWVzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGtleSA9IHZhbHVlc1tpXTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5KSB7XG4gICAgICBiYXNlT2JqW3ZhbHVlc1tpXV0gPSB2YWx1ZXNbaSArIDFdO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBrZXkgIT09ICcnICYmIGtleSAhPT0gbnVsbCkge1xuICAgICAgLy8gbnVsbCBpcyBhIHNwZWNpYWwgdmFsdWUgZm9yIGV4cGxpY2l0bHkgcmVtb3ZpbmcgYSBiaW5kaW5nXG4gICAgICB3YXJuKFxuICAgICAgICAoXCJJbnZhbGlkIHZhbHVlIGZvciBkeW5hbWljIGRpcmVjdGl2ZSBhcmd1bWVudCAoZXhwZWN0ZWQgc3RyaW5nIG9yIG51bGwpOiBcIiArIGtleSksXG4gICAgICAgIHRoaXNcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiYXNlT2JqXG59XG5cbi8vIGhlbHBlciB0byBkeW5hbWljYWxseSBhcHBlbmQgbW9kaWZpZXIgcnVudGltZSBtYXJrZXJzIHRvIGV2ZW50IG5hbWVzLlxuLy8gZW5zdXJlIG9ubHkgYXBwZW5kIHdoZW4gdmFsdWUgaXMgYWxyZWFkeSBzdHJpbmcsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGNhc3Rcbi8vIHRvIHN0cmluZyBhbmQgY2F1c2UgdGhlIHR5cGUgY2hlY2sgdG8gbWlzcy5cbmZ1bmN0aW9uIHByZXBlbmRNb2RpZmllciAodmFsdWUsIHN5bWJvbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHN5bWJvbCArIHZhbHVlIDogdmFsdWVcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluc3RhbGxSZW5kZXJIZWxwZXJzICh0YXJnZXQpIHtcbiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7XG4gIHRhcmdldC5fbiA9IHRvTnVtYmVyO1xuICB0YXJnZXQuX3MgPSB0b1N0cmluZztcbiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDtcbiAgdGFyZ2V0Ll90ID0gcmVuZGVyU2xvdDtcbiAgdGFyZ2V0Ll9xID0gbG9vc2VFcXVhbDtcbiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mO1xuICB0YXJnZXQuX20gPSByZW5kZXJTdGF0aWM7XG4gIHRhcmdldC5fZiA9IHJlc29sdmVGaWx0ZXI7XG4gIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7XG4gIHRhcmdldC5fYiA9IGJpbmRPYmplY3RQcm9wcztcbiAgdGFyZ2V0Ll92ID0gY3JlYXRlVGV4dFZOb2RlO1xuICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICB0YXJnZXQuX3UgPSByZXNvbHZlU2NvcGVkU2xvdHM7XG4gIHRhcmdldC5fZyA9IGJpbmRPYmplY3RMaXN0ZW5lcnM7XG4gIHRhcmdldC5fZCA9IGJpbmREeW5hbWljS2V5cztcbiAgdGFyZ2V0Ll9wID0gcHJlcGVuZE1vZGlmaWVyO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgKFxuICBkYXRhLFxuICBwcm9wcyxcbiAgY2hpbGRyZW4sXG4gIHBhcmVudCxcbiAgQ3RvclxuKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zO1xuICAvLyBlbnN1cmUgdGhlIGNyZWF0ZUVsZW1lbnQgZnVuY3Rpb24gaW4gZnVuY3Rpb25hbCBjb21wb25lbnRzXG4gIC8vIGdldHMgYSB1bmlxdWUgY29udGV4dCAtIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBjb3JyZWN0IG5hbWVkIHNsb3QgY2hlY2tcbiAgdmFyIGNvbnRleHRWbTtcbiAgaWYgKGhhc093bihwYXJlbnQsICdfdWlkJykpIHtcbiAgICBjb250ZXh0Vm0gPSBPYmplY3QuY3JlYXRlKHBhcmVudCk7XG4gICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgY29udGV4dFZtLl9vcmlnaW5hbCA9IHBhcmVudDtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC5cbiAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgYXJlIGFibGUgdG8gZ2V0IGEgaG9sZCB0byB0aGVcbiAgICAvLyByZWFsIGNvbnRleHQgaW5zdGFuY2UuXG4gICAgY29udGV4dFZtID0gcGFyZW50O1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHBhcmVudCA9IHBhcmVudC5fb3JpZ2luYWw7XG4gIH1cbiAgdmFyIGlzQ29tcGlsZWQgPSBpc1RydWUob3B0aW9ucy5fY29tcGlsZWQpO1xuICB2YXIgbmVlZE5vcm1hbGl6YXRpb24gPSAhaXNDb21waWxlZDtcblxuICB0aGlzLmRhdGEgPSBkYXRhO1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMubGlzdGVuZXJzID0gZGF0YS5vbiB8fCBlbXB0eU9iamVjdDtcbiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTtcbiAgdGhpcy5zbG90cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMkMS4kc2xvdHMpIHtcbiAgICAgIG5vcm1hbGl6ZVNjb3BlZFNsb3RzKFxuICAgICAgICBkYXRhLnNjb3BlZFNsb3RzLFxuICAgICAgICB0aGlzJDEuJHNsb3RzID0gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcyQxLiRzbG90c1xuICB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2NvcGVkU2xvdHMnLCAoe1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVNjb3BlZFNsb3RzKGRhdGEuc2NvcGVkU2xvdHMsIHRoaXMuc2xvdHMoKSlcbiAgICB9XG4gIH0pKTtcblxuICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlXG4gIGlmIChpc0NvbXBpbGVkKSB7XG4gICAgLy8gZXhwb3NpbmcgJG9wdGlvbnMgZm9yIHJlbmRlclN0YXRpYygpXG4gICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgLy8gcHJlLXJlc29sdmUgc2xvdHMgZm9yIHJlbmRlclNsb3QoKVxuICAgIHRoaXMuJHNsb3RzID0gdGhpcy5zbG90cygpO1xuICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gbm9ybWFsaXplU2NvcGVkU2xvdHMoZGF0YS5zY29wZWRTbG90cywgdGhpcy4kc2xvdHMpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuX3Njb3BlSWQpIHtcbiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHtcbiAgICAgIHZhciB2bm9kZSA9IGNyZWF0ZUVsZW1lbnQoY29udGV4dFZtLCBhLCBiLCBjLCBkLCBuZWVkTm9ybWFsaXphdGlvbik7XG4gICAgICBpZiAodm5vZGUgJiYgIUFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7XG4gICAgICAgIHZub2RlLmZuQ29udGV4dCA9IHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2bm9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9O1xuICB9XG59XG5cbmluc3RhbGxSZW5kZXJIZWxwZXJzKEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0LnByb3RvdHlwZSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKFxuICBDdG9yLFxuICBwcm9wc0RhdGEsXG4gIGRhdGEsXG4gIGNvbnRleHRWbSxcbiAgY2hpbGRyZW5cbikge1xuICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9ucztcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7XG4gIGlmIChpc0RlZihwcm9wT3B0aW9ucykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9XG4gICAgaWYgKGlzRGVmKGRhdGEucHJvcHMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEucHJvcHMpOyB9XG4gIH1cblxuICB2YXIgcmVuZGVyQ29udGV4dCA9IG5ldyBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dChcbiAgICBkYXRhLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbnRleHRWbSxcbiAgICBDdG9yXG4gICk7XG5cbiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTtcblxuICBpZiAodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkge1xuICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucywgcmVuZGVyQ29udGV4dClcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkge1xuICAgIHZhciB2bm9kZXMgPSBub3JtYWxpemVDaGlsZHJlbih2bm9kZSkgfHwgW107XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzW2ldID0gY2xvbmVBbmRNYXJrRnVuY3Rpb25hbFJlc3VsdCh2bm9kZXNbaV0sIGRhdGEsIHJlbmRlckNvbnRleHQucGFyZW50LCBvcHRpb25zLCByZW5kZXJDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQgKHZub2RlLCBkYXRhLCBjb250ZXh0Vm0sIG9wdGlvbnMsIHJlbmRlckNvbnRleHQpIHtcbiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWRcbiAgLy8gKGUuZy4gaXQgd2FzIGZyb20gYSBjYWNoZWQgbm9ybWFsIHNsb3QpIHRoZSBmbkNvbnRleHQgY2F1c2VzIG5hbWVkIHNsb3RzXG4gIC8vIHRoYXQgc2hvdWxkIG5vdCBiZSBtYXRjaGVkIHRvIG1hdGNoLlxuICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgY2xvbmUuZm5Db250ZXh0ID0gY29udGV4dFZtO1xuICBjbG9uZS5mbk9wdGlvbnMgPSBvcHRpb25zO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIChjbG9uZS5kZXZ0b29sc01ldGEgPSBjbG9uZS5kZXZ0b29sc01ldGEgfHwge30pLnJlbmRlckNvbnRleHQgPSByZW5kZXJDb250ZXh0O1xuICB9XG4gIGlmIChkYXRhLnNsb3QpIHtcbiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDtcbiAgfVxuICByZXR1cm4gY2xvbmVcbn1cblxuZnVuY3Rpb24gbWVyZ2VQcm9wcyAodG8sIGZyb20pIHtcbiAgZm9yICh2YXIga2V5IGluIGZyb20pIHtcbiAgICB0b1tjYW1lbGl6ZShrZXkpXSA9IGZyb21ba2V5XTtcbiAgfVxufVxuXG4vKiAgKi9cblxuLyogICovXG5cbi8qICAqL1xuXG4vKiAgKi9cblxuLy8gaW5saW5lIGhvb2tzIHRvIGJlIGludm9rZWQgb24gY29tcG9uZW50IFZOb2RlcyBkdXJpbmcgcGF0Y2hcbnZhciBjb21wb25lbnRWTm9kZUhvb2tzID0ge1xuICBpbml0OiBmdW5jdGlvbiBpbml0ICh2bm9kZSwgaHlkcmF0aW5nKSB7XG4gICAgaWYgKFxuICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgJiZcbiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiZcbiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlXG4gICAgKSB7XG4gICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2hcbiAgICAgIHZhciBtb3VudGVkTm9kZSA9IHZub2RlOyAvLyB3b3JrIGFyb3VuZCBmbG93XG4gICAgICBjb21wb25lbnRWTm9kZUhvb2tzLnByZXBhdGNoKG1vdW50ZWROb2RlLCBtb3VudGVkTm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VGb3JWbm9kZShcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGFjdGl2ZUluc3RhbmNlXG4gICAgICApO1xuICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTtcbiAgICB9XG4gIH0sXG5cbiAgcHJlcGF0Y2g6IGZ1bmN0aW9uIHByZXBhdGNoIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICB1cGRhdGVDaGlsZENvbXBvbmVudChcbiAgICAgIGNoaWxkLFxuICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHNcbiAgICAgIG9wdGlvbnMubGlzdGVuZXJzLCAvLyB1cGRhdGVkIGxpc3RlbmVyc1xuICAgICAgdm5vZGUsIC8vIG5ldyBwYXJlbnQgdm5vZGVcbiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuXG4gICAgKTtcbiAgfSxcblxuICBpbnNlcnQ6IGZ1bmN0aW9uIGluc2VydCAodm5vZGUpIHtcbiAgICB2YXIgY29udGV4dCA9IHZub2RlLmNvbnRleHQ7XG4gICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNNb3VudGVkKSB7XG4gICAgICBjb21wb25lbnRJbnN0YW5jZS5faXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnbW91bnRlZCcpO1xuICAgIH1cbiAgICBpZiAodm5vZGUuZGF0YS5rZWVwQWxpdmUpIHtcbiAgICAgIGlmIChjb250ZXh0Ll9pc01vdW50ZWQpIHtcbiAgICAgICAgLy8gdnVlLXJvdXRlciMxMjEyXG4gICAgICAgIC8vIER1cmluZyB1cGRhdGVzLCBhIGtlcHQtYWxpdmUgY29tcG9uZW50J3MgY2hpbGQgY29tcG9uZW50cyBtYXlcbiAgICAgICAgLy8gY2hhbmdlLCBzbyBkaXJlY3RseSB3YWxraW5nIHRoZSB0cmVlIGhlcmUgbWF5IGNhbGwgYWN0aXZhdGVkIGhvb2tzXG4gICAgICAgIC8vIG9uIGluY29ycmVjdCBjaGlsZHJlbi4gSW5zdGVhZCB3ZSBwdXNoIHRoZW0gaW50byBhIHF1ZXVlIHdoaWNoIHdpbGxcbiAgICAgICAgLy8gYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSB3aG9sZSBwYXRjaCBwcm9jZXNzIGVuZGVkLlxuICAgICAgICBxdWV1ZUFjdGl2YXRlZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3kgKHZub2RlKSB7XG4gICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHtcbiAgICAgIGlmICghdm5vZGUuZGF0YS5rZWVwQWxpdmUpIHtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuJGRlc3Ryb3koKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxudmFyIGhvb2tzVG9NZXJnZSA9IE9iamVjdC5rZXlzKGNvbXBvbmVudFZOb2RlSG9va3MpO1xuXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKFxuICBDdG9yLFxuICBkYXRhLFxuICBjb250ZXh0LFxuICBjaGlsZHJlbixcbiAgdGFnXG4pIHtcbiAgaWYgKGlzVW5kZWYoQ3RvcikpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBiYXNlQ3RvciA9IGNvbnRleHQuJG9wdGlvbnMuX2Jhc2U7XG5cbiAgLy8gcGxhaW4gb3B0aW9ucyBvYmplY3Q6IHR1cm4gaXQgaW50byBhIGNvbnN0cnVjdG9yXG4gIGlmIChpc09iamVjdChDdG9yKSkge1xuICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7XG4gIH1cblxuICAvLyBpZiBhdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGEgY29uc3RydWN0b3Igb3IgYW4gYXN5bmMgY29tcG9uZW50IGZhY3RvcnksXG4gIC8vIHJlamVjdC5cbiAgaWYgKHR5cGVvZiBDdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oKFwiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogXCIgKyAoU3RyaW5nKEN0b3IpKSksIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIGFzeW5jIGNvbXBvbmVudFxuICB2YXIgYXN5bmNGYWN0b3J5O1xuICBpZiAoaXNVbmRlZihDdG9yLmNpZCkpIHtcbiAgICBhc3luY0ZhY3RvcnkgPSBDdG9yO1xuICAgIEN0b3IgPSByZXNvbHZlQXN5bmNDb21wb25lbnQoYXN5bmNGYWN0b3J5LCBiYXNlQ3Rvcik7XG4gICAgaWYgKEN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYXN5bmMgY29tcG9uZW50LCB3aGljaCBpcyByZW5kZXJlZFxuICAgICAgLy8gYXMgYSBjb21tZW50IG5vZGUgYnV0IHByZXNlcnZlcyBhbGwgdGhlIHJhdyBpbmZvcm1hdGlvbiBmb3IgdGhlIG5vZGUuXG4gICAgICAvLyB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGZvciBhc3luYyBzZXJ2ZXItcmVuZGVyaW5nIGFuZCBoeWRyYXRpb24uXG4gICAgICByZXR1cm4gY3JlYXRlQXN5bmNQbGFjZWhvbGRlcihcbiAgICAgICAgYXN5bmNGYWN0b3J5LFxuICAgICAgICBkYXRhLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgdGFnXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgZGF0YSA9IGRhdGEgfHwge307XG5cbiAgLy8gcmVzb2x2ZSBjb25zdHJ1Y3RvciBvcHRpb25zIGluIGNhc2UgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZCBhZnRlclxuICAvLyBjb21wb25lbnQgY29uc3RydWN0b3IgY3JlYXRpb25cbiAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyhDdG9yKTtcblxuICAvLyB0cmFuc2Zvcm0gY29tcG9uZW50IHYtbW9kZWwgZGF0YSBpbnRvIHByb3BzICYgZXZlbnRzXG4gIGlmIChpc0RlZihkYXRhLm1vZGVsKSkge1xuICAgIHRyYW5zZm9ybU1vZGVsKEN0b3Iub3B0aW9ucywgZGF0YSk7XG4gIH1cblxuICAvLyBleHRyYWN0IHByb3BzXG4gIHZhciBwcm9wc0RhdGEgPSBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhKGRhdGEsIEN0b3IsIHRhZyk7XG5cbiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnRcbiAgaWYgKGlzVHJ1ZShDdG9yLm9wdGlvbnMuZnVuY3Rpb25hbCkpIHtcbiAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb25hbENvbXBvbmVudChDdG9yLCBwcm9wc0RhdGEsIGRhdGEsIGNvbnRleHQsIGNoaWxkcmVuKVxuICB9XG5cbiAgLy8gZXh0cmFjdCBsaXN0ZW5lcnMsIHNpbmNlIHRoZXNlIG5lZWRzIHRvIGJlIHRyZWF0ZWQgYXNcbiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnNcbiAgdmFyIGxpc3RlbmVycyA9IGRhdGEub247XG4gIC8vIHJlcGxhY2Ugd2l0aCBsaXN0ZW5lcnMgd2l0aCAubmF0aXZlIG1vZGlmaWVyXG4gIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLlxuICBkYXRhLm9uID0gZGF0YS5uYXRpdmVPbjtcblxuICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHtcbiAgICAvLyBhYnN0cmFjdCBjb21wb25lbnRzIGRvIG5vdCBrZWVwIGFueXRoaW5nXG4gICAgLy8gb3RoZXIgdGhhbiBwcm9wcyAmIGxpc3RlbmVycyAmIHNsb3RcblxuICAgIC8vIHdvcmsgYXJvdW5kIGZsb3dcbiAgICB2YXIgc2xvdCA9IGRhdGEuc2xvdDtcbiAgICBkYXRhID0ge307XG4gICAgaWYgKHNsb3QpIHtcbiAgICAgIGRhdGEuc2xvdCA9IHNsb3Q7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlXG4gIGluc3RhbGxDb21wb25lbnRIb29rcyhkYXRhKTtcblxuICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZVxuICB2YXIgbmFtZSA9IEN0b3Iub3B0aW9ucy5uYW1lIHx8IHRhZztcbiAgdmFyIHZub2RlID0gbmV3IFZOb2RlKFxuICAgIChcInZ1ZS1jb21wb25lbnQtXCIgKyAoQ3Rvci5jaWQpICsgKG5hbWUgPyAoXCItXCIgKyBuYW1lKSA6ICcnKSksXG4gICAgZGF0YSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dCxcbiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LFxuICAgIGFzeW5jRmFjdG9yeVxuICApO1xuXG4gIHJldHVybiB2bm9kZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlIChcbiAgdm5vZGUsIC8vIHdlIGtub3cgaXQncyBNb3VudGVkQ29tcG9uZW50Vk5vZGUgYnV0IGZsb3cgZG9lc24ndFxuICBwYXJlbnQgLy8gYWN0aXZlSW5zdGFuY2UgaW4gbGlmZWN5Y2xlIHN0YXRlXG4pIHtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgX2lzQ29tcG9uZW50OiB0cnVlLFxuICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsXG4gICAgcGFyZW50OiBwYXJlbnRcbiAgfTtcbiAgLy8gY2hlY2sgaW5saW5lLXRlbXBsYXRlIHJlbmRlciBmdW5jdGlvbnNcbiAgdmFyIGlubGluZVRlbXBsYXRlID0gdm5vZGUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtcbiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkge1xuICAgIG9wdGlvbnMucmVuZGVyID0gaW5saW5lVGVtcGxhdGUucmVuZGVyO1xuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gaW5saW5lVGVtcGxhdGUuc3RhdGljUmVuZGVyRm5zO1xuICB9XG4gIHJldHVybiBuZXcgdm5vZGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGluc3RhbGxDb21wb25lbnRIb29rcyAoZGF0YSkge1xuICB2YXIgaG9va3MgPSBkYXRhLmhvb2sgfHwgKGRhdGEuaG9vayA9IHt9KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gaG9va3NUb01lcmdlW2ldO1xuICAgIHZhciBleGlzdGluZyA9IGhvb2tzW2tleV07XG4gICAgdmFyIHRvTWVyZ2UgPSBjb21wb25lbnRWTm9kZUhvb2tzW2tleV07XG4gICAgaWYgKGV4aXN0aW5nICE9PSB0b01lcmdlICYmICEoZXhpc3RpbmcgJiYgZXhpc3RpbmcuX21lcmdlZCkpIHtcbiAgICAgIGhvb2tzW2tleV0gPSBleGlzdGluZyA/IG1lcmdlSG9vayQxKHRvTWVyZ2UsIGV4aXN0aW5nKSA6IHRvTWVyZ2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlSG9vayQxIChmMSwgZjIpIHtcbiAgdmFyIG1lcmdlZCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgLy8gZmxvdyBjb21wbGFpbnMgYWJvdXQgZXh0cmEgYXJncyB3aGljaCBpcyB3aHkgd2UgdXNlIGFueVxuICAgIGYxKGEsIGIpO1xuICAgIGYyKGEsIGIpO1xuICB9O1xuICBtZXJnZWQuX21lcmdlZCA9IHRydWU7XG4gIHJldHVybiBtZXJnZWRcbn1cblxuLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50b1xuLy8gcHJvcCBhbmQgZXZlbnQgaGFuZGxlciByZXNwZWN0aXZlbHkuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Nb2RlbCAob3B0aW9ucywgZGF0YSkge1xuICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJztcbiAgdmFyIGV2ZW50ID0gKG9wdGlvbnMubW9kZWwgJiYgb3B0aW9ucy5tb2RlbC5ldmVudCkgfHwgJ2lucHV0J1xuICA7KGRhdGEuYXR0cnMgfHwgKGRhdGEuYXR0cnMgPSB7fSkpW3Byb3BdID0gZGF0YS5tb2RlbC52YWx1ZTtcbiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTtcbiAgdmFyIGV4aXN0aW5nID0gb25bZXZlbnRdO1xuICB2YXIgY2FsbGJhY2sgPSBkYXRhLm1vZGVsLmNhbGxiYWNrO1xuICBpZiAoaXNEZWYoZXhpc3RpbmcpKSB7XG4gICAgaWYgKFxuICAgICAgQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyBleGlzdGluZy5pbmRleE9mKGNhbGxiYWNrKSA9PT0gLTFcbiAgICAgICAgOiBleGlzdGluZyAhPT0gY2FsbGJhY2tcbiAgICApIHtcbiAgICAgIG9uW2V2ZW50XSA9IFtjYWxsYmFja10uY29uY2F0KGV4aXN0aW5nKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb25bZXZlbnRdID0gY2FsbGJhY2s7XG4gIH1cbn1cblxuLyogICovXG5cbnZhciBTSU1QTEVfTk9STUFMSVpFID0gMTtcbnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjtcblxuLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgcHJvdmlkaW5nIGEgbW9yZSBmbGV4aWJsZSBpbnRlcmZhY2Vcbi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvd1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCAoXG4gIGNvbnRleHQsXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIG5vcm1hbGl6YXRpb25UeXBlLFxuICBhbHdheXNOb3JtYWxpemVcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgIG5vcm1hbGl6YXRpb25UeXBlID0gY2hpbGRyZW47XG4gICAgY2hpbGRyZW4gPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGlzVHJ1ZShhbHdheXNOb3JtYWxpemUpKSB7XG4gICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFO1xuICB9XG4gIHJldHVybiBfY3JlYXRlRWxlbWVudChjb250ZXh0LCB0YWcsIGRhdGEsIGNoaWxkcmVuLCBub3JtYWxpemF0aW9uVHlwZSlcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUVsZW1lbnQgKFxuICBjb250ZXh0LFxuICB0YWcsXG4gIGRhdGEsXG4gIGNoaWxkcmVuLFxuICBub3JtYWxpemF0aW9uVHlwZVxuKSB7XG4gIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgIFwiQXZvaWQgdXNpbmcgb2JzZXJ2ZWQgZGF0YSBvYmplY3QgYXMgdm5vZGUgZGF0YTogXCIgKyAoSlNPTi5zdHJpbmdpZnkoZGF0YSkpICsgXCJcXG5cIiArXG4gICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJyxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyBvYmplY3Qgc3ludGF4IGluIHYtYmluZFxuICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHtcbiAgICB0YWcgPSBkYXRhLmlzO1xuICB9XG4gIGlmICghdGFnKSB7XG4gICAgLy8gaW4gY2FzZSBvZiBjb21wb25lbnQgOmlzIHNldCB0byBmYWxzeSB2YWx1ZVxuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyB3YXJuIGFnYWluc3Qgbm9uLXByaW1pdGl2ZSBrZXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICBpc0RlZihkYXRhKSAmJiBpc0RlZihkYXRhLmtleSkgJiYgIWlzUHJpbWl0aXZlKGRhdGEua2V5KVxuICApIHtcbiAgICB7XG4gICAgICB3YXJuKFxuICAgICAgICAnQXZvaWQgdXNpbmcgbm9uLXByaW1pdGl2ZSB2YWx1ZSBhcyBrZXksICcgK1xuICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLFxuICAgICAgICBjb250ZXh0XG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvLyBzdXBwb3J0IHNpbmdsZSBmdW5jdGlvbiBjaGlsZHJlbiBhcyBkZWZhdWx0IHNjb3BlZCBzbG90XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJlxuICAgIHR5cGVvZiBjaGlsZHJlblswXSA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLnNjb3BlZFNsb3RzID0geyBkZWZhdWx0OiBjaGlsZHJlblswXSB9O1xuICAgIGNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgaWYgKG5vcm1hbGl6YXRpb25UeXBlID09PSBBTFdBWVNfTk9STUFMSVpFKSB7XG4gICAgY2hpbGRyZW4gPSBub3JtYWxpemVDaGlsZHJlbihjaGlsZHJlbik7XG4gIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHtcbiAgICBjaGlsZHJlbiA9IHNpbXBsZU5vcm1hbGl6ZUNoaWxkcmVuKGNoaWxkcmVuKTtcbiAgfVxuICB2YXIgdm5vZGUsIG5zO1xuICBpZiAodHlwZW9mIHRhZyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgQ3RvcjtcbiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpO1xuICAgIGlmIChjb25maWcuaXNSZXNlcnZlZFRhZyh0YWcpKSB7XG4gICAgICAvLyBwbGF0Zm9ybSBidWlsdC1pbiBlbGVtZW50c1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5uYXRpdmVPbikpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJUaGUgLm5hdGl2ZSBtb2RpZmllciBmb3Igdi1vbiBpcyBvbmx5IHZhbGlkIG9uIGNvbXBvbmVudHMgYnV0IGl0IHdhcyB1c2VkIG9uIDxcIiArIHRhZyArIFwiPi5cIiksXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoXG4gICAgICAgIGNvbmZpZy5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0YWcpLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICgoIWRhdGEgfHwgIWRhdGEucHJlKSAmJiBpc0RlZihDdG9yID0gcmVzb2x2ZUFzc2V0KGNvbnRleHQuJG9wdGlvbnMsICdjb21wb25lbnRzJywgdGFnKSkpIHtcbiAgICAgIC8vIGNvbXBvbmVudFxuICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVua25vd24gb3IgdW5saXN0ZWQgbmFtZXNwYWNlZCBlbGVtZW50c1xuICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHNcbiAgICAgIC8vIHBhcmVudCBub3JtYWxpemVzIGNoaWxkcmVuXG4gICAgICB2bm9kZSA9IG5ldyBWTm9kZShcbiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGRpcmVjdCBjb21wb25lbnQgb3B0aW9ucyAvIGNvbnN0cnVjdG9yXG4gICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgcmV0dXJuIHZub2RlXG4gIH0gZWxzZSBpZiAoaXNEZWYodm5vZGUpKSB7XG4gICAgaWYgKGlzRGVmKG5zKSkgeyBhcHBseU5TKHZub2RlLCBucyk7IH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH1cbiAgICByZXR1cm4gdm5vZGVcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlOUyAodm5vZGUsIG5zLCBmb3JjZSkge1xuICB2bm9kZS5ucyA9IG5zO1xuICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyB1c2UgZGVmYXVsdCBuYW1lc3BhY2UgaW5zaWRlIGZvcmVpZ25PYmplY3RcbiAgICBucyA9IHVuZGVmaW5lZDtcbiAgICBmb3JjZSA9IHRydWU7XG4gIH1cbiAgaWYgKGlzRGVmKHZub2RlLmNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSB2bm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChpc0RlZihjaGlsZC50YWcpICYmIChcbiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7XG4gICAgICAgIGFwcGx5TlMoY2hpbGQsIG5zLCBmb3JjZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIHJlZiAjNTMxOFxuLy8gbmVjZXNzYXJ5IHRvIGVuc3VyZSBwYXJlbnQgcmUtcmVuZGVyIHdoZW4gZGVlcCBiaW5kaW5ncyBsaWtlIDpzdHlsZSBhbmRcbi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzXG5mdW5jdGlvbiByZWdpc3RlckRlZXBCaW5kaW5ncyAoZGF0YSkge1xuICBpZiAoaXNPYmplY3QoZGF0YS5zdHlsZSkpIHtcbiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTtcbiAgfVxuICBpZiAoaXNPYmplY3QoZGF0YS5jbGFzcykpIHtcbiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTtcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHtcbiAgdm0uX3Zub2RlID0gbnVsbDsgLy8gdGhlIHJvb3Qgb2YgdGhlIGNoaWxkIHRyZWVcbiAgdm0uX3N0YXRpY1RyZWVzID0gbnVsbDsgLy8gdi1vbmNlIGNhY2hlZCB0cmVlc1xuICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zO1xuICB2YXIgcGFyZW50Vm5vZGUgPSB2bS4kdm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsgLy8gdGhlIHBsYWNlaG9sZGVyIG5vZGUgaW4gcGFyZW50IHRyZWVcbiAgdmFyIHJlbmRlckNvbnRleHQgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5jb250ZXh0O1xuICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpO1xuICB2bS4kc2NvcGVkU2xvdHMgPSBlbXB0eU9iamVjdDtcbiAgLy8gYmluZCB0aGUgY3JlYXRlRWxlbWVudCBmbiB0byB0aGlzIGluc3RhbmNlXG4gIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuXG4gIC8vIGFyZ3Mgb3JkZXI6IHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcbiAgLy8gaW50ZXJuYWwgdmVyc2lvbiBpcyB1c2VkIGJ5IHJlbmRlciBmdW5jdGlvbnMgY29tcGlsZWQgZnJvbSB0ZW1wbGF0ZXNcbiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9O1xuICAvLyBub3JtYWxpemF0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIGZvciB0aGUgcHVibGljIHZlcnNpb24sIHVzZWQgaW5cbiAgLy8gdXNlci13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMuXG4gIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9O1xuXG4gIC8vICRhdHRycyAmICRsaXN0ZW5lcnMgYXJlIGV4cG9zZWQgZm9yIGVhc2llciBIT0MgY3JlYXRpb24uXG4gIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWRcbiAgdmFyIHBhcmVudERhdGEgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5kYXRhO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgJiYgd2FybihcIiRhdHRycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGxpc3RlbmVycycsIG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyB8fCBlbXB0eU9iamVjdCwgZnVuY3Rpb24gKCkge1xuICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKFwiJGxpc3RlbmVycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGF0dHJzJywgcGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLmF0dHJzIHx8IGVtcHR5T2JqZWN0LCBudWxsLCB0cnVlKTtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIG51bGwsIHRydWUpO1xuICB9XG59XG5cbnZhciBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPSBudWxsO1xuXG5mdW5jdGlvbiByZW5kZXJNaXhpbiAoVnVlKSB7XG4gIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzXG4gIGluc3RhbGxSZW5kZXJIZWxwZXJzKFZ1ZS5wcm90b3R5cGUpO1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgcmV0dXJuIG5leHRUaWNrKGZuLCB0aGlzKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuX3JlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIHZhciByZWYgPSB2bS4kb3B0aW9ucztcbiAgICB2YXIgcmVuZGVyID0gcmVmLnJlbmRlcjtcbiAgICB2YXIgX3BhcmVudFZub2RlID0gcmVmLl9wYXJlbnRWbm9kZTtcblxuICAgIGlmIChfcGFyZW50Vm5vZGUpIHtcbiAgICAgIHZtLiRzY29wZWRTbG90cyA9IG5vcm1hbGl6ZVNjb3BlZFNsb3RzKFxuICAgICAgICBfcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyxcbiAgICAgICAgdm0uJHNsb3RzLFxuICAgICAgICB2bS4kc2NvcGVkU2xvdHNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2Vzc1xuICAgIC8vIHRvIHRoZSBkYXRhIG9uIHRoZSBwbGFjZWhvbGRlciBub2RlLlxuICAgIHZtLiR2bm9kZSA9IF9wYXJlbnRWbm9kZTtcbiAgICAvLyByZW5kZXIgc2VsZlxuICAgIHZhciB2bm9kZTtcbiAgICB0cnkge1xuICAgICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIG1haW50YWluIGEgc3RhY2sgYmVjYXVzZSBhbGwgcmVuZGVyIGZucyBhcmUgY2FsbGVkXG4gICAgICAvLyBzZXBhcmF0ZWx5IGZyb20gb25lIGFub3RoZXIuIE5lc3RlZCBjb21wb25lbnQncyByZW5kZXIgZm5zIGFyZSBjYWxsZWRcbiAgICAgIC8vIHdoZW4gcGFyZW50IGNvbXBvbmVudCBpcyBwYXRjaGVkLlxuICAgICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gdm07XG4gICAgICB2bm9kZSA9IHJlbmRlci5jYWxsKHZtLl9yZW5kZXJQcm94eSwgdm0uJGNyZWF0ZUVsZW1lbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcInJlbmRlclwiKTtcbiAgICAgIC8vIHJldHVybiBlcnJvciByZW5kZXIgcmVzdWx0LFxuICAgICAgLy8gb3IgcHJldmlvdXMgdm5vZGUgdG8gcHJldmVudCByZW5kZXIgZXJyb3IgY2F1c2luZyBibGFuayBjb21wb25lbnRcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB2bS4kb3B0aW9ucy5yZW5kZXJFcnJvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcInJlbmRlckVycm9yXCIpO1xuICAgICAgICAgIHZub2RlID0gdm0uX3Zub2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gICAgLy8gaWYgdGhlIHJldHVybmVkIGFycmF5IGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUgbm9kZSwgYWxsb3cgaXRcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2bm9kZSkgJiYgdm5vZGUubGVuZ3RoID09PSAxKSB7XG4gICAgICB2bm9kZSA9IHZub2RlWzBdO1xuICAgIH1cbiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0XG4gICAgaWYgKCEodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ011bHRpcGxlIHJvb3Qgbm9kZXMgcmV0dXJuZWQgZnJvbSByZW5kZXIgZnVuY3Rpb24uIFJlbmRlciBmdW5jdGlvbiAnICtcbiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJyxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdm5vZGUgPSBjcmVhdGVFbXB0eVZOb2RlKCk7XG4gICAgfVxuICAgIC8vIHNldCBwYXJlbnRcbiAgICB2bm9kZS5wYXJlbnQgPSBfcGFyZW50Vm5vZGU7XG4gICAgcmV0dXJuIHZub2RlXG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBlbnN1cmVDdG9yIChjb21wLCBiYXNlKSB7XG4gIGlmIChcbiAgICBjb21wLl9fZXNNb2R1bGUgfHxcbiAgICAoaGFzU3ltYm9sICYmIGNvbXBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ01vZHVsZScpXG4gICkge1xuICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7XG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0KGNvbXApXG4gICAgPyBiYXNlLmV4dGVuZChjb21wKVxuICAgIDogY29tcFxufVxuXG5mdW5jdGlvbiBjcmVhdGVBc3luY1BsYWNlaG9sZGVyIChcbiAgZmFjdG9yeSxcbiAgZGF0YSxcbiAgY29udGV4dCxcbiAgY2hpbGRyZW4sXG4gIHRhZ1xuKSB7XG4gIHZhciBub2RlID0gY3JlYXRlRW1wdHlWTm9kZSgpO1xuICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7XG4gIG5vZGUuYXN5bmNNZXRhID0geyBkYXRhOiBkYXRhLCBjb250ZXh0OiBjb250ZXh0LCBjaGlsZHJlbjogY2hpbGRyZW4sIHRhZzogdGFnIH07XG4gIHJldHVybiBub2RlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBc3luY0NvbXBvbmVudCAoXG4gIGZhY3RvcnksXG4gIGJhc2VDdG9yXG4pIHtcbiAgaWYgKGlzVHJ1ZShmYWN0b3J5LmVycm9yKSAmJiBpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5lcnJvckNvbXBcbiAgfVxuXG4gIGlmIChpc0RlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkXG4gIH1cblxuICB2YXIgb3duZXIgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gIGlmIChvd25lciAmJiBpc0RlZihmYWN0b3J5Lm93bmVycykgJiYgZmFjdG9yeS5vd25lcnMuaW5kZXhPZihvd25lcikgPT09IC0xKSB7XG4gICAgLy8gYWxyZWFkeSBwZW5kaW5nXG4gICAgZmFjdG9yeS5vd25lcnMucHVzaChvd25lcik7XG4gIH1cblxuICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5sb2FkaW5nQ29tcFxuICB9XG5cbiAgaWYgKG93bmVyICYmICFpc0RlZihmYWN0b3J5Lm93bmVycykpIHtcbiAgICB2YXIgb3duZXJzID0gZmFjdG9yeS5vd25lcnMgPSBbb3duZXJdO1xuICAgIHZhciBzeW5jID0gdHJ1ZTtcbiAgICB2YXIgdGltZXJMb2FkaW5nID0gbnVsbDtcbiAgICB2YXIgdGltZXJUaW1lb3V0ID0gbnVsbFxuXG4gICAgOyhvd25lcikuJG9uKCdob29rOmRlc3Ryb3llZCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlbW92ZShvd25lcnMsIG93bmVyKTsgfSk7XG5cbiAgICB2YXIgZm9yY2VSZW5kZXIgPSBmdW5jdGlvbiAocmVuZGVyQ29tcGxldGVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG93bmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgKG93bmVyc1tpXSkuJGZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW5kZXJDb21wbGV0ZWQpIHtcbiAgICAgICAgb3duZXJzLmxlbmd0aCA9IDA7XG4gICAgICAgIGlmICh0aW1lckxvYWRpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJMb2FkaW5nKTtcbiAgICAgICAgICB0aW1lckxvYWRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lclRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJUaW1lb3V0KTtcbiAgICAgICAgICB0aW1lclRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciByZXNvbHZlID0gb25jZShmdW5jdGlvbiAocmVzKSB7XG4gICAgICAvLyBjYWNoZSByZXNvbHZlZFxuICAgICAgZmFjdG9yeS5yZXNvbHZlZCA9IGVuc3VyZUN0b3IocmVzLCBiYXNlQ3Rvcik7XG4gICAgICAvLyBpbnZva2UgY2FsbGJhY2tzIG9ubHkgaWYgdGhpcyBpcyBub3QgYSBzeW5jaHJvbm91cyByZXNvbHZlXG4gICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUilcbiAgICAgIGlmICghc3luYykge1xuICAgICAgICBmb3JjZVJlbmRlcih0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG93bmVycy5sZW5ndGggPSAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkZhaWxlZCB0byByZXNvbHZlIGFzeW5jIGNvbXBvbmVudDogXCIgKyAoU3RyaW5nKGZhY3RvcnkpKSArXG4gICAgICAgIChyZWFzb24gPyAoXCJcXG5SZWFzb246IFwiICsgcmVhc29uKSA6ICcnKVxuICAgICAgKTtcbiAgICAgIGlmIChpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7XG4gICAgICAgIGZvcmNlUmVuZGVyKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTtcblxuICAgIGlmIChpc09iamVjdChyZXMpKSB7XG4gICAgICBpZiAoaXNQcm9taXNlKHJlcykpIHtcbiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZVxuICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgICAgICAgIHJlcy50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNQcm9taXNlKHJlcy5jb21wb25lbnQpKSB7XG4gICAgICAgIHJlcy5jb21wb25lbnQudGhlbihyZXNvbHZlLCByZWplY3QpO1xuXG4gICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7XG4gICAgICAgICAgZmFjdG9yeS5lcnJvckNvbXAgPSBlbnN1cmVDdG9yKHJlcy5lcnJvciwgYmFzZUN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy5sb2FkaW5nKSkge1xuICAgICAgICAgIGZhY3RvcnkubG9hZGluZ0NvbXAgPSBlbnN1cmVDdG9yKHJlcy5sb2FkaW5nLCBiYXNlQ3Rvcik7XG4gICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkge1xuICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGltZXJMb2FkaW5nID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRpbWVyTG9hZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpICYmIGlzVW5kZWYoZmFjdG9yeS5lcnJvcikpIHtcbiAgICAgICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVzLmRlbGF5IHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy50aW1lb3V0KSkge1xuICAgICAgICAgIHRpbWVyVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGltZXJUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICAgICAgICAgICA/IChcInRpbWVvdXQgKFwiICsgKHJlcy50aW1lb3V0KSArIFwibXMpXCIpXG4gICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCByZXMudGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzeW5jID0gZmFsc2U7XG4gICAgLy8gcmV0dXJuIGluIGNhc2UgcmVzb2x2ZWQgc3luY2hyb25vdXNseVxuICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdcbiAgICAgID8gZmFjdG9yeS5sb2FkaW5nQ29tcFxuICAgICAgOiBmYWN0b3J5LnJlc29sdmVkXG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGlzQXN5bmNQbGFjZWhvbGRlciAobm9kZSkge1xuICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3Rvcnlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGdldEZpcnN0Q29tcG9uZW50Q2hpbGQgKGNoaWxkcmVuKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkge1xuICAgICAgICByZXR1cm4gY1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRFdmVudHMgKHZtKSB7XG4gIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2bS5faGFzSG9va0V2ZW50ID0gZmFsc2U7XG4gIC8vIGluaXQgcGFyZW50IGF0dGFjaGVkIGV2ZW50c1xuICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztcbiAgaWYgKGxpc3RlbmVycykge1xuICAgIHVwZGF0ZUNvbXBvbmVudExpc3RlbmVycyh2bSwgbGlzdGVuZXJzKTtcbiAgfVxufVxuXG52YXIgdGFyZ2V0O1xuXG5mdW5jdGlvbiBhZGQgKGV2ZW50LCBmbikge1xuICB0YXJnZXQuJG9uKGV2ZW50LCBmbik7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHtcbiAgdGFyZ2V0LiRvZmYoZXZlbnQsIGZuKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlT25jZUhhbmRsZXIgKGV2ZW50LCBmbikge1xuICB2YXIgX3RhcmdldCA9IHRhcmdldDtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHtcbiAgICB2YXIgcmVzID0gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICBpZiAocmVzICE9PSBudWxsKSB7XG4gICAgICBfdGFyZ2V0LiRvZmYoZXZlbnQsIG9uY2VIYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzIChcbiAgdm0sXG4gIGxpc3RlbmVycyxcbiAgb2xkTGlzdGVuZXJzXG4pIHtcbiAgdGFyZ2V0ID0gdm07XG4gIHVwZGF0ZUxpc3RlbmVycyhsaXN0ZW5lcnMsIG9sZExpc3RlbmVycyB8fCB7fSwgYWRkLCByZW1vdmUkMSwgY3JlYXRlT25jZUhhbmRsZXIsIHZtKTtcbiAgdGFyZ2V0ID0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7XG4gIHZhciBob29rUkUgPSAvXmhvb2s6LztcbiAgVnVlLnByb3RvdHlwZS4kb24gPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZtLiRvbihldmVudFtpXSwgZm4pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAodm0uX2V2ZW50c1tldmVudF0gfHwgKHZtLl9ldmVudHNbZXZlbnRdID0gW10pKS5wdXNoKGZuKTtcbiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uXG4gICAgICAvLyBpbnN0ZWFkIG9mIGEgaGFzaCBsb29rdXBcbiAgICAgIGlmIChob29rUkUudGVzdChldmVudCkpIHtcbiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2bVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBmdW5jdGlvbiBvbiAoKSB7XG4gICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7XG4gICAgICBmbi5hcHBseSh2bSwgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgb24uZm4gPSBmbjtcbiAgICB2bS4kb24oZXZlbnQsIG9uKTtcbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRvZmYgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICAvLyBhbGxcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgcmV0dXJuIHZtXG4gICAgfVxuICAgIC8vIGFycmF5IG9mIGV2ZW50c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkge1xuICAgICAgZm9yICh2YXIgaSQxID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSQxIDwgbDsgaSQxKyspIHtcbiAgICAgICAgdm0uJG9mZihldmVudFtpJDFdLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKCFjYnMpIHtcbiAgICAgIHJldHVybiB2bVxuICAgIH1cbiAgICBpZiAoIWZuKSB7XG4gICAgICB2bS5fZXZlbnRzW2V2ZW50XSA9IG51bGw7XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgaGFuZGxlclxuICAgIHZhciBjYjtcbiAgICB2YXIgaSA9IGNicy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY2IgPSBjYnNbaV07XG4gICAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgICBjYnMuc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGxvd2VyQ2FzZUV2ZW50ID0gZXZlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChsb3dlckNhc2VFdmVudCAhPT0gZXZlbnQgJiYgdm0uX2V2ZW50c1tsb3dlckNhc2VFdmVudF0pIHtcbiAgICAgICAgdGlwKFxuICAgICAgICAgIFwiRXZlbnQgXFxcIlwiICsgbG93ZXJDYXNlRXZlbnQgKyBcIlxcXCIgaXMgZW1pdHRlZCBpbiBjb21wb25lbnQgXCIgK1xuICAgICAgICAgIChmb3JtYXRDb21wb25lbnROYW1lKHZtKSkgKyBcIiBidXQgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBmb3IgXFxcIlwiICsgZXZlbnQgKyBcIlxcXCIuIFwiICtcbiAgICAgICAgICBcIk5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIFwiICtcbiAgICAgICAgICBcInYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBcIiArXG4gICAgICAgICAgXCJZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcXFwiXCIgKyAoaHlwaGVuYXRlKGV2ZW50KSkgKyBcIlxcXCIgaW5zdGVhZCBvZiBcXFwiXCIgKyBldmVudCArIFwiXFxcIi5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKGNicykge1xuICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7XG4gICAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzLCAxKTtcbiAgICAgIHZhciBpbmZvID0gXCJldmVudCBoYW5kbGVyIGZvciBcXFwiXCIgKyBldmVudCArIFwiXFxcIlwiO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGNic1tpXSwgdm0sIGFyZ3MsIHZtLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZtXG4gIH07XG59XG5cbi8qICAqL1xuXG52YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsO1xudmFyIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBzZXRBY3RpdmVJbnN0YW5jZSh2bSkge1xuICB2YXIgcHJldkFjdGl2ZUluc3RhbmNlID0gYWN0aXZlSW5zdGFuY2U7XG4gIGFjdGl2ZUluc3RhbmNlID0gdm07XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgYWN0aXZlSW5zdGFuY2UgPSBwcmV2QWN0aXZlSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdExpZmVjeWNsZSAodm0pIHtcbiAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcblxuICAvLyBsb2NhdGUgZmlyc3Qgbm9uLWFic3RyYWN0IHBhcmVudFxuICB2YXIgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICB3aGlsZSAocGFyZW50LiRvcHRpb25zLmFic3RyYWN0ICYmIHBhcmVudC4kcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50LiRjaGlsZHJlbi5wdXNoKHZtKTtcbiAgfVxuXG4gIHZtLiRwYXJlbnQgPSBwYXJlbnQ7XG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm07XG5cbiAgdm0uJGNoaWxkcmVuID0gW107XG4gIHZtLiRyZWZzID0ge307XG5cbiAgdm0uX3dhdGNoZXIgPSBudWxsO1xuICB2bS5faW5hY3RpdmUgPSBudWxsO1xuICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTtcbiAgdm0uX2lzTW91bnRlZCA9IGZhbHNlO1xuICB2bS5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkge1xuICBWdWUucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAodm5vZGUsIGh5ZHJhdGluZykge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgdmFyIHByZXZFbCA9IHZtLiRlbDtcbiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlO1xuICAgIHZhciByZXN0b3JlQWN0aXZlSW5zdGFuY2UgPSBzZXRBY3RpdmVJbnN0YW5jZSh2bSk7XG4gICAgdm0uX3Zub2RlID0gdm5vZGU7XG4gICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzXG4gICAgLy8gYmFzZWQgb24gdGhlIHJlbmRlcmluZyBiYWNrZW5kIHVzZWQuXG4gICAgaWYgKCFwcmV2Vm5vZGUpIHtcbiAgICAgIC8vIGluaXRpYWwgcmVuZGVyXG4gICAgICB2bS4kZWwgPSB2bS5fX3BhdGNoX18odm0uJGVsLCB2bm9kZSwgaHlkcmF0aW5nLCBmYWxzZSAvKiByZW1vdmVPbmx5ICovKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXBkYXRlc1xuICAgICAgdm0uJGVsID0gdm0uX19wYXRjaF9fKHByZXZWbm9kZSwgdm5vZGUpO1xuICAgIH1cbiAgICByZXN0b3JlQWN0aXZlSW5zdGFuY2UoKTtcbiAgICAvLyB1cGRhdGUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAocHJldkVsKSB7XG4gICAgICBwcmV2RWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIGlmICh2bS4kZWwpIHtcbiAgICAgIHZtLiRlbC5fX3Z1ZV9fID0gdm07XG4gICAgfVxuICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGxcbiAgICBpZiAodm0uJHZub2RlICYmIHZtLiRwYXJlbnQgJiYgdm0uJHZub2RlID09PSB2bS4kcGFyZW50Ll92bm9kZSkge1xuICAgICAgdm0uJHBhcmVudC4kZWwgPSB2bS4kZWw7XG4gICAgfVxuICAgIC8vIHVwZGF0ZWQgaG9vayBpcyBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlciB0byBlbnN1cmUgdGhhdCBjaGlsZHJlbiBhcmVcbiAgICAvLyB1cGRhdGVkIGluIGEgcGFyZW50J3MgdXBkYXRlZCBob29rLlxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJGZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci51cGRhdGUoKTtcbiAgICB9XG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmICh2bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlRGVzdHJveScpO1xuICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyByZW1vdmUgc2VsZiBmcm9tIHBhcmVudFxuICAgIHZhciBwYXJlbnQgPSB2bS4kcGFyZW50O1xuICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICAgIHJlbW92ZShwYXJlbnQuJGNoaWxkcmVuLCB2bSk7XG4gICAgfVxuICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzXG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci50ZWFyZG93bigpO1xuICAgIH1cbiAgICB2YXIgaSA9IHZtLl93YXRjaGVycy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgZnJvbSBkYXRhIG9iXG4gICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuXG4gICAgaWYgKHZtLl9kYXRhLl9fb2JfXykge1xuICAgICAgdm0uX2RhdGEuX19vYl9fLnZtQ291bnQtLTtcbiAgICB9XG4gICAgLy8gY2FsbCB0aGUgbGFzdCBob29rLi4uXG4gICAgdm0uX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWVcbiAgICB2bS5fX3BhdGNoX18odm0uX3Zub2RlLCBudWxsKTtcbiAgICAvLyBmaXJlIGRlc3Ryb3llZCBob29rXG4gICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTtcbiAgICAvLyB0dXJuIG9mZiBhbGwgaW5zdGFuY2UgbGlzdGVuZXJzLlxuICAgIHZtLiRvZmYoKTtcbiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAodm0uJGVsKSB7XG4gICAgICB2bS4kZWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIC8vIHJlbGVhc2UgY2lyY3VsYXIgcmVmZXJlbmNlICgjNjc1OSlcbiAgICBpZiAodm0uJHZub2RlKSB7XG4gICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vdW50Q29tcG9uZW50IChcbiAgdm0sXG4gIGVsLFxuICBoeWRyYXRpbmdcbikge1xuICB2bS4kZWwgPSBlbDtcbiAgaWYgKCF2bS4kb3B0aW9ucy5yZW5kZXIpIHtcbiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICgodm0uJG9wdGlvbnMudGVtcGxhdGUgJiYgdm0uJG9wdGlvbnMudGVtcGxhdGUuY2hhckF0KDApICE9PSAnIycpIHx8XG4gICAgICAgIHZtLiRvcHRpb25zLmVsIHx8IGVsKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ1lvdSBhcmUgdXNpbmcgdGhlIHJ1bnRpbWUtb25seSBidWlsZCBvZiBWdWUgd2hlcmUgdGhlIHRlbXBsYXRlICcgK1xuICAgICAgICAgICdjb21waWxlciBpcyBub3QgYXZhaWxhYmxlLiBFaXRoZXIgcHJlLWNvbXBpbGUgdGhlIHRlbXBsYXRlcyBpbnRvICcgK1xuICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ0ZhaWxlZCB0byBtb3VudCBjb21wb25lbnQ6IHRlbXBsYXRlIG9yIHJlbmRlciBmdW5jdGlvbiBub3QgZGVmaW5lZC4nLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNhbGxIb29rKHZtLCAnYmVmb3JlTW91bnQnKTtcblxuICB2YXIgdXBkYXRlQ29tcG9uZW50O1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICB1cGRhdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lO1xuICAgICAgdmFyIGlkID0gdm0uX3VpZDtcbiAgICAgIHZhciBzdGFydFRhZyA9IFwidnVlLXBlcmYtc3RhcnQ6XCIgKyBpZDtcbiAgICAgIHZhciBlbmRUYWcgPSBcInZ1ZS1wZXJmLWVuZDpcIiArIGlkO1xuXG4gICAgICBtYXJrKHN0YXJ0VGFnKTtcbiAgICAgIHZhciB2bm9kZSA9IHZtLl9yZW5kZXIoKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgbmFtZSArIFwiIHJlbmRlclwiKSwgc3RhcnRUYWcsIGVuZFRhZyk7XG5cbiAgICAgIG1hcmsoc3RhcnRUYWcpO1xuICAgICAgdm0uX3VwZGF0ZSh2bm9kZSwgaHlkcmF0aW5nKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgbmFtZSArIFwiIHBhdGNoXCIpLCBzdGFydFRhZywgZW5kVGFnKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZUNvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZtLl91cGRhdGUodm0uX3JlbmRlcigpLCBoeWRyYXRpbmcpO1xuICAgIH07XG4gIH1cblxuICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvclxuICAvLyBzaW5jZSB0aGUgd2F0Y2hlcidzIGluaXRpYWwgcGF0Y2ggbWF5IGNhbGwgJGZvcmNlVXBkYXRlIChlLmcuIGluc2lkZSBjaGlsZFxuICAvLyBjb21wb25lbnQncyBtb3VudGVkIGhvb2spLCB3aGljaCByZWxpZXMgb24gdm0uX3dhdGNoZXIgYmVpbmcgYWxyZWFkeSBkZWZpbmVkXG4gIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIHtcbiAgICBiZWZvcmU6IGZ1bmN0aW9uIGJlZm9yZSAoKSB7XG4gICAgICBpZiAodm0uX2lzTW91bnRlZCAmJiAhdm0uX2lzRGVzdHJveWVkKSB7XG4gICAgICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlVXBkYXRlJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB0cnVlIC8qIGlzUmVuZGVyV2F0Y2hlciAqLyk7XG4gIGh5ZHJhdGluZyA9IGZhbHNlO1xuXG4gIC8vIG1hbnVhbGx5IG1vdW50ZWQgaW5zdGFuY2UsIGNhbGwgbW91bnRlZCBvbiBzZWxmXG4gIC8vIG1vdW50ZWQgaXMgY2FsbGVkIGZvciByZW5kZXItY3JlYXRlZCBjaGlsZCBjb21wb25lbnRzIGluIGl0cyBpbnNlcnRlZCBob29rXG4gIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkge1xuICAgIHZtLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgIGNhbGxIb29rKHZtLCAnbW91bnRlZCcpO1xuICB9XG4gIHJldHVybiB2bVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDaGlsZENvbXBvbmVudCAoXG4gIHZtLFxuICBwcm9wc0RhdGEsXG4gIGxpc3RlbmVycyxcbiAgcGFyZW50Vm5vZGUsXG4gIHJlbmRlckNoaWxkcmVuXG4pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgPSB0cnVlO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgY29tcG9uZW50IGhhcyBzbG90IGNoaWxkcmVuXG4gIC8vIHdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgb3ZlcndyaXRpbmcgJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuLlxuXG4gIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBkeW5hbWljIHNjb3BlZFNsb3RzIChoYW5kLXdyaXR0ZW4gb3IgY29tcGlsZWQgYnV0IHdpdGhcbiAgLy8gZHluYW1pYyBzbG90IG5hbWVzKS4gU3RhdGljIHNjb3BlZCBzbG90cyBjb21waWxlZCBmcm9tIHRlbXBsYXRlIGhhcyB0aGVcbiAgLy8gXCIkc3RhYmxlXCIgbWFya2VyLlxuICB2YXIgbmV3U2NvcGVkU2xvdHMgPSBwYXJlbnRWbm9kZS5kYXRhLnNjb3BlZFNsb3RzO1xuICB2YXIgb2xkU2NvcGVkU2xvdHMgPSB2bS4kc2NvcGVkU2xvdHM7XG4gIHZhciBoYXNEeW5hbWljU2NvcGVkU2xvdCA9ICEhKFxuICAgIChuZXdTY29wZWRTbG90cyAmJiAhbmV3U2NvcGVkU2xvdHMuJHN0YWJsZSkgfHxcbiAgICAob2xkU2NvcGVkU2xvdHMgIT09IGVtcHR5T2JqZWN0ICYmICFvbGRTY29wZWRTbG90cy4kc3RhYmxlKSB8fFxuICAgIChuZXdTY29wZWRTbG90cyAmJiB2bS4kc2NvcGVkU2xvdHMuJGtleSAhPT0gbmV3U2NvcGVkU2xvdHMuJGtleSlcbiAgKTtcblxuICAvLyBBbnkgc3RhdGljIHNsb3QgY2hpbGRyZW4gZnJvbSB0aGUgcGFyZW50IG1heSBoYXZlIGNoYW5nZWQgZHVyaW5nIHBhcmVudCdzXG4gIC8vIHVwZGF0ZS4gRHluYW1pYyBzY29wZWQgc2xvdHMgbWF5IGFsc28gaGF2ZSBjaGFuZ2VkLiBJbiBzdWNoIGNhc2VzLCBhIGZvcmNlZFxuICAvLyB1cGRhdGUgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBjb3JyZWN0bmVzcy5cbiAgdmFyIG5lZWRzRm9yY2VVcGRhdGUgPSAhIShcbiAgICByZW5kZXJDaGlsZHJlbiB8fCAgICAgICAgICAgICAgIC8vIGhhcyBuZXcgc3RhdGljIHNsb3RzXG4gICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90c1xuICAgIGhhc0R5bmFtaWNTY29wZWRTbG90XG4gICk7XG5cbiAgdm0uJG9wdGlvbnMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7XG4gIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyXG5cbiAgaWYgKHZtLl92bm9kZSkgeyAvLyB1cGRhdGUgY2hpbGQgdHJlZSdzIHBhcmVudFxuICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTtcbiAgfVxuICB2bS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4gPSByZW5kZXJDaGlsZHJlbjtcblxuICAvLyB1cGRhdGUgJGF0dHJzIGFuZCAkbGlzdGVuZXJzIGhhc2hcbiAgLy8gdGhlc2UgYXJlIGFsc28gcmVhY3RpdmUgc28gdGhleSBtYXkgdHJpZ2dlciBjaGlsZCB1cGRhdGUgaWYgdGhlIGNoaWxkXG4gIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyXG4gIHZtLiRhdHRycyA9IHBhcmVudFZub2RlLmRhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3Q7XG4gIHZtLiRsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7XG5cbiAgLy8gdXBkYXRlIHByb3BzXG4gIGlmIChwcm9wc0RhdGEgJiYgdm0uJG9wdGlvbnMucHJvcHMpIHtcbiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpO1xuICAgIHZhciBwcm9wcyA9IHZtLl9wcm9wcztcbiAgICB2YXIgcHJvcEtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IHByb3BLZXlzW2ldO1xuICAgICAgdmFyIHByb3BPcHRpb25zID0gdm0uJG9wdGlvbnMucHJvcHM7IC8vIHd0ZiBmbG93P1xuICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTtcbiAgICB9XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpO1xuICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGFcbiAgICB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgPSBwcm9wc0RhdGE7XG4gIH1cblxuICAvLyB1cGRhdGUgbGlzdGVuZXJzXG4gIGxpc3RlbmVycyA9IGxpc3RlbmVycyB8fCBlbXB0eU9iamVjdDtcbiAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7XG4gIHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7XG4gIHVwZGF0ZUNvbXBvbmVudExpc3RlbmVycyh2bSwgbGlzdGVuZXJzLCBvbGRMaXN0ZW5lcnMpO1xuXG4gIC8vIHJlc29sdmUgc2xvdHMgKyBmb3JjZSB1cGRhdGUgaWYgaGFzIGNoaWxkcmVuXG4gIGlmIChuZWVkc0ZvcmNlVXBkYXRlKSB7XG4gICAgdm0uJHNsb3RzID0gcmVzb2x2ZVNsb3RzKHJlbmRlckNoaWxkcmVuLCBwYXJlbnRWbm9kZS5jb250ZXh0KTtcbiAgICB2bS4kZm9yY2VVcGRhdGUoKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkluYWN0aXZlVHJlZSAodm0pIHtcbiAgd2hpbGUgKHZtICYmICh2bSA9IHZtLiRwYXJlbnQpKSB7XG4gICAgaWYgKHZtLl9pbmFjdGl2ZSkgeyByZXR1cm4gdHJ1ZSB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQgKHZtLCBkaXJlY3QpIHtcbiAgaWYgKGRpcmVjdCkge1xuICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlO1xuICAgIGlmIChpc0luSW5hY3RpdmVUcmVlKHZtKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICB9IGVsc2UgaWYgKHZtLl9kaXJlY3RJbmFjdGl2ZSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmICh2bS5faW5hY3RpdmUgfHwgdm0uX2luYWN0aXZlID09PSBudWxsKSB7XG4gICAgdm0uX2luYWN0aXZlID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQodm0uJGNoaWxkcmVuW2ldKTtcbiAgICB9XG4gICAgY2FsbEhvb2sodm0sICdhY3RpdmF0ZWQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWFjdGl2YXRlQ2hpbGRDb21wb25lbnQgKHZtLCBkaXJlY3QpIHtcbiAgaWYgKGRpcmVjdCkge1xuICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IHRydWU7XG4gICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cbiAgaWYgKCF2bS5faW5hY3RpdmUpIHtcbiAgICB2bS5faW5hY3RpdmUgPSB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm0uJGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWFjdGl2YXRlQ2hpbGRDb21wb25lbnQodm0uJGNoaWxkcmVuW2ldKTtcbiAgICB9XG4gICAgY2FsbEhvb2sodm0sICdkZWFjdGl2YXRlZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxIb29rICh2bSwgaG9vaykge1xuICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgbGlmZWN5Y2xlIGhvb2tzXG4gIHB1c2hUYXJnZXQoKTtcbiAgdmFyIGhhbmRsZXJzID0gdm0uJG9wdGlvbnNbaG9va107XG4gIHZhciBpbmZvID0gaG9vayArIFwiIGhvb2tcIjtcbiAgaWYgKGhhbmRsZXJzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGhhbmRsZXJzW2ldLCB2bSwgbnVsbCwgdm0sIGluZm8pO1xuICAgIH1cbiAgfVxuICBpZiAodm0uX2hhc0hvb2tFdmVudCkge1xuICAgIHZtLiRlbWl0KCdob29rOicgKyBob29rKTtcbiAgfVxuICBwb3BUYXJnZXQoKTtcbn1cblxuLyogICovXG5cbnZhciBNQVhfVVBEQVRFX0NPVU5UID0gMTAwO1xuXG52YXIgcXVldWUgPSBbXTtcbnZhciBhY3RpdmF0ZWRDaGlsZHJlbiA9IFtdO1xudmFyIGhhcyA9IHt9O1xudmFyIGNpcmN1bGFyID0ge307XG52YXIgd2FpdGluZyA9IGZhbHNlO1xudmFyIGZsdXNoaW5nID0gZmFsc2U7XG52YXIgaW5kZXggPSAwO1xuXG4vKipcbiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gcmVzZXRTY2hlZHVsZXJTdGF0ZSAoKSB7XG4gIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDtcbiAgaGFzID0ge307XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY2lyY3VsYXIgPSB7fTtcbiAgfVxuICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTtcbn1cblxuLy8gQXN5bmMgZWRnZSBjYXNlICM2NTY2IHJlcXVpcmVzIHNhdmluZyB0aGUgdGltZXN0YW1wIHdoZW4gZXZlbnQgbGlzdGVuZXJzIGFyZVxuLy8gYXR0YWNoZWQuIEhvd2V2ZXIsIGNhbGxpbmcgcGVyZm9ybWFuY2Uubm93KCkgaGFzIGEgcGVyZiBvdmVyaGVhZCBlc3BlY2lhbGx5XG4vLyBpZiB0aGUgcGFnZSBoYXMgdGhvdXNhbmRzIG9mIGV2ZW50IGxpc3RlbmVycy4gSW5zdGVhZCwgd2UgdGFrZSBhIHRpbWVzdGFtcFxuLy8gZXZlcnkgdGltZSB0aGUgc2NoZWR1bGVyIGZsdXNoZXMgYW5kIHVzZSB0aGF0IGZvciBhbGwgZXZlbnQgbGlzdGVuZXJzXG4vLyBhdHRhY2hlZCBkdXJpbmcgdGhhdCBmbHVzaC5cbnZhciBjdXJyZW50Rmx1c2hUaW1lc3RhbXAgPSAwO1xuXG4vLyBBc3luYyBlZGdlIGNhc2UgZml4IHJlcXVpcmVzIHN0b3JpbmcgYW4gZXZlbnQgbGlzdGVuZXIncyBhdHRhY2ggdGltZXN0YW1wLlxudmFyIGdldE5vdyA9IERhdGUubm93O1xuXG4vLyBEZXRlcm1pbmUgd2hhdCBldmVudCB0aW1lc3RhbXAgdGhlIGJyb3dzZXIgaXMgdXNpbmcuIEFubm95aW5nbHksIHRoZVxuLy8gdGltZXN0YW1wIGNhbiBlaXRoZXIgYmUgaGktcmVzIChyZWxhdGl2ZSB0byBwYWdlIGxvYWQpIG9yIGxvdy1yZXNcbi8vIChyZWxhdGl2ZSB0byBVTklYIGVwb2NoKSwgc28gaW4gb3JkZXIgdG8gY29tcGFyZSB0aW1lIHdlIGhhdmUgdG8gdXNlIHRoZVxuLy8gc2FtZSB0aW1lc3RhbXAgdHlwZSB3aGVuIHNhdmluZyB0aGUgZmx1c2ggdGltZXN0YW1wLlxuLy8gQWxsIElFIHZlcnNpb25zIHVzZSBsb3ctcmVzIGV2ZW50IHRpbWVzdGFtcHMsIGFuZCBoYXZlIHByb2JsZW1hdGljIGNsb2NrXG4vLyBpbXBsZW1lbnRhdGlvbnMgKCM5NjMyKVxuaWYgKGluQnJvd3NlciAmJiAhaXNJRSkge1xuICB2YXIgcGVyZm9ybWFuY2UgPSB3aW5kb3cucGVyZm9ybWFuY2U7XG4gIGlmIChcbiAgICBwZXJmb3JtYW5jZSAmJlxuICAgIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbicgJiZcbiAgICBnZXROb3coKSA+IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpLnRpbWVTdGFtcFxuICApIHtcbiAgICAvLyBpZiB0aGUgZXZlbnQgdGltZXN0YW1wLCBhbHRob3VnaCBldmFsdWF0ZWQgQUZURVIgdGhlIERhdGUubm93KCksIGlzXG4gICAgLy8gc21hbGxlciB0aGFuIGl0LCBpdCBtZWFucyB0aGUgZXZlbnQgaXMgdXNpbmcgYSBoaS1yZXMgdGltZXN0YW1wLFxuICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHVzZSB0aGUgaGktcmVzIHZlcnNpb24gZm9yIGV2ZW50IGxpc3RlbmVyIHRpbWVzdGFtcHMgYXNcbiAgICAvLyB3ZWxsLlxuICAgIGdldE5vdyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOyB9O1xuICB9XG59XG5cbi8qKlxuICogRmx1c2ggYm90aCBxdWV1ZXMgYW5kIHJ1biB0aGUgd2F0Y2hlcnMuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoU2NoZWR1bGVyUXVldWUgKCkge1xuICBjdXJyZW50Rmx1c2hUaW1lc3RhbXAgPSBnZXROb3coKTtcbiAgZmx1c2hpbmcgPSB0cnVlO1xuICB2YXIgd2F0Y2hlciwgaWQ7XG5cbiAgLy8gU29ydCBxdWV1ZSBiZWZvcmUgZmx1c2guXG4gIC8vIFRoaXMgZW5zdXJlcyB0aGF0OlxuICAvLyAxLiBDb21wb25lbnRzIGFyZSB1cGRhdGVkIGZyb20gcGFyZW50IHRvIGNoaWxkLiAoYmVjYXVzZSBwYXJlbnQgaXMgYWx3YXlzXG4gIC8vICAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjaGlsZClcbiAgLy8gMi4gQSBjb21wb25lbnQncyB1c2VyIHdhdGNoZXJzIGFyZSBydW4gYmVmb3JlIGl0cyByZW5kZXIgd2F0Y2hlciAoYmVjYXVzZVxuICAvLyAgICB1c2VyIHdhdGNoZXJzIGFyZSBjcmVhdGVkIGJlZm9yZSB0aGUgcmVuZGVyIHdhdGNoZXIpXG4gIC8vIDMuIElmIGEgY29tcG9uZW50IGlzIGRlc3Ryb3llZCBkdXJpbmcgYSBwYXJlbnQgY29tcG9uZW50J3Mgd2F0Y2hlciBydW4sXG4gIC8vICAgIGl0cyB3YXRjaGVycyBjYW4gYmUgc2tpcHBlZC5cbiAgcXVldWUuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5pZCAtIGIuaWQ7IH0pO1xuXG4gIC8vIGRvIG5vdCBjYWNoZSBsZW5ndGggYmVjYXVzZSBtb3JlIHdhdGNoZXJzIG1pZ2h0IGJlIHB1c2hlZFxuICAvLyBhcyB3ZSBydW4gZXhpc3Rpbmcgd2F0Y2hlcnNcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgd2F0Y2hlciA9IHF1ZXVlW2luZGV4XTtcbiAgICBpZiAod2F0Y2hlci5iZWZvcmUpIHtcbiAgICAgIHdhdGNoZXIuYmVmb3JlKCk7XG4gICAgfVxuICAgIGlkID0gd2F0Y2hlci5pZDtcbiAgICBoYXNbaWRdID0gbnVsbDtcbiAgICB3YXRjaGVyLnJ1bigpO1xuICAgIC8vIGluIGRldiBidWlsZCwgY2hlY2sgYW5kIHN0b3AgY2lyY3VsYXIgdXBkYXRlcy5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHtcbiAgICAgIGNpcmN1bGFyW2lkXSA9IChjaXJjdWxhcltpZF0gfHwgMCkgKyAxO1xuICAgICAgaWYgKGNpcmN1bGFyW2lkXSA+IE1BWF9VUERBVEVfQ09VTlQpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnWW91IG1heSBoYXZlIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wICcgKyAoXG4gICAgICAgICAgICB3YXRjaGVyLnVzZXJcbiAgICAgICAgICAgICAgPyAoXCJpbiB3YXRjaGVyIHdpdGggZXhwcmVzc2lvbiBcXFwiXCIgKyAod2F0Y2hlci5leHByZXNzaW9uKSArIFwiXFxcIlwiKVxuICAgICAgICAgICAgICA6IFwiaW4gYSBjb21wb25lbnQgcmVuZGVyIGZ1bmN0aW9uLlwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3YXRjaGVyLnZtXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8ga2VlcCBjb3BpZXMgb2YgcG9zdCBxdWV1ZXMgYmVmb3JlIHJlc2V0dGluZyBzdGF0ZVxuICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpO1xuICB2YXIgdXBkYXRlZFF1ZXVlID0gcXVldWUuc2xpY2UoKTtcblxuICByZXNldFNjaGVkdWxlclN0YXRlKCk7XG5cbiAgLy8gY2FsbCBjb21wb25lbnQgdXBkYXRlZCBhbmQgYWN0aXZhdGVkIGhvb2tzXG4gIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7XG4gIGNhbGxVcGRhdGVkSG9va3ModXBkYXRlZFF1ZXVlKTtcblxuICAvLyBkZXZ0b29sIGhvb2tcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChkZXZ0b29scyAmJiBjb25maWcuZGV2dG9vbHMpIHtcbiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxVcGRhdGVkSG9va3MgKHF1ZXVlKSB7XG4gIHZhciBpID0gcXVldWUubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgdmFyIHdhdGNoZXIgPSBxdWV1ZVtpXTtcbiAgICB2YXIgdm0gPSB3YXRjaGVyLnZtO1xuICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkICYmICF2bS5faXNEZXN0cm95ZWQpIHtcbiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC5cbiAqIFRoZSBxdWV1ZSB3aWxsIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgZW50aXJlIHRyZWUgaGFzIGJlZW4gcGF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7XG4gIC8vIHNldHRpbmcgX2luYWN0aXZlIHRvIGZhbHNlIGhlcmUgc28gdGhhdCBhIHJlbmRlciBmdW5jdGlvbiBjYW5cbiAgLy8gcmVseSBvbiBjaGVja2luZyB3aGV0aGVyIGl0J3MgaW4gYW4gaW5hY3RpdmUgdHJlZSAoZS5nLiByb3V0ZXItdmlldylcbiAgdm0uX2luYWN0aXZlID0gZmFsc2U7XG4gIGFjdGl2YXRlZENoaWxkcmVuLnB1c2godm0pO1xufVxuXG5mdW5jdGlvbiBjYWxsQWN0aXZhdGVkSG9va3MgKHF1ZXVlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlO1xuICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQocXVldWVbaV0sIHRydWUgLyogdHJ1ZSAqLyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLlxuICogSm9icyB3aXRoIGR1cGxpY2F0ZSBJRHMgd2lsbCBiZSBza2lwcGVkIHVubGVzcyBpdCdzXG4gKiBwdXNoZWQgd2hlbiB0aGUgcXVldWUgaXMgYmVpbmcgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gcXVldWVXYXRjaGVyICh3YXRjaGVyKSB7XG4gIHZhciBpZCA9IHdhdGNoZXIuaWQ7XG4gIGlmIChoYXNbaWRdID09IG51bGwpIHtcbiAgICBoYXNbaWRdID0gdHJ1ZTtcbiAgICBpZiAoIWZsdXNoaW5nKSB7XG4gICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBhbHJlYWR5IGZsdXNoaW5nLCBzcGxpY2UgdGhlIHdhdGNoZXIgYmFzZWQgb24gaXRzIGlkXG4gICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LlxuICAgICAgdmFyIGkgPSBxdWV1ZS5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGkgPiBpbmRleCAmJiBxdWV1ZVtpXS5pZCA+IHdhdGNoZXIuaWQpIHtcbiAgICAgICAgaS0tO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKGkgKyAxLCAwLCB3YXRjaGVyKTtcbiAgICB9XG4gICAgLy8gcXVldWUgdGhlIGZsdXNoXG4gICAgaWYgKCF3YWl0aW5nKSB7XG4gICAgICB3YWl0aW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbmZpZy5hc3luYykge1xuICAgICAgICBmbHVzaFNjaGVkdWxlclF1ZXVlKCk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgbmV4dFRpY2soZmx1c2hTY2hlZHVsZXJRdWV1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG5cblxudmFyIHVpZCQyID0gMDtcblxuLyoqXG4gKiBBIHdhdGNoZXIgcGFyc2VzIGFuIGV4cHJlc3Npb24sIGNvbGxlY3RzIGRlcGVuZGVuY2llcyxcbiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuXG4gKiBUaGlzIGlzIHVzZWQgZm9yIGJvdGggdGhlICR3YXRjaCgpIGFwaSBhbmQgZGlyZWN0aXZlcy5cbiAqL1xudmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyIChcbiAgdm0sXG4gIGV4cE9yRm4sXG4gIGNiLFxuICBvcHRpb25zLFxuICBpc1JlbmRlcldhdGNoZXJcbikge1xuICB0aGlzLnZtID0gdm07XG4gIGlmIChpc1JlbmRlcldhdGNoZXIpIHtcbiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7XG4gIH1cbiAgdm0uX3dhdGNoZXJzLnB1c2godGhpcyk7XG4gIC8vIG9wdGlvbnNcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICB0aGlzLmRlZXAgPSAhIW9wdGlvbnMuZGVlcDtcbiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjtcbiAgICB0aGlzLmxhenkgPSAhIW9wdGlvbnMubGF6eTtcbiAgICB0aGlzLnN5bmMgPSAhIW9wdGlvbnMuc3luYztcbiAgICB0aGlzLmJlZm9yZSA9IG9wdGlvbnMuYmVmb3JlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZGVlcCA9IHRoaXMudXNlciA9IHRoaXMubGF6eSA9IHRoaXMuc3luYyA9IGZhbHNlO1xuICB9XG4gIHRoaXMuY2IgPSBjYjtcbiAgdGhpcy5pZCA9ICsrdWlkJDI7IC8vIHVpZCBmb3IgYmF0Y2hpbmdcbiAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICB0aGlzLmRpcnR5ID0gdGhpcy5sYXp5OyAvLyBmb3IgbGF6eSB3YXRjaGVyc1xuICB0aGlzLmRlcHMgPSBbXTtcbiAgdGhpcy5uZXdEZXBzID0gW107XG4gIHRoaXMuZGVwSWRzID0gbmV3IF9TZXQoKTtcbiAgdGhpcy5uZXdEZXBJZHMgPSBuZXcgX1NldCgpO1xuICB0aGlzLmV4cHJlc3Npb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgPyBleHBPckZuLnRvU3RyaW5nKClcbiAgICA6ICcnO1xuICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXJcbiAgaWYgKHR5cGVvZiBleHBPckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5nZXR0ZXIgPSBleHBPckZuO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZ2V0dGVyID0gcGFyc2VQYXRoKGV4cE9yRm4pO1xuICAgIGlmICghdGhpcy5nZXR0ZXIpIHtcbiAgICAgIHRoaXMuZ2V0dGVyID0gbm9vcDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJGYWlsZWQgd2F0Y2hpbmcgcGF0aDogXFxcIlwiICsgZXhwT3JGbiArIFwiXFxcIiBcIiArXG4gICAgICAgICdXYXRjaGVyIG9ubHkgYWNjZXB0cyBzaW1wbGUgZG90LWRlbGltaXRlZCBwYXRocy4gJyArXG4gICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH1cbiAgfVxuICB0aGlzLnZhbHVlID0gdGhpcy5sYXp5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHRoaXMuZ2V0KCk7XG59O1xuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSBnZXR0ZXIsIGFuZCByZS1jb2xsZWN0IGRlcGVuZGVuY2llcy5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0ICgpIHtcbiAgcHVzaFRhcmdldCh0aGlzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgdm0gPSB0aGlzLnZtO1xuICB0cnkge1xuICAgIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh2bSwgdm0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHRoaXMudXNlcikge1xuICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sIChcImdldHRlciBmb3Igd2F0Y2hlciBcXFwiXCIgKyAodGhpcy5leHByZXNzaW9uKSArIFwiXFxcIlwiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgLy8gXCJ0b3VjaFwiIGV2ZXJ5IHByb3BlcnR5IHNvIHRoZXkgYXJlIGFsbCB0cmFja2VkIGFzXG4gICAgLy8gZGVwZW5kZW5jaWVzIGZvciBkZWVwIHdhdGNoaW5nXG4gICAgaWYgKHRoaXMuZGVlcCkge1xuICAgICAgdHJhdmVyc2UodmFsdWUpO1xuICAgIH1cbiAgICBwb3BUYXJnZXQoKTtcbiAgICB0aGlzLmNsZWFudXBEZXBzKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59O1xuXG4vKipcbiAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBkaXJlY3RpdmUuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmFkZERlcCA9IGZ1bmN0aW9uIGFkZERlcCAoZGVwKSB7XG4gIHZhciBpZCA9IGRlcC5pZDtcbiAgaWYgKCF0aGlzLm5ld0RlcElkcy5oYXMoaWQpKSB7XG4gICAgdGhpcy5uZXdEZXBJZHMuYWRkKGlkKTtcbiAgICB0aGlzLm5ld0RlcHMucHVzaChkZXApO1xuICAgIGlmICghdGhpcy5kZXBJZHMuaGFzKGlkKSkge1xuICAgICAgZGVwLmFkZFN1Yih0aGlzKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQ2xlYW4gdXAgZm9yIGRlcGVuZGVuY3kgY29sbGVjdGlvbi5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuY2xlYW51cERlcHMgPSBmdW5jdGlvbiBjbGVhbnVwRGVwcyAoKSB7XG4gIHZhciBpID0gdGhpcy5kZXBzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciBkZXAgPSB0aGlzLmRlcHNbaV07XG4gICAgaWYgKCF0aGlzLm5ld0RlcElkcy5oYXMoZGVwLmlkKSkge1xuICAgICAgZGVwLnJlbW92ZVN1Yih0aGlzKTtcbiAgICB9XG4gIH1cbiAgdmFyIHRtcCA9IHRoaXMuZGVwSWRzO1xuICB0aGlzLmRlcElkcyA9IHRoaXMubmV3RGVwSWRzO1xuICB0aGlzLm5ld0RlcElkcyA9IHRtcDtcbiAgdGhpcy5uZXdEZXBJZHMuY2xlYXIoKTtcbiAgdG1wID0gdGhpcy5kZXBzO1xuICB0aGlzLmRlcHMgPSB0aGlzLm5ld0RlcHM7XG4gIHRoaXMubmV3RGVwcyA9IHRtcDtcbiAgdGhpcy5uZXdEZXBzLmxlbmd0aCA9IDA7XG59O1xuXG4vKipcbiAqIFN1YnNjcmliZXIgaW50ZXJmYWNlLlxuICogV2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgY2hhbmdlcy5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlICgpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHRoaXMubGF6eSkge1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHRoaXMuc3luYykge1xuICAgIHRoaXMucnVuKCk7XG4gIH0gZWxzZSB7XG4gICAgcXVldWVXYXRjaGVyKHRoaXMpO1xuICB9XG59O1xuXG4vKipcbiAqIFNjaGVkdWxlciBqb2IgaW50ZXJmYWNlLlxuICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlci5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gcnVuICgpIHtcbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5nZXQoKTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fFxuICAgICAgLy8gRGVlcCB3YXRjaGVycyBhbmQgd2F0Y2hlcnMgb24gT2JqZWN0L0FycmF5cyBzaG91bGQgZmlyZSBldmVuXG4gICAgICAvLyB3aGVuIHRoZSB2YWx1ZSBpcyB0aGUgc2FtZSwgYmVjYXVzZSB0aGUgdmFsdWUgbWF5XG4gICAgICAvLyBoYXZlIG11dGF0ZWQuXG4gICAgICBpc09iamVjdCh2YWx1ZSkgfHxcbiAgICAgIHRoaXMuZGVlcFxuICAgICkge1xuICAgICAgLy8gc2V0IG5ldyB2YWx1ZVxuICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIHRoaXMudm0sIChcImNhbGxiYWNrIGZvciB3YXRjaGVyIFxcXCJcIiArICh0aGlzLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jYi5jYWxsKHRoaXMudm0sIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSB2YWx1ZSBvZiB0aGUgd2F0Y2hlci5cbiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiBldmFsdWF0ZSAoKSB7XG4gIHRoaXMudmFsdWUgPSB0aGlzLmdldCgpO1xuICB0aGlzLmRpcnR5ID0gZmFsc2U7XG59O1xuXG4vKipcbiAqIERlcGVuZCBvbiBhbGwgZGVwcyBjb2xsZWN0ZWQgYnkgdGhpcyB3YXRjaGVyLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5kZXBlbmQgPSBmdW5jdGlvbiBkZXBlbmQgKCkge1xuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB0aGlzLmRlcHNbaV0uZGVwZW5kKCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVtb3ZlIHNlbGYgZnJvbSBhbGwgZGVwZW5kZW5jaWVzJyBzdWJzY3JpYmVyIGxpc3QuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkge1xuICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAvLyByZW1vdmUgc2VsZiBmcm9tIHZtJ3Mgd2F0Y2hlciBsaXN0XG4gICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBvcGVyYXRpb24gc28gd2Ugc2tpcCBpdFxuICAgIC8vIGlmIHRoZSB2bSBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgaWYgKCF0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkKSB7XG4gICAgICByZW1vdmUodGhpcy52bS5fd2F0Y2hlcnMsIHRoaXMpO1xuICAgIH1cbiAgICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdGhpcy5kZXBzW2ldLnJlbW92ZVN1Yih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgfVxufTtcblxuLyogICovXG5cbnZhciBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24gPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBub29wLFxuICBzZXQ6IG5vb3Bcbn07XG5cbmZ1bmN0aW9uIHByb3h5ICh0YXJnZXQsIHNvdXJjZUtleSwga2V5KSB7XG4gIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5nZXQgPSBmdW5jdGlvbiBwcm94eUdldHRlciAoKSB7XG4gICAgcmV0dXJuIHRoaXNbc291cmNlS2V5XVtrZXldXG4gIH07XG4gIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBmdW5jdGlvbiBwcm94eVNldHRlciAodmFsKSB7XG4gICAgdGhpc1tzb3VyY2VLZXldW2tleV0gPSB2YWw7XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uKTtcbn1cblxuZnVuY3Rpb24gaW5pdFN0YXRlICh2bSkge1xuICB2bS5fd2F0Y2hlcnMgPSBbXTtcbiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucztcbiAgaWYgKG9wdHMucHJvcHMpIHsgaW5pdFByb3BzKHZtLCBvcHRzLnByb3BzKTsgfVxuICBpZiAob3B0cy5tZXRob2RzKSB7IGluaXRNZXRob2RzKHZtLCBvcHRzLm1ldGhvZHMpOyB9XG4gIGlmIChvcHRzLmRhdGEpIHtcbiAgICBpbml0RGF0YSh2bSk7XG4gIH0gZWxzZSB7XG4gICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pO1xuICB9XG4gIGlmIChvcHRzLmNvbXB1dGVkKSB7IGluaXRDb21wdXRlZCh2bSwgb3B0cy5jb21wdXRlZCk7IH1cbiAgaWYgKG9wdHMud2F0Y2ggJiYgb3B0cy53YXRjaCAhPT0gbmF0aXZlV2F0Y2gpIHtcbiAgICBpbml0V2F0Y2godm0sIG9wdHMud2F0Y2gpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRQcm9wcyAodm0sIHByb3BzT3B0aW9ucykge1xuICB2YXIgcHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhIHx8IHt9O1xuICB2YXIgcHJvcHMgPSB2bS5fcHJvcHMgPSB7fTtcbiAgLy8gY2FjaGUgcHJvcCBrZXlzIHNvIHRoYXQgZnV0dXJlIHByb3BzIHVwZGF0ZXMgY2FuIGl0ZXJhdGUgdXNpbmcgQXJyYXlcbiAgLy8gaW5zdGVhZCBvZiBkeW5hbWljIG9iamVjdCBrZXkgZW51bWVyYXRpb24uXG4gIHZhciBrZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzID0gW107XG4gIHZhciBpc1Jvb3QgPSAhdm0uJHBhcmVudDtcbiAgLy8gcm9vdCBpbnN0YW5jZSBwcm9wcyBzaG91bGQgYmUgY29udmVydGVkXG4gIGlmICghaXNSb290KSB7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKGZhbHNlKTtcbiAgfVxuICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgIGtleXMucHVzaChrZXkpO1xuICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGh5cGhlbmF0ZWRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIGlmIChpc1Jlc2VydmVkQXR0cmlidXRlKGh5cGhlbmF0ZWRLZXkpIHx8XG4gICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgKFwiXFxcIlwiICsgaHlwaGVuYXRlZEtleSArIFwiXFxcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBkZWZpbmVSZWFjdGl2ZSQkMShwcm9wcywga2V5LCB2YWx1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzUm9vdCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlIFwiICtcbiAgICAgICAgICAgIFwib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gXCIgK1xuICAgICAgICAgICAgXCJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgXCIgK1xuICAgICAgICAgICAgXCJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcXFwiXCIgKyBrZXkgKyBcIlxcXCJcIixcbiAgICAgICAgICAgIHZtXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHByb3BzLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZVxuICAgIC8vIGR1cmluZyBWdWUuZXh0ZW5kKCkuIFdlIG9ubHkgbmVlZCB0byBwcm94eSBwcm9wcyBkZWZpbmVkIGF0XG4gICAgLy8gaW5zdGFudGlhdGlvbiBoZXJlLlxuICAgIGlmICghKGtleSBpbiB2bSkpIHtcbiAgICAgIHByb3h5KHZtLCBcIl9wcm9wc1wiLCBrZXkpO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKHZhciBrZXkgaW4gcHJvcHNPcHRpb25zKSBsb29wKCBrZXkgKTtcbiAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpO1xufVxuXG5mdW5jdGlvbiBpbml0RGF0YSAodm0pIHtcbiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhO1xuICBkYXRhID0gdm0uX2RhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gZ2V0RGF0YShkYXRhLCB2bSlcbiAgICA6IGRhdGEgfHwge307XG4gIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgIGRhdGEgPSB7fTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAnZGF0YSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBhbiBvYmplY3Q6XFxuJyArXG4gICAgICAnaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvY29tcG9uZW50cy5odG1sI2RhdGEtTXVzdC1CZS1hLUZ1bmN0aW9uJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICAvLyBwcm94eSBkYXRhIG9uIGluc3RhbmNlXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gIHZhciBwcm9wcyA9IHZtLiRvcHRpb25zLnByb3BzO1xuICB2YXIgbWV0aG9kcyA9IHZtLiRvcHRpb25zLm1ldGhvZHM7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKG1ldGhvZHMgJiYgaGFzT3duKG1ldGhvZHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIGRhdGEgcHJvcGVydHkuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJUaGUgZGF0YSBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuIFwiICtcbiAgICAgICAgXCJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuXCIsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQoa2V5KSkge1xuICAgICAgcHJveHkodm0sIFwiX2RhdGFcIiwga2V5KTtcbiAgICB9XG4gIH1cbiAgLy8gb2JzZXJ2ZSBkYXRhXG4gIG9ic2VydmUoZGF0YSwgdHJ1ZSAvKiBhc1Jvb3REYXRhICovKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YSAoZGF0YSwgdm0pIHtcbiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGRhdGEgZ2V0dGVyc1xuICBwdXNoVGFyZ2V0KCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYW5kbGVFcnJvcihlLCB2bSwgXCJkYXRhKClcIik7XG4gICAgcmV0dXJuIHt9XG4gIH0gZmluYWxseSB7XG4gICAgcG9wVGFyZ2V0KCk7XG4gIH1cbn1cblxudmFyIGNvbXB1dGVkV2F0Y2hlck9wdGlvbnMgPSB7IGxhenk6IHRydWUgfTtcblxuZnVuY3Rpb24gaW5pdENvbXB1dGVkICh2bSwgY29tcHV0ZWQpIHtcbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLy8gY29tcHV0ZWQgcHJvcGVydGllcyBhcmUganVzdCBnZXR0ZXJzIGR1cmluZyBTU1JcbiAgdmFyIGlzU1NSID0gaXNTZXJ2ZXJSZW5kZXJpbmcoKTtcblxuICBmb3IgKHZhciBrZXkgaW4gY29tcHV0ZWQpIHtcbiAgICB2YXIgdXNlckRlZiA9IGNvbXB1dGVkW2tleV07XG4gICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0O1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGdldHRlciA9PSBudWxsKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAoXCJHZXR0ZXIgaXMgbWlzc2luZyBmb3IgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiLlwiKSxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1NTUikge1xuICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS5cbiAgICAgIHdhdGNoZXJzW2tleV0gPSBuZXcgV2F0Y2hlcihcbiAgICAgICAgdm0sXG4gICAgICAgIGdldHRlciB8fCBub29wLFxuICAgICAgICBub29wLFxuICAgICAgICBjb21wdXRlZFdhdGNoZXJPcHRpb25zXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGVcbiAgICAvLyBjb21wb25lbnQgcHJvdG90eXBlLiBXZSBvbmx5IG5lZWQgdG8gZGVmaW5lIGNvbXB1dGVkIHByb3BlcnRpZXMgZGVmaW5lZFxuICAgIC8vIGF0IGluc3RhbnRpYXRpb24gaGVyZS5cbiAgICBpZiAoIShrZXkgaW4gdm0pKSB7XG4gICAgICBkZWZpbmVDb21wdXRlZCh2bSwga2V5LCB1c2VyRGVmKTtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChrZXkgaW4gdm0uJGRhdGEpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLlwiKSwgdm0pO1xuICAgICAgfSBlbHNlIGlmICh2bS4kb3B0aW9ucy5wcm9wcyAmJiBrZXkgaW4gdm0uJG9wdGlvbnMucHJvcHMpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIHByb3AuXCIpLCB2bSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZUNvbXB1dGVkIChcbiAgdGFyZ2V0LFxuICBrZXksXG4gIHVzZXJEZWZcbikge1xuICB2YXIgc2hvdWxkQ2FjaGUgPSAhaXNTZXJ2ZXJSZW5kZXJpbmcoKTtcbiAgaWYgKHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlXG4gICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSlcbiAgICAgIDogY3JlYXRlR2V0dGVySW52b2tlcih1c2VyRGVmKTtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDtcbiAgfSBlbHNlIHtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gdXNlckRlZi5nZXRcbiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2VcbiAgICAgICAgPyBjcmVhdGVDb21wdXRlZEdldHRlcihrZXkpXG4gICAgICAgIDogY3JlYXRlR2V0dGVySW52b2tlcih1c2VyRGVmLmdldClcbiAgICAgIDogbm9vcDtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gdXNlckRlZi5zZXQgfHwgbm9vcDtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9PT0gbm9vcCkge1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAoXCJDb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgd2FzIGFzc2lnbmVkIHRvIGJ1dCBpdCBoYXMgbm8gc2V0dGVyLlwiKSxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIgKGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkge1xuICAgIHZhciB3YXRjaGVyID0gdGhpcy5fY29tcHV0ZWRXYXRjaGVycyAmJiB0aGlzLl9jb21wdXRlZFdhdGNoZXJzW2tleV07XG4gICAgaWYgKHdhdGNoZXIpIHtcbiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7XG4gICAgICAgIHdhdGNoZXIuZXZhbHVhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICAgIHdhdGNoZXIuZGVwZW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVHZXR0ZXJJbnZva2VyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb21wdXRlZEdldHRlciAoKSB7XG4gICAgcmV0dXJuIGZuLmNhbGwodGhpcywgdGhpcylcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0TWV0aG9kcyAodm0sIG1ldGhvZHMpIHtcbiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7XG4gIGZvciAodmFyIGtleSBpbiBtZXRob2RzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0aG9kc1trZXldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyB0eXBlIFxcXCJcIiArICh0eXBlb2YgbWV0aG9kc1trZXldKSArIFwiXFxcIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIFwiICtcbiAgICAgICAgICBcIkRpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/XCIsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIHByb3AuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuIFwiICtcbiAgICAgICAgICBcIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdm1ba2V5XSA9IHR5cGVvZiBtZXRob2RzW2tleV0gIT09ICdmdW5jdGlvbicgPyBub29wIDogYmluZChtZXRob2RzW2tleV0sIHZtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0V2F0Y2ggKHZtLCB3YXRjaCkge1xuICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHtcbiAgICB2YXIgaGFuZGxlciA9IHdhdGNoW2tleV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXJbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVXYXRjaGVyIChcbiAgdm0sXG4gIGV4cE9yRm4sXG4gIGhhbmRsZXIsXG4gIG9wdGlvbnNcbikge1xuICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkge1xuICAgIG9wdGlvbnMgPSBoYW5kbGVyO1xuICAgIGhhbmRsZXIgPSBoYW5kbGVyLmhhbmRsZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJykge1xuICAgIGhhbmRsZXIgPSB2bVtoYW5kbGVyXTtcbiAgfVxuICByZXR1cm4gdm0uJHdhdGNoKGV4cE9yRm4sIGhhbmRsZXIsIG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIHN0YXRlTWl4aW4gKFZ1ZSkge1xuICAvLyBmbG93IHNvbWVob3cgaGFzIHByb2JsZW1zIHdpdGggZGlyZWN0bHkgZGVjbGFyZWQgZGVmaW5pdGlvbiBvYmplY3RcbiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwXG4gIC8vIHRoZSBvYmplY3QgaGVyZS5cbiAgdmFyIGRhdGFEZWYgPSB7fTtcbiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07XG4gIHZhciBwcm9wc0RlZiA9IHt9O1xuICBwcm9wc0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wcm9wcyB9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGRhdGFEZWYuc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICtcbiAgICAgICAgJ1VzZSBuZXN0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluc3RlYWQuJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICAgIHByb3BzRGVmLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXCIkcHJvcHMgaXMgcmVhZG9ubHkuXCIsIHRoaXMpO1xuICAgIH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckZGF0YScsIGRhdGFEZWYpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTtcblxuICBWdWUucHJvdG90eXBlLiRzZXQgPSBzZXQ7XG4gIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDtcblxuICBWdWUucHJvdG90eXBlLiR3YXRjaCA9IGZ1bmN0aW9uIChcbiAgICBleHBPckZuLFxuICAgIGNiLFxuICAgIG9wdGlvbnNcbiAgKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoaXNQbGFpbk9iamVjdChjYikpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucylcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy51c2VyID0gdHJ1ZTtcbiAgICB2YXIgd2F0Y2hlciA9IG5ldyBXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuaW1tZWRpYXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCB2bSwgKFwiY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyIFxcXCJcIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVud2F0Y2hGbiAoKSB7XG4gICAgICB3YXRjaGVyLnRlYXJkb3duKCk7XG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxudmFyIHVpZCQzID0gMDtcblxuZnVuY3Rpb24gaW5pdE1peGluIChWdWUpIHtcbiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICAvLyBhIHVpZFxuICAgIHZtLl91aWQgPSB1aWQkMysrO1xuXG4gICAgdmFyIHN0YXJ0VGFnLCBlbmRUYWc7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHN0YXJ0VGFnID0gXCJ2dWUtcGVyZi1zdGFydDpcIiArICh2bS5fdWlkKTtcbiAgICAgIGVuZFRhZyA9IFwidnVlLXBlcmYtZW5kOlwiICsgKHZtLl91aWQpO1xuICAgICAgbWFyayhzdGFydFRhZyk7XG4gICAgfVxuXG4gICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWRcbiAgICB2bS5faXNWdWUgPSB0cnVlO1xuICAgIC8vIG1lcmdlIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkge1xuICAgICAgLy8gb3B0aW1pemUgaW50ZXJuYWwgY29tcG9uZW50IGluc3RhbnRpYXRpb25cbiAgICAgIC8vIHNpbmNlIGR5bmFtaWMgb3B0aW9ucyBtZXJnaW5nIGlzIHByZXR0eSBzbG93LCBhbmQgbm9uZSBvZiB0aGVcbiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LlxuICAgICAgaW5pdEludGVybmFsQ29tcG9uZW50KHZtLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoXG4gICAgICAgIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnModm0uY29uc3RydWN0b3IpLFxuICAgICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaW5pdFByb3h5KHZtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uX3JlbmRlclByb3h5ID0gdm07XG4gICAgfVxuICAgIC8vIGV4cG9zZSByZWFsIHNlbGZcbiAgICB2bS5fc2VsZiA9IHZtO1xuICAgIGluaXRMaWZlY3ljbGUodm0pO1xuICAgIGluaXRFdmVudHModm0pO1xuICAgIGluaXRSZW5kZXIodm0pO1xuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlQ3JlYXRlJyk7XG4gICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHNcbiAgICBpbml0U3RhdGUodm0pO1xuICAgIGluaXRQcm92aWRlKHZtKTsgLy8gcmVzb2x2ZSBwcm92aWRlIGFmdGVyIGRhdGEvcHJvcHNcbiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7XG4gICAgICB2bS5fbmFtZSA9IGZvcm1hdENvbXBvbmVudE5hbWUodm0sIGZhbHNlKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgKHZtLl9uYW1lKSArIFwiIGluaXRcIiksIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgIH1cblxuICAgIGlmICh2bS4kb3B0aW9ucy5lbCkge1xuICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGluaXRJbnRlcm5hbENvbXBvbmVudCAodm0sIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7XG4gIC8vIGRvaW5nIHRoaXMgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuIGR5bmFtaWMgZW51bWVyYXRpb24uXG4gIHZhciBwYXJlbnRWbm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlO1xuICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuICBvcHRzLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlO1xuXG4gIHZhciB2bm9kZUNvbXBvbmVudE9wdGlvbnMgPSBwYXJlbnRWbm9kZS5jb21wb25lbnRPcHRpb25zO1xuICBvcHRzLnByb3BzRGF0YSA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGE7XG4gIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnM7XG4gIG9wdHMuX3JlbmRlckNoaWxkcmVuID0gdm5vZGVDb21wb25lbnRPcHRpb25zLmNoaWxkcmVuO1xuICBvcHRzLl9jb21wb25lbnRUYWcgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMudGFnO1xuXG4gIGlmIChvcHRpb25zLnJlbmRlcikge1xuICAgIG9wdHMucmVuZGVyID0gb3B0aW9ucy5yZW5kZXI7XG4gICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZucztcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zIChDdG9yKSB7XG4gIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zO1xuICBpZiAoQ3Rvci5zdXBlcikge1xuICAgIHZhciBzdXBlck9wdGlvbnMgPSByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zKEN0b3Iuc3VwZXIpO1xuICAgIHZhciBjYWNoZWRTdXBlck9wdGlvbnMgPSBDdG9yLnN1cGVyT3B0aW9ucztcbiAgICBpZiAoc3VwZXJPcHRpb25zICE9PSBjYWNoZWRTdXBlck9wdGlvbnMpIHtcbiAgICAgIC8vIHN1cGVyIG9wdGlvbiBjaGFuZ2VkLFxuICAgICAgLy8gbmVlZCB0byByZXNvbHZlIG5ldyBvcHRpb25zLlxuICAgICAgQ3Rvci5zdXBlck9wdGlvbnMgPSBzdXBlck9wdGlvbnM7XG4gICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGxhdGUtbW9kaWZpZWQvYXR0YWNoZWQgb3B0aW9ucyAoIzQ5NzYpXG4gICAgICB2YXIgbW9kaWZpZWRPcHRpb25zID0gcmVzb2x2ZU1vZGlmaWVkT3B0aW9ucyhDdG9yKTtcbiAgICAgIC8vIHVwZGF0ZSBiYXNlIGV4dGVuZCBvcHRpb25zXG4gICAgICBpZiAobW9kaWZpZWRPcHRpb25zKSB7XG4gICAgICAgIGV4dGVuZChDdG9yLmV4dGVuZE9wdGlvbnMsIG1vZGlmaWVkT3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBvcHRpb25zID0gQ3Rvci5vcHRpb25zID0gbWVyZ2VPcHRpb25zKHN1cGVyT3B0aW9ucywgQ3Rvci5leHRlbmRPcHRpb25zKTtcbiAgICAgIGlmIChvcHRpb25zLm5hbWUpIHtcbiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTW9kaWZpZWRPcHRpb25zIChDdG9yKSB7XG4gIHZhciBtb2RpZmllZDtcbiAgdmFyIGxhdGVzdCA9IEN0b3Iub3B0aW9ucztcbiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9ucztcbiAgZm9yICh2YXIga2V5IGluIGxhdGVzdCkge1xuICAgIGlmIChsYXRlc3Rba2V5XSAhPT0gc2VhbGVkW2tleV0pIHtcbiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfVxuICAgICAgbW9kaWZpZWRba2V5XSA9IGxhdGVzdFtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbW9kaWZpZWRcbn1cblxuZnVuY3Rpb24gVnVlIChvcHRpb25zKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgISh0aGlzIGluc3RhbmNlb2YgVnVlKVxuICApIHtcbiAgICB3YXJuKCdWdWUgaXMgYSBjb25zdHJ1Y3RvciBhbmQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBgbmV3YCBrZXl3b3JkJyk7XG4gIH1cbiAgdGhpcy5faW5pdChvcHRpb25zKTtcbn1cblxuaW5pdE1peGluKFZ1ZSk7XG5zdGF0ZU1peGluKFZ1ZSk7XG5ldmVudHNNaXhpbihWdWUpO1xubGlmZWN5Y2xlTWl4aW4oVnVlKTtcbnJlbmRlck1peGluKFZ1ZSk7XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0VXNlIChWdWUpIHtcbiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICB2YXIgaW5zdGFsbGVkUGx1Z2lucyA9ICh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zIHx8ICh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zID0gW10pKTtcbiAgICBpZiAoaW5zdGFsbGVkUGx1Z2lucy5pbmRleE9mKHBsdWdpbikgPiAtMSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzLCAxKTtcbiAgICBhcmdzLnVuc2hpZnQodGhpcyk7XG4gICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGx1Z2luLmluc3RhbGwuYXBwbHkocGx1Z2luLCBhcmdzKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9XG4gICAgaW5zdGFsbGVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgcmV0dXJuIHRoaXNcbiAgfTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHtcbiAgVnVlLm1peGluID0gZnVuY3Rpb24gKG1peGluKSB7XG4gICAgdGhpcy5vcHRpb25zID0gbWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucywgbWl4aW4pO1xuICAgIHJldHVybiB0aGlzXG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHtcbiAgLyoqXG4gICAqIEVhY2ggaW5zdGFuY2UgY29uc3RydWN0b3IsIGluY2x1ZGluZyBWdWUsIGhhcyBhIHVuaXF1ZVxuICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCBcImNoaWxkXG4gICAqIGNvbnN0cnVjdG9yc1wiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLlxuICAgKi9cbiAgVnVlLmNpZCA9IDA7XG4gIHZhciBjaWQgPSAxO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgVnVlLmV4dGVuZCA9IGZ1bmN0aW9uIChleHRlbmRPcHRpb25zKSB7XG4gICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307XG4gICAgdmFyIFN1cGVyID0gdGhpcztcbiAgICB2YXIgU3VwZXJJZCA9IFN1cGVyLmNpZDtcbiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pO1xuICAgIGlmIChjYWNoZWRDdG9yc1tTdXBlcklkXSkge1xuICAgICAgcmV0dXJuIGNhY2hlZEN0b3JzW1N1cGVySWRdXG4gICAgfVxuXG4gICAgdmFyIG5hbWUgPSBleHRlbmRPcHRpb25zLm5hbWUgfHwgU3VwZXIub3B0aW9ucy5uYW1lO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIG5hbWUpIHtcbiAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgU3ViID0gZnVuY3Rpb24gVnVlQ29tcG9uZW50IChvcHRpb25zKSB7XG4gICAgICB0aGlzLl9pbml0KG9wdGlvbnMpO1xuICAgIH07XG4gICAgU3ViLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3VwZXIucHJvdG90eXBlKTtcbiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViO1xuICAgIFN1Yi5jaWQgPSBjaWQrKztcbiAgICBTdWIub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhcbiAgICAgIFN1cGVyLm9wdGlvbnMsXG4gICAgICBleHRlbmRPcHRpb25zXG4gICAgKTtcbiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjtcblxuICAgIC8vIEZvciBwcm9wcyBhbmQgY29tcHV0ZWQgcHJvcGVydGllcywgd2UgZGVmaW5lIHRoZSBwcm94eSBnZXR0ZXJzIG9uXG4gICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXNcbiAgICAvLyBhdm9pZHMgT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxzIGZvciBlYWNoIGluc3RhbmNlIGNyZWF0ZWQuXG4gICAgaWYgKFN1Yi5vcHRpb25zLnByb3BzKSB7XG4gICAgICBpbml0UHJvcHMkMShTdWIpO1xuICAgIH1cbiAgICBpZiAoU3ViLm9wdGlvbnMuY29tcHV0ZWQpIHtcbiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7XG4gICAgfVxuXG4gICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlXG4gICAgU3ViLmV4dGVuZCA9IFN1cGVyLmV4dGVuZDtcbiAgICBTdWIubWl4aW4gPSBTdXBlci5taXhpbjtcbiAgICBTdWIudXNlID0gU3VwZXIudXNlO1xuXG4gICAgLy8gY3JlYXRlIGFzc2V0IHJlZ2lzdGVycywgc28gZXh0ZW5kZWQgY2xhc3Nlc1xuICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby5cbiAgICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICBTdWJbdHlwZV0gPSBTdXBlclt0eXBlXTtcbiAgICB9KTtcbiAgICAvLyBlbmFibGUgcmVjdXJzaXZlIHNlbGYtbG9va3VwXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7XG4gICAgfVxuXG4gICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS5cbiAgICAvLyBsYXRlciBhdCBpbnN0YW50aWF0aW9uIHdlIGNhbiBjaGVjayBpZiBTdXBlcidzIG9wdGlvbnMgaGF2ZVxuICAgIC8vIGJlZW4gdXBkYXRlZC5cbiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9ucztcbiAgICBTdWIuZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnM7XG4gICAgU3ViLnNlYWxlZE9wdGlvbnMgPSBleHRlbmQoe30sIFN1Yi5vcHRpb25zKTtcblxuICAgIC8vIGNhY2hlIGNvbnN0cnVjdG9yXG4gICAgY2FjaGVkQ3RvcnNbU3VwZXJJZF0gPSBTdWI7XG4gICAgcmV0dXJuIFN1YlxuICB9O1xufVxuXG5mdW5jdGlvbiBpbml0UHJvcHMkMSAoQ29tcCkge1xuICB2YXIgcHJvcHMgPSBDb21wLm9wdGlvbnMucHJvcHM7XG4gIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgIHByb3h5KENvbXAucHJvdG90eXBlLCBcIl9wcm9wc1wiLCBrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRDb21wdXRlZCQxIChDb21wKSB7XG4gIHZhciBjb21wdXRlZCA9IENvbXAub3B0aW9ucy5jb21wdXRlZDtcbiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7XG4gICAgZGVmaW5lQ29tcHV0ZWQoQ29tcC5wcm90b3R5cGUsIGtleSwgY29tcHV0ZWRba2V5XSk7XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRBc3NldFJlZ2lzdGVycyAoVnVlKSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuXG4gICAqL1xuICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKFxuICAgICAgaWQsXG4gICAgICBkZWZpbml0aW9uXG4gICAgKSB7XG4gICAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1t0eXBlICsgJ3MnXVtpZF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlID09PSAnY29tcG9uZW50Jykge1xuICAgICAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICBkZWZpbml0aW9uLm5hbWUgPSBkZWZpbml0aW9uLm5hbWUgfHwgaWQ7XG4gICAgICAgICAgZGVmaW5pdGlvbiA9IHRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQoZGVmaW5pdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdkaXJlY3RpdmUnICYmIHR5cGVvZiBkZWZpbml0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbiA9IHsgYmluZDogZGVmaW5pdGlvbiwgdXBkYXRlOiBkZWZpbml0aW9uIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zW3R5cGUgKyAncyddW2lkXSA9IGRlZmluaXRpb247XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5cbi8qICAqL1xuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZSAob3B0cykge1xuICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZylcbn1cblxuZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLmluZGV4T2YobmFtZSkgPiAtMVxuICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYXR0ZXJuLnNwbGl0KCcsJykuaW5kZXhPZihuYW1lKSA+IC0xXG4gIH0gZWxzZSBpZiAoaXNSZWdFeHAocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHtcbiAgdmFyIGNhY2hlID0ga2VlcEFsaXZlSW5zdGFuY2UuY2FjaGU7XG4gIHZhciBrZXlzID0ga2VlcEFsaXZlSW5zdGFuY2Uua2V5cztcbiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTtcbiAgZm9yICh2YXIga2V5IGluIGNhY2hlKSB7XG4gICAgdmFyIGNhY2hlZE5vZGUgPSBjYWNoZVtrZXldO1xuICAgIGlmIChjYWNoZWROb2RlKSB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoY2FjaGVkTm9kZS5jb21wb25lbnRPcHRpb25zKTtcbiAgICAgIGlmIChuYW1lICYmICFmaWx0ZXIobmFtZSkpIHtcbiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoXG4gIGNhY2hlLFxuICBrZXksXG4gIGtleXMsXG4gIGN1cnJlbnRcbikge1xuICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTtcbiAgaWYgKGNhY2hlZCQkMSAmJiAoIWN1cnJlbnQgfHwgY2FjaGVkJCQxLnRhZyAhPT0gY3VycmVudC50YWcpKSB7XG4gICAgY2FjaGVkJCQxLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7XG4gIH1cbiAgY2FjaGVba2V5XSA9IG51bGw7XG4gIHJlbW92ZShrZXlzLCBrZXkpO1xufVxuXG52YXIgcGF0dGVyblR5cGVzID0gW1N0cmluZywgUmVnRXhwLCBBcnJheV07XG5cbnZhciBLZWVwQWxpdmUgPSB7XG4gIG5hbWU6ICdrZWVwLWFsaXZlJyxcbiAgYWJzdHJhY3Q6IHRydWUsXG5cbiAgcHJvcHM6IHtcbiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsXG4gICAgZXhjbHVkZTogcGF0dGVyblR5cGVzLFxuICAgIG1heDogW1N0cmluZywgTnVtYmVyXVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQgKCkge1xuICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMua2V5cyA9IFtdO1xuICB9LFxuXG4gIGRlc3Ryb3llZDogZnVuY3Rpb24gZGVzdHJveWVkICgpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jYWNoZSkge1xuICAgICAgcHJ1bmVDYWNoZUVudHJ5KHRoaXMuY2FjaGUsIGtleSwgdGhpcy5rZXlzKTtcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB0aGlzLiR3YXRjaCgnaW5jbHVkZScsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHBydW5lQ2FjaGUodGhpcyQxLCBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gbWF0Y2hlcyh2YWwsIG5hbWUpOyB9KTtcbiAgICB9KTtcbiAgICB0aGlzLiR3YXRjaCgnZXhjbHVkZScsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHBydW5lQ2FjaGUodGhpcyQxLCBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gIW1hdGNoZXModmFsLCBuYW1lKTsgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkge1xuICAgIHZhciBzbG90ID0gdGhpcy4kc2xvdHMuZGVmYXVsdDtcbiAgICB2YXIgdm5vZGUgPSBnZXRGaXJzdENvbXBvbmVudENoaWxkKHNsb3QpO1xuICAgIHZhciBjb21wb25lbnRPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucztcbiAgICBpZiAoY29tcG9uZW50T3B0aW9ucykge1xuICAgICAgLy8gY2hlY2sgcGF0dGVyblxuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE9wdGlvbnMpO1xuICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICB2YXIgaW5jbHVkZSA9IHJlZi5pbmNsdWRlO1xuICAgICAgdmFyIGV4Y2x1ZGUgPSByZWYuZXhjbHVkZTtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gbm90IGluY2x1ZGVkXG4gICAgICAgIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkpIHx8XG4gICAgICAgIC8vIGV4Y2x1ZGVkXG4gICAgICAgIChleGNsdWRlICYmIG5hbWUgJiYgbWF0Y2hlcyhleGNsdWRlLCBuYW1lKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdm5vZGVcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZiQxID0gdGhpcztcbiAgICAgIHZhciBjYWNoZSA9IHJlZiQxLmNhY2hlO1xuICAgICAgdmFyIGtleXMgPSByZWYkMS5rZXlzO1xuICAgICAgdmFyIGtleSA9IHZub2RlLmtleSA9PSBudWxsXG4gICAgICAgIC8vIHNhbWUgY29uc3RydWN0b3IgbWF5IGdldCByZWdpc3RlcmVkIGFzIGRpZmZlcmVudCBsb2NhbCBjb21wb25lbnRzXG4gICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSlcbiAgICAgICAgPyBjb21wb25lbnRPcHRpb25zLkN0b3IuY2lkICsgKGNvbXBvbmVudE9wdGlvbnMudGFnID8gKFwiOjpcIiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpXG4gICAgICAgIDogdm5vZGUua2V5O1xuICAgICAgaWYgKGNhY2hlW2tleV0pIHtcbiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjYWNoZVtrZXldLmNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgICAvLyBtYWtlIGN1cnJlbnQga2V5IGZyZXNoZXN0XG4gICAgICAgIHJlbW92ZShrZXlzLCBrZXkpO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhY2hlW2tleV0gPSB2bm9kZTtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgIC8vIHBydW5lIG9sZGVzdCBlbnRyeVxuICAgICAgICBpZiAodGhpcy5tYXggJiYga2V5cy5sZW5ndGggPiBwYXJzZUludCh0aGlzLm1heCkpIHtcbiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleXNbMF0sIGtleXMsIHRoaXMuX3Zub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2bm9kZS5kYXRhLmtlZXBBbGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB2bm9kZSB8fCAoc2xvdCAmJiBzbG90WzBdKVxuICB9XG59O1xuXG52YXIgYnVpbHRJbkNvbXBvbmVudHMgPSB7XG4gIEtlZXBBbGl2ZTogS2VlcEFsaXZlXG59O1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7XG4gIC8vIGNvbmZpZ1xuICB2YXIgY29uZmlnRGVmID0ge307XG4gIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdEbyBub3QgcmVwbGFjZSB0aGUgVnVlLmNvbmZpZyBvYmplY3QsIHNldCBpbmRpdmlkdWFsIGZpZWxkcyBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTtcblxuICAvLyBleHBvc2VkIHV0aWwgbWV0aG9kcy5cbiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uXG4gIC8vIHRoZW0gdW5sZXNzIHlvdSBhcmUgYXdhcmUgb2YgdGhlIHJpc2suXG4gIFZ1ZS51dGlsID0ge1xuICAgIHdhcm46IHdhcm4sXG4gICAgZXh0ZW5kOiBleHRlbmQsXG4gICAgbWVyZ2VPcHRpb25zOiBtZXJnZU9wdGlvbnMsXG4gICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlJCQxXG4gIH07XG5cbiAgVnVlLnNldCA9IHNldDtcbiAgVnVlLmRlbGV0ZSA9IGRlbDtcbiAgVnVlLm5leHRUaWNrID0gbmV4dFRpY2s7XG5cbiAgLy8gMi42IGV4cGxpY2l0IG9ic2VydmFibGUgQVBJXG4gIFZ1ZS5vYnNlcnZhYmxlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIG9ic2VydmUob2JqKTtcbiAgICByZXR1cm4gb2JqXG4gIH07XG5cbiAgVnVlLm9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9KTtcblxuICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIFwiYmFzZVwiIGNvbnN0cnVjdG9yIHRvIGV4dGVuZCBhbGwgcGxhaW4tb2JqZWN0XG4gIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLlxuICBWdWUub3B0aW9ucy5fYmFzZSA9IFZ1ZTtcblxuICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpO1xuXG4gIGluaXRVc2UoVnVlKTtcbiAgaW5pdE1peGluJDEoVnVlKTtcbiAgaW5pdEV4dGVuZChWdWUpO1xuICBpbml0QXNzZXRSZWdpc3RlcnMoVnVlKTtcbn1cblxuaW5pdEdsb2JhbEFQSShWdWUpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRpc1NlcnZlcicsIHtcbiAgZ2V0OiBpc1NlcnZlclJlbmRlcmluZ1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJHNzckNvbnRleHQnLCB7XG4gIGdldDogZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0XG4gIH1cbn0pO1xuXG4vLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb25cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUsICdGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCcsIHtcbiAgdmFsdWU6IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0XG59KTtcblxuVnVlLnZlcnNpb24gPSAnMi42LjEyJztcblxuLyogICovXG5cbi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheVxuLy8gZHVyaW5nIHRlbXBsYXRlIGNvbXBpbGF0aW9uXG52YXIgaXNSZXNlcnZlZEF0dHIgPSBtYWtlTWFwKCdzdHlsZSxjbGFzcycpO1xuXG4vLyBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHVzaW5nIHByb3BzIGZvciBiaW5kaW5nXG52YXIgYWNjZXB0VmFsdWUgPSBtYWtlTWFwKCdpbnB1dCx0ZXh0YXJlYSxvcHRpb24sc2VsZWN0LHByb2dyZXNzJyk7XG52YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7XG4gIHJldHVybiAoXG4gICAgKGF0dHIgPT09ICd2YWx1ZScgJiYgYWNjZXB0VmFsdWUodGFnKSkgJiYgdHlwZSAhPT0gJ2J1dHRvbicgfHxcbiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fFxuICAgIChhdHRyID09PSAnY2hlY2tlZCcgJiYgdGFnID09PSAnaW5wdXQnKSB8fFxuICAgIChhdHRyID09PSAnbXV0ZWQnICYmIHRhZyA9PT0gJ3ZpZGVvJylcbiAgKVxufTtcblxudmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTtcblxudmFyIGlzVmFsaWRDb250ZW50RWRpdGFibGVWYWx1ZSA9IG1ha2VNYXAoJ2V2ZW50cyxjYXJldCx0eXBpbmcscGxhaW50ZXh0LW9ubHknKTtcblxudmFyIGNvbnZlcnRFbnVtZXJhdGVkVmFsdWUgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkgfHwgdmFsdWUgPT09ICdmYWxzZSdcbiAgICA/ICdmYWxzZSdcbiAgICAvLyBhbGxvdyBhcmJpdHJhcnkgc3RyaW5nIHZhbHVlIGZvciBjb250ZW50ZWRpdGFibGVcbiAgICA6IGtleSA9PT0gJ2NvbnRlbnRlZGl0YWJsZScgJiYgaXNWYWxpZENvbnRlbnRFZGl0YWJsZVZhbHVlKHZhbHVlKVxuICAgICAgPyB2YWx1ZVxuICAgICAgOiAndHJ1ZSdcbn07XG5cbnZhciBpc0Jvb2xlYW5BdHRyID0gbWFrZU1hcChcbiAgJ2FsbG93ZnVsbHNjcmVlbixhc3luYyxhdXRvZm9jdXMsYXV0b3BsYXksY2hlY2tlZCxjb21wYWN0LGNvbnRyb2xzLGRlY2xhcmUsJyArXG4gICdkZWZhdWx0LGRlZmF1bHRjaGVja2VkLGRlZmF1bHRtdXRlZCxkZWZhdWx0c2VsZWN0ZWQsZGVmZXIsZGlzYWJsZWQsJyArXG4gICdlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLCcgK1xuICAnbXV0ZWQsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm92YWxpZGF0ZSxub3dyYXAsb3BlbixwYXVzZW9uZXhpdCxyZWFkb25seSwnICtcbiAgJ3JlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxzZWxlY3RlZCxzb3J0YWJsZSx0cmFuc2xhdGUsJyArXG4gICd0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlJ1xuKTtcblxudmFyIHhsaW5rTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc7XG5cbnZhciBpc1hsaW5rID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUuY2hhckF0KDUpID09PSAnOicgJiYgbmFtZS5zbGljZSgwLCA1KSA9PT0gJ3hsaW5rJ1xufTtcblxudmFyIGdldFhsaW5rUHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBpc1hsaW5rKG5hbWUpID8gbmFtZS5zbGljZSg2LCBuYW1lLmxlbmd0aCkgOiAnJ1xufTtcblxudmFyIGlzRmFsc3lBdHRyVmFsdWUgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCB2YWwgPT09IGZhbHNlXG59O1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gZ2VuQ2xhc3NGb3JWbm9kZSAodm5vZGUpIHtcbiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlO1xuICB2YXIgY2hpbGROb2RlID0gdm5vZGU7XG4gIHdoaWxlIChpc0RlZihjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UpKSB7XG4gICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtcbiAgICBpZiAoY2hpbGROb2RlICYmIGNoaWxkTm9kZS5kYXRhKSB7XG4gICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoY2hpbGROb2RlLmRhdGEsIGRhdGEpO1xuICAgIH1cbiAgfVxuICB3aGlsZSAoaXNEZWYocGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50KSkge1xuICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZGF0YSkge1xuICAgICAgZGF0YSA9IG1lcmdlQ2xhc3NEYXRhKGRhdGEsIHBhcmVudE5vZGUuZGF0YSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZW5kZXJDbGFzcyhkYXRhLnN0YXRpY0NsYXNzLCBkYXRhLmNsYXNzKVxufVxuXG5mdW5jdGlvbiBtZXJnZUNsYXNzRGF0YSAoY2hpbGQsIHBhcmVudCkge1xuICByZXR1cm4ge1xuICAgIHN0YXRpY0NsYXNzOiBjb25jYXQoY2hpbGQuc3RhdGljQ2xhc3MsIHBhcmVudC5zdGF0aWNDbGFzcyksXG4gICAgY2xhc3M6IGlzRGVmKGNoaWxkLmNsYXNzKVxuICAgICAgPyBbY2hpbGQuY2xhc3MsIHBhcmVudC5jbGFzc11cbiAgICAgIDogcGFyZW50LmNsYXNzXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyQ2xhc3MgKFxuICBzdGF0aWNDbGFzcyxcbiAgZHluYW1pY0NsYXNzXG4pIHtcbiAgaWYgKGlzRGVmKHN0YXRpY0NsYXNzKSB8fCBpc0RlZihkeW5hbWljQ2xhc3MpKSB7XG4gICAgcmV0dXJuIGNvbmNhdChzdGF0aWNDbGFzcywgc3RyaW5naWZ5Q2xhc3MoZHluYW1pY0NsYXNzKSlcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gJydcbn1cblxuZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIHJldHVybiBhID8gYiA/IChhICsgJyAnICsgYikgOiBhIDogKGIgfHwgJycpXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUNsYXNzICh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUpXG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gJydcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkgKHZhbHVlKSB7XG4gIHZhciByZXMgPSAnJztcbiAgdmFyIHN0cmluZ2lmaWVkO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmIChpc0RlZihzdHJpbmdpZmllZCA9IHN0cmluZ2lmeUNsYXNzKHZhbHVlW2ldKSkgJiYgc3RyaW5naWZpZWQgIT09ICcnKSB7XG4gICAgICBpZiAocmVzKSB7IHJlcyArPSAnICc7IH1cbiAgICAgIHJlcyArPSBzdHJpbmdpZmllZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHZhbHVlKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlW2tleV0pIHtcbiAgICAgIGlmIChyZXMpIHsgcmVzICs9ICcgJzsgfVxuICAgICAgcmVzICs9IGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxudmFyIG5hbWVzcGFjZU1hcCA9IHtcbiAgc3ZnOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCdcbn07XG5cbnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKFxuICAnaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsJyArXG4gICdhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sJyArXG4gICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICtcbiAgJ2EsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSwnICtcbiAgJ3Msc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLCcgK1xuICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArXG4gICdjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0ciwnICtcbiAgJ2J1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sJyArXG4gICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgK1xuICAnZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LCcgK1xuICAnY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCdcbik7XG5cbi8vIHRoaXMgbWFwIGlzIGludGVudGlvbmFsbHkgc2VsZWN0aXZlLCBvbmx5IGNvdmVyaW5nIFNWRyBlbGVtZW50cyB0aGF0IG1heVxuLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy5cbnZhciBpc1NWRyA9IG1ha2VNYXAoXG4gICdzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsJyArXG4gICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICtcbiAgJ3BvbHlnb24scG9seWxpbmUscmVjdCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dHBhdGgsdHNwYW4sdXNlLHZpZXcnLFxuICB0cnVlXG4pO1xuXG52YXIgaXNSZXNlcnZlZFRhZyA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgcmV0dXJuIGlzSFRNTFRhZyh0YWcpIHx8IGlzU1ZHKHRhZylcbn07XG5cbmZ1bmN0aW9uIGdldFRhZ05hbWVzcGFjZSAodGFnKSB7XG4gIGlmIChpc1NWRyh0YWcpKSB7XG4gICAgcmV0dXJuICdzdmcnXG4gIH1cbiAgLy8gYmFzaWMgc3VwcG9ydCBmb3IgTWF0aE1MXG4gIC8vIG5vdGUgaXQgZG9lc24ndCBzdXBwb3J0IG90aGVyIE1hdGhNTCBlbGVtZW50cyBiZWluZyBjb21wb25lbnQgcm9vdHNcbiAgaWYgKHRhZyA9PT0gJ21hdGgnKSB7XG4gICAgcmV0dXJuICdtYXRoJ1xuICB9XG59XG5cbnZhciB1bmtub3duRWxlbWVudENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQgKHRhZykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCFpbkJyb3dzZXIpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmIChpc1Jlc2VydmVkVGFnKHRhZykpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICB0YWcgPSB0YWcudG9Mb3dlckNhc2UoKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gIT0gbnVsbCkge1xuICAgIHJldHVybiB1bmtub3duRWxlbWVudENhY2hlW3RhZ11cbiAgfVxuICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gIGlmICh0YWcuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yODIxMDM2NC8xMDcwMjQ0XG4gICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAoXG4gICAgICBlbC5jb25zdHJ1Y3RvciA9PT0gd2luZG93LkhUTUxVbmtub3duRWxlbWVudCB8fFxuICAgICAgZWwuY29uc3RydWN0b3IgPT09IHdpbmRvdy5IVE1MRWxlbWVudFxuICAgICkpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAvSFRNTFVua25vd25FbGVtZW50Ly50ZXN0KGVsLnRvU3RyaW5nKCkpKVxuICB9XG59XG5cbnZhciBpc1RleHRJbnB1dFR5cGUgPSBtYWtlTWFwKCd0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCcpO1xuXG4vKiAgKi9cblxuLyoqXG4gKiBRdWVyeSBhbiBlbGVtZW50IHNlbGVjdG9yIGlmIGl0J3Mgbm90IGFuIGVsZW1lbnQgYWxyZWFkeS5cbiAqL1xuZnVuY3Rpb24gcXVlcnkgKGVsKSB7XG4gIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7XG4gICAgaWYgKCFzZWxlY3RlZCkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAnQ2Fubm90IGZpbmQgZWxlbWVudDogJyArIGVsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RlZFxuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbFxuICB9XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50JDEgKHRhZ05hbWUsIHZub2RlKSB7XG4gIHZhciBlbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICBpZiAodGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHtcbiAgICByZXR1cm4gZWxtXG4gIH1cbiAgLy8gZmFsc2Ugb3IgbnVsbCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGJ1dCB1bmRlZmluZWQgd2lsbCBub3RcbiAgaWYgKHZub2RlLmRhdGEgJiYgdm5vZGUuZGF0YS5hdHRycyAmJiB2bm9kZS5kYXRhLmF0dHJzLm11bHRpcGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbG0uc2V0QXR0cmlidXRlKCdtdWx0aXBsZScsICdtdWx0aXBsZScpO1xuICB9XG4gIHJldHVybiBlbG1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TIChuYW1lc3BhY2UsIHRhZ05hbWUpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VNYXBbbmFtZXNwYWNlXSwgdGFnTmFtZSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUgKHRleHQpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQodGV4dClcbn1cblxuZnVuY3Rpb24gaW5zZXJ0QmVmb3JlIChwYXJlbnROb2RlLCBuZXdOb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZCAobm9kZSwgY2hpbGQpIHtcbiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENoaWxkIChub2RlLCBjaGlsZCkge1xuICBub2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cblxuZnVuY3Rpb24gcGFyZW50Tm9kZSAobm9kZSkge1xuICByZXR1cm4gbm9kZS5wYXJlbnROb2RlXG59XG5cbmZ1bmN0aW9uIG5leHRTaWJsaW5nIChub2RlKSB7XG4gIHJldHVybiBub2RlLm5leHRTaWJsaW5nXG59XG5cbmZ1bmN0aW9uIHRhZ05hbWUgKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudGFnTmFtZVxufVxuXG5mdW5jdGlvbiBzZXRUZXh0Q29udGVudCAobm9kZSwgdGV4dCkge1xuICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn1cblxuZnVuY3Rpb24gc2V0U3R5bGVTY29wZSAobm9kZSwgc2NvcGVJZCkge1xuICBub2RlLnNldEF0dHJpYnV0ZShzY29wZUlkLCAnJyk7XG59XG5cbnZhciBub2RlT3BzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50JDEsXG4gIGNyZWF0ZUVsZW1lbnROUzogY3JlYXRlRWxlbWVudE5TLFxuICBjcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsXG4gIGNyZWF0ZUNvbW1lbnQ6IGNyZWF0ZUNvbW1lbnQsXG4gIGluc2VydEJlZm9yZTogaW5zZXJ0QmVmb3JlLFxuICByZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsXG4gIGFwcGVuZENoaWxkOiBhcHBlbmRDaGlsZCxcbiAgcGFyZW50Tm9kZTogcGFyZW50Tm9kZSxcbiAgbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLFxuICB0YWdOYW1lOiB0YWdOYW1lLFxuICBzZXRUZXh0Q29udGVudDogc2V0VGV4dENvbnRlbnQsXG4gIHNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGVcbn0pO1xuXG4vKiAgKi9cblxudmFyIHJlZiA9IHtcbiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7XG4gICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7XG4gICAgaWYgKG9sZFZub2RlLmRhdGEucmVmICE9PSB2bm9kZS5kYXRhLnJlZikge1xuICAgICAgcmVnaXN0ZXJSZWYob2xkVm5vZGUsIHRydWUpO1xuICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICAgIH1cbiAgfSxcbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHtcbiAgICByZWdpc3RlclJlZih2bm9kZSwgdHJ1ZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7XG4gIHZhciBrZXkgPSB2bm9kZS5kYXRhLnJlZjtcbiAgaWYgKCFpc0RlZihrZXkpKSB7IHJldHVybiB9XG5cbiAgdmFyIHZtID0gdm5vZGUuY29udGV4dDtcbiAgdmFyIHJlZiA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlIHx8IHZub2RlLmVsbTtcbiAgdmFyIHJlZnMgPSB2bS4kcmVmcztcbiAgaWYgKGlzUmVtb3ZhbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHtcbiAgICAgIHJlbW92ZShyZWZzW2tleV0sIHJlZik7XG4gICAgfSBlbHNlIGlmIChyZWZzW2tleV0gPT09IHJlZikge1xuICAgICAgcmVmc1trZXldID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodm5vZGUuZGF0YS5yZWZJbkZvcikge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHtcbiAgICAgICAgcmVmc1trZXldID0gW3JlZl07XG4gICAgICB9IGVsc2UgaWYgKHJlZnNba2V5XS5pbmRleE9mKHJlZikgPCAwKSB7XG4gICAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgICAgICByZWZzW2tleV0ucHVzaChyZWYpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWZzW2tleV0gPSByZWY7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmlydHVhbCBET00gcGF0Y2hpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIFNuYWJiZG9tIGJ5XG4gKiBTaW1vbiBGcmlpcyBWaW5kdW0gKEBwYWxkZXBpbmQpXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxkZXBpbmQvc25hYmJkb20vYmxvYi9tYXN0ZXIvTElDRU5TRVxuICpcbiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKVxuICpcbiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgYmVjYXVzZSB0aGlzIGZpbGUgaXMgcGVyZi1jcml0aWNhbCBhbmQgdGhlIGNvc3RcbiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LlxuICovXG5cbnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7XG5cbnZhciBob29rcyA9IFsnY3JlYXRlJywgJ2FjdGl2YXRlJywgJ3VwZGF0ZScsICdyZW1vdmUnLCAnZGVzdHJveSddO1xuXG5mdW5jdGlvbiBzYW1lVm5vZGUgKGEsIGIpIHtcbiAgcmV0dXJuIChcbiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKFxuICAgICAgKFxuICAgICAgICBhLnRhZyA9PT0gYi50YWcgJiZcbiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmXG4gICAgICAgIGlzRGVmKGEuZGF0YSkgPT09IGlzRGVmKGIuZGF0YSkgJiZcbiAgICAgICAgc2FtZUlucHV0VHlwZShhLCBiKVxuICAgICAgKSB8fCAoXG4gICAgICAgIGlzVHJ1ZShhLmlzQXN5bmNQbGFjZWhvbGRlcikgJiZcbiAgICAgICAgYS5hc3luY0ZhY3RvcnkgPT09IGIuYXN5bmNGYWN0b3J5ICYmXG4gICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHtcbiAgaWYgKGEudGFnICE9PSAnaW5wdXQnKSB7IHJldHVybiB0cnVlIH1cbiAgdmFyIGk7XG4gIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHZhciB0eXBlQiA9IGlzRGVmKGkgPSBiLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHJldHVybiB0eXBlQSA9PT0gdHlwZUIgfHwgaXNUZXh0SW5wdXRUeXBlKHR5cGVBKSAmJiBpc1RleHRJbnB1dFR5cGUodHlwZUIpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVRvT2xkSWR4IChjaGlsZHJlbiwgYmVnaW5JZHgsIGVuZElkeCkge1xuICB2YXIgaSwga2V5O1xuICB2YXIgbWFwID0ge307XG4gIGZvciAoaSA9IGJlZ2luSWR4OyBpIDw9IGVuZElkeDsgKytpKSB7XG4gICAga2V5ID0gY2hpbGRyZW5baV0ua2V5O1xuICAgIGlmIChpc0RlZihrZXkpKSB7IG1hcFtrZXldID0gaTsgfVxuICB9XG4gIHJldHVybiBtYXBcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkge1xuICB2YXIgaSwgajtcbiAgdmFyIGNicyA9IHt9O1xuXG4gIHZhciBtb2R1bGVzID0gYmFja2VuZC5tb2R1bGVzO1xuICB2YXIgbm9kZU9wcyA9IGJhY2tlbmQubm9kZU9wcztcblxuICBmb3IgKGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyArK2kpIHtcbiAgICBjYnNbaG9va3NbaV1dID0gW107XG4gICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHtcbiAgICAgIGlmIChpc0RlZihtb2R1bGVzW2pdW2hvb2tzW2ldXSkpIHtcbiAgICAgICAgY2JzW2hvb2tzW2ldXS5wdXNoKG1vZHVsZXNbal1baG9va3NbaV1dKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbXB0eU5vZGVBdCAoZWxtKSB7XG4gICAgcmV0dXJuIG5ldyBWTm9kZShub2RlT3BzLnRhZ05hbWUoZWxtKS50b0xvd2VyQ2FzZSgpLCB7fSwgW10sIHVuZGVmaW5lZCwgZWxtKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUm1DYiAoY2hpbGRFbG0sIGxpc3RlbmVycykge1xuICAgIGZ1bmN0aW9uIHJlbW92ZSQkMSAoKSB7XG4gICAgICBpZiAoLS1yZW1vdmUkJDEubGlzdGVuZXJzID09PSAwKSB7XG4gICAgICAgIHJlbW92ZU5vZGUoY2hpbGRFbG0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZW1vdmUkJDEubGlzdGVuZXJzID0gbGlzdGVuZXJzO1xuICAgIHJldHVybiByZW1vdmUkJDFcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7XG4gICAgdmFyIHBhcmVudCA9IG5vZGVPcHMucGFyZW50Tm9kZShlbCk7XG4gICAgLy8gZWxlbWVudCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBkdWUgdG8gdi1odG1sIC8gdi10ZXh0XG4gICAgaWYgKGlzRGVmKHBhcmVudCkpIHtcbiAgICAgIG5vZGVPcHMucmVtb3ZlQ2hpbGQocGFyZW50LCBlbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNVbmtub3duRWxlbWVudCQkMSAodm5vZGUsIGluVlByZSkge1xuICAgIHJldHVybiAoXG4gICAgICAhaW5WUHJlICYmXG4gICAgICAhdm5vZGUubnMgJiZcbiAgICAgICEoXG4gICAgICAgIGNvbmZpZy5pZ25vcmVkRWxlbWVudHMubGVuZ3RoICYmXG4gICAgICAgIGNvbmZpZy5pZ25vcmVkRWxlbWVudHMuc29tZShmdW5jdGlvbiAoaWdub3JlKSB7XG4gICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSlcbiAgICAgICAgICAgID8gaWdub3JlLnRlc3Qodm5vZGUudGFnKVxuICAgICAgICAgICAgOiBpZ25vcmUgPT09IHZub2RlLnRhZ1xuICAgICAgICB9KVxuICAgICAgKSAmJlxuICAgICAgY29uZmlnLmlzVW5rbm93bkVsZW1lbnQodm5vZGUudGFnKVxuICAgIClcbiAgfVxuXG4gIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxtIChcbiAgICB2bm9kZSxcbiAgICBpbnNlcnRlZFZub2RlUXVldWUsXG4gICAgcGFyZW50RWxtLFxuICAgIHJlZkVsbSxcbiAgICBuZXN0ZWQsXG4gICAgb3duZXJBcnJheSxcbiAgICBpbmRleFxuICApIHtcbiAgICBpZiAoaXNEZWYodm5vZGUuZWxtKSAmJiBpc0RlZihvd25lckFycmF5KSkge1xuICAgICAgLy8gVGhpcyB2bm9kZSB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIHJlbmRlciFcbiAgICAgIC8vIG5vdyBpdCdzIHVzZWQgYXMgYSBuZXcgbm9kZSwgb3ZlcndyaXRpbmcgaXRzIGVsbSB3b3VsZCBjYXVzZVxuICAgICAgLy8gcG90ZW50aWFsIHBhdGNoIGVycm9ycyBkb3duIHRoZSByb2FkIHdoZW4gaXQncyB1c2VkIGFzIGFuIGluc2VydGlvblxuICAgICAgLy8gcmVmZXJlbmNlIG5vZGUuIEluc3RlYWQsIHdlIGNsb25lIHRoZSBub2RlIG9uLWRlbWFuZCBiZWZvcmUgY3JlYXRpbmdcbiAgICAgIC8vIGFzc29jaWF0ZWQgRE9NIGVsZW1lbnQgZm9yIGl0LlxuICAgICAgdm5vZGUgPSBvd25lckFycmF5W2luZGV4XSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgIH1cblxuICAgIHZub2RlLmlzUm9vdEluc2VydCA9ICFuZXN0ZWQ7IC8vIGZvciB0cmFuc2l0aW9uIGVudGVyIGNoZWNrXG4gICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgdGFnID0gdm5vZGUudGFnO1xuICAgIGlmIChpc0RlZih0YWcpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnByZSkge1xuICAgICAgICAgIGNyZWF0aW5nRWxtSW5WUHJlKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW5rbm93bkVsZW1lbnQkJDEodm5vZGUsIGNyZWF0aW5nRWxtSW5WUHJlKSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArXG4gICAgICAgICAgICAncmVnaXN0ZXIgdGhlIGNvbXBvbmVudCBjb3JyZWN0bHk/IEZvciByZWN1cnNpdmUgY29tcG9uZW50cywgJyArXG4gICAgICAgICAgICAnbWFrZSBzdXJlIHRvIHByb3ZpZGUgdGhlIFwibmFtZVwiIG9wdGlvbi4nLFxuICAgICAgICAgICAgdm5vZGUuY29udGV4dFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdm5vZGUuZWxtID0gdm5vZGUubnNcbiAgICAgICAgPyBub2RlT3BzLmNyZWF0ZUVsZW1lbnROUyh2bm9kZS5ucywgdGFnKVxuICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTtcbiAgICAgIHNldFNjb3BlKHZub2RlKTtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICB7XG4gICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBkYXRhICYmIGRhdGEucHJlKSB7XG4gICAgICAgIGNyZWF0aW5nRWxtSW5WUHJlLS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1RydWUodm5vZGUuaXNDb21tZW50KSkge1xuICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVDb21tZW50KHZub2RlLnRleHQpO1xuICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bm9kZS5lbG0gPSBub2RlT3BzLmNyZWF0ZVRleHROb2RlKHZub2RlLnRleHQpO1xuICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pIHtcbiAgICB2YXIgaSA9IHZub2RlLmRhdGE7XG4gICAgaWYgKGlzRGVmKGkpKSB7XG4gICAgICB2YXIgaXNSZWFjdGl2YXRlZCA9IGlzRGVmKHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpLmtlZXBBbGl2ZTtcbiAgICAgIGlmIChpc0RlZihpID0gaS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkge1xuICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8pO1xuICAgICAgfVxuICAgICAgLy8gYWZ0ZXIgY2FsbGluZyB0aGUgaW5pdCBob29rLCBpZiB0aGUgdm5vZGUgaXMgYSBjaGlsZCBjb21wb25lbnRcbiAgICAgIC8vIGl0IHNob3VsZCd2ZSBjcmVhdGVkIGEgY2hpbGQgaW5zdGFuY2UgYW5kIG1vdW50ZWQgaXQuIHRoZSBjaGlsZFxuICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uXG4gICAgICAvLyBpbiB0aGF0IGNhc2Ugd2UgY2FuIGp1c3QgcmV0dXJuIHRoZSBlbGVtZW50IGFuZCBiZSBkb25lLlxuICAgICAgaWYgKGlzRGVmKHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSkge1xuICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBpbnNlcnQocGFyZW50RWxtLCB2bm9kZS5lbG0sIHJlZkVsbSk7XG4gICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHtcbiAgICAgICAgICByZWFjdGl2YXRlQ29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkge1xuICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2guYXBwbHkoaW5zZXJ0ZWRWbm9kZVF1ZXVlLCB2bm9kZS5kYXRhLnBlbmRpbmdJbnNlcnQpO1xuICAgICAgdm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0ID0gbnVsbDtcbiAgICB9XG4gICAgdm5vZGUuZWxtID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UuJGVsO1xuICAgIGlmIChpc1BhdGNoYWJsZSh2bm9kZSkpIHtcbiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgc2V0U2NvcGUodm5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC5cbiAgICAgIC8vIHNraXAgYWxsIGVsZW1lbnQtcmVsYXRlZCBtb2R1bGVzIGV4Y2VwdCBmb3IgcmVmICgjMzQ1NSlcbiAgICAgIHJlZ2lzdGVyUmVmKHZub2RlKTtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rXG4gICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhY3RpdmF0ZUNvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pIHtcbiAgICB2YXIgaTtcbiAgICAvLyBoYWNrIGZvciAjNDMzOTogYSByZWFjdGl2YXRlZCBjb21wb25lbnQgd2l0aCBpbm5lciB0cmFuc2l0aW9uXG4gICAgLy8gZG9lcyBub3QgdHJpZ2dlciBiZWNhdXNlIHRoZSBpbm5lciBub2RlJ3MgY3JlYXRlZCBob29rcyBhcmUgbm90IGNhbGxlZFxuICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dFxuICAgIC8vIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGJldHRlciB3YXkgdG8gZG8gaXQuXG4gICAgdmFyIGlubmVyTm9kZSA9IHZub2RlO1xuICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIGlubmVyTm9kZSA9IGlubmVyTm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7XG4gICAgICBpZiAoaXNEZWYoaSA9IGlubmVyTm9kZS5kYXRhKSAmJiBpc0RlZihpID0gaS50cmFuc2l0aW9uKSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY2JzLmFjdGl2YXRlW2ldKGVtcHR5Tm9kZSwgaW5uZXJOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB1bmxpa2UgYSBuZXdseSBjcmVhdGVkIGNvbXBvbmVudCxcbiAgICAvLyBhIHJlYWN0aXZhdGVkIGtlZXAtYWxpdmUgY29tcG9uZW50IGRvZXNuJ3QgaW5zZXJ0IGl0c2VsZlxuICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkge1xuICAgIGlmIChpc0RlZihwYXJlbnQpKSB7XG4gICAgICBpZiAoaXNEZWYocmVmJCQxKSkge1xuICAgICAgICBpZiAobm9kZU9wcy5wYXJlbnROb2RlKHJlZiQkMSkgPT09IHBhcmVudCkge1xuICAgICAgICAgIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudCwgZWxtLCByZWYkJDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlT3BzLmFwcGVuZENoaWxkKHBhcmVudCwgZWxtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhjaGlsZHJlbik7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNyZWF0ZUVsbShjaGlsZHJlbltpXSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCB2bm9kZS5lbG0sIG51bGwsIHRydWUsIGNoaWxkcmVuLCBpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZub2RlLnRleHQpKSB7XG4gICAgICBub2RlT3BzLmFwcGVuZENoaWxkKHZub2RlLmVsbSwgbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZShTdHJpbmcodm5vZGUudGV4dCkpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1BhdGNoYWJsZSAodm5vZGUpIHtcbiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIHZub2RlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO1xuICAgIH1cbiAgICByZXR1cm4gaXNEZWYodm5vZGUudGFnKVxuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlQ3JlYXRlSG9va3MgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBjYnMuY3JlYXRlLmxlbmd0aDsgKytpJDEpIHtcbiAgICAgIGNicy5jcmVhdGVbaSQxXShlbXB0eU5vZGUsIHZub2RlKTtcbiAgICB9XG4gICAgaSA9IHZub2RlLmRhdGEuaG9vazsgLy8gUmV1c2UgdmFyaWFibGVcbiAgICBpZiAoaXNEZWYoaSkpIHtcbiAgICAgIGlmIChpc0RlZihpLmNyZWF0ZSkpIHsgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7IH1cbiAgICAgIGlmIChpc0RlZihpLmluc2VydCkpIHsgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2godm5vZGUpOyB9XG4gICAgfVxuICB9XG5cbiAgLy8gc2V0IHNjb3BlIGlkIGF0dHJpYnV0ZSBmb3Igc2NvcGVkIENTUy5cbiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWRcbiAgLy8gb2YgZ29pbmcgdGhyb3VnaCB0aGUgbm9ybWFsIGF0dHJpYnV0ZSBwYXRjaGluZyBwcm9jZXNzLlxuICBmdW5jdGlvbiBzZXRTY29wZSAodm5vZGUpIHtcbiAgICB2YXIgaTtcbiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmZuU2NvcGVJZCkpIHtcbiAgICAgIG5vZGVPcHMuc2V0U3R5bGVTY29wZSh2bm9kZS5lbG0sIGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYW5jZXN0b3IgPSB2bm9kZTtcbiAgICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgICBpZiAoaXNEZWYoaSA9IGFuY2VzdG9yLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkge1xuICAgICAgICAgIG5vZGVPcHMuc2V0U3R5bGVTY29wZSh2bm9kZS5lbG0sIGkpO1xuICAgICAgICB9XG4gICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBmb3Igc2xvdCBjb250ZW50IHRoZXkgc2hvdWxkIGFsc28gZ2V0IHRoZSBzY29wZUlkIGZyb20gdGhlIGhvc3QgaW5zdGFuY2UuXG4gICAgaWYgKGlzRGVmKGkgPSBhY3RpdmVJbnN0YW5jZSkgJiZcbiAgICAgIGkgIT09IHZub2RlLmNvbnRleHQgJiZcbiAgICAgIGkgIT09IHZub2RlLmZuQ29udGV4dCAmJlxuICAgICAgaXNEZWYoaSA9IGkuJG9wdGlvbnMuX3Njb3BlSWQpXG4gICAgKSB7XG4gICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRWbm9kZXMgKHBhcmVudEVsbSwgcmVmRWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHtcbiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBmYWxzZSwgdm5vZGVzLCBzdGFydElkeCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRGVzdHJveUhvb2sgKHZub2RlKSB7XG4gICAgdmFyIGksIGo7XG4gICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIGlmIChpc0RlZihkYXRhKSkge1xuICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmRlc3Ryb3kpKSB7IGkodm5vZGUpOyB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmRlc3Ryb3kubGVuZ3RoOyArK2kpIHsgY2JzLmRlc3Ryb3lbaV0odm5vZGUpOyB9XG4gICAgfVxuICAgIGlmIChpc0RlZihpID0gdm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHtcbiAgICAgICAgaW52b2tlRGVzdHJveUhvb2sodm5vZGUuY2hpbGRyZW5bal0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZVZub2RlcyAodm5vZGVzLCBzdGFydElkeCwgZW5kSWR4KSB7XG4gICAgZm9yICg7IHN0YXJ0SWR4IDw9IGVuZElkeDsgKytzdGFydElkeCkge1xuICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTtcbiAgICAgIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKGlzRGVmKGNoLnRhZykpIHtcbiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTtcbiAgICAgICAgICBpbnZva2VEZXN0cm95SG9vayhjaCk7XG4gICAgICAgIH0gZWxzZSB7IC8vIFRleHQgbm9kZVxuICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkge1xuICAgIGlmIChpc0RlZihybSkgfHwgaXNEZWYodm5vZGUuZGF0YSkpIHtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTtcbiAgICAgIGlmIChpc0RlZihybSkpIHtcbiAgICAgICAgLy8gd2UgaGF2ZSBhIHJlY3Vyc2l2ZWx5IHBhc3NlZCBkb3duIHJtIGNhbGxiYWNrXG4gICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnRcbiAgICAgICAgcm0ubGlzdGVuZXJzICs9IGxpc3RlbmVycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nXG4gICAgICAgIHJtID0gY3JlYXRlUm1DYih2bm9kZS5lbG0sIGxpc3RlbmVycyk7XG4gICAgICB9XG4gICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZVxuICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkgJiYgaXNEZWYoaSA9IGkuX3Zub2RlKSAmJiBpc0RlZihpLmRhdGEpKSB7XG4gICAgICAgIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2soaSwgcm0pO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5yZW1vdmUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY2JzLnJlbW92ZVtpXSh2bm9kZSwgcm0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLnJlbW92ZSkpIHtcbiAgICAgICAgaSh2bm9kZSwgcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm0oKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlTm9kZSh2bm9kZS5lbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuIChwYXJlbnRFbG0sIG9sZENoLCBuZXdDaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KSB7XG4gICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDtcbiAgICB2YXIgbmV3U3RhcnRJZHggPSAwO1xuICAgIHZhciBvbGRFbmRJZHggPSBvbGRDaC5sZW5ndGggLSAxO1xuICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07XG4gICAgdmFyIG9sZEVuZFZub2RlID0gb2xkQ2hbb2xkRW5kSWR4XTtcbiAgICB2YXIgbmV3RW5kSWR4ID0gbmV3Q2gubGVuZ3RoIC0gMTtcbiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdO1xuICAgIHZhciBuZXdFbmRWbm9kZSA9IG5ld0NoW25ld0VuZElkeF07XG4gICAgdmFyIG9sZEtleVRvSWR4LCBpZHhJbk9sZCwgdm5vZGVUb01vdmUsIHJlZkVsbTtcblxuICAgIC8vIHJlbW92ZU9ubHkgaXMgYSBzcGVjaWFsIGZsYWcgdXNlZCBvbmx5IGJ5IDx0cmFuc2l0aW9uLWdyb3VwPlxuICAgIC8vIHRvIGVuc3VyZSByZW1vdmVkIGVsZW1lbnRzIHN0YXkgaW4gY29ycmVjdCByZWxhdGl2ZSBwb3NpdGlvbnNcbiAgICAvLyBkdXJpbmcgbGVhdmluZyB0cmFuc2l0aW9uc1xuICAgIHZhciBjYW5Nb3ZlID0gIXJlbW92ZU9ubHk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKG5ld0NoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAob2xkU3RhcnRJZHggPD0gb2xkRW5kSWR4ICYmIG5ld1N0YXJ0SWR4IDw9IG5ld0VuZElkeCkge1xuICAgICAgaWYgKGlzVW5kZWYob2xkU3RhcnRWbm9kZSkpIHtcbiAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdOyAvLyBWbm9kZSBoYXMgYmVlbiBtb3ZlZCBsZWZ0XG4gICAgICB9IGVsc2UgaWYgKGlzVW5kZWYob2xkRW5kVm5vZGUpKSB7XG4gICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSkpIHtcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIG5ld0NoLCBuZXdTdGFydElkeCk7XG4gICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTtcbiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdFbmRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBuZXdDaCwgbmV3RW5kSWR4KTtcbiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07XG4gICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIHJpZ2h0XG4gICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgbmV3Q2gsIG5ld0VuZElkeCk7XG4gICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgbm9kZU9wcy5uZXh0U2libGluZyhvbGRFbmRWbm9kZS5lbG0pKTtcbiAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdO1xuICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTtcbiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlKSkgeyAvLyBWbm9kZSBtb3ZlZCBsZWZ0XG4gICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTtcbiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZEVuZFZub2RlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTtcbiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9XG4gICAgICAgIGlkeEluT2xkID0gaXNEZWYobmV3U3RhcnRWbm9kZS5rZXkpXG4gICAgICAgICAgPyBvbGRLZXlUb0lkeFtuZXdTdGFydFZub2RlLmtleV1cbiAgICAgICAgICA6IGZpbmRJZHhJbk9sZChuZXdTdGFydFZub2RlLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7XG4gICAgICAgIGlmIChpc1VuZGVmKGlkeEluT2xkKSkgeyAvLyBOZXcgZWxlbWVudFxuICAgICAgICAgIGNyZWF0ZUVsbShuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgb2xkU3RhcnRWbm9kZS5lbG0sIGZhbHNlLCBuZXdDaCwgbmV3U3RhcnRJZHgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZub2RlVG9Nb3ZlID0gb2xkQ2hbaWR4SW5PbGRdO1xuICAgICAgICAgIGlmIChzYW1lVm5vZGUodm5vZGVUb01vdmUsIG5ld1N0YXJ0Vm5vZGUpKSB7XG4gICAgICAgICAgICBwYXRjaFZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIG5ld0NoLCBuZXdTdGFydElkeCk7XG4gICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgdm5vZGVUb01vdmUuZWxtLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNhbWUga2V5IGJ1dCBkaWZmZXJlbnQgZWxlbWVudC4gdHJlYXQgYXMgbmV3IGVsZW1lbnRcbiAgICAgICAgICAgIGNyZWF0ZUVsbShuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgb2xkU3RhcnRWbm9kZS5lbG0sIGZhbHNlLCBuZXdDaCwgbmV3U3RhcnRJZHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvbGRTdGFydElkeCA+IG9sZEVuZElkeCkge1xuICAgICAgcmVmRWxtID0gaXNVbmRlZihuZXdDaFtuZXdFbmRJZHggKyAxXSkgPyBudWxsIDogbmV3Q2hbbmV3RW5kSWR4ICsgMV0uZWxtO1xuICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgcmVmRWxtLCBuZXdDaCwgbmV3U3RhcnRJZHgsIG5ld0VuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0SWR4ID4gbmV3RW5kSWR4KSB7XG4gICAgICByZW1vdmVWbm9kZXMob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrRHVwbGljYXRlS2V5cyAoY2hpbGRyZW4pIHtcbiAgICB2YXIgc2VlbktleXMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdm5vZGUgPSBjaGlsZHJlbltpXTtcbiAgICAgIHZhciBrZXkgPSB2bm9kZS5rZXk7XG4gICAgICBpZiAoaXNEZWYoa2V5KSkge1xuICAgICAgICBpZiAoc2VlbktleXNba2V5XSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAoXCJEdXBsaWNhdGUga2V5cyBkZXRlY3RlZDogJ1wiICsga2V5ICsgXCInLiBUaGlzIG1heSBjYXVzZSBhbiB1cGRhdGUgZXJyb3IuXCIpLFxuICAgICAgICAgICAgdm5vZGUuY29udGV4dFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VlbktleXNba2V5XSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSWR4SW5PbGQgKG5vZGUsIG9sZENoLCBzdGFydCwgZW5kKSB7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHZhciBjID0gb2xkQ2hbaV07XG4gICAgICBpZiAoaXNEZWYoYykgJiYgc2FtZVZub2RlKG5vZGUsIGMpKSB7IHJldHVybiBpIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXRjaFZub2RlIChcbiAgICBvbGRWbm9kZSxcbiAgICB2bm9kZSxcbiAgICBpbnNlcnRlZFZub2RlUXVldWUsXG4gICAgb3duZXJBcnJheSxcbiAgICBpbmRleCxcbiAgICByZW1vdmVPbmx5XG4gICkge1xuICAgIGlmIChvbGRWbm9kZSA9PT0gdm5vZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc0RlZih2bm9kZS5lbG0pICYmIGlzRGVmKG93bmVyQXJyYXkpKSB7XG4gICAgICAvLyBjbG9uZSByZXVzZWQgdm5vZGVcbiAgICAgIHZub2RlID0gb3duZXJBcnJheVtpbmRleF0gPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgICB9XG5cbiAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtO1xuXG4gICAgaWYgKGlzVHJ1ZShvbGRWbm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIpKSB7XG4gICAgICBpZiAoaXNEZWYodm5vZGUuYXN5bmNGYWN0b3J5LnJlc29sdmVkKSkge1xuICAgICAgICBoeWRyYXRlKG9sZFZub2RlLmVsbSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gcmV1c2UgZWxlbWVudCBmb3Igc3RhdGljIHRyZWVzLlxuICAgIC8vIG5vdGUgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgLVxuICAgIC8vIGlmIHRoZSBuZXcgbm9kZSBpcyBub3QgY2xvbmVkIGl0IG1lYW5zIHRoZSByZW5kZXIgZnVuY3Rpb25zIGhhdmUgYmVlblxuICAgIC8vIHJlc2V0IGJ5IHRoZSBob3QtcmVsb2FkLWFwaSBhbmQgd2UgbmVlZCB0byBkbyBhIHByb3BlciByZS1yZW5kZXIuXG4gICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc1N0YXRpYykgJiZcbiAgICAgIGlzVHJ1ZShvbGRWbm9kZS5pc1N0YXRpYykgJiZcbiAgICAgIHZub2RlLmtleSA9PT0gb2xkVm5vZGUua2V5ICYmXG4gICAgICAoaXNUcnVlKHZub2RlLmlzQ2xvbmVkKSB8fCBpc1RydWUodm5vZGUuaXNPbmNlKSlcbiAgICApIHtcbiAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlID0gb2xkVm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgaTtcbiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7XG4gICAgaWYgKGlzRGVmKGRhdGEpICYmIGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLnByZXBhdGNoKSkge1xuICAgICAgaShvbGRWbm9kZSwgdm5vZGUpO1xuICAgIH1cblxuICAgIHZhciBvbGRDaCA9IG9sZFZub2RlLmNoaWxkcmVuO1xuICAgIHZhciBjaCA9IHZub2RlLmNoaWxkcmVuO1xuICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc1BhdGNoYWJsZSh2bm9kZSkpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKSB7IGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTsgfVxuICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLnVwZGF0ZSkpIHsgaShvbGRWbm9kZSwgdm5vZGUpOyB9XG4gICAgfVxuICAgIGlmIChpc1VuZGVmKHZub2RlLnRleHQpKSB7XG4gICAgICBpZiAoaXNEZWYob2xkQ2gpICYmIGlzRGVmKGNoKSkge1xuICAgICAgICBpZiAob2xkQ2ggIT09IGNoKSB7IHVwZGF0ZUNoaWxkcmVuKGVsbSwgb2xkQ2gsIGNoLCBpbnNlcnRlZFZub2RlUXVldWUsIHJlbW92ZU9ubHkpOyB9XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKGNoKSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhjaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7IG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCAnJyk7IH1cbiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZENoKSkge1xuICAgICAgICByZW1vdmVWbm9kZXMob2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpO1xuICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkge1xuICAgICAgICBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob2xkVm5vZGUudGV4dCAhPT0gdm5vZGUudGV4dCkge1xuICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sIHZub2RlLnRleHQpO1xuICAgIH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wb3N0cGF0Y2gpKSB7IGkob2xkVm5vZGUsIHZub2RlKTsgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkge1xuICAgIC8vIGRlbGF5IGluc2VydCBob29rcyBmb3IgY29tcG9uZW50IHJvb3Qgbm9kZXMsIGludm9rZSB0aGVtIGFmdGVyIHRoZVxuICAgIC8vIGVsZW1lbnQgaXMgcmVhbGx5IGluc2VydGVkXG4gICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7XG4gICAgICB2bm9kZS5wYXJlbnQuZGF0YS5wZW5kaW5nSW5zZXJ0ID0gcXVldWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcXVldWVbaV0uZGF0YS5ob29rLmluc2VydChxdWV1ZVtpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGh5ZHJhdGlvbkJhaWxlZCA9IGZhbHNlO1xuICAvLyBsaXN0IG9mIG1vZHVsZXMgdGhhdCBjYW4gc2tpcCBjcmVhdGUgaG9vayBkdXJpbmcgaHlkcmF0aW9uIGJlY2F1c2UgdGhleVxuICAvLyBhcmUgYWxyZWFkeSByZW5kZXJlZCBvbiB0aGUgY2xpZW50IG9yIGhhcyBubyBuZWVkIGZvciBpbml0aWFsaXphdGlvblxuICAvLyBOb3RlOiBzdHlsZSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IHJlbGllcyBvbiBpbml0aWFsIGNsb25lIGZvciBmdXR1cmVcbiAgLy8gZGVlcCB1cGRhdGVzICgjNzA2MykuXG4gIHZhciBpc1JlbmRlcmVkTW9kdWxlID0gbWFrZU1hcCgnYXR0cnMsY2xhc3Msc3RhdGljQ2xhc3Msc3RhdGljU3R5bGUsa2V5Jyk7XG5cbiAgLy8gTm90ZTogdGhpcyBpcyBhIGJyb3dzZXItb25seSBmdW5jdGlvbiBzbyB3ZSBjYW4gYXNzdW1lIGVsbXMgYXJlIERPTSBub2Rlcy5cbiAgZnVuY3Rpb24gaHlkcmF0ZSAoZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBpblZQcmUpIHtcbiAgICB2YXIgaTtcbiAgICB2YXIgdGFnID0gdm5vZGUudGFnO1xuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjtcbiAgICBpblZQcmUgPSBpblZQcmUgfHwgKGRhdGEgJiYgZGF0YS5wcmUpO1xuICAgIHZub2RlLmVsbSA9IGVsbTtcblxuICAgIGlmIChpc1RydWUodm5vZGUuaXNDb21tZW50KSAmJiBpc0RlZih2bm9kZS5hc3luY0ZhY3RvcnkpKSB7XG4gICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gYXNzZXJ0IG5vZGUgbWF0Y2hcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCFhc3NlcnROb2RlTWF0Y2goZWxtLCB2bm9kZSwgaW5WUHJlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsgaSh2bm9kZSwgdHJ1ZSAvKiBoeWRyYXRpbmcgKi8pOyB9XG4gICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSkge1xuICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS5cbiAgICAgICAgaW5pdENvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRGVmKHRhZykpIHtcbiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHtcbiAgICAgICAgLy8gZW1wdHkgZWxlbWVudCwgYWxsb3cgY2xpZW50IHRvIHBpY2sgdXAgYW5kIHBvcHVsYXRlIGNoaWxkcmVuXG4gICAgICAgIGlmICghZWxtLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB2LWh0bWwgYW5kIGRvbVByb3BzOiBpbm5lckhUTUxcbiAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEpICYmIGlzRGVmKGkgPSBpLmRvbVByb3BzKSAmJiBpc0RlZihpID0gaS5pbm5lckhUTUwpKSB7XG4gICAgICAgICAgICBpZiAoaSAhPT0gZWxtLmlubmVySFRNTCkge1xuICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkJhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdzZXJ2ZXIgaW5uZXJIVE1MOiAnLCBpKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2NsaWVudCBpbm5lckhUTUw6ICcsIGVsbS5pbm5lckhUTUwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpdGVyYXRlIGFuZCBjb21wYXJlIGNoaWxkcmVuIGxpc3RzXG4gICAgICAgICAgICB2YXIgY2hpbGRyZW5NYXRjaCA9IHRydWU7XG4gICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZWxtLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBjaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7XG4gICAgICAgICAgICAgIGlmICghY2hpbGROb2RlIHx8ICFoeWRyYXRlKGNoaWxkTm9kZSwgY2hpbGRyZW5baSQxXSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBpblZQcmUpKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgY2hpbGROb2RlIGlzIG5vdCBudWxsLCBpdCBtZWFucyB0aGUgYWN0dWFsIGNoaWxkTm9kZXMgbGlzdCBpc1xuICAgICAgICAgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIHZpcnR1YWwgY2hpbGRyZW4gbGlzdC5cbiAgICAgICAgICAgIGlmICghY2hpbGRyZW5NYXRjaCB8fCBjaGlsZE5vZGUpIHtcbiAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgIWh5ZHJhdGlvbkJhaWxlZFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBoeWRyYXRpb25CYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGFyZW50OiAnLCBlbG0pO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTWlzbWF0Y2hpbmcgY2hpbGROb2RlcyB2cy4gVk5vZGVzOiAnLCBlbG0uY2hpbGROb2RlcywgY2hpbGRyZW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICAgIHZhciBmdWxsSW52b2tlID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgaWYgKCFpc1JlbmRlcmVkTW9kdWxlKGtleSkpIHtcbiAgICAgICAgICAgIGZ1bGxJbnZva2UgPSB0cnVlO1xuICAgICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bGxJbnZva2UgJiYgZGF0YVsnY2xhc3MnXSkge1xuICAgICAgICAgIC8vIGVuc3VyZSBjb2xsZWN0aW5nIGRlcHMgZm9yIGRlZXAgY2xhc3MgYmluZGluZ3MgZm9yIGZ1dHVyZSB1cGRhdGVzXG4gICAgICAgICAgdHJhdmVyc2UoZGF0YVsnY2xhc3MnXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVsbS5kYXRhICE9PSB2bm9kZS50ZXh0KSB7XG4gICAgICBlbG0uZGF0YSA9IHZub2RlLnRleHQ7XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBhc3NlcnROb2RlTWF0Y2ggKG5vZGUsIHZub2RlLCBpblZQcmUpIHtcbiAgICBpZiAoaXNEZWYodm5vZGUudGFnKSkge1xuICAgICAgcmV0dXJuIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwgKFxuICAgICAgICAhaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgaW5WUHJlKSAmJlxuICAgICAgICB2bm9kZS50YWcudG9Mb3dlckNhc2UoKSA9PT0gKG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09ICh2bm9kZS5pc0NvbW1lbnQgPyA4IDogMylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5KSB7XG4gICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7XG4gICAgICBpZiAoaXNEZWYob2xkVm5vZGUpKSB7IGludm9rZURlc3Ryb3lIb29rKG9sZFZub2RlKTsgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGlzSW5pdGlhbFBhdGNoID0gZmFsc2U7XG4gICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdO1xuXG4gICAgaWYgKGlzVW5kZWYob2xkVm5vZGUpKSB7XG4gICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50XG4gICAgICBpc0luaXRpYWxQYXRjaCA9IHRydWU7XG4gICAgICBjcmVhdGVFbG0odm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpO1xuICAgICAgaWYgKCFpc1JlYWxFbGVtZW50ICYmIHNhbWVWbm9kZShvbGRWbm9kZSwgdm5vZGUpKSB7XG4gICAgICAgIC8vIHBhdGNoIGV4aXN0aW5nIHJvb3Qgbm9kZVxuICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBudWxsLCBudWxsLCByZW1vdmVPbmx5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1JlYWxFbGVtZW50KSB7XG4gICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnRcbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHNlcnZlci1yZW5kZXJlZCBjb250ZW50IGFuZCBpZiB3ZSBjYW4gcGVyZm9ybVxuICAgICAgICAgIC8vIGEgc3VjY2Vzc2Z1bCBoeWRyYXRpb24uXG4gICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZShTU1JfQVRUUikpIHtcbiAgICAgICAgICAgIG9sZFZub2RlLnJlbW92ZUF0dHJpYnV0ZShTU1JfQVRUUik7XG4gICAgICAgICAgICBoeWRyYXRpbmcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNUcnVlKGh5ZHJhdGluZykpIHtcbiAgICAgICAgICAgIGlmIChoeWRyYXRlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSkge1xuICAgICAgICAgICAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHRydWUpO1xuICAgICAgICAgICAgICByZXR1cm4gb2xkVm5vZGVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgICdUaGUgY2xpZW50LXNpZGUgcmVuZGVyZWQgdmlydHVhbCBET00gdHJlZSBpcyBub3QgbWF0Y2hpbmcgJyArXG4gICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgK1xuICAgICAgICAgICAgICAgICdIVE1MIG1hcmt1cCwgZm9yIGV4YW1wbGUgbmVzdGluZyBibG9jay1sZXZlbCBlbGVtZW50cyBpbnNpZGUgJyArXG4gICAgICAgICAgICAgICAgJzxwPiwgb3IgbWlzc2luZyA8dGJvZHk+LiBCYWlsaW5nIGh5ZHJhdGlvbiBhbmQgcGVyZm9ybWluZyAnICtcbiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBlaXRoZXIgbm90IHNlcnZlci1yZW5kZXJlZCwgb3IgaHlkcmF0aW9uIGZhaWxlZC5cbiAgICAgICAgICAvLyBjcmVhdGUgYW4gZW1wdHkgbm9kZSBhbmQgcmVwbGFjZSBpdFxuICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnRcbiAgICAgICAgdmFyIG9sZEVsbSA9IG9sZFZub2RlLmVsbTtcbiAgICAgICAgdmFyIHBhcmVudEVsbSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgbm9kZVxuICAgICAgICBjcmVhdGVFbG0oXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLFxuICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhXG4gICAgICAgICAgLy8gbGVhdmluZyB0cmFuc2l0aW9uLiBPbmx5IGhhcHBlbnMgd2hlbiBjb21iaW5pbmcgdHJhbnNpdGlvbiArXG4gICAgICAgICAgLy8ga2VlcC1hbGl2ZSArIEhPQ3MuICgjNDU5MClcbiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtLFxuICAgICAgICAgIG5vZGVPcHMubmV4dFNpYmxpbmcob2xkRWxtKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBwYXJlbnQgcGxhY2Vob2xkZXIgbm9kZSBlbGVtZW50LCByZWN1cnNpdmVseVxuICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkge1xuICAgICAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlLnBhcmVudDtcbiAgICAgICAgICB2YXIgcGF0Y2hhYmxlID0gaXNQYXRjaGFibGUodm5vZGUpO1xuICAgICAgICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYnMuZGVzdHJveS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICBjYnMuZGVzdHJveVtpXShhbmNlc3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbmNlc3Rvci5lbG0gPSB2bm9kZS5lbG07XG4gICAgICAgICAgICBpZiAocGF0Y2hhYmxlKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkge1xuICAgICAgICAgICAgICAgIGNicy5jcmVhdGVbaSQxXShlbXB0eU5vZGUsIGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyAjNjUxM1xuICAgICAgICAgICAgICAvLyBpbnZva2UgaW5zZXJ0IGhvb2tzIHRoYXQgbWF5IGhhdmUgYmVlbiBtZXJnZWQgYnkgY3JlYXRlIGhvb2tzLlxuICAgICAgICAgICAgICAvLyBlLmcuIGZvciBkaXJlY3RpdmVzIHRoYXQgdXNlcyB0aGUgXCJpbnNlcnRlZFwiIGhvb2suXG4gICAgICAgICAgICAgIHZhciBpbnNlcnQgPSBhbmNlc3Rvci5kYXRhLmhvb2suaW5zZXJ0O1xuICAgICAgICAgICAgICBpZiAoaW5zZXJ0Lm1lcmdlZCkge1xuICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGF0IGluZGV4IDEgdG8gYXZvaWQgcmUtaW52b2tpbmcgY29tcG9uZW50IG1vdW50ZWQgaG9va1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkkMiA9IDE7IGkkMiA8IGluc2VydC5mbnMubGVuZ3RoOyBpJDIrKykge1xuICAgICAgICAgICAgICAgICAgaW5zZXJ0LmZuc1tpJDJdKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZWdpc3RlclJlZihhbmNlc3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZXN0cm95IG9sZCBub2RlXG4gICAgICAgIGlmIChpc0RlZihwYXJlbnRFbG0pKSB7XG4gICAgICAgICAgcmVtb3ZlVm5vZGVzKFtvbGRWbm9kZV0sIDAsIDApO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRhZykpIHtcbiAgICAgICAgICBpbnZva2VEZXN0cm95SG9vayhvbGRWbm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIGlzSW5pdGlhbFBhdGNoKTtcbiAgICByZXR1cm4gdm5vZGUuZWxtXG4gIH1cbn1cblxuLyogICovXG5cbnZhciBkaXJlY3RpdmVzID0ge1xuICBjcmVhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsXG4gIHVwZGF0ZTogdXBkYXRlRGlyZWN0aXZlcyxcbiAgZGVzdHJveTogZnVuY3Rpb24gdW5iaW5kRGlyZWN0aXZlcyAodm5vZGUpIHtcbiAgICB1cGRhdGVEaXJlY3RpdmVzKHZub2RlLCBlbXB0eU5vZGUpO1xuICB9XG59O1xuXG5mdW5jdGlvbiB1cGRhdGVEaXJlY3RpdmVzIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgaWYgKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcyB8fCB2bm9kZS5kYXRhLmRpcmVjdGl2ZXMpIHtcbiAgICBfdXBkYXRlKG9sZFZub2RlLCB2bm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3VwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7XG4gIHZhciBpc0NyZWF0ZSA9IG9sZFZub2RlID09PSBlbXB0eU5vZGU7XG4gIHZhciBpc0Rlc3Ryb3kgPSB2bm9kZSA9PT0gZW1wdHlOb2RlO1xuICB2YXIgb2xkRGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMShvbGRWbm9kZS5kYXRhLmRpcmVjdGl2ZXMsIG9sZFZub2RlLmNvbnRleHQpO1xuICB2YXIgbmV3RGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSh2bm9kZS5kYXRhLmRpcmVjdGl2ZXMsIHZub2RlLmNvbnRleHQpO1xuXG4gIHZhciBkaXJzV2l0aEluc2VydCA9IFtdO1xuICB2YXIgZGlyc1dpdGhQb3N0cGF0Y2ggPSBbXTtcblxuICB2YXIga2V5LCBvbGREaXIsIGRpcjtcbiAgZm9yIChrZXkgaW4gbmV3RGlycykge1xuICAgIG9sZERpciA9IG9sZERpcnNba2V5XTtcbiAgICBkaXIgPSBuZXdEaXJzW2tleV07XG4gICAgaWYgKCFvbGREaXIpIHtcbiAgICAgIC8vIG5ldyBkaXJlY3RpdmUsIGJpbmRcbiAgICAgIGNhbGxIb29rJDEoZGlyLCAnYmluZCcsIHZub2RlLCBvbGRWbm9kZSk7XG4gICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmluc2VydGVkKSB7XG4gICAgICAgIGRpcnNXaXRoSW5zZXJ0LnB1c2goZGlyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXhpc3RpbmcgZGlyZWN0aXZlLCB1cGRhdGVcbiAgICAgIGRpci5vbGRWYWx1ZSA9IG9sZERpci52YWx1ZTtcbiAgICAgIGRpci5vbGRBcmcgPSBvbGREaXIuYXJnO1xuICAgICAgY2FsbEhvb2skMShkaXIsICd1cGRhdGUnLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5jb21wb25lbnRVcGRhdGVkKSB7XG4gICAgICAgIGRpcnNXaXRoUG9zdHBhdGNoLnB1c2goZGlyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZGlyc1dpdGhJbnNlcnQubGVuZ3RoKSB7XG4gICAgdmFyIGNhbGxJbnNlcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoSW5zZXJ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhJbnNlcnRbaV0sICdpbnNlcnRlZCcsIHZub2RlLCBvbGRWbm9kZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoaXNDcmVhdGUpIHtcbiAgICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAnaW5zZXJ0JywgY2FsbEluc2VydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxJbnNlcnQoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGlyc1dpdGhQb3N0cGF0Y2gubGVuZ3RoKSB7XG4gICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdwb3N0cGF0Y2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoUG9zdHBhdGNoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhQb3N0cGF0Y2hbaV0sICdjb21wb25lbnRVcGRhdGVkJywgdm5vZGUsIG9sZFZub2RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmICghaXNDcmVhdGUpIHtcbiAgICBmb3IgKGtleSBpbiBvbGREaXJzKSB7XG4gICAgICBpZiAoIW5ld0RpcnNba2V5XSkge1xuICAgICAgICAvLyBubyBsb25nZXIgcHJlc2VudCwgdW5iaW5kXG4gICAgICAgIGNhbGxIb29rJDEob2xkRGlyc1trZXldLCAndW5iaW5kJywgb2xkVm5vZGUsIG9sZFZub2RlLCBpc0Rlc3Ryb3kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZW1wdHlNb2RpZmllcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5mdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzJDEgKFxuICBkaXJzLFxuICB2bVxuKSB7XG4gIHZhciByZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpZiAoIWRpcnMpIHtcbiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICByZXR1cm4gcmVzXG4gIH1cbiAgdmFyIGksIGRpcjtcbiAgZm9yIChpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHtcbiAgICBkaXIgPSBkaXJzW2ldO1xuICAgIGlmICghZGlyLm1vZGlmaWVycykge1xuICAgICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgICBkaXIubW9kaWZpZXJzID0gZW1wdHlNb2RpZmllcnM7XG4gICAgfVxuICAgIHJlc1tnZXRSYXdEaXJOYW1lKGRpcildID0gZGlyO1xuICAgIGRpci5kZWYgPSByZXNvbHZlQXNzZXQodm0uJG9wdGlvbnMsICdkaXJlY3RpdmVzJywgZGlyLm5hbWUsIHRydWUpO1xuICB9XG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGdldFJhd0Rpck5hbWUgKGRpcikge1xuICByZXR1cm4gZGlyLnJhd05hbWUgfHwgKChkaXIubmFtZSkgKyBcIi5cIiArIChPYmplY3Qua2V5cyhkaXIubW9kaWZpZXJzIHx8IHt9KS5qb2luKCcuJykpKVxufVxuXG5mdW5jdGlvbiBjYWxsSG9vayQxIChkaXIsIGhvb2ssIHZub2RlLCBvbGRWbm9kZSwgaXNEZXN0cm95KSB7XG4gIHZhciBmbiA9IGRpci5kZWYgJiYgZGlyLmRlZltob29rXTtcbiAgaWYgKGZuKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZuKHZub2RlLmVsbSwgZGlyLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlRXJyb3IoZSwgdm5vZGUuY29udGV4dCwgKFwiZGlyZWN0aXZlIFwiICsgKGRpci5uYW1lKSArIFwiIFwiICsgaG9vayArIFwiIGhvb2tcIikpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgYmFzZU1vZHVsZXMgPSBbXG4gIHJlZixcbiAgZGlyZWN0aXZlc1xuXTtcblxuLyogICovXG5cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIG9wdHMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zO1xuICBpZiAoaXNEZWYob3B0cykgJiYgb3B0cy5DdG9yLm9wdGlvbnMuaW5oZXJpdEF0dHJzID09PSBmYWxzZSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEuYXR0cnMpICYmIGlzVW5kZWYodm5vZGUuZGF0YS5hdHRycykpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIga2V5LCBjdXIsIG9sZDtcbiAgdmFyIGVsbSA9IHZub2RlLmVsbTtcbiAgdmFyIG9sZEF0dHJzID0gb2xkVm5vZGUuZGF0YS5hdHRycyB8fCB7fTtcbiAgdmFyIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyB8fCB7fTtcbiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0XG4gIGlmIChpc0RlZihhdHRycy5fX29iX18pKSB7XG4gICAgYXR0cnMgPSB2bm9kZS5kYXRhLmF0dHJzID0gZXh0ZW5kKHt9LCBhdHRycyk7XG4gIH1cblxuICBmb3IgKGtleSBpbiBhdHRycykge1xuICAgIGN1ciA9IGF0dHJzW2tleV07XG4gICAgb2xkID0gb2xkQXR0cnNba2V5XTtcbiAgICBpZiAob2xkICE9PSBjdXIpIHtcbiAgICAgIHNldEF0dHIoZWxtLCBrZXksIGN1cik7XG4gICAgfVxuICB9XG4gIC8vICM0MzkxOiBpbiBJRTksIHNldHRpbmcgdHlwZSBjYW4gcmVzZXQgdmFsdWUgZm9yIGlucHV0W3R5cGU9cmFkaW9dXG4gIC8vICM2NjY2OiBJRS9FZGdlIGZvcmNlcyBwcm9ncmVzcyB2YWx1ZSBkb3duIHRvIDEgYmVmb3JlIHNldHRpbmcgYSBtYXhcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICgoaXNJRSB8fCBpc0VkZ2UpICYmIGF0dHJzLnZhbHVlICE9PSBvbGRBdHRycy52YWx1ZSkge1xuICAgIHNldEF0dHIoZWxtLCAndmFsdWUnLCBhdHRycy52YWx1ZSk7XG4gIH1cbiAgZm9yIChrZXkgaW4gb2xkQXR0cnMpIHtcbiAgICBpZiAoaXNVbmRlZihhdHRyc1trZXldKSkge1xuICAgICAgaWYgKGlzWGxpbmsoa2V5KSkge1xuICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywgZ2V0WGxpbmtQcm9wKGtleSkpO1xuICAgICAgfSBlbHNlIGlmICghaXNFbnVtZXJhdGVkQXR0cihrZXkpKSB7XG4gICAgICAgIGVsbS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGVsLnRhZ05hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICBiYXNlU2V0QXR0cihlbCwga2V5LCB2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXR0cihrZXkpKSB7XG4gICAgLy8gc2V0IGF0dHJpYnV0ZSBmb3IgYmxhbmsgdmFsdWVcbiAgICAvLyBlLmcuIDxvcHRpb24gZGlzYWJsZWQ+U2VsZWN0IG9uZTwvb3B0aW9uPlxuICAgIGlmIChpc0ZhbHN5QXR0clZhbHVlKHZhbHVlKSkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRlY2huaWNhbGx5IGFsbG93ZnVsbHNjcmVlbiBpcyBhIGJvb2xlYW4gYXR0cmlidXRlIGZvciA8aWZyYW1lPixcbiAgICAgIC8vIGJ1dCBGbGFzaCBleHBlY3RzIGEgdmFsdWUgb2YgXCJ0cnVlXCIgd2hlbiB1c2VkIG9uIDxlbWJlZD4gdGFnXG4gICAgICB2YWx1ZSA9IGtleSA9PT0gJ2FsbG93ZnVsbHNjcmVlbicgJiYgZWwudGFnTmFtZSA9PT0gJ0VNQkVEJ1xuICAgICAgICA/ICd0cnVlJ1xuICAgICAgICA6IGtleTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNFbnVtZXJhdGVkQXR0cihrZXkpKSB7XG4gICAgZWwuc2V0QXR0cmlidXRlKGtleSwgY29udmVydEVudW1lcmF0ZWRWYWx1ZShrZXksIHZhbHVlKSk7XG4gIH0gZWxzZSBpZiAoaXNYbGluayhrZXkpKSB7XG4gICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGVOUyh4bGlua05TLCBnZXRYbGlua1Byb3Aoa2V5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBiYXNlU2V0QXR0cihlbCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZVNldEF0dHIgKGVsLCBrZXksIHZhbHVlKSB7XG4gIGlmIChpc0ZhbHN5QXR0clZhbHVlKHZhbHVlKSkge1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICB9IGVsc2Uge1xuICAgIC8vICM3MTM4OiBJRTEwICYgMTEgZmlyZXMgaW5wdXQgZXZlbnQgd2hlbiBzZXR0aW5nIHBsYWNlaG9sZGVyIG9uXG4gICAgLy8gPHRleHRhcmVhPi4uLiBibG9jayB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYW5kIHJlbW92ZSB0aGUgYmxvY2tlclxuICAgIC8vIGltbWVkaWF0ZWx5LlxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChcbiAgICAgIGlzSUUgJiYgIWlzSUU5ICYmXG4gICAgICBlbC50YWdOYW1lID09PSAnVEVYVEFSRUEnICYmXG4gICAgICBrZXkgPT09ICdwbGFjZWhvbGRlcicgJiYgdmFsdWUgIT09ICcnICYmICFlbC5fX2llcGhcbiAgICApIHtcbiAgICAgIHZhciBibG9ja2VyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBibG9ja2VyKTtcbiAgICAgIH07XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGJsb2NrZXIpO1xuICAgICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgICBlbC5fX2llcGggPSB0cnVlOyAvKiBJRSBwbGFjZWhvbGRlciBwYXRjaGVkICovXG4gICAgfVxuICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTtcbiAgfVxufVxuXG52YXIgYXR0cnMgPSB7XG4gIGNyZWF0ZTogdXBkYXRlQXR0cnMsXG4gIHVwZGF0ZTogdXBkYXRlQXR0cnNcbn07XG5cbi8qICAqL1xuXG5mdW5jdGlvbiB1cGRhdGVDbGFzcyAob2xkVm5vZGUsIHZub2RlKSB7XG4gIHZhciBlbCA9IHZub2RlLmVsbTtcbiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICB2YXIgb2xkRGF0YSA9IG9sZFZub2RlLmRhdGE7XG4gIGlmIChcbiAgICBpc1VuZGVmKGRhdGEuc3RhdGljQ2xhc3MpICYmXG4gICAgaXNVbmRlZihkYXRhLmNsYXNzKSAmJiAoXG4gICAgICBpc1VuZGVmKG9sZERhdGEpIHx8IChcbiAgICAgICAgaXNVbmRlZihvbGREYXRhLnN0YXRpY0NsYXNzKSAmJlxuICAgICAgICBpc1VuZGVmKG9sZERhdGEuY2xhc3MpXG4gICAgICApXG4gICAgKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBjbHMgPSBnZW5DbGFzc0ZvclZub2RlKHZub2RlKTtcblxuICAvLyBoYW5kbGUgdHJhbnNpdGlvbiBjbGFzc2VzXG4gIHZhciB0cmFuc2l0aW9uQ2xhc3MgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXM7XG4gIGlmIChpc0RlZih0cmFuc2l0aW9uQ2xhc3MpKSB7XG4gICAgY2xzID0gY29uY2F0KGNscywgc3RyaW5naWZ5Q2xhc3ModHJhbnNpdGlvbkNsYXNzKSk7XG4gIH1cblxuICAvLyBzZXQgdGhlIGNsYXNzXG4gIGlmIChjbHMgIT09IGVsLl9wcmV2Q2xhc3MpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgY2xzKTtcbiAgICBlbC5fcHJldkNsYXNzID0gY2xzO1xuICB9XG59XG5cbnZhciBrbGFzcyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVDbGFzcyxcbiAgdXBkYXRlOiB1cGRhdGVDbGFzc1xufTtcblxuLyogICovXG5cbi8qICAqL1xuXG4vKiAgKi9cblxuLyogICovXG5cbi8vIGluIHNvbWUgY2FzZXMsIHRoZSBldmVudCB1c2VkIGhhcyB0byBiZSBkZXRlcm1pbmVkIGF0IHJ1bnRpbWVcbi8vIHNvIHdlIHVzZWQgc29tZSByZXNlcnZlZCB0b2tlbnMgZHVyaW5nIGNvbXBpbGUuXG52YXIgUkFOR0VfVE9LRU4gPSAnX19yJztcbnZhciBDSEVDS0JPWF9SQURJT19UT0tFTiA9ICdfX2MnO1xuXG4vKiAgKi9cblxuLy8gbm9ybWFsaXplIHYtbW9kZWwgZXZlbnQgdG9rZW5zIHRoYXQgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lLlxuLy8gaXQncyBpbXBvcnRhbnQgdG8gcGxhY2UgdGhlIGV2ZW50IGFzIHRoZSBmaXJzdCBpbiB0aGUgYXJyYXkgYmVjYXVzZVxuLy8gdGhlIHdob2xlIHBvaW50IGlzIGVuc3VyaW5nIHRoZSB2LW1vZGVsIGNhbGxiYWNrIGdldHMgY2FsbGVkIGJlZm9yZVxuLy8gdXNlci1hdHRhY2hlZCBoYW5kbGVycy5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV2ZW50cyAob24pIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc0RlZihvbltSQU5HRV9UT0tFTl0pKSB7XG4gICAgLy8gSUUgaW5wdXRbdHlwZT1yYW5nZV0gb25seSBzdXBwb3J0cyBgY2hhbmdlYCBldmVudFxuICAgIHZhciBldmVudCA9IGlzSUUgPyAnY2hhbmdlJyA6ICdpbnB1dCc7XG4gICAgb25bZXZlbnRdID0gW10uY29uY2F0KG9uW1JBTkdFX1RPS0VOXSwgb25bZXZlbnRdIHx8IFtdKTtcbiAgICBkZWxldGUgb25bUkFOR0VfVE9LRU5dO1xuICB9XG4gIC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gZml4ICM0NTIxIGJ1dCBubyBsb25nZXIgbmVjZXNzYXJ5XG4gIC8vIGFmdGVyIDIuNS4gS2VlcGluZyBpdCBmb3IgYmFja3dhcmRzIGNvbXBhdCB3aXRoIGdlbmVyYXRlZCBjb2RlIGZyb20gPCAyLjRcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc0RlZihvbltDSEVDS0JPWF9SQURJT19UT0tFTl0pKSB7XG4gICAgb24uY2hhbmdlID0gW10uY29uY2F0KG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXSwgb24uY2hhbmdlIHx8IFtdKTtcbiAgICBkZWxldGUgb25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dO1xuICB9XG59XG5cbnZhciB0YXJnZXQkMTtcblxuZnVuY3Rpb24gY3JlYXRlT25jZUhhbmRsZXIkMSAoZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpIHtcbiAgdmFyIF90YXJnZXQgPSB0YXJnZXQkMTsgLy8gc2F2ZSBjdXJyZW50IHRhcmdldCBlbGVtZW50IGluIGNsb3N1cmVcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHtcbiAgICB2YXIgcmVzID0gaGFuZGxlci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIGlmIChyZXMgIT09IG51bGwpIHtcbiAgICAgIHJlbW92ZSQyKGV2ZW50LCBvbmNlSGFuZGxlciwgY2FwdHVyZSwgX3RhcmdldCk7XG4gICAgfVxuICB9XG59XG5cbi8vICM5NDQ2OiBGaXJlZm94IDw9IDUzIChpbiBwYXJ0aWN1bGFyLCBFU1IgNTIpIGhhcyBpbmNvcnJlY3QgRXZlbnQudGltZVN0YW1wXG4vLyBpbXBsZW1lbnRhdGlvbiBhbmQgZG9lcyBub3QgZmlyZSBtaWNyb3Rhc2tzIGluIGJldHdlZW4gZXZlbnQgcHJvcGFnYXRpb24sIHNvXG4vLyBzYWZlIHRvIGV4Y2x1ZGUuXG52YXIgdXNlTWljcm90YXNrRml4ID0gaXNVc2luZ01pY3JvVGFzayAmJiAhKGlzRkYgJiYgTnVtYmVyKGlzRkZbMV0pIDw9IDUzKTtcblxuZnVuY3Rpb24gYWRkJDEgKFxuICBuYW1lLFxuICBoYW5kbGVyLFxuICBjYXB0dXJlLFxuICBwYXNzaXZlXG4pIHtcbiAgLy8gYXN5bmMgZWRnZSBjYXNlICM2NTY2OiBpbm5lciBjbGljayBldmVudCB0cmlnZ2VycyBwYXRjaCwgZXZlbnQgaGFuZGxlclxuICAvLyBhdHRhY2hlZCB0byBvdXRlciBlbGVtZW50IGR1cmluZyBwYXRjaCwgYW5kIHRyaWdnZXJlZCBhZ2Fpbi4gVGhpc1xuICAvLyBoYXBwZW5zIGJlY2F1c2UgYnJvd3NlcnMgZmlyZSBtaWNyb3Rhc2sgdGlja3MgYmV0d2VlbiBldmVudCBwcm9wYWdhdGlvbi5cbiAgLy8gdGhlIHNvbHV0aW9uIGlzIHNpbXBsZTogd2Ugc2F2ZSB0aGUgdGltZXN0YW1wIHdoZW4gYSBoYW5kbGVyIGlzIGF0dGFjaGVkLFxuICAvLyBhbmQgdGhlIGhhbmRsZXIgd291bGQgb25seSBmaXJlIGlmIHRoZSBldmVudCBwYXNzZWQgdG8gaXQgd2FzIGZpcmVkXG4gIC8vIEFGVEVSIGl0IHdhcyBhdHRhY2hlZC5cbiAgaWYgKHVzZU1pY3JvdGFza0ZpeCkge1xuICAgIHZhciBhdHRhY2hlZFRpbWVzdGFtcCA9IGN1cnJlbnRGbHVzaFRpbWVzdGFtcDtcbiAgICB2YXIgb3JpZ2luYWwgPSBoYW5kbGVyO1xuICAgIGhhbmRsZXIgPSBvcmlnaW5hbC5fd3JhcHBlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIC8vIG5vIGJ1YmJsaW5nLCBzaG91bGQgYWx3YXlzIGZpcmUuXG4gICAgICAgIC8vIHRoaXMgaXMganVzdCBhIHNhZmV0eSBuZXQgaW4gY2FzZSBldmVudC50aW1lU3RhbXAgaXMgdW5yZWxpYWJsZSBpblxuICAgICAgICAvLyBjZXJ0YWluIHdlaXJkIGVudmlyb25tZW50cy4uLlxuICAgICAgICBlLnRhcmdldCA9PT0gZS5jdXJyZW50VGFyZ2V0IHx8XG4gICAgICAgIC8vIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGhhbmRsZXIgYXR0YWNobWVudFxuICAgICAgICBlLnRpbWVTdGFtcCA+PSBhdHRhY2hlZFRpbWVzdGFtcCB8fFxuICAgICAgICAvLyBiYWlsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBoYXZlIGJ1Z2d5IGV2ZW50LnRpbWVTdGFtcCBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgLy8gIzk0NjIgaU9TIDkgYnVnOiBldmVudC50aW1lU3RhbXAgaXMgMCBhZnRlciBoaXN0b3J5LnB1c2hTdGF0ZVxuICAgICAgICAvLyAjOTY4MSBRdFdlYkVuZ2luZSBldmVudC50aW1lU3RhbXAgaXMgbmVnYXRpdmUgdmFsdWVcbiAgICAgICAgZS50aW1lU3RhbXAgPD0gMCB8fFxuICAgICAgICAvLyAjOTQ0OCBiYWlsIGlmIGV2ZW50IGlzIGZpcmVkIGluIGFub3RoZXIgZG9jdW1lbnQgaW4gYSBtdWx0aS1wYWdlXG4gICAgICAgIC8vIGVsZWN0cm9uL253LmpzIGFwcCwgc2luY2UgZXZlbnQudGltZVN0YW1wIHdpbGwgYmUgdXNpbmcgYSBkaWZmZXJlbnRcbiAgICAgICAgLy8gc3RhcnRpbmcgcmVmZXJlbmNlXG4gICAgICAgIGUudGFyZ2V0Lm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHRhcmdldCQxLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgbmFtZSxcbiAgICBoYW5kbGVyLFxuICAgIHN1cHBvcnRzUGFzc2l2ZVxuICAgICAgPyB7IGNhcHR1cmU6IGNhcHR1cmUsIHBhc3NpdmU6IHBhc3NpdmUgfVxuICAgICAgOiBjYXB0dXJlXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSQyIChcbiAgbmFtZSxcbiAgaGFuZGxlcixcbiAgY2FwdHVyZSxcbiAgX3RhcmdldFxuKSB7XG4gIChfdGFyZ2V0IHx8IHRhcmdldCQxKS5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgIG5hbWUsXG4gICAgaGFuZGxlci5fd3JhcHBlciB8fCBoYW5kbGVyLFxuICAgIGNhcHR1cmVcbiAgKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRE9NTGlzdGVuZXJzIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgaWYgKGlzVW5kZWYob2xkVm5vZGUuZGF0YS5vbikgJiYgaXNVbmRlZih2bm9kZS5kYXRhLm9uKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvbiA9IHZub2RlLmRhdGEub24gfHwge307XG4gIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307XG4gIHRhcmdldCQxID0gdm5vZGUuZWxtO1xuICBub3JtYWxpemVFdmVudHMob24pO1xuICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIGNyZWF0ZU9uY2VIYW5kbGVyJDEsIHZub2RlLmNvbnRleHQpO1xuICB0YXJnZXQkMSA9IHVuZGVmaW5lZDtcbn1cblxudmFyIGV2ZW50cyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVET01MaXN0ZW5lcnMsXG4gIHVwZGF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzXG59O1xuXG4vKiAgKi9cblxudmFyIHN2Z0NvbnRhaW5lcjtcblxuZnVuY3Rpb24gdXBkYXRlRE9NUHJvcHMgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLmRvbVByb3BzKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEuZG9tUHJvcHMpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIGtleSwgY3VyO1xuICB2YXIgZWxtID0gdm5vZGUuZWxtO1xuICB2YXIgb2xkUHJvcHMgPSBvbGRWbm9kZS5kYXRhLmRvbVByb3BzIHx8IHt9O1xuICB2YXIgcHJvcHMgPSB2bm9kZS5kYXRhLmRvbVByb3BzIHx8IHt9O1xuICAvLyBjbG9uZSBvYnNlcnZlZCBvYmplY3RzLCBhcyB0aGUgdXNlciBwcm9iYWJseSB3YW50cyB0byBtdXRhdGUgaXRcbiAgaWYgKGlzRGVmKHByb3BzLl9fb2JfXykpIHtcbiAgICBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgPSBleHRlbmQoe30sIHByb3BzKTtcbiAgfVxuXG4gIGZvciAoa2V5IGluIG9sZFByb3BzKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb3BzKSkge1xuICAgICAgZWxtW2tleV0gPSAnJztcbiAgICB9XG4gIH1cblxuICBmb3IgKGtleSBpbiBwcm9wcykge1xuICAgIGN1ciA9IHByb3BzW2tleV07XG4gICAgLy8gaWdub3JlIGNoaWxkcmVuIGlmIHRoZSBub2RlIGhhcyB0ZXh0Q29udGVudCBvciBpbm5lckhUTUwsXG4gICAgLy8gYXMgdGhlc2Ugd2lsbCB0aHJvdyBhd2F5IGV4aXN0aW5nIERPTSBub2RlcyBhbmQgY2F1c2UgcmVtb3ZhbCBlcnJvcnNcbiAgICAvLyBvbiBzdWJzZXF1ZW50IHBhdGNoZXMgKCMzMzYwKVxuICAgIGlmIChrZXkgPT09ICd0ZXh0Q29udGVudCcgfHwga2V5ID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgaWYgKHZub2RlLmNoaWxkcmVuKSB7IHZub2RlLmNoaWxkcmVuLmxlbmd0aCA9IDA7IH1cbiAgICAgIGlmIChjdXIgPT09IG9sZFByb3BzW2tleV0pIHsgY29udGludWUgfVxuICAgICAgLy8gIzY2MDEgd29yayBhcm91bmQgQ2hyb21lIHZlcnNpb24gPD0gNTUgYnVnIHdoZXJlIHNpbmdsZSB0ZXh0Tm9kZVxuICAgICAgLy8gcmVwbGFjZWQgYnkgaW5uZXJIVE1ML3RleHRDb250ZW50IHJldGFpbnMgaXRzIHBhcmVudE5vZGUgcHJvcGVydHlcbiAgICAgIGlmIChlbG0uY2hpbGROb2Rlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZWxtLnJlbW92ZUNoaWxkKGVsbS5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAndmFsdWUnICYmIGVsbS50YWdOYW1lICE9PSAnUFJPR1JFU1MnKSB7XG4gICAgICAvLyBzdG9yZSB2YWx1ZSBhcyBfdmFsdWUgYXMgd2VsbCBzaW5jZVxuICAgICAgLy8gbm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZFxuICAgICAgZWxtLl92YWx1ZSA9IGN1cjtcbiAgICAgIC8vIGF2b2lkIHJlc2V0dGluZyBjdXJzb3IgcG9zaXRpb24gd2hlbiB2YWx1ZSBpcyB0aGUgc2FtZVxuICAgICAgdmFyIHN0ckN1ciA9IGlzVW5kZWYoY3VyKSA/ICcnIDogU3RyaW5nKGN1cik7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlVmFsdWUoZWxtLCBzdHJDdXIpKSB7XG4gICAgICAgIGVsbS52YWx1ZSA9IHN0ckN1cjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2lubmVySFRNTCcgJiYgaXNTVkcoZWxtLnRhZ05hbWUpICYmIGlzVW5kZWYoZWxtLmlubmVySFRNTCkpIHtcbiAgICAgIC8vIElFIGRvZXNuJ3Qgc3VwcG9ydCBpbm5lckhUTUwgZm9yIFNWRyBlbGVtZW50c1xuICAgICAgc3ZnQ29udGFpbmVyID0gc3ZnQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgc3ZnQ29udGFpbmVyLmlubmVySFRNTCA9IFwiPHN2Zz5cIiArIGN1ciArIFwiPC9zdmc+XCI7XG4gICAgICB2YXIgc3ZnID0gc3ZnQ29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgICB3aGlsZSAoZWxtLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgZWxtLnJlbW92ZUNoaWxkKGVsbS5maXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzdmcuZmlyc3RDaGlsZCkge1xuICAgICAgICBlbG0uYXBwZW5kQ2hpbGQoc3ZnLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBza2lwIHRoZSB1cGRhdGUgaWYgb2xkIGFuZCBuZXcgVkRPTSBzdGF0ZSBpcyB0aGUgc2FtZS5cbiAgICAgIC8vIGB2YWx1ZWAgaXMgaGFuZGxlZCBzZXBhcmF0ZWx5IGJlY2F1c2UgdGhlIERPTSB2YWx1ZSBtYXkgYmUgdGVtcG9yYXJpbHlcbiAgICAgIC8vIG91dCBvZiBzeW5jIHdpdGggVkRPTSBzdGF0ZSBkdWUgdG8gZm9jdXMsIGNvbXBvc2l0aW9uIGFuZCBtb2RpZmllcnMuXG4gICAgICAvLyBUaGlzICAjNDUyMSBieSBza2lwcGluZyB0aGUgdW5uZWNlc3NhcnkgYGNoZWNrZWRgIHVwZGF0ZS5cbiAgICAgIGN1ciAhPT0gb2xkUHJvcHNba2V5XVxuICAgICkge1xuICAgICAgLy8gc29tZSBwcm9wZXJ0eSB1cGRhdGVzIGNhbiB0aHJvd1xuICAgICAgLy8gZS5nLiBgdmFsdWVgIG9uIDxwcm9ncmVzcz4gdy8gbm9uLWZpbml0ZSB2YWx1ZVxuICAgICAgdHJ5IHtcbiAgICAgICAgZWxtW2tleV0gPSBjdXI7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgfVxufVxuXG4vLyBjaGVjayBwbGF0Zm9ybXMvd2ViL3V0aWwvYXR0cnMuanMgYWNjZXB0VmFsdWVcblxuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVWYWx1ZSAoZWxtLCBjaGVja1ZhbCkge1xuICByZXR1cm4gKCFlbG0uY29tcG9zaW5nICYmIChcbiAgICBlbG0udGFnTmFtZSA9PT0gJ09QVElPTicgfHxcbiAgICBpc05vdEluRm9jdXNBbmREaXJ0eShlbG0sIGNoZWNrVmFsKSB8fFxuICAgIGlzRGlydHlXaXRoTW9kaWZpZXJzKGVsbSwgY2hlY2tWYWwpXG4gICkpXG59XG5cbmZ1bmN0aW9uIGlzTm90SW5Gb2N1c0FuZERpcnR5IChlbG0sIGNoZWNrVmFsKSB7XG4gIC8vIHJldHVybiB0cnVlIHdoZW4gdGV4dGJveCAoLm51bWJlciBhbmQgLnRyaW0pIGxvc2VzIGZvY3VzIGFuZCBpdHMgdmFsdWUgaXNcbiAgLy8gbm90IGVxdWFsIHRvIHRoZSB1cGRhdGVkIHZhbHVlXG4gIHZhciBub3RJbkZvY3VzID0gdHJ1ZTtcbiAgLy8gIzYxNTdcbiAgLy8gd29yayBhcm91bmQgSUUgYnVnIHdoZW4gYWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW4gYW4gaWZyYW1lXG4gIHRyeSB7IG5vdEluRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBlbG07IH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBub3RJbkZvY3VzICYmIGVsbS52YWx1ZSAhPT0gY2hlY2tWYWxcbn1cblxuZnVuY3Rpb24gaXNEaXJ0eVdpdGhNb2RpZmllcnMgKGVsbSwgbmV3VmFsKSB7XG4gIHZhciB2YWx1ZSA9IGVsbS52YWx1ZTtcbiAgdmFyIG1vZGlmaWVycyA9IGVsbS5fdk1vZGlmaWVyczsgLy8gaW5qZWN0ZWQgYnkgdi1tb2RlbCBydW50aW1lXG4gIGlmIChpc0RlZihtb2RpZmllcnMpKSB7XG4gICAgaWYgKG1vZGlmaWVycy5udW1iZXIpIHtcbiAgICAgIHJldHVybiB0b051bWJlcih2YWx1ZSkgIT09IHRvTnVtYmVyKG5ld1ZhbClcbiAgICB9XG4gICAgaWYgKG1vZGlmaWVycy50cmltKSB7XG4gICAgICByZXR1cm4gdmFsdWUudHJpbSgpICE9PSBuZXdWYWwudHJpbSgpXG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZSAhPT0gbmV3VmFsXG59XG5cbnZhciBkb21Qcm9wcyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVET01Qcm9wcyxcbiAgdXBkYXRlOiB1cGRhdGVET01Qcm9wc1xufTtcblxuLyogICovXG5cbnZhciBwYXJzZVN0eWxlVGV4dCA9IGNhY2hlZChmdW5jdGlvbiAoY3NzVGV4dCkge1xuICB2YXIgcmVzID0ge307XG4gIHZhciBsaXN0RGVsaW1pdGVyID0gLzsoPyFbXihdKlxcKSkvZztcbiAgdmFyIHByb3BlcnR5RGVsaW1pdGVyID0gLzooLispLztcbiAgY3NzVGV4dC5zcGxpdChsaXN0RGVsaW1pdGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHZhciB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyKTtcbiAgICAgIHRtcC5sZW5ndGggPiAxICYmIChyZXNbdG1wWzBdLnRyaW0oKV0gPSB0bXBbMV0udHJpbSgpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzXG59KTtcblxuLy8gbWVyZ2Ugc3RhdGljIGFuZCBkeW5hbWljIHN0eWxlIGRhdGEgb24gdGhlIHNhbWUgdm5vZGVcbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0eWxlRGF0YSAoZGF0YSkge1xuICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcoZGF0YS5zdHlsZSk7XG4gIC8vIHN0YXRpYyBzdHlsZSBpcyBwcmUtcHJvY2Vzc2VkIGludG8gYW4gb2JqZWN0IGR1cmluZyBjb21waWxhdGlvblxuICAvLyBhbmQgaXMgYWx3YXlzIGEgZnJlc2ggb2JqZWN0LCBzbyBpdCdzIHNhZmUgdG8gbWVyZ2UgaW50byBpdFxuICByZXR1cm4gZGF0YS5zdGF0aWNTdHlsZVxuICAgID8gZXh0ZW5kKGRhdGEuc3RhdGljU3R5bGUsIHN0eWxlKVxuICAgIDogc3R5bGVcbn1cblxuLy8gbm9ybWFsaXplIHBvc3NpYmxlIGFycmF5IC8gc3RyaW5nIHZhbHVlcyBpbnRvIE9iamVjdFxuZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVCaW5kaW5nIChiaW5kaW5nU3R5bGUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYmluZGluZ1N0eWxlKSkge1xuICAgIHJldHVybiB0b09iamVjdChiaW5kaW5nU3R5bGUpXG4gIH1cbiAgaWYgKHR5cGVvZiBiaW5kaW5nU3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhcnNlU3R5bGVUZXh0KGJpbmRpbmdTdHlsZSlcbiAgfVxuICByZXR1cm4gYmluZGluZ1N0eWxlXG59XG5cbi8qKlxuICogcGFyZW50IGNvbXBvbmVudCBzdHlsZSBzaG91bGQgYmUgYWZ0ZXIgY2hpbGQnc1xuICogc28gdGhhdCBwYXJlbnQgY29tcG9uZW50J3Mgc3R5bGUgY291bGQgb3ZlcnJpZGUgaXRcbiAqL1xuZnVuY3Rpb24gZ2V0U3R5bGUgKHZub2RlLCBjaGVja0NoaWxkKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIHN0eWxlRGF0YTtcblxuICBpZiAoY2hlY2tDaGlsZCkge1xuICAgIHZhciBjaGlsZE5vZGUgPSB2bm9kZTtcbiAgICB3aGlsZSAoY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO1xuICAgICAgaWYgKFxuICAgICAgICBjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmRhdGEgJiZcbiAgICAgICAgKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YShjaGlsZE5vZGUuZGF0YSkpXG4gICAgICApIHtcbiAgICAgICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YSh2bm9kZS5kYXRhKSkpIHtcbiAgICBleHRlbmQocmVzLCBzdHlsZURhdGEpO1xuICB9XG5cbiAgdmFyIHBhcmVudE5vZGUgPSB2bm9kZTtcbiAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7XG4gICAgaWYgKHBhcmVudE5vZGUuZGF0YSAmJiAoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHBhcmVudE5vZGUuZGF0YSkpKSB7XG4gICAgICBleHRlbmQocmVzLCBzdHlsZURhdGEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qICAqL1xuXG52YXIgY3NzVmFyUkUgPSAvXi0tLztcbnZhciBpbXBvcnRhbnRSRSA9IC9cXHMqIWltcG9ydGFudCQvO1xudmFyIHNldFByb3AgPSBmdW5jdGlvbiAoZWwsIG5hbWUsIHZhbCkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGNzc1ZhclJFLnRlc3QobmFtZSkpIHtcbiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWwpO1xuICB9IGVsc2UgaWYgKGltcG9ydGFudFJFLnRlc3QodmFsKSkge1xuICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KGh5cGhlbmF0ZShuYW1lKSwgdmFsLnJlcGxhY2UoaW1wb3J0YW50UkUsICcnKSwgJ2ltcG9ydGFudCcpO1xuICB9IGVsc2Uge1xuICAgIHZhciBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZShuYW1lKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAvLyBTdXBwb3J0IHZhbHVlcyBhcnJheSBjcmVhdGVkIGJ5IGF1dG9wcmVmaXhlciwgZS5nLlxuICAgICAgLy8ge2Rpc3BsYXk6IFtcIi13ZWJraXQtYm94XCIsIFwiLW1zLWZsZXhib3hcIiwgXCJmbGV4XCJdfVxuICAgICAgLy8gU2V0IHRoZW0gb25lIGJ5IG9uZSwgYW5kIHRoZSBicm93c2VyIHdpbGwgb25seSBzZXQgdGhvc2UgaXQgY2FuIHJlY29nbml6ZVxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBlbC5zdHlsZVtub3JtYWxpemVkTmFtZV0gPSB2YWxbaV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnN0eWxlW25vcm1hbGl6ZWROYW1lXSA9IHZhbDtcbiAgICB9XG4gIH1cbn07XG5cbnZhciB2ZW5kb3JOYW1lcyA9IFsnV2Via2l0JywgJ01veicsICdtcyddO1xuXG52YXIgZW1wdHlTdHlsZTtcbnZhciBub3JtYWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHByb3ApIHtcbiAgZW1wdHlTdHlsZSA9IGVtcHR5U3R5bGUgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7XG4gIHByb3AgPSBjYW1lbGl6ZShwcm9wKTtcbiAgaWYgKHByb3AgIT09ICdmaWx0ZXInICYmIChwcm9wIGluIGVtcHR5U3R5bGUpKSB7XG4gICAgcmV0dXJuIHByb3BcbiAgfVxuICB2YXIgY2FwTmFtZSA9IHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnNsaWNlKDEpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHZlbmRvck5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5hbWUgPSB2ZW5kb3JOYW1lc1tpXSArIGNhcE5hbWU7XG4gICAgaWYgKG5hbWUgaW4gZW1wdHlTdHlsZSkge1xuICAgICAgcmV0dXJuIG5hbWVcbiAgICB9XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiB1cGRhdGVTdHlsZSAob2xkVm5vZGUsIHZub2RlKSB7XG4gIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgdmFyIG9sZERhdGEgPSBvbGRWbm9kZS5kYXRhO1xuXG4gIGlmIChpc1VuZGVmKGRhdGEuc3RhdGljU3R5bGUpICYmIGlzVW5kZWYoZGF0YS5zdHlsZSkgJiZcbiAgICBpc1VuZGVmKG9sZERhdGEuc3RhdGljU3R5bGUpICYmIGlzVW5kZWYob2xkRGF0YS5zdHlsZSlcbiAgKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgY3VyLCBuYW1lO1xuICB2YXIgZWwgPSB2bm9kZS5lbG07XG4gIHZhciBvbGRTdGF0aWNTdHlsZSA9IG9sZERhdGEuc3RhdGljU3R5bGU7XG4gIHZhciBvbGRTdHlsZUJpbmRpbmcgPSBvbGREYXRhLm5vcm1hbGl6ZWRTdHlsZSB8fCBvbGREYXRhLnN0eWxlIHx8IHt9O1xuXG4gIC8vIGlmIHN0YXRpYyBzdHlsZSBleGlzdHMsIHN0eWxlYmluZGluZyBhbHJlYWR5IG1lcmdlZCBpbnRvIGl0IHdoZW4gZG9pbmcgbm9ybWFsaXplU3R5bGVEYXRhXG4gIHZhciBvbGRTdHlsZSA9IG9sZFN0YXRpY1N0eWxlIHx8IG9sZFN0eWxlQmluZGluZztcblxuICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcodm5vZGUuZGF0YS5zdHlsZSkgfHwge307XG5cbiAgLy8gc3RvcmUgbm9ybWFsaXplZCBzdHlsZSB1bmRlciBhIGRpZmZlcmVudCBrZXkgZm9yIG5leHQgZGlmZlxuICAvLyBtYWtlIHN1cmUgdG8gY2xvbmUgaXQgaWYgaXQncyByZWFjdGl2ZSwgc2luY2UgdGhlIHVzZXIgbGlrZWx5IHdhbnRzXG4gIC8vIHRvIG11dGF0ZSBpdC5cbiAgdm5vZGUuZGF0YS5ub3JtYWxpemVkU3R5bGUgPSBpc0RlZihzdHlsZS5fX29iX18pXG4gICAgPyBleHRlbmQoe30sIHN0eWxlKVxuICAgIDogc3R5bGU7XG5cbiAgdmFyIG5ld1N0eWxlID0gZ2V0U3R5bGUodm5vZGUsIHRydWUpO1xuXG4gIGZvciAobmFtZSBpbiBvbGRTdHlsZSkge1xuICAgIGlmIChpc1VuZGVmKG5ld1N0eWxlW25hbWVdKSkge1xuICAgICAgc2V0UHJvcChlbCwgbmFtZSwgJycpO1xuICAgIH1cbiAgfVxuICBmb3IgKG5hbWUgaW4gbmV3U3R5bGUpIHtcbiAgICBjdXIgPSBuZXdTdHlsZVtuYW1lXTtcbiAgICBpZiAoY3VyICE9PSBvbGRTdHlsZVtuYW1lXSkge1xuICAgICAgLy8gaWU5IHNldHRpbmcgdG8gbnVsbCBoYXMgbm8gZWZmZWN0LCBtdXN0IHVzZSBlbXB0eSBzdHJpbmdcbiAgICAgIHNldFByb3AoZWwsIG5hbWUsIGN1ciA9PSBudWxsID8gJycgOiBjdXIpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgc3R5bGUgPSB7XG4gIGNyZWF0ZTogdXBkYXRlU3R5bGUsXG4gIHVwZGF0ZTogdXBkYXRlU3R5bGVcbn07XG5cbi8qICAqL1xuXG52YXIgd2hpdGVzcGFjZVJFID0gL1xccysvO1xuXG4vKipcbiAqIEFkZCBjbGFzcyB3aXRoIGNvbXBhdGliaWxpdHkgZm9yIFNWRyBzaW5jZSBjbGFzc0xpc3QgaXMgbm90IHN1cHBvcnRlZCBvblxuICogU1ZHIGVsZW1lbnRzIGluIElFXG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzIChlbCwgY2xzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkge1xuICAgICAgY2xzLnNwbGl0KHdoaXRlc3BhY2VSRSkuZm9yRWFjaChmdW5jdGlvbiAoYykgeyByZXR1cm4gZWwuY2xhc3NMaXN0LmFkZChjKTsgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoY2xzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGN1ciA9IFwiIFwiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyBcIiBcIjtcbiAgICBpZiAoY3VyLmluZGV4T2YoJyAnICsgY2xzICsgJyAnKSA8IDApIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAoY3VyICsgY2xzKS50cmltKCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBjbGFzcyB3aXRoIGNvbXBhdGliaWxpdHkgZm9yIFNWRyBzaW5jZSBjbGFzc0xpc3QgaXMgbm90IHN1cHBvcnRlZCBvblxuICogU1ZHIGVsZW1lbnRzIGluIElFXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzIChlbCwgY2xzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkge1xuICAgICAgY2xzLnNwbGl0KHdoaXRlc3BhY2VSRSkuZm9yRWFjaChmdW5jdGlvbiAoYykgeyByZXR1cm4gZWwuY2xhc3NMaXN0LnJlbW92ZShjKTsgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xzKTtcbiAgICB9XG4gICAgaWYgKCFlbC5jbGFzc0xpc3QubGVuZ3RoKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBjdXIgPSBcIiBcIiArIChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgXCIgXCI7XG4gICAgdmFyIHRhciA9ICcgJyArIGNscyArICcgJztcbiAgICB3aGlsZSAoY3VyLmluZGV4T2YodGFyKSA+PSAwKSB7XG4gICAgICBjdXIgPSBjdXIucmVwbGFjZSh0YXIsICcgJyk7XG4gICAgfVxuICAgIGN1ciA9IGN1ci50cmltKCk7XG4gICAgaWYgKGN1cikge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIGN1cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uIChkZWYkJDEpIHtcbiAgaWYgKCFkZWYkJDEpIHtcbiAgICByZXR1cm5cbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAodHlwZW9mIGRlZiQkMSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgcmVzID0ge307XG4gICAgaWYgKGRlZiQkMS5jc3MgIT09IGZhbHNlKSB7XG4gICAgICBleHRlbmQocmVzLCBhdXRvQ3NzVHJhbnNpdGlvbihkZWYkJDEubmFtZSB8fCAndicpKTtcbiAgICB9XG4gICAgZXh0ZW5kKHJlcywgZGVmJCQxKTtcbiAgICByZXR1cm4gcmVzXG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZiQkMSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gYXV0b0Nzc1RyYW5zaXRpb24oZGVmJCQxKVxuICB9XG59XG5cbnZhciBhdXRvQ3NzVHJhbnNpdGlvbiA9IGNhY2hlZChmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4ge1xuICAgIGVudGVyQ2xhc3M6IChuYW1lICsgXCItZW50ZXJcIiksXG4gICAgZW50ZXJUb0NsYXNzOiAobmFtZSArIFwiLWVudGVyLXRvXCIpLFxuICAgIGVudGVyQWN0aXZlQ2xhc3M6IChuYW1lICsgXCItZW50ZXItYWN0aXZlXCIpLFxuICAgIGxlYXZlQ2xhc3M6IChuYW1lICsgXCItbGVhdmVcIiksXG4gICAgbGVhdmVUb0NsYXNzOiAobmFtZSArIFwiLWxlYXZlLXRvXCIpLFxuICAgIGxlYXZlQWN0aXZlQ2xhc3M6IChuYW1lICsgXCItbGVhdmUtYWN0aXZlXCIpXG4gIH1cbn0pO1xuXG52YXIgaGFzVHJhbnNpdGlvbiA9IGluQnJvd3NlciAmJiAhaXNJRTk7XG52YXIgVFJBTlNJVElPTiA9ICd0cmFuc2l0aW9uJztcbnZhciBBTklNQVRJT04gPSAnYW5pbWF0aW9uJztcblxuLy8gVHJhbnNpdGlvbiBwcm9wZXJ0eS9ldmVudCBzbmlmZmluZ1xudmFyIHRyYW5zaXRpb25Qcm9wID0gJ3RyYW5zaXRpb24nO1xudmFyIHRyYW5zaXRpb25FbmRFdmVudCA9ICd0cmFuc2l0aW9uZW5kJztcbnZhciBhbmltYXRpb25Qcm9wID0gJ2FuaW1hdGlvbic7XG52YXIgYW5pbWF0aW9uRW5kRXZlbnQgPSAnYW5pbWF0aW9uZW5kJztcbmlmIChoYXNUcmFuc2l0aW9uKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAod2luZG93Lm9udHJhbnNpdGlvbmVuZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgd2luZG93Lm9ud2Via2l0dHJhbnNpdGlvbmVuZCAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHRyYW5zaXRpb25Qcm9wID0gJ1dlYmtpdFRyYW5zaXRpb24nO1xuICAgIHRyYW5zaXRpb25FbmRFdmVudCA9ICd3ZWJraXRUcmFuc2l0aW9uRW5kJztcbiAgfVxuICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiZcbiAgICB3aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQgIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBhbmltYXRpb25Qcm9wID0gJ1dlYmtpdEFuaW1hdGlvbic7XG4gICAgYW5pbWF0aW9uRW5kRXZlbnQgPSAnd2Via2l0QW5pbWF0aW9uRW5kJztcbiAgfVxufVxuXG4vLyBiaW5kaW5nIHRvIHdpbmRvdyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBob3QgcmVsb2FkIHdvcmsgaW4gSUUgaW4gc3RyaWN0IG1vZGVcbnZhciByYWYgPSBpbkJyb3dzZXJcbiAgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KVxuICAgIDogc2V0VGltZW91dFxuICA6IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIGZ1bmN0aW9uIChmbikgeyByZXR1cm4gZm4oKTsgfTtcblxuZnVuY3Rpb24gbmV4dEZyYW1lIChmbikge1xuICByYWYoZnVuY3Rpb24gKCkge1xuICAgIHJhZihmbik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHtcbiAgdmFyIHRyYW5zaXRpb25DbGFzc2VzID0gZWwuX3RyYW5zaXRpb25DbGFzc2VzIHx8IChlbC5fdHJhbnNpdGlvbkNsYXNzZXMgPSBbXSk7XG4gIGlmICh0cmFuc2l0aW9uQ2xhc3Nlcy5pbmRleE9mKGNscykgPCAwKSB7XG4gICAgdHJhbnNpdGlvbkNsYXNzZXMucHVzaChjbHMpO1xuICAgIGFkZENsYXNzKGVsLCBjbHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25DbGFzcyAoZWwsIGNscykge1xuICBpZiAoZWwuX3RyYW5zaXRpb25DbGFzc2VzKSB7XG4gICAgcmVtb3ZlKGVsLl90cmFuc2l0aW9uQ2xhc3NlcywgY2xzKTtcbiAgfVxuICByZW1vdmVDbGFzcyhlbCwgY2xzKTtcbn1cblxuZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzIChcbiAgZWwsXG4gIGV4cGVjdGVkVHlwZSxcbiAgY2Jcbikge1xuICB2YXIgcmVmID0gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSk7XG4gIHZhciB0eXBlID0gcmVmLnR5cGU7XG4gIHZhciB0aW1lb3V0ID0gcmVmLnRpbWVvdXQ7XG4gIHZhciBwcm9wQ291bnQgPSByZWYucHJvcENvdW50O1xuICBpZiAoIXR5cGUpIHsgcmV0dXJuIGNiKCkgfVxuICB2YXIgZXZlbnQgPSB0eXBlID09PSBUUkFOU0lUSU9OID8gdHJhbnNpdGlvbkVuZEV2ZW50IDogYW5pbWF0aW9uRW5kRXZlbnQ7XG4gIHZhciBlbmRlZCA9IDA7XG4gIHZhciBlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgb25FbmQpO1xuICAgIGNiKCk7XG4gIH07XG4gIHZhciBvbkVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBlbCkge1xuICAgICAgaWYgKCsrZW5kZWQgPj0gcHJvcENvdW50KSB7XG4gICAgICAgIGVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7XG4gICAgICBlbmQoKTtcbiAgICB9XG4gIH0sIHRpbWVvdXQgKyAxKTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgb25FbmQpO1xufVxuXG52YXIgdHJhbnNmb3JtUkUgPSAvXFxiKHRyYW5zZm9ybXxhbGwpKCx8JCkvO1xuXG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uSW5mbyAoZWwsIGV4cGVjdGVkVHlwZSkge1xuICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICAvLyBKU0RPTSBtYXkgcmV0dXJuIHVuZGVmaW5lZCBmb3IgdHJhbnNpdGlvbiBwcm9wZXJ0aWVzXG4gIHZhciB0cmFuc2l0aW9uRGVsYXlzID0gKHN0eWxlc1t0cmFuc2l0aW9uUHJvcCArICdEZWxheSddIHx8ICcnKS5zcGxpdCgnLCAnKTtcbiAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbnMgPSAoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10gfHwgJycpLnNwbGl0KCcsICcpO1xuICB2YXIgdHJhbnNpdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KHRyYW5zaXRpb25EZWxheXMsIHRyYW5zaXRpb25EdXJhdGlvbnMpO1xuICB2YXIgYW5pbWF0aW9uRGVsYXlzID0gKHN0eWxlc1thbmltYXRpb25Qcm9wICsgJ0RlbGF5J10gfHwgJycpLnNwbGl0KCcsICcpO1xuICB2YXIgYW5pbWF0aW9uRHVyYXRpb25zID0gKHN0eWxlc1thbmltYXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10gfHwgJycpLnNwbGl0KCcsICcpO1xuICB2YXIgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpO1xuXG4gIHZhciB0eXBlO1xuICB2YXIgdGltZW91dCA9IDA7XG4gIHZhciBwcm9wQ291bnQgPSAwO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gVFJBTlNJVElPTikge1xuICAgIGlmICh0cmFuc2l0aW9uVGltZW91dCA+IDApIHtcbiAgICAgIHR5cGUgPSBUUkFOU0lUSU9OO1xuICAgICAgdGltZW91dCA9IHRyYW5zaXRpb25UaW1lb3V0O1xuICAgICAgcHJvcENvdW50ID0gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGg7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gQU5JTUFUSU9OKSB7XG4gICAgaWYgKGFuaW1hdGlvblRpbWVvdXQgPiAwKSB7XG4gICAgICB0eXBlID0gQU5JTUFUSU9OO1xuICAgICAgdGltZW91dCA9IGFuaW1hdGlvblRpbWVvdXQ7XG4gICAgICBwcm9wQ291bnQgPSBhbmltYXRpb25EdXJhdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aW1lb3V0ID0gTWF0aC5tYXgodHJhbnNpdGlvblRpbWVvdXQsIGFuaW1hdGlvblRpbWVvdXQpO1xuICAgIHR5cGUgPSB0aW1lb3V0ID4gMFxuICAgICAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXRcbiAgICAgICAgPyBUUkFOU0lUSU9OXG4gICAgICAgIDogQU5JTUFUSU9OXG4gICAgICA6IG51bGw7XG4gICAgcHJvcENvdW50ID0gdHlwZVxuICAgICAgPyB0eXBlID09PSBUUkFOU0lUSU9OXG4gICAgICAgID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGhcbiAgICAgICAgOiBhbmltYXRpb25EdXJhdGlvbnMubGVuZ3RoXG4gICAgICA6IDA7XG4gIH1cbiAgdmFyIGhhc1RyYW5zZm9ybSA9XG4gICAgdHlwZSA9PT0gVFJBTlNJVElPTiAmJlxuICAgIHRyYW5zZm9ybVJFLnRlc3Qoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ1Byb3BlcnR5J10pO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IHR5cGUsXG4gICAgdGltZW91dDogdGltZW91dCxcbiAgICBwcm9wQ291bnQ6IHByb3BDb3VudCxcbiAgICBoYXNUcmFuc2Zvcm06IGhhc1RyYW5zZm9ybVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRpbWVvdXQgKGRlbGF5cywgZHVyYXRpb25zKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHdoaWxlIChkZWxheXMubGVuZ3RoIDwgZHVyYXRpb25zLmxlbmd0aCkge1xuICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTtcbiAgfVxuXG4gIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBkdXJhdGlvbnMubWFwKGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgcmV0dXJuIHRvTXMoZCkgKyB0b01zKGRlbGF5c1tpXSlcbiAgfSkpXG59XG5cbi8vIE9sZCB2ZXJzaW9ucyBvZiBDaHJvbWl1bSAoYmVsb3cgNjEuMC4zMTYzLjEwMCkgZm9ybWF0cyBmbG9hdGluZyBwb2ludGVyIG51bWJlcnNcbi8vIGluIGEgbG9jYWxlLWRlcGVuZGVudCB3YXksIHVzaW5nIGEgY29tbWEgaW5zdGVhZCBvZiBhIGRvdC5cbi8vIElmIGNvbW1hIGlzIG5vdCByZXBsYWNlZCB3aXRoIGEgZG90LCB0aGUgaW5wdXQgd2lsbCBiZSByb3VuZGVkIGRvd24gKGkuZS4gYWN0aW5nXG4vLyBhcyBhIGZsb29yIGZ1bmN0aW9uKSBjYXVzaW5nIHVuZXhwZWN0ZWQgYmVoYXZpb3JzXG5mdW5jdGlvbiB0b01zIChzKSB7XG4gIHJldHVybiBOdW1iZXIocy5zbGljZSgwLCAtMSkucmVwbGFjZSgnLCcsICcuJykpICogMTAwMFxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gZW50ZXIgKHZub2RlLCB0b2dnbGVEaXNwbGF5KSB7XG4gIHZhciBlbCA9IHZub2RlLmVsbTtcblxuICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vd1xuICBpZiAoaXNEZWYoZWwuX2xlYXZlQ2IpKSB7XG4gICAgZWwuX2xlYXZlQ2IuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICBlbC5fbGVhdmVDYigpO1xuICB9XG5cbiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pO1xuICBpZiAoaXNVbmRlZihkYXRhKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc0RlZihlbC5fZW50ZXJDYikgfHwgZWwubm9kZVR5cGUgIT09IDEpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBjc3MgPSBkYXRhLmNzcztcbiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7XG4gIHZhciBlbnRlckNsYXNzID0gZGF0YS5lbnRlckNsYXNzO1xuICB2YXIgZW50ZXJUb0NsYXNzID0gZGF0YS5lbnRlclRvQ2xhc3M7XG4gIHZhciBlbnRlckFjdGl2ZUNsYXNzID0gZGF0YS5lbnRlckFjdGl2ZUNsYXNzO1xuICB2YXIgYXBwZWFyQ2xhc3MgPSBkYXRhLmFwcGVhckNsYXNzO1xuICB2YXIgYXBwZWFyVG9DbGFzcyA9IGRhdGEuYXBwZWFyVG9DbGFzcztcbiAgdmFyIGFwcGVhckFjdGl2ZUNsYXNzID0gZGF0YS5hcHBlYXJBY3RpdmVDbGFzcztcbiAgdmFyIGJlZm9yZUVudGVyID0gZGF0YS5iZWZvcmVFbnRlcjtcbiAgdmFyIGVudGVyID0gZGF0YS5lbnRlcjtcbiAgdmFyIGFmdGVyRW50ZXIgPSBkYXRhLmFmdGVyRW50ZXI7XG4gIHZhciBlbnRlckNhbmNlbGxlZCA9IGRhdGEuZW50ZXJDYW5jZWxsZWQ7XG4gIHZhciBiZWZvcmVBcHBlYXIgPSBkYXRhLmJlZm9yZUFwcGVhcjtcbiAgdmFyIGFwcGVhciA9IGRhdGEuYXBwZWFyO1xuICB2YXIgYWZ0ZXJBcHBlYXIgPSBkYXRhLmFmdGVyQXBwZWFyO1xuICB2YXIgYXBwZWFyQ2FuY2VsbGVkID0gZGF0YS5hcHBlYXJDYW5jZWxsZWQ7XG4gIHZhciBkdXJhdGlvbiA9IGRhdGEuZHVyYXRpb247XG5cbiAgLy8gYWN0aXZlSW5zdGFuY2Ugd2lsbCBhbHdheXMgYmUgdGhlIDx0cmFuc2l0aW9uPiBjb21wb25lbnQgbWFuYWdpbmcgdGhpc1xuICAvLyB0cmFuc2l0aW9uLiBPbmUgZWRnZSBjYXNlIHRvIGNoZWNrIGlzIHdoZW4gdGhlIDx0cmFuc2l0aW9uPiBpcyBwbGFjZWRcbiAgLy8gYXMgdGhlIHJvb3Qgbm9kZSBvZiBhIGNoaWxkIGNvbXBvbmVudC4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gY2hlY2tcbiAgLy8gPHRyYW5zaXRpb24+J3MgcGFyZW50IGZvciBhcHBlYXIgY2hlY2suXG4gIHZhciBjb250ZXh0ID0gYWN0aXZlSW5zdGFuY2U7XG4gIHZhciB0cmFuc2l0aW9uTm9kZSA9IGFjdGl2ZUluc3RhbmNlLiR2bm9kZTtcbiAgd2hpbGUgKHRyYW5zaXRpb25Ob2RlICYmIHRyYW5zaXRpb25Ob2RlLnBhcmVudCkge1xuICAgIGNvbnRleHQgPSB0cmFuc2l0aW9uTm9kZS5jb250ZXh0O1xuICAgIHRyYW5zaXRpb25Ob2RlID0gdHJhbnNpdGlvbk5vZGUucGFyZW50O1xuICB9XG5cbiAgdmFyIGlzQXBwZWFyID0gIWNvbnRleHQuX2lzTW91bnRlZCB8fCAhdm5vZGUuaXNSb290SW5zZXJ0O1xuXG4gIGlmIChpc0FwcGVhciAmJiAhYXBwZWFyICYmIGFwcGVhciAhPT0gJycpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBzdGFydENsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyQ2xhc3NcbiAgICA/IGFwcGVhckNsYXNzXG4gICAgOiBlbnRlckNsYXNzO1xuICB2YXIgYWN0aXZlQ2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJBY3RpdmVDbGFzc1xuICAgID8gYXBwZWFyQWN0aXZlQ2xhc3NcbiAgICA6IGVudGVyQWN0aXZlQ2xhc3M7XG4gIHZhciB0b0NsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyVG9DbGFzc1xuICAgID8gYXBwZWFyVG9DbGFzc1xuICAgIDogZW50ZXJUb0NsYXNzO1xuXG4gIHZhciBiZWZvcmVFbnRlckhvb2sgPSBpc0FwcGVhclxuICAgID8gKGJlZm9yZUFwcGVhciB8fCBiZWZvcmVFbnRlcilcbiAgICA6IGJlZm9yZUVudGVyO1xuICB2YXIgZW50ZXJIb29rID0gaXNBcHBlYXJcbiAgICA/ICh0eXBlb2YgYXBwZWFyID09PSAnZnVuY3Rpb24nID8gYXBwZWFyIDogZW50ZXIpXG4gICAgOiBlbnRlcjtcbiAgdmFyIGFmdGVyRW50ZXJIb29rID0gaXNBcHBlYXJcbiAgICA/IChhZnRlckFwcGVhciB8fCBhZnRlckVudGVyKVxuICAgIDogYWZ0ZXJFbnRlcjtcbiAgdmFyIGVudGVyQ2FuY2VsbGVkSG9vayA9IGlzQXBwZWFyXG4gICAgPyAoYXBwZWFyQ2FuY2VsbGVkIHx8IGVudGVyQ2FuY2VsbGVkKVxuICAgIDogZW50ZXJDYW5jZWxsZWQ7XG5cbiAgdmFyIGV4cGxpY2l0RW50ZXJEdXJhdGlvbiA9IHRvTnVtYmVyKFxuICAgIGlzT2JqZWN0KGR1cmF0aW9uKVxuICAgICAgPyBkdXJhdGlvbi5lbnRlclxuICAgICAgOiBkdXJhdGlvblxuICApO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGV4cGxpY2l0RW50ZXJEdXJhdGlvbiAhPSBudWxsKSB7XG4gICAgY2hlY2tEdXJhdGlvbihleHBsaWNpdEVudGVyRHVyYXRpb24sICdlbnRlcicsIHZub2RlKTtcbiAgfVxuXG4gIHZhciBleHBlY3RzQ1NTID0gY3NzICE9PSBmYWxzZSAmJiAhaXNJRTk7XG4gIHZhciB1c2VyV2FudHNDb250cm9sID0gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aChlbnRlckhvb2spO1xuXG4gIHZhciBjYiA9IGVsLl9lbnRlckNiID0gb25jZShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGV4cGVjdHNDU1MpIHtcbiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgdG9DbGFzcyk7XG4gICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGFjdGl2ZUNsYXNzKTtcbiAgICB9XG4gICAgaWYgKGNiLmNhbmNlbGxlZCkge1xuICAgICAgaWYgKGV4cGVjdHNDU1MpIHtcbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTtcbiAgICAgIH1cbiAgICAgIGVudGVyQ2FuY2VsbGVkSG9vayAmJiBlbnRlckNhbmNlbGxlZEhvb2soZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlckVudGVySG9vayAmJiBhZnRlckVudGVySG9vayhlbCk7XG4gICAgfVxuICAgIGVsLl9lbnRlckNiID0gbnVsbDtcbiAgfSk7XG5cbiAgaWYgKCF2bm9kZS5kYXRhLnNob3cpIHtcbiAgICAvLyByZW1vdmUgcGVuZGluZyBsZWF2ZSBlbGVtZW50IG9uIGVudGVyIGJ5IGluamVjdGluZyBhbiBpbnNlcnQgaG9va1xuICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAnaW5zZXJ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudE5vZGU7XG4gICAgICB2YXIgcGVuZGluZ05vZGUgPSBwYXJlbnQgJiYgcGFyZW50Ll9wZW5kaW5nICYmIHBhcmVudC5fcGVuZGluZ1t2bm9kZS5rZXldO1xuICAgICAgaWYgKHBlbmRpbmdOb2RlICYmXG4gICAgICAgIHBlbmRpbmdOb2RlLnRhZyA9PT0gdm5vZGUudGFnICYmXG4gICAgICAgIHBlbmRpbmdOb2RlLmVsbS5fbGVhdmVDYlxuICAgICAgKSB7XG4gICAgICAgIHBlbmRpbmdOb2RlLmVsbS5fbGVhdmVDYigpO1xuICAgICAgfVxuICAgICAgZW50ZXJIb29rICYmIGVudGVySG9vayhlbCwgY2IpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gc3RhcnQgZW50ZXIgdHJhbnNpdGlvblxuICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTtcbiAgaWYgKGV4cGVjdHNDU1MpIHtcbiAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIHN0YXJ0Q2xhc3MpO1xuICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpO1xuICAgIG5leHRGcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIHN0YXJ0Q2xhc3MpO1xuICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHtcbiAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCB0b0NsYXNzKTtcbiAgICAgICAgaWYgKCF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdEVudGVyRHVyYXRpb24pKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNiLCBleHBsaWNpdEVudGVyRHVyYXRpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmICh2bm9kZS5kYXRhLnNob3cpIHtcbiAgICB0b2dnbGVEaXNwbGF5ICYmIHRvZ2dsZURpc3BsYXkoKTtcbiAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7XG4gIH1cblxuICBpZiAoIWV4cGVjdHNDU1MgJiYgIXVzZXJXYW50c0NvbnRyb2wpIHtcbiAgICBjYigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxlYXZlICh2bm9kZSwgcm0pIHtcbiAgdmFyIGVsID0gdm5vZGUuZWxtO1xuXG4gIC8vIGNhbGwgZW50ZXIgY2FsbGJhY2sgbm93XG4gIGlmIChpc0RlZihlbC5fZW50ZXJDYikpIHtcbiAgICBlbC5fZW50ZXJDYi5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIGVsLl9lbnRlckNiKCk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHJlc29sdmVUcmFuc2l0aW9uKHZub2RlLmRhdGEudHJhbnNpdGlvbik7XG4gIGlmIChpc1VuZGVmKGRhdGEpIHx8IGVsLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgcmV0dXJuIHJtKClcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoaXNEZWYoZWwuX2xlYXZlQ2IpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgY3NzID0gZGF0YS5jc3M7XG4gIHZhciB0eXBlID0gZGF0YS50eXBlO1xuICB2YXIgbGVhdmVDbGFzcyA9IGRhdGEubGVhdmVDbGFzcztcbiAgdmFyIGxlYXZlVG9DbGFzcyA9IGRhdGEubGVhdmVUb0NsYXNzO1xuICB2YXIgbGVhdmVBY3RpdmVDbGFzcyA9IGRhdGEubGVhdmVBY3RpdmVDbGFzcztcbiAgdmFyIGJlZm9yZUxlYXZlID0gZGF0YS5iZWZvcmVMZWF2ZTtcbiAgdmFyIGxlYXZlID0gZGF0YS5sZWF2ZTtcbiAgdmFyIGFmdGVyTGVhdmUgPSBkYXRhLmFmdGVyTGVhdmU7XG4gIHZhciBsZWF2ZUNhbmNlbGxlZCA9IGRhdGEubGVhdmVDYW5jZWxsZWQ7XG4gIHZhciBkZWxheUxlYXZlID0gZGF0YS5kZWxheUxlYXZlO1xuICB2YXIgZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uO1xuXG4gIHZhciBleHBlY3RzQ1NTID0gY3NzICE9PSBmYWxzZSAmJiAhaXNJRTk7XG4gIHZhciB1c2VyV2FudHNDb250cm9sID0gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aChsZWF2ZSk7XG5cbiAgdmFyIGV4cGxpY2l0TGVhdmVEdXJhdGlvbiA9IHRvTnVtYmVyKFxuICAgIGlzT2JqZWN0KGR1cmF0aW9uKVxuICAgICAgPyBkdXJhdGlvbi5sZWF2ZVxuICAgICAgOiBkdXJhdGlvblxuICApO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGlzRGVmKGV4cGxpY2l0TGVhdmVEdXJhdGlvbikpIHtcbiAgICBjaGVja0R1cmF0aW9uKGV4cGxpY2l0TGVhdmVEdXJhdGlvbiwgJ2xlYXZlJywgdm5vZGUpO1xuICB9XG5cbiAgdmFyIGNiID0gZWwuX2xlYXZlQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLl9wZW5kaW5nKSB7XG4gICAgICBlbC5wYXJlbnROb2RlLl9wZW5kaW5nW3Zub2RlLmtleV0gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoZXhwZWN0c0NTUykge1xuICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZVRvQ2xhc3MpO1xuICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTtcbiAgICB9XG4gICAgaWYgKGNiLmNhbmNlbGxlZCkge1xuICAgICAgaWYgKGV4cGVjdHNDU1MpIHtcbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTtcbiAgICAgIH1cbiAgICAgIGxlYXZlQ2FuY2VsbGVkICYmIGxlYXZlQ2FuY2VsbGVkKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm0oKTtcbiAgICAgIGFmdGVyTGVhdmUgJiYgYWZ0ZXJMZWF2ZShlbCk7XG4gICAgfVxuICAgIGVsLl9sZWF2ZUNiID0gbnVsbDtcbiAgfSk7XG5cbiAgaWYgKGRlbGF5TGVhdmUpIHtcbiAgICBkZWxheUxlYXZlKHBlcmZvcm1MZWF2ZSk7XG4gIH0gZWxzZSB7XG4gICAgcGVyZm9ybUxlYXZlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBwZXJmb3JtTGVhdmUgKCkge1xuICAgIC8vIHRoZSBkZWxheWVkIGxlYXZlIG1heSBoYXZlIGFscmVhZHkgYmVlbiBjYW5jZWxsZWRcbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gcmVjb3JkIGxlYXZpbmcgZWxlbWVudFxuICAgIGlmICghdm5vZGUuZGF0YS5zaG93ICYmIGVsLnBhcmVudE5vZGUpIHtcbiAgICAgIChlbC5wYXJlbnROb2RlLl9wZW5kaW5nIHx8IChlbC5wYXJlbnROb2RlLl9wZW5kaW5nID0ge30pKVsodm5vZGUua2V5KV0gPSB2bm9kZTtcbiAgICB9XG4gICAgYmVmb3JlTGVhdmUgJiYgYmVmb3JlTGVhdmUoZWwpO1xuICAgIGlmIChleHBlY3RzQ1NTKSB7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTtcbiAgICAgIG5leHRGcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVDbGFzcyk7XG4gICAgICAgIGlmICghY2IuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZVRvQ2xhc3MpO1xuICAgICAgICAgIGlmICghdXNlcldhbnRzQ29udHJvbCkge1xuICAgICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24pKSB7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIGV4cGxpY2l0TGVhdmVEdXJhdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZWF2ZSAmJiBsZWF2ZShlbCwgY2IpO1xuICAgIGlmICghZXhwZWN0c0NTUyAmJiAhdXNlcldhbnRzQ29udHJvbCkge1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gb25seSB1c2VkIGluIGRldiBtb2RlXG5mdW5jdGlvbiBjaGVja0R1cmF0aW9uICh2YWwsIG5hbWUsIHZub2RlKSB7XG4gIGlmICh0eXBlb2YgdmFsICE9PSAnbnVtYmVyJykge1xuICAgIHdhcm4oXG4gICAgICBcIjx0cmFuc2l0aW9uPiBleHBsaWNpdCBcIiArIG5hbWUgKyBcIiBkdXJhdGlvbiBpcyBub3QgYSB2YWxpZCBudW1iZXIgLSBcIiArXG4gICAgICBcImdvdCBcIiArIChKU09OLnN0cmluZ2lmeSh2YWwpKSArIFwiLlwiLFxuICAgICAgdm5vZGUuY29udGV4dFxuICAgICk7XG4gIH0gZWxzZSBpZiAoaXNOYU4odmFsKSkge1xuICAgIHdhcm4oXG4gICAgICBcIjx0cmFuc2l0aW9uPiBleHBsaWNpdCBcIiArIG5hbWUgKyBcIiBkdXJhdGlvbiBpcyBOYU4gLSBcIiArXG4gICAgICAndGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LicsXG4gICAgICB2bm9kZS5jb250ZXh0XG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRHVyYXRpb24gKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhbClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYSB0cmFuc2l0aW9uIGhvb2sncyBhcmd1bWVudCBsZW5ndGguIFRoZSBob29rIG1heSBiZTpcbiAqIC0gYSBtZXJnZWQgaG9vayAoaW52b2tlcikgd2l0aCB0aGUgb3JpZ2luYWwgaW4gLmZuc1xuICogLSBhIHdyYXBwZWQgY29tcG9uZW50IG1ldGhvZCAoY2hlY2sgLl9sZW5ndGgpXG4gKiAtIGEgcGxhaW4gZnVuY3Rpb24gKC5sZW5ndGgpXG4gKi9cbmZ1bmN0aW9uIGdldEhvb2tBcmd1bWVudHNMZW5ndGggKGZuKSB7XG4gIGlmIChpc1VuZGVmKGZuKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHZhciBpbnZva2VyRm5zID0gZm4uZm5zO1xuICBpZiAoaXNEZWYoaW52b2tlckZucykpIHtcbiAgICAvLyBpbnZva2VyXG4gICAgcmV0dXJuIGdldEhvb2tBcmd1bWVudHNMZW5ndGgoXG4gICAgICBBcnJheS5pc0FycmF5KGludm9rZXJGbnMpXG4gICAgICAgID8gaW52b2tlckZuc1swXVxuICAgICAgICA6IGludm9rZXJGbnNcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChmbi5fbGVuZ3RoIHx8IGZuLmxlbmd0aCkgPiAxXG4gIH1cbn1cblxuZnVuY3Rpb24gX2VudGVyIChfLCB2bm9kZSkge1xuICBpZiAodm5vZGUuZGF0YS5zaG93ICE9PSB0cnVlKSB7XG4gICAgZW50ZXIodm5vZGUpO1xuICB9XG59XG5cbnZhciB0cmFuc2l0aW9uID0gaW5Ccm93c2VyID8ge1xuICBjcmVhdGU6IF9lbnRlcixcbiAgYWN0aXZhdGU6IF9lbnRlcixcbiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUkJDEgKHZub2RlLCBybSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHZub2RlLmRhdGEuc2hvdyAhPT0gdHJ1ZSkge1xuICAgICAgbGVhdmUodm5vZGUsIHJtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm0oKTtcbiAgICB9XG4gIH1cbn0gOiB7fTtcblxudmFyIHBsYXRmb3JtTW9kdWxlcyA9IFtcbiAgYXR0cnMsXG4gIGtsYXNzLFxuICBldmVudHMsXG4gIGRvbVByb3BzLFxuICBzdHlsZSxcbiAgdHJhbnNpdGlvblxuXTtcblxuLyogICovXG5cbi8vIHRoZSBkaXJlY3RpdmUgbW9kdWxlIHNob3VsZCBiZSBhcHBsaWVkIGxhc3QsIGFmdGVyIGFsbFxuLy8gYnVpbHQtaW4gbW9kdWxlcyBoYXZlIGJlZW4gYXBwbGllZC5cbnZhciBtb2R1bGVzID0gcGxhdGZvcm1Nb2R1bGVzLmNvbmNhdChiYXNlTW9kdWxlcyk7XG5cbnZhciBwYXRjaCA9IGNyZWF0ZVBhdGNoRnVuY3Rpb24oeyBub2RlT3BzOiBub2RlT3BzLCBtb2R1bGVzOiBtb2R1bGVzIH0pO1xuXG4vKipcbiAqIE5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBsaWtlIGF0dGFjaGluZ1xuICogcHJvcGVydGllcyB0byBFbGVtZW50cy5cbiAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChpc0lFOSkge1xuICAvLyBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L2ludGVybmV0LWV4cGxvcmVyLTktb25pbnB1dC9cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0aW9uY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGVsICYmIGVsLnZtb2RlbCkge1xuICAgICAgdHJpZ2dlcihlbCwgJ2lucHV0Jyk7XG4gICAgfVxuICB9KTtcbn1cblxudmFyIGRpcmVjdGl2ZSA9IHtcbiAgaW5zZXJ0ZWQ6IGZ1bmN0aW9uIGluc2VydGVkIChlbCwgYmluZGluZywgdm5vZGUsIG9sZFZub2RlKSB7XG4gICAgaWYgKHZub2RlLnRhZyA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgIC8vICM2OTAzXG4gICAgICBpZiAob2xkVm5vZGUuZWxtICYmICFvbGRWbm9kZS5lbG0uX3ZPcHRpb25zKSB7XG4gICAgICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAncG9zdHBhdGNoJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRpcmVjdGl2ZS5jb21wb25lbnRVcGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpO1xuICAgICAgfVxuICAgICAgZWwuX3ZPcHRpb25zID0gW10ubWFwLmNhbGwoZWwub3B0aW9ucywgZ2V0VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSAndGV4dGFyZWEnIHx8IGlzVGV4dElucHV0VHlwZShlbC50eXBlKSkge1xuICAgICAgZWwuX3ZNb2RpZmllcnMgPSBiaW5kaW5nLm1vZGlmaWVycztcbiAgICAgIGlmICghYmluZGluZy5tb2RpZmllcnMubGF6eSkge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY29tcG9zaXRpb25lbmQnLCBvbkNvbXBvc2l0aW9uRW5kKTtcbiAgICAgICAgLy8gU2FmYXJpIDwgMTAuMiAmIFVJV2ViVmlldyBkb2Vzbid0IGZpcmUgY29tcG9zaXRpb25lbmQgd2hlblxuICAgICAgICAvLyBzd2l0Y2hpbmcgZm9jdXMgYmVmb3JlIGNvbmZpcm1pbmcgY29tcG9zaXRpb24gY2hvaWNlXG4gICAgICAgIC8vIHRoaXMgYWxzbyBmaXhlcyB0aGUgaXNzdWUgd2hlcmUgc29tZSBicm93c2VycyBlLmcuIGlPUyBDaHJvbWVcbiAgICAgICAgLy8gZmlyZXMgXCJjaGFuZ2VcIiBpbnN0ZWFkIG9mIFwiaW5wdXRcIiBvbiBhdXRvY29tcGxldGUuXG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGlzSUU5KSB7XG4gICAgICAgICAgZWwudm1vZGVsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjb21wb25lbnRVcGRhdGVkOiBmdW5jdGlvbiBjb21wb25lbnRVcGRhdGVkIChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBpZiAodm5vZGUudGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpO1xuICAgICAgLy8gaW4gY2FzZSB0aGUgb3B0aW9ucyByZW5kZXJlZCBieSB2LWZvciBoYXZlIGNoYW5nZWQsXG4gICAgICAvLyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHZhbHVlIGlzIG91dC1vZi1zeW5jIHdpdGggdGhlIHJlbmRlcmVkIG9wdGlvbnMuXG4gICAgICAvLyBkZXRlY3Qgc3VjaCBjYXNlcyBhbmQgZmlsdGVyIG91dCB2YWx1ZXMgdGhhdCBubyBsb25nZXIgaGFzIGEgbWF0Y2hpbmdcbiAgICAgIC8vIG9wdGlvbiBpbiB0aGUgRE9NLlxuICAgICAgdmFyIHByZXZPcHRpb25zID0gZWwuX3ZPcHRpb25zO1xuICAgICAgdmFyIGN1ck9wdGlvbnMgPSBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7XG4gICAgICBpZiAoY3VyT3B0aW9ucy5zb21lKGZ1bmN0aW9uIChvLCBpKSB7IHJldHVybiAhbG9vc2VFcXVhbChvLCBwcmV2T3B0aW9uc1tpXSk7IH0pKSB7XG4gICAgICAgIC8vIHRyaWdnZXIgY2hhbmdlIGV2ZW50IGlmXG4gICAgICAgIC8vIG5vIG1hdGNoaW5nIG9wdGlvbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIHZhbHVlXG4gICAgICAgIHZhciBuZWVkUmVzZXQgPSBlbC5tdWx0aXBsZVxuICAgICAgICAgID8gYmluZGluZy52YWx1ZS5zb21lKGZ1bmN0aW9uICh2KSB7IHJldHVybiBoYXNOb01hdGNoaW5nT3B0aW9uKHYsIGN1ck9wdGlvbnMpOyB9KVxuICAgICAgICAgIDogYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSAmJiBoYXNOb01hdGNoaW5nT3B0aW9uKGJpbmRpbmcudmFsdWUsIGN1ck9wdGlvbnMpO1xuICAgICAgICBpZiAobmVlZFJlc2V0KSB7XG4gICAgICAgICAgdHJpZ2dlcihlbCwgJ2NoYW5nZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBzZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7XG4gIGFjdHVhbGx5U2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZtKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc0lFIHx8IGlzRWRnZSkge1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pO1xuICAgIH0sIDApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFjdHVhbGx5U2V0U2VsZWN0ZWQgKGVsLCBiaW5kaW5nLCB2bSkge1xuICB2YXIgdmFsdWUgPSBiaW5kaW5nLnZhbHVlO1xuICB2YXIgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlO1xuICBpZiAoaXNNdWx0aXBsZSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICBcIjxzZWxlY3QgbXVsdGlwbGUgdi1tb2RlbD1cXFwiXCIgKyAoYmluZGluZy5leHByZXNzaW9uKSArIFwiXFxcIj4gXCIgK1xuICAgICAgXCJleHBlY3RzIGFuIEFycmF5IHZhbHVlIGZvciBpdHMgYmluZGluZywgYnV0IGdvdCBcIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSksXG4gICAgICB2bVxuICAgICk7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHNlbGVjdGVkLCBvcHRpb247XG4gIGZvciAodmFyIGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBvcHRpb24gPSBlbC5vcHRpb25zW2ldO1xuICAgIGlmIChpc011bHRpcGxlKSB7XG4gICAgICBzZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgZ2V0VmFsdWUob3B0aW9uKSkgPiAtMTtcbiAgICAgIGlmIChvcHRpb24uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobG9vc2VFcXVhbChnZXRWYWx1ZShvcHRpb24pLCB2YWx1ZSkpIHtcbiAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpIHtcbiAgICAgICAgICBlbC5zZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCFpc011bHRpcGxlKSB7XG4gICAgZWwuc2VsZWN0ZWRJbmRleCA9IC0xO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc05vTWF0Y2hpbmdPcHRpb24gKHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBvcHRpb25zLmV2ZXJ5KGZ1bmN0aW9uIChvKSB7IHJldHVybiAhbG9vc2VFcXVhbChvLCB2YWx1ZSk7IH0pXG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlIChvcHRpb24pIHtcbiAgcmV0dXJuICdfdmFsdWUnIGluIG9wdGlvblxuICAgID8gb3B0aW9uLl92YWx1ZVxuICAgIDogb3B0aW9uLnZhbHVlXG59XG5cbmZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydCAoZSkge1xuICBlLnRhcmdldC5jb21wb3NpbmcgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kIChlKSB7XG4gIC8vIHByZXZlbnQgdHJpZ2dlcmluZyBhbiBpbnB1dCBldmVudCBmb3Igbm8gcmVhc29uXG4gIGlmICghZS50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybiB9XG4gIGUudGFyZ2V0LmNvbXBvc2luZyA9IGZhbHNlO1xuICB0cmlnZ2VyKGUudGFyZ2V0LCAnaW5wdXQnKTtcbn1cblxuZnVuY3Rpb24gdHJpZ2dlciAoZWwsIHR5cGUpIHtcbiAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpO1xuICBlLmluaXRFdmVudCh0eXBlLCB0cnVlLCB0cnVlKTtcbiAgZWwuZGlzcGF0Y2hFdmVudChlKTtcbn1cblxuLyogICovXG5cbi8vIHJlY3Vyc2l2ZWx5IHNlYXJjaCBmb3IgcG9zc2libGUgdHJhbnNpdGlvbiBkZWZpbmVkIGluc2lkZSB0aGUgY29tcG9uZW50IHJvb3RcbmZ1bmN0aW9uIGxvY2F0ZU5vZGUgKHZub2RlKSB7XG4gIHJldHVybiB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSAmJiAoIXZub2RlLmRhdGEgfHwgIXZub2RlLmRhdGEudHJhbnNpdGlvbilcbiAgICA/IGxvY2F0ZU5vZGUodm5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKVxuICAgIDogdm5vZGVcbn1cblxudmFyIHNob3cgPSB7XG4gIGJpbmQ6IGZ1bmN0aW9uIGJpbmQgKGVsLCByZWYsIHZub2RlKSB7XG4gICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlO1xuXG4gICAgdm5vZGUgPSBsb2NhdGVOb2RlKHZub2RlKTtcbiAgICB2YXIgdHJhbnNpdGlvbiQkMSA9IHZub2RlLmRhdGEgJiYgdm5vZGUuZGF0YS50cmFuc2l0aW9uO1xuICAgIHZhciBvcmlnaW5hbERpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgPVxuICAgICAgZWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJycgOiBlbC5zdHlsZS5kaXNwbGF5O1xuICAgIGlmICh2YWx1ZSAmJiB0cmFuc2l0aW9uJCQxKSB7XG4gICAgICB2bm9kZS5kYXRhLnNob3cgPSB0cnVlO1xuICAgICAgZW50ZXIodm5vZGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IG9yaWdpbmFsRGlzcGxheTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBvcmlnaW5hbERpc3BsYXkgOiAnbm9uZSc7XG4gICAgfVxuICB9LFxuXG4gIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChlbCwgcmVmLCB2bm9kZSkge1xuICAgIHZhciB2YWx1ZSA9IHJlZi52YWx1ZTtcbiAgICB2YXIgb2xkVmFsdWUgPSByZWYub2xkVmFsdWU7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIXZhbHVlID09PSAhb2xkVmFsdWUpIHsgcmV0dXJuIH1cbiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpO1xuICAgIHZhciB0cmFuc2l0aW9uJCQxID0gdm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLnRyYW5zaXRpb247XG4gICAgaWYgKHRyYW5zaXRpb24kJDEpIHtcbiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZW50ZXIodm5vZGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5O1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlYXZlKHZub2RlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZSA/IGVsLl9fdk9yaWdpbmFsRGlzcGxheSA6ICdub25lJztcbiAgICB9XG4gIH0sXG5cbiAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQgKFxuICAgIGVsLFxuICAgIGJpbmRpbmcsXG4gICAgdm5vZGUsXG4gICAgb2xkVm5vZGUsXG4gICAgaXNEZXN0cm95XG4gICkge1xuICAgIGlmICghaXNEZXN0cm95KSB7XG4gICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5O1xuICAgIH1cbiAgfVxufTtcblxudmFyIHBsYXRmb3JtRGlyZWN0aXZlcyA9IHtcbiAgbW9kZWw6IGRpcmVjdGl2ZSxcbiAgc2hvdzogc2hvd1xufTtcblxuLyogICovXG5cbnZhciB0cmFuc2l0aW9uUHJvcHMgPSB7XG4gIG5hbWU6IFN0cmluZyxcbiAgYXBwZWFyOiBCb29sZWFuLFxuICBjc3M6IEJvb2xlYW4sXG4gIG1vZGU6IFN0cmluZyxcbiAgdHlwZTogU3RyaW5nLFxuICBlbnRlckNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gIGxlYXZlVG9DbGFzczogU3RyaW5nLFxuICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyVG9DbGFzczogU3RyaW5nLFxuICBkdXJhdGlvbjogW051bWJlciwgU3RyaW5nLCBPYmplY3RdXG59O1xuXG4vLyBpbiBjYXNlIHRoZSBjaGlsZCBpcyBhbHNvIGFuIGFic3RyYWN0IGNvbXBvbmVudCwgZS5nLiA8a2VlcC1hbGl2ZT5cbi8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkXG5mdW5jdGlvbiBnZXRSZWFsQ2hpbGQgKHZub2RlKSB7XG4gIHZhciBjb21wT3B0aW9ucyA9IHZub2RlICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICByZXR1cm4gZ2V0UmVhbENoaWxkKGdldEZpcnN0Q29tcG9uZW50Q2hpbGQoY29tcE9wdGlvbnMuY2hpbGRyZW4pKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2bm9kZVxuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUcmFuc2l0aW9uRGF0YSAoY29tcCkge1xuICB2YXIgZGF0YSA9IHt9O1xuICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7XG4gIC8vIHByb3BzXG4gIGZvciAodmFyIGtleSBpbiBvcHRpb25zLnByb3BzRGF0YSkge1xuICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTtcbiAgfVxuICAvLyBldmVudHMuXG4gIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kc1xuICB2YXIgbGlzdGVuZXJzID0gb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO1xuICBmb3IgKHZhciBrZXkkMSBpbiBsaXN0ZW5lcnMpIHtcbiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdO1xuICB9XG4gIHJldHVybiBkYXRhXG59XG5cbmZ1bmN0aW9uIHBsYWNlaG9sZGVyIChoLCByYXdDaGlsZCkge1xuICBpZiAoL1xcZC1rZWVwLWFsaXZlJC8udGVzdChyYXdDaGlsZC50YWcpKSB7XG4gICAgcmV0dXJuIGgoJ2tlZXAtYWxpdmUnLCB7XG4gICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGFcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1BhcmVudFRyYW5zaXRpb24gKHZub2RlKSB7XG4gIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7XG4gICAgaWYgKHZub2RlLmRhdGEudHJhbnNpdGlvbikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTYW1lQ2hpbGQgKGNoaWxkLCBvbGRDaGlsZCkge1xuICByZXR1cm4gb2xkQ2hpbGQua2V5ID09PSBjaGlsZC5rZXkgJiYgb2xkQ2hpbGQudGFnID09PSBjaGlsZC50YWdcbn1cblxudmFyIGlzTm90VGV4dE5vZGUgPSBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50YWcgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpOyB9O1xuXG52YXIgaXNWU2hvd0RpcmVjdGl2ZSA9IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLm5hbWUgPT09ICdzaG93JzsgfTtcblxudmFyIFRyYW5zaXRpb24gPSB7XG4gIG5hbWU6ICd0cmFuc2l0aW9uJyxcbiAgcHJvcHM6IHRyYW5zaXRpb25Qcm9wcyxcbiAgYWJzdHJhY3Q6IHRydWUsXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuJHNsb3RzLmRlZmF1bHQ7XG4gICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcylcbiAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcihpc05vdFRleHROb2RlKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gd2FybiBtdWx0aXBsZSBlbGVtZW50c1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICc8dHJhbnNpdGlvbj4gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIHNpbmdsZSBlbGVtZW50LiBVc2UgJyArXG4gICAgICAgICc8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLicsXG4gICAgICAgIHRoaXMuJHBhcmVudFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgbW9kZSA9IHRoaXMubW9kZTtcblxuICAgIC8vIHdhcm4gaW52YWxpZCBtb2RlXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgIG1vZGUgJiYgbW9kZSAhPT0gJ2luLW91dCcgJiYgbW9kZSAhPT0gJ291dC1pbidcbiAgICApIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdpbnZhbGlkIDx0cmFuc2l0aW9uPiBtb2RlOiAnICsgbW9kZSxcbiAgICAgICAgdGhpcy4kcGFyZW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciByYXdDaGlsZCA9IGNoaWxkcmVuWzBdO1xuXG4gICAgLy8gaWYgdGhpcyBpcyBhIGNvbXBvbmVudCByb290IG5vZGUgYW5kIHRoZSBjb21wb25lbnQnc1xuICAgIC8vIHBhcmVudCBjb250YWluZXIgbm9kZSBhbHNvIGhhcyB0cmFuc2l0aW9uLCBza2lwLlxuICAgIGlmIChoYXNQYXJlbnRUcmFuc2l0aW9uKHRoaXMuJHZub2RlKSkge1xuICAgICAgcmV0dXJuIHJhd0NoaWxkXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgdHJhbnNpdGlvbiBkYXRhIHRvIGNoaWxkXG4gICAgLy8gdXNlIGdldFJlYWxDaGlsZCgpIHRvIGlnbm9yZSBhYnN0cmFjdCBjb21wb25lbnRzIGUuZy4ga2VlcC1hbGl2ZVxuICAgIHZhciBjaGlsZCA9IGdldFJlYWxDaGlsZChyYXdDaGlsZCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFjaGlsZCkge1xuICAgICAgcmV0dXJuIHJhd0NoaWxkXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xlYXZpbmcpIHtcbiAgICAgIHJldHVybiBwbGFjZWhvbGRlcihoLCByYXdDaGlsZClcbiAgICB9XG5cbiAgICAvLyBlbnN1cmUgYSBrZXkgdGhhdCBpcyB1bmlxdWUgdG8gdGhlIHZub2RlIHR5cGUgYW5kIHRvIHRoaXMgdHJhbnNpdGlvblxuICAgIC8vIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBrZXkgd2lsbCBiZSB1c2VkIHRvIHJlbW92ZSBwZW5kaW5nIGxlYXZpbmcgbm9kZXNcbiAgICAvLyBkdXJpbmcgZW50ZXJpbmcuXG4gICAgdmFyIGlkID0gXCJfX3RyYW5zaXRpb24tXCIgKyAodGhpcy5fdWlkKSArIFwiLVwiO1xuICAgIGNoaWxkLmtleSA9IGNoaWxkLmtleSA9PSBudWxsXG4gICAgICA/IGNoaWxkLmlzQ29tbWVudFxuICAgICAgICA/IGlkICsgJ2NvbW1lbnQnXG4gICAgICAgIDogaWQgKyBjaGlsZC50YWdcbiAgICAgIDogaXNQcmltaXRpdmUoY2hpbGQua2V5KVxuICAgICAgICA/IChTdHJpbmcoY2hpbGQua2V5KS5pbmRleE9mKGlkKSA9PT0gMCA/IGNoaWxkLmtleSA6IGlkICsgY2hpbGQua2V5KVxuICAgICAgICA6IGNoaWxkLmtleTtcblxuICAgIHZhciBkYXRhID0gKGNoaWxkLmRhdGEgfHwgKGNoaWxkLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7XG4gICAgdmFyIG9sZFJhd0NoaWxkID0gdGhpcy5fdm5vZGU7XG4gICAgdmFyIG9sZENoaWxkID0gZ2V0UmVhbENoaWxkKG9sZFJhd0NoaWxkKTtcblxuICAgIC8vIG1hcmsgdi1zaG93XG4gICAgLy8gc28gdGhhdCB0aGUgdHJhbnNpdGlvbiBtb2R1bGUgY2FuIGhhbmQgb3ZlciB0aGUgY29udHJvbCB0byB0aGUgZGlyZWN0aXZlXG4gICAgaWYgKGNoaWxkLmRhdGEuZGlyZWN0aXZlcyAmJiBjaGlsZC5kYXRhLmRpcmVjdGl2ZXMuc29tZShpc1ZTaG93RGlyZWN0aXZlKSkge1xuICAgICAgY2hpbGQuZGF0YS5zaG93ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvbGRDaGlsZCAmJlxuICAgICAgb2xkQ2hpbGQuZGF0YSAmJlxuICAgICAgIWlzU2FtZUNoaWxkKGNoaWxkLCBvbGRDaGlsZCkgJiZcbiAgICAgICFpc0FzeW5jUGxhY2Vob2xkZXIob2xkQ2hpbGQpICYmXG4gICAgICAvLyAjNjY4NyBjb21wb25lbnQgcm9vdCBpcyBhIGNvbW1lbnQgbm9kZVxuICAgICAgIShvbGRDaGlsZC5jb21wb25lbnRJbnN0YW5jZSAmJiBvbGRDaGlsZC5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUuaXNDb21tZW50KVxuICAgICkge1xuICAgICAgLy8gcmVwbGFjZSBvbGQgY2hpbGQgdHJhbnNpdGlvbiBkYXRhIHdpdGggZnJlc2ggb25lXG4gICAgICAvLyBpbXBvcnRhbnQgZm9yIGR5bmFtaWMgdHJhbnNpdGlvbnMhXG4gICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkLmRhdGEudHJhbnNpdGlvbiA9IGV4dGVuZCh7fSwgZGF0YSk7XG4gICAgICAvLyBoYW5kbGUgdHJhbnNpdGlvbiBtb2RlXG4gICAgICBpZiAobW9kZSA9PT0gJ291dC1pbicpIHtcbiAgICAgICAgLy8gcmV0dXJuIHBsYWNlaG9sZGVyIG5vZGUgYW5kIHF1ZXVlIHVwZGF0ZSB3aGVuIGxlYXZlIGZpbmlzaGVzXG4gICAgICAgIHRoaXMuX2xlYXZpbmcgPSB0cnVlO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhvbGREYXRhLCAnYWZ0ZXJMZWF2ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzJDEuX2xlYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzJDEuJGZvcmNlVXBkYXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpXG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdpbi1vdXQnKSB7XG4gICAgICAgIGlmIChpc0FzeW5jUGxhY2Vob2xkZXIoY2hpbGQpKSB7XG4gICAgICAgICAgcmV0dXJuIG9sZFJhd0NoaWxkXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgdmFyIHBlcmZvcm1MZWF2ZSA9IGZ1bmN0aW9uICgpIHsgZGVsYXllZExlYXZlKCk7IH07XG4gICAgICAgIG1lcmdlVk5vZGVIb29rKGRhdGEsICdhZnRlckVudGVyJywgcGVyZm9ybUxlYXZlKTtcbiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2VudGVyQ2FuY2VsbGVkJywgcGVyZm9ybUxlYXZlKTtcbiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2RlbGF5TGVhdmUnLCBmdW5jdGlvbiAobGVhdmUpIHsgZGVsYXllZExlYXZlID0gbGVhdmU7IH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByYXdDaGlsZFxuICB9XG59O1xuXG4vKiAgKi9cblxudmFyIHByb3BzID0gZXh0ZW5kKHtcbiAgdGFnOiBTdHJpbmcsXG4gIG1vdmVDbGFzczogU3RyaW5nXG59LCB0cmFuc2l0aW9uUHJvcHMpO1xuXG5kZWxldGUgcHJvcHMubW9kZTtcblxudmFyIFRyYW5zaXRpb25Hcm91cCA9IHtcbiAgcHJvcHM6IHByb3BzLFxuXG4gIGJlZm9yZU1vdW50OiBmdW5jdGlvbiBiZWZvcmVNb3VudCAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgdXBkYXRlID0gdGhpcy5fdXBkYXRlO1xuICAgIHRoaXMuX3VwZGF0ZSA9IGZ1bmN0aW9uICh2bm9kZSwgaHlkcmF0aW5nKSB7XG4gICAgICB2YXIgcmVzdG9yZUFjdGl2ZUluc3RhbmNlID0gc2V0QWN0aXZlSW5zdGFuY2UodGhpcyQxKTtcbiAgICAgIC8vIGZvcmNlIHJlbW92aW5nIHBhc3NcbiAgICAgIHRoaXMkMS5fX3BhdGNoX18oXG4gICAgICAgIHRoaXMkMS5fdm5vZGUsXG4gICAgICAgIHRoaXMkMS5rZXB0LFxuICAgICAgICBmYWxzZSwgLy8gaHlkcmF0aW5nXG4gICAgICAgIHRydWUgLy8gcmVtb3ZlT25seSAoIWltcG9ydGFudCwgYXZvaWRzIHVubmVjZXNzYXJ5IG1vdmVzKVxuICAgICAgKTtcbiAgICAgIHRoaXMkMS5fdm5vZGUgPSB0aGlzJDEua2VwdDtcbiAgICAgIHJlc3RvcmVBY3RpdmVJbnN0YW5jZSgpO1xuICAgICAgdXBkYXRlLmNhbGwodGhpcyQxLCB2bm9kZSwgaHlkcmF0aW5nKTtcbiAgICB9O1xuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyIChoKSB7XG4gICAgdmFyIHRhZyA9IHRoaXMudGFnIHx8IHRoaXMuJHZub2RlLmRhdGEudGFnIHx8ICdzcGFuJztcbiAgICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB2YXIgcHJldkNoaWxkcmVuID0gdGhpcy5wcmV2Q2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuICAgIHZhciByYXdDaGlsZHJlbiA9IHRoaXMuJHNsb3RzLmRlZmF1bHQgfHwgW107XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIHZhciB0cmFuc2l0aW9uRGF0YSA9IGV4dHJhY3RUcmFuc2l0aW9uRGF0YSh0aGlzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gcmF3Q2hpbGRyZW5baV07XG4gICAgICBpZiAoYy50YWcpIHtcbiAgICAgICAgaWYgKGMua2V5ICE9IG51bGwgJiYgU3RyaW5nKGMua2V5KS5pbmRleE9mKCdfX3ZsaXN0JykgIT09IDApIHtcbiAgICAgICAgICBjaGlsZHJlbi5wdXNoKGMpO1xuICAgICAgICAgIG1hcFtjLmtleV0gPSBjXG4gICAgICAgICAgOyhjLmRhdGEgfHwgKGMuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25EYXRhO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB2YXIgb3B0cyA9IGMuY29tcG9uZW50T3B0aW9ucztcbiAgICAgICAgICB2YXIgbmFtZSA9IG9wdHMgPyAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZyB8fCAnJykgOiBjLnRhZztcbiAgICAgICAgICB3YXJuKChcIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8XCIgKyBuYW1lICsgXCI+XCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHZhciBrZXB0ID0gW107XG4gICAgICB2YXIgcmVtb3ZlZCA9IFtdO1xuICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgcHJldkNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHtcbiAgICAgICAgdmFyIGMkMSA9IHByZXZDaGlsZHJlbltpJDFdO1xuICAgICAgICBjJDEuZGF0YS50cmFuc2l0aW9uID0gdHJhbnNpdGlvbkRhdGE7XG4gICAgICAgIGMkMS5kYXRhLnBvcyA9IGMkMS5lbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmIChtYXBbYyQxLmtleV0pIHtcbiAgICAgICAgICBrZXB0LnB1c2goYyQxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW1vdmVkLnB1c2goYyQxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5rZXB0ID0gaCh0YWcsIG51bGwsIGtlcHQpO1xuICAgICAgdGhpcy5yZW1vdmVkID0gcmVtb3ZlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gaCh0YWcsIG51bGwsIGNoaWxkcmVuKVxuICB9LFxuXG4gIHVwZGF0ZWQ6IGZ1bmN0aW9uIHVwZGF0ZWQgKCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucHJldkNoaWxkcmVuO1xuICAgIHZhciBtb3ZlQ2xhc3MgPSB0aGlzLm1vdmVDbGFzcyB8fCAoKHRoaXMubmFtZSB8fCAndicpICsgJy1tb3ZlJyk7XG4gICAgaWYgKCFjaGlsZHJlbi5sZW5ndGggfHwgIXRoaXMuaGFzTW92ZShjaGlsZHJlblswXS5lbG0sIG1vdmVDbGFzcykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHdlIGRpdmlkZSB0aGUgd29yayBpbnRvIHRocmVlIGxvb3BzIHRvIGF2b2lkIG1peGluZyBET00gcmVhZHMgYW5kIHdyaXRlc1xuICAgIC8vIGluIGVhY2ggaXRlcmF0aW9uIC0gd2hpY2ggaGVscHMgcHJldmVudCBsYXlvdXQgdGhyYXNoaW5nLlxuICAgIGNoaWxkcmVuLmZvckVhY2goY2FsbFBlbmRpbmdDYnMpO1xuICAgIGNoaWxkcmVuLmZvckVhY2gocmVjb3JkUG9zaXRpb24pO1xuICAgIGNoaWxkcmVuLmZvckVhY2goYXBwbHlUcmFuc2xhdGlvbik7XG5cbiAgICAvLyBmb3JjZSByZWZsb3cgdG8gcHV0IGV2ZXJ5dGhpbmcgaW4gcG9zaXRpb25cbiAgICAvLyBhc3NpZ24gdG8gdGhpcyB0byBhdm9pZCBiZWluZyByZW1vdmVkIGluIHRyZWUtc2hha2luZ1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHRoaXMuX3JlZmxvdyA9IGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0O1xuXG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgaWYgKGMuZGF0YS5tb3ZlZCkge1xuICAgICAgICB2YXIgZWwgPSBjLmVsbTtcbiAgICAgICAgdmFyIHMgPSBlbC5zdHlsZTtcbiAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnJztcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kRXZlbnQsIGVsLl9tb3ZlQ2IgPSBmdW5jdGlvbiBjYiAoZSkge1xuICAgICAgICAgIGlmIChlICYmIGUudGFyZ2V0ICE9PSBlbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZSB8fCAvdHJhbnNmb3JtJC8udGVzdChlLnByb3BlcnR5TmFtZSkpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbkVuZEV2ZW50LCBjYik7XG4gICAgICAgICAgICBlbC5fbW92ZUNiID0gbnVsbDtcbiAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYXNNb3ZlOiBmdW5jdGlvbiBoYXNNb3ZlIChlbCwgbW92ZUNsYXNzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghaGFzVHJhbnNpdGlvbikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHRoaXMuX2hhc01vdmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc01vdmVcbiAgICAgIH1cbiAgICAgIC8vIERldGVjdCB3aGV0aGVyIGFuIGVsZW1lbnQgd2l0aCB0aGUgbW92ZSBjbGFzcyBhcHBsaWVkIGhhc1xuICAgICAgLy8gQ1NTIHRyYW5zaXRpb25zLiBTaW5jZSB0aGUgZWxlbWVudCBtYXkgYmUgaW5zaWRlIGFuIGVudGVyaW5nXG4gICAgICAvLyB0cmFuc2l0aW9uIGF0IHRoaXMgdmVyeSBtb21lbnQsIHdlIG1ha2UgYSBjbG9uZSBvZiBpdCBhbmQgcmVtb3ZlXG4gICAgICAvLyBhbGwgb3RoZXIgdHJhbnNpdGlvbiBjbGFzc2VzIGFwcGxpZWQgdG8gZW5zdXJlIG9ubHkgdGhlIG1vdmUgY2xhc3NcbiAgICAgIC8vIGlzIGFwcGxpZWQuXG4gICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTtcbiAgICAgIGlmIChlbC5fdHJhbnNpdGlvbkNsYXNzZXMpIHtcbiAgICAgICAgZWwuX3RyYW5zaXRpb25DbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGNscykgeyByZW1vdmVDbGFzcyhjbG9uZSwgY2xzKTsgfSk7XG4gICAgICB9XG4gICAgICBhZGRDbGFzcyhjbG9uZSwgbW92ZUNsYXNzKTtcbiAgICAgIGNsb25lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB0aGlzLiRlbC5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgICB2YXIgaW5mbyA9IGdldFRyYW5zaXRpb25JbmZvKGNsb25lKTtcbiAgICAgIHRoaXMuJGVsLnJlbW92ZUNoaWxkKGNsb25lKTtcbiAgICAgIHJldHVybiAodGhpcy5faGFzTW92ZSA9IGluZm8uaGFzVHJhbnNmb3JtKVxuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMgKGMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChjLmVsbS5fbW92ZUNiKSB7XG4gICAgYy5lbG0uX21vdmVDYigpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoYy5lbG0uX2VudGVyQ2IpIHtcbiAgICBjLmVsbS5fZW50ZXJDYigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZFBvc2l0aW9uIChjKSB7XG4gIGMuZGF0YS5uZXdQb3MgPSBjLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbiAoYykge1xuICB2YXIgb2xkUG9zID0gYy5kYXRhLnBvcztcbiAgdmFyIG5ld1BvcyA9IGMuZGF0YS5uZXdQb3M7XG4gIHZhciBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7XG4gIHZhciBkeSA9IG9sZFBvcy50b3AgLSBuZXdQb3MudG9wO1xuICBpZiAoZHggfHwgZHkpIHtcbiAgICBjLmRhdGEubW92ZWQgPSB0cnVlO1xuICAgIHZhciBzID0gYy5lbG0uc3R5bGU7XG4gICAgcy50cmFuc2Zvcm0gPSBzLldlYmtpdFRyYW5zZm9ybSA9IFwidHJhbnNsYXRlKFwiICsgZHggKyBcInB4LFwiICsgZHkgKyBcInB4KVwiO1xuICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzJztcbiAgfVxufVxuXG52YXIgcGxhdGZvcm1Db21wb25lbnRzID0ge1xuICBUcmFuc2l0aW9uOiBUcmFuc2l0aW9uLFxuICBUcmFuc2l0aW9uR3JvdXA6IFRyYW5zaXRpb25Hcm91cFxufTtcblxuLyogICovXG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMgdXRpbHNcblZ1ZS5jb25maWcubXVzdFVzZVByb3AgPSBtdXN0VXNlUHJvcDtcblZ1ZS5jb25maWcuaXNSZXNlcnZlZFRhZyA9IGlzUmVzZXJ2ZWRUYWc7XG5WdWUuY29uZmlnLmlzUmVzZXJ2ZWRBdHRyID0gaXNSZXNlcnZlZEF0dHI7XG5WdWUuY29uZmlnLmdldFRhZ05hbWVzcGFjZSA9IGdldFRhZ05hbWVzcGFjZTtcblZ1ZS5jb25maWcuaXNVbmtub3duRWxlbWVudCA9IGlzVW5rbm93bkVsZW1lbnQ7XG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gcnVudGltZSBkaXJlY3RpdmVzICYgY29tcG9uZW50c1xuZXh0ZW5kKFZ1ZS5vcHRpb25zLmRpcmVjdGl2ZXMsIHBsYXRmb3JtRGlyZWN0aXZlcyk7XG5leHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgcGxhdGZvcm1Db21wb25lbnRzKTtcblxuLy8gaW5zdGFsbCBwbGF0Zm9ybSBwYXRjaCBmdW5jdGlvblxuVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gPSBpbkJyb3dzZXIgPyBwYXRjaCA6IG5vb3A7XG5cbi8vIHB1YmxpYyBtb3VudCBtZXRob2RcblZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKFxuICBlbCxcbiAgaHlkcmF0aW5nXG4pIHtcbiAgZWwgPSBlbCAmJiBpbkJyb3dzZXIgPyBxdWVyeShlbCkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBtb3VudENvbXBvbmVudCh0aGlzLCBlbCwgaHlkcmF0aW5nKVxufTtcblxuLy8gZGV2dG9vbHMgZ2xvYmFsIGhvb2tcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5pZiAoaW5Ccm93c2VyKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGlmIChjb25maWcuZGV2dG9vbHMpIHtcbiAgICAgIGlmIChkZXZ0b29scykge1xuICAgICAgICBkZXZ0b29scy5lbWl0KCdpbml0JywgVnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0J1xuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGVbY29uc29sZS5pbmZvID8gJ2luZm8nIDogJ2xvZyddKFxuICAgICAgICAgICdEb3dubG9hZCB0aGUgVnVlIERldnRvb2xzIGV4dGVuc2lvbiBmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZTpcXG4nICtcbiAgICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1kZXZ0b29scydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiZcbiAgICAgIGNvbmZpZy5wcm9kdWN0aW9uVGlwICE9PSBmYWxzZSAmJlxuICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnXG4gICAgKSB7XG4gICAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/ICdpbmZvJyA6ICdsb2cnXShcbiAgICAgICAgXCJZb3UgYXJlIHJ1bm5pbmcgVnVlIGluIGRldmVsb3BtZW50IG1vZGUuXFxuXCIgK1xuICAgICAgICBcIk1ha2Ugc3VyZSB0byB0dXJuIG9uIHByb2R1Y3Rpb24gbW9kZSB3aGVuIGRlcGxveWluZyBmb3IgcHJvZHVjdGlvbi5cXG5cIiArXG4gICAgICAgIFwiU2VlIG1vcmUgdGlwcyBhdCBodHRwczovL3Z1ZWpzLm9yZy9ndWlkZS9kZXBsb3ltZW50Lmh0bWxcIlxuICAgICAgKTtcbiAgICB9XG4gIH0sIDApO1xufVxuXG4vKiAgKi9cblxuZXhwb3J0IGRlZmF1bHQgVnVlO1xuIiwidmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIFtcbiAgICAgIF9jKFwiZmxleC1maWx0ZXItYmFyXCIsIHsgYXR0cnM6IHsgc3RvcmU6IF92bS5zdG9yZSB9IH0pLFxuICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgIF9jKFwiZmxleC1jb250ZW50LWxvYWRlclwiLCB7XG4gICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICB2YWx1ZTogX3ZtLmxvYWRpbmcsXG4gICAgICAgICAgICBleHByZXNzaW9uOiBcImxvYWRpbmdcIlxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IHsgc3RvcmU6IF92bS5zdG9yZSB9XG4gICAgICB9KSxcbiAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICBfYyhcImZsZXgtdGFibGVcIiwge1xuICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgdmFsdWU6ICFfdm0ubG9hZGluZyxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IFwiIWxvYWRpbmdcIlxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IHsgc3RvcmU6IF92bS5zdG9yZSB9LFxuICAgICAgICBtb2RlbDoge1xuICAgICAgICAgIHZhbHVlOiBfdm0ubG9hZGluZyxcbiAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oJCR2KSB7XG4gICAgICAgICAgICBfdm0ubG9hZGluZyA9ICQkdlxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXhwcmVzc2lvbjogXCJsb2FkaW5nXCJcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICBdLFxuICAgIDFcbiAgKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSIsInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICBbXG4gICAgICBfYyhcInZ1ZXRhYmxlXCIsIHtcbiAgICAgICAgcmVmOiBcInZ1ZXRhYmxlXCIsXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgY3NzOiBfdm0uY3NzLnRhYmxlLFxuICAgICAgICAgIGZpZWxkczogX3ZtLnN0b3JlLmZpZWxkcyB8fCBbXSxcbiAgICAgICAgICBzZWFyY2hGaWVsZHM6IF92bS5zdG9yZS5zZWFyY2hGaWVsZHMgfHwgW10sXG4gICAgICAgICAgc29ydE9yZGVyOiBfdm0uc3RvcmUuc29ydE9yZGVyLFxuICAgICAgICAgIFwibXVsdGktc29ydFwiOiB0cnVlLFxuICAgICAgICAgIFwiYXBpLW1vZGVcIjogdHJ1ZSxcbiAgICAgICAgICBcImFwaS11cmxcIjogX3ZtLnN0b3JlLmFwaSxcbiAgICAgICAgICBcInBlci1wYWdlXCI6IF92bS5wZXJQYWdlLFxuICAgICAgICAgIFwiYXBwZW5kLXBhcmFtc1wiOiBfdm0uZXh0cmFQYXJhbXMsXG4gICAgICAgICAgXCJwYWdpbmF0aW9uLXBhdGhcIjogXCJsaW5rcy5wYWdpbmF0aW9uXCIsXG4gICAgICAgICAgXCJzaG93LXNvcnQtaWNvbnNcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBvbjoge1xuICAgICAgICAgIFwidnVldGFibGU6cGFnaW5hdGlvbi1kYXRhXCI6IF92bS5vblBhZ2luYXRpb25EYXRhLFxuICAgICAgICAgIFwidnVldGFibGU6bG9hZGluZ1wiOiBfdm0ub25WdWV0YWJsZUxvYWRpbmcsXG4gICAgICAgICAgXCJ2dWV0YWJsZTpsb2FkLXN1Y2Nlc3NcIjogX3ZtLm9uVnVlVGFibGVMb2FkU3VjY2Vzc1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgeyBzdGF0aWNDbGFzczogXCJmbGV4LWxpc3QtcGFnaW5hdGlvblwiIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfYyhcInZ1ZXRhYmxlLXBhZ2luYXRpb24taW5mb1wiLCB7XG4gICAgICAgICAgICByZWY6IFwicGFnaW5hdGlvbkluZm9cIixcbiAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgIFwiaW5mby10ZW1wbGF0ZVwiOiBfdm0uc3RvcmUucGFnaW5hdGlvbkluZm8sXG4gICAgICAgICAgICAgIFwiaW5mby1uby1kYXRhLXRlbXBsYXRlXCI6IF92bS5zdG9yZS5lbXB0eVJlc3VsdCxcbiAgICAgICAgICAgICAgY3NzOiBfdm0uY3NzLnBhZ2luYXRpb25JbmZvXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICBfYyhcInZ1ZXRhYmxlLXBhZ2luYXRpb25cIiwge1xuICAgICAgICAgICAgcmVmOiBcInBhZ2luYXRpb25cIixcbiAgICAgICAgICAgIGF0dHJzOiB7IGNzczogX3ZtLmNzcy5wYWdpbmF0aW9uIH0sXG4gICAgICAgICAgICBvbjogeyBcInZ1ZXRhYmxlLXBhZ2luYXRpb246Y2hhbmdlLXBhZ2VcIjogX3ZtLm9uQ2hhbmdlUGFnZSB9XG4gICAgICAgICAgfSlcbiAgICAgICAgXSxcbiAgICAgICAgMVxuICAgICAgKVxuICAgIF0sXG4gICAgMVxuICApXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cbnJlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5leHBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IiwidmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfdm0uaXNGaXhlZEhlYWRlclxuICAgID8gX2MoXCJkaXZcIiwgW1xuICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInZ1ZXRhYmxlLWhlYWQtd3JhcHBlclwiIH0sIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwidGFibGVcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xhc3M6IFtcInZ1ZXRhYmxlXCIsIF92bS5jc3MudGFibGVDbGFzcywgX3ZtLmNzcy50YWJsZUhlYWRlckNsYXNzXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXCJ0aGVhZFwiLCBbXG4gICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICBcInRyXCIsXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0udGFibGVGaWVsZHMsIGZ1bmN0aW9uKGZpZWxkLCBmaWVsZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uaXNTcGVjaWFsRmllbGQoZmllbGQubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gXCJfX2NoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBmaWVsZEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidnVldGFibGUtdGgtY2hlY2tib3gtXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnRyYWNrQnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudGl0bGVDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeyB3aWR0aDogZmllbGQud2lkdGggfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJpbnB1dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgdHlwZTogXCJjaGVja2JveFwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IF92bS5jaGVja0NoZWNrYm94ZXNTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0udG9nZ2xlQWxsQ2hlY2tib3hlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gXCJfX2NvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJ0aFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZ1ZXRhYmxlLXRoLWNvbXBvbmVudC1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnRyYWNrQnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnRpdGxlQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zb3J0Q2xhc3MoZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHNvcnRhYmxlOiBfdm0uaXNTb3J0YWJsZShmaWVsZCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IHdpZHRoOiBmaWVsZC53aWR0aCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBfdm0uX3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnJlbmRlclRpdGxlKGZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub3JkZXJCeShmaWVsZCwgJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gXCJfX3Nsb3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwidGhcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBmaWVsZEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2dWV0YWJsZS10aC1zbG90LVwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZXh0cmFjdEFyZ3MoZmllbGQubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnRpdGxlQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zb3J0Q2xhc3MoZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHNvcnRhYmxlOiBfdm0uaXNTb3J0YWJsZShmaWVsZCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IHdpZHRoOiBmaWVsZC53aWR0aCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBfdm0uX3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnJlbmRlclRpdGxlKGZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub3JkZXJCeShmaWVsZCwgJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gXCJfX3NlcXVlbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcInRoXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmllbGRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidnVldGFibGUtdGgtc2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudGl0bGVDbGFzcyB8fCBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsgd2lkdGg6IGZpZWxkLndpZHRoIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IF92bS5fcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0ucmVuZGVyVGl0bGUoZmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5ub3RJbihfdm0uZXh0cmFjdE5hbWUoZmllbGQubmFtZSksIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJfX3NlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiX19jaGVja2JveFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIl9fY29tcG9uZW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiX19zbG90XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJ0aFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZ1ZXRhYmxlLXRoLVwiICsgZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudGl0bGVDbGFzcyB8fCBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsgd2lkdGg6IGZpZWxkLndpZHRoIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IF92bS5fcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0ucmVuZGVyVGl0bGUoZmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFwidGhcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2dWV0YWJsZS10aC1cIiArIGZpZWxkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudGl0bGVDbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uc29ydENsYXNzKGZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHNvcnRhYmxlOiBfdm0uaXNTb3J0YWJsZShmaWVsZCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeyB3aWR0aDogZmllbGQud2lkdGggfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgaWQ6IFwiX1wiICsgZmllbGQubmFtZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVySFRNTDogX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnJlbmRlclRpdGxlKGZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9yZGVyQnkoZmllbGQsICRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgIF92bS5zY3JvbGxWaXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgPyBfYyhcInRoXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwidnVldGFibGUtZ3V0dGVyLWNvbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeyB3aWR0aDogX3ZtLnNjcm9sbEJhcldpZHRoIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKVxuICAgICAgICBdKSxcbiAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ2dWV0YWJsZS1ib2R5LXdyYXBwZXJcIixcbiAgICAgICAgICAgIHN0eWxlOiB7IGhlaWdodDogX3ZtLnRhYmxlSGVpZ2h0IH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICBcInRhYmxlXCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjbGFzczogW1widnVldGFibGVcIiwgX3ZtLmNzcy50YWJsZUNsYXNzLCBfdm0uY3NzLnRhYmxlQm9keUNsYXNzXVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICBcImNvbGdyb3VwXCIsXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0udGFibGVGaWVsZHMsIGZ1bmN0aW9uKGZpZWxkLCBmaWVsZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcImNvbFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmllbGRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZ1ZXRhYmxlLXRoLVwiICsgZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50aXRsZUNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IHdpZHRoOiBmaWVsZC53aWR0aCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyBpZDogXCJfY29sX1wiICsgZmllbGQubmFtZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgXCJ0Ym9keVwiLFxuICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJ2dWV0YWJsZS1ib2R5XCIgfSxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9sKF92bS50YWJsZURhdGEsIGZ1bmN0aW9uKGl0ZW0sIGl0ZW1JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0clwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBpdGVtSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IF92bS5vblJvd0NsYXNzKGl0ZW0sIGl0ZW1JbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaXRlbS1pbmRleFwiOiBpdGVtSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXI6IF92bS5vblJvd0NoYW5nZWQoaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub25Sb3dDbGlja2VkKGl0ZW0sICRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmxjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub25Sb3dEb3VibGVDbGlja2VkKGl0ZW0sICRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2woX3ZtLnRhYmxlRmllbGRzLCBmdW5jdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uaXNTcGVjaWFsRmllbGQoZmllbGQubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiX19zZXF1ZW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcInRkXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBmaWVsZEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidnVldGFibGUtc2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5kYXRhQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IF92bS5fcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5yZW5kZXJTZXF1ZW5jZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5leHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIl9faGFuZGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwidGRcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2dWV0YWJsZS1oYW5kbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5kYXRhQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IF92bS5fcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5yZW5kZXJJY29uVGFnKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoYW5kbGUtaWNvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uY3NzLmhhbmRsZUljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5leHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIl9fY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmllbGRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2dWV0YWJsZS1jaGVja2JveGVzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5kYXRhQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcImlucHV0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IF92bS5yb3dTZWxlY3RlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0udG9nZ2xlQ2hlY2tib3goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiX19jb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmllbGRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2dWV0YWJsZS1jb21wb25lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmRhdGFDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmV4dHJhY3RBcmdzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6IFwiY29tcG9uZW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyb3ctZGF0YVwiOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicm93LWluZGV4XCI6IGl0ZW1JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJvdy1maWVsZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc29ydEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiX19zbG90XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidnVldGFibGUtc2xvdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGF0YUNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl90KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmV4dHJhY3RBcmdzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YTogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGl0ZW1JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93RmllbGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc29ydEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcInRkXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IGZpZWxkLmRhdGFDbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBfdm0uX3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5yZW5kZXJOb3JtYWxGaWVsZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub25DZWxsQ2xpY2tlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJsY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uQ2VsbERvdWJsZUNsaWNrZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRtZW51OiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vbkNlbGxSaWdodENsaWNrZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0udXNlRGV0YWlsUm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHJhbnNpdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBpdGVtSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgbmFtZTogX3ZtLmRldGFpbFJvd1RyYW5zaXRpb24gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmlzVmlzaWJsZURldGFpbFJvdyhpdGVtW192bS50cmFja0J5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0clwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBbX3ZtLmNzcy5kZXRhaWxSb3dDbGFzc10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vbkRldGFpbFJvd0NsaWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzcGFuOiBfdm0uY291bnRWaXNpYmxlRmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoX3ZtLmRldGFpbFJvd0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiBcImNvbXBvbmVudFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyb3ctZGF0YVwiOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJvdy1pbmRleFwiOiBpdGVtSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgICBfdm0uZGlzcGxheUVtcHR5RGF0YVJvd1xuICAgICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcInRyXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcInRkXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInZ1ZXRhYmxlLWVtcHR5LXJlc3VsdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgY29sc3BhbjogX3ZtLmNvdW50VmlzaWJsZUZpZWxkcyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBfdm0uX3MoX3ZtLm5vRGF0YVRlbXBsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmxlc3NUaGFuTWluUm93c1xuICAgICAgICAgICAgICAgICAgICAgID8gX3ZtLl9sKF92bS5ibGFua1Jvd3MsIGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGtleTogaSwgc3RhdGljQ2xhc3M6IFwiYmxhbmstcm93XCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2woX3ZtLnRhYmxlRmllbGRzLCBmdW5jdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJ0ZFwiLCB7IGtleTogZmllbGRJbmRleCB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiwqBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKVxuICAgICAgICAgIF1cbiAgICAgICAgKVxuICAgICAgXSlcbiAgICA6IF9jKFwidGFibGVcIiwgeyBjbGFzczogW1widnVldGFibGVcIiwgX3ZtLmNzcy50YWJsZUNsYXNzXSB9LCBbXG4gICAgICAgIF9jKFwidGhlYWRcIiwgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJ0clwiLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfdm0uX2woX3ZtLnRhYmxlRmllbGRzLCBmdW5jdGlvbihmaWVsZCwgZmllbGRJbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICBmaWVsZC52aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmlzU3BlY2lhbEZpZWxkKGZpZWxkLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09IFwiX19jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmllbGRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZ1ZXRhYmxlLXRoLWNoZWNrYm94LVwiICsgX3ZtLnRyYWNrQnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudGl0bGVDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeyB3aWR0aDogZmllbGQud2lkdGggfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJpbnB1dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgdHlwZTogXCJjaGVja2JveFwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IF92bS5jaGVja0NoZWNrYm94ZXNTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0udG9nZ2xlQWxsQ2hlY2tib3hlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gXCJfX2NvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJ0aFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZ1ZXRhYmxlLXRoLWNvbXBvbmVudC1cIiArIF92bS50cmFja0J5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50aXRsZUNsYXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uc29ydENsYXNzKGZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzb3J0YWJsZTogX3ZtLmlzU29ydGFibGUoZmllbGQpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeyB3aWR0aDogZmllbGQud2lkdGggfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVySFRNTDogX3ZtLl9zKF92bS5yZW5kZXJUaXRsZShmaWVsZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub3JkZXJCeShmaWVsZCwgJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIiBcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gXCJfX3Nsb3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwidGhcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBmaWVsZEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2dWV0YWJsZS10aC1zbG90LVwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZXh0cmFjdEFyZ3MoZmllbGQubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnRpdGxlQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zb3J0Q2xhc3MoZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHNvcnRhYmxlOiBfdm0uaXNTb3J0YWJsZShmaWVsZCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IHdpZHRoOiBmaWVsZC53aWR0aCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBfdm0uX3MoX3ZtLnJlbmRlclRpdGxlKGZpZWxkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vcmRlckJ5KGZpZWxkLCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5leHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSBcIl9fc2VxdWVuY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwidGhcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBmaWVsZEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2dWV0YWJsZS10aC1zZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50aXRsZUNsYXNzIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zb3J0Q2xhc3MoZmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsgd2lkdGg6IGZpZWxkLndpZHRoIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IF92bS5fcyhfdm0ucmVuZGVyVGl0bGUoZmllbGQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLm5vdEluKF92bS5leHRyYWN0TmFtZShmaWVsZC5uYW1lKSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIl9fc2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJfX2NoZWNrYm94XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiX19jb21wb25lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJfX3Nsb3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcInRoXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmllbGRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidnVldGFibGUtdGgtXCIgKyBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50aXRsZUNsYXNzIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zb3J0Q2xhc3MoZmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsgd2lkdGg6IGZpZWxkLndpZHRoIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IF92bS5fcyhfdm0ucmVuZGVyVGl0bGUoZmllbGQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJ0aFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmllbGRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZ1ZXRhYmxlLXRoLVwiICsgZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50aXRsZUNsYXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zb3J0Q2xhc3MoZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgc29ydGFibGU6IF92bS5pc1NvcnRhYmxlKGZpZWxkKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IHdpZHRoOiBmaWVsZC53aWR0aCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyBpZDogXCJfXCIgKyBmaWVsZC5uYW1lIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBfdm0uX3MoX3ZtLnJlbmRlclRpdGxlKGZpZWxkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9yZGVyQnkoZmllbGQsICRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICBdKSxcbiAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJ0Ym9keVwiLFxuICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwidnVldGFibGUtYm9keVwiIH0sXG4gICAgICAgICAgW1xuICAgICAgICAgICAgX3ZtLl9sKF92bS50YWJsZURhdGEsIGZ1bmN0aW9uKGl0ZW0sIGl0ZW1JbmRleCkge1xuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgXCJ0clwiLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGl0ZW1JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IF92bS5vblJvd0NsYXNzKGl0ZW0sIGl0ZW1JbmRleCksXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgXCJpdGVtLWluZGV4XCI6IGl0ZW1JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXI6IF92bS5vblJvd0NoYW5nZWQoaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBkYmxjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uUm93RG91YmxlQ2xpY2tlZChpdGVtLCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uUm93Q2xpY2tlZChpdGVtLCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBfdm0uX2woX3ZtLnRhYmxlRmllbGRzLCBmdW5jdGlvbihmaWVsZCwgZmllbGRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC52aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmlzU3BlY2lhbEZpZWxkKGZpZWxkLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09IFwiX19zZXF1ZW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJ0ZFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZ1ZXRhYmxlLXNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmRhdGFDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVySFRNTDogX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5yZW5kZXJTZXF1ZW5jZShpdGVtSW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5leHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSBcIl9faGFuZGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcInRkXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmllbGRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidnVldGFibGUtaGFuZGxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmRhdGFDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVySFRNTDogX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5yZW5kZXJJY29uVGFnKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaGFuZGxlLWljb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5jc3MuaGFuZGxlSWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5leHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSBcIl9fY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0ZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2dWV0YWJsZS1jaGVja2JveGVzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGF0YUNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFwiaW5wdXRcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHR5cGU6IFwiY2hlY2tib3hcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiBfdm0ucm93U2VsZWN0ZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvZ2dsZUNoZWNrYm94KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJfX2NvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmllbGRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZ1ZXRhYmxlLWNvbXBvbmVudFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmRhdGFDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhfdm0uZXh0cmFjdEFyZ3MoZmllbGQubmFtZSksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6IFwiY29tcG9uZW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicm93LWRhdGFcIjogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicm93LWluZGV4XCI6IGl0ZW1JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicm93LWZpZWxkXCI6IGZpZWxkLnNvcnRGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5leHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PT0gXCJfX3Nsb3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0ZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2dWV0YWJsZS1zbG90XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGF0YUNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZXh0cmFjdEFyZ3MoZmllbGQubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGl0ZW1JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0ZpZWxkOiBmaWVsZC5zb3J0RmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYXNDYWxsYmFjayhmaWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcInRkXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmllbGRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBmaWVsZC5kYXRhQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IF92bS5fcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uY2FsbENhbGxiYWNrKGZpZWxkLCBpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub25DZWxsQ2xpY2tlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJsY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub25DZWxsRG91YmxlQ2xpY2tlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dG1lbnU6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub25DZWxsUmlnaHRDbGlja2VkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfYyhcInRkXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmllbGRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBmaWVsZC5kYXRhQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IF92bS5fcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZ2V0T2JqZWN0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vbkNlbGxDbGlja2VkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmxjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vbkNlbGxEb3VibGVDbGlja2VkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0bWVudTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vbkNlbGxSaWdodENsaWNrZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgICBfdm0udXNlRGV0YWlsUm93XG4gICAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHJhbnNpdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGl0ZW1JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgbmFtZTogX3ZtLmRldGFpbFJvd1RyYW5zaXRpb24gfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmlzVmlzaWJsZURldGFpbFJvdyhpdGVtW192bS50cmFja0J5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogW192bS5jc3MuZGV0YWlsUm93Q2xhc3NdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub25EZXRhaWxSb3dDbGljayhpdGVtLCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IGNvbHNwYW46IF92bS5jb3VudFZpc2libGVGaWVsZHMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoX3ZtLmRldGFpbFJvd0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogXCJjb21wb25lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyb3ctZGF0YVwiOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyb3ctaW5kZXhcIjogaXRlbUluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgIF92bS5kaXNwbGF5RW1wdHlEYXRhUm93XG4gICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgX2MoXCJ0clwiLCBbXG4gICAgICAgICAgICAgICAgICAgIF9jKFwidGRcIiwge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInZ1ZXRhYmxlLWVtcHR5LXJlc3VsdFwiLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IGNvbHNwYW46IF92bS5jb3VudFZpc2libGVGaWVsZHMgfSxcbiAgICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczogeyBpbm5lckhUTUw6IF92bS5fcyhfdm0ubm9EYXRhVGVtcGxhdGUpIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgIF92bS5sZXNzVGhhbk1pblJvd3NcbiAgICAgICAgICAgICAgPyBfdm0uX2woX3ZtLmJsYW5rUm93cywgZnVuY3Rpb24oaSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICAgICAgICBcInRyXCIsXG4gICAgICAgICAgICAgICAgICAgIHsga2V5OiBpLCBzdGF0aWNDbGFzczogXCJibGFuay1yb3dcIiB9LFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLl9sKF92bS50YWJsZUZpZWxkcywgZnVuY3Rpb24oZmllbGQsIGZpZWxkSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwidGRcIiwgeyBrZXk6IGZpZWxkSW5kZXggfSwgW192bS5fdihcIsKgXCIpXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICBdLFxuICAgICAgICAgIDJcbiAgICAgICAgKVxuICAgICAgXSlcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iLCI8dGVtcGxhdGU+XHJcbjxkaXYgdi1pZj1cImlzRml4ZWRIZWFkZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwidnVldGFibGUtaGVhZC13cmFwcGVyXCI+XHJcbiAgICA8dGFibGUgOmNsYXNzPVwiWyd2dWV0YWJsZScsIGNzcy50YWJsZUNsYXNzLCBjc3MudGFibGVIZWFkZXJDbGFzc11cIj5cclxuICAgIDx0aGVhZD5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihmaWVsZCwgZmllbGRJbmRleCkgaW4gdGFibGVGaWVsZHNcIj5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiZmllbGQudmlzaWJsZVwiPlxyXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cImlzU3BlY2lhbEZpZWxkKGZpZWxkLm5hbWUpXCI+XHJcbiAgICAgICAgICAgICAgPHRoIHYtaWY9XCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSAnX19jaGVja2JveCdcIlxyXG4gICAgICAgICAgICAgICAgOmtleT1cImZpZWxkSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgOnN0eWxlPVwie3dpZHRoOiBmaWVsZC53aWR0aH1cIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiWyd2dWV0YWJsZS10aC1jaGVja2JveC0nK3RyYWNrQnksIGZpZWxkLnRpdGxlQ2xhc3NdXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgQGNoYW5nZT1cInRvZ2dsZUFsbENoZWNrYm94ZXMoZmllbGQubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIDpjaGVja2VkPVwiY2hlY2tDaGVja2JveGVzU3RhdGUoZmllbGQubmFtZSlcIj5cclxuICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgIDx0aCB2LWlmPVwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fY29tcG9uZW50J1wiXHJcbiAgICAgICAgICAgICAgICA6a2V5PVwiZmllbGRJbmRleFwiXHJcbiAgICAgICAgICAgICAgICA6c3R5bGU9XCJ7d2lkdGg6IGZpZWxkLndpZHRofVwiXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbJ3Z1ZXRhYmxlLXRoLWNvbXBvbmVudC0nK3RyYWNrQnksIGZpZWxkLnRpdGxlQ2xhc3MsIHNvcnRDbGFzcyhmaWVsZCksIHsnc29ydGFibGUnOiBpc1NvcnRhYmxlKGZpZWxkKX1dXCJcclxuICAgICAgICAgICAgICAgIHYtaHRtbD1cInJlbmRlclRpdGxlKGZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgICBAY2xpY2s9XCJvcmRlckJ5KGZpZWxkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICA+PC90aD5cclxuICAgICAgICAgICAgICA8dGggdi1pZj1cImV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09ICdfX3Nsb3QnXCJcclxuICAgICAgICAgICAgICAgIDprZXk9XCJmaWVsZEluZGV4XCJcclxuICAgICAgICAgICAgICAgIDpzdHlsZT1cInt3aWR0aDogZmllbGQud2lkdGh9XCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cIlsndnVldGFibGUtdGgtc2xvdC0nK2V4dHJhY3RBcmdzKGZpZWxkLm5hbWUpLCBmaWVsZC50aXRsZUNsYXNzLCBzb3J0Q2xhc3MoZmllbGQpLCB7J3NvcnRhYmxlJzogaXNTb3J0YWJsZShmaWVsZCl9XVwiXHJcbiAgICAgICAgICAgICAgICB2LWh0bWw9XCJyZW5kZXJUaXRsZShmaWVsZClcIlxyXG4gICAgICAgICAgICAgICAgQGNsaWNrPVwib3JkZXJCeShmaWVsZCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgPjwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoIHYtaWY9XCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSAnX19zZXF1ZW5jZSdcIlxyXG4gICAgICAgICAgICAgICAgOmtleT1cImZpZWxkSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgOnN0eWxlPVwie3dpZHRoOiBmaWVsZC53aWR0aH1cIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiWyd2dWV0YWJsZS10aC1zZXF1ZW5jZScsIGZpZWxkLnRpdGxlQ2xhc3MgfHwgJyddXCIgdi1odG1sPVwicmVuZGVyVGl0bGUoZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICA8dGggdi1pZj1cIm5vdEluKGV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpLCBbJ19fc2VxdWVuY2UnLCAnX19jaGVja2JveCcsICdfX2NvbXBvbmVudCcsICdfX3Nsb3QnXSlcIlxyXG4gICAgICAgICAgICAgICAgOmtleT1cImZpZWxkSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgOnN0eWxlPVwie3dpZHRoOiBmaWVsZC53aWR0aH1cIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiWyd2dWV0YWJsZS10aC0nK2ZpZWxkLm5hbWUsIGZpZWxkLnRpdGxlQ2xhc3MgfHwgJyddXCIgdi1odG1sPVwicmVuZGVyVGl0bGUoZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cclxuICAgICAgICAgICAgICA8dGggQGNsaWNrPVwib3JkZXJCeShmaWVsZCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICA6a2V5PVwiZmllbGRJbmRleFwiXHJcbiAgICAgICAgICAgICAgICA6aWQ9XCInXycgKyBmaWVsZC5uYW1lXCJcclxuICAgICAgICAgICAgICAgIDpzdHlsZT1cInt3aWR0aDogZmllbGQud2lkdGh9XCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cIlsndnVldGFibGUtdGgtJytmaWVsZC5uYW1lLCBmaWVsZC50aXRsZUNsYXNzLCBzb3J0Q2xhc3MoZmllbGQpLCB7J3NvcnRhYmxlJzogaXNTb3J0YWJsZShmaWVsZCl9XVwiXHJcbiAgICAgICAgICAgICAgICB2LWh0bWw9XCJyZW5kZXJUaXRsZShmaWVsZClcIlxyXG4gICAgICAgICAgICAgID48L3RoPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgIDx0aCB2LWlmPVwic2Nyb2xsVmlzaWJsZVwiIDpzdHlsZT1cInt3aWR0aDogc2Nyb2xsQmFyV2lkdGh9XCIgY2xhc3M9XCJ2dWV0YWJsZS1ndXR0ZXItY29sXCI+PC90aD5cclxuICAgICAgPC90cj5cclxuICAgIDwvdGhlYWQ+XHJcbiAgICA8L3RhYmxlPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ2dWV0YWJsZS1ib2R5LXdyYXBwZXJcIiA6c3R5bGU9XCJ7aGVpZ2h0OiB0YWJsZUhlaWdodH1cIj5cclxuICAgIDx0YWJsZSA6Y2xhc3M9XCJbJ3Z1ZXRhYmxlJywgY3NzLnRhYmxlQ2xhc3MsIGNzcy50YWJsZUJvZHlDbGFzc11cIj5cclxuICAgICAgPGNvbGdyb3VwPlxyXG4gICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihmaWVsZCwgZmllbGRJbmRleCkgaW4gdGFibGVGaWVsZHNcIj5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiZmllbGQudmlzaWJsZVwiPlxyXG4gICAgICAgICAgICA8Y29sXHJcbiAgICAgICAgICAgICAgOmtleT1cImZpZWxkSW5kZXhcIlxyXG4gICAgICAgICAgICAgIDppZD1cIidfY29sXycgKyBmaWVsZC5uYW1lXCJcclxuICAgICAgICAgICAgICA6c3R5bGU9XCJ7d2lkdGg6IGZpZWxkLndpZHRofVwiXHJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiWyd2dWV0YWJsZS10aC0nK2ZpZWxkLm5hbWUsIGZpZWxkLnRpdGxlQ2xhc3NdXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPC9jb2xncm91cD5cclxuICAgICAgPHRib2R5IHYtY2xvYWsgY2xhc3M9XCJ2dWV0YWJsZS1ib2R5XCI+XHJcbiAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGl0ZW1JbmRleCkgaW4gdGFibGVEYXRhXCI+XHJcbiAgICAgICAgICA8dHIgXHJcbiAgICAgICAgICAgIDprZXk9XCJpdGVtSW5kZXhcIlxyXG4gICAgICAgICAgICA6aXRlbS1pbmRleD1cIml0ZW1JbmRleFwiIFxyXG4gICAgICAgICAgICA6cmVuZGVyPVwib25Sb3dDaGFuZ2VkKGl0ZW0pXCIgXHJcbiAgICAgICAgICAgIDpjbGFzcz1cIm9uUm93Q2xhc3MoaXRlbSwgaXRlbUluZGV4KVwiXHJcbiAgICAgICAgICAgIEBjbGljaz1cIm9uUm93Q2xpY2tlZChpdGVtLCAkZXZlbnQpXCIgXHJcbiAgICAgICAgICAgIEBkYmxjbGljaz1cIm9uUm93RG91YmxlQ2xpY2tlZChpdGVtLCAkZXZlbnQpXCIgXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihmaWVsZCwgZmllbGRJbmRleCkgaW4gdGFibGVGaWVsZHNcIj5cclxuICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cImZpZWxkLnZpc2libGVcIj5cclxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXNTcGVjaWFsRmllbGQoZmllbGQubmFtZSlcIj5cclxuICAgICAgICAgICAgICAgICAgPHRkIHYtaWY9XCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSAnX19zZXF1ZW5jZSdcIiBcclxuICAgICAgICAgICAgICAgICAgICA6a2V5PVwiZmllbGRJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwiWyd2dWV0YWJsZS1zZXF1ZW5jZScsIGZpZWxkLmRhdGFDbGFzc11cIlxyXG4gICAgICAgICAgICAgICAgICAgIHYtaHRtbD1cInJlbmRlclNlcXVlbmNlKGl0ZW1JbmRleClcIj5cclxuICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgPHRkIHYtaWY9XCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSAnX19oYW5kbGUnXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgOmtleT1cImZpZWxkSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIDpjbGFzcz1cIlsndnVldGFibGUtaGFuZGxlJywgZmllbGQuZGF0YUNsYXNzXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdi1odG1sPVwicmVuZGVySWNvblRhZyhbJ2hhbmRsZS1pY29uJywgY3NzLmhhbmRsZUljb25dKVwiXHJcbiAgICAgICAgICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8dGQgdi1pZj1cImV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09ICdfX2NoZWNrYm94J1wiIFxyXG4gICAgICAgICAgICAgICAgICAgIDprZXk9XCJmaWVsZEluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbJ3Z1ZXRhYmxlLWNoZWNrYm94ZXMnLCBmaWVsZC5kYXRhQ2xhc3NdXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGNoYW5nZT1cInRvZ2dsZUNoZWNrYm94KGl0ZW0sIGZpZWxkLm5hbWUsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOmNoZWNrZWQ9XCJyb3dTZWxlY3RlZChpdGVtLCBmaWVsZC5uYW1lKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8dGQgdi1pZj1cImV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09PSAnX19jb21wb25lbnQnXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgOmtleT1cImZpZWxkSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIDpjbGFzcz1cIlsndnVldGFibGUtY29tcG9uZW50JywgZmllbGQuZGF0YUNsYXNzXVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cImV4dHJhY3RBcmdzKGZpZWxkLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDpyb3ctZGF0YT1cIml0ZW1cIiA6cm93LWluZGV4PVwiaXRlbUluZGV4XCIgOnJvdy1maWVsZD1cImZpZWxkLnNvcnRGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvY29tcG9uZW50PlxyXG4gICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8dGQgdi1pZj1cImV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09PSAnX19zbG90J1wiIFxyXG4gICAgICAgICAgICAgICAgICAgIDprZXk9XCJmaWVsZEluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbJ3Z1ZXRhYmxlLXNsb3QnLCBmaWVsZC5kYXRhQ2xhc3NdXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzbG90IDpuYW1lPVwiZXh0cmFjdEFyZ3MoZmllbGQubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOnJvdy1kYXRhPVwiaXRlbVwiIDpyb3ctaW5kZXg9XCJpdGVtSW5kZXhcIiA6cm93LWZpZWxkPVwiZmllbGQuc29ydEZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9zbG90PlxyXG4gICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgICAgICAgICAgICAgIDx0ZCA6Y2xhc3M9XCJmaWVsZC5kYXRhQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIDprZXk9XCJmaWVsZEluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICB2LWh0bWw9XCJyZW5kZXJOb3JtYWxGaWVsZChmaWVsZCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIEBjbGljaz1cIm9uQ2VsbENsaWNrZWQoaXRlbSwgZmllbGQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIEBkYmxjbGljaz1cIm9uQ2VsbERvdWJsZUNsaWNrZWQoaXRlbSwgZmllbGQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIEBjb250ZXh0bWVudT1cIm9uQ2VsbFJpZ2h0Q2xpY2tlZChpdGVtLCBmaWVsZCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwidXNlRGV0YWlsUm93XCI+XHJcbiAgICAgICAgICAgIDx0cmFuc2l0aW9uIDpuYW1lPVwiZGV0YWlsUm93VHJhbnNpdGlvblwiIDprZXk9XCJpdGVtSW5kZXhcIj5cclxuICAgICAgICAgICAgICA8dHIgdi1pZj1cImlzVmlzaWJsZURldGFpbFJvdyhpdGVtW3RyYWNrQnldKVwiXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbY3NzLmRldGFpbFJvd0NsYXNzXVwiXHJcbiAgICAgICAgICAgICAgICBAY2xpY2s9XCJvbkRldGFpbFJvd0NsaWNrKGl0ZW0sICRldmVudClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDx0ZCA6Y29sc3Bhbj1cImNvdW50VmlzaWJsZUZpZWxkc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cImRldGFpbFJvd0NvbXBvbmVudFwiIDpyb3ctZGF0YT1cIml0ZW1cIiA6cm93LWluZGV4PVwiaXRlbUluZGV4XCI+PC9jb21wb25lbnQ+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdHJhbnNpdGlvbj5cclxuICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8dGVtcGxhdGUgdi1pZj1cImRpc3BsYXlFbXB0eURhdGFSb3dcIj5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRkIDpjb2xzcGFuPVwiY291bnRWaXNpYmxlRmllbGRzXCIgY2xhc3M9XCJ2dWV0YWJsZS1lbXB0eS1yZXN1bHRcIiB2LWh0bWw9XCJub0RhdGFUZW1wbGF0ZVwiPjwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJsZXNzVGhhbk1pblJvd3NcIj5cclxuICAgICAgICAgIDx0ciB2LWZvcj1cImkgaW4gYmxhbmtSb3dzXCIgY2xhc3M9XCJibGFuay1yb3dcIiA6a2V5PVwiaVwiPlxyXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoZmllbGQsIGZpZWxkSW5kZXgpIGluIHRhYmxlRmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgPHRkIHYtaWY9XCJmaWVsZC52aXNpYmxlXCIgOmtleT1cImZpZWxkSW5kZXhcIj4mbmJzcDs8L3RkPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8L3Rib2R5PlxyXG4gICAgPC90YWJsZT5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjx0YWJsZSB2LWVsc2UgOmNsYXNzPVwiWyd2dWV0YWJsZScsIGNzcy50YWJsZUNsYXNzXVwiPiA8IS0tIG5vIGZpeGVkIGhlYWRlciAtIHJlZ3VsYXIgdGFibGUgLS0+XHJcbiAgPHRoZWFkPlxyXG4gICAgPHRyPlxyXG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoZmllbGQsIGZpZWxkSW5kZXgpIGluIHRhYmxlRmllbGRzXCI+XHJcbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJmaWVsZC52aXNpYmxlXCI+XHJcbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cImlzU3BlY2lhbEZpZWxkKGZpZWxkLm5hbWUpXCI+XHJcbiAgICAgICAgICAgIDx0aCB2LWlmPVwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fY2hlY2tib3gnXCJcclxuICAgICAgICAgICAgICA6a2V5PVwiZmllbGRJbmRleFwiXHJcbiAgICAgICAgICAgICAgOnN0eWxlPVwie3dpZHRoOiBmaWVsZC53aWR0aH1cIlxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cIlsndnVldGFibGUtdGgtY2hlY2tib3gtJyt0cmFja0J5LCBmaWVsZC50aXRsZUNsYXNzXVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgQGNoYW5nZT1cInRvZ2dsZUFsbENoZWNrYm94ZXMoZmllbGQubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICA6Y2hlY2tlZD1cImNoZWNrQ2hlY2tib3hlc1N0YXRlKGZpZWxkLm5hbWUpXCI+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0aCB2LWlmPVwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fY29tcG9uZW50J1wiXHJcbiAgICAgICAgICAgICAgOmtleT1cImZpZWxkSW5kZXhcIlxyXG4gICAgICAgICAgICAgIDpzdHlsZT1cInt3aWR0aDogZmllbGQud2lkdGh9XCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCJbJ3Z1ZXRhYmxlLXRoLWNvbXBvbmVudC0nK3RyYWNrQnksIGZpZWxkLnRpdGxlQ2xhc3MsIHNvcnRDbGFzcyhmaWVsZCksIHsnc29ydGFibGUnOiBpc1NvcnRhYmxlKGZpZWxkKX1dXCJcclxuICAgICAgICAgICAgICB2LWh0bWw9XCJyZW5kZXJUaXRsZShmaWVsZClcIlxyXG4gICAgICAgICAgICAgIEBjbGljaz1cIm9yZGVyQnkoZmllbGQsICRldmVudClcIlxyXG4gICAgICAgICAgICA+PC90aD5cclxuICAgICAgICAgICAgPHRoIHYtaWY9XCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSAnX19zbG90J1wiXHJcbiAgICAgICAgICAgICAgOmtleT1cImZpZWxkSW5kZXhcIlxyXG4gICAgICAgICAgICAgIDpzdHlsZT1cInt3aWR0aDogZmllbGQud2lkdGh9XCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCJbJ3Z1ZXRhYmxlLXRoLXNsb3QtJytleHRyYWN0QXJncyhmaWVsZC5uYW1lKSwgZmllbGQudGl0bGVDbGFzcywgc29ydENsYXNzKGZpZWxkKSwgeydzb3J0YWJsZSc6IGlzU29ydGFibGUoZmllbGQpfV1cIlxyXG4gICAgICAgICAgICAgIHYtaHRtbD1cInJlbmRlclRpdGxlKGZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgQGNsaWNrPVwib3JkZXJCeShmaWVsZCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID48L3RoPlxyXG4gICAgICAgICAgICA8dGggdi1pZj1cImV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09ICdfX3NlcXVlbmNlJ1wiXHJcbiAgICAgICAgICAgICAgOmtleT1cImZpZWxkSW5kZXhcIlxyXG4gICAgICAgICAgICAgIDpzdHlsZT1cInt3aWR0aDogZmllbGQud2lkdGh9XCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCJbJ3Z1ZXRhYmxlLXRoLXNlcXVlbmNlJywgZmllbGQudGl0bGVDbGFzcyB8fCAnJywgc29ydENsYXNzKGZpZWxkKV1cIiB2LWh0bWw9XCJyZW5kZXJUaXRsZShmaWVsZClcIlxyXG4gICAgICAgICAgICA+PC90aD5cclxuICAgICAgICAgICAgPHRoIHYtaWY9XCJub3RJbihleHRyYWN0TmFtZShmaWVsZC5uYW1lKSwgWydfX3NlcXVlbmNlJywgJ19fY2hlY2tib3gnLCAnX19jb21wb25lbnQnLCAnX19zbG90J10pXCJcclxuICAgICAgICAgICAgICA6a2V5PVwiZmllbGRJbmRleFwiXHJcbiAgICAgICAgICAgICAgOnN0eWxlPVwie3dpZHRoOiBmaWVsZC53aWR0aH1cIlxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cIlsndnVldGFibGUtdGgtJytmaWVsZC5uYW1lLCBmaWVsZC50aXRsZUNsYXNzIHx8ICcnLCBzb3J0Q2xhc3MoZmllbGQpXVwiIHYtaHRtbD1cInJlbmRlclRpdGxlKGZpZWxkKVwiXHJcbiAgICAgICAgICAgID48L3RoPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgICAgICAgIDx0aCBAY2xpY2s9XCJvcmRlckJ5KGZpZWxkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICA6a2V5PVwiZmllbGRJbmRleFwiXHJcbiAgICAgICAgICAgICAgOmlkPVwiJ18nICsgZmllbGQubmFtZVwiXHJcbiAgICAgICAgICAgICAgOnN0eWxlPVwie3dpZHRoOiBmaWVsZC53aWR0aH1cIlxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cIlsndnVldGFibGUtdGgtJytmaWVsZC5uYW1lLCBmaWVsZC50aXRsZUNsYXNzLCBzb3J0Q2xhc3MoZmllbGQpLCAgeydzb3J0YWJsZSc6IGlzU29ydGFibGUoZmllbGQpfV1cIlxyXG4gICAgICAgICAgICAgIHYtaHRtbD1cInJlbmRlclRpdGxlKGZpZWxkKVwiXHJcbiAgICAgICAgICAgID48L3RoPlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC90cj5cclxuICA8L3RoZWFkPlxyXG4gIDx0Ym9keSB2LWNsb2FrIGNsYXNzPVwidnVldGFibGUtYm9keVwiPlxyXG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGl0ZW1JbmRleCkgaW4gdGFibGVEYXRhXCI+XHJcbiAgICAgIDx0ciBAZGJsY2xpY2s9XCJvblJvd0RvdWJsZUNsaWNrZWQoaXRlbSwgJGV2ZW50KVwiIFxyXG4gICAgICAgIDprZXk9XCJpdGVtSW5kZXhcIlxyXG4gICAgICAgIDppdGVtLWluZGV4PVwiaXRlbUluZGV4XCIgXHJcbiAgICAgICAgOnJlbmRlcj1cIm9uUm93Q2hhbmdlZChpdGVtKVwiIFxyXG4gICAgICAgIDpjbGFzcz1cIm9uUm93Q2xhc3MoaXRlbSwgaXRlbUluZGV4KVwiXHJcbiAgICAgICAgQGNsaWNrPVwib25Sb3dDbGlja2VkKGl0ZW0sICRldmVudClcIiBcclxuICAgICAgPlxyXG4gICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihmaWVsZCwgZmllbGRJbmRleCkgaW4gdGFibGVGaWVsZHNcIj5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiZmllbGQudmlzaWJsZVwiPlxyXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cImlzU3BlY2lhbEZpZWxkKGZpZWxkLm5hbWUpXCI+XHJcbiAgICAgICAgICAgICAgPHRkIHYtaWY9XCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PSAnX19zZXF1ZW5jZSdcIiBcclxuICAgICAgICAgICAgICAgIDprZXk9XCJmaWVsZEluZGV4XCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cIlsndnVldGFibGUtc2VxdWVuY2UnLCBmaWVsZC5kYXRhQ2xhc3NdXCJcclxuICAgICAgICAgICAgICAgIHYtaHRtbD1cInJlbmRlclNlcXVlbmNlKGl0ZW1JbmRleClcIlxyXG4gICAgICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCB2LWlmPVwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19faGFuZGxlJ1wiIFxyXG4gICAgICAgICAgICAgICAgOmtleT1cImZpZWxkSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiWyd2dWV0YWJsZS1oYW5kbGUnLCBmaWVsZC5kYXRhQ2xhc3NdXCJcclxuICAgICAgICAgICAgICAgIHYtaHRtbD1cInJlbmRlckljb25UYWcoWydoYW5kbGUtaWNvbicsIGNzcy5oYW5kbGVJY29uXSlcIlxyXG4gICAgICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCB2LWlmPVwiZXh0cmFjdE5hbWUoZmllbGQubmFtZSkgPT0gJ19fY2hlY2tib3gnXCIgXHJcbiAgICAgICAgICAgICAgICA6a2V5PVwiZmllbGRJbmRleFwiXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbJ3Z1ZXRhYmxlLWNoZWNrYm94ZXMnLCBmaWVsZC5kYXRhQ2xhc3NdXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgQGNoYW5nZT1cInRvZ2dsZUNoZWNrYm94KGl0ZW0sIGZpZWxkLm5hbWUsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICA6Y2hlY2tlZD1cInJvd1NlbGVjdGVkKGl0ZW0sIGZpZWxkLm5hbWUpXCI+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgdi1pZj1cImV4dHJhY3ROYW1lKGZpZWxkLm5hbWUpID09PSAnX19jb21wb25lbnQnXCIgXHJcbiAgICAgICAgICAgICAgICA6a2V5PVwiZmllbGRJbmRleFwiXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbJ3Z1ZXRhYmxlLWNvbXBvbmVudCcsIGZpZWxkLmRhdGFDbGFzc11cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwiZXh0cmFjdEFyZ3MoZmllbGQubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICA6cm93LWRhdGE9XCJpdGVtXCIgOnJvdy1pbmRleD1cIml0ZW1JbmRleFwiIDpyb3ctZmllbGQ9XCJmaWVsZC5zb3J0RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgPjwvY29tcG9uZW50PlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHYtaWY9XCJleHRyYWN0TmFtZShmaWVsZC5uYW1lKSA9PT0gJ19fc2xvdCdcIiBcclxuICAgICAgICAgICAgICAgIDprZXk9XCJmaWVsZEluZGV4XCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cIlsndnVldGFibGUtc2xvdCcsIGZpZWxkLmRhdGFDbGFzc11cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxzbG90IDpuYW1lPVwiZXh0cmFjdEFyZ3MoZmllbGQubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICA6cm93LWRhdGE9XCJpdGVtXCIgOnJvdy1pbmRleD1cIml0ZW1JbmRleFwiIDpyb3ctZmllbGQ9XCJmaWVsZC5zb3J0RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgPjwvc2xvdD5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgICAgIDx0ZCB2LWlmPVwiaGFzQ2FsbGJhY2soZmllbGQpXCIgXHJcbiAgICAgICAgICAgICAgICA6a2V5PVwiZmllbGRJbmRleFwiXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJmaWVsZC5kYXRhQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgdi1odG1sPVwiY2FsbENhbGxiYWNrKGZpZWxkLCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICBAY2xpY2s9XCJvbkNlbGxDbGlja2VkKGl0ZW0sIGZpZWxkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIEBkYmxjbGljaz1cIm9uQ2VsbERvdWJsZUNsaWNrZWQoaXRlbSwgZmllbGQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgQGNvbnRleHRtZW51PVwib25DZWxsUmlnaHRDbGlja2VkKGl0ZW0sIGZpZWxkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICA+PC90ZD5cclxuICAgICAgICAgICAgICA8dGQgdi1lbHNlIFxyXG4gICAgICAgICAgICAgICAgOmtleT1cImZpZWxkSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiZmllbGQuZGF0YUNsYXNzXCJcclxuICAgICAgICAgICAgICAgIHYtaHRtbD1cImdldE9iamVjdFZhbHVlKGl0ZW0sIGZpZWxkLm5hbWUsICcnKVwiXHJcbiAgICAgICAgICAgICAgICBAY2xpY2s9XCJvbkNlbGxDbGlja2VkKGl0ZW0sIGZpZWxkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIEBkYmxjbGljaz1cIm9uQ2VsbERvdWJsZUNsaWNrZWQoaXRlbSwgZmllbGQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgQGNvbnRleHRtZW51PVwib25DZWxsUmlnaHRDbGlja2VkKGl0ZW0sIGZpZWxkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICA+PC90ZD5cclxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPC90cj5cclxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJ1c2VEZXRhaWxSb3dcIj5cclxuICAgICAgICA8dHJhbnNpdGlvbiA6bmFtZT1cImRldGFpbFJvd1RyYW5zaXRpb25cIiA6a2V5PVwiaXRlbUluZGV4XCI+XHJcbiAgICAgICAgICA8dHIgdi1pZj1cImlzVmlzaWJsZURldGFpbFJvdyhpdGVtW3RyYWNrQnldKVwiXHJcbiAgICAgICAgICAgIDpjbGFzcz1cIltjc3MuZGV0YWlsUm93Q2xhc3NdXCJcclxuICAgICAgICAgICAgQGNsaWNrPVwib25EZXRhaWxSb3dDbGljayhpdGVtLCAkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHRkIDpjb2xzcGFuPVwiY291bnRWaXNpYmxlRmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJkZXRhaWxSb3dDb21wb25lbnRcIiA6cm93LWRhdGE9XCJpdGVtXCIgOnJvdy1pbmRleD1cIml0ZW1JbmRleFwiPjwvY29tcG9uZW50PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RyYW5zaXRpb24+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPHRlbXBsYXRlIHYtaWY9XCJkaXNwbGF5RW1wdHlEYXRhUm93XCI+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGQgOmNvbHNwYW49XCJjb3VudFZpc2libGVGaWVsZHNcIiBjbGFzcz1cInZ1ZXRhYmxlLWVtcHR5LXJlc3VsdFwiIHYtaHRtbD1cIm5vRGF0YVRlbXBsYXRlXCI+PC90ZD5cclxuICAgICAgPC90cj5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgdi1pZj1cImxlc3NUaGFuTWluUm93c1wiPlxyXG4gICAgICA8dHIgdi1mb3I9XCJpIGluIGJsYW5rUm93c1wiIGNsYXNzPVwiYmxhbmstcm93XCIgOmtleT1cImlcIj5cclxuICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoZmllbGQsIGZpZWxkSW5kZXgpIGluIHRhYmxlRmllbGRzXCI+XHJcbiAgICAgICAgICA8dGQgdi1pZj1cImZpZWxkLnZpc2libGVcIiA6a2V5PVwiZmllbGRJbmRleFwiPiZuYnNwOzwvdGQ+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPC90cj5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgPC90Ym9keT5cclxuPC90YWJsZT5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQ+XHJcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcydcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBwcm9wczoge1xyXG4gICAgZmllbGRzOiB7XHJcbiAgICAgIHR5cGU6IEFycmF5LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIGxvYWRPblN0YXJ0OiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICBhcGlVcmw6IHtcclxuICAgICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgICAgZGVmYXVsdDogJydcclxuICAgIH0sXHJcbiAgICBodHRwTWV0aG9kOiB7XHJcbiAgICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICAgIGRlZmF1bHQ6ICdnZXQnLFxyXG4gICAgICAgIHZhbGlkYXRvcjogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gWydnZXQnLCAncG9zdCddLmluZGV4T2YodmFsdWUpID4gLTFcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgcmVhY3RpdmVBcGlVcmw6IHtcclxuICAgICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICBhcGlNb2RlOiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgIH0sXHJcbiAgICBkYXRhOiB7XHJcbiAgICAgIHR5cGU6IFtBcnJheSwgT2JqZWN0XSxcclxuICAgICAgZGVmYXVsdDogbnVsbFxyXG4gICAgfSxcclxuICAgIGRhdGFUb3RhbDoge1xyXG4gICAgICB0eXBlOiBOdW1iZXIsXHJcbiAgICAgIGRlZmF1bHQ6IDBcclxuICAgIH0sXHJcbiAgICBkYXRhTWFuYWdlcjoge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvbixcclxuICAgICAgZGVmYXVsdDogbnVsbFxyXG4gICAgfSxcclxuICAgIGRhdGFQYXRoOiB7XHJcbiAgICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICAgIGRlZmF1bHQ6ICdkYXRhJ1xyXG4gICAgfSxcclxuICAgIHBhZ2luYXRpb25QYXRoOiB7XHJcbiAgICAgICAgdHlwZTogW1N0cmluZ10sXHJcbiAgICAgICAgZGVmYXVsdDogJ2xpbmtzLnBhZ2luYXRpb24nXHJcbiAgICB9LFxyXG4gICAgcXVlcnlQYXJhbXM6IHtcclxuICAgICAgdHlwZTogW09iamVjdCwgRnVuY3Rpb25dLFxyXG4gICAgICBkZWZhdWx0ICgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgc29ydDogJ3NvcnQnLFxyXG4gICAgICAgICAgcGFnZTogJ3BhZ2UnLFxyXG4gICAgICAgICAgcGVyUGFnZTogJ3Blcl9wYWdlJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGFwcGVuZFBhcmFtczoge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQgKCkge1xyXG4gICAgICAgIHJldHVybiB7fVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgaHR0cE9wdGlvbnM6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0ICgpIHtcclxuICAgICAgICByZXR1cm4ge31cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGh0dHBGZXRjaDoge1xyXG4gICAgICB0eXBlOiBGdW5jdGlvbixcclxuICAgICAgZGVmYXVsdDogbnVsbFxyXG4gICAgfSxcclxuICAgIHBlclBhZ2U6IHtcclxuICAgICAgICB0eXBlOiBOdW1iZXIsXHJcbiAgICAgICAgZGVmYXVsdDogMTBcclxuICAgIH0sXHJcbiAgICBpbml0aWFsUGFnZToge1xyXG4gICAgICB0eXBlOiBOdW1iZXIsXHJcbiAgICAgIGRlZmF1bHQ6IDFcclxuICAgIH0sXHJcbiAgICBzb3J0T3JkZXI6IHtcclxuICAgICAgdHlwZTogQXJyYXksXHJcbiAgICAgIGRlZmF1bHQgKCkge1xyXG4gICAgICAgIHJldHVybiBbXVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgbXVsdGlTb3J0OiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQgKCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgdGFibGVIZWlnaHQ6IHtcclxuICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICBkZWZhdWx0OiBudWxsXHJcbiAgICB9LFxyXG4gICAgLypcclxuICAgICAqIHBoeXNpY2FsIGtleSB0aGF0IHdpbGwgdHJpZ2dlciBtdWx0aS1zb3J0IG9wdGlvblxyXG4gICAgICogcG9zc2libGUgdmFsdWVzOiAnYWx0JywgJ2N0cmwnLCAnbWV0YScsICdzaGlmdCdcclxuICAgICAqICdjdHJsJyBtaWdodCBub3Qgd29yayBhcyBleHBlY3RlZCBvbiBNYWNcclxuICAgICAqL1xyXG4gICAgbXVsdGlTb3J0S2V5OiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogJ2FsdCdcclxuICAgIH0sXHJcbiAgICAvKiBkZXByZWNhdGVkICovXHJcbiAgICByb3dDbGFzc0NhbGxiYWNrOiB7XHJcbiAgICAgIHR5cGU6IFtTdHJpbmcsIEZ1bmN0aW9uXSxcclxuICAgICAgZGVmYXVsdDogJydcclxuICAgIH0sXHJcbiAgICByb3dDbGFzczoge1xyXG4gICAgICB0eXBlOiBbU3RyaW5nLCBGdW5jdGlvbl0sXHJcbiAgICAgIGRlZmF1bHQ6ICcnXHJcbiAgICB9LFxyXG4gICAgZGV0YWlsUm93Q29tcG9uZW50OiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogJydcclxuICAgIH0sXHJcbiAgICBkZXRhaWxSb3dUcmFuc2l0aW9uOiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogJydcclxuICAgIH0sXHJcbiAgICB0cmFja0J5OiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogJ2lkJ1xyXG4gICAgfSxcclxuICAgIGNzczoge1xyXG4gICAgICB0eXBlOiBPYmplY3QsXHJcbiAgICAgIGRlZmF1bHQgKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICB0YWJsZUNsYXNzOiAndWkgYmx1ZSBzZWxlY3RhYmxlIGNlbGxlZCBzdGFja2FibGUgYXR0YWNoZWQgdGFibGUnLFxyXG4gICAgICAgICAgbG9hZGluZ0NsYXNzOiAnbG9hZGluZycsXHJcbiAgICAgICAgICBhc2NlbmRpbmdJY29uOiAnYmx1ZSBjaGV2cm9uIHVwIGljb24nLFxyXG4gICAgICAgICAgZGVzY2VuZGluZ0ljb246ICdibHVlIGNoZXZyb24gZG93biBpY29uJyxcclxuICAgICAgICAgIGFzY2VuZGluZ0NsYXNzOiAnc29ydGVkLWFzYycsXHJcbiAgICAgICAgICBkZXNjZW5kaW5nQ2xhc3M6ICdzb3J0ZWQtZGVzYycsXHJcbiAgICAgICAgICBzb3J0YWJsZUljb246ICcnLFxyXG4gICAgICAgICAgZGV0YWlsUm93Q2xhc3M6ICd2dWV0YWJsZS1kZXRhaWwtcm93JyxcclxuICAgICAgICAgIGhhbmRsZUljb246ICdncmV5IHNpZGViYXIgaWNvbicsXHJcbiAgICAgICAgICB0YWJsZUJvZHlDbGFzczogJ3Z1ZXRhYmxlLXNlbWFudGljLW5vLXRvcCB2dWV0YWJsZS1maXhlZC1sYXlvdXQnLFxyXG4gICAgICAgICAgdGFibGVIZWFkZXJDbGFzczogJ3Z1ZXRhYmxlLWZpeGVkLWxheW91dCdcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBtaW5Sb3dzOiB7XHJcbiAgICAgIHR5cGU6IE51bWJlcixcclxuICAgICAgZGVmYXVsdDogMFxyXG4gICAgfSxcclxuICAgIHNpbGVudDoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfSxcclxuICAgIG5vRGF0YVRlbXBsYXRlOiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4gJ05vIERhdGEgQXZhaWxhYmxlJ1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgc2hvd1NvcnRJY29uczoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiB0cnVlXHJcbiAgICB9XHJcbiAgfSxcclxuICBkYXRhICgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGV2ZW50UHJlZml4OiAndnVldGFibGU6JyxcclxuICAgICAgdGFibGVGaWVsZHM6IFtdLFxyXG4gICAgICB0YWJsZURhdGE6IG51bGwsXHJcbiAgICAgIHRhYmxlUGFnaW5hdGlvbjogbnVsbCxcclxuICAgICAgY3VycmVudFBhZ2U6IHRoaXMuaW5pdGlhbFBhZ2UsXHJcbiAgICAgIHNlbGVjdGVkVG86IFtdLFxyXG4gICAgICB2aXNpYmxlRGV0YWlsUm93czogW10sXHJcbiAgICAgIGxhc3RTY3JvbGxQb3NpdGlvbjogMCxcclxuICAgICAgc2Nyb2xsQmFyV2lkdGg6ICcxN3B4JywgLy9jaHJvbWUgZGVmYXVsdFxyXG4gICAgICBzY3JvbGxWaXNpYmxlOiBmYWxzZSxcclxuICAgIH1cclxuICB9LFxyXG4gIG1vdW50ZWQgKCkge1xyXG4gICAgdGhpcy5ub3JtYWxpemVGaWVsZHMoKVxyXG4gICAgdGhpcy5ub3JtYWxpemVTb3J0T3JkZXIoKVxyXG4gICAgaWYgKHRoaXMuaXNGaXhlZEhlYWRlcikge1xyXG4gICAgICB0aGlzLnNjcm9sbEJhcldpZHRoID0gdGhpcy5nZXRTY3JvbGxCYXJXaWR0aCgpICsgJ3B4JztcclxuICAgIH1cclxuICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCkge1xyXG4gICAgICB0aGlzLmZpcmVFdmVudCgnaW5pdGlhbGl6ZWQnLCB0aGlzLnRhYmxlRmllbGRzKVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAodGhpcy5sb2FkT25TdGFydCkge1xyXG4gICAgICB0aGlzLmxvYWREYXRhKClcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzRml4ZWRIZWFkZXIpIHtcclxuICAgICAgbGV0IGVsZW0gPSB0aGlzLiRlbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2dWV0YWJsZS1ib2R5LXdyYXBwZXInKVswXTtcclxuICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVTY3JvbGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSxcclxuICBkZXN0cm95ZWQgKCkge1xyXG4gICAgbGV0IGVsZW0gPSB0aGlzLiRlbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2dWV0YWJsZS1ib2R5LXdyYXBwZXInKVswXTtcclxuICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhhbmRsZVNjcm9sbCk7XHJcbiAgICB9XHJcbiAgfSxcclxuICBjb21wdXRlZDoge1xyXG4gICAgdmVyc2lvbjogKCkgPT4gVkVSU0lPTixcclxuICAgIHVzZURldGFpbFJvdyAoKSB7XHJcbiAgICAgIGlmICh0aGlzLnRhYmxlRGF0YSAmJiB0aGlzLnRhYmxlRGF0YVswXSAmJiB0aGlzLmRldGFpbFJvd0NvbXBvbmVudCAhPT0gJycgJiYgdHlwZW9mIHRoaXMudGFibGVEYXRhWzBdW3RoaXMudHJhY2tCeV0gPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhpcy53YXJuKCdZb3UgbmVlZCB0byBkZWZpbmUgdW5pcXVlIHJvdyBpZGVudGlmaWVyIGluIG9yZGVyIGZvciBkZXRhaWwtcm93IGZlYXR1cmUgdG8gd29yay4gVXNlIGB0cmFjay1ieWAgcHJvcCB0byBkZWZpbmUgb25lIScpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmRldGFpbFJvd0NvbXBvbmVudCAhPT0gJydcclxuICAgIH0sXHJcbiAgICBjb3VudFZpc2libGVGaWVsZHMgKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50YWJsZUZpZWxkcy5maWx0ZXIoZnVuY3Rpb24oZmllbGQpIHtcclxuICAgICAgICByZXR1cm4gZmllbGQudmlzaWJsZVxyXG4gICAgICB9KS5sZW5ndGhcclxuICAgIH0sXHJcbiAgICBjb3VudFRhYmxlRGF0YSAoKSB7XHJcbiAgICAgIGlmICh0aGlzLnRhYmxlRGF0YSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiAwXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMudGFibGVEYXRhLmxlbmd0aFxyXG4gICAgfSxcclxuICAgIGRpc3BsYXlFbXB0eURhdGFSb3cgKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb3VudFRhYmxlRGF0YSA9PT0gMCAmJiB0aGlzLm5vRGF0YVRlbXBsYXRlLmxlbmd0aCA+IDBcclxuICAgIH0sXHJcbiAgICBsZXNzVGhhbk1pblJvd3MgKCkge1xyXG4gICAgICBpZiAodGhpcy50YWJsZURhdGEgPT09IG51bGwgfHwgdGhpcy50YWJsZURhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy50YWJsZURhdGEubGVuZ3RoIDwgdGhpcy5taW5Sb3dzXHJcbiAgICB9LFxyXG4gICAgYmxhbmtSb3dzICgpIHtcclxuICAgICAgaWYgKHRoaXMudGFibGVEYXRhID09PSBudWxsIHx8IHRoaXMudGFibGVEYXRhLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1pblJvd3NcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy50YWJsZURhdGEubGVuZ3RoID49IHRoaXMubWluUm93cykge1xyXG4gICAgICAgIHJldHVybiAwXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLm1pblJvd3MgLSB0aGlzLnRhYmxlRGF0YS5sZW5ndGhcclxuICAgIH0sXHJcbiAgICBpc0FwaU1vZGUgKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcGlNb2RlXHJcbiAgICB9LFxyXG4gICAgaXNEYXRhTW9kZSAoKSB7XHJcbiAgICAgIHJldHVybiAhIHRoaXMuYXBpTW9kZVxyXG4gICAgfSxcclxuICAgIGlzRml4ZWRIZWFkZXIgKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50YWJsZUhlaWdodCAhPSBudWxsXHJcbiAgICB9XHJcbiAgfSxcclxuICBtZXRob2RzOiB7XHJcbiAgICBnZXRTY3JvbGxCYXJXaWR0aCAoKSB7XHJcbiAgICAgIGNvbnN0IG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnN0IGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgICBvdXRlci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgIG91dGVyLnN0eWxlLndpZHRoID0gJzEwMHB4JztcclxuXHJcbiAgICAgIGlubmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG5cclxuXHJcbiAgICAgIG91dGVyLmFwcGVuZENoaWxkKGlubmVyKTtcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdXRlcik7XHJcblxyXG5cclxuICAgICAgY29uc3Qgd2lkdGhXaXRob3V0U2Nyb2xsYmFyID0gb3V0ZXIub2Zmc2V0V2lkdGg7XHJcblxyXG4gICAgICBvdXRlci5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnO1xyXG5cclxuICAgICAgY29uc3Qgd2lkdGhXaXRoU2Nyb2xsYmFyID0gaW5uZXIub2Zmc2V0V2lkdGg7XHJcblxyXG5cclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChvdXRlcik7XHJcblxyXG5cclxuICAgICAgcmV0dXJuICh3aWR0aFdpdGhvdXRTY3JvbGxiYXIgLSB3aWR0aFdpdGhTY3JvbGxiYXIpO1xyXG4gICAgfSxcclxuICAgIGhhbmRsZVNjcm9sbCAoZSkgeyAvL21ha2Ugc3VyZSB0aGF0IHRoZSBoZWFkZXIgYW5kIHRoZSBib2R5IGFyZSBhbGlnbmVkIHdoZW4gc2Nyb2xsaW5nIGhvcml6b250YWxseSBvbiBhIHRhYmxlIHRoYXQgaXMgd2lkZXIgdGhhbiB0aGUgdmlld3BvcnRcclxuICAgICAgbGV0IGhvcml6b250YWwgPSBlLmN1cnJlbnRUYXJnZXQuc2Nyb2xsTGVmdDtcclxuICAgICAgaWYgKGhvcml6b250YWwgIT0gdGhpcy5sYXN0U2Nyb2xsUG9zaXRpb24pIHsgLy9kb24ndCBtb2RpZnkgaGVhZGVyIHNjcm9sbCBpZiB3ZSBhcmUgc2Nyb2xsaW5nIHZlcnRpY2FsbHlcclxuICAgICAgICBsZXQgaGVhZGVyID0gdGhpcy4kZWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndnVldGFibGUtaGVhZC13cmFwcGVyJylbMF1cclxuICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHtcclxuICAgICAgICAgIGhlYWRlci5zY3JvbGxMZWZ0ID0gaG9yaXpvbnRhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sYXN0U2Nyb2xsUG9zaXRpb24gPSBob3Jpem9udGFsO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSxcclxuICAgIG5vcm1hbGl6ZUZpZWxkcyAoKSB7XHJcbiAgICAgIGlmICh0eXBlb2YodGhpcy5maWVsZHMpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRoaXMud2FybignWW91IG5lZWQgdG8gcHJvdmlkZSBcImZpZWxkc1wiIHByb3AuJylcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy50YWJsZUZpZWxkcyA9IFtdXHJcbiAgICAgIGxldCBzZWxmID0gdGhpc1xyXG4gICAgICBsZXQgb2JqXHJcbiAgICAgIHRoaXMuZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQsIGkpIHtcclxuICAgICAgICBpZiAodHlwZW9mIChmaWVsZCkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBvYmogPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IGZpZWxkLFxyXG4gICAgICAgICAgICB0aXRsZTogc2VsZi5zZXRUaXRsZShmaWVsZCksXHJcbiAgICAgICAgICAgIHRpdGxlQ2xhc3M6ICcnLFxyXG4gICAgICAgICAgICBkYXRhQ2xhc3M6ICcnLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogbnVsbCxcclxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb2JqID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBmaWVsZC5uYW1lLFxyXG4gICAgICAgICAgICB3aWR0aDogZmllbGQud2lkdGgsXHJcbiAgICAgICAgICAgIHRpdGxlOiAoZmllbGQudGl0bGUgPT09IHVuZGVmaW5lZCkgPyBzZWxmLnNldFRpdGxlKGZpZWxkLm5hbWUpIDogZmllbGQudGl0bGUsXHJcbiAgICAgICAgICAgIHNvcnRGaWVsZDogZmllbGQuc29ydEZpZWxkLFxyXG4gICAgICAgICAgICB0aXRsZUNsYXNzOiAoZmllbGQudGl0bGVDbGFzcyA9PT0gdW5kZWZpbmVkKSA/ICcnIDogZmllbGQudGl0bGVDbGFzcyxcclxuICAgICAgICAgICAgZGF0YUNsYXNzOiAoZmllbGQuZGF0YUNsYXNzID09PSB1bmRlZmluZWQpID8gJycgOiBmaWVsZC5kYXRhQ2xhc3MsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoZmllbGQuY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgPyAnJyA6IGZpZWxkLmNhbGxiYWNrLFxyXG4gICAgICAgICAgICB2aXNpYmxlOiAoZmllbGQudmlzaWJsZSA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiBmaWVsZC52aXNpYmxlLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxmLnRhYmxlRmllbGRzLnB1c2gob2JqKVxyXG4gICAgICB9KVxyXG4gICAgfSxcclxuICAgIHNldERhdGEgKGRhdGEpIHtcclxuICAgICAgaWYgKGRhdGEgPT09IG51bGwgfHwgdHlwZW9mKGRhdGEpID09PSAndW5kZWZpbmVkJykgcmV0dXJuXHJcblxyXG4gICAgICB0aGlzLmZpcmVFdmVudCgnbG9hZGluZycpXHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG4gICAgICAgIHRoaXMudGFibGVEYXRhID0gZGF0YVxyXG4gICAgICAgIHRoaXMuZmlyZUV2ZW50KCdsb2FkZWQnKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnRhYmxlRGF0YSA9IHRoaXMuZ2V0T2JqZWN0VmFsdWUoZGF0YSwgdGhpcy5kYXRhUGF0aCwgbnVsbClcclxuICAgICAgdGhpcy50YWJsZVBhZ2luYXRpb24gPSB0aGlzLmdldE9iamVjdFZhbHVlKGRhdGEsIHRoaXMucGFnaW5hdGlvblBhdGgsIG51bGwpXHJcblxyXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpIHtcclxuICAgICAgICB0aGlzLmZpeEhlYWRlcigpXHJcbiAgICAgICAgdGhpcy5maXJlRXZlbnQoJ3BhZ2luYXRpb24tZGF0YScsIHRoaXMudGFibGVQYWdpbmF0aW9uKVxyXG4gICAgICAgIHRoaXMuZmlyZUV2ZW50KCdsb2FkZWQnKVxyXG4gICAgICB9KVxyXG4gICAgfSxcclxuICAgIHNldFRpdGxlIChzdHIpIHtcclxuICAgICAgaWYgKHRoaXMuaXNTcGVjaWFsRmllbGQoc3RyKSkge1xyXG4gICAgICAgIHJldHVybiAnJ1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy50aXRsZUNhc2Uoc3RyKVxyXG4gICAgfSxcclxuICAgIGdldFRpdGxlIChmaWVsZCkge1xyXG4gICAgICBpZiAodHlwZW9mKGZpZWxkLnRpdGxlKSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZpZWxkLnRpdGxlKClcclxuXHJcbiAgICAgIHJldHVybiB0eXBlb2YoZmllbGQudGl0bGUpID09PSAndW5kZWZpbmVkJ1xyXG4gICAgICAgID8gZmllbGQubmFtZS5yZXBsYWNlKCcuJywgJyAnKVxyXG4gICAgICAgIDogZmllbGQudGl0bGVcclxuICAgIH0sXHJcbiAgICByZW5kZXJUaXRsZSAoZmllbGQpIHtcclxuICAgICAgbGV0IHRpdGxlID0gdGhpcy5nZXRUaXRsZShmaWVsZClcclxuXHJcbiAgICAgIGlmICh0aXRsZS5sZW5ndGggPiAwICYmIHRoaXMuaXNJbkN1cnJlbnRTb3J0R3JvdXAoZmllbGQpIHx8IHRoaXMuaGFzU29ydGFibGVJY29uKGZpZWxkKSkge1xyXG4gICAgICAgIGxldCBzdHlsZSA9IGBvcGFjaXR5OiR7dGhpcy5zb3J0SWNvbk9wYWNpdHkoZmllbGQpfTtwb3NpdGlvbjpyZWxhdGl2ZTtmbG9hdDpyaWdodGBcclxuICAgICAgICBsZXQgaWNvblRhZyA9IHRoaXMuc2hvd1NvcnRJY29ucyA/IHRoaXMucmVuZGVySWNvblRhZyhbJ3NvcnQtaWNvbicsIHRoaXMuc29ydEljb24oZmllbGQpXSwgYHN0eWxlPVwiJHtzdHlsZX1cImApIDogJydcclxuICAgICAgICByZXR1cm4gdGl0bGUgKyAnICcgKyBpY29uVGFnXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aXRsZVxyXG4gICAgfSxcclxuICAgIHJlbmRlclNlcXVlbmNlIChpbmRleCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50YWJsZVBhZ2luYXRpb25cclxuICAgICAgICA/IHRoaXMudGFibGVQYWdpbmF0aW9uLmZyb20gKyBpbmRleFxyXG4gICAgICAgIDogaW5kZXhcclxuICAgIH0sXHJcbiAgICByZW5kZXJOb3JtYWxGaWVsZCAoZmllbGQsIGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaGFzQ2FsbGJhY2soZmllbGQpXHJcbiAgICAgICAgPyB0aGlzLmNhbGxDYWxsYmFjayhmaWVsZCwgaXRlbSlcclxuICAgICAgICA6IHRoaXMuZ2V0T2JqZWN0VmFsdWUoaXRlbSwgZmllbGQubmFtZSwgJycpXHJcbiAgICB9LFxyXG4gICAgaXNTcGVjaWFsRmllbGQgKGZpZWxkTmFtZSkge1xyXG4gICAgICByZXR1cm4gZmllbGROYW1lLnNsaWNlKDAsIDIpID09PSAnX18nXHJcbiAgICB9LFxyXG4gICAgdGl0bGVDYXNlIChzdHIpIHtcclxuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHcrL2csIGZ1bmN0aW9uKHR4dCkge1xyXG4gICAgICAgIHJldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKClcclxuICAgICAgfSlcclxuICAgIH0sXHJcbiAgICBjYW1lbENhc2UgKHN0ciwgZGVsaW1pdGVyID0gJ18nKSB7XHJcbiAgICAgIGxldCBzZWxmID0gdGhpc1xyXG4gICAgICByZXR1cm4gc3RyLnNwbGl0KGRlbGltaXRlcikubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gc2VsZi50aXRsZUNhc2UoaXRlbSlcclxuICAgICAgfSkuam9pbignJylcclxuICAgIH0sXHJcbiAgICBub3RJbiAoc3RyLCBhcnIpIHtcclxuICAgICAgcmV0dXJuIGFyci5pbmRleE9mKHN0cikgPT09IC0xXHJcbiAgICB9LFxyXG4gICAgbG9hZERhdGEgKHN1Y2Nlc3MgPSB0aGlzLmxvYWRTdWNjZXNzLCBmYWlsZWQgPSB0aGlzLmxvYWRGYWlsZWQpIHtcclxuICAgICAgaWYgKHRoaXMuaXNEYXRhTW9kZSkge1xyXG4gICAgICAgIHRoaXMuY2FsbERhdGFNYW5hZ2VyKClcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5maXJlRXZlbnQoJ2xvYWRpbmcnKVxyXG5cclxuICAgICAgdGhpcy5odHRwT3B0aW9uc1sncGFyYW1zJ10gPSB0aGlzLmdldEFwcGVuZFBhcmFtcyggdGhpcy5nZXRBbGxRdWVyeVBhcmFtcygpIClcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmZldGNoKHRoaXMuYXBpVXJsLCB0aGlzLmh0dHBPcHRpb25zKS50aGVuKFxyXG4gICAgICAgICAgc3VjY2VzcyxcclxuICAgICAgICAgIGZhaWxlZFxyXG4gICAgICApLmNhdGNoKCgpID0+IGZhaWxlZCgpKVxyXG4gICAgfSxcclxuICAgIGZldGNoIChhcGlVcmwsIGh0dHBPcHRpb25zKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHBGZXRjaFxyXG4gICAgICAgICAgPyB0aGlzLmh0dHBGZXRjaChhcGlVcmwsIGh0dHBPcHRpb25zKVxyXG4gICAgICAgICAgOiBheGlvc1t0aGlzLmh0dHBNZXRob2RdKGFwaVVybCwgaHR0cE9wdGlvbnMpXHJcbiAgICB9LFxyXG4gICAgbG9hZFN1Y2Nlc3MgKHJlc3BvbnNlKSB7XHJcbiAgICAgIHRoaXMuZmlyZUV2ZW50KCdsb2FkLXN1Y2Nlc3MnLCByZXNwb25zZSlcclxuXHJcbiAgICAgIGxldCBib2R5ID0gdGhpcy50cmFuc2Zvcm0ocmVzcG9uc2UuZGF0YSlcclxuXHJcbiAgICAgIHRoaXMudGFibGVEYXRhID0gdGhpcy5nZXRPYmplY3RWYWx1ZShib2R5LCB0aGlzLmRhdGFQYXRoLCBudWxsKVxyXG4gICAgICB0aGlzLnRhYmxlUGFnaW5hdGlvbiA9IHRoaXMuZ2V0T2JqZWN0VmFsdWUoYm9keSwgdGhpcy5wYWdpbmF0aW9uUGF0aCwgbnVsbClcclxuXHJcbiAgICAgIGlmICh0aGlzLnRhYmxlUGFnaW5hdGlvbiA9PT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMud2FybigndnVldGFibGU6IHBhZ2luYXRpb24tcGF0aCBcIicgKyB0aGlzLnBhZ2luYXRpb25QYXRoICsgJ1wiIG5vdCBmb3VuZC4gJ1xyXG4gICAgICAgICAgKyAnSXQgbG9va3MgbGlrZSB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIHRoZSBzZXZlciBkb2VzIG5vdCBoYXZlIHBhZ2luYXRpb24gaW5mb3JtYXRpb24gJ1xyXG4gICAgICAgICAgKyBcIm9yIHlvdSBtYXkgaGF2ZSBzZXQgaXQgaW5jb3JyZWN0bHkuXFxuXCJcclxuICAgICAgICAgICsgJ1lvdSBjYW4gZXhwbGljaXRseSBzdXBwcmVzcyB0aGlzIHdhcm5pbmcgYnkgc2V0dGluZyBwYWdpbmF0aW9uLXBhdGg9XCJcIi4nXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpIHtcclxuICAgICAgICB0aGlzLmZpeEhlYWRlcigpXHJcbiAgICAgICAgdGhpcy5maXJlRXZlbnQoJ3BhZ2luYXRpb24tZGF0YScsIHRoaXMudGFibGVQYWdpbmF0aW9uKVxyXG4gICAgICAgIHRoaXMuZmlyZUV2ZW50KCdsb2FkZWQnKVxyXG4gICAgICB9KVxyXG4gICAgfSxcclxuICAgIGZpeEhlYWRlcigpIHtcclxuICAgICAgaWYgKCF0aGlzLmlzRml4ZWRIZWFkZXIpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBlbGVtID0gdGhpcy4kZWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndnVldGFibGUtYm9keS13cmFwcGVyJylbMF1cclxuICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChlbGVtLnNjcm9sbEhlaWdodCA+IGVsZW0uY2xpZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICB0aGlzLnNjcm9sbFZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2Nyb2xsVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGxvYWRGYWlsZWQgKHJlc3BvbnNlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2xvYWQtZXJyb3InLCByZXNwb25zZSlcclxuICAgICAgdGhpcy5maXJlRXZlbnQoJ2xvYWQtZXJyb3InLCByZXNwb25zZSlcclxuICAgICAgdGhpcy5maXJlRXZlbnQoJ2xvYWRlZCcpXHJcbiAgICB9LFxyXG4gICAgdHJhbnNmb3JtIChkYXRhKSB7XHJcbiAgICAgIGxldCBmdW5jID0gJ3RyYW5zZm9ybSdcclxuXHJcbiAgICAgIGlmICh0aGlzLnBhcmVudEZ1bmN0aW9uRXhpc3RzKGZ1bmMpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy4kcGFyZW50W2Z1bmNdLmNhbGwodGhpcy4kcGFyZW50LCBkYXRhKVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGF0YVxyXG4gICAgfSxcclxuICAgIHBhcmVudEZ1bmN0aW9uRXhpc3RzIChmdW5jKSB7XHJcbiAgICAgIHJldHVybiAoZnVuYyAhPT0gJycgJiYgdHlwZW9mIHRoaXMuJHBhcmVudFtmdW5jXSA9PT0gJ2Z1bmN0aW9uJylcclxuICAgIH0sXHJcbiAgICBjYWxsUGFyZW50RnVuY3Rpb24gKGZ1bmMsIGFyZ3MsIGRlZmF1bHRWYWx1ZSA9IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMucGFyZW50RnVuY3Rpb25FeGlzdHMoZnVuYykpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4kcGFyZW50W2Z1bmNdLmNhbGwodGhpcy4kcGFyZW50LCBhcmdzKVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXHJcbiAgICB9LFxyXG4gICAgZmlyZUV2ZW50IChldmVudE5hbWUsIGFyZ3MpIHtcclxuICAgICAgdGhpcy4kZW1pdCh0aGlzLmV2ZW50UHJlZml4ICsgZXZlbnROYW1lLCBhcmdzKVxyXG4gICAgfSxcclxuICAgIHdhcm4gKG1zZykge1xyXG4gICAgICBpZiAoIXRoaXMuc2lsZW50KSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKG1zZylcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGdldEFsbFF1ZXJ5UGFyYW1zICgpIHtcclxuICAgICAgbGV0IHBhcmFtcyA9IHt9XHJcblxyXG4gICAgICBpZiAodHlwZW9mKHRoaXMucXVlcnlQYXJhbXMpID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgcGFyYW1zID0gdGhpcy5xdWVyeVBhcmFtcyh0aGlzLnNvcnRPcmRlciwgdGhpcy5jdXJyZW50UGFnZSwgdGhpcy5wZXJQYWdlKVxyXG4gICAgICAgIHJldHVybiB0eXBlb2YocGFyYW1zKSAhPT0gJ29iamVjdCcgPyB7fSA6IHBhcmFtc1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwYXJhbXNbdGhpcy5xdWVyeVBhcmFtcy5zb3J0XSA9IHRoaXMuZ2V0U29ydFBhcmFtKClcclxuICAgICAgcGFyYW1zW3RoaXMucXVlcnlQYXJhbXMucGFnZV0gPSB0aGlzLmN1cnJlbnRQYWdlXHJcbiAgICAgIHBhcmFtc1t0aGlzLnF1ZXJ5UGFyYW1zLnBlclBhZ2VdID0gdGhpcy5wZXJQYWdlXHJcblxyXG4gICAgICByZXR1cm4gcGFyYW1zXHJcbiAgICB9LFxyXG4gICAgZ2V0U29ydFBhcmFtICgpIHtcclxuICAgICAgaWYgKCF0aGlzLnNvcnRPcmRlciB8fCB0aGlzLnNvcnRPcmRlci5maWVsZCA9PSAnJykge1xyXG4gICAgICAgIHJldHVybiAnJ1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuJHBhcmVudFsnZ2V0U29ydFBhcmFtJ10gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4kcGFyZW50WydnZXRTb3J0UGFyYW0nXS5jYWxsKHRoaXMuJHBhcmVudCwgdGhpcy5zb3J0T3JkZXIpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRTb3J0UGFyYW0oKVxyXG4gICAgfSxcclxuICAgIGdldERlZmF1bHRTb3J0UGFyYW0gKCkge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc29ydE9yZGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGZpZWxkTmFtZSA9ICh0eXBlb2YgdGhpcy5zb3J0T3JkZXJbaV0uc29ydEZpZWxkID09PSAndW5kZWZpbmVkJylcclxuICAgICAgICAgID8gdGhpcy5zb3J0T3JkZXJbaV0uZmllbGRcclxuICAgICAgICAgIDogdGhpcy5zb3J0T3JkZXJbaV0uc29ydEZpZWxkO1xyXG5cclxuICAgICAgICByZXN1bHQgKz0gZmllbGROYW1lICsgJ3wnICsgdGhpcy5zb3J0T3JkZXJbaV0uZGlyZWN0aW9uICsgKChpKzEpIDwgdGhpcy5zb3J0T3JkZXIubGVuZ3RoID8gJywnIDogJycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG4gICAgZ2V0QXBwZW5kUGFyYW1zIChwYXJhbXMpIHtcclxuICAgICAgZm9yIChsZXQgeCBpbiB0aGlzLmFwcGVuZFBhcmFtcykge1xyXG4gICAgICAgIHBhcmFtc1t4XSA9IHRoaXMuYXBwZW5kUGFyYW1zW3hdXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBwYXJhbXNcclxuICAgIH0sXHJcbiAgICBleHRyYWN0TmFtZSAoc3RyaW5nKSB7XHJcbiAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQoJzonKVswXS50cmltKClcclxuICAgIH0sXHJcbiAgICBleHRyYWN0QXJncyAoc3RyaW5nKSB7XHJcbiAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQoJzonKVsxXVxyXG4gICAgfSxcclxuICAgIGlzU29ydGFibGUgKGZpZWxkKSB7XHJcbiAgICAgIHJldHVybiAhKHR5cGVvZiBmaWVsZC5zb3J0RmllbGQgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgfSxcclxuICAgIGlzSW5DdXJyZW50U29ydEdyb3VwIChmaWVsZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50U29ydE9yZGVyUG9zaXRpb24oZmllbGQpICE9PSBmYWxzZTtcclxuICAgIH0sXHJcbiAgICBoYXNTb3J0YWJsZUljb24gKGZpZWxkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzU29ydGFibGUoZmllbGQpICYmIHRoaXMuY3NzLnNvcnRhYmxlSWNvbiAhPSAnJ1xyXG4gICAgfSxcclxuICAgIGN1cnJlbnRTb3J0T3JkZXJQb3NpdGlvbiAoZmllbGQpIHtcclxuICAgICAgaWYgKCAhIHRoaXMuaXNTb3J0YWJsZShmaWVsZCkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvcnRPcmRlci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmZpZWxkSXNJblNvcnRPcmRlclBvc2l0aW9uKGZpZWxkLCBpKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9LFxyXG4gICAgZmllbGRJc0luU29ydE9yZGVyUG9zaXRpb24gKGZpZWxkLCBpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNvcnRPcmRlcltpXS5maWVsZCA9PT0gZmllbGQubmFtZSAmJiB0aGlzLnNvcnRPcmRlcltpXS5zb3J0RmllbGQgPT09IGZpZWxkLnNvcnRGaWVsZFxyXG4gICAgfSxcclxuICAgIG9yZGVyQnkgKGZpZWxkLCBldmVudCkge1xyXG4gICAgICBpZiAoICEgdGhpcy5pc1NvcnRhYmxlKGZpZWxkKSApIHJldHVyblxyXG5cclxuICAgICAgbGV0IGtleSA9IHRoaXMubXVsdGlTb3J0S2V5LnRvTG93ZXJDYXNlKCkgKyAnS2V5J1xyXG5cclxuICAgICAgaWYgKHRoaXMubXVsdGlTb3J0ICYmIGV2ZW50W2tleV0pIHsgLy9hZGRpbmcgY29sdW1uIHRvIG11bHRpc29ydFxyXG4gICAgICAgIHRoaXMubXVsdGlDb2x1bW5Tb3J0KGZpZWxkKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vbm8gbXVsdGlzb3J0LCBvciByZXNldHRpbmcgc29ydFxyXG4gICAgICAgIHRoaXMuc2luZ2xlQ29sdW1uU29ydChmaWVsZClcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDEgICAgLy8gcmVzZXQgcGFnZSBpbmRleFxyXG4gICAgICBpZiAodGhpcy5hcGlNb2RlIHx8IHRoaXMuZGF0YU1hbmFnZXIpIHtcclxuICAgICAgICB0aGlzLmxvYWREYXRhKClcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG11bHRpQ29sdW1uU29ydCAoZmllbGQpIHtcclxuICAgICAgbGV0IGkgPSB0aGlzLmN1cnJlbnRTb3J0T3JkZXJQb3NpdGlvbihmaWVsZCk7XHJcblxyXG4gICAgICBpZihpID09PSBmYWxzZSkgeyAvL3RoaXMgZmllbGQgaXMgbm90IGluIHRoZSBzb3J0IGFycmF5IHlldFxyXG4gICAgICAgIHRoaXMuc29ydE9yZGVyLnB1c2goe1xyXG4gICAgICAgICAgZmllbGQ6IGZpZWxkLm5hbWUsXHJcbiAgICAgICAgICBzb3J0RmllbGQ6IGZpZWxkLnNvcnRGaWVsZCxcclxuICAgICAgICAgIGRpcmVjdGlvbjogJ2FzYydcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHsgLy90aGlzIGZpZWxkIGlzIGluIHRoZSBzb3J0IGFycmF5LCBub3cgd2UgY2hhbmdlIGl0cyBzdGF0ZVxyXG4gICAgICAgIGlmKHRoaXMuc29ydE9yZGVyW2ldLmRpcmVjdGlvbiA9PT0gJ2FzYycpIHtcclxuICAgICAgICAgIC8vIHN3aXRjaCBkaXJlY3Rpb25cclxuICAgICAgICAgIHRoaXMuc29ydE9yZGVyW2ldLmRpcmVjdGlvbiA9ICdkZXNjJ1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL3JlbW92ZSBzb3J0IGNvbmRpdGlvblxyXG4gICAgICAgICAgdGhpcy5zb3J0T3JkZXIuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHNpbmdsZUNvbHVtblNvcnQgKGZpZWxkKSB7XHJcbiAgICAgIGlmICh0aGlzLnNvcnRPcmRlci5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aGlzLmNsZWFyU29ydE9yZGVyKClcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zb3J0T3JkZXIuc3BsaWNlKDEpOyAvL3JlbW92ZXMgYWRkaXRpb25hbCBjb2x1bW5zXHJcblxyXG4gICAgICBpZiAodGhpcy5maWVsZElzSW5Tb3J0T3JkZXJQb3NpdGlvbihmaWVsZCwgMCkpIHtcclxuICAgICAgICAvLyBjaGFuZ2Ugc29ydCBkaXJlY3Rpb25cclxuICAgICAgICB0aGlzLnNvcnRPcmRlclswXS5kaXJlY3Rpb24gPSB0aGlzLnNvcnRPcmRlclswXS5kaXJlY3Rpb24gPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYydcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyByZXNldCBzb3J0IGRpcmVjdGlvblxyXG4gICAgICAgIHRoaXMuc29ydE9yZGVyWzBdLmRpcmVjdGlvbiA9ICdhc2MnXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zb3J0T3JkZXJbMF0uZmllbGQgPSBmaWVsZC5uYW1lXHJcbiAgICAgIHRoaXMuc29ydE9yZGVyWzBdLnNvcnRGaWVsZCA9IGZpZWxkLnNvcnRGaWVsZFxyXG4gICAgfSxcclxuICAgIGNsZWFyU29ydE9yZGVyICgpIHtcclxuICAgICAgdGhpcy5zb3J0T3JkZXIucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICcnLFxyXG4gICAgICAgIHNvcnRGaWVsZDogJycsXHJcbiAgICAgICAgZGlyZWN0aW9uOiAnYXNjJ1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBzb3J0Q2xhc3MgKGZpZWxkKSB7XHJcbiAgICAgIGxldCBjbHMgPSAnJ1xyXG4gICAgICBsZXQgaSA9IHRoaXMuY3VycmVudFNvcnRPcmRlclBvc2l0aW9uKGZpZWxkKVxyXG5cclxuICAgICAgaWYgKGkgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgY2xzID0gKHRoaXMuc29ydE9yZGVyW2ldLmRpcmVjdGlvbiA9PSAnYXNjJykgPyB0aGlzLmNzcy5hc2NlbmRpbmdDbGFzcyA6IHRoaXMuY3NzLmRlc2NlbmRpbmdDbGFzc1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gY2xzXHJcbiAgICB9LFxyXG4gICAgc29ydEljb24gKGZpZWxkKSB7XHJcbiAgICAgIGxldCBjbHMgPSB0aGlzLmNzcy5zb3J0YWJsZUljb25cclxuICAgICAgbGV0IGkgPSB0aGlzLmN1cnJlbnRTb3J0T3JkZXJQb3NpdGlvbihmaWVsZClcclxuXHJcbiAgICAgIGlmIChpICE9PSBmYWxzZSkge1xyXG4gICAgICAgIGNscyA9ICh0aGlzLnNvcnRPcmRlcltpXS5kaXJlY3Rpb24gPT0gJ2FzYycpID8gdGhpcy5jc3MuYXNjZW5kaW5nSWNvbiA6IHRoaXMuY3NzLmRlc2NlbmRpbmdJY29uXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBjbHM7XHJcbiAgICB9LFxyXG4gICAgc29ydEljb25PcGFjaXR5IChmaWVsZCkge1xyXG4gICAgICAvKlxyXG4gICAgICAgKiBmaWVsZHMgd2l0aCBzdHJvbmdlciBwcmVjZWRlbmNlIGhhdmUgZGFya2VyIGNvbG9yXHJcbiAgICAgICAqXHJcbiAgICAgICAqIGlmIHRoZXJlIGFyZSBmZXcgZmllbGRzLCB3ZSBnbyBkb3duIGJ5IDAuM1xyXG4gICAgICAgKiBleC4gMiBmaWVsZHMgYXJlIHNlbGVjdGVkOiAxLjAsIDAuN1xyXG4gICAgICAgKlxyXG4gICAgICAgKiBpZiB0aGVyZSBhcmUgbW9yZSB3ZSBnbyBkb3duIGV2ZW5seSBvbiB0aGUgZ2l2ZW4gc3BlY3RydW1cclxuICAgICAgICogZXguIDYgZmllbGRzIGFyZSBzZWxlY3RlZDogMS4wLCAwLjg2LCAwLjcyLCAwLjU4LCAwLjQ0LCAwLjNcclxuICAgICAgICovXHJcbiAgICAgIGxldCBtYXggPSAxLjAsXHJcbiAgICAgICAgICBtaW4gPSAwLjMsXHJcbiAgICAgICAgICBzdGVwID0gMC4zXHJcblxyXG4gICAgICBsZXQgY291bnQgPSB0aGlzLnNvcnRPcmRlci5sZW5ndGg7XHJcbiAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5jdXJyZW50U29ydE9yZGVyUG9zaXRpb24oZmllbGQpXHJcblxyXG5cclxuICAgICAgaWYobWF4IC0gY291bnQgKiBzdGVwIDwgbWluKSB7XHJcbiAgICAgICAgc3RlcCA9IChtYXggLSBtaW4pIC8gKGNvdW50LTEpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBvcGFjaXR5ID0gbWF4IC0gY3VycmVudCAqIHN0ZXBcclxuXHJcbiAgICAgIHJldHVybiBvcGFjaXR5XHJcbiAgICB9LFxyXG4gICAgaGFzQ2FsbGJhY2sgKGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGl0ZW0uY2FsbGJhY2sgPyB0cnVlIDogZmFsc2VcclxuICAgIH0sXHJcbiAgICBjYWxsQ2FsbGJhY2sgKGZpZWxkLCBpdGVtKSB7XHJcbiAgICAgIGlmICggISB0aGlzLmhhc0NhbGxiYWNrKGZpZWxkKSkgcmV0dXJuXHJcblxyXG4gICAgICBpZih0eXBlb2YoZmllbGQuY2FsbGJhY2spID09ICdmdW5jdGlvbicpIHtcclxuICAgICAgIHJldHVybiBmaWVsZC5jYWxsYmFjayh0aGlzLmdldE9iamVjdFZhbHVlKGl0ZW0sIGZpZWxkLm5hbWUpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgYXJncyA9IGZpZWxkLmNhbGxiYWNrLnNwbGl0KCd8JylcclxuICAgICAgbGV0IGZ1bmMgPSBhcmdzLnNoaWZ0KClcclxuXHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy4kcGFyZW50W2Z1bmNdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXRPYmplY3RWYWx1ZShpdGVtLCBmaWVsZC5uYW1lKVxyXG5cclxuICAgICAgICByZXR1cm4gKGFyZ3MubGVuZ3RoID4gMClcclxuICAgICAgICAgID8gdGhpcy4kcGFyZW50W2Z1bmNdLmFwcGx5KHRoaXMuJHBhcmVudCwgW3ZhbHVlXS5jb25jYXQoYXJncykpXHJcbiAgICAgICAgICA6IHRoaXMuJHBhcmVudFtmdW5jXS5jYWxsKHRoaXMuJHBhcmVudCwgdmFsdWUpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9LFxyXG4gICAgZ2V0T2JqZWN0VmFsdWUgKG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICh0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAndW5kZWZpbmVkJykgPyBudWxsIDogZGVmYXVsdFZhbHVlXHJcblxyXG4gICAgICBsZXQgb2JqID0gb2JqZWN0XHJcbiAgICAgIGlmIChwYXRoLnRyaW0oKSAhPSAnJykge1xyXG4gICAgICAgIGxldCBrZXlzID0gcGF0aC5zcGxpdCgnLicpXHJcbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xyXG4gICAgICAgICAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqW2tleV0gIT09ICd1bmRlZmluZWQnICYmIG9ialtrZXldICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9iaiA9IG9ialtrZXldXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvYmogPSBkZWZhdWx0VmFsdWVcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2JqXHJcbiAgICB9LFxyXG4gICAgdG9nZ2xlQ2hlY2tib3ggKGRhdGFJdGVtLCBmaWVsZE5hbWUsIGV2ZW50KSB7XHJcbiAgICAgIGxldCBpc0NoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZFxyXG4gICAgICBsZXQgaWRDb2x1bW4gPSB0aGlzLnRyYWNrQnlcclxuXHJcbiAgICAgIGlmIChkYXRhSXRlbVtpZENvbHVtbl0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMud2FybignX19jaGVja2JveCBmaWVsZDogVGhlIFwiJyt0aGlzLnRyYWNrQnkrJ1wiIGZpZWxkIGRvZXMgbm90IGV4aXN0ISBNYWtlIHN1cmUgdGhlIGZpZWxkIHlvdSBzcGVjaWZ5IGluIFwidHJhY2stYnlcIiBwcm9wIGRvZXMgZXhpc3QuJylcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGtleSA9IGRhdGFJdGVtW2lkQ29sdW1uXVxyXG4gICAgICBpZiAoaXNDaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RJZChrZXkpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51bnNlbGVjdElkKGtleSlcclxuICAgICAgfVxyXG4gICAgICB0aGlzLiRlbWl0KCd2dWV0YWJsZTpjaGVja2JveC10b2dnbGVkJywgaXNDaGVja2VkLCBkYXRhSXRlbSlcclxuICAgIH0sXHJcbiAgICBzZWxlY3RJZCAoa2V5KSB7XHJcbiAgICAgIGlmICggISB0aGlzLmlzU2VsZWN0ZWRSb3coa2V5KSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUby5wdXNoKGtleSlcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHVuc2VsZWN0SWQgKGtleSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVG8gPSB0aGlzLnNlbGVjdGVkVG8uZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gaXRlbSAhPT0ga2V5XHJcbiAgICAgIH0pXHJcbiAgICB9LFxyXG4gICAgaXNTZWxlY3RlZFJvdyAoa2V5KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVG8uaW5kZXhPZihrZXkpID49IDBcclxuICAgIH0sXHJcbiAgICByb3dTZWxlY3RlZCAoZGF0YUl0ZW0sIGZpZWxkTmFtZSl7XHJcbiAgICAgIGxldCBpZENvbHVtbiA9IHRoaXMudHJhY2tCeVxyXG4gICAgICBsZXQga2V5ID0gZGF0YUl0ZW1baWRDb2x1bW5dXHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5pc1NlbGVjdGVkUm93KGtleSlcclxuICAgIH0sXHJcbiAgICBjaGVja0NoZWNrYm94ZXNTdGF0ZSAoZmllbGROYW1lKSB7XHJcbiAgICAgIGlmICghIHRoaXMudGFibGVEYXRhKSByZXR1cm5cclxuXHJcbiAgICAgIGxldCBzZWxmID0gdGhpc1xyXG4gICAgICBsZXQgaWRDb2x1bW4gPSB0aGlzLnRyYWNrQnlcclxuICAgICAgbGV0IHNlbGVjdG9yID0gJ3RoLnZ1ZXRhYmxlLXRoLWNoZWNrYm94LScgKyBpZENvbHVtbiArICcgaW5wdXRbdHlwZT1jaGVja2JveF0nXHJcbiAgICAgIGxldCBlbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxyXG5cclxuICAgICAgLy9maXhlZDpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsIHJldHVybiB0aGUgdHlwZW9mIG5vZGVMaXN0IG5vdCBhcnJheVxyXG4gICAgICBpZiAoZWxzLmZvckVhY2g9PT11bmRlZmluZWQpXHJcbiAgICAgICAgZWxzLmZvckVhY2g9ZnVuY3Rpb24oY2Ipe1xyXG4gICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGVscywgY2IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNvdW50IGhvdyBtYW55IGNoZWNrYm94IHJvdyBpbiB0aGUgY3VycmVudCBwYWdlIGhhcyBiZWVuIGNoZWNrZWRcclxuICAgICAgbGV0IHNlbGVjdGVkID0gdGhpcy50YWJsZURhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gc2VsZi5zZWxlY3RlZFRvLmluZGV4T2YoaXRlbVtpZENvbHVtbl0pID49IDBcclxuICAgICAgfSlcclxuXHJcbiAgICAgIC8vIGNvdW50ID09IDAsIGNsZWFyIHRoZSBjaGVja2JveFxyXG4gICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoIDw9IDApIHtcclxuICAgICAgICBlbHMuZm9yRWFjaChmdW5jdGlvbihlbCkge1xyXG4gICAgICAgICAgZWwuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgfVxyXG4gICAgICAvLyBjb3VudCA+IDAgYW5kIGNvdW50IDwgcGVyUGFnZSwgc2V0IGNoZWNrYm94IHN0YXRlIHRvICdpbmRldGVybWluYXRlJ1xyXG4gICAgICBlbHNlIGlmIChzZWxlY3RlZC5sZW5ndGggPCB0aGlzLnBlclBhZ2UpIHtcclxuICAgICAgICBlbHMuZm9yRWFjaChmdW5jdGlvbihlbCkge1xyXG4gICAgICAgICAgZWwuaW5kZXRlcm1pbmF0ZSA9IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgIH1cclxuICAgICAgLy8gY291bnQgPT0gcGVyUGFnZSwgc2V0IGNoZWNrYm94IHN0YXRlIHRvICdjaGVja2VkJ1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBlbHMuZm9yRWFjaChmdW5jdGlvbihlbCkge1xyXG4gICAgICAgICAgZWwuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgdG9nZ2xlQWxsQ2hlY2tib3hlcyAoZmllbGROYW1lLCBldmVudCkge1xyXG4gICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgbGV0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkXHJcbiAgICAgIGxldCBpZENvbHVtbiA9IHRoaXMudHJhY2tCeVxyXG5cclxuICAgICAgaWYgKGlzQ2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMudGFibGVEYXRhLmZvckVhY2goZnVuY3Rpb24oZGF0YUl0ZW0pIHtcclxuICAgICAgICAgIHNlbGYuc2VsZWN0SWQoZGF0YUl0ZW1baWRDb2x1bW5dKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50YWJsZURhdGEuZm9yRWFjaChmdW5jdGlvbihkYXRhSXRlbSkge1xyXG4gICAgICAgICAgc2VsZi51bnNlbGVjdElkKGRhdGFJdGVtW2lkQ29sdW1uXSlcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuJGVtaXQoJ3Z1ZXRhYmxlOmNoZWNrYm94LXRvZ2dsZWQtYWxsJywgaXNDaGVja2VkKVxyXG4gICAgfSxcclxuICAgIGdvdG9QcmV2aW91c1BhZ2UgKCkge1xyXG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA+IDEpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlLS1cclxuICAgICAgICB0aGlzLmxvYWREYXRhKClcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGdvdG9OZXh0UGFnZSAoKSB7XHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlIDwgdGhpcy50YWJsZVBhZ2luYXRpb24ubGFzdF9wYWdlKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSsrXHJcbiAgICAgICAgdGhpcy5sb2FkRGF0YSgpXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBnb3RvUGFnZSAocGFnZSkge1xyXG4gICAgICBpZiAocGFnZSAhPSB0aGlzLmN1cnJlbnRQYWdlICYmIChwYWdlID4gMCAmJiBwYWdlIDw9IHRoaXMudGFibGVQYWdpbmF0aW9uLmxhc3RfcGFnZSkpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZVxyXG4gICAgICAgIHRoaXMubG9hZERhdGEoKVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgaXNWaXNpYmxlRGV0YWlsUm93IChyb3dJZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy52aXNpYmxlRGV0YWlsUm93cy5pbmRleE9mKCByb3dJZCApID49IDBcclxuICAgIH0sXHJcbiAgICBzaG93RGV0YWlsUm93IChyb3dJZCkge1xyXG4gICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlRGV0YWlsUm93KHJvd0lkKSkge1xyXG4gICAgICAgIHRoaXMudmlzaWJsZURldGFpbFJvd3MucHVzaChyb3dJZClcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGhpZGVEZXRhaWxSb3cgKHJvd0lkKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZURldGFpbFJvdyhyb3dJZCkpIHtcclxuICAgICAgICB0aGlzLnZpc2libGVEZXRhaWxSb3dzLnNwbGljZShcclxuICAgICAgICAgIHRoaXMudmlzaWJsZURldGFpbFJvd3MuaW5kZXhPZihyb3dJZCksXHJcbiAgICAgICAgICAxXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgdG9nZ2xlRGV0YWlsUm93IChyb3dJZCkge1xyXG4gICAgICBpZiAodGhpcy5pc1Zpc2libGVEZXRhaWxSb3cocm93SWQpKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlRGV0YWlsUm93KHJvd0lkKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2hvd0RldGFpbFJvdyhyb3dJZClcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHNob3dGaWVsZCAoaW5kZXgpIHtcclxuICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRoaXMudGFibGVGaWVsZHMubGVuZ3RoKSByZXR1cm5cclxuXHJcbiAgICAgIHRoaXMudGFibGVGaWVsZHNbaW5kZXhdLnZpc2libGUgPSB0cnVlXHJcbiAgICB9LFxyXG4gICAgaGlkZUZpZWxkIChpbmRleCkge1xyXG4gICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGhpcy50YWJsZUZpZWxkcy5sZW5ndGgpIHJldHVyblxyXG5cclxuICAgICAgdGhpcy50YWJsZUZpZWxkc1tpbmRleF0udmlzaWJsZSA9IGZhbHNlXHJcbiAgICB9LFxyXG4gICAgdG9nZ2xlRmllbGQgKGluZGV4KSB7XHJcbiAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLnRhYmxlRmllbGRzLmxlbmd0aCkgcmV0dXJuXHJcblxyXG4gICAgICB0aGlzLnRhYmxlRmllbGRzW2luZGV4XS52aXNpYmxlID0gISB0aGlzLnRhYmxlRmllbGRzW2luZGV4XS52aXNpYmxlXHJcbiAgICB9LFxyXG4gICAgcmVuZGVySWNvblRhZyAoY2xhc3Nlcywgb3B0aW9ucyA9ICcnKSB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YodGhpcy5jc3MucmVuZGVySWNvbikgPT09ICd1bmRlZmluZWQnXHJcbiAgICAgICAgPyBgPGkgY2xhc3M9XCIke2NsYXNzZXMuam9pbignICcpfVwiICR7b3B0aW9uc30+PC9pPmBcclxuICAgICAgICA6IHRoaXMuY3NzLnJlbmRlckljb24oY2xhc3Nlcywgb3B0aW9ucylcclxuICAgIH0sXHJcbiAgICBtYWtlUGFnaW5hdGlvbiAodG90YWwgPSBudWxsLCBwZXJQYWdlID0gbnVsbCwgY3VycmVudFBhZ2UgPSBudWxsKSB7XHJcbiAgICAgIGxldCBwYWdpbmF0aW9uID0ge31cclxuICAgICAgdG90YWwgPSB0b3RhbCA9PT0gbnVsbCA/IHRoaXMuZGF0YVRvdGFsIDogdG90YWxcclxuICAgICAgcGVyUGFnZSA9IHBlclBhZ2UgPT09IG51bGwgPyB0aGlzLnBlclBhZ2UgOiBwZXJQYWdlXHJcbiAgICAgIGN1cnJlbnRQYWdlID0gY3VycmVudFBhZ2UgPT09IG51bGwgPyB0aGlzLmN1cnJlbnRQYWdlIDogY3VycmVudFBhZ2VcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgJ3RvdGFsJzogdG90YWwsXHJcbiAgICAgICAgJ3Blcl9wYWdlJzogcGVyUGFnZSxcclxuICAgICAgICAnY3VycmVudF9wYWdlJzogY3VycmVudFBhZ2UsXHJcbiAgICAgICAgJ2xhc3RfcGFnZSc6IE1hdGguY2VpbCh0b3RhbCAvIHBlclBhZ2UpIHx8IDAsXHJcbiAgICAgICAgJ25leHRfcGFnZV91cmwnOiAnJyxcclxuICAgICAgICAncHJldl9wYWdlX3VybCc6ICcnLFxyXG4gICAgICAgICdmcm9tJzogKGN1cnJlbnRQYWdlIC0xKSAqIHBlclBhZ2UgKzEsXHJcbiAgICAgICAgJ3RvJzogTWF0aC5taW4oY3VycmVudFBhZ2UgKiBwZXJQYWdlLCB0b3RhbClcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG5vcm1hbGl6ZVNvcnRPcmRlciAoKSB7XHJcbiAgICAgIHRoaXMuc29ydE9yZGVyLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgICAgIGl0ZW0uc29ydEZpZWxkID0gaXRlbS5zb3J0RmllbGQgfHwgaXRlbS5maWVsZFxyXG4gICAgICB9KVxyXG4gICAgfSxcclxuICAgIGNhbGxEYXRhTWFuYWdlciAoKSB7XHJcbiAgICAgIGlmICh0aGlzLmRhdGFNYW5hZ2VyID09PSBudWxsICYmIHRoaXMuZGF0YSA9PT0gbnVsbCkgcmV0dXJuXHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RGF0YSh0aGlzLmRhdGEpXHJcbiAgICAgIH0gXHJcbiAgICAgIFxyXG4gICAgICB0aGlzLm5vcm1hbGl6ZVNvcnRPcmRlcigpXHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5zZXREYXRhKFxyXG4gICAgICAgIHRoaXMuZGF0YU1hbmFnZXJcclxuICAgICAgICAgID8gdGhpcy5kYXRhTWFuYWdlcih0aGlzLnNvcnRPcmRlciwgdGhpcy5tYWtlUGFnaW5hdGlvbigpKVxyXG4gICAgICAgICAgOiB0aGlzLmRhdGFcclxuICAgICAgKVxyXG4gICAgfSxcclxuICAgIG9uUm93Q2xhc3MgKGRhdGFJdGVtLCBpbmRleCkge1xyXG4gICAgICBpZiAodGhpcy5yb3dDbGFzc0NhbGxiYWNrICE9PSAnJykge1xyXG4gICAgICAgIHRoaXMud2FybignXCJyb3ctY2xhc3MtY2FsbGJhY2tcIiBwcm9wIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgXCJyb3ctY2xhc3NcIiBwcm9wIGluc3RlYWQuJylcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHR5cGVvZih0aGlzLnJvd0NsYXNzKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd0NsYXNzKGRhdGFJdGVtLCBpbmRleClcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMucm93Q2xhc3NcclxuICAgIH0sXHJcbiAgICBvblJvd0NoYW5nZWQgKGRhdGFJdGVtKSB7XHJcbiAgICAgIHRoaXMuZmlyZUV2ZW50KCdyb3ctY2hhbmdlZCcsIGRhdGFJdGVtKVxyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfSxcclxuICAgIG9uUm93Q2xpY2tlZCAoZGF0YUl0ZW0sIGV2ZW50KSB7XHJcbiAgICAgIHRoaXMuJGVtaXQodGhpcy5ldmVudFByZWZpeCArICdyb3ctY2xpY2tlZCcsIGRhdGFJdGVtLCBldmVudClcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH0sXHJcbiAgICBvblJvd0RvdWJsZUNsaWNrZWQgKGRhdGFJdGVtLCBldmVudCkge1xyXG4gICAgICB0aGlzLiRlbWl0KHRoaXMuZXZlbnRQcmVmaXggKyAncm93LWRibGNsaWNrZWQnLCBkYXRhSXRlbSwgZXZlbnQpXHJcbiAgICB9LFxyXG4gICAgb25EZXRhaWxSb3dDbGljayAoZGF0YUl0ZW0sIGV2ZW50KSB7XHJcbiAgICAgIHRoaXMuJGVtaXQodGhpcy5ldmVudFByZWZpeCArICdkZXRhaWwtcm93LWNsaWNrZWQnLCBkYXRhSXRlbSwgZXZlbnQpXHJcbiAgICB9LFxyXG4gICAgb25DZWxsQ2xpY2tlZCAoZGF0YUl0ZW0sIGZpZWxkLCBldmVudCkge1xyXG4gICAgICB0aGlzLiRlbWl0KHRoaXMuZXZlbnRQcmVmaXggKyAnY2VsbC1jbGlja2VkJywgZGF0YUl0ZW0sIGZpZWxkLCBldmVudClcclxuICAgIH0sXHJcbiAgICBvbkNlbGxEb3VibGVDbGlja2VkIChkYXRhSXRlbSwgZmllbGQsIGV2ZW50KSB7XHJcbiAgICAgIHRoaXMuJGVtaXQodGhpcy5ldmVudFByZWZpeCArICdjZWxsLWRibGNsaWNrZWQnLCBkYXRhSXRlbSwgZmllbGQsIGV2ZW50KVxyXG4gICAgfSxcclxuICAgIG9uQ2VsbFJpZ2h0Q2xpY2tlZCAoZGF0YUl0ZW0sIGZpZWxkLCBldmVudCkge1xyXG4gICAgICB0aGlzLiRlbWl0KHRoaXMuZXZlbnRQcmVmaXggKyAnY2VsbC1yaWdodGNsaWNrZWQnLCBkYXRhSXRlbSwgZmllbGQsIGV2ZW50KVxyXG4gICAgfSxcclxuICAgIC8qXHJcbiAgICAgKiBBUEkgZm9yIGV4dGVybmFsc1xyXG4gICAgICovXHJcbiAgICBjaGFuZ2VQYWdlIChwYWdlKSB7XHJcbiAgICAgIGlmIChwYWdlID09PSAncHJldicpIHtcclxuICAgICAgICB0aGlzLmdvdG9QcmV2aW91c1BhZ2UoKVxyXG4gICAgICB9IGVsc2UgaWYgKHBhZ2UgPT09ICduZXh0Jykge1xyXG4gICAgICAgIHRoaXMuZ290b05leHRQYWdlKClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmdvdG9QYWdlKHBhZ2UpXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICByZWxvYWQgKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5sb2FkRGF0YSgpXHJcbiAgICB9LFxyXG4gICAgcmVmcmVzaCAoKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxXHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWREYXRhKClcclxuICAgIH0sXHJcbiAgICByZXNldERhdGEgKCkge1xyXG4gICAgICB0aGlzLnRhYmxlRGF0YSA9IG51bGxcclxuICAgICAgdGhpcy50YWJsZVBhZ2luYXRpb24gPSBudWxsXHJcbiAgICAgIHRoaXMuZmlyZUV2ZW50KCdkYXRhLXJlc2V0JylcclxuICAgIH1cclxuICB9LCAvLyBlbmQ6IG1ldGhvZHNcclxuICB3YXRjaDoge1xyXG4gICAgJ211bHRpU29ydCcgKG5ld1ZhbCwgb2xkVmFsKSB7XHJcbiAgICAgIGlmIChuZXdWYWwgPT09IGZhbHNlICYmIHRoaXMuc29ydE9yZGVyLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICB0aGlzLnNvcnRPcmRlci5zcGxpY2UoMSk7XHJcbiAgICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgJ2FwaVVybCcgIChuZXdWYWwsIG9sZFZhbCkge1xyXG4gICAgICBpZih0aGlzLnJlYWN0aXZlQXBpVXJsICYmIG5ld1ZhbCAhPT0gb2xkVmFsKVxyXG4gICAgICAgIHRoaXMucmVmcmVzaCgpXHJcbiAgICB9LFxyXG4gICAgJ2RhdGEnIChuZXdWYWwsIG9sZFZhbCkge1xyXG4gICAgICB0aGlzLnNldERhdGEobmV3VmFsKVxyXG4gICAgfSxcclxuICAgICd0YWJsZUhlaWdodCcgKG5ld1ZhbCwgb2xkVmFsKSB7XHJcbiAgICAgIHRoaXMuZml4SGVhZGVyKClcclxuICAgIH1cclxuICB9LFxyXG59XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIHNjb3BlZD5cclxuICBbdi1jbG9ha10ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcbiAgLnZ1ZXRhYmxlIHRoLnNvcnRhYmxlOmhvdmVyIHtcclxuICAgIGNvbG9yOiAjMjE4NWQwO1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIH1cclxuICAudnVldGFibGUtYm9keS13cmFwcGVyIHtcclxuICAgIHBvc2l0aW9uOnJlbGF0aXZlO1xyXG4gICAgb3ZlcmZsb3cteTphdXRvO1xyXG4gIH1cclxuICAudnVldGFibGUtaGVhZC13cmFwcGVyIHtcclxuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcclxuICB9XHJcbiAgLnZ1ZXRhYmxlLWFjdGlvbnMge1xyXG4gICAgd2lkdGg6IDE1JTtcclxuICAgIHBhZGRpbmc6IDEycHggMHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIH1cclxuICAudnVldGFibGUtcGFnaW5hdGlvbiB7XHJcbiAgICBiYWNrZ3JvdW5kOiAjZjlmYWZiICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG4gIC52dWV0YWJsZS1wYWdpbmF0aW9uLWluZm8ge1xyXG4gICAgbWFyZ2luLXRvcDogYXV0bztcclxuICAgIG1hcmdpbi1ib3R0b206IGF1dG87XHJcbiAgfVxyXG4gIC52dWV0YWJsZS1lbXB0eS1yZXN1bHQge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIH1cclxuICAudnVldGFibGUtY2xpcC10ZXh0IHtcclxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcclxuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gIH1cclxuICAudnVldGFibGUtc2VtYW50aWMtbm8tdG9wIHtcclxuICAgIGJvcmRlci10b3A6bm9uZSAhaW1wb3J0YW50O1xyXG4gICAgbWFyZ2luLXRvcDowICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG4gIC52dWV0YWJsZS1maXhlZC1sYXlvdXQge1xyXG4gICAgdGFibGUtbGF5b3V0OiBmaXhlZDtcclxuICB9XHJcbiAgLnZ1ZXRhYmxlLWd1dHRlci1jb2wge1xyXG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xyXG4gICAgYm9yZGVyLWxlZnQ6IG5vbmUgICFpbXBvcnRhbnQ7XHJcbiAgICBib3JkZXItcmlnaHQ6IG5vbmUgICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNFswXS5ydWxlc1swXSEuLi8uLi8uLi92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vVnVldGFibGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNFswXS5ydWxlc1swXSEuLi8uLi8uLi92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vVnVldGFibGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiIiwiLyogZ2xvYmFscyBfX1ZVRV9TU1JfQ09OVEVYVF9fICovXG5cbi8vIElNUE9SVEFOVDogRG8gTk9UIHVzZSBFUzIwMTUgZmVhdHVyZXMgaW4gdGhpcyBmaWxlIChleGNlcHQgZm9yIG1vZHVsZXMpLlxuLy8gVGhpcyBtb2R1bGUgaXMgYSBydW50aW1lIHV0aWxpdHkgZm9yIGNsZWFuZXIgY29tcG9uZW50IG1vZHVsZSBvdXRwdXQgYW5kIHdpbGxcbi8vIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCB3ZWJwYWNrIHVzZXIgYnVuZGxlLlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub3JtYWxpemVDb21wb25lbnQgKFxuICBzY3JpcHRFeHBvcnRzLFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZnVuY3Rpb25hbFRlbXBsYXRlLFxuICBpbmplY3RTdHlsZXMsXG4gIHNjb3BlSWQsXG4gIG1vZHVsZUlkZW50aWZpZXIsIC8qIHNlcnZlciBvbmx5ICovXG4gIHNoYWRvd01vZGUgLyogdnVlLWNsaSBvbmx5ICovXG4pIHtcbiAgLy8gVnVlLmV4dGVuZCBjb25zdHJ1Y3RvciBleHBvcnQgaW50ZXJvcFxuICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nXG4gICAgPyBzY3JpcHRFeHBvcnRzLm9wdGlvbnNcbiAgICA6IHNjcmlwdEV4cG9ydHNcblxuICAvLyByZW5kZXIgZnVuY3Rpb25zXG4gIGlmIChyZW5kZXIpIHtcbiAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlclxuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gc3RhdGljUmVuZGVyRm5zXG4gICAgb3B0aW9ucy5fY29tcGlsZWQgPSB0cnVlXG4gIH1cblxuICAvLyBmdW5jdGlvbmFsIHRlbXBsYXRlXG4gIGlmIChmdW5jdGlvbmFsVGVtcGxhdGUpIHtcbiAgICBvcHRpb25zLmZ1bmN0aW9uYWwgPSB0cnVlXG4gIH1cblxuICAvLyBzY29wZWRJZFxuICBpZiAoc2NvcGVJZCkge1xuICAgIG9wdGlvbnMuX3Njb3BlSWQgPSAnZGF0YS12LScgKyBzY29wZUlkXG4gIH1cblxuICB2YXIgaG9va1xuICBpZiAobW9kdWxlSWRlbnRpZmllcikgeyAvLyBzZXJ2ZXIgYnVpbGRcbiAgICBob29rID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIC8vIDIuMyBpbmplY3Rpb25cbiAgICAgIGNvbnRleHQgPVxuICAgICAgICBjb250ZXh0IHx8IC8vIGNhY2hlZCBjYWxsXG4gICAgICAgICh0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0KSB8fCAvLyBzdGF0ZWZ1bFxuICAgICAgICAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuJHZub2RlICYmIHRoaXMucGFyZW50LiR2bm9kZS5zc3JDb250ZXh0KSAvLyBmdW5jdGlvbmFsXG4gICAgICAvLyAyLjIgd2l0aCBydW5Jbk5ld0NvbnRleHQ6IHRydWVcbiAgICAgIGlmICghY29udGV4dCAmJiB0eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfXyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29udGV4dCA9IF9fVlVFX1NTUl9DT05URVhUX19cbiAgICAgIH1cbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgc3R5bGVzXG4gICAgICBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgICAgIGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIGNvbnRleHQpXG4gICAgICB9XG4gICAgICAvLyByZWdpc3RlciBjb21wb25lbnQgbW9kdWxlIGlkZW50aWZpZXIgZm9yIGFzeW5jIGNodW5rIGluZmVycmVuY2VcbiAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzKSB7XG4gICAgICAgIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzLmFkZChtb2R1bGVJZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB1c2VkIGJ5IHNzciBpbiBjYXNlIGNvbXBvbmVudCBpcyBjYWNoZWQgYW5kIGJlZm9yZUNyZWF0ZVxuICAgIC8vIG5ldmVyIGdldHMgY2FsbGVkXG4gICAgb3B0aW9ucy5fc3NyUmVnaXN0ZXIgPSBob29rXG4gIH0gZWxzZSBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgaG9vayA9IHNoYWRvd01vZGVcbiAgICAgID8gZnVuY3Rpb24gKCkge1xuICAgICAgICBpbmplY3RTdHlsZXMuY2FsbChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIChvcHRpb25zLmZ1bmN0aW9uYWwgPyB0aGlzLnBhcmVudCA6IHRoaXMpLiRyb290LiRvcHRpb25zLnNoYWRvd1Jvb3RcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgOiBpbmplY3RTdHlsZXNcbiAgfVxuXG4gIGlmIChob29rKSB7XG4gICAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgICAgLy8gZm9yIHRlbXBsYXRlLW9ubHkgaG90LXJlbG9hZCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgcmVuZGVyIGZuIGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRocm91Z2ggdGhlIG5vcm1hbGl6ZXJcbiAgICAgIG9wdGlvbnMuX2luamVjdFN0eWxlcyA9IGhvb2tcbiAgICAgIC8vIHJlZ2lzdGVyIGZvciBmdW5jdGlvbmFsIGNvbXBvbmVudCBpbiB2dWUgZmlsZVxuICAgICAgdmFyIG9yaWdpbmFsUmVuZGVyID0gb3B0aW9ucy5yZW5kZXJcbiAgICAgIG9wdGlvbnMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyV2l0aFN0eWxlSW5qZWN0aW9uIChoLCBjb250ZXh0KSB7XG4gICAgICAgIGhvb2suY2FsbChjb250ZXh0KVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxSZW5kZXIoaCwgY29udGV4dClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCByZWdpc3RyYXRpb24gYXMgYmVmb3JlQ3JlYXRlIGhvb2tcbiAgICAgIHZhciBleGlzdGluZyA9IG9wdGlvbnMuYmVmb3JlQ3JlYXRlXG4gICAgICBvcHRpb25zLmJlZm9yZUNyZWF0ZSA9IGV4aXN0aW5nXG4gICAgICAgID8gW10uY29uY2F0KGV4aXN0aW5nLCBob29rKVxuICAgICAgICA6IFtob29rXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXhwb3J0czogc2NyaXB0RXhwb3J0cyxcbiAgICBvcHRpb25zOiBvcHRpb25zXG4gIH1cbn1cbiIsImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vVnVldGFibGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE1OTY1ZTNiJnNjb3BlZD10cnVlJlwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL1Z1ZXRhYmxlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuZXhwb3J0ICogZnJvbSBcIi4vVnVldGFibGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5pbXBvcnQgc3R5bGUwIGZyb20gXCIuL1Z1ZXRhYmxlLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTE1OTY1ZTNiJnNjb3BlZD10cnVlJmxhbmc9Y3NzJlwiXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuaW1wb3J0IG5vcm1hbGl6ZXIgZnJvbSBcIiEuLi8uLi8uLi92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcIlxudmFyIGNvbXBvbmVudCA9IG5vcm1hbGl6ZXIoXG4gIHNjcmlwdCxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBcIjE1OTY1ZTNiXCIsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChtb2R1bGUuaG90KSB7XG4gIHZhciBhcGkgPSByZXF1aXJlKFwiL1VzZXJzL2RqYW1pbC9Qcm9qZWN0cy90cmlsYnkvX2dyYXYvZ3Jhdi1wbHVnaW4tZmxleC1vYmplY3RzL25vZGVfbW9kdWxlcy92dWUtaG90LXJlbG9hZC1hcGkvZGlzdC9pbmRleC5qc1wiKVxuICBhcGkuaW5zdGFsbChyZXF1aXJlKCd2dWUnKSlcbiAgaWYgKGFwaS5jb21wYXRpYmxlKSB7XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuICAgIGlmICghYXBpLmlzUmVjb3JkZWQoJzE1OTY1ZTNiJykpIHtcbiAgICAgIGFwaS5jcmVhdGVSZWNvcmQoJzE1OTY1ZTNiJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZWxvYWQoJzE1OTY1ZTNiJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfVxuICAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiLi9WdWV0YWJsZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MTU5NjVlM2Imc2NvcGVkPXRydWUmXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwaS5yZXJlbmRlcignMTU5NjVlM2InLCB7XG4gICAgICAgIHJlbmRlcjogcmVuZGVyLFxuICAgICAgICBzdGF0aWNSZW5kZXJGbnM6IHN0YXRpY1JlbmRlckZuc1xuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcIm5vZGVfbW9kdWxlcy92dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlLnZ1ZVwiXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyIsInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgIHZhbHVlOiBfdm0udGFibGVQYWdpbmF0aW9uICYmIF92bS50YWJsZVBhZ2luYXRpb24ubGFzdF9wYWdlID4gMSxcbiAgICAgICAgICBleHByZXNzaW9uOiBcInRhYmxlUGFnaW5hdGlvbiAmJiB0YWJsZVBhZ2luYXRpb24ubGFzdF9wYWdlID4gMVwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBjbGFzczogX3ZtLmNzcy53cmFwcGVyQ2xhc3NcbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFxuICAgICAgICBcImFcIixcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICBcImJ0bi1uYXZcIixcbiAgICAgICAgICAgIF92bS5jc3MubGlua0NsYXNzLFxuICAgICAgICAgICAgX3ZtLmlzT25GaXJzdFBhZ2UgPyBfdm0uY3NzLmRpc2FibGVkQ2xhc3MgOiBcIlwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3ZtLmxvYWRQYWdlKDEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX3ZtLmNzcy5pY29ucy5maXJzdCAhPSBcIlwiXG4gICAgICAgICAgICA/IF9jKFwiaVwiLCB7IGNsYXNzOiBbX3ZtLmNzcy5pY29ucy5maXJzdF0gfSlcbiAgICAgICAgICAgIDogX2MoXCJzcGFuXCIsIFtfdm0uX3YoXCLCq1wiKV0pXG4gICAgICAgIF1cbiAgICAgICksXG4gICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgX2MoXG4gICAgICAgIFwiYVwiLFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgIFwiYnRuLW5hdlwiLFxuICAgICAgICAgICAgX3ZtLmNzcy5saW5rQ2xhc3MsXG4gICAgICAgICAgICBfdm0uaXNPbkZpcnN0UGFnZSA/IF92bS5jc3MuZGlzYWJsZWRDbGFzcyA6IFwiXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdm0ubG9hZFBhZ2UoXCJwcmV2XCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX3ZtLmNzcy5pY29ucy5uZXh0ICE9IFwiXCJcbiAgICAgICAgICAgID8gX2MoXCJpXCIsIHsgY2xhc3M6IFtfdm0uY3NzLmljb25zLnByZXZdIH0pXG4gICAgICAgICAgICA6IF9jKFwic3BhblwiLCBbX3ZtLl92KFwiwqDigLlcIildKVxuICAgICAgICBdXG4gICAgICApLFxuICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgIF92bS5ub3RFbm91Z2hQYWdlc1xuICAgICAgICA/IFtcbiAgICAgICAgICAgIF92bS5fbChfdm0udG90YWxQYWdlLCBmdW5jdGlvbihuKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgX2MoXCJhXCIsIHtcbiAgICAgICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5jc3MucGFnZUNsYXNzLFxuICAgICAgICAgICAgICAgICAgICBfdm0uaXNDdXJyZW50UGFnZShuKSA/IF92bS5jc3MuYWN0aXZlQ2xhc3MgOiBcIlwiXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHsgaW5uZXJIVE1MOiBfdm0uX3MobikgfSxcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLmxvYWRQYWdlKG4pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXG4gICAgICAgICAgICBfdm0uX2woX3ZtLndpbmRvd1NpemUsIGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBfYyhcImFcIiwge1xuICAgICAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmNzcy5wYWdlQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgIF92bS5pc0N1cnJlbnRQYWdlKF92bS53aW5kb3dTdGFydCArIG4gLSAxKVxuICAgICAgICAgICAgICAgICAgICAgID8gX3ZtLmNzcy5hY3RpdmVDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIGRvbVByb3BzOiB7IGlubmVySFRNTDogX3ZtLl9zKF92bS53aW5kb3dTdGFydCArIG4gLSAxKSB9LFxuICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ubG9hZFBhZ2UoX3ZtLndpbmRvd1N0YXJ0ICsgbiAtIDEpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF0sXG4gICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgX2MoXG4gICAgICAgIFwiYVwiLFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgIFwiYnRuLW5hdlwiLFxuICAgICAgICAgICAgX3ZtLmNzcy5saW5rQ2xhc3MsXG4gICAgICAgICAgICBfdm0uaXNPbkxhc3RQYWdlID8gX3ZtLmNzcy5kaXNhYmxlZENsYXNzIDogXCJcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgb246IHtcbiAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF92bS5sb2FkUGFnZShcIm5leHRcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfdm0uY3NzLmljb25zLm5leHQgIT0gXCJcIlxuICAgICAgICAgICAgPyBfYyhcImlcIiwgeyBjbGFzczogW192bS5jc3MuaWNvbnMubmV4dF0gfSlcbiAgICAgICAgICAgIDogX2MoXCJzcGFuXCIsIFtfdm0uX3YoXCLigLrCoFwiKV0pXG4gICAgICAgIF1cbiAgICAgICksXG4gICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgX2MoXG4gICAgICAgIFwiYVwiLFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgIFwiYnRuLW5hdlwiLFxuICAgICAgICAgICAgX3ZtLmNzcy5saW5rQ2xhc3MsXG4gICAgICAgICAgICBfdm0uaXNPbkxhc3RQYWdlID8gX3ZtLmNzcy5kaXNhYmxlZENsYXNzIDogXCJcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgb246IHtcbiAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF92bS5sb2FkUGFnZShfdm0udG90YWxQYWdlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF92bS5jc3MuaWNvbnMubGFzdCAhPSBcIlwiXG4gICAgICAgICAgICA/IF9jKFwiaVwiLCB7IGNsYXNzOiBbX3ZtLmNzcy5pY29ucy5sYXN0XSB9KVxuICAgICAgICAgICAgOiBfYyhcInNwYW5cIiwgW192bS5fdihcIsK7XCIpXSlcbiAgICAgICAgXVxuICAgICAgKVxuICAgIF0sXG4gICAgMlxuICApXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cbnJlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5leHBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IiwiPHNjcmlwdD5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIHByb3BzOiB7XHJcbiAgICBjc3M6IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICBkZWZhdWx0ICgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgd3JhcHBlckNsYXNzOiAndWkgcmlnaHQgZmxvYXRlZCBwYWdpbmF0aW9uIG1lbnUnLFxyXG4gICAgICAgICAgYWN0aXZlQ2xhc3M6ICdhY3RpdmUgbGFyZ2UnLFxyXG4gICAgICAgICAgZGlzYWJsZWRDbGFzczogJ2Rpc2FibGVkJyxcclxuICAgICAgICAgIHBhZ2VDbGFzczogJ2l0ZW0nLFxyXG4gICAgICAgICAgbGlua0NsYXNzOiAnaWNvbiBpdGVtJyxcclxuICAgICAgICAgIHBhZ2luYXRpb25DbGFzczogJ3VpIGJvdHRvbSBhdHRhY2hlZCBzZWdtZW50IGdyaWQnLFxyXG4gICAgICAgICAgcGFnaW5hdGlvbkluZm9DbGFzczogJ2xlZnQgZmxvYXRlZCBsZWZ0IGFsaWduZWQgc2l4IHdpZGUgY29sdW1uJyxcclxuICAgICAgICAgIGRyb3Bkb3duQ2xhc3M6ICd1aSBzZWFyY2ggZHJvcGRvd24nLFxyXG4gICAgICAgICAgaWNvbnM6IHtcclxuICAgICAgICAgICAgZmlyc3Q6ICdhbmdsZSBkb3VibGUgbGVmdCBpY29uJyxcclxuICAgICAgICAgICAgcHJldjogJ2xlZnQgY2hldnJvbiBpY29uJyxcclxuICAgICAgICAgICAgbmV4dDogJ3JpZ2h0IGNoZXZyb24gaWNvbicsXHJcbiAgICAgICAgICAgIGxhc3Q6ICdhbmdsZSBkb3VibGUgcmlnaHQgaWNvbicsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25FYWNoU2lkZToge1xyXG4gICAgICB0eXBlOiBOdW1iZXIsXHJcbiAgICAgIGRlZmF1bHQgKCkge1xyXG4gICAgICAgIHJldHVybiAyXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgfSxcclxuICBkYXRhOiBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGV2ZW50UHJlZml4OiAndnVldGFibGUtcGFnaW5hdGlvbjonLFxyXG4gICAgICB0YWJsZVBhZ2luYXRpb246IG51bGxcclxuICAgIH1cclxuICB9LFxyXG4gIGNvbXB1dGVkOiB7XHJcbiAgICB0b3RhbFBhZ2UgKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50YWJsZVBhZ2luYXRpb24gPT09IG51bGxcclxuICAgICAgICA/IDBcclxuICAgICAgICA6IHRoaXMudGFibGVQYWdpbmF0aW9uLmxhc3RfcGFnZVxyXG4gICAgfSxcclxuICAgIGlzT25GaXJzdFBhZ2UgKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50YWJsZVBhZ2luYXRpb24gPT09IG51bGxcclxuICAgICAgICA/IGZhbHNlXHJcbiAgICAgICAgOiB0aGlzLnRhYmxlUGFnaW5hdGlvbi5jdXJyZW50X3BhZ2UgPT09IDFcclxuICAgIH0sXHJcbiAgICBpc09uTGFzdFBhZ2UgKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50YWJsZVBhZ2luYXRpb24gPT09IG51bGxcclxuICAgICAgICA/IGZhbHNlXHJcbiAgICAgICAgOiB0aGlzLnRhYmxlUGFnaW5hdGlvbi5jdXJyZW50X3BhZ2UgPT09IHRoaXMudGFibGVQYWdpbmF0aW9uLmxhc3RfcGFnZVxyXG4gICAgfSxcclxuICAgIG5vdEVub3VnaFBhZ2VzICgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudG90YWxQYWdlIDwgKHRoaXMub25FYWNoU2lkZSAqIDIpICsgNFxyXG4gICAgfSxcclxuICAgIHdpbmRvd1NpemUgKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5vbkVhY2hTaWRlICogMiArMTtcclxuICAgIH0sXHJcbiAgICB3aW5kb3dTdGFydCAoKSB7XHJcbiAgICAgIGlmICghdGhpcy50YWJsZVBhZ2luYXRpb24gfHwgdGhpcy50YWJsZVBhZ2luYXRpb24uY3VycmVudF9wYWdlIDw9IHRoaXMub25FYWNoU2lkZSkge1xyXG4gICAgICAgIHJldHVybiAxXHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50YWJsZVBhZ2luYXRpb24uY3VycmVudF9wYWdlID49ICh0aGlzLnRvdGFsUGFnZSAtIHRoaXMub25FYWNoU2lkZSkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b3RhbFBhZ2UgLSB0aGlzLm9uRWFjaFNpZGUqMlxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy50YWJsZVBhZ2luYXRpb24uY3VycmVudF9wYWdlIC0gdGhpcy5vbkVhY2hTaWRlXHJcbiAgICB9LFxyXG4gIH0sXHJcbiAgbWV0aG9kczoge1xyXG4gICAgbG9hZFBhZ2UgKHBhZ2UpIHtcclxuICAgICAgdGhpcy4kZW1pdCh0aGlzLmV2ZW50UHJlZml4KydjaGFuZ2UtcGFnZScsIHBhZ2UpXHJcbiAgICB9LFxyXG4gICAgaXNDdXJyZW50UGFnZSAocGFnZSkge1xyXG4gICAgICByZXR1cm4gcGFnZSA9PT0gdGhpcy50YWJsZVBhZ2luYXRpb24uY3VycmVudF9wYWdlXHJcbiAgICB9LFxyXG4gICAgc2V0UGFnaW5hdGlvbkRhdGEgKHRhYmxlUGFnaW5hdGlvbikge1xyXG4gICAgICB0aGlzLnRhYmxlUGFnaW5hdGlvbiA9IHRhYmxlUGFnaW5hdGlvblxyXG4gICAgfSxcclxuICAgIHJlc2V0RGF0YSAoKSB7XHJcbiAgICAgIHRoaXMudGFibGVQYWdpbmF0aW9uID0gbnVsbFxyXG4gICAgfVxyXG4gIH1cclxufVxyXG48L3NjcmlwdD5cclxuIiwiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTRbMF0ucnVsZXNbMF0hLi4vLi4vLi4vdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL1Z1ZXRhYmxlUGFnaW5hdGlvbk1peGluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTRbMF0ucnVsZXNbMF0hLi4vLi4vLi4vdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL1Z1ZXRhYmxlUGFnaW5hdGlvbk1peGluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIiIsInZhciByZW5kZXIsIHN0YXRpY1JlbmRlckZuc1xuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9WdWV0YWJsZVBhZ2luYXRpb25NaXhpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL1Z1ZXRhYmxlUGFnaW5hdGlvbk1peGluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vLi4vdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKG1vZHVsZS5ob3QpIHtcbiAgdmFyIGFwaSA9IHJlcXVpcmUoXCIvVXNlcnMvZGphbWlsL1Byb2plY3RzL3RyaWxieS9fZ3Jhdi9ncmF2LXBsdWdpbi1mbGV4LW9iamVjdHMvbm9kZV9tb2R1bGVzL3Z1ZS1ob3QtcmVsb2FkLWFwaS9kaXN0L2luZGV4LmpzXCIpXG4gIGFwaS5pbnN0YWxsKHJlcXVpcmUoJ3Z1ZScpKVxuICBpZiAoYXBpLmNvbXBhdGlibGUpIHtcbiAgICBtb2R1bGUuaG90LmFjY2VwdCgpXG4gICAgaWYgKCFhcGkuaXNSZWNvcmRlZCgnNWM0YzI0MDgnKSkge1xuICAgICAgYXBpLmNyZWF0ZVJlY29yZCgnNWM0YzI0MDgnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbG9hZCgnNWM0YzI0MDgnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9XG4gICAgXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwibm9kZV9tb2R1bGVzL3Z1ZXRhYmxlLTIvc3JjL2NvbXBvbmVudHMvVnVldGFibGVQYWdpbmF0aW9uTWl4aW4udnVlXCJcbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudC5leHBvcnRzIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXYgdi1zaG93PVwidGFibGVQYWdpbmF0aW9uICYmIHRhYmxlUGFnaW5hdGlvbi5sYXN0X3BhZ2UgPiAxXCIgOmNsYXNzPVwiY3NzLndyYXBwZXJDbGFzc1wiPlxyXG4gICAgPGEgQGNsaWNrPVwibG9hZFBhZ2UoMSlcIlxyXG4gICAgICA6Y2xhc3M9XCJbJ2J0bi1uYXYnLCBjc3MubGlua0NsYXNzLCBpc09uRmlyc3RQYWdlID8gY3NzLmRpc2FibGVkQ2xhc3MgOiAnJ11cIj5cclxuICAgICAgICA8aSB2LWlmPVwiY3NzLmljb25zLmZpcnN0ICE9ICcnXCIgOmNsYXNzPVwiW2Nzcy5pY29ucy5maXJzdF1cIj48L2k+XHJcbiAgICAgICAgPHNwYW4gdi1lbHNlPiZsYXF1bzs8L3NwYW4+XHJcbiAgICA8L2E+XHJcbiAgICA8YSBAY2xpY2s9XCJsb2FkUGFnZSgncHJldicpXCJcclxuICAgICAgOmNsYXNzPVwiWydidG4tbmF2JywgY3NzLmxpbmtDbGFzcywgaXNPbkZpcnN0UGFnZSA/IGNzcy5kaXNhYmxlZENsYXNzIDogJyddXCI+XHJcbiAgICAgICAgPGkgdi1pZj1cImNzcy5pY29ucy5uZXh0ICE9ICcnXCIgOmNsYXNzPVwiW2Nzcy5pY29ucy5wcmV2XVwiPjwvaT5cclxuICAgICAgICA8c3BhbiB2LWVsc2U+Jm5ic3A7JmxzYXF1bzs8L3NwYW4+XHJcbiAgICA8L2E+XHJcbiAgICA8dGVtcGxhdGUgdi1pZj1cIm5vdEVub3VnaFBhZ2VzXCI+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIm4gaW4gdG90YWxQYWdlXCI+XHJcbiAgICAgICAgPGEgQGNsaWNrPVwibG9hZFBhZ2UobilcIlxyXG4gICAgICAgICAgOmNsYXNzPVwiW2Nzcy5wYWdlQ2xhc3MsIGlzQ3VycmVudFBhZ2UobikgPyBjc3MuYWN0aXZlQ2xhc3MgOiAnJ11cIlxyXG4gICAgICAgICAgdi1odG1sPVwiblwiPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCJuIGluIHdpbmRvd1NpemVcIj5cclxuICAgICAgICA8YSBAY2xpY2s9XCJsb2FkUGFnZSh3aW5kb3dTdGFydCtuLTEpXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltjc3MucGFnZUNsYXNzLCBpc0N1cnJlbnRQYWdlKHdpbmRvd1N0YXJ0K24tMSkgPyBjc3MuYWN0aXZlQ2xhc3MgOiAnJ11cIlxyXG4gICAgICAgICAgdi1odG1sPVwid2luZG93U3RhcnQrbi0xXCI+XHJcbiAgICAgICAgPC9hPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDxhIEBjbGljaz1cImxvYWRQYWdlKCduZXh0JylcIlxyXG4gICAgICA6Y2xhc3M9XCJbJ2J0bi1uYXYnLCBjc3MubGlua0NsYXNzLCBpc09uTGFzdFBhZ2UgPyBjc3MuZGlzYWJsZWRDbGFzcyA6ICcnXVwiPlxyXG4gICAgICA8aSB2LWlmPVwiY3NzLmljb25zLm5leHQgIT0gJydcIiA6Y2xhc3M9XCJbY3NzLmljb25zLm5leHRdXCI+PC9pPlxyXG4gICAgICA8c3BhbiB2LWVsc2U+JnJzYXF1bzsmbmJzcDs8L3NwYW4+XHJcbiAgICA8L2E+XHJcbiAgICA8YSBAY2xpY2s9XCJsb2FkUGFnZSh0b3RhbFBhZ2UpXCJcclxuICAgICAgOmNsYXNzPVwiWydidG4tbmF2JywgY3NzLmxpbmtDbGFzcywgaXNPbkxhc3RQYWdlID8gY3NzLmRpc2FibGVkQ2xhc3MgOiAnJ11cIj5cclxuICAgICAgPGkgdi1pZj1cImNzcy5pY29ucy5sYXN0ICE9ICcnXCIgOmNsYXNzPVwiW2Nzcy5pY29ucy5sYXN0XVwiPjwvaT5cclxuICAgICAgPHNwYW4gdi1lbHNlPiZyYXF1bzs8L3NwYW4+XHJcbiAgICA8L2E+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0PlxyXG5pbXBvcnQgUGFnaW5hdGlvbk1peGluIGZyb20gJy4vVnVldGFibGVQYWdpbmF0aW9uTWl4aW4udnVlJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIG1peGluczogW1BhZ2luYXRpb25NaXhpbl0sXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vLi4vLi4vYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00WzBdLnJ1bGVzWzBdIS4uLy4uLy4uL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9WdWV0YWJsZVBhZ2luYXRpb24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNFswXS5ydWxlc1swXSEuLi8uLi8uLi92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vVnVldGFibGVQYWdpbmF0aW9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIiIsImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vVnVldGFibGVQYWdpbmF0aW9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zZWZkZDU5NiZcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9WdWV0YWJsZVBhZ2luYXRpb24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5leHBvcnQgKiBmcm9tIFwiLi9WdWV0YWJsZVBhZ2luYXRpb24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuaW1wb3J0IG5vcm1hbGl6ZXIgZnJvbSBcIiEuLi8uLi8uLi92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcIlxudmFyIGNvbXBvbmVudCA9IG5vcm1hbGl6ZXIoXG4gIHNjcmlwdCxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAobW9kdWxlLmhvdCkge1xuICB2YXIgYXBpID0gcmVxdWlyZShcIi9Vc2Vycy9kamFtaWwvUHJvamVjdHMvdHJpbGJ5L19ncmF2L2dyYXYtcGx1Z2luLWZsZXgtb2JqZWN0cy9ub2RlX21vZHVsZXMvdnVlLWhvdC1yZWxvYWQtYXBpL2Rpc3QvaW5kZXguanNcIilcbiAgYXBpLmluc3RhbGwocmVxdWlyZSgndnVlJykpXG4gIGlmIChhcGkuY29tcGF0aWJsZSkge1xuICAgIG1vZHVsZS5ob3QuYWNjZXB0KClcbiAgICBpZiAoIWFwaS5pc1JlY29yZGVkKCczZWZkZDU5NicpKSB7XG4gICAgICBhcGkuY3JlYXRlUmVjb3JkKCczZWZkZDU5NicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVsb2FkKCczZWZkZDU5NicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH1cbiAgICBtb2R1bGUuaG90LmFjY2VwdChcIi4vVnVldGFibGVQYWdpbmF0aW9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zZWZkZDU5NiZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgYXBpLnJlcmVuZGVyKCczZWZkZDU5NicsIHtcbiAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgIHN0YXRpY1JlbmRlckZuczogc3RhdGljUmVuZGVyRm5zXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwibm9kZV9tb2R1bGVzL3Z1ZXRhYmxlLTIvc3JjL2NvbXBvbmVudHMvVnVldGFibGVQYWdpbmF0aW9uLnZ1ZVwiXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyIsInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJkaXZcIiwge1xuICAgIGNsYXNzOiBbXCJ2dWV0YWJsZS1wYWdpbmF0aW9uLWluZm9cIiwgX3ZtLmNzcy5pbmZvQ2xhc3NdLFxuICAgIGRvbVByb3BzOiB7IGlubmVySFRNTDogX3ZtLl9zKF92bS5wYWdpbmF0aW9uSW5mbykgfVxuICB9KVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSIsIjxzY3JpcHQ+XHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBwcm9wczoge1xyXG4gICAgY3NzOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgaW5mb0NsYXNzOiAnbGVmdCBmbG9hdGVkIGxlZnQgYWxpZ25lZCBzaXggd2lkZSBjb2x1bW4nXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgaW5mb1RlbXBsYXRlOiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdCgpIHtcclxuICAgICAgICByZXR1cm4gXCJEaXNwbGF5aW5nIHtmcm9tfSB0byB7dG99IG9mIHt0b3RhbH0gaXRlbXNcIlxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgbm9EYXRhVGVtcGxhdGU6IHtcclxuICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICBkZWZhdWx0KCkge1xyXG4gICAgICAgIHJldHVybiAnTm8gcmVsZXZhbnQgZGF0YSdcclxuICAgICAgfVxyXG4gICAgfSxcclxuICB9LFxyXG4gIGRhdGE6IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdGFibGVQYWdpbmF0aW9uOiBudWxsXHJcbiAgICB9XHJcbiAgfSxcclxuICBjb21wdXRlZDoge1xyXG4gICAgcGFnaW5hdGlvbkluZm8gKCkge1xyXG4gICAgICBpZiAodGhpcy50YWJsZVBhZ2luYXRpb24gPT0gbnVsbCB8fCB0aGlzLnRhYmxlUGFnaW5hdGlvbi50b3RhbCA9PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9EYXRhVGVtcGxhdGVcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaW5mb1RlbXBsYXRlXHJcbiAgICAgICAgLnJlcGxhY2UoJ3tmcm9tfScsIHRoaXMudGFibGVQYWdpbmF0aW9uLmZyb20gfHwgMClcclxuICAgICAgICAucmVwbGFjZSgne3RvfScsIHRoaXMudGFibGVQYWdpbmF0aW9uLnRvIHx8IDApXHJcbiAgICAgICAgLnJlcGxhY2UoJ3t0b3RhbH0nLCB0aGlzLnRhYmxlUGFnaW5hdGlvbi50b3RhbCB8fCAwKVxyXG4gICAgfSxcclxuICB9LFxyXG4gIG1ldGhvZHM6IHtcclxuICAgIHNldFBhZ2luYXRpb25EYXRhICh0YWJsZVBhZ2luYXRpb24pIHtcclxuICAgICAgdGhpcy50YWJsZVBhZ2luYXRpb24gPSB0YWJsZVBhZ2luYXRpb25cclxuICAgIH0sXHJcbiAgICByZXNldERhdGEgKCkge1xyXG4gICAgICB0aGlzLnRhYmxlUGFnaW5hdGlvbiA9IG51bGxcclxuICAgIH1cclxuICB9LFxyXG59XHJcbjwvc2NyaXB0PlxyXG4iLCJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNFswXS5ydWxlc1swXSEuLi8uLi8uLi92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vVnVldGFibGVQYWdpbmF0aW9uSW5mb01peGluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTRbMF0ucnVsZXNbMF0hLi4vLi4vLi4vdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL1Z1ZXRhYmxlUGFnaW5hdGlvbkluZm9NaXhpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCIiLCJ2YXIgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnNcbmltcG9ydCBzY3JpcHQgZnJvbSBcIi4vVnVldGFibGVQYWdpbmF0aW9uSW5mb01peGluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuZXhwb3J0ICogZnJvbSBcIi4vVnVldGFibGVQYWdpbmF0aW9uSW5mb01peGluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vLi4vdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKG1vZHVsZS5ob3QpIHtcbiAgdmFyIGFwaSA9IHJlcXVpcmUoXCIvVXNlcnMvZGphbWlsL1Byb2plY3RzL3RyaWxieS9fZ3Jhdi9ncmF2LXBsdWdpbi1mbGV4LW9iamVjdHMvbm9kZV9tb2R1bGVzL3Z1ZS1ob3QtcmVsb2FkLWFwaS9kaXN0L2luZGV4LmpzXCIpXG4gIGFwaS5pbnN0YWxsKHJlcXVpcmUoJ3Z1ZScpKVxuICBpZiAoYXBpLmNvbXBhdGlibGUpIHtcbiAgICBtb2R1bGUuaG90LmFjY2VwdCgpXG4gICAgaWYgKCFhcGkuaXNSZWNvcmRlZCgnMmYwNWEzNmUnKSkge1xuICAgICAgYXBpLmNyZWF0ZVJlY29yZCgnMmYwNWEzNmUnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbG9hZCgnMmYwNWEzNmUnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9XG4gICAgXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwibm9kZV9tb2R1bGVzL3Z1ZXRhYmxlLTIvc3JjL2NvbXBvbmVudHMvVnVldGFibGVQYWdpbmF0aW9uSW5mb01peGluLnZ1ZVwiXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IDpjbGFzcz1cIlsndnVldGFibGUtcGFnaW5hdGlvbi1pbmZvJywgY3NzLmluZm9DbGFzc11cIlxyXG4gICAgdi1odG1sPVwicGFnaW5hdGlvbkluZm9cIj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQ+XHJcbmltcG9ydCBQYWdpbmF0aW9uSW5mb01peGluIGZyb20gJy4vVnVldGFibGVQYWdpbmF0aW9uSW5mb01peGluLnZ1ZSdcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBtaXhpbnM6IFtQYWdpbmF0aW9uSW5mb01peGluXSxcclxufVxyXG48L3NjcmlwdD5cclxuIiwiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTRbMF0ucnVsZXNbMF0hLi4vLi4vLi4vdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL1Z1ZXRhYmxlUGFnaW5hdGlvbkluZm8udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNFswXS5ydWxlc1swXSEuLi8uLi8uLi92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vVnVldGFibGVQYWdpbmF0aW9uSW5mby52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCIiLCJpbXBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IGZyb20gXCIuL1Z1ZXRhYmxlUGFnaW5hdGlvbkluZm8udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE3NzI0MDgzJlwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL1Z1ZXRhYmxlUGFnaW5hdGlvbkluZm8udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5leHBvcnQgKiBmcm9tIFwiLi9WdWV0YWJsZVBhZ2luYXRpb25JbmZvLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vLi4vdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKG1vZHVsZS5ob3QpIHtcbiAgdmFyIGFwaSA9IHJlcXVpcmUoXCIvVXNlcnMvZGphbWlsL1Byb2plY3RzL3RyaWxieS9fZ3Jhdi9ncmF2LXBsdWdpbi1mbGV4LW9iamVjdHMvbm9kZV9tb2R1bGVzL3Z1ZS1ob3QtcmVsb2FkLWFwaS9kaXN0L2luZGV4LmpzXCIpXG4gIGFwaS5pbnN0YWxsKHJlcXVpcmUoJ3Z1ZScpKVxuICBpZiAoYXBpLmNvbXBhdGlibGUpIHtcbiAgICBtb2R1bGUuaG90LmFjY2VwdCgpXG4gICAgaWYgKCFhcGkuaXNSZWNvcmRlZCgnMTc3MjQwODMnKSkge1xuICAgICAgYXBpLmNyZWF0ZVJlY29yZCgnMTc3MjQwODMnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbG9hZCgnMTc3MjQwODMnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIuL1Z1ZXRhYmxlUGFnaW5hdGlvbkluZm8udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE3NzI0MDgzJlwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhcGkucmVyZW5kZXIoJzE3NzI0MDgzJywge1xuICAgICAgICByZW5kZXI6IHJlbmRlcixcbiAgICAgICAgc3RhdGljUmVuZGVyRm5zOiBzdGF0aWNSZW5kZXJGbnNcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJub2RlX21vZHVsZXMvdnVldGFibGUtMi9zcmMvY29tcG9uZW50cy9WdWV0YWJsZVBhZ2luYXRpb25JbmZvLnZ1ZVwiXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyIsImV4cG9ydCBkZWZhdWx0IHtcbiAgICB0YWJsZToge1xuICAgICAgICB0YWJsZUNsYXNzOiAndGFibGUnLFxuICAgICAgICBsb2FkaW5nQ2xhc3M6ICdsb2FkaW5nJyxcbiAgICAgICAgc29ydGFibGVJY29uOiAnJyxcbiAgICAgICAgYXNjZW5kaW5nSWNvbjogJ2ZhIGZhLWZ3IGZhLWNoZXZyb24tdXAnLFxuICAgICAgICBkZXNjZW5kaW5nSWNvbjogJ2ZhIGZhLWZ3IGZhLWNoZXZyb24tZG93bicsXG4gICAgICAgIGFzY2VuZGluZ0NsYXNzOiAnJyxcbiAgICAgICAgZGVzY2VuZGluZ0NsYXNzOiAnJyxcbiAgICAgICAgaGFuZGxlSWNvbjogJ2ZhIGZhLWZ3IGZhLWJhcnMnLFxuICAgICAgICByZW5kZXJJY29uOiAoY2xhc3Nlcywgb3B0aW9ucykgPT4gYDxpIGNsYXNzPVwiJHtjbGFzc2VzLmpvaW4oJyAnKX1cIj48L2k+YFxuICAgIH0sXG4gICAgcGFnaW5hdGlvbjoge1xuICAgICAgICB3cmFwcGVyQ2xhc3M6ICdmbGV4LW9iamVjdHMtcGFnaW5hdGlvbicsXG4gICAgICAgIGFjdGl2ZUNsYXNzOiAnYnV0dG9uIGFjdGl2ZScsXG4gICAgICAgIGRpc2FibGVkQ2xhc3M6ICdidXR0b24gZGlzYWJsZWQnLFxuICAgICAgICBwYWdlQ2xhc3M6ICdidXR0b24gcGFnZScsXG4gICAgICAgIGxpbmtDbGFzczogJ2J1dHRvbiBsaW5rJyxcbiAgICAgICAgaWNvbnM6IHtcbiAgICAgICAgICAgIGZpcnN0OiAnZmEgZmEtZncgZmEtYW5nbGUtZG91YmxlLWxlZnQnLFxuICAgICAgICAgICAgcHJldjogJ2ZhIGZhLWZ3IGZhLWNoZXZyb24tbGVmdCcsXG4gICAgICAgICAgICBuZXh0OiAnZmEgZmEtZncgZmEtY2hldnJvbi1yaWdodCcsXG4gICAgICAgICAgICBsYXN0OiAnZmEgZmEtZncgZmEtYW5nbGUtZG91YmxlLXJpZ2h0J1xuICAgICAgICB9XG4gICAgfSxcbiAgICBwYWdpbmF0aW9uSW5mbzoge1xuICAgICAgICBpbmZvQ2xhc3M6ICcnXG4gICAgfVxufTtcbiIsIjx0ZW1wbGF0ZT5cbiAgICA8ZGl2PlxuICAgICAgICA8dnVldGFibGUgcmVmPVwidnVldGFibGVcIlxuICAgICAgICAgICAgICAgICAgOmNzcz1cImNzcy50YWJsZVwiXG4gICAgICAgICAgICAgICAgICA6ZmllbGRzPVwic3RvcmUuZmllbGRzIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgIDpzZWFyY2hGaWVsZHM9XCJzdG9yZS5zZWFyY2hGaWVsZHMgfHwgW11cIlxuICAgICAgICAgICAgICAgICAgOnNvcnRPcmRlcj1cInN0b3JlLnNvcnRPcmRlclwiXG4gICAgICAgICAgICAgICAgICA6bXVsdGktc29ydD1cInRydWVcIlxuXG4gICAgICAgICAgICAgICAgICA6YXBpLW1vZGU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIDphcGktdXJsPVwic3RvcmUuYXBpXCJcbiAgICAgICAgICAgICAgICAgIDpwZXItcGFnZT1cInBlclBhZ2VcIlxuICAgICAgICAgICAgICAgICAgOmFwcGVuZC1wYXJhbXM9XCJleHRyYVBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICBwYWdpbmF0aW9uLXBhdGg9XCJsaW5rcy5wYWdpbmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgIDpzaG93LXNvcnQtaWNvbnM9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIEB2dWV0YWJsZTpwYWdpbmF0aW9uLWRhdGE9XCJvblBhZ2luYXRpb25EYXRhXCJcbiAgICAgICAgICAgICAgICAgIEB2dWV0YWJsZTpsb2FkaW5nPVwib25WdWV0YWJsZUxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgQHZ1ZXRhYmxlOmxvYWQtc3VjY2Vzcz1cIm9uVnVlVGFibGVMb2FkU3VjY2Vzc1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtbGlzdC1wYWdpbmF0aW9uXCI+XG4gICAgICAgICAgICA8dnVldGFibGUtcGFnaW5hdGlvbi1pbmZvIHJlZj1cInBhZ2luYXRpb25JbmZvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmluZm8tdGVtcGxhdGU9XCJzdG9yZS5wYWdpbmF0aW9uSW5mb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppbmZvLW5vLWRhdGEtdGVtcGxhdGU9XCJzdG9yZS5lbXB0eVJlc3VsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjc3M9XCJjc3MucGFnaW5hdGlvbkluZm9cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDx2dWV0YWJsZS1wYWdpbmF0aW9uIHJlZj1cInBhZ2luYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNzcz1cImNzcy5wYWdpbmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB2dWV0YWJsZS1wYWdpbmF0aW9uOmNoYW5nZS1wYWdlPVwib25DaGFuZ2VQYWdlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbiAgICBpbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG4gICAgaW1wb3J0IFZ1ZXRhYmxlIGZyb20gJ3Z1ZXRhYmxlLTIvc3JjL2NvbXBvbmVudHMvVnVldGFibGUudnVlJztcbiAgICBpbXBvcnQgVnVldGFibGVQYWdpbmF0aW9uIGZyb20gXCJ2dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlUGFnaW5hdGlvbi52dWVcIjtcbiAgICBpbXBvcnQgVnVldGFibGVQYWdpbmF0aW9uSW5mbyBmcm9tICd2dWV0YWJsZS0yL3NyYy9jb21wb25lbnRzL1Z1ZXRhYmxlUGFnaW5hdGlvbkluZm8udnVlJztcbiAgICBpbXBvcnQgVnVldGFibGVDc3NDb25maWcgZnJvbSBcIi4uL1Z1ZXRhYmxlQ3NzQ29uZmlnLmpzXCI7XG5cbiAgICBpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG4gICAgZXhwb3J0IGRlZmF1bHQge1xuICAgICAgICBwcm9wczogWydzdG9yZScsICd2YWx1ZSddLFxuICAgICAgICBjb21wb25lbnRzOiB7VnVldGFibGUsIFZ1ZXRhYmxlUGFnaW5hdGlvbiwgVnVldGFibGVQYWdpbmF0aW9uSW5mb30sXG4gICAgICAgIGRhdGE6ICgpID0+ICh7XG4gICAgICAgICAgICBjc3M6IFZ1ZXRhYmxlQ3NzQ29uZmlnLFxuICAgICAgICAgICAgcGVyUGFnZTogMTAsXG4gICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgIGV4dHJhUGFyYW1zOiB7fVxuICAgICAgICB9KSxcbiAgICAgICAgY3JlYXRlZCgpIHtcbiAgICAgICAgICAgIHRoaXMucGVyUGFnZSA9IHRoaXMuc3RvcmUucGVyUGFnZTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IE9iamVjdC52YWx1ZXModGhpcy5zdG9yZS5kYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgIHRoaXMuJHJlZnMudnVldGFibGUuc2V0RGF0YSh0aGlzLnN0b3JlLmRhdGEpO1xuICAgICAgICAgICAgdGhpcy4kZXZlbnRzLiRvbignZmlsdGVyLXNldCcsIGV2ZW50ID0+IHRoaXMub25GaWx0ZXJTZXQoZXZlbnQpKTtcbiAgICAgICAgICAgIHRoaXMuJGV2ZW50cy4kb24oJ2ZpbHRlci1yZXNldCcsIGV2ZW50ID0+IHRoaXMub25GaWx0ZXJSZXNldCgpKTtcbiAgICAgICAgICAgIHRoaXMuJGV2ZW50cy4kb24oJ2ZpbHRlci1wZXJQYWdlJywgZXZlbnQgPT4gdGhpcy5vbkZpbHRlclBlclBhZ2UoZXZlbnQpKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgb25QYWdpbmF0aW9uRGF0YShwYWdpbmF0aW9uRGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMucGFnaW5hdGlvbi5zZXRQYWdpbmF0aW9uRGF0YShwYWdpbmF0aW9uRGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5wYWdpbmF0aW9uSW5mby5zZXRQYWdpbmF0aW9uRGF0YShwYWdpbmF0aW9uRGF0YSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25GaWx0ZXJTZXQgKGZpbHRlclRleHQpIHtcbiAgICAgICAgICAgICAgICBfLnNldCh0aGlzLmV4dHJhUGFyYW1zLCAnZmlsdGVyJywgZmlsdGVyVGV4dCk7XG4gICAgICAgICAgICAgICAgVnVlLm5leHRUaWNrKCgpID0+IHRoaXMuJHJlZnMudnVldGFibGUucmVmcmVzaCgpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkZpbHRlclJlc2V0ICgpIHtcbiAgICAgICAgICAgICAgICBfLnVuc2V0KHRoaXMuZXh0cmFQYXJhbXMsICdmaWx0ZXInKTtcbiAgICAgICAgICAgICAgICBWdWUubmV4dFRpY2soKCkgPT4gdGhpcy4kcmVmcy52dWV0YWJsZS5yZWZyZXNoKCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRmlsdGVyUGVyUGFnZSAobGltaXQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb25GaWx0ZXJQZXJQYWdlJywgbGltaXQsIHRoaXMuc3RvcmUuZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJQYWdlID0gbGltaXQgfHwgdGhpcy4kcmVmcy5wYWdpbmF0aW9uSW5mby50YWJsZVBhZ2luYXRpb24udG90YWw7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy4kcmVmcy52dWV0YWJsZS5wZXJQYWdlID0gbGltaXQ7XG4gICAgICAgICAgICAgICAgVnVlLm5leHRUaWNrKCgpID0+IHRoaXMuJHJlZnMudnVldGFibGUucmVmcmVzaCgpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNoYW5nZVBhZ2UocGFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMudnVldGFibGUuY2hhbmdlUGFnZShwYWdlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblZ1ZXRhYmxlTG9hZGluZygpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uVnVlVGFibGVMb2FkU3VjY2VzcygpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbjwvc2NyaXB0PlxuIiwiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00WzBdLnJ1bGVzWzBdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vVGFibGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTRbMF0ucnVsZXNbMF0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9UYWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCIiLCJpbXBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IGZyb20gXCIuL1RhYmxlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xM2RlZGM4YyZcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9UYWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL1RhYmxlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChtb2R1bGUuaG90KSB7XG4gIHZhciBhcGkgPSByZXF1aXJlKFwiL1VzZXJzL2RqYW1pbC9Qcm9qZWN0cy90cmlsYnkvX2dyYXYvZ3Jhdi1wbHVnaW4tZmxleC1vYmplY3RzL25vZGVfbW9kdWxlcy92dWUtaG90LXJlbG9hZC1hcGkvZGlzdC9pbmRleC5qc1wiKVxuICBhcGkuaW5zdGFsbChyZXF1aXJlKCd2dWUnKSlcbiAgaWYgKGFwaS5jb21wYXRpYmxlKSB7XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuICAgIGlmICghYXBpLmlzUmVjb3JkZWQoJzEzZGVkYzhjJykpIHtcbiAgICAgIGFwaS5jcmVhdGVSZWNvcmQoJzEzZGVkYzhjJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZWxvYWQoJzEzZGVkYzhjJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfVxuICAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiLi9UYWJsZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MTNkZWRjOGMmXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwaS5yZXJlbmRlcignMTNkZWRjOGMnLCB7XG4gICAgICAgIHJlbmRlcjogcmVuZGVyLFxuICAgICAgICBzdGF0aWNSZW5kZXJGbnM6IHN0YXRpY1JlbmRlckZuc1xuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcImFwcC9saXN0L2NvbXBvbmVudHMvVGFibGUudnVlXCJcbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudC5leHBvcnRzIiwidmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInNlYXJjaC13cmFwcGVyXCIgfSwgW1xuICAgIF9jKFwiaW5wdXRcIiwge1xuICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJtb2RlbFwiLFxuICAgICAgICAgIHJhd05hbWU6IFwidi1tb2RlbC50cmltXCIsXG4gICAgICAgICAgdmFsdWU6IF92bS5maWx0ZXJUZXh0LFxuICAgICAgICAgIGV4cHJlc3Npb246IFwiZmlsdGVyVGV4dFwiLFxuICAgICAgICAgIG1vZGlmaWVyczogeyB0cmltOiB0cnVlIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHN0YXRpY0NsYXNzOiBcInNlYXJjaFwiLFxuICAgICAgYXR0cnM6IHsgdHlwZTogXCJ0ZXh0XCIsIHBsYWNlaG9sZGVyOiBfdm0uc3RvcmUuc2VhcmNoUGxhY2Vob2xkZXIgfSxcbiAgICAgIGRvbVByb3BzOiB7IHZhbHVlOiBfdm0uZmlsdGVyVGV4dCB9LFxuICAgICAgb246IHtcbiAgICAgICAgaW5wdXQ6IFtcbiAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICgkZXZlbnQudGFyZ2V0LmNvbXBvc2luZykge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF92bS5maWx0ZXJUZXh0ID0gJGV2ZW50LnRhcmdldC52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIF92bS5kb0ZpbHRlclxuICAgICAgICBdLFxuICAgICAgICBibHVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3ZtLiRmb3JjZVVwZGF0ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdm0uX3YoXCIgXCIpLFxuICAgIF9jKFxuICAgICAgXCJzZWxlY3RcIixcbiAgICAgIHtcbiAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwibW9kZWxcIixcbiAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuICAgICAgICAgICAgdmFsdWU6IF92bS5zdG9yZS5wZXJQYWdlLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJzdG9yZS5wZXJQYWdlXCJcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHN0YXRpY0NsYXNzOiBcImZpbHRlci1wZXJQYWdlXCIsXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgY2hhbmdlOiBbXG4gICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgdmFyICQkc2VsZWN0ZWRWYWwgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gICAgICAgICAgICAgICAgLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLCBmdW5jdGlvbihvKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gby5zZWxlY3RlZFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbihvKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgdmFsID0gXCJfdmFsdWVcIiBpbiBvID8gby5fdmFsdWUgOiBvLnZhbHVlXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdmFsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgX3ZtLiRzZXQoXG4gICAgICAgICAgICAgICAgX3ZtLnN0b3JlLFxuICAgICAgICAgICAgICAgIFwicGVyUGFnZVwiLFxuICAgICAgICAgICAgICAgICRldmVudC50YXJnZXQubXVsdGlwbGUgPyAkJHNlbGVjdGVkVmFsIDogJCRzZWxlY3RlZFZhbFswXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX3ZtLmNoYW5nZVBlclBhZ2VcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfdm0uX2wodGhpcy5wZXJQYWdlT3B0aW9ucywgZnVuY3Rpb24odmFsdWUsIHRpdGxlKSB7XG4gICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgIHsgZG9tUHJvcHM6IHsgdmFsdWU6IHZhbHVlLCBzZWxlY3RlZDogX3ZtLnN0b3JlLnBlclBhZ2UgPT09IHZhbHVlIH0gfSxcbiAgICAgICAgICBbX3ZtLl92KF92bS5fcyh0aXRsZSkpXVxuICAgICAgICApXG4gICAgICB9KSxcbiAgICAgIDBcbiAgICApXG4gIF0pXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cbnJlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5leHBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IiwiPHRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtd3JhcHBlclwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNlYXJjaFwiIDpwbGFjZWhvbGRlcj1cInN0b3JlLnNlYXJjaFBsYWNlaG9sZGVyXCIgdi1tb2RlbC50cmltPVwiZmlsdGVyVGV4dFwiIEBpbnB1dD1cImRvRmlsdGVyXCI+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmaWx0ZXItcGVyUGFnZVwiIHYtbW9kZWw9XCJzdG9yZS5wZXJQYWdlXCIgQGNoYW5nZT1cImNoYW5nZVBlclBhZ2VcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCIodmFsdWUsIHRpdGxlKSBpbiB0aGlzLnBlclBhZ2VPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgOnZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICA6c2VsZWN0ZWQ9XCJzdG9yZS5wZXJQYWdlID09PSB2YWx1ZVwiPnt7IHRpdGxlIH19PC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbiAgICBpbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaCc7XG5cbiAgICBleHBvcnQgZGVmYXVsdCB7XG4gICAgICAgIHByb3BzOiBbJ3N0b3JlJ10sXG4gICAgICAgIGRhdGE6ICgpID0+ICh7XG4gICAgICAgICAgICBmaWx0ZXJUZXh0OiAnJyxcbiAgICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnRmlsdGVyLi4uJyxcbiAgICAgICAgICAgIHNlbGVjdGVkOiAnJ1xuICAgICAgICB9KSxcbiAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgIHBlclBhZ2VPcHRpb25zKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICcyNSc6IDI1LFxuICAgICAgICAgICAgICAgICAgICAnNTAnOiA1MCxcbiAgICAgICAgICAgICAgICAgICAgJzEwMCc6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgJzIwMCc6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgJ0FsbCc6ICcnXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1t0aGlzLnN0b3JlLnBlclBhZ2VdKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbdGhpcy5zdG9yZS5wZXJQYWdlXSA9IHRoaXMuc3RvcmUucGVyUGFnZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlZCgpIHtcbiAgICAgICAgICAgIHRoaXMuZG9GaWx0ZXIgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4kZXZlbnRzLmZpcmUoJ2ZpbHRlci1zZXQnLCB0aGlzLmZpbHRlclRleHQpO1xuICAgICAgICAgICAgfSwgMjUwLCB7IGxlYWRpbmc6IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNoYW5nZVBlclBhZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4kZXZlbnRzLmZpcmUoJ2ZpbHRlci1wZXJQYWdlJywgdGhpcy5zdG9yZS5wZXJQYWdlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIHJlc2V0RmlsdGVyKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyVGV4dCA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuJGV2ZW50cy5maXJlKCdmaWx0ZXItcmVzZXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkPlxuICAgIC5zZWFyY2gtd3JhcHBlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgfVxuXG4gICAgLnNlYXJjaC13cmFwcGVyIHNlbGVjdCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxcmVtO1xuICAgIH1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTRbMF0ucnVsZXNbMF0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9GaWx0ZXJCYXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTRbMF0ucnVsZXNbMF0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9GaWx0ZXJCYXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiIiwiaW1wb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSBmcm9tIFwiLi9GaWx0ZXJCYXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTVlMTk1YTMyJnNjb3BlZD10cnVlJlwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL0ZpbHRlckJhci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL0ZpbHRlckJhci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmltcG9ydCBzdHlsZTAgZnJvbSBcIi4vRmlsdGVyQmFyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTVlMTk1YTMyJnNjb3BlZD10cnVlJmxhbmc9Y3NzJlwiXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuaW1wb3J0IG5vcm1hbGl6ZXIgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgXCI1ZTE5NWEzMlwiLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAobW9kdWxlLmhvdCkge1xuICB2YXIgYXBpID0gcmVxdWlyZShcIi9Vc2Vycy9kamFtaWwvUHJvamVjdHMvdHJpbGJ5L19ncmF2L2dyYXYtcGx1Z2luLWZsZXgtb2JqZWN0cy9ub2RlX21vZHVsZXMvdnVlLWhvdC1yZWxvYWQtYXBpL2Rpc3QvaW5kZXguanNcIilcbiAgYXBpLmluc3RhbGwocmVxdWlyZSgndnVlJykpXG4gIGlmIChhcGkuY29tcGF0aWJsZSkge1xuICAgIG1vZHVsZS5ob3QuYWNjZXB0KClcbiAgICBpZiAoIWFwaS5pc1JlY29yZGVkKCc1ZTE5NWEzMicpKSB7XG4gICAgICBhcGkuY3JlYXRlUmVjb3JkKCc1ZTE5NWEzMicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVsb2FkKCc1ZTE5NWEzMicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH1cbiAgICBtb2R1bGUuaG90LmFjY2VwdChcIi4vRmlsdGVyQmFyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01ZTE5NWEzMiZzY29wZWQ9dHJ1ZSZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgYXBpLnJlcmVuZGVyKCc1ZTE5NWEzMicsIHtcbiAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgIHN0YXRpY1JlbmRlckZuczogc3RhdGljUmVuZGVyRm5zXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwiYXBwL2xpc3QvY29tcG9uZW50cy9GaWx0ZXJCYXIudnVlXCJcbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudC5leHBvcnRzIiwidmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIFtcbiAgICAgIF9jKFwiZGl2XCIsIHsgc3R5bGU6IHsgaGVpZ2h0OiAzMDAsIHdpZHRoOiBcIjEwMCVcIiB9IH0pLFxuICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgIF9jKFxuICAgICAgICBcImNvbnRlbnQtbG9hZGVyXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgaGVpZ2h0OiBfdm0uZml4ZWRBbW91bnQgKiBfdm0uY291bnQsXG4gICAgICAgICAgICB3aWR0aDogMTA2MCxcbiAgICAgICAgICAgIHNwZWVkOiAyLFxuICAgICAgICAgICAgcHJpbWFyeUNvbG9yOiBcIiNkOWQ5ZDlcIixcbiAgICAgICAgICAgIHNlY29uZGFyeUNvbG9yOiBcIiNlY2ViZWJcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF92bS5fbChfdm0uY291bnQsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBfYyhcInJlY3RcIiwge1xuICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICB4OiBcIjEzXCIsXG4gICAgICAgICAgICAgICAgICB5OiBfdm0uZml4ZWRBbW91bnQgKiBpbmRleCArIF92bS5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICByeDogXCI2XCIsXG4gICAgICAgICAgICAgICAgICByeTogXCI2XCIsXG4gICAgICAgICAgICAgICAgICB3aWR0aDogMjAwICogX3ZtLnJhbmRvbSgpLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBcIjEyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICBfYyhcInJlY3RcIiwge1xuICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICB4OiBcIjUzM1wiLFxuICAgICAgICAgICAgICAgICAgeTogX3ZtLmZpeGVkQW1vdW50ICogaW5kZXggKyBfdm0ub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgcng6IFwiNlwiLFxuICAgICAgICAgICAgICAgICAgcnk6IFwiNlwiLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IDYzICogX3ZtLnJhbmRvbSgpLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBcIjEyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICBfYyhcInJlY3RcIiwge1xuICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICB4OiBcIjY1M1wiLFxuICAgICAgICAgICAgICAgICAgeTogX3ZtLmZpeGVkQW1vdW50ICogaW5kZXggKyBfdm0ub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgcng6IFwiNlwiLFxuICAgICAgICAgICAgICAgICAgcnk6IFwiNlwiLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IDc4ICogX3ZtLnJhbmRvbSgpLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBcIjEyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBfdm0uX3YoXCIgXCIpLFxuICAgICAgICAgICAgICBfYyhcInJlY3RcIiwge1xuICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICB4OiBcIjc1NVwiLFxuICAgICAgICAgICAgICAgICAgeTogX3ZtLmZpeGVkQW1vdW50ICogaW5kZXggKyBfdm0ub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgcng6IFwiNlwiLFxuICAgICAgICAgICAgICAgICAgcnk6IFwiNlwiLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IDExNyAqIF92bS5yYW5kb20oKSxcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogXCIxMlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgX2MoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgeDogXCI5MzhcIixcbiAgICAgICAgICAgICAgICAgIHk6IF92bS5maXhlZEFtb3VudCAqIGluZGV4ICsgX3ZtLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgIHJ4OiBcIjZcIixcbiAgICAgICAgICAgICAgICAgIHJ5OiBcIjZcIixcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiA4MyAqIF92bS5yYW5kb20oKSxcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogXCIxMlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgX3ZtLl92KFwiIFwiKSxcbiAgICAgICAgICAgICAgX2MoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgeDogXCIwXCIsXG4gICAgICAgICAgICAgICAgICB5OiBfdm0uZml4ZWRBbW91bnQgKiBpbmRleCxcbiAgICAgICAgICAgICAgICAgIHJ4OiBcIjZcIixcbiAgICAgICAgICAgICAgICAgIHJ5OiBcIjZcIixcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBcIjEwNjBcIixcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogXCIuM1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0pXG4gICAgICAgIF0sXG4gICAgICAgIDJcbiAgICAgIClcbiAgICBdLFxuICAgIDFcbiAgKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSIsImltcG9ydCBfbWVyZ2VKU1hQcm9wcyBmcm9tICdiYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wcyc7XG5cbnZhciB1aWQgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpO1xufSk7XG5cbnZhciBDb250ZW50TG9hZGVyID0ge1xuICBuYW1lOiAnQ29udGVudExvYWRlcicsXG4gIGZ1bmN0aW9uYWw6IHRydWUsXG4gIHByb3BzOiB7XG4gICAgd2lkdGg6IHtcbiAgICAgIHR5cGU6IFtOdW1iZXIsIFN0cmluZ10sXG4gICAgICBcImRlZmF1bHRcIjogNDAwXG4gICAgfSxcbiAgICBoZWlnaHQ6IHtcbiAgICAgIHR5cGU6IFtOdW1iZXIsIFN0cmluZ10sXG4gICAgICBcImRlZmF1bHRcIjogMTMwXG4gICAgfSxcbiAgICBzcGVlZDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgXCJkZWZhdWx0XCI6IDJcbiAgICB9LFxuICAgIHByZXNlcnZlQXNwZWN0UmF0aW86IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIFwiZGVmYXVsdFwiOiAneE1pZFlNaWQgbWVldCdcbiAgICB9LFxuICAgIGJhc2VVcmw6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIFwiZGVmYXVsdFwiOiAnJ1xuICAgIH0sXG4gICAgcHJpbWFyeUNvbG9yOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBcImRlZmF1bHRcIjogJyNmOWY5ZjknXG4gICAgfSxcbiAgICBzZWNvbmRhcnlDb2xvcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgXCJkZWZhdWx0XCI6ICcjZWNlYmViJ1xuICAgIH0sXG4gICAgcHJpbWFyeU9wYWNpdHk6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIFwiZGVmYXVsdFwiOiAxXG4gICAgfSxcbiAgICBzZWNvbmRhcnlPcGFjaXR5OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBcImRlZmF1bHRcIjogMVxuICAgIH0sXG4gICAgdW5pcXVlS2V5OiB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9LFxuICAgIGFuaW1hdGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBcImRlZmF1bHRcIjogdHJ1ZVxuICAgIH1cbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCwgX3JlZikge1xuICAgIHZhciBwcm9wcyA9IF9yZWYucHJvcHMsXG4gICAgICAgIGRhdGEgPSBfcmVmLmRhdGEsXG4gICAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgICB2YXIgaWRDbGlwID0gcHJvcHMudW5pcXVlS2V5ID8gcHJvcHMudW5pcXVlS2V5ICsgXCItaWRDbGlwXCIgOiB1aWQoKTtcbiAgICB2YXIgaWRHcmFkaWVudCA9IHByb3BzLnVuaXF1ZUtleSA/IHByb3BzLnVuaXF1ZUtleSArIFwiLWlkR3JhZGllbnRcIiA6IHVpZCgpO1xuICAgIHJldHVybiBoKFwic3ZnXCIsIF9tZXJnZUpTWFByb3BzKFtkYXRhLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICB2aWV3Qm94OiBcIjAgMCBcIiArIHByb3BzLndpZHRoICsgXCIgXCIgKyBwcm9wcy5oZWlnaHQsXG4gICAgICAgIHZlcnNpb246IFwiMS4xXCIsXG4gICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW86IHByb3BzLnByZXNlcnZlQXNwZWN0UmF0aW9cbiAgICAgIH1cbiAgICB9XSksIFtoKFwicmVjdFwiLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBmaWxsOiBcInVybChcIiArIHByb3BzLmJhc2VVcmwgKyBcIiNcIiArIGlkR3JhZGllbnQgKyBcIilcIlxuICAgICAgfSxcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIFwiY2xpcC1wYXRoXCI6IFwidXJsKFwiICsgcHJvcHMuYmFzZVVybCArIFwiI1wiICsgaWRDbGlwICsgXCIpXCIsXG4gICAgICAgIHg6IFwiMFwiLFxuICAgICAgICB5OiBcIjBcIixcbiAgICAgICAgd2lkdGg6IHByb3BzLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IHByb3BzLmhlaWdodFxuICAgICAgfVxuICAgIH0pLCBoKFwiZGVmc1wiLCBbaChcImNsaXBQYXRoXCIsIHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIGlkOiBpZENsaXBcbiAgICAgIH1cbiAgICB9LCBbY2hpbGRyZW4gfHwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIwXCIsXG4gICAgICAgIHk6IFwiMFwiLFxuICAgICAgICByeDogXCI1XCIsXG4gICAgICAgIHJ5OiBcIjVcIixcbiAgICAgICAgd2lkdGg6IHByb3BzLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IHByb3BzLmhlaWdodFxuICAgICAgfVxuICAgIH0pXSksIGgoXCJsaW5lYXJHcmFkaWVudFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICBpZDogaWRHcmFkaWVudFxuICAgICAgfVxuICAgIH0sIFtoKFwic3RvcFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICBvZmZzZXQ6IFwiMCVcIixcbiAgICAgICAgXCJzdG9wLWNvbG9yXCI6IHByb3BzLnByaW1hcnlDb2xvcixcbiAgICAgICAgXCJzdG9wLW9wYWNpdHlcIjogcHJvcHMucHJpbWFyeU9wYWNpdHlcbiAgICAgIH1cbiAgICB9LCBbcHJvcHMuYW5pbWF0ZSA/IGgoXCJhbmltYXRlXCIsIHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIGF0dHJpYnV0ZU5hbWU6IFwib2Zmc2V0XCIsXG4gICAgICAgIHZhbHVlczogXCItMjsgMVwiLFxuICAgICAgICBkdXI6IHByb3BzLnNwZWVkICsgXCJzXCIsXG4gICAgICAgIHJlcGVhdENvdW50OiBcImluZGVmaW5pdGVcIlxuICAgICAgfVxuICAgIH0pIDogbnVsbF0pLCBoKFwic3RvcFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICBvZmZzZXQ6IFwiNTAlXCIsXG4gICAgICAgIFwic3RvcC1jb2xvclwiOiBwcm9wcy5zZWNvbmRhcnlDb2xvcixcbiAgICAgICAgXCJzdG9wLW9wYWNpdHlcIjogcHJvcHMuc2Vjb25kYXJ5T3BhY2l0eVxuICAgICAgfVxuICAgIH0sIFtwcm9wcy5hbmltYXRlID8gaChcImFuaW1hdGVcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgYXR0cmlidXRlTmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgdmFsdWVzOiBcIi0xLjU7IDEuNVwiLFxuICAgICAgICBkdXI6IHByb3BzLnNwZWVkICsgXCJzXCIsXG4gICAgICAgIHJlcGVhdENvdW50OiBcImluZGVmaW5pdGVcIlxuICAgICAgfVxuICAgIH0pIDogbnVsbF0pLCBoKFwic3RvcFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICBvZmZzZXQ6IFwiMTAwJVwiLFxuICAgICAgICBcInN0b3AtY29sb3JcIjogcHJvcHMucHJpbWFyeUNvbG9yLFxuICAgICAgICBcInN0b3Atb3BhY2l0eVwiOiBwcm9wcy5wcmltYXJ5T3BhY2l0eVxuICAgICAgfVxuICAgIH0sIFtwcm9wcy5hbmltYXRlID8gaChcImFuaW1hdGVcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgYXR0cmlidXRlTmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgdmFsdWVzOiBcIi0xOyAyXCIsXG4gICAgICAgIGR1cjogcHJvcHMuc3BlZWQgKyBcInNcIixcbiAgICAgICAgcmVwZWF0Q291bnQ6IFwiaW5kZWZpbml0ZVwiXG4gICAgICB9XG4gICAgfSkgOiBudWxsXSldKV0pXSk7XG4gIH1cbn07XG5cbnZhciBCdWxsZXRMaXN0TG9hZGVyID0ge1xuICBuYW1lOiAnQnVsbGV0TGlzdExvYWRlcicsXG4gIGZ1bmN0aW9uYWw6IHRydWUsXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgsIF9yZWYpIHtcbiAgICB2YXIgZGF0YSA9IF9yZWYuZGF0YTtcbiAgICByZXR1cm4gaChDb250ZW50TG9hZGVyLCBkYXRhLCBbaChcImNpcmNsZVwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICBjeDogXCIxMFwiLFxuICAgICAgICBjeTogXCIyMFwiLFxuICAgICAgICByOiBcIjhcIlxuICAgICAgfVxuICAgIH0pLCBoKFwicmVjdFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICB4OiBcIjI1XCIsXG4gICAgICAgIHk6IFwiMTVcIixcbiAgICAgICAgcng6IFwiNVwiLFxuICAgICAgICByeTogXCI1XCIsXG4gICAgICAgIHdpZHRoOiBcIjIyMFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTBcIlxuICAgICAgfVxuICAgIH0pLCBoKFwiY2lyY2xlXCIsIHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIGN4OiBcIjEwXCIsXG4gICAgICAgIGN5OiBcIjUwXCIsXG4gICAgICAgIHI6IFwiOFwiXG4gICAgICB9XG4gICAgfSksIGgoXCJyZWN0XCIsIHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIHg6IFwiMjVcIixcbiAgICAgICAgeTogXCI0NVwiLFxuICAgICAgICByeDogXCI1XCIsXG4gICAgICAgIHJ5OiBcIjVcIixcbiAgICAgICAgd2lkdGg6IFwiMjIwXCIsXG4gICAgICAgIGhlaWdodDogXCIxMFwiXG4gICAgICB9XG4gICAgfSksIGgoXCJjaXJjbGVcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgY3g6IFwiMTBcIixcbiAgICAgICAgY3k6IFwiODBcIixcbiAgICAgICAgcjogXCI4XCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIyNVwiLFxuICAgICAgICB5OiBcIjc1XCIsXG4gICAgICAgIHJ4OiBcIjVcIixcbiAgICAgICAgcnk6IFwiNVwiLFxuICAgICAgICB3aWR0aDogXCIyMjBcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwXCJcbiAgICAgIH1cbiAgICB9KSwgaChcImNpcmNsZVwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICBjeDogXCIxMFwiLFxuICAgICAgICBjeTogXCIxMTBcIixcbiAgICAgICAgcjogXCI4XCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIyNVwiLFxuICAgICAgICB5OiBcIjEwNVwiLFxuICAgICAgICByeDogXCI1XCIsXG4gICAgICAgIHJ5OiBcIjVcIixcbiAgICAgICAgd2lkdGg6IFwiMjIwXCIsXG4gICAgICAgIGhlaWdodDogXCIxMFwiXG4gICAgICB9XG4gICAgfSldKTtcbiAgfVxufTtcblxudmFyIENvZGVMb2FkZXIgPSB7XG4gIG5hbWU6ICdDb2RlTG9hZGVyJyxcbiAgZnVuY3Rpb25hbDogdHJ1ZSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCwgX3JlZikge1xuICAgIHZhciBkYXRhID0gX3JlZi5kYXRhO1xuICAgIHJldHVybiBoKENvbnRlbnRMb2FkZXIsIGRhdGEsIFtoKFwicmVjdFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICB4OiBcIjBcIixcbiAgICAgICAgeTogXCIwXCIsXG4gICAgICAgIHJ4OiBcIjNcIixcbiAgICAgICAgcnk6IFwiM1wiLFxuICAgICAgICB3aWR0aDogXCI3MFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTBcIlxuICAgICAgfVxuICAgIH0pLCBoKFwicmVjdFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICB4OiBcIjgwXCIsXG4gICAgICAgIHk6IFwiMFwiLFxuICAgICAgICByeDogXCIzXCIsXG4gICAgICAgIHJ5OiBcIjNcIixcbiAgICAgICAgd2lkdGg6IFwiMTAwXCIsXG4gICAgICAgIGhlaWdodDogXCIxMFwiXG4gICAgICB9XG4gICAgfSksIGgoXCJyZWN0XCIsIHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIHg6IFwiMTkwXCIsXG4gICAgICAgIHk6IFwiMFwiLFxuICAgICAgICByeDogXCIzXCIsXG4gICAgICAgIHJ5OiBcIjNcIixcbiAgICAgICAgd2lkdGg6IFwiMTBcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwXCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIxNVwiLFxuICAgICAgICB5OiBcIjIwXCIsXG4gICAgICAgIHJ4OiBcIjNcIixcbiAgICAgICAgcnk6IFwiM1wiLFxuICAgICAgICB3aWR0aDogXCIxMzBcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwXCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIxNTVcIixcbiAgICAgICAgeTogXCIyMFwiLFxuICAgICAgICByeDogXCIzXCIsXG4gICAgICAgIHJ5OiBcIjNcIixcbiAgICAgICAgd2lkdGg6IFwiMTMwXCIsXG4gICAgICAgIGhlaWdodDogXCIxMFwiXG4gICAgICB9XG4gICAgfSksIGgoXCJyZWN0XCIsIHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIHg6IFwiMTVcIixcbiAgICAgICAgeTogXCI0MFwiLFxuICAgICAgICByeDogXCIzXCIsXG4gICAgICAgIHJ5OiBcIjNcIixcbiAgICAgICAgd2lkdGg6IFwiOTBcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwXCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIxMTVcIixcbiAgICAgICAgeTogXCI0MFwiLFxuICAgICAgICByeDogXCIzXCIsXG4gICAgICAgIHJ5OiBcIjNcIixcbiAgICAgICAgd2lkdGg6IFwiNjBcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwXCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIxODVcIixcbiAgICAgICAgeTogXCI0MFwiLFxuICAgICAgICByeDogXCIzXCIsXG4gICAgICAgIHJ5OiBcIjNcIixcbiAgICAgICAgd2lkdGg6IFwiNjBcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwXCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIwXCIsXG4gICAgICAgIHk6IFwiNjBcIixcbiAgICAgICAgcng6IFwiM1wiLFxuICAgICAgICByeTogXCIzXCIsXG4gICAgICAgIHdpZHRoOiBcIjMwXCIsXG4gICAgICAgIGhlaWdodDogXCIxMFwiXG4gICAgICB9XG4gICAgfSldKTtcbiAgfVxufTtcblxudmFyIEZhY2Vib29rTG9hZGVyID0ge1xuICBuYW1lOiAnRmFjZWJvb2tMb2FkZXInLFxuICBmdW5jdGlvbmFsOiB0cnVlLFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoLCBfcmVmKSB7XG4gICAgdmFyIGRhdGEgPSBfcmVmLmRhdGE7XG4gICAgcmV0dXJuIGgoQ29udGVudExvYWRlciwgZGF0YSwgW2goXCJyZWN0XCIsIHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIHg6IFwiNzBcIixcbiAgICAgICAgeTogXCIxNVwiLFxuICAgICAgICByeDogXCI0XCIsXG4gICAgICAgIHJ5OiBcIjRcIixcbiAgICAgICAgd2lkdGg6IFwiMTE3XCIsXG4gICAgICAgIGhlaWdodDogXCI2LjRcIlxuICAgICAgfVxuICAgIH0pLCBoKFwicmVjdFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICB4OiBcIjcwXCIsXG4gICAgICAgIHk6IFwiMzVcIixcbiAgICAgICAgcng6IFwiM1wiLFxuICAgICAgICByeTogXCIzXCIsXG4gICAgICAgIHdpZHRoOiBcIjg1XCIsXG4gICAgICAgIGhlaWdodDogXCI2LjRcIlxuICAgICAgfVxuICAgIH0pLCBoKFwicmVjdFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICB4OiBcIjBcIixcbiAgICAgICAgeTogXCI4MFwiLFxuICAgICAgICByeDogXCIzXCIsXG4gICAgICAgIHJ5OiBcIjNcIixcbiAgICAgICAgd2lkdGg6IFwiMzUwXCIsXG4gICAgICAgIGhlaWdodDogXCI2LjRcIlxuICAgICAgfVxuICAgIH0pLCBoKFwicmVjdFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICB4OiBcIjBcIixcbiAgICAgICAgeTogXCIxMDBcIixcbiAgICAgICAgcng6IFwiM1wiLFxuICAgICAgICByeTogXCIzXCIsXG4gICAgICAgIHdpZHRoOiBcIjM4MFwiLFxuICAgICAgICBoZWlnaHQ6IFwiNi40XCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIwXCIsXG4gICAgICAgIHk6IFwiMTIwXCIsXG4gICAgICAgIHJ4OiBcIjNcIixcbiAgICAgICAgcnk6IFwiM1wiLFxuICAgICAgICB3aWR0aDogXCIyMDFcIixcbiAgICAgICAgaGVpZ2h0OiBcIjYuNFwiXG4gICAgICB9XG4gICAgfSksIGgoXCJjaXJjbGVcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgY3g6IFwiMzBcIixcbiAgICAgICAgY3k6IFwiMzBcIixcbiAgICAgICAgcjogXCIzMFwiXG4gICAgICB9XG4gICAgfSldKTtcbiAgfVxufTtcblxudmFyIExpc3RMb2FkZXIgPSB7XG4gIG5hbWU6ICdMaXN0TG9hZGVyJyxcbiAgZnVuY3Rpb25hbDogdHJ1ZSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCwgX3JlZikge1xuICAgIHZhciBkYXRhID0gX3JlZi5kYXRhO1xuICAgIHJldHVybiBoKENvbnRlbnRMb2FkZXIsIGRhdGEsIFtoKFwicmVjdFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICB4OiBcIjBcIixcbiAgICAgICAgeTogXCIwXCIsXG4gICAgICAgIHJ4OiBcIjNcIixcbiAgICAgICAgcnk6IFwiM1wiLFxuICAgICAgICB3aWR0aDogXCIyNTBcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwXCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIyMFwiLFxuICAgICAgICB5OiBcIjIwXCIsXG4gICAgICAgIHJ4OiBcIjNcIixcbiAgICAgICAgcnk6IFwiM1wiLFxuICAgICAgICB3aWR0aDogXCIyMjBcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwXCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIyMFwiLFxuICAgICAgICB5OiBcIjQwXCIsXG4gICAgICAgIHJ4OiBcIjNcIixcbiAgICAgICAgcnk6IFwiM1wiLFxuICAgICAgICB3aWR0aDogXCIxNzBcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwXCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCIwXCIsXG4gICAgICAgIHk6IFwiNjBcIixcbiAgICAgICAgcng6IFwiM1wiLFxuICAgICAgICByeTogXCIzXCIsXG4gICAgICAgIHdpZHRoOiBcIjI1MFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTBcIlxuICAgICAgfVxuICAgIH0pLCBoKFwicmVjdFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICB4OiBcIjIwXCIsXG4gICAgICAgIHk6IFwiODBcIixcbiAgICAgICAgcng6IFwiM1wiLFxuICAgICAgICByeTogXCIzXCIsXG4gICAgICAgIHdpZHRoOiBcIjIwMFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTBcIlxuICAgICAgfVxuICAgIH0pLCBoKFwicmVjdFwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICB4OiBcIjIwXCIsXG4gICAgICAgIHk6IFwiMTAwXCIsXG4gICAgICAgIHJ4OiBcIjNcIixcbiAgICAgICAgcnk6IFwiM1wiLFxuICAgICAgICB3aWR0aDogXCI4MFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTBcIlxuICAgICAgfVxuICAgIH0pXSk7XG4gIH1cbn07XG5cbnZhciBJbnN0YWdyYW1Mb2FkZXIgPSB7XG4gIG5hbWU6ICdJbnN0YWdyYW1Mb2FkZXInLFxuICBmdW5jdGlvbmFsOiB0cnVlLFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoLCBfcmVmKSB7XG4gICAgdmFyIGRhdGEgPSBfcmVmLmRhdGE7XG4gICAgcmV0dXJuIGgoQ29udGVudExvYWRlciwgX21lcmdlSlNYUHJvcHMoW2RhdGEsIHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIGhlaWdodDogNDgwXG4gICAgICB9XG4gICAgfV0pLCBbaChcImNpcmNsZVwiLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICBjeDogXCIzMFwiLFxuICAgICAgICBjeTogXCIzMFwiLFxuICAgICAgICByOiBcIjMwXCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCI3NVwiLFxuICAgICAgICB5OiBcIjEzXCIsXG4gICAgICAgIHJ4OiBcIjRcIixcbiAgICAgICAgcnk6IFwiNFwiLFxuICAgICAgICB3aWR0aDogXCIxMDBcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEzXCJcbiAgICAgIH1cbiAgICB9KSwgaChcInJlY3RcIiwge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogXCI3NVwiLFxuICAgICAgICB5OiBcIjM3XCIsXG4gICAgICAgIHJ4OiBcIjRcIixcbiAgICAgICAgcnk6IFwiNFwiLFxuICAgICAgICB3aWR0aDogXCI1MFwiLFxuICAgICAgICBoZWlnaHQ6IFwiOFwiXG4gICAgICB9XG4gICAgfSksIGgoXCJyZWN0XCIsIHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIHg6IFwiMFwiLFxuICAgICAgICB5OiBcIjcwXCIsXG4gICAgICAgIHJ4OiBcIjVcIixcbiAgICAgICAgcnk6IFwiNVwiLFxuICAgICAgICB3aWR0aDogXCI0MDBcIixcbiAgICAgICAgaGVpZ2h0OiBcIjQwMFwiXG4gICAgICB9XG4gICAgfSldKTtcbiAgfVxufTtcblxuZXhwb3J0IHsgQ29udGVudExvYWRlciwgQnVsbGV0TGlzdExvYWRlciwgQ29kZUxvYWRlciwgRmFjZWJvb2tMb2FkZXIsIExpc3RMb2FkZXIsIEluc3RhZ3JhbUxvYWRlciB9O1xuIiwiPHRlbXBsYXRlPlxuICAgIDxkaXY+XG4gICAgICAgIDxkaXYgOnN0eWxlPVwieyBoZWlnaHQ6IDMwMCwgd2lkdGg6ICcxMDAlJyB9XCI+PC9kaXY+XG4gICAgICAgIDxjb250ZW50LWxvYWRlclxuICAgICAgICAgICAgOmhlaWdodD1cImZpeGVkQW1vdW50ICogY291bnRcIlxuICAgICAgICAgICAgOndpZHRoPVwiMTA2MFwiXG4gICAgICAgICAgICA6c3BlZWQ9XCIyXCJcbiAgICAgICAgICAgIHByaW1hcnlDb2xvcj1cIiNkOWQ5ZDlcIlxuICAgICAgICAgICAgc2Vjb25kYXJ5Q29sb3I9XCIjZWNlYmViXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiaW5kZXggaW4gY291bnRcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMTNcIiA6eT1cImZpeGVkQW1vdW50ICogaW5kZXggKyBvZmZzZXRcIiByeD1cIjZcIiByeT1cIjZcIiA6d2lkdGg9XCIyMDAgKiByYW5kb20oKVwiIGhlaWdodD1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNTMzXCIgOnk9XCJmaXhlZEFtb3VudCAqIGluZGV4ICsgb2Zmc2V0XCIgcng9XCI2XCIgcnk9XCI2XCIgOndpZHRoPVwiNjMgKiByYW5kb20oKVwiIGhlaWdodD1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNjUzXCIgOnk9XCJmaXhlZEFtb3VudCAqIGluZGV4ICsgb2Zmc2V0XCIgcng9XCI2XCIgcnk9XCI2XCIgOndpZHRoPVwiNzggKiByYW5kb20oKVwiIGhlaWdodD1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNzU1XCIgOnk9XCJmaXhlZEFtb3VudCAqIGluZGV4ICsgb2Zmc2V0XCIgcng9XCI2XCIgcnk9XCI2XCIgOndpZHRoPVwiMTE3ICogcmFuZG9tKClcIiBoZWlnaHQ9XCIxMlwiIC8+XG4gICAgICAgICAgICAgICAgPHJlY3QgeD1cIjkzOFwiIDp5PVwiZml4ZWRBbW91bnQgKiBpbmRleCArIG9mZnNldFwiIHJ4PVwiNlwiIHJ5PVwiNlwiIDp3aWR0aD1cIjgzICogcmFuZG9tKClcIiBoZWlnaHQ9XCIxMlwiIC8+XG5cbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMFwiIDp5PVwiZml4ZWRBbW91bnQgKiBpbmRleFwiIHJ4PVwiNlwiIHJ5PVwiNlwiIHdpZHRoPVwiMTA2MFwiIGhlaWdodD1cIi4zXCIgLz5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvY29udGVudC1sb2FkZXI+XG4gICAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuICAgIGltcG9ydCB7IENvbnRlbnRMb2FkZXIgfSBmcm9tICd2dWUtY29udGVudC1sb2FkZXInO1xuXG4gICAgZXhwb3J0IGRlZmF1bHQge1xuICAgICAgICBwcm9wczogWydzdG9yZSddLFxuICAgICAgICBkYXRhOiAoKSA9PiAoe1xuICAgICAgICAgICAgZml4ZWRBbW91bnQ6IDMxLFxuICAgICAgICAgICAgb2Zmc2V0OiAxMCxcbiAgICAgICAgICAgIHN0ZXBzOiBbMC43LCAwLjgsIDAuOSwgMV1cbiAgICAgICAgfSksXG4gICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICBjb3VudCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5wZXJQYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICByYW5kb20oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy5zdGVwcy5sZW5ndGgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgQ29udGVudExvYWRlclxuICAgICAgICB9XG4gICAgfVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTRbMF0ucnVsZXNbMF0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9Db250ZW50TG9hZGVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00WzBdLnJ1bGVzWzBdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vQ29udGVudExvYWRlci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCIiLCJpbXBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IGZyb20gXCIuL0NvbnRlbnRMb2FkZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZkZGE1NjUwJlwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL0NvbnRlbnRMb2FkZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5leHBvcnQgKiBmcm9tIFwiLi9Db250ZW50TG9hZGVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChtb2R1bGUuaG90KSB7XG4gIHZhciBhcGkgPSByZXF1aXJlKFwiL1VzZXJzL2RqYW1pbC9Qcm9qZWN0cy90cmlsYnkvX2dyYXYvZ3Jhdi1wbHVnaW4tZmxleC1vYmplY3RzL25vZGVfbW9kdWxlcy92dWUtaG90LXJlbG9hZC1hcGkvZGlzdC9pbmRleC5qc1wiKVxuICBhcGkuaW5zdGFsbChyZXF1aXJlKCd2dWUnKSlcbiAgaWYgKGFwaS5jb21wYXRpYmxlKSB7XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuICAgIGlmICghYXBpLmlzUmVjb3JkZWQoJzZkZGE1NjUwJykpIHtcbiAgICAgIGFwaS5jcmVhdGVSZWNvcmQoJzZkZGE1NjUwJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZWxvYWQoJzZkZGE1NjUwJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfVxuICAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiLi9Db250ZW50TG9hZGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02ZGRhNTY1MCZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgYXBpLnJlcmVuZGVyKCc2ZGRhNTY1MCcsIHtcbiAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgIHN0YXRpY1JlbmRlckZuczogc3RhdGljUmVuZGVyRm5zXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwiYXBwL2xpc3QvY29tcG9uZW50cy9Db250ZW50TG9hZGVyLnZ1ZVwiXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyIsIjx0ZW1wbGF0ZT5cbiAgICA8ZGl2PlxuICAgICAgICA8ZmxleC1maWx0ZXItYmFyIDpzdG9yZT1cInN0b3JlXCIgLz5cbiAgICAgICAgPGZsZXgtY29udGVudC1sb2FkZXIgOnN0b3JlPVwic3RvcmVcIiB2LXNob3c9XCJsb2FkaW5nXCIgLz5cbiAgICAgICAgPGZsZXgtdGFibGUgOnN0b3JlPVwic3RvcmVcIiB2LW1vZGVsPVwibG9hZGluZ1wiIHYtc2hvdz1cIiFsb2FkaW5nXCIgLz5cbiAgICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG4gICAgaW1wb3J0IEZsZXhUYWJsZSBmcm9tICcuL2NvbXBvbmVudHMvVGFibGUudnVlJztcbiAgICBpbXBvcnQgRmxleEZpbHRlckJhciBmcm9tICcuL2NvbXBvbmVudHMvRmlsdGVyQmFyLnZ1ZSc7XG4gICAgaW1wb3J0IEZsZXhDb250ZW50TG9hZGVyIGZyb20gJy4vY29tcG9uZW50cy9Db250ZW50TG9hZGVyLnZ1ZSc7XG5cbiAgICBleHBvcnQgZGVmYXVsdCB7XG4gICAgICAgIHByb3BzOiBbJ2luaXRpYWxTdG9yZSddLFxuICAgICAgICBjb21wb25lbnRzOiB7RmxleFRhYmxlLCBGbGV4RmlsdGVyQmFyLCBGbGV4Q29udGVudExvYWRlcn0sXG4gICAgICAgIGRhdGE6ICgpID0+ICh7XG4gICAgICAgICAgICBwZXJQYWdlOiAxMCxcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWVcbiAgICAgICAgfSksXG4gICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICBzdG9yZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmluaXRpYWxTdG9yZSB8fCAne30nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbjwvc2NyaXB0PlxuIiwiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00WzBdLnJ1bGVzWzBdIS4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vQXBwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00WzBdLnJ1bGVzWzBdIS4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vQXBwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIiIsImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vQXBwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01NGIxMTBjYyZcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9BcHAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5leHBvcnQgKiBmcm9tIFwiLi9BcHAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuaW1wb3J0IG5vcm1hbGl6ZXIgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKG1vZHVsZS5ob3QpIHtcbiAgdmFyIGFwaSA9IHJlcXVpcmUoXCIvVXNlcnMvZGphbWlsL1Byb2plY3RzL3RyaWxieS9fZ3Jhdi9ncmF2LXBsdWdpbi1mbGV4LW9iamVjdHMvbm9kZV9tb2R1bGVzL3Z1ZS1ob3QtcmVsb2FkLWFwaS9kaXN0L2luZGV4LmpzXCIpXG4gIGFwaS5pbnN0YWxsKHJlcXVpcmUoJ3Z1ZScpKVxuICBpZiAoYXBpLmNvbXBhdGlibGUpIHtcbiAgICBtb2R1bGUuaG90LmFjY2VwdCgpXG4gICAgaWYgKCFhcGkuaXNSZWNvcmRlZCgnNTRiMTEwY2MnKSkge1xuICAgICAgYXBpLmNyZWF0ZVJlY29yZCgnNTRiMTEwY2MnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbG9hZCgnNTRiMTEwY2MnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIuL0FwcC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NTRiMTEwY2MmXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwaS5yZXJlbmRlcignNTRiMTEwY2MnLCB7XG4gICAgICAgIHJlbmRlcjogcmVuZGVyLFxuICAgICAgICBzdGF0aWNSZW5kZXJGbnM6IHN0YXRpY1JlbmRlckZuc1xuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcImFwcC9saXN0L0FwcC52dWVcIlxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50LmV4cG9ydHMiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG5pbXBvcnQgVnVlRXZlbnRzIGZyb20gJ3Z1ZS1ldmVudHMnO1xuaW1wb3J0IEFwcCBmcm9tICcuL0FwcC52dWUnO1xuXG5WdWUudXNlKFZ1ZUV2ZW50cyk7XG5cbmNvbnN0IElEID0gJyNmbGV4LW9iamVjdHMtbGlzdCc7XG5jb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihJRCk7XG5cbmlmIChlbGVtZW50KSB7XG4gICAgY29uc3QgaW5pdGlhbFN0b3JlID0gZWxlbWVudC5kYXRhc2V0LmluaXRpYWxTdG9yZTtcblxuICAgIG5ldyBWdWUoeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgICBlbDogSUQsXG4gICAgICAgIHJlbmRlcjogaCA9PiBoKEFwcCwge1xuICAgICAgICAgICAgcHJvcHM6IHtpbml0aWFsU3RvcmV9XG4gICAgICAgIH0pXG4gICAgfSk7XG59XG4iLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0galF1ZXJ5OyIsIi8qKlxuICogKGMpIFRyaWxieSBNZWRpYSwgTExDXG4gKiBBdXRob3IgRGphbWlsIExlZ2F0b1xuICpcbiAqIEJhc2VkIG9uIE1hcmsgTWF0eWFzJ3MgRmluZGVyanNcbiAqIE1JVCBMaWNlbnNlXG4gKi9cblxuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRlbWl0dGVyMyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUUyA9IHtcbiAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgIHZhbHVlS2V5OiAndmFsdWUnLCAvLyBuZXdcbiAgICBjaGlsZEtleTogJ2NoaWxkcmVuJyxcbiAgICBpY29uS2V5OiAnaWNvbicsIC8vIG5ld1xuICAgIGl0ZW1LZXk6ICdpdGVtLWtleScsIC8vIG5ld1xuICAgIGl0ZW1UcmlnZ2VyOiBudWxsLFxuICAgIHBhdGhCYXI6IHRydWUsXG4gICAgY2xhc3NOYW1lOiB7XG4gICAgICAgIGNvbnRhaW5lcjogJ2Zqcy1jb250YWluZXInLFxuICAgICAgICBwYXRoQmFyOiAnZmpzLXBhdGgtYmFyJyxcbiAgICAgICAgY29sOiAnZmpzLWNvbCcsXG4gICAgICAgIGxpc3Q6ICdmanMtbGlzdCcsXG4gICAgICAgIGl0ZW06ICdmanMtaXRlbScsXG4gICAgICAgIGFjdGl2ZTogJ2Zqcy1hY3RpdmUnLFxuICAgICAgICBjaGlsZHJlbjogJ2Zqcy1oYXMtY2hpbGRyZW4nLFxuICAgICAgICB1cmw6ICdmanMtdXJsJyxcbiAgICAgICAgaXRlbVByZXBlbmQ6ICdmanMtaXRlbS1wcmVwZW5kJyxcbiAgICAgICAgaXRlbUNvbnRlbnQ6ICdmanMtaXRlbS1jb250ZW50JyxcbiAgICAgICAgaXRlbUFwcGVuZDogJ2Zqcy1pdGVtLWFwcGVuZCdcbiAgICB9XG59O1xuXG5jbGFzcyBGaW5kZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLiRlbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9ICQoY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcblxuICAgICAgICB0aGlzLmNvbmZpZyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBERUZBVUxUUywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLm9mZignY2xpY2suZmluZGVyIGtleWRvd24uZmluZGVyJyk7XG5cbiAgICAgICAgLy8gZG9tIGV2ZW50c1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5vbignY2xpY2suZmluZGVyJywgdGhpcy5jbGlja0V2ZW50LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5vbigna2V5ZG93bi5maW5kZXInLCB0aGlzLmtleWRvd25FdmVudC5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyBpbnRlcm5hbCBldmVudHNcbiAgICAgICAgdGhpcy4kZW1pdHRlci5vbignaXRlbS1zZWxlY3RlZCcsIHRoaXMuaXRlbVNlbGVjdGVkLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLiRlbWl0dGVyLm9uKCdjcmVhdGUtY29sdW1uJywgdGhpcy5hZGRDb2x1bW4uYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuJGVtaXR0ZXIub24oJ25hdmlnYXRlJywgdGhpcy5uYXZpZ2F0ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy4kZW1pdHRlci5vbignZ28tdG8nLCB0aGlzLmdvVG8uYmluZCh0aGlzLCB0aGlzLmRhdGEpKTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNvbmZpZy5jbGFzc05hbWUuY29udGFpbmVyKS5hdHRyKCd0YWJpbmRleCcsIDApO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlQ29sdW1uKHRoaXMuZGF0YSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnBhdGhCYXIpIHtcbiAgICAgICAgICAgIHRoaXMucGF0aEJhciA9IHRoaXMuY3JlYXRlUGF0aEJhcigpO1xuICAgICAgICAgICAgdGhpcy5wYXRoQmFyLm9uKCdjbGljay5maW5kZXInLCAnW2RhdGEtYnJlYWRjcnVtYi1ub2RlXScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2JyZWFkY3J1bWJOb2RlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5nb1RvKHRoaXMuZGF0YSwgbG9jYXRpb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAnJyBpcyA8Um9vdD5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmRlZmF1bHRQYXRoIHx8IHRoaXMuY29uZmlnLmRlZmF1bHRQYXRoID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5nb1RvKHRoaXMuZGF0YSwgdGhpcy5jb25maWcuZGVmYXVsdFBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVsb2FkKGRhdGEgPSB0aGlzLmRhdGEpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDb2x1bW4oZGF0YSk7XG5cbiAgICAgICAgLy8gJycgaXMgPFJvb3Q+XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWZhdWx0UGF0aCB8fCB0aGlzLmNvbmZpZy5kZWZhdWx0UGF0aCA9PT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuZ29UbyhkYXRhLCB0aGlzLmNvbmZpZy5kZWZhdWx0UGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVDb2x1bW4oZGF0YSwgcGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKGRhdGEpID0+IHRoaXMuY3JlYXRlQ29sdW1uKGRhdGEsIHBhcmVudCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBkYXRhLmNhbGwodGhpcywgcGFyZW50LCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gQXJyYXkuZnJvbShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLmNvbmZpZy5jcmVhdGVMaXN0IHx8IHRoaXMuY3JlYXRlTGlzdDtcbiAgICAgICAgICAgIGNvbnN0IGRpdiA9ICQoJzxkaXYgLz4nKTtcbiAgICAgICAgICAgIGRpdi5hcHBlbmQobGlzdC5jYWxsKHRoaXMsIGRhdGEpKS5hZGRDbGFzcyh0aGlzLmNvbmZpZy5jbGFzc05hbWUuY29sKTtcbiAgICAgICAgICAgIHRoaXMuJGVtaXR0ZXIuZW1pdCgnY3JlYXRlLWNvbHVtbicsIGRpdik7XG5cbiAgICAgICAgICAgIHJldHVybiBkaXY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZGF0YSB0eXBlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVQYXRoQmFyKCkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5zaWJsaW5ncyhgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLnBhdGhCYXJ9YCkucmVtb3ZlKCk7XG4gICAgICAgIGNvbnN0IHBhdGhCYXIgPSAkKGA8ZGl2IGNsYXNzPVwiJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUucGF0aEJhcn1cIiAvPmApO1xuICAgICAgICBwYXRoQmFyLmluc2VydEFmdGVyKHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgICByZXR1cm4gcGF0aEJhcjtcbiAgICB9XG5cbiAgICBjbGlja0V2ZW50KGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGFyZ2V0LmNsb3Nlc3QoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5jb2x9YCk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0YXJnZXQuY2xvc2VzdChgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLml0ZW19YCk7XG4gICAgICAgIGNvbnN0IHByZXZlbnQgPSB0YXJnZXQuaXMoJ1tkYXRhLWZsZXhwYWdlcy1wcmV2ZW50XScpID8gdGFyZ2V0IDogdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLWZsZXhwYWdlcy1wcmV2ZW50XScpO1xuXG4gICAgICAgIGlmIChwcmV2ZW50LmRhdGEoJ2ZsZXhwYWdlc1ByZXZlbnQnKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pdGVtVHJpZ2dlcikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5pcyh0aGlzLmNvbmZpZy5pdGVtVHJpZ2dlcikgfHwgdGFyZ2V0LmNsb3Nlc3QodGhpcy5jb25maWcuaXRlbVRyaWdnZXIpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLiRlbWl0dGVyLmVtaXQoJ2l0ZW0tc2VsZWN0ZWQnLCB7Y29sdW1uLCBpdGVtfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKGl0ZW0ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLiRlbWl0dGVyLmVtaXQoJ2l0ZW0tc2VsZWN0ZWQnLCB7IGNvbHVtbiwgaXRlbSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGtleWRvd25FdmVudChldmVudCkge1xuICAgICAgICBjb25zdCBjb2RlcyA9IHsgMzc6ICdsZWZ0JywgMzg6ICd1cCcsIDM5OiAncmlnaHQnLCA0MDogJ2Rvd24nLCAxMzogJ2VudGVyJyB9O1xuXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlIGluIGNvZGVzKSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIHRoaXMuJGVtaXR0ZXIuZW1pdCgnbmF2aWdhdGUnLCB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBjb2Rlc1tldmVudC5rZXlDb2RlXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpdGVtU2VsZWN0ZWQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHZhbHVlLml0ZW07XG4gICAgICAgIGlmICghZWxlbWVudC5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50WzBdLl9pdGVtO1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB2YWx1ZS5jb2x1bW47XG4gICAgICAgIGNvbnN0IGRhdGEgPSBpdGVtW3RoaXMuY29uZmlnLmNoaWxkS2V5XSB8fCB0aGlzLmRhdGE7IC8vIFRPRE86IHRoaXMuZGF0YSBmb3IgY29uc3RhbnQgcmVmcmVzaFxuICAgICAgICBjb25zdCBhY3RpdmUgPSAkKGNvbHVtbikuZmluZChgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLmFjdGl2ZX1gKTtcblxuICAgICAgICBpZiAoYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICAgICAgYWN0aXZlLnJlbW92ZUNsYXNzKHRoaXMuY29uZmlnLmNsYXNzTmFtZS5hY3RpdmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5hZGRDbGFzcyh0aGlzLmNvbmZpZy5jbGFzc05hbWUuYWN0aXZlKTtcbiAgICAgICAgY29sdW1uLm5leHRBbGwoKS5yZW1vdmUoKTsgLy8gPyE/IT9cblxuICAgICAgICB0aGlzLmNvbnRhaW5lclswXS5mb2N1cygpO1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8od2luZG93LnBhZ2VYT2Zmc2V0LCB3aW5kb3cucGFnZVlPZmZzZXQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlUGF0aEJhcigpO1xuXG4gICAgICAgIGxldCBuZXdDb2x1bW47XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBuZXdDb2x1bW4gPSB0aGlzLmNyZWF0ZUNvbHVtbihkYXRhLCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuJGVtaXR0ZXIuZW1pdCgnaW50ZXJpb3Itc2VsZWN0ZWQnLCBpdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuJGVtaXR0ZXIuZW1pdCgnbGVhZi1zZWxlY3RlZCcsIGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld0NvbHVtbjtcbiAgICB9XG5cbiAgICBhZGRDb2x1bW4oY29sdW1uKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChjb2x1bW4pO1xuICAgICAgICB0aGlzLiRlbWl0dGVyLmVtaXQoJ2NvbHVtbi1jcmVhdGVkJywgY29sdW1uKTtcbiAgICB9XG5cbiAgICBuYXZpZ2F0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmZpbmRMYXN0QWN0aXZlKCk7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHZhbHVlLmRpcmVjdGlvbjtcbiAgICAgICAgbGV0IGNvbHVtbjtcbiAgICAgICAgbGV0IGl0ZW07XG4gICAgICAgIGxldCB0YXJnZXQ7XG5cbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgICAgaXRlbSA9IGFjdGl2ZS5pdGVtO1xuICAgICAgICAgICAgY29sdW1uID0gYWN0aXZlLmNvbHVtbjtcblxuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3VwJyAmJiBpdGVtLnByZXYoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBpdGVtLnByZXYoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnZG93bicgJiYgaXRlbS5uZXh0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gaXRlbS5uZXh0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3JpZ2h0JyAmJiBjb2x1bW4ubmV4dCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGNvbHVtbi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gY29sdW1uLmZpbmQoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5pdGVtfWApLmZpcnN0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnICYmIGNvbHVtbi5wcmV2KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uLnByZXYoKTtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb2x1bW4uZmluZChgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLmFjdGl2ZX1gKS5maXJzdCgpIHx8IGNvbHVtbi5maW5kKGAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUuaXRlbX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbHVtbiA9IHRoaXMuY29udGFpbmVyLmZpbmQoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5jb2x9YCkuZmlyc3QoKTtcbiAgICAgICAgICAgIHRhcmdldCA9IGNvbHVtbi5maW5kKGAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUuaXRlbX1gKS5maXJzdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGl2ZSAmJiBkaXJlY3Rpb24gPT09ICdlbnRlcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSBhY3RpdmUuaXRlbS5maW5kKCdhJykucHJvcCgnaHJlZicpO1xuICAgICAgICAgICAgaWYgKGhyZWYpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBocmVmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy4kZW1pdHRlci5lbWl0KCdpdGVtLXNlbGVjdGVkJywge1xuICAgICAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgICAgICBpdGVtOiB0YXJnZXRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJblZpZXcodGFyZ2V0LCBjb2x1bW4sIHRydWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpZXcodGFyZ2V0WzBdLCBjb2x1bW5bMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ29UbyhkYXRhLCBwYXRoKSB7XG4gICAgICAgIHBhdGggPSBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGguc3BsaXQoJy8nKS5tYXAoYml0ID0+IGJpdC50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICBpZiAocGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNoaWxkcmVuKCkucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGRhdGEuY2FsbCh0aGlzLCBudWxsLCAoZGF0YSkgPT4gdGhpcy5zZWxlY3RQYXRoKHBhdGgsIGRhdGEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0UGF0aChwYXRoLCBkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdFBhdGgocGF0aCwgZGF0YSwgY29sdW1uKSB7XG4gICAgICAgIGNvbHVtbiA9IGNvbHVtbiB8fCAocGF0aC5sZW5ndGggPyB0aGlzLmNyZWF0ZUNvbHVtbihkYXRhKSA6IHRoaXMuY29udGFpbmVyLmZpbmQoYD4gLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLmNvbH1gKSk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHBhdGhbMF0gfHwgJyc7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZGF0YS5maW5kKChpdGVtKSA9PiBpdGVtW3RoaXMuY29uZmlnLml0ZW1LZXldID09PSBjdXJyZW50KTtcbiAgICAgICAgY29uc3QgaXRlbSA9IGNvbHVtbi5maW5kKGBbZGF0YS1manMtaXRlbT1cIiR7Y3VycmVudH1cIl1gKS5maXJzdCgpO1xuICAgICAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLml0ZW1TZWxlY3RlZCh7XG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgICBpdGVtXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0luVmlldyhpdGVtLCBjb2x1bW4sIHRydWUpKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvVmlldyhpdGVtWzBdLCBjb2x1bW5bMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF0aC5zaGlmdCgpO1xuXG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCAmJiBjaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RQYXRoKHBhdGgsIGNoaWxkcmVuW3RoaXMuY29uZmlnLmNoaWxkS2V5XSwgbmV3Q29sdW1uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZpbmRMYXN0QWN0aXZlKCkge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmNvbnRhaW5lci5maW5kKGAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUuYWN0aXZlfWApO1xuICAgICAgICBpZiAoIWFjdGl2ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbSA9IGFjdGl2ZS5sYXN0KCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGl0ZW0uY2xvc2VzdChgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLmNvbH1gKTtcblxuICAgICAgICByZXR1cm4geyBpdGVtLCBjb2x1bW4gfTtcbiAgICB9XG5cbiAgICBjcmVhdGVMaXN0KGRhdGEpIHtcbiAgICAgICAgY29uc3QgbGlzdCA9ICQoJzx1bCAvPicpO1xuICAgICAgICBjb25zdCBjcmVhdGVJdGVtID0gdGhpcy5jb25maWcuY3JlYXRlSXRlbSB8fCB0aGlzLmNyZWF0ZUl0ZW07XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZGF0YS5tYXAoKGl0ZW0pID0+IGNyZWF0ZUl0ZW0uY2FsbCh0aGlzLCBpdGVtKSk7XG5cbiAgICAgICAgY29uc3QgZnJhZ21lbnRzID0gaXRlbXMucmVkdWNlKChmcmFnbWVudCwgY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY3VycmVudFswXSB8fCBjdXJyZW50KTtcblxuICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgICAgICB9LCBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuXG4gICAgICAgIGxpc3QuYXBwZW5kKGZyYWdtZW50cykuYWRkQ2xhc3ModGhpcy5jb25maWcuY2xhc3NOYW1lLmxpc3QpO1xuXG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIGNyZWF0ZUl0ZW0oaXRlbSkge1xuICAgICAgICBjb25zdCBsaXN0SXRlbSA9ICQoJzxsaSAvPicpO1xuICAgICAgICBjb25zdCBsaXN0SXRlbUNsYXNzZXMgPSBbdGhpcy5jb25maWcuY2xhc3NOYW1lLml0ZW1dO1xuICAgICAgICBjb25zdCBsaW5rID0gJChgPGEgaHJlZj1cIiR7aXRlbS5ocmVmIHx8ICcnfVwiIC8+YCk7XG4gICAgICAgIGNvbnN0IGNyZWF0ZUl0ZW1Db250ZW50ID0gdGhpcy5jb25maWcuY3JlYXRlSXRlbUNvbnRlbnQgfHwgdGhpcy5jcmVhdGVJdGVtQ29udGVudDtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVJdGVtQ29udGVudC5jYWxsKHRoaXMsIGl0ZW0pO1xuICAgICAgICBsaW5rLmFwcGVuZChmcmFnbWVudClcbiAgICAgICAgICAgIC5hdHRyKCdocmVmJywgJycpXG4gICAgICAgICAgICAuYXR0cigndGFiaW5kZXgnLCAtMSk7XG5cbiAgICAgICAgaWYgKGl0ZW0udXJsKSB7XG4gICAgICAgICAgICBsaW5rLmF0dHIoJ2hyZWYnLCBpdGVtLnVybCk7XG4gICAgICAgICAgICBsaXN0SXRlbUNsYXNzZXMucHVzaChpdGVtLmNsYXNzTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXRlbVt0aGlzLmNvbmZpZy5jaGlsZEtleV0pIHtcbiAgICAgICAgICAgIGxpc3RJdGVtQ2xhc3Nlcy5wdXNoKHRoaXMuY29uZmlnLmNsYXNzTmFtZVt0aGlzLmNvbmZpZy5jaGlsZEtleV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGlzdEl0ZW0uYWRkQ2xhc3MobGlzdEl0ZW1DbGFzc2VzLmpvaW4oJyAnKSk7XG4gICAgICAgIGxpc3RJdGVtLmFwcGVuZChsaW5rKVxuICAgICAgICAgICAgLmF0dHIoJ2RhdGEtZmpzLWl0ZW0nLCBpdGVtW3RoaXMuY29uZmlnLml0ZW1LZXldKTtcblxuICAgICAgICBsaXN0SXRlbVswXS5faXRlbSA9IGl0ZW07XG5cbiAgICAgICAgcmV0dXJuIGxpc3RJdGVtO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhdGhCYXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25maWcucGF0aEJhcikgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICBjb25zdCBhY3RpdmVJdGVtcyA9IHRoaXMuY29udGFpbmVyLmZpbmQoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5hY3RpdmV9YCk7XG4gICAgICAgIGxldCBpdGVtS2V5cyA9ICcnO1xuICAgICAgICB0aGlzLnBhdGhCYXIuZW1wdHkoKTtcbiAgICAgICAgYWN0aXZlSXRlbXMuZWFjaCgoaW5kZXgsIGFjdGl2ZUl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBhY3RpdmVJdGVtLl9pdGVtO1xuICAgICAgICAgICAgY29uc3QgaXNMYXN0ID0gKGluZGV4ICsgMSkgPT09IGFjdGl2ZUl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgIGl0ZW1LZXlzICs9IGAvJHtpdGVtW3RoaXMuY29uZmlnLml0ZW1LZXldfWA7XG4gICAgICAgICAgICB0aGlzLnBhdGhCYXIuYXBwZW5kKGBcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyZWFkY3J1bWItbm9kZSAke2l0ZW0uaWNvbn1cIiAke2l0ZW0udHlwZSA9PT0gJ2RpcicgfHwgaXRlbS5jaGlsZF9jb3VudCA+IDAgPyBgZGF0YS1icmVhZGNydW1iLW5vZGU9XCIke2l0ZW1LZXlzfVwiYCA6ICcnfT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIke2l0ZW0uaWNvbn1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJlYWRjcnVtYi1ub2RlLW5hbWVcIj4keyQoJzxkaXYgLz4nKS50ZXh0KGl0ZW1bdGhpcy5jb25maWcubGFiZWxLZXldKS5odG1sKCl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAkeyFpc0xhc3QgPyAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1jaGV2cm9uLXJpZ2h0XCI+PC9pPicgOiAnJ31cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICBgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0SWNvbih0eXBlKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAncm9vdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmYS1zaXRlbWFwJztcbiAgICAgICAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZmEtZmlsZS1vJztcbiAgICAgICAgICAgIGNhc2UgJ2Rpcic6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnZmEtZm9sZGVyJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzSW5WaWV3KGVsZW1lbnQsIGNvbnRhaW5lciwgcGFydGlhbCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQubGVuZ3RoIHx8ICFjb250YWluZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudFRvcCA9ICQoZWxlbWVudCkub2Zmc2V0KCkudG9wIC0gY29udGFpbmVyLm9mZnNldCgpLnRvcDtcbiAgICAgICAgY29uc3QgZWxlbWVudEJvdHRvbSA9IGVsZW1lbnRUb3AgKyAkKGVsZW1lbnQpLmhlaWdodCgpO1xuXG4gICAgICAgIGNvbnN0IGlzVG90YWwgPSAoZWxlbWVudFRvcCA+PSAwICYmIGVsZW1lbnRCb3R0b20gPD0gY29udGFpbmVySGVpZ2h0KTtcbiAgICAgICAgY29uc3QgaXNQYXJ0aWFsID0gKChlbGVtZW50VG9wIDwgMCAmJiBlbGVtZW50Qm90dG9tID4gMCkgfHwgKGVsZW1lbnRUb3AgPiAwICYmIGVsZW1lbnRUb3AgPD0gY29udGFpbmVyLmhlaWdodCgpKSkgJiYgcGFydGlhbDtcblxuICAgICAgICByZXR1cm4gaXNUb3RhbCB8fCBpc1BhcnRpYWw7XG4gICAgfVxuXG4gICAgc2Nyb2xsVG9WaWV3KGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAgICAgICBjb25zdCB0b3AgPSBwYXJzZUludChjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLCAxMCk7XG4gICAgICAgIGNvbnN0IGJvdCA9IHBhcnNlSW50KGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20sIDEwKTtcblxuICAgICAgICBjb25zdCBub3dfdG9wID0gcGFyc2VJbnQoZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AsIDEwKTtcbiAgICAgICAgY29uc3Qgbm93X2JvdCA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tLCAxMCk7XG5cbiAgICAgICAgbGV0IHNjcm9sbF9ieSA9IDA7XG4gICAgICAgIGlmIChub3dfdG9wIDwgdG9wKSB7XG4gICAgICAgICAgICBzY3JvbGxfYnkgPSAtKHRvcCAtIG5vd190b3ApO1xuICAgICAgICB9IGVsc2UgaWYgKG5vd19ib3QgPiBib3QpIHtcbiAgICAgICAgICAgIHNjcm9sbF9ieSA9IG5vd19ib3QgLSBib3Q7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2Nyb2xsX2J5ICE9PSAwKSB7XG4gICAgICAgICAgICBjb250YWluZXIuc2Nyb2xsVG9wICs9IHNjcm9sbF9ieTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmluZGVyO1xuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBGaW5kZXIgZnJvbSAnLi4vdXRpbHMvZmluZGVyJztcbmltcG9ydCB7IGdldEluaXRpYWxSb3V0ZSwgZ2V0U3RvcmUsIHNldEluaXRpYWxSb3V0ZSB9IGZyb20gJy4vaW5kZXgnO1xuLy8gaW1wb3J0IGdldEZpbHRlcnMgZnJvbSAnLi4vdXRpbHMvZ2V0LWZpbHRlcnMnO1xuXG5sZXQgWEhSVVVJRCA9IDA7XG5jb25zdCBHUkFWX0NPTkZJRyA9IHR5cGVvZiBnbG9iYWwuR3JhdkNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwuR3JhdkNvbmZpZyA6IGdsb2JhbC5HcmF2QWRtaW4uY29uZmlnO1xuXG5leHBvcnQgY29uc3QgSW5zdGFuY2VzID0ge307XG5cbmNvbnN0IGlzSW5WaWV3cG9ydCA9IChlbGVtKSA9PiB7XG4gICAgY29uc3QgYm91bmRpbmcgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRpdGxlYmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RpdGxlYmFyJyk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGl0bGViYXIgPyB0aXRsZWJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgOiAwO1xuICAgIHJldHVybiAoXG4gICAgICAgIGJvdW5kaW5nLnRvcCA+PSBvZmZzZXQgJiZcbiAgICAgICAgYm91bmRpbmcubGVmdCA+PSAwICYmXG4gICAgICAgIGJvdW5kaW5nLmJvdHRvbSA8PSAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpICYmXG4gICAgICAgIGJvdW5kaW5nLnJpZ2h0IDw9ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjbGFzcyBGbGV4UGFnZXMge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgZGF0YSkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9ICQoY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgY29uc3QgZGF0YUxvYWQgPSB0aGlzLmRhdGFMb2FkO1xuXG4gICAgICAgIHRoaXMuZmluZGVyID0gbmV3IEZpbmRlcihcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLFxuICAgICAgICAgICAgKHBhcmVudCwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YUxvYWQuY2FsbCh0aGlzLCBwYXJlbnQsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWxLZXk6ICd0aXRsZScsXG4gICAgICAgICAgICAgICAgZGVmYXVsdFBhdGg6IGdldEluaXRpYWxSb3V0ZSgpLFxuICAgICAgICAgICAgICAgIGl0ZW1UcmlnZ2VyOiAnW2RhdGEtZmxleHBhZ2VzLWV4cGFuZF0nLFxuICAgICAgICAgICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZsZXhQYWdlcy5jcmVhdGVJdGVtKHRoaXMuY29uZmlnLCBpdGVtLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNyZWF0ZUl0ZW1Db250ZW50OiBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGbGV4UGFnZXMuY3JlYXRlSXRlbUNvbnRlbnQodGhpcy5jb25maWcsIGl0ZW0sIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmZpbmRlci4kZW1pdHRlci5vbignbGVhZi1zZWxlY3RlZCcsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBzZXRJbml0aWFsUm91dGUoe1xuICAgICAgICAgICAgICAgIHJvdXRlOiBpdGVtLnJvdXRlLnJhd1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmluZGVyLiRlbWl0dGVyLm9uKCdpbnRlcmlvci1zZWxlY3RlZCcsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBzZXRJbml0aWFsUm91dGUoe1xuICAgICAgICAgICAgICAgIHJvdXRlOiBpdGVtLnJvdXRlLnJhd1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qXG4gICAgICAgIHRoaXMuZmluZGVyLiRlbWl0dGVyLm9uKCdsZWFmLXNlbGVjdGVkJywgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzZWxlY3RlZCcsIGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy5maW5kZXIuZW1pdCgnY3JlYXRlLWNvbHVtbicsICgpID0+IHRoaXMuY3JlYXRlU2ltcGxlQ29sdW1uKGl0ZW0pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5maW5kZXIuJGVtaXR0ZXIub24oJ2l0ZW0tc2VsZWN0ZWQnLCAoc2VsZWN0ZWQpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzZWxlY3RlZCcsIHNlbGVjdGVkKTtcbiAgICAgICAgICAgIC8vIGZvciBmdXR1cmUgdXNlIG9ubHkgLSBjcmVhdGUgY29sdW1uLWNhcmQgY3JlYXRpb24gZm9yIGZpbGUgd2l0aCBkZXRhaWxzIGxpa2UgaW4gbWFjT1MgZmluZGVyXG4gICAgICAgICAgICAvLyB0aGlzLmZpbmRlci4kZW1pdHRlcignY3JlYXRlLWNvbHVtbicsICgpID0+IHRoaXMuY3JlYXRlU2ltcGxlQ29sdW1uKHNlbGVjdGVkKSk7XG4gICAgICAgIH0pOyAqL1xuXG4gICAgICAgIHRoaXMuZmluZGVyLiRlbWl0dGVyLm9uKCdjb2x1bW4tY3JlYXRlZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyWzBdLnNjcm9sbExlZnQgPSB0aGlzLmNvbnRhaW5lclswXS5zY3JvbGxXaWR0aCAtIHRoaXMuY29udGFpbmVyWzBdLmNsaWVudFdpZHRoO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSXRlbShjb25maWcsIGl0ZW0sIGZpbmRlcikge1xuICAgICAgICBjb25zdCBsaXN0SXRlbSA9ICQoJzxsaSAvPicpO1xuICAgICAgICBjb25zdCBsaXN0SXRlbUNsYXNzZXMgPSBbY29uZmlnLmNsYXNzTmFtZS5pdGVtXTtcbiAgICAgICAgLy8gY29uc3QgaHJlZiA9IGAke0dSQVZfQ09ORklHLmN1cnJlbnRfdXJsfS8ke2l0ZW0ucm91dGUucmF3fWAucmVwbGFjZSgnLy8nLCAnLycpO1xuICAgICAgICBjb25zdCBsaW5rID0gJCgnPGRpdiBjbGFzcz1cImZqcy1pdGVtLXdyYXBwZXJcIiAvPicpO1xuICAgICAgICBjb25zdCBjcmVhdGVJdGVtQ29udGVudCA9IGNvbmZpZy5jcmVhdGVJdGVtQ29udGVudCB8fCBmaW5kZXIuY3JlYXRlSXRlbUNvbnRlbnQ7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlSXRlbUNvbnRlbnQuY2FsbCh0aGlzLCBpdGVtKTtcbiAgICAgICAgbGluay5hcHBlbmQoZnJhZ21lbnQpXG4gICAgICAgIC8vIC5hdHRyKCdocmVmJywgaHJlZilcbiAgICAgICAgICAgIC5hdHRyKCd0YWJpbmRleCcsIC0xKTtcblxuICAgICAgICBpZiAoaXRlbS51cmwpIHtcbiAgICAgICAgICAgIGxpbmsuYXR0cignaHJlZicsIGl0ZW0udXJsKTtcbiAgICAgICAgICAgIGxpc3RJdGVtQ2xhc3Nlcy5wdXNoKGl0ZW0uY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtW2NvbmZpZy5jaGlsZEtleV0pIHtcbiAgICAgICAgICAgIGxpc3RJdGVtQ2xhc3Nlcy5wdXNoKGNvbmZpZy5jbGFzc05hbWVbY29uZmlnLmNoaWxkS2V5XSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXRlbS5maWx0ZXJzX2hpdCkge1xuICAgICAgICAgICAgbGlzdEl0ZW1DbGFzc2VzLnB1c2goJ2ZpbHRlcnMtaGl0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0SXRlbS5hZGRDbGFzcyhsaXN0SXRlbUNsYXNzZXMuam9pbignICcpKTtcbiAgICAgICAgbGlzdEl0ZW0uYXBwZW5kKGxpbmspXG4gICAgICAgICAgICAuYXR0cignZGF0YS1manMtaXRlbScsIGl0ZW1bY29uZmlnLml0ZW1LZXldKTtcblxuICAgICAgICBsaXN0SXRlbVswXS5faXRlbSA9IGl0ZW07XG5cbiAgICAgICAgcmV0dXJuIGxpc3RJdGVtO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVJdGVtQ29udGVudChjb25maWcsIGl0ZW0pIHtcbiAgICAgICAgY29uc3QgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgY29uc3Qgcm91dGUgPSBgJHtHUkFWX0NPTkZJRy5jdXJyZW50X3VybH0vJHtpdGVtLnJvdXRlLnJhd31gLnJlcGxhY2UoJy8vJywgJy8nKTtcbiAgICAgICAgY29uc3QgdGl0bGUgPSAkKCc8ZGl2IGNsYXNzPVwiZmpzLXRpdGxlXCIgLz4nKTtcbiAgICAgICAgY29uc3QgbGluayA9ICQoYDxhIGhyZWY9XCIke3JvdXRlfVwiIC8+YCk7XG4gICAgICAgIGNvbnN0IGljb24gPSAkKGA8c3BhbiBjbGFzcz1cImZqcy1pY29uICR7aXRlbS5pY29ufSBiYWRnZS0ke2l0ZW0uZXh0cmFzICYmIGl0ZW0uZXh0cmFzLnB1Ymxpc2hlZCA/ICdwdWJsaXNoZWQnIDogJ3VucHVibGlzaGVkJ31cIiAvPmApO1xuXG4gICAgICAgIGlmIChpdGVtLmV4dHJhcyAmJiBpdGVtLmV4dHJhcy5sYW5nKSB7XG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gJyc7XG4gICAgICAgICAgICBpZiAoaXRlbS5leHRyYXMudHJhbnNsYXRlZCkge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICd0cmFuc2xhdGVkJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGl0ZW0uZXh0cmFzLmxhbmcgPT09ICduL2EnKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ25vdC1hdmFpbGFibGUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsYW5nID0gJChgPHNwYW4gY2xhc3M9XCJiYWRnZS1sYW5nICR7c3RhdHVzfVwiPiR7aXRlbS5leHRyYXMubGFuZ308L3NwYW4+YCk7XG4gICAgICAgICAgICBsYW5nLmFwcGVuZFRvKGljb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0uZXh0cmFzICYmIGl0ZW0uZXh0cmFzICYmIChpdGVtLmV4dHJhcy5wdWJsaXNoZWRfZGF0ZSB8fCBpdGVtLmV4dHJhcy51bnB1Ymxpc2hlZF9kYXRlKSkge1xuICAgICAgICAgICAgY29uc3QgY2xvY2sgPSAkKCc8c3BhbiBjbGFzcz1cImJhZGdlLWNsb2NrXCIgLz4nKTtcbiAgICAgICAgICAgIGNsb2NrLmFwcGVuZFRvKGljb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5mbyA9ICQoYDxzcGFuIGNsYXNzPVwiZmpzLWluZm9cIj48YiB0aXRsZT1cIiR7aXRlbS50aXRsZX1cIj4ke2l0ZW0udGl0bGV9PC9iPiA8ZW0gdGl0bGU9XCIke2l0ZW0ucm91dGUuZGlzcGxheX1cIj4ke2l0ZW0ucm91dGUuZGlzcGxheX08L2VtPjwvc3Bhbj5gKTtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9ICQoJzxzcGFuIGNsYXNzPVwiZmpzLWFjdGlvbnNcIiAvPicpO1xuXG4gICAgICAgIGxldCBkb3Rkb3Rkb3QgPSBudWxsO1xuICAgICAgICBpZiAoaXRlbS5leHRyYXMpIHtcbiAgICAgICAgICAgIGNvbnN0IExBTkdfVVJMID0gJCgnW2RhdGEtbGFuZy11cmxdJykuZGF0YSgnbGFuZ1VybCcpO1xuICAgICAgICAgICAgZG90ZG90ZG90ID0gJCgnPGRpdiBjbGFzcz1cImJ1dHRvbi1ncm91cFwiIGRhdGEtZmxleHBhZ2VzLWRvdHgzIGRhdGEtZmxleHBhZ2VzLXByZXZlbnQ+PGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBkcm9wZG93bi10b2dnbGVcIiBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCI+PGkgY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy12IGZqcy1hY3Rpb24tdG9nZ2xlXCI+PC9pPjwvYnV0dG9uPjwvZGl2PicpO1xuICAgICAgICAgICAgZG90ZG90ZG90Lm9uKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZG90ZG90ZG90LmZpbmQoJy5kcm9wZG93bi1tZW51JykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdzID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYW5ncyA9ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZXh0cmFzLnRhZ3MuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdzICs9IGA8c3BhbiBjbGFzcz1cImJhZGdlIHRhZyB0YWctJHt0YWd9XCI+JHt0YWd9PC9zcGFuPmA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IGl0ZW0uZXh0cmFzLmxhbmdzIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0cmFuc2xhdGlvbnMpLmZvckVhY2goKGxhbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0cmFuc2xhdGlvbnNbbGFuZ107XG4gICAgICAgICAgICAgICAgICAgICAgICBsYW5ncyArPSBgPGEgY2xhc3M9XCJsYW5nXCIgaHJlZj1cIiR7TEFOR19VUkwucmVwbGFjZSgvJUxBTkclL2csIGxhbmcpLnJlcGxhY2UoJy8vJywgJy8nKX0ke2l0ZW0ucm91dGUucmF3fVwiPjxzcGFuIGNsYXNzPVwiYmFkZ2UgbGFuZy0ke2xhbmcgPyBsYW5nIDogJ2RlZmF1bHQnfSBsYW5nLSR7dHJhbnNsYXRlZCA/ICd0cmFuc2xhdGVkJyA6ICdub24tdHJhbnNsYXRlZCd9XCI+PGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1jaXJjbGVcIj48L2k+ICR7bGFuZyA/IGxhbmcgOiAnZGVmYXVsdCd9PC9zcGFuPjwvYT5gO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5QcmV2aWV3ID0gaXRlbS5leHRyYXMuYWN0aW9ucy5pbmNsdWRlcygncHJldmlldycpICYmICghKGl0ZW0uZXh0cmFzLnRhZ3MuaW5jbHVkZXMoJ25vbi1yb3V0YWJsZScpIHx8IGl0ZW0uZXh0cmFzLnRhZ3MuaW5jbHVkZXMoJ3VucHVibGlzaGVkJykpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FuRWRpdCA9IGl0ZW0uZXh0cmFzLmFjdGlvbnMuaW5jbHVkZXMoJ2VkaXQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FuQ29weSA9IGl0ZW0uZXh0cmFzLmFjdGlvbnMuaW5jbHVkZXMoJ2NvcHknKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FuTW92ZSA9IGZhbHNlOyAvLyBpdGVtLmV4dHJhcy5hY3Rpb25zLmluY2x1ZGVzKCdtb3ZlJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbkRlbGV0ZSA9IGl0ZW0uZXh0cmFzLmFjdGlvbnMuaW5jbHVkZXMoJ2RlbGV0ZScpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1bCA9ICQoYDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbi1iYXJcIj5cbiAgICAgICAgJHtjYW5QcmV2aWV3ID8gYDxhIGhyZWY9XCIke3JvdXRlfS86cHJldmlld1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHRpdGxlPVwiUHJldmlld1wiPjxpIGNsYXNzPVwiZmEgZmEtZncgZmEtZXllXCI+PC9pPjwvYT5gIDogJyd9XG4gICAgICAgICR7Y2FuRWRpdCA/IGA8YSBocmVmPVwiJHtyb3V0ZX1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiB0aXRsZT1cIkVkaXRcIj48aSBjbGFzcz1cImZhIGZhLWZ3IGZhLXBlbmNpbFwiPjwvaT48L2E+YCA6ICcnfVxuICAgICAgICAke2NhbkNvcHkgPyBgPGEgaHJlZj1cIiR7cm91dGV9L3Rhc2s6Y29weS9hZG1pbi1ub25jZToke0dSQVZfQ09ORklHLmFkbWluX25vbmNlfVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHRpdGxlPVwiRHVwbGljYXRlXCI+PGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1jb3B5XCI+PC9pPjwvYT5gIDogJyd9XG4gICAgICAgICR7Y2FuTW92ZSA/ICc8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHRpdGxlPVwiTW92ZSAoY29taW5nIHNvb24pXCI+PGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1hcnJvd3NcIj48L2k+PC9hPicgOiAnJ31cbiAgICAgICAgJHtjYW5EZWxldGUgPyBgPGEgaHJlZj1cIiNkZWxldGVcIiBkYXRhLXJlbW9kYWwtdGFyZ2V0PVwiZGVsZXRlXCIgZGF0YS1kZWxldGUtdXJsPVwiJHtyb3V0ZX0vdGFzazpkZWxldGUvYWRtaW4tbm9uY2U6JHtHUkFWX0NPTkZJRy5hZG1pbl9ub25jZX1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZGFuZ2VyXCIgdGl0bGU9XCJEZWxldGVcIj48aSBjbGFzcz1cImZhIGZhLWZ3IGZhLXRyYXNoLW9cIj48L2k+PC9hPmAgOiAnJ31cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0YWdzXCI+JHt0YWdzfTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XG4gICAgJHtpdGVtLmV4dHJhcy5sYW5nIHx8IHR5cGVvZiBpdGVtLmV4dHJhcy5sYW5ncyAhPT0gJ3VuZGVmaW5lZCcgPyBgPGRpdiBjbGFzcz1cImxhbmdzXCI+JHtsYW5nc308L2Rpdj48ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PmAgOiAnJ31cbiAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mb3NcIj5cbiAgICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48Yj5yb3V0ZTwvYj48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+JHtpdGVtLnJvdXRlLmRpc3BsYXl9PC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPnRlbXBsYXRlPC9iPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD4ke2l0ZW0uZXh0cmFzLnRlbXBsYXRlfTwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAke2l0ZW0uZXh0cmFzICYmIGl0ZW0uZXh0cmFzLnB1Ymxpc2hlZF9kYXRlID8gYFxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPnB1Ymxpc2g8L2I+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPiR7aXRlbS5leHRyYXMucHVibGlzaGVkX2RhdGV9PC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIGAgOiAnJ31cbiAgICAgICAgICAgICAgICAke2l0ZW0uZXh0cmFzICYmIGl0ZW0uZXh0cmFzLnVucHVibGlzaGVkX2RhdGUgPyBgXG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+dW5wdWJsaXNoPC9iPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD4ke2l0ZW0uZXh0cmFzLnVucHVibGlzaGVkX2RhdGV9PC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIGAgOiAnJ31cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48Yj5tb2RpZmllZDwvYj48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+JHtpdGVtLm1vZGlmaWVkfTwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+YCk7XG4gICAgICAgICAgICAgICAgICAgIHVsLmFwcGVuZFRvKGRvdGRvdGRvdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXRlbS5jaGlsZF9jb3VudCkge1xuICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gJCgnPGJ1dHRvbiBjbGFzcz1cImZqcy1jaGlsZHJlblwiIGRhdGEtZmxleHBhZ2VzLWV4cGFuZCBkYXRhLWZsZXhwYWdlcy1wcmV2ZW50IC8+Jyk7XG4gICAgICAgICAgICBjb25zdCBjb3VudCA9ICQoYDxzcGFuIGNsYXNzPVwiYmFkZ2UgY2hpbGQtY291bnRcIj4ke3R5cGVvZiBpdGVtLmNvdW50ICE9PSAndW5kZWZpbmVkJyA/IGAke2l0ZW0uY291bnR9IC8gYCA6ICcnfSR7aXRlbS5jaGlsZF9jb3VudH08L3NwYW4+YCk7XG4gICAgICAgICAgICBjb25zdCBhcnJvdyA9ICQoJzxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodFwiPjwvaT4nKTtcbiAgICAgICAgICAgIGNvdW50LmFwcGVuZFRvKGJ1dHRvbik7XG4gICAgICAgICAgICBhcnJvdy5hcHBlbmRUbyhidXR0b24pO1xuICAgICAgICAgICAgYnV0dG9uLmFwcGVuZFRvKGFjdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWNvbi5hcHBlbmRUbyh0aXRsZSk7XG4gICAgICAgIGRvdGRvdGRvdC5hcHBlbmRUbyh0aXRsZSk7XG4gICAgICAgIGxpbmsuYXBwZW5kVG8odGl0bGUpO1xuICAgICAgICBpbmZvLmFwcGVuZFRvKGxpbmspO1xuXG4gICAgICAgIHRpdGxlLmFwcGVuZFRvKGZyYWcpO1xuICAgICAgICBhY3Rpb25zLmFwcGVuZFRvKGZyYWcpO1xuXG4gICAgICAgIHJldHVybiBmcmFnO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVMb2FkaW5nQ29sdW1uKCkge1xuICAgICAgICByZXR1cm4gJChgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmpzLWNvbCBsZWFmLWNvbFwiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVhZi1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyYXYtbG9hZGluZ1wiPjxkaXYgY2xhc3M9XCJncmF2LWxvYWRlclwiPkxvYWRpbmcuLi48L2Rpdj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlRXJyb3JDb2x1bW4oZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuICQoYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZqcy1jb2wgbGVhZi1jb2xcIiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlYWYtcm93IGVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZncgZmEtd2FybmluZ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHtlcnJvcn08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCk7XG4gICAgfVxuXG4gICAgY3JlYXRlU2ltcGxlQ29sdW1uKGl0ZW0pIHt9XG5cbiAgICBkYXRhTG9hZChwYXJlbnQsIGNhbGxiYWNrLCBmaWx0ZXJzID0gZ2V0U3RvcmUoKS5maWx0ZXJzIHx8IHt9KSB7XG4gICAgICAgIC8qIGlmICghcGFyZW50ICYmIE9iamVjdC5rZXlzKGZpbHRlcnMpLmxlbmd0aCkge1xuICAgICAgICAgICAgcGFyZW50ID0geyBjaGlsZF9jb3VudDogMSwgcm91dGU6IHsgcmF3OiAnJyB9IH07XG4gICAgICAgIH0qL1xuXG4gICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFyZW50LmNoaWxkX2NvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBVVUlEID0gKytYSFJVVUlEO1xuICAgICAgICB0aGlzLnN0YXJ0TG9hZGVyKCk7XG5cbiAgICAgICAgY29uc3Qgd2l0aEZpbHRlcnMgPSBPYmplY3Qua2V5cyhmaWx0ZXJzKS5sZW5ndGggPyB7IC4uLmZpbHRlcnMgfSA6IHt9O1xuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IGAke0dSQVZfQ09ORklHLmN1cnJlbnRfdXJsfWAsXG4gICAgICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIHtcbiAgICAgICAgICAgICAgICByb3V0ZTogYjY0X2VuY29kZV91bmljb2RlKHBhcmVudC5yb3V0ZS5yYXcpLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2xpc3RMZXZlbCdcbiAgICAgICAgICAgIH0sIHdpdGhGaWx0ZXJzKSxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcExvYWRlcigpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRlci4kZW1pdHRlci5lbWl0KCdjcmVhdGUtY29sdW1uJywgRmxleFBhZ2VzLmNyZWF0ZUVycm9yQ29sdW1uKHJlc3BvbnNlLm1lc3NhZ2UpWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBzdGFsZSByZXF1ZXN0XG4gICAgICAgICAgICAgICAgaWYgKFVVSUQgIT09IFhIUlVVSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4gPSByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhcnRMb2FkZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5maW5kZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nSW5kaWNhdG9yID0gRmxleFBhZ2VzLmNyZWF0ZUxvYWRpbmdDb2x1bW4oKTtcbiAgICAgICAgdGhpcy5maW5kZXIuJGVtaXR0ZXIuZW1pdCgnY3JlYXRlLWNvbHVtbicsIHRoaXMubG9hZGluZ0luZGljYXRvclswXSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZ0luZGljYXRvcjtcbiAgICB9XG5cbiAgICBzdG9wTG9hZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nSW5kaWNhdG9yICYmIHRoaXMubG9hZGluZ0luZGljYXRvci5yZW1vdmUoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBiNjRfZW5jb2RlX3VuaWNvZGUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIGJ0b2EoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZyxcbiAgICAgICAgZnVuY3Rpb24gdG9Tb2xpZEJ5dGVzKG1hdGNoLCBwMSkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoJzB4JyArIHAxKTtcbiAgICAgICAgfSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGI2NF9kZWNvZGVfdW5pY29kZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGF0b2Ioc3RyKS5zcGxpdCgnJykubWFwKGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgcmV0dXJuICclJyArICgnMDAnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpO1xuICAgIH0pLmpvaW4oJycpKTtcbn07XG5cbmNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gKHNjcm9sbGluZ0NvbHVtbiwgcGFnZUNvbHVtbnMpID0+IHtcbiAgICBjb25zdCBncm91cCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwYWdlcy1jb2x1bW5zIC5idXR0b24tZ3JvdXAub3BlbicpO1xuICAgIGlmIChncm91cCkge1xuICAgICAgICBjb25zdCBidXR0b24gPSBncm91cC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScpO1xuICAgICAgICBjb25zdCBkcm9wZG93biA9IGdyb3VwLnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1tZW51Jyk7XG4gICAgICAgIGNvbnN0IGJ1dHRvbkluVmlldyA9IGlzSW5WaWV3cG9ydChidXR0b24pO1xuXG4gICAgICAgIGlmIChidXR0b24gJiYgZHJvcGRvd24pIHtcbiAgICAgICAgICAgIGlmICghYnV0dG9uSW5WaWV3KSB7XG4gICAgICAgICAgICAgICAgJChkcm9wZG93bikuY3NzKHsgZGlzcGxheTogJ25vbmUnIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKGRyb3Bkb3duKS5jc3MoeyBkaXNwbGF5OiAnaW5oZXJpdCcgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBidXR0b25DbGllbnRSZWN0ID0gYnV0dG9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ2xpZW50UmVjdCA9IGRyb3Bkb3duLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9ICh3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9ICh3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IGJ1dHRvbkNsaWVudFJlY3QuaGVpZ2h0ICsgYnV0dG9uQ2xpZW50UmVjdC50b3AgKyBzY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgbGV0IGxlZnQgPSBidXR0b25DbGllbnRSZWN0LmxlZnQgKyBzY3JvbGxMZWZ0OyAvLyAgLSBkcm9wZG93bkNsaWVudFJlY3Qud2lkdGhcblxuICAgICAgICAgICAgICAgIGlmIChsZWZ0ICsgZHJvcGRvd25DbGllbnRSZWN0LndpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZHJvcGRvd25DbGllbnRSZWN0LndpZHRoIC0gNTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAkKGRyb3Bkb3duKS5jc3MoeyB0b3AsIGxlZnQgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsaW5nQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldENsaWVudFJlY3QgPSBldmVudC50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgodG9wIDwgdGFyZ2V0Q2xpZW50UmVjdC50b3AgKyBzY3JvbGxUb3ApIHx8ICh0b3AgPiB0YXJnZXRDbGllbnRSZWN0LnRvcCArIHNjcm9sbFRvcCArIHRhcmdldENsaWVudFJlY3QuaGVpZ2h0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChkcm9wZG93bikuY3NzKHsgZGlzcGxheTogJ25vbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHBhZ2VDb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldENsaWVudFJlY3QgPSBldmVudC50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgobGVmdCA8IHRhcmdldENsaWVudFJlY3QubGVmdCArIHNjcm9sbExlZnQpIHx8IChsZWZ0ID4gdGFyZ2V0Q2xpZW50UmVjdC5sZWZ0ICsgc2Nyb2xsTGVmdCArIHRhcmdldENsaWVudFJlY3Qud2lkdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGRyb3Bkb3duKS5jc3MoeyBkaXNwbGF5OiAnbm9uZScgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCBjbG9zZUdob3N0RHJvcGRvd25zID0gKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5lZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNwYWdlcy1jb2x1bW5zIC5idXR0b24tZ3JvdXA6bm90KC5vcGVuKSAuZHJvcGRvd24tbWVudScpIHx8IFtdO1xuICAgIG9wZW5lZC5mb3JFYWNoKChpdGVtKSA9PiB7IGl0ZW0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsgfSk7XG59O1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoZXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICYmICFldmVudC50YXJnZXQuY2xhc3NMaXN0KSB7IHJldHVybiB0cnVlOyB9XG4gICAgY29uc3Qgc2Nyb2xsaW5nRG9jdW1lbnQgPSBldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdnbS1zY3JvbGwtdmlldycpIHx8IGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbnRlbnQtd3JhcHBlcicpO1xuICAgIGNvbnN0IHNjcm9sbGluZ0NvbHVtbiA9IGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2Zqcy1jb2wnKTtcbiAgICBjb25zdCBwYWdlQ29sdW1ucyA9IGV2ZW50LnRhcmdldC5pZCA9PT0gJ3BhZ2VzLWNvbHVtbnMnO1xuXG4gICAgaWYgKHNjcm9sbGluZ0RvY3VtZW50IHx8IHNjcm9sbGluZ0NvbHVtbiB8fCBwYWdlQ29sdW1ucykge1xuICAgICAgICBjbG9zZUdob3N0RHJvcGRvd25zKCk7XG4gICAgICAgIHVwZGF0ZVBvc2l0aW9uKHNjcm9sbGluZ0NvbHVtbiwgcGFnZUNvbHVtbnMpO1xuICAgIH1cbn0sIHRydWUpO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgIGNsb3NlR2hvc3REcm9wZG93bnMoKTtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmRhdGFzZXQudG9nZ2xlIHx8IGV2ZW50LnRhcmdldC5jbG9zZXN0KCdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclNjcm9sbGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmdtLXNjcm9sbC12aWV3Jyk7XG5cbiAgICAgICAgKChjb250YWluZXJTY3JvbGxlci5sZW5ndGggPyBjb250YWluZXJTY3JvbGxlciA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jb250ZW50LXdyYXBwZXInKSkgfHwgW10pLmZvckVhY2goKHNjcm9sbCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsRXZlbnQgPSBuZXcgRXZlbnQoJ3Njcm9sbCcpO1xuICAgICAgICAgICAgc2Nyb2xsLmRpc3BhdGNoRXZlbnQoc2Nyb2xsRXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoKGV2ZW50LnRhcmdldC5jbGFzc0xpc3QgJiYgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnZHJvcGRvd24tbWVudScpKSB8fCAoZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5kcm9wZG93bi1tZW51JykpKSB7XG4gICAgICAgIGlmICghJChldmVudC50YXJnZXQpLmNsb3Nlc3QoJy5kcm9wZG93bi1tZW51JykuZmluZChldmVudC50YXJnZXQpLmxlbmd0aCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8vIFByZXZlbnQgZHJvcGRvd25zIGZyb20gY2xvc2luZyB3aGVuIGNsaWNraW5nIHdpdGhpblxuJChkb2N1bWVudCkub24oJ2NsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpJywgJy5manMtaXRlbS13cmFwcGVyIC5kcm9wZG93bi1tZW51JywgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59KTtcbiIsImZ1bmN0aW9uIGhhc093bihvYmosIGtleSkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn0gLy8gRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycy5cblxuXG5mdW5jdGlvbiBlc2NhcGVSZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLiorP14kfFtcXF0oKXt9XFxcXC1dL2csICdcXFxcJCYnKTtcbn0gLy8gUmV0dXJuIGEgZnV0dXJlIGRhdGUgYnkgdGhlIGdpdmVuIHN0cmluZy5cblxuXG5mdW5jdGlvbiBjb21wdXRlRXhwaXJlcyhzdHIpIHtcbiAgdmFyIGxhc3RDaCA9IHN0ci5jaGFyQXQoc3RyLmxlbmd0aCAtIDEpO1xuICB2YXIgdmFsdWUgPSBwYXJzZUludChzdHIsIDEwKTtcbiAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpO1xuXG4gIHN3aXRjaCAobGFzdENoKSB7XG4gICAgY2FzZSAnWSc6XG4gICAgICBleHBpcmVzLnNldEZ1bGxZZWFyKGV4cGlyZXMuZ2V0RnVsbFllYXIoKSArIHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnTSc6XG4gICAgICBleHBpcmVzLnNldE1vbnRoKGV4cGlyZXMuZ2V0TW9udGgoKSArIHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnRCc6XG4gICAgICBleHBpcmVzLnNldERhdGUoZXhwaXJlcy5nZXREYXRlKCkgKyB2YWx1ZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2gnOlxuICAgICAgZXhwaXJlcy5zZXRIb3VycyhleHBpcmVzLmdldEhvdXJzKCkgKyB2YWx1ZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ20nOlxuICAgICAgZXhwaXJlcy5zZXRNaW51dGVzKGV4cGlyZXMuZ2V0TWludXRlcygpICsgdmFsdWUpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzJzpcbiAgICAgIGV4cGlyZXMuc2V0U2Vjb25kcyhleHBpcmVzLmdldFNlY29uZHMoKSArIHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGV4cGlyZXMgPSBuZXcgRGF0ZShzdHIpO1xuICB9XG5cbiAgcmV0dXJuIGV4cGlyZXM7XG59IC8vIENvbnZlcnQgYW4gb2JqZWN0IHRvIGEgY29va2llIG9wdGlvbiBzdHJpbmcuXG5cblxuZnVuY3Rpb24gY29udmVydChvcHRzKSB7XG4gIHZhciByZXMgPSAnJzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5cbiAgZm9yICh2YXIga2V5IGluIG9wdHMpIHtcbiAgICBpZiAoaGFzT3duKG9wdHMsIGtleSkpIHtcbiAgICAgIGlmICgvXmV4cGlyZXMkL2kudGVzdChrZXkpKSB7XG4gICAgICAgIHZhciBleHBpcmVzID0gb3B0c1trZXldO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZXhwaXJlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBleHBpcmVzICs9IHR5cGVvZiBleHBpcmVzID09PSAnbnVtYmVyJyA/ICdEJyA6ICcnO1xuICAgICAgICAgIGV4cGlyZXMgPSBjb21wdXRlRXhwaXJlcyhleHBpcmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcyArPSBcIjtcIiArIGtleSArIFwiPVwiICsgZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmICgvXnNlY3VyZSQvLnRlc3Qoa2V5KSkge1xuICAgICAgICBpZiAob3B0c1trZXldKSB7XG4gICAgICAgICAgcmVzICs9IFwiO1wiICsga2V5O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXMgKz0gXCI7XCIgKyBrZXkgKyBcIj1cIiArIG9wdHNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWhhc093bihvcHRzLCAncGF0aCcpKSB7XG4gICAgcmVzICs9ICc7cGF0aD0vJztcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCB7IGhhc093biwgZXNjYXBlUmUsIGNvbXB1dGVFeHBpcmVzLCBjb252ZXJ0IH07IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuaW1wb3J0IHsgZXNjYXBlUmUsIGNvbnZlcnQgfSBmcm9tICcuL3V0aWwnOyAvLyBDaGVjayBpZiB0aGUgYnJvd3NlciBjb29raWUgaXMgZW5hYmxlZC5cblxuZnVuY3Rpb24gaXNFbmFibGVkKCkge1xuICB2YXIga2V5ID0gJ0BrZXlAJztcbiAgdmFyIHZhbHVlID0gJzEnO1xuICB2YXIgcmUgPSBuZXcgUmVnRXhwKFwiKD86Xnw7IClcIiArIGtleSArIFwiPVwiICsgdmFsdWUgKyBcIig/Ojt8JClcIik7XG4gIGRvY3VtZW50LmNvb2tpZSA9IGtleSArIFwiPVwiICsgdmFsdWUgKyBcIjtwYXRoPS9cIjtcbiAgdmFyIGVuYWJsZWQgPSByZS50ZXN0KGRvY3VtZW50LmNvb2tpZSk7XG5cbiAgaWYgKGVuYWJsZWQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICByZW1vdmUoa2V5KTtcbiAgfVxuXG4gIHJldHVybiBlbmFibGVkO1xufSAvLyBHZXQgdGhlIGNvb2tpZSB2YWx1ZSBieSBrZXkuXG5cblxuZnVuY3Rpb24gZ2V0KGtleSwgZGVjb2Rlcikge1xuICBpZiAoZGVjb2RlciA9PT0gdm9pZCAwKSB7XG4gICAgZGVjb2RlciA9IGRlY29kZVVSSUNvbXBvbmVudDtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJyB8fCAha2V5KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgcmVLZXkgPSBuZXcgUmVnRXhwKFwiKD86Xnw7IClcIiArIGVzY2FwZVJlKGtleSkgKyBcIig/Oj0oW147XSopKT8oPzo7fCQpXCIpO1xuICB2YXIgbWF0Y2ggPSByZUtleS5leGVjKGRvY3VtZW50LmNvb2tpZSk7XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdHlwZW9mIGRlY29kZXIgPT09ICdmdW5jdGlvbicgPyBkZWNvZGVyKG1hdGNoWzFdKSA6IG1hdGNoWzFdO1xufSAvLyBUaGUgYWxsIGNvb2tpZXNcblxuXG5mdW5jdGlvbiBnZXRBbGwoZGVjb2Rlcikge1xuICBpZiAoZGVjb2RlciA9PT0gdm9pZCAwKSB7XG4gICAgZGVjb2RlciA9IGRlY29kZVVSSUNvbXBvbmVudDtcbiAgfVxuXG4gIHZhciByZUtleSA9IC8oPzpefDsgKShbXj1dKz8pKD86PShbXjtdKikpPyg/Ojt8JCkvZztcbiAgdmFyIGNvb2tpZXMgPSB7fTtcbiAgdmFyIG1hdGNoO1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXG4gIHdoaWxlIChtYXRjaCA9IHJlS2V5LmV4ZWMoZG9jdW1lbnQuY29va2llKSkge1xuICAgIHJlS2V5Lmxhc3RJbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2gubGVuZ3RoIC0gMTtcbiAgICBjb29raWVzW21hdGNoWzFdXSA9IHR5cGVvZiBkZWNvZGVyID09PSAnZnVuY3Rpb24nID8gZGVjb2RlcihtYXRjaFsyXSkgOiBtYXRjaFsyXTtcbiAgfVxuXG4gIHJldHVybiBjb29raWVzO1xufSAvLyBTZXQgYSBjb29raWUuXG5cblxuZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUsIGVuY29kZXIsIG9wdGlvbnMpIHtcbiAgaWYgKGVuY29kZXIgPT09IHZvaWQgMCkge1xuICAgIGVuY29kZXIgPSBlbmNvZGVVUklDb21wb25lbnQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuY29kZXIgPT09ICdvYmplY3QnICYmIGVuY29kZXIgIT09IG51bGwpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgIG9wdGlvbnMgPSBlbmNvZGVyO1xuICAgIGVuY29kZXIgPSBlbmNvZGVVUklDb21wb25lbnQ7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICB9XG5cbiAgdmFyIGF0dHJzU3RyID0gY29udmVydChvcHRpb25zIHx8IHt9KTtcbiAgdmFyIHZhbHVlU3RyID0gdHlwZW9mIGVuY29kZXIgPT09ICdmdW5jdGlvbicgPyBlbmNvZGVyKHZhbHVlKSA6IHZhbHVlO1xuICB2YXIgbmV3Q29va2llID0ga2V5ICsgXCI9XCIgKyB2YWx1ZVN0ciArIGF0dHJzU3RyO1xuICBkb2N1bWVudC5jb29raWUgPSBuZXdDb29raWU7XG59IC8vIFJlbW92ZSBhIGNvb2tpZSBieSB0aGUgc3BlY2lmaWVkIGtleS5cblxuXG5mdW5jdGlvbiByZW1vdmUoa2V5LCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0ge1xuICAgIGV4cGlyZXM6IC0xXG4gIH07XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBvcHRzID0gX2V4dGVuZHMoe30sIG9wdGlvbnMsIG9wdHMpO1xuICB9XG5cbiAgcmV0dXJuIHNldChrZXksICdhJywgb3B0cyk7XG59IC8vIEdldCB0aGUgY29va2llJ3MgdmFsdWUgd2l0aG91dCBkZWNvZGluZy5cblxuXG5mdW5jdGlvbiBnZXRSYXcoa2V5KSB7XG4gIHJldHVybiBnZXQoa2V5LCBudWxsKTtcbn0gLy8gU2V0IGEgY29va2llIHdpdGhvdXQgZW5jb2RpbmcgdGhlIHZhbHVlLlxuXG5cbmZ1bmN0aW9uIHNldFJhdyhrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBzZXQoa2V5LCB2YWx1ZSwgbnVsbCwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCB7IGlzRW5hYmxlZCwgZ2V0LCBnZXRBbGwsIHNldCwgZ2V0UmF3LCBzZXRSYXcsIHJlbW92ZSwgaXNFbmFibGVkIGFzIGlzQ29va2llRW5hYmxlZCwgZ2V0IGFzIGdldENvb2tpZSwgZ2V0QWxsIGFzIGdldEFsbENvb2tpZXMsIHNldCBhcyBzZXRDb29raWUsIGdldFJhdyBhcyBnZXRSYXdDb29raWUsIHNldFJhdyBhcyBzZXRSYXdDb29raWUsIHJlbW92ZSBhcyByZW1vdmVDb29raWUgfTsiLCJleHBvcnQgZGVmYXVsdCAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3BhZ2VzLWZpbHRlcnMgaW5wdXRbbmFtZV0nKTtcbiAgICBjb25zdCBmaWx0ZXJzID0ge307XG4gICAgY29uc3QgdHJhY2tNdWx0aSA9IFtdO1xuXG4gICAgaW5wdXRzLmZvckVhY2goKGZpbHRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLnR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIuaW5kZXRlcm1pbmF0ZSB8fCBmaWx0ZXIuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubmFtZS5tYXRjaCgvXFxbXSQvKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gZmlsdGVyLm5hbWUucmVwbGFjZSgvXFxbXSQvLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlsdGVyc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1tuYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFja011bHRpLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja011bHRpLnB1c2gobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzW25hbWVdLnB1c2goZmlsdGVyLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzW2ZpbHRlci5uYW1lXSA9IGZpbHRlci52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLnZhbHVlKSB7XG4gICAgICAgICAgICBmaWx0ZXJzW2ZpbHRlci5uYW1lXSA9IGZpbHRlci52YWx1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJhY2tNdWx0aS5mb3JFYWNoKChtdWx0aSkgPT4ge1xuICAgICAgICBmaWx0ZXJzW211bHRpXSA9IGZpbHRlcnNbbXVsdGldLmpvaW4oJywnKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWx0ZXJzO1xufTtcbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBiNjRfZGVjb2RlX3VuaWNvZGUsIGI2NF9lbmNvZGVfdW5pY29kZSwgRmxleFBhZ2VzIH0gZnJvbSAnLi9maW5kZXInO1xuaW1wb3J0IHsgaXNFbmFibGVkLCBnZXRDb29raWUsIHNldENvb2tpZSB9IGZyb20gJ3RpbnktY29va2llJztcbmltcG9ydCBnZXRGaWx0ZXJzIGZyb20gJy4uL3V0aWxzL2dldC1maWx0ZXJzJztcblxuY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BhZ2VzLWNvbnRlbnQtd3JhcHBlcicpO1xuXG5leHBvcnQgY29uc3QgZ2V0U3RvcmUgPSAoKSA9PiB7XG4gICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnBhcnNlKGI2NF9kZWNvZGVfdW5pY29kZShnZXRDb29raWUoJ2dyYXYtYWRtaW4tZmxleHBhZ2VzJykgfHwgJ2UzMD0nKSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0U3RvcmUgPSAoc3RvcmUgPSB7fSwgb3B0aW9ucyA9IHsgZXhwaXJlczogJzFZJywgc2FtZXNpdGU6ICdMYXgnIH0pID0+IHtcbiAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldENvb2tpZSgnZ3Jhdi1hZG1pbi1mbGV4cGFnZXMnLCBiNjRfZW5jb2RlX3VuaWNvZGUoSlNPTi5zdHJpbmdpZnkoc3RvcmUpKSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW5pdGlhbFJvdXRlID0gKCkgPT4ge1xuICAgIGNvbnN0IHBhcnNlZCA9IGdldFN0b3JlKCk7XG4gICAgcmV0dXJuIHBhcnNlZC5yb3V0ZSB8fCAnJztcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRJbml0aWFsUm91dGUgPSAoeyByb3V0ZSA9ICcnLCBmaWx0ZXJzID0gZ2V0U3RvcmUoKS5maWx0ZXJzIHx8IHt9LCBvcHRpb25zID0geyBleHBpcmVzOiAnMVknIH19ID0ge30pID0+IHtcbiAgICByZXR1cm4gc2V0U3RvcmUoeyByb3V0ZSwgZmlsdGVycyB9LCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydCBsZXQgRmxleFBhZ2VzSW5zdGFuY2UgPSBudWxsO1xuXG5leHBvcnQgY29uc3QgUmVMb2FkID0gKGZyZXNoID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBzZWFyY2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGFnZXMtZmlsdGVycyBbbmFtZT1cImZpbHRlcnNbc2VhcmNoXVwiXScpO1xuICAgIGNvbnN0IGxvYWRlciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuZ3Jhdi1sb2FkaW5nJyk7XG4gICAgY29uc3QgY29udGVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjcGFnZXMtY29sdW1ucycpO1xuICAgIGNvbnN0IGdyYXZDb25maWcgPSB0eXBlb2YgZ2xvYmFsLkdyYXZDb25maWcgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsLkdyYXZDb25maWcgOiBnbG9iYWwuR3JhdkFkbWluLmNvbmZpZztcblxuICAgIGlmIChmcmVzaCAmJiBzZWFyY2gpIHtcbiAgICAgICAgc2VhcmNoLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaWYgKGxvYWRlciAmJiBjb250ZW50KSB7XG4gICAgICAgIGxvYWRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICBjb25zdCBmaWx0ZXJzID0gZnJlc2ggPyBnZXRTdG9yZSgpLmZpbHRlcnMgfHwge30gOiBnZXRGaWx0ZXJzKCk7XG4gICAgICAgIGNvbnN0IHdpdGhGaWx0ZXJzID0gT2JqZWN0LmtleXMoZmlsdGVycykubGVuZ3RoID8geyAuLi5maWx0ZXJzLCBpbml0aWFsOiB0cnVlIH0gOiB7fTtcblxuICAgICAgICBjb25zdCBzdG9yZSA9IGdldFN0b3JlKCk7XG4gICAgICAgIHN0b3JlLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICBzZXRTdG9yZShzdG9yZSk7XG5cbiAgICAgICAgbGV0IGlzU2VhcmNoRm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgICAgICBpc1NlYXJjaEZvY3VzZWQgPSBzZWFyY2ggPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50V3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50LXdyYXBwZXIgLmdtLXNjcm9sbC12aWV3Jyk7XG4gICAgICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0ge1xuICAgICAgICAgICAgdG9wOiBjb250ZW50V3JhcHBlciA/IGNvbnRlbnRXcmFwcGVyLnNjcm9sbFRvcCA6IDAsXG4gICAgICAgICAgICBsZWZ0OiBjb250ZW50V3JhcHBlciA/IGNvbnRlbnRXcmFwcGVyLnNjcm9sbExlZnQgOiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogYCR7Z3JhdkNvbmZpZy5jdXJyZW50X3VybH1gLFxuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHt9LCB7XG4gICAgICAgICAgICAgICAgcm91dGU6IGI2NF9lbmNvZGVfdW5pY29kZShnZXRJbml0aWFsUm91dGUoKSksXG4gICAgICAgICAgICAgICAgaW5pdGlhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdsaXN0TGV2ZWwnXG4gICAgICAgICAgICB9LCB3aXRoRmlsdGVycyksXG4gICAgICAgICAgICBzdWNjZXNzKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgbG9hZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgRmxleFBhZ2VzSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIEZsZXhQYWdlc0luc3RhbmNlID0gbmV3IEZsZXhQYWdlcyhjb250ZW50LCByZXNwb25zZS5kYXRhKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWFyY2ggJiYgaXNTZWFyY2hGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50V3JhcHBlcikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50V3JhcHBlci5zY3JvbGxUbyhzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIEZsZXhQYWdlc0luc3RhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5pZiAoY29udGFpbmVyKSB7XG4gICAgUmVMb2FkKHRydWUpO1xufVxuIiwiaW1wb3J0ICcuLi91dGlscy9pbmRldGVybWluYXRlJztcbmltcG9ydCAnLi9wYW5lbCc7XG5pbXBvcnQgeyBSZUxvYWQgfSBmcm9tICcuLi9jb2x1bW5zJztcbmltcG9ydCB0aHJvdHRsZSBmcm9tICdsb2Rhc2gvdGhyb3R0bGUnO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IGZpbHRlclR5cGUgPSBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LmRhdGFzZXQuZmlsdGVycztcblxuICAgIGlmIChmaWx0ZXJUeXBlID09PSAncmVzZXQnKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnI3BhZ2VzLWZpbHRlcnMnKTtcbiAgICAgICAgKGZpbHRlcnMucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cInRleHRcIl0nKSB8fCBbXSkuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIChmaWx0ZXJzLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpIHx8IFtdKS5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IGlucHV0LmNsb3Nlc3QoJy5jaGVja2JveGVzJyk7XG4gICAgICAgICAgICBpZiAod3JhcHBlcikge1xuICAgICAgICAgICAgICAgIHdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgnc3RhdHVzLWNoZWNrZWQnLCAnc3RhdHVzLXVuY2hlY2tlZCcsICdzdGF0dXMtaW5kZXRlcm1pbmF0ZScpO1xuICAgICAgICAgICAgICAgIHdyYXBwZXIuZGF0YXNldC5fY2hlY2tTdGF0dXMgPSAnMCc7XG4gICAgICAgICAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdzdGF0dXMtdW5jaGVja2VkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlucHV0LmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlucHV0LmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyVHlwZSA9PT0gJ2FwcGx5Jykge1xuICAgICAgICBSZUxvYWQoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pO1xuXG5jb25zdCB0aHJvdHRsZWRSZWxvYWQgPSB0aHJvdHRsZSgoKSA9PiB7XG4gICAgUmVMb2FkKCk7XG59LCAzNTAsIHsgbGVhZGluZzogZmFsc2UgfSk7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUgJiYgZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnbmFtZScpID09PSAnZmlsdGVyc1tzZWFyY2hdJykge1xuICAgICAgICB0aHJvdHRsZWRSZWxvYWQuY2FuY2VsKCk7XG4gICAgICAgIHRocm90dGxlZFJlbG9hZCgpO1xuICAgIH1cbn0pO1xuIiwiaW1wb3J0ICcuL2xpc3QnO1xuaW1wb3J0ICcuL2NvbHVtbnMnO1xuaW1wb3J0ICcuL2ZpbHRlcnMnO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7510\n");
})();
/******/ })()
;