| 1 |
- (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-elementUI"],{"12f2":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nexports.default = function (ref) {\n return {\n methods: {\n focus: function focus() {\n this.$refs[ref].focus();\n }\n }\n };\n};\n\n;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvbWl4aW5zL2ZvY3VzLmpzPzEyZjIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjEyZjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHJlZikge1xuICByZXR1cm4ge1xuICAgIG1ldGhvZHM6IHtcbiAgICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgICAgdGhpcy4kcmVmc1tyZWZdLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxuOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///12f2\n")},"14e9":function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 133);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 133:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/resize-event\"\nvar resize_event_ = __webpack_require__(16);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/scrollbar-width\"\nvar scrollbar_width_ = __webpack_require__(39);\nvar scrollbar_width_default = /*#__PURE__*/__webpack_require__.n(scrollbar_width_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/util\"\nvar util_ = __webpack_require__(3);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/dom\"\nvar dom_ = __webpack_require__(2);\n\n// CONCATENATED MODULE: ./packages/scrollbar/src/util.js\nvar BAR_MAP = {\n vertical: {\n offset: 'offsetHeight',\n scroll: 'scrollTop',\n scrollSize: 'scrollHeight',\n size: 'height',\n key: 'vertical',\n axis: 'Y',\n client: 'clientY',\n direction: 'top'\n },\n horizontal: {\n offset: 'offsetWidth',\n scroll: 'scrollLeft',\n scrollSize: 'scrollWidth',\n size: 'width',\n key: 'horizontal',\n axis: 'X',\n client: 'clientX',\n direction: 'left'\n }\n};\n\nfunction renderThumbStyle(_ref) {\n var move = _ref.move,\n size = _ref.size,\n bar = _ref.bar;\n\n var style = {};\n var translate = 'translate' + bar.axis + '(' + move + '%)';\n\n style[bar.size] = size;\n style.transform = translate;\n style.msTransform = translate;\n style.webkitTransform = translate;\n\n return style;\n};\n// CONCATENATED MODULE: ./packages/scrollbar/src/bar.js\n\n\n\n/* istanbul ignore next */\n/* harmony default export */ var src_bar = ({\n name: 'Bar',\n\n props: {\n vertical: Boolean,\n size: String,\n move: Number\n },\n\n computed: {\n bar: function bar() {\n return BAR_MAP[this.vertical ? 'vertical' : 'horizontal'];\n },\n wrap: function wrap() {\n return this.$parent.wrap;\n }\n },\n\n render: function render(h) {\n var size = this.size,\n move = this.move,\n bar = this.bar;\n\n\n return h(\n 'div',\n {\n 'class': ['el-scrollbar__bar', 'is-' + bar.key],\n on: {\n 'mousedown': this.clickTrackHandler\n }\n },\n [h('div', {\n ref: 'thumb',\n 'class': 'el-scrollbar__thumb',\n on: {\n 'mousedown': this.clickThumbHandler\n },\n\n style: renderThumbStyle({ size: size, move: move, bar: bar }) })]\n );\n },\n\n\n methods: {\n clickThumbHandler: function clickThumbHandler(e) {\n // prevent click event of right button\n if (e.ctrlKey || e.button === 2) {\n return;\n }\n this.startDrag(e);\n this[this.bar.axis] = e.currentTarget[this.bar.offset] - (e[this.bar.client] - e.currentTarget.getBoundingClientRect()[this.bar.direction]);\n },\n clickTrackHandler: function clickTrackHandler(e) {\n var offset = Math.abs(e.target.getBoundingClientRect()[this.bar.direction] - e[this.bar.client]);\n var thumbHalf = this.$refs.thumb[this.bar.offset] / 2;\n var thumbPositionPercentage = (offset - thumbHalf) * 100 / this.$el[this.bar.offset];\n\n this.wrap[this.bar.scroll] = thumbPositionPercentage * this.wrap[this.bar.scrollSize] / 100;\n },\n startDrag: function startDrag(e) {\n e.stopImmediatePropagation();\n this.cursorDown = true;\n\n Object(dom_[\"on\"])(document, 'mousemove', this.mouseMoveDocumentHandler);\n Object(dom_[\"on\"])(document, 'mouseup', this.mouseUpDocumentHandler);\n document.onselectstart = function () {\n return false;\n };\n },\n mouseMoveDocumentHandler: function mouseMoveDocumentHandler(e) {\n if (this.cursorDown === false) return;\n var prevPage = this[this.bar.axis];\n\n if (!prevPage) return;\n\n var offset = (this.$el.getBoundingClientRect()[this.bar.direction] - e[this.bar.client]) * -1;\n var thumbClickPosition = this.$refs.thumb[this.bar.offset] - prevPage;\n var thumbPositionPercentage = (offset - thumbClickPosition) * 100 / this.$el[this.bar.offset];\n\n this.wrap[this.bar.scroll] = thumbPositionPercentage * this.wrap[this.bar.scrollSize] / 100;\n },\n mouseUpDocumentHandler: function mouseUpDocumentHandler(e) {\n this.cursorDown = false;\n this[this.bar.axis] = 0;\n Object(dom_[\"off\"])(document, 'mousemove', this.mouseMoveDocumentHandler);\n document.onselectstart = null;\n }\n },\n\n destroyed: function destroyed() {\n Object(dom_[\"off\"])(document, 'mouseup', this.mouseUpDocumentHandler);\n }\n});\n// CONCATENATED MODULE: ./packages/scrollbar/src/main.js\n// reference https://github.com/noeldelgado/gemini-scrollbar/blob/master/index.js\n\n\n\n\n\n\n/* istanbul ignore next */\n/* harmony default export */ var main = ({\n name: 'ElScrollbar',\n\n components: { Bar: src_bar },\n\n props: {\n native: Boolean,\n wrapStyle: {},\n wrapClass: {},\n viewClass: {},\n viewStyle: {},\n noresize: Boolean, // 如果 container 尺寸不会发生变化,最好设置它可以优化性能\n tag: {\n type: String,\n default: 'div'\n }\n },\n\n data: function data() {\n return {\n sizeWidth: '0',\n sizeHeight: '0',\n moveX: 0,\n moveY: 0\n };\n },\n\n\n computed: {\n wrap: function wrap() {\n return this.$refs.wrap;\n }\n },\n\n render: function render(h) {\n var gutter = scrollbar_width_default()();\n var style = this.wrapStyle;\n\n if (gutter) {\n var gutterWith = '-' + gutter + 'px';\n var gutterStyle = 'margin-bottom: ' + gutterWith + '; margin-right: ' + gutterWith + ';';\n\n if (Array.isArray(this.wrapStyle)) {\n style = Object(util_[\"toObject\"])(this.wrapStyle);\n style.marginRight = style.marginBottom = gutterWith;\n } else if (typeof this.wrapStyle === 'string') {\n style += gutterStyle;\n } else {\n style = gutterStyle;\n }\n }\n var view = h(this.tag, {\n class: ['el-scrollbar__view', this.viewClass],\n style: this.viewStyle,\n ref: 'resize'\n }, this.$slots.default);\n var wrap = h(\n 'div',\n {\n ref: 'wrap',\n style: style,\n on: {\n 'scroll': this.handleScroll\n },\n\n 'class': [this.wrapClass, 'el-scrollbar__wrap', gutter ? '' : 'el-scrollbar__wrap--hidden-default'] },\n [[view]]\n );\n var nodes = void 0;\n\n if (!this.native) {\n nodes = [wrap, h(src_bar, {\n attrs: {\n move: this.moveX,\n size: this.sizeWidth }\n }), h(src_bar, {\n attrs: {\n vertical: true,\n move: this.moveY,\n size: this.sizeHeight }\n })];\n } else {\n nodes = [h(\n 'div',\n {\n ref: 'wrap',\n 'class': [this.wrapClass, 'el-scrollbar__wrap'],\n style: style },\n [[view]]\n )];\n }\n return h('div', { class: 'el-scrollbar' }, nodes);\n },\n\n\n methods: {\n handleScroll: function handleScroll() {\n var wrap = this.wrap;\n\n this.moveY = wrap.scrollTop * 100 / wrap.clientHeight;\n this.moveX = wrap.scrollLeft * 100 / wrap.clientWidth;\n },\n update: function update() {\n var heightPercentage = void 0,\n widthPercentage = void 0;\n var wrap = this.wrap;\n if (!wrap) return;\n\n heightPercentage = wrap.clientHeight * 100 / wrap.scrollHeight;\n widthPercentage = wrap.clientWidth * 100 / wrap.scrollWidth;\n\n this.sizeHeight = heightPercentage < 100 ? heightPercentage + '%' : '';\n this.sizeWidth = widthPercentage < 100 ? widthPercentage + '%' : '';\n }\n },\n\n mounted: function mounted() {\n if (this.native) return;\n this.$nextTick(this.update);\n !this.noresize && Object(resize_event_[\"addResizeListener\"])(this.$refs.resize, this.update);\n },\n beforeDestroy: function beforeDestroy() {\n if (this.native) return;\n !this.noresize && Object(resize_event_[\"removeResizeListener\"])(this.$refs.resize, this.update);\n }\n});\n// CONCATENATED MODULE: ./packages/scrollbar/index.js\n\n\n/* istanbul ignore next */\nmain.install = function (Vue) {\n Vue.component(main.name, main);\n};\n\n/* harmony default export */ var scrollbar = __webpack_exports__[\"default\"] = (main);\n\n/***/ }),\n\n/***/ 16:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"4010\");\n\n/***/ }),\n\n/***/ 2:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"5924\");\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"8122\");\n\n/***/ }),\n\n/***/ 39:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"e62d\");\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvc2Nyb2xsYmFyLmpzPzE0ZTkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsZ0NBQWdDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxrQkFBa0I7QUFDbEY7QUFDQSx5REFBeUQsY0FBYztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQ0FBaUM7QUFDbEYsd0hBQXdILG1CQUFtQixFQUFFO0FBQzdJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQkFBMEIsRUFBRTtBQUMvRCx5Q0FBeUMsZUFBZTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtEQUErRDtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQsaUNBQWlDLG1DQUFtQyxHQUFHO0FBQ3ZFO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxlQUFlOztBQUU5QjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGlCQUFpQjtBQUNqQixpQkFBaUI7QUFDakIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkRBQTJELGtDQUFrQzs7QUFFN0Y7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVCw2R0FBNkc7QUFDN0c7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHdCQUF3QjtBQUM3QyxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQW1DOztBQUU1RCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBMEI7O0FBRW5ELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUEyQjs7QUFFcEQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQXNDOztBQUUvRCxPQUFPOztBQUVQLFVBQVUiLCJmaWxlIjoiMTRlOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC9cIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTMzKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gMTMzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Jlc2l6ZS1ldmVudFwiXG52YXIgcmVzaXplX2V2ZW50XyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvc2Nyb2xsYmFyLXdpZHRoXCJcbnZhciBzY3JvbGxiYXJfd2lkdGhfID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOSk7XG52YXIgc2Nyb2xsYmFyX3dpZHRoX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHNjcm9sbGJhcl93aWR0aF8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvdXRpbFwiXG52YXIgdXRpbF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvZG9tXCJcbnZhciBkb21fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zY3JvbGxiYXIvc3JjL3V0aWwuanNcbnZhciBCQVJfTUFQID0ge1xuICB2ZXJ0aWNhbDoge1xuICAgIG9mZnNldDogJ29mZnNldEhlaWdodCcsXG4gICAgc2Nyb2xsOiAnc2Nyb2xsVG9wJyxcbiAgICBzY3JvbGxTaXplOiAnc2Nyb2xsSGVpZ2h0JyxcbiAgICBzaXplOiAnaGVpZ2h0JyxcbiAgICBrZXk6ICd2ZXJ0aWNhbCcsXG4gICAgYXhpczogJ1knLFxuICAgIGNsaWVudDogJ2NsaWVudFknLFxuICAgIGRpcmVjdGlvbjogJ3RvcCdcbiAgfSxcbiAgaG9yaXpvbnRhbDoge1xuICAgIG9mZnNldDogJ29mZnNldFdpZHRoJyxcbiAgICBzY3JvbGw6ICdzY3JvbGxMZWZ0JyxcbiAgICBzY3JvbGxTaXplOiAnc2Nyb2xsV2lkdGgnLFxuICAgIHNpemU6ICd3aWR0aCcsXG4gICAga2V5OiAnaG9yaXpvbnRhbCcsXG4gICAgYXhpczogJ1gnLFxuICAgIGNsaWVudDogJ2NsaWVudFgnLFxuICAgIGRpcmVjdGlvbjogJ2xlZnQnXG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlbmRlclRodW1iU3R5bGUoX3JlZikge1xuICB2YXIgbW92ZSA9IF9yZWYubW92ZSxcbiAgICAgIHNpemUgPSBfcmVmLnNpemUsXG4gICAgICBiYXIgPSBfcmVmLmJhcjtcblxuICB2YXIgc3R5bGUgPSB7fTtcbiAgdmFyIHRyYW5zbGF0ZSA9ICd0cmFuc2xhdGUnICsgYmFyLmF4aXMgKyAnKCcgKyBtb3ZlICsgJyUpJztcblxuICBzdHlsZVtiYXIuc2l6ZV0gPSBzaXplO1xuICBzdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2xhdGU7XG4gIHN0eWxlLm1zVHJhbnNmb3JtID0gdHJhbnNsYXRlO1xuICBzdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSB0cmFuc2xhdGU7XG5cbiAgcmV0dXJuIHN0eWxlO1xufTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2Nyb2xsYmFyL3NyYy9iYXIuanNcblxuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfYmFyID0gKHtcbiAgbmFtZTogJ0JhcicsXG5cbiAgcHJvcHM6IHtcbiAgICB2ZXJ0aWNhbDogQm9vbGVhbixcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgbW92ZTogTnVtYmVyXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBiYXI6IGZ1bmN0aW9uIGJhcigpIHtcbiAgICAgIHJldHVybiBCQVJfTUFQW3RoaXMudmVydGljYWwgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnXTtcbiAgICB9LFxuICAgIHdyYXA6IGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50LndyYXA7XG4gICAgfVxuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZSxcbiAgICAgICAgbW92ZSA9IHRoaXMubW92ZSxcbiAgICAgICAgYmFyID0gdGhpcy5iYXI7XG5cblxuICAgIHJldHVybiBoKFxuICAgICAgJ2RpdicsXG4gICAgICB7XG4gICAgICAgICdjbGFzcyc6IFsnZWwtc2Nyb2xsYmFyX19iYXInLCAnaXMtJyArIGJhci5rZXldLFxuICAgICAgICBvbjoge1xuICAgICAgICAgICdtb3VzZWRvd24nOiB0aGlzLmNsaWNrVHJhY2tIYW5kbGVyXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbaCgnZGl2Jywge1xuICAgICAgICByZWY6ICd0aHVtYicsXG4gICAgICAgICdjbGFzcyc6ICdlbC1zY3JvbGxiYXJfX3RodW1iJyxcbiAgICAgICAgb246IHtcbiAgICAgICAgICAnbW91c2Vkb3duJzogdGhpcy5jbGlja1RodW1iSGFuZGxlclxuICAgICAgICB9LFxuXG4gICAgICAgIHN0eWxlOiByZW5kZXJUaHVtYlN0eWxlKHsgc2l6ZTogc2l6ZSwgbW92ZTogbW92ZSwgYmFyOiBiYXIgfSkgfSldXG4gICAgKTtcbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBjbGlja1RodW1iSGFuZGxlcjogZnVuY3Rpb24gY2xpY2tUaHVtYkhhbmRsZXIoZSkge1xuICAgICAgLy8gcHJldmVudCBjbGljayBldmVudCBvZiByaWdodCBidXR0b25cbiAgICAgIGlmIChlLmN0cmxLZXkgfHwgZS5idXR0b24gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGFydERyYWcoZSk7XG4gICAgICB0aGlzW3RoaXMuYmFyLmF4aXNdID0gZS5jdXJyZW50VGFyZ2V0W3RoaXMuYmFyLm9mZnNldF0gLSAoZVt0aGlzLmJhci5jbGllbnRdIC0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3RoaXMuYmFyLmRpcmVjdGlvbl0pO1xuICAgIH0sXG4gICAgY2xpY2tUcmFja0hhbmRsZXI6IGZ1bmN0aW9uIGNsaWNrVHJhY2tIYW5kbGVyKGUpIHtcbiAgICAgIHZhciBvZmZzZXQgPSBNYXRoLmFicyhlLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0aGlzLmJhci5kaXJlY3Rpb25dIC0gZVt0aGlzLmJhci5jbGllbnRdKTtcbiAgICAgIHZhciB0aHVtYkhhbGYgPSB0aGlzLiRyZWZzLnRodW1iW3RoaXMuYmFyLm9mZnNldF0gLyAyO1xuICAgICAgdmFyIHRodW1iUG9zaXRpb25QZXJjZW50YWdlID0gKG9mZnNldCAtIHRodW1iSGFsZikgKiAxMDAgLyB0aGlzLiRlbFt0aGlzLmJhci5vZmZzZXRdO1xuXG4gICAgICB0aGlzLndyYXBbdGhpcy5iYXIuc2Nyb2xsXSA9IHRodW1iUG9zaXRpb25QZXJjZW50YWdlICogdGhpcy53cmFwW3RoaXMuYmFyLnNjcm9sbFNpemVdIC8gMTAwO1xuICAgIH0sXG4gICAgc3RhcnREcmFnOiBmdW5jdGlvbiBzdGFydERyYWcoZSkge1xuICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuY3Vyc29yRG93biA9IHRydWU7XG5cbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVEb2N1bWVudEhhbmRsZXIpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkoZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5tb3VzZVVwRG9jdW1lbnRIYW5kbGVyKTtcbiAgICAgIGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBtb3VzZU1vdmVEb2N1bWVudEhhbmRsZXI6IGZ1bmN0aW9uIG1vdXNlTW92ZURvY3VtZW50SGFuZGxlcihlKSB7XG4gICAgICBpZiAodGhpcy5jdXJzb3JEb3duID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgdmFyIHByZXZQYWdlID0gdGhpc1t0aGlzLmJhci5heGlzXTtcblxuICAgICAgaWYgKCFwcmV2UGFnZSkgcmV0dXJuO1xuXG4gICAgICB2YXIgb2Zmc2V0ID0gKHRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3RoaXMuYmFyLmRpcmVjdGlvbl0gLSBlW3RoaXMuYmFyLmNsaWVudF0pICogLTE7XG4gICAgICB2YXIgdGh1bWJDbGlja1Bvc2l0aW9uID0gdGhpcy4kcmVmcy50aHVtYlt0aGlzLmJhci5vZmZzZXRdIC0gcHJldlBhZ2U7XG4gICAgICB2YXIgdGh1bWJQb3NpdGlvblBlcmNlbnRhZ2UgPSAob2Zmc2V0IC0gdGh1bWJDbGlja1Bvc2l0aW9uKSAqIDEwMCAvIHRoaXMuJGVsW3RoaXMuYmFyLm9mZnNldF07XG5cbiAgICAgIHRoaXMud3JhcFt0aGlzLmJhci5zY3JvbGxdID0gdGh1bWJQb3NpdGlvblBlcmNlbnRhZ2UgKiB0aGlzLndyYXBbdGhpcy5iYXIuc2Nyb2xsU2l6ZV0gLyAxMDA7XG4gICAgfSxcbiAgICBtb3VzZVVwRG9jdW1lbnRIYW5kbGVyOiBmdW5jdGlvbiBtb3VzZVVwRG9jdW1lbnRIYW5kbGVyKGUpIHtcbiAgICAgIHRoaXMuY3Vyc29yRG93biA9IGZhbHNlO1xuICAgICAgdGhpc1t0aGlzLmJhci5heGlzXSA9IDA7XG4gICAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZURvY3VtZW50SGFuZGxlcik7XG4gICAgICBkb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKGRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMubW91c2VVcERvY3VtZW50SGFuZGxlcik7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zY3JvbGxiYXIvc3JjL21haW4uanNcbi8vIHJlZmVyZW5jZSBodHRwczovL2dpdGh1Yi5jb20vbm9lbGRlbGdhZG8vZ2VtaW5pLXNjcm9sbGJhci9ibG9iL21hc3Rlci9pbmRleC5qc1xuXG5cblxuXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG1haW4gPSAoe1xuICBuYW1lOiAnRWxTY3JvbGxiYXInLFxuXG4gIGNvbXBvbmVudHM6IHsgQmFyOiBzcmNfYmFyIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBuYXRpdmU6IEJvb2xlYW4sXG4gICAgd3JhcFN0eWxlOiB7fSxcbiAgICB3cmFwQ2xhc3M6IHt9LFxuICAgIHZpZXdDbGFzczoge30sXG4gICAgdmlld1N0eWxlOiB7fSxcbiAgICBub3Jlc2l6ZTogQm9vbGVhbiwgLy8g5aaC5p6cIGNvbnRhaW5lciDlsLrlr7jkuI3kvJrlj5HnlJ/lj5jljJbvvIzmnIDlpb3orr7nva7lroPlj6/ku6XkvJjljJbmgKfog71cbiAgICB0YWc6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdkaXYnXG4gICAgfVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemVXaWR0aDogJzAnLFxuICAgICAgc2l6ZUhlaWdodDogJzAnLFxuICAgICAgbW92ZVg6IDAsXG4gICAgICBtb3ZlWTogMFxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIHdyYXA6IGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy53cmFwO1xuICAgIH1cbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgdmFyIGd1dHRlciA9IHNjcm9sbGJhcl93aWR0aF9kZWZhdWx0KCkoKTtcbiAgICB2YXIgc3R5bGUgPSB0aGlzLndyYXBTdHlsZTtcblxuICAgIGlmIChndXR0ZXIpIHtcbiAgICAgIHZhciBndXR0ZXJXaXRoID0gJy0nICsgZ3V0dGVyICsgJ3B4JztcbiAgICAgIHZhciBndXR0ZXJTdHlsZSA9ICdtYXJnaW4tYm90dG9tOiAnICsgZ3V0dGVyV2l0aCArICc7IG1hcmdpbi1yaWdodDogJyArIGd1dHRlcldpdGggKyAnOyc7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMud3JhcFN0eWxlKSkge1xuICAgICAgICBzdHlsZSA9IE9iamVjdCh1dGlsX1tcInRvT2JqZWN0XCJdKSh0aGlzLndyYXBTdHlsZSk7XG4gICAgICAgIHN0eWxlLm1hcmdpblJpZ2h0ID0gc3R5bGUubWFyZ2luQm90dG9tID0gZ3V0dGVyV2l0aDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMud3JhcFN0eWxlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzdHlsZSArPSBndXR0ZXJTdHlsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlID0gZ3V0dGVyU3R5bGU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciB2aWV3ID0gaCh0aGlzLnRhZywge1xuICAgICAgY2xhc3M6IFsnZWwtc2Nyb2xsYmFyX192aWV3JywgdGhpcy52aWV3Q2xhc3NdLFxuICAgICAgc3R5bGU6IHRoaXMudmlld1N0eWxlLFxuICAgICAgcmVmOiAncmVzaXplJ1xuICAgIH0sIHRoaXMuJHNsb3RzLmRlZmF1bHQpO1xuICAgIHZhciB3cmFwID0gaChcbiAgICAgICdkaXYnLFxuICAgICAge1xuICAgICAgICByZWY6ICd3cmFwJyxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBvbjoge1xuICAgICAgICAgICdzY3JvbGwnOiB0aGlzLmhhbmRsZVNjcm9sbFxuICAgICAgICB9LFxuXG4gICAgICAgICdjbGFzcyc6IFt0aGlzLndyYXBDbGFzcywgJ2VsLXNjcm9sbGJhcl9fd3JhcCcsIGd1dHRlciA/ICcnIDogJ2VsLXNjcm9sbGJhcl9fd3JhcC0taGlkZGVuLWRlZmF1bHQnXSB9LFxuICAgICAgW1t2aWV3XV1cbiAgICApO1xuICAgIHZhciBub2RlcyA9IHZvaWQgMDtcblxuICAgIGlmICghdGhpcy5uYXRpdmUpIHtcbiAgICAgIG5vZGVzID0gW3dyYXAsIGgoc3JjX2Jhciwge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIG1vdmU6IHRoaXMubW92ZVgsXG4gICAgICAgICAgc2l6ZTogdGhpcy5zaXplV2lkdGggfVxuICAgICAgfSksIGgoc3JjX2Jhciwge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHZlcnRpY2FsOiB0cnVlLFxuICAgICAgICAgIG1vdmU6IHRoaXMubW92ZVksXG4gICAgICAgICAgc2l6ZTogdGhpcy5zaXplSGVpZ2h0IH1cbiAgICAgIH0pXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZXMgPSBbaChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHtcbiAgICAgICAgICByZWY6ICd3cmFwJyxcbiAgICAgICAgICAnY2xhc3MnOiBbdGhpcy53cmFwQ2xhc3MsICdlbC1zY3JvbGxiYXJfX3dyYXAnXSxcbiAgICAgICAgICBzdHlsZTogc3R5bGUgfSxcbiAgICAgICAgW1t2aWV3XV1cbiAgICAgICldO1xuICAgIH1cbiAgICByZXR1cm4gaCgnZGl2JywgeyBjbGFzczogJ2VsLXNjcm9sbGJhcicgfSwgbm9kZXMpO1xuICB9LFxuXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZVNjcm9sbDogZnVuY3Rpb24gaGFuZGxlU2Nyb2xsKCkge1xuICAgICAgdmFyIHdyYXAgPSB0aGlzLndyYXA7XG5cbiAgICAgIHRoaXMubW92ZVkgPSB3cmFwLnNjcm9sbFRvcCAqIDEwMCAvIHdyYXAuY2xpZW50SGVpZ2h0O1xuICAgICAgdGhpcy5tb3ZlWCA9IHdyYXAuc2Nyb2xsTGVmdCAqIDEwMCAvIHdyYXAuY2xpZW50V2lkdGg7XG4gICAgfSxcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHZhciBoZWlnaHRQZXJjZW50YWdlID0gdm9pZCAwLFxuICAgICAgICAgIHdpZHRoUGVyY2VudGFnZSA9IHZvaWQgMDtcbiAgICAgIHZhciB3cmFwID0gdGhpcy53cmFwO1xuICAgICAgaWYgKCF3cmFwKSByZXR1cm47XG5cbiAgICAgIGhlaWdodFBlcmNlbnRhZ2UgPSB3cmFwLmNsaWVudEhlaWdodCAqIDEwMCAvIHdyYXAuc2Nyb2xsSGVpZ2h0O1xuICAgICAgd2lkdGhQZXJjZW50YWdlID0gd3JhcC5jbGllbnRXaWR0aCAqIDEwMCAvIHdyYXAuc2Nyb2xsV2lkdGg7XG5cbiAgICAgIHRoaXMuc2l6ZUhlaWdodCA9IGhlaWdodFBlcmNlbnRhZ2UgPCAxMDAgPyBoZWlnaHRQZXJjZW50YWdlICsgJyUnIDogJyc7XG4gICAgICB0aGlzLnNpemVXaWR0aCA9IHdpZHRoUGVyY2VudGFnZSA8IDEwMCA/IHdpZHRoUGVyY2VudGFnZSArICclJyA6ICcnO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkgcmV0dXJuO1xuICAgIHRoaXMuJG5leHRUaWNrKHRoaXMudXBkYXRlKTtcbiAgICAhdGhpcy5ub3Jlc2l6ZSAmJiBPYmplY3QocmVzaXplX2V2ZW50X1tcImFkZFJlc2l6ZUxpc3RlbmVyXCJdKSh0aGlzLiRyZWZzLnJlc2l6ZSwgdGhpcy51cGRhdGUpO1xuICB9LFxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkgcmV0dXJuO1xuICAgICF0aGlzLm5vcmVzaXplICYmIE9iamVjdChyZXNpemVfZXZlbnRfW1wicmVtb3ZlUmVzaXplTGlzdGVuZXJcIl0pKHRoaXMuJHJlZnMucmVzaXplLCB0aGlzLnVwZGF0ZSk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zY3JvbGxiYXIvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xubWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KG1haW4ubmFtZSwgbWFpbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzY3JvbGxiYXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChtYWluKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDE2OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9yZXNpemUtZXZlbnRcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9kb21cIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzk6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Njcm9sbGJhci13aWR0aFwiKTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///14e9\n")},"299c":function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 138);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 138:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/vue-popper\"\nvar vue_popper_ = __webpack_require__(5);\nvar vue_popper_default = /*#__PURE__*/__webpack_require__.n(vue_popper_);\n\n// EXTERNAL MODULE: external \"throttle-debounce/debounce\"\nvar debounce_ = __webpack_require__(19);\nvar debounce_default = /*#__PURE__*/__webpack_require__.n(debounce_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/dom\"\nvar dom_ = __webpack_require__(2);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/util\"\nvar util_ = __webpack_require__(3);\n\n// EXTERNAL MODULE: external \"vue\"\nvar external_vue_ = __webpack_require__(7);\nvar external_vue_default = /*#__PURE__*/__webpack_require__.n(external_vue_);\n\n// CONCATENATED MODULE: ./packages/tooltip/src/main.js\n\n\n\n\n\n\n/* harmony default export */ var main = ({\n name: 'ElTooltip',\n\n mixins: [vue_popper_default.a],\n\n props: {\n openDelay: {\n type: Number,\n default: 0\n },\n disabled: Boolean,\n manual: Boolean,\n effect: {\n type: String,\n default: 'dark'\n },\n arrowOffset: {\n type: Number,\n default: 0\n },\n popperClass: String,\n content: String,\n visibleArrow: {\n default: true\n },\n transition: {\n type: String,\n default: 'el-fade-in-linear'\n },\n popperOptions: {\n default: function _default() {\n return {\n boundariesPadding: 10,\n gpuAcceleration: false\n };\n }\n },\n enterable: {\n type: Boolean,\n default: true\n },\n hideAfter: {\n type: Number,\n default: 0\n },\n tabindex: {\n type: Number,\n default: 0\n }\n },\n\n data: function data() {\n return {\n tooltipId: 'el-tooltip-' + Object(util_[\"generateId\"])(),\n timeoutPending: null,\n focusing: false\n };\n },\n beforeCreate: function beforeCreate() {\n var _this = this;\n\n if (this.$isServer) return;\n\n this.popperVM = new external_vue_default.a({\n data: { node: '' },\n render: function render(h) {\n return this.node;\n }\n }).$mount();\n\n this.debounceClose = debounce_default()(200, function () {\n return _this.handleClosePopper();\n });\n },\n render: function render(h) {\n var _this2 = this;\n\n if (this.popperVM) {\n this.popperVM.node = h(\n 'transition',\n {\n attrs: {\n name: this.transition\n },\n on: {\n 'afterLeave': this.doDestroy\n }\n },\n [h(\n 'div',\n {\n on: {\n 'mouseleave': function mouseleave() {\n _this2.setExpectedState(false);_this2.debounceClose();\n },\n 'mouseenter': function mouseenter() {\n _this2.setExpectedState(true);\n }\n },\n\n ref: 'popper',\n attrs: { role: 'tooltip',\n id: this.tooltipId,\n 'aria-hidden': this.disabled || !this.showPopper ? 'true' : 'false'\n },\n directives: [{\n name: 'show',\n value: !this.disabled && this.showPopper\n }],\n\n 'class': ['el-tooltip__popper', 'is-' + this.effect, this.popperClass] },\n [this.$slots.content || this.content]\n )]\n );\n }\n\n var firstElement = this.getFirstElement();\n if (!firstElement) return null;\n\n var data = firstElement.data = firstElement.data || {};\n data.staticClass = this.addTooltipClass(data.staticClass);\n\n return firstElement;\n },\n mounted: function mounted() {\n var _this3 = this;\n\n this.referenceElm = this.$el;\n if (this.$el.nodeType === 1) {\n this.$el.setAttribute('aria-describedby', this.tooltipId);\n this.$el.setAttribute('tabindex', this.tabindex);\n Object(dom_[\"on\"])(this.referenceElm, 'mouseenter', this.show);\n Object(dom_[\"on\"])(this.referenceElm, 'mouseleave', this.hide);\n Object(dom_[\"on\"])(this.referenceElm, 'focus', function () {\n if (!_this3.$slots.default || !_this3.$slots.default.length) {\n _this3.handleFocus();\n return;\n }\n var instance = _this3.$slots.default[0].componentInstance;\n if (instance && instance.focus) {\n instance.focus();\n } else {\n _this3.handleFocus();\n }\n });\n Object(dom_[\"on\"])(this.referenceElm, 'blur', this.handleBlur);\n Object(dom_[\"on\"])(this.referenceElm, 'click', this.removeFocusing);\n }\n // fix issue https://github.com/ElemeFE/element/issues/14424\n if (this.value && this.popperVM) {\n this.popperVM.$nextTick(function () {\n if (_this3.value) {\n _this3.updatePopper();\n }\n });\n }\n },\n\n watch: {\n focusing: function focusing(val) {\n if (val) {\n Object(dom_[\"addClass\"])(this.referenceElm, 'focusing');\n } else {\n Object(dom_[\"removeClass\"])(this.referenceElm, 'focusing');\n }\n }\n },\n methods: {\n show: function show() {\n this.setExpectedState(true);\n this.handleShowPopper();\n },\n hide: function hide() {\n this.setExpectedState(false);\n this.debounceClose();\n },\n handleFocus: function handleFocus() {\n this.focusing = true;\n this.show();\n },\n handleBlur: function handleBlur() {\n this.focusing = false;\n this.hide();\n },\n removeFocusing: function removeFocusing() {\n this.focusing = false;\n },\n addTooltipClass: function addTooltipClass(prev) {\n if (!prev) {\n return 'el-tooltip';\n } else {\n return 'el-tooltip ' + prev.replace('el-tooltip', '');\n }\n },\n handleShowPopper: function handleShowPopper() {\n var _this4 = this;\n\n if (!this.expectedState || this.manual) return;\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () {\n _this4.showPopper = true;\n }, this.openDelay);\n\n if (this.hideAfter > 0) {\n this.timeoutPending = setTimeout(function () {\n _this4.showPopper = false;\n }, this.hideAfter);\n }\n },\n handleClosePopper: function handleClosePopper() {\n if (this.enterable && this.expectedState || this.manual) return;\n clearTimeout(this.timeout);\n\n if (this.timeoutPending) {\n clearTimeout(this.timeoutPending);\n }\n this.showPopper = false;\n\n if (this.disabled) {\n this.doDestroy();\n }\n },\n setExpectedState: function setExpectedState(expectedState) {\n if (expectedState === false) {\n clearTimeout(this.timeoutPending);\n }\n this.expectedState = expectedState;\n },\n getFirstElement: function getFirstElement() {\n var slots = this.$slots.default;\n if (!Array.isArray(slots)) return null;\n var element = null;\n for (var index = 0; index < slots.length; index++) {\n if (slots[index] && slots[index].tag) {\n element = slots[index];\n break;\n };\n }\n return element;\n }\n },\n\n beforeDestroy: function beforeDestroy() {\n this.popperVM && this.popperVM.$destroy();\n },\n destroyed: function destroyed() {\n var reference = this.referenceElm;\n if (reference.nodeType === 1) {\n Object(dom_[\"off\"])(reference, 'mouseenter', this.show);\n Object(dom_[\"off\"])(reference, 'mouseleave', this.hide);\n Object(dom_[\"off\"])(reference, 'focus', this.handleFocus);\n Object(dom_[\"off\"])(reference, 'blur', this.handleBlur);\n Object(dom_[\"off\"])(reference, 'click', this.removeFocusing);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/tooltip/index.js\n\n\n/* istanbul ignore next */\nmain.install = function (Vue) {\n Vue.component(main.name, main);\n};\n\n/* harmony default export */ var tooltip = __webpack_exports__[\"default\"] = (main);\n\n/***/ }),\n\n/***/ 19:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"0e15\");\n\n/***/ }),\n\n/***/ 2:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"5924\");\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"8122\");\n\n/***/ }),\n\n/***/ 5:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"e974\");\n\n/***/ }),\n\n/***/ 7:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"2b0e\");\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdG9vbHRpcC5qcz8yOTljIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELGdDQUFnQztBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0Usa0JBQWtCO0FBQ2xGO0FBQ0EseURBQXlELGNBQWM7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsaUNBQWlDO0FBQ2xGLHdIQUF3SCxtQkFBbUIsRUFBRTtBQUM3STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsMEJBQTBCLEVBQUU7QUFDL0QseUNBQXlDLGVBQWU7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCwrREFBK0Q7QUFDN0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FBT0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQyxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWIsb0ZBQW9GO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsc0JBQXNCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBNEI7O0FBRXJELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFbkQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQTJCOztBQUVwRCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBaUM7O0FBRTFELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUFLOztBQUU5QixPQUFPOztBQUVQLFVBQVUiLCJmaWxlIjoiMjk5Yy5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC9cIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTM4KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gMTM4OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Z1ZS1wb3BwZXJcIlxudmFyIHZ1ZV9wb3BwZXJfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbnZhciB2dWVfcG9wcGVyX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHZ1ZV9wb3BwZXJfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcInRocm90dGxlLWRlYm91bmNlL2RlYm91bmNlXCJcbnZhciBkZWJvdW5jZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTtcbnZhciBkZWJvdW5jZV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihkZWJvdW5jZV8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvZG9tXCJcbnZhciBkb21fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL3V0aWxcIlxudmFyIHV0aWxfID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcInZ1ZVwiXG52YXIgZXh0ZXJuYWxfdnVlXyA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7XG52YXIgZXh0ZXJuYWxfdnVlX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGV4dGVybmFsX3Z1ZV8pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Rvb2x0aXAvc3JjL21haW4uanNcblxuXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG1haW4gPSAoe1xuICBuYW1lOiAnRWxUb29sdGlwJyxcblxuICBtaXhpbnM6IFt2dWVfcG9wcGVyX2RlZmF1bHQuYV0sXG5cbiAgcHJvcHM6IHtcbiAgICBvcGVuRGVsYXk6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIGRpc2FibGVkOiBCb29sZWFuLFxuICAgIG1hbnVhbDogQm9vbGVhbixcbiAgICBlZmZlY3Q6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdkYXJrJ1xuICAgIH0sXG4gICAgYXJyb3dPZmZzZXQ6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIHBvcHBlckNsYXNzOiBTdHJpbmcsXG4gICAgY29udGVudDogU3RyaW5nLFxuICAgIHZpc2libGVBcnJvdzoge1xuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgdHJhbnNpdGlvbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2VsLWZhZGUtaW4tbGluZWFyJ1xuICAgIH0sXG4gICAgcG9wcGVyT3B0aW9uczoge1xuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYm91bmRhcmllc1BhZGRpbmc6IDEwLFxuICAgICAgICAgIGdwdUFjY2VsZXJhdGlvbjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGVudGVyYWJsZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGhpZGVBZnRlcjoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMFxuICAgIH0sXG4gICAgdGFiaW5kZXg6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9vbHRpcElkOiAnZWwtdG9vbHRpcC0nICsgT2JqZWN0KHV0aWxfW1wiZ2VuZXJhdGVJZFwiXSkoKSxcbiAgICAgIHRpbWVvdXRQZW5kaW5nOiBudWxsLFxuICAgICAgZm9jdXNpbmc6IGZhbHNlXG4gICAgfTtcbiAgfSxcbiAgYmVmb3JlQ3JlYXRlOiBmdW5jdGlvbiBiZWZvcmVDcmVhdGUoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICh0aGlzLiRpc1NlcnZlcikgcmV0dXJuO1xuXG4gICAgdGhpcy5wb3BwZXJWTSA9IG5ldyBleHRlcm5hbF92dWVfZGVmYXVsdC5hKHtcbiAgICAgIGRhdGE6IHsgbm9kZTogJycgfSxcbiAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZTtcbiAgICAgIH1cbiAgICB9KS4kbW91bnQoKTtcblxuICAgIHRoaXMuZGVib3VuY2VDbG9zZSA9IGRlYm91bmNlX2RlZmF1bHQoKSgyMDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVDbG9zZVBvcHBlcigpO1xuICAgIH0pO1xuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5wb3BwZXJWTSkge1xuICAgICAgdGhpcy5wb3BwZXJWTS5ub2RlID0gaChcbiAgICAgICAgJ3RyYW5zaXRpb24nLFxuICAgICAgICB7XG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNpdGlvblxuICAgICAgICAgIH0sXG4gICAgICAgICAgb246IHtcbiAgICAgICAgICAgICdhZnRlckxlYXZlJzogdGhpcy5kb0Rlc3Ryb3lcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtoKFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICdtb3VzZWxlYXZlJzogZnVuY3Rpb24gbW91c2VsZWF2ZSgpIHtcbiAgICAgICAgICAgICAgICBfdGhpczIuc2V0RXhwZWN0ZWRTdGF0ZShmYWxzZSk7X3RoaXMyLmRlYm91bmNlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ21vdXNlZW50ZXInOiBmdW5jdGlvbiBtb3VzZWVudGVyKCkge1xuICAgICAgICAgICAgICAgIF90aGlzMi5zZXRFeHBlY3RlZFN0YXRlKHRydWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByZWY6ICdwb3BwZXInLFxuICAgICAgICAgICAgYXR0cnM6IHsgcm9sZTogJ3Rvb2x0aXAnLFxuICAgICAgICAgICAgICBpZDogdGhpcy50b29sdGlwSWQsXG4gICAgICAgICAgICAgICdhcmlhLWhpZGRlbic6IHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMuc2hvd1BvcHBlciA/ICd0cnVlJyA6ICdmYWxzZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbe1xuICAgICAgICAgICAgICBuYW1lOiAnc2hvdycsXG4gICAgICAgICAgICAgIHZhbHVlOiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLnNob3dQb3BwZXJcbiAgICAgICAgICAgIH1dLFxuXG4gICAgICAgICAgICAnY2xhc3MnOiBbJ2VsLXRvb2x0aXBfX3BvcHBlcicsICdpcy0nICsgdGhpcy5lZmZlY3QsIHRoaXMucG9wcGVyQ2xhc3NdIH0sXG4gICAgICAgICAgW3RoaXMuJHNsb3RzLmNvbnRlbnQgfHwgdGhpcy5jb250ZW50XVxuICAgICAgICApXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3RFbGVtZW50ID0gdGhpcy5nZXRGaXJzdEVsZW1lbnQoKTtcbiAgICBpZiAoIWZpcnN0RWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgZGF0YSA9IGZpcnN0RWxlbWVudC5kYXRhID0gZmlyc3RFbGVtZW50LmRhdGEgfHwge307XG4gICAgZGF0YS5zdGF0aWNDbGFzcyA9IHRoaXMuYWRkVG9vbHRpcENsYXNzKGRhdGEuc3RhdGljQ2xhc3MpO1xuXG4gICAgcmV0dXJuIGZpcnN0RWxlbWVudDtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHRoaXMucmVmZXJlbmNlRWxtID0gdGhpcy4kZWw7XG4gICAgaWYgKHRoaXMuJGVsLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICB0aGlzLiRlbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aGlzLnRvb2x0aXBJZCk7XG4gICAgICB0aGlzLiRlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgdGhpcy50YWJpbmRleCk7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKSh0aGlzLnJlZmVyZW5jZUVsbSwgJ21vdXNlZW50ZXInLCB0aGlzLnNob3cpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdtb3VzZWxlYXZlJywgdGhpcy5oaWRlKTtcbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHRoaXMucmVmZXJlbmNlRWxtLCAnZm9jdXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMzLiRzbG90cy5kZWZhdWx0IHx8ICFfdGhpczMuJHNsb3RzLmRlZmF1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgX3RoaXMzLmhhbmRsZUZvY3VzKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IF90aGlzMy4kc2xvdHMuZGVmYXVsdFswXS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICAgICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmZvY3VzKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpczMuaGFuZGxlRm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKSh0aGlzLnJlZmVyZW5jZUVsbSwgJ2JsdXInLCB0aGlzLmhhbmRsZUJsdXIpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdjbGljaycsIHRoaXMucmVtb3ZlRm9jdXNpbmcpO1xuICAgIH1cbiAgICAvLyBmaXggaXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvMTQ0MjRcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnBvcHBlclZNKSB7XG4gICAgICB0aGlzLnBvcHBlclZNLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczMudmFsdWUpIHtcbiAgICAgICAgICBfdGhpczMudXBkYXRlUG9wcGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGZvY3VzaW5nOiBmdW5jdGlvbiBmb2N1c2luZyh2YWwpIHtcbiAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJhZGRDbGFzc1wiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdmb2N1c2luZycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJyZW1vdmVDbGFzc1wiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdmb2N1c2luZycpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIHNob3c6IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICB0aGlzLnNldEV4cGVjdGVkU3RhdGUodHJ1ZSk7XG4gICAgICB0aGlzLmhhbmRsZVNob3dQb3BwZXIoKTtcbiAgICB9LFxuICAgIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgICB0aGlzLnNldEV4cGVjdGVkU3RhdGUoZmFsc2UpO1xuICAgICAgdGhpcy5kZWJvdW5jZUNsb3NlKCk7XG4gICAgfSxcbiAgICBoYW5kbGVGb2N1czogZnVuY3Rpb24gaGFuZGxlRm9jdXMoKSB7XG4gICAgICB0aGlzLmZvY3VzaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH0sXG4gICAgaGFuZGxlQmx1cjogZnVuY3Rpb24gaGFuZGxlQmx1cigpIHtcbiAgICAgIHRoaXMuZm9jdXNpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0sXG4gICAgcmVtb3ZlRm9jdXNpbmc6IGZ1bmN0aW9uIHJlbW92ZUZvY3VzaW5nKCkge1xuICAgICAgdGhpcy5mb2N1c2luZyA9IGZhbHNlO1xuICAgIH0sXG4gICAgYWRkVG9vbHRpcENsYXNzOiBmdW5jdGlvbiBhZGRUb29sdGlwQ2xhc3MocHJldikge1xuICAgICAgaWYgKCFwcmV2KSB7XG4gICAgICAgIHJldHVybiAnZWwtdG9vbHRpcCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ2VsLXRvb2x0aXAgJyArIHByZXYucmVwbGFjZSgnZWwtdG9vbHRpcCcsICcnKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZVNob3dQb3BwZXI6IGZ1bmN0aW9uIGhhbmRsZVNob3dQb3BwZXIoKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLmV4cGVjdGVkU3RhdGUgfHwgdGhpcy5tYW51YWwpIHJldHVybjtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzNC5zaG93UG9wcGVyID0gdHJ1ZTtcbiAgICAgIH0sIHRoaXMub3BlbkRlbGF5KTtcblxuICAgICAgaWYgKHRoaXMuaGlkZUFmdGVyID4gMCkge1xuICAgICAgICB0aGlzLnRpbWVvdXRQZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXM0LnNob3dQb3BwZXIgPSBmYWxzZTtcbiAgICAgICAgfSwgdGhpcy5oaWRlQWZ0ZXIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlQ2xvc2VQb3BwZXI6IGZ1bmN0aW9uIGhhbmRsZUNsb3NlUG9wcGVyKCkge1xuICAgICAgaWYgKHRoaXMuZW50ZXJhYmxlICYmIHRoaXMuZXhwZWN0ZWRTdGF0ZSB8fCB0aGlzLm1hbnVhbCkgcmV0dXJuO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG5cbiAgICAgIGlmICh0aGlzLnRpbWVvdXRQZW5kaW5nKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRQZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hvd1BvcHBlciA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmRvRGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0RXhwZWN0ZWRTdGF0ZTogZnVuY3Rpb24gc2V0RXhwZWN0ZWRTdGF0ZShleHBlY3RlZFN0YXRlKSB7XG4gICAgICBpZiAoZXhwZWN0ZWRTdGF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFBlbmRpbmcpO1xuICAgICAgfVxuICAgICAgdGhpcy5leHBlY3RlZFN0YXRlID0gZXhwZWN0ZWRTdGF0ZTtcbiAgICB9LFxuICAgIGdldEZpcnN0RWxlbWVudDogZnVuY3Rpb24gZ2V0Rmlyc3RFbGVtZW50KCkge1xuICAgICAgdmFyIHNsb3RzID0gdGhpcy4kc2xvdHMuZGVmYXVsdDtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzbG90cykpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGVsZW1lbnQgPSBudWxsO1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNsb3RzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBpZiAoc2xvdHNbaW5kZXhdICYmIHNsb3RzW2luZGV4XS50YWcpIHtcbiAgICAgICAgICBlbGVtZW50ID0gc2xvdHNbaW5kZXhdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgdGhpcy5wb3BwZXJWTSAmJiB0aGlzLnBvcHBlclZNLiRkZXN0cm95KCk7XG4gIH0sXG4gIGRlc3Ryb3llZDogZnVuY3Rpb24gZGVzdHJveWVkKCkge1xuICAgIHZhciByZWZlcmVuY2UgPSB0aGlzLnJlZmVyZW5jZUVsbTtcbiAgICBpZiAocmVmZXJlbmNlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkocmVmZXJlbmNlLCAnbW91c2VlbnRlcicsIHRoaXMuc2hvdyk7XG4gICAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkocmVmZXJlbmNlLCAnbW91c2VsZWF2ZScsIHRoaXMuaGlkZSk7XG4gICAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkocmVmZXJlbmNlLCAnZm9jdXMnLCB0aGlzLmhhbmRsZUZvY3VzKTtcbiAgICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdibHVyJywgdGhpcy5oYW5kbGVCbHVyKTtcbiAgICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdjbGljaycsIHRoaXMucmVtb3ZlRm9jdXNpbmcpO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Rvb2x0aXAvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xubWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KG1haW4ubmFtZSwgbWFpbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0b29sdGlwID0gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAobWFpbik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAxOTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidGhyb3R0bGUtZGVib3VuY2UvZGVib3VuY2VcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9kb21cIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvdnVlLXBvcHBlclwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDc6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInZ1ZVwiKTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///299c\n")},"2a5e":function(module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\nexports.default = scrollIntoView;\n\nvar _vue = __webpack_require__("2b0e");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction scrollIntoView(container, selected) {\n if (_vue2.default.prototype.$isServer) return;\n\n if (!selected) {\n container.scrollTop = 0;\n return;\n }\n\n var offsetParents = [];\n var pointer = selected.offsetParent;\n while (pointer && container !== pointer && container.contains(pointer)) {\n offsetParents.push(pointer);\n pointer = pointer.offsetParent;\n }\n var top = selected.offsetTop + offsetParents.reduce(function (prev, curr) {\n return prev + curr.offsetTop;\n }, 0);\n var bottom = top + selected.offsetHeight;\n var viewRectTop = container.scrollTop;\n var viewRectBottom = viewRectTop + container.clientHeight;\n\n if (top < viewRectTop) {\n container.scrollTop = top;\n } else if (bottom > viewRectBottom) {\n container.scrollTop = bottom - container.clientHeight;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvc2Nyb2xsLWludG8tdmlldy5qcz8yYTVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7O0FBRUEsV0FBVyxtQkFBTyxDQUFDLE1BQUs7O0FBRXhCOztBQUVBLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBIiwiZmlsZSI6IjJhNWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBzY3JvbGxJbnRvVmlldztcblxudmFyIF92dWUgPSByZXF1aXJlKCd2dWUnKTtcblxudmFyIF92dWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdnVlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoY29udGFpbmVyLCBzZWxlY3RlZCkge1xuICBpZiAoX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyKSByZXR1cm47XG5cbiAgaWYgKCFzZWxlY3RlZCkge1xuICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSAwO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBvZmZzZXRQYXJlbnRzID0gW107XG4gIHZhciBwb2ludGVyID0gc2VsZWN0ZWQub2Zmc2V0UGFyZW50O1xuICB3aGlsZSAocG9pbnRlciAmJiBjb250YWluZXIgIT09IHBvaW50ZXIgJiYgY29udGFpbmVyLmNvbnRhaW5zKHBvaW50ZXIpKSB7XG4gICAgb2Zmc2V0UGFyZW50cy5wdXNoKHBvaW50ZXIpO1xuICAgIHBvaW50ZXIgPSBwb2ludGVyLm9mZnNldFBhcmVudDtcbiAgfVxuICB2YXIgdG9wID0gc2VsZWN0ZWQub2Zmc2V0VG9wICsgb2Zmc2V0UGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHtcbiAgICByZXR1cm4gcHJldiArIGN1cnIub2Zmc2V0VG9wO1xuICB9LCAwKTtcbiAgdmFyIGJvdHRvbSA9IHRvcCArIHNlbGVjdGVkLm9mZnNldEhlaWdodDtcbiAgdmFyIHZpZXdSZWN0VG9wID0gY29udGFpbmVyLnNjcm9sbFRvcDtcbiAgdmFyIHZpZXdSZWN0Qm90dG9tID0gdmlld1JlY3RUb3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xuXG4gIGlmICh0b3AgPCB2aWV3UmVjdFRvcCkge1xuICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSB0b3A7XG4gIH0gZWxzZSBpZiAoYm90dG9tID4gdmlld1JlY3RCb3R0b20pIHtcbiAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gYm90dG9tIC0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgfVxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2a5e\n')},"2bb5":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nvar _util = __webpack_require__(\"8122\");\n\n/**\n * Show migrating guide in browser console.\n *\n * Usage:\n * import Migrating from 'element-ui/src/mixins/migrating';\n *\n * mixins: [Migrating]\n *\n * add getMigratingConfig method for your component.\n * getMigratingConfig() {\n * return {\n * props: {\n * 'allow-no-selection': 'allow-no-selection is removed.',\n * 'selection-mode': 'selection-mode is removed.'\n * },\n * events: {\n * selectionchange: 'selectionchange is renamed to selection-change.'\n * }\n * };\n * },\n */\nexports.default = {\n mounted: function mounted() {\n if (true) return;\n if (!this.$vnode) return;\n\n var _getMigratingConfig = this.getMigratingConfig(),\n _getMigratingConfig$p = _getMigratingConfig.props,\n props = _getMigratingConfig$p === undefined ? {} : _getMigratingConfig$p,\n _getMigratingConfig$e = _getMigratingConfig.events,\n events = _getMigratingConfig$e === undefined ? {} : _getMigratingConfig$e;\n\n var _$vnode = this.$vnode,\n data = _$vnode.data,\n componentOptions = _$vnode.componentOptions;\n\n var definedProps = data.attrs || {};\n var definedEvents = componentOptions.listeners || {};\n\n for (var propName in definedProps) {\n propName = (0, _util.kebabCase)(propName); // compatible with camel case\n if (props[propName]) {\n console.warn('[Element Migrating][' + this.$options.name + '][Attribute]: ' + props[propName]);\n }\n }\n\n for (var eventName in definedEvents) {\n eventName = (0, _util.kebabCase)(eventName); // compatible with camel case\n if (events[eventName]) {\n console.warn('[Element Migrating][' + this.$options.name + '][Event]: ' + events[eventName]);\n }\n }\n },\n\n methods: {\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {},\n events: {}\n };\n }\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvbWl4aW5zL21pZ3JhdGluZy5qcz8yYmI1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLFlBQVksbUJBQU8sQ0FBQyxNQUEyQjs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQXFDO0FBQzdDOztBQUVBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQSx5REFBeUQ7O0FBRXpEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIyYmI1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKCdlbGVtZW50LXVpL2xpYi91dGlscy91dGlsJyk7XG5cbi8qKlxuICogU2hvdyBtaWdyYXRpbmcgZ3VpZGUgaW4gYnJvd3NlciBjb25zb2xlLlxuICpcbiAqIFVzYWdlOlxuICogaW1wb3J0IE1pZ3JhdGluZyBmcm9tICdlbGVtZW50LXVpL3NyYy9taXhpbnMvbWlncmF0aW5nJztcbiAqXG4gKiBtaXhpbnM6IFtNaWdyYXRpbmddXG4gKlxuICogYWRkIGdldE1pZ3JhdGluZ0NvbmZpZyBtZXRob2QgZm9yIHlvdXIgY29tcG9uZW50LlxuICogIGdldE1pZ3JhdGluZ0NvbmZpZygpIHtcbiAqICAgIHJldHVybiB7XG4gKiAgICAgIHByb3BzOiB7XG4gKiAgICAgICAgJ2FsbG93LW5vLXNlbGVjdGlvbic6ICdhbGxvdy1uby1zZWxlY3Rpb24gaXMgcmVtb3ZlZC4nLFxuICogICAgICAgICdzZWxlY3Rpb24tbW9kZSc6ICdzZWxlY3Rpb24tbW9kZSBpcyByZW1vdmVkLidcbiAqICAgICAgfSxcbiAqICAgICAgZXZlbnRzOiB7XG4gKiAgICAgICAgc2VsZWN0aW9uY2hhbmdlOiAnc2VsZWN0aW9uY2hhbmdlIGlzIHJlbmFtZWQgdG8gc2VsZWN0aW9uLWNoYW5nZS4nXG4gKiAgICAgIH1cbiAqICAgIH07XG4gKiAgfSxcbiAqL1xuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLiR2bm9kZSkgcmV0dXJuO1xuXG4gICAgdmFyIF9nZXRNaWdyYXRpbmdDb25maWcgPSB0aGlzLmdldE1pZ3JhdGluZ0NvbmZpZygpLFxuICAgICAgICBfZ2V0TWlncmF0aW5nQ29uZmlnJHAgPSBfZ2V0TWlncmF0aW5nQ29uZmlnLnByb3BzLFxuICAgICAgICBwcm9wcyA9IF9nZXRNaWdyYXRpbmdDb25maWckcCA9PT0gdW5kZWZpbmVkID8ge30gOiBfZ2V0TWlncmF0aW5nQ29uZmlnJHAsXG4gICAgICAgIF9nZXRNaWdyYXRpbmdDb25maWckZSA9IF9nZXRNaWdyYXRpbmdDb25maWcuZXZlbnRzLFxuICAgICAgICBldmVudHMgPSBfZ2V0TWlncmF0aW5nQ29uZmlnJGUgPT09IHVuZGVmaW5lZCA/IHt9IDogX2dldE1pZ3JhdGluZ0NvbmZpZyRlO1xuXG4gICAgdmFyIF8kdm5vZGUgPSB0aGlzLiR2bm9kZSxcbiAgICAgICAgZGF0YSA9IF8kdm5vZGUuZGF0YSxcbiAgICAgICAgY29tcG9uZW50T3B0aW9ucyA9IF8kdm5vZGUuY29tcG9uZW50T3B0aW9ucztcblxuICAgIHZhciBkZWZpbmVkUHJvcHMgPSBkYXRhLmF0dHJzIHx8IHt9O1xuICAgIHZhciBkZWZpbmVkRXZlbnRzID0gY29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnMgfHwge307XG5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZpbmVkUHJvcHMpIHtcbiAgICAgIHByb3BOYW1lID0gKDAsIF91dGlsLmtlYmFiQ2FzZSkocHJvcE5hbWUpOyAvLyBjb21wYXRpYmxlIHdpdGggY2FtZWwgY2FzZVxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tFbGVtZW50IE1pZ3JhdGluZ11bJyArIHRoaXMuJG9wdGlvbnMubmFtZSArICddW0F0dHJpYnV0ZV06ICcgKyBwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBkZWZpbmVkRXZlbnRzKSB7XG4gICAgICBldmVudE5hbWUgPSAoMCwgX3V0aWwua2ViYWJDYXNlKShldmVudE5hbWUpOyAvLyBjb21wYXRpYmxlIHdpdGggY2FtZWwgY2FzZVxuICAgICAgaWYgKGV2ZW50c1tldmVudE5hbWVdKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW0VsZW1lbnQgTWlncmF0aW5nXVsnICsgdGhpcy4kb3B0aW9ucy5uYW1lICsgJ11bRXZlbnRdOiAnICsgZXZlbnRzW2V2ZW50TmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TWlncmF0aW5nQ29uZmlnOiBmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczoge30sXG4gICAgICAgIGV2ZW50czoge31cbiAgICAgIH07XG4gICAgfVxuICB9XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2bb5\n")},4010:function(module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\nexports.removeResizeListener = exports.addResizeListener = undefined;\n\nvar _resizeObserverPolyfill = __webpack_require__("6dd8");\n\nvar _resizeObserverPolyfill2 = _interopRequireDefault(_resizeObserverPolyfill);\n\nvar _throttleDebounce = __webpack_require__("9619");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isServer = typeof window === \'undefined\';\n\n/* istanbul ignore next */\nvar resizeHandler = function resizeHandler(entries) {\n for (var _iterator = entries, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n var _ref;\n\n if (_isArray) {\n if (_i >= _iterator.length) break;\n _ref = _iterator[_i++];\n } else {\n _i = _iterator.next();\n if (_i.done) break;\n _ref = _i.value;\n }\n\n var entry = _ref;\n\n var listeners = entry.target.__resizeListeners__ || [];\n if (listeners.length) {\n listeners.forEach(function (fn) {\n fn();\n });\n }\n }\n};\n\n/* istanbul ignore next */\nvar addResizeListener = exports.addResizeListener = function addResizeListener(element, fn) {\n if (isServer) return;\n if (!element.__resizeListeners__) {\n element.__resizeListeners__ = [];\n element.__ro__ = new _resizeObserverPolyfill2.default((0, _throttleDebounce.debounce)(16, resizeHandler));\n element.__ro__.observe(element);\n }\n element.__resizeListeners__.push(fn);\n};\n\n/* istanbul ignore next */\nvar removeResizeListener = exports.removeResizeListener = function removeResizeListener(element, fn) {\n if (!element || !element.__resizeListeners__) return;\n element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);\n if (!element.__resizeListeners__.length) {\n element.__ro__.disconnect();\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvcmVzaXplLWV2ZW50LmpzPzQwMTAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTs7QUFFQSw4QkFBOEIsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFaEU7O0FBRUEsd0JBQXdCLG1CQUFPLENBQUMsTUFBbUI7O0FBRW5ELHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3Rjs7QUFFQTtBQUNBO0FBQ0EsOElBQThJO0FBQzlJOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI0MDEwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5yZW1vdmVSZXNpemVMaXN0ZW5lciA9IGV4cG9ydHMuYWRkUmVzaXplTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbnZhciBfcmVzaXplT2JzZXJ2ZXJQb2x5ZmlsbCA9IHJlcXVpcmUoJ3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbCcpO1xuXG52YXIgX3Jlc2l6ZU9ic2VydmVyUG9seWZpbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVzaXplT2JzZXJ2ZXJQb2x5ZmlsbCk7XG5cbnZhciBfdGhyb3R0bGVEZWJvdW5jZSA9IHJlcXVpcmUoJ3Rocm90dGxlLWRlYm91bmNlJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBpc1NlcnZlciA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbiByZXNpemVIYW5kbGVyKGVudHJpZXMpIHtcbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gZW50cmllcywgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pLnZhbHVlO1xuICAgIH1cblxuICAgIHZhciBlbnRyeSA9IF9yZWY7XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gZW50cnkudGFyZ2V0Ll9fcmVzaXplTGlzdGVuZXJzX18gfHwgW107XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICBmbigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIGFkZFJlc2l6ZUxpc3RlbmVyID0gZXhwb3J0cy5hZGRSZXNpemVMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZFJlc2l6ZUxpc3RlbmVyKGVsZW1lbnQsIGZuKSB7XG4gIGlmIChpc1NlcnZlcikgcmV0dXJuO1xuICBpZiAoIWVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXykge1xuICAgIGVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXyA9IFtdO1xuICAgIGVsZW1lbnQuX19yb19fID0gbmV3IF9yZXNpemVPYnNlcnZlclBvbHlmaWxsMi5kZWZhdWx0KCgwLCBfdGhyb3R0bGVEZWJvdW5jZS5kZWJvdW5jZSkoMTYsIHJlc2l6ZUhhbmRsZXIpKTtcbiAgICBlbGVtZW50Ll9fcm9fXy5vYnNlcnZlKGVsZW1lbnQpO1xuICB9XG4gIGVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXy5wdXNoKGZuKTtcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgcmVtb3ZlUmVzaXplTGlzdGVuZXIgPSBleHBvcnRzLnJlbW92ZVJlc2l6ZUxpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlUmVzaXplTGlzdGVuZXIoZWxlbWVudCwgZm4pIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50Ll9fcmVzaXplTGlzdGVuZXJzX18pIHJldHVybjtcbiAgZWxlbWVudC5fX3Jlc2l6ZUxpc3RlbmVyc19fLnNwbGljZShlbGVtZW50Ll9fcmVzaXplTGlzdGVuZXJzX18uaW5kZXhPZihmbiksIDEpO1xuICBpZiAoIWVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXy5sZW5ndGgpIHtcbiAgICBlbGVtZW50Ll9fcm9fXy5kaXNjb25uZWN0KCk7XG4gIH1cbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4010\n')},"417f":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _dom = __webpack_require__(\"5924\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar nodeList = [];\nvar ctx = '@@clickoutsideContext';\n\nvar startClick = void 0;\nvar seed = 0;\n\n!_vue2.default.prototype.$isServer && (0, _dom.on)(document, 'mousedown', function (e) {\n return startClick = e;\n});\n\n!_vue2.default.prototype.$isServer && (0, _dom.on)(document, 'mouseup', function (e) {\n nodeList.forEach(function (node) {\n return node[ctx].documentHandler(e, startClick);\n });\n});\n\nfunction createDocumentHandler(el, binding, vnode) {\n return function () {\n var mouseup = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var mousedown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!vnode || !vnode.context || !mouseup.target || !mousedown.target || el.contains(mouseup.target) || el.contains(mousedown.target) || el === mouseup.target || vnode.context.popperElm && (vnode.context.popperElm.contains(mouseup.target) || vnode.context.popperElm.contains(mousedown.target))) return;\n\n if (binding.expression && el[ctx].methodName && vnode.context[el[ctx].methodName]) {\n vnode.context[el[ctx].methodName]();\n } else {\n el[ctx].bindingFn && el[ctx].bindingFn();\n }\n };\n}\n\n/**\n * v-clickoutside\n * @desc 点击元素外面才会触发的事件\n * @example\n * ```vue\n * <div v-element-clickoutside=\"handleClose\">\n * ```\n */\nexports.default = {\n bind: function bind(el, binding, vnode) {\n nodeList.push(el);\n var id = seed++;\n el[ctx] = {\n id: id,\n documentHandler: createDocumentHandler(el, binding, vnode),\n methodName: binding.expression,\n bindingFn: binding.value\n };\n },\n update: function update(el, binding, vnode) {\n el[ctx].documentHandler = createDocumentHandler(el, binding, vnode);\n el[ctx].methodName = binding.expression;\n el[ctx].bindingFn = binding.value;\n },\n unbind: function unbind(el) {\n var len = nodeList.length;\n\n for (var i = 0; i < len; i++) {\n if (nodeList[i][ctx].id === el[ctx].id) {\n nodeList.splice(i, 1);\n break;\n }\n }\n delete el[ctx];\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvY2xpY2tvdXRzaWRlLmpzPzQxN2YiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7O0FBRUEsV0FBVyxtQkFBTyxDQUFDLE1BQUs7O0FBRXhCOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFN0Msc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNDE3Zi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF92dWUgPSByZXF1aXJlKCd2dWUnKTtcblxudmFyIF92dWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdnVlKTtcblxudmFyIF9kb20gPSByZXF1aXJlKCdlbGVtZW50LXVpL2xpYi91dGlscy9kb20nKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIG5vZGVMaXN0ID0gW107XG52YXIgY3R4ID0gJ0BAY2xpY2tvdXRzaWRlQ29udGV4dCc7XG5cbnZhciBzdGFydENsaWNrID0gdm9pZCAwO1xudmFyIHNlZWQgPSAwO1xuXG4hX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyICYmICgwLCBfZG9tLm9uKShkb2N1bWVudCwgJ21vdXNlZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBzdGFydENsaWNrID0gZTtcbn0pO1xuXG4hX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyICYmICgwLCBfZG9tLm9uKShkb2N1bWVudCwgJ21vdXNldXAnLCBmdW5jdGlvbiAoZSkge1xuICBub2RlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGVbY3R4XS5kb2N1bWVudEhhbmRsZXIoZSwgc3RhcnRDbGljayk7XG4gIH0pO1xufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURvY3VtZW50SGFuZGxlcihlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbW91c2V1cCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIG1vdXNlZG93biA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBpZiAoIXZub2RlIHx8ICF2bm9kZS5jb250ZXh0IHx8ICFtb3VzZXVwLnRhcmdldCB8fCAhbW91c2Vkb3duLnRhcmdldCB8fCBlbC5jb250YWlucyhtb3VzZXVwLnRhcmdldCkgfHwgZWwuY29udGFpbnMobW91c2Vkb3duLnRhcmdldCkgfHwgZWwgPT09IG1vdXNldXAudGFyZ2V0IHx8IHZub2RlLmNvbnRleHQucG9wcGVyRWxtICYmICh2bm9kZS5jb250ZXh0LnBvcHBlckVsbS5jb250YWlucyhtb3VzZXVwLnRhcmdldCkgfHwgdm5vZGUuY29udGV4dC5wb3BwZXJFbG0uY29udGFpbnMobW91c2Vkb3duLnRhcmdldCkpKSByZXR1cm47XG5cbiAgICBpZiAoYmluZGluZy5leHByZXNzaW9uICYmIGVsW2N0eF0ubWV0aG9kTmFtZSAmJiB2bm9kZS5jb250ZXh0W2VsW2N0eF0ubWV0aG9kTmFtZV0pIHtcbiAgICAgIHZub2RlLmNvbnRleHRbZWxbY3R4XS5tZXRob2ROYW1lXSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbFtjdHhdLmJpbmRpbmdGbiAmJiBlbFtjdHhdLmJpbmRpbmdGbigpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiB2LWNsaWNrb3V0c2lkZVxuICogQGRlc2Mg54K55Ye75YWD57Sg5aSW6Z2i5omN5Lya6Kem5Y+R55qE5LqL5Lu2XG4gKiBAZXhhbXBsZVxuICogYGBgdnVlXG4gKiA8ZGl2IHYtZWxlbWVudC1jbGlja291dHNpZGU9XCJoYW5kbGVDbG9zZVwiPlxuICogYGBgXG4gKi9cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgYmluZDogZnVuY3Rpb24gYmluZChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBub2RlTGlzdC5wdXNoKGVsKTtcbiAgICB2YXIgaWQgPSBzZWVkKys7XG4gICAgZWxbY3R4XSA9IHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGRvY3VtZW50SGFuZGxlcjogY3JlYXRlRG9jdW1lbnRIYW5kbGVyKGVsLCBiaW5kaW5nLCB2bm9kZSksXG4gICAgICBtZXRob2ROYW1lOiBiaW5kaW5nLmV4cHJlc3Npb24sXG4gICAgICBiaW5kaW5nRm46IGJpbmRpbmcudmFsdWVcbiAgICB9O1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBlbFtjdHhdLmRvY3VtZW50SGFuZGxlciA9IGNyZWF0ZURvY3VtZW50SGFuZGxlcihlbCwgYmluZGluZywgdm5vZGUpO1xuICAgIGVsW2N0eF0ubWV0aG9kTmFtZSA9IGJpbmRpbmcuZXhwcmVzc2lvbjtcbiAgICBlbFtjdHhdLmJpbmRpbmdGbiA9IGJpbmRpbmcudmFsdWU7XG4gIH0sXG4gIHVuYmluZDogZnVuY3Rpb24gdW5iaW5kKGVsKSB7XG4gICAgdmFyIGxlbiA9IG5vZGVMaXN0Lmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChub2RlTGlzdFtpXVtjdHhdLmlkID09PSBlbFtjdHhdLmlkKSB7XG4gICAgICAgIG5vZGVMaXN0LnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZSBlbFtjdHhdO1xuICB9XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///417f\n")},"41f8":function(module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\nexports.isVNode = isVNode;\n\nvar _util = __webpack_require__("8122");\n\nfunction isVNode(node) {\n return node !== null && (typeof node === \'undefined\' ? \'undefined\' : _typeof(node)) === \'object\' && (0, _util.hasOwn)(node, \'componentOptions\');\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvdmRvbS5qcz80MWY4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLG9HQUFvRyxtQkFBbUIsRUFBRSxtQkFBbUIsOEhBQThIOztBQUUxUTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsTUFBMkI7O0FBRS9DO0FBQ0E7QUFDQSIsImZpbGUiOiI0MWY4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmV4cG9ydHMuaXNWTm9kZSA9IGlzVk5vZGU7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoJ2VsZW1lbnQtdWkvbGliL3V0aWxzL3V0aWwnKTtcblxuZnVuY3Rpb24gaXNWTm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlICE9PSBudWxsICYmICh0eXBlb2Ygbm9kZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yobm9kZSkpID09PSAnb2JqZWN0JyAmJiAoMCwgX3V0aWwuaGFzT3duKShub2RlLCAnY29tcG9uZW50T3B0aW9ucycpO1xufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///41f8\n')},4726:function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 61);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 15:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"14e9\");\n\n/***/ }),\n\n/***/ 18:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"dcdc\");\n\n/***/ }),\n\n/***/ 21:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"d397\");\n\n/***/ }),\n\n/***/ 26:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"92fa\");\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"8122\");\n\n/***/ }),\n\n/***/ 31:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"2a5e\");\n\n/***/ }),\n\n/***/ 41:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"e452\");\n\n/***/ }),\n\n/***/ 52:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"f494\");\n\n/***/ }),\n\n/***/ 6:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"6b7c\");\n\n/***/ }),\n\n/***/ 61:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-panel.vue?vue&type=template&id=34932346&\nvar cascader_panelvue_type_template_id_34932346_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 class: [\"el-cascader-panel\", _vm.border && \"is-bordered\"],\n on: { keydown: _vm.handleKeyDown }\n },\n _vm._l(_vm.menus, function(menu, index) {\n return _c(\"cascader-menu\", {\n key: index,\n ref: \"menu\",\n refInFor: true,\n attrs: { index: index, nodes: menu }\n })\n }),\n 1\n )\n}\nvar staticRenderFns = []\ncascader_panelvue_type_template_id_34932346_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue?vue&type=template&id=34932346&\n\n// EXTERNAL MODULE: external \"babel-helper-vue-jsx-merge-props\"\nvar external_babel_helper_vue_jsx_merge_props_ = __webpack_require__(26);\nvar external_babel_helper_vue_jsx_merge_props_default = /*#__PURE__*/__webpack_require__.n(external_babel_helper_vue_jsx_merge_props_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/scrollbar\"\nvar scrollbar_ = __webpack_require__(15);\nvar scrollbar_default = /*#__PURE__*/__webpack_require__.n(scrollbar_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/checkbox\"\nvar checkbox_ = __webpack_require__(18);\nvar checkbox_default = /*#__PURE__*/__webpack_require__.n(checkbox_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/radio\"\nvar radio_ = __webpack_require__(52);\nvar radio_default = /*#__PURE__*/__webpack_require__.n(radio_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/util\"\nvar util_ = __webpack_require__(3);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-node.vue?vue&type=script&lang=js&\n\n\n\n\n\n\nvar stopPropagation = function stopPropagation(e) {\n return e.stopPropagation();\n};\n\n/* harmony default export */ var cascader_nodevue_type_script_lang_js_ = ({\n inject: ['panel'],\n\n components: {\n ElCheckbox: checkbox_default.a,\n ElRadio: radio_default.a\n },\n\n props: {\n node: {\n required: true\n },\n nodeId: String\n },\n\n computed: {\n config: function config() {\n return this.panel.config;\n },\n isLeaf: function isLeaf() {\n return this.node.isLeaf;\n },\n isDisabled: function isDisabled() {\n return this.node.isDisabled;\n },\n checkedValue: function checkedValue() {\n return this.panel.checkedValue;\n },\n isChecked: function isChecked() {\n return this.node.isSameNode(this.checkedValue);\n },\n inActivePath: function inActivePath() {\n return this.isInPath(this.panel.activePath);\n },\n inCheckedPath: function inCheckedPath() {\n var _this = this;\n\n if (!this.config.checkStrictly) return false;\n\n return this.panel.checkedNodePaths.some(function (checkedPath) {\n return _this.isInPath(checkedPath);\n });\n },\n value: function value() {\n return this.node.getValueByOption();\n }\n },\n\n methods: {\n handleExpand: function handleExpand() {\n var _this2 = this;\n\n var panel = this.panel,\n node = this.node,\n isDisabled = this.isDisabled,\n config = this.config;\n var multiple = config.multiple,\n checkStrictly = config.checkStrictly;\n\n\n if (!checkStrictly && isDisabled || node.loading) return;\n\n if (config.lazy && !node.loaded) {\n panel.lazyLoad(node, function () {\n // do not use cached leaf value here, invoke this.isLeaf to get new value.\n var isLeaf = _this2.isLeaf;\n\n\n if (!isLeaf) _this2.handleExpand();\n if (multiple) {\n // if leaf sync checked state, else clear checked state\n var checked = isLeaf ? node.checked : false;\n _this2.handleMultiCheckChange(checked);\n }\n });\n } else {\n panel.handleExpand(node);\n }\n },\n handleCheckChange: function handleCheckChange() {\n var panel = this.panel,\n value = this.value,\n node = this.node;\n\n panel.handleCheckChange(value);\n panel.handleExpand(node);\n },\n handleMultiCheckChange: function handleMultiCheckChange(checked) {\n this.node.doCheck(checked);\n this.panel.calculateMultiCheckedValue();\n },\n isInPath: function isInPath(pathNodes) {\n var node = this.node;\n\n var selectedPathNode = pathNodes[node.level - 1] || {};\n return selectedPathNode.uid === node.uid;\n },\n renderPrefix: function renderPrefix(h) {\n var isLeaf = this.isLeaf,\n isChecked = this.isChecked,\n config = this.config;\n var checkStrictly = config.checkStrictly,\n multiple = config.multiple;\n\n\n if (multiple) {\n return this.renderCheckbox(h);\n } else if (checkStrictly) {\n return this.renderRadio(h);\n } else if (isLeaf && isChecked) {\n return this.renderCheckIcon(h);\n }\n\n return null;\n },\n renderPostfix: function renderPostfix(h) {\n var node = this.node,\n isLeaf = this.isLeaf;\n\n\n if (node.loading) {\n return this.renderLoadingIcon(h);\n } else if (!isLeaf) {\n return this.renderExpandIcon(h);\n }\n\n return null;\n },\n renderCheckbox: function renderCheckbox(h) {\n var node = this.node,\n config = this.config,\n isDisabled = this.isDisabled;\n\n var events = {\n on: { change: this.handleMultiCheckChange },\n nativeOn: {}\n };\n\n if (config.checkStrictly) {\n // when every node is selectable, click event should not trigger expand event.\n events.nativeOn.click = stopPropagation;\n }\n\n return h('el-checkbox', external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n value: node.checked,\n indeterminate: node.indeterminate,\n disabled: isDisabled\n }\n }, events]));\n },\n renderRadio: function renderRadio(h) {\n var checkedValue = this.checkedValue,\n value = this.value,\n isDisabled = this.isDisabled;\n\n // to keep same reference if value cause radio's checked state is calculated by reference comparision;\n\n if (Object(util_[\"isEqual\"])(value, checkedValue)) {\n value = checkedValue;\n }\n\n return h(\n 'el-radio',\n {\n attrs: {\n value: checkedValue,\n label: value,\n disabled: isDisabled\n },\n on: {\n 'change': this.handleCheckChange\n },\n nativeOn: {\n 'click': stopPropagation\n }\n },\n [h('span')]\n );\n },\n renderCheckIcon: function renderCheckIcon(h) {\n return h('i', { 'class': 'el-icon-check el-cascader-node__prefix' });\n },\n renderLoadingIcon: function renderLoadingIcon(h) {\n return h('i', { 'class': 'el-icon-loading el-cascader-node__postfix' });\n },\n renderExpandIcon: function renderExpandIcon(h) {\n return h('i', { 'class': 'el-icon-arrow-right el-cascader-node__postfix' });\n },\n renderContent: function renderContent(h) {\n var panel = this.panel,\n node = this.node;\n\n var render = panel.renderLabelFn;\n var vnode = render ? render({ node: node, data: node.data }) : null;\n\n return h(\n 'span',\n { 'class': 'el-cascader-node__label' },\n [vnode || node.label]\n );\n }\n },\n\n render: function render(h) {\n var _this3 = this;\n\n var inActivePath = this.inActivePath,\n inCheckedPath = this.inCheckedPath,\n isChecked = this.isChecked,\n isLeaf = this.isLeaf,\n isDisabled = this.isDisabled,\n config = this.config,\n nodeId = this.nodeId;\n var expandTrigger = config.expandTrigger,\n checkStrictly = config.checkStrictly,\n multiple = config.multiple;\n\n var disabled = !checkStrictly && isDisabled;\n var events = { on: {} };\n\n if (expandTrigger === 'click') {\n events.on.click = this.handleExpand;\n } else {\n events.on.mouseenter = function (e) {\n _this3.handleExpand();\n _this3.$emit('expand', e);\n };\n events.on.focus = function (e) {\n _this3.handleExpand();\n _this3.$emit('expand', e);\n };\n }\n if (isLeaf && !isDisabled && !checkStrictly && !multiple) {\n events.on.click = this.handleCheckChange;\n }\n\n return h(\n 'li',\n external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n role: 'menuitem',\n id: nodeId,\n 'aria-expanded': inActivePath,\n tabindex: disabled ? null : -1\n },\n 'class': {\n 'el-cascader-node': true,\n 'is-selectable': checkStrictly,\n 'in-active-path': inActivePath,\n 'in-checked-path': inCheckedPath,\n 'is-active': isChecked,\n 'is-disabled': disabled\n }\n }, events]),\n [this.renderPrefix(h), this.renderContent(h), this.renderPostfix(h)]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-node.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_nodevue_type_script_lang_js_ = (cascader_nodevue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-node.vue\nvar cascader_node_render, cascader_node_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n src_cascader_nodevue_type_script_lang_js_,\n cascader_node_render,\n cascader_node_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"packages/cascader-panel/src/cascader-node.vue\"\n/* harmony default export */ var cascader_node = (component.exports);\n// EXTERNAL MODULE: external \"element-ui/lib/mixins/locale\"\nvar locale_ = __webpack_require__(6);\nvar locale_default = /*#__PURE__*/__webpack_require__.n(locale_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-menu.vue?vue&type=script&lang=js&\n\n\n\n\n\n\n\n/* harmony default export */ var cascader_menuvue_type_script_lang_js_ = ({\n name: 'ElCascaderMenu',\n\n mixins: [locale_default.a],\n\n inject: ['panel'],\n\n components: {\n ElScrollbar: scrollbar_default.a,\n CascaderNode: cascader_node\n },\n\n props: {\n nodes: {\n type: Array,\n required: true\n },\n index: Number\n },\n\n data: function data() {\n return {\n activeNode: null,\n hoverTimer: null,\n id: Object(util_[\"generateId\"])()\n };\n },\n\n\n computed: {\n isEmpty: function isEmpty() {\n return !this.nodes.length;\n },\n menuId: function menuId() {\n return 'cascader-menu-' + this.id + '-' + this.index;\n }\n },\n\n methods: {\n handleExpand: function handleExpand(e) {\n this.activeNode = e.target;\n },\n handleMouseMove: function handleMouseMove(e) {\n var activeNode = this.activeNode,\n hoverTimer = this.hoverTimer;\n var hoverZone = this.$refs.hoverZone;\n\n\n if (!activeNode || !hoverZone) return;\n\n if (activeNode.contains(e.target)) {\n clearTimeout(hoverTimer);\n\n var _$el$getBoundingClien = this.$el.getBoundingClientRect(),\n left = _$el$getBoundingClien.left;\n\n var startX = e.clientX - left;\n var _$el = this.$el,\n offsetWidth = _$el.offsetWidth,\n offsetHeight = _$el.offsetHeight;\n\n var top = activeNode.offsetTop;\n var bottom = top + activeNode.offsetHeight;\n\n hoverZone.innerHTML = '\\n <path style=\"pointer-events: auto;\" fill=\"transparent\" d=\"M' + startX + ' ' + top + ' L' + offsetWidth + ' 0 V' + top + ' Z\" />\\n <path style=\"pointer-events: auto;\" fill=\"transparent\" d=\"M' + startX + ' ' + bottom + ' L' + offsetWidth + ' ' + offsetHeight + ' V' + bottom + ' Z\" />\\n ';\n } else if (!hoverTimer) {\n this.hoverTimer = setTimeout(this.clearHoverZone, this.panel.config.hoverThreshold);\n }\n },\n clearHoverZone: function clearHoverZone() {\n var hoverZone = this.$refs.hoverZone;\n\n if (!hoverZone) return;\n hoverZone.innerHTML = '';\n },\n renderEmptyText: function renderEmptyText(h) {\n return h(\n 'div',\n { 'class': 'el-cascader-menu__empty-text' },\n [this.t('el.cascader.noData')]\n );\n },\n renderNodeList: function renderNodeList(h) {\n var menuId = this.menuId;\n var isHoverMenu = this.panel.isHoverMenu;\n\n var events = { on: {} };\n\n if (isHoverMenu) {\n events.on.expand = this.handleExpand;\n }\n\n var nodes = this.nodes.map(function (node, index) {\n var hasChildren = node.hasChildren;\n\n return h('cascader-node', external_babel_helper_vue_jsx_merge_props_default()([{\n key: node.uid,\n attrs: { node: node,\n 'node-id': menuId + '-' + index,\n 'aria-haspopup': hasChildren,\n 'aria-owns': hasChildren ? menuId : null\n }\n }, events]));\n });\n\n return [].concat(nodes, [isHoverMenu ? h('svg', { ref: 'hoverZone', 'class': 'el-cascader-menu__hover-zone' }) : null]);\n }\n },\n\n render: function render(h) {\n var isEmpty = this.isEmpty,\n menuId = this.menuId;\n\n var events = { nativeOn: {} };\n\n // optimize hover to expand experience (#8010)\n if (this.panel.isHoverMenu) {\n events.nativeOn.mousemove = this.handleMouseMove;\n // events.nativeOn.mouseleave = this.clearHoverZone;\n }\n\n return h(\n 'el-scrollbar',\n external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n tag: 'ul',\n role: 'menu',\n id: menuId,\n\n 'wrap-class': 'el-cascader-menu__wrap',\n 'view-class': {\n 'el-cascader-menu__list': true,\n 'is-empty': isEmpty\n }\n },\n 'class': 'el-cascader-menu' }, events]),\n [isEmpty ? this.renderEmptyText(h) : this.renderNodeList(h)]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-menu.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_menuvue_type_script_lang_js_ = (cascader_menuvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-menu.vue\nvar cascader_menu_render, cascader_menu_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar cascader_menu_component = Object(componentNormalizer[\"a\" /* default */])(\n src_cascader_menuvue_type_script_lang_js_,\n cascader_menu_render,\n cascader_menu_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var cascader_menu_api; }\ncascader_menu_component.options.__file = \"packages/cascader-panel/src/cascader-menu.vue\"\n/* harmony default export */ var cascader_menu = (cascader_menu_component.exports);\n// EXTERNAL MODULE: external \"element-ui/lib/utils/shared\"\nvar shared_ = __webpack_require__(21);\n\n// CONCATENATED MODULE: ./packages/cascader-panel/src/node.js\nvar _createClass = function () { function 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\nvar uid = 0;\n\nvar node_Node = function () {\n function Node(data, config, parentNode) {\n _classCallCheck(this, Node);\n\n this.data = data;\n this.config = config;\n this.parent = parentNode || null;\n this.level = !this.parent ? 1 : this.parent.level + 1;\n this.uid = uid++;\n\n this.initState();\n this.initChildren();\n }\n\n Node.prototype.initState = function initState() {\n var _config = this.config,\n valueKey = _config.value,\n labelKey = _config.label;\n\n\n this.value = this.data[valueKey];\n this.label = this.data[labelKey];\n this.pathNodes = this.calculatePathNodes();\n this.path = this.pathNodes.map(function (node) {\n return node.value;\n });\n this.pathLabels = this.pathNodes.map(function (node) {\n return node.label;\n });\n\n // lazy load\n this.loading = false;\n this.loaded = false;\n };\n\n Node.prototype.initChildren = function initChildren() {\n var _this = this;\n\n var config = this.config;\n\n var childrenKey = config.children;\n var childrenData = this.data[childrenKey];\n this.hasChildren = Array.isArray(childrenData);\n this.children = (childrenData || []).map(function (child) {\n return new Node(child, config, _this);\n });\n };\n\n Node.prototype.calculatePathNodes = function calculatePathNodes() {\n var nodes = [this];\n var parent = this.parent;\n\n while (parent) {\n nodes.unshift(parent);\n parent = parent.parent;\n }\n\n return nodes;\n };\n\n Node.prototype.getPath = function getPath() {\n return this.path;\n };\n\n Node.prototype.getValue = function getValue() {\n return this.value;\n };\n\n Node.prototype.getValueByOption = function getValueByOption() {\n return this.config.emitPath ? this.getPath() : this.getValue();\n };\n\n Node.prototype.getText = function getText(allLevels, separator) {\n return allLevels ? this.pathLabels.join(separator) : this.label;\n };\n\n Node.prototype.isSameNode = function isSameNode(checkedValue) {\n var value = this.getValueByOption();\n return this.config.multiple && Array.isArray(checkedValue) ? checkedValue.some(function (val) {\n return Object(util_[\"isEqual\"])(val, value);\n }) : Object(util_[\"isEqual\"])(checkedValue, value);\n };\n\n Node.prototype.broadcast = function broadcast(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 var handlerName = 'onParent' + Object(util_[\"capitalize\"])(event);\n\n this.children.forEach(function (child) {\n if (child) {\n // bottom up\n child.broadcast.apply(child, [event].concat(args));\n child[handlerName] && child[handlerName].apply(child, args);\n }\n });\n };\n\n Node.prototype.emit = function emit(event) {\n var parent = this.parent;\n\n var handlerName = 'onChild' + Object(util_[\"capitalize\"])(event);\n if (parent) {\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 parent[handlerName] && parent[handlerName].apply(parent, args);\n parent.emit.apply(parent, [event].concat(args));\n }\n };\n\n Node.prototype.onParentCheck = function onParentCheck(checked) {\n if (!this.isDisabled) {\n this.setCheckState(checked);\n }\n };\n\n Node.prototype.onChildCheck = function onChildCheck() {\n var children = this.children;\n\n var validChildren = children.filter(function (child) {\n return !child.isDisabled;\n });\n var checked = validChildren.length ? validChildren.every(function (child) {\n return child.checked;\n }) : false;\n\n this.setCheckState(checked);\n };\n\n Node.prototype.setCheckState = function setCheckState(checked) {\n var totalNum = this.children.length;\n var checkedNum = this.children.reduce(function (c, p) {\n var num = p.checked ? 1 : p.indeterminate ? 0.5 : 0;\n return c + num;\n }, 0);\n\n this.checked = checked;\n this.indeterminate = checkedNum !== totalNum && checkedNum > 0;\n };\n\n Node.prototype.syncCheckState = function syncCheckState(checkedValue) {\n var value = this.getValueByOption();\n var checked = this.isSameNode(checkedValue, value);\n\n this.doCheck(checked);\n };\n\n Node.prototype.doCheck = function doCheck(checked) {\n if (this.checked !== checked) {\n if (this.config.checkStrictly) {\n this.checked = checked;\n } else {\n // bottom up to unify the calculation of the indeterminate state\n this.broadcast('check', checked);\n this.setCheckState(checked);\n this.emit('check');\n }\n }\n };\n\n _createClass(Node, [{\n key: 'isDisabled',\n get: function get() {\n var data = this.data,\n parent = this.parent,\n config = this.config;\n\n var disabledKey = config.disabled;\n var checkStrictly = config.checkStrictly;\n\n return data[disabledKey] || !checkStrictly && parent && parent.isDisabled;\n }\n }, {\n key: 'isLeaf',\n get: function get() {\n var data = this.data,\n loaded = this.loaded,\n hasChildren = this.hasChildren,\n children = this.children;\n var _config2 = this.config,\n lazy = _config2.lazy,\n leafKey = _config2.leaf;\n\n if (lazy) {\n var isLeaf = Object(shared_[\"isDef\"])(data[leafKey]) ? data[leafKey] : loaded ? !children.length : false;\n this.hasChildren = !isLeaf;\n return isLeaf;\n }\n return !hasChildren;\n }\n }]);\n\n return Node;\n}();\n\n/* harmony default export */ var src_node = (node_Node);\n// CONCATENATED MODULE: ./packages/cascader-panel/src/store.js\nfunction store_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\nvar flatNodes = function flatNodes(data, leafOnly) {\n return data.reduce(function (res, node) {\n if (node.isLeaf) {\n res.push(node);\n } else {\n !leafOnly && res.push(node);\n res = res.concat(flatNodes(node.children, leafOnly));\n }\n return res;\n }, []);\n};\n\nvar store_Store = function () {\n function Store(data, config) {\n store_classCallCheck(this, Store);\n\n this.config = config;\n this.initNodes(data);\n }\n\n Store.prototype.initNodes = function initNodes(data) {\n var _this = this;\n\n data = Object(util_[\"coerceTruthyValueToArray\"])(data);\n this.nodes = data.map(function (nodeData) {\n return new src_node(nodeData, _this.config);\n });\n this.flattedNodes = this.getFlattedNodes(false, false);\n this.leafNodes = this.getFlattedNodes(true, false);\n };\n\n Store.prototype.appendNode = function appendNode(nodeData, parentNode) {\n var node = new src_node(nodeData, this.config, parentNode);\n var children = parentNode ? parentNode.children : this.nodes;\n\n children.push(node);\n };\n\n Store.prototype.appendNodes = function appendNodes(nodeDataList, parentNode) {\n var _this2 = this;\n\n nodeDataList = Object(util_[\"coerceTruthyValueToArray\"])(nodeDataList);\n nodeDataList.forEach(function (nodeData) {\n return _this2.appendNode(nodeData, parentNode);\n });\n };\n\n Store.prototype.getNodes = function getNodes() {\n return this.nodes;\n };\n\n Store.prototype.getFlattedNodes = function getFlattedNodes(leafOnly) {\n var cached = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var cachedNodes = leafOnly ? this.leafNodes : this.flattedNodes;\n return cached ? cachedNodes : flatNodes(this.nodes, leafOnly);\n };\n\n Store.prototype.getNodeByValue = function getNodeByValue(value) {\n var nodes = this.getFlattedNodes(false, !this.config.lazy).filter(function (node) {\n return Object(util_[\"valueEquals\"])(node.path, value) || node.value === value;\n });\n return nodes && nodes.length ? nodes[0] : null;\n };\n\n return Store;\n}();\n\n/* harmony default export */ var src_store = (store_Store);\n// EXTERNAL MODULE: external \"element-ui/lib/utils/merge\"\nvar merge_ = __webpack_require__(9);\nvar merge_default = /*#__PURE__*/__webpack_require__.n(merge_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/aria-utils\"\nvar aria_utils_ = __webpack_require__(41);\nvar aria_utils_default = /*#__PURE__*/__webpack_require__.n(aria_utils_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/scroll-into-view\"\nvar scroll_into_view_ = __webpack_require__(31);\nvar scroll_into_view_default = /*#__PURE__*/__webpack_require__.n(scroll_into_view_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-panel.vue?vue&type=script&lang=js&\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\nvar KeyCode = aria_utils_default.a.keys;\n\nvar DefaultProps = {\n expandTrigger: 'click', // or hover\n multiple: false,\n checkStrictly: false, // whether all nodes can be selected\n emitPath: true, // wether to emit an array of all levels value in which node is located\n lazy: false,\n lazyLoad: util_[\"noop\"],\n value: 'value',\n label: 'label',\n children: 'children',\n leaf: 'leaf',\n disabled: 'disabled',\n hoverThreshold: 500\n};\n\nvar cascader_panelvue_type_script_lang_js_isLeaf = function isLeaf(el) {\n return !el.getAttribute('aria-owns');\n};\n\nvar getSibling = function getSibling(el, distance) {\n var parentNode = el.parentNode;\n\n if (parentNode) {\n var siblings = parentNode.querySelectorAll('.el-cascader-node[tabindex=\"-1\"]');\n var index = Array.prototype.indexOf.call(siblings, el);\n return siblings[index + distance] || null;\n }\n return null;\n};\n\nvar getMenuIndex = function getMenuIndex(el, distance) {\n if (!el) return;\n var pieces = el.id.split('-');\n return Number(pieces[pieces.length - 2]);\n};\n\nvar focusNode = function focusNode(el) {\n if (!el) return;\n el.focus();\n !cascader_panelvue_type_script_lang_js_isLeaf(el) && el.click();\n};\n\nvar checkNode = function checkNode(el) {\n if (!el) return;\n\n var input = el.querySelector('input');\n if (input) {\n input.click();\n } else if (cascader_panelvue_type_script_lang_js_isLeaf(el)) {\n el.click();\n }\n};\n\n/* harmony default export */ var cascader_panelvue_type_script_lang_js_ = ({\n name: 'ElCascaderPanel',\n\n components: {\n CascaderMenu: cascader_menu\n },\n\n props: {\n value: {},\n options: Array,\n props: Object,\n border: {\n type: Boolean,\n default: true\n },\n renderLabel: Function\n },\n\n provide: function provide() {\n return {\n panel: this\n };\n },\n data: function data() {\n return {\n checkedValue: null,\n checkedNodePaths: [],\n store: [],\n menus: [],\n activePath: [],\n loadCount: 0\n };\n },\n\n\n computed: {\n config: function config() {\n return merge_default()(_extends({}, DefaultProps), this.props || {});\n },\n multiple: function multiple() {\n return this.config.multiple;\n },\n checkStrictly: function checkStrictly() {\n return this.config.checkStrictly;\n },\n leafOnly: function leafOnly() {\n return !this.checkStrictly;\n },\n isHoverMenu: function isHoverMenu() {\n return this.config.expandTrigger === 'hover';\n },\n renderLabelFn: function renderLabelFn() {\n return this.renderLabel || this.$scopedSlots.default;\n }\n },\n\n watch: {\n value: function value() {\n this.syncCheckedValue();\n this.checkStrictly && this.calculateCheckedNodePaths();\n },\n\n options: {\n handler: function handler() {\n this.initStore();\n },\n immediate: true,\n deep: true\n },\n checkedValue: function checkedValue(val) {\n if (!Object(util_[\"isEqual\"])(val, this.value)) {\n this.checkStrictly && this.calculateCheckedNodePaths();\n this.$emit('input', val);\n this.$emit('change', val);\n }\n }\n },\n\n mounted: function mounted() {\n if (!this.isEmptyValue(this.value)) {\n this.syncCheckedValue();\n }\n },\n\n\n methods: {\n initStore: function initStore() {\n var config = this.config,\n options = this.options;\n\n if (config.lazy && Object(util_[\"isEmpty\"])(options)) {\n this.lazyLoad();\n } else {\n this.store = new src_store(options, config);\n this.menus = [this.store.getNodes()];\n this.syncMenuState();\n }\n },\n syncCheckedValue: function syncCheckedValue() {\n var value = this.value,\n checkedValue = this.checkedValue;\n\n if (!Object(util_[\"isEqual\"])(value, checkedValue)) {\n this.activePath = [];\n this.checkedValue = value;\n this.syncMenuState();\n }\n },\n syncMenuState: function syncMenuState() {\n var multiple = this.multiple,\n checkStrictly = this.checkStrictly;\n\n this.syncActivePath();\n multiple && this.syncMultiCheckState();\n checkStrictly && this.calculateCheckedNodePaths();\n this.$nextTick(this.scrollIntoView);\n },\n syncMultiCheckState: function syncMultiCheckState() {\n var _this = this;\n\n var nodes = this.getFlattedNodes(this.leafOnly);\n\n nodes.forEach(function (node) {\n node.syncCheckState(_this.checkedValue);\n });\n },\n isEmptyValue: function isEmptyValue(val) {\n var multiple = this.multiple,\n config = this.config;\n var emitPath = config.emitPath;\n\n if (multiple || emitPath) {\n return Object(util_[\"isEmpty\"])(val);\n }\n return false;\n },\n syncActivePath: function syncActivePath() {\n var _this2 = this;\n\n var store = this.store,\n multiple = this.multiple,\n activePath = this.activePath,\n checkedValue = this.checkedValue;\n\n\n if (!Object(util_[\"isEmpty\"])(activePath)) {\n var nodes = activePath.map(function (node) {\n return _this2.getNodeByValue(node.getValue());\n });\n this.expandNodes(nodes);\n } else if (!this.isEmptyValue(checkedValue)) {\n var value = multiple ? checkedValue[0] : checkedValue;\n var checkedNode = this.getNodeByValue(value) || {};\n var _nodes = (checkedNode.pathNodes || []).slice(0, -1);\n this.expandNodes(_nodes);\n } else {\n this.activePath = [];\n this.menus = [store.getNodes()];\n }\n },\n expandNodes: function expandNodes(nodes) {\n var _this3 = this;\n\n nodes.forEach(function (node) {\n return _this3.handleExpand(node, true /* silent */);\n });\n },\n calculateCheckedNodePaths: function calculateCheckedNodePaths() {\n var _this4 = this;\n\n var checkedValue = this.checkedValue,\n multiple = this.multiple;\n\n var checkedValues = multiple ? Object(util_[\"coerceTruthyValueToArray\"])(checkedValue) : [checkedValue];\n this.checkedNodePaths = checkedValues.map(function (v) {\n var checkedNode = _this4.getNodeByValue(v);\n return checkedNode ? checkedNode.pathNodes : [];\n });\n },\n handleKeyDown: function handleKeyDown(e) {\n var target = e.target,\n keyCode = e.keyCode;\n\n\n switch (keyCode) {\n case KeyCode.up:\n var prev = getSibling(target, -1);\n focusNode(prev);\n break;\n case KeyCode.down:\n var next = getSibling(target, 1);\n focusNode(next);\n break;\n case KeyCode.left:\n var preMenu = this.$refs.menu[getMenuIndex(target) - 1];\n if (preMenu) {\n var expandedNode = preMenu.$el.querySelector('.el-cascader-node[aria-expanded=\"true\"]');\n focusNode(expandedNode);\n }\n break;\n case KeyCode.right:\n var nextMenu = this.$refs.menu[getMenuIndex(target) + 1];\n if (nextMenu) {\n var firstNode = nextMenu.$el.querySelector('.el-cascader-node[tabindex=\"-1\"]');\n focusNode(firstNode);\n }\n break;\n case KeyCode.enter:\n checkNode(target);\n break;\n case KeyCode.esc:\n case KeyCode.tab:\n this.$emit('close');\n break;\n default:\n return;\n }\n },\n handleExpand: function handleExpand(node, silent) {\n var activePath = this.activePath;\n var level = node.level;\n\n var path = activePath.slice(0, level - 1);\n var menus = this.menus.slice(0, level);\n\n if (!node.isLeaf) {\n path.push(node);\n menus.push(node.children);\n }\n\n this.activePath = path;\n this.menus = menus;\n\n if (!silent) {\n var pathValues = path.map(function (node) {\n return node.getValue();\n });\n var activePathValues = activePath.map(function (node) {\n return node.getValue();\n });\n if (!Object(util_[\"valueEquals\"])(pathValues, activePathValues)) {\n this.$emit('active-item-change', pathValues); // Deprecated\n this.$emit('expand-change', pathValues);\n }\n }\n },\n handleCheckChange: function handleCheckChange(value) {\n this.checkedValue = value;\n },\n lazyLoad: function lazyLoad(node, onFullfiled) {\n var _this5 = this;\n\n var config = this.config;\n\n if (!node) {\n node = node || { root: true, level: 0 };\n this.store = new src_store([], config);\n this.menus = [this.store.getNodes()];\n }\n node.loading = true;\n var resolve = function resolve(dataList) {\n var parent = node.root ? null : node;\n dataList && dataList.length && _this5.store.appendNodes(dataList, parent);\n node.loading = false;\n node.loaded = true;\n\n // dispose default value on lazy load mode\n if (Array.isArray(_this5.checkedValue)) {\n var nodeValue = _this5.checkedValue[_this5.loadCount++];\n var valueKey = _this5.config.value;\n var leafKey = _this5.config.leaf;\n\n if (Array.isArray(dataList) && dataList.filter(function (item) {\n return item[valueKey] === nodeValue;\n }).length > 0) {\n var checkedNode = _this5.store.getNodeByValue(nodeValue);\n\n if (!checkedNode.data[leafKey]) {\n _this5.lazyLoad(checkedNode, function () {\n _this5.handleExpand(checkedNode);\n });\n }\n\n if (_this5.loadCount === _this5.checkedValue.length) {\n _this5.$parent.computePresentText();\n }\n }\n }\n\n onFullfiled && onFullfiled(dataList);\n };\n config.lazyLoad(node, resolve);\n },\n\n\n /**\n * public methods\n */\n calculateMultiCheckedValue: function calculateMultiCheckedValue() {\n this.checkedValue = this.getCheckedNodes(this.leafOnly).map(function (node) {\n return node.getValueByOption();\n });\n },\n scrollIntoView: function scrollIntoView() {\n if (this.$isServer) return;\n\n var menus = this.$refs.menu || [];\n menus.forEach(function (menu) {\n var menuElement = menu.$el;\n if (menuElement) {\n var container = menuElement.querySelector('.el-scrollbar__wrap');\n var activeNode = menuElement.querySelector('.el-cascader-node.is-active') || menuElement.querySelector('.el-cascader-node.in-active-path');\n scroll_into_view_default()(container, activeNode);\n }\n });\n },\n getNodeByValue: function getNodeByValue(val) {\n return this.store.getNodeByValue(val);\n },\n getFlattedNodes: function getFlattedNodes(leafOnly) {\n var cached = !this.config.lazy;\n return this.store.getFlattedNodes(leafOnly, cached);\n },\n getCheckedNodes: function getCheckedNodes(leafOnly) {\n var checkedValue = this.checkedValue,\n multiple = this.multiple;\n\n if (multiple) {\n var nodes = this.getFlattedNodes(leafOnly);\n return nodes.filter(function (node) {\n return node.checked;\n });\n } else {\n return this.isEmptyValue(checkedValue) ? [] : [this.getNodeByValue(checkedValue)];\n }\n },\n clearCheckedNodes: function clearCheckedNodes() {\n var config = this.config,\n leafOnly = this.leafOnly;\n var multiple = config.multiple,\n emitPath = config.emitPath;\n\n if (multiple) {\n this.getCheckedNodes(leafOnly).filter(function (node) {\n return !node.isDisabled;\n }).forEach(function (node) {\n return node.doCheck(false);\n });\n this.calculateMultiCheckedValue();\n } else {\n this.checkedValue = emitPath ? [] : null;\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_panelvue_type_script_lang_js_ = (cascader_panelvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue\n\n\n\n\n\n/* normalize component */\n\nvar cascader_panel_component = Object(componentNormalizer[\"a\" /* default */])(\n src_cascader_panelvue_type_script_lang_js_,\n cascader_panelvue_type_template_id_34932346_render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var cascader_panel_api; }\ncascader_panel_component.options.__file = \"packages/cascader-panel/src/cascader-panel.vue\"\n/* harmony default export */ var cascader_panel = (cascader_panel_component.exports);\n// CONCATENATED MODULE: ./packages/cascader-panel/index.js\n\n\n/* istanbul ignore next */\ncascader_panel.install = function (Vue) {\n Vue.component(cascader_panel.name, cascader_panel);\n};\n\n/* harmony default export */ var packages_cascader_panel = __webpack_exports__[\"default\"] = (cascader_panel);\n\n/***/ }),\n\n/***/ 9:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"7f4d\");\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvY2FzY2FkZXItcGFuZWwuanM/NDcyNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxnQ0FBZ0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLGtCQUFrQjtBQUNsRjtBQUNBLHlEQUF5RCxjQUFjO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGlDQUFpQztBQUNsRix3SEFBd0gsbUJBQW1CLEVBQUU7QUFDN0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDBCQUEwQixFQUFFO0FBQy9ELHlDQUF5QyxlQUFlO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsK0RBQStEO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJGQUEyRiwyQkFBMkIsRUFBRTtBQUN4SDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFbkQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQXlCOztBQUVsRCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBNkI7O0FBRXRELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUFrQzs7QUFFM0QsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQTJCOztBQUVwRCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBdUM7O0FBRWhFLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUFpQzs7QUFFMUQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQXNCOztBQUUvQyxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBOEI7O0FBRXZELE9BQU87O0FBRVA7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxzQ0FBc0M7QUFDbkQ7QUFDQTs7QUFFQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQSx3Q0FBd0MsaUNBQWlDO0FBQ3pFLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHdIO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLDJCQUEyQjtBQUN0QztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUE0Qjs7QUFFckQsT0FBTzs7QUFFUCxVQUFVIiwiZmlsZSI6IjQ3MjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2Rpc3QvXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDYxKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIG5vcm1hbGl6ZUNvbXBvbmVudDsgfSk7XG4vKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi9cblxuLy8gSU1QT1JUQU5UOiBEbyBOT1QgdXNlIEVTMjAxNSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgKGV4Y2VwdCBmb3IgbW9kdWxlcykuXG4vLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbFxuLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudCAoXG4gIHNjcmlwdEV4cG9ydHMsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmdW5jdGlvbmFsVGVtcGxhdGUsXG4gIGluamVjdFN0eWxlcyxcbiAgc2NvcGVJZCxcbiAgbW9kdWxlSWRlbnRpZmllciwgLyogc2VydmVyIG9ubHkgKi9cbiAgc2hhZG93TW9kZSAvKiB2dWUtY2xpIG9ubHkgKi9cbikge1xuICAvLyBWdWUuZXh0ZW5kIGNvbnN0cnVjdG9yIGV4cG9ydCBpbnRlcm9wXG4gIHZhciBvcHRpb25zID0gdHlwZW9mIHNjcmlwdEV4cG9ydHMgPT09ICdmdW5jdGlvbidcbiAgICA/IHNjcmlwdEV4cG9ydHMub3B0aW9uc1xuICAgIDogc2NyaXB0RXhwb3J0c1xuXG4gIC8vIHJlbmRlciBmdW5jdGlvbnNcbiAgaWYgKHJlbmRlcikge1xuICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyXG4gICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnNcbiAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWVcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGZ1bmN0aW9uYWxUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25hbCA9IHRydWVcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWRcbiAgfVxuXG4gIHZhciBob29rXG4gIGlmIChtb2R1bGVJZGVudGlmaWVyKSB7IC8vIHNlcnZlciBidWlsZFxuICAgIGhvb2sgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgLy8gMi4zIGluamVjdGlvblxuICAgICAgY29udGV4dCA9XG4gICAgICAgIGNvbnRleHQgfHwgLy8gY2FjaGVkIGNhbGxcbiAgICAgICAgKHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHQpIHx8IC8vIHN0YXRlZnVsXG4gICAgICAgICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC4kdm5vZGUgJiYgdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQpIC8vIGZ1bmN0aW9uYWxcbiAgICAgIC8vIDIuMiB3aXRoIHJ1bkluTmV3Q29udGV4dDogdHJ1ZVxuICAgICAgaWYgKCFjb250ZXh0ICYmIHR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb250ZXh0ID0gX19WVUVfU1NSX0NPTlRFWFRfX1xuICAgICAgfVxuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCBzdHlsZXNcbiAgICAgIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICAgICAgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgY29udGV4dClcbiAgICAgIH1cbiAgICAgIC8vIHJlZ2lzdGVyIGNvbXBvbmVudCBtb2R1bGUgaWRlbnRpZmllciBmb3IgYXN5bmMgY2h1bmsgaW5mZXJyZW5jZVxuICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMpIHtcbiAgICAgICAgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKG1vZHVsZUlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHVzZWQgYnkgc3NyIGluIGNhc2UgY29tcG9uZW50IGlzIGNhY2hlZCBhbmQgYmVmb3JlQ3JlYXRlXG4gICAgLy8gbmV2ZXIgZ2V0cyBjYWxsZWRcbiAgICBvcHRpb25zLl9zc3JSZWdpc3RlciA9IGhvb2tcbiAgfSBlbHNlIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICBob29rID0gc2hhZG93TW9kZVxuICAgICAgPyBmdW5jdGlvbiAoKSB7IGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIHRoaXMuJHJvb3QuJG9wdGlvbnMuc2hhZG93Um9vdCkgfVxuICAgICAgOiBpbmplY3RTdHlsZXNcbiAgfVxuXG4gIGlmIChob29rKSB7XG4gICAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgICAgLy8gZm9yIHRlbXBsYXRlLW9ubHkgaG90LXJlbG9hZCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgcmVuZGVyIGZuIGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRocm91Z2ggdGhlIG5vcm1hbGl6ZXJcbiAgICAgIG9wdGlvbnMuX2luamVjdFN0eWxlcyA9IGhvb2tcbiAgICAgIC8vIHJlZ2lzdGVyIGZvciBmdW5jdGlvYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlXG4gICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24gKGgsIGNvbnRleHQpIHtcbiAgICAgICAgaG9vay5jYWxsKGNvbnRleHQpXG4gICAgICAgIHJldHVybiBvcmlnaW5hbFJlbmRlcihoLCBjb250ZXh0KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiBhcyBiZWZvcmVDcmVhdGUgaG9va1xuICAgICAgdmFyIGV4aXN0aW5nID0gb3B0aW9ucy5iZWZvcmVDcmVhdGVcbiAgICAgIG9wdGlvbnMuYmVmb3JlQ3JlYXRlID0gZXhpc3RpbmdcbiAgICAgICAgPyBbXS5jb25jYXQoZXhpc3RpbmcsIGhvb2spXG4gICAgICAgIDogW2hvb2tdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHBvcnRzOiBzY3JpcHRFeHBvcnRzLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAxNTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvc2Nyb2xsYmFyXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTg6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL2NoZWNrYm94XCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjE6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL3NoYXJlZFwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDI2OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJiYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wc1wiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDM6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL3V0aWxcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzMTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvc2Nyb2xsLWludG8tdmlld1wiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDQxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9hcmlhLXV0aWxzXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTI6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3JhZGlvXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2xvY2FsZVwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDYxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItcGFuZWwudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTM0OTMyMzQ2JlxudmFyIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQ5MzIzNDZfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgY2xhc3M6IFtcImVsLWNhc2NhZGVyLXBhbmVsXCIsIF92bS5ib3JkZXIgJiYgXCJpcy1ib3JkZXJlZFwiXSxcbiAgICAgIG9uOiB7IGtleWRvd246IF92bS5oYW5kbGVLZXlEb3duIH1cbiAgICB9LFxuICAgIF92bS5fbChfdm0ubWVudXMsIGZ1bmN0aW9uKG1lbnUsIGluZGV4KSB7XG4gICAgICByZXR1cm4gX2MoXCJjYXNjYWRlci1tZW51XCIsIHtcbiAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgcmVmOiBcIm1lbnVcIixcbiAgICAgICAgcmVmSW5Gb3I6IHRydWUsXG4gICAgICAgIGF0dHJzOiB7IGluZGV4OiBpbmRleCwgbm9kZXM6IG1lbnUgfVxuICAgICAgfSlcbiAgICB9KSxcbiAgICAxXG4gIClcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxuY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDkzMjM0Nl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1wYW5lbC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MzQ5MzIzNDYmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJiYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wc1wiXG52YXIgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7XG52YXIgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3Njcm9sbGJhclwiXG52YXIgc2Nyb2xsYmFyXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xudmFyIHNjcm9sbGJhcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzY3JvbGxiYXJfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL2NoZWNrYm94XCJcbnZhciBjaGVja2JveF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KTtcbnZhciBjaGVja2JveF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjaGVja2JveF8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvcmFkaW9cIlxudmFyIHJhZGlvXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTIpO1xudmFyIHJhZGlvX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHJhZGlvXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCJcbnZhciB1dGlsXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1ub2RlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcblxuXG5cblxuXG5cbnZhciBzdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oZSkge1xuICByZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhc2NhZGVyX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBpbmplY3Q6IFsncGFuZWwnXSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxDaGVja2JveDogY2hlY2tib3hfZGVmYXVsdC5hLFxuICAgIEVsUmFkaW86IHJhZGlvX2RlZmF1bHQuYVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgbm9kZToge1xuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIG5vZGVJZDogU3RyaW5nXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjb25maWc6IGZ1bmN0aW9uIGNvbmZpZygpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhbmVsLmNvbmZpZztcbiAgICB9LFxuICAgIGlzTGVhZjogZnVuY3Rpb24gaXNMZWFmKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZS5pc0xlYWY7XG4gICAgfSxcbiAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbiBpc0Rpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZS5pc0Rpc2FibGVkO1xuICAgIH0sXG4gICAgY2hlY2tlZFZhbHVlOiBmdW5jdGlvbiBjaGVja2VkVmFsdWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYW5lbC5jaGVja2VkVmFsdWU7XG4gICAgfSxcbiAgICBpc0NoZWNrZWQ6IGZ1bmN0aW9uIGlzQ2hlY2tlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUuaXNTYW1lTm9kZSh0aGlzLmNoZWNrZWRWYWx1ZSk7XG4gICAgfSxcbiAgICBpbkFjdGl2ZVBhdGg6IGZ1bmN0aW9uIGluQWN0aXZlUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzSW5QYXRoKHRoaXMucGFuZWwuYWN0aXZlUGF0aCk7XG4gICAgfSxcbiAgICBpbkNoZWNrZWRQYXRoOiBmdW5jdGlvbiBpbkNoZWNrZWRQYXRoKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5jaGVja1N0cmljdGx5KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0aGlzLnBhbmVsLmNoZWNrZWROb2RlUGF0aHMuc29tZShmdW5jdGlvbiAoY2hlY2tlZFBhdGgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmlzSW5QYXRoKGNoZWNrZWRQYXRoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZS5nZXRWYWx1ZUJ5T3B0aW9uKCk7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVFeHBhbmQ6IGZ1bmN0aW9uIGhhbmRsZUV4cGFuZCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgcGFuZWwgPSB0aGlzLnBhbmVsLFxuICAgICAgICAgIG5vZGUgPSB0aGlzLm5vZGUsXG4gICAgICAgICAgaXNEaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZCxcbiAgICAgICAgICBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgIHZhciBtdWx0aXBsZSA9IGNvbmZpZy5tdWx0aXBsZSxcbiAgICAgICAgICBjaGVja1N0cmljdGx5ID0gY29uZmlnLmNoZWNrU3RyaWN0bHk7XG5cblxuICAgICAgaWYgKCFjaGVja1N0cmljdGx5ICYmIGlzRGlzYWJsZWQgfHwgbm9kZS5sb2FkaW5nKSByZXR1cm47XG5cbiAgICAgIGlmIChjb25maWcubGF6eSAmJiAhbm9kZS5sb2FkZWQpIHtcbiAgICAgICAgcGFuZWwubGF6eUxvYWQobm9kZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIGRvIG5vdCB1c2UgY2FjaGVkIGxlYWYgdmFsdWUgaGVyZSwgaW52b2tlIHRoaXMuaXNMZWFmIHRvIGdldCBuZXcgdmFsdWUuXG4gICAgICAgICAgdmFyIGlzTGVhZiA9IF90aGlzMi5pc0xlYWY7XG5cblxuICAgICAgICAgIGlmICghaXNMZWFmKSBfdGhpczIuaGFuZGxlRXhwYW5kKCk7XG4gICAgICAgICAgaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAvLyBpZiBsZWFmIHN5bmMgY2hlY2tlZCBzdGF0ZSwgZWxzZSBjbGVhciBjaGVja2VkIHN0YXRlXG4gICAgICAgICAgICB2YXIgY2hlY2tlZCA9IGlzTGVhZiA/IG5vZGUuY2hlY2tlZCA6IGZhbHNlO1xuICAgICAgICAgICAgX3RoaXMyLmhhbmRsZU11bHRpQ2hlY2tDaGFuZ2UoY2hlY2tlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhbmVsLmhhbmRsZUV4cGFuZChub2RlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUNoZWNrQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVDaGVja0NoYW5nZSgpIHtcbiAgICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWwsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlLFxuICAgICAgICAgIG5vZGUgPSB0aGlzLm5vZGU7XG5cbiAgICAgIHBhbmVsLmhhbmRsZUNoZWNrQ2hhbmdlKHZhbHVlKTtcbiAgICAgIHBhbmVsLmhhbmRsZUV4cGFuZChub2RlKTtcbiAgICB9LFxuICAgIGhhbmRsZU11bHRpQ2hlY2tDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZU11bHRpQ2hlY2tDaGFuZ2UoY2hlY2tlZCkge1xuICAgICAgdGhpcy5ub2RlLmRvQ2hlY2soY2hlY2tlZCk7XG4gICAgICB0aGlzLnBhbmVsLmNhbGN1bGF0ZU11bHRpQ2hlY2tlZFZhbHVlKCk7XG4gICAgfSxcbiAgICBpc0luUGF0aDogZnVuY3Rpb24gaXNJblBhdGgocGF0aE5vZGVzKSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZTtcblxuICAgICAgdmFyIHNlbGVjdGVkUGF0aE5vZGUgPSBwYXRoTm9kZXNbbm9kZS5sZXZlbCAtIDFdIHx8IHt9O1xuICAgICAgcmV0dXJuIHNlbGVjdGVkUGF0aE5vZGUudWlkID09PSBub2RlLnVpZDtcbiAgICB9LFxuICAgIHJlbmRlclByZWZpeDogZnVuY3Rpb24gcmVuZGVyUHJlZml4KGgpIHtcbiAgICAgIHZhciBpc0xlYWYgPSB0aGlzLmlzTGVhZixcbiAgICAgICAgICBpc0NoZWNrZWQgPSB0aGlzLmlzQ2hlY2tlZCxcbiAgICAgICAgICBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgIHZhciBjaGVja1N0cmljdGx5ID0gY29uZmlnLmNoZWNrU3RyaWN0bHksXG4gICAgICAgICAgbXVsdGlwbGUgPSBjb25maWcubXVsdGlwbGU7XG5cblxuICAgICAgaWYgKG11bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNoZWNrYm94KGgpO1xuICAgICAgfSBlbHNlIGlmIChjaGVja1N0cmljdGx5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlclJhZGlvKGgpO1xuICAgICAgfSBlbHNlIGlmIChpc0xlYWYgJiYgaXNDaGVja2VkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNoZWNrSWNvbihoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW5kZXJQb3N0Zml4OiBmdW5jdGlvbiByZW5kZXJQb3N0Zml4KGgpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlLFxuICAgICAgICAgIGlzTGVhZiA9IHRoaXMuaXNMZWFmO1xuXG5cbiAgICAgIGlmIChub2RlLmxvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyTG9hZGluZ0ljb24oaCk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0xlYWYpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRXhwYW5kSWNvbihoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW5kZXJDaGVja2JveDogZnVuY3Rpb24gcmVuZGVyQ2hlY2tib3goaCkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUsXG4gICAgICAgICAgY29uZmlnID0gdGhpcy5jb25maWcsXG4gICAgICAgICAgaXNEaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZDtcblxuICAgICAgdmFyIGV2ZW50cyA9IHtcbiAgICAgICAgb246IHsgY2hhbmdlOiB0aGlzLmhhbmRsZU11bHRpQ2hlY2tDaGFuZ2UgfSxcbiAgICAgICAgbmF0aXZlT246IHt9XG4gICAgICB9O1xuXG4gICAgICBpZiAoY29uZmlnLmNoZWNrU3RyaWN0bHkpIHtcbiAgICAgICAgLy8gd2hlbiBldmVyeSBub2RlIGlzIHNlbGVjdGFibGUsIGNsaWNrIGV2ZW50IHNob3VsZCBub3QgdHJpZ2dlciBleHBhbmQgZXZlbnQuXG4gICAgICAgIGV2ZW50cy5uYXRpdmVPbi5jbGljayA9IHN0b3BQcm9wYWdhdGlvbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGgoJ2VsLWNoZWNrYm94JywgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfZGVmYXVsdCgpKFt7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdmFsdWU6IG5vZGUuY2hlY2tlZCxcbiAgICAgICAgICBpbmRldGVybWluYXRlOiBub2RlLmluZGV0ZXJtaW5hdGUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWRcbiAgICAgICAgfVxuICAgICAgfSwgZXZlbnRzXSkpO1xuICAgIH0sXG4gICAgcmVuZGVyUmFkaW86IGZ1bmN0aW9uIHJlbmRlclJhZGlvKGgpIHtcbiAgICAgIHZhciBjaGVja2VkVmFsdWUgPSB0aGlzLmNoZWNrZWRWYWx1ZSxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMudmFsdWUsXG4gICAgICAgICAgaXNEaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZDtcblxuICAgICAgLy8gdG8ga2VlcCBzYW1lIHJlZmVyZW5jZSBpZiB2YWx1ZSBjYXVzZSByYWRpbydzIGNoZWNrZWQgc3RhdGUgaXMgY2FsY3VsYXRlZCBieSByZWZlcmVuY2UgY29tcGFyaXNpb247XG5cbiAgICAgIGlmIChPYmplY3QodXRpbF9bXCJpc0VxdWFsXCJdKSh2YWx1ZSwgY2hlY2tlZFZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IGNoZWNrZWRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGgoXG4gICAgICAgICdlbC1yYWRpbycsXG4gICAgICAgIHtcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgdmFsdWU6IGNoZWNrZWRWYWx1ZSxcbiAgICAgICAgICAgIGxhYmVsOiB2YWx1ZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBpc0Rpc2FibGVkXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgJ2NoYW5nZSc6IHRoaXMuaGFuZGxlQ2hlY2tDaGFuZ2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hdGl2ZU9uOiB7XG4gICAgICAgICAgICAnY2xpY2snOiBzdG9wUHJvcGFnYXRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtoKCdzcGFuJyldXG4gICAgICApO1xuICAgIH0sXG4gICAgcmVuZGVyQ2hlY2tJY29uOiBmdW5jdGlvbiByZW5kZXJDaGVja0ljb24oaCkge1xuICAgICAgcmV0dXJuIGgoJ2knLCB7ICdjbGFzcyc6ICdlbC1pY29uLWNoZWNrIGVsLWNhc2NhZGVyLW5vZGVfX3ByZWZpeCcgfSk7XG4gICAgfSxcbiAgICByZW5kZXJMb2FkaW5nSWNvbjogZnVuY3Rpb24gcmVuZGVyTG9hZGluZ0ljb24oaCkge1xuICAgICAgcmV0dXJuIGgoJ2knLCB7ICdjbGFzcyc6ICdlbC1pY29uLWxvYWRpbmcgZWwtY2FzY2FkZXItbm9kZV9fcG9zdGZpeCcgfSk7XG4gICAgfSxcbiAgICByZW5kZXJFeHBhbmRJY29uOiBmdW5jdGlvbiByZW5kZXJFeHBhbmRJY29uKGgpIHtcbiAgICAgIHJldHVybiBoKCdpJywgeyAnY2xhc3MnOiAnZWwtaWNvbi1hcnJvdy1yaWdodCBlbC1jYXNjYWRlci1ub2RlX19wb3N0Zml4JyB9KTtcbiAgICB9LFxuICAgIHJlbmRlckNvbnRlbnQ6IGZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoaCkge1xuICAgICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbCxcbiAgICAgICAgICBub2RlID0gdGhpcy5ub2RlO1xuXG4gICAgICB2YXIgcmVuZGVyID0gcGFuZWwucmVuZGVyTGFiZWxGbjtcbiAgICAgIHZhciB2bm9kZSA9IHJlbmRlciA/IHJlbmRlcih7IG5vZGU6IG5vZGUsIGRhdGE6IG5vZGUuZGF0YSB9KSA6IG51bGw7XG5cbiAgICAgIHJldHVybiBoKFxuICAgICAgICAnc3BhbicsXG4gICAgICAgIHsgJ2NsYXNzJzogJ2VsLWNhc2NhZGVyLW5vZGVfX2xhYmVsJyB9LFxuICAgICAgICBbdm5vZGUgfHwgbm9kZS5sYWJlbF1cbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHZhciBpbkFjdGl2ZVBhdGggPSB0aGlzLmluQWN0aXZlUGF0aCxcbiAgICAgICAgaW5DaGVja2VkUGF0aCA9IHRoaXMuaW5DaGVja2VkUGF0aCxcbiAgICAgICAgaXNDaGVja2VkID0gdGhpcy5pc0NoZWNrZWQsXG4gICAgICAgIGlzTGVhZiA9IHRoaXMuaXNMZWFmLFxuICAgICAgICBpc0Rpc2FibGVkID0gdGhpcy5pc0Rpc2FibGVkLFxuICAgICAgICBjb25maWcgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgbm9kZUlkID0gdGhpcy5ub2RlSWQ7XG4gICAgdmFyIGV4cGFuZFRyaWdnZXIgPSBjb25maWcuZXhwYW5kVHJpZ2dlcixcbiAgICAgICAgY2hlY2tTdHJpY3RseSA9IGNvbmZpZy5jaGVja1N0cmljdGx5LFxuICAgICAgICBtdWx0aXBsZSA9IGNvbmZpZy5tdWx0aXBsZTtcblxuICAgIHZhciBkaXNhYmxlZCA9ICFjaGVja1N0cmljdGx5ICYmIGlzRGlzYWJsZWQ7XG4gICAgdmFyIGV2ZW50cyA9IHsgb246IHt9IH07XG5cbiAgICBpZiAoZXhwYW5kVHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgZXZlbnRzLm9uLmNsaWNrID0gdGhpcy5oYW5kbGVFeHBhbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV2ZW50cy5vbi5tb3VzZWVudGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgX3RoaXMzLmhhbmRsZUV4cGFuZCgpO1xuICAgICAgICBfdGhpczMuJGVtaXQoJ2V4cGFuZCcsIGUpO1xuICAgICAgfTtcbiAgICAgIGV2ZW50cy5vbi5mb2N1cyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzMy5oYW5kbGVFeHBhbmQoKTtcbiAgICAgICAgX3RoaXMzLiRlbWl0KCdleHBhbmQnLCBlKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpc0xlYWYgJiYgIWlzRGlzYWJsZWQgJiYgIWNoZWNrU3RyaWN0bHkgJiYgIW11bHRpcGxlKSB7XG4gICAgICBldmVudHMub24uY2xpY2sgPSB0aGlzLmhhbmRsZUNoZWNrQ2hhbmdlO1xuICAgIH1cblxuICAgIHJldHVybiBoKFxuICAgICAgJ2xpJyxcbiAgICAgIGV4dGVybmFsX2JhYmVsX2hlbHBlcl92dWVfanN4X21lcmdlX3Byb3BzX2RlZmF1bHQoKShbe1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHJvbGU6ICdtZW51aXRlbScsXG4gICAgICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgICAgICAnYXJpYS1leHBhbmRlZCc6IGluQWN0aXZlUGF0aCxcbiAgICAgICAgICB0YWJpbmRleDogZGlzYWJsZWQgPyBudWxsIDogLTFcbiAgICAgICAgfSxcbiAgICAgICAgJ2NsYXNzJzoge1xuICAgICAgICAgICdlbC1jYXNjYWRlci1ub2RlJzogdHJ1ZSxcbiAgICAgICAgICAnaXMtc2VsZWN0YWJsZSc6IGNoZWNrU3RyaWN0bHksXG4gICAgICAgICAgJ2luLWFjdGl2ZS1wYXRoJzogaW5BY3RpdmVQYXRoLFxuICAgICAgICAgICdpbi1jaGVja2VkLXBhdGgnOiBpbkNoZWNrZWRQYXRoLFxuICAgICAgICAgICdpcy1hY3RpdmUnOiBpc0NoZWNrZWQsXG4gICAgICAgICAgJ2lzLWRpc2FibGVkJzogZGlzYWJsZWRcbiAgICAgICAgfVxuICAgICAgfSwgZXZlbnRzXSksXG4gICAgICBbdGhpcy5yZW5kZXJQcmVmaXgoaCksIHRoaXMucmVuZGVyQ29udGVudChoKSwgdGhpcy5yZW5kZXJQb3N0Zml4KGgpXVxuICAgICk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbm9kZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2Nhc2NhZGVyX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoY2FzY2FkZXJfbm9kZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbnZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbm9kZS52dWVcbnZhciBjYXNjYWRlcl9ub2RlX3JlbmRlciwgY2FzY2FkZXJfbm9kZV9zdGF0aWNSZW5kZXJGbnNcblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gT2JqZWN0KGNvbXBvbmVudE5vcm1hbGl6ZXJbXCJhXCIgLyogZGVmYXVsdCAqL10pKFxuICBzcmNfY2FzY2FkZXJfbm9kZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgY2FzY2FkZXJfbm9kZV9yZW5kZXIsXG4gIGNhc2NhZGVyX25vZGVfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhcGk7IH1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW5vZGUudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhc2NhZGVyX25vZGUgPSAoY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL21peGlucy9sb2NhbGVcIlxudmFyIGxvY2FsZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xudmFyIGxvY2FsZV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihsb2NhbGVfKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW1lbnUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXNjYWRlcl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsQ2FzY2FkZXJNZW51JyxcblxuICBtaXhpbnM6IFtsb2NhbGVfZGVmYXVsdC5hXSxcblxuICBpbmplY3Q6IFsncGFuZWwnXSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxTY3JvbGxiYXI6IHNjcm9sbGJhcl9kZWZhdWx0LmEsXG4gICAgQ2FzY2FkZXJOb2RlOiBjYXNjYWRlcl9ub2RlXG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBub2Rlczoge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgaW5kZXg6IE51bWJlclxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGl2ZU5vZGU6IG51bGwsXG4gICAgICBob3ZlclRpbWVyOiBudWxsLFxuICAgICAgaWQ6IE9iamVjdCh1dGlsX1tcImdlbmVyYXRlSWRcIl0pKClcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICAgICAgcmV0dXJuICF0aGlzLm5vZGVzLmxlbmd0aDtcbiAgICB9LFxuICAgIG1lbnVJZDogZnVuY3Rpb24gbWVudUlkKCkge1xuICAgICAgcmV0dXJuICdjYXNjYWRlci1tZW51LScgKyB0aGlzLmlkICsgJy0nICsgdGhpcy5pbmRleDtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUV4cGFuZDogZnVuY3Rpb24gaGFuZGxlRXhwYW5kKGUpIHtcbiAgICAgIHRoaXMuYWN0aXZlTm9kZSA9IGUudGFyZ2V0O1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VNb3ZlOiBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZSkge1xuICAgICAgdmFyIGFjdGl2ZU5vZGUgPSB0aGlzLmFjdGl2ZU5vZGUsXG4gICAgICAgICAgaG92ZXJUaW1lciA9IHRoaXMuaG92ZXJUaW1lcjtcbiAgICAgIHZhciBob3ZlclpvbmUgPSB0aGlzLiRyZWZzLmhvdmVyWm9uZTtcblxuXG4gICAgICBpZiAoIWFjdGl2ZU5vZGUgfHwgIWhvdmVyWm9uZSkgcmV0dXJuO1xuXG4gICAgICBpZiAoYWN0aXZlTm9kZS5jb250YWlucyhlLnRhcmdldCkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpO1xuXG4gICAgICAgIHZhciBfJGVsJGdldEJvdW5kaW5nQ2xpZW4gPSB0aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIGxlZnQgPSBfJGVsJGdldEJvdW5kaW5nQ2xpZW4ubGVmdDtcblxuICAgICAgICB2YXIgc3RhcnRYID0gZS5jbGllbnRYIC0gbGVmdDtcbiAgICAgICAgdmFyIF8kZWwgPSB0aGlzLiRlbCxcbiAgICAgICAgICAgIG9mZnNldFdpZHRoID0gXyRlbC5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIG9mZnNldEhlaWdodCA9IF8kZWwub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIHZhciB0b3AgPSBhY3RpdmVOb2RlLm9mZnNldFRvcDtcbiAgICAgICAgdmFyIGJvdHRvbSA9IHRvcCArIGFjdGl2ZU5vZGUub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIGhvdmVyWm9uZS5pbm5lckhUTUwgPSAnXFxuICAgICAgICAgIDxwYXRoIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCIgZmlsbD1cInRyYW5zcGFyZW50XCIgZD1cIk0nICsgc3RhcnRYICsgJyAnICsgdG9wICsgJyBMJyArIG9mZnNldFdpZHRoICsgJyAwIFYnICsgdG9wICsgJyBaXCIgLz5cXG4gICAgICAgICAgPHBhdGggc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIiBmaWxsPVwidHJhbnNwYXJlbnRcIiBkPVwiTScgKyBzdGFydFggKyAnICcgKyBib3R0b20gKyAnIEwnICsgb2Zmc2V0V2lkdGggKyAnICcgKyBvZmZzZXRIZWlnaHQgKyAnIFYnICsgYm90dG9tICsgJyBaXCIgLz5cXG4gICAgICAgICc7XG4gICAgICB9IGVsc2UgaWYgKCFob3ZlclRpbWVyKSB7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lciA9IHNldFRpbWVvdXQodGhpcy5jbGVhckhvdmVyWm9uZSwgdGhpcy5wYW5lbC5jb25maWcuaG92ZXJUaHJlc2hvbGQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xlYXJIb3ZlclpvbmU6IGZ1bmN0aW9uIGNsZWFySG92ZXJab25lKCkge1xuICAgICAgdmFyIGhvdmVyWm9uZSA9IHRoaXMuJHJlZnMuaG92ZXJab25lO1xuXG4gICAgICBpZiAoIWhvdmVyWm9uZSkgcmV0dXJuO1xuICAgICAgaG92ZXJab25lLmlubmVySFRNTCA9ICcnO1xuICAgIH0sXG4gICAgcmVuZGVyRW1wdHlUZXh0OiBmdW5jdGlvbiByZW5kZXJFbXB0eVRleHQoaCkge1xuICAgICAgcmV0dXJuIGgoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7ICdjbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51X19lbXB0eS10ZXh0JyB9LFxuICAgICAgICBbdGhpcy50KCdlbC5jYXNjYWRlci5ub0RhdGEnKV1cbiAgICAgICk7XG4gICAgfSxcbiAgICByZW5kZXJOb2RlTGlzdDogZnVuY3Rpb24gcmVuZGVyTm9kZUxpc3QoaCkge1xuICAgICAgdmFyIG1lbnVJZCA9IHRoaXMubWVudUlkO1xuICAgICAgdmFyIGlzSG92ZXJNZW51ID0gdGhpcy5wYW5lbC5pc0hvdmVyTWVudTtcblxuICAgICAgdmFyIGV2ZW50cyA9IHsgb246IHt9IH07XG5cbiAgICAgIGlmIChpc0hvdmVyTWVudSkge1xuICAgICAgICBldmVudHMub24uZXhwYW5kID0gdGhpcy5oYW5kbGVFeHBhbmQ7XG4gICAgICB9XG5cbiAgICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMubWFwKGZ1bmN0aW9uIChub2RlLCBpbmRleCkge1xuICAgICAgICB2YXIgaGFzQ2hpbGRyZW4gPSBub2RlLmhhc0NoaWxkcmVuO1xuXG4gICAgICAgIHJldHVybiBoKCdjYXNjYWRlci1ub2RlJywgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfZGVmYXVsdCgpKFt7XG4gICAgICAgICAga2V5OiBub2RlLnVpZCxcbiAgICAgICAgICBhdHRyczogeyBub2RlOiBub2RlLFxuICAgICAgICAgICAgJ25vZGUtaWQnOiBtZW51SWQgKyAnLScgKyBpbmRleCxcbiAgICAgICAgICAgICdhcmlhLWhhc3BvcHVwJzogaGFzQ2hpbGRyZW4sXG4gICAgICAgICAgICAnYXJpYS1vd25zJzogaGFzQ2hpbGRyZW4gPyBtZW51SWQgOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9LCBldmVudHNdKSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFtdLmNvbmNhdChub2RlcywgW2lzSG92ZXJNZW51ID8gaCgnc3ZnJywgeyByZWY6ICdob3ZlclpvbmUnLCAnY2xhc3MnOiAnZWwtY2FzY2FkZXItbWVudV9faG92ZXItem9uZScgfSkgOiBudWxsXSk7XG4gICAgfVxuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICB2YXIgaXNFbXB0eSA9IHRoaXMuaXNFbXB0eSxcbiAgICAgICAgbWVudUlkID0gdGhpcy5tZW51SWQ7XG5cbiAgICB2YXIgZXZlbnRzID0geyBuYXRpdmVPbjoge30gfTtcblxuICAgIC8vIG9wdGltaXplIGhvdmVyIHRvIGV4cGFuZCBleHBlcmllbmNlICgjODAxMClcbiAgICBpZiAodGhpcy5wYW5lbC5pc0hvdmVyTWVudSkge1xuICAgICAgZXZlbnRzLm5hdGl2ZU9uLm1vdXNlbW92ZSA9IHRoaXMuaGFuZGxlTW91c2VNb3ZlO1xuICAgICAgLy8gZXZlbnRzLm5hdGl2ZU9uLm1vdXNlbGVhdmUgPSB0aGlzLmNsZWFySG92ZXJab25lO1xuICAgIH1cblxuICAgIHJldHVybiBoKFxuICAgICAgJ2VsLXNjcm9sbGJhcicsXG4gICAgICBleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc19kZWZhdWx0KCkoW3tcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB0YWc6ICd1bCcsXG4gICAgICAgICAgcm9sZTogJ21lbnUnLFxuICAgICAgICAgIGlkOiBtZW51SWQsXG5cbiAgICAgICAgICAnd3JhcC1jbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51X193cmFwJyxcbiAgICAgICAgICAndmlldy1jbGFzcyc6IHtcbiAgICAgICAgICAgICdlbC1jYXNjYWRlci1tZW51X19saXN0JzogdHJ1ZSxcbiAgICAgICAgICAgICdpcy1lbXB0eSc6IGlzRW1wdHlcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdjbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51JyB9LCBldmVudHNdKSxcbiAgICAgIFtpc0VtcHR5ID8gdGhpcy5yZW5kZXJFbXB0eVRleHQoaCkgOiB0aGlzLnJlbmRlck5vZGVMaXN0KGgpXVxuICAgICk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbWVudS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2Nhc2NhZGVyX21lbnV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoY2FzY2FkZXJfbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbWVudS52dWVcbnZhciBjYXNjYWRlcl9tZW51X3JlbmRlciwgY2FzY2FkZXJfbWVudV9zdGF0aWNSZW5kZXJGbnNcblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY2FzY2FkZXJfbWVudV9jb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplcltcImFcIiAvKiBkZWZhdWx0ICovXSkoXG4gIHNyY19jYXNjYWRlcl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBjYXNjYWRlcl9tZW51X3JlbmRlcixcbiAgY2FzY2FkZXJfbWVudV9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGNhc2NhZGVyX21lbnVfYXBpOyB9XG5jYXNjYWRlcl9tZW51X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW1lbnUudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhc2NhZGVyX21lbnUgPSAoY2FzY2FkZXJfbWVudV9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvc2hhcmVkXCJcbnZhciBzaGFyZWRfID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL25vZGUuanNcbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblxuXG5cbnZhciB1aWQgPSAwO1xuXG52YXIgbm9kZV9Ob2RlID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBOb2RlKGRhdGEsIGNvbmZpZywgcGFyZW50Tm9kZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb2RlKTtcblxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnROb2RlIHx8IG51bGw7XG4gICAgdGhpcy5sZXZlbCA9ICF0aGlzLnBhcmVudCA/IDEgOiB0aGlzLnBhcmVudC5sZXZlbCArIDE7XG4gICAgdGhpcy51aWQgPSB1aWQrKztcblxuICAgIHRoaXMuaW5pdFN0YXRlKCk7XG4gICAgdGhpcy5pbml0Q2hpbGRyZW4oKTtcbiAgfVxuXG4gIE5vZGUucHJvdG90eXBlLmluaXRTdGF0ZSA9IGZ1bmN0aW9uIGluaXRTdGF0ZSgpIHtcbiAgICB2YXIgX2NvbmZpZyA9IHRoaXMuY29uZmlnLFxuICAgICAgICB2YWx1ZUtleSA9IF9jb25maWcudmFsdWUsXG4gICAgICAgIGxhYmVsS2V5ID0gX2NvbmZpZy5sYWJlbDtcblxuXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGF0YVt2YWx1ZUtleV07XG4gICAgdGhpcy5sYWJlbCA9IHRoaXMuZGF0YVtsYWJlbEtleV07XG4gICAgdGhpcy5wYXRoTm9kZXMgPSB0aGlzLmNhbGN1bGF0ZVBhdGhOb2RlcygpO1xuICAgIHRoaXMucGF0aCA9IHRoaXMucGF0aE5vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5wYXRoTGFiZWxzID0gdGhpcy5wYXRoTm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS5sYWJlbDtcbiAgICB9KTtcblxuICAgIC8vIGxhenkgbG9hZFxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuaW5pdENoaWxkcmVuID0gZnVuY3Rpb24gaW5pdENoaWxkcmVuKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWc7XG5cbiAgICB2YXIgY2hpbGRyZW5LZXkgPSBjb25maWcuY2hpbGRyZW47XG4gICAgdmFyIGNoaWxkcmVuRGF0YSA9IHRoaXMuZGF0YVtjaGlsZHJlbktleV07XG4gICAgdGhpcy5oYXNDaGlsZHJlbiA9IEFycmF5LmlzQXJyYXkoY2hpbGRyZW5EYXRhKTtcbiAgICB0aGlzLmNoaWxkcmVuID0gKGNoaWxkcmVuRGF0YSB8fCBbXSkubWFwKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIG5ldyBOb2RlKGNoaWxkLCBjb25maWcsIF90aGlzKTtcbiAgICB9KTtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5jYWxjdWxhdGVQYXRoTm9kZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVQYXRoTm9kZXMoKSB7XG4gICAgdmFyIG5vZGVzID0gW3RoaXNdO1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIG5vZGVzLnVuc2hpZnQocGFyZW50KTtcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmdldFBhdGggPSBmdW5jdGlvbiBnZXRQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLnBhdGg7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiBnZXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5nZXRWYWx1ZUJ5T3B0aW9uID0gZnVuY3Rpb24gZ2V0VmFsdWVCeU9wdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZW1pdFBhdGggPyB0aGlzLmdldFBhdGgoKSA6IHRoaXMuZ2V0VmFsdWUoKTtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24gZ2V0VGV4dChhbGxMZXZlbHMsIHNlcGFyYXRvcikge1xuICAgIHJldHVybiBhbGxMZXZlbHMgPyB0aGlzLnBhdGhMYWJlbHMuam9pbihzZXBhcmF0b3IpIDogdGhpcy5sYWJlbDtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5pc1NhbWVOb2RlID0gZnVuY3Rpb24gaXNTYW1lTm9kZShjaGVja2VkVmFsdWUpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlQnlPcHRpb24oKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheShjaGVja2VkVmFsdWUpID8gY2hlY2tlZFZhbHVlLnNvbWUoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIE9iamVjdCh1dGlsX1tcImlzRXF1YWxcIl0pKHZhbCwgdmFsdWUpO1xuICAgIH0pIDogT2JqZWN0KHV0aWxfW1wiaXNFcXVhbFwiXSkoY2hlY2tlZFZhbHVlLCB2YWx1ZSk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuYnJvYWRjYXN0ID0gZnVuY3Rpb24gYnJvYWRjYXN0KGV2ZW50KSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgaGFuZGxlck5hbWUgPSAnb25QYXJlbnQnICsgT2JqZWN0KHV0aWxfW1wiY2FwaXRhbGl6ZVwiXSkoZXZlbnQpO1xuXG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIC8vIGJvdHRvbSB1cFxuICAgICAgICBjaGlsZC5icm9hZGNhc3QuYXBwbHkoY2hpbGQsIFtldmVudF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgY2hpbGRbaGFuZGxlck5hbWVdICYmIGNoaWxkW2hhbmRsZXJOYW1lXS5hcHBseShjaGlsZCwgYXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cbiAgICB2YXIgaGFuZGxlck5hbWUgPSAnb25DaGlsZCcgKyBPYmplY3QodXRpbF9bXCJjYXBpdGFsaXplXCJdKShldmVudCk7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRbaGFuZGxlck5hbWVdICYmIHBhcmVudFtoYW5kbGVyTmFtZV0uYXBwbHkocGFyZW50LCBhcmdzKTtcbiAgICAgIHBhcmVudC5lbWl0LmFwcGx5KHBhcmVudCwgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5vblBhcmVudENoZWNrID0gZnVuY3Rpb24gb25QYXJlbnRDaGVjayhjaGVja2VkKSB7XG4gICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0Q2hlY2tTdGF0ZShjaGVja2VkKTtcbiAgICB9XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUub25DaGlsZENoZWNrID0gZnVuY3Rpb24gb25DaGlsZENoZWNrKCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG5cbiAgICB2YXIgdmFsaWRDaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHJldHVybiAhY2hpbGQuaXNEaXNhYmxlZDtcbiAgICB9KTtcbiAgICB2YXIgY2hlY2tlZCA9IHZhbGlkQ2hpbGRyZW4ubGVuZ3RoID8gdmFsaWRDaGlsZHJlbi5ldmVyeShmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZC5jaGVja2VkO1xuICAgIH0pIDogZmFsc2U7XG5cbiAgICB0aGlzLnNldENoZWNrU3RhdGUoY2hlY2tlZCk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuc2V0Q2hlY2tTdGF0ZSA9IGZ1bmN0aW9uIHNldENoZWNrU3RhdGUoY2hlY2tlZCkge1xuICAgIHZhciB0b3RhbE51bSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHZhciBjaGVja2VkTnVtID0gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoZnVuY3Rpb24gKGMsIHApIHtcbiAgICAgIHZhciBudW0gPSBwLmNoZWNrZWQgPyAxIDogcC5pbmRldGVybWluYXRlID8gMC41IDogMDtcbiAgICAgIHJldHVybiBjICsgbnVtO1xuICAgIH0sIDApO1xuXG4gICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDtcbiAgICB0aGlzLmluZGV0ZXJtaW5hdGUgPSBjaGVja2VkTnVtICE9PSB0b3RhbE51bSAmJiBjaGVja2VkTnVtID4gMDtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5zeW5jQ2hlY2tTdGF0ZSA9IGZ1bmN0aW9uIHN5bmNDaGVja1N0YXRlKGNoZWNrZWRWYWx1ZSkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWVCeU9wdGlvbigpO1xuICAgIHZhciBjaGVja2VkID0gdGhpcy5pc1NhbWVOb2RlKGNoZWNrZWRWYWx1ZSwgdmFsdWUpO1xuXG4gICAgdGhpcy5kb0NoZWNrKGNoZWNrZWQpO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmRvQ2hlY2sgPSBmdW5jdGlvbiBkb0NoZWNrKGNoZWNrZWQpIHtcbiAgICBpZiAodGhpcy5jaGVja2VkICE9PSBjaGVja2VkKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuY2hlY2tTdHJpY3RseSkge1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSBjaGVja2VkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYm90dG9tIHVwIHRvIHVuaWZ5IHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaW5kZXRlcm1pbmF0ZSBzdGF0ZVxuICAgICAgICB0aGlzLmJyb2FkY2FzdCgnY2hlY2snLCBjaGVja2VkKTtcbiAgICAgICAgdGhpcy5zZXRDaGVja1N0YXRlKGNoZWNrZWQpO1xuICAgICAgICB0aGlzLmVtaXQoJ2NoZWNrJyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhOb2RlLCBbe1xuICAgIGtleTogJ2lzRGlzYWJsZWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnQsXG4gICAgICAgICAgY29uZmlnID0gdGhpcy5jb25maWc7XG5cbiAgICAgIHZhciBkaXNhYmxlZEtleSA9IGNvbmZpZy5kaXNhYmxlZDtcbiAgICAgIHZhciBjaGVja1N0cmljdGx5ID0gY29uZmlnLmNoZWNrU3RyaWN0bHk7XG5cbiAgICAgIHJldHVybiBkYXRhW2Rpc2FibGVkS2V5XSB8fCAhY2hlY2tTdHJpY3RseSAmJiBwYXJlbnQgJiYgcGFyZW50LmlzRGlzYWJsZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaXNMZWFmJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhLFxuICAgICAgICAgIGxvYWRlZCA9IHRoaXMubG9hZGVkLFxuICAgICAgICAgIGhhc0NoaWxkcmVuID0gdGhpcy5oYXNDaGlsZHJlbixcbiAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG4gICAgICB2YXIgX2NvbmZpZzIgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgICBsYXp5ID0gX2NvbmZpZzIubGF6eSxcbiAgICAgICAgICBsZWFmS2V5ID0gX2NvbmZpZzIubGVhZjtcblxuICAgICAgaWYgKGxhenkpIHtcbiAgICAgICAgdmFyIGlzTGVhZiA9IE9iamVjdChzaGFyZWRfW1wiaXNEZWZcIl0pKGRhdGFbbGVhZktleV0pID8gZGF0YVtsZWFmS2V5XSA6IGxvYWRlZCA/ICFjaGlsZHJlbi5sZW5ndGggOiBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNDaGlsZHJlbiA9ICFpc0xlYWY7XG4gICAgICAgIHJldHVybiBpc0xlYWY7XG4gICAgICB9XG4gICAgICByZXR1cm4gIWhhc0NoaWxkcmVuO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBOb2RlO1xufSgpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfbm9kZSA9IChub2RlX05vZGUpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvc3RvcmUuanNcbmZ1bmN0aW9uIHN0b3JlX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXG5cblxudmFyIGZsYXROb2RlcyA9IGZ1bmN0aW9uIGZsYXROb2RlcyhkYXRhLCBsZWFmT25seSkge1xuICByZXR1cm4gZGF0YS5yZWR1Y2UoZnVuY3Rpb24gKHJlcywgbm9kZSkge1xuICAgIGlmIChub2RlLmlzTGVhZikge1xuICAgICAgcmVzLnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICFsZWFmT25seSAmJiByZXMucHVzaChub2RlKTtcbiAgICAgIHJlcyA9IHJlcy5jb25jYXQoZmxhdE5vZGVzKG5vZGUuY2hpbGRyZW4sIGxlYWZPbmx5KSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH0sIFtdKTtcbn07XG5cbnZhciBzdG9yZV9TdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3RvcmUoZGF0YSwgY29uZmlnKSB7XG4gICAgc3RvcmVfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RvcmUpO1xuXG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pbml0Tm9kZXMoZGF0YSk7XG4gIH1cblxuICBTdG9yZS5wcm90b3R5cGUuaW5pdE5vZGVzID0gZnVuY3Rpb24gaW5pdE5vZGVzKGRhdGEpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZGF0YSA9IE9iamVjdCh1dGlsX1tcImNvZXJjZVRydXRoeVZhbHVlVG9BcnJheVwiXSkoZGF0YSk7XG4gICAgdGhpcy5ub2RlcyA9IGRhdGEubWFwKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBzcmNfbm9kZShub2RlRGF0YSwgX3RoaXMuY29uZmlnKTtcbiAgICB9KTtcbiAgICB0aGlzLmZsYXR0ZWROb2RlcyA9IHRoaXMuZ2V0RmxhdHRlZE5vZGVzKGZhbHNlLCBmYWxzZSk7XG4gICAgdGhpcy5sZWFmTm9kZXMgPSB0aGlzLmdldEZsYXR0ZWROb2Rlcyh0cnVlLCBmYWxzZSk7XG4gIH07XG5cbiAgU3RvcmUucHJvdG90eXBlLmFwcGVuZE5vZGUgPSBmdW5jdGlvbiBhcHBlbmROb2RlKG5vZGVEYXRhLCBwYXJlbnROb2RlKSB7XG4gICAgdmFyIG5vZGUgPSBuZXcgc3JjX25vZGUobm9kZURhdGEsIHRoaXMuY29uZmlnLCBwYXJlbnROb2RlKTtcbiAgICB2YXIgY2hpbGRyZW4gPSBwYXJlbnROb2RlID8gcGFyZW50Tm9kZS5jaGlsZHJlbiA6IHRoaXMubm9kZXM7XG5cbiAgICBjaGlsZHJlbi5wdXNoKG5vZGUpO1xuICB9O1xuXG4gIFN0b3JlLnByb3RvdHlwZS5hcHBlbmROb2RlcyA9IGZ1bmN0aW9uIGFwcGVuZE5vZGVzKG5vZGVEYXRhTGlzdCwgcGFyZW50Tm9kZSkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgbm9kZURhdGFMaXN0ID0gT2JqZWN0KHV0aWxfW1wiY29lcmNlVHJ1dGh5VmFsdWVUb0FycmF5XCJdKShub2RlRGF0YUxpc3QpO1xuICAgIG5vZGVEYXRhTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgcmV0dXJuIF90aGlzMi5hcHBlbmROb2RlKG5vZGVEYXRhLCBwYXJlbnROb2RlKTtcbiAgICB9KTtcbiAgfTtcblxuICBTdG9yZS5wcm90b3R5cGUuZ2V0Tm9kZXMgPSBmdW5jdGlvbiBnZXROb2RlcygpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlcztcbiAgfTtcblxuICBTdG9yZS5wcm90b3R5cGUuZ2V0RmxhdHRlZE5vZGVzID0gZnVuY3Rpb24gZ2V0RmxhdHRlZE5vZGVzKGxlYWZPbmx5KSB7XG4gICAgdmFyIGNhY2hlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcblxuICAgIHZhciBjYWNoZWROb2RlcyA9IGxlYWZPbmx5ID8gdGhpcy5sZWFmTm9kZXMgOiB0aGlzLmZsYXR0ZWROb2RlcztcbiAgICByZXR1cm4gY2FjaGVkID8gY2FjaGVkTm9kZXMgOiBmbGF0Tm9kZXModGhpcy5ub2RlcywgbGVhZk9ubHkpO1xuICB9O1xuXG4gIFN0b3JlLnByb3RvdHlwZS5nZXROb2RlQnlWYWx1ZSA9IGZ1bmN0aW9uIGdldE5vZGVCeVZhbHVlKHZhbHVlKSB7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5nZXRGbGF0dGVkTm9kZXMoZmFsc2UsICF0aGlzLmNvbmZpZy5sYXp5KS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBPYmplY3QodXRpbF9bXCJ2YWx1ZUVxdWFsc1wiXSkobm9kZS5wYXRoLCB2YWx1ZSkgfHwgbm9kZS52YWx1ZSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGVzICYmIG5vZGVzLmxlbmd0aCA/IG5vZGVzWzBdIDogbnVsbDtcbiAgfTtcblxuICByZXR1cm4gU3RvcmU7XG59KCk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19zdG9yZSA9IChzdG9yZV9TdG9yZSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvbWVyZ2VcIlxudmFyIG1lcmdlXyA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG52YXIgbWVyZ2VfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obWVyZ2VfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL2FyaWEtdXRpbHNcIlxudmFyIGFyaWFfdXRpbHNfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MSk7XG52YXIgYXJpYV91dGlsc19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihhcmlhX3V0aWxzXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9zY3JvbGwtaW50by12aWV3XCJcbnZhciBzY3JvbGxfaW50b192aWV3XyA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpO1xudmFyIHNjcm9sbF9pbnRvX3ZpZXdfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc2Nyb2xsX2ludG9fdmlld18pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItcGFuZWwudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxuXG5cblxuXG52YXIgS2V5Q29kZSA9IGFyaWFfdXRpbHNfZGVmYXVsdC5hLmtleXM7XG5cbnZhciBEZWZhdWx0UHJvcHMgPSB7XG4gIGV4cGFuZFRyaWdnZXI6ICdjbGljaycsIC8vIG9yIGhvdmVyXG4gIG11bHRpcGxlOiBmYWxzZSxcbiAgY2hlY2tTdHJpY3RseTogZmFsc2UsIC8vIHdoZXRoZXIgYWxsIG5vZGVzIGNhbiBiZSBzZWxlY3RlZFxuICBlbWl0UGF0aDogdHJ1ZSwgLy8gd2V0aGVyIHRvIGVtaXQgYW4gYXJyYXkgb2YgYWxsIGxldmVscyB2YWx1ZSBpbiB3aGljaCBub2RlIGlzIGxvY2F0ZWRcbiAgbGF6eTogZmFsc2UsXG4gIGxhenlMb2FkOiB1dGlsX1tcIm5vb3BcIl0sXG4gIHZhbHVlOiAndmFsdWUnLFxuICBsYWJlbDogJ2xhYmVsJyxcbiAgY2hpbGRyZW46ICdjaGlsZHJlbicsXG4gIGxlYWY6ICdsZWFmJyxcbiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGhvdmVyVGhyZXNob2xkOiA1MDBcbn07XG5cbnZhciBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2lzTGVhZiA9IGZ1bmN0aW9uIGlzTGVhZihlbCkge1xuICByZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgnYXJpYS1vd25zJyk7XG59O1xuXG52YXIgZ2V0U2libGluZyA9IGZ1bmN0aW9uIGdldFNpYmxpbmcoZWwsIGRpc3RhbmNlKSB7XG4gIHZhciBwYXJlbnROb2RlID0gZWwucGFyZW50Tm9kZTtcblxuICBpZiAocGFyZW50Tm9kZSkge1xuICAgIHZhciBzaWJsaW5ncyA9IHBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgnLmVsLWNhc2NhZGVyLW5vZGVbdGFiaW5kZXg9XCItMVwiXScpO1xuICAgIHZhciBpbmRleCA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoc2libGluZ3MsIGVsKTtcbiAgICByZXR1cm4gc2libGluZ3NbaW5kZXggKyBkaXN0YW5jZV0gfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciBnZXRNZW51SW5kZXggPSBmdW5jdGlvbiBnZXRNZW51SW5kZXgoZWwsIGRpc3RhbmNlKSB7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdmFyIHBpZWNlcyA9IGVsLmlkLnNwbGl0KCctJyk7XG4gIHJldHVybiBOdW1iZXIocGllY2VzW3BpZWNlcy5sZW5ndGggLSAyXSk7XG59O1xuXG52YXIgZm9jdXNOb2RlID0gZnVuY3Rpb24gZm9jdXNOb2RlKGVsKSB7XG4gIGlmICghZWwpIHJldHVybjtcbiAgZWwuZm9jdXMoKTtcbiAgIWNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfaXNMZWFmKGVsKSAmJiBlbC5jbGljaygpO1xufTtcblxudmFyIGNoZWNrTm9kZSA9IGZ1bmN0aW9uIGNoZWNrTm9kZShlbCkge1xuICBpZiAoIWVsKSByZXR1cm47XG5cbiAgdmFyIGlucHV0ID0gZWwucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgaWYgKGlucHV0KSB7XG4gICAgaW5wdXQuY2xpY2soKTtcbiAgfSBlbHNlIGlmIChjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2lzTGVhZihlbCkpIHtcbiAgICBlbC5jbGljaygpO1xuICB9XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbENhc2NhZGVyUGFuZWwnLFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBDYXNjYWRlck1lbnU6IGNhc2NhZGVyX21lbnVcbiAgfSxcblxuICBwcm9wczoge1xuICAgIHZhbHVlOiB7fSxcbiAgICBvcHRpb25zOiBBcnJheSxcbiAgICBwcm9wczogT2JqZWN0LFxuICAgIGJvcmRlcjoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIHJlbmRlckxhYmVsOiBGdW5jdGlvblxuICB9LFxuXG4gIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhbmVsOiB0aGlzXG4gICAgfTtcbiAgfSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZFZhbHVlOiBudWxsLFxuICAgICAgY2hlY2tlZE5vZGVQYXRoczogW10sXG4gICAgICBzdG9yZTogW10sXG4gICAgICBtZW51czogW10sXG4gICAgICBhY3RpdmVQYXRoOiBbXSxcbiAgICAgIGxvYWRDb3VudDogMFxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIGNvbmZpZzogZnVuY3Rpb24gY29uZmlnKCkge1xuICAgICAgcmV0dXJuIG1lcmdlX2RlZmF1bHQoKShfZXh0ZW5kcyh7fSwgRGVmYXVsdFByb3BzKSwgdGhpcy5wcm9wcyB8fCB7fSk7XG4gICAgfSxcbiAgICBtdWx0aXBsZTogZnVuY3Rpb24gbXVsdGlwbGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWcubXVsdGlwbGU7XG4gICAgfSxcbiAgICBjaGVja1N0cmljdGx5OiBmdW5jdGlvbiBjaGVja1N0cmljdGx5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmNoZWNrU3RyaWN0bHk7XG4gICAgfSxcbiAgICBsZWFmT25seTogZnVuY3Rpb24gbGVhZk9ubHkoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuY2hlY2tTdHJpY3RseTtcbiAgICB9LFxuICAgIGlzSG92ZXJNZW51OiBmdW5jdGlvbiBpc0hvdmVyTWVudSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5leHBhbmRUcmlnZ2VyID09PSAnaG92ZXInO1xuICAgIH0sXG4gICAgcmVuZGVyTGFiZWxGbjogZnVuY3Rpb24gcmVuZGVyTGFiZWxGbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckxhYmVsIHx8IHRoaXMuJHNjb3BlZFNsb3RzLmRlZmF1bHQ7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgdGhpcy5zeW5jQ2hlY2tlZFZhbHVlKCk7XG4gICAgICB0aGlzLmNoZWNrU3RyaWN0bHkgJiYgdGhpcy5jYWxjdWxhdGVDaGVja2VkTm9kZVBhdGhzKCk7XG4gICAgfSxcblxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuaW5pdFN0b3JlKCk7XG4gICAgICB9LFxuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgZGVlcDogdHJ1ZVxuICAgIH0sXG4gICAgY2hlY2tlZFZhbHVlOiBmdW5jdGlvbiBjaGVja2VkVmFsdWUodmFsKSB7XG4gICAgICBpZiAoIU9iamVjdCh1dGlsX1tcImlzRXF1YWxcIl0pKHZhbCwgdGhpcy52YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5jaGVja1N0cmljdGx5ICYmIHRoaXMuY2FsY3VsYXRlQ2hlY2tlZE5vZGVQYXRocygpO1xuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzRW1wdHlWYWx1ZSh0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy5zeW5jQ2hlY2tlZFZhbHVlKCk7XG4gICAgfVxuICB9LFxuXG5cbiAgbWV0aG9kczoge1xuICAgIGluaXRTdG9yZTogZnVuY3Rpb24gaW5pdFN0b3JlKCkge1xuICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnLFxuICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmIChjb25maWcubGF6eSAmJiBPYmplY3QodXRpbF9bXCJpc0VtcHR5XCJdKShvcHRpb25zKSkge1xuICAgICAgICB0aGlzLmxhenlMb2FkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JlID0gbmV3IHNyY19zdG9yZShvcHRpb25zLCBjb25maWcpO1xuICAgICAgICB0aGlzLm1lbnVzID0gW3RoaXMuc3RvcmUuZ2V0Tm9kZXMoKV07XG4gICAgICAgIHRoaXMuc3luY01lbnVTdGF0ZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3luY0NoZWNrZWRWYWx1ZTogZnVuY3Rpb24gc3luY0NoZWNrZWRWYWx1ZSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUsXG4gICAgICAgICAgY2hlY2tlZFZhbHVlID0gdGhpcy5jaGVja2VkVmFsdWU7XG5cbiAgICAgIGlmICghT2JqZWN0KHV0aWxfW1wiaXNFcXVhbFwiXSkodmFsdWUsIGNoZWNrZWRWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQYXRoID0gW107XG4gICAgICAgIHRoaXMuY2hlY2tlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc3luY01lbnVTdGF0ZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3luY01lbnVTdGF0ZTogZnVuY3Rpb24gc3luY01lbnVTdGF0ZSgpIHtcbiAgICAgIHZhciBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGUsXG4gICAgICAgICAgY2hlY2tTdHJpY3RseSA9IHRoaXMuY2hlY2tTdHJpY3RseTtcblxuICAgICAgdGhpcy5zeW5jQWN0aXZlUGF0aCgpO1xuICAgICAgbXVsdGlwbGUgJiYgdGhpcy5zeW5jTXVsdGlDaGVja1N0YXRlKCk7XG4gICAgICBjaGVja1N0cmljdGx5ICYmIHRoaXMuY2FsY3VsYXRlQ2hlY2tlZE5vZGVQYXRocygpO1xuICAgICAgdGhpcy4kbmV4dFRpY2sodGhpcy5zY3JvbGxJbnRvVmlldyk7XG4gICAgfSxcbiAgICBzeW5jTXVsdGlDaGVja1N0YXRlOiBmdW5jdGlvbiBzeW5jTXVsdGlDaGVja1N0YXRlKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIG5vZGVzID0gdGhpcy5nZXRGbGF0dGVkTm9kZXModGhpcy5sZWFmT25seSk7XG5cbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgbm9kZS5zeW5jQ2hlY2tTdGF0ZShfdGhpcy5jaGVja2VkVmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBpc0VtcHR5VmFsdWU6IGZ1bmN0aW9uIGlzRW1wdHlWYWx1ZSh2YWwpIHtcbiAgICAgIHZhciBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGUsXG4gICAgICAgICAgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgICB2YXIgZW1pdFBhdGggPSBjb25maWcuZW1pdFBhdGg7XG5cbiAgICAgIGlmIChtdWx0aXBsZSB8fCBlbWl0UGF0aCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiaXNFbXB0eVwiXSkodmFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIHN5bmNBY3RpdmVQYXRoOiBmdW5jdGlvbiBzeW5jQWN0aXZlUGF0aCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgc3RvcmUgPSB0aGlzLnN0b3JlLFxuICAgICAgICAgIG11bHRpcGxlID0gdGhpcy5tdWx0aXBsZSxcbiAgICAgICAgICBhY3RpdmVQYXRoID0gdGhpcy5hY3RpdmVQYXRoLFxuICAgICAgICAgIGNoZWNrZWRWYWx1ZSA9IHRoaXMuY2hlY2tlZFZhbHVlO1xuXG5cbiAgICAgIGlmICghT2JqZWN0KHV0aWxfW1wiaXNFbXB0eVwiXSkoYWN0aXZlUGF0aCkpIHtcbiAgICAgICAgdmFyIG5vZGVzID0gYWN0aXZlUGF0aC5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLmdldE5vZGVCeVZhbHVlKG5vZGUuZ2V0VmFsdWUoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4cGFuZE5vZGVzKG5vZGVzKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNFbXB0eVZhbHVlKGNoZWNrZWRWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gbXVsdGlwbGUgPyBjaGVja2VkVmFsdWVbMF0gOiBjaGVja2VkVmFsdWU7XG4gICAgICAgIHZhciBjaGVja2VkTm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5VmFsdWUodmFsdWUpIHx8IHt9O1xuICAgICAgICB2YXIgX25vZGVzID0gKGNoZWNrZWROb2RlLnBhdGhOb2RlcyB8fCBbXSkuc2xpY2UoMCwgLTEpO1xuICAgICAgICB0aGlzLmV4cGFuZE5vZGVzKF9ub2Rlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZVBhdGggPSBbXTtcbiAgICAgICAgdGhpcy5tZW51cyA9IFtzdG9yZS5nZXROb2RlcygpXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV4cGFuZE5vZGVzOiBmdW5jdGlvbiBleHBhbmROb2Rlcyhub2Rlcykge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5oYW5kbGVFeHBhbmQobm9kZSwgdHJ1ZSAvKiBzaWxlbnQgKi8pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBjYWxjdWxhdGVDaGVja2VkTm9kZVBhdGhzOiBmdW5jdGlvbiBjYWxjdWxhdGVDaGVja2VkTm9kZVBhdGhzKCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHZhciBjaGVja2VkVmFsdWUgPSB0aGlzLmNoZWNrZWRWYWx1ZSxcbiAgICAgICAgICBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XG5cbiAgICAgIHZhciBjaGVja2VkVmFsdWVzID0gbXVsdGlwbGUgPyBPYmplY3QodXRpbF9bXCJjb2VyY2VUcnV0aHlWYWx1ZVRvQXJyYXlcIl0pKGNoZWNrZWRWYWx1ZSkgOiBbY2hlY2tlZFZhbHVlXTtcbiAgICAgIHRoaXMuY2hlY2tlZE5vZGVQYXRocyA9IGNoZWNrZWRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHZhciBjaGVja2VkTm9kZSA9IF90aGlzNC5nZXROb2RlQnlWYWx1ZSh2KTtcbiAgICAgICAgcmV0dXJuIGNoZWNrZWROb2RlID8gY2hlY2tlZE5vZGUucGF0aE5vZGVzIDogW107XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGhhbmRsZUtleURvd246IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0LFxuICAgICAgICAgIGtleUNvZGUgPSBlLmtleUNvZGU7XG5cblxuICAgICAgc3dpdGNoIChrZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgS2V5Q29kZS51cDpcbiAgICAgICAgICB2YXIgcHJldiA9IGdldFNpYmxpbmcodGFyZ2V0LCAtMSk7XG4gICAgICAgICAgZm9jdXNOb2RlKHByZXYpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUuZG93bjpcbiAgICAgICAgICB2YXIgbmV4dCA9IGdldFNpYmxpbmcodGFyZ2V0LCAxKTtcbiAgICAgICAgICBmb2N1c05vZGUobmV4dCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgS2V5Q29kZS5sZWZ0OlxuICAgICAgICAgIHZhciBwcmVNZW51ID0gdGhpcy4kcmVmcy5tZW51W2dldE1lbnVJbmRleCh0YXJnZXQpIC0gMV07XG4gICAgICAgICAgaWYgKHByZU1lbnUpIHtcbiAgICAgICAgICAgIHZhciBleHBhbmRlZE5vZGUgPSBwcmVNZW51LiRlbC5xdWVyeVNlbGVjdG9yKCcuZWwtY2FzY2FkZXItbm9kZVthcmlhLWV4cGFuZGVkPVwidHJ1ZVwiXScpO1xuICAgICAgICAgICAgZm9jdXNOb2RlKGV4cGFuZGVkTm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUucmlnaHQ6XG4gICAgICAgICAgdmFyIG5leHRNZW51ID0gdGhpcy4kcmVmcy5tZW51W2dldE1lbnVJbmRleCh0YXJnZXQpICsgMV07XG4gICAgICAgICAgaWYgKG5leHRNZW51KSB7XG4gICAgICAgICAgICB2YXIgZmlyc3ROb2RlID0gbmV4dE1lbnUuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1jYXNjYWRlci1ub2RlW3RhYmluZGV4PVwiLTFcIl0nKTtcbiAgICAgICAgICAgIGZvY3VzTm9kZShmaXJzdE5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLmVudGVyOlxuICAgICAgICAgIGNoZWNrTm9kZSh0YXJnZXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUuZXNjOlxuICAgICAgICBjYXNlIEtleUNvZGUudGFiOlxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2Nsb3NlJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlRXhwYW5kOiBmdW5jdGlvbiBoYW5kbGVFeHBhbmQobm9kZSwgc2lsZW50KSB7XG4gICAgICB2YXIgYWN0aXZlUGF0aCA9IHRoaXMuYWN0aXZlUGF0aDtcbiAgICAgIHZhciBsZXZlbCA9IG5vZGUubGV2ZWw7XG5cbiAgICAgIHZhciBwYXRoID0gYWN0aXZlUGF0aC5zbGljZSgwLCBsZXZlbCAtIDEpO1xuICAgICAgdmFyIG1lbnVzID0gdGhpcy5tZW51cy5zbGljZSgwLCBsZXZlbCk7XG5cbiAgICAgIGlmICghbm9kZS5pc0xlYWYpIHtcbiAgICAgICAgcGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICBtZW51cy5wdXNoKG5vZGUuY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFjdGl2ZVBhdGggPSBwYXRoO1xuICAgICAgdGhpcy5tZW51cyA9IG1lbnVzO1xuXG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICB2YXIgcGF0aFZhbHVlcyA9IHBhdGgubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VmFsdWUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBhY3RpdmVQYXRoVmFsdWVzID0gYWN0aXZlUGF0aC5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRWYWx1ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFPYmplY3QodXRpbF9bXCJ2YWx1ZUVxdWFsc1wiXSkocGF0aFZhbHVlcywgYWN0aXZlUGF0aFZhbHVlcykpIHtcbiAgICAgICAgICB0aGlzLiRlbWl0KCdhY3RpdmUtaXRlbS1jaGFuZ2UnLCBwYXRoVmFsdWVzKTsgLy8gRGVwcmVjYXRlZFxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2V4cGFuZC1jaGFuZ2UnLCBwYXRoVmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlQ2hlY2tDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUNoZWNrQ2hhbmdlKHZhbHVlKSB7XG4gICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IHZhbHVlO1xuICAgIH0sXG4gICAgbGF6eUxvYWQ6IGZ1bmN0aW9uIGxhenlMb2FkKG5vZGUsIG9uRnVsbGZpbGVkKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUgfHwgeyByb290OiB0cnVlLCBsZXZlbDogMCB9O1xuICAgICAgICB0aGlzLnN0b3JlID0gbmV3IHNyY19zdG9yZShbXSwgY29uZmlnKTtcbiAgICAgICAgdGhpcy5tZW51cyA9IFt0aGlzLnN0b3JlLmdldE5vZGVzKCldO1xuICAgICAgfVxuICAgICAgbm9kZS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHZhciByZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZShkYXRhTGlzdCkge1xuICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5yb290ID8gbnVsbCA6IG5vZGU7XG4gICAgICAgIGRhdGFMaXN0ICYmIGRhdGFMaXN0Lmxlbmd0aCAmJiBfdGhpczUuc3RvcmUuYXBwZW5kTm9kZXMoZGF0YUxpc3QsIHBhcmVudCk7XG4gICAgICAgIG5vZGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBub2RlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gZGlzcG9zZSBkZWZhdWx0IHZhbHVlIG9uIGxhenkgbG9hZCBtb2RlXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KF90aGlzNS5jaGVja2VkVmFsdWUpKSB7XG4gICAgICAgICAgdmFyIG5vZGVWYWx1ZSA9IF90aGlzNS5jaGVja2VkVmFsdWVbX3RoaXM1LmxvYWRDb3VudCsrXTtcbiAgICAgICAgICB2YXIgdmFsdWVLZXkgPSBfdGhpczUuY29uZmlnLnZhbHVlO1xuICAgICAgICAgIHZhciBsZWFmS2V5ID0gX3RoaXM1LmNvbmZpZy5sZWFmO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YUxpc3QpICYmIGRhdGFMaXN0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1bdmFsdWVLZXldID09PSBub2RlVmFsdWU7XG4gICAgICAgICAgfSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIGNoZWNrZWROb2RlID0gX3RoaXM1LnN0b3JlLmdldE5vZGVCeVZhbHVlKG5vZGVWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghY2hlY2tlZE5vZGUuZGF0YVtsZWFmS2V5XSkge1xuICAgICAgICAgICAgICBfdGhpczUubGF6eUxvYWQoY2hlY2tlZE5vZGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpczUuaGFuZGxlRXhwYW5kKGNoZWNrZWROb2RlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfdGhpczUubG9hZENvdW50ID09PSBfdGhpczUuY2hlY2tlZFZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICBfdGhpczUuJHBhcmVudC5jb21wdXRlUHJlc2VudFRleHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvbkZ1bGxmaWxlZCAmJiBvbkZ1bGxmaWxlZChkYXRhTGlzdCk7XG4gICAgICB9O1xuICAgICAgY29uZmlnLmxhenlMb2FkKG5vZGUsIHJlc29sdmUpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIHB1YmxpYyBtZXRob2RzXG4gICAgKi9cbiAgICBjYWxjdWxhdGVNdWx0aUNoZWNrZWRWYWx1ZTogZnVuY3Rpb24gY2FsY3VsYXRlTXVsdGlDaGVja2VkVmFsdWUoKSB7XG4gICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IHRoaXMuZ2V0Q2hlY2tlZE5vZGVzKHRoaXMubGVhZk9ubHkpLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5nZXRWYWx1ZUJ5T3B0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHNjcm9sbEludG9WaWV3OiBmdW5jdGlvbiBzY3JvbGxJbnRvVmlldygpIHtcbiAgICAgIGlmICh0aGlzLiRpc1NlcnZlcikgcmV0dXJuO1xuXG4gICAgICB2YXIgbWVudXMgPSB0aGlzLiRyZWZzLm1lbnUgfHwgW107XG4gICAgICBtZW51cy5mb3JFYWNoKGZ1bmN0aW9uIChtZW51KSB7XG4gICAgICAgIHZhciBtZW51RWxlbWVudCA9IG1lbnUuJGVsO1xuICAgICAgICBpZiAobWVudUVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbWVudUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVsLXNjcm9sbGJhcl9fd3JhcCcpO1xuICAgICAgICAgIHZhciBhY3RpdmVOb2RlID0gbWVudUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW5vZGUuaXMtYWN0aXZlJykgfHwgbWVudUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW5vZGUuaW4tYWN0aXZlLXBhdGgnKTtcbiAgICAgICAgICBzY3JvbGxfaW50b192aWV3X2RlZmF1bHQoKShjb250YWluZXIsIGFjdGl2ZU5vZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldE5vZGVCeVZhbHVlOiBmdW5jdGlvbiBnZXROb2RlQnlWYWx1ZSh2YWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldE5vZGVCeVZhbHVlKHZhbCk7XG4gICAgfSxcbiAgICBnZXRGbGF0dGVkTm9kZXM6IGZ1bmN0aW9uIGdldEZsYXR0ZWROb2RlcyhsZWFmT25seSkge1xuICAgICAgdmFyIGNhY2hlZCA9ICF0aGlzLmNvbmZpZy5sYXp5O1xuICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0RmxhdHRlZE5vZGVzKGxlYWZPbmx5LCBjYWNoZWQpO1xuICAgIH0sXG4gICAgZ2V0Q2hlY2tlZE5vZGVzOiBmdW5jdGlvbiBnZXRDaGVja2VkTm9kZXMobGVhZk9ubHkpIHtcbiAgICAgIHZhciBjaGVja2VkVmFsdWUgPSB0aGlzLmNoZWNrZWRWYWx1ZSxcbiAgICAgICAgICBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XG5cbiAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLmdldEZsYXR0ZWROb2RlcyhsZWFmT25seSk7XG4gICAgICAgIHJldHVybiBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5jaGVja2VkO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRW1wdHlWYWx1ZShjaGVja2VkVmFsdWUpID8gW10gOiBbdGhpcy5nZXROb2RlQnlWYWx1ZShjaGVja2VkVmFsdWUpXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsZWFyQ2hlY2tlZE5vZGVzOiBmdW5jdGlvbiBjbGVhckNoZWNrZWROb2RlcygpIHtcbiAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgICBsZWFmT25seSA9IHRoaXMubGVhZk9ubHk7XG4gICAgICB2YXIgbXVsdGlwbGUgPSBjb25maWcubXVsdGlwbGUsXG4gICAgICAgICAgZW1pdFBhdGggPSBjb25maWcuZW1pdFBhdGg7XG5cbiAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICB0aGlzLmdldENoZWNrZWROb2RlcyhsZWFmT25seSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuICFub2RlLmlzRGlzYWJsZWQ7XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5kb0NoZWNrKGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTXVsdGlDaGVja2VkVmFsdWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hlY2tlZFZhbHVlID0gZW1pdFBhdGggPyBbXSA6IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGNhc2NhZGVyX3BhbmVsX2NvbXBvbmVudCA9IE9iamVjdChjb21wb25lbnROb3JtYWxpemVyW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShcbiAgc3JjX2Nhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0OTMyMzQ2X3JlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBjYXNjYWRlcl9wYW5lbF9hcGk7IH1cbmNhc2NhZGVyX3BhbmVsX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXNjYWRlcl9wYW5lbCA9IChjYXNjYWRlcl9wYW5lbF9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNhc2NhZGVyX3BhbmVsLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoY2FzY2FkZXJfcGFuZWwubmFtZSwgY2FzY2FkZXJfcGFuZWwpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfY2FzY2FkZXJfcGFuZWwgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChjYXNjYWRlcl9wYW5lbCk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9tZXJnZVwiKTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4726\n")},4897:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.i18n = exports.use = exports.t = undefined;\n\nvar _zhCN = __webpack_require__(\"f0d9\");\n\nvar _zhCN2 = _interopRequireDefault(_zhCN);\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _deepmerge = __webpack_require__(\"3c4e\");\n\nvar _deepmerge2 = _interopRequireDefault(_deepmerge);\n\nvar _format = __webpack_require__(\"9d7e\");\n\nvar _format2 = _interopRequireDefault(_format);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar format = (0, _format2.default)(_vue2.default);\nvar lang = _zhCN2.default;\nvar merged = false;\nvar i18nHandler = function i18nHandler() {\n var vuei18n = Object.getPrototypeOf(this || _vue2.default).$t;\n if (typeof vuei18n === 'function' && !!_vue2.default.locale) {\n if (!merged) {\n merged = true;\n _vue2.default.locale(_vue2.default.config.lang, (0, _deepmerge2.default)(lang, _vue2.default.locale(_vue2.default.config.lang) || {}, { clone: true }));\n }\n return vuei18n.apply(this, arguments);\n }\n};\n\nvar t = exports.t = function t(path, options) {\n var value = i18nHandler.apply(this, arguments);\n if (value !== null && value !== undefined) return value;\n\n var array = path.split('.');\n var current = lang;\n\n for (var i = 0, j = array.length; i < j; i++) {\n var property = array[i];\n value = current[property];\n if (i === j - 1) return format(value, options);\n if (!value) return '';\n current = value;\n }\n return '';\n};\n\nvar use = exports.use = function use(l) {\n lang = l || lang;\n};\n\nvar i18n = exports.i18n = function i18n(fn) {\n i18nHandler = fn || i18nHandler;\n};\n\nexports.default = { use: use, t: t, i18n: i18n };\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvbG9jYWxlL2luZGV4LmpzPzQ4OTciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsTUFBa0M7O0FBRXREOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUFLOztBQUV4Qjs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUFXOztBQUVwQzs7QUFFQSxjQUFjLG1CQUFPLENBQUMsTUFBVTs7QUFFaEM7O0FBRUEsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwSUFBMEksR0FBRyxjQUFjO0FBQzNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1DQUFtQyxPQUFPO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIiLCJmaWxlIjoiNDg5Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuaTE4biA9IGV4cG9ydHMudXNlID0gZXhwb3J0cy50ID0gdW5kZWZpbmVkO1xuXG52YXIgX3poQ04gPSByZXF1aXJlKCdlbGVtZW50LXVpL2xpYi9sb2NhbGUvbGFuZy96aC1DTicpO1xuXG52YXIgX3poQ04yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfemhDTik7XG5cbnZhciBfdnVlID0gcmVxdWlyZSgndnVlJyk7XG5cbnZhciBfdnVlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Z1ZSk7XG5cbnZhciBfZGVlcG1lcmdlID0gcmVxdWlyZSgnZGVlcG1lcmdlJyk7XG5cbnZhciBfZGVlcG1lcmdlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZXBtZXJnZSk7XG5cbnZhciBfZm9ybWF0ID0gcmVxdWlyZSgnLi9mb3JtYXQnKTtcblxudmFyIF9mb3JtYXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZm9ybWF0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGZvcm1hdCA9ICgwLCBfZm9ybWF0Mi5kZWZhdWx0KShfdnVlMi5kZWZhdWx0KTtcbnZhciBsYW5nID0gX3poQ04yLmRlZmF1bHQ7XG52YXIgbWVyZ2VkID0gZmFsc2U7XG52YXIgaTE4bkhhbmRsZXIgPSBmdW5jdGlvbiBpMThuSGFuZGxlcigpIHtcbiAgdmFyIHZ1ZWkxOG4gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyB8fCBfdnVlMi5kZWZhdWx0KS4kdDtcbiAgaWYgKHR5cGVvZiB2dWVpMThuID09PSAnZnVuY3Rpb24nICYmICEhX3Z1ZTIuZGVmYXVsdC5sb2NhbGUpIHtcbiAgICBpZiAoIW1lcmdlZCkge1xuICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgIF92dWUyLmRlZmF1bHQubG9jYWxlKF92dWUyLmRlZmF1bHQuY29uZmlnLmxhbmcsICgwLCBfZGVlcG1lcmdlMi5kZWZhdWx0KShsYW5nLCBfdnVlMi5kZWZhdWx0LmxvY2FsZShfdnVlMi5kZWZhdWx0LmNvbmZpZy5sYW5nKSB8fCB7fSwgeyBjbG9uZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIHJldHVybiB2dWVpMThuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cbn07XG5cbnZhciB0ID0gZXhwb3J0cy50ID0gZnVuY3Rpb24gdChwYXRoLCBvcHRpb25zKSB7XG4gIHZhciB2YWx1ZSA9IGkxOG5IYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWU7XG5cbiAgdmFyIGFycmF5ID0gcGF0aC5zcGxpdCgnLicpO1xuICB2YXIgY3VycmVudCA9IGxhbmc7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICB2YXIgcHJvcGVydHkgPSBhcnJheVtpXTtcbiAgICB2YWx1ZSA9IGN1cnJlbnRbcHJvcGVydHldO1xuICAgIGlmIChpID09PSBqIC0gMSkgcmV0dXJuIGZvcm1hdCh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuICcnO1xuICAgIGN1cnJlbnQgPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gJyc7XG59O1xuXG52YXIgdXNlID0gZXhwb3J0cy51c2UgPSBmdW5jdGlvbiB1c2UobCkge1xuICBsYW5nID0gbCB8fCBsYW5nO1xufTtcblxudmFyIGkxOG4gPSBleHBvcnRzLmkxOG4gPSBmdW5jdGlvbiBpMThuKGZuKSB7XG4gIGkxOG5IYW5kbGVyID0gZm4gfHwgaTE4bkhhbmRsZXI7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7IHVzZTogdXNlLCB0OiB0LCBpMThuOiBpMThuIH07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4897\n")},"4b26":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _dom = __webpack_require__(\"5924\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar hasModal = false;\nvar hasInitZIndex = false;\nvar zIndex = void 0;\n\nvar getModal = function getModal() {\n if (_vue2.default.prototype.$isServer) return;\n var modalDom = PopupManager.modalDom;\n if (modalDom) {\n hasModal = true;\n } else {\n hasModal = false;\n modalDom = document.createElement('div');\n PopupManager.modalDom = modalDom;\n\n modalDom.addEventListener('touchmove', function (event) {\n event.preventDefault();\n event.stopPropagation();\n });\n\n modalDom.addEventListener('click', function () {\n PopupManager.doOnModalClick && PopupManager.doOnModalClick();\n });\n }\n\n return modalDom;\n};\n\nvar instances = {};\n\nvar PopupManager = {\n modalFade: true,\n\n getInstance: function getInstance(id) {\n return instances[id];\n },\n\n register: function register(id, instance) {\n if (id && instance) {\n instances[id] = instance;\n }\n },\n\n deregister: function deregister(id) {\n if (id) {\n instances[id] = null;\n delete instances[id];\n }\n },\n\n nextZIndex: function nextZIndex() {\n return PopupManager.zIndex++;\n },\n\n modalStack: [],\n\n doOnModalClick: function doOnModalClick() {\n var topItem = PopupManager.modalStack[PopupManager.modalStack.length - 1];\n if (!topItem) return;\n\n var instance = PopupManager.getInstance(topItem.id);\n if (instance && instance.closeOnClickModal) {\n instance.close();\n }\n },\n\n openModal: function openModal(id, zIndex, dom, modalClass, modalFade) {\n if (_vue2.default.prototype.$isServer) return;\n if (!id || zIndex === undefined) return;\n this.modalFade = modalFade;\n\n var modalStack = this.modalStack;\n\n for (var i = 0, j = modalStack.length; i < j; i++) {\n var item = modalStack[i];\n if (item.id === id) {\n return;\n }\n }\n\n var modalDom = getModal();\n\n (0, _dom.addClass)(modalDom, 'v-modal');\n if (this.modalFade && !hasModal) {\n (0, _dom.addClass)(modalDom, 'v-modal-enter');\n }\n if (modalClass) {\n var classArr = modalClass.trim().split(/\\s+/);\n classArr.forEach(function (item) {\n return (0, _dom.addClass)(modalDom, item);\n });\n }\n setTimeout(function () {\n (0, _dom.removeClass)(modalDom, 'v-modal-enter');\n }, 200);\n\n if (dom && dom.parentNode && dom.parentNode.nodeType !== 11) {\n dom.parentNode.appendChild(modalDom);\n } else {\n document.body.appendChild(modalDom);\n }\n\n if (zIndex) {\n modalDom.style.zIndex = zIndex;\n }\n modalDom.tabIndex = 0;\n modalDom.style.display = '';\n\n this.modalStack.push({ id: id, zIndex: zIndex, modalClass: modalClass });\n },\n\n closeModal: function closeModal(id) {\n var modalStack = this.modalStack;\n var modalDom = getModal();\n\n if (modalStack.length > 0) {\n var topItem = modalStack[modalStack.length - 1];\n if (topItem.id === id) {\n if (topItem.modalClass) {\n var classArr = topItem.modalClass.trim().split(/\\s+/);\n classArr.forEach(function (item) {\n return (0, _dom.removeClass)(modalDom, item);\n });\n }\n\n modalStack.pop();\n if (modalStack.length > 0) {\n modalDom.style.zIndex = modalStack[modalStack.length - 1].zIndex;\n }\n } else {\n for (var i = modalStack.length - 1; i >= 0; i--) {\n if (modalStack[i].id === id) {\n modalStack.splice(i, 1);\n break;\n }\n }\n }\n }\n\n if (modalStack.length === 0) {\n if (this.modalFade) {\n (0, _dom.addClass)(modalDom, 'v-modal-leave');\n }\n setTimeout(function () {\n if (modalStack.length === 0) {\n if (modalDom.parentNode) modalDom.parentNode.removeChild(modalDom);\n modalDom.style.display = 'none';\n PopupManager.modalDom = undefined;\n }\n (0, _dom.removeClass)(modalDom, 'v-modal-leave');\n }, 200);\n }\n }\n};\n\nObject.defineProperty(PopupManager, 'zIndex', {\n configurable: true,\n get: function get() {\n if (!hasInitZIndex) {\n zIndex = zIndex || (_vue2.default.prototype.$ELEMENT || {}).zIndex || 2000;\n hasInitZIndex = true;\n }\n return zIndex;\n },\n set: function set(value) {\n zIndex = value;\n }\n});\n\nvar getTopPopup = function getTopPopup() {\n if (_vue2.default.prototype.$isServer) return;\n if (PopupManager.modalStack.length > 0) {\n var topPopup = PopupManager.modalStack[PopupManager.modalStack.length - 1];\n if (!topPopup) return;\n var instance = PopupManager.getInstance(topPopup.id);\n\n return instance;\n }\n};\n\nif (!_vue2.default.prototype.$isServer) {\n // handle `esc` key when the popup is shown\n window.addEventListener('keydown', function (event) {\n if (event.keyCode === 27) {\n var topPopup = getTopPopup();\n\n if (topPopup && topPopup.closeOnPressEscape) {\n topPopup.handleClose ? topPopup.handleClose() : topPopup.handleAction ? topPopup.handleAction('cancel') : topPopup.close();\n }\n }\n });\n}\n\nexports.default = PopupManager;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvcG9wdXAvcG9wdXAtbWFuYWdlci5qcz80YjI2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUFLOztBQUV4Qjs7QUFFQSxXQUFXLG1CQUFPLENBQUMsTUFBMEI7O0FBRTdDLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSwwQ0FBMEMsT0FBTztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIsaURBQWlEO0FBQzNFLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSIsImZpbGUiOiI0YjI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3Z1ZSA9IHJlcXVpcmUoJ3Z1ZScpO1xuXG52YXIgX3Z1ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92dWUpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoJ2VsZW1lbnQtdWkvbGliL3V0aWxzL2RvbScpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgaGFzTW9kYWwgPSBmYWxzZTtcbnZhciBoYXNJbml0WkluZGV4ID0gZmFsc2U7XG52YXIgekluZGV4ID0gdm9pZCAwO1xuXG52YXIgZ2V0TW9kYWwgPSBmdW5jdGlvbiBnZXRNb2RhbCgpIHtcbiAgaWYgKF92dWUyLmRlZmF1bHQucHJvdG90eXBlLiRpc1NlcnZlcikgcmV0dXJuO1xuICB2YXIgbW9kYWxEb20gPSBQb3B1cE1hbmFnZXIubW9kYWxEb207XG4gIGlmIChtb2RhbERvbSkge1xuICAgIGhhc01vZGFsID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBoYXNNb2RhbCA9IGZhbHNlO1xuICAgIG1vZGFsRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgUG9wdXBNYW5hZ2VyLm1vZGFsRG9tID0gbW9kYWxEb207XG5cbiAgICBtb2RhbERvbS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcblxuICAgIG1vZGFsRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgUG9wdXBNYW5hZ2VyLmRvT25Nb2RhbENsaWNrICYmIFBvcHVwTWFuYWdlci5kb09uTW9kYWxDbGljaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG1vZGFsRG9tO1xufTtcblxudmFyIGluc3RhbmNlcyA9IHt9O1xuXG52YXIgUG9wdXBNYW5hZ2VyID0ge1xuICBtb2RhbEZhZGU6IHRydWUsXG5cbiAgZ2V0SW5zdGFuY2U6IGZ1bmN0aW9uIGdldEluc3RhbmNlKGlkKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlc1tpZF07XG4gIH0sXG5cbiAgcmVnaXN0ZXI6IGZ1bmN0aW9uIHJlZ2lzdGVyKGlkLCBpbnN0YW5jZSkge1xuICAgIGlmIChpZCAmJiBpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2VzW2lkXSA9IGluc3RhbmNlO1xuICAgIH1cbiAgfSxcblxuICBkZXJlZ2lzdGVyOiBmdW5jdGlvbiBkZXJlZ2lzdGVyKGlkKSB7XG4gICAgaWYgKGlkKSB7XG4gICAgICBpbnN0YW5jZXNbaWRdID0gbnVsbDtcbiAgICAgIGRlbGV0ZSBpbnN0YW5jZXNbaWRdO1xuICAgIH1cbiAgfSxcblxuICBuZXh0WkluZGV4OiBmdW5jdGlvbiBuZXh0WkluZGV4KCkge1xuICAgIHJldHVybiBQb3B1cE1hbmFnZXIuekluZGV4Kys7XG4gIH0sXG5cbiAgbW9kYWxTdGFjazogW10sXG5cbiAgZG9Pbk1vZGFsQ2xpY2s6IGZ1bmN0aW9uIGRvT25Nb2RhbENsaWNrKCkge1xuICAgIHZhciB0b3BJdGVtID0gUG9wdXBNYW5hZ2VyLm1vZGFsU3RhY2tbUG9wdXBNYW5hZ2VyLm1vZGFsU3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKCF0b3BJdGVtKSByZXR1cm47XG5cbiAgICB2YXIgaW5zdGFuY2UgPSBQb3B1cE1hbmFnZXIuZ2V0SW5zdGFuY2UodG9wSXRlbS5pZCk7XG4gICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmNsb3NlT25DbGlja01vZGFsKSB7XG4gICAgICBpbnN0YW5jZS5jbG9zZSgpO1xuICAgIH1cbiAgfSxcblxuICBvcGVuTW9kYWw6IGZ1bmN0aW9uIG9wZW5Nb2RhbChpZCwgekluZGV4LCBkb20sIG1vZGFsQ2xhc3MsIG1vZGFsRmFkZSkge1xuICAgIGlmIChfdnVlMi5kZWZhdWx0LnByb3RvdHlwZS4kaXNTZXJ2ZXIpIHJldHVybjtcbiAgICBpZiAoIWlkIHx8IHpJbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5tb2RhbEZhZGUgPSBtb2RhbEZhZGU7XG5cbiAgICB2YXIgbW9kYWxTdGFjayA9IHRoaXMubW9kYWxTdGFjaztcblxuICAgIGZvciAodmFyIGkgPSAwLCBqID0gbW9kYWxTdGFjay5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gbW9kYWxTdGFja1tpXTtcbiAgICAgIGlmIChpdGVtLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1vZGFsRG9tID0gZ2V0TW9kYWwoKTtcblxuICAgICgwLCBfZG9tLmFkZENsYXNzKShtb2RhbERvbSwgJ3YtbW9kYWwnKTtcbiAgICBpZiAodGhpcy5tb2RhbEZhZGUgJiYgIWhhc01vZGFsKSB7XG4gICAgICAoMCwgX2RvbS5hZGRDbGFzcykobW9kYWxEb20sICd2LW1vZGFsLWVudGVyJyk7XG4gICAgfVxuICAgIGlmIChtb2RhbENsYXNzKSB7XG4gICAgICB2YXIgY2xhc3NBcnIgPSBtb2RhbENsYXNzLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgY2xhc3NBcnIuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gKDAsIF9kb20uYWRkQ2xhc3MpKG1vZGFsRG9tLCBpdGVtKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICgwLCBfZG9tLnJlbW92ZUNsYXNzKShtb2RhbERvbSwgJ3YtbW9kYWwtZW50ZXInKTtcbiAgICB9LCAyMDApO1xuXG4gICAgaWYgKGRvbSAmJiBkb20ucGFyZW50Tm9kZSAmJiBkb20ucGFyZW50Tm9kZS5ub2RlVHlwZSAhPT0gMTEpIHtcbiAgICAgIGRvbS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG1vZGFsRG9tKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbERvbSk7XG4gICAgfVxuXG4gICAgaWYgKHpJbmRleCkge1xuICAgICAgbW9kYWxEb20uc3R5bGUuekluZGV4ID0gekluZGV4O1xuICAgIH1cbiAgICBtb2RhbERvbS50YWJJbmRleCA9IDA7XG4gICAgbW9kYWxEb20uc3R5bGUuZGlzcGxheSA9ICcnO1xuXG4gICAgdGhpcy5tb2RhbFN0YWNrLnB1c2goeyBpZDogaWQsIHpJbmRleDogekluZGV4LCBtb2RhbENsYXNzOiBtb2RhbENsYXNzIH0pO1xuICB9LFxuXG4gIGNsb3NlTW9kYWw6IGZ1bmN0aW9uIGNsb3NlTW9kYWwoaWQpIHtcbiAgICB2YXIgbW9kYWxTdGFjayA9IHRoaXMubW9kYWxTdGFjaztcbiAgICB2YXIgbW9kYWxEb20gPSBnZXRNb2RhbCgpO1xuXG4gICAgaWYgKG1vZGFsU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgdmFyIHRvcEl0ZW0gPSBtb2RhbFN0YWNrW21vZGFsU3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBpZiAodG9wSXRlbS5pZCA9PT0gaWQpIHtcbiAgICAgICAgaWYgKHRvcEl0ZW0ubW9kYWxDbGFzcykge1xuICAgICAgICAgIHZhciBjbGFzc0FyciA9IHRvcEl0ZW0ubW9kYWxDbGFzcy50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICBjbGFzc0Fyci5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gKDAsIF9kb20ucmVtb3ZlQ2xhc3MpKG1vZGFsRG9tLCBpdGVtKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZGFsU3RhY2sucG9wKCk7XG4gICAgICAgIGlmIChtb2RhbFN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtb2RhbERvbS5zdHlsZS56SW5kZXggPSBtb2RhbFN0YWNrW21vZGFsU3RhY2subGVuZ3RoIC0gMV0uekluZGV4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gbW9kYWxTdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChtb2RhbFN0YWNrW2ldLmlkID09PSBpZCkge1xuICAgICAgICAgICAgbW9kYWxTdGFjay5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kYWxTdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmICh0aGlzLm1vZGFsRmFkZSkge1xuICAgICAgICAoMCwgX2RvbS5hZGRDbGFzcykobW9kYWxEb20sICd2LW1vZGFsLWxlYXZlJyk7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG1vZGFsU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgaWYgKG1vZGFsRG9tLnBhcmVudE5vZGUpIG1vZGFsRG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobW9kYWxEb20pO1xuICAgICAgICAgIG1vZGFsRG9tLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgUG9wdXBNYW5hZ2VyLm1vZGFsRG9tID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgICgwLCBfZG9tLnJlbW92ZUNsYXNzKShtb2RhbERvbSwgJ3YtbW9kYWwtbGVhdmUnKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICB9XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUG9wdXBNYW5hZ2VyLCAnekluZGV4Jywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIGlmICghaGFzSW5pdFpJbmRleCkge1xuICAgICAgekluZGV4ID0gekluZGV4IHx8IChfdnVlMi5kZWZhdWx0LnByb3RvdHlwZS4kRUxFTUVOVCB8fCB7fSkuekluZGV4IHx8IDIwMDA7XG4gICAgICBoYXNJbml0WkluZGV4ID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHpJbmRleDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICB6SW5kZXggPSB2YWx1ZTtcbiAgfVxufSk7XG5cbnZhciBnZXRUb3BQb3B1cCA9IGZ1bmN0aW9uIGdldFRvcFBvcHVwKCkge1xuICBpZiAoX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyKSByZXR1cm47XG4gIGlmIChQb3B1cE1hbmFnZXIubW9kYWxTdGFjay5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHRvcFBvcHVwID0gUG9wdXBNYW5hZ2VyLm1vZGFsU3RhY2tbUG9wdXBNYW5hZ2VyLm1vZGFsU3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKCF0b3BQb3B1cCkgcmV0dXJuO1xuICAgIHZhciBpbnN0YW5jZSA9IFBvcHVwTWFuYWdlci5nZXRJbnN0YW5jZSh0b3BQb3B1cC5pZCk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cbn07XG5cbmlmICghX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyKSB7XG4gIC8vIGhhbmRsZSBgZXNjYCBrZXkgd2hlbiB0aGUgcG9wdXAgaXMgc2hvd25cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgIHZhciB0b3BQb3B1cCA9IGdldFRvcFBvcHVwKCk7XG5cbiAgICAgIGlmICh0b3BQb3B1cCAmJiB0b3BQb3B1cC5jbG9zZU9uUHJlc3NFc2NhcGUpIHtcbiAgICAgICAgdG9wUG9wdXAuaGFuZGxlQ2xvc2UgPyB0b3BQb3B1cC5oYW5kbGVDbG9zZSgpIDogdG9wUG9wdXAuaGFuZGxlQWN0aW9uID8gdG9wUG9wdXAuaGFuZGxlQWN0aW9uKCdjYW5jZWwnKSA6IHRvcFBvcHVwLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gUG9wdXBNYW5hZ2VyOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4b26\n")},"4e4b":function(module,exports,__webpack_require__){eval('module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: \'Module\' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, \'__esModule\', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === \'object\' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, \'default\', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != \'string\') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module[\'default\']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, \'a\', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = "/dist/";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 62);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 10:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("f3ad");\n\n/***/ }),\n\n/***/ 12:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("417f");\n\n/***/ }),\n\n/***/ 15:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("14e9");\n\n/***/ }),\n\n/***/ 16:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("4010");\n\n/***/ }),\n\n/***/ 19:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("0e15");\n\n/***/ }),\n\n/***/ 21:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("d397");\n\n/***/ }),\n\n/***/ 22:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("12f2");\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("8122");\n\n/***/ }),\n\n/***/ 31:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("2a5e");\n\n/***/ }),\n\n/***/ 33:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/option.vue?vue&type=template&id=7a44c642&\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "li",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-select-dropdown__item",\n class: {\n selected: _vm.itemSelected,\n "is-disabled": _vm.disabled || _vm.groupDisabled || _vm.limitReached,\n hover: _vm.hover\n },\n on: {\n mouseenter: _vm.hoverItem,\n click: function($event) {\n $event.stopPropagation()\n return _vm.selectOptionClick($event)\n }\n }\n },\n [_vm._t("default", [_c("span", [_vm._v(_vm._s(_vm.currentLabel))])])],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/select/src/option.vue?vue&type=template&id=7a44c642&\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/emitter"\nvar emitter_ = __webpack_require__(4);\nvar emitter_default = /*#__PURE__*/__webpack_require__.n(emitter_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/util"\nvar util_ = __webpack_require__(3);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/option.vue?vue&type=script&lang=js&\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : 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/* harmony default export */ var optionvue_type_script_lang_js_ = ({\n mixins: [emitter_default.a],\n\n name: \'ElOption\',\n\n componentName: \'ElOption\',\n\n inject: [\'select\'],\n\n props: {\n value: {\n required: true\n },\n label: [String, Number],\n created: Boolean,\n disabled: {\n type: Boolean,\n default: false\n }\n },\n\n data: function data() {\n return {\n index: -1,\n groupDisabled: false,\n visible: true,\n hitState: false,\n hover: false\n };\n },\n\n\n computed: {\n isObject: function isObject() {\n return Object.prototype.toString.call(this.value).toLowerCase() === \'[object object]\';\n },\n currentLabel: function currentLabel() {\n return this.label || (this.isObject ? \'\' : this.value);\n },\n currentValue: function currentValue() {\n return this.value || this.label || \'\';\n },\n itemSelected: function itemSelected() {\n if (!this.select.multiple) {\n return this.isEqual(this.value, this.select.value);\n } else {\n return this.contains(this.select.value, this.value);\n }\n },\n limitReached: function limitReached() {\n if (this.select.multiple) {\n return !this.itemSelected && (this.select.value || []).length >= this.select.multipleLimit && this.select.multipleLimit > 0;\n } else {\n return false;\n }\n }\n },\n\n watch: {\n currentLabel: function currentLabel() {\n if (!this.created && !this.select.remote) this.dispatch(\'ElSelect\', \'setSelected\');\n },\n value: function value(val, oldVal) {\n var _select = this.select,\n remote = _select.remote,\n valueKey = _select.valueKey;\n\n if (!this.created && !remote) {\n if (valueKey && (typeof val === \'undefined\' ? \'undefined\' : _typeof(val)) === \'object\' && (typeof oldVal === \'undefined\' ? \'undefined\' : _typeof(oldVal)) === \'object\' && val[valueKey] === oldVal[valueKey]) {\n return;\n }\n this.dispatch(\'ElSelect\', \'setSelected\');\n }\n }\n },\n\n methods: {\n isEqual: function isEqual(a, b) {\n if (!this.isObject) {\n return a === b;\n } else {\n var valueKey = this.select.valueKey;\n return Object(util_["getValueByPath"])(a, valueKey) === Object(util_["getValueByPath"])(b, valueKey);\n }\n },\n contains: function contains() {\n var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var target = arguments[1];\n\n if (!this.isObject) {\n return arr && arr.indexOf(target) > -1;\n } else {\n var valueKey = this.select.valueKey;\n return arr && arr.some(function (item) {\n return Object(util_["getValueByPath"])(item, valueKey) === Object(util_["getValueByPath"])(target, valueKey);\n });\n }\n },\n handleGroupDisabled: function handleGroupDisabled(val) {\n this.groupDisabled = val;\n },\n hoverItem: function hoverItem() {\n if (!this.disabled && !this.groupDisabled) {\n this.select.hoverIndex = this.select.options.indexOf(this);\n }\n },\n selectOptionClick: function selectOptionClick() {\n if (this.disabled !== true && this.groupDisabled !== true) {\n this.dispatch(\'ElSelect\', \'handleOptionClick\', [this, true]);\n }\n },\n queryChange: function queryChange(query) {\n this.visible = new RegExp(Object(util_["escapeRegexpString"])(query), \'i\').test(this.currentLabel) || this.created;\n if (!this.visible) {\n this.select.filteredOptionsCount--;\n }\n }\n },\n\n created: function created() {\n this.select.options.push(this);\n this.select.cachedOptions.push(this);\n this.select.optionsCount++;\n this.select.filteredOptionsCount++;\n\n this.$on(\'queryChange\', this.queryChange);\n this.$on(\'handleGroupDisabled\', this.handleGroupDisabled);\n },\n beforeDestroy: function beforeDestroy() {\n var _select2 = this.select,\n selected = _select2.selected,\n multiple = _select2.multiple;\n\n var selectedOptions = multiple ? selected : [selected];\n var index = this.select.cachedOptions.indexOf(this);\n var selectedIndex = selectedOptions.indexOf(this);\n\n // if option is not selected, remove it from cache\n if (index > -1 && selectedIndex < 0) {\n this.select.cachedOptions.splice(index, 1);\n }\n this.select.onOptionDestroy(this.select.options.indexOf(this));\n }\n});\n// CONCATENATED MODULE: ./packages/select/src/option.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_optionvue_type_script_lang_js_ = (optionvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/select/src/option.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer["a" /* default */])(\n src_optionvue_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 api; }\ncomponent.options.__file = "packages/select/src/option.vue"\n/* harmony default export */ var src_option = __webpack_exports__["a"] = (component.exports);\n\n/***/ }),\n\n/***/ 38:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("8bbc");\n\n/***/ }),\n\n/***/ 4:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("d010");\n\n/***/ }),\n\n/***/ 5:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("e974");\n\n/***/ }),\n\n/***/ 6:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("6b7c");\n\n/***/ }),\n\n/***/ 62:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select.vue?vue&type=template&id=0e4aade6&\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 directives: [\n {\n name: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.handleClose,\n expression: "handleClose"\n }\n ],\n staticClass: "el-select",\n class: [_vm.selectSize ? "el-select--" + _vm.selectSize : ""],\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.toggleMenu($event)\n }\n }\n },\n [\n _vm.multiple\n ? _c(\n "div",\n {\n ref: "tags",\n staticClass: "el-select__tags",\n style: { "max-width": _vm.inputWidth - 32 + "px", width: "100%" }\n },\n [\n _vm.collapseTags && _vm.selected.length\n ? _c(\n "span",\n [\n _c(\n "el-tag",\n {\n attrs: {\n closable: !_vm.selectDisabled,\n size: _vm.collapseTagSize,\n hit: _vm.selected[0].hitState,\n type: "info",\n "disable-transitions": ""\n },\n on: {\n close: function($event) {\n _vm.deleteTag($event, _vm.selected[0])\n }\n }\n },\n [\n _c("span", { staticClass: "el-select__tags-text" }, [\n _vm._v(_vm._s(_vm.selected[0].currentLabel))\n ])\n ]\n ),\n _vm.selected.length > 1\n ? _c(\n "el-tag",\n {\n attrs: {\n closable: false,\n size: _vm.collapseTagSize,\n type: "info",\n "disable-transitions": ""\n }\n },\n [\n _c(\n "span",\n { staticClass: "el-select__tags-text" },\n [_vm._v("+ " + _vm._s(_vm.selected.length - 1))]\n )\n ]\n )\n : _vm._e()\n ],\n 1\n )\n : _vm._e(),\n !_vm.collapseTags\n ? _c(\n "transition-group",\n { on: { "after-leave": _vm.resetInputHeight } },\n _vm._l(_vm.selected, function(item) {\n return _c(\n "el-tag",\n {\n key: _vm.getValueKey(item),\n attrs: {\n closable: !_vm.selectDisabled,\n size: _vm.collapseTagSize,\n hit: item.hitState,\n type: "info",\n "disable-transitions": ""\n },\n on: {\n close: function($event) {\n _vm.deleteTag($event, item)\n }\n }\n },\n [\n _c("span", { staticClass: "el-select__tags-text" }, [\n _vm._v(_vm._s(item.currentLabel))\n ])\n ]\n )\n }),\n 1\n )\n : _vm._e(),\n _vm.filterable\n ? _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.query,\n expression: "query"\n }\n ],\n ref: "input",\n staticClass: "el-select__input",\n class: [_vm.selectSize ? "is-" + _vm.selectSize : ""],\n style: {\n "flex-grow": "1",\n width: _vm.inputLength / (_vm.inputWidth - 32) + "%",\n "max-width": _vm.inputWidth - 42 + "px"\n },\n attrs: {\n type: "text",\n disabled: _vm.selectDisabled,\n autocomplete: _vm.autoComplete || _vm.autocomplete\n },\n domProps: { value: _vm.query },\n on: {\n focus: _vm.handleFocus,\n blur: function($event) {\n _vm.softFocus = false\n },\n keyup: _vm.managePlaceholder,\n keydown: [\n _vm.resetInputState,\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "down", 40, $event.key, [\n "Down",\n "ArrowDown"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n _vm.handleNavigate("next")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "up", 38, $event.key, [\n "Up",\n "ArrowUp"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n _vm.handleNavigate("prev")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "enter",\n 13,\n $event.key,\n "Enter"\n )\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.selectOption($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "esc", 27, $event.key, [\n "Esc",\n "Escape"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.visible = false\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "delete",\n [8, 46],\n $event.key,\n ["Backspace", "Delete", "Del"]\n )\n ) {\n return null\n }\n return _vm.deletePrevTag($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "tab", 9, $event.key, "Tab")\n ) {\n return null\n }\n _vm.visible = false\n }\n ],\n compositionstart: _vm.handleComposition,\n compositionupdate: _vm.handleComposition,\n compositionend: _vm.handleComposition,\n input: [\n function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.query = $event.target.value\n },\n _vm.debouncedQueryChange\n ]\n }\n })\n : _vm._e()\n ],\n 1\n )\n : _vm._e(),\n _c(\n "el-input",\n {\n ref: "reference",\n class: { "is-focus": _vm.visible },\n attrs: {\n type: "text",\n placeholder: _vm.currentPlaceholder,\n name: _vm.name,\n id: _vm.id,\n autocomplete: _vm.autoComplete || _vm.autocomplete,\n size: _vm.selectSize,\n disabled: _vm.selectDisabled,\n readonly: _vm.readonly,\n "validate-event": false,\n tabindex: _vm.multiple && _vm.filterable ? "-1" : null\n },\n on: {\n focus: _vm.handleFocus,\n blur: _vm.handleBlur,\n input: _vm.debouncedOnInputChange,\n compositionstart: _vm.handleComposition,\n compositionupdate: _vm.handleComposition,\n compositionend: _vm.handleComposition\n },\n nativeOn: {\n keydown: [\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "down", 40, $event.key, [\n "Down",\n "ArrowDown"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.handleNavigate("next")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "up", 38, $event.key, [\n "Up",\n "ArrowUp"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.handleNavigate("prev")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.selectOption($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "esc", 27, $event.key, [\n "Esc",\n "Escape"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.visible = false\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "tab", 9, $event.key, "Tab")\n ) {\n return null\n }\n _vm.visible = false\n }\n ],\n mouseenter: function($event) {\n _vm.inputHovering = true\n },\n mouseleave: function($event) {\n _vm.inputHovering = false\n }\n },\n model: {\n value: _vm.selectedLabel,\n callback: function($$v) {\n _vm.selectedLabel = $$v\n },\n expression: "selectedLabel"\n }\n },\n [\n _vm.$slots.prefix\n ? _c("template", { slot: "prefix" }, [_vm._t("prefix")], 2)\n : _vm._e(),\n _c("template", { slot: "suffix" }, [\n _c("i", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: !_vm.showClose,\n expression: "!showClose"\n }\n ],\n class: [\n "el-select__caret",\n "el-input__icon",\n "el-icon-" + _vm.iconClass\n ]\n }),\n _vm.showClose\n ? _c("i", {\n staticClass:\n "el-select__caret el-input__icon el-icon-circle-close",\n on: { click: _vm.handleClearClick }\n })\n : _vm._e()\n ])\n ],\n 2\n ),\n _c(\n "transition",\n {\n attrs: { name: "el-zoom-in-top" },\n on: {\n "before-enter": _vm.handleMenuEnter,\n "after-leave": _vm.doDestroy\n }\n },\n [\n _c(\n "el-select-menu",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible && _vm.emptyText !== false,\n expression: "visible && emptyText !== false"\n }\n ],\n ref: "popper",\n attrs: { "append-to-body": _vm.popperAppendToBody }\n },\n [\n _c(\n "el-scrollbar",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.options.length > 0 && !_vm.loading,\n expression: "options.length > 0 && !loading"\n }\n ],\n ref: "scrollbar",\n class: {\n "is-empty":\n !_vm.allowCreate &&\n _vm.query &&\n _vm.filteredOptionsCount === 0\n },\n attrs: {\n tag: "ul",\n "wrap-class": "el-select-dropdown__wrap",\n "view-class": "el-select-dropdown__list"\n }\n },\n [\n _vm.showNewOption\n ? _c("el-option", {\n attrs: { value: _vm.query, created: "" }\n })\n : _vm._e(),\n _vm._t("default")\n ],\n 2\n ),\n _vm.emptyText &&\n (!_vm.allowCreate ||\n _vm.loading ||\n (_vm.allowCreate && _vm.options.length === 0))\n ? [\n _vm.$slots.empty\n ? _vm._t("empty")\n : _c("p", { staticClass: "el-select-dropdown__empty" }, [\n _vm._v(\n "\\n " +\n _vm._s(_vm.emptyText) +\n "\\n "\n )\n ])\n ]\n : _vm._e()\n ],\n 2\n )\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/select/src/select.vue?vue&type=template&id=0e4aade6&\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/emitter"\nvar emitter_ = __webpack_require__(4);\nvar emitter_default = /*#__PURE__*/__webpack_require__.n(emitter_);\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/focus"\nvar focus_ = __webpack_require__(22);\nvar focus_default = /*#__PURE__*/__webpack_require__.n(focus_);\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/locale"\nvar locale_ = __webpack_require__(6);\nvar locale_default = /*#__PURE__*/__webpack_require__.n(locale_);\n\n// EXTERNAL MODULE: external "element-ui/lib/input"\nvar input_ = __webpack_require__(10);\nvar input_default = /*#__PURE__*/__webpack_require__.n(input_);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select-dropdown.vue?vue&type=template&id=06828748&\nvar select_dropdownvue_type_template_id_06828748_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 staticClass: "el-select-dropdown el-popper",\n class: [{ "is-multiple": _vm.$parent.multiple }, _vm.popperClass],\n style: { minWidth: _vm.minWidth }\n },\n [_vm._t("default")],\n 2\n )\n}\nvar select_dropdownvue_type_template_id_06828748_staticRenderFns = []\nselect_dropdownvue_type_template_id_06828748_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/select/src/select-dropdown.vue?vue&type=template&id=06828748&\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/vue-popper"\nvar vue_popper_ = __webpack_require__(5);\nvar vue_popper_default = /*#__PURE__*/__webpack_require__.n(vue_popper_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select-dropdown.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ var select_dropdownvue_type_script_lang_js_ = ({\n name: \'ElSelectDropdown\',\n\n componentName: \'ElSelectDropdown\',\n\n mixins: [vue_popper_default.a],\n\n props: {\n placement: {\n default: \'bottom-start\'\n },\n\n boundariesPadding: {\n default: 0\n },\n\n popperOptions: {\n default: function _default() {\n return {\n gpuAcceleration: false\n };\n }\n },\n\n visibleArrow: {\n default: true\n },\n\n appendToBody: {\n type: Boolean,\n default: true\n }\n },\n\n data: function data() {\n return {\n minWidth: \'\'\n };\n },\n\n\n computed: {\n popperClass: function popperClass() {\n return this.$parent.popperClass;\n }\n },\n\n watch: {\n \'$parent.inputWidth\': function $parentInputWidth() {\n this.minWidth = this.$parent.$el.getBoundingClientRect().width + \'px\';\n }\n },\n\n mounted: function mounted() {\n var _this = this;\n\n this.referenceElm = this.$parent.$refs.reference.$el;\n this.$parent.popperElm = this.popperElm = this.$el;\n this.$on(\'updatePopper\', function () {\n if (_this.$parent.visible) _this.updatePopper();\n });\n this.$on(\'destroyPopper\', this.destroyPopper);\n }\n});\n// CONCATENATED MODULE: ./packages/select/src/select-dropdown.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_select_dropdownvue_type_script_lang_js_ = (select_dropdownvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/select/src/select-dropdown.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer["a" /* default */])(\n src_select_dropdownvue_type_script_lang_js_,\n select_dropdownvue_type_template_id_06828748_render,\n select_dropdownvue_type_template_id_06828748_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = "packages/select/src/select-dropdown.vue"\n/* harmony default export */ var select_dropdown = (component.exports);\n// EXTERNAL MODULE: ./packages/select/src/option.vue + 4 modules\nvar src_option = __webpack_require__(33);\n\n// EXTERNAL MODULE: external "element-ui/lib/tag"\nvar tag_ = __webpack_require__(38);\nvar tag_default = /*#__PURE__*/__webpack_require__.n(tag_);\n\n// EXTERNAL MODULE: external "element-ui/lib/scrollbar"\nvar scrollbar_ = __webpack_require__(15);\nvar scrollbar_default = /*#__PURE__*/__webpack_require__.n(scrollbar_);\n\n// EXTERNAL MODULE: external "throttle-debounce/debounce"\nvar debounce_ = __webpack_require__(19);\nvar debounce_default = /*#__PURE__*/__webpack_require__.n(debounce_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/clickoutside"\nvar clickoutside_ = __webpack_require__(12);\nvar clickoutside_default = /*#__PURE__*/__webpack_require__.n(clickoutside_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/resize-event"\nvar resize_event_ = __webpack_require__(16);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/scroll-into-view"\nvar scroll_into_view_ = __webpack_require__(31);\nvar scroll_into_view_default = /*#__PURE__*/__webpack_require__.n(scroll_into_view_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/util"\nvar util_ = __webpack_require__(3);\n\n// CONCATENATED MODULE: ./packages/select/src/navigation-mixin.js\n/* harmony default export */ var navigation_mixin = ({\n data: function data() {\n return {\n hoverOption: -1\n };\n },\n\n\n computed: {\n optionsAllDisabled: function optionsAllDisabled() {\n return this.options.filter(function (option) {\n return option.visible;\n }).every(function (option) {\n return option.disabled;\n });\n }\n },\n\n watch: {\n hoverIndex: function hoverIndex(val) {\n var _this = this;\n\n if (typeof val === \'number\' && val > -1) {\n this.hoverOption = this.options[val] || {};\n }\n this.options.forEach(function (option) {\n option.hover = _this.hoverOption === option;\n });\n }\n },\n\n methods: {\n navigateOptions: function navigateOptions(direction) {\n var _this2 = this;\n\n if (!this.visible) {\n this.visible = true;\n return;\n }\n if (this.options.length === 0 || this.filteredOptionsCount === 0) return;\n if (!this.optionsAllDisabled) {\n if (direction === \'next\') {\n this.hoverIndex++;\n if (this.hoverIndex === this.options.length) {\n this.hoverIndex = 0;\n }\n } else if (direction === \'prev\') {\n this.hoverIndex--;\n if (this.hoverIndex < 0) {\n this.hoverIndex = this.options.length - 1;\n }\n }\n var option = this.options[this.hoverIndex];\n if (option.disabled === true || option.groupDisabled === true || !option.visible) {\n this.navigateOptions(direction);\n }\n this.$nextTick(function () {\n return _this2.scrollToOption(_this2.hoverOption);\n });\n }\n }\n }\n});\n// EXTERNAL MODULE: external "element-ui/lib/utils/shared"\nvar shared_ = __webpack_require__(21);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ var selectvue_type_script_lang_js_ = ({\n mixins: [emitter_default.a, locale_default.a, focus_default()(\'reference\'), navigation_mixin],\n\n name: \'ElSelect\',\n\n componentName: \'ElSelect\',\n\n inject: {\n elForm: {\n default: \'\'\n },\n\n elFormItem: {\n default: \'\'\n }\n },\n\n provide: function provide() {\n return {\n \'select\': this\n };\n },\n\n\n computed: {\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n readonly: function readonly() {\n return !this.filterable || this.multiple || !Object(util_["isIE"])() && !Object(util_["isEdge"])() && !this.visible;\n },\n showClose: function showClose() {\n var hasValue = this.multiple ? Array.isArray(this.value) && this.value.length > 0 : this.value !== undefined && this.value !== null && this.value !== \'\';\n var criteria = this.clearable && !this.selectDisabled && this.inputHovering && hasValue;\n return criteria;\n },\n iconClass: function iconClass() {\n return this.remote && this.filterable ? \'\' : this.visible ? \'arrow-up is-reverse\' : \'arrow-up\';\n },\n debounce: function debounce() {\n return this.remote ? 300 : 0;\n },\n emptyText: function emptyText() {\n if (this.loading) {\n return this.loadingText || this.t(\'el.select.loading\');\n } else {\n if (this.remote && this.query === \'\' && this.options.length === 0) return false;\n if (this.filterable && this.query && this.options.length > 0 && this.filteredOptionsCount === 0) {\n return this.noMatchText || this.t(\'el.select.noMatch\');\n }\n if (this.options.length === 0) {\n return this.noDataText || this.t(\'el.select.noData\');\n }\n }\n return null;\n },\n showNewOption: function showNewOption() {\n var _this = this;\n\n var hasExistingOption = this.options.filter(function (option) {\n return !option.created;\n }).some(function (option) {\n return option.currentLabel === _this.query;\n });\n return this.filterable && this.allowCreate && this.query !== \'\' && !hasExistingOption;\n },\n selectSize: function selectSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n selectDisabled: function selectDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n },\n collapseTagSize: function collapseTagSize() {\n return [\'small\', \'mini\'].indexOf(this.selectSize) > -1 ? \'mini\' : \'small\';\n },\n propPlaceholder: function propPlaceholder() {\n return typeof this.placeholder !== \'undefined\' ? this.placeholder : this.t(\'el.select.placeholder\');\n }\n },\n\n components: {\n ElInput: input_default.a,\n ElSelectMenu: select_dropdown,\n ElOption: src_option["a" /* default */],\n ElTag: tag_default.a,\n ElScrollbar: scrollbar_default.a\n },\n\n directives: { Clickoutside: clickoutside_default.a },\n\n props: {\n name: String,\n id: String,\n value: {\n required: true\n },\n autocomplete: {\n type: String,\n default: \'off\'\n },\n /** @Deprecated in next major version */\n autoComplete: {\n type: String,\n validator: function validator(val) {\n false && false;\n return true;\n }\n },\n automaticDropdown: Boolean,\n size: String,\n disabled: Boolean,\n clearable: Boolean,\n filterable: Boolean,\n allowCreate: Boolean,\n loading: Boolean,\n popperClass: String,\n remote: Boolean,\n loadingText: String,\n noMatchText: String,\n noDataText: String,\n remoteMethod: Function,\n filterMethod: Function,\n multiple: Boolean,\n multipleLimit: {\n type: Number,\n default: 0\n },\n placeholder: {\n type: String,\n required: false\n },\n defaultFirstOption: Boolean,\n reserveKeyword: Boolean,\n valueKey: {\n type: String,\n default: \'value\'\n },\n collapseTags: Boolean,\n popperAppendToBody: {\n type: Boolean,\n default: true\n }\n },\n\n data: function data() {\n return {\n options: [],\n cachedOptions: [],\n createdLabel: null,\n createdSelected: false,\n selected: this.multiple ? [] : {},\n inputLength: 20,\n inputWidth: 0,\n initialInputHeight: 0,\n cachedPlaceHolder: \'\',\n optionsCount: 0,\n filteredOptionsCount: 0,\n visible: false,\n softFocus: false,\n selectedLabel: \'\',\n hoverIndex: -1,\n query: \'\',\n previousQuery: null,\n inputHovering: false,\n currentPlaceholder: \'\',\n menuVisibleOnFocus: false,\n isOnComposition: false,\n isSilentBlur: false\n };\n },\n\n\n watch: {\n selectDisabled: function selectDisabled() {\n var _this2 = this;\n\n this.$nextTick(function () {\n _this2.resetInputHeight();\n });\n },\n propPlaceholder: function propPlaceholder(val) {\n this.cachedPlaceHolder = this.currentPlaceholder = val;\n },\n value: function value(val, oldVal) {\n if (this.multiple) {\n this.resetInputHeight();\n if (val && val.length > 0 || this.$refs.input && this.query !== \'\') {\n this.currentPlaceholder = \'\';\n } else {\n this.currentPlaceholder = this.cachedPlaceHolder;\n }\n if (this.filterable && !this.reserveKeyword) {\n this.query = \'\';\n this.handleQueryChange(this.query);\n }\n }\n this.setSelected();\n if (this.filterable && !this.multiple) {\n this.inputLength = 20;\n }\n if (!Object(util_["valueEquals"])(val, oldVal)) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', val);\n }\n },\n visible: function visible(val) {\n var _this3 = this;\n\n if (!val) {\n this.broadcast(\'ElSelectDropdown\', \'destroyPopper\');\n if (this.$refs.input) {\n this.$refs.input.blur();\n }\n this.query = \'\';\n this.previousQuery = null;\n this.selectedLabel = \'\';\n this.inputLength = 20;\n this.menuVisibleOnFocus = false;\n this.resetHoverIndex();\n this.$nextTick(function () {\n if (_this3.$refs.input && _this3.$refs.input.value === \'\' && _this3.selected.length === 0) {\n _this3.currentPlaceholder = _this3.cachedPlaceHolder;\n }\n });\n if (!this.multiple) {\n if (this.selected) {\n if (this.filterable && this.allowCreate && this.createdSelected && this.createdLabel) {\n this.selectedLabel = this.createdLabel;\n } else {\n this.selectedLabel = this.selected.currentLabel;\n }\n if (this.filterable) this.query = this.selectedLabel;\n }\n\n if (this.filterable) {\n this.currentPlaceholder = this.cachedPlaceHolder;\n }\n }\n } else {\n this.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n if (this.filterable) {\n this.query = this.remote ? \'\' : this.selectedLabel;\n this.handleQueryChange(this.query);\n if (this.multiple) {\n this.$refs.input.focus();\n } else {\n if (!this.remote) {\n this.broadcast(\'ElOption\', \'queryChange\', \'\');\n this.broadcast(\'ElOptionGroup\', \'queryChange\');\n }\n\n if (this.selectedLabel) {\n this.currentPlaceholder = this.selectedLabel;\n this.selectedLabel = \'\';\n }\n }\n }\n }\n this.$emit(\'visible-change\', val);\n },\n options: function options() {\n var _this4 = this;\n\n if (this.$isServer) return;\n this.$nextTick(function () {\n _this4.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n });\n if (this.multiple) {\n this.resetInputHeight();\n }\n var inputs = this.$el.querySelectorAll(\'input\');\n if ([].indexOf.call(inputs, document.activeElement) === -1) {\n this.setSelected();\n }\n if (this.defaultFirstOption && (this.filterable || this.remote) && this.filteredOptionsCount) {\n this.checkDefaultFirstOption();\n }\n }\n },\n\n methods: {\n handleNavigate: function handleNavigate(direction) {\n if (this.isOnComposition) return;\n\n this.navigateOptions(direction);\n },\n handleComposition: function handleComposition(event) {\n var _this5 = this;\n\n var text = event.target.value;\n if (event.type === \'compositionend\') {\n this.isOnComposition = false;\n this.$nextTick(function (_) {\n return _this5.handleQueryChange(text);\n });\n } else {\n var lastCharacter = text[text.length - 1] || \'\';\n this.isOnComposition = !Object(shared_["isKorean"])(lastCharacter);\n }\n },\n handleQueryChange: function handleQueryChange(val) {\n var _this6 = this;\n\n if (this.previousQuery === val || this.isOnComposition) return;\n if (this.previousQuery === null && (typeof this.filterMethod === \'function\' || typeof this.remoteMethod === \'function\')) {\n this.previousQuery = val;\n return;\n }\n this.previousQuery = val;\n this.$nextTick(function () {\n if (_this6.visible) _this6.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n });\n this.hoverIndex = -1;\n if (this.multiple && this.filterable) {\n this.$nextTick(function () {\n var length = _this6.$refs.input.value.length * 15 + 20;\n _this6.inputLength = _this6.collapseTags ? Math.min(50, length) : length;\n _this6.managePlaceholder();\n _this6.resetInputHeight();\n });\n }\n if (this.remote && typeof this.remoteMethod === \'function\') {\n this.hoverIndex = -1;\n this.remoteMethod(val);\n } else if (typeof this.filterMethod === \'function\') {\n this.filterMethod(val);\n this.broadcast(\'ElOptionGroup\', \'queryChange\');\n } else {\n this.filteredOptionsCount = this.optionsCount;\n this.broadcast(\'ElOption\', \'queryChange\', val);\n this.broadcast(\'ElOptionGroup\', \'queryChange\');\n }\n if (this.defaultFirstOption && (this.filterable || this.remote) && this.filteredOptionsCount) {\n this.checkDefaultFirstOption();\n }\n },\n scrollToOption: function scrollToOption(option) {\n var target = Array.isArray(option) && option[0] ? option[0].$el : option.$el;\n if (this.$refs.popper && target) {\n var menu = this.$refs.popper.$el.querySelector(\'.el-select-dropdown__wrap\');\n scroll_into_view_default()(menu, target);\n }\n this.$refs.scrollbar && this.$refs.scrollbar.handleScroll();\n },\n handleMenuEnter: function handleMenuEnter() {\n var _this7 = this;\n\n this.$nextTick(function () {\n return _this7.scrollToOption(_this7.selected);\n });\n },\n emitChange: function emitChange(val) {\n if (!Object(util_["valueEquals"])(this.value, val)) {\n this.$emit(\'change\', val);\n }\n },\n getOption: function getOption(value) {\n var option = void 0;\n var isObject = Object.prototype.toString.call(value).toLowerCase() === \'[object object]\';\n var isNull = Object.prototype.toString.call(value).toLowerCase() === \'[object null]\';\n var isUndefined = Object.prototype.toString.call(value).toLowerCase() === \'[object undefined]\';\n\n for (var i = this.cachedOptions.length - 1; i >= 0; i--) {\n var cachedOption = this.cachedOptions[i];\n var isEqual = isObject ? Object(util_["getValueByPath"])(cachedOption.value, this.valueKey) === Object(util_["getValueByPath"])(value, this.valueKey) : cachedOption.value === value;\n if (isEqual) {\n option = cachedOption;\n break;\n }\n }\n if (option) return option;\n var label = !isObject && !isNull && !isUndefined ? String(value) : \'\';\n var newOption = {\n value: value,\n currentLabel: label\n };\n if (this.multiple) {\n newOption.hitState = false;\n }\n return newOption;\n },\n setSelected: function setSelected() {\n var _this8 = this;\n\n if (!this.multiple) {\n var option = this.getOption(this.value);\n if (option.created) {\n this.createdLabel = option.currentLabel;\n this.createdSelected = true;\n } else {\n this.createdSelected = false;\n }\n this.selectedLabel = option.currentLabel;\n this.selected = option;\n if (this.filterable) this.query = this.selectedLabel;\n return;\n }\n var result = [];\n if (Array.isArray(this.value)) {\n this.value.forEach(function (value) {\n result.push(_this8.getOption(value));\n });\n }\n this.selected = result;\n this.$nextTick(function () {\n _this8.resetInputHeight();\n });\n },\n handleFocus: function handleFocus(event) {\n if (!this.softFocus) {\n if (this.automaticDropdown || this.filterable) {\n if (this.filterable && !this.visible) {\n this.menuVisibleOnFocus = true;\n }\n this.visible = true;\n }\n this.$emit(\'focus\', event);\n } else {\n this.softFocus = false;\n }\n },\n blur: function blur() {\n this.visible = false;\n this.$refs.reference.blur();\n },\n handleBlur: function handleBlur(event) {\n var _this9 = this;\n\n setTimeout(function () {\n if (_this9.isSilentBlur) {\n _this9.isSilentBlur = false;\n } else {\n _this9.$emit(\'blur\', event);\n }\n }, 50);\n this.softFocus = false;\n },\n handleClearClick: function handleClearClick(event) {\n this.deleteSelected(event);\n },\n doDestroy: function doDestroy() {\n this.$refs.popper && this.$refs.popper.doDestroy();\n },\n handleClose: function handleClose() {\n this.visible = false;\n },\n toggleLastOptionHitState: function toggleLastOptionHitState(hit) {\n if (!Array.isArray(this.selected)) return;\n var option = this.selected[this.selected.length - 1];\n if (!option) return;\n\n if (hit === true || hit === false) {\n option.hitState = hit;\n return hit;\n }\n\n option.hitState = !option.hitState;\n return option.hitState;\n },\n deletePrevTag: function deletePrevTag(e) {\n if (e.target.value.length <= 0 && !this.toggleLastOptionHitState()) {\n var value = this.value.slice();\n value.pop();\n this.$emit(\'input\', value);\n this.emitChange(value);\n }\n },\n managePlaceholder: function managePlaceholder() {\n if (this.currentPlaceholder !== \'\') {\n this.currentPlaceholder = this.$refs.input.value ? \'\' : this.cachedPlaceHolder;\n }\n },\n resetInputState: function resetInputState(e) {\n if (e.keyCode !== 8) this.toggleLastOptionHitState(false);\n this.inputLength = this.$refs.input.value.length * 15 + 20;\n this.resetInputHeight();\n },\n resetInputHeight: function resetInputHeight() {\n var _this10 = this;\n\n if (this.collapseTags && !this.filterable) return;\n this.$nextTick(function () {\n if (!_this10.$refs.reference) return;\n var inputChildNodes = _this10.$refs.reference.$el.childNodes;\n var input = [].filter.call(inputChildNodes, function (item) {\n return item.tagName === \'INPUT\';\n })[0];\n var tags = _this10.$refs.tags;\n var tagsHeight = tags ? Math.round(tags.getBoundingClientRect().height) : 0;\n var sizeInMap = _this10.initialInputHeight || 40;\n input.style.height = _this10.selected.length === 0 ? sizeInMap + \'px\' : Math.max(tags ? tagsHeight + (tagsHeight > sizeInMap ? 6 : 0) : 0, sizeInMap) + \'px\';\n if (_this10.visible && _this10.emptyText !== false) {\n _this10.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n }\n });\n },\n resetHoverIndex: function resetHoverIndex() {\n var _this11 = this;\n\n setTimeout(function () {\n if (!_this11.multiple) {\n _this11.hoverIndex = _this11.options.indexOf(_this11.selected);\n } else {\n if (_this11.selected.length > 0) {\n _this11.hoverIndex = Math.min.apply(null, _this11.selected.map(function (item) {\n return _this11.options.indexOf(item);\n }));\n } else {\n _this11.hoverIndex = -1;\n }\n }\n }, 300);\n },\n handleOptionSelect: function handleOptionSelect(option, byClick) {\n var _this12 = this;\n\n if (this.multiple) {\n var value = (this.value || []).slice();\n var optionIndex = this.getValueIndex(value, option.value);\n if (optionIndex > -1) {\n value.splice(optionIndex, 1);\n } else if (this.multipleLimit <= 0 || value.length < this.multipleLimit) {\n value.push(option.value);\n }\n this.$emit(\'input\', value);\n this.emitChange(value);\n if (option.created) {\n this.query = \'\';\n this.handleQueryChange(\'\');\n this.inputLength = 20;\n }\n if (this.filterable) this.$refs.input.focus();\n } else {\n this.$emit(\'input\', option.value);\n this.emitChange(option.value);\n this.visible = false;\n }\n this.isSilentBlur = byClick;\n this.setSoftFocus();\n if (this.visible) return;\n this.$nextTick(function () {\n _this12.scrollToOption(option);\n });\n },\n setSoftFocus: function setSoftFocus() {\n this.softFocus = true;\n var input = this.$refs.input || this.$refs.reference;\n if (input) {\n input.focus();\n }\n },\n getValueIndex: function getValueIndex() {\n var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var value = arguments[1];\n\n var isObject = Object.prototype.toString.call(value).toLowerCase() === \'[object object]\';\n if (!isObject) {\n return arr.indexOf(value);\n } else {\n var valueKey = this.valueKey;\n var index = -1;\n arr.some(function (item, i) {\n if (Object(util_["getValueByPath"])(item, valueKey) === Object(util_["getValueByPath"])(value, valueKey)) {\n index = i;\n return true;\n }\n return false;\n });\n return index;\n }\n },\n toggleMenu: function toggleMenu() {\n if (!this.selectDisabled) {\n if (this.menuVisibleOnFocus) {\n this.menuVisibleOnFocus = false;\n } else {\n this.visible = !this.visible;\n }\n if (this.visible) {\n (this.$refs.input || this.$refs.reference).focus();\n }\n }\n },\n selectOption: function selectOption() {\n if (!this.visible) {\n this.toggleMenu();\n } else {\n if (this.options[this.hoverIndex]) {\n this.handleOptionSelect(this.options[this.hoverIndex]);\n }\n }\n },\n deleteSelected: function deleteSelected(event) {\n event.stopPropagation();\n var value = this.multiple ? [] : \'\';\n this.$emit(\'input\', value);\n this.emitChange(value);\n this.visible = false;\n this.$emit(\'clear\');\n },\n deleteTag: function deleteTag(event, tag) {\n var index = this.selected.indexOf(tag);\n if (index > -1 && !this.selectDisabled) {\n var value = this.value.slice();\n value.splice(index, 1);\n this.$emit(\'input\', value);\n this.emitChange(value);\n this.$emit(\'remove-tag\', tag.value);\n }\n event.stopPropagation();\n },\n onInputChange: function onInputChange() {\n if (this.filterable && this.query !== this.selectedLabel) {\n this.query = this.selectedLabel;\n this.handleQueryChange(this.query);\n }\n },\n onOptionDestroy: function onOptionDestroy(index) {\n if (index > -1) {\n this.optionsCount--;\n this.filteredOptionsCount--;\n this.options.splice(index, 1);\n }\n },\n resetInputWidth: function resetInputWidth() {\n this.inputWidth = this.$refs.reference.$el.getBoundingClientRect().width;\n },\n handleResize: function handleResize() {\n this.resetInputWidth();\n if (this.multiple) this.resetInputHeight();\n },\n checkDefaultFirstOption: function checkDefaultFirstOption() {\n this.hoverIndex = -1;\n // highlight the created option\n var hasCreated = false;\n for (var i = this.options.length - 1; i >= 0; i--) {\n if (this.options[i].created) {\n hasCreated = true;\n this.hoverIndex = i;\n break;\n }\n }\n if (hasCreated) return;\n for (var _i = 0; _i !== this.options.length; ++_i) {\n var option = this.options[_i];\n if (this.query) {\n // highlight first options that passes the filter\n if (!option.disabled && !option.groupDisabled && option.visible) {\n this.hoverIndex = _i;\n break;\n }\n } else {\n // highlight currently selected option\n if (option.itemSelected) {\n this.hoverIndex = _i;\n break;\n }\n }\n }\n },\n getValueKey: function getValueKey(item) {\n if (Object.prototype.toString.call(item.value).toLowerCase() !== \'[object object]\') {\n return item.value;\n } else {\n return Object(util_["getValueByPath"])(item.value, this.valueKey);\n }\n }\n },\n\n created: function created() {\n var _this13 = this;\n\n this.cachedPlaceHolder = this.currentPlaceholder = this.propPlaceholder;\n if (this.multiple && !Array.isArray(this.value)) {\n this.$emit(\'input\', []);\n }\n if (!this.multiple && Array.isArray(this.value)) {\n this.$emit(\'input\', \'\');\n }\n\n this.debouncedOnInputChange = debounce_default()(this.debounce, function () {\n _this13.onInputChange();\n });\n\n this.debouncedQueryChange = debounce_default()(this.debounce, function (e) {\n _this13.handleQueryChange(e.target.value);\n });\n\n this.$on(\'handleOptionClick\', this.handleOptionSelect);\n this.$on(\'setSelected\', this.setSelected);\n },\n mounted: function mounted() {\n var _this14 = this;\n\n if (this.multiple && Array.isArray(this.value) && this.value.length > 0) {\n this.currentPlaceholder = \'\';\n }\n Object(resize_event_["addResizeListener"])(this.$el, this.handleResize);\n\n var reference = this.$refs.reference;\n if (reference && reference.$el) {\n var sizeMap = {\n medium: 36,\n small: 32,\n mini: 28\n };\n var input = reference.$el.querySelector(\'input\');\n this.initialInputHeight = input.getBoundingClientRect().height || sizeMap[this.selectSize];\n }\n if (this.remote && this.multiple) {\n this.resetInputHeight();\n }\n this.$nextTick(function () {\n if (reference && reference.$el) {\n _this14.inputWidth = reference.$el.getBoundingClientRect().width;\n }\n });\n this.setSelected();\n },\n beforeDestroy: function beforeDestroy() {\n if (this.$el && this.handleResize) Object(resize_event_["removeResizeListener"])(this.$el, this.handleResize);\n }\n});\n// CONCATENATED MODULE: ./packages/select/src/select.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_selectvue_type_script_lang_js_ = (selectvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/select/src/select.vue\n\n\n\n\n\n/* normalize component */\n\nvar select_component = Object(componentNormalizer["a" /* default */])(\n src_selectvue_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 select_api; }\nselect_component.options.__file = "packages/select/src/select.vue"\n/* harmony default export */ var src_select = (select_component.exports);\n// CONCATENATED MODULE: ./packages/select/index.js\n\n\n/* istanbul ignore next */\nsrc_select.install = function (Vue) {\n Vue.component(src_select.name, src_select);\n};\n\n/* harmony default export */ var packages_select = __webpack_exports__["default"] = (src_select);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvc2VsZWN0LmpzPzRlNGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsZ0NBQWdDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxrQkFBa0I7QUFDbEY7QUFDQSx5REFBeUQsY0FBYztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQ0FBaUM7QUFDbEYsd0hBQXdILG1CQUFtQixFQUFFO0FBQzdJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQkFBMEIsRUFBRTtBQUMvRCx5Q0FBeUMsZUFBZTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtEQUErRDtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwyRkFBMkYsMkJBQTJCLEVBQUU7QUFDeEg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBc0I7O0FBRS9DLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUFtQzs7QUFFNUQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQTBCOztBQUVuRCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBbUM7O0FBRTVELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUE0Qjs7QUFFckQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQTZCOztBQUV0RCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBNkI7O0FBRXRELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUEyQjs7QUFFcEQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQXVDOztBQUVoRSxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvR0FBb0csbUJBQW1CLEVBQUUsbUJBQW1CLDhIQUE4SDs7QUFFMVE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSx3RztBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBb0I7O0FBRTdDLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUErQjs7QUFFeEQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQWlDOztBQUUxRCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBOEI7O0FBRXZELE9BQU87O0FBRVA7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0Esc0NBQXNDLHNDQUFzQztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxzQ0FBc0M7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sc0NBQXNDLEVBQUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0Esc0NBQXNDLHNDQUFzQztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLCtCQUErQixtQkFBbUI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSw4QkFBOEIsaUJBQWlCO0FBQy9DO0FBQ0EsMEJBQTBCLGlCQUFpQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMkNBQTJDO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHNDQUFzQztBQUNyRCxjQUFjO0FBQ2QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwSDtBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBLG1DQUFtQztBQUNuQyxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQSxzRUFBc0U7QUFDdEUsS0FBSztBQUNMO0FBQ0EsZ0RBQWdEO0FBQ2hELEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxlQUFlLHVDQUF1Qzs7QUFFdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE1BQUssSUFBSSxLQUFLO0FBQ3ZCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpREFBaUQsUUFBUTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw0QkFBNEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSx3RztBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxtQkFBbUI7QUFDOUI7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPOztBQUVQLFVBQVUiLCJmaWxlIjoiNGU0Yi5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC9cIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNjIpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoe1xuXG4vKioqLyAwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gbm9ybWFsaXplQ29tcG9uZW50OyB9KTtcbi8qIGdsb2JhbHMgX19WVUVfU1NSX0NPTlRFWFRfXyAqL1xuXG4vLyBJTVBPUlRBTlQ6IERvIE5PVCB1c2UgRVMyMDE1IGZlYXR1cmVzIGluIHRoaXMgZmlsZSAoZXhjZXB0IGZvciBtb2R1bGVzKS5cbi8vIFRoaXMgbW9kdWxlIGlzIGEgcnVudGltZSB1dGlsaXR5IGZvciBjbGVhbmVyIGNvbXBvbmVudCBtb2R1bGUgb3V0cHV0IGFuZCB3aWxsXG4vLyBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgd2VicGFjayB1c2VyIGJ1bmRsZS5cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50IChcbiAgc2NyaXB0RXhwb3J0cyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZ1bmN0aW9uYWxUZW1wbGF0ZSxcbiAgaW5qZWN0U3R5bGVzLFxuICBzY29wZUlkLFxuICBtb2R1bGVJZGVudGlmaWVyLCAvKiBzZXJ2ZXIgb25seSAqL1xuICBzaGFkb3dNb2RlIC8qIHZ1ZS1jbGkgb25seSAqL1xuKSB7XG4gIC8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3BcbiAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2NyaXB0RXhwb3J0cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2NyaXB0RXhwb3J0cy5vcHRpb25zXG4gICAgOiBzY3JpcHRFeHBvcnRzXG5cbiAgLy8gcmVuZGVyIGZ1bmN0aW9uc1xuICBpZiAocmVuZGVyKSB7XG4gICAgb3B0aW9ucy5yZW5kZXIgPSByZW5kZXJcbiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IHN0YXRpY1JlbmRlckZuc1xuICAgIG9wdGlvbnMuX2NvbXBpbGVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gZnVuY3Rpb25hbCB0ZW1wbGF0ZVxuICBpZiAoZnVuY3Rpb25hbFRlbXBsYXRlKSB7XG4gICAgb3B0aW9ucy5mdW5jdGlvbmFsID0gdHJ1ZVxuICB9XG5cbiAgLy8gc2NvcGVkSWRcbiAgaWYgKHNjb3BlSWQpIHtcbiAgICBvcHRpb25zLl9zY29wZUlkID0gJ2RhdGEtdi0nICsgc2NvcGVJZFxuICB9XG5cbiAgdmFyIGhvb2tcbiAgaWYgKG1vZHVsZUlkZW50aWZpZXIpIHsgLy8gc2VydmVyIGJ1aWxkXG4gICAgaG9vayA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAvLyAyLjMgaW5qZWN0aW9uXG4gICAgICBjb250ZXh0ID1cbiAgICAgICAgY29udGV4dCB8fCAvLyBjYWNoZWQgY2FsbFxuICAgICAgICAodGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dCkgfHwgLy8gc3RhdGVmdWxcbiAgICAgICAgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LiR2bm9kZSAmJiB0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCkgLy8gZnVuY3Rpb25hbFxuICAgICAgLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlXG4gICAgICBpZiAoIWNvbnRleHQgJiYgdHlwZW9mIF9fVlVFX1NTUl9DT05URVhUX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnRleHQgPSBfX1ZVRV9TU1JfQ09OVEVYVF9fXG4gICAgICB9XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHN0eWxlc1xuICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCBjb250ZXh0KVxuICAgICAgfVxuICAgICAgLy8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlXG4gICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykge1xuICAgICAgICBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcilcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGVcbiAgICAvLyBuZXZlciBnZXRzIGNhbGxlZFxuICAgIG9wdGlvbnMuX3NzclJlZ2lzdGVyID0gaG9va1xuICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykge1xuICAgIGhvb2sgPSBzaGFkb3dNb2RlXG4gICAgICA/IGZ1bmN0aW9uICgpIHsgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgdGhpcy4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290KSB9XG4gICAgICA6IGluamVjdFN0eWxlc1xuICB9XG5cbiAgaWYgKGhvb2spIHtcbiAgICBpZiAob3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndFxuICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgbm9ybWFsaXplclxuICAgICAgb3B0aW9ucy5faW5qZWN0U3R5bGVzID0gaG9va1xuICAgICAgLy8gcmVnaXN0ZXIgZm9yIGZ1bmN0aW9hbCBjb21wb25lbnQgaW4gdnVlIGZpbGVcbiAgICAgIHZhciBvcmlnaW5hbFJlbmRlciA9IG9wdGlvbnMucmVuZGVyXG4gICAgICBvcHRpb25zLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcldpdGhTdHlsZUluamVjdGlvbiAoaCwgY29udGV4dCkge1xuICAgICAgICBob29rLmNhbGwoY29udGV4dClcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsIGNvbnRleHQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgcmVnaXN0cmF0aW9uIGFzIGJlZm9yZUNyZWF0ZSBob29rXG4gICAgICB2YXIgZXhpc3RpbmcgPSBvcHRpb25zLmJlZm9yZUNyZWF0ZVxuICAgICAgb3B0aW9ucy5iZWZvcmVDcmVhdGUgPSBleGlzdGluZ1xuICAgICAgICA/IFtdLmNvbmNhdChleGlzdGluZywgaG9vaylcbiAgICAgICAgOiBbaG9va11cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDEwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9pbnB1dFwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDEyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9jbGlja291dHNpZGVcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAxNTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvc2Nyb2xsYmFyXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTY6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Jlc2l6ZS1ldmVudFwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDE5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ0aHJvdHRsZS1kZWJvdW5jZS9kZWJvdW5jZVwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDIxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9zaGFyZWRcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyMjpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2ZvY3VzXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvdXRpbFwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDMxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9zY3JvbGwtaW50by12aWV3XCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzM6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03YTQ0YzY0MiZcbnZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJsaVwiLFxuICAgIHtcbiAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgdmFsdWU6IF92bS52aXNpYmxlLFxuICAgICAgICAgIGV4cHJlc3Npb246IFwidmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3QtZHJvcGRvd25fX2l0ZW1cIixcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIHNlbGVjdGVkOiBfdm0uaXRlbVNlbGVjdGVkLFxuICAgICAgICBcImlzLWRpc2FibGVkXCI6IF92bS5kaXNhYmxlZCB8fCBfdm0uZ3JvdXBEaXNhYmxlZCB8fCBfdm0ubGltaXRSZWFjaGVkLFxuICAgICAgICBob3ZlcjogX3ZtLmhvdmVyXG4gICAgICB9LFxuICAgICAgb246IHtcbiAgICAgICAgbW91c2VlbnRlcjogX3ZtLmhvdmVySXRlbSxcbiAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHJldHVybiBfdm0uc2VsZWN0T3B0aW9uQ2xpY2soJGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbX3ZtLl90KFwiZGVmYXVsdFwiLCBbX2MoXCJzcGFuXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS5jdXJyZW50TGFiZWwpKV0pXSldLFxuICAgIDJcbiAgKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03YTQ0YzY0MiZcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL21peGlucy9lbWl0dGVyXCJcbnZhciBlbWl0dGVyXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG52YXIgZW1pdHRlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihlbWl0dGVyXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCJcbnZhciB1dGlsXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG9wdGlvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hXSxcblxuICBuYW1lOiAnRWxPcHRpb24nLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbE9wdGlvbicsXG5cbiAgaW5qZWN0OiBbJ3NlbGVjdCddLFxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBsYWJlbDogW1N0cmluZywgTnVtYmVyXSxcbiAgICBjcmVhdGVkOiBCb29sZWFuLFxuICAgIGRpc2FibGVkOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5kZXg6IC0xLFxuICAgICAgZ3JvdXBEaXNhYmxlZDogZmFsc2UsXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgaGl0U3RhdGU6IGZhbHNlLFxuICAgICAgaG92ZXI6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNPYmplY3Q6IGZ1bmN0aW9uIGlzT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzLnZhbHVlKS50b0xvd2VyQ2FzZSgpID09PSAnW29iamVjdCBvYmplY3RdJztcbiAgICB9LFxuICAgIGN1cnJlbnRMYWJlbDogZnVuY3Rpb24gY3VycmVudExhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFiZWwgfHwgKHRoaXMuaXNPYmplY3QgPyAnJyA6IHRoaXMudmFsdWUpO1xuICAgIH0sXG4gICAgY3VycmVudFZhbHVlOiBmdW5jdGlvbiBjdXJyZW50VmFsdWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSB8fCB0aGlzLmxhYmVsIHx8ICcnO1xuICAgIH0sXG4gICAgaXRlbVNlbGVjdGVkOiBmdW5jdGlvbiBpdGVtU2VsZWN0ZWQoKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0Lm11bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWwodGhpcy52YWx1ZSwgdGhpcy5zZWxlY3QudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbnModGhpcy5zZWxlY3QudmFsdWUsIHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbGltaXRSZWFjaGVkOiBmdW5jdGlvbiBsaW1pdFJlYWNoZWQoKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3QubXVsdGlwbGUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLml0ZW1TZWxlY3RlZCAmJiAodGhpcy5zZWxlY3QudmFsdWUgfHwgW10pLmxlbmd0aCA+PSB0aGlzLnNlbGVjdC5tdWx0aXBsZUxpbWl0ICYmIHRoaXMuc2VsZWN0Lm11bHRpcGxlTGltaXQgPiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGN1cnJlbnRMYWJlbDogZnVuY3Rpb24gY3VycmVudExhYmVsKCkge1xuICAgICAgaWYgKCF0aGlzLmNyZWF0ZWQgJiYgIXRoaXMuc2VsZWN0LnJlbW90ZSkgdGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCAnc2V0U2VsZWN0ZWQnKTtcbiAgICB9LFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZFZhbCkge1xuICAgICAgdmFyIF9zZWxlY3QgPSB0aGlzLnNlbGVjdCxcbiAgICAgICAgICByZW1vdGUgPSBfc2VsZWN0LnJlbW90ZSxcbiAgICAgICAgICB2YWx1ZUtleSA9IF9zZWxlY3QudmFsdWVLZXk7XG5cbiAgICAgIGlmICghdGhpcy5jcmVhdGVkICYmICFyZW1vdGUpIHtcbiAgICAgICAgaWYgKHZhbHVlS2V5ICYmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWwpKSA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiBvbGRWYWwgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9sZFZhbCkpID09PSAnb2JqZWN0JyAmJiB2YWxbdmFsdWVLZXldID09PSBvbGRWYWxbdmFsdWVLZXldKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsU2VsZWN0JywgJ3NldFNlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBpc0VxdWFsOiBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgICAgIGlmICghdGhpcy5pc09iamVjdCkge1xuICAgICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB2YWx1ZUtleSA9IHRoaXMuc2VsZWN0LnZhbHVlS2V5O1xuICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGEsIHZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGIsIHZhbHVlS2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbnRhaW5zOiBmdW5jdGlvbiBjb250YWlucygpIHtcbiAgICAgIHZhciBhcnIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICAgICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKCF0aGlzLmlzT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBhcnIgJiYgYXJyLmluZGV4T2YodGFyZ2V0KSA+IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHZhbHVlS2V5ID0gdGhpcy5zZWxlY3QudmFsdWVLZXk7XG4gICAgICAgIHJldHVybiBhcnIgJiYgYXJyLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGl0ZW0sIHZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKHRhcmdldCwgdmFsdWVLZXkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUdyb3VwRGlzYWJsZWQ6IGZ1bmN0aW9uIGhhbmRsZUdyb3VwRGlzYWJsZWQodmFsKSB7XG4gICAgICB0aGlzLmdyb3VwRGlzYWJsZWQgPSB2YWw7XG4gICAgfSxcbiAgICBob3Zlckl0ZW06IGZ1bmN0aW9uIGhvdmVySXRlbSgpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5ncm91cERpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LmhvdmVySW5kZXggPSB0aGlzLnNlbGVjdC5vcHRpb25zLmluZGV4T2YodGhpcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZWxlY3RPcHRpb25DbGljazogZnVuY3Rpb24gc2VsZWN0T3B0aW9uQ2xpY2soKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSAmJiB0aGlzLmdyb3VwRGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCAnaGFuZGxlT3B0aW9uQ2xpY2snLCBbdGhpcywgdHJ1ZV0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlDaGFuZ2U6IGZ1bmN0aW9uIHF1ZXJ5Q2hhbmdlKHF1ZXJ5KSB7XG4gICAgICB0aGlzLnZpc2libGUgPSBuZXcgUmVnRXhwKE9iamVjdCh1dGlsX1tcImVzY2FwZVJlZ2V4cFN0cmluZ1wiXSkocXVlcnkpLCAnaScpLnRlc3QodGhpcy5jdXJyZW50TGFiZWwpIHx8IHRoaXMuY3JlYXRlZDtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LmZpbHRlcmVkT3B0aW9uc0NvdW50LS07XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5zZWxlY3Qub3B0aW9ucy5wdXNoKHRoaXMpO1xuICAgIHRoaXMuc2VsZWN0LmNhY2hlZE9wdGlvbnMucHVzaCh0aGlzKTtcbiAgICB0aGlzLnNlbGVjdC5vcHRpb25zQ291bnQrKztcbiAgICB0aGlzLnNlbGVjdC5maWx0ZXJlZE9wdGlvbnNDb3VudCsrO1xuXG4gICAgdGhpcy4kb24oJ3F1ZXJ5Q2hhbmdlJywgdGhpcy5xdWVyeUNoYW5nZSk7XG4gICAgdGhpcy4kb24oJ2hhbmRsZUdyb3VwRGlzYWJsZWQnLCB0aGlzLmhhbmRsZUdyb3VwRGlzYWJsZWQpO1xuICB9LFxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIHZhciBfc2VsZWN0MiA9IHRoaXMuc2VsZWN0LFxuICAgICAgICBzZWxlY3RlZCA9IF9zZWxlY3QyLnNlbGVjdGVkLFxuICAgICAgICBtdWx0aXBsZSA9IF9zZWxlY3QyLm11bHRpcGxlO1xuXG4gICAgdmFyIHNlbGVjdGVkT3B0aW9ucyA9IG11bHRpcGxlID8gc2VsZWN0ZWQgOiBbc2VsZWN0ZWRdO1xuICAgIHZhciBpbmRleCA9IHRoaXMuc2VsZWN0LmNhY2hlZE9wdGlvbnMuaW5kZXhPZih0aGlzKTtcbiAgICB2YXIgc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkT3B0aW9ucy5pbmRleE9mKHRoaXMpO1xuXG4gICAgLy8gaWYgb3B0aW9uIGlzIG5vdCBzZWxlY3RlZCwgcmVtb3ZlIGl0IGZyb20gY2FjaGVcbiAgICBpZiAoaW5kZXggPiAtMSAmJiBzZWxlY3RlZEluZGV4IDwgMCkge1xuICAgICAgdGhpcy5zZWxlY3QuY2FjaGVkT3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdC5vbk9wdGlvbkRlc3Ryb3kodGhpcy5zZWxlY3Qub3B0aW9ucy5pbmRleE9mKHRoaXMpKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfb3B0aW9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKG9wdGlvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbnZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBjb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplcltcImFcIiAvKiBkZWZhdWx0ICovXSkoXG4gIHNyY19vcHRpb252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhcGk7IH1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19vcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChjb21wb25lbnQuZXhwb3J0cyk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdGFnXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2VtaXR0ZXJcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy92dWUtcG9wcGVyXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2xvY2FsZVwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDYyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MGU0YWFkZTYmXG52YXIgcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJjbGlja291dHNpZGVcIixcbiAgICAgICAgICByYXdOYW1lOiBcInYtY2xpY2tvdXRzaWRlXCIsXG4gICAgICAgICAgdmFsdWU6IF92bS5oYW5kbGVDbG9zZSxcbiAgICAgICAgICBleHByZXNzaW9uOiBcImhhbmRsZUNsb3NlXCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdFwiLFxuICAgICAgY2xhc3M6IFtfdm0uc2VsZWN0U2l6ZSA/IFwiZWwtc2VsZWN0LS1cIiArIF92bS5zZWxlY3RTaXplIDogXCJcIl0sXG4gICAgICBvbjoge1xuICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgcmV0dXJuIF92bS50b2dnbGVNZW51KCRldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX3ZtLm11bHRpcGxlXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICByZWY6IFwidGFnc1wiLFxuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3RfX3RhZ3NcIixcbiAgICAgICAgICAgICAgc3R5bGU6IHsgXCJtYXgtd2lkdGhcIjogX3ZtLmlucHV0V2lkdGggLSAzMiArIFwicHhcIiwgd2lkdGg6IFwiMTAwJVwiIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF92bS5jb2xsYXBzZVRhZ3MgJiYgX3ZtLnNlbGVjdGVkLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImVsLXRhZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiAhX3ZtLnNlbGVjdERpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IF92bS5jb2xsYXBzZVRhZ1NpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0OiBfdm0uc2VsZWN0ZWRbMF0uaGl0U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbmZvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXNhYmxlLXRyYW5zaXRpb25zXCI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGVsZXRlVGFnKCRldmVudCwgX3ZtLnNlbGVjdGVkWzBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtc2VsZWN0X190YWdzLXRleHRcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uc2VsZWN0ZWRbMF0uY3VycmVudExhYmVsKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIF92bS5zZWxlY3RlZC5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtdGFnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBfdm0uY29sbGFwc2VUYWdTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImluZm9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXNhYmxlLXRyYW5zaXRpb25zXCI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3RfX3RhZ3MtdGV4dFwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtfdm0uX3YoXCIrIFwiICsgX3ZtLl9zKF92bS5zZWxlY3RlZC5sZW5ndGggLSAxKSldXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAhX3ZtLmNvbGxhcHNlVGFnc1xuICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgIFwidHJhbnNpdGlvbi1ncm91cFwiLFxuICAgICAgICAgICAgICAgICAgICB7IG9uOiB7IFwiYWZ0ZXItbGVhdmVcIjogX3ZtLnJlc2V0SW5wdXRIZWlnaHQgfSB9LFxuICAgICAgICAgICAgICAgICAgICBfdm0uX2woX3ZtLnNlbGVjdGVkLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC10YWdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBfdm0uZ2V0VmFsdWVLZXkoaXRlbSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6ICFfdm0uc2VsZWN0RGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogX3ZtLmNvbGxhcHNlVGFnU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXQ6IGl0ZW0uaGl0U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbmZvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXNhYmxlLXRyYW5zaXRpb25zXCI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGVsZXRlVGFnKCRldmVudCwgaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFwic3BhblwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdF9fdGFncy10ZXh0XCIgfSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoaXRlbS5jdXJyZW50TGFiZWwpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICBfdm0uZmlsdGVyYWJsZVxuICAgICAgICAgICAgICAgID8gX2MoXCJpbnB1dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0ucXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcInF1ZXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHJlZjogXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3RfX2lucHV0XCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiBbX3ZtLnNlbGVjdFNpemUgPyBcImlzLVwiICsgX3ZtLnNlbGVjdFNpemUgOiBcIlwiXSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICBcImZsZXgtZ3Jvd1wiOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogX3ZtLmlucHV0TGVuZ3RoIC8gKF92bS5pbnB1dFdpZHRoIC0gMzIpICsgXCIlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgXCJtYXgtd2lkdGhcIjogX3ZtLmlucHV0V2lkdGggLSA0MiArIFwicHhcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBfdm0uc2VsZWN0RGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlOiBfdm0uYXV0b0NvbXBsZXRlIHx8IF92bS5hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHsgdmFsdWU6IF92bS5xdWVyeSB9LFxuICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIGZvY3VzOiBfdm0uaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgICAgICAgICAgYmx1cjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uc29mdEZvY3VzID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGtleXVwOiBfdm0ubWFuYWdlUGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgICAgICAga2V5ZG93bjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnJlc2V0SW5wdXRTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZG93blwiLCA0MCwgJGV2ZW50LmtleSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJEb3duXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFycm93RG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlTmF2aWdhdGUoXCJuZXh0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJ1cFwiLCAzOCwgJGV2ZW50LmtleSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBcnJvd1VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVOYXZpZ2F0ZShcInByZXZcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVudGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5zZWxlY3RPcHRpb24oJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZXNjXCIsIDI3LCAkZXZlbnQua2V5LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVzY1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFc2NhcGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS52aXNpYmxlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlbGV0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzgsIDQ2XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJCYWNrc3BhY2VcIiwgXCJEZWxldGVcIiwgXCJEZWxcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5kZWxldGVQcmV2VGFnKCRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInRhYlwiLCA5LCAkZXZlbnQua2V5LCBcIlRhYlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS52aXNpYmxlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uc3RhcnQ6IF92bS5oYW5kbGVDb21wb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbnVwZGF0ZTogX3ZtLmhhbmRsZUNvbXBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uZW5kOiBfdm0uaGFuZGxlQ29tcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0ucXVlcnkgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmRlYm91bmNlZFF1ZXJ5Q2hhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgX2MoXG4gICAgICAgIFwiZWwtaW5wdXRcIixcbiAgICAgICAge1xuICAgICAgICAgIHJlZjogXCJyZWZlcmVuY2VcIixcbiAgICAgICAgICBjbGFzczogeyBcImlzLWZvY3VzXCI6IF92bS52aXNpYmxlIH0sXG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IF92bS5jdXJyZW50UGxhY2Vob2xkZXIsXG4gICAgICAgICAgICBuYW1lOiBfdm0ubmFtZSxcbiAgICAgICAgICAgIGlkOiBfdm0uaWQsXG4gICAgICAgICAgICBhdXRvY29tcGxldGU6IF92bS5hdXRvQ29tcGxldGUgfHwgX3ZtLmF1dG9jb21wbGV0ZSxcbiAgICAgICAgICAgIHNpemU6IF92bS5zZWxlY3RTaXplLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5zZWxlY3REaXNhYmxlZCxcbiAgICAgICAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHksXG4gICAgICAgICAgICBcInZhbGlkYXRlLWV2ZW50XCI6IGZhbHNlLFxuICAgICAgICAgICAgdGFiaW5kZXg6IF92bS5tdWx0aXBsZSAmJiBfdm0uZmlsdGVyYWJsZSA/IFwiLTFcIiA6IG51bGxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBmb2N1czogX3ZtLmhhbmRsZUZvY3VzLFxuICAgICAgICAgICAgYmx1cjogX3ZtLmhhbmRsZUJsdXIsXG4gICAgICAgICAgICBpbnB1dDogX3ZtLmRlYm91bmNlZE9uSW5wdXRDaGFuZ2UsXG4gICAgICAgICAgICBjb21wb3NpdGlvbnN0YXJ0OiBfdm0uaGFuZGxlQ29tcG9zaXRpb24sXG4gICAgICAgICAgICBjb21wb3NpdGlvbnVwZGF0ZTogX3ZtLmhhbmRsZUNvbXBvc2l0aW9uLFxuICAgICAgICAgICAgY29tcG9zaXRpb25lbmQ6IF92bS5oYW5kbGVDb21wb3NpdGlvblxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICAgIGtleWRvd246IFtcbiAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJkb3duXCIsIDQwLCAkZXZlbnQua2V5LCBbXG4gICAgICAgICAgICAgICAgICAgIFwiRG93blwiLFxuICAgICAgICAgICAgICAgICAgICBcIkFycm93RG93blwiXG4gICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICBfdm0uaGFuZGxlTmF2aWdhdGUoXCJuZXh0XCIpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwidXBcIiwgMzgsICRldmVudC5rZXksIFtcbiAgICAgICAgICAgICAgICAgICAgXCJVcFwiLFxuICAgICAgICAgICAgICAgICAgICBcIkFycm93VXBcIlxuICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgX3ZtLmhhbmRsZU5hdmlnYXRlKFwicHJldlwiKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzLCAkZXZlbnQua2V5LCBcIkVudGVyXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgIHJldHVybiBfdm0uc2VsZWN0T3B0aW9uKCRldmVudClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcsICRldmVudC5rZXksIFtcbiAgICAgICAgICAgICAgICAgICAgXCJFc2NcIixcbiAgICAgICAgICAgICAgICAgICAgXCJFc2NhcGVcIlxuICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgX3ZtLnZpc2libGUgPSBmYWxzZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInRhYlwiLCA5LCAkZXZlbnQua2V5LCBcIlRhYlwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX3ZtLnZpc2libGUgPSBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbW91c2VlbnRlcjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgIF92bS5pbnB1dEhvdmVyaW5nID0gdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdXNlbGVhdmU6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICBfdm0uaW5wdXRIb3ZlcmluZyA9IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtb2RlbDoge1xuICAgICAgICAgICAgdmFsdWU6IF92bS5zZWxlY3RlZExhYmVsLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCQkdikge1xuICAgICAgICAgICAgICBfdm0uc2VsZWN0ZWRMYWJlbCA9ICQkdlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IFwic2VsZWN0ZWRMYWJlbFwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX3ZtLiRzbG90cy5wcmVmaXhcbiAgICAgICAgICAgID8gX2MoXCJ0ZW1wbGF0ZVwiLCB7IHNsb3Q6IFwicHJlZml4XCIgfSwgW192bS5fdChcInByZWZpeFwiKV0sIDIpXG4gICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgIF9jKFwidGVtcGxhdGVcIiwgeyBzbG90OiBcInN1ZmZpeFwiIH0sIFtcbiAgICAgICAgICAgIF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogIV92bS5zaG93Q2xvc2UsXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcIiFzaG93Q2xvc2VcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICBcImVsLXNlbGVjdF9fY2FyZXRcIixcbiAgICAgICAgICAgICAgICBcImVsLWlucHV0X19pY29uXCIsXG4gICAgICAgICAgICAgICAgXCJlbC1pY29uLVwiICsgX3ZtLmljb25DbGFzc1xuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF92bS5zaG93Q2xvc2VcbiAgICAgICAgICAgICAgPyBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgIFwiZWwtc2VsZWN0X19jYXJldCBlbC1pbnB1dF9faWNvbiBlbC1pY29uLWNpcmNsZS1jbG9zZVwiLFxuICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5oYW5kbGVDbGVhckNsaWNrIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgXSlcbiAgICAgICAgXSxcbiAgICAgICAgMlxuICAgICAgKSxcbiAgICAgIF9jKFxuICAgICAgICBcInRyYW5zaXRpb25cIixcbiAgICAgICAge1xuICAgICAgICAgIGF0dHJzOiB7IG5hbWU6IFwiZWwtem9vbS1pbi10b3BcIiB9LFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBcImJlZm9yZS1lbnRlclwiOiBfdm0uaGFuZGxlTWVudUVudGVyLFxuICAgICAgICAgICAgXCJhZnRlci1sZWF2ZVwiOiBfdm0uZG9EZXN0cm95XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImVsLXNlbGVjdC1tZW51XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnZpc2libGUgJiYgX3ZtLmVtcHR5VGV4dCAhPT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcInZpc2libGUgJiYgZW1wdHlUZXh0ICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZWY6IFwicG9wcGVyXCIsXG4gICAgICAgICAgICAgIGF0dHJzOiB7IFwiYXBwZW5kLXRvLWJvZHlcIjogX3ZtLnBvcHBlckFwcGVuZFRvQm9keSB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImVsLXNjcm9sbGJhclwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5vcHRpb25zLmxlbmd0aCA+IDAgJiYgIV92bS5sb2FkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwib3B0aW9ucy5sZW5ndGggPiAwICYmICFsb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIHJlZjogXCJzY3JvbGxiYXJcIixcbiAgICAgICAgICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiaXMtZW1wdHlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAhX3ZtLmFsbG93Q3JlYXRlICYmXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLnF1ZXJ5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLmZpbHRlcmVkT3B0aW9uc0NvdW50ID09PSAwXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFnOiBcInVsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwid3JhcC1jbGFzc1wiOiBcImVsLXNlbGVjdC1kcm9wZG93bl9fd3JhcFwiLFxuICAgICAgICAgICAgICAgICAgICBcInZpZXctY2xhc3NcIjogXCJlbC1zZWxlY3QtZHJvcGRvd25fX2xpc3RcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgX3ZtLnNob3dOZXdPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgPyBfYyhcImVsLW9wdGlvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyB2YWx1ZTogX3ZtLnF1ZXJ5LCBjcmVhdGVkOiBcIlwiIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgX3ZtLl90KFwiZGVmYXVsdFwiKVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBfdm0uZW1wdHlUZXh0ICYmXG4gICAgICAgICAgICAgICghX3ZtLmFsbG93Q3JlYXRlIHx8XG4gICAgICAgICAgICAgICAgX3ZtLmxvYWRpbmcgfHxcbiAgICAgICAgICAgICAgICAoX3ZtLmFsbG93Q3JlYXRlICYmIF92bS5vcHRpb25zLmxlbmd0aCA9PT0gMCkpXG4gICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgIF92bS4kc2xvdHMuZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgICA/IF92bS5fdChcImVtcHR5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgOiBfYyhcInBcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3QtZHJvcGRvd25fX2VtcHR5XCIgfSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgICAgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKF92bS5lbXB0eVRleHQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICBdLFxuICAgICAgICAxXG4gICAgICApXG4gICAgXSxcbiAgICAxXG4gIClcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MGU0YWFkZTYmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZW1pdHRlclwiXG52YXIgZW1pdHRlcl8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xudmFyIGVtaXR0ZXJfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZW1pdHRlcl8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2ZvY3VzXCJcbnZhciBmb2N1c18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcbnZhciBmb2N1c19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihmb2N1c18pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2xvY2FsZVwiXG52YXIgbG9jYWxlXyA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG52YXIgbG9jYWxlX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGxvY2FsZV8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvaW5wdXRcIlxudmFyIGlucHV0XyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xudmFyIGlucHV0X2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGlucHV0Xyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QtZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTA2ODI4NzQ4JlxudmFyIHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ODI4NzQ4X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdC1kcm9wZG93biBlbC1wb3BwZXJcIixcbiAgICAgIGNsYXNzOiBbeyBcImlzLW11bHRpcGxlXCI6IF92bS4kcGFyZW50Lm11bHRpcGxlIH0sIF92bS5wb3BwZXJDbGFzc10sXG4gICAgICBzdHlsZTogeyBtaW5XaWR0aDogX3ZtLm1pbldpZHRoIH1cbiAgICB9LFxuICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAyXG4gIClcbn1cbnZhciBzZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY4Mjg3NDhfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDY4Mjg3NDgmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy92dWUtcG9wcGVyXCJcbnZhciB2dWVfcG9wcGVyXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG52YXIgdnVlX3BvcHBlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih2dWVfcG9wcGVyXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFNlbGVjdERyb3Bkb3duJyxcblxuICBjb21wb25lbnROYW1lOiAnRWxTZWxlY3REcm9wZG93bicsXG5cbiAgbWl4aW5zOiBbdnVlX3BvcHBlcl9kZWZhdWx0LmFdLFxuXG4gIHByb3BzOiB7XG4gICAgcGxhY2VtZW50OiB7XG4gICAgICBkZWZhdWx0OiAnYm90dG9tLXN0YXJ0J1xuICAgIH0sXG5cbiAgICBib3VuZGFyaWVzUGFkZGluZzoge1xuICAgICAgZGVmYXVsdDogMFxuICAgIH0sXG5cbiAgICBwb3BwZXJPcHRpb25zOiB7XG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBncHVBY2NlbGVyYXRpb246IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIHZpc2libGVBcnJvdzoge1xuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG5cbiAgICBhcHBlbmRUb0JvZHk6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbldpZHRoOiAnJ1xuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIHBvcHBlckNsYXNzOiBmdW5jdGlvbiBwb3BwZXJDbGFzcygpIHtcbiAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQucG9wcGVyQ2xhc3M7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgJyRwYXJlbnQuaW5wdXRXaWR0aCc6IGZ1bmN0aW9uICRwYXJlbnRJbnB1dFdpZHRoKCkge1xuICAgICAgdGhpcy5taW5XaWR0aCA9IHRoaXMuJHBhcmVudC4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKyAncHgnO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLnJlZmVyZW5jZUVsbSA9IHRoaXMuJHBhcmVudC4kcmVmcy5yZWZlcmVuY2UuJGVsO1xuICAgIHRoaXMuJHBhcmVudC5wb3BwZXJFbG0gPSB0aGlzLnBvcHBlckVsbSA9IHRoaXMuJGVsO1xuICAgIHRoaXMuJG9uKCd1cGRhdGVQb3BwZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuJHBhcmVudC52aXNpYmxlKSBfdGhpcy51cGRhdGVQb3BwZXIoKTtcbiAgICB9KTtcbiAgICB0aGlzLiRvbignZGVzdHJveVBvcHBlcicsIHRoaXMuZGVzdHJveVBvcHBlcik7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3NlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChzZWxlY3RfZHJvcGRvd252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXG52YXIgY29tcG9uZW50Tm9ybWFsaXplciA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QtZHJvcGRvd24udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gT2JqZWN0KGNvbXBvbmVudE5vcm1hbGl6ZXJbXCJhXCIgLyogZGVmYXVsdCAqL10pKFxuICBzcmNfc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBzZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9yZW5kZXIsXG4gIHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ODI4NzQ4X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgYXBpOyB9XG5jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LWRyb3Bkb3duLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzZWxlY3RfZHJvcGRvd24gPSAoY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZSArIDQgbW9kdWxlc1xudmFyIHNyY19vcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3RhZ1wiXG52YXIgdGFnXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzgpO1xudmFyIHRhZ19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih0YWdfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3Njcm9sbGJhclwiXG52YXIgc2Nyb2xsYmFyXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xudmFyIHNjcm9sbGJhcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzY3JvbGxiYXJfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcInRocm90dGxlLWRlYm91bmNlL2RlYm91bmNlXCJcbnZhciBkZWJvdW5jZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTtcbnZhciBkZWJvdW5jZV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihkZWJvdW5jZV8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvY2xpY2tvdXRzaWRlXCJcbnZhciBjbGlja291dHNpZGVfID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG52YXIgY2xpY2tvdXRzaWRlX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNsaWNrb3V0c2lkZV8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvcmVzaXplLWV2ZW50XCJcbnZhciByZXNpemVfZXZlbnRfID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9zY3JvbGwtaW50by12aWV3XCJcbnZhciBzY3JvbGxfaW50b192aWV3XyA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpO1xudmFyIHNjcm9sbF9pbnRvX3ZpZXdfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc2Nyb2xsX2ludG9fdmlld18pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvdXRpbFwiXG52YXIgdXRpbF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvbmF2aWdhdGlvbi1taXhpbi5qc1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbmF2aWdhdGlvbl9taXhpbiA9ICh7XG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhvdmVyT3B0aW9uOiAtMVxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIG9wdGlvbnNBbGxEaXNhYmxlZDogZnVuY3Rpb24gb3B0aW9uc0FsbERpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maWx0ZXIoZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgICByZXR1cm4gb3B0aW9uLnZpc2libGU7XG4gICAgICB9KS5ldmVyeShmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24uZGlzYWJsZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBob3ZlckluZGV4OiBmdW5jdGlvbiBob3ZlckluZGV4KHZhbCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCA+IC0xKSB7XG4gICAgICAgIHRoaXMuaG92ZXJPcHRpb24gPSB0aGlzLm9wdGlvbnNbdmFsXSB8fCB7fTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgb3B0aW9uLmhvdmVyID0gX3RoaXMuaG92ZXJPcHRpb24gPT09IG9wdGlvbjtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbmF2aWdhdGVPcHRpb25zOiBmdW5jdGlvbiBuYXZpZ2F0ZU9wdGlvbnMoZGlyZWN0aW9uKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLnZpc2libGUpIHtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDAgfHwgdGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudCA9PT0gMCkgcmV0dXJuO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnNBbGxEaXNhYmxlZCkge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnbmV4dCcpIHtcbiAgICAgICAgICB0aGlzLmhvdmVySW5kZXgrKztcbiAgICAgICAgICBpZiAodGhpcy5ob3ZlckluZGV4ID09PSB0aGlzLm9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVySW5kZXggPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdwcmV2Jykge1xuICAgICAgICAgIHRoaXMuaG92ZXJJbmRleC0tO1xuICAgICAgICAgIGlmICh0aGlzLmhvdmVySW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVySW5kZXggPSB0aGlzLm9wdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9wdGlvbiA9IHRoaXMub3B0aW9uc1t0aGlzLmhvdmVySW5kZXhdO1xuICAgICAgICBpZiAob3B0aW9uLmRpc2FibGVkID09PSB0cnVlIHx8IG9wdGlvbi5ncm91cERpc2FibGVkID09PSB0cnVlIHx8ICFvcHRpb24udmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMubmF2aWdhdGVPcHRpb25zKGRpcmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuc2Nyb2xsVG9PcHRpb24oX3RoaXMyLmhvdmVyT3B0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9zaGFyZWRcIlxudmFyIHNoYXJlZF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmEsIGxvY2FsZV9kZWZhdWx0LmEsIGZvY3VzX2RlZmF1bHQoKSgncmVmZXJlbmNlJyksIG5hdmlnYXRpb25fbWl4aW5dLFxuXG4gIG5hbWU6ICdFbFNlbGVjdCcsXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsU2VsZWN0JyxcblxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcblxuICAgIGVsRm9ybUl0ZW06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdzZWxlY3QnOiB0aGlzXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgX2VsRm9ybUl0ZW1TaXplOiBmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZWxGb3JtSXRlbSB8fCB7fSkuZWxGb3JtSXRlbVNpemU7XG4gICAgfSxcbiAgICByZWFkb25seTogZnVuY3Rpb24gcmVhZG9ubHkoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuZmlsdGVyYWJsZSB8fCB0aGlzLm11bHRpcGxlIHx8ICFPYmplY3QodXRpbF9bXCJpc0lFXCJdKSgpICYmICFPYmplY3QodXRpbF9bXCJpc0VkZ2VcIl0pKCkgJiYgIXRoaXMudmlzaWJsZTtcbiAgICB9LFxuICAgIHNob3dDbG9zZTogZnVuY3Rpb24gc2hvd0Nsb3NlKCkge1xuICAgICAgdmFyIGhhc1ZhbHVlID0gdGhpcy5tdWx0aXBsZSA/IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiAwIDogdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMudmFsdWUgIT09IG51bGwgJiYgdGhpcy52YWx1ZSAhPT0gJyc7XG4gICAgICB2YXIgY3JpdGVyaWEgPSB0aGlzLmNsZWFyYWJsZSAmJiAhdGhpcy5zZWxlY3REaXNhYmxlZCAmJiB0aGlzLmlucHV0SG92ZXJpbmcgJiYgaGFzVmFsdWU7XG4gICAgICByZXR1cm4gY3JpdGVyaWE7XG4gICAgfSxcbiAgICBpY29uQ2xhc3M6IGZ1bmN0aW9uIGljb25DbGFzcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW90ZSAmJiB0aGlzLmZpbHRlcmFibGUgPyAnJyA6IHRoaXMudmlzaWJsZSA/ICdhcnJvdy11cCBpcy1yZXZlcnNlJyA6ICdhcnJvdy11cCc7XG4gICAgfSxcbiAgICBkZWJvdW5jZTogZnVuY3Rpb24gZGVib3VuY2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdGUgPyAzMDAgOiAwO1xuICAgIH0sXG4gICAgZW1wdHlUZXh0OiBmdW5jdGlvbiBlbXB0eVRleHQoKSB7XG4gICAgICBpZiAodGhpcy5sb2FkaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdUZXh0IHx8IHRoaXMudCgnZWwuc2VsZWN0LmxvYWRpbmcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJlbW90ZSAmJiB0aGlzLnF1ZXJ5ID09PSAnJyAmJiB0aGlzLm9wdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUgJiYgdGhpcy5xdWVyeSAmJiB0aGlzLm9wdGlvbnMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9NYXRjaFRleHQgfHwgdGhpcy50KCdlbC5zZWxlY3Qubm9NYXRjaCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9EYXRhVGV4dCB8fCB0aGlzLnQoJ2VsLnNlbGVjdC5ub0RhdGEnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBzaG93TmV3T3B0aW9uOiBmdW5jdGlvbiBzaG93TmV3T3B0aW9uKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGhhc0V4aXN0aW5nT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbHRlcihmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgIHJldHVybiAhb3B0aW9uLmNyZWF0ZWQ7XG4gICAgICB9KS5zb21lKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi5jdXJyZW50TGFiZWwgPT09IF90aGlzLnF1ZXJ5O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJhYmxlICYmIHRoaXMuYWxsb3dDcmVhdGUgJiYgdGhpcy5xdWVyeSAhPT0gJycgJiYgIWhhc0V4aXN0aW5nT3B0aW9uO1xuICAgIH0sXG4gICAgc2VsZWN0U2l6ZTogZnVuY3Rpb24gc2VsZWN0U2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgfHwgdGhpcy5fZWxGb3JtSXRlbVNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7XG4gICAgfSxcbiAgICBzZWxlY3REaXNhYmxlZDogZnVuY3Rpb24gc2VsZWN0RGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkO1xuICAgIH0sXG4gICAgY29sbGFwc2VUYWdTaXplOiBmdW5jdGlvbiBjb2xsYXBzZVRhZ1NpemUoKSB7XG4gICAgICByZXR1cm4gWydzbWFsbCcsICdtaW5pJ10uaW5kZXhPZih0aGlzLnNlbGVjdFNpemUpID4gLTEgPyAnbWluaScgOiAnc21hbGwnO1xuICAgIH0sXG4gICAgcHJvcFBsYWNlaG9sZGVyOiBmdW5jdGlvbiBwcm9wUGxhY2Vob2xkZXIoKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRoaXMucGxhY2Vob2xkZXIgIT09ICd1bmRlZmluZWQnID8gdGhpcy5wbGFjZWhvbGRlciA6IHRoaXMudCgnZWwuc2VsZWN0LnBsYWNlaG9sZGVyJyk7XG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBFbElucHV0OiBpbnB1dF9kZWZhdWx0LmEsXG4gICAgRWxTZWxlY3RNZW51OiBzZWxlY3RfZHJvcGRvd24sXG4gICAgRWxPcHRpb246IHNyY19vcHRpb25bXCJhXCIgLyogZGVmYXVsdCAqL10sXG4gICAgRWxUYWc6IHRhZ19kZWZhdWx0LmEsXG4gICAgRWxTY3JvbGxiYXI6IHNjcm9sbGJhcl9kZWZhdWx0LmFcbiAgfSxcblxuICBkaXJlY3RpdmVzOiB7IENsaWNrb3V0c2lkZTogY2xpY2tvdXRzaWRlX2RlZmF1bHQuYSB9LFxuXG4gIHByb3BzOiB7XG4gICAgbmFtZTogU3RyaW5nLFxuICAgIGlkOiBTdHJpbmcsXG4gICAgdmFsdWU6IHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBhdXRvY29tcGxldGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdvZmYnXG4gICAgfSxcbiAgICAvKiogQERlcHJlY2F0ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uICovXG4gICAgYXV0b0NvbXBsZXRlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpIHtcbiAgICAgICAgIGZhbHNlICYmIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGF1dG9tYXRpY0Ryb3Bkb3duOiBCb29sZWFuLFxuICAgIHNpemU6IFN0cmluZyxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBjbGVhcmFibGU6IEJvb2xlYW4sXG4gICAgZmlsdGVyYWJsZTogQm9vbGVhbixcbiAgICBhbGxvd0NyZWF0ZTogQm9vbGVhbixcbiAgICBsb2FkaW5nOiBCb29sZWFuLFxuICAgIHBvcHBlckNsYXNzOiBTdHJpbmcsXG4gICAgcmVtb3RlOiBCb29sZWFuLFxuICAgIGxvYWRpbmdUZXh0OiBTdHJpbmcsXG4gICAgbm9NYXRjaFRleHQ6IFN0cmluZyxcbiAgICBub0RhdGFUZXh0OiBTdHJpbmcsXG4gICAgcmVtb3RlTWV0aG9kOiBGdW5jdGlvbixcbiAgICBmaWx0ZXJNZXRob2Q6IEZ1bmN0aW9uLFxuICAgIG11bHRpcGxlOiBCb29sZWFuLFxuICAgIG11bHRpcGxlTGltaXQ6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIHBsYWNlaG9sZGVyOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogZmFsc2VcbiAgICB9LFxuICAgIGRlZmF1bHRGaXJzdE9wdGlvbjogQm9vbGVhbixcbiAgICByZXNlcnZlS2V5d29yZDogQm9vbGVhbixcbiAgICB2YWx1ZUtleToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ3ZhbHVlJ1xuICAgIH0sXG4gICAgY29sbGFwc2VUYWdzOiBCb29sZWFuLFxuICAgIHBvcHBlckFwcGVuZFRvQm9keToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3B0aW9uczogW10sXG4gICAgICBjYWNoZWRPcHRpb25zOiBbXSxcbiAgICAgIGNyZWF0ZWRMYWJlbDogbnVsbCxcbiAgICAgIGNyZWF0ZWRTZWxlY3RlZDogZmFsc2UsXG4gICAgICBzZWxlY3RlZDogdGhpcy5tdWx0aXBsZSA/IFtdIDoge30sXG4gICAgICBpbnB1dExlbmd0aDogMjAsXG4gICAgICBpbnB1dFdpZHRoOiAwLFxuICAgICAgaW5pdGlhbElucHV0SGVpZ2h0OiAwLFxuICAgICAgY2FjaGVkUGxhY2VIb2xkZXI6ICcnLFxuICAgICAgb3B0aW9uc0NvdW50OiAwLFxuICAgICAgZmlsdGVyZWRPcHRpb25zQ291bnQ6IDAsXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgIHNvZnRGb2N1czogZmFsc2UsXG4gICAgICBzZWxlY3RlZExhYmVsOiAnJyxcbiAgICAgIGhvdmVySW5kZXg6IC0xLFxuICAgICAgcXVlcnk6ICcnLFxuICAgICAgcHJldmlvdXNRdWVyeTogbnVsbCxcbiAgICAgIGlucHV0SG92ZXJpbmc6IGZhbHNlLFxuICAgICAgY3VycmVudFBsYWNlaG9sZGVyOiAnJyxcbiAgICAgIG1lbnVWaXNpYmxlT25Gb2N1czogZmFsc2UsXG4gICAgICBpc09uQ29tcG9zaXRpb246IGZhbHNlLFxuICAgICAgaXNTaWxlbnRCbHVyOiBmYWxzZVxuICAgIH07XG4gIH0sXG5cblxuICB3YXRjaDoge1xuICAgIHNlbGVjdERpc2FibGVkOiBmdW5jdGlvbiBzZWxlY3REaXNhYmxlZCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByb3BQbGFjZWhvbGRlcjogZnVuY3Rpb24gcHJvcFBsYWNlaG9sZGVyKHZhbCkge1xuICAgICAgdGhpcy5jYWNoZWRQbGFjZUhvbGRlciA9IHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gdmFsO1xuICAgIH0sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkVmFsKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB0aGlzLnJlc2V0SW5wdXRIZWlnaHQoKTtcbiAgICAgICAgaWYgKHZhbCAmJiB2YWwubGVuZ3RoID4gMCB8fCB0aGlzLiRyZWZzLmlucHV0ICYmIHRoaXMucXVlcnkgIT09ICcnKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50UGxhY2Vob2xkZXIgPSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQbGFjZWhvbGRlciA9IHRoaXMuY2FjaGVkUGxhY2VIb2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSAmJiAhdGhpcy5yZXNlcnZlS2V5d29yZCkge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5Q2hhbmdlKHRoaXMucXVlcnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNldFNlbGVjdGVkKCk7XG4gICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmICF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuaW5wdXRMZW5ndGggPSAyMDtcbiAgICAgIH1cbiAgICAgIGlmICghT2JqZWN0KHV0aWxfW1widmFsdWVFcXVhbHNcIl0pKHZhbCwgb2xkVmFsKSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKCdFbEZvcm1JdGVtJywgJ2VsLmZvcm0uY2hhbmdlJywgdmFsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHZpc2libGU6IGZ1bmN0aW9uIHZpc2libGUodmFsKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAnZGVzdHJveVBvcHBlcicpO1xuICAgICAgICBpZiAodGhpcy4kcmVmcy5pbnB1dCkge1xuICAgICAgICAgIHRoaXMuJHJlZnMuaW5wdXQuYmx1cigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgdGhpcy5wcmV2aW91c1F1ZXJ5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZExhYmVsID0gJyc7XG4gICAgICAgIHRoaXMuaW5wdXRMZW5ndGggPSAyMDtcbiAgICAgICAgdGhpcy5tZW51VmlzaWJsZU9uRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldEhvdmVySW5kZXgoKTtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChfdGhpczMuJHJlZnMuaW5wdXQgJiYgX3RoaXMzLiRyZWZzLmlucHV0LnZhbHVlID09PSAnJyAmJiBfdGhpczMuc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBfdGhpczMuY3VycmVudFBsYWNlaG9sZGVyID0gX3RoaXMzLmNhY2hlZFBsYWNlSG9sZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmIHRoaXMuYWxsb3dDcmVhdGUgJiYgdGhpcy5jcmVhdGVkU2VsZWN0ZWQgJiYgdGhpcy5jcmVhdGVkTGFiZWwpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZExhYmVsID0gdGhpcy5jcmVhdGVkTGFiZWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWwgPSB0aGlzLnNlbGVjdGVkLmN1cnJlbnRMYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUpIHRoaXMucXVlcnkgPSB0aGlzLnNlbGVjdGVkTGFiZWw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGxhY2Vob2xkZXIgPSB0aGlzLmNhY2hlZFBsYWNlSG9sZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAndXBkYXRlUG9wcGVyJyk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5yZW1vdGUgPyAnJyA6IHRoaXMuc2VsZWN0ZWRMYWJlbDtcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5Q2hhbmdlKHRoaXMucXVlcnkpO1xuICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZW1vdGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uJywgJ3F1ZXJ5Q2hhbmdlJywgJycpO1xuICAgICAgICAgICAgICB0aGlzLmJyb2FkY2FzdCgnRWxPcHRpb25Hcm91cCcsICdxdWVyeUNoYW5nZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZExhYmVsKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gdGhpcy5zZWxlY3RlZExhYmVsO1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWwgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuJGVtaXQoJ3Zpc2libGUtY2hhbmdlJywgdmFsKTtcbiAgICB9LFxuICAgIG9wdGlvbnM6IGZ1bmN0aW9uIG9wdGlvbnMoKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuJGlzU2VydmVyKSByZXR1cm47XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzNC5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAndXBkYXRlUG9wcGVyJyk7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMucmVzZXRJbnB1dEhlaWdodCgpO1xuICAgICAgfVxuICAgICAgdmFyIGlucHV0cyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Jyk7XG4gICAgICBpZiAoW10uaW5kZXhPZi5jYWxsKGlucHV0cywgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRGaXJzdE9wdGlvbiAmJiAodGhpcy5maWx0ZXJhYmxlIHx8IHRoaXMucmVtb3RlKSAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50KSB7XG4gICAgICAgIHRoaXMuY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZU5hdmlnYXRlOiBmdW5jdGlvbiBoYW5kbGVOYXZpZ2F0ZShkaXJlY3Rpb24pIHtcbiAgICAgIGlmICh0aGlzLmlzT25Db21wb3NpdGlvbikgcmV0dXJuO1xuXG4gICAgICB0aGlzLm5hdmlnYXRlT3B0aW9ucyhkaXJlY3Rpb24pO1xuICAgIH0sXG4gICAgaGFuZGxlQ29tcG9zaXRpb246IGZ1bmN0aW9uIGhhbmRsZUNvbXBvc2l0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIHRleHQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NvbXBvc2l0aW9uZW5kJykge1xuICAgICAgICB0aGlzLmlzT25Db21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoXykge1xuICAgICAgICAgIHJldHVybiBfdGhpczUuaGFuZGxlUXVlcnlDaGFuZ2UodGV4dCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGxhc3RDaGFyYWN0ZXIgPSB0ZXh0W3RleHQubGVuZ3RoIC0gMV0gfHwgJyc7XG4gICAgICAgIHRoaXMuaXNPbkNvbXBvc2l0aW9uID0gIU9iamVjdChzaGFyZWRfW1wiaXNLb3JlYW5cIl0pKGxhc3RDaGFyYWN0ZXIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlUXVlcnlDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVF1ZXJ5Q2hhbmdlKHZhbCkge1xuICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLnByZXZpb3VzUXVlcnkgPT09IHZhbCB8fCB0aGlzLmlzT25Db21wb3NpdGlvbikgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMucHJldmlvdXNRdWVyeSA9PT0gbnVsbCAmJiAodHlwZW9mIHRoaXMuZmlsdGVyTWV0aG9kID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB0aGlzLnJlbW90ZU1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1F1ZXJ5ID0gdmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnByZXZpb3VzUXVlcnkgPSB2YWw7XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczYudmlzaWJsZSkgX3RoaXM2LmJyb2FkY2FzdCgnRWxTZWxlY3REcm9wZG93bicsICd1cGRhdGVQb3BwZXInKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ob3ZlckluZGV4ID0gLTE7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiB0aGlzLmZpbHRlcmFibGUpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBsZW5ndGggPSBfdGhpczYuJHJlZnMuaW5wdXQudmFsdWUubGVuZ3RoICogMTUgKyAyMDtcbiAgICAgICAgICBfdGhpczYuaW5wdXRMZW5ndGggPSBfdGhpczYuY29sbGFwc2VUYWdzID8gTWF0aC5taW4oNTAsIGxlbmd0aCkgOiBsZW5ndGg7XG4gICAgICAgICAgX3RoaXM2Lm1hbmFnZVBsYWNlaG9sZGVyKCk7XG4gICAgICAgICAgX3RoaXM2LnJlc2V0SW5wdXRIZWlnaHQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZW1vdGUgJiYgdHlwZW9mIHRoaXMucmVtb3RlTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnJlbW90ZU1ldGhvZCh2YWwpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5maWx0ZXJNZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJNZXRob2QodmFsKTtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uR3JvdXAnLCAncXVlcnlDaGFuZ2UnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zQ291bnQgPSB0aGlzLm9wdGlvbnNDb3VudDtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uJywgJ3F1ZXJ5Q2hhbmdlJywgdmFsKTtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uR3JvdXAnLCAncXVlcnlDaGFuZ2UnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRGaXJzdE9wdGlvbiAmJiAodGhpcy5maWx0ZXJhYmxlIHx8IHRoaXMucmVtb3RlKSAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50KSB7XG4gICAgICAgIHRoaXMuY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNjcm9sbFRvT3B0aW9uOiBmdW5jdGlvbiBzY3JvbGxUb09wdGlvbihvcHRpb24pIHtcbiAgICAgIHZhciB0YXJnZXQgPSBBcnJheS5pc0FycmF5KG9wdGlvbikgJiYgb3B0aW9uWzBdID8gb3B0aW9uWzBdLiRlbCA6IG9wdGlvbi4kZWw7XG4gICAgICBpZiAodGhpcy4kcmVmcy5wb3BwZXIgJiYgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBtZW51ID0gdGhpcy4kcmVmcy5wb3BwZXIuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1zZWxlY3QtZHJvcGRvd25fX3dyYXAnKTtcbiAgICAgICAgc2Nyb2xsX2ludG9fdmlld19kZWZhdWx0KCkobWVudSwgdGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuJHJlZnMuc2Nyb2xsYmFyICYmIHRoaXMuJHJlZnMuc2Nyb2xsYmFyLmhhbmRsZVNjcm9sbCgpO1xuICAgIH0sXG4gICAgaGFuZGxlTWVudUVudGVyOiBmdW5jdGlvbiBoYW5kbGVNZW51RW50ZXIoKSB7XG4gICAgICB2YXIgX3RoaXM3ID0gdGhpcztcblxuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXM3LnNjcm9sbFRvT3B0aW9uKF90aGlzNy5zZWxlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGVtaXRDaGFuZ2U6IGZ1bmN0aW9uIGVtaXRDaGFuZ2UodmFsKSB7XG4gICAgICBpZiAoIU9iamVjdCh1dGlsX1tcInZhbHVlRXF1YWxzXCJdKSh0aGlzLnZhbHVlLCB2YWwpKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRPcHRpb246IGZ1bmN0aW9uIGdldE9wdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG9wdGlvbiA9IHZvaWQgMDtcbiAgICAgIHZhciBpc09iamVjdCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkudG9Mb3dlckNhc2UoKSA9PT0gJ1tvYmplY3Qgb2JqZWN0XSc7XG4gICAgICB2YXIgaXNOdWxsID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS50b0xvd2VyQ2FzZSgpID09PSAnW29iamVjdCBudWxsXSc7XG4gICAgICB2YXIgaXNVbmRlZmluZWQgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnRvTG93ZXJDYXNlKCkgPT09ICdbb2JqZWN0IHVuZGVmaW5lZF0nO1xuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5jYWNoZWRPcHRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjYWNoZWRPcHRpb24gPSB0aGlzLmNhY2hlZE9wdGlvbnNbaV07XG4gICAgICAgIHZhciBpc0VxdWFsID0gaXNPYmplY3QgPyBPYmplY3QodXRpbF9bXCJnZXRWYWx1ZUJ5UGF0aFwiXSkoY2FjaGVkT3B0aW9uLnZhbHVlLCB0aGlzLnZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKHZhbHVlLCB0aGlzLnZhbHVlS2V5KSA6IGNhY2hlZE9wdGlvbi52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICAgIGlmIChpc0VxdWFsKSB7XG4gICAgICAgICAgb3B0aW9uID0gY2FjaGVkT3B0aW9uO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9uKSByZXR1cm4gb3B0aW9uO1xuICAgICAgdmFyIGxhYmVsID0gIWlzT2JqZWN0ICYmICFpc051bGwgJiYgIWlzVW5kZWZpbmVkID8gU3RyaW5nKHZhbHVlKSA6ICcnO1xuICAgICAgdmFyIG5ld09wdGlvbiA9IHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBjdXJyZW50TGFiZWw6IGxhYmVsXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgbmV3T3B0aW9uLmhpdFN0YXRlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3T3B0aW9uO1xuICAgIH0sXG4gICAgc2V0U2VsZWN0ZWQ6IGZ1bmN0aW9uIHNldFNlbGVjdGVkKCkge1xuICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB2YXIgb3B0aW9uID0gdGhpcy5nZXRPcHRpb24odGhpcy52YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb24uY3JlYXRlZCkge1xuICAgICAgICAgIHRoaXMuY3JlYXRlZExhYmVsID0gb3B0aW9uLmN1cnJlbnRMYWJlbDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZWRTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVkU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWwgPSBvcHRpb24uY3VycmVudExhYmVsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gb3B0aW9uO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlKSB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWxlY3RlZExhYmVsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgICB0aGlzLnZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goX3RoaXM4LmdldE9wdGlvbih2YWx1ZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSByZXN1bHQ7XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzOC5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGhhbmRsZUZvY3VzOiBmdW5jdGlvbiBoYW5kbGVGb2N1cyhldmVudCkge1xuICAgICAgaWYgKCF0aGlzLnNvZnRGb2N1cykge1xuICAgICAgICBpZiAodGhpcy5hdXRvbWF0aWNEcm9wZG93biB8fCB0aGlzLmZpbHRlcmFibGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmICF0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMubWVudVZpc2libGVPbkZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiRlbWl0KCdmb2N1cycsIGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29mdEZvY3VzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLiRyZWZzLnJlZmVyZW5jZS5ibHVyKCk7XG4gICAgfSxcbiAgICBoYW5kbGVCbHVyOiBmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczkuaXNTaWxlbnRCbHVyKSB7XG4gICAgICAgICAgX3RoaXM5LmlzU2lsZW50Qmx1ciA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzOS4kZW1pdCgnYmx1cicsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgICAgdGhpcy5zb2Z0Rm9jdXMgPSBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZUNsZWFyQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZUNsZWFyQ2xpY2soZXZlbnQpIHtcbiAgICAgIHRoaXMuZGVsZXRlU2VsZWN0ZWQoZXZlbnQpO1xuICAgIH0sXG4gICAgZG9EZXN0cm95OiBmdW5jdGlvbiBkb0Rlc3Ryb3koKSB7XG4gICAgICB0aGlzLiRyZWZzLnBvcHBlciAmJiB0aGlzLiRyZWZzLnBvcHBlci5kb0Rlc3Ryb3koKTtcbiAgICB9LFxuICAgIGhhbmRsZUNsb3NlOiBmdW5jdGlvbiBoYW5kbGVDbG9zZSgpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIH0sXG4gICAgdG9nZ2xlTGFzdE9wdGlvbkhpdFN0YXRlOiBmdW5jdGlvbiB0b2dnbGVMYXN0T3B0aW9uSGl0U3RhdGUoaGl0KSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZCkpIHJldHVybjtcbiAgICAgIHZhciBvcHRpb24gPSB0aGlzLnNlbGVjdGVkW3RoaXMuc2VsZWN0ZWQubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBpZiAoaGl0ID09PSB0cnVlIHx8IGhpdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgb3B0aW9uLmhpdFN0YXRlID0gaGl0O1xuICAgICAgICByZXR1cm4gaGl0O1xuICAgICAgfVxuXG4gICAgICBvcHRpb24uaGl0U3RhdGUgPSAhb3B0aW9uLmhpdFN0YXRlO1xuICAgICAgcmV0dXJuIG9wdGlvbi5oaXRTdGF0ZTtcbiAgICB9LFxuICAgIGRlbGV0ZVByZXZUYWc6IGZ1bmN0aW9uIGRlbGV0ZVByZXZUYWcoZSkge1xuICAgICAgaWYgKGUudGFyZ2V0LnZhbHVlLmxlbmd0aCA8PSAwICYmICF0aGlzLnRvZ2dsZUxhc3RPcHRpb25IaXRTdGF0ZSgpKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUuc2xpY2UoKTtcbiAgICAgICAgdmFsdWUucG9wKCk7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbWFuYWdlUGxhY2Vob2xkZXI6IGZ1bmN0aW9uIG1hbmFnZVBsYWNlaG9sZGVyKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFBsYWNlaG9sZGVyICE9PSAnJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRQbGFjZWhvbGRlciA9IHRoaXMuJHJlZnMuaW5wdXQudmFsdWUgPyAnJyA6IHRoaXMuY2FjaGVkUGxhY2VIb2xkZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICByZXNldElucHV0U3RhdGU6IGZ1bmN0aW9uIHJlc2V0SW5wdXRTdGF0ZShlKSB7XG4gICAgICBpZiAoZS5rZXlDb2RlICE9PSA4KSB0aGlzLnRvZ2dsZUxhc3RPcHRpb25IaXRTdGF0ZShmYWxzZSk7XG4gICAgICB0aGlzLmlucHV0TGVuZ3RoID0gdGhpcy4kcmVmcy5pbnB1dC52YWx1ZS5sZW5ndGggKiAxNSArIDIwO1xuICAgICAgdGhpcy5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgfSxcbiAgICByZXNldElucHV0SGVpZ2h0OiBmdW5jdGlvbiByZXNldElucHV0SGVpZ2h0KCkge1xuICAgICAgdmFyIF90aGlzMTAgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5jb2xsYXBzZVRhZ3MgJiYgIXRoaXMuZmlsdGVyYWJsZSkgcmV0dXJuO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIV90aGlzMTAuJHJlZnMucmVmZXJlbmNlKSByZXR1cm47XG4gICAgICAgIHZhciBpbnB1dENoaWxkTm9kZXMgPSBfdGhpczEwLiRyZWZzLnJlZmVyZW5jZS4kZWwuY2hpbGROb2RlcztcbiAgICAgICAgdmFyIGlucHV0ID0gW10uZmlsdGVyLmNhbGwoaW5wdXRDaGlsZE5vZGVzLCBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiBpdGVtLnRhZ05hbWUgPT09ICdJTlBVVCc7XG4gICAgICAgIH0pWzBdO1xuICAgICAgICB2YXIgdGFncyA9IF90aGlzMTAuJHJlZnMudGFncztcbiAgICAgICAgdmFyIHRhZ3NIZWlnaHQgPSB0YWdzID8gTWF0aC5yb3VuZCh0YWdzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgOiAwO1xuICAgICAgICB2YXIgc2l6ZUluTWFwID0gX3RoaXMxMC5pbml0aWFsSW5wdXRIZWlnaHQgfHwgNDA7XG4gICAgICAgIGlucHV0LnN0eWxlLmhlaWdodCA9IF90aGlzMTAuc2VsZWN0ZWQubGVuZ3RoID09PSAwID8gc2l6ZUluTWFwICsgJ3B4JyA6IE1hdGgubWF4KHRhZ3MgPyB0YWdzSGVpZ2h0ICsgKHRhZ3NIZWlnaHQgPiBzaXplSW5NYXAgPyA2IDogMCkgOiAwLCBzaXplSW5NYXApICsgJ3B4JztcbiAgICAgICAgaWYgKF90aGlzMTAudmlzaWJsZSAmJiBfdGhpczEwLmVtcHR5VGV4dCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBfdGhpczEwLmJyb2FkY2FzdCgnRWxTZWxlY3REcm9wZG93bicsICd1cGRhdGVQb3BwZXInKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICByZXNldEhvdmVySW5kZXg6IGZ1bmN0aW9uIHJlc2V0SG92ZXJJbmRleCgpIHtcbiAgICAgIHZhciBfdGhpczExID0gdGhpcztcblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMxMS5tdWx0aXBsZSkge1xuICAgICAgICAgIF90aGlzMTEuaG92ZXJJbmRleCA9IF90aGlzMTEub3B0aW9ucy5pbmRleE9mKF90aGlzMTEuc2VsZWN0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChfdGhpczExLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF90aGlzMTEuaG92ZXJJbmRleCA9IE1hdGgubWluLmFwcGx5KG51bGwsIF90aGlzMTEuc2VsZWN0ZWQubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczExLm9wdGlvbnMuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMxMS5ob3ZlckluZGV4ID0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAzMDApO1xuICAgIH0sXG4gICAgaGFuZGxlT3B0aW9uU2VsZWN0OiBmdW5jdGlvbiBoYW5kbGVPcHRpb25TZWxlY3Qob3B0aW9uLCBieUNsaWNrKSB7XG4gICAgICB2YXIgX3RoaXMxMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICh0aGlzLnZhbHVlIHx8IFtdKS5zbGljZSgpO1xuICAgICAgICB2YXIgb3B0aW9uSW5kZXggPSB0aGlzLmdldFZhbHVlSW5kZXgodmFsdWUsIG9wdGlvbi52YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb25JbmRleCA+IC0xKSB7XG4gICAgICAgICAgdmFsdWUuc3BsaWNlKG9wdGlvbkluZGV4LCAxKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm11bHRpcGxlTGltaXQgPD0gMCB8fCB2YWx1ZS5sZW5ndGggPCB0aGlzLm11bHRpcGxlTGltaXQpIHtcbiAgICAgICAgICB2YWx1ZS5wdXNoKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSh2YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb24uY3JlYXRlZCkge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5Q2hhbmdlKCcnKTtcbiAgICAgICAgICB0aGlzLmlucHV0TGVuZ3RoID0gMjA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSkgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBvcHRpb24udmFsdWUpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2Uob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLmlzU2lsZW50Qmx1ciA9IGJ5Q2xpY2s7XG4gICAgICB0aGlzLnNldFNvZnRGb2N1cygpO1xuICAgICAgaWYgKHRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczEyLnNjcm9sbFRvT3B0aW9uKG9wdGlvbik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHNldFNvZnRGb2N1czogZnVuY3Rpb24gc2V0U29mdEZvY3VzKCkge1xuICAgICAgdGhpcy5zb2Z0Rm9jdXMgPSB0cnVlO1xuICAgICAgdmFyIGlucHV0ID0gdGhpcy4kcmVmcy5pbnB1dCB8fCB0aGlzLiRyZWZzLnJlZmVyZW5jZTtcbiAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0VmFsdWVJbmRleDogZnVuY3Rpb24gZ2V0VmFsdWVJbmRleCgpIHtcbiAgICAgIHZhciBhcnIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzWzFdO1xuXG4gICAgICB2YXIgaXNPYmplY3QgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnRvTG93ZXJDYXNlKCkgPT09ICdbb2JqZWN0IG9iamVjdF0nO1xuICAgICAgaWYgKCFpc09iamVjdCkge1xuICAgICAgICByZXR1cm4gYXJyLmluZGV4T2YodmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHZhbHVlS2V5ID0gdGhpcy52YWx1ZUtleTtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIGFyci5zb21lKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgICAgICAgaWYgKE9iamVjdCh1dGlsX1tcImdldFZhbHVlQnlQYXRoXCJdKShpdGVtLCB2YWx1ZUtleSkgPT09IE9iamVjdCh1dGlsX1tcImdldFZhbHVlQnlQYXRoXCJdKSh2YWx1ZSwgdmFsdWVLZXkpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH0sXG4gICAgdG9nZ2xlTWVudTogZnVuY3Rpb24gdG9nZ2xlTWVudSgpIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3REaXNhYmxlZCkge1xuICAgICAgICBpZiAodGhpcy5tZW51VmlzaWJsZU9uRm9jdXMpIHtcbiAgICAgICAgICB0aGlzLm1lbnVWaXNpYmxlT25Gb2N1cyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmlzaWJsZSA9ICF0aGlzLnZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmlzaWJsZSkge1xuICAgICAgICAgICh0aGlzLiRyZWZzLmlucHV0IHx8IHRoaXMuJHJlZnMucmVmZXJlbmNlKS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBzZWxlY3RPcHRpb246IGZ1bmN0aW9uIHNlbGVjdE9wdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlTWVudSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc1t0aGlzLmhvdmVySW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVPcHRpb25TZWxlY3QodGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkZWxldGVTZWxlY3RlZDogZnVuY3Rpb24gZGVsZXRlU2VsZWN0ZWQoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5tdWx0aXBsZSA/IFtdIDogJyc7XG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSh2YWx1ZSk7XG4gICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuJGVtaXQoJ2NsZWFyJyk7XG4gICAgfSxcbiAgICBkZWxldGVUYWc6IGZ1bmN0aW9uIGRlbGV0ZVRhZyhldmVudCwgdGFnKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLnNlbGVjdGVkLmluZGV4T2YodGFnKTtcbiAgICAgIGlmIChpbmRleCA+IC0xICYmICF0aGlzLnNlbGVjdERpc2FibGVkKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUuc2xpY2UoKTtcbiAgICAgICAgdmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3JlbW92ZS10YWcnLCB0YWcudmFsdWUpO1xuICAgICAgfVxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgICBvbklucHV0Q2hhbmdlOiBmdW5jdGlvbiBvbklucHV0Q2hhbmdlKCkge1xuICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSAmJiB0aGlzLnF1ZXJ5ICE9PSB0aGlzLnNlbGVjdGVkTGFiZWwpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuc2VsZWN0ZWRMYWJlbDtcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVyeUNoYW5nZSh0aGlzLnF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uT3B0aW9uRGVzdHJveTogZnVuY3Rpb24gb25PcHRpb25EZXN0cm95KGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3VudC0tO1xuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50LS07XG4gICAgICAgIHRoaXMub3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzZXRJbnB1dFdpZHRoOiBmdW5jdGlvbiByZXNldElucHV0V2lkdGgoKSB7XG4gICAgICB0aGlzLmlucHV0V2lkdGggPSB0aGlzLiRyZWZzLnJlZmVyZW5jZS4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgfSxcbiAgICBoYW5kbGVSZXNpemU6IGZ1bmN0aW9uIGhhbmRsZVJlc2l6ZSgpIHtcbiAgICAgIHRoaXMucmVzZXRJbnB1dFdpZHRoKCk7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkgdGhpcy5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgfSxcbiAgICBjaGVja0RlZmF1bHRGaXJzdE9wdGlvbjogZnVuY3Rpb24gY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKSB7XG4gICAgICB0aGlzLmhvdmVySW5kZXggPSAtMTtcbiAgICAgIC8vIGhpZ2hsaWdodCB0aGUgY3JlYXRlZCBvcHRpb25cbiAgICAgIHZhciBoYXNDcmVhdGVkID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5vcHRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uY3JlYXRlZCkge1xuICAgICAgICAgIGhhc0NyZWF0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IGk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChoYXNDcmVhdGVkKSByZXR1cm47XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pICE9PSB0aGlzLm9wdGlvbnMubGVuZ3RoOyArK19pKSB7XG4gICAgICAgIHZhciBvcHRpb24gPSB0aGlzLm9wdGlvbnNbX2ldO1xuICAgICAgICBpZiAodGhpcy5xdWVyeSkge1xuICAgICAgICAgIC8vIGhpZ2hsaWdodCBmaXJzdCBvcHRpb25zIHRoYXQgcGFzc2VzIHRoZSBmaWx0ZXJcbiAgICAgICAgICBpZiAoIW9wdGlvbi5kaXNhYmxlZCAmJiAhb3B0aW9uLmdyb3VwRGlzYWJsZWQgJiYgb3B0aW9uLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IF9pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGhpZ2hsaWdodCBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgaWYgKG9wdGlvbi5pdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IF9pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRWYWx1ZUtleTogZnVuY3Rpb24gZ2V0VmFsdWVLZXkoaXRlbSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVtLnZhbHVlKS50b0xvd2VyQ2FzZSgpICE9PSAnW29iamVjdCBvYmplY3RdJykge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBPYmplY3QodXRpbF9bXCJnZXRWYWx1ZUJ5UGF0aFwiXSkoaXRlbS52YWx1ZSwgdGhpcy52YWx1ZUtleSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdmFyIF90aGlzMTMgPSB0aGlzO1xuXG4gICAgdGhpcy5jYWNoZWRQbGFjZUhvbGRlciA9IHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gdGhpcy5wcm9wUGxhY2Vob2xkZXI7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgIUFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgW10pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCAnJyk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWJvdW5jZWRPbklucHV0Q2hhbmdlID0gZGVib3VuY2VfZGVmYXVsdCgpKHRoaXMuZGVib3VuY2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMTMub25JbnB1dENoYW5nZSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kZWJvdW5jZWRRdWVyeUNoYW5nZSA9IGRlYm91bmNlX2RlZmF1bHQoKSh0aGlzLmRlYm91bmNlLCBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMxMy5oYW5kbGVRdWVyeUNoYW5nZShlLnRhcmdldC52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRvbignaGFuZGxlT3B0aW9uQ2xpY2snLCB0aGlzLmhhbmRsZU9wdGlvblNlbGVjdCk7XG4gICAgdGhpcy4kb24oJ3NldFNlbGVjdGVkJywgdGhpcy5zZXRTZWxlY3RlZCk7XG4gIH0sXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIF90aGlzMTQgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gJyc7XG4gICAgfVxuICAgIE9iamVjdChyZXNpemVfZXZlbnRfW1wiYWRkUmVzaXplTGlzdGVuZXJcIl0pKHRoaXMuJGVsLCB0aGlzLmhhbmRsZVJlc2l6ZSk7XG5cbiAgICB2YXIgcmVmZXJlbmNlID0gdGhpcy4kcmVmcy5yZWZlcmVuY2U7XG4gICAgaWYgKHJlZmVyZW5jZSAmJiByZWZlcmVuY2UuJGVsKSB7XG4gICAgICB2YXIgc2l6ZU1hcCA9IHtcbiAgICAgICAgbWVkaXVtOiAzNixcbiAgICAgICAgc21hbGw6IDMyLFxuICAgICAgICBtaW5pOiAyOFxuICAgICAgfTtcbiAgICAgIHZhciBpbnB1dCA9IHJlZmVyZW5jZS4kZWwucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICAgIHRoaXMuaW5pdGlhbElucHV0SGVpZ2h0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IHx8IHNpemVNYXBbdGhpcy5zZWxlY3RTaXplXTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVtb3RlICYmIHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMucmVzZXRJbnB1dEhlaWdodCgpO1xuICAgIH1cbiAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocmVmZXJlbmNlICYmIHJlZmVyZW5jZS4kZWwpIHtcbiAgICAgICAgX3RoaXMxNC5pbnB1dFdpZHRoID0gcmVmZXJlbmNlLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNldFNlbGVjdGVkKCk7XG4gIH0sXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuJGVsICYmIHRoaXMuaGFuZGxlUmVzaXplKSBPYmplY3QocmVzaXplX2V2ZW50X1tcInJlbW92ZVJlc2l6ZUxpc3RlbmVyXCJdKSh0aGlzLiRlbCwgdGhpcy5oYW5kbGVSZXNpemUpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19zZWxlY3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHNlbGVjdF9jb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplcltcImFcIiAvKiBkZWZhdWx0ICovXSkoXG4gIHNyY19zZWxlY3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBzZWxlY3RfYXBpOyB9XG5zZWxlY3RfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3NlbGVjdCA9IChzZWxlY3RfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3QvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuc3JjX3NlbGVjdC5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHNyY19zZWxlY3QubmFtZSwgc3JjX3NlbGVjdCk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19zZWxlY3QgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChzcmNfc2VsZWN0KTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4e4b\n')},5128:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.PopupManager = undefined;\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _merge = __webpack_require__(\"7f4d\");\n\nvar _merge2 = _interopRequireDefault(_merge);\n\nvar _popupManager = __webpack_require__(\"4b26\");\n\nvar _popupManager2 = _interopRequireDefault(_popupManager);\n\nvar _scrollbarWidth = __webpack_require__(\"e62d\");\n\nvar _scrollbarWidth2 = _interopRequireDefault(_scrollbarWidth);\n\nvar _dom = __webpack_require__(\"5924\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar idSeed = 1;\n\nvar scrollBarWidth = void 0;\n\nexports.default = {\n props: {\n visible: {\n type: Boolean,\n default: false\n },\n openDelay: {},\n closeDelay: {},\n zIndex: {},\n modal: {\n type: Boolean,\n default: false\n },\n modalFade: {\n type: Boolean,\n default: true\n },\n modalClass: {},\n modalAppendToBody: {\n type: Boolean,\n default: false\n },\n lockScroll: {\n type: Boolean,\n default: true\n },\n closeOnPressEscape: {\n type: Boolean,\n default: false\n },\n closeOnClickModal: {\n type: Boolean,\n default: false\n }\n },\n\n beforeMount: function beforeMount() {\n this._popupId = 'popup-' + idSeed++;\n _popupManager2.default.register(this._popupId, this);\n },\n beforeDestroy: function beforeDestroy() {\n _popupManager2.default.deregister(this._popupId);\n _popupManager2.default.closeModal(this._popupId);\n\n this.restoreBodyStyle();\n },\n data: function data() {\n return {\n opened: false,\n bodyPaddingRight: null,\n computedBodyPaddingRight: 0,\n withoutHiddenClass: true,\n rendered: false\n };\n },\n\n\n watch: {\n visible: function visible(val) {\n var _this = this;\n\n if (val) {\n if (this._opening) return;\n if (!this.rendered) {\n this.rendered = true;\n _vue2.default.nextTick(function () {\n _this.open();\n });\n } else {\n this.open();\n }\n } else {\n this.close();\n }\n }\n },\n\n methods: {\n open: function open(options) {\n var _this2 = this;\n\n if (!this.rendered) {\n this.rendered = true;\n }\n\n var props = (0, _merge2.default)({}, this.$props || this, options);\n\n if (this._closeTimer) {\n clearTimeout(this._closeTimer);\n this._closeTimer = null;\n }\n clearTimeout(this._openTimer);\n\n var openDelay = Number(props.openDelay);\n if (openDelay > 0) {\n this._openTimer = setTimeout(function () {\n _this2._openTimer = null;\n _this2.doOpen(props);\n }, openDelay);\n } else {\n this.doOpen(props);\n }\n },\n doOpen: function doOpen(props) {\n if (this.$isServer) return;\n if (this.willOpen && !this.willOpen()) return;\n if (this.opened) return;\n\n this._opening = true;\n\n var dom = this.$el;\n\n var modal = props.modal;\n\n var zIndex = props.zIndex;\n if (zIndex) {\n _popupManager2.default.zIndex = zIndex;\n }\n\n if (modal) {\n if (this._closing) {\n _popupManager2.default.closeModal(this._popupId);\n this._closing = false;\n }\n _popupManager2.default.openModal(this._popupId, _popupManager2.default.nextZIndex(), this.modalAppendToBody ? undefined : dom, props.modalClass, props.modalFade);\n if (props.lockScroll) {\n this.withoutHiddenClass = !(0, _dom.hasClass)(document.body, 'el-popup-parent--hidden');\n if (this.withoutHiddenClass) {\n this.bodyPaddingRight = document.body.style.paddingRight;\n this.computedBodyPaddingRight = parseInt((0, _dom.getStyle)(document.body, 'paddingRight'), 10);\n }\n scrollBarWidth = (0, _scrollbarWidth2.default)();\n var bodyHasOverflow = document.documentElement.clientHeight < document.body.scrollHeight;\n var bodyOverflowY = (0, _dom.getStyle)(document.body, 'overflowY');\n if (scrollBarWidth > 0 && (bodyHasOverflow || bodyOverflowY === 'scroll') && this.withoutHiddenClass) {\n document.body.style.paddingRight = this.computedBodyPaddingRight + scrollBarWidth + 'px';\n }\n (0, _dom.addClass)(document.body, 'el-popup-parent--hidden');\n }\n }\n\n if (getComputedStyle(dom).position === 'static') {\n dom.style.position = 'absolute';\n }\n\n dom.style.zIndex = _popupManager2.default.nextZIndex();\n this.opened = true;\n\n this.onOpen && this.onOpen();\n\n this.doAfterOpen();\n },\n doAfterOpen: function doAfterOpen() {\n this._opening = false;\n },\n close: function close() {\n var _this3 = this;\n\n if (this.willClose && !this.willClose()) return;\n\n if (this._openTimer !== null) {\n clearTimeout(this._openTimer);\n this._openTimer = null;\n }\n clearTimeout(this._closeTimer);\n\n var closeDelay = Number(this.closeDelay);\n\n if (closeDelay > 0) {\n this._closeTimer = setTimeout(function () {\n _this3._closeTimer = null;\n _this3.doClose();\n }, closeDelay);\n } else {\n this.doClose();\n }\n },\n doClose: function doClose() {\n this._closing = true;\n\n this.onClose && this.onClose();\n\n if (this.lockScroll) {\n setTimeout(this.restoreBodyStyle, 200);\n }\n\n this.opened = false;\n\n this.doAfterClose();\n },\n doAfterClose: function doAfterClose() {\n _popupManager2.default.closeModal(this._popupId);\n this._closing = false;\n },\n restoreBodyStyle: function restoreBodyStyle() {\n if (this.modal && this.withoutHiddenClass) {\n document.body.style.paddingRight = this.bodyPaddingRight;\n (0, _dom.removeClass)(document.body, 'el-popup-parent--hidden');\n }\n this.withoutHiddenClass = true;\n }\n }\n};\nexports.PopupManager = _popupManager2.default;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvcG9wdXAvaW5kZXguanM/NTEyOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUFLOztBQUV4Qjs7QUFFQSxhQUFhLG1CQUFPLENBQUMsTUFBNEI7O0FBRWpEOztBQUVBLG9CQUFvQixtQkFBTyxDQUFDLE1BQTBDOztBQUV0RTs7QUFFQSxzQkFBc0IsbUJBQU8sQ0FBQyxNQUFvQjs7QUFFbEQ7O0FBRUEsV0FBVyxtQkFBTyxDQUFDLE1BQVE7O0FBRTNCLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3Rjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGlCQUFpQjtBQUNqQixrQkFBa0I7QUFDbEIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx5Q0FBeUM7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUxMjguanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLlBvcHVwTWFuYWdlciA9IHVuZGVmaW5lZDtcblxudmFyIF92dWUgPSByZXF1aXJlKCd2dWUnKTtcblxudmFyIF92dWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdnVlKTtcblxudmFyIF9tZXJnZSA9IHJlcXVpcmUoJ2VsZW1lbnQtdWkvbGliL3V0aWxzL21lcmdlJyk7XG5cbnZhciBfbWVyZ2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbWVyZ2UpO1xuXG52YXIgX3BvcHVwTWFuYWdlciA9IHJlcXVpcmUoJ2VsZW1lbnQtdWkvbGliL3V0aWxzL3BvcHVwL3BvcHVwLW1hbmFnZXInKTtcblxudmFyIF9wb3B1cE1hbmFnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9wdXBNYW5hZ2VyKTtcblxudmFyIF9zY3JvbGxiYXJXaWR0aCA9IHJlcXVpcmUoJy4uL3Njcm9sbGJhci13aWR0aCcpO1xuXG52YXIgX3Njcm9sbGJhcldpZHRoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Njcm9sbGJhcldpZHRoKTtcblxudmFyIF9kb20gPSByZXF1aXJlKCcuLi9kb20nKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGlkU2VlZCA9IDE7XG5cbnZhciBzY3JvbGxCYXJXaWR0aCA9IHZvaWQgMDtcblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBwcm9wczoge1xuICAgIHZpc2libGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgb3BlbkRlbGF5OiB7fSxcbiAgICBjbG9zZURlbGF5OiB7fSxcbiAgICB6SW5kZXg6IHt9LFxuICAgIG1vZGFsOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIG1vZGFsRmFkZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIG1vZGFsQ2xhc3M6IHt9LFxuICAgIG1vZGFsQXBwZW5kVG9Cb2R5OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIGxvY2tTY3JvbGw6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjbG9zZU9uUHJlc3NFc2NhcGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgY2xvc2VPbkNsaWNrTW9kYWw6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBiZWZvcmVNb3VudDogZnVuY3Rpb24gYmVmb3JlTW91bnQoKSB7XG4gICAgdGhpcy5fcG9wdXBJZCA9ICdwb3B1cC0nICsgaWRTZWVkKys7XG4gICAgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5yZWdpc3Rlcih0aGlzLl9wb3B1cElkLCB0aGlzKTtcbiAgfSxcbiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICBfcG9wdXBNYW5hZ2VyMi5kZWZhdWx0LmRlcmVnaXN0ZXIodGhpcy5fcG9wdXBJZCk7XG4gICAgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5jbG9zZU1vZGFsKHRoaXMuX3BvcHVwSWQpO1xuXG4gICAgdGhpcy5yZXN0b3JlQm9keVN0eWxlKCk7XG4gIH0sXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5lZDogZmFsc2UsXG4gICAgICBib2R5UGFkZGluZ1JpZ2h0OiBudWxsLFxuICAgICAgY29tcHV0ZWRCb2R5UGFkZGluZ1JpZ2h0OiAwLFxuICAgICAgd2l0aG91dEhpZGRlbkNsYXNzOiB0cnVlLFxuICAgICAgcmVuZGVyZWQ6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIHdhdGNoOiB7XG4gICAgdmlzaWJsZTogZnVuY3Rpb24gdmlzaWJsZSh2YWwpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgaWYgKHRoaXMuX29wZW5pbmcpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLnJlbmRlcmVkKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlZCA9IHRydWU7XG4gICAgICAgICAgX3Z1ZTIuZGVmYXVsdC5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5vcGVuKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9wZW46IGZ1bmN0aW9uIG9wZW4ob3B0aW9ucykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5yZW5kZXJlZCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb3BzID0gKDAsIF9tZXJnZTIuZGVmYXVsdCkoe30sIHRoaXMuJHByb3BzIHx8IHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAodGhpcy5fY2xvc2VUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY2xvc2VUaW1lcik7XG4gICAgICAgIHRoaXMuX2Nsb3NlVGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX29wZW5UaW1lcik7XG5cbiAgICAgIHZhciBvcGVuRGVsYXkgPSBOdW1iZXIocHJvcHMub3BlbkRlbGF5KTtcbiAgICAgIGlmIChvcGVuRGVsYXkgPiAwKSB7XG4gICAgICAgIHRoaXMuX29wZW5UaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMi5fb3BlblRpbWVyID0gbnVsbDtcbiAgICAgICAgICBfdGhpczIuZG9PcGVuKHByb3BzKTtcbiAgICAgICAgfSwgb3BlbkRlbGF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZG9PcGVuKHByb3BzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRvT3BlbjogZnVuY3Rpb24gZG9PcGVuKHByb3BzKSB7XG4gICAgICBpZiAodGhpcy4kaXNTZXJ2ZXIpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLndpbGxPcGVuICYmICF0aGlzLndpbGxPcGVuKCkpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLm9wZW5lZCkgcmV0dXJuO1xuXG4gICAgICB0aGlzLl9vcGVuaW5nID0gdHJ1ZTtcblxuICAgICAgdmFyIGRvbSA9IHRoaXMuJGVsO1xuXG4gICAgICB2YXIgbW9kYWwgPSBwcm9wcy5tb2RhbDtcblxuICAgICAgdmFyIHpJbmRleCA9IHByb3BzLnpJbmRleDtcbiAgICAgIGlmICh6SW5kZXgpIHtcbiAgICAgICAgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC56SW5kZXggPSB6SW5kZXg7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RhbCkge1xuICAgICAgICBpZiAodGhpcy5fY2xvc2luZykge1xuICAgICAgICAgIF9wb3B1cE1hbmFnZXIyLmRlZmF1bHQuY2xvc2VNb2RhbCh0aGlzLl9wb3B1cElkKTtcbiAgICAgICAgICB0aGlzLl9jbG9zaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5vcGVuTW9kYWwodGhpcy5fcG9wdXBJZCwgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5uZXh0WkluZGV4KCksIHRoaXMubW9kYWxBcHBlbmRUb0JvZHkgPyB1bmRlZmluZWQgOiBkb20sIHByb3BzLm1vZGFsQ2xhc3MsIHByb3BzLm1vZGFsRmFkZSk7XG4gICAgICAgIGlmIChwcm9wcy5sb2NrU2Nyb2xsKSB7XG4gICAgICAgICAgdGhpcy53aXRob3V0SGlkZGVuQ2xhc3MgPSAhKDAsIF9kb20uaGFzQ2xhc3MpKGRvY3VtZW50LmJvZHksICdlbC1wb3B1cC1wYXJlbnQtLWhpZGRlbicpO1xuICAgICAgICAgIGlmICh0aGlzLndpdGhvdXRIaWRkZW5DbGFzcykge1xuICAgICAgICAgICAgdGhpcy5ib2R5UGFkZGluZ1JpZ2h0ID0gZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkQm9keVBhZGRpbmdSaWdodCA9IHBhcnNlSW50KCgwLCBfZG9tLmdldFN0eWxlKShkb2N1bWVudC5ib2R5LCAncGFkZGluZ1JpZ2h0JyksIDEwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Nyb2xsQmFyV2lkdGggPSAoMCwgX3Njcm9sbGJhcldpZHRoMi5kZWZhdWx0KSgpO1xuICAgICAgICAgIHZhciBib2R5SGFzT3ZlcmZsb3cgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IDwgZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ7XG4gICAgICAgICAgdmFyIGJvZHlPdmVyZmxvd1kgPSAoMCwgX2RvbS5nZXRTdHlsZSkoZG9jdW1lbnQuYm9keSwgJ292ZXJmbG93WScpO1xuICAgICAgICAgIGlmIChzY3JvbGxCYXJXaWR0aCA+IDAgJiYgKGJvZHlIYXNPdmVyZmxvdyB8fCBib2R5T3ZlcmZsb3dZID09PSAnc2Nyb2xsJykgJiYgdGhpcy53aXRob3V0SGlkZGVuQ2xhc3MpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gdGhpcy5jb21wdXRlZEJvZHlQYWRkaW5nUmlnaHQgKyBzY3JvbGxCYXJXaWR0aCArICdweCc7XG4gICAgICAgICAgfVxuICAgICAgICAgICgwLCBfZG9tLmFkZENsYXNzKShkb2N1bWVudC5ib2R5LCAnZWwtcG9wdXAtcGFyZW50LS1oaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShkb20pLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICBkb20uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgfVxuXG4gICAgICBkb20uc3R5bGUuekluZGV4ID0gX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5uZXh0WkluZGV4KCk7XG4gICAgICB0aGlzLm9wZW5lZCA9IHRydWU7XG5cbiAgICAgIHRoaXMub25PcGVuICYmIHRoaXMub25PcGVuKCk7XG5cbiAgICAgIHRoaXMuZG9BZnRlck9wZW4oKTtcbiAgICB9LFxuICAgIGRvQWZ0ZXJPcGVuOiBmdW5jdGlvbiBkb0FmdGVyT3BlbigpIHtcbiAgICAgIHRoaXMuX29wZW5pbmcgPSBmYWxzZTtcbiAgICB9LFxuICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy53aWxsQ2xvc2UgJiYgIXRoaXMud2lsbENsb3NlKCkpIHJldHVybjtcblxuICAgICAgaWYgKHRoaXMuX29wZW5UaW1lciAhPT0gbnVsbCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fb3BlblRpbWVyKTtcbiAgICAgICAgdGhpcy5fb3BlblRpbWVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZVRpbWVyKTtcblxuICAgICAgdmFyIGNsb3NlRGVsYXkgPSBOdW1iZXIodGhpcy5jbG9zZURlbGF5KTtcblxuICAgICAgaWYgKGNsb3NlRGVsYXkgPiAwKSB7XG4gICAgICAgIHRoaXMuX2Nsb3NlVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczMuX2Nsb3NlVGltZXIgPSBudWxsO1xuICAgICAgICAgIF90aGlzMy5kb0Nsb3NlKCk7XG4gICAgICAgIH0sIGNsb3NlRGVsYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kb0Nsb3NlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkb0Nsb3NlOiBmdW5jdGlvbiBkb0Nsb3NlKCkge1xuICAgICAgdGhpcy5fY2xvc2luZyA9IHRydWU7XG5cbiAgICAgIHRoaXMub25DbG9zZSAmJiB0aGlzLm9uQ2xvc2UoKTtcblxuICAgICAgaWYgKHRoaXMubG9ja1Njcm9sbCkge1xuICAgICAgICBzZXRUaW1lb3V0KHRoaXMucmVzdG9yZUJvZHlTdHlsZSwgMjAwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcGVuZWQgPSBmYWxzZTtcblxuICAgICAgdGhpcy5kb0FmdGVyQ2xvc2UoKTtcbiAgICB9LFxuICAgIGRvQWZ0ZXJDbG9zZTogZnVuY3Rpb24gZG9BZnRlckNsb3NlKCkge1xuICAgICAgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5jbG9zZU1vZGFsKHRoaXMuX3BvcHVwSWQpO1xuICAgICAgdGhpcy5fY2xvc2luZyA9IGZhbHNlO1xuICAgIH0sXG4gICAgcmVzdG9yZUJvZHlTdHlsZTogZnVuY3Rpb24gcmVzdG9yZUJvZHlTdHlsZSgpIHtcbiAgICAgIGlmICh0aGlzLm1vZGFsICYmIHRoaXMud2l0aG91dEhpZGRlbkNsYXNzKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gdGhpcy5ib2R5UGFkZGluZ1JpZ2h0O1xuICAgICAgICAoMCwgX2RvbS5yZW1vdmVDbGFzcykoZG9jdW1lbnQuYm9keSwgJ2VsLXBvcHVwLXBhcmVudC0taGlkZGVuJyk7XG4gICAgICB9XG4gICAgICB0aGlzLndpdGhvdXRIaWRkZW5DbGFzcyA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuZXhwb3J0cy5Qb3B1cE1hbmFnZXIgPSBfcG9wdXBNYW5hZ2VyMi5kZWZhdWx0OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5128\n")},5488:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nvar _dom = __webpack_require__(\"5924\");\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Transition = function () {\n function Transition() {\n _classCallCheck(this, Transition);\n }\n\n Transition.prototype.beforeEnter = function beforeEnter(el) {\n (0, _dom.addClass)(el, 'collapse-transition');\n if (!el.dataset) el.dataset = {};\n\n el.dataset.oldPaddingTop = el.style.paddingTop;\n el.dataset.oldPaddingBottom = el.style.paddingBottom;\n\n el.style.height = '0';\n el.style.paddingTop = 0;\n el.style.paddingBottom = 0;\n };\n\n Transition.prototype.enter = function enter(el) {\n el.dataset.oldOverflow = el.style.overflow;\n if (el.scrollHeight !== 0) {\n el.style.height = el.scrollHeight + 'px';\n el.style.paddingTop = el.dataset.oldPaddingTop;\n el.style.paddingBottom = el.dataset.oldPaddingBottom;\n } else {\n el.style.height = '';\n el.style.paddingTop = el.dataset.oldPaddingTop;\n el.style.paddingBottom = el.dataset.oldPaddingBottom;\n }\n\n el.style.overflow = 'hidden';\n };\n\n Transition.prototype.afterEnter = function afterEnter(el) {\n // for safari: remove class then reset height is necessary\n (0, _dom.removeClass)(el, 'collapse-transition');\n el.style.height = '';\n el.style.overflow = el.dataset.oldOverflow;\n };\n\n Transition.prototype.beforeLeave = function beforeLeave(el) {\n if (!el.dataset) el.dataset = {};\n el.dataset.oldPaddingTop = el.style.paddingTop;\n el.dataset.oldPaddingBottom = el.style.paddingBottom;\n el.dataset.oldOverflow = el.style.overflow;\n\n el.style.height = el.scrollHeight + 'px';\n el.style.overflow = 'hidden';\n };\n\n Transition.prototype.leave = function leave(el) {\n if (el.scrollHeight !== 0) {\n // for safari: add class after set height, or it will jump to zero height suddenly, weired\n (0, _dom.addClass)(el, 'collapse-transition');\n el.style.height = 0;\n el.style.paddingTop = 0;\n el.style.paddingBottom = 0;\n }\n };\n\n Transition.prototype.afterLeave = function afterLeave(el) {\n (0, _dom.removeClass)(el, 'collapse-transition');\n el.style.height = '';\n el.style.overflow = el.dataset.oldOverflow;\n el.style.paddingTop = el.dataset.oldPaddingTop;\n el.style.paddingBottom = el.dataset.oldPaddingBottom;\n };\n\n return Transition;\n}();\n\nexports.default = {\n name: 'ElCollapseTransition',\n functional: true,\n render: function render(h, _ref) {\n var children = _ref.children;\n\n var data = {\n on: new Transition()\n };\n\n return h('transition', data, children);\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdHJhbnNpdGlvbnMvY29sbGFwc2UtdHJhbnNpdGlvbi5qcz81NDg4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFN0MsaURBQWlELDBDQUEwQywwREFBMEQsRUFBRTs7QUFFdko7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6IjU0ODguanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZG9tID0gcmVxdWlyZSgnZWxlbWVudC11aS9saWIvdXRpbHMvZG9tJyk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUcmFuc2l0aW9uKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUcmFuc2l0aW9uKTtcbiAgfVxuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLmJlZm9yZUVudGVyID0gZnVuY3Rpb24gYmVmb3JlRW50ZXIoZWwpIHtcbiAgICAoMCwgX2RvbS5hZGRDbGFzcykoZWwsICdjb2xsYXBzZS10cmFuc2l0aW9uJyk7XG4gICAgaWYgKCFlbC5kYXRhc2V0KSBlbC5kYXRhc2V0ID0ge307XG5cbiAgICBlbC5kYXRhc2V0Lm9sZFBhZGRpbmdUb3AgPSBlbC5zdHlsZS5wYWRkaW5nVG9wO1xuICAgIGVsLmRhdGFzZXQub2xkUGFkZGluZ0JvdHRvbSA9IGVsLnN0eWxlLnBhZGRpbmdCb3R0b207XG5cbiAgICBlbC5zdHlsZS5oZWlnaHQgPSAnMCc7XG4gICAgZWwuc3R5bGUucGFkZGluZ1RvcCA9IDA7XG4gICAgZWwuc3R5bGUucGFkZGluZ0JvdHRvbSA9IDA7XG4gIH07XG5cbiAgVHJhbnNpdGlvbi5wcm90b3R5cGUuZW50ZXIgPSBmdW5jdGlvbiBlbnRlcihlbCkge1xuICAgIGVsLmRhdGFzZXQub2xkT3ZlcmZsb3cgPSBlbC5zdHlsZS5vdmVyZmxvdztcbiAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0ICE9PSAwKSB7XG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSBlbC5zY3JvbGxIZWlnaHQgKyAncHgnO1xuICAgICAgZWwuc3R5bGUucGFkZGluZ1RvcCA9IGVsLmRhdGFzZXQub2xkUGFkZGluZ1RvcDtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBlbC5kYXRhc2V0Lm9sZFBhZGRpbmdCb3R0b207XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgZWwuc3R5bGUucGFkZGluZ1RvcCA9IGVsLmRhdGFzZXQub2xkUGFkZGluZ1RvcDtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBlbC5kYXRhc2V0Lm9sZFBhZGRpbmdCb3R0b207XG4gICAgfVxuXG4gICAgZWwuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgfTtcblxuICBUcmFuc2l0aW9uLnByb3RvdHlwZS5hZnRlckVudGVyID0gZnVuY3Rpb24gYWZ0ZXJFbnRlcihlbCkge1xuICAgIC8vIGZvciBzYWZhcmk6IHJlbW92ZSBjbGFzcyB0aGVuIHJlc2V0IGhlaWdodCBpcyBuZWNlc3NhcnlcbiAgICAoMCwgX2RvbS5yZW1vdmVDbGFzcykoZWwsICdjb2xsYXBzZS10cmFuc2l0aW9uJyk7XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgZWwuc3R5bGUub3ZlcmZsb3cgPSBlbC5kYXRhc2V0Lm9sZE92ZXJmbG93O1xuICB9O1xuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLmJlZm9yZUxlYXZlID0gZnVuY3Rpb24gYmVmb3JlTGVhdmUoZWwpIHtcbiAgICBpZiAoIWVsLmRhdGFzZXQpIGVsLmRhdGFzZXQgPSB7fTtcbiAgICBlbC5kYXRhc2V0Lm9sZFBhZGRpbmdUb3AgPSBlbC5zdHlsZS5wYWRkaW5nVG9wO1xuICAgIGVsLmRhdGFzZXQub2xkUGFkZGluZ0JvdHRvbSA9IGVsLnN0eWxlLnBhZGRpbmdCb3R0b207XG4gICAgZWwuZGF0YXNldC5vbGRPdmVyZmxvdyA9IGVsLnN0eWxlLm92ZXJmbG93O1xuXG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gZWwuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcbiAgICBlbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICB9O1xuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLmxlYXZlID0gZnVuY3Rpb24gbGVhdmUoZWwpIHtcbiAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0ICE9PSAwKSB7XG4gICAgICAvLyBmb3Igc2FmYXJpOiBhZGQgY2xhc3MgYWZ0ZXIgc2V0IGhlaWdodCwgb3IgaXQgd2lsbCBqdW1wIHRvIHplcm8gaGVpZ2h0IHN1ZGRlbmx5LCB3ZWlyZWRcbiAgICAgICgwLCBfZG9tLmFkZENsYXNzKShlbCwgJ2NvbGxhcHNlLXRyYW5zaXRpb24nKTtcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IDA7XG4gICAgICBlbC5zdHlsZS5wYWRkaW5nVG9wID0gMDtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdCb3R0b20gPSAwO1xuICAgIH1cbiAgfTtcblxuICBUcmFuc2l0aW9uLnByb3RvdHlwZS5hZnRlckxlYXZlID0gZnVuY3Rpb24gYWZ0ZXJMZWF2ZShlbCkge1xuICAgICgwLCBfZG9tLnJlbW92ZUNsYXNzKShlbCwgJ2NvbGxhcHNlLXRyYW5zaXRpb24nKTtcbiAgICBlbC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICBlbC5zdHlsZS5vdmVyZmxvdyA9IGVsLmRhdGFzZXQub2xkT3ZlcmZsb3c7XG4gICAgZWwuc3R5bGUucGFkZGluZ1RvcCA9IGVsLmRhdGFzZXQub2xkUGFkZGluZ1RvcDtcbiAgICBlbC5zdHlsZS5wYWRkaW5nQm90dG9tID0gZWwuZGF0YXNldC5vbGRQYWRkaW5nQm90dG9tO1xuICB9O1xuXG4gIHJldHVybiBUcmFuc2l0aW9uO1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIG5hbWU6ICdFbENvbGxhcHNlVHJhbnNpdGlvbicsXG4gIGZ1bmN0aW9uYWw6IHRydWUsXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgsIF9yZWYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuXG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICBvbjogbmV3IFRyYW5zaXRpb24oKVxuICAgIH07XG5cbiAgICByZXR1cm4gaCgndHJhbnNpdGlvbicsIGRhdGEsIGNoaWxkcmVuKTtcbiAgfVxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5488\n")},5858:function(module,exports,__webpack_require__){"use strict";eval("/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;var _typeof=typeof Symbol===\"function\"&&typeof Symbol.iterator===\"symbol\"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol===\"function\"&&obj.constructor===Symbol&&obj!==Symbol.prototype?\"symbol\":typeof obj;};/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright JS Foundation and other contributors <https://js.foundation/>\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 *//*eslint-disable*/(function(){/** Used as a safe reference for `undefined` in pre-ES5 environments. */var undefined;/** Used as the semantic version number. */var VERSION='4.17.10';/** 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.7976931348623157e308,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À:'A',Á:'A',Â:'A',Ã:'A',Ä:'A',Å:'A',à:'a',á:'a',â:'a',ã:'a',ä:'a',å:'a',Ç:'C',ç:'c',Ð:'D',ð:'d',È:'E',É:'E',Ê:'E',Ë:'E',è:'e',é:'e',ê:'e',ë:'e',Ì:'I',Í:'I',Î:'I',Ï:'I',ì:'i',í:'i',î:'i',ï:'i',Ñ:'N',ñ:'n',Ò:'O',Ó:'O',Ô:'O',Õ:'O',Ö:'O',Ø:'O',ò:'o',ó:'o',ô:'o',õ:'o',ö:'o',ø:'o',Ù:'U',Ú:'U',Û:'U',Ü:'U',ù:'u',ú:'u',û:'u',ü:'u',Ý:'Y',ý:'y',ÿ:'y',Æ:'Ae',æ:'ae',Þ:'Th',þ:'th',ß:'ss',// Latin Extended-A block.\nĀ:'A',Ă:'A',Ą:'A',ā:'a',ă:'a',ą:'a',Ć:'C',Ĉ:'C',Ċ:'C',Č:'C',ć:'c',ĉ:'c',ċ:'c',č:'c',Ď:'D',Đ:'D',ď:'d',đ:'d',Ē:'E',Ĕ:'E',Ė:'E',Ę:'E',Ě:'E',ē:'e',ĕ:'e',ė:'e',ę:'e',ě:'e',Ĝ:'G',Ğ:'G',Ġ:'G',Ģ:'G',ĝ:'g',ğ:'g',ġ:'g',ģ:'g',Ĥ:'H',Ħ:'H',ĥ:'h',ħ:'h',Ĩ:'I',Ī:'I',Ĭ:'I',Į:'I',İ:'I',ĩ:'i',ī:'i',ĭ:'i',į:'i',ı:'i',Ĵ:'J',ĵ:'j',Ķ:'K',ķ:'k',ĸ:'k',Ĺ:'L',Ļ:'L',Ľ:'L',Ŀ:'L',Ł:'L',ĺ:'l',ļ:'l',ľ:'l',ŀ:'l',ł:'l',Ń:'N',Ņ:'N',Ň:'N',Ŋ:'N',ń:'n',ņ:'n',ň:'n',ŋ:'n',Ō:'O',Ŏ:'O',Ő:'O',ō:'o',ŏ:'o',ő:'o',Ŕ:'R',Ŗ:'R',Ř:'R',ŕ:'r',ŗ:'r',ř:'r',Ś:'S',Ŝ:'S',Ş:'S',Š:'S',ś:'s',ŝ:'s',ş:'s',š:'s',Ţ:'T',Ť:'T',Ŧ:'T',ţ:'t',ť:'t',ŧ:'t',Ũ:'U',Ū:'U',Ŭ:'U',Ů:'U',Ű:'U',Ų:'U',ũ:'u',ū:'u',ŭ:'u',ů:'u',ű:'u',ų:'u',Ŵ:'W',ŵ:'w',Ŷ:'Y',ŷ:'y',Ÿ:'Y',Ź:'Z',Ż:'Z',Ž:'Z',ź:'z',ż:'z',ž:'z',IJ:'IJ',ij:'ij',Œ:'Oe',œ:'oe',ʼn:\"'n\",ſ:'s'};/** Used to map characters to HTML entities. */var htmlEscapes={'&':'&','<':'<','>':'>','\"':'"',\"'\":'''};/** Used to map HTML entities to characters. */var htmlUnescapes={'&':'&','<':'<','>':'>','"':'\"',''':\"'\"};/** 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 global==='undefined'?'undefined':_typeof(global))==='object'&&global&&global.Object===Object&&global;/** 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?undefined:_typeof(exports))==='object'&&exports&&!exports.nodeType&&exports;/** Detect free variable `module`. */var freeModule=freeExports&&( false?undefined:_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 * Gets the value at `key`, unless `key` is \"__proto__\".\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){return key=='__proto__'?undefined:object[key];}/**\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&©Object(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&©Object(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));});return result;}if(isMap(value)){value.forEach(function(subValue,key){result.set(key,baseClone(subValue,bitmask,customizer,key,value,stack));});return result;}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==='undefined'?'undefined':_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){if(isObject(srcValue)){stack||(stack=new Stack());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)||srcIndex&&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){var index=-1;iteratees=arrayMap(iteratees.length?iteratees:[identity],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(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){value=iteratee(value);var low=0,high=array==null?0:array.length,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){// 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;}// Assume cyclic values are equal.\nvar stacked=stack.get(array);if(stacked&&stack.get(other)){return stacked==other;}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;}}// Assume cyclic values are equal.\nvar stacked=stack.get(object);if(stacked&&stack.get(other)){return stacked==other;}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==='undefined'?'undefined':_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==='undefined'?'undefined':_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==='undefined'?'undefined':_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==='undefined'?'undefined':_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 * 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 */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': 40 },\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', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['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.\ntimerId=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, & 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==='undefined'?'undefined':_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==='undefined'?'undefined':_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==='undefined'?'undefined':_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, & 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><script></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.\nvar sourceURL='//# sourceURL='+('sourceURL'in options?options.sourceURL:'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=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 * `&`, `<`, `>`, `"`, and `'` 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, & 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 * @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 */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 * @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 */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 * @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 * @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 */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+'',names=realNames[key]||(realNames[key]=[]);names.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__(\"3c35\"))==='object'&&__webpack_require__(\"3c35\")){// 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\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(undefined);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(\"c8ba\"), __webpack_require__(\"62e4\")(module)))\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvbG9kYXNoLmpzPzU4NTgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0ZBQWEsd0ZBQXdGLG1CQUFtQixlQUFlLCtHQUErRztBQUN0UDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsc0ZBQXNGLGlFQUFpRSxxRkFBcUYsMkpBQTJKLG1HQUFtRyx1RUFBdUUsMEZBQTBGLHlHQUF5RywwR0FBMEcsNFFBQTRRLHlHQUF5RyxtSEFBbUgsNEdBQTRHLHVKQUF1SixxTEFBcUwsZ1ZBQWdWLDZwQkFBNnBCLHlYQUF5WCw4R0FBOEcsK0ZBQStGLEdBQUcsa0dBQWtHLDhIQUE4SCx1SUFBdUksa1FBQWtRO0FBQzk3SDtBQUNBO0FBQ0EseUNBQXlDLGlEQUFpRCxpSEFBaUgsK0RBQStELDBEQUEwRCx3REFBd0QsMkhBQTJILCtFQUErRTtBQUN0a0I7QUFDQTtBQUNBLDZCQUE2QixNQUFNLGFBQWEsT0FBTyxHQUFHLHdGQUF3RiwrRkFBK0YsdUVBQXVFLGdHQUFnRyxzRUFBc0UsOEVBQThFLHdJQUF3SSxrRkFBa0YscUhBQXFILDZ4QkFBNnhCLGdlQUFnZSxFQUFFLCtGQUErRixtc0JBQW1zQiwrREFBK0Q7QUFDMzlGO0FBQ0E7QUFDQSwyQ0FBMkMsMkpBQTJKLGdYQUFnWCxtT0FBbU8sbUhBQW1ILEdBQUcsaURBQWlELGlaQUFpWixrRkFBa0YsbUZBQW1GLGtQQUFrUCxvWUFBb1kseUZBQXlGLHdpQkFBd2lCLCtFQUErRSxxRkFBcUY7QUFDajVGO0FBQ0Esc3dCQUFzd0IsZ0VBQWdFLFVBQVUsV0FBVyxXQUFXLGFBQWEsWUFBWSxHQUFHLGtFQUFrRSxNQUFNLFdBQVcsV0FBVyxhQUFhLFlBQVksT0FBTyw4RkFBOEYsdUVBQXVFLHFIQUFxSCw4S0FBOEssbUpBQW1KLHlHQUF5Ryx1REFBdUQsTUFBNEIsQ0FBQyxTQUFXLG1FQUFtRSxrRUFBa0UsTUFBMkIs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QUE0RCxnQkFBZ0IseURBQXlELHVEQUF1RCx5Q0FBeUMscUNBQXFDO0FBQzN4QywyREFBMkQsK09BQStPLGdCQUFnQixRQUFRLHdDQUF3QywwSUFBMEksNENBQTRDLDREQUE0RCw0Q0FBNEMsNkVBQTZFO0FBQ3J0QixzQkFBc0IsOEhBQThILDJCQUEyQiwyQ0FBMkMsa0NBQWtDLHlCQUF5QiwrQ0FBK0MsRUFBRSwyQ0FBMkMsMEJBQTBCLDhCQUE4Qiw4QkFBOEIsc0VBQXNFLEVBQUU7QUFDL2dCLGdGQUFnRixrSkFBa0osd0NBQXdDLG1CQUFtQixrQ0FBa0MsdUJBQXVCLGlEQUFpRCx1Q0FBdUMsaURBQWlELEtBQUssRUFBRTtBQUN0ZSwyREFBMkQsa0NBQWtDLGVBQWUscUVBQXFFLFlBQVksZ0NBQWdDLElBQUksRUFBRSw2REFBNkQsOEJBQThCLEVBQUU7QUFDaFUsc0NBQXNDLDBDQUEwQyxzQ0FBc0M7QUFDdEgsOEJBQThCLG9DQUFvQyxzQ0FBc0Msa0NBQWtDLG9DQUFvQyx3Q0FBd0MscUZBQXFGO0FBQzNTLDZDQUE2QyxnQkFBZ0IsaURBQWlELGdCQUFnQjtBQUM5SCxxQkFBcUI7QUFDckIsR0FBRyxLQUEwQixVQUFVLDJCQUFVLGNBQWMsMkJBQVUsRUFBRTtBQUMzRTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxtQ0FBTyxXQUFXLFVBQVU7QUFBQSxvR0FBQyxFQUFFO0FBQy9CLG9CQUFvQjtBQUNwQiwyQkFBMkI7QUFDM0IsaUJBQWlCLEtBQUs7QUFDdEIsV0FBVyxrQiIsImZpbGUiOiI1ODU4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO3ZhciBfdHlwZW9mPXR5cGVvZiBTeW1ib2w9PT1cImZ1bmN0aW9uXCImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PT1cInN5bWJvbFwiP2Z1bmN0aW9uKG9iail7cmV0dXJuIHR5cGVvZiBvYmo7fTpmdW5jdGlvbihvYmope3JldHVybiBvYmomJnR5cGVvZiBTeW1ib2w9PT1cImZ1bmN0aW9uXCImJm9iai5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmb2JqIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBvYmo7fTsvKipcbiAqIEBsaWNlbnNlXG4gKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pzLmZvdW5kYXRpb24vPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovLyplc2xpbnQtZGlzYWJsZSovKGZ1bmN0aW9uKCl7LyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlLUVTNSBlbnZpcm9ubWVudHMuICovdmFyIHVuZGVmaW5lZDsvKiogVXNlZCBhcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuICovdmFyIFZFUlNJT049JzQuMTcuMTAnOy8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL3ZhciBMQVJHRV9BUlJBWV9TSVpFPTIwMDsvKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovdmFyIENPUkVfRVJST1JfVEVYVD0nVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuJyxGVU5DX0VSUk9SX1RFWFQ9J0V4cGVjdGVkIGEgZnVuY3Rpb24nOy8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi92YXIgSEFTSF9VTkRFRklORUQ9J19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nOy8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi92YXIgTUFYX01FTU9JWkVfU0laRT01MDA7LyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqL3ZhciBQTEFDRUhPTERFUj0nX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyc7LyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi92YXIgQ0xPTkVfREVFUF9GTEFHPTEsQ0xPTkVfRkxBVF9GTEFHPTIsQ0xPTkVfU1lNQk9MU19GTEFHPTQ7LyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovdmFyIENPTVBBUkVfUEFSVElBTF9GTEFHPTEsQ09NUEFSRV9VTk9SREVSRURfRkxBRz0yOy8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL3ZhciBXUkFQX0JJTkRfRkxBRz0xLFdSQVBfQklORF9LRVlfRkxBRz0yLFdSQVBfQ1VSUllfQk9VTkRfRkxBRz00LFdSQVBfQ1VSUllfRkxBRz04LFdSQVBfQ1VSUllfUklHSFRfRkxBRz0xNixXUkFQX1BBUlRJQUxfRkxBRz0zMixXUkFQX1BBUlRJQUxfUklHSFRfRkxBRz02NCxXUkFQX0FSWV9GTEFHPTEyOCxXUkFQX1JFQVJHX0ZMQUc9MjU2LFdSQVBfRkxJUF9GTEFHPTUxMjsvKiogVXNlZCBhcyBkZWZhdWx0IG9wdGlvbnMgZm9yIGBfLnRydW5jYXRlYC4gKi92YXIgREVGQVVMVF9UUlVOQ19MRU5HVEg9MzAsREVGQVVMVF9UUlVOQ19PTUlTU0lPTj0nLi4uJzsvKiogVXNlZCB0byBkZXRlY3QgaG90IGZ1bmN0aW9ucyBieSBudW1iZXIgb2YgY2FsbHMgd2l0aGluIGEgc3BhbiBvZiBtaWxsaXNlY29uZHMuICovdmFyIEhPVF9DT1VOVD04MDAsSE9UX1NQQU49MTY7LyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovdmFyIExBWllfRklMVEVSX0ZMQUc9MSxMQVpZX01BUF9GTEFHPTIsTEFaWV9XSElMRV9GTEFHPTM7LyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovdmFyIElORklOSVRZPTEvMCxNQVhfU0FGRV9JTlRFR0VSPTkwMDcxOTkyNTQ3NDA5OTEsTUFYX0lOVEVHRVI9MS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCxOQU49MC8wOy8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgaW5kZXggb2YgYW4gYXJyYXkuICovdmFyIE1BWF9BUlJBWV9MRU5HVEg9NDI5NDk2NzI5NSxNQVhfQVJSQVlfSU5ERVg9TUFYX0FSUkFZX0xFTkdUSC0xLEhBTEZfTUFYX0FSUkFZX0xFTkdUSD1NQVhfQVJSQVlfTEVOR1RIPj4+MTsvKiogVXNlZCB0byBhc3NvY2lhdGUgd3JhcCBtZXRob2RzIHdpdGggdGhlaXIgYml0IGZsYWdzLiAqL3ZhciB3cmFwRmxhZ3M9W1snYXJ5JyxXUkFQX0FSWV9GTEFHXSxbJ2JpbmQnLFdSQVBfQklORF9GTEFHXSxbJ2JpbmRLZXknLFdSQVBfQklORF9LRVlfRkxBR10sWydjdXJyeScsV1JBUF9DVVJSWV9GTEFHXSxbJ2N1cnJ5UmlnaHQnLFdSQVBfQ1VSUllfUklHSFRfRkxBR10sWydmbGlwJyxXUkFQX0ZMSVBfRkxBR10sWydwYXJ0aWFsJyxXUkFQX1BBUlRJQUxfRkxBR10sWydwYXJ0aWFsUmlnaHQnLFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSxbJ3JlYXJnJyxXUkFQX1JFQVJHX0ZMQUddXTsvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovdmFyIGFyZ3NUYWc9J1tvYmplY3QgQXJndW1lbnRzXScsYXJyYXlUYWc9J1tvYmplY3QgQXJyYXldJyxhc3luY1RhZz0nW29iamVjdCBBc3luY0Z1bmN0aW9uXScsYm9vbFRhZz0nW29iamVjdCBCb29sZWFuXScsZGF0ZVRhZz0nW29iamVjdCBEYXRlXScsZG9tRXhjVGFnPSdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nLGVycm9yVGFnPSdbb2JqZWN0IEVycm9yXScsZnVuY1RhZz0nW29iamVjdCBGdW5jdGlvbl0nLGdlblRhZz0nW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLG1hcFRhZz0nW29iamVjdCBNYXBdJyxudW1iZXJUYWc9J1tvYmplY3QgTnVtYmVyXScsbnVsbFRhZz0nW29iamVjdCBOdWxsXScsb2JqZWN0VGFnPSdbb2JqZWN0IE9iamVjdF0nLHByb21pc2VUYWc9J1tvYmplY3QgUHJvbWlzZV0nLHByb3h5VGFnPSdbb2JqZWN0IFByb3h5XScscmVnZXhwVGFnPSdbb2JqZWN0IFJlZ0V4cF0nLHNldFRhZz0nW29iamVjdCBTZXRdJyxzdHJpbmdUYWc9J1tvYmplY3QgU3RyaW5nXScsc3ltYm9sVGFnPSdbb2JqZWN0IFN5bWJvbF0nLHVuZGVmaW5lZFRhZz0nW29iamVjdCBVbmRlZmluZWRdJyx3ZWFrTWFwVGFnPSdbb2JqZWN0IFdlYWtNYXBdJyx3ZWFrU2V0VGFnPSdbb2JqZWN0IFdlYWtTZXRdJzt2YXIgYXJyYXlCdWZmZXJUYWc9J1tvYmplY3QgQXJyYXlCdWZmZXJdJyxkYXRhVmlld1RhZz0nW29iamVjdCBEYXRhVmlld10nLGZsb2F0MzJUYWc9J1tvYmplY3QgRmxvYXQzMkFycmF5XScsZmxvYXQ2NFRhZz0nW29iamVjdCBGbG9hdDY0QXJyYXldJyxpbnQ4VGFnPSdbb2JqZWN0IEludDhBcnJheV0nLGludDE2VGFnPSdbb2JqZWN0IEludDE2QXJyYXldJyxpbnQzMlRhZz0nW29iamVjdCBJbnQzMkFycmF5XScsdWludDhUYWc9J1tvYmplY3QgVWludDhBcnJheV0nLHVpbnQ4Q2xhbXBlZFRhZz0nW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLHVpbnQxNlRhZz0nW29iamVjdCBVaW50MTZBcnJheV0nLHVpbnQzMlRhZz0nW29iamVjdCBVaW50MzJBcnJheV0nOy8qKiBVc2VkIHRvIG1hdGNoIGVtcHR5IHN0cmluZyBsaXRlcmFscyBpbiBjb21waWxlZCB0ZW1wbGF0ZSBzb3VyY2UuICovdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nPS9cXGJfX3AgXFwrPSAnJzsvZyxyZUVtcHR5U3RyaW5nTWlkZGxlPS9cXGIoX19wIFxcKz0pICcnIFxcKy9nLHJlRW1wdHlTdHJpbmdUcmFpbGluZz0vKF9fZVxcKC4qP1xcKXxcXGJfX3RcXCkpIFxcK1xcbicnOy9nOy8qKiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycy4gKi92YXIgcmVFc2NhcGVkSHRtbD0vJig/OmFtcHxsdHxndHxxdW90fCMzOSk7L2cscmVVbmVzY2FwZWRIdG1sPS9bJjw+XCInXS9nLHJlSGFzRXNjYXBlZEh0bWw9UmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxyZUhhc1VuZXNjYXBlZEh0bWw9UmVnRXhwKHJlVW5lc2NhcGVkSHRtbC5zb3VyY2UpOy8qKiBVc2VkIHRvIG1hdGNoIHRlbXBsYXRlIGRlbGltaXRlcnMuICovdmFyIHJlRXNjYXBlPS88JS0oW1xcc1xcU10rPyklPi9nLHJlRXZhbHVhdGU9LzwlKFtcXHNcXFNdKz8pJT4vZyxyZUludGVycG9sYXRlPS88JT0oW1xcc1xcU10rPyklPi9nOy8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi92YXIgcmVJc0RlZXBQcm9wPS9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8scmVJc1BsYWluUHJvcD0vXlxcdyokLyxyZVByb3BOYW1lPS9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZzsvKipcbiAgICAgKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gICAgICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gICAgICovdmFyIHJlUmVnRXhwQ2hhcj0vW1xcXFxeJC4qKz8oKVtcXF17fXxdL2cscmVIYXNSZWdFeHBDaGFyPVJlZ0V4cChyZVJlZ0V4cENoYXIuc291cmNlKTsvKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL3ZhciByZVRyaW09L15cXHMrfFxccyskL2cscmVUcmltU3RhcnQ9L15cXHMrLyxyZVRyaW1FbmQ9L1xccyskLzsvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi92YXIgcmVXcmFwQ29tbWVudD0vXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vLHJlV3JhcERldGFpbHM9L1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLHJlU3BsaXREZXRhaWxzPS8sPyAmIC87LyoqIFVzZWQgdG8gbWF0Y2ggd29yZHMgY29tcG9zZWQgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuICovdmFyIHJlQXNjaWlXb3JkPS9bXlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceDdmXSsvZzsvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi92YXIgcmVFc2NhcGVDaGFyPS9cXFxcKFxcXFwpPy9nOy8qKlxuICAgICAqIFVzZWQgdG8gbWF0Y2hcbiAgICAgKiBbRVMgdGVtcGxhdGUgZGVsaW1pdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdGVtcGxhdGUtbGl0ZXJhbC1sZXhpY2FsLWNvbXBvbmVudHMpLlxuICAgICAqL3ZhciByZUVzVGVtcGxhdGU9L1xcJFxceyhbXlxcXFx9XSooPzpcXFxcLlteXFxcXH1dKikqKVxcfS9nOy8qKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVzLiAqL3ZhciByZUZsYWdzPS9cXHcqJC87LyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi92YXIgcmVJc0JhZEhleD0vXlstK10weFswLTlhLWZdKyQvaTsvKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovdmFyIHJlSXNCaW5hcnk9L14wYlswMV0rJC9pOy8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi92YXIgcmVJc0hvc3RDdG9yPS9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87LyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovdmFyIHJlSXNPY3RhbD0vXjBvWzAtN10rJC9pOy8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi92YXIgcmVJc1VpbnQ9L14oPzowfFsxLTldXFxkKikkLzsvKiogVXNlZCB0byBtYXRjaCBMYXRpbiBVbmljb2RlIGxldHRlcnMgKGV4Y2x1ZGluZyBtYXRoZW1hdGljYWwgb3BlcmF0b3JzKS4gKi92YXIgcmVMYXRpbj0vW1xceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHhmZlxcdTAxMDAtXFx1MDE3Zl0vZzsvKiogVXNlZCB0byBlbnN1cmUgY2FwdHVyaW5nIG9yZGVyIG9mIHRlbXBsYXRlIGRlbGltaXRlcnMuICovdmFyIHJlTm9NYXRjaD0vKCReKS87LyoqIFVzZWQgdG8gbWF0Y2ggdW5lc2NhcGVkIGNoYXJhY3RlcnMgaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLiAqL3ZhciByZVVuZXNjYXBlZFN0cmluZz0vWydcXG5cXHJcXHUyMDI4XFx1MjAyOVxcXFxdL2c7LyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL3ZhciByc0FzdHJhbFJhbmdlPSdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxyc0NvbWJvTWFya3NSYW5nZT0nXFxcXHUwMzAwLVxcXFx1MDM2ZicscmVDb21ib0hhbGZNYXJrc1JhbmdlPSdcXFxcdWZlMjAtXFxcXHVmZTJmJyxyc0NvbWJvU3ltYm9sc1JhbmdlPSdcXFxcdTIwZDAtXFxcXHUyMGZmJyxyc0NvbWJvUmFuZ2U9cnNDb21ib01hcmtzUmFuZ2UrcmVDb21ib0hhbGZNYXJrc1JhbmdlK3JzQ29tYm9TeW1ib2xzUmFuZ2UscnNEaW5nYmF0UmFuZ2U9J1xcXFx1MjcwMC1cXFxcdTI3YmYnLHJzTG93ZXJSYW5nZT0nYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxyc01hdGhPcFJhbmdlPSdcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3Jyxyc05vbkNoYXJSYW5nZT0nXFxcXHgwMC1cXFxceDJmXFxcXHgzYS1cXFxceDQwXFxcXHg1Yi1cXFxceDYwXFxcXHg3Yi1cXFxceGJmJyxyc1B1bmN0dWF0aW9uUmFuZ2U9J1xcXFx1MjAwMC1cXFxcdTIwNmYnLHJzU3BhY2VSYW5nZT0nIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDAnLHJzVXBwZXJSYW5nZT0nQS1aXFxcXHhjMC1cXFxceGQ2XFxcXHhkOC1cXFxceGRlJyxyc1ZhclJhbmdlPSdcXFxcdWZlMGVcXFxcdWZlMGYnLHJzQnJlYWtSYW5nZT1yc01hdGhPcFJhbmdlK3JzTm9uQ2hhclJhbmdlK3JzUHVuY3R1YXRpb25SYW5nZStyc1NwYWNlUmFuZ2U7LyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL3ZhciByc0Fwb3M9J1tcXCdcXHUyMDE5XScscnNBc3RyYWw9J1snK3JzQXN0cmFsUmFuZ2UrJ10nLHJzQnJlYWs9J1snK3JzQnJlYWtSYW5nZSsnXScscnNDb21ibz0nWycrcnNDb21ib1JhbmdlKyddJyxyc0RpZ2l0cz0nXFxcXGQrJyxyc0RpbmdiYXQ9J1snK3JzRGluZ2JhdFJhbmdlKyddJyxyc0xvd2VyPSdbJytyc0xvd2VyUmFuZ2UrJ10nLHJzTWlzYz0nW14nK3JzQXN0cmFsUmFuZ2UrcnNCcmVha1JhbmdlK3JzRGlnaXRzK3JzRGluZ2JhdFJhbmdlK3JzTG93ZXJSYW5nZStyc1VwcGVyUmFuZ2UrJ10nLHJzRml0ej0nXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxyc01vZGlmaWVyPScoPzonK3JzQ29tYm8rJ3wnK3JzRml0eisnKScscnNOb25Bc3RyYWw9J1teJytyc0FzdHJhbFJhbmdlKyddJyxyc1JlZ2lvbmFsPScoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9Jyxyc1N1cnJQYWlyPSdbXFxcXHVkODAwLVxcXFx1ZGJmZl1bXFxcXHVkYzAwLVxcXFx1ZGZmZl0nLHJzVXBwZXI9J1snK3JzVXBwZXJSYW5nZSsnXScscnNaV0o9J1xcXFx1MjAwZCc7LyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovdmFyIHJzTWlzY0xvd2VyPScoPzonK3JzTG93ZXIrJ3wnK3JzTWlzYysnKScscnNNaXNjVXBwZXI9Jyg/OicrcnNVcHBlcisnfCcrcnNNaXNjKycpJyxyc09wdENvbnRyTG93ZXI9Jyg/OicrcnNBcG9zKycoPzpkfGxsfG18cmV8c3x0fHZlKSk/Jyxyc09wdENvbnRyVXBwZXI9Jyg/OicrcnNBcG9zKycoPzpEfExMfE18UkV8U3xUfFZFKSk/JyxyZU9wdE1vZD1yc01vZGlmaWVyKyc/Jyxyc09wdFZhcj0nWycrcnNWYXJSYW5nZSsnXT8nLHJzT3B0Sm9pbj0nKD86Jytyc1pXSisnKD86JytbcnNOb25Bc3RyYWwscnNSZWdpb25hbCxyc1N1cnJQYWlyXS5qb2luKCd8JykrJyknK3JzT3B0VmFyK3JlT3B0TW9kKycpKicscnNPcmRMb3dlcj0nXFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pJyxyc09yZFVwcGVyPSdcXFxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXFxcZFRIKSg/PVxcXFxifFthLXpfXSknLHJzU2VxPXJzT3B0VmFyK3JlT3B0TW9kK3JzT3B0Sm9pbixyc0Vtb2ppPScoPzonK1tyc0RpbmdiYXQscnNSZWdpb25hbCxyc1N1cnJQYWlyXS5qb2luKCd8JykrJyknK3JzU2VxLHJzU3ltYm9sPScoPzonK1tyc05vbkFzdHJhbCtyc0NvbWJvKyc/Jyxyc0NvbWJvLHJzUmVnaW9uYWwscnNTdXJyUGFpcixyc0FzdHJhbF0uam9pbignfCcpKycpJzsvKiogVXNlZCB0byBtYXRjaCBhcG9zdHJvcGhlcy4gKi92YXIgcmVBcG9zPVJlZ0V4cChyc0Fwb3MsJ2cnKTsvKipcbiAgICAgKiBVc2VkIHRvIG1hdGNoIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykgYW5kXG4gICAgICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrcyBmb3Igc3ltYm9sc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzX2Zvcl9TeW1ib2xzKS5cbiAgICAgKi92YXIgcmVDb21ib01hcms9UmVnRXhwKHJzQ29tYm8sJ2cnKTsvKiogVXNlZCB0byBtYXRjaCBbc3RyaW5nIHN5bWJvbHNdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUpLiAqL3ZhciByZVVuaWNvZGU9UmVnRXhwKHJzRml0eisnKD89Jytyc0ZpdHorJyl8Jytyc1N5bWJvbCtyc1NlcSwnZycpOy8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovdmFyIHJlVW5pY29kZVdvcmQ9UmVnRXhwKFtyc1VwcGVyKyc/Jytyc0xvd2VyKycrJytyc09wdENvbnRyTG93ZXIrJyg/PScrW3JzQnJlYWsscnNVcHBlciwnJCddLmpvaW4oJ3wnKSsnKScscnNNaXNjVXBwZXIrJysnK3JzT3B0Q29udHJVcHBlcisnKD89JytbcnNCcmVhayxyc1VwcGVyK3JzTWlzY0xvd2VyLCckJ10uam9pbignfCcpKycpJyxyc1VwcGVyKyc/Jytyc01pc2NMb3dlcisnKycrcnNPcHRDb250ckxvd2VyLHJzVXBwZXIrJysnK3JzT3B0Q29udHJVcHBlcixyc09yZFVwcGVyLHJzT3JkTG93ZXIscnNEaWdpdHMscnNFbW9qaV0uam9pbignfCcpLCdnJyk7LyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovdmFyIHJlSGFzVW5pY29kZT1SZWdFeHAoJ1snK3JzWldKK3JzQXN0cmFsUmFuZ2UrcnNDb21ib1JhbmdlK3JzVmFyUmFuZ2UrJ10nKTsvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB0aGF0IG5lZWQgYSBtb3JlIHJvYnVzdCByZWdleHAgdG8gbWF0Y2ggd29yZHMuICovdmFyIHJlSGFzVW5pY29kZVdvcmQ9L1thLXpdW0EtWl18W0EtWl17Mix9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vOy8qKiBVc2VkIHRvIGFzc2lnbiBkZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcy4gKi92YXIgY29udGV4dFByb3BzPVsnQXJyYXknLCdCdWZmZXInLCdEYXRhVmlldycsJ0RhdGUnLCdFcnJvcicsJ0Zsb2F0MzJBcnJheScsJ0Zsb2F0NjRBcnJheScsJ0Z1bmN0aW9uJywnSW50OEFycmF5JywnSW50MTZBcnJheScsJ0ludDMyQXJyYXknLCdNYXAnLCdNYXRoJywnT2JqZWN0JywnUHJvbWlzZScsJ1JlZ0V4cCcsJ1NldCcsJ1N0cmluZycsJ1N5bWJvbCcsJ1R5cGVFcnJvcicsJ1VpbnQ4QXJyYXknLCdVaW50OENsYW1wZWRBcnJheScsJ1VpbnQxNkFycmF5JywnVWludDMyQXJyYXknLCdXZWFrTWFwJywnXycsJ2NsZWFyVGltZW91dCcsJ2lzRmluaXRlJywncGFyc2VJbnQnLCdzZXRUaW1lb3V0J107LyoqIFVzZWQgdG8gbWFrZSB0ZW1wbGF0ZSBzb3VyY2VVUkxzIGVhc2llciB0byBpZGVudGlmeS4gKi92YXIgdGVtcGxhdGVDb3VudGVyPS0xOy8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi92YXIgdHlwZWRBcnJheVRhZ3M9e307dHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ109dHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ109dHlwZWRBcnJheVRhZ3NbaW50OFRhZ109dHlwZWRBcnJheVRhZ3NbaW50MTZUYWddPXR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXT10eXBlZEFycmF5VGFnc1t1aW50OFRhZ109dHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXT10eXBlZEFycmF5VGFnc1t1aW50MTZUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ109dHJ1ZTt0eXBlZEFycmF5VGFnc1thcmdzVGFnXT10eXBlZEFycmF5VGFnc1thcnJheVRhZ109dHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddPXR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXT10eXBlZEFycmF5VGFnc1tkYXRlVGFnXT10eXBlZEFycmF5VGFnc1tlcnJvclRhZ109dHlwZWRBcnJheVRhZ3NbZnVuY1RhZ109dHlwZWRBcnJheVRhZ3NbbWFwVGFnXT10eXBlZEFycmF5VGFnc1tudW1iZXJUYWddPXR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ109dHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXT10eXBlZEFycmF5VGFnc1tzZXRUYWddPXR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ109dHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ109ZmFsc2U7LyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi92YXIgY2xvbmVhYmxlVGFncz17fTtjbG9uZWFibGVUYWdzW2FyZ3NUYWddPWNsb25lYWJsZVRhZ3NbYXJyYXlUYWddPWNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddPWNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddPWNsb25lYWJsZVRhZ3NbYm9vbFRhZ109Y2xvbmVhYmxlVGFnc1tkYXRlVGFnXT1jbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddPWNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ109Y2xvbmVhYmxlVGFnc1tpbnQ4VGFnXT1jbG9uZWFibGVUYWdzW2ludDE2VGFnXT1jbG9uZWFibGVUYWdzW2ludDMyVGFnXT1jbG9uZWFibGVUYWdzW21hcFRhZ109Y2xvbmVhYmxlVGFnc1tudW1iZXJUYWddPWNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXT1jbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ109Y2xvbmVhYmxlVGFnc1tzZXRUYWddPWNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXT1jbG9uZWFibGVUYWdzW3N5bWJvbFRhZ109Y2xvbmVhYmxlVGFnc1t1aW50OFRhZ109Y2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddPWNsb25lYWJsZVRhZ3NbdWludDE2VGFnXT1jbG9uZWFibGVUYWdzW3VpbnQzMlRhZ109dHJ1ZTtjbG9uZWFibGVUYWdzW2Vycm9yVGFnXT1jbG9uZWFibGVUYWdzW2Z1bmNUYWddPWNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ109ZmFsc2U7LyoqIFVzZWQgdG8gbWFwIExhdGluIFVuaWNvZGUgbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzLiAqL3ZhciBkZWJ1cnJlZExldHRlcnM9ey8vIExhdGluLTEgU3VwcGxlbWVudCBibG9jay5cbsOAOidBJyzDgTonQScsw4I6J0EnLMODOidBJyzDhDonQScsw4U6J0EnLMOgOidhJyzDoTonYScsw6I6J2EnLMOjOidhJyzDpDonYScsw6U6J2EnLMOHOidDJyzDpzonYycsw5A6J0QnLMOwOidkJyzDiDonRScsw4k6J0UnLMOKOidFJyzDizonRScsw6g6J2UnLMOpOidlJyzDqjonZScsw6s6J2UnLMOMOidJJyzDjTonSScsw446J0knLMOPOidJJyzDrDonaScsw606J2knLMOuOidpJyzDrzonaScsw5E6J04nLMOxOiduJyzDkjonTycsw5M6J08nLMOUOidPJyzDlTonTycsw5Y6J08nLMOYOidPJyzDsjonbycsw7M6J28nLMO0OidvJyzDtTonbycsw7Y6J28nLMO4OidvJyzDmTonVScsw5o6J1UnLMObOidVJyzDnDonVScsw7k6J3UnLMO6Oid1JyzDuzondScsw7w6J3UnLMOdOidZJyzDvToneScsw786J3knLMOGOidBZScsw6Y6J2FlJyzDnjonVGgnLMO+Oid0aCcsw586J3NzJywvLyBMYXRpbiBFeHRlbmRlZC1BIGJsb2NrLlxuxIA6J0EnLMSCOidBJyzEhDonQScsxIE6J2EnLMSDOidhJyzEhTonYScsxIY6J0MnLMSIOidDJyzEijonQycsxIw6J0MnLMSHOidjJyzEiTonYycsxIs6J2MnLMSNOidjJyzEjjonRCcsxJA6J0QnLMSPOidkJyzEkTonZCcsxJI6J0UnLMSUOidFJyzEljonRScsxJg6J0UnLMSaOidFJyzEkzonZScsxJU6J2UnLMSXOidlJyzEmTonZScsxJs6J2UnLMScOidHJyzEnjonRycsxKA6J0cnLMSiOidHJyzEnTonZycsxJ86J2cnLMShOidnJyzEozonZycsxKQ6J0gnLMSmOidIJyzEpTonaCcsxKc6J2gnLMSoOidJJyzEqjonSScsxKw6J0knLMSuOidJJyzEsDonSScsxKk6J2knLMSrOidpJyzErTonaScsxK86J2knLMSxOidpJyzEtDonSicsxLU6J2onLMS2OidLJyzEtzonaycsxLg6J2snLMS5OidMJyzEuzonTCcsxL06J0wnLMS/OidMJyzFgTonTCcsxLo6J2wnLMS8OidsJyzEvjonbCcsxYA6J2wnLMWCOidsJyzFgzonTicsxYU6J04nLMWHOidOJyzFijonTicsxYQ6J24nLMWGOiduJyzFiDonbicsxYs6J24nLMWMOidPJyzFjjonTycsxZA6J08nLMWNOidvJyzFjzonbycsxZE6J28nLMWUOidSJyzFljonUicsxZg6J1InLMWVOidyJyzFlzoncicsxZk6J3InLMWaOidTJyzFnDonUycsxZ46J1MnLMWgOidTJyzFmzoncycsxZ06J3MnLMWfOidzJyzFoToncycsxaI6J1QnLMWkOidUJyzFpjonVCcsxaM6J3QnLMWlOid0JyzFpzondCcsxag6J1UnLMWqOidVJyzFrDonVScsxa46J1UnLMWwOidVJyzFsjonVScsxak6J3UnLMWrOid1JyzFrTondScsxa86J3UnLMWxOid1JyzFszondScsxbQ6J1cnLMW1Oid3JyzFtjonWScsxbc6J3knLMW4OidZJyzFuTonWicsxbs6J1onLMW9OidaJyzFujoneicsxbw6J3onLMW+Oid6JyzEsjonSUonLMSzOidpaicsxZI6J09lJyzFkzonb2UnLMWJOlwiJ25cIizFvzoncyd9Oy8qKiBVc2VkIHRvIG1hcCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuICovdmFyIGh0bWxFc2NhcGVzPXsnJic6JyZhbXA7JywnPCc6JyZsdDsnLCc+JzonJmd0OycsJ1wiJzonJnF1b3Q7JyxcIidcIjonJiMzOTsnfTsvKiogVXNlZCB0byBtYXAgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLiAqL3ZhciBodG1sVW5lc2NhcGVzPXsnJmFtcDsnOicmJywnJmx0Oyc6JzwnLCcmZ3Q7JzonPicsJyZxdW90Oyc6J1wiJywnJiMzOTsnOlwiJ1wifTsvKiogVXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi92YXIgc3RyaW5nRXNjYXBlcz17J1xcXFwnOidcXFxcJyxcIidcIjpcIidcIiwnXFxuJzonbicsJ1xccic6J3InLCdcXHUyMDI4JzondTIwMjgnLCdcXHUyMDI5JzondTIwMjknfTsvKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL3ZhciBmcmVlUGFyc2VGbG9hdD1wYXJzZUZsb2F0LGZyZWVQYXJzZUludD1wYXJzZUludDsvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL3ZhciBmcmVlR2xvYmFsPSh0eXBlb2YgZ2xvYmFsPT09J3VuZGVmaW5lZCc/J3VuZGVmaW5lZCc6X3R5cGVvZihnbG9iYWwpKT09PSdvYmplY3QnJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbDsvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL3ZhciBmcmVlU2VsZj0odHlwZW9mIHNlbGY9PT0ndW5kZWZpbmVkJz8ndW5kZWZpbmVkJzpfdHlwZW9mKHNlbGYpKT09PSdvYmplY3QnJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZjsvKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi92YXIgcm9vdD1mcmVlR2xvYmFsfHxmcmVlU2VsZnx8RnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTsvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL3ZhciBmcmVlRXhwb3J0cz0odHlwZW9mIGV4cG9ydHM9PT0ndW5kZWZpbmVkJz8ndW5kZWZpbmVkJzpfdHlwZW9mKGV4cG9ydHMpKT09PSdvYmplY3QnJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0czsvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovdmFyIGZyZWVNb2R1bGU9ZnJlZUV4cG9ydHMmJih0eXBlb2YgbW9kdWxlPT09J3VuZGVmaW5lZCc/J3VuZGVmaW5lZCc6X3R5cGVvZihtb2R1bGUpKT09PSdvYmplY3QnJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZTsvKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL3ZhciBtb2R1bGVFeHBvcnRzPWZyZWVNb2R1bGUmJmZyZWVNb2R1bGUuZXhwb3J0cz09PWZyZWVFeHBvcnRzOy8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL3ZhciBmcmVlUHJvY2Vzcz1tb2R1bGVFeHBvcnRzJiZmcmVlR2xvYmFsLnByb2Nlc3M7LyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovdmFyIG5vZGVVdGlsPWZ1bmN0aW9uKCl7dHJ5ey8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxudmFyIHR5cGVzPWZyZWVNb2R1bGUmJmZyZWVNb2R1bGUucmVxdWlyZSYmZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7aWYodHlwZXMpe3JldHVybiB0eXBlczt9Ly8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbnJldHVybiBmcmVlUHJvY2VzcyYmZnJlZVByb2Nlc3MuYmluZGluZyYmZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO31jYXRjaChlKXt9fSgpOy8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovdmFyIG5vZGVJc0FycmF5QnVmZmVyPW5vZGVVdGlsJiZub2RlVXRpbC5pc0FycmF5QnVmZmVyLG5vZGVJc0RhdGU9bm9kZVV0aWwmJm5vZGVVdGlsLmlzRGF0ZSxub2RlSXNNYXA9bm9kZVV0aWwmJm5vZGVVdGlsLmlzTWFwLG5vZGVJc1JlZ0V4cD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNSZWdFeHAsbm9kZUlzU2V0PW5vZGVVdGlsJiZub2RlVXRpbC5pc1NldCxub2RlSXNUeXBlZEFycmF5PW5vZGVVdGlsJiZub2RlVXRpbC5pc1R5cGVkQXJyYXk7LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKlxuICAgICAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICAgKi9mdW5jdGlvbiBhcHBseShmdW5jLHRoaXNBcmcsYXJncyl7c3dpdGNoKGFyZ3MubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtjYXNlIDE6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0pO2Nhc2UgMjpyZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsYXJnc1swXSxhcmdzWzFdKTtjYXNlIDM6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKTt9cmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZyxhcmdzKTt9LyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlQWdncmVnYXRvcmAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovZnVuY3Rpb24gYXJyYXlBZ2dyZWdhdG9yKGFycmF5LHNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtzZXR0ZXIoYWNjdW11bGF0b3IsdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGFycmF5KTt9cmV0dXJuIGFjY3VtdWxhdG9yO30vKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtpZihpdGVyYXRlZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpPT09ZmFsc2Upe2JyZWFrO319cmV0dXJuIGFycmF5O30vKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaFJpZ2h0YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9mdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSxpdGVyYXRlZSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZShsZW5ndGgtLSl7aWYoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSxsZW5ndGgsYXJyYXkpPT09ZmFsc2Upe2JyZWFrO319cmV0dXJuIGFycmF5O30vKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZXZlcnlgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL2Z1bmN0aW9uIGFycmF5RXZlcnkoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtpZighcHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpe3JldHVybiBmYWxzZTt9fXJldHVybiB0cnVlO30vKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICovZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO2lmKHByZWRpY2F0ZSh2YWx1ZSxpbmRleCxhcnJheSkpe3Jlc3VsdFtyZXNJbmRleCsrXT12YWx1ZTt9fXJldHVybiByZXN1bHQ7fS8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAgICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiEhbGVuZ3RoJiZiYXNlSW5kZXhPZihhcnJheSx2YWx1ZSwwKT4tMTt9LyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICovZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksdmFsdWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7aWYoY29tcGFyYXRvcih2YWx1ZSxhcnJheVtpbmRleF0pKXtyZXR1cm4gdHJ1ZTt9fXJldHVybiBmYWxzZTt9LyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gICAgICogc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqL2Z1bmN0aW9uIGFycmF5TWFwKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHJlc3VsdD1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtyZXN1bHRbaW5kZXhdPWl0ZXJhdGVlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk7fXJldHVybiByZXN1bHQ7fS8qKlxuICAgICAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL2Z1bmN0aW9uIGFycmF5UHVzaChhcnJheSx2YWx1ZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxvZmZzZXQ9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXthcnJheVtvZmZzZXQraW5kZXhdPXZhbHVlc1tpbmRleF07fXJldHVybiBhcnJheTt9LyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKi9mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSxpdGVyYXRlZSxhY2N1bXVsYXRvcixpbml0QWNjdW0pe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoaW5pdEFjY3VtJiZsZW5ndGgpe2FjY3VtdWxhdG9yPWFycmF5WysraW5kZXhdO313aGlsZSgrK2luZGV4PGxlbmd0aCl7YWNjdW11bGF0b3I9aXRlcmF0ZWUoYWNjdW11bGF0b3IsYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KTt9cmV0dXJuIGFjY3VtdWxhdG9yO30vKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKi9mdW5jdGlvbiBhcnJheVJlZHVjZVJpZ2h0KGFycmF5LGl0ZXJhdGVlLGFjY3VtdWxhdG9yLGluaXRBY2N1bSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZihpbml0QWNjdW0mJmxlbmd0aCl7YWNjdW11bGF0b3I9YXJyYXlbLS1sZW5ndGhdO313aGlsZShsZW5ndGgtLSl7YWNjdW11bGF0b3I9aXRlcmF0ZWUoYWNjdW11bGF0b3IsYXJyYXlbbGVuZ3RoXSxsZW5ndGgsYXJyYXkpO31yZXR1cm4gYWNjdW11bGF0b3I7fS8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICAgKiBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7aWYocHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpe3JldHVybiB0cnVlO319cmV0dXJuIGZhbHNlO30vKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGFuIEFTQ0lJIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICAgKi92YXIgYXNjaWlTaXplPWJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7LyoqXG4gICAgICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgICAqL2Z1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpe3JldHVybiBzdHJpbmcuc3BsaXQoJycpO30vKipcbiAgICAgKiBTcGxpdHMgYW4gQVNDSUkgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICAgKi9mdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZyl7cmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCl8fFtdO30vKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZmluZEtleWAgYW5kIGBfLmZpbmRMYXN0S2V5YCxcbiAgICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gXG4gICAgICogdXNpbmcgYGVhY2hGdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCBvciBpdHMga2V5LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqL2Z1bmN0aW9uIGJhc2VGaW5kS2V5KGNvbGxlY3Rpb24scHJlZGljYXRlLGVhY2hGdW5jKXt2YXIgcmVzdWx0O2VhY2hGdW5jKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe2lmKHByZWRpY2F0ZSh2YWx1ZSxrZXksY29sbGVjdGlvbikpe3Jlc3VsdD1rZXk7cmV0dXJuIGZhbHNlO319KTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tSW5kZXgrKGZyb21SaWdodD8xOi0xKTt3aGlsZShmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aCl7aWYocHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpe3JldHVybiBpbmRleDt9fXJldHVybi0xO30vKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9mdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3JldHVybiB2YWx1ZT09PXZhbHVlP3N0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KTpiYXNlRmluZEluZGV4KGFycmF5LGJhc2VJc05hTixmcm9tSW5kZXgpO30vKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9mdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksdmFsdWUsZnJvbUluZGV4LGNvbXBhcmF0b3Ipe3ZhciBpbmRleD1mcm9tSW5kZXgtMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtpZihjb21wYXJhdG9yKGFycmF5W2luZGV4XSx2YWx1ZSkpe3JldHVybiBpbmRleDt9fXJldHVybi0xO30vKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpe3JldHVybiB2YWx1ZSE9PXZhbHVlO30vKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZWFuYCBhbmQgYF8ubWVhbkJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAgICovZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU3VtKGFycmF5LGl0ZXJhdGVlKS9sZW5ndGg6TkFOO30vKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKi9mdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3Rba2V5XTt9O30vKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eU9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKi9mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldO307fS8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpbml0QWNjdW0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mXG4gICAgICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICovZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLGl0ZXJhdGVlLGFjY3VtdWxhdG9yLGluaXRBY2N1bSxlYWNoRnVuYyl7ZWFjaEZ1bmMoY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXthY2N1bXVsYXRvcj1pbml0QWNjdW0/KGluaXRBY2N1bT1mYWxzZSx2YWx1ZSk6aXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsY29sbGVjdGlvbik7fSk7cmV0dXJuIGFjY3VtdWxhdG9yO30vKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0QnlgIHdoaWNoIHVzZXMgYGNvbXBhcmVyYCB0byBkZWZpbmUgdGhlXG4gICAgICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICAgICAqIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyZXIgVGhlIGZ1bmN0aW9uIHRvIGRlZmluZSBzb3J0IG9yZGVyLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL2Z1bmN0aW9uIGJhc2VTb3J0QnkoYXJyYXksY29tcGFyZXIpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO2FycmF5LnNvcnQoY29tcGFyZXIpO3doaWxlKGxlbmd0aC0tKXthcnJheVtsZW5ndGhdPWFycmF5W2xlbmd0aF0udmFsdWU7fXJldHVybiBhcnJheTt9LyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc3VtYCBhbmQgYF8uc3VtQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgICAqL2Z1bmN0aW9uIGJhc2VTdW0oYXJyYXksaXRlcmF0ZWUpe3ZhciByZXN1bHQsaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGN1cnJlbnQ9aXRlcmF0ZWUoYXJyYXlbaW5kZXhdKTtpZihjdXJyZW50IT09dW5kZWZpbmVkKXtyZXN1bHQ9cmVzdWx0PT09dW5kZWZpbmVkP2N1cnJlbnQ6cmVzdWx0K2N1cnJlbnQ7fX1yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gICAgICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gICAgICovZnVuY3Rpb24gYmFzZVRpbWVzKG4saXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobik7d2hpbGUoKytpbmRleDxuKXtyZXN1bHRbaW5kZXhdPWl0ZXJhdGVlKGluZGV4KTt9cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9QYWlyc2AgYW5kIGBfLnRvUGFpcnNJbmAgd2hpY2ggY3JlYXRlcyBhbiBhcnJheVxuICAgICAqIG9mIGtleS12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYHByb3BzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICovZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlNYXAocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm5ba2V5LG9iamVjdFtrZXldXTt9KTt9LyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqL2Z1bmN0aW9uIGJhc2VVbmFyeShmdW5jKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jKHZhbHVlKTt9O30vKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICAgICAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIG9mIGBwcm9wc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqL2Z1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlNYXAocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm4gb2JqZWN0W2tleV07fSk7fS8qKlxuICAgICAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsa2V5KXtyZXR1cm4gY2FjaGUuaGFzKGtleSk7fS8qKlxuICAgICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1TdGFydGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc3RyaW5nIHN5bWJvbFxuICAgICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAgICAgKi9mdW5jdGlvbiBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scyxjaHJTeW1ib2xzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXN0clN5bWJvbHMubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKXt9cmV0dXJuIGluZGV4O30vKipcbiAgICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHN0cmluZyBzeW1ib2xcbiAgICAgKiB0aGF0IGlzIG5vdCBmb3VuZCBpbiB0aGUgY2hhcmFjdGVyIHN5bWJvbHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0clN5bWJvbHMgVGhlIHN0cmluZyBzeW1ib2xzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAgICAgKi9mdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scyl7dmFyIGluZGV4PXN0clN5bWJvbHMubGVuZ3RoO3doaWxlKGluZGV4LS0mJmJhc2VJbmRleE9mKGNoclN5bWJvbHMsc3RyU3ltYm9sc1tpbmRleF0sMCk+LTEpe31yZXR1cm4gaW5kZXg7fS8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBgcGxhY2Vob2xkZXJgIG9jY3VycmVuY2VzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgY291bnQuXG4gICAgICovZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LHBsYWNlaG9sZGVyKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9MDt3aGlsZShsZW5ndGgtLSl7aWYoYXJyYXlbbGVuZ3RoXT09PXBsYWNlaG9sZGVyKXsrK3Jlc3VsdDt9fXJldHVybiByZXN1bHQ7fS8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVidXJyYCB0byBjb252ZXJ0IExhdGluLTEgU3VwcGxlbWVudCBhbmQgTGF0aW4gRXh0ZW5kZWQtQVxuICAgICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxldHRlciBUaGUgbWF0Y2hlZCBsZXR0ZXIgdG8gZGVidXJyLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIGxldHRlci5cbiAgICAgKi92YXIgZGVidXJyTGV0dGVyPWJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7LyoqXG4gICAgICogVXNlZCBieSBgXy5lc2NhcGVgIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAgICovdmFyIGVzY2FwZUh0bWxDaGFyPWJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTsvKipcbiAgICAgKiBVc2VkIGJ5IGBfLnRlbXBsYXRlYCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgICAqL2Z1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIoY2hyKXtyZXR1cm4nXFxcXCcrc3RyaW5nRXNjYXBlc1tjaHJdO30vKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL2Z1bmN0aW9uIGdldFZhbHVlKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldO30vKipcbiAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzeW1ib2wgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9mdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZyl7cmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyk7fS8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSB3b3JkIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICovZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKXtyZXR1cm4gcmVIYXNVbmljb2RlV29yZC50ZXN0KHN0cmluZyk7fS8qKlxuICAgICAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICAgKi9mdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3Ipe3ZhciBkYXRhLHJlc3VsdD1bXTt3aGlsZSghKGRhdGE9aXRlcmF0b3IubmV4dCgpKS5kb25lKXtyZXN1bHQucHVzaChkYXRhLnZhbHVlKTt9cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICogQ29udmVydHMgYG1hcGAgdG8gaXRzIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICovZnVuY3Rpb24gbWFwVG9BcnJheShtYXApe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobWFwLnNpemUpO21hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLGtleSl7cmVzdWx0WysraW5kZXhdPVtrZXksdmFsdWVdO30pO3JldHVybiByZXN1bHQ7fS8qKlxuICAgICAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL2Z1bmN0aW9uIG92ZXJBcmcoZnVuYyx0cmFuc2Zvcm0pe3JldHVybiBmdW5jdGlvbihhcmcpe3JldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTt9O30vKipcbiAgICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAgICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGVpciBpbmRleGVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHJlcGxhY2UuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKi9mdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSxwbGFjZWhvbGRlcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYodmFsdWU9PT1wbGFjZWhvbGRlcnx8dmFsdWU9PT1QTEFDRUhPTERFUil7YXJyYXlbaW5kZXhdPVBMQUNFSE9MREVSO3Jlc3VsdFtyZXNJbmRleCsrXT1pbmRleDt9fXJldHVybiByZXN1bHQ7fS8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgLCB1bmxlc3MgYGtleWAgaXMgXCJfX3Byb3RvX19cIi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCxrZXkpe3JldHVybiBrZXk9PSdfX3Byb3RvX18nP3VuZGVmaW5lZDpvYmplY3Rba2V5XTt9LyoqXG4gICAgICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gICAgICovZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkoc2V0LnNpemUpO3NldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXtyZXN1bHRbKytpbmRleF09dmFsdWU7fSk7cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICogQ29udmVydHMgYHNldGAgdG8gaXRzIHZhbHVlLXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlLXZhbHVlIHBhaXJzLlxuICAgICAqL2Z1bmN0aW9uIHNldFRvUGFpcnMoc2V0KXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KHNldC5zaXplKTtzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPVt2YWx1ZSx2YWx1ZV07fSk7cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqL2Z1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7aWYoYXJyYXlbaW5kZXhdPT09dmFsdWUpe3JldHVybiBpbmRleDt9fXJldHVybi0xO30vKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubGFzdEluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqL2Z1bmN0aW9uIHN0cmljdExhc3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCl7dmFyIGluZGV4PWZyb21JbmRleCsxO3doaWxlKGluZGV4LS0pe2lmKGFycmF5W2luZGV4XT09PXZhbHVlKXtyZXR1cm4gaW5kZXg7fX1yZXR1cm4gaW5kZXg7fS8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICAgKi9mdW5jdGlvbiBzdHJpbmdTaXplKHN0cmluZyl7cmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKT91bmljb2RlU2l6ZShzdHJpbmcpOmFzY2lpU2l6ZShzdHJpbmcpO30vKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICovZnVuY3Rpb24gc3RyaW5nVG9BcnJheShzdHJpbmcpe3JldHVybiBoYXNVbmljb2RlKHN0cmluZyk/dW5pY29kZVRvQXJyYXkoc3RyaW5nKTphc2NpaVRvQXJyYXkoc3RyaW5nKTt9LyoqXG4gICAgICogVXNlZCBieSBgXy51bmVzY2FwZWAgdG8gY29udmVydCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIHVuZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAgICovdmFyIHVuZXNjYXBlSHRtbENoYXI9YmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7LyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiBhIFVuaWNvZGUgYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgICAqL2Z1bmN0aW9uIHVuaWNvZGVTaXplKHN0cmluZyl7dmFyIHJlc3VsdD1yZVVuaWNvZGUubGFzdEluZGV4PTA7d2hpbGUocmVVbmljb2RlLnRlc3Qoc3RyaW5nKSl7KytyZXN1bHQ7fXJldHVybiByZXN1bHQ7fS8qKlxuICAgICAqIENvbnZlcnRzIGEgVW5pY29kZSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICovZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSl8fFtdO30vKipcbiAgICAgKiBTcGxpdHMgYSBVbmljb2RlIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAgICovZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZyl7cmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGVXb3JkKXx8W107fS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdXNpbmcgdGhlIGBjb250ZXh0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dD1yb290XSBUaGUgY29udGV4dCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGEgbmV3IGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ2Zvbyc6IF8uY29uc3RhbnQoJ2ZvbycpIH0pO1xuICAgICAqXG4gICAgICogdmFyIGxvZGFzaCA9IF8ucnVuSW5Db250ZXh0KCk7XG4gICAgICogbG9kYXNoLm1peGluKHsgJ2Jhcic6IGxvZGFzaC5jb25zdGFudCgnYmFyJykgfSk7XG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oXy5mb28pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKiBfLmlzRnVuY3Rpb24oXy5iYXIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guZm9vKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5iYXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIENyZWF0ZSBhIHN1cGVkLXVwIGBkZWZlcmAgaW4gTm9kZS5qcy5cbiAgICAgKiB2YXIgZGVmZXIgPSBfLnJ1bkluQ29udGV4dCh7ICdzZXRUaW1lb3V0Jzogc2V0SW1tZWRpYXRlIH0pLmRlZmVyO1xuICAgICAqL3ZhciBydW5JbkNvbnRleHQ9ZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpe2NvbnRleHQ9Y29udGV4dD09bnVsbD9yb290Ol8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSxjb250ZXh0LF8ucGljayhyb290LGNvbnRleHRQcm9wcykpOy8qKiBCdWlsdC1pbiBjb25zdHJ1Y3RvciByZWZlcmVuY2VzLiAqL3ZhciBBcnJheT1jb250ZXh0LkFycmF5LERhdGU9Y29udGV4dC5EYXRlLEVycm9yPWNvbnRleHQuRXJyb3IsRnVuY3Rpb249Y29udGV4dC5GdW5jdGlvbixNYXRoPWNvbnRleHQuTWF0aCxPYmplY3Q9Y29udGV4dC5PYmplY3QsUmVnRXhwPWNvbnRleHQuUmVnRXhwLFN0cmluZz1jb250ZXh0LlN0cmluZyxUeXBlRXJyb3I9Y29udGV4dC5UeXBlRXJyb3I7LyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL3ZhciBhcnJheVByb3RvPUFycmF5LnByb3RvdHlwZSxmdW5jUHJvdG89RnVuY3Rpb24ucHJvdG90eXBlLG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGU7LyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL3ZhciBjb3JlSnNEYXRhPWNvbnRleHRbJ19fY29yZS1qc19zaGFyZWRfXyddOy8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi92YXIgZnVuY1RvU3RyaW5nPWZ1bmNQcm90by50b1N0cmluZzsvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi92YXIgaGFzT3duUHJvcGVydHk9b2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7LyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi92YXIgaWRDb3VudGVyPTA7LyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi92YXIgbWFza1NyY0tleT1mdW5jdGlvbigpe3ZhciB1aWQ9L1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhJiZjb3JlSnNEYXRhLmtleXMmJmNvcmVKc0RhdGEua2V5cy5JRV9QUk9UT3x8JycpO3JldHVybiB1aWQ/J1N5bWJvbChzcmMpXzEuJyt1aWQ6Jyc7fSgpOy8qKlxuICAgICAgICogVXNlZCB0byByZXNvbHZlIHRoZVxuICAgICAgICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gICAgICAgKiBvZiB2YWx1ZXMuXG4gICAgICAgKi92YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmc9b2JqZWN0UHJvdG8udG9TdHJpbmc7LyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL3ZhciBvYmplY3RDdG9yU3RyaW5nPWZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7LyoqIFVzZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgYF9gIHJlZmVyZW5jZSBpbiBgXy5ub0NvbmZsaWN0YC4gKi92YXIgb2xkRGFzaD1yb290Ll87LyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi92YXIgcmVJc05hdGl2ZT1SZWdFeHAoJ14nK2Z1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwnXFxcXCQmJykucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywnJDEuKj8nKSsnJCcpOy8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL3ZhciBCdWZmZXI9bW9kdWxlRXhwb3J0cz9jb250ZXh0LkJ1ZmZlcjp1bmRlZmluZWQsX1N5bWJvbD1jb250ZXh0LlN5bWJvbCxVaW50OEFycmF5PWNvbnRleHQuVWludDhBcnJheSxhbGxvY1Vuc2FmZT1CdWZmZXI/QnVmZmVyLmFsbG9jVW5zYWZlOnVuZGVmaW5lZCxnZXRQcm90b3R5cGU9b3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsT2JqZWN0KSxvYmplY3RDcmVhdGU9T2JqZWN0LmNyZWF0ZSxwcm9wZXJ0eUlzRW51bWVyYWJsZT1vYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxzcGxpY2U9YXJyYXlQcm90by5zcGxpY2Usc3ByZWFkYWJsZVN5bWJvbD1fU3ltYm9sP19TeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlOnVuZGVmaW5lZCxzeW1JdGVyYXRvcj1fU3ltYm9sP19TeW1ib2wuaXRlcmF0b3I6dW5kZWZpbmVkLHN5bVRvU3RyaW5nVGFnPV9TeW1ib2w/X1N5bWJvbC50b1N0cmluZ1RhZzp1bmRlZmluZWQ7dmFyIGRlZmluZVByb3BlcnR5PWZ1bmN0aW9uKCl7dHJ5e3ZhciBmdW5jPWdldE5hdGl2ZShPYmplY3QsJ2RlZmluZVByb3BlcnR5Jyk7ZnVuYyh7fSwnJyx7fSk7cmV0dXJuIGZ1bmM7fWNhdGNoKGUpe319KCk7LyoqIE1vY2tlZCBidWlsdC1pbnMuICovdmFyIGN0eENsZWFyVGltZW91dD1jb250ZXh0LmNsZWFyVGltZW91dCE9PXJvb3QuY2xlYXJUaW1lb3V0JiZjb250ZXh0LmNsZWFyVGltZW91dCxjdHhOb3c9RGF0ZSYmRGF0ZS5ub3chPT1yb290LkRhdGUubm93JiZEYXRlLm5vdyxjdHhTZXRUaW1lb3V0PWNvbnRleHQuc2V0VGltZW91dCE9PXJvb3Quc2V0VGltZW91dCYmY29udGV4dC5zZXRUaW1lb3V0Oy8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi92YXIgbmF0aXZlQ2VpbD1NYXRoLmNlaWwsbmF0aXZlRmxvb3I9TWF0aC5mbG9vcixuYXRpdmVHZXRTeW1ib2xzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsbmF0aXZlSXNCdWZmZXI9QnVmZmVyP0J1ZmZlci5pc0J1ZmZlcjp1bmRlZmluZWQsbmF0aXZlSXNGaW5pdGU9Y29udGV4dC5pc0Zpbml0ZSxuYXRpdmVKb2luPWFycmF5UHJvdG8uam9pbixuYXRpdmVLZXlzPW92ZXJBcmcoT2JqZWN0LmtleXMsT2JqZWN0KSxuYXRpdmVNYXg9TWF0aC5tYXgsbmF0aXZlTWluPU1hdGgubWluLG5hdGl2ZU5vdz1EYXRlLm5vdyxuYXRpdmVQYXJzZUludD1jb250ZXh0LnBhcnNlSW50LG5hdGl2ZVJhbmRvbT1NYXRoLnJhbmRvbSxuYXRpdmVSZXZlcnNlPWFycmF5UHJvdG8ucmV2ZXJzZTsvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovdmFyIERhdGFWaWV3PWdldE5hdGl2ZShjb250ZXh0LCdEYXRhVmlldycpLE1hcD1nZXROYXRpdmUoY29udGV4dCwnTWFwJyksUHJvbWlzZT1nZXROYXRpdmUoY29udGV4dCwnUHJvbWlzZScpLFNldD1nZXROYXRpdmUoY29udGV4dCwnU2V0JyksV2Vha01hcD1nZXROYXRpdmUoY29udGV4dCwnV2Vha01hcCcpLG5hdGl2ZUNyZWF0ZT1nZXROYXRpdmUoT2JqZWN0LCdjcmVhdGUnKTsvKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi92YXIgbWV0YU1hcD1XZWFrTWFwJiZuZXcgV2Vha01hcCgpOy8qKiBVc2VkIHRvIGxvb2t1cCB1bm1pbmlmaWVkIGZ1bmN0aW9uIG5hbWVzLiAqL3ZhciByZWFsTmFtZXM9e307LyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi92YXIgZGF0YVZpZXdDdG9yU3RyaW5nPXRvU291cmNlKERhdGFWaWV3KSxtYXBDdG9yU3RyaW5nPXRvU291cmNlKE1hcCkscHJvbWlzZUN0b3JTdHJpbmc9dG9Tb3VyY2UoUHJvbWlzZSksc2V0Q3RvclN0cmluZz10b1NvdXJjZShTZXQpLHdlYWtNYXBDdG9yU3RyaW5nPXRvU291cmNlKFdlYWtNYXApOy8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL3ZhciBzeW1ib2xQcm90bz1fU3ltYm9sP19TeW1ib2wucHJvdG90eXBlOnVuZGVmaW5lZCxzeW1ib2xWYWx1ZU9mPXN5bWJvbFByb3RvP3N5bWJvbFByb3RvLnZhbHVlT2Y6dW5kZWZpbmVkLHN5bWJvbFRvU3RyaW5nPXN5bWJvbFByb3RvP3N5bWJvbFByb3RvLnRvU3RyaW5nOnVuZGVmaW5lZDsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKlxuICAgICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBpbXBsaWNpdCBtZXRob2RcbiAgICAgICAqIGNoYWluIHNlcXVlbmNlcy4gTWV0aG9kcyB0aGF0IG9wZXJhdGUgb24gYW5kIHJldHVybiBhcnJheXMsIGNvbGxlY3Rpb25zLFxuICAgICAgICogYW5kIGZ1bmN0aW9ucyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgc2luZ2xlIHZhbHVlXG4gICAgICAgKiBvciBtYXkgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlIHdpbGwgYXV0b21hdGljYWxseSBlbmQgdGhlIGNoYWluIHNlcXVlbmNlXG4gICAgICAgKiBhbmQgcmV0dXJuIHRoZSB1bndyYXBwZWQgdmFsdWUuIE90aGVyd2lzZSwgdGhlIHZhbHVlIG11c3QgYmUgdW53cmFwcGVkXG4gICAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgICAqXG4gICAgICAgKiBFeHBsaWNpdCBjaGFpbiBzZXF1ZW5jZXMsIHdoaWNoIG11c3QgYmUgdW53cmFwcGVkIHdpdGggYF8jdmFsdWVgLCBtYXkgYmVcbiAgICAgICAqIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLlxuICAgICAgICpcbiAgICAgICAqIFRoZSBleGVjdXRpb24gb2YgY2hhaW5lZCBtZXRob2RzIGlzIGxhenksIHRoYXQgaXMsIGl0J3MgZGVmZXJyZWQgdW50aWxcbiAgICAgICAqIGBfI3ZhbHVlYCBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAgICpcbiAgICAgICAqIExhenkgZXZhbHVhdGlvbiBhbGxvd3Mgc2V2ZXJhbCBtZXRob2RzIHRvIHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uLlxuICAgICAgICogU2hvcnRjdXQgZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiB0byBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBhdm9pZHNcbiAgICAgICAqIHRoZSBjcmVhdGlvbiBvZiBpbnRlcm1lZGlhdGUgYXJyYXlzIGFuZCBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIG51bWJlciBvZlxuICAgICAgICogaXRlcmF0ZWUgZXhlY3V0aW9ucy4gU2VjdGlvbnMgb2YgYSBjaGFpbiBzZXF1ZW5jZSBxdWFsaWZ5IGZvciBzaG9ydGN1dFxuICAgICAgICogZnVzaW9uIGlmIHRoZSBzZWN0aW9uIGlzIGFwcGxpZWQgdG8gYW4gYXJyYXkgYW5kIGl0ZXJhdGVlcyBhY2NlcHQgb25seVxuICAgICAgICogb25lIGFyZ3VtZW50LiBUaGUgaGV1cmlzdGljIGZvciB3aGV0aGVyIGEgc2VjdGlvbiBxdWFsaWZpZXMgZm9yIHNob3J0Y3V0XG4gICAgICAgKiBmdXNpb24gaXMgc3ViamVjdCB0byBjaGFuZ2UuXG4gICAgICAgKlxuICAgICAgICogQ2hhaW5pbmcgaXMgc3VwcG9ydGVkIGluIGN1c3RvbSBidWlsZHMgYXMgbG9uZyBhcyB0aGUgYF8jdmFsdWVgIG1ldGhvZCBpc1xuICAgICAgICogZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuXG4gICAgICAgKlxuICAgICAgICogSW4gYWRkaXRpb24gdG8gbG9kYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGhhdmUgYEFycmF5YCBhbmQgYFN0cmluZ2AgbWV0aG9kcy5cbiAgICAgICAqXG4gICAgICAgKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICAgICAgICogYGNvbmNhdGAsIGBqb2luYCwgYHBvcGAsIGBwdXNoYCwgYHNoaWZ0YCwgYHNvcnRgLCBgc3BsaWNlYCwgYW5kIGB1bnNoaWZ0YFxuICAgICAgICpcbiAgICAgICAqIFRoZSB3cmFwcGVyIGBTdHJpbmdgIG1ldGhvZHMgYXJlOlxuICAgICAgICogYHJlcGxhY2VgIGFuZCBgc3BsaXRgXG4gICAgICAgKlxuICAgICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uIGFyZTpcbiAgICAgICAqIGBhdGAsIGBjb21wYWN0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGRyb3BXaGlsZWAsIGBmaWx0ZXJgLCBgZmluZGAsXG4gICAgICAgKiBgZmluZExhc3RgLCBgaGVhZGAsIGBpbml0aWFsYCwgYGxhc3RgLCBgbWFwYCwgYHJlamVjdGAsIGByZXZlcnNlYCwgYHNsaWNlYCxcbiAgICAgICAqIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGFuZCBgdG9BcnJheWBcbiAgICAgICAqXG4gICAgICAgKiBUaGUgY2hhaW5hYmxlIHdyYXBwZXIgbWV0aG9kcyBhcmU6XG4gICAgICAgKiBgYWZ0ZXJgLCBgYXJ5YCwgYGFzc2lnbmAsIGBhc3NpZ25JbmAsIGBhc3NpZ25JbldpdGhgLCBgYXNzaWduV2l0aGAsIGBhdGAsXG4gICAgICAgKiBgYmVmb3JlYCwgYGJpbmRgLCBgYmluZEFsbGAsIGBiaW5kS2V5YCwgYGNhc3RBcnJheWAsIGBjaGFpbmAsIGBjaHVua2AsXG4gICAgICAgKiBgY29tbWl0YCwgYGNvbXBhY3RgLCBgY29uY2F0YCwgYGNvbmZvcm1zYCwgYGNvbnN0YW50YCwgYGNvdW50QnlgLCBgY3JlYXRlYCxcbiAgICAgICAqIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgZGVmZXJgLCBgZGVsYXlgLFxuICAgICAgICogYGRpZmZlcmVuY2VgLCBgZGlmZmVyZW5jZUJ5YCwgYGRpZmZlcmVuY2VXaXRoYCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCxcbiAgICAgICAqIGBkcm9wUmlnaHRXaGlsZWAsIGBkcm9wV2hpbGVgLCBgZXh0ZW5kYCwgYGV4dGVuZFdpdGhgLCBgZmlsbGAsIGBmaWx0ZXJgLFxuICAgICAgICogYGZsYXRNYXBgLCBgZmxhdE1hcERlZXBgLCBgZmxhdE1hcERlcHRoYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLFxuICAgICAgICogYGZsYXR0ZW5EZXB0aGAsIGBmbGlwYCwgYGZsb3dgLCBgZmxvd1JpZ2h0YCwgYGZyb21QYWlyc2AsIGBmdW5jdGlvbnNgLFxuICAgICAgICogYGZ1bmN0aW9uc0luYCwgYGdyb3VwQnlgLCBgaW5pdGlhbGAsIGBpbnRlcnNlY3Rpb25gLCBgaW50ZXJzZWN0aW9uQnlgLFxuICAgICAgICogYGludGVyc2VjdGlvbldpdGhgLCBgaW52ZXJ0YCwgYGludmVydEJ5YCwgYGludm9rZU1hcGAsIGBpdGVyYXRlZWAsIGBrZXlCeWAsXG4gICAgICAgKiBga2V5c2AsIGBrZXlzSW5gLCBgbWFwYCwgYG1hcEtleXNgLCBgbWFwVmFsdWVzYCwgYG1hdGNoZXNgLCBgbWF0Y2hlc1Byb3BlcnR5YCxcbiAgICAgICAqIGBtZW1vaXplYCwgYG1lcmdlYCwgYG1lcmdlV2l0aGAsIGBtZXRob2RgLCBgbWV0aG9kT2ZgLCBgbWl4aW5gLCBgbmVnYXRlYCxcbiAgICAgICAqIGBudGhBcmdgLCBgb21pdGAsIGBvbWl0QnlgLCBgb25jZWAsIGBvcmRlckJ5YCwgYG92ZXJgLCBgb3ZlckFyZ3NgLFxuICAgICAgICogYG92ZXJFdmVyeWAsIGBvdmVyU29tZWAsIGBwYXJ0aWFsYCwgYHBhcnRpYWxSaWdodGAsIGBwYXJ0aXRpb25gLCBgcGlja2AsXG4gICAgICAgKiBgcGlja0J5YCwgYHBsYW50YCwgYHByb3BlcnR5YCwgYHByb3BlcnR5T2ZgLCBgcHVsbGAsIGBwdWxsQWxsYCwgYHB1bGxBbGxCeWAsXG4gICAgICAgKiBgcHVsbEFsbFdpdGhgLCBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZWFyZ2AsIGByZWplY3RgLFxuICAgICAgICogYHJlbW92ZWAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2FtcGxlU2l6ZWAsIGBzZXRgLCBgc2V0V2l0aGAsIGBzaHVmZmxlYCxcbiAgICAgICAqIGBzbGljZWAsIGBzb3J0YCwgYHNvcnRCeWAsIGBzcGxpY2VgLCBgc3ByZWFkYCwgYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICAgICAgICogYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0b0FycmF5YCxcbiAgICAgICAqIGB0b1BhaXJzYCwgYHRvUGFpcnNJbmAsIGB0b1BhdGhgLCBgdG9QbGFpbk9iamVjdGAsIGB0cmFuc2Zvcm1gLCBgdW5hcnlgLFxuICAgICAgICogYHVuaW9uYCwgYHVuaW9uQnlgLCBgdW5pb25XaXRoYCwgYHVuaXFgLCBgdW5pcUJ5YCwgYHVuaXFXaXRoYCwgYHVuc2V0YCxcbiAgICAgICAqIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHVuemlwV2l0aGAsIGB1cGRhdGVgLCBgdXBkYXRlV2l0aGAsIGB2YWx1ZXNgLFxuICAgICAgICogYHZhbHVlc0luYCwgYHdpdGhvdXRgLCBgd3JhcGAsIGB4b3JgLCBgeG9yQnlgLCBgeG9yV2l0aGAsIGB6aXBgLFxuICAgICAgICogYHppcE9iamVjdGAsIGB6aXBPYmplY3REZWVwYCwgYW5kIGB6aXBXaXRoYFxuICAgICAgICpcbiAgICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBhcmUgKipub3QqKiBjaGFpbmFibGUgYnkgZGVmYXVsdCBhcmU6XG4gICAgICAgKiBgYWRkYCwgYGF0dGVtcHRgLCBgY2FtZWxDYXNlYCwgYGNhcGl0YWxpemVgLCBgY2VpbGAsIGBjbGFtcGAsIGBjbG9uZWAsXG4gICAgICAgKiBgY2xvbmVEZWVwYCwgYGNsb25lRGVlcFdpdGhgLCBgY2xvbmVXaXRoYCwgYGNvbmZvcm1zVG9gLCBgZGVidXJyYCxcbiAgICAgICAqIGBkZWZhdWx0VG9gLCBgZGl2aWRlYCwgYGVhY2hgLCBgZWFjaFJpZ2h0YCwgYGVuZHNXaXRoYCwgYGVxYCwgYGVzY2FwZWAsXG4gICAgICAgKiBgZXNjYXBlUmVnRXhwYCwgYGV2ZXJ5YCwgYGZpbmRgLCBgZmluZEluZGV4YCwgYGZpbmRLZXlgLCBgZmluZExhc3RgLFxuICAgICAgICogYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmlyc3RgLCBgZmxvb3JgLCBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLFxuICAgICAgICogYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCwgYGdldGAsIGBndGAsIGBndGVgLCBgaGFzYCxcbiAgICAgICAqIGBoYXNJbmAsIGBoZWFkYCwgYGlkZW50aXR5YCwgYGluY2x1ZGVzYCwgYGluZGV4T2ZgLCBgaW5SYW5nZWAsIGBpbnZva2VgLFxuICAgICAgICogYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNBcnJheUJ1ZmZlcmAsIGBpc0FycmF5TGlrZWAsIGBpc0FycmF5TGlrZU9iamVjdGAsXG4gICAgICAgKiBgaXNCb29sZWFuYCwgYGlzQnVmZmVyYCwgYGlzRGF0ZWAsIGBpc0VsZW1lbnRgLCBgaXNFbXB0eWAsIGBpc0VxdWFsYCxcbiAgICAgICAqIGBpc0VxdWFsV2l0aGAsIGBpc0Vycm9yYCwgYGlzRmluaXRlYCwgYGlzRnVuY3Rpb25gLCBgaXNJbnRlZ2VyYCwgYGlzTGVuZ3RoYCxcbiAgICAgICAqIGBpc01hcGAsIGBpc01hdGNoYCwgYGlzTWF0Y2hXaXRoYCwgYGlzTmFOYCwgYGlzTmF0aXZlYCwgYGlzTmlsYCwgYGlzTnVsbGAsXG4gICAgICAgKiBgaXNOdW1iZXJgLCBgaXNPYmplY3RgLCBgaXNPYmplY3RMaWtlYCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBgLFxuICAgICAgICogYGlzU2FmZUludGVnZXJgLCBgaXNTZXRgLCBgaXNTdHJpbmdgLCBgaXNVbmRlZmluZWRgLCBgaXNUeXBlZEFycmF5YCxcbiAgICAgICAqIGBpc1dlYWtNYXBgLCBgaXNXZWFrU2V0YCwgYGpvaW5gLCBga2ViYWJDYXNlYCwgYGxhc3RgLCBgbGFzdEluZGV4T2ZgLFxuICAgICAgICogYGxvd2VyQ2FzZWAsIGBsb3dlckZpcnN0YCwgYGx0YCwgYGx0ZWAsIGBtYXhgLCBgbWF4QnlgLCBgbWVhbmAsIGBtZWFuQnlgLFxuICAgICAgICogYG1pbmAsIGBtaW5CeWAsIGBtdWx0aXBseWAsIGBub0NvbmZsaWN0YCwgYG5vb3BgLCBgbm93YCwgYG50aGAsIGBwYWRgLFxuICAgICAgICogYHBhZEVuZGAsIGBwYWRTdGFydGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsXG4gICAgICAgKiBgcmVwZWF0YCwgYHJlc3VsdGAsIGByb3VuZGAsIGBydW5JbkNvbnRleHRgLCBgc2FtcGxlYCwgYHNoaWZ0YCwgYHNpemVgLFxuICAgICAgICogYHNuYWtlQ2FzZWAsIGBzb21lYCwgYHNvcnRlZEluZGV4YCwgYHNvcnRlZEluZGV4QnlgLCBgc29ydGVkTGFzdEluZGV4YCxcbiAgICAgICAqIGBzb3J0ZWRMYXN0SW5kZXhCeWAsIGBzdGFydENhc2VgLCBgc3RhcnRzV2l0aGAsIGBzdHViQXJyYXlgLCBgc3R1YkZhbHNlYCxcbiAgICAgICAqIGBzdHViT2JqZWN0YCwgYHN0dWJTdHJpbmdgLCBgc3R1YlRydWVgLCBgc3VidHJhY3RgLCBgc3VtYCwgYHN1bUJ5YCxcbiAgICAgICAqIGB0ZW1wbGF0ZWAsIGB0aW1lc2AsIGB0b0Zpbml0ZWAsIGB0b0ludGVnZXJgLCBgdG9KU09OYCwgYHRvTGVuZ3RoYCxcbiAgICAgICAqIGB0b0xvd2VyYCwgYHRvTnVtYmVyYCwgYHRvU2FmZUludGVnZXJgLCBgdG9TdHJpbmdgLCBgdG9VcHBlcmAsIGB0cmltYCxcbiAgICAgICAqIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGB0cnVuY2F0ZWAsIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGB1cHBlckNhc2VgLFxuICAgICAgICogYHVwcGVyRmlyc3RgLCBgdmFsdWVgLCBhbmQgYHdvcmRzYFxuICAgICAgICpcbiAgICAgICAqIEBuYW1lIF9cbiAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGluc3RhbmNlLlxuICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgICAqIH1cbiAgICAgICAqXG4gICAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgICAqXG4gICAgICAgKiAvLyBSZXR1cm5zIGFuIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgICAqIHdyYXBwZWQucmVkdWNlKF8uYWRkKTtcbiAgICAgICAqIC8vID0+IDZcbiAgICAgICAqXG4gICAgICAgKiAvLyBSZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZS5cbiAgICAgICAqIHZhciBzcXVhcmVzID0gd3JhcHBlZC5tYXAoc3F1YXJlKTtcbiAgICAgICAqXG4gICAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7XG4gICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICpcbiAgICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpO1xuICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICovZnVuY3Rpb24gbG9kYXNoKHZhbHVlKXtpZihpc09iamVjdExpa2UodmFsdWUpJiYhaXNBcnJheSh2YWx1ZSkmJiEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpe2lmKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcil7cmV0dXJuIHZhbHVlO31pZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCdfX3dyYXBwZWRfXycpKXtyZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTt9fXJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSk7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gICAgICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICAgICAqL3ZhciBiYXNlQ3JlYXRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb2JqZWN0KCl7fXJldHVybiBmdW5jdGlvbihwcm90byl7aWYoIWlzT2JqZWN0KHByb3RvKSl7cmV0dXJue307fWlmKG9iamVjdENyZWF0ZSl7cmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7fW9iamVjdC5wcm90b3R5cGU9cHJvdG87dmFyIHJlc3VsdD1uZXcgb2JqZWN0KCk7b2JqZWN0LnByb3RvdHlwZT11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdDt9O30oKTsvKipcbiAgICAgICAqIFRoZSBmdW5jdGlvbiB3aG9zZSBwcm90b3R5cGUgY2hhaW4gc2VxdWVuY2Ugd3JhcHBlcnMgaW5oZXJpdCBmcm9tLlxuICAgICAgICpcbiAgICAgICAqIEBwcml2YXRlXG4gICAgICAgKi9mdW5jdGlvbiBiYXNlTG9kYXNoKCl7fS8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4vKipcbiAgICAgICAgICogVGhlIGJhc2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbY2hhaW5BbGxdIEVuYWJsZSBleHBsaWNpdCBtZXRob2QgY2hhaW4gc2VxdWVuY2VzLlxuICAgICAgICAgKi9mdW5jdGlvbiBMb2Rhc2hXcmFwcGVyKHZhbHVlLGNoYWluQWxsKXt0aGlzLl9fd3JhcHBlZF9fPXZhbHVlO3RoaXMuX19hY3Rpb25zX189W107dGhpcy5fX2NoYWluX189ISFjaGFpbkFsbDt0aGlzLl9faW5kZXhfXz0wO3RoaXMuX192YWx1ZXNfXz11bmRlZmluZWQ7fS8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IGxvZGFzaCBhcmUgbGlrZSB0aG9zZSBpblxuICAgICAgICAgKiBlbWJlZGRlZCBSdWJ5IChFUkIpIGFzIHdlbGwgYXMgRVMyMDE1IHRlbXBsYXRlIHN0cmluZ3MuIENoYW5nZSB0aGVcbiAgICAgICAgICogZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL2xvZGFzaC50ZW1wbGF0ZVNldHRpbmdzPXsvKipcbiAgICAgICAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gYmUgSFRNTC1lc2NhcGVkLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgICAgICAgKi9lc2NhcGU6cmVFc2NhcGUsLyoqXG4gICAgICAgICAgICAgKiBVc2VkIHRvIGRldGVjdCBjb2RlIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICAgICAgICovZXZhbHVhdGU6cmVFdmFsdWF0ZSwvKipcbiAgICAgICAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gaW5qZWN0LlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgICAgICAgKi9pbnRlcnBvbGF0ZTpyZUludGVycG9sYXRlLC8qKlxuICAgICAgICAgICAgICogVXNlZCB0byByZWZlcmVuY2UgdGhlIGRhdGEgb2JqZWN0IGluIHRoZSB0ZW1wbGF0ZSB0ZXh0LlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAgICAgKi92YXJpYWJsZTonJywvKipcbiAgICAgICAgICAgICAqIFVzZWQgdG8gaW1wb3J0IHZhcmlhYmxlcyBpbnRvIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgICAgICovaW1wb3J0czp7LyoqXG4gICAgICAgICAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXG4gICAgICAgICAgICAgICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAgICAgICAgICAgICAqL186bG9kYXNofX07Ly8gRW5zdXJlIHdyYXBwZXJzIGFyZSBpbnN0YW5jZXMgb2YgYGJhc2VMb2Rhc2hgLlxubG9kYXNoLnByb3RvdHlwZT1iYXNlTG9kYXNoLnByb3RvdHlwZTtsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxvZGFzaDtMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZT1iYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1Mb2Rhc2hXcmFwcGVyOy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICAgICAqL2Z1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKXt0aGlzLl9fd3JhcHBlZF9fPXZhbHVlO3RoaXMuX19hY3Rpb25zX189W107dGhpcy5fX2Rpcl9fPTE7dGhpcy5fX2ZpbHRlcmVkX189ZmFsc2U7dGhpcy5fX2l0ZXJhdGVlc19fPVtdO3RoaXMuX190YWtlQ291bnRfXz1NQVhfQVJSQVlfTEVOR1RIO3RoaXMuX192aWV3c19fPVtdO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBsYXp5IHdyYXBwZXIgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbmFtZSBjbG9uZVxuICAgICAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGBMYXp5V3JhcHBlcmAgb2JqZWN0LlxuICAgICAgICAgKi9mdW5jdGlvbiBsYXp5Q2xvbmUoKXt2YXIgcmVzdWx0PW5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO3Jlc3VsdC5fX2Rpcl9fPXRoaXMuX19kaXJfXztyZXN1bHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fO3Jlc3VsdC5fX2l0ZXJhdGVlc19fPWNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO3Jlc3VsdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXztyZXN1bHQuX192aWV3c19fPWNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIFJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgbGF6eSBpdGVyYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgICAgICogQG1lbWJlck9mIExhenlXcmFwcGVyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyByZXZlcnNlZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgICAgICovZnVuY3Rpb24gbGF6eVJldmVyc2UoKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHJlc3VsdD1uZXcgTGF6eVdyYXBwZXIodGhpcyk7cmVzdWx0Ll9fZGlyX189LTE7cmVzdWx0Ll9fZmlsdGVyZWRfXz10cnVlO31lbHNle3Jlc3VsdD10aGlzLmNsb25lKCk7cmVzdWx0Ll9fZGlyX18qPS0xO31yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogRXh0cmFjdHMgdGhlIHVud3JhcHBlZCB2YWx1ZSBmcm9tIGl0cyBsYXp5IHdyYXBwZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIHZhbHVlXG4gICAgICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAgICAgKi9mdW5jdGlvbiBsYXp5VmFsdWUoKXt2YXIgYXJyYXk9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGRpcj10aGlzLl9fZGlyX18saXNBcnI9aXNBcnJheShhcnJheSksaXNSaWdodD1kaXI8MCxhcnJMZW5ndGg9aXNBcnI/YXJyYXkubGVuZ3RoOjAsdmlldz1nZXRWaWV3KDAsYXJyTGVuZ3RoLHRoaXMuX192aWV3c19fKSxzdGFydD12aWV3LnN0YXJ0LGVuZD12aWV3LmVuZCxsZW5ndGg9ZW5kLXN0YXJ0LGluZGV4PWlzUmlnaHQ/ZW5kOnN0YXJ0LTEsaXRlcmF0ZWVzPXRoaXMuX19pdGVyYXRlZXNfXyxpdGVyTGVuZ3RoPWl0ZXJhdGVlcy5sZW5ndGgscmVzSW5kZXg9MCx0YWtlQ291bnQ9bmF0aXZlTWluKGxlbmd0aCx0aGlzLl9fdGFrZUNvdW50X18pO2lmKCFpc0Fycnx8IWlzUmlnaHQmJmFyckxlbmd0aD09bGVuZ3RoJiZ0YWtlQ291bnQ9PWxlbmd0aCl7cmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksdGhpcy5fX2FjdGlvbnNfXyk7fXZhciByZXN1bHQ9W107b3V0ZXI6d2hpbGUobGVuZ3RoLS0mJnJlc0luZGV4PHRha2VDb3VudCl7aW5kZXgrPWRpcjt2YXIgaXRlckluZGV4PS0xLHZhbHVlPWFycmF5W2luZGV4XTt3aGlsZSgrK2l0ZXJJbmRleDxpdGVyTGVuZ3RoKXt2YXIgZGF0YT1pdGVyYXRlZXNbaXRlckluZGV4XSxpdGVyYXRlZT1kYXRhLml0ZXJhdGVlLHR5cGU9ZGF0YS50eXBlLGNvbXB1dGVkPWl0ZXJhdGVlKHZhbHVlKTtpZih0eXBlPT1MQVpZX01BUF9GTEFHKXt2YWx1ZT1jb21wdXRlZDt9ZWxzZSBpZighY29tcHV0ZWQpe2lmKHR5cGU9PUxBWllfRklMVEVSX0ZMQUcpe2NvbnRpbnVlIG91dGVyO31lbHNle2JyZWFrIG91dGVyO319fXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZTt9cmV0dXJuIHJlc3VsdDt9Ly8gRW5zdXJlIGBMYXp5V3JhcHBlcmAgaXMgYW4gaW5zdGFuY2Ugb2YgYGJhc2VMb2Rhc2hgLlxuTGF6eVdyYXBwZXIucHJvdG90eXBlPWJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO0xhenlXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1MYXp5V3JhcHBlcjsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgICAgICovZnVuY3Rpb24gSGFzaChlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSk7fX0vKipcbiAgICAgICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG5hbWUgY2xlYXJcbiAgICAgICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgICAgICovZnVuY3Rpb24gaGFzaENsZWFyKCl7dGhpcy5fX2RhdGFfXz1uYXRpdmVDcmVhdGU/bmF0aXZlQ3JlYXRlKG51bGwpOnt9O3RoaXMuc2l6ZT0wO30vKipcbiAgICAgICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGhhc2hEZWxldGUoa2V5KXt2YXIgcmVzdWx0PXRoaXMuaGFzKGtleSkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07dGhpcy5zaXplLT1yZXN1bHQ/MTowO3JldHVybiByZXN1bHQ7fS8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG5hbWUgZ2V0XG4gICAgICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICAgICAqL2Z1bmN0aW9uIGhhc2hHZXQoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO2lmKG5hdGl2ZUNyZWF0ZSl7dmFyIHJlc3VsdD1kYXRhW2tleV07cmV0dXJuIHJlc3VsdD09PUhBU0hfVU5ERUZJTkVEP3VuZGVmaW5lZDpyZXN1bHQ7fXJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KT9kYXRhW2tleV06dW5kZWZpbmVkO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbmFtZSBoYXNcbiAgICAgICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gaGFzaEhhcyhrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187cmV0dXJuIG5hdGl2ZUNyZWF0ZT9kYXRhW2tleV0hPT11bmRlZmluZWQ6aGFzT3duUHJvcGVydHkuY2FsbChkYXRhLGtleSk7fS8qKlxuICAgICAgICAgKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIHNldFxuICAgICAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICAgICAgICAgKi9mdW5jdGlvbiBoYXNoU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXzt0aGlzLnNpemUrPXRoaXMuaGFzKGtleSk/MDoxO2RhdGFba2V5XT1uYXRpdmVDcmVhdGUmJnZhbHVlPT09dW5kZWZpbmVkP0hBU0hfVU5ERUZJTkVEOnZhbHVlO3JldHVybiB0aGlzO30vLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG5IYXNoLnByb3RvdHlwZS5jbGVhcj1oYXNoQ2xlYXI7SGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddPWhhc2hEZWxldGU7SGFzaC5wcm90b3R5cGUuZ2V0PWhhc2hHZXQ7SGFzaC5wcm90b3R5cGUuaGFzPWhhc2hIYXM7SGFzaC5wcm90b3R5cGUuc2V0PWhhc2hTZXQ7LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAgICAgKi9mdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pO319LyoqXG4gICAgICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgICAgICovZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPVtdO3RoaXMuc2l6ZT0wO30vKipcbiAgICAgICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXtyZXR1cm4gZmFsc2U7fXZhciBsYXN0SW5kZXg9ZGF0YS5sZW5ndGgtMTtpZihpbmRleD09bGFzdEluZGV4KXtkYXRhLnBvcCgpO31lbHNle3NwbGljZS5jYWxsKGRhdGEsaW5kZXgsMSk7fS0tdGhpcy5zaXplO3JldHVybiB0cnVlO30vKipcbiAgICAgICAgICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIGdldFxuICAgICAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICAgICAqL2Z1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtyZXR1cm4gaW5kZXg8MD91bmRlZmluZWQ6ZGF0YVtpbmRleF1bMV07fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIGhhc1xuICAgICAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpe3JldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXyxrZXkpPi0xO30vKipcbiAgICAgICAgICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbmFtZSBzZXRcbiAgICAgICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICAgICAgICAgKi9mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MCl7Kyt0aGlzLnNpemU7ZGF0YS5wdXNoKFtrZXksdmFsdWVdKTt9ZWxzZXtkYXRhW2luZGV4XVsxXT12YWx1ZTt9cmV0dXJuIHRoaXM7fS8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhcj1saXN0Q2FjaGVDbGVhcjtMaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXT1saXN0Q2FjaGVEZWxldGU7TGlzdENhY2hlLnByb3RvdHlwZS5nZXQ9bGlzdENhY2hlR2V0O0xpc3RDYWNoZS5wcm90b3R5cGUuaGFzPWxpc3RDYWNoZUhhcztMaXN0Q2FjaGUucHJvdG90eXBlLnNldD1saXN0Q2FjaGVTZXQ7LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICAgICAqL2Z1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKTt9fS8qKlxuICAgICAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAgICAgKi9mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCl7dGhpcy5zaXplPTA7dGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgSGFzaCgpLG1hcDpuZXcoTWFwfHxMaXN0Q2FjaGUpKCksc3RyaW5nOm5ldyBIYXNoKCl9O30vKipcbiAgICAgICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG5hbWUgZGVsZXRlXG4gICAgICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKi9mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpe3ZhciByZXN1bHQ9Z2V0TWFwRGF0YSh0aGlzLGtleSlbJ2RlbGV0ZSddKGtleSk7dGhpcy5zaXplLT1yZXN1bHQ/MTowO3JldHVybiByZXN1bHQ7fS8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbmFtZSBnZXRcbiAgICAgICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICAgICAqL2Z1bmN0aW9uIG1hcENhY2hlR2V0KGtleSl7cmV0dXJuIGdldE1hcERhdGEodGhpcyxrZXkpLmdldChrZXkpO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIGhhc1xuICAgICAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuaGFzKGtleSk7fS8qKlxuICAgICAgICAgKiBTZXRzIHRoZSBtYXAgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG5hbWUgc2V0XG4gICAgICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gICAgICAgICAqL2Z1bmN0aW9uIG1hcENhY2hlU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9Z2V0TWFwRGF0YSh0aGlzLGtleSksc2l6ZT1kYXRhLnNpemU7ZGF0YS5zZXQoa2V5LHZhbHVlKTt0aGlzLnNpemUrPWRhdGEuc2l6ZT09c2l6ZT8wOjE7cmV0dXJuIHRoaXM7fS8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9bWFwQ2FjaGVDbGVhcjtNYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddPW1hcENhY2hlRGVsZXRlO01hcENhY2hlLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQ7TWFwQ2FjaGUucHJvdG90eXBlLmhhcz1tYXBDYWNoZUhhcztNYXBDYWNoZS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0Oy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICAgICAgICAgKi9mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dmFsdWVzPT1udWxsPzA6dmFsdWVzLmxlbmd0aDt0aGlzLl9fZGF0YV9fPW5ldyBNYXBDYWNoZSgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTt9fS8qKlxuICAgICAgICAgKiBBZGRzIGB2YWx1ZWAgdG8gdGhlIGFycmF5IGNhY2hlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbmFtZSBhZGRcbiAgICAgICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICAgICAqIEBhbGlhcyBwdXNoXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNhY2hlLlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAgICAgICAgICovZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpe3RoaXMuX19kYXRhX18uc2V0KHZhbHVlLEhBU0hfVU5ERUZJTkVEKTtyZXR1cm4gdGhpczt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG5hbWUgaGFzXG4gICAgICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO30vLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuU2V0Q2FjaGUucHJvdG90eXBlLmFkZD1TZXRDYWNoZS5wcm90b3R5cGUucHVzaD1zZXRDYWNoZUFkZDtTZXRDYWNoZS5wcm90b3R5cGUuaGFzPXNldENhY2hlSGFzOy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICAgICAqL2Z1bmN0aW9uIFN0YWNrKGVudHJpZXMpe3ZhciBkYXRhPXRoaXMuX19kYXRhX189bmV3IExpc3RDYWNoZShlbnRyaWVzKTt0aGlzLnNpemU9ZGF0YS5zaXplO30vKipcbiAgICAgICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAgICAgKi9mdW5jdGlvbiBzdGFja0NsZWFyKCl7dGhpcy5fX2RhdGFfXz1uZXcgTGlzdENhY2hlKCk7dGhpcy5zaXplPTA7fS8qKlxuICAgICAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLHJlc3VsdD1kYXRhWydkZWxldGUnXShrZXkpO3RoaXMuc2l6ZT1kYXRhLnNpemU7cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG5hbWUgZ2V0XG4gICAgICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAgICAgKi9mdW5jdGlvbiBzdGFja0dldChrZXkpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG5hbWUgaGFzXG4gICAgICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKi9mdW5jdGlvbiBzdGFja0hhcyhrZXkpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkpO30vKipcbiAgICAgICAgICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG5hbWUgc2V0XG4gICAgICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBzdGFjayBjYWNoZSBpbnN0YW5jZS5cbiAgICAgICAgICovZnVuY3Rpb24gc3RhY2tTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO2lmKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpe3ZhciBwYWlycz1kYXRhLl9fZGF0YV9fO2lmKCFNYXB8fHBhaXJzLmxlbmd0aDxMQVJHRV9BUlJBWV9TSVpFLTEpe3BhaXJzLnB1c2goW2tleSx2YWx1ZV0pO3RoaXMuc2l6ZT0rK2RhdGEuc2l6ZTtyZXR1cm4gdGhpczt9ZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBNYXBDYWNoZShwYWlycyk7fWRhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gdGhpczt9Ly8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhcj1zdGFja0NsZWFyO1N0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ109c3RhY2tEZWxldGU7U3RhY2sucHJvdG90eXBlLmdldD1zdGFja0dldDtTdGFjay5wcm90b3R5cGUuaGFzPXN0YWNrSGFzO1N0YWNrLnByb3RvdHlwZS5zZXQ9c3RhY2tTZXQ7LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAgICAgKi9mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLGluaGVyaXRlZCl7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpLGlzQXJnPSFpc0FyciYmaXNBcmd1bWVudHModmFsdWUpLGlzQnVmZj0haXNBcnImJiFpc0FyZyYmaXNCdWZmZXIodmFsdWUpLGlzVHlwZT0haXNBcnImJiFpc0FyZyYmIWlzQnVmZiYmaXNUeXBlZEFycmF5KHZhbHVlKSxza2lwSW5kZXhlcz1pc0Fycnx8aXNBcmd8fGlzQnVmZnx8aXNUeXBlLHJlc3VsdD1za2lwSW5kZXhlcz9iYXNlVGltZXModmFsdWUubGVuZ3RoLFN0cmluZyk6W10sbGVuZ3RoPXJlc3VsdC5sZW5ndGg7Zm9yKHZhciBrZXkgaW4gdmFsdWUpe2lmKChpbmhlcml0ZWR8fGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsa2V5KSkmJiEoc2tpcEluZGV4ZXMmJigvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG5rZXk9PSdsZW5ndGgnfHwvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbmlzQnVmZiYmKGtleT09J29mZnNldCd8fGtleT09J3BhcmVudCcpfHwvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG5pc1R5cGUmJihrZXk9PSdidWZmZXInfHxrZXk9PSdieXRlTGVuZ3RoJ3x8a2V5PT0nYnl0ZU9mZnNldCcpfHwvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG5pc0luZGV4KGtleSxsZW5ndGgpKSkpe3Jlc3VsdC5wdXNoKGtleSk7fX1yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNhbXBsZWAgZm9yIGFycmF5cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAgICAgKi9mdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtiYXNlUmFuZG9tKDAsbGVuZ3RoLTEpXTp1bmRlZmluZWQ7fS8qKlxuICAgICAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlU2l6ZWAgZm9yIGFycmF5cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAgICAgKi9mdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksbil7cmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSksYmFzZUNsYW1wKG4sMCxhcnJheS5sZW5ndGgpKTt9LyoqXG4gICAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zaHVmZmxlYCBmb3IgYXJyYXlzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICAgICAqL2Z1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSl7cmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpO30vKipcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ25cbiAgICAgICAgICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAgICAgKi9mdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksdmFsdWUpe2lmKHZhbHVlIT09dW5kZWZpbmVkJiYhZXEob2JqZWN0W2tleV0sdmFsdWUpfHx2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSl7YmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpO319LyoqXG4gICAgICAgICAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAgICAgICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAgICAgKi9mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV07aWYoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZlcShvYmpWYWx1ZSx2YWx1ZSkpfHx2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSl7YmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpO319LyoqXG4gICAgICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgICAgICovZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LGtleSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe2lmKGVxKGFycmF5W2xlbmd0aF1bMF0sa2V5KSl7cmV0dXJuIGxlbmd0aDt9fXJldHVybi0xO30vKipcbiAgICAgICAgICogQWdncmVnYXRlcyBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgb24gYGFjY3VtdWxhdG9yYCB3aXRoIGtleXMgdHJhbnNmb3JtZWRcbiAgICAgICAgICogYnkgYGl0ZXJhdGVlYCBhbmQgdmFsdWVzIHNldCBieSBgc2V0dGVyYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlQWdncmVnYXRvcihjb2xsZWN0aW9uLHNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7c2V0dGVyKGFjY3VtdWxhdG9yLHZhbHVlLGl0ZXJhdGVlKHZhbHVlKSxjb2xsZWN0aW9uKTt9KTtyZXR1cm4gYWNjdW11bGF0b3I7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdCYmY29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCk7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25JbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gICAgICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3QmJmNvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCk7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICAgICAgICAgKiB2YWx1ZSBjaGVja3MuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXtpZihrZXk9PSdfX3Byb3RvX18nJiZkZWZpbmVQcm9wZXJ0eSl7ZGVmaW5lUHJvcGVydHkob2JqZWN0LGtleSx7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnZhbHVlLHdyaXRhYmxlOnRydWV9KTt9ZWxzZXtvYmplY3Rba2V5XT12YWx1ZTt9fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsIHBhdGhzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgZWxlbWVudHMuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VBdChvYmplY3QscGF0aHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aHMubGVuZ3RoLHJlc3VsdD1BcnJheShsZW5ndGgpLHNraXA9b2JqZWN0PT1udWxsO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtyZXN1bHRbaW5kZXhdPXNraXA/dW5kZWZpbmVkOmdldChvYmplY3QscGF0aHNbaW5kZXhdKTt9cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsYW1wYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUNsYW1wKG51bWJlcixsb3dlcix1cHBlcil7aWYobnVtYmVyPT09bnVtYmVyKXtpZih1cHBlciE9PXVuZGVmaW5lZCl7bnVtYmVyPW51bWJlcjw9dXBwZXI/bnVtYmVyOnVwcGVyO31pZihsb3dlciE9PXVuZGVmaW5lZCl7bnVtYmVyPW51bWJlcj49bG93ZXI/bnVtYmVyOmxvd2VyO319cmV0dXJuIG51bWJlcjt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCBhbmQgYF8uY2xvbmVEZWVwYCB3aGljaCB0cmFja3NcbiAgICAgICAgICogdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICAgICAqICAxIC0gRGVlcCBjbG9uZVxuICAgICAgICAgKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAgICAgICAgICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIG9iamVjdHMgYW5kIHRoZWlyIGNsb25lIGNvdW50ZXJwYXJ0cy5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksb2JqZWN0LHN0YWNrKXt2YXIgcmVzdWx0LGlzRGVlcD1iaXRtYXNrJkNMT05FX0RFRVBfRkxBRyxpc0ZsYXQ9Yml0bWFzayZDTE9ORV9GTEFUX0ZMQUcsaXNGdWxsPWJpdG1hc2smQ0xPTkVfU1lNQk9MU19GTEFHO2lmKGN1c3RvbWl6ZXIpe3Jlc3VsdD1vYmplY3Q/Y3VzdG9taXplcih2YWx1ZSxrZXksb2JqZWN0LHN0YWNrKTpjdXN0b21pemVyKHZhbHVlKTt9aWYocmVzdWx0IT09dW5kZWZpbmVkKXtyZXR1cm4gcmVzdWx0O31pZighaXNPYmplY3QodmFsdWUpKXtyZXR1cm4gdmFsdWU7fXZhciBpc0Fycj1pc0FycmF5KHZhbHVlKTtpZihpc0Fycil7cmVzdWx0PWluaXRDbG9uZUFycmF5KHZhbHVlKTtpZighaXNEZWVwKXtyZXR1cm4gY29weUFycmF5KHZhbHVlLHJlc3VsdCk7fX1lbHNle3ZhciB0YWc9Z2V0VGFnKHZhbHVlKSxpc0Z1bmM9dGFnPT1mdW5jVGFnfHx0YWc9PWdlblRhZztpZihpc0J1ZmZlcih2YWx1ZSkpe3JldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSxpc0RlZXApO31pZih0YWc9PW9iamVjdFRhZ3x8dGFnPT1hcmdzVGFnfHxpc0Z1bmMmJiFvYmplY3Qpe3Jlc3VsdD1pc0ZsYXR8fGlzRnVuYz97fTppbml0Q2xvbmVPYmplY3QodmFsdWUpO2lmKCFpc0RlZXApe3JldHVybiBpc0ZsYXQ/Y29weVN5bWJvbHNJbih2YWx1ZSxiYXNlQXNzaWduSW4ocmVzdWx0LHZhbHVlKSk6Y29weVN5bWJvbHModmFsdWUsYmFzZUFzc2lnbihyZXN1bHQsdmFsdWUpKTt9fWVsc2V7aWYoIWNsb25lYWJsZVRhZ3NbdGFnXSl7cmV0dXJuIG9iamVjdD92YWx1ZTp7fTt9cmVzdWx0PWluaXRDbG9uZUJ5VGFnKHZhbHVlLHRhZyxpc0RlZXApO319Ly8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbnN0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKCkpO3ZhciBzdGFja2VkPXN0YWNrLmdldCh2YWx1ZSk7aWYoc3RhY2tlZCl7cmV0dXJuIHN0YWNrZWQ7fXN0YWNrLnNldCh2YWx1ZSxyZXN1bHQpO2lmKGlzU2V0KHZhbHVlKSl7dmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSl7cmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN1YlZhbHVlLHZhbHVlLHN0YWNrKSk7fSk7cmV0dXJuIHJlc3VsdDt9aWYoaXNNYXAodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7cmVzdWx0LnNldChrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsc3RhY2spKTt9KTtyZXR1cm4gcmVzdWx0O312YXIga2V5c0Z1bmM9aXNGdWxsP2lzRmxhdD9nZXRBbGxLZXlzSW46Z2V0QWxsS2V5czppc0ZsYXQ/a2V5c0luOmtleXM7dmFyIHByb3BzPWlzQXJyP3VuZGVmaW5lZDprZXlzRnVuYyh2YWx1ZSk7YXJyYXlFYWNoKHByb3BzfHx2YWx1ZSxmdW5jdGlvbihzdWJWYWx1ZSxrZXkpe2lmKHByb3BzKXtrZXk9c3ViVmFsdWU7c3ViVmFsdWU9dmFsdWVba2V5XTt9Ly8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbmFzc2lnblZhbHVlKHJlc3VsdCxrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsc3RhY2spKTt9KTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VDb25mb3Jtcyhzb3VyY2Upe3ZhciBwcm9wcz1rZXlzKHNvdXJjZSk7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2UscHJvcHMpO307fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc1RvYCB3aGljaCBhY2NlcHRzIGBwcm9wc2AgdG8gY2hlY2suXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxwcm9wcyl7dmFyIGxlbmd0aD1wcm9wcy5sZW5ndGg7aWYob2JqZWN0PT1udWxsKXtyZXR1cm4hbGVuZ3RoO31vYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cHJvcHNbbGVuZ3RoXSxwcmVkaWNhdGU9c291cmNlW2tleV0sdmFsdWU9b2JqZWN0W2tleV07aWYodmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCl8fCFwcmVkaWNhdGUodmFsdWUpKXtyZXR1cm4gZmFsc2U7fX1yZXR1cm4gdHJ1ZTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRlbGF5YCBhbmQgYF8uZGVmZXJgIHdoaWNoIGFjY2VwdHMgYGFyZ3NgXG4gICAgICAgICAqIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VEZWxheShmdW5jLHdhaXQsYXJncyl7aWYodHlwZW9mIGZ1bmMhPT0nZnVuY3Rpb24nKXt0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7fXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZnVuYy5hcHBseSh1bmRlZmluZWQsYXJncyk7fSx3YWl0KTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kaWZmZXJlbmNlYCB3aXRob3V0IHN1cHBvcnRcbiAgICAgICAgICogZm9yIGV4Y2x1ZGluZyBtdWx0aXBsZSBhcnJheXMgb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsaW5jbHVkZXM9YXJyYXlJbmNsdWRlcyxpc0NvbW1vbj10cnVlLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzdWx0PVtdLHZhbHVlc0xlbmd0aD12YWx1ZXMubGVuZ3RoO2lmKCFsZW5ndGgpe3JldHVybiByZXN1bHQ7fWlmKGl0ZXJhdGVlKXt2YWx1ZXM9YXJyYXlNYXAodmFsdWVzLGJhc2VVbmFyeShpdGVyYXRlZSkpO31pZihjb21wYXJhdG9yKXtpbmNsdWRlcz1hcnJheUluY2x1ZGVzV2l0aDtpc0NvbW1vbj1mYWxzZTt9ZWxzZSBpZih2YWx1ZXMubGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXtpbmNsdWRlcz1jYWNoZUhhcztpc0NvbW1vbj1mYWxzZTt2YWx1ZXM9bmV3IFNldENhY2hlKHZhbHVlcyk7fW91dGVyOndoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlPT1udWxsP3ZhbHVlOml0ZXJhdGVlKHZhbHVlKTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZihpc0NvbW1vbiYmY29tcHV0ZWQ9PT1jb21wdXRlZCl7dmFyIHZhbHVlc0luZGV4PXZhbHVlc0xlbmd0aDt3aGlsZSh2YWx1ZXNJbmRleC0tKXtpZih2YWx1ZXNbdmFsdWVzSW5kZXhdPT09Y29tcHV0ZWQpe2NvbnRpbnVlIG91dGVyO319cmVzdWx0LnB1c2godmFsdWUpO31lbHNlIGlmKCFpbmNsdWRlcyh2YWx1ZXMsY29tcHV0ZWQsY29tcGFyYXRvcikpe3Jlc3VsdC5wdXNoKHZhbHVlKTt9fXJldHVybiByZXN1bHQ7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICAgICAqL3ZhciBiYXNlRWFjaD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTsvKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaFJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICAgICAqL3ZhciBiYXNlRWFjaFJpZ2h0PWNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd25SaWdodCx0cnVlKTsvKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZXZlcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICAgICAqICBlbHNlIGBmYWxzZWBcbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0PXRydWU7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtyZXN1bHQ9ISFwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIHJlc3VsdDt9KTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLm1heGAgYW5kIGBfLm1pbmAgd2hpY2ggYWNjZXB0cyBhXG4gICAgICAgICAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGN1cnJlbnQ9aXRlcmF0ZWUodmFsdWUpO2lmKGN1cnJlbnQhPW51bGwmJihjb21wdXRlZD09PXVuZGVmaW5lZD9jdXJyZW50PT09Y3VycmVudCYmIWlzU3ltYm9sKGN1cnJlbnQpOmNvbXBhcmF0b3IoY3VycmVudCxjb21wdXRlZCkpKXt2YXIgY29tcHV0ZWQ9Y3VycmVudCxyZXN1bHQ9dmFsdWU7fX1yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsbGAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlRmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3N0YXJ0PXRvSW50ZWdlcihzdGFydCk7aWYoc3RhcnQ8MCl7c3RhcnQ9LXN0YXJ0Pmxlbmd0aD8wOmxlbmd0aCtzdGFydDt9ZW5kPWVuZD09PXVuZGVmaW5lZHx8ZW5kPmxlbmd0aD9sZW5ndGg6dG9JbnRlZ2VyKGVuZCk7aWYoZW5kPDApe2VuZCs9bGVuZ3RoO31lbmQ9c3RhcnQ+ZW5kPzA6dG9MZW5ndGgoZW5kKTt3aGlsZShzdGFydDxlbmQpe2FycmF5W3N0YXJ0KytdPXZhbHVlO31yZXR1cm4gYXJyYXk7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbikpe3Jlc3VsdC5wdXNoKHZhbHVlKTt9fSk7cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSxkZXB0aCxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGV8fChwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZSk7cmVzdWx0fHwocmVzdWx0PVtdKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihkZXB0aD4wJiZwcmVkaWNhdGUodmFsdWUpKXtpZihkZXB0aD4xKXsvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuYmFzZUZsYXR0ZW4odmFsdWUsZGVwdGgtMSxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KTt9ZWxzZXthcnJheVB1c2gocmVzdWx0LHZhbHVlKTt9fWVsc2UgaWYoIWlzU3RyaWN0KXtyZXN1bHRbcmVzdWx0Lmxlbmd0aF09dmFsdWU7fX1yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAgICAgICAgICogcHJvcGVydGllcyByZXR1cm5lZCBieSBga2V5c0Z1bmNgIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAgICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAgICovdmFyIGJhc2VGb3I9Y3JlYXRlQmFzZUZvcigpOy8qKlxuICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VGb3JgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllc1xuICAgICAgICAgKiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgICAqL3ZhciBiYXNlRm9yUmlnaHQ9Y3JlYXRlQmFzZUZvcih0cnVlKTsvKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yKG9iamVjdCxpdGVyYXRlZSxrZXlzKTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93blJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VGb3JPd25SaWdodChvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JSaWdodChvYmplY3QsaXRlcmF0ZWUsa2V5cyk7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mdW5jdGlvbnNgIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkgb2ZcbiAgICAgICAgICogYG9iamVjdGAgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZmlsdGVyZWQgZnJvbSBgcHJvcHNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGZpbHRlci5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUZ1bmN0aW9ucyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheUZpbHRlcihwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybiBpc0Z1bmN0aW9uKG9iamVjdFtrZXldKTt9KTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VHZXQob2JqZWN0LHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO3ZhciBpbmRleD0wLGxlbmd0aD1wYXRoLmxlbmd0aDt3aGlsZShvYmplY3QhPW51bGwmJmluZGV4PGxlbmd0aCl7b2JqZWN0PW9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07fXJldHVybiBpbmRleCYmaW5kZXg9PWxlbmd0aD9vYmplY3Q6dW5kZWZpbmVkO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gICAgICAgICAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAgICAgKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzRnVuYyxzeW1ib2xzRnVuYyl7dmFyIHJlc3VsdD1rZXlzRnVuYyhvYmplY3QpO3JldHVybiBpc0FycmF5KG9iamVjdCk/cmVzdWx0OmFycmF5UHVzaChyZXN1bHQsc3ltYm9sc0Z1bmMob2JqZWN0KSk7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSl7aWYodmFsdWU9PW51bGwpe3JldHVybiB2YWx1ZT09PXVuZGVmaW5lZD91bmRlZmluZWRUYWc6bnVsbFRhZzt9cmV0dXJuIHN5bVRvU3RyaW5nVGFnJiZzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpP2dldFJhd1RhZyh2YWx1ZSk6b2JqZWN0VG9TdHJpbmcodmFsdWUpO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ3RgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VHdCh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPm90aGVyO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUhhcyhvYmplY3Qsa2V5KXtyZXR1cm4gb2JqZWN0IT1udWxsJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LGtleSl7cmV0dXJuIG9iamVjdCE9bnVsbCYma2V5IGluIE9iamVjdChvYmplY3QpO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5SYW5nZWAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VJblJhbmdlKG51bWJlcixzdGFydCxlbmQpe3JldHVybiBudW1iZXI+PW5hdGl2ZU1pbihzdGFydCxlbmQpJiZudW1iZXI8bmF0aXZlTWF4KHN0YXJ0LGVuZCk7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCwgd2l0aG91dCBzdXBwb3J0XG4gICAgICAgICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5jbHVkZXM9Y29tcGFyYXRvcj9hcnJheUluY2x1ZGVzV2l0aDphcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheXNbMF0ubGVuZ3RoLG90aExlbmd0aD1hcnJheXMubGVuZ3RoLG90aEluZGV4PW90aExlbmd0aCxjYWNoZXM9QXJyYXkob3RoTGVuZ3RoKSxtYXhMZW5ndGg9SW5maW5pdHkscmVzdWx0PVtdO3doaWxlKG90aEluZGV4LS0pe3ZhciBhcnJheT1hcnJheXNbb3RoSW5kZXhdO2lmKG90aEluZGV4JiZpdGVyYXRlZSl7YXJyYXk9YXJyYXlNYXAoYXJyYXksYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7fW1heExlbmd0aD1uYXRpdmVNaW4oYXJyYXkubGVuZ3RoLG1heExlbmd0aCk7Y2FjaGVzW290aEluZGV4XT0hY29tcGFyYXRvciYmKGl0ZXJhdGVlfHxsZW5ndGg+PTEyMCYmYXJyYXkubGVuZ3RoPj0xMjApP25ldyBTZXRDYWNoZShvdGhJbmRleCYmYXJyYXkpOnVuZGVmaW5lZDt9YXJyYXk9YXJyYXlzWzBdO3ZhciBpbmRleD0tMSxzZWVuPWNhY2hlc1swXTtvdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCYmcmVzdWx0Lmxlbmd0aDxtYXhMZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU/aXRlcmF0ZWUodmFsdWUpOnZhbHVlO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKCEoc2Vlbj9jYWNoZUhhcyhzZWVuLGNvbXB1dGVkKTppbmNsdWRlcyhyZXN1bHQsY29tcHV0ZWQsY29tcGFyYXRvcikpKXtvdGhJbmRleD1vdGhMZW5ndGg7d2hpbGUoLS1vdGhJbmRleCl7dmFyIGNhY2hlPWNhY2hlc1tvdGhJbmRleF07aWYoIShjYWNoZT9jYWNoZUhhcyhjYWNoZSxjb21wdXRlZCk6aW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSxjb21wdXRlZCxjb21wYXJhdG9yKSkpe2NvbnRpbnVlIG91dGVyO319aWYoc2Vlbil7c2Vlbi5wdXNoKGNvbXB1dGVkKTt9cmVzdWx0LnB1c2godmFsdWUpO319cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludmVydGAgYW5kIGBfLmludmVydEJ5YCB3aGljaCBpbnZlcnRzXG4gICAgICAgICAqIGBvYmplY3RgIHdpdGggdmFsdWVzIHRyYW5zZm9ybWVkIGJ5IGBpdGVyYXRlZWAgYW5kIHNldCBieSBgc2V0dGVyYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0gdmFsdWVzLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUludmVydGVyKG9iamVjdCxzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe3NldHRlcihhY2N1bXVsYXRvcixpdGVyYXRlZSh2YWx1ZSksa2V5LG9iamVjdCk7fSk7cmV0dXJuIGFjY3VtdWxhdG9yO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW52b2tlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgICAgICogbWV0aG9kIGFyZ3VtZW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3Mpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO29iamVjdD1wYXJlbnQob2JqZWN0LHBhdGgpO3ZhciBmdW5jPW9iamVjdD09bnVsbD9vYmplY3Q6b2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtyZXR1cm4gZnVuYz09bnVsbD91bmRlZmluZWQ6YXBwbHkoZnVuYyxvYmplY3QsYXJncyk7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1hcmdzVGFnO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcnJheUJ1ZmZlcmAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09YXJyYXlCdWZmZXJUYWc7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0RhdGVgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlSXNEYXRlKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWRhdGVUYWc7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gICAgICAgICAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgICAgICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICAgICAgICAgKiAgMiAtIFBhcnRpYWwgY29tcGFyaXNvblxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl7aWYodmFsdWU9PT1vdGhlcil7cmV0dXJuIHRydWU7fWlmKHZhbHVlPT1udWxsfHxvdGhlcj09bnVsbHx8IWlzT2JqZWN0TGlrZSh2YWx1ZSkmJiFpc09iamVjdExpa2Uob3RoZXIpKXtyZXR1cm4gdmFsdWUhPT12YWx1ZSYmb3RoZXIhPT1vdGhlcjt9cmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsYmFzZUlzRXF1YWwsc3RhY2spO30vKipcbiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAgICAgKiBkZWVwIGNvbXBhcmlzb25zIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gICAgICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIG9iaklzQXJyPWlzQXJyYXkob2JqZWN0KSxvdGhJc0Fycj1pc0FycmF5KG90aGVyKSxvYmpUYWc9b2JqSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG9iamVjdCksb3RoVGFnPW90aElzQXJyP2FycmF5VGFnOmdldFRhZyhvdGhlcik7b2JqVGFnPW9ialRhZz09YXJnc1RhZz9vYmplY3RUYWc6b2JqVGFnO290aFRhZz1vdGhUYWc9PWFyZ3NUYWc/b2JqZWN0VGFnOm90aFRhZzt2YXIgb2JqSXNPYmo9b2JqVGFnPT1vYmplY3RUYWcsb3RoSXNPYmo9b3RoVGFnPT1vYmplY3RUYWcsaXNTYW1lVGFnPW9ialRhZz09b3RoVGFnO2lmKGlzU2FtZVRhZyYmaXNCdWZmZXIob2JqZWN0KSl7aWYoIWlzQnVmZmVyKG90aGVyKSl7cmV0dXJuIGZhbHNlO31vYmpJc0Fycj10cnVlO29iaklzT2JqPWZhbHNlO31pZihpc1NhbWVUYWcmJiFvYmpJc09iail7c3RhY2t8fChzdGFjaz1uZXcgU3RhY2soKSk7cmV0dXJuIG9iaklzQXJyfHxpc1R5cGVkQXJyYXkob2JqZWN0KT9lcXVhbEFycmF5cyhvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayk6ZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsb2JqVGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spO31pZighKGJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKXt2YXIgb2JqSXNXcmFwcGVkPW9iaklzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwnX193cmFwcGVkX18nKSxvdGhJc1dyYXBwZWQ9b3RoSXNPYmomJmhhc093blByb3BlcnR5LmNhbGwob3RoZXIsJ19fd3JhcHBlZF9fJyk7aWYob2JqSXNXcmFwcGVkfHxvdGhJc1dyYXBwZWQpe3ZhciBvYmpVbndyYXBwZWQ9b2JqSXNXcmFwcGVkP29iamVjdC52YWx1ZSgpOm9iamVjdCxvdGhVbndyYXBwZWQ9b3RoSXNXcmFwcGVkP290aGVyLnZhbHVlKCk6b3RoZXI7c3RhY2t8fChzdGFjaz1uZXcgU3RhY2soKSk7cmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsb3RoVW53cmFwcGVkLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayk7fX1pZighaXNTYW1lVGFnKXtyZXR1cm4gZmFsc2U7fXN0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKCkpO3JldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUlzTWFwKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmZ2V0VGFnKHZhbHVlKT09bWFwVGFnO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXRjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsbWF0Y2hEYXRhLGN1c3RvbWl6ZXIpe3ZhciBpbmRleD1tYXRjaERhdGEubGVuZ3RoLGxlbmd0aD1pbmRleCxub0N1c3RvbWl6ZXI9IWN1c3RvbWl6ZXI7aWYob2JqZWN0PT1udWxsKXtyZXR1cm4hbGVuZ3RoO31vYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUoaW5kZXgtLSl7dmFyIGRhdGE9bWF0Y2hEYXRhW2luZGV4XTtpZihub0N1c3RvbWl6ZXImJmRhdGFbMl0/ZGF0YVsxXSE9PW9iamVjdFtkYXRhWzBdXTohKGRhdGFbMF1pbiBvYmplY3QpKXtyZXR1cm4gZmFsc2U7fX13aGlsZSgrK2luZGV4PGxlbmd0aCl7ZGF0YT1tYXRjaERhdGFbaW5kZXhdO3ZhciBrZXk9ZGF0YVswXSxvYmpWYWx1ZT1vYmplY3Rba2V5XSxzcmNWYWx1ZT1kYXRhWzFdO2lmKG5vQ3VzdG9taXplciYmZGF0YVsyXSl7aWYob2JqVmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCkpe3JldHVybiBmYWxzZTt9fWVsc2V7dmFyIHN0YWNrPW5ldyBTdGFjaygpO2lmKGN1c3RvbWl6ZXIpe3ZhciByZXN1bHQ9Y3VzdG9taXplcihvYmpWYWx1ZSxzcmNWYWx1ZSxrZXksb2JqZWN0LHNvdXJjZSxzdGFjayk7fWlmKCEocmVzdWx0PT09dW5kZWZpbmVkP2Jhc2VJc0VxdWFsKHNyY1ZhbHVlLG9ialZhbHVlLENPTVBBUkVfUEFSVElBTF9GTEFHfENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsY3VzdG9taXplcixzdGFjayk6cmVzdWx0KSl7cmV0dXJuIGZhbHNlO319fXJldHVybiB0cnVlO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSl7aWYoIWlzT2JqZWN0KHZhbHVlKXx8aXNNYXNrZWQodmFsdWUpKXtyZXR1cm4gZmFsc2U7fXZhciBwYXR0ZXJuPWlzRnVuY3Rpb24odmFsdWUpP3JlSXNOYXRpdmU6cmVJc0hvc3RDdG9yO3JldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzUmVnRXhwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1yZWdleHBUYWc7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1NldGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZnZXRUYWcodmFsdWUpPT1zZXRUYWc7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmaXNMZW5ndGgodmFsdWUubGVuZ3RoKSYmISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pdGVyYXRlZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpey8vIERvbid0IHN0b3JlIHRoZSBgdHlwZW9mYCByZXN1bHQgaW4gYSB2YXJpYWJsZSB0byBhdm9pZCBhIEpJVCBidWcgaW4gU2FmYXJpIDkuXG4vLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuaWYodHlwZW9mIHZhbHVlPT09J2Z1bmN0aW9uJyl7cmV0dXJuIHZhbHVlO31pZih2YWx1ZT09bnVsbCl7cmV0dXJuIGlkZW50aXR5O31pZigodHlwZW9mIHZhbHVlPT09J3VuZGVmaW5lZCc/J3VuZGVmaW5lZCc6X3R5cGVvZih2YWx1ZSkpPT09J29iamVjdCcpe3JldHVybiBpc0FycmF5KHZhbHVlKT9iYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLHZhbHVlWzFdKTpiYXNlTWF0Y2hlcyh2YWx1ZSk7fXJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KXtpZighaXNQcm90b3R5cGUob2JqZWN0KSl7cmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTt9dmFyIHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSYma2V5IT0nY29uc3RydWN0b3InKXtyZXN1bHQucHVzaChrZXkpO319cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KXtpZighaXNPYmplY3Qob2JqZWN0KSl7cmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO312YXIgaXNQcm90bz1pc1Byb3RvdHlwZShvYmplY3QpLHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBvYmplY3Qpe2lmKCEoa2V5PT0nY29uc3RydWN0b3InJiYoaXNQcm90b3x8IWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpKSl7cmVzdWx0LnB1c2goa2V5KTt9fXJldHVybiByZXN1bHQ7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZUx0KHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU8b3RoZXI7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGluZGV4PS0xLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7cmVzdWx0WysraW5kZXhdPWl0ZXJhdGVlKHZhbHVlLGtleSxjb2xsZWN0aW9uKTt9KTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKXt2YXIgbWF0Y2hEYXRhPWdldE1hdGNoRGF0YShzb3VyY2UpO2lmKG1hdGNoRGF0YS5sZW5ndGg9PTEmJm1hdGNoRGF0YVswXVsyXSl7cmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSxtYXRjaERhdGFbMF1bMV0pO31yZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT09c291cmNlfHxiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLG1hdGNoRGF0YSk7fTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLHNyY1ZhbHVlKXtpZihpc0tleShwYXRoKSYmaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSl7cmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLHNyY1ZhbHVlKTt9cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7dmFyIG9ialZhbHVlPWdldChvYmplY3QscGF0aCk7cmV0dXJuIG9ialZhbHVlPT09dW5kZWZpbmVkJiZvYmpWYWx1ZT09PXNyY1ZhbHVlP2hhc0luKG9iamVjdCxwYXRoKTpiYXNlSXNFcXVhbChzcmNWYWx1ZSxvYmpWYWx1ZSxDT01QQVJFX1BBUlRJQUxfRkxBR3xDT01QQVJFX1VOT1JERVJFRF9GTEFHKTt9O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyLHN0YWNrKXtpZihvYmplY3Q9PT1zb3VyY2Upe3JldHVybjt9YmFzZUZvcihzb3VyY2UsZnVuY3Rpb24oc3JjVmFsdWUsa2V5KXtpZihpc09iamVjdChzcmNWYWx1ZSkpe3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKCkpO2Jhc2VNZXJnZURlZXAob2JqZWN0LHNvdXJjZSxrZXksc3JjSW5kZXgsYmFzZU1lcmdlLGN1c3RvbWl6ZXIsc3RhY2spO31lbHNle3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIoc2FmZUdldChvYmplY3Qsa2V5KSxzcmNWYWx1ZSxrZXkrJycsb2JqZWN0LHNvdXJjZSxzdGFjayk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKXtuZXdWYWx1ZT1zcmNWYWx1ZTt9YXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LG5ld1ZhbHVlKTt9fSxrZXlzSW4pO30vKipcbiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgICAgICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgICAgICogcmVmZXJlbmNlcyB0byBiZSBtZXJnZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3Qsc291cmNlLGtleSxzcmNJbmRleCxtZXJnZUZ1bmMsY3VzdG9taXplcixzdGFjayl7dmFyIG9ialZhbHVlPXNhZmVHZXQob2JqZWN0LGtleSksc3JjVmFsdWU9c2FmZUdldChzb3VyY2Usa2V5KSxzdGFja2VkPXN0YWNrLmdldChzcmNWYWx1ZSk7aWYoc3RhY2tlZCl7YXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHN0YWNrZWQpO3JldHVybjt9dmFyIG5ld1ZhbHVlPWN1c3RvbWl6ZXI/Y3VzdG9taXplcihvYmpWYWx1ZSxzcmNWYWx1ZSxrZXkrJycsb2JqZWN0LHNvdXJjZSxzdGFjayk6dW5kZWZpbmVkO3ZhciBpc0NvbW1vbj1uZXdWYWx1ZT09PXVuZGVmaW5lZDtpZihpc0NvbW1vbil7dmFyIGlzQXJyPWlzQXJyYXkoc3JjVmFsdWUpLGlzQnVmZj0haXNBcnImJmlzQnVmZmVyKHNyY1ZhbHVlKSxpc1R5cGVkPSFpc0FyciYmIWlzQnVmZiYmaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTtuZXdWYWx1ZT1zcmNWYWx1ZTtpZihpc0Fycnx8aXNCdWZmfHxpc1R5cGVkKXtpZihpc0FycmF5KG9ialZhbHVlKSl7bmV3VmFsdWU9b2JqVmFsdWU7fWVsc2UgaWYoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKXtuZXdWYWx1ZT1jb3B5QXJyYXkob2JqVmFsdWUpO31lbHNlIGlmKGlzQnVmZil7aXNDb21tb249ZmFsc2U7bmV3VmFsdWU9Y2xvbmVCdWZmZXIoc3JjVmFsdWUsdHJ1ZSk7fWVsc2UgaWYoaXNUeXBlZCl7aXNDb21tb249ZmFsc2U7bmV3VmFsdWU9Y2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLHRydWUpO31lbHNle25ld1ZhbHVlPVtdO319ZWxzZSBpZihpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKXx8aXNBcmd1bWVudHMoc3JjVmFsdWUpKXtuZXdWYWx1ZT1vYmpWYWx1ZTtpZihpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpe25ld1ZhbHVlPXRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO31lbHNlIGlmKCFpc09iamVjdChvYmpWYWx1ZSl8fHNyY0luZGV4JiZpc0Z1bmN0aW9uKG9ialZhbHVlKSl7bmV3VmFsdWU9aW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKTt9fWVsc2V7aXNDb21tb249ZmFsc2U7fX1pZihpc0NvbW1vbil7Ly8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG5zdGFjay5zZXQoc3JjVmFsdWUsbmV3VmFsdWUpO21lcmdlRnVuYyhuZXdWYWx1ZSxzcmNWYWx1ZSxzcmNJbmRleCxjdXN0b21pemVyLHN0YWNrKTtzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO31hc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubnRoYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VOdGgoYXJyYXksbil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7aWYoIWxlbmd0aCl7cmV0dXJuO31uKz1uPDA/bGVuZ3RoOjA7cmV0dXJuIGlzSW5kZXgobixsZW5ndGgpP2FycmF5W25dOnVuZGVmaW5lZDt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmdbXX0gb3JkZXJzIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMpe3ZhciBpbmRleD0tMTtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLmxlbmd0aD9pdGVyYXRlZXM6W2lkZW50aXR5XSxiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO3ZhciByZXN1bHQ9YmFzZU1hcChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXt2YXIgY3JpdGVyaWE9YXJyYXlNYXAoaXRlcmF0ZWVzLGZ1bmN0aW9uKGl0ZXJhdGVlKXtyZXR1cm4gaXRlcmF0ZWUodmFsdWUpO30pO3JldHVybntjcml0ZXJpYTpjcml0ZXJpYSxpbmRleDorK2luZGV4LHZhbHVlOnZhbHVlfTt9KTtyZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsZnVuY3Rpb24ob2JqZWN0LG90aGVyKXtyZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCxvdGhlcixvcmRlcnMpO30pO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICAgICAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LHBhdGhzKXtyZXR1cm4gYmFzZVBpY2tCeShvYmplY3QscGF0aHMsZnVuY3Rpb24odmFsdWUscGF0aCl7cmV0dXJuIGhhc0luKG9iamVjdCxwYXRoKTt9KTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LHBhdGhzLHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRocy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGF0aD1wYXRoc1tpbmRleF0sdmFsdWU9YmFzZUdldChvYmplY3QscGF0aCk7aWYocHJlZGljYXRlKHZhbHVlLHBhdGgpKXtiYXNlU2V0KHJlc3VsdCxjYXN0UGF0aChwYXRoLG9iamVjdCksdmFsdWUpO319cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUdldChvYmplY3QscGF0aCk7fTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBbGxCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgICAgICAgKiBzaG9ydGhhbmRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleE9mPWNvbXBhcmF0b3I/YmFzZUluZGV4T2ZXaXRoOmJhc2VJbmRleE9mLGluZGV4PS0xLGxlbmd0aD12YWx1ZXMubGVuZ3RoLHNlZW49YXJyYXk7aWYoYXJyYXk9PT12YWx1ZXMpe3ZhbHVlcz1jb3B5QXJyYXkodmFsdWVzKTt9aWYoaXRlcmF0ZWUpe3NlZW49YXJyYXlNYXAoYXJyYXksYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7fXdoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZnJvbUluZGV4PTAsdmFsdWU9dmFsdWVzW2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7d2hpbGUoKGZyb21JbmRleD1pbmRleE9mKHNlZW4sY29tcHV0ZWQsZnJvbUluZGV4LGNvbXBhcmF0b3IpKT4tMSl7aWYoc2VlbiE9PWFycmF5KXtzcGxpY2UuY2FsbChzZWVuLGZyb21JbmRleCwxKTt9c3BsaWNlLmNhbGwoYXJyYXksZnJvbUluZGV4LDEpO319cmV0dXJuIGFycmF5O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgICAgICogaW5kZXhlcyBvciBjYXB0dXJpbmcgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGluZGV4ZXMgVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZVB1bGxBdChhcnJheSxpbmRleGVzKXt2YXIgbGVuZ3RoPWFycmF5P2luZGV4ZXMubGVuZ3RoOjAsbGFzdEluZGV4PWxlbmd0aC0xO3doaWxlKGxlbmd0aC0tKXt2YXIgaW5kZXg9aW5kZXhlc1tsZW5ndGhdO2lmKGxlbmd0aD09bGFzdEluZGV4fHxpbmRleCE9PXByZXZpb3VzKXt2YXIgcHJldmlvdXM9aW5kZXg7aWYoaXNJbmRleChpbmRleCkpe3NwbGljZS5jYWxsKGFycmF5LGluZGV4LDEpO31lbHNle2Jhc2VVbnNldChhcnJheSxpbmRleCk7fX19cmV0dXJuIGFycmF5O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZG9tYCB3aXRob3V0IHN1cHBvcnQgZm9yIHJldHVybmluZ1xuICAgICAgICAgKiBmbG9hdGluZy1wb2ludCBudW1iZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93ZXIgVGhlIGxvd2VyIGJvdW5kLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKXtyZXR1cm4gbG93ZXIrbmF0aXZlRmxvb3IobmF0aXZlUmFuZG9tKCkqKHVwcGVyLWxvd2VyKzEpKTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICAgICAgICAgKiBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VSYW5nZShzdGFydCxlbmQsc3RlcCxmcm9tUmlnaHQpe3ZhciBpbmRleD0tMSxsZW5ndGg9bmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZC1zdGFydCkvKHN0ZXB8fDEpKSwwKSxyZXN1bHQ9QXJyYXkobGVuZ3RoKTt3aGlsZShsZW5ndGgtLSl7cmVzdWx0W2Zyb21SaWdodD9sZW5ndGg6KytpbmRleF09c3RhcnQ7c3RhcnQrPXN0ZXA7fXJldHVybiByZXN1bHQ7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXBlYXRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZyxuKXt2YXIgcmVzdWx0PScnO2lmKCFzdHJpbmd8fG48MXx8bj5NQVhfU0FGRV9JTlRFR0VSKXtyZXR1cm4gcmVzdWx0O30vLyBMZXZlcmFnZSB0aGUgZXhwb25lbnRpYXRpb24gYnkgc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBhIGZhc3RlciByZXBlYXQuXG4vLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXhwb25lbnRpYXRpb25fYnlfc3F1YXJpbmcgZm9yIG1vcmUgZGV0YWlscy5cbmRve2lmKG4lMil7cmVzdWx0Kz1zdHJpbmc7fW49bmF0aXZlRmxvb3Iobi8yKTtpZihuKXtzdHJpbmcrPXN0cmluZzt9fXdoaWxlKG4pO3JldHVybiByZXN1bHQ7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VSZXN0KGZ1bmMsc3RhcnQpe3JldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLHN0YXJ0LGlkZW50aXR5KSxmdW5jKycnKTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pe3JldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlU2l6ZWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4pe3ZhciBhcnJheT12YWx1ZXMoY29sbGVjdGlvbik7cmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSk7fS8qKlxuICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7aWYoIWlzT2JqZWN0KG9iamVjdCkpe3JldHVybiBvYmplY3Q7fXBhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aC5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xLG5lc3RlZD1vYmplY3Q7d2hpbGUobmVzdGVkIT1udWxsJiYrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleShwYXRoW2luZGV4XSksbmV3VmFsdWU9dmFsdWU7aWYoaW5kZXghPWxhc3RJbmRleCl7dmFyIG9ialZhbHVlPW5lc3RlZFtrZXldO25ld1ZhbHVlPWN1c3RvbWl6ZXI/Y3VzdG9taXplcihvYmpWYWx1ZSxrZXksbmVzdGVkKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpe25ld1ZhbHVlPWlzT2JqZWN0KG9ialZhbHVlKT9vYmpWYWx1ZTppc0luZGV4KHBhdGhbaW5kZXgrMV0pP1tdOnt9O319YXNzaWduVmFsdWUobmVzdGVkLGtleSxuZXdWYWx1ZSk7bmVzdGVkPW5lc3RlZFtrZXldO31yZXR1cm4gb2JqZWN0O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldERhdGFgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICAgICAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAgICAgKi92YXIgYmFzZVNldERhdGE9IW1ldGFNYXA/aWRlbnRpdHk6ZnVuY3Rpb24oZnVuYyxkYXRhKXttZXRhTWFwLnNldChmdW5jLGRhdGEpO3JldHVybiBmdW5jO307LyoqXG4gICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICAgKlxuICAgICAgICogQHByaXZhdGVcbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAgICovdmFyIGJhc2VTZXRUb1N0cmluZz0hZGVmaW5lUHJvcGVydHk/aWRlbnRpdHk6ZnVuY3Rpb24oZnVuYyxzdHJpbmcpe3JldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCd0b1N0cmluZycse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6Y29uc3RhbnQoc3RyaW5nKSx3cml0YWJsZTp0cnVlfSk7fTsvKipcbiAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNodWZmbGVgLlxuICAgICAgICpcbiAgICAgICAqIEBwcml2YXRlXG4gICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICAgKi9mdW5jdGlvbiBiYXNlU2h1ZmZsZShjb2xsZWN0aW9uKXtyZXR1cm4gc2h1ZmZsZVNlbGYodmFsdWVzKGNvbGxlY3Rpb24pKTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtpZihzdGFydDwwKXtzdGFydD0tc3RhcnQ+bGVuZ3RoPzA6bGVuZ3RoK3N0YXJ0O31lbmQ9ZW5kPmxlbmd0aD9sZW5ndGg6ZW5kO2lmKGVuZDwwKXtlbmQrPWxlbmd0aDt9bGVuZ3RoPXN0YXJ0PmVuZD8wOmVuZC1zdGFydD4+PjA7c3RhcnQ+Pj49MDt2YXIgcmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3Jlc3VsdFtpbmRleF09YXJyYXlbaW5kZXgrc3RhcnRdO31yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VTb21lKGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0O2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsaW5kZXgsY29sbGVjdGlvbil7cmVzdWx0PXByZWRpY2F0ZSh2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKTtyZXR1cm4hcmVzdWx0O30pO3JldHVybiEhcmVzdWx0O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhgIHdoaWNoXG4gICAgICAgICAqIHBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBvZiBgYXJyYXlgIHRvIGRldGVybWluZSB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSxyZXRIaWdoZXN0KXt2YXIgbG93PTAsaGlnaD1hcnJheT09bnVsbD9sb3c6YXJyYXkubGVuZ3RoO2lmKHR5cGVvZiB2YWx1ZT09PSdudW1iZXInJiZ2YWx1ZT09PXZhbHVlJiZoaWdoPD1IQUxGX01BWF9BUlJBWV9MRU5HVEgpe3doaWxlKGxvdzxoaWdoKXt2YXIgbWlkPWxvdytoaWdoPj4+MSxjb21wdXRlZD1hcnJheVttaWRdO2lmKGNvbXB1dGVkIT09bnVsbCYmIWlzU3ltYm9sKGNvbXB1dGVkKSYmKHJldEhpZ2hlc3Q/Y29tcHV0ZWQ8PXZhbHVlOmNvbXB1dGVkPHZhbHVlKSl7bG93PW1pZCsxO31lbHNle2hpZ2g9bWlkO319cmV0dXJuIGhpZ2g7fXJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpZGVudGl0eSxyZXRIaWdoZXN0KTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZEluZGV4QnlgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhCeWBcbiAgICAgICAgICogd2hpY2ggaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlXG4gICAgICAgICAqIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGl0ZXJhdGVlLHJldEhpZ2hlc3Qpe3ZhbHVlPWl0ZXJhdGVlKHZhbHVlKTt2YXIgbG93PTAsaGlnaD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCx2YWxJc05hTj12YWx1ZSE9PXZhbHVlLHZhbElzTnVsbD12YWx1ZT09PW51bGwsdmFsSXNTeW1ib2w9aXNTeW1ib2wodmFsdWUpLHZhbElzVW5kZWZpbmVkPXZhbHVlPT09dW5kZWZpbmVkO3doaWxlKGxvdzxoaWdoKXt2YXIgbWlkPW5hdGl2ZUZsb29yKChsb3craGlnaCkvMiksY29tcHV0ZWQ9aXRlcmF0ZWUoYXJyYXlbbWlkXSksb3RoSXNEZWZpbmVkPWNvbXB1dGVkIT09dW5kZWZpbmVkLG90aElzTnVsbD1jb21wdXRlZD09PW51bGwsb3RoSXNSZWZsZXhpdmU9Y29tcHV0ZWQ9PT1jb21wdXRlZCxvdGhJc1N5bWJvbD1pc1N5bWJvbChjb21wdXRlZCk7aWYodmFsSXNOYU4pe3ZhciBzZXRMb3c9cmV0SGlnaGVzdHx8b3RoSXNSZWZsZXhpdmU7fWVsc2UgaWYodmFsSXNVbmRlZmluZWQpe3NldExvdz1vdGhJc1JlZmxleGl2ZSYmKHJldEhpZ2hlc3R8fG90aElzRGVmaW5lZCk7fWVsc2UgaWYodmFsSXNOdWxsKXtzZXRMb3c9b3RoSXNSZWZsZXhpdmUmJm90aElzRGVmaW5lZCYmKHJldEhpZ2hlc3R8fCFvdGhJc051bGwpO31lbHNlIGlmKHZhbElzU3ltYm9sKXtzZXRMb3c9b3RoSXNSZWZsZXhpdmUmJm90aElzRGVmaW5lZCYmIW90aElzTnVsbCYmKHJldEhpZ2hlc3R8fCFvdGhJc1N5bWJvbCk7fWVsc2UgaWYob3RoSXNOdWxsfHxvdGhJc1N5bWJvbCl7c2V0TG93PWZhbHNlO31lbHNle3NldExvdz1yZXRIaWdoZXN0P2NvbXB1dGVkPD12YWx1ZTpjb21wdXRlZDx2YWx1ZTt9aWYoc2V0TG93KXtsb3c9bWlkKzE7fWVsc2V7aGlnaD1taWQ7fX1yZXR1cm4gbmF0aXZlTWluKGhpZ2gsTUFYX0FSUkFZX0lOREVYKTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZFVuaXFgIGFuZCBgXy5zb3J0ZWRVbmlxQnlgIHdpdGhvdXRcbiAgICAgICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSxpdGVyYXRlZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU/aXRlcmF0ZWUodmFsdWUpOnZhbHVlO2lmKCFpbmRleHx8IWVxKGNvbXB1dGVkLHNlZW4pKXt2YXIgc2Vlbj1jb21wdXRlZDtyZXN1bHRbcmVzSW5kZXgrK109dmFsdWU9PT0wPzA6dmFsdWU7fX1yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9OdW1iZXJgIHdoaWNoIGRvZXNuJ3QgZW5zdXJlIGNvcnJlY3RcbiAgICAgICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlVG9OdW1iZXIodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09PSdudW1iZXInKXtyZXR1cm4gdmFsdWU7fWlmKGlzU3ltYm9sKHZhbHVlKSl7cmV0dXJuIE5BTjt9cmV0dXJuK3ZhbHVlO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gICAgICAgICAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSl7Ly8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbmlmKHR5cGVvZiB2YWx1ZT09PSdzdHJpbmcnKXtyZXR1cm4gdmFsdWU7fWlmKGlzQXJyYXkodmFsdWUpKXsvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxucmV0dXJuIGFycmF5TWFwKHZhbHVlLGJhc2VUb1N0cmluZykrJyc7fWlmKGlzU3ltYm9sKHZhbHVlKSl7cmV0dXJuIHN5bWJvbFRvU3RyaW5nP3N5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpOicnO312YXIgcmVzdWx0PXZhbHVlKycnO3JldHVybiByZXN1bHQ9PScwJyYmMS92YWx1ZT09LUlORklOSVRZPyctMCc6cmVzdWx0O30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VVbmlxKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxpbmNsdWRlcz1hcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheS5sZW5ndGgsaXNDb21tb249dHJ1ZSxyZXN1bHQ9W10sc2Vlbj1yZXN1bHQ7aWYoY29tcGFyYXRvcil7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGg7fWVsc2UgaWYobGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXt2YXIgc2V0PWl0ZXJhdGVlP251bGw6Y3JlYXRlU2V0KGFycmF5KTtpZihzZXQpe3JldHVybiBzZXRUb0FycmF5KHNldCk7fWlzQ29tbW9uPWZhbHNlO2luY2x1ZGVzPWNhY2hlSGFzO3NlZW49bmV3IFNldENhY2hlKCk7fWVsc2V7c2Vlbj1pdGVyYXRlZT9bXTpyZXN1bHQ7fW91dGVyOndoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZihpc0NvbW1vbiYmY29tcHV0ZWQ9PT1jb21wdXRlZCl7dmFyIHNlZW5JbmRleD1zZWVuLmxlbmd0aDt3aGlsZShzZWVuSW5kZXgtLSl7aWYoc2VlbltzZWVuSW5kZXhdPT09Y29tcHV0ZWQpe2NvbnRpbnVlIG91dGVyO319aWYoaXRlcmF0ZWUpe3NlZW4ucHVzaChjb21wdXRlZCk7fXJlc3VsdC5wdXNoKHZhbHVlKTt9ZWxzZSBpZighaW5jbHVkZXMoc2Vlbixjb21wdXRlZCxjb21wYXJhdG9yKSl7aWYoc2VlbiE9PXJlc3VsdCl7c2Vlbi5wdXNoKGNvbXB1dGVkKTt9cmVzdWx0LnB1c2godmFsdWUpO319cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuc2V0YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gdW5zZXQuXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlVW5zZXQob2JqZWN0LHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO29iamVjdD1wYXJlbnQob2JqZWN0LHBhdGgpO3JldHVybiBvYmplY3Q9PW51bGx8fGRlbGV0ZSBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZVVwZGF0ZShvYmplY3QscGF0aCx1cGRhdGVyLGN1c3RvbWl6ZXIpe3JldHVybiBiYXNlU2V0KG9iamVjdCxwYXRoLHVwZGF0ZXIoYmFzZUdldChvYmplY3QscGF0aCkpLGN1c3RvbWl6ZXIpO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAgICAgICAgICogd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LHByZWRpY2F0ZSxpc0Ryb3AsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tUmlnaHQ/bGVuZ3RoOi0xO3doaWxlKChmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aCkmJnByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXt9cmV0dXJuIGlzRHJvcD9iYXNlU2xpY2UoYXJyYXksZnJvbVJpZ2h0PzA6aW5kZXgsZnJvbVJpZ2h0P2luZGV4KzE6bGVuZ3RoKTpiYXNlU2xpY2UoYXJyYXksZnJvbVJpZ2h0P2luZGV4KzE6MCxmcm9tUmlnaHQ/bGVuZ3RoOmluZGV4KTt9LyoqXG4gICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGB3cmFwcGVyVmFsdWVgIHdoaWNoIHJldHVybnMgdGhlIHJlc3VsdCBvZlxuICAgICAgICAgKiBwZXJmb3JtaW5nIGEgc2VxdWVuY2Ugb2YgYWN0aW9ucyBvbiB0aGUgdW53cmFwcGVkIGB2YWx1ZWAsIHdoZXJlIGVhY2hcbiAgICAgICAgICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYWN0aW9ucyBBY3Rpb25zIHRvIHBlcmZvcm0gdG8gcmVzb2x2ZSB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICAgICAqL2Z1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsYWN0aW9ucyl7dmFyIHJlc3VsdD12YWx1ZTtpZihyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcil7cmVzdWx0PXJlc3VsdC52YWx1ZSgpO31yZXR1cm4gYXJyYXlSZWR1Y2UoYWN0aW9ucyxmdW5jdGlvbihyZXN1bHQsYWN0aW9uKXtyZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsYXJyYXlQdXNoKFtyZXN1bHRdLGFjdGlvbi5hcmdzKSk7fSxyZXN1bHQpO30vKipcbiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgICAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcywgdGhhdCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgdmFsdWVzLlxuICAgICAgICAgKi9mdW5jdGlvbiBiYXNlWG9yKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgbGVuZ3RoPWFycmF5cy5sZW5ndGg7aWYobGVuZ3RoPDIpe3JldHVybiBsZW5ndGg/YmFzZVVuaXEoYXJyYXlzWzBdKTpbXTt9dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgYXJyYXk9YXJyYXlzW2luZGV4XSxvdGhJbmRleD0tMTt3aGlsZSgrK290aEluZGV4PGxlbmd0aCl7aWYob3RoSW5kZXghPWluZGV4KXtyZXN1bHRbaW5kZXhdPWJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF18fGFycmF5LGFycmF5c1tvdGhJbmRleF0saXRlcmF0ZWUsY29tcGFyYXRvcik7fX19cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwxKSxpdGVyYXRlZSxjb21wYXJhdG9yKTt9LyoqXG4gICAgICAgICAqIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy56aXBPYmplY3RgIHdoaWNoIGFzc2lnbnMgdmFsdWVzIHVzaW5nIGBhc3NpZ25GdW5jYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgICAgICovZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcyx2YWx1ZXMsYXNzaWduRnVuYyl7dmFyIGluZGV4PS0xLGxlbmd0aD1wcm9wcy5sZW5ndGgsdmFsc0xlbmd0aD12YWx1ZXMubGVuZ3RoLHJlc3VsdD17fTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWluZGV4PHZhbHNMZW5ndGg/dmFsdWVzW2luZGV4XTp1bmRlZmluZWQ7YXNzaWduRnVuYyhyZXN1bHQscHJvcHNbaW5kZXhdLHZhbHVlKTt9cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gZW1wdHkgYXJyYXkgaWYgaXQncyBub3QgYW4gYXJyYXkgbGlrZSBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgdGhlIGNhc3QgYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICAgICAqL2Z1bmN0aW9uIGNhc3RBcnJheUxpa2VPYmplY3QodmFsdWUpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSk/dmFsdWU6W107fS8qKlxuICAgICAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09PSdmdW5jdGlvbic/dmFsdWU6aWRlbnRpdHk7fS8qKlxuICAgICAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAgICAgKi9mdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSxvYmplY3Qpe2lmKGlzQXJyYXkodmFsdWUpKXtyZXR1cm4gdmFsdWU7fXJldHVybiBpc0tleSh2YWx1ZSxvYmplY3QpP1t2YWx1ZV06c3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSk7fS8qKlxuICAgICAgICAgKiBBIGBiYXNlUmVzdGAgYWxpYXMgd2hpY2ggY2FuIGJlIHJlcGxhY2VkIHdpdGggYGlkZW50aXR5YCBieSBtb2R1bGVcbiAgICAgICAgICogcmVwbGFjZW1lbnQgcGx1Z2lucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgICAgICovdmFyIGNhc3RSZXN0PWJhc2VSZXN0Oy8qKlxuICAgICAgICAgKiBDYXN0cyBgYXJyYXlgIHRvIGEgc2xpY2UgaWYgaXQncyBuZWVkZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBzbGljZS5cbiAgICAgICAgICovZnVuY3Rpb24gY2FzdFNsaWNlKGFycmF5LHN0YXJ0LGVuZCl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW5ndGg6ZW5kO3JldHVybiFzdGFydCYmZW5kPj1sZW5ndGg/YXJyYXk6YmFzZVNsaWNlKGFycmF5LHN0YXJ0LGVuZCk7fS8qKlxuICAgICAgICAgKiBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIFtgY2xlYXJUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vY2xlYXJUaW1lb3V0KS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ8T2JqZWN0fSBpZCBUaGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3Qgb2YgdGhlIHRpbWVyIHRvIGNsZWFyLlxuICAgICAgICAgKi92YXIgY2xlYXJUaW1lb3V0PWN0eENsZWFyVGltZW91dHx8ZnVuY3Rpb24oaWQpe3JldHVybiByb290LmNsZWFyVGltZW91dChpZCk7fTsvKipcbiAgICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gICAgICAgKlxuICAgICAgICogQHByaXZhdGVcbiAgICAgICAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICAgICAgICovZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLGlzRGVlcCl7aWYoaXNEZWVwKXtyZXR1cm4gYnVmZmVyLnNsaWNlKCk7fXZhciBsZW5ndGg9YnVmZmVyLmxlbmd0aCxyZXN1bHQ9YWxsb2NVbnNhZmU/YWxsb2NVbnNhZmUobGVuZ3RoKTpuZXcgYnVmZmVyLmNvbnN0cnVjdG9yKGxlbmd0aCk7YnVmZmVyLmNvcHkocmVzdWx0KTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheUJ1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGFycmF5IGJ1ZmZlci5cbiAgICAgICAgICovZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcil7dmFyIHJlc3VsdD1uZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7bmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBkYXRhVmlld2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhVmlldyBUaGUgZGF0YSB2aWV3IHRvIGNsb25lLlxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICAgICAgICAgKi9mdW5jdGlvbiBjbG9uZURhdGFWaWV3KGRhdGFWaWV3LGlzRGVlcCl7dmFyIGJ1ZmZlcj1pc0RlZXA/Y2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpOmRhdGFWaWV3LmJ1ZmZlcjtyZXR1cm4gbmV3IGRhdGFWaWV3LmNvbnN0cnVjdG9yKGJ1ZmZlcixkYXRhVmlldy5ieXRlT2Zmc2V0LGRhdGFWaWV3LmJ5dGVMZW5ndGgpO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGByZWdleHBgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVnZXhwIFRoZSByZWdleHAgdG8gY2xvbmUuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCl7dmFyIHJlc3VsdD1uZXcgcmVnZXhwLmNvbnN0cnVjdG9yKHJlZ2V4cC5zb3VyY2UscmVGbGFncy5leGVjKHJlZ2V4cCkpO3Jlc3VsdC5sYXN0SW5kZXg9cmVnZXhwLmxhc3RJbmRleDtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAgICAgKi9mdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpe3JldHVybiBzeW1ib2xWYWx1ZU9mP09iamVjdChzeW1ib2xWYWx1ZU9mLmNhbGwoc3ltYm9sKSk6e307fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAgICAgICAgICovZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksaXNEZWVwKXt2YXIgYnVmZmVyPWlzRGVlcD9jbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKTp0eXBlZEFycmF5LmJ1ZmZlcjtyZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLHR5cGVkQXJyYXkuYnl0ZU9mZnNldCx0eXBlZEFycmF5Lmxlbmd0aCk7fS8qKlxuICAgICAgICAgKiBDb21wYXJlcyB2YWx1ZXMgdG8gc29ydCB0aGVtIGluIGFzY2VuZGluZyBvcmRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGB2YWx1ZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsb3RoZXIpe2lmKHZhbHVlIT09b3RoZXIpe3ZhciB2YWxJc0RlZmluZWQ9dmFsdWUhPT11bmRlZmluZWQsdmFsSXNOdWxsPXZhbHVlPT09bnVsbCx2YWxJc1JlZmxleGl2ZT12YWx1ZT09PXZhbHVlLHZhbElzU3ltYm9sPWlzU3ltYm9sKHZhbHVlKTt2YXIgb3RoSXNEZWZpbmVkPW90aGVyIT09dW5kZWZpbmVkLG90aElzTnVsbD1vdGhlcj09PW51bGwsb3RoSXNSZWZsZXhpdmU9b3RoZXI9PT1vdGhlcixvdGhJc1N5bWJvbD1pc1N5bWJvbChvdGhlcik7aWYoIW90aElzTnVsbCYmIW90aElzU3ltYm9sJiYhdmFsSXNTeW1ib2wmJnZhbHVlPm90aGVyfHx2YWxJc1N5bWJvbCYmb3RoSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZSYmIW90aElzTnVsbCYmIW90aElzU3ltYm9sfHx2YWxJc051bGwmJm90aElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmV8fCF2YWxJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlfHwhdmFsSXNSZWZsZXhpdmUpe3JldHVybiAxO31pZighdmFsSXNOdWxsJiYhdmFsSXNTeW1ib2wmJiFvdGhJc1N5bWJvbCYmdmFsdWU8b3RoZXJ8fG90aElzU3ltYm9sJiZ2YWxJc0RlZmluZWQmJnZhbElzUmVmbGV4aXZlJiYhdmFsSXNOdWxsJiYhdmFsSXNTeW1ib2x8fG90aElzTnVsbCYmdmFsSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZXx8IW90aElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmV8fCFvdGhJc1JlZmxleGl2ZSl7cmV0dXJuLTE7fX1yZXR1cm4gMDt9LyoqXG4gICAgICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAgICAgKiBhbmQgc3RhYmxlIHNvcnQgdGhlbS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgICAgICogc3BlY2lmeSBhbiBvcmRlciBvZiBcImRlc2NcIiBmb3IgZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlclxuICAgICAgICAgKiBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbltdfHN0cmluZ1tdfSBvcmRlcnMgVGhlIG9yZGVyIHRvIHNvcnQgYnkgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgb2JqZWN0YC5cbiAgICAgICAgICovZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCxvdGhlcixvcmRlcnMpe3ZhciBpbmRleD0tMSxvYmpDcml0ZXJpYT1vYmplY3QuY3JpdGVyaWEsb3RoQ3JpdGVyaWE9b3RoZXIuY3JpdGVyaWEsbGVuZ3RoPW9iakNyaXRlcmlhLmxlbmd0aCxvcmRlcnNMZW5ndGg9b3JkZXJzLmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHJlc3VsdD1jb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSxvdGhDcml0ZXJpYVtpbmRleF0pO2lmKHJlc3VsdCl7aWYoaW5kZXg+PW9yZGVyc0xlbmd0aCl7cmV0dXJuIHJlc3VsdDt9dmFyIG9yZGVyPW9yZGVyc1tpbmRleF07cmV0dXJuIHJlc3VsdCoob3JkZXI9PSdkZXNjJz8tMToxKTt9fS8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbi8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4vLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbi8vIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbi8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxucmV0dXJuIG9iamVjdC5pbmRleC1vdGhlci5pbmRleDt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAgICAgKiBwbGFjZWhvbGRlcnMsIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICAgICAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgICAgICovZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPWFyZ3MubGVuZ3RoLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgsbGVmdEluZGV4PS0xLGxlZnRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLHJhbmdlTGVuZ3RoPW5hdGl2ZU1heChhcmdzTGVuZ3RoLWhvbGRlcnNMZW5ndGgsMCkscmVzdWx0PUFycmF5KGxlZnRMZW5ndGgrcmFuZ2VMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKytsZWZ0SW5kZXg8bGVmdExlbmd0aCl7cmVzdWx0W2xlZnRJbmRleF09cGFydGlhbHNbbGVmdEluZGV4XTt9d2hpbGUoKythcmdzSW5kZXg8aG9sZGVyc0xlbmd0aCl7aWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXtyZXN1bHRbaG9sZGVyc1thcmdzSW5kZXhdXT1hcmdzW2FyZ3NJbmRleF07fX13aGlsZShyYW5nZUxlbmd0aC0tKXtyZXN1bHRbbGVmdEluZGV4KytdPWFyZ3NbYXJnc0luZGV4KytdO31yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBjb21wb3NlQXJnc2AgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBjb21wb3NpdGlvblxuICAgICAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICAgICAqL2Z1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPWFyZ3MubGVuZ3RoLGhvbGRlcnNJbmRleD0tMSxob2xkZXJzTGVuZ3RoPWhvbGRlcnMubGVuZ3RoLHJpZ2h0SW5kZXg9LTEscmlnaHRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLHJhbmdlTGVuZ3RoPW5hdGl2ZU1heChhcmdzTGVuZ3RoLWhvbGRlcnNMZW5ndGgsMCkscmVzdWx0PUFycmF5KHJhbmdlTGVuZ3RoK3JpZ2h0TGVuZ3RoKSxpc1VuY3VycmllZD0haXNDdXJyaWVkO3doaWxlKCsrYXJnc0luZGV4PHJhbmdlTGVuZ3RoKXtyZXN1bHRbYXJnc0luZGV4XT1hcmdzW2FyZ3NJbmRleF07fXZhciBvZmZzZXQ9YXJnc0luZGV4O3doaWxlKCsrcmlnaHRJbmRleDxyaWdodExlbmd0aCl7cmVzdWx0W29mZnNldCtyaWdodEluZGV4XT1wYXJ0aWFsc1tyaWdodEluZGV4XTt9d2hpbGUoKytob2xkZXJzSW5kZXg8aG9sZGVyc0xlbmd0aCl7aWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXtyZXN1bHRbb2Zmc2V0K2hvbGRlcnNbaG9sZGVyc0luZGV4XV09YXJnc1thcmdzSW5kZXgrK107fX1yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsYXJyYXkpe3ZhciBpbmRleD0tMSxsZW5ndGg9c291cmNlLmxlbmd0aDthcnJheXx8KGFycmF5PUFycmF5KGxlbmd0aCkpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXthcnJheVtpbmRleF09c291cmNlW2luZGV4XTt9cmV0dXJuIGFycmF5O30vKipcbiAgICAgICAgICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAgICovZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UscHJvcHMsb2JqZWN0LGN1c3RvbWl6ZXIpe3ZhciBpc05ldz0hb2JqZWN0O29iamVjdHx8KG9iamVjdD17fSk7dmFyIGluZGV4PS0xLGxlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9cHJvcHNbaW5kZXhdO3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqZWN0W2tleV0sc291cmNlW2tleV0sa2V5LG9iamVjdCxzb3VyY2UpOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCl7bmV3VmFsdWU9c291cmNlW2tleV07fWlmKGlzTmV3KXtiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSk7fWVsc2V7YXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSk7fX1yZXR1cm4gb2JqZWN0O30vKipcbiAgICAgICAgICogQ29waWVzIG93biBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAgICovZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLG9iamVjdCl7cmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLGdldFN5bWJvbHMoc291cmNlKSxvYmplY3QpO30vKipcbiAgICAgICAgICogQ29waWVzIG93biBhbmQgaW5oZXJpdGVkIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAgICAgKi9mdW5jdGlvbiBjb3B5U3ltYm9sc0luKHNvdXJjZSxvYmplY3Qpe3JldHVybiBjb3B5T2JqZWN0KHNvdXJjZSxnZXRTeW1ib2xzSW4oc291cmNlKSxvYmplY3QpO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2luaXRpYWxpemVyXSBUaGUgYWNjdW11bGF0b3Igb2JqZWN0IGluaXRpYWxpemVyLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhZ2dyZWdhdG9yIGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcixpbml0aWFsaXplcil7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlBZ2dyZWdhdG9yOmJhc2VBZ2dyZWdhdG9yLGFjY3VtdWxhdG9yPWluaXRpYWxpemVyP2luaXRpYWxpemVyKCk6e307cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixzZXR0ZXIsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYWNjdW11bGF0b3IpO307fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGNyZWF0ZUFzc2lnbmVyKGFzc2lnbmVyKXtyZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9c291cmNlcy5sZW5ndGgsY3VzdG9taXplcj1sZW5ndGg+MT9zb3VyY2VzW2xlbmd0aC0xXTp1bmRlZmluZWQsZ3VhcmQ9bGVuZ3RoPjI/c291cmNlc1syXTp1bmRlZmluZWQ7Y3VzdG9taXplcj1hc3NpZ25lci5sZW5ndGg+MyYmdHlwZW9mIGN1c3RvbWl6ZXI9PT0nZnVuY3Rpb24nPyhsZW5ndGgtLSxjdXN0b21pemVyKTp1bmRlZmluZWQ7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sc291cmNlc1sxXSxndWFyZCkpe2N1c3RvbWl6ZXI9bGVuZ3RoPDM/dW5kZWZpbmVkOmN1c3RvbWl6ZXI7bGVuZ3RoPTE7fW9iamVjdD1PYmplY3Qob2JqZWN0KTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTtpZihzb3VyY2Upe2Fzc2lnbmVyKG9iamVjdCxzb3VyY2UsaW5kZXgsY3VzdG9taXplcik7fX1yZXR1cm4gb2JqZWN0O30pO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe2lmKGNvbGxlY3Rpb249PW51bGwpe3JldHVybiBjb2xsZWN0aW9uO31pZighaXNBcnJheUxpa2UoY29sbGVjdGlvbikpe3JldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLGl0ZXJhdGVlKTt9dmFyIGxlbmd0aD1jb2xsZWN0aW9uLmxlbmd0aCxpbmRleD1mcm9tUmlnaHQ/bGVuZ3RoOi0xLGl0ZXJhYmxlPU9iamVjdChjb2xsZWN0aW9uKTt3aGlsZShmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aCl7aWYoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLGluZGV4LGl0ZXJhYmxlKT09PWZhbHNlKXticmVhazt9fXJldHVybiBjb2xsZWN0aW9uO307fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgYmFzZSBmdW5jdGlvbiBmb3IgbWV0aG9kcyBsaWtlIGBfLmZvckluYCBhbmQgYF8uZm9yT3duYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0LGl0ZXJhdGVlLGtleXNGdW5jKXt2YXIgaW5kZXg9LTEsaXRlcmFibGU9T2JqZWN0KG9iamVjdCkscHJvcHM9a2V5c0Z1bmMob2JqZWN0KSxsZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXt2YXIga2V5PXByb3BzW2Zyb21SaWdodD9sZW5ndGg6KytpbmRleF07aWYoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpPT09ZmFsc2Upe2JyZWFrO319cmV0dXJuIG9iamVjdDt9O30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBvcHRpb25hbCBgdGhpc2BcbiAgICAgICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYyxiaXRtYXNrLHRoaXNBcmcpe3ZhciBpc0JpbmQ9Yml0bWFzayZXUkFQX0JJTkRfRkxBRyxDdG9yPWNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBmbj10aGlzJiZ0aGlzIT09cm9vdCYmdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXI/Q3RvcjpmdW5jO3JldHVybiBmbi5hcHBseShpc0JpbmQ/dGhpc0FyZzp0aGlzLGFyZ3VtZW50cyk7fXJldHVybiB3cmFwcGVyO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhc2UgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGNyZWF0ZUNhc2VGaXJzdChtZXRob2ROYW1lKXtyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTt2YXIgc3RyU3ltYm9scz1oYXNVbmljb2RlKHN0cmluZyk/c3RyaW5nVG9BcnJheShzdHJpbmcpOnVuZGVmaW5lZDt2YXIgY2hyPXN0clN5bWJvbHM/c3RyU3ltYm9sc1swXTpzdHJpbmcuY2hhckF0KDApO3ZhciB0cmFpbGluZz1zdHJTeW1ib2xzP2Nhc3RTbGljZShzdHJTeW1ib2xzLDEpLmpvaW4oJycpOnN0cmluZy5zbGljZSgxKTtyZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkrdHJhaWxpbmc7fTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmNhbWVsQ2FzZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lIGVhY2ggd29yZC5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG91bmRlciBmdW5jdGlvbi5cbiAgICAgICAgICovZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjayl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCcnKSksY2FsbGJhY2ssJycpO307fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhbiBpbnN0YW5jZSBvZiBgQ3RvcmAgcmVnYXJkbGVzcyBvZlxuICAgICAgICAgKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3Ipe3JldHVybiBmdW5jdGlvbigpey8vIFVzZSBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0byB3b3JrIHdpdGggY2xhc3MgY29uc3RydWN0b3JzLiBTZWVcbi8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4vLyBmb3IgbW9yZSBkZXRhaWxzLlxudmFyIGFyZ3M9YXJndW1lbnRzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgQ3RvcigpO2Nhc2UgMTpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7Y2FzZSAyOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7Y2FzZSA1OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSk7fXZhciB0aGlzQmluZGluZz1iYXNlQ3JlYXRlKEN0b3IucHJvdG90eXBlKSxyZXN1bHQ9Q3Rvci5hcHBseSh0aGlzQmluZGluZyxhcmdzKTsvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbi8vIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxMy4yLjIgZm9yIG1vcmUgZGV0YWlscy5cbnJldHVybiBpc09iamVjdChyZXN1bHQpP3Jlc3VsdDp0aGlzQmluZGluZzt9O30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGVuYWJsZSBjdXJyeWluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGNyZWF0ZUN1cnJ5KGZ1bmMsYml0bWFzayxhcml0eSl7dmFyIEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVuZ3RoKSxpbmRleD1sZW5ndGgscGxhY2Vob2xkZXI9Z2V0SG9sZGVyKHdyYXBwZXIpO3doaWxlKGluZGV4LS0pe2FyZ3NbaW5kZXhdPWFyZ3VtZW50c1tpbmRleF07fXZhciBob2xkZXJzPWxlbmd0aDwzJiZhcmdzWzBdIT09cGxhY2Vob2xkZXImJmFyZ3NbbGVuZ3RoLTFdIT09cGxhY2Vob2xkZXI/W106cmVwbGFjZUhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7bGVuZ3RoLT1ob2xkZXJzLmxlbmd0aDtpZihsZW5ndGg8YXJpdHkpe3JldHVybiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayxjcmVhdGVIeWJyaWQsd3JhcHBlci5wbGFjZWhvbGRlcix1bmRlZmluZWQsYXJncyxob2xkZXJzLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHktbGVuZ3RoKTt9dmFyIGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9DdG9yOmZ1bmM7cmV0dXJuIGFwcGx5KGZuLHRoaXMsYXJncyk7fXJldHVybiB3cmFwcGVyO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGBfLmZpbmRgIG9yIGBfLmZpbmRMYXN0YCBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmluZEluZGV4RnVuYyBUaGUgZnVuY3Rpb24gdG8gZmluZCB0aGUgY29sbGVjdGlvbiBpbmRleC5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAgICAgICAgICovZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKXtyZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbixwcmVkaWNhdGUsZnJvbUluZGV4KXt2YXIgaXRlcmFibGU9T2JqZWN0KGNvbGxlY3Rpb24pO2lmKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSl7dmFyIGl0ZXJhdGVlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKTtjb2xsZWN0aW9uPWtleXMoY29sbGVjdGlvbik7cHJlZGljYXRlPWZ1bmN0aW9uIHByZWRpY2F0ZShrZXkpe3JldHVybiBpdGVyYXRlZShpdGVyYWJsZVtrZXldLGtleSxpdGVyYWJsZSk7fTt9dmFyIGluZGV4PWZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbixwcmVkaWNhdGUsZnJvbUluZGV4KTtyZXR1cm4gaW5kZXg+LTE/aXRlcmFibGVbaXRlcmF0ZWU/Y29sbGVjdGlvbltpbmRleF06aW5kZXhdOnVuZGVmaW5lZDt9O30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGBfLmZsb3dgIG9yIGBfLmZsb3dSaWdodGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCl7cmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmNzKXt2YXIgbGVuZ3RoPWZ1bmNzLmxlbmd0aCxpbmRleD1sZW5ndGgscHJlcmVxPUxvZGFzaFdyYXBwZXIucHJvdG90eXBlLnRocnU7aWYoZnJvbVJpZ2h0KXtmdW5jcy5yZXZlcnNlKCk7fXdoaWxlKGluZGV4LS0pe3ZhciBmdW5jPWZ1bmNzW2luZGV4XTtpZih0eXBlb2YgZnVuYyE9PSdmdW5jdGlvbicpe3Rocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt9aWYocHJlcmVxJiYhd3JhcHBlciYmZ2V0RnVuY05hbWUoZnVuYyk9PSd3cmFwcGVyJyl7dmFyIHdyYXBwZXI9bmV3IExvZGFzaFdyYXBwZXIoW10sdHJ1ZSk7fX1pbmRleD13cmFwcGVyP2luZGV4Omxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7ZnVuYz1mdW5jc1tpbmRleF07dmFyIGZ1bmNOYW1lPWdldEZ1bmNOYW1lKGZ1bmMpLGRhdGE9ZnVuY05hbWU9PSd3cmFwcGVyJz9nZXREYXRhKGZ1bmMpOnVuZGVmaW5lZDtpZihkYXRhJiZpc0xhemlhYmxlKGRhdGFbMF0pJiZkYXRhWzFdPT0oV1JBUF9BUllfRkxBR3xXUkFQX0NVUlJZX0ZMQUd8V1JBUF9QQVJUSUFMX0ZMQUd8V1JBUF9SRUFSR19GTEFHKSYmIWRhdGFbNF0ubGVuZ3RoJiZkYXRhWzldPT0xKXt3cmFwcGVyPXdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsZGF0YVszXSk7fWVsc2V7d3JhcHBlcj1mdW5jLmxlbmd0aD09MSYmaXNMYXppYWJsZShmdW5jKT93cmFwcGVyW2Z1bmNOYW1lXSgpOndyYXBwZXIudGhydShmdW5jKTt9fXJldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cyx2YWx1ZT1hcmdzWzBdO2lmKHdyYXBwZXImJmFyZ3MubGVuZ3RoPT0xJiZpc0FycmF5KHZhbHVlKSl7cmV0dXJuIHdyYXBwZXIucGxhbnQodmFsdWUpLnZhbHVlKCk7fXZhciBpbmRleD0wLHJlc3VsdD1sZW5ndGg/ZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsYXJncyk6dmFsdWU7d2hpbGUoKytpbmRleDxsZW5ndGgpe3Jlc3VsdD1mdW5jc1tpbmRleF0uY2FsbCh0aGlzLHJlc3VsdCk7fXJldHVybiByZXN1bHQ7fTt9KTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCBvcHRpb25hbCBgdGhpc2BcbiAgICAgICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AsIHBhcnRpYWwgYXBwbGljYXRpb24sIGFuZCBjdXJyeWluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzUmlnaHRdIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkXG4gICAgICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc1JpZ2h0XSBUaGUgYHBhcnRpYWxzUmlnaHRgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYyxiaXRtYXNrLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNBcnk9Yml0bWFzayZXUkFQX0FSWV9GTEFHLGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRyxpc0N1cnJpZWQ9Yml0bWFzayYoV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyksaXNGbGlwPWJpdG1hc2smV1JBUF9GTElQX0ZMQUcsQ3Rvcj1pc0JpbmRLZXk/dW5kZWZpbmVkOmNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KGxlbmd0aCksaW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pe2FyZ3NbaW5kZXhdPWFyZ3VtZW50c1tpbmRleF07fWlmKGlzQ3VycmllZCl7dmFyIHBsYWNlaG9sZGVyPWdldEhvbGRlcih3cmFwcGVyKSxob2xkZXJzQ291bnQ9Y291bnRIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpO31pZihwYXJ0aWFscyl7YXJncz1jb21wb3NlQXJncyhhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKTt9aWYocGFydGlhbHNSaWdodCl7YXJncz1jb21wb3NlQXJnc1JpZ2h0KGFyZ3MscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsaXNDdXJyaWVkKTt9bGVuZ3RoLT1ob2xkZXJzQ291bnQ7aWYoaXNDdXJyaWVkJiZsZW5ndGg8YXJpdHkpe3ZhciBuZXdIb2xkZXJzPXJlcGxhY2VIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpO3JldHVybiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayxjcmVhdGVIeWJyaWQsd3JhcHBlci5wbGFjZWhvbGRlcix0aGlzQXJnLGFyZ3MsbmV3SG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5LWxlbmd0aCk7fXZhciB0aGlzQmluZGluZz1pc0JpbmQ/dGhpc0FyZzp0aGlzLGZuPWlzQmluZEtleT90aGlzQmluZGluZ1tmdW5jXTpmdW5jO2xlbmd0aD1hcmdzLmxlbmd0aDtpZihhcmdQb3Mpe2FyZ3M9cmVvcmRlcihhcmdzLGFyZ1Bvcyk7fWVsc2UgaWYoaXNGbGlwJiZsZW5ndGg+MSl7YXJncy5yZXZlcnNlKCk7fWlmKGlzQXJ5JiZhcnk8bGVuZ3RoKXthcmdzLmxlbmd0aD1hcnk7fWlmKHRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcil7Zm49Q3Rvcnx8Y3JlYXRlQ3Rvcihmbik7fXJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZyxhcmdzKTt9cmV0dXJuIHdyYXBwZXI7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdG9JdGVyYXRlZSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSBpdGVyYXRlZXMuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludmVydGVyIGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsdG9JdGVyYXRlZSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLHt9KTt9O30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wZXJhdG9yIFRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBjcmVhdGVNYXRoT3BlcmF0aW9uKG9wZXJhdG9yLGRlZmF1bHRWYWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLG90aGVyKXt2YXIgcmVzdWx0O2lmKHZhbHVlPT09dW5kZWZpbmVkJiZvdGhlcj09PXVuZGVmaW5lZCl7cmV0dXJuIGRlZmF1bHRWYWx1ZTt9aWYodmFsdWUhPT11bmRlZmluZWQpe3Jlc3VsdD12YWx1ZTt9aWYob3RoZXIhPT11bmRlZmluZWQpe2lmKHJlc3VsdD09PXVuZGVmaW5lZCl7cmV0dXJuIG90aGVyO31pZih0eXBlb2YgdmFsdWU9PT0nc3RyaW5nJ3x8dHlwZW9mIG90aGVyPT09J3N0cmluZycpe3ZhbHVlPWJhc2VUb1N0cmluZyh2YWx1ZSk7b3RoZXI9YmFzZVRvU3RyaW5nKG90aGVyKTt9ZWxzZXt2YWx1ZT1iYXNlVG9OdW1iZXIodmFsdWUpO290aGVyPWJhc2VUb051bWJlcihvdGhlcik7fXJlc3VsdD1vcGVyYXRvcih2YWx1ZSxvdGhlcik7fXJldHVybiByZXN1bHQ7fTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG92ZXIgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKXtyZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKXtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciB0aGlzQXJnPXRoaXM7cmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsZnVuY3Rpb24oaXRlcmF0ZWUpe3JldHVybiBhcHBseShpdGVyYXRlZSx0aGlzQXJnLGFyZ3MpO30pO30pO30pO30vKipcbiAgICAgICAgICogQ3JlYXRlcyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AgYmFzZWQgb24gYGxlbmd0aGAuIFRoZSBgY2hhcnNgIHN0cmluZ1xuICAgICAgICAgKiBpcyB0cnVuY2F0ZWQgaWYgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4Y2VlZHMgYGxlbmd0aGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRpbmcgZm9yIGBzdHJpbmdgLlxuICAgICAgICAgKi9mdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCxjaGFycyl7Y2hhcnM9Y2hhcnM9PT11bmRlZmluZWQ/JyAnOmJhc2VUb1N0cmluZyhjaGFycyk7dmFyIGNoYXJzTGVuZ3RoPWNoYXJzLmxlbmd0aDtpZihjaGFyc0xlbmd0aDwyKXtyZXR1cm4gY2hhcnNMZW5ndGg/YmFzZVJlcGVhdChjaGFycyxsZW5ndGgpOmNoYXJzO312YXIgcmVzdWx0PWJhc2VSZXBlYXQoY2hhcnMsbmF0aXZlQ2VpbChsZW5ndGgvc3RyaW5nU2l6ZShjaGFycykpKTtyZXR1cm4gaGFzVW5pY29kZShjaGFycyk/Y2FzdFNsaWNlKHN0cmluZ1RvQXJyYXkocmVzdWx0KSwwLGxlbmd0aCkuam9pbignJyk6cmVzdWx0LnNsaWNlKDAsbGVuZ3RoKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmdcbiAgICAgICAgICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzKXt2YXIgaXNCaW5kPWJpdG1hc2smV1JBUF9CSU5EX0ZMQUcsQ3Rvcj1jcmVhdGVDdG9yKGZ1bmMpO2Z1bmN0aW9uIHdyYXBwZXIoKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9YXJndW1lbnRzLmxlbmd0aCxsZWZ0SW5kZXg9LTEsbGVmdExlbmd0aD1wYXJ0aWFscy5sZW5ndGgsYXJncz1BcnJheShsZWZ0TGVuZ3RoK2FyZ3NMZW5ndGgpLGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9DdG9yOmZ1bmM7d2hpbGUoKytsZWZ0SW5kZXg8bGVmdExlbmd0aCl7YXJnc1tsZWZ0SW5kZXhdPXBhcnRpYWxzW2xlZnRJbmRleF07fXdoaWxlKGFyZ3NMZW5ndGgtLSl7YXJnc1tsZWZ0SW5kZXgrK109YXJndW1lbnRzWysrYXJnc0luZGV4XTt9cmV0dXJuIGFwcGx5KGZuLGlzQmluZD90aGlzQXJnOnRoaXMsYXJncyk7fXJldHVybiB3cmFwcGVyO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGBfLnJhbmdlYCBvciBgXy5yYW5nZVJpZ2h0YCBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJhbmdlIGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpe3JldHVybiBmdW5jdGlvbihzdGFydCxlbmQsc3RlcCl7aWYoc3RlcCYmdHlwZW9mIHN0ZXAhPT0nbnVtYmVyJyYmaXNJdGVyYXRlZUNhbGwoc3RhcnQsZW5kLHN0ZXApKXtlbmQ9c3RlcD11bmRlZmluZWQ7fS8vIEVuc3VyZSB0aGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbnN0YXJ0PXRvRmluaXRlKHN0YXJ0KTtpZihlbmQ9PT11bmRlZmluZWQpe2VuZD1zdGFydDtzdGFydD0wO31lbHNle2VuZD10b0Zpbml0ZShlbmQpO31zdGVwPXN0ZXA9PT11bmRlZmluZWQ/c3RhcnQ8ZW5kPzE6LTE6dG9GaW5pdGUoc3RlcCk7cmV0dXJuIGJhc2VSYW5nZShzdGFydCxlbmQsc3RlcCxmcm9tUmlnaHQpO307fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHJlbGF0aW9uYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wZXJhdG9yIFRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlbGF0aW9uYWwgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUsb3RoZXIpe2lmKCEodHlwZW9mIHZhbHVlPT09J3N0cmluZycmJnR5cGVvZiBvdGhlcj09PSdzdHJpbmcnKSl7dmFsdWU9dG9OdW1iZXIodmFsdWUpO290aGVyPXRvTnVtYmVyKG90aGVyKTt9cmV0dXJuIG9wZXJhdG9yKHZhbHVlLG90aGVyKTt9O30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGNvbnRpbnVlIGN1cnJ5aW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwRnVuYyBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBgZnVuY2Agd3JhcHBlci5cbiAgICAgICAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLHdyYXBGdW5jLHBsYWNlaG9sZGVyLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNDdXJyeT1iaXRtYXNrJldSQVBfQ1VSUllfRkxBRyxuZXdIb2xkZXJzPWlzQ3Vycnk/aG9sZGVyczp1bmRlZmluZWQsbmV3SG9sZGVyc1JpZ2h0PWlzQ3Vycnk/dW5kZWZpbmVkOmhvbGRlcnMsbmV3UGFydGlhbHM9aXNDdXJyeT9wYXJ0aWFsczp1bmRlZmluZWQsbmV3UGFydGlhbHNSaWdodD1pc0N1cnJ5P3VuZGVmaW5lZDpwYXJ0aWFscztiaXRtYXNrfD1pc0N1cnJ5P1dSQVBfUEFSVElBTF9GTEFHOldSQVBfUEFSVElBTF9SSUdIVF9GTEFHO2JpdG1hc2smPX4oaXNDdXJyeT9XUkFQX1BBUlRJQUxfUklHSFRfRkxBRzpXUkFQX1BBUlRJQUxfRkxBRyk7aWYoIShiaXRtYXNrJldSQVBfQ1VSUllfQk9VTkRfRkxBRykpe2JpdG1hc2smPX4oV1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHKTt9dmFyIG5ld0RhdGE9W2Z1bmMsYml0bWFzayx0aGlzQXJnLG5ld1BhcnRpYWxzLG5ld0hvbGRlcnMsbmV3UGFydGlhbHNSaWdodCxuZXdIb2xkZXJzUmlnaHQsYXJnUG9zLGFyeSxhcml0eV07dmFyIHJlc3VsdD13cmFwRnVuYy5hcHBseSh1bmRlZmluZWQsbmV3RGF0YSk7aWYoaXNMYXppYWJsZShmdW5jKSl7c2V0RGF0YShyZXN1bHQsbmV3RGF0YSk7fXJlc3VsdC5wbGFjZWhvbGRlcj1wbGFjZWhvbGRlcjtyZXR1cm4gc2V0V3JhcFRvU3RyaW5nKHJlc3VsdCxmdW5jLGJpdG1hc2spO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ucm91bmRgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgYE1hdGhgIG1ldGhvZCB0byB1c2Ugd2hlbiByb3VuZGluZy5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcm91bmQgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpe3ZhciBmdW5jPU1hdGhbbWV0aG9kTmFtZV07cmV0dXJuIGZ1bmN0aW9uKG51bWJlcixwcmVjaXNpb24pe251bWJlcj10b051bWJlcihudW1iZXIpO3ByZWNpc2lvbj1wcmVjaXNpb249PW51bGw/MDpuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksMjkyKTtpZihwcmVjaXNpb24pey8vIFNoaWZ0IHdpdGggZXhwb25lbnRpYWwgbm90YXRpb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgaXNzdWVzLlxuLy8gU2VlIFtNRE5dKGh0dHBzOi8vbWRuLmlvL3JvdW5kI0V4YW1wbGVzKSBmb3IgbW9yZSBkZXRhaWxzLlxudmFyIHBhaXI9KHRvU3RyaW5nKG51bWJlcikrJ2UnKS5zcGxpdCgnZScpLHZhbHVlPWZ1bmMocGFpclswXSsnZScrKCtwYWlyWzFdK3ByZWNpc2lvbikpO3BhaXI9KHRvU3RyaW5nKHZhbHVlKSsnZScpLnNwbGl0KCdlJyk7cmV0dXJuKyhwYWlyWzBdKydlJysoK3BhaXJbMV0tcHJlY2lzaW9uKSk7fXJldHVybiBmdW5jKG51bWJlcik7fTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAgICAgICAgICovdmFyIGNyZWF0ZVNldD0hKFNldCYmMS9zZXRUb0FycmF5KG5ldyBTZXQoWywtMF0pKVsxXT09SU5GSU5JVFkpP25vb3A6ZnVuY3Rpb24odmFsdWVzKXtyZXR1cm4gbmV3IFNldCh2YWx1ZXMpO307LyoqXG4gICAgICAgKiBDcmVhdGVzIGEgYF8udG9QYWlyc2Agb3IgYF8udG9QYWlyc0luYCBmdW5jdGlvbi5cbiAgICAgICAqXG4gICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhaXJzIGZ1bmN0aW9uLlxuICAgICAgICovZnVuY3Rpb24gY3JlYXRlVG9QYWlycyhrZXlzRnVuYyl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7dmFyIHRhZz1nZXRUYWcob2JqZWN0KTtpZih0YWc9PW1hcFRhZyl7cmV0dXJuIG1hcFRvQXJyYXkob2JqZWN0KTt9aWYodGFnPT1zZXRUYWcpe3JldHVybiBzZXRUb1BhaXJzKG9iamVjdCk7fXJldHVybiBiYXNlVG9QYWlycyhvYmplY3Qsa2V5c0Z1bmMob2JqZWN0KSk7fTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWxcbiAgICAgICAgICogYHRoaXNgIGJpbmRpbmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAgICAgKiAgICAxIC0gYF8uYmluZGBcbiAgICAgICAgICogICAgMiAtIGBfLmJpbmRLZXlgXG4gICAgICAgICAqICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICAgICAgICAgKiAgICA4IC0gYF8uY3VycnlgXG4gICAgICAgICAqICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICAgICAgICAgKiAgIDMyIC0gYF8ucGFydGlhbGBcbiAgICAgICAgICogICA2NCAtIGBfLnBhcnRpYWxSaWdodGBcbiAgICAgICAgICogIDEyOCAtIGBfLnJlYXJnYFxuICAgICAgICAgKiAgMjU2IC0gYF8uYXJ5YFxuICAgICAgICAgKiAgNTEyIC0gYF8uZmxpcGBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICAgICAqL2Z1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYyxiaXRtYXNrLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNCaW5kS2V5PWJpdG1hc2smV1JBUF9CSU5EX0tFWV9GTEFHO2lmKCFpc0JpbmRLZXkmJnR5cGVvZiBmdW5jIT09J2Z1bmN0aW9uJyl7dGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO312YXIgbGVuZ3RoPXBhcnRpYWxzP3BhcnRpYWxzLmxlbmd0aDowO2lmKCFsZW5ndGgpe2JpdG1hc2smPX4oV1JBUF9QQVJUSUFMX0ZMQUd8V1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpO3BhcnRpYWxzPWhvbGRlcnM9dW5kZWZpbmVkO31hcnk9YXJ5PT09dW5kZWZpbmVkP2FyeTpuYXRpdmVNYXgodG9JbnRlZ2VyKGFyeSksMCk7YXJpdHk9YXJpdHk9PT11bmRlZmluZWQ/YXJpdHk6dG9JbnRlZ2VyKGFyaXR5KTtsZW5ndGgtPWhvbGRlcnM/aG9sZGVycy5sZW5ndGg6MDtpZihiaXRtYXNrJldSQVBfUEFSVElBTF9SSUdIVF9GTEFHKXt2YXIgcGFydGlhbHNSaWdodD1wYXJ0aWFscyxob2xkZXJzUmlnaHQ9aG9sZGVycztwYXJ0aWFscz1ob2xkZXJzPXVuZGVmaW5lZDt9dmFyIGRhdGE9aXNCaW5kS2V5P3VuZGVmaW5lZDpnZXREYXRhKGZ1bmMpO3ZhciBuZXdEYXRhPVtmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHldO2lmKGRhdGEpe21lcmdlRGF0YShuZXdEYXRhLGRhdGEpO31mdW5jPW5ld0RhdGFbMF07Yml0bWFzaz1uZXdEYXRhWzFdO3RoaXNBcmc9bmV3RGF0YVsyXTtwYXJ0aWFscz1uZXdEYXRhWzNdO2hvbGRlcnM9bmV3RGF0YVs0XTthcml0eT1uZXdEYXRhWzldPW5ld0RhdGFbOV09PT11bmRlZmluZWQ/aXNCaW5kS2V5PzA6ZnVuYy5sZW5ndGg6bmF0aXZlTWF4KG5ld0RhdGFbOV0tbGVuZ3RoLDApO2lmKCFhcml0eSYmYml0bWFzayYoV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRykpe2JpdG1hc2smPX4oV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7fWlmKCFiaXRtYXNrfHxiaXRtYXNrPT1XUkFQX0JJTkRfRkxBRyl7dmFyIHJlc3VsdD1jcmVhdGVCaW5kKGZ1bmMsYml0bWFzayx0aGlzQXJnKTt9ZWxzZSBpZihiaXRtYXNrPT1XUkFQX0NVUlJZX0ZMQUd8fGJpdG1hc2s9PVdSQVBfQ1VSUllfUklHSFRfRkxBRyl7cmVzdWx0PWNyZWF0ZUN1cnJ5KGZ1bmMsYml0bWFzayxhcml0eSk7fWVsc2UgaWYoKGJpdG1hc2s9PVdSQVBfUEFSVElBTF9GTEFHfHxiaXRtYXNrPT0oV1JBUF9CSU5EX0ZMQUd8V1JBUF9QQVJUSUFMX0ZMQUcpKSYmIWhvbGRlcnMubGVuZ3RoKXtyZXN1bHQ9Y3JlYXRlUGFydGlhbChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyk7fWVsc2V7cmVzdWx0PWNyZWF0ZUh5YnJpZC5hcHBseSh1bmRlZmluZWQsbmV3RGF0YSk7fXZhciBzZXR0ZXI9ZGF0YT9iYXNlU2V0RGF0YTpzZXREYXRhO3JldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCxuZXdEYXRhKSxmdW5jLGJpdG1hc2spO30vKipcbiAgICAgICAgICogVXNlZCBieSBgXy5kZWZhdWx0c2AgdG8gY3VzdG9taXplIGl0cyBgXy5hc3NpZ25JbmAgdXNlIHRvIGFzc2lnbiBwcm9wZXJ0aWVzXG4gICAgICAgICAqIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzXG4gICAgICAgICAqIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHNvdXJjZSB2YWx1ZS5cbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHBhcmVudCBvYmplY3Qgb2YgYG9ialZhbHVlYC5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgICAgICovZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSxzcmNWYWx1ZSxrZXksb2JqZWN0KXtpZihvYmpWYWx1ZT09PXVuZGVmaW5lZHx8ZXEob2JqVmFsdWUsb2JqZWN0UHJvdG9ba2V5XSkmJiFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKXtyZXR1cm4gc3JjVmFsdWU7fXJldHVybiBvYmpWYWx1ZTt9LyoqXG4gICAgICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNEZWVwYCB0byBjdXN0b21pemUgaXRzIGBfLm1lcmdlYCB1c2UgdG8gbWVyZ2Ugc291cmNlXG4gICAgICAgICAqIG9iamVjdHMgaW50byBkZXN0aW5hdGlvbiBvYmplY3RzIHRoYXQgYXJlIHBhc3NlZCB0aHJ1LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIG1lcmdlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHBhcmVudCBvYmplY3Qgb2YgYHNyY1ZhbHVlYC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgICAgICovZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNNZXJnZShvYmpWYWx1ZSxzcmNWYWx1ZSxrZXksb2JqZWN0LHNvdXJjZSxzdGFjayl7aWYoaXNPYmplY3Qob2JqVmFsdWUpJiZpc09iamVjdChzcmNWYWx1ZSkpey8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuc3RhY2suc2V0KHNyY1ZhbHVlLG9ialZhbHVlKTtiYXNlTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsdW5kZWZpbmVkLGN1c3RvbURlZmF1bHRzTWVyZ2Usc3RhY2spO3N0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7fXJldHVybiBvYmpWYWx1ZTt9LyoqXG4gICAgICAgICAqIFVzZWQgYnkgYF8ub21pdGAgdG8gY3VzdG9taXplIGl0cyBgXy5jbG9uZURlZXBgIHVzZSB0byBvbmx5IGNsb25lIHBsYWluXG4gICAgICAgICAqIG9iamVjdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVuY2xvbmVkIHZhbHVlIG9yIGB1bmRlZmluZWRgIHRvIGRlZmVyIGNsb25pbmcgdG8gYF8uY2xvbmVEZWVwYC5cbiAgICAgICAgICovZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKXtyZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSk/dW5kZWZpbmVkOnZhbHVlO30vKipcbiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAgICAgKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBvdGhlciBUaGUgb3RoZXIgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXlzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBpc1BhcnRpYWw9Yml0bWFzayZDT01QQVJFX1BBUlRJQUxfRkxBRyxhcnJMZW5ndGg9YXJyYXkubGVuZ3RoLG90aExlbmd0aD1vdGhlci5sZW5ndGg7aWYoYXJyTGVuZ3RoIT1vdGhMZW5ndGgmJiEoaXNQYXJ0aWFsJiZvdGhMZW5ndGg+YXJyTGVuZ3RoKSl7cmV0dXJuIGZhbHNlO30vLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG52YXIgc3RhY2tlZD1zdGFjay5nZXQoYXJyYXkpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpe3JldHVybiBzdGFja2VkPT1vdGhlcjt9dmFyIGluZGV4PS0xLHJlc3VsdD10cnVlLHNlZW49Yml0bWFzayZDT01QQVJFX1VOT1JERVJFRF9GTEFHP25ldyBTZXRDYWNoZSgpOnVuZGVmaW5lZDtzdGFjay5zZXQoYXJyYXksb3RoZXIpO3N0YWNrLnNldChvdGhlcixhcnJheSk7Ly8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxud2hpbGUoKytpbmRleDxhcnJMZW5ndGgpe3ZhciBhcnJWYWx1ZT1hcnJheVtpbmRleF0sb3RoVmFsdWU9b3RoZXJbaW5kZXhdO2lmKGN1c3RvbWl6ZXIpe3ZhciBjb21wYXJlZD1pc1BhcnRpYWw/Y3VzdG9taXplcihvdGhWYWx1ZSxhcnJWYWx1ZSxpbmRleCxvdGhlcixhcnJheSxzdGFjayk6Y3VzdG9taXplcihhcnJWYWx1ZSxvdGhWYWx1ZSxpbmRleCxhcnJheSxvdGhlcixzdGFjayk7fWlmKGNvbXBhcmVkIT09dW5kZWZpbmVkKXtpZihjb21wYXJlZCl7Y29udGludWU7fXJlc3VsdD1mYWxzZTticmVhazt9Ly8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbmlmKHNlZW4pe2lmKCFhcnJheVNvbWUob3RoZXIsZnVuY3Rpb24ob3RoVmFsdWUsb3RoSW5kZXgpe2lmKCFjYWNoZUhhcyhzZWVuLG90aEluZGV4KSYmKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSl7cmV0dXJuIHNlZW4ucHVzaChvdGhJbmRleCk7fX0pKXtyZXN1bHQ9ZmFsc2U7YnJlYWs7fX1lbHNlIGlmKCEoYXJyVmFsdWU9PT1vdGhWYWx1ZXx8ZXF1YWxGdW5jKGFyclZhbHVlLG90aFZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixzdGFjaykpKXtyZXN1bHQ9ZmFsc2U7YnJlYWs7fX1zdGFja1snZGVsZXRlJ10oYXJyYXkpO3N0YWNrWydkZWxldGUnXShvdGhlcik7cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAgICAgICAgICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsdGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3N3aXRjaCh0YWcpe2Nhc2UgZGF0YVZpZXdUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fG9iamVjdC5ieXRlT2Zmc2V0IT1vdGhlci5ieXRlT2Zmc2V0KXtyZXR1cm4gZmFsc2U7fW9iamVjdD1vYmplY3QuYnVmZmVyO290aGVyPW90aGVyLmJ1ZmZlcjtjYXNlIGFycmF5QnVmZmVyVGFnOmlmKG9iamVjdC5ieXRlTGVuZ3RoIT1vdGhlci5ieXRlTGVuZ3RofHwhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSl7cmV0dXJuIGZhbHNlO31yZXR1cm4gdHJ1ZTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOmNhc2UgbnVtYmVyVGFnOi8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4vLyBJbnZhbGlkIGRhdGVzIGFyZSBjb2VyY2VkIHRvIGBOYU5gLlxucmV0dXJuIGVxKCtvYmplY3QsK290aGVyKTtjYXNlIGVycm9yVGFnOnJldHVybiBvYmplY3QubmFtZT09b3RoZXIubmFtZSYmb2JqZWN0Lm1lc3NhZ2U9PW90aGVyLm1lc3NhZ2U7Y2FzZSByZWdleHBUYWc6Y2FzZSBzdHJpbmdUYWc6Ly8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncywgcHJpbWl0aXZlcyBhbmQgb2JqZWN0cyxcbi8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbi8vIGZvciBtb3JlIGRldGFpbHMuXG5yZXR1cm4gb2JqZWN0PT1vdGhlcisnJztjYXNlIG1hcFRhZzp2YXIgY29udmVydD1tYXBUb0FycmF5O2Nhc2Ugc2V0VGFnOnZhciBpc1BhcnRpYWw9Yml0bWFzayZDT01QQVJFX1BBUlRJQUxfRkxBRztjb252ZXJ0fHwoY29udmVydD1zZXRUb0FycmF5KTtpZihvYmplY3Quc2l6ZSE9b3RoZXIuc2l6ZSYmIWlzUGFydGlhbCl7cmV0dXJuIGZhbHNlO30vLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG52YXIgc3RhY2tlZD1zdGFjay5nZXQob2JqZWN0KTtpZihzdGFja2VkKXtyZXR1cm4gc3RhY2tlZD09b3RoZXI7fWJpdG1hc2t8PUNPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7Ly8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG5zdGFjay5zZXQob2JqZWN0LG90aGVyKTt2YXIgcmVzdWx0PWVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSxjb252ZXJ0KG90aGVyKSxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTtzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtyZXR1cm4gcmVzdWx0O2Nhc2Ugc3ltYm9sVGFnOmlmKHN5bWJvbFZhbHVlT2Ype3JldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KT09c3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTt9fXJldHVybiBmYWxzZTt9LyoqXG4gICAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIGlzUGFydGlhbD1iaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHLG9ialByb3BzPWdldEFsbEtleXMob2JqZWN0KSxvYmpMZW5ndGg9b2JqUHJvcHMubGVuZ3RoLG90aFByb3BzPWdldEFsbEtleXMob3RoZXIpLG90aExlbmd0aD1vdGhQcm9wcy5sZW5ndGg7aWYob2JqTGVuZ3RoIT1vdGhMZW5ndGgmJiFpc1BhcnRpYWwpe3JldHVybiBmYWxzZTt9dmFyIGluZGV4PW9iakxlbmd0aDt3aGlsZShpbmRleC0tKXt2YXIga2V5PW9ialByb3BzW2luZGV4XTtpZighKGlzUGFydGlhbD9rZXkgaW4gb3RoZXI6aGFzT3duUHJvcGVydHkuY2FsbChvdGhlcixrZXkpKSl7cmV0dXJuIGZhbHNlO319Ly8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxudmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZCYmc3RhY2suZ2V0KG90aGVyKSl7cmV0dXJuIHN0YWNrZWQ9PW90aGVyO312YXIgcmVzdWx0PXRydWU7c3RhY2suc2V0KG9iamVjdCxvdGhlcik7c3RhY2suc2V0KG90aGVyLG9iamVjdCk7dmFyIHNraXBDdG9yPWlzUGFydGlhbDt3aGlsZSgrK2luZGV4PG9iakxlbmd0aCl7a2V5PW9ialByb3BzW2luZGV4XTt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV0sb3RoVmFsdWU9b3RoZXJba2V5XTtpZihjdXN0b21pemVyKXt2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsb2JqVmFsdWUsa2V5LG90aGVyLG9iamVjdCxzdGFjayk6Y3VzdG9taXplcihvYmpWYWx1ZSxvdGhWYWx1ZSxrZXksb2JqZWN0LG90aGVyLHN0YWNrKTt9Ly8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG5pZighKGNvbXBhcmVkPT09dW5kZWZpbmVkP29ialZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhvYmpWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spOmNvbXBhcmVkKSl7cmVzdWx0PWZhbHNlO2JyZWFrO31za2lwQ3Rvcnx8KHNraXBDdG9yPWtleT09J2NvbnN0cnVjdG9yJyk7fWlmKHJlc3VsdCYmIXNraXBDdG9yKXt2YXIgb2JqQ3Rvcj1vYmplY3QuY29uc3RydWN0b3Isb3RoQ3Rvcj1vdGhlci5jb25zdHJ1Y3RvcjsvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbmlmKG9iakN0b3IhPW90aEN0b3ImJidjb25zdHJ1Y3RvcidpbiBvYmplY3QmJidjb25zdHJ1Y3RvcidpbiBvdGhlciYmISh0eXBlb2Ygb2JqQ3Rvcj09PSdmdW5jdGlvbicmJm9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yJiZ0eXBlb2Ygb3RoQ3Rvcj09PSdmdW5jdGlvbicmJm90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSl7cmVzdWx0PWZhbHNlO319c3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7c3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggZmxhdHRlbnMgdGhlIHJlc3QgYXJyYXkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBmbGF0UmVzdChmdW5jKXtyZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYyx1bmRlZmluZWQsZmxhdHRlbiksZnVuYysnJyk7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICAgICAqL2Z1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KXtyZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LGtleXMsZ2V0U3ltYm9scyk7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgICAgICovZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCl7cmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzSW4sZ2V0U3ltYm9sc0luKTt9LyoqXG4gICAgICAgICAqIEdldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAgICAgKi92YXIgZ2V0RGF0YT0hbWV0YU1hcD9ub29wOmZ1bmN0aW9uKGZ1bmMpe3JldHVybiBtZXRhTWFwLmdldChmdW5jKTt9Oy8qKlxuICAgICAgICogR2V0cyB0aGUgbmFtZSBvZiBgZnVuY2AuXG4gICAgICAgKlxuICAgICAgICogQHByaXZhdGVcbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgICAgICAqL2Z1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpe3ZhciByZXN1bHQ9ZnVuYy5uYW1lKycnLGFycmF5PXJlYWxOYW1lc1tyZXN1bHRdLGxlbmd0aD1oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlYWxOYW1lcyxyZXN1bHQpP2FycmF5Lmxlbmd0aDowO3doaWxlKGxlbmd0aC0tKXt2YXIgZGF0YT1hcnJheVtsZW5ndGhdLG90aGVyRnVuYz1kYXRhLmZ1bmM7aWYob3RoZXJGdW5jPT1udWxsfHxvdGhlckZ1bmM9PWZ1bmMpe3JldHVybiBkYXRhLm5hbWU7fX1yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogR2V0cyB0aGUgYXJndW1lbnQgcGxhY2Vob2xkZXIgdmFsdWUgZm9yIGBmdW5jYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAgICAgKi9mdW5jdGlvbiBnZXRIb2xkZXIoZnVuYyl7dmFyIG9iamVjdD1oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaCwncGxhY2Vob2xkZXInKT9sb2Rhc2g6ZnVuYztyZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO30vKipcbiAgICAgICAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgXCJpdGVyYXRlZVwiIGZ1bmN0aW9uLiBJZiBgXy5pdGVyYXRlZWAgaXMgY3VzdG9taXplZCxcbiAgICAgICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgYmFzZUl0ZXJhdGVlYC5cbiAgICAgICAgICogSWYgYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgdGhlIGNob3NlbiBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggdGhlbSBhbmRcbiAgICAgICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHsqfSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgdGhlIGNyZWF0ZWQgaXRlcmF0ZWUuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY2hvc2VuIGZ1bmN0aW9uIG9yIGl0cyByZXN1bHQuXG4gICAgICAgICAqL2Z1bmN0aW9uIGdldEl0ZXJhdGVlKCl7dmFyIHJlc3VsdD1sb2Rhc2guaXRlcmF0ZWV8fGl0ZXJhdGVlO3Jlc3VsdD1yZXN1bHQ9PT1pdGVyYXRlZT9iYXNlSXRlcmF0ZWU6cmVzdWx0O3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Jlc3VsdChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTpyZXN1bHQ7fS8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBkYXRhIGZvciBgbWFwYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gICAgICAgICAqL2Z1bmN0aW9uIGdldE1hcERhdGEobWFwLGtleSl7dmFyIGRhdGE9bWFwLl9fZGF0YV9fO3JldHVybiBpc0tleWFibGUoa2V5KT9kYXRhW3R5cGVvZiBrZXk9PT0nc3RyaW5nJz8nc3RyaW5nJzonaGFzaCddOmRhdGEubWFwO30vKipcbiAgICAgICAgICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLlxuICAgICAgICAgKi9mdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KXt2YXIgcmVzdWx0PWtleXMob2JqZWN0KSxsZW5ndGg9cmVzdWx0Lmxlbmd0aDt3aGlsZShsZW5ndGgtLSl7dmFyIGtleT1yZXN1bHRbbGVuZ3RoXSx2YWx1ZT1vYmplY3Rba2V5XTtyZXN1bHRbbGVuZ3RoXT1ba2V5LHZhbHVlLGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldO31yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAgICAgKi9mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LGtleSl7dmFyIHZhbHVlPWdldFZhbHVlKG9iamVjdCxrZXkpO3JldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpP3ZhbHVlOnVuZGVmaW5lZDt9LyoqXG4gICAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAgICAgICAgICovZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKXt2YXIgaXNPd249aGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxzeW1Ub1N0cmluZ1RhZyksdGFnPXZhbHVlW3N5bVRvU3RyaW5nVGFnXTt0cnl7dmFsdWVbc3ltVG9TdHJpbmdUYWddPXVuZGVmaW5lZDt2YXIgdW5tYXNrZWQ9dHJ1ZTt9Y2F0Y2goZSl7fXZhciByZXN1bHQ9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYodW5tYXNrZWQpe2lmKGlzT3duKXt2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dGFnO31lbHNle2RlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107fX1yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICAgICAqL3ZhciBnZXRTeW1ib2xzPSFuYXRpdmVHZXRTeW1ib2xzP3N0dWJBcnJheTpmdW5jdGlvbihvYmplY3Qpe2lmKG9iamVjdD09bnVsbCl7cmV0dXJuW107fW9iamVjdD1PYmplY3Qob2JqZWN0KTtyZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLGZ1bmN0aW9uKHN5bWJvbCl7cmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LHN5bWJvbCk7fSk7fTsvKipcbiAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgICAqXG4gICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAgICovdmFyIGdldFN5bWJvbHNJbj0hbmF0aXZlR2V0U3ltYm9scz9zdHViQXJyYXk6ZnVuY3Rpb24ob2JqZWN0KXt2YXIgcmVzdWx0PVtdO3doaWxlKG9iamVjdCl7YXJyYXlQdXNoKHJlc3VsdCxnZXRTeW1ib2xzKG9iamVjdCkpO29iamVjdD1nZXRQcm90b3R5cGUob2JqZWN0KTt9cmV0dXJuIHJlc3VsdDt9Oy8qKlxuICAgICAgICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICAgICAgICpcbiAgICAgICAqIEBwcml2YXRlXG4gICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gICAgICAgKi92YXIgZ2V0VGFnPWJhc2VHZXRUYWc7Ly8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuaWYoRGF0YVZpZXcmJmdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkhPWRhdGFWaWV3VGFnfHxNYXAmJmdldFRhZyhuZXcgTWFwKCkpIT1tYXBUYWd8fFByb21pc2UmJmdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkhPXByb21pc2VUYWd8fFNldCYmZ2V0VGFnKG5ldyBTZXQoKSkhPXNldFRhZ3x8V2Vha01hcCYmZ2V0VGFnKG5ldyBXZWFrTWFwKCkpIT13ZWFrTWFwVGFnKXtnZXRUYWc9ZnVuY3Rpb24gZ2V0VGFnKHZhbHVlKXt2YXIgcmVzdWx0PWJhc2VHZXRUYWcodmFsdWUpLEN0b3I9cmVzdWx0PT1vYmplY3RUYWc/dmFsdWUuY29uc3RydWN0b3I6dW5kZWZpbmVkLGN0b3JTdHJpbmc9Q3Rvcj90b1NvdXJjZShDdG9yKTonJztpZihjdG9yU3RyaW5nKXtzd2l0Y2goY3RvclN0cmluZyl7Y2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6cmV0dXJuIGRhdGFWaWV3VGFnO2Nhc2UgbWFwQ3RvclN0cmluZzpyZXR1cm4gbWFwVGFnO2Nhc2UgcHJvbWlzZUN0b3JTdHJpbmc6cmV0dXJuIHByb21pc2VUYWc7Y2FzZSBzZXRDdG9yU3RyaW5nOnJldHVybiBzZXRUYWc7Y2FzZSB3ZWFrTWFwQ3RvclN0cmluZzpyZXR1cm4gd2Vha01hcFRhZzt9fXJldHVybiByZXN1bHQ7fTt9LyoqXG4gICAgICAgICAqIEdldHMgdGhlIHZpZXcsIGFwcGx5aW5nIGFueSBgdHJhbnNmb3Jtc2AgdG8gdGhlIGBzdGFydGAgYW5kIGBlbmRgIHBvc2l0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgdmlldy5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSB2aWV3LlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB0cmFuc2Zvcm1zIFRoZSB0cmFuc2Zvcm1hdGlvbnMgdG8gYXBwbHkgdG8gdGhlIHZpZXcuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGBzdGFydGAgYW5kIGBlbmRgXG4gICAgICAgICAqICBwb3NpdGlvbnMgb2YgdGhlIHZpZXcuXG4gICAgICAgICAqL2Z1bmN0aW9uIGdldFZpZXcoc3RhcnQsZW5kLHRyYW5zZm9ybXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dHJhbnNmb3Jtcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBkYXRhPXRyYW5zZm9ybXNbaW5kZXhdLHNpemU9ZGF0YS5zaXplO3N3aXRjaChkYXRhLnR5cGUpe2Nhc2UnZHJvcCc6c3RhcnQrPXNpemU7YnJlYWs7Y2FzZSdkcm9wUmlnaHQnOmVuZC09c2l6ZTticmVhaztjYXNlJ3Rha2UnOmVuZD1uYXRpdmVNaW4oZW5kLHN0YXJ0K3NpemUpO2JyZWFrO2Nhc2UndGFrZVJpZ2h0JzpzdGFydD1uYXRpdmVNYXgoc3RhcnQsZW5kLXNpemUpO2JyZWFrO319cmV0dXJue3N0YXJ0OnN0YXJ0LGVuZDplbmR9O30vKipcbiAgICAgICAgICogRXh0cmFjdHMgd3JhcHBlciBkZXRhaWxzIGZyb20gdGhlIGBzb3VyY2VgIGJvZHkgY29tbWVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIGluc3BlY3QuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd3JhcHBlciBkZXRhaWxzLlxuICAgICAgICAgKi9mdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2Upe3ZhciBtYXRjaD1zb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7cmV0dXJuIG1hdGNoP21hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKTpbXTt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKi9mdW5jdGlvbiBoYXNQYXRoKG9iamVjdCxwYXRoLGhhc0Z1bmMpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aC5sZW5ndGgscmVzdWx0PWZhbHNlO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIga2V5PXRvS2V5KHBhdGhbaW5kZXhdKTtpZighKHJlc3VsdD1vYmplY3QhPW51bGwmJmhhc0Z1bmMob2JqZWN0LGtleSkpKXticmVhazt9b2JqZWN0PW9iamVjdFtrZXldO31pZihyZXN1bHR8fCsraW5kZXghPWxlbmd0aCl7cmV0dXJuIHJlc3VsdDt9bGVuZ3RoPW9iamVjdD09bnVsbD8wOm9iamVjdC5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmlzTGVuZ3RoKGxlbmd0aCkmJmlzSW5kZXgoa2V5LGxlbmd0aCkmJihpc0FycmF5KG9iamVjdCl8fGlzQXJndW1lbnRzKG9iamVjdCkpO30vKipcbiAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgICAgICovZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc3VsdD1uZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTsvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuaWYobGVuZ3RoJiZ0eXBlb2YgYXJyYXlbMF09PT0nc3RyaW5nJyYmaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwnaW5kZXgnKSl7cmVzdWx0LmluZGV4PWFycmF5LmluZGV4O3Jlc3VsdC5pbnB1dD1hcnJheS5pbnB1dDt9cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgICAgICovZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCl7cmV0dXJuIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3I9PT0nZnVuY3Rpb24nJiYhaXNQcm90b3R5cGUob2JqZWN0KT9iYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKTp7fTt9LyoqXG4gICAgICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjbG9uaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAgICAgKi9mdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsdGFnLGlzRGVlcCl7dmFyIEN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yO3N3aXRjaCh0YWcpe2Nhc2UgYXJyYXlCdWZmZXJUYWc6cmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOnJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtjYXNlIGRhdGFWaWV3VGFnOnJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCxpc0RlZXApO2Nhc2UgZmxvYXQzMlRhZzpjYXNlIGZsb2F0NjRUYWc6Y2FzZSBpbnQ4VGFnOmNhc2UgaW50MTZUYWc6Y2FzZSBpbnQzMlRhZzpjYXNlIHVpbnQ4VGFnOmNhc2UgdWludDhDbGFtcGVkVGFnOmNhc2UgdWludDE2VGFnOmNhc2UgdWludDMyVGFnOnJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LGlzRGVlcCk7Y2FzZSBtYXBUYWc6cmV0dXJuIG5ldyBDdG9yKCk7Y2FzZSBudW1iZXJUYWc6Y2FzZSBzdHJpbmdUYWc6cmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7Y2FzZSByZWdleHBUYWc6cmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7Y2FzZSBzZXRUYWc6cmV0dXJuIG5ldyBDdG9yKCk7Y2FzZSBzeW1ib2xUYWc6cmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7fX0vKipcbiAgICAgICAgICogSW5zZXJ0cyB3cmFwcGVyIGBkZXRhaWxzYCBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgYHNvdXJjZWAgYm9keS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIG1vZGlmeS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIGluc2VydC5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc291cmNlLlxuICAgICAgICAgKi9mdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsZGV0YWlscyl7dmFyIGxlbmd0aD1kZXRhaWxzLmxlbmd0aDtpZighbGVuZ3RoKXtyZXR1cm4gc291cmNlO312YXIgbGFzdEluZGV4PWxlbmd0aC0xO2RldGFpbHNbbGFzdEluZGV4XT0obGVuZ3RoPjE/JyYgJzonJykrZGV0YWlsc1tsYXN0SW5kZXhdO2RldGFpbHM9ZGV0YWlscy5qb2luKGxlbmd0aD4yPycsICc6JyAnKTtyZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwne1xcbi8qIFt3cmFwcGVkIHdpdGggJytkZXRhaWxzKyddICovXFxuJyk7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZsYXR0ZW5hYmxlIGBhcmd1bWVudHNgIG9iamVjdCBvciBhcnJheS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpe3JldHVybiBpc0FycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpfHwhIShzcHJlYWRhYmxlU3ltYm9sJiZ2YWx1ZSYmdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGlzSW5kZXgodmFsdWUsbGVuZ3RoKXt2YXIgdHlwZT10eXBlb2YgdmFsdWU9PT0ndW5kZWZpbmVkJz8ndW5kZWZpbmVkJzpfdHlwZW9mKHZhbHVlKTtsZW5ndGg9bGVuZ3RoPT1udWxsP01BWF9TQUZFX0lOVEVHRVI6bGVuZ3RoO3JldHVybiEhbGVuZ3RoJiYodHlwZT09J251bWJlcid8fHR5cGUhPSdzeW1ib2wnJiZyZUlzVWludC50ZXN0KHZhbHVlKSkmJnZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTxsZW5ndGg7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gaW5kZXggVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBpbmRleCBvciBrZXkgYXJndW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICAgICAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKi9mdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSxpbmRleCxvYmplY3Qpe2lmKCFpc09iamVjdChvYmplY3QpKXtyZXR1cm4gZmFsc2U7fXZhciB0eXBlPXR5cGVvZiBpbmRleD09PSd1bmRlZmluZWQnPyd1bmRlZmluZWQnOl90eXBlb2YoaW5kZXgpO2lmKHR5cGU9PSdudW1iZXInP2lzQXJyYXlMaWtlKG9iamVjdCkmJmlzSW5kZXgoaW5kZXgsb2JqZWN0Lmxlbmd0aCk6dHlwZT09J3N0cmluZycmJmluZGV4IGluIG9iamVjdCl7cmV0dXJuIGVxKG9iamVjdFtpbmRleF0sdmFsdWUpO31yZXR1cm4gZmFsc2U7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gaXNLZXkodmFsdWUsb2JqZWN0KXtpZihpc0FycmF5KHZhbHVlKSl7cmV0dXJuIGZhbHNlO312YXIgdHlwZT10eXBlb2YgdmFsdWU9PT0ndW5kZWZpbmVkJz8ndW5kZWZpbmVkJzpfdHlwZW9mKHZhbHVlKTtpZih0eXBlPT0nbnVtYmVyJ3x8dHlwZT09J3N5bWJvbCd8fHR5cGU9PSdib29sZWFuJ3x8dmFsdWU9PW51bGx8fGlzU3ltYm9sKHZhbHVlKSl7cmV0dXJuIHRydWU7fXJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpfHwhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpfHxvYmplY3QhPW51bGwmJnZhbHVlIGluIE9iamVjdChvYmplY3QpO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlPT09J3VuZGVmaW5lZCc/J3VuZGVmaW5lZCc6X3R5cGVvZih2YWx1ZSk7cmV0dXJuIHR5cGU9PSdzdHJpbmcnfHx0eXBlPT0nbnVtYmVyJ3x8dHlwZT09J3N5bWJvbCd8fHR5cGU9PSdib29sZWFuJz92YWx1ZSE9PSdfX3Byb3RvX18nOnZhbHVlPT09bnVsbDt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCxcbiAgICAgICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKXt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksb3RoZXI9bG9kYXNoW2Z1bmNOYW1lXTtpZih0eXBlb2Ygb3RoZXIhPT0nZnVuY3Rpb24nfHwhKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpe3JldHVybiBmYWxzZTt9aWYoZnVuYz09PW90aGVyKXtyZXR1cm4gdHJ1ZTt9dmFyIGRhdGE9Z2V0RGF0YShvdGhlcik7cmV0dXJuISFkYXRhJiZmdW5jPT09ZGF0YVswXTt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gaXNNYXNrZWQoZnVuYyl7cmV0dXJuISFtYXNrU3JjS2V5JiZtYXNrU3JjS2V5IGluIGZ1bmM7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGlzIGNhcGFibGUgb2YgYmVpbmcgbWFza2VkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrYWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKi92YXIgaXNNYXNrYWJsZT1jb3JlSnNEYXRhP2lzRnVuY3Rpb246c3R1YkZhbHNlOy8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBwcm90b3R5cGUgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICovZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpe3ZhciBDdG9yPXZhbHVlJiZ2YWx1ZS5jb25zdHJ1Y3Rvcixwcm90bz10eXBlb2YgQ3Rvcj09PSdmdW5jdGlvbicmJkN0b3IucHJvdG90eXBlfHxvYmplY3RQcm90bztyZXR1cm4gdmFsdWU9PT1wcm90bzt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gICAgICAgICAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKi9mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpe3JldHVybiB2YWx1ZT09PXZhbHVlJiYhaXNPYmplY3QodmFsdWUpO30vKipcbiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gICAgICAgICAqIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgICAgICovZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LHNyY1ZhbHVlKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtpZihvYmplY3Q9PW51bGwpe3JldHVybiBmYWxzZTt9cmV0dXJuIG9iamVjdFtrZXldPT09c3JjVmFsdWUmJihzcmNWYWx1ZSE9PXVuZGVmaW5lZHx8a2V5IGluIE9iamVjdChvYmplY3QpKTt9O30vKipcbiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICAgICAgICAgKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpe3ZhciByZXN1bHQ9bWVtb2l6ZShmdW5jLGZ1bmN0aW9uKGtleSl7aWYoY2FjaGUuc2l6ZT09PU1BWF9NRU1PSVpFX1NJWkUpe2NhY2hlLmNsZWFyKCk7fXJldHVybiBrZXk7fSk7dmFyIGNhY2hlPXJlc3VsdC5jYWNoZTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogTWVyZ2VzIHRoZSBmdW5jdGlvbiBtZXRhZGF0YSBvZiBgc291cmNlYCBpbnRvIGBkYXRhYC5cbiAgICAgICAgICpcbiAgICAgICAgICogTWVyZ2luZyBtZXRhZGF0YSByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygd3JhcHBlcnMgdXNlZCB0byBpbnZva2UgYSBmdW5jdGlvbi5cbiAgICAgICAgICogVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG1ldGhvZHMgbGlrZSBgXy5iaW5kYCwgYF8uY3VycnlgLCBhbmQgYF8ucGFydGlhbGBcbiAgICAgICAgICogbWF5IGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBleGVjdXRpb24gb3JkZXIuIE1ldGhvZHMgbGlrZSBgXy5hcnlgIGFuZFxuICAgICAgICAgKiBgXy5yZWFyZ2AgbW9kaWZ5IGZ1bmN0aW9uIGFyZ3VtZW50cywgbWFraW5nIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZVxuICAgICAgICAgKiBleGVjdXRlZCBpbXBvcnRhbnQsIHByZXZlbnRpbmcgdGhlIG1lcmdpbmcgb2YgbWV0YWRhdGEuIEhvd2V2ZXIsIHdlIG1ha2VcbiAgICAgICAgICogYW4gZXhjZXB0aW9uIGZvciBhIHNhZmUgY29tYmluZWQgY2FzZSB3aGVyZSBjdXJyaWVkIGZ1bmN0aW9ucyBoYXZlIGBfLmFyeWBcbiAgICAgICAgICogYW5kIG9yIGBfLnJlYXJnYCBhcHBsaWVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBkYXRhIFRoZSBkZXN0aW5hdGlvbiBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBzb3VyY2UgbWV0YWRhdGEuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGF0YWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIG1lcmdlRGF0YShkYXRhLHNvdXJjZSl7dmFyIGJpdG1hc2s9ZGF0YVsxXSxzcmNCaXRtYXNrPXNvdXJjZVsxXSxuZXdCaXRtYXNrPWJpdG1hc2t8c3JjQml0bWFzayxpc0NvbW1vbj1uZXdCaXRtYXNrPChXUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUd8V1JBUF9BUllfRkxBRyk7dmFyIGlzQ29tYm89c3JjQml0bWFzaz09V1JBUF9BUllfRkxBRyYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxzcmNCaXRtYXNrPT1XUkFQX0FSWV9GTEFHJiZiaXRtYXNrPT1XUkFQX1JFQVJHX0ZMQUcmJmRhdGFbN10ubGVuZ3RoPD1zb3VyY2VbOF18fHNyY0JpdG1hc2s9PShXUkFQX0FSWV9GTEFHfFdSQVBfUkVBUkdfRkxBRykmJnNvdXJjZVs3XS5sZW5ndGg8PXNvdXJjZVs4XSYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHOy8vIEV4aXQgZWFybHkgaWYgbWV0YWRhdGEgY2FuJ3QgYmUgbWVyZ2VkLlxuaWYoIShpc0NvbW1vbnx8aXNDb21ibykpe3JldHVybiBkYXRhO30vLyBVc2Ugc291cmNlIGB0aGlzQXJnYCBpZiBhdmFpbGFibGUuXG5pZihzcmNCaXRtYXNrJldSQVBfQklORF9GTEFHKXtkYXRhWzJdPXNvdXJjZVsyXTsvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLlxubmV3Qml0bWFza3w9Yml0bWFzayZXUkFQX0JJTkRfRkxBRz8wOldSQVBfQ1VSUllfQk9VTkRfRkxBRzt9Ly8gQ29tcG9zZSBwYXJ0aWFsIGFyZ3VtZW50cy5cbnZhciB2YWx1ZT1zb3VyY2VbM107aWYodmFsdWUpe3ZhciBwYXJ0aWFscz1kYXRhWzNdO2RhdGFbM109cGFydGlhbHM/Y29tcG9zZUFyZ3MocGFydGlhbHMsdmFsdWUsc291cmNlWzRdKTp2YWx1ZTtkYXRhWzRdPXBhcnRpYWxzP3JlcGxhY2VIb2xkZXJzKGRhdGFbM10sUExBQ0VIT0xERVIpOnNvdXJjZVs0XTt9Ly8gQ29tcG9zZSBwYXJ0aWFsIHJpZ2h0IGFyZ3VtZW50cy5cbnZhbHVlPXNvdXJjZVs1XTtpZih2YWx1ZSl7cGFydGlhbHM9ZGF0YVs1XTtkYXRhWzVdPXBhcnRpYWxzP2NvbXBvc2VBcmdzUmlnaHQocGFydGlhbHMsdmFsdWUsc291cmNlWzZdKTp2YWx1ZTtkYXRhWzZdPXBhcnRpYWxzP3JlcGxhY2VIb2xkZXJzKGRhdGFbNV0sUExBQ0VIT0xERVIpOnNvdXJjZVs2XTt9Ly8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuXG52YWx1ZT1zb3VyY2VbN107aWYodmFsdWUpe2RhdGFbN109dmFsdWU7fS8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuaWYoc3JjQml0bWFzayZXUkFQX0FSWV9GTEFHKXtkYXRhWzhdPWRhdGFbOF09PW51bGw/c291cmNlWzhdOm5hdGl2ZU1pbihkYXRhWzhdLHNvdXJjZVs4XSk7fS8vIFVzZSBzb3VyY2UgYGFyaXR5YCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuaWYoZGF0YVs5XT09bnVsbCl7ZGF0YVs5XT1zb3VyY2VbOV07fS8vIFVzZSBzb3VyY2UgYGZ1bmNgIGFuZCBtZXJnZSBiaXRtYXNrcy5cbmRhdGFbMF09c291cmNlWzBdO2RhdGFbMV09bmV3Qml0bWFzaztyZXR1cm4gZGF0YTt9LyoqXG4gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICAgICAgICAgKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICAgICAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgICAgICovZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCl7dmFyIHJlc3VsdD1bXTtpZihvYmplY3QhPW51bGwpe2Zvcih2YXIga2V5IGluIE9iamVjdChvYmplY3QpKXtyZXN1bHQucHVzaChrZXkpO319cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAgICAgKi9mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSl7cmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO30vKipcbiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggdHJhbnNmb3JtcyB0aGUgcmVzdCBhcnJheS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgICAgICovZnVuY3Rpb24gb3ZlclJlc3QoZnVuYyxzdGFydCx0cmFuc2Zvcm0pe3N0YXJ0PW5hdGl2ZU1heChzdGFydD09PXVuZGVmaW5lZD9mdW5jLmxlbmd0aC0xOnN0YXJ0LDApO3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cyxpbmRleD0tMSxsZW5ndGg9bmF0aXZlTWF4KGFyZ3MubGVuZ3RoLXN0YXJ0LDApLGFycmF5PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe2FycmF5W2luZGV4XT1hcmdzW3N0YXJ0K2luZGV4XTt9aW5kZXg9LTE7dmFyIG90aGVyQXJncz1BcnJheShzdGFydCsxKTt3aGlsZSgrK2luZGV4PHN0YXJ0KXtvdGhlckFyZ3NbaW5kZXhdPWFyZ3NbaW5kZXhdO31vdGhlckFyZ3Nbc3RhcnRdPXRyYW5zZm9ybShhcnJheSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxvdGhlckFyZ3MpO307fS8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBwYXJlbnQgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwYXJlbnQgdmFsdWUuXG4gICAgICAgICAqL2Z1bmN0aW9uIHBhcmVudChvYmplY3QscGF0aCl7cmV0dXJuIHBhdGgubGVuZ3RoPDI/b2JqZWN0OmJhc2VHZXQob2JqZWN0LGJhc2VTbGljZShwYXRoLDAsLTEpKTt9LyoqXG4gICAgICAgICAqIFJlb3JkZXIgYGFycmF5YCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBlbGVtZW50IGF0XG4gICAgICAgICAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAgICAgICAgICogdGhlIHNlY29uZCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgc2Vjb25kIGVsZW1lbnQsIGFuZCBzbyBvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHJlb3JkZXIuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFycmF5IGluZGV4ZXMuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAgICAgKi9mdW5jdGlvbiByZW9yZGVyKGFycmF5LGluZGV4ZXMpe3ZhciBhcnJMZW5ndGg9YXJyYXkubGVuZ3RoLGxlbmd0aD1uYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsYXJyTGVuZ3RoKSxvbGRBcnJheT1jb3B5QXJyYXkoYXJyYXkpO3doaWxlKGxlbmd0aC0tKXt2YXIgaW5kZXg9aW5kZXhlc1tsZW5ndGhdO2FycmF5W2xlbmd0aF09aXNJbmRleChpbmRleCxhcnJMZW5ndGgpP29sZEFycmF5W2luZGV4XTp1bmRlZmluZWQ7fXJldHVybiBhcnJheTt9LyoqXG4gICAgICAgICAqIFNldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIElmIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBob3QsIGkuZS4gaXMgaW52b2tlZCBhIGxvdCBpbiBhIHNob3J0XG4gICAgICAgICAqIHBlcmlvZCBvZiB0aW1lLCBpdCB3aWxsIHRyaXAgaXRzIGJyZWFrZXIgYW5kIHRyYW5zaXRpb24gdG8gYW4gaWRlbnRpdHlcbiAgICAgICAgICogZnVuY3Rpb24gdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhdXNlcyBpbiBWOC4gU2VlXG4gICAgICAgICAqIFtWOCBpc3N1ZSAyMDcwXShodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDcwKVxuICAgICAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgICAgICovdmFyIHNldERhdGE9c2hvcnRPdXQoYmFzZVNldERhdGEpOy8qKlxuICAgICAgICAgKiBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIFtgc2V0VGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL3NldFRpbWVvdXQpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAgICAgKi92YXIgc2V0VGltZW91dD1jdHhTZXRUaW1lb3V0fHxmdW5jdGlvbihmdW5jLHdhaXQpe3JldHVybiByb290LnNldFRpbWVvdXQoZnVuYyx3YWl0KTt9Oy8qKlxuICAgICAgICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC5cbiAgICAgICAqXG4gICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICAgKi92YXIgc2V0VG9TdHJpbmc9c2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTsvKipcbiAgICAgICAgICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYHdyYXBwZXJgIHRvIG1pbWljIHRoZSBzb3VyY2Ugb2YgYHJlZmVyZW5jZWBcbiAgICAgICAgICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZmVyZW5jZSBUaGUgcmVmZXJlbmNlIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICAgICAgICAgKi9mdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlcixyZWZlcmVuY2UsYml0bWFzayl7dmFyIHNvdXJjZT1yZWZlcmVuY2UrJyc7cmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksYml0bWFzaykpKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICAgICAgICAgKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAgICAgICAgICogbWlsbGlzZWNvbmRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICAgICAgICAgKi9mdW5jdGlvbiBzaG9ydE91dChmdW5jKXt2YXIgY291bnQ9MCxsYXN0Q2FsbGVkPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHN0YW1wPW5hdGl2ZU5vdygpLHJlbWFpbmluZz1IT1RfU1BBTi0oc3RhbXAtbGFzdENhbGxlZCk7bGFzdENhbGxlZD1zdGFtcDtpZihyZW1haW5pbmc+MCl7aWYoKytjb3VudD49SE9UX0NPVU5UKXtyZXR1cm4gYXJndW1lbnRzWzBdO319ZWxzZXtjb3VudD0wO31yZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsYXJndW1lbnRzKTt9O30vKipcbiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIHdoaWNoIG11dGF0ZXMgYW5kIHNldHMgdGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT1hcnJheS5sZW5ndGhdIFRoZSBzaXplIG9mIGBhcnJheWAuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAgICAgKi9mdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSxzaXplKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aCxsYXN0SW5kZXg9bGVuZ3RoLTE7c2l6ZT1zaXplPT09dW5kZWZpbmVkP2xlbmd0aDpzaXplO3doaWxlKCsraW5kZXg8c2l6ZSl7dmFyIHJhbmQ9YmFzZVJhbmRvbShpbmRleCxsYXN0SW5kZXgpLHZhbHVlPWFycmF5W3JhbmRdO2FycmF5W3JhbmRdPWFycmF5W2luZGV4XTthcnJheVtpbmRleF09dmFsdWU7fWFycmF5Lmxlbmd0aD1zaXplO3JldHVybiBhcnJheTt9LyoqXG4gICAgICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgICAgICovdmFyIHN0cmluZ1RvUGF0aD1tZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZyl7dmFyIHJlc3VsdD1bXTtpZihzdHJpbmcuY2hhckNvZGVBdCgwKT09PTQ2LyogLiAqLyl7cmVzdWx0LnB1c2goJycpO31zdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLGZ1bmN0aW9uKG1hdGNoLG51bWJlcixxdW90ZSxzdWJTdHJpbmcpe3Jlc3VsdC5wdXNoKHF1b3RlP3N1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwnJDEnKTpudW1iZXJ8fG1hdGNoKTt9KTtyZXR1cm4gcmVzdWx0O30pOy8qKlxuICAgICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyBrZXkgaWYgaXQncyBub3QgYSBzdHJpbmcgb3Igc3ltYm9sLlxuICAgICAgICpcbiAgICAgICAqIEBwcml2YXRlXG4gICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAgICogQHJldHVybnMge3N0cmluZ3xzeW1ib2x9IFJldHVybnMgdGhlIGtleS5cbiAgICAgICAqL2Z1bmN0aW9uIHRvS2V5KHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PT0nc3RyaW5nJ3x8aXNTeW1ib2wodmFsdWUpKXtyZXR1cm4gdmFsdWU7fXZhciByZXN1bHQ9dmFsdWUrJyc7cmV0dXJuIHJlc3VsdD09JzAnJiYxL3ZhbHVlPT0tSU5GSU5JVFk/Jy0wJzpyZXN1bHQ7fS8qKlxuICAgICAgICAgKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAgICAgICAgICovZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYyl7aWYoZnVuYyE9bnVsbCl7dHJ5e3JldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTt9Y2F0Y2goZSl7fXRyeXtyZXR1cm4gZnVuYysnJzt9Y2F0Y2goZSl7fX1yZXR1cm4nJzt9LyoqXG4gICAgICAgICAqIFVwZGF0ZXMgd3JhcHBlciBgZGV0YWlsc2AgYmFzZWQgb24gYGJpdG1hc2tgIGZsYWdzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gbW9kaWZ5LlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRldGFpbHNgLlxuICAgICAgICAgKi9mdW5jdGlvbiB1cGRhdGVXcmFwRGV0YWlscyhkZXRhaWxzLGJpdG1hc2spe2FycmF5RWFjaCh3cmFwRmxhZ3MsZnVuY3Rpb24ocGFpcil7dmFyIHZhbHVlPSdfLicrcGFpclswXTtpZihiaXRtYXNrJnBhaXJbMV0mJiFhcnJheUluY2x1ZGVzKGRldGFpbHMsdmFsdWUpKXtkZXRhaWxzLnB1c2godmFsdWUpO319KTtyZXR1cm4gZGV0YWlscy5zb3J0KCk7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHdyYXBwZXJgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gd3JhcHBlciBUaGUgd3JhcHBlciB0byBjbG9uZS5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHdyYXBwZXIuXG4gICAgICAgICAqL2Z1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKXtpZih3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpe3JldHVybiB3cmFwcGVyLmNsb25lKCk7fXZhciByZXN1bHQ9bmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXyx3cmFwcGVyLl9fY2hhaW5fXyk7cmVzdWx0Ll9fYWN0aW9uc19fPWNvcHlBcnJheSh3cmFwcGVyLl9fYWN0aW9uc19fKTtyZXN1bHQuX19pbmRleF9fPXdyYXBwZXIuX19pbmRleF9fO3Jlc3VsdC5fX3ZhbHVlc19fPXdyYXBwZXIuX192YWx1ZXNfXztyZXR1cm4gcmVzdWx0O30vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKlxuICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gZ3JvdXBzIHRoZSBsZW5ndGggb2YgYHNpemVgLlxuICAgICAgICAgKiBJZiBgYXJyYXlgIGNhbid0IGJlIHNwbGl0IGV2ZW5seSwgdGhlIGZpbmFsIGNodW5rIHdpbGwgYmUgdGhlIHJlbWFpbmluZ1xuICAgICAgICAgKiBlbGVtZW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gVGhlIGxlbmd0aCBvZiBlYWNoIGNodW5rXG4gICAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNodW5rcy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMik7XG4gICAgICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbJ2MnLCAnZCddXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAzKTtcbiAgICAgICAgICogLy8gPT4gW1snYScsICdiJywgJ2MnXSwgWydkJ11dXG4gICAgICAgICAqL2Z1bmN0aW9uIGNodW5rKGFycmF5LHNpemUsZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGFycmF5LHNpemUsZ3VhcmQpOnNpemU9PT11bmRlZmluZWQpe3NpemU9MTt9ZWxzZXtzaXplPW5hdGl2ZU1heCh0b0ludGVnZXIoc2l6ZSksMCk7fXZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aHx8c2l6ZTwxKXtyZXR1cm5bXTt9dmFyIGluZGV4PTAscmVzSW5kZXg9MCxyZXN1bHQ9QXJyYXkobmF0aXZlQ2VpbChsZW5ndGgvc2l6ZSkpO3doaWxlKGluZGV4PGxlbmd0aCl7cmVzdWx0W3Jlc0luZGV4KytdPWJhc2VTbGljZShhcnJheSxpbmRleCxpbmRleCs9c2l6ZSk7fXJldHVybiByZXN1bHQ7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IHdpdGggYWxsIGZhbHNleSB2YWx1ZXMgcmVtb3ZlZC4gVGhlIHZhbHVlcyBgZmFsc2VgLCBgbnVsbGAsXG4gICAgICAgICAqIGAwYCwgYFwiXCJgLCBgdW5kZWZpbmVkYCwgYW5kIGBOYU5gIGFyZSBmYWxzZXkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFjdC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmNvbXBhY3QoWzAsIDEsIGZhbHNlLCAyLCAnJywgM10pO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgICAgICovZnVuY3Rpb24gY29tcGFjdChhcnJheSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZSl7cmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlO319cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgY29uY2F0ZW5hdGluZyBgYXJyYXlgIHdpdGggYW55IGFkZGl0aW9uYWwgYXJyYXlzXG4gICAgICAgICAqIGFuZC9vciB2YWx1ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29uY2F0ZW5hdGUuXG4gICAgICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjb25jYXRlbmF0ZS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgYXJyYXkgPSBbMV07XG4gICAgICAgICAqIHZhciBvdGhlciA9IF8uY29uY2F0KGFycmF5LCAyLCBbM10sIFtbNF1dKTtcbiAgICAgICAgICpcbiAgICAgICAgICogY29uc29sZS5sb2cob3RoZXIpO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdXVxuICAgICAgICAgKlxuICAgICAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICAgICAqIC8vID0+IFsxXVxuICAgICAgICAgKi9mdW5jdGlvbiBjb25jYXQoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aWYoIWxlbmd0aCl7cmV0dXJuW107fXZhciBhcmdzPUFycmF5KGxlbmd0aC0xKSxhcnJheT1hcmd1bWVudHNbMF0saW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pe2FyZ3NbaW5kZXgtMV09YXJndW1lbnRzW2luZGV4XTt9cmV0dXJuIGFycmF5UHVzaChpc0FycmF5KGFycmF5KT9jb3B5QXJyYXkoYXJyYXkpOlthcnJheV0sYmFzZUZsYXR0ZW4oYXJncywxKSk7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGBhcnJheWAgdmFsdWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgb3RoZXIgZ2l2ZW4gYXJyYXlzXG4gICAgICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAgICAgKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgICAgICogLy8gPT4gWzFdXG4gICAgICAgICAqL3ZhciBkaWZmZXJlbmNlPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LHZhbHVlcyl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSk6W107fSk7LyoqXG4gICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaFxuICAgICAgICogaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAgICogKHZhbHVlKS5cbiAgICAgICAqXG4gICAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxCeWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogXy5kaWZmZXJlbmNlQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICAgKiAvLyA9PiBbMS4yXVxuICAgICAgICpcbiAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICogXy5kaWZmZXJlbmNlQnkoW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCBbeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgICAqL3ZhciBkaWZmZXJlbmNlQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgaXRlcmF0ZWU9bGFzdCh2YWx1ZXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSl7aXRlcmF0ZWU9dW5kZWZpbmVkO31yZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LGJhc2VGbGF0dGVuKHZhbHVlcywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXTt9KTsvKipcbiAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGlmZmVyZW5jZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgb3JkZXIgYW5kXG4gICAgICAgKiByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvclxuICAgICAgICogaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICAgKlxuICAgICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsV2l0aGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICAgKlxuICAgICAgICogXy5kaWZmZXJlbmNlV2l0aChvYmplY3RzLCBbeyAneCc6IDEsICd5JzogMiB9XSwgXy5pc0VxdWFsKTtcbiAgICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICAgKi92YXIgZGlmZmVyZW5jZVdpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgY29tcGFyYXRvcj1sYXN0KHZhbHVlcyk7aWYoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpe2NvbXBhcmF0b3I9dW5kZWZpbmVkO31yZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LGJhc2VGbGF0dGVuKHZhbHVlcywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLHVuZGVmaW5lZCxjb21wYXJhdG9yKTpbXTt9KTsvKipcbiAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZHJvcC5cbiAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIF8uZHJvcChbMSwgMiwgM10pO1xuICAgICAgICogLy8gPT4gWzIsIDNdXG4gICAgICAgKlxuICAgICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMik7XG4gICAgICAgKiAvLyA9PiBbM11cbiAgICAgICAqXG4gICAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCA1KTtcbiAgICAgICAqIC8vID0+IFtdXG4gICAgICAgKlxuICAgICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMCk7XG4gICAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgICAqL2Z1bmN0aW9uIGRyb3AoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXtyZXR1cm5bXTt9bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAgICAgKiAvLyA9PiBbMV1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgICAgICogLy8gPT4gW11cbiAgICAgICAgICpcbiAgICAgICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICAgICAqL2Z1bmN0aW9uIGRyb3BSaWdodChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpe3JldHVybltdO31uPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO249bGVuZ3RoLW47cmV0dXJuIGJhc2VTbGljZShhcnJheSwwLG48MD8wOm4pO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAgICAgKiBdO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICAgICAqL2Z1bmN0aW9uIGRyb3BSaWdodFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVdoaWxlKGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSx0cnVlLHRydWUpOltdO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAgICAgKiBdO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5kcm9wV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5kcm9wV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICAgICAqL2Z1bmN0aW9uIGRyb3BXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksdHJ1ZSk6W107fS8qKlxuICAgICAgICAgKiBGaWxscyBlbGVtZW50cyBvZiBgYXJyYXlgIHdpdGggYHZhbHVlYCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3RcbiAgICAgICAgICogaW5jbHVkaW5nLCBgZW5kYC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGBhcnJheWAgd2l0aC5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5maWxsKGFycmF5LCAnYScpO1xuICAgICAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICAgICAqIC8vID0+IFsnYScsICdhJywgJ2EnXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmZpbGwoQXJyYXkoMyksIDIpO1xuICAgICAgICAgKiAvLyA9PiBbMiwgMiwgMl1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5maWxsKFs0LCA2LCA4LCAxMF0sICcqJywgMSwgMyk7XG4gICAgICAgICAqIC8vID0+IFs0LCAnKicsICcqJywgMTBdXG4gICAgICAgICAqL2Z1bmN0aW9uIGZpbGwoYXJyYXksdmFsdWUsc3RhcnQsZW5kKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpe3JldHVybltdO31pZihzdGFydCYmdHlwZW9mIHN0YXJ0IT09J251bWJlcicmJmlzSXRlcmF0ZWVDYWxsKGFycmF5LHZhbHVlLHN0YXJ0KSl7c3RhcnQ9MDtlbmQ9bGVuZ3RoO31yZXR1cm4gYmFzZUZpbGwoYXJyYXksdmFsdWUsc3RhcnQsZW5kKTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0XG4gICAgICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAgICAgKiBdO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAgICAgICAgICogLy8gPT4gMFxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAgICAgKiAvLyA9PiAxXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5maW5kSW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgICAgICogLy8gPT4gMFxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgICAgICogLy8gPT4gMlxuICAgICAgICAgKi9mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXtyZXR1cm4tMTt9dmFyIGluZGV4PWZyb21JbmRleD09bnVsbD8wOnRvSW50ZWdlcihmcm9tSW5kZXgpO2lmKGluZGV4PDApe2luZGV4PW5hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk7fXJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxpbmRleCk7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRJbmRleGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50c1xuICAgICAgICAgKiBvZiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIHVzZXJzID0gW1xuICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgICAgICogXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ3BlYmJsZXMnOyB9KTtcbiAgICAgICAgICogLy8gPT4gMlxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICAgICAqIC8vID0+IDBcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgICAgICogLy8gPT4gMlxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICAgICAqIC8vID0+IDBcbiAgICAgICAgICovZnVuY3Rpb24gZmluZExhc3RJbmRleChhcnJheSxwcmVkaWNhdGUsZnJvbUluZGV4KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpe3JldHVybi0xO312YXIgaW5kZXg9bGVuZ3RoLTE7aWYoZnJvbUluZGV4IT09dW5kZWZpbmVkKXtpbmRleD10b0ludGVnZXIoZnJvbUluZGV4KTtpbmRleD1mcm9tSW5kZXg8MD9uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApOm5hdGl2ZU1pbihpbmRleCxsZW5ndGgtMSk7fXJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxpbmRleCx0cnVlKTt9LyoqXG4gICAgICAgICAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZmxhdHRlbihbMSwgWzIsIFszLCBbNF1dLCA1XV0pO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICAgICAqL2Z1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlRmxhdHRlbihhcnJheSwxKTpbXTt9LyoqXG4gICAgICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIGBhcnJheWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICAgICAqIC8vID0+IFsxLCAyLCAzLCA0LCA1XVxuICAgICAgICAgKi9mdW5jdGlvbiBmbGF0dGVuRGVlcChhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LElORklOSVRZKTpbXTt9LyoqXG4gICAgICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYGFycmF5YCB1cCB0byBgZGVwdGhgIHRpbWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBhcnJheSA9IFsxLCBbMiwgWzMsIFs0XV0sIDVdXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDEpO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAyKTtcbiAgICAgICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XSwgNV1cbiAgICAgICAgICovZnVuY3Rpb24gZmxhdHRlbkRlcHRoKGFycmF5LGRlcHRoKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpe3JldHVybltdO31kZXB0aD1kZXB0aD09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihkZXB0aCk7cmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LGRlcHRoKTt9LyoqXG4gICAgICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZFxuICAgICAgICAgKiBmcm9tIGtleS12YWx1ZSBgcGFpcnNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5mcm9tUGFpcnMoW1snYScsIDFdLCBbJ2InLCAyXV0pO1xuICAgICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgICAgICovZnVuY3Rpb24gZnJvbVBhaXJzKHBhaXJzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhaXJzPT1udWxsPzA6cGFpcnMubGVuZ3RoLHJlc3VsdD17fTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHBhaXI9cGFpcnNbaW5kZXhdO3Jlc3VsdFtwYWlyWzBdXT1wYWlyWzFdO31yZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAYWxpYXMgZmlyc3RcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5oZWFkKFsxLCAyLCAzXSk7XG4gICAgICAgICAqIC8vID0+IDFcbiAgICAgICAgICpcbiAgICAgICAgICogXy5oZWFkKFtdKTtcbiAgICAgICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICAgICAqL2Z1bmN0aW9uIGhlYWQoYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2FycmF5WzBdOnVuZGVmaW5lZDt9LyoqXG4gICAgICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgaW4gYGFycmF5YFxuICAgICAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXMgdGhlXG4gICAgICAgICAqIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGFycmF5YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAgICAgKiAvLyA9PiAxXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICAgICAqIC8vID0+IDNcbiAgICAgICAgICovZnVuY3Rpb24gaW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aCl7cmV0dXJuLTE7fXZhciBpbmRleD1mcm9tSW5kZXg9PW51bGw/MDp0b0ludGVnZXIoZnJvbUluZGV4KTtpZihpbmRleDwwKXtpbmRleD1uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApO31yZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpO30vKipcbiAgICAgICAgICogR2V0cyBhbGwgYnV0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdKTtcbiAgICAgICAgICogLy8gPT4gWzEsIDJdXG4gICAgICAgICAqL2Z1bmN0aW9uIGluaXRpYWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMCwtMSk6W107fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIGdpdmVuIGFycmF5c1xuICAgICAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pbnRlcnNlY3Rpb24oWzIsIDFdLCBbMiwgM10pO1xuICAgICAgICAgKiAvLyA9PiBbMl1cbiAgICAgICAgICovdmFyIGludGVyc2VjdGlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO3JldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQpOltdO30pOy8qKlxuICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICAgKiAodmFsdWUpLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogXy5pbnRlcnNlY3Rpb25CeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgICAqIC8vID0+IFsyLjFdXG4gICAgICAgKlxuICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAgICogLy8gPT4gW3sgJ3gnOiAxIH1dXG4gICAgICAgKi92YXIgaW50ZXJzZWN0aW9uQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpLG1hcHBlZD1hcnJheU1hcChhcnJheXMsY2FzdEFycmF5TGlrZU9iamVjdCk7aWYoaXRlcmF0ZWU9PT1sYXN0KG1hcHBlZCkpe2l0ZXJhdGVlPXVuZGVmaW5lZDt9ZWxzZXttYXBwZWQucG9wKCk7fXJldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdO30pOy8qKlxuICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gICAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlc1xuICAgICAgICogb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICAgKlxuICAgICAgICogXy5pbnRlcnNlY3Rpb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH1dXG4gICAgICAgKi92YXIgaW50ZXJzZWN0aW9uV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKSxtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PT0nZnVuY3Rpb24nP2NvbXBhcmF0b3I6dW5kZWZpbmVkO2lmKGNvbXBhcmF0b3Ipe21hcHBlZC5wb3AoKTt9cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCx1bmRlZmluZWQsY29tcGFyYXRvcik6W107fSk7LyoqXG4gICAgICAgKiBDb252ZXJ0cyBhbGwgZWxlbWVudHMgaW4gYGFycmF5YCBpbnRvIGEgc3RyaW5nIHNlcGFyYXRlZCBieSBgc2VwYXJhdG9yYC5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb252ZXJ0LlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9JywnXSBUaGUgZWxlbWVudCBzZXBhcmF0b3IuXG4gICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBqb2luZWQgc3RyaW5nLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBfLmpvaW4oWydhJywgJ2InLCAnYyddLCAnficpO1xuICAgICAgICogLy8gPT4gJ2F+Yn5jJ1xuICAgICAgICovZnVuY3Rpb24gam9pbihhcnJheSxzZXBhcmF0b3Ipe3JldHVybiBhcnJheT09bnVsbD8nJzpuYXRpdmVKb2luLmNhbGwoYXJyYXksc2VwYXJhdG9yKTt9LyoqXG4gICAgICAgICAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubGFzdChbMSwgMiwgM10pO1xuICAgICAgICAgKiAvLyA9PiAzXG4gICAgICAgICAqL2Z1bmN0aW9uIGxhc3QoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtsZW5ndGgtMV06dW5kZWZpbmVkO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICAgICAqIGBhcnJheWAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTtcbiAgICAgICAgICogLy8gPT4gM1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuXG4gICAgICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgICAgICogLy8gPT4gMVxuICAgICAgICAgKi9mdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aCl7cmV0dXJuLTE7fXZhciBpbmRleD1sZW5ndGg7aWYoZnJvbUluZGV4IT09dW5kZWZpbmVkKXtpbmRleD10b0ludGVnZXIoZnJvbUluZGV4KTtpbmRleD1pbmRleDwwP25hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk6bmF0aXZlTWluKGluZGV4LGxlbmd0aC0xKTt9cmV0dXJuIHZhbHVlPT09dmFsdWU/c3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpOmJhc2VGaW5kSW5kZXgoYXJyYXksYmFzZUlzTmFOLGluZGV4LHRydWUpO30vKipcbiAgICAgICAgICogR2V0cyB0aGUgZWxlbWVudCBhdCBpbmRleCBgbmAgb2YgYGFycmF5YC4gSWYgYG5gIGlzIG5lZ2F0aXZlLCB0aGUgbnRoXG4gICAgICAgICAqIGVsZW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjExLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTBdIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5udGgoYXJyYXksIDEpO1xuICAgICAgICAgKiAvLyA9PiAnYidcbiAgICAgICAgICpcbiAgICAgICAgICogXy5udGgoYXJyYXksIC0yKTtcbiAgICAgICAgICogLy8gPT4gJ2MnO1xuICAgICAgICAgKi9mdW5jdGlvbiBudGgoYXJyYXksbil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZU50aChhcnJheSx0b0ludGVnZXIobikpOnVuZGVmaW5lZDt9LyoqXG4gICAgICAgICAqIFJlbW92ZXMgYWxsIGdpdmVuIHZhbHVlcyBmcm9tIGBhcnJheWAgdXNpbmdcbiAgICAgICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLndpdGhvdXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5yZW1vdmVgXG4gICAgICAgICAqIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHByZWRpY2F0ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucHVsbChhcnJheSwgJ2EnLCAnYycpO1xuICAgICAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgICAgICovdmFyIHB1bGw9YmFzZVJlc3QocHVsbEFsbCk7LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBhcnJheSBvZiB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucHVsbEFsbChhcnJheSwgWydhJywgJ2MnXSk7XG4gICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAgICAgKi9mdW5jdGlvbiBwdWxsQWxsKGFycmF5LHZhbHVlcyl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMpOmFycmF5O30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZUJ5YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDMgfSwgeyAneCc6IDEgfV07XG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucHVsbEFsbEJ5KGFycmF5LCBbeyAneCc6IDEgfSwgeyAneCc6IDMgfV0sICd4Jyk7XG4gICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICAgICAqL2Z1bmN0aW9uIHB1bGxBbGxCeShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoJiZ2YWx1ZXMmJnZhbHVlcy5sZW5ndGg/YmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTphcnJheTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VXaXRoYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAzLCAneSc6IDQgfSwgeyAneCc6IDUsICd5JzogNiB9XTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5wdWxsQWxsV2l0aChhcnJheSwgW3sgJ3gnOiAzLCAneSc6IDQgfV0sIF8uaXNFcXVhbCk7XG4gICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDUsICd5JzogNiB9XVxuICAgICAgICAgKi9mdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSx2YWx1ZXMsY29tcGFyYXRvcil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMsdW5kZWZpbmVkLGNvbXBhcmF0b3IpOmFycmF5O30vKipcbiAgICAgICAgICogUmVtb3ZlcyBlbGVtZW50cyBmcm9tIGBhcnJheWAgY29ycmVzcG9uZGluZyB0byBgaW5kZXhlc2AgYW5kIHJldHVybnMgYW5cbiAgICAgICAgICogYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFVubGlrZSBgXy5hdGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXSl9IFtpbmRleGVzXSBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAgICAgKiB2YXIgcHVsbGVkID0gXy5wdWxsQXQoYXJyYXksIFsxLCAzXSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgICAgICogLy8gPT4gWydhJywgJ2MnXVxuICAgICAgICAgKlxuICAgICAgICAgKiBjb25zb2xlLmxvZyhwdWxsZWQpO1xuICAgICAgICAgKiAvLyA9PiBbJ2InLCAnZCddXG4gICAgICAgICAqL3ZhciBwdWxsQXQ9ZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksaW5kZXhlcyl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXN1bHQ9YmFzZUF0KGFycmF5LGluZGV4ZXMpO2Jhc2VQdWxsQXQoYXJyYXksYXJyYXlNYXAoaW5kZXhlcyxmdW5jdGlvbihpbmRleCl7cmV0dXJuIGlzSW5kZXgoaW5kZXgsbGVuZ3RoKT8raW5kZXg6aW5kZXg7fSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7cmV0dXJuIHJlc3VsdDt9KTsvKipcbiAgICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gYGFycmF5YCB0aGF0IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvclxuICAgICAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHJlbW92ZWQgZWxlbWVudHMuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZFxuICAgICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgICAqXG4gICAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmZpbHRlcmAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4gVXNlIGBfLnB1bGxgXG4gICAgICAgKiB0byBwdWxsIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgdmFsdWUuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDMsIDRdO1xuICAgICAgICogdmFyIGV2ZW5zID0gXy5yZW1vdmUoYXJyYXksIGZ1bmN0aW9uKG4pIHtcbiAgICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICAgKiB9KTtcbiAgICAgICAqXG4gICAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgICAqXG4gICAgICAgKiBjb25zb2xlLmxvZyhldmVucyk7XG4gICAgICAgKiAvLyA9PiBbMiwgNF1cbiAgICAgICAqL2Z1bmN0aW9uIHJlbW92ZShhcnJheSxwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSl7cmV0dXJuIHJlc3VsdDt9dmFyIGluZGV4PS0xLGluZGV4ZXM9W10sbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO2lmKHByZWRpY2F0ZSh2YWx1ZSxpbmRleCxhcnJheSkpe3Jlc3VsdC5wdXNoKHZhbHVlKTtpbmRleGVzLnB1c2goaW5kZXgpO319YmFzZVB1bGxBdChhcnJheSxpbmRleGVzKTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogUmV2ZXJzZXMgYGFycmF5YCBzbyB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGJlY29tZXMgdGhlIGxhc3QsIHRoZSBzZWNvbmRcbiAgICAgICAgICogZWxlbWVudCBiZWNvbWVzIHRoZSBzZWNvbmQgdG8gbGFzdCwgYW5kIHNvIG9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgIGFuZCBpcyBiYXNlZCBvblxuICAgICAgICAgKiBbYEFycmF5I3JldmVyc2VgXShodHRwczovL21kbi5pby9BcnJheS9yZXZlcnNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucmV2ZXJzZShhcnJheSk7XG4gICAgICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAgICAgKlxuICAgICAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAgICAgKi9mdW5jdGlvbiByZXZlcnNlKGFycmF5KXtyZXR1cm4gYXJyYXk9PW51bGw/YXJyYXk6bmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnN0ZWFkIG9mXG4gICAgICAgICAqIFtgQXJyYXkjc2xpY2VgXShodHRwczovL21kbi5pby9BcnJheS9zbGljZSkgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmVcbiAgICAgICAgICogcmV0dXJuZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2xpY2UuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgICAgICovZnVuY3Rpb24gc2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpe3JldHVybltdO31pZihlbmQmJnR5cGVvZiBlbmQhPT0nbnVtYmVyJyYmaXNJdGVyYXRlZUNhbGwoYXJyYXksc3RhcnQsZW5kKSl7c3RhcnQ9MDtlbmQ9bGVuZ3RoO31lbHNle3N0YXJ0PXN0YXJ0PT1udWxsPzA6dG9JbnRlZ2VyKHN0YXJ0KTtlbmQ9ZW5kPT09dW5kZWZpbmVkP2xlbmd0aDp0b0ludGVnZXIoZW5kKTt9cmV0dXJuIGJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpO30vKipcbiAgICAgICAgICogVXNlcyBhIGJpbmFyeSBzZWFyY2ggdG8gZGV0ZXJtaW5lIHRoZSBsb3dlc3QgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgICAgICogIGludG8gYGFycmF5YC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5zb3J0ZWRJbmRleChbMzAsIDUwXSwgNDApO1xuICAgICAgICAgKiAvLyA9PiAxXG4gICAgICAgICAqL2Z1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LHZhbHVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlKTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgICAgICogLy8gPT4gMFxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICAgICAqIC8vID0+IDBcbiAgICAgICAgICovZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5zb3J0ZWRJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICAgICAqIC8vID0+IDFcbiAgICAgICAgICovZnVuY3Rpb24gc29ydGVkSW5kZXhPZihhcnJheSx2YWx1ZSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZihsZW5ndGgpe3ZhciBpbmRleD1iYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUpO2lmKGluZGV4PGxlbmd0aCYmZXEoYXJyYXlbaW5kZXhdLHZhbHVlKSl7cmV0dXJuIGluZGV4O319cmV0dXJuLTE7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBoaWdoZXN0XG4gICAgICAgICAqIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0b1xuICAgICAgICAgKiBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uc29ydGVkTGFzdEluZGV4KFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICAgICAqIC8vID0+IDRcbiAgICAgICAgICovZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4KGFycmF5LHZhbHVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHRydWUpO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRMYXN0SW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICAgICAqIC8vID0+IDFcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgICAgICogLy8gPT4gMVxuICAgICAgICAgKi9mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLHRydWUpO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5sYXN0SW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5zb3J0ZWRMYXN0SW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAgICAgKiAvLyA9PiAzXG4gICAgICAgICAqL2Z1bmN0aW9uIHNvcnRlZExhc3RJbmRleE9mKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGxlbmd0aCl7dmFyIGluZGV4PWJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSx0cnVlKS0xO2lmKGVxKGFycmF5W2luZGV4XSx2YWx1ZSkpe3JldHVybiBpbmRleDt9fXJldHVybi0xO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgICAgICogZm9yIHNvcnRlZCBhcnJheXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uc29ydGVkVW5pcShbMSwgMSwgMl0pO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgICAgICovZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXkpOltdO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxQnlgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5zb3J0ZWRVbmlxQnkoWzEuMSwgMS4yLCAyLjMsIDIuNF0sIE1hdGguZmxvb3IpO1xuICAgICAgICAgKiAvLyA9PiBbMS4xLCAyLjNdXG4gICAgICAgICAqL2Z1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdO30vKipcbiAgICAgICAgICogR2V0cyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy50YWlsKFsxLCAyLCAzXSk7XG4gICAgICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAgICAgKi9mdW5jdGlvbiB0YWlsKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YmFzZVNsaWNlKGFycmF5LDEsbGVuZ3RoKTpbXTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRha2UoWzEsIDIsIDNdKTtcbiAgICAgICAgICogLy8gPT4gWzFdXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udGFrZShbMSwgMiwgM10sIDIpO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgICAgICpcbiAgICAgICAgICogXy50YWtlKFsxLCAyLCAzXSwgNSk7XG4gICAgICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAwKTtcbiAgICAgICAgICogLy8gPT4gW11cbiAgICAgICAgICovZnVuY3Rpb24gdGFrZShhcnJheSxuLGd1YXJkKXtpZighKGFycmF5JiZhcnJheS5sZW5ndGgpKXtyZXR1cm5bXTt9bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bik7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdKTtcbiAgICAgICAgICogLy8gPT4gWzNdXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gICAgICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDUpO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgICAgICpcbiAgICAgICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgICAgICogLy8gPT4gW11cbiAgICAgICAgICovZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aCl7cmV0dXJuW107fW49Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7bj1sZW5ndGgtbjtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLiBFbGVtZW50cyBhcmVcbiAgICAgICAgICogdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIHVzZXJzID0gW1xuICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgICAgICogXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICAgICAqIC8vID0+IFtdXG4gICAgICAgICAqL2Z1bmN0aW9uIHRha2VSaWdodFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVdoaWxlKGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxmYWxzZSx0cnVlKTpbXTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgYmVnaW5uaW5nLiBFbGVtZW50c1xuICAgICAgICAgKiBhcmUgdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIHVzZXJzID0gW1xuICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgICAgICogXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy50YWtlV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICAgICAqIC8vID0+IFtdXG4gICAgICAgICAqL2Z1bmN0aW9uIHRha2VXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpOltdO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzLCBpbiBvcmRlciwgZnJvbSBhbGwgZ2l2ZW4gYXJyYXlzIHVzaW5nXG4gICAgICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnVuaW9uKFsyXSwgWzEsIDJdKTtcbiAgICAgICAgICogLy8gPT4gWzIsIDFdXG4gICAgICAgICAqL3ZhciB1bmlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSk7fSk7LyoqXG4gICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgICAqIHdoaWNoIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tIHRoZSBmaXJzdFxuICAgICAgICogYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICAgKiAodmFsdWUpLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBfLnVuaW9uQnkoWzIuMV0sIFsxLjIsIDIuM10sIE1hdGguZmxvb3IpO1xuICAgICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAgICpcbiAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICogXy51bmlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICAgKi92YXIgdW5pb25CeT1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBpdGVyYXRlZT1sYXN0KGFycmF5cyk7aWYoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKXtpdGVyYXRlZT11bmRlZmluZWQ7fXJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk7fSk7LyoqXG4gICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbVxuICAgICAgICogdGhlIGZpcnN0IGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgICAqXG4gICAgICAgKiBfLnVuaW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgICAqL3ZhciB1bmlvbldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09PSdmdW5jdGlvbic/Y29tcGFyYXRvcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLHVuZGVmaW5lZCxjb21wYXJhdG9yKTt9KTsvKipcbiAgICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIGFuIGFycmF5LCB1c2luZ1xuICAgICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGVsZW1lbnRcbiAgICAgICAqIGlzIGtlcHQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXJcbiAgICAgICAqIGluIHRoZSBhcnJheS5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIF8udW5pcShbMiwgMSwgMl0pO1xuICAgICAgICogLy8gPT4gWzIsIDFdXG4gICAgICAgKi9mdW5jdGlvbiB1bmlxKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlVW5pcShhcnJheSk6W107fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICAgICAqIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlXG4gICAgICAgICAqIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgICAgICogKHZhbHVlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnVuaXFCeShbMi4xLCAxLjIsIDIuM10sIE1hdGguZmxvb3IpO1xuICAgICAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLnVuaXFCeShbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAgICAgKi9mdW5jdGlvbiB1bmlxQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LlRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICAgICAqXG4gICAgICAgICAqIF8udW5pcVdpdGgob2JqZWN0cywgXy5pc0VxdWFsKTtcbiAgICAgICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAgICAgKi9mdW5jdGlvbiB1bmlxV2l0aChhcnJheSxjb21wYXJhdG9yKXtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT09J2Z1bmN0aW9uJz9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlVW5pcShhcnJheSx1bmRlZmluZWQsY29tcGFyYXRvcik6W107fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBhcnJheSBvZiBncm91cGVkXG4gICAgICAgICAqIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGFuIGFycmF5IHJlZ3JvdXBpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZWlyIHByZS16aXBcbiAgICAgICAgICogY29uZmlndXJhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMS4yLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnVuemlwKHppcHBlZCk7XG4gICAgICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV1dXG4gICAgICAgICAqL2Z1bmN0aW9uIHVuemlwKGFycmF5KXtpZighKGFycmF5JiZhcnJheS5sZW5ndGgpKXtyZXR1cm5bXTt9dmFyIGxlbmd0aD0wO2FycmF5PWFycmF5RmlsdGVyKGFycmF5LGZ1bmN0aW9uKGdyb3VwKXtpZihpc0FycmF5TGlrZU9iamVjdChncm91cCkpe2xlbmd0aD1uYXRpdmVNYXgoZ3JvdXAubGVuZ3RoLGxlbmd0aCk7cmV0dXJuIHRydWU7fX0pO3JldHVybiBiYXNlVGltZXMobGVuZ3RoLGZ1bmN0aW9uKGluZGV4KXtyZXR1cm4gYXJyYXlNYXAoYXJyYXksYmFzZVByb3BlcnR5KGluZGV4KSk7fSk7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAgICAgKiBob3cgcmVncm91cGVkIHZhbHVlcyBzaG91bGQgYmUgY29tYmluZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhlXG4gICAgICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuOC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgICAgICogIHJlZ3JvdXBlZCB2YWx1ZXMuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0pO1xuICAgICAgICAgKiAvLyA9PiBbWzEsIDEwLCAxMDBdLCBbMiwgMjAsIDIwMF1dXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udW56aXBXaXRoKHppcHBlZCwgXy5hZGQpO1xuICAgICAgICAgKiAvLyA9PiBbMywgMzAsIDMwMF1cbiAgICAgICAgICovZnVuY3Rpb24gdW56aXBXaXRoKGFycmF5LGl0ZXJhdGVlKXtpZighKGFycmF5JiZhcnJheS5sZW5ndGgpKXtyZXR1cm5bXTt9dmFyIHJlc3VsdD11bnppcChhcnJheSk7aWYoaXRlcmF0ZWU9PW51bGwpe3JldHVybiByZXN1bHQ7fXJldHVybiBhcnJheU1hcChyZXN1bHQsZnVuY3Rpb24oZ3JvdXApe3JldHVybiBhcHBseShpdGVyYXRlZSx1bmRlZmluZWQsZ3JvdXApO30pO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBleGNsdWRpbmcgYWxsIGdpdmVuIHZhbHVlcyB1c2luZ1xuICAgICAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ueG9yXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ud2l0aG91dChbMiwgMSwgMiwgM10sIDEsIDIpO1xuICAgICAgICAgKiAvLyA9PiBbM11cbiAgICAgICAgICovdmFyIHdpdGhvdXQ9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyk6W107fSk7LyoqXG4gICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBpcyB0aGVcbiAgICAgICAqIFtzeW1tZXRyaWMgZGlmZmVyZW5jZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZlcmVuY2UpXG4gICAgICAgKiBvZiB0aGUgZ2l2ZW4gYXJyYXlzLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlclxuICAgICAgICogdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ud2l0aG91dFxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBfLnhvcihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgICAqL3ZhciB4b3I9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpKTt9KTsvKipcbiAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgICAqIHdoaWNoIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWRcbiAgICAgICAqIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lXG4gICAgICAgKiBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogXy54b3JCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgICAqIC8vID0+IFsxLjIsIDMuNF1cbiAgICAgICAqXG4gICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAqIF8ueG9yQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgICAqL3ZhciB4b3JCeT1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBpdGVyYXRlZT1sYXN0KGFycmF5cyk7aWYoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKXtpdGVyYXRlZT11bmRlZmluZWQ7fXJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpO30pOy8qKlxuICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoIGlzXG4gICAgICAgKiBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgICAqXG4gICAgICAgKiBfLnhvcldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XVxuICAgICAgICovdmFyIHhvcldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09PSdmdW5jdGlvbic/Y29tcGFyYXRvcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSx1bmRlZmluZWQsY29tcGFyYXRvcik7fSk7LyoqXG4gICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMsIHRoZSBmaXJzdCBvZiB3aGljaCBjb250YWlucyB0aGVcbiAgICAgICAqIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICAgKiBzZWNvbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAgICovdmFyIHppcD1iYXNlUmVzdCh1bnppcCk7LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gICAgICAgICAqIG9uZSBvZiBwcm9wZXJ0eSBpZGVudGlmaWVycyBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjQuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gICAgICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAgICAgKi9mdW5jdGlvbiB6aXBPYmplY3QocHJvcHMsdmFsdWVzKXtyZXR1cm4gYmFzZVppcE9iamVjdChwcm9wc3x8W10sdmFsdWVzfHxbXSxhc3NpZ25WYWx1ZSk7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcE9iamVjdGAgZXhjZXB0IHRoYXQgaXQgc3VwcG9ydHMgcHJvcGVydHkgcGF0aHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy56aXBPYmplY3REZWVwKFsnYS5iWzBdLmMnLCAnYS5iWzFdLmQnXSwgWzEsIDJdKTtcbiAgICAgICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiBbeyAnYyc6IDEgfSwgeyAnZCc6IDIgfV0gfSB9XG4gICAgICAgICAqL2Z1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsdmFsdWVzKXtyZXR1cm4gYmFzZVppcE9iamVjdChwcm9wc3x8W10sdmFsdWVzfHxbXSxiYXNlU2V0KTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAgICAgKiBob3cgZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgICAgICogIGdyb3VwZWQgdmFsdWVzLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnppcFdpdGgoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSwgZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAgICAgKiAgIHJldHVybiBhICsgYiArIGM7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiAvLyA9PiBbMTExLCAyMjJdXG4gICAgICAgICAqL3ZhciB6aXBXaXRoPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGxlbmd0aD1hcnJheXMubGVuZ3RoLGl0ZXJhdGVlPWxlbmd0aD4xP2FycmF5c1tsZW5ndGgtMV06dW5kZWZpbmVkO2l0ZXJhdGVlPXR5cGVvZiBpdGVyYXRlZT09PSdmdW5jdGlvbic/KGFycmF5cy5wb3AoKSxpdGVyYXRlZSk6dW5kZWZpbmVkO3JldHVybiB1bnppcFdpdGgoYXJyYXlzLGl0ZXJhdGVlKTt9KTsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKlxuICAgICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UgdGhhdCB3cmFwcyBgdmFsdWVgIHdpdGggZXhwbGljaXQgbWV0aG9kXG4gICAgICAgKiBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC4gVGhlIHJlc3VsdCBvZiBzdWNoIHNlcXVlbmNlcyBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAgICogd2l0aCBgXyN2YWx1ZWAuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAxLjMuMFxuICAgICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LFxuICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICAgICAgICogXTtcbiAgICAgICAqXG4gICAgICAgKiB2YXIgeW91bmdlc3QgPSBfXG4gICAgICAgKiAgIC5jaGFpbih1c2VycylcbiAgICAgICAqICAgLnNvcnRCeSgnYWdlJylcbiAgICAgICAqICAgLm1hcChmdW5jdGlvbihvKSB7XG4gICAgICAgKiAgICAgcmV0dXJuIG8udXNlciArICcgaXMgJyArIG8uYWdlO1xuICAgICAgICogICB9KVxuICAgICAgICogICAuaGVhZCgpXG4gICAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAgICogLy8gPT4gJ3BlYmJsZXMgaXMgMSdcbiAgICAgICAqL2Z1bmN0aW9uIGNoYWluKHZhbHVlKXt2YXIgcmVzdWx0PWxvZGFzaCh2YWx1ZSk7cmVzdWx0Ll9fY2hhaW5fXz10cnVlO3JldHVybiByZXN1bHQ7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbnZva2VzIGBpbnRlcmNlcHRvcmAgYW5kIHJldHVybnMgYHZhbHVlYC4gVGhlIGludGVyY2VwdG9yXG4gICAgICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvXG4gICAgICAgICAqIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZSBpbiBvcmRlciB0byBtb2RpZnkgaW50ZXJtZWRpYXRlIHJlc3VsdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfKFsxLCAyLCAzXSlcbiAgICAgICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgICAgICogICAgLy8gTXV0YXRlIGlucHV0IGFycmF5LlxuICAgICAgICAgKiAgICBhcnJheS5wb3AoKTtcbiAgICAgICAgICogIH0pXG4gICAgICAgICAqICAucmV2ZXJzZSgpXG4gICAgICAgICAqICAudmFsdWUoKTtcbiAgICAgICAgICogLy8gPT4gWzIsIDFdXG4gICAgICAgICAqL2Z1bmN0aW9uIHRhcCh2YWx1ZSxpbnRlcmNlcHRvcil7aW50ZXJjZXB0b3IodmFsdWUpO3JldHVybiB2YWx1ZTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udGFwYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gXCJwYXNzIHRocnVcIiB2YWx1ZXMgcmVwbGFjaW5nIGludGVybWVkaWF0ZVxuICAgICAgICAgKiByZXN1bHRzIGluIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfKCcgIGFiYyAgJylcbiAgICAgICAgICogIC5jaGFpbigpXG4gICAgICAgICAqICAudHJpbSgpXG4gICAgICAgICAqICAudGhydShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgKiAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICAgICAgICogIH0pXG4gICAgICAgICAqICAudmFsdWUoKTtcbiAgICAgICAgICogLy8gPT4gWydhYmMnXVxuICAgICAgICAgKi9mdW5jdGlvbiB0aHJ1KHZhbHVlLGludGVyY2VwdG9yKXtyZXR1cm4gaW50ZXJjZXB0b3IodmFsdWUpO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5hdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBuYW1lIGF0XG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBfKG9iamVjdCkuYXQoWydhWzBdLmIuYycsICdhWzFdJ10pLnZhbHVlKCk7XG4gICAgICAgICAqIC8vID0+IFszLCA0XVxuICAgICAgICAgKi92YXIgd3JhcHBlckF0PWZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKXt2YXIgbGVuZ3RoPXBhdGhzLmxlbmd0aCxzdGFydD1sZW5ndGg/cGF0aHNbMF06MCx2YWx1ZT10aGlzLl9fd3JhcHBlZF9fLGludGVyY2VwdG9yPWZ1bmN0aW9uIGludGVyY2VwdG9yKG9iamVjdCl7cmV0dXJuIGJhc2VBdChvYmplY3QscGF0aHMpO307aWYobGVuZ3RoPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RofHwhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpfHwhaXNJbmRleChzdGFydCkpe3JldHVybiB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO312YWx1ZT12YWx1ZS5zbGljZShzdGFydCwrc3RhcnQrKGxlbmd0aD8xOjApKTt2YWx1ZS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOnRocnUsYXJnczpbaW50ZXJjZXB0b3JdLHRoaXNBcmc6dW5kZWZpbmVkfSk7cmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLHRoaXMuX19jaGFpbl9fKS50aHJ1KGZ1bmN0aW9uKGFycmF5KXtpZihsZW5ndGgmJiFhcnJheS5sZW5ndGgpe2FycmF5LnB1c2godW5kZWZpbmVkKTt9cmV0dXJuIGFycmF5O30pO30pOy8qKlxuICAgICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2Ugd2l0aCBleHBsaWNpdCBtZXRob2QgY2hhaW4gc2VxdWVuY2VzIGVuYWJsZWQuXG4gICAgICAgKlxuICAgICAgICogQG5hbWUgY2hhaW5cbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgICAqIF07XG4gICAgICAgKlxuICAgICAgICogLy8gQSBzZXF1ZW5jZSB3aXRob3V0IGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAgICogXyh1c2VycykuaGVhZCgpO1xuICAgICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAgICpcbiAgICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgICAqIF8odXNlcnMpXG4gICAgICAgKiAgIC5jaGFpbigpXG4gICAgICAgKiAgIC5oZWFkKClcbiAgICAgICAqICAgLnBpY2soJ3VzZXInKVxuICAgICAgICogICAudmFsdWUoKTtcbiAgICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JyB9XG4gICAgICAgKi9mdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKXtyZXR1cm4gY2hhaW4odGhpcyk7fS8qKlxuICAgICAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgYW5kIHJldHVybnMgdGhlIHdyYXBwZWQgcmVzdWx0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbmFtZSBjb21taXRcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMi4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBhcnJheSA9IFsxLCAyXTtcbiAgICAgICAgICogdmFyIHdyYXBwZWQgPSBfKGFycmF5KS5wdXNoKDMpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAgICAgKlxuICAgICAgICAgKiB3cmFwcGVkID0gd3JhcHBlZC5jb21taXQoKTtcbiAgICAgICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgICAgICpcbiAgICAgICAgICogd3JhcHBlZC5sYXN0KCk7XG4gICAgICAgICAqIC8vID0+IDNcbiAgICAgICAgICpcbiAgICAgICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgICAgICovZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpe3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksdGhpcy5fX2NoYWluX18pO30vKipcbiAgICAgICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBvbiBhIHdyYXBwZWQgb2JqZWN0IGZvbGxvd2luZyB0aGVcbiAgICAgICAgICogW2l0ZXJhdG9yIHByb3RvY29sXShodHRwczovL21kbi5pby9pdGVyYXRpb25fcHJvdG9jb2xzI2l0ZXJhdG9yKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG5hbWUgbmV4dFxuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXh0IGl0ZXJhdG9yIHZhbHVlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgICAgICpcbiAgICAgICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMSB9XG4gICAgICAgICAqXG4gICAgICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDIgfVxuICAgICAgICAgKlxuICAgICAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgICAgICogLy8gPT4geyAnZG9uZSc6IHRydWUsICd2YWx1ZSc6IHVuZGVmaW5lZCB9XG4gICAgICAgICAqL2Z1bmN0aW9uIHdyYXBwZXJOZXh0KCl7aWYodGhpcy5fX3ZhbHVlc19fPT09dW5kZWZpbmVkKXt0aGlzLl9fdmFsdWVzX189dG9BcnJheSh0aGlzLnZhbHVlKCkpO312YXIgZG9uZT10aGlzLl9faW5kZXhfXz49dGhpcy5fX3ZhbHVlc19fLmxlbmd0aCx2YWx1ZT1kb25lP3VuZGVmaW5lZDp0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK107cmV0dXJue2RvbmU6ZG9uZSx2YWx1ZTp2YWx1ZX07fS8qKlxuICAgICAgICAgKiBFbmFibGVzIHRoZSB3cmFwcGVyIHRvIGJlIGl0ZXJhYmxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbmFtZSBTeW1ib2wuaXRlcmF0b3JcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiB3cmFwcGVkW1N5bWJvbC5pdGVyYXRvcl0oKSA9PT0gd3JhcHBlZDtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBBcnJheS5mcm9tKHdyYXBwZWQpO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgICAgICovZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKXtyZXR1cm4gdGhpczt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgY2hhaW4gc2VxdWVuY2UgcGxhbnRpbmcgYHZhbHVlYCBhcyB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG5hbWUgcGxhbnRcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMi4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGxhbnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKS5tYXAoc3F1YXJlKTtcbiAgICAgICAgICogdmFyIG90aGVyID0gd3JhcHBlZC5wbGFudChbMywgNF0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBvdGhlci52YWx1ZSgpO1xuICAgICAgICAgKiAvLyA9PiBbOSwgMTZdXG4gICAgICAgICAqXG4gICAgICAgICAqIHdyYXBwZWQudmFsdWUoKTtcbiAgICAgICAgICogLy8gPT4gWzEsIDRdXG4gICAgICAgICAqL2Z1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSl7dmFyIHJlc3VsdCxwYXJlbnQ9dGhpczt3aGlsZShwYXJlbnQgaW5zdGFuY2VvZiBiYXNlTG9kYXNoKXt2YXIgY2xvbmU9d3JhcHBlckNsb25lKHBhcmVudCk7Y2xvbmUuX19pbmRleF9fPTA7Y2xvbmUuX192YWx1ZXNfXz11bmRlZmluZWQ7aWYocmVzdWx0KXtwcmV2aW91cy5fX3dyYXBwZWRfXz1jbG9uZTt9ZWxzZXtyZXN1bHQ9Y2xvbmU7fXZhciBwcmV2aW91cz1jbG9uZTtwYXJlbnQ9cGFyZW50Ll9fd3JhcHBlZF9fO31wcmV2aW91cy5fX3dyYXBwZWRfXz12YWx1ZTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5yZXZlcnNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgdGhlIHdyYXBwZWQgYXJyYXkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXyhhcnJheSkucmV2ZXJzZSgpLnZhbHVlKClcbiAgICAgICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICAgICAqXG4gICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICAgICAqL2Z1bmN0aW9uIHdyYXBwZXJSZXZlcnNlKCl7dmFyIHZhbHVlPXRoaXMuX193cmFwcGVkX187aWYodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcil7dmFyIHdyYXBwZWQ9dmFsdWU7aWYodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpe3dyYXBwZWQ9bmV3IExhenlXcmFwcGVyKHRoaXMpO313cmFwcGVkPXdyYXBwZWQucmV2ZXJzZSgpO3dyYXBwZWQuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzp0aHJ1LGFyZ3M6W3JldmVyc2VdLHRoaXNBcmc6dW5kZWZpbmVkfSk7cmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZWQsdGhpcy5fX2NoYWluX18pO31yZXR1cm4gdGhpcy50aHJ1KHJldmVyc2UpO30vKipcbiAgICAgICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG5hbWUgdmFsdWVcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBhbGlhcyB0b0pTT04sIHZhbHVlT2ZcbiAgICAgICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdW53cmFwcGVkIHZhbHVlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfKFsxLCAyLCAzXSkudmFsdWUoKTtcbiAgICAgICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICAgICAqL2Z1bmN0aW9uIHdyYXBwZXJWYWx1ZSgpe3JldHVybiBiYXNlV3JhcHBlclZhbHVlKHRoaXMuX193cmFwcGVkX18sdGhpcy5fX2FjdGlvbnNfXyk7fS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgICAgICogZWFjaCBrZXkgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUga2V5IHdhcyByZXR1cm5lZCBieSBgaXRlcmF0ZWVgLiBUaGVcbiAgICAgICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmNvdW50QnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLmNvdW50QnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgICAgICogLy8gPT4geyAnMyc6IDIsICc1JzogMSB9XG4gICAgICAgICAqL3ZhciBjb3VudEJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsa2V5KSl7KytyZXN1bHRba2V5XTt9ZWxzZXtiYXNlQXNzaWduVmFsdWUocmVzdWx0LGtleSwxKTt9fSk7LyoqXG4gICAgICAgKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYWxsKiogZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAgICogSXRlcmF0aW9uIGlzIHN0b3BwZWQgb25jZSBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAgICpcbiAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCBmb3JcbiAgICAgICAqIFtlbXB0eSBjb2xsZWN0aW9uc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1wdHlfc2V0KSBiZWNhdXNlXG4gICAgICAgKiBbZXZlcnl0aGluZyBpcyB0cnVlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WYWN1b3VzX3RydXRoKSBvZlxuICAgICAgICogZWxlbWVudHMgb2YgZW1wdHkgY29sbGVjdGlvbnMuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICpcbiAgICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgICAqIF07XG4gICAgICAgKlxuICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAqIF8uZXZlcnkodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAqXG4gICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgKiBfLmV2ZXJ5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgKlxuICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgKiBfLmV2ZXJ5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICovZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFdmVyeTpiYXNlRXZlcnk7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSl7cHJlZGljYXRlPXVuZGVmaW5lZDt9cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpO30vKipcbiAgICAgICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAgICAgICAgICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFVubGlrZSBgXy5yZW1vdmVgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICAgICAqIEBzZWUgXy5yZWplY3RcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIHVzZXJzID0gW1xuICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAgICAgKiBdO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmZpbHRlcih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5maWx0ZXIodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgICAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICAgICAqL2Z1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUZpbHRlcjpiYXNlRmlsdGVyO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKTt9LyoqXG4gICAgICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgICAgICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgICAgICogXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdwZWJibGVzJ1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgICAqIF8uZmluZCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgICAgICovdmFyIGZpbmQ9Y3JlYXRlRmluZChmaW5kSW5kZXgpOy8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1jb2xsZWN0aW9uLmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZmluZExhc3QoWzEsIDIsIDMsIDRdLCBmdW5jdGlvbihuKSB7XG4gICAgICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiAvLyA9PiAzXG4gICAgICAgICAqL3ZhciBmaW5kTGFzdD1jcmVhdGVGaW5kKGZpbmRMYXN0SW5kZXgpOy8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZmxhdHRlbmVkIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmBcbiAgICAgICAgICogdGhydSBgaXRlcmF0ZWVgIGFuZCBmbGF0dGVuaW5nIHRoZSBtYXBwZWQgcmVzdWx0cy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBkdXBsaWNhdGUobikge1xuICAgICAgICAgKiAgIHJldHVybiBbbiwgbl07XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5mbGF0TWFwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICAgICAqL2Z1bmN0aW9uIGZsYXRNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSwxKTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICAgICAqIG1hcHBlZCByZXN1bHRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICAgICAqICAgcmV0dXJuIFtbW24sIG5dXV07XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5mbGF0TWFwRGVlcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICAgICAqIC8vID0+IFsxLCAxLCAyLCAyXVxuICAgICAgICAgKi9mdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLGl0ZXJhdGVlKXtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLElORklOSVRZKTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICAgICAqIG1hcHBlZCByZXN1bHRzIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuNy4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICAgICAqICAgcmV0dXJuIFtbW24sIG5dXV07XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5mbGF0TWFwRGVwdGgoWzEsIDJdLCBkdXBsaWNhdGUsIDIpO1xuICAgICAgICAgKiAvLyA9PiBbWzEsIDFdLCBbMiwgMl1dXG4gICAgICAgICAqL2Z1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLGl0ZXJhdGVlLGRlcHRoKXtkZXB0aD1kZXB0aD09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihkZXB0aCk7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSxkZXB0aCk7fS8qKlxuICAgICAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gICAgICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIEFzIHdpdGggb3RoZXIgXCJDb2xsZWN0aW9uc1wiIG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhIFwibGVuZ3RoXCJcbiAgICAgICAgICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAgICAgICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGFsaWFzIGVhY2hcbiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHRcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5mb3JFYWNoKFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiAvLyA9PiBMb2dzIGAxYCB0aGVuIGAyYC5cbiAgICAgICAgICpcbiAgICAgICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgICAgICovZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLGl0ZXJhdGVlKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5RWFjaDpiYXNlRWFjaDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yRWFjaGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAgICAgKiBAYWxpYXMgZWFjaFJpZ2h0XG4gICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaFxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmZvckVhY2hSaWdodChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAgICAgKiB9KTtcbiAgICAgICAgICogLy8gPT4gTG9ncyBgMmAgdGhlbiBgMWAuXG4gICAgICAgICAqL2Z1bmN0aW9uIGZvckVhY2hSaWdodChjb2xsZWN0aW9uLGl0ZXJhdGVlKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5RWFjaFJpZ2h0OmJhc2VFYWNoUmlnaHQ7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSk7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBvcmRlciBvZiBncm91cGVkIHZhbHVlc1xuICAgICAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIGBjb2xsZWN0aW9uYC4gVGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgICogdmFsdWUgb2YgZWFjaCBrZXkgaXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlXG4gICAgICAgICAqIGtleS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5ncm91cEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICAgICAqIC8vID0+IHsgJzQnOiBbNC4yXSwgJzYnOiBbNi4xLCA2LjNdIH1cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAgICAgKiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH1cbiAgICAgICAgICovdmFyIGdyb3VwQnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsa2V5KXtpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCxrZXkpKXtyZXN1bHRba2V5XS5wdXNoKHZhbHVlKTt9ZWxzZXtiYXNlQXNzaWduVmFsdWUocmVzdWx0LGtleSxbdmFsdWVdKTt9fSk7LyoqXG4gICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICAgICAgICogY2hlY2tlZCBmb3IgYSBzdWJzdHJpbmcgb2YgYHZhbHVlYCwgb3RoZXJ3aXNlXG4gICAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAgICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAgICAgICAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAqXG4gICAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICpcbiAgICAgICAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAqXG4gICAgICAgKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgKi9mdW5jdGlvbiBpbmNsdWRlcyhjb2xsZWN0aW9uLHZhbHVlLGZyb21JbmRleCxndWFyZCl7Y29sbGVjdGlvbj1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9jb2xsZWN0aW9uOnZhbHVlcyhjb2xsZWN0aW9uKTtmcm9tSW5kZXg9ZnJvbUluZGV4JiYhZ3VhcmQ/dG9JbnRlZ2VyKGZyb21JbmRleCk6MDt2YXIgbGVuZ3RoPWNvbGxlY3Rpb24ubGVuZ3RoO2lmKGZyb21JbmRleDwwKXtmcm9tSW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtmcm9tSW5kZXgsMCk7fXJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKT9mcm9tSW5kZXg8PWxlbmd0aCYmY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLGZyb21JbmRleCk+LTE6ISFsZW5ndGgmJmJhc2VJbmRleE9mKGNvbGxlY3Rpb24sdmFsdWUsZnJvbUluZGV4KT4tMTt9LyoqXG4gICAgICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nXG4gICAgICAgICAqIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAgICAgKiBhcmUgcHJvdmlkZWQgdG8gZWFjaCBpbnZva2VkIG1ldGhvZC4gSWYgYHBhdGhgIGlzIGEgZnVuY3Rpb24sIGl0J3MgaW52b2tlZFxuICAgICAgICAgKiBmb3IsIGFuZCBgdGhpc2AgYm91bmQgdG8sIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgICAgICogIHRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGVhY2ggbWV0aG9kIHdpdGguXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pbnZva2VNYXAoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAgICAgICAgICogLy8gPT4gW1sxLCA1LCA3XSwgWzEsIDIsIDNdXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmludm9rZU1hcChbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gICAgICAgICAqIC8vID0+IFtbJzEnLCAnMicsICczJ10sIFsnNCcsICc1JywgJzYnXV1cbiAgICAgICAgICovdmFyIGludm9rZU1hcD1iYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLHBhdGgsYXJncyl7dmFyIGluZGV4PS0xLGlzRnVuYz10eXBlb2YgcGF0aD09PSdmdW5jdGlvbicscmVzdWx0PWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pP0FycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKTpbXTtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlKXtyZXN1bHRbKytpbmRleF09aXNGdW5jP2FwcGx5KHBhdGgsdmFsdWUsYXJncyk6YmFzZUludm9rZSh2YWx1ZSxwYXRoLGFyZ3MpO30pO3JldHVybiByZXN1bHQ7fSk7LyoqXG4gICAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZlxuICAgICAgICogZWFjaCBrZXkgaXMgdGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LiBUaGVcbiAgICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgYXJyYXkgPSBbXG4gICAgICAgKiAgIHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LFxuICAgICAgICogICB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9XG4gICAgICAgKiBdO1xuICAgICAgICpcbiAgICAgICAqIF8ua2V5QnkoYXJyYXksIGZ1bmN0aW9uKG8pIHtcbiAgICAgICAqICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoby5jb2RlKTtcbiAgICAgICAqIH0pO1xuICAgICAgICogLy8gPT4geyAnYSc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAnZCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAgICpcbiAgICAgICAqIF8ua2V5QnkoYXJyYXksICdkaXInKTtcbiAgICAgICAqIC8vID0+IHsgJ2xlZnQnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ3JpZ2h0JzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICAgKi92YXIga2V5Qnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsa2V5KXtiYXNlQXNzaWduVmFsdWUocmVzdWx0LGtleSx2YWx1ZSk7fSk7LyoqXG4gICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICAgICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICAgKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICAgKlxuICAgICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICAgKiBgXy5ldmVyeWAsIGBfLmZpbHRlcmAsIGBfLm1hcGAsIGBfLm1hcFZhbHVlc2AsIGBfLnJlamVjdGAsIGFuZCBgXy5zb21lYC5cbiAgICAgICAqXG4gICAgICAgKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAgICAgICAqIGBhcnlgLCBgY2h1bmtgLCBgY3VycnlgLCBgY3VycnlSaWdodGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBldmVyeWAsXG4gICAgICAgKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAgICAgICAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgICAqIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYW5kIGB3b3Jkc2BcbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgICAqIH1cbiAgICAgICAqXG4gICAgICAgKiBfLm1hcChbNCwgOF0sIHNxdWFyZSk7XG4gICAgICAgKiAvLyA9PiBbMTYsIDY0XVxuICAgICAgICpcbiAgICAgICAqIF8ubWFwKHsgJ2EnOiA0LCAnYic6IDggfSwgc3F1YXJlKTtcbiAgICAgICAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICAgKlxuICAgICAgICogdmFyIHVzZXJzID0gW1xuICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gICAgICAgKiBdO1xuICAgICAgICpcbiAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICogXy5tYXAodXNlcnMsICd1c2VyJyk7XG4gICAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgICAqL2Z1bmN0aW9uIG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5TWFwOmJhc2VNYXA7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSk7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRCeWAgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHNwZWNpZnlpbmcgdGhlIHNvcnRcbiAgICAgICAgICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXNcbiAgICAgICAgICogYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSwgc3BlY2lmeSBhbiBvcmRlciBvZiBcImRlc2NcIiBmb3JcbiAgICAgICAgICogZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlciBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5W118RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtvcmRlcnNdIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9LFxuICAgICAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAgICAgKiBdO1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBTb3J0IGJ5IGB1c2VyYCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kIGJ5IGBhZ2VgIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICAgICAqIF8ub3JkZXJCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddLCBbJ2FzYycsICdkZXNjJ10pO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDQwXV1cbiAgICAgICAgICovZnVuY3Rpb24gb3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMsZ3VhcmQpe2lmKGNvbGxlY3Rpb249PW51bGwpe3JldHVybltdO31pZighaXNBcnJheShpdGVyYXRlZXMpKXtpdGVyYXRlZXM9aXRlcmF0ZWVzPT1udWxsP1tdOltpdGVyYXRlZXNdO31vcmRlcnM9Z3VhcmQ/dW5kZWZpbmVkOm9yZGVycztpZighaXNBcnJheShvcmRlcnMpKXtvcmRlcnM9b3JkZXJzPT1udWxsP1tdOltvcmRlcnNdO31yZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byB0d28gZ3JvdXBzLCB0aGUgZmlyc3Qgb2Ygd2hpY2hcbiAgICAgICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB0aGUgc2Vjb25kIG9mIHdoaWNoXG4gICAgICAgICAqIGNvbnRhaW5zIGVsZW1lbnRzIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5IGZvci4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAgICAgKiBdO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hY3RpdmU7IH0pO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5wYXJ0aXRpb24odXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1sncGViYmxlcyddLCBbJ2Jhcm5leScsICdmcmVkJ11dXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5wYXJ0aXRpb24odXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgJ3BlYmJsZXMnXSwgWydmcmVkJ11dXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgICAgICovdmFyIHBhcnRpdGlvbj1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe3Jlc3VsdFtrZXk/MDoxXS5wdXNoKHZhbHVlKTt9LGZ1bmN0aW9uKCl7cmV0dXJuW1tdLFtdXTt9KTsvKipcbiAgICAgICAqIFJlZHVjZXMgYGNvbGxlY3Rpb25gIHRvIGEgdmFsdWUgd2hpY2ggaXMgdGhlIGFjY3VtdWxhdGVkIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgICAgKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgXG4gICAgICAgKiBpcyBub3QgZ2l2ZW4sIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCBpcyB1c2VkIGFzIHRoZSBpbml0aWFsXG4gICAgICAgKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAgICAgICAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICAgKlxuICAgICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICAgKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLlxuICAgICAgICpcbiAgICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAgICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsXG4gICAgICAgKiBhbmQgYHNvcnRCeWBcbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICAgKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAgICAgICAqICAgcmV0dXJuIHN1bSArIG47XG4gICAgICAgKiB9LCAwKTtcbiAgICAgICAqIC8vID0+IDNcbiAgICAgICAqXG4gICAgICAgKiBfLnJlZHVjZSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICAgKiAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgKiB9LCB7fSk7XG4gICAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICAgKi9mdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVJlZHVjZTpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2gpO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yZWR1Y2VgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICAgICAqIEBzZWUgXy5yZWR1Y2VcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIGFycmF5ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnJlZHVjZVJpZ2h0KGFycmF5LCBmdW5jdGlvbihmbGF0dGVuZWQsIG90aGVyKSB7XG4gICAgICAgICAqICAgcmV0dXJuIGZsYXR0ZW5lZC5jb25jYXQob3RoZXIpO1xuICAgICAgICAgKiB9LCBbXSk7XG4gICAgICAgICAqIC8vID0+IFs0LCA1LCAyLCAzLCAwLCAxXVxuICAgICAgICAgKi9mdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5UmVkdWNlUmlnaHQ6YmFzZVJlZHVjZSxpbml0QWNjdW09YXJndW1lbnRzLmxlbmd0aDwzO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsNCksYWNjdW11bGF0b3IsaW5pdEFjY3VtLGJhc2VFYWNoUmlnaHQpO30vKipcbiAgICAgICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmZpbHRlcmA7IHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYFxuICAgICAgICAgKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAgICAgKiBAc2VlIF8uZmlsdGVyXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgICAgICogXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5yZWplY3QodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgICAqIF8ucmVqZWN0KHVzZXJzLCB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLnJlamVjdCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5yZWplY3QodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAgICAgKi9mdW5jdGlvbiByZWplY3QoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlGaWx0ZXI6YmFzZUZpbHRlcjtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpKTt9LyoqXG4gICAgICAgICAqIEdldHMgYSByYW5kb20gZWxlbWVudCBmcm9tIGBjb2xsZWN0aW9uYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICAgICAqIC8vID0+IDJcbiAgICAgICAgICovZnVuY3Rpb24gc2FtcGxlKGNvbGxlY3Rpb24pe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTYW1wbGU6YmFzZVNhbXBsZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTt9LyoqXG4gICAgICAgICAqIEdldHMgYG5gIHJhbmRvbSBlbGVtZW50cyBhdCB1bmlxdWUga2V5cyBmcm9tIGBjb2xsZWN0aW9uYCB1cCB0byB0aGVcbiAgICAgICAgICogc2l6ZSBvZiBgY29sbGVjdGlvbmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgMik7XG4gICAgICAgICAqIC8vID0+IFszLCAxXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnNhbXBsZVNpemUoWzEsIDIsIDNdLCA0KTtcbiAgICAgICAgICogLy8gPT4gWzIsIDMsIDFdXG4gICAgICAgICAqL2Z1bmN0aW9uIHNhbXBsZVNpemUoY29sbGVjdGlvbixuLGd1YXJkKXtpZihndWFyZD9pc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLG4sZ3VhcmQpOm49PT11bmRlZmluZWQpe249MTt9ZWxzZXtuPXRvSW50ZWdlcihuKTt9dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNhbXBsZVNpemU6YmFzZVNhbXBsZVNpemU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixuKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygc2h1ZmZsZWQgdmFsdWVzLCB1c2luZyBhIHZlcnNpb24gb2YgdGhlXG4gICAgICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzaHVmZmxlZCBhcnJheS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5zaHVmZmxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICAgICAqIC8vID0+IFs0LCAxLCAzLCAyXVxuICAgICAgICAgKi9mdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTaHVmZmxlOmJhc2VTaHVmZmxlO3JldHVybiBmdW5jKGNvbGxlY3Rpb24pO30vKipcbiAgICAgICAgICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAgICAgICAgICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uc2l6ZShbMSwgMiwgM10pO1xuICAgICAgICAgKiAvLyA9PiAzXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAgICAgKiAvLyA9PiAyXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uc2l6ZSgncGViYmxlcycpO1xuICAgICAgICAgKiAvLyA9PiA3XG4gICAgICAgICAqL2Z1bmN0aW9uIHNpemUoY29sbGVjdGlvbil7aWYoY29sbGVjdGlvbj09bnVsbCl7cmV0dXJuIDA7fWlmKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXtyZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbik/c3RyaW5nU2l6ZShjb2xsZWN0aW9uKTpjb2xsZWN0aW9uLmxlbmd0aDt9dmFyIHRhZz1nZXRUYWcoY29sbGVjdGlvbik7aWYodGFnPT1tYXBUYWd8fHRhZz09c2V0VGFnKXtyZXR1cm4gY29sbGVjdGlvbi5zaXplO31yZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFueSoqIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywgZmFsc2VdLCBCb29sZWFuKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgICAgICogXTtcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5zb21lKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5zb21lKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICovZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNvbWU6YmFzZVNvbWU7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSl7cHJlZGljYXRlPXVuZGVmaW5lZDt9cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cywgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgcmVzdWx0cyBvZlxuICAgICAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICAgICAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAgICAgICAgICogZXF1YWwgZWxlbWVudHMuIFRoZSBpdGVyYXRlZXMgYXJlIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gICAgICAgICAqIF07XG4gICAgICAgICAqXG4gICAgICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgNDBdLCBbJ2ZyZWQnLCA0OF1dXG4gICAgICAgICAqL3ZhciBzb3J0Qnk9YmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZXMpe2lmKGNvbGxlY3Rpb249PW51bGwpe3JldHVybltdO312YXIgbGVuZ3RoPWl0ZXJhdGVlcy5sZW5ndGg7aWYobGVuZ3RoPjEmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24saXRlcmF0ZWVzWzBdLGl0ZXJhdGVlc1sxXSkpe2l0ZXJhdGVlcz1bXTt9ZWxzZSBpZihsZW5ndGg+MiYmaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzWzBdLGl0ZXJhdGVlc1sxXSxpdGVyYXRlZXNbMl0pKXtpdGVyYXRlZXM9W2l0ZXJhdGVlc1swXV07fXJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywxKSxbXSk7fSk7LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKipcbiAgICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICAgICAgICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAgICogQGNhdGVnb3J5IERhdGVcbiAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICAgICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICAgICAgICogfSwgXy5ub3coKSk7XG4gICAgICAgKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICAgICAgICovdmFyIG5vdz1jdHhOb3d8fGZ1bmN0aW9uKCl7cmV0dXJuIHJvb3QuRGF0ZS5ub3coKTt9Oy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqXG4gICAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uYmVmb3JlYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAgICogYGZ1bmNgIG9uY2UgaXQncyBjYWxsZWQgYG5gIG9yIG1vcmUgdGltZXMuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGJlZm9yZSBgZnVuY2AgaXMgaW52b2tlZC5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogdmFyIHNhdmVzID0gWydwcm9maWxlJywgJ3NldHRpbmdzJ107XG4gICAgICAgKlxuICAgICAgICogdmFyIGRvbmUgPSBfLmFmdGVyKHNhdmVzLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgICAgKiAgIGNvbnNvbGUubG9nKCdkb25lIHNhdmluZyEnKTtcbiAgICAgICAqIH0pO1xuICAgICAgICpcbiAgICAgICAqIF8uZm9yRWFjaChzYXZlcywgZnVuY3Rpb24odHlwZSkge1xuICAgICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6IGRvbmUgfSk7XG4gICAgICAgKiB9KTtcbiAgICAgICAqIC8vID0+IExvZ3MgJ2RvbmUgc2F2aW5nIScgYWZ0ZXIgdGhlIHR3byBhc3luYyBzYXZlcyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgICAqL2Z1bmN0aW9uIGFmdGVyKG4sZnVuYyl7aWYodHlwZW9mIGZ1bmMhPT0nZnVuY3Rpb24nKXt0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7fW49dG9JbnRlZ2VyKG4pO3JldHVybiBmdW5jdGlvbigpe2lmKC0tbjwxKXtyZXR1cm4gZnVuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fX07fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB1cCB0byBgbmAgYXJndW1lbnRzLFxuICAgICAgICAgKiBpZ25vcmluZyBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgY2FwLlxuICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubWFwKFsnNicsICc4JywgJzEwJ10sIF8uYXJ5KHBhcnNlSW50LCAxKSk7XG4gICAgICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgICAgICovZnVuY3Rpb24gYXJ5KGZ1bmMsbixndWFyZCl7bj1ndWFyZD91bmRlZmluZWQ6bjtuPWZ1bmMmJm49PW51bGw/ZnVuYy5sZW5ndGg6bjtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfQVJZX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLG4pO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHNcbiAgICAgICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAgICAgICAgICogY2FsbHMgdG8gdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGF0IHdoaWNoIGBmdW5jYCBpcyBubyBsb25nZXIgaW52b2tlZC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gICAgICAgICAqIC8vID0+IEFsbG93cyBhZGRpbmcgdXAgdG8gNCBjb250YWN0cyB0byB0aGUgbGlzdC5cbiAgICAgICAgICovZnVuY3Rpb24gYmVmb3JlKG4sZnVuYyl7dmFyIHJlc3VsdDtpZih0eXBlb2YgZnVuYyE9PSdmdW5jdGlvbicpe3Rocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt9bj10b0ludGVnZXIobik7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPjApe3Jlc3VsdD1mdW5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9aWYobjw9MSl7ZnVuYz11bmRlZmluZWQ7fXJldHVybiByZXN1bHQ7fTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYFxuICAgICAgICAgKiBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGBfLmJpbmQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpYyBidWlsZHMsXG4gICAgICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFVubGlrZSBuYXRpdmUgYEZ1bmN0aW9uI2JpbmRgLCB0aGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIlxuICAgICAgICAgKiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBiaW5kLlxuICAgICAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgJ2hpJyk7XG4gICAgICAgICAqIGJvdW5kKCchJyk7XG4gICAgICAgICAqIC8vID0+ICdoaSBmcmVkISdcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICAgICAqIHZhciBib3VuZCA9IF8uYmluZChncmVldCwgb2JqZWN0LCBfLCAnIScpO1xuICAgICAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAgICAgKi92YXIgYmluZD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHRoaXNBcmcscGFydGlhbHMpe3ZhciBiaXRtYXNrPVdSQVBfQklORF9GTEFHO2lmKHBhcnRpYWxzLmxlbmd0aCl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKGJpbmQpKTtiaXRtYXNrfD1XUkFQX1BBUlRJQUxfRkxBRzt9cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxiaXRtYXNrLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyk7fSk7LyoqXG4gICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYCB3aXRoIGBwYXJ0aWFsc2BcbiAgICAgICAqIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG8gcmVmZXJlbmNlXG4gICAgICAgKiBtZXRob2RzIHRoYXQgbWF5IGJlIHJlZGVmaW5lZCBvciBkb24ndCB5ZXQgZXhpc3QuIFNlZVxuICAgICAgICogW1BldGVyIE1pY2hhdXgncyBhcnRpY2xlXShodHRwOi8vcGV0ZXIubWljaGF1eC5jYS9hcnRpY2xlcy9sYXp5LWZ1bmN0aW9uLWRlZmluaXRpb24tcGF0dGVybilcbiAgICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgKlxuICAgICAgICogVGhlIGBfLmJpbmRLZXkucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuXG4gICAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAgICogICAndXNlcic6ICdmcmVkJyxcbiAgICAgICAqICAgJ2dyZWV0JzogZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICAgKiAgICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICAgKiAgIH1cbiAgICAgICAqIH07XG4gICAgICAgKlxuICAgICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgJ2hpJyk7XG4gICAgICAgKiBib3VuZCgnIScpO1xuICAgICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAgICpcbiAgICAgICAqIG9iamVjdC5ncmVldCA9IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAneWEgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAgICogfTtcbiAgICAgICAqXG4gICAgICAgKiBib3VuZCgnIScpO1xuICAgICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICAgKlxuICAgICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCBfLCAnIScpO1xuICAgICAgICogYm91bmQoJ2hpJyk7XG4gICAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgICAqL3ZhciBiaW5kS2V5PWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxrZXkscGFydGlhbHMpe3ZhciBiaXRtYXNrPVdSQVBfQklORF9GTEFHfFdSQVBfQklORF9LRVlfRkxBRztpZihwYXJ0aWFscy5sZW5ndGgpe3ZhciBob2xkZXJzPXJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLGdldEhvbGRlcihiaW5kS2V5KSk7Yml0bWFza3w9V1JBUF9QQVJUSUFMX0ZMQUc7fXJldHVybiBjcmVhdGVXcmFwKGtleSxiaXRtYXNrLG9iamVjdCxwYXJ0aWFscyxob2xkZXJzKTt9KTsvKipcbiAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYXJndW1lbnRzIG9mIGBmdW5jYCBhbmQgZWl0aGVyIGludm9rZXNcbiAgICAgICAqIGBmdW5jYCByZXR1cm5pbmcgaXRzIHJlc3VsdCwgaWYgYXQgbGVhc3QgYGFyaXR5YCBudW1iZXIgb2YgYXJndW1lbnRzIGhhdmVcbiAgICAgICAqIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHJlbWFpbmluZyBgZnVuY2BcbiAgICAgICAqIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgYGZ1bmNgIG1heSBiZSBzcGVjaWZpZWQgaWYgYGZ1bmMubGVuZ3RoYFxuICAgICAgICogaXMgbm90IHN1ZmZpY2llbnQuXG4gICAgICAgKlxuICAgICAgICogVGhlIGBfLmN1cnJ5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAgICogbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAgICpcbiAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDIuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAgICogfTtcbiAgICAgICAqXG4gICAgICAgKiB2YXIgY3VycmllZCA9IF8uY3VycnkoYWJjKTtcbiAgICAgICAqXG4gICAgICAgKiBjdXJyaWVkKDEpKDIpKDMpO1xuICAgICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICAgKlxuICAgICAgICogY3VycmllZCgxLCAyKSgzKTtcbiAgICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAgICpcbiAgICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgICAqXG4gICAgICAgKiAvLyBDdXJyaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAgICogY3VycmllZCgxKShfLCAzKSgyKTtcbiAgICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAgICovZnVuY3Rpb24gY3VycnkoZnVuYyxhcml0eSxndWFyZCl7YXJpdHk9Z3VhcmQ/dW5kZWZpbmVkOmFyaXR5O3ZhciByZXN1bHQ9Y3JlYXRlV3JhcChmdW5jLFdSQVBfQ1VSUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5KTtyZXN1bHQucGxhY2Vob2xkZXI9Y3VycnkucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY3VycnlgIGV4Y2VwdCB0aGF0IGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byBgZnVuY2BcbiAgICAgICAgICogaW4gdGhlIG1hbm5lciBvZiBgXy5wYXJ0aWFsUmlnaHRgIGluc3RlYWQgb2YgYF8ucGFydGlhbGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBgXy5jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICAgICAqIH07XG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeVJpZ2h0KGFiYyk7XG4gICAgICAgICAqXG4gICAgICAgICAqIGN1cnJpZWQoMykoMikoMSk7XG4gICAgICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAgICAgKlxuICAgICAgICAgKiBjdXJyaWVkKDIsIDMpKDEpO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgICAgICpcbiAgICAgICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICAgICAqIGN1cnJpZWQoMykoMSwgXykoMik7XG4gICAgICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAgICAgKi9mdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsYXJpdHksZ3VhcmQpe2FyaXR5PWd1YXJkP3VuZGVmaW5lZDphcml0eTt2YXIgcmVzdWx0PWNyZWF0ZVdyYXAoZnVuYyxXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eSk7cmVzdWx0LnBsYWNlaG9sZGVyPWN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICAgICAgICAgKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAgICAgICAgICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICAgICAgICAgKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAgICAgICAgICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gICAgICAgICAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgICAgICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICAgICAgICAgKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICAgICAgICAgKiBpbnZvY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gICAgICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gICAgICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgICAgICpcbiAgICAgICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICAgICAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAgICAgICAgICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gICAgICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICAgICAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gICAgICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICAgICAgICAgKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gICAgICAgICAqIH0pKTtcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAgICAgICAgICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gICAgICAgICAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAgICAgICAgICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICAgICAgICAgKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAgICAgICAgICovZnVuY3Rpb24gZGVib3VuY2UoZnVuYyx3YWl0LG9wdGlvbnMpe3ZhciBsYXN0QXJncyxsYXN0VGhpcyxtYXhXYWl0LHJlc3VsdCx0aW1lcklkLGxhc3RDYWxsVGltZSxsYXN0SW52b2tlVGltZT0wLGxlYWRpbmc9ZmFsc2UsbWF4aW5nPWZhbHNlLHRyYWlsaW5nPXRydWU7aWYodHlwZW9mIGZ1bmMhPT0nZnVuY3Rpb24nKXt0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7fXdhaXQ9dG9OdW1iZXIod2FpdCl8fDA7aWYoaXNPYmplY3Qob3B0aW9ucykpe2xlYWRpbmc9ISFvcHRpb25zLmxlYWRpbmc7bWF4aW5nPSdtYXhXYWl0J2luIG9wdGlvbnM7bWF4V2FpdD1tYXhpbmc/bmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCl8fDAsd2FpdCk6bWF4V2FpdDt0cmFpbGluZz0ndHJhaWxpbmcnaW4gb3B0aW9ucz8hIW9wdGlvbnMudHJhaWxpbmc6dHJhaWxpbmc7fWZ1bmN0aW9uIGludm9rZUZ1bmModGltZSl7dmFyIGFyZ3M9bGFzdEFyZ3MsdGhpc0FyZz1sYXN0VGhpcztsYXN0QXJncz1sYXN0VGhpcz11bmRlZmluZWQ7bGFzdEludm9rZVRpbWU9dGltZTtyZXN1bHQ9ZnVuYy5hcHBseSh0aGlzQXJnLGFyZ3MpO3JldHVybiByZXN1bHQ7fWZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpey8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG5sYXN0SW52b2tlVGltZT10aW1lOy8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG50aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHdhaXQpOy8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxucmV0dXJuIGxlYWRpbmc/aW52b2tlRnVuYyh0aW1lKTpyZXN1bHQ7fWZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSl7dmFyIHRpbWVTaW5jZUxhc3RDYWxsPXRpbWUtbGFzdENhbGxUaW1lLHRpbWVTaW5jZUxhc3RJbnZva2U9dGltZS1sYXN0SW52b2tlVGltZSx0aW1lV2FpdGluZz13YWl0LXRpbWVTaW5jZUxhc3RDYWxsO3JldHVybiBtYXhpbmc/bmF0aXZlTWluKHRpbWVXYWl0aW5nLG1heFdhaXQtdGltZVNpbmNlTGFzdEludm9rZSk6dGltZVdhaXRpbmc7fWZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKXt2YXIgdGltZVNpbmNlTGFzdENhbGw9dGltZS1sYXN0Q2FsbFRpbWUsdGltZVNpbmNlTGFzdEludm9rZT10aW1lLWxhc3RJbnZva2VUaW1lOy8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4vLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxucmV0dXJuIGxhc3RDYWxsVGltZT09PXVuZGVmaW5lZHx8dGltZVNpbmNlTGFzdENhbGw+PXdhaXR8fHRpbWVTaW5jZUxhc3RDYWxsPDB8fG1heGluZyYmdGltZVNpbmNlTGFzdEludm9rZT49bWF4V2FpdDt9ZnVuY3Rpb24gdGltZXJFeHBpcmVkKCl7dmFyIHRpbWU9bm93KCk7aWYoc2hvdWxkSW52b2tlKHRpbWUpKXtyZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO30vLyBSZXN0YXJ0IHRoZSB0aW1lci5cbnRpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQscmVtYWluaW5nV2FpdCh0aW1lKSk7fWZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKXt0aW1lcklkPXVuZGVmaW5lZDsvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4vLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbmlmKHRyYWlsaW5nJiZsYXN0QXJncyl7cmV0dXJuIGludm9rZUZ1bmModGltZSk7fWxhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0O31mdW5jdGlvbiBjYW5jZWwoKXtpZih0aW1lcklkIT09dW5kZWZpbmVkKXtjbGVhclRpbWVvdXQodGltZXJJZCk7fWxhc3RJbnZva2VUaW1lPTA7bGFzdEFyZ3M9bGFzdENhbGxUaW1lPWxhc3RUaGlzPXRpbWVySWQ9dW5kZWZpbmVkO31mdW5jdGlvbiBmbHVzaCgpe3JldHVybiB0aW1lcklkPT09dW5kZWZpbmVkP3Jlc3VsdDp0cmFpbGluZ0VkZ2Uobm93KCkpO31mdW5jdGlvbiBkZWJvdW5jZWQoKXt2YXIgdGltZT1ub3coKSxpc0ludm9raW5nPXNob3VsZEludm9rZSh0aW1lKTtsYXN0QXJncz1hcmd1bWVudHM7bGFzdFRoaXM9dGhpcztsYXN0Q2FsbFRpbWU9dGltZTtpZihpc0ludm9raW5nKXtpZih0aW1lcklkPT09dW5kZWZpbmVkKXtyZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTt9aWYobWF4aW5nKXsvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxudGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCx3YWl0KTtyZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO319aWYodGltZXJJZD09PXVuZGVmaW5lZCl7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCx3YWl0KTt9cmV0dXJuIHJlc3VsdDt9ZGVib3VuY2VkLmNhbmNlbD1jYW5jZWw7ZGVib3VuY2VkLmZsdXNoPWZsdXNoO3JldHVybiBkZWJvdW5jZWQ7fS8qKlxuICAgICAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAgICAgICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlZmVyLlxuICAgICAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkge1xuICAgICAgICAgKiAgIGNvbnNvbGUubG9nKHRleHQpO1xuICAgICAgICAgKiB9LCAnZGVmZXJyZWQnKTtcbiAgICAgICAgICogLy8gPT4gTG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBtaWxsaXNlY29uZC5cbiAgICAgICAgICovdmFyIGRlZmVyPWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsYXJncyl7cmV0dXJuIGJhc2VEZWxheShmdW5jLDEsYXJncyk7fSk7LyoqXG4gICAgICAgKiBJbnZva2VzIGBmdW5jYCBhZnRlciBgd2FpdGAgbWlsbGlzZWNvbmRzLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICAgKiBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBfLmRlbGF5KGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICAgKiB9LCAxMDAwLCAnbGF0ZXInKTtcbiAgICAgICAqIC8vID0+IExvZ3MgJ2xhdGVyJyBhZnRlciBvbmUgc2Vjb25kLlxuICAgICAgICovdmFyIGRlbGF5PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsd2FpdCxhcmdzKXtyZXR1cm4gYmFzZURlbGF5KGZ1bmMsdG9OdW1iZXIod2FpdCl8fDAsYXJncyk7fSk7LyoqXG4gICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGFyZ3VtZW50cyByZXZlcnNlZC5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZsaXAgYXJndW1lbnRzIGZvci5cbiAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsaXBwZWQgZnVuY3Rpb24uXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIHZhciBmbGlwcGVkID0gXy5mbGlwKGZ1bmN0aW9uKCkge1xuICAgICAgICogICByZXR1cm4gXy50b0FycmF5KGFyZ3VtZW50cyk7XG4gICAgICAgKiB9KTtcbiAgICAgICAqXG4gICAgICAgKiBmbGlwcGVkKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICAgKiAvLyA9PiBbJ2QnLCAnYycsICdiJywgJ2EnXVxuICAgICAgICovZnVuY3Rpb24gZmxpcChmdW5jKXtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfRkxJUF9GTEFHKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gICAgICAgICAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAgICAgICAgICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICAgICAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gICAgICAgICAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gICAgICAgICAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICAgICAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICAgICAgICAgKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICAgICAgICAgKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgICAgICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAgICAgICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YWx1ZXMob3RoZXIpO1xuICAgICAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgICAgICpcbiAgICAgICAgICogb2JqZWN0LmEgPSAyO1xuICAgICAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgICAgICogLy8gPT4gWzEsIDJdXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICAgICAgICAgKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gICAgICAgICAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gICAgICAgICAqL2Z1bmN0aW9uIG1lbW9pemUoZnVuYyxyZXNvbHZlcil7aWYodHlwZW9mIGZ1bmMhPT0nZnVuY3Rpb24nfHxyZXNvbHZlciE9bnVsbCYmdHlwZW9mIHJlc29sdmVyIT09J2Z1bmN0aW9uJyl7dGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO312YXIgbWVtb2l6ZWQ9ZnVuY3Rpb24gbWVtb2l6ZWQoKXt2YXIgYXJncz1hcmd1bWVudHMsa2V5PXJlc29sdmVyP3Jlc29sdmVyLmFwcGx5KHRoaXMsYXJncyk6YXJnc1swXSxjYWNoZT1tZW1vaXplZC5jYWNoZTtpZihjYWNoZS5oYXMoa2V5KSl7cmV0dXJuIGNhY2hlLmdldChrZXkpO312YXIgcmVzdWx0PWZ1bmMuYXBwbHkodGhpcyxhcmdzKTttZW1vaXplZC5jYWNoZT1jYWNoZS5zZXQoa2V5LHJlc3VsdCl8fGNhY2hlO3JldHVybiByZXN1bHQ7fTttZW1vaXplZC5jYWNoZT1uZXcobWVtb2l6ZS5DYWNoZXx8TWFwQ2FjaGUpKCk7cmV0dXJuIG1lbW9pemVkO30vLyBFeHBvc2UgYE1hcENhY2hlYC5cbm1lbW9pemUuQ2FjaGU9TWFwQ2FjaGU7LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG5lZ2F0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJlZGljYXRlIGBmdW5jYC4gVGhlXG4gICAgICAgICAqIGBmdW5jYCBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZVxuICAgICAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgdG8gbmVnYXRlLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBuZWdhdGVkIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBpc0V2ZW4obikge1xuICAgICAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZmlsdGVyKFsxLCAyLCAzLCA0LCA1LCA2XSwgXy5uZWdhdGUoaXNFdmVuKSk7XG4gICAgICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAgICAgKi9mdW5jdGlvbiBuZWdhdGUocHJlZGljYXRlKXtpZih0eXBlb2YgcHJlZGljYXRlIT09J2Z1bmN0aW9uJyl7dGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO31yZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7c3dpdGNoKGFyZ3MubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMpO2Nhc2UgMTpyZXR1cm4hcHJlZGljYXRlLmNhbGwodGhpcyxhcmdzWzBdKTtjYXNlIDI6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSxhcmdzWzFdKTtjYXNlIDM6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO31yZXR1cm4hcHJlZGljYXRlLmFwcGx5KHRoaXMsYXJncyk7fTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gaW52b2tpbmcgYGZ1bmNgIG9uY2UuIFJlcGVhdCBjYWxsc1xuICAgICAgICAgKiB0byB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbi4gVGhlIGBmdW5jYCBpc1xuICAgICAgICAgKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIGluaXRpYWxpemUgPSBfLm9uY2UoY3JlYXRlQXBwbGljYXRpb24pO1xuICAgICAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgICAgICogLy8gPT4gYGNyZWF0ZUFwcGxpY2F0aW9uYCBpcyBpbnZva2VkIG9uY2VcbiAgICAgICAgICovZnVuY3Rpb24gb25jZShmdW5jKXtyZXR1cm4gYmVmb3JlKDIsZnVuYyk7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudHMgdHJhbnNmb3JtZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3RyYW5zZm9ybXM9W18uaWRlbnRpdHldXVxuICAgICAgICAgKiAgVGhlIGFyZ3VtZW50IHRyYW5zZm9ybXMuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBkb3VibGVkKG4pIHtcbiAgICAgICAgICogICByZXR1cm4gbiAqIDI7XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIGZ1bmMgPSBfLm92ZXJBcmdzKGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgICogICByZXR1cm4gW3gsIHldO1xuICAgICAgICAgKiB9LCBbc3F1YXJlLCBkb3VibGVkXSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmMoOSwgMyk7XG4gICAgICAgICAqIC8vID0+IFs4MSwgNl1cbiAgICAgICAgICpcbiAgICAgICAgICogZnVuYygxMCwgNSk7XG4gICAgICAgICAqIC8vID0+IFsxMDAsIDEwXVxuICAgICAgICAgKi92YXIgb3ZlckFyZ3M9Y2FzdFJlc3QoZnVuY3Rpb24oZnVuYyx0cmFuc2Zvcm1zKXt0cmFuc2Zvcm1zPXRyYW5zZm9ybXMubGVuZ3RoPT0xJiZpc0FycmF5KHRyYW5zZm9ybXNbMF0pP2FycmF5TWFwKHRyYW5zZm9ybXNbMF0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTphcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLDEpLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7dmFyIGZ1bmNzTGVuZ3RoPXRyYW5zZm9ybXMubGVuZ3RoO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1pbihhcmdzLmxlbmd0aCxmdW5jc0xlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe2FyZ3NbaW5kZXhdPXRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcyxhcmdzW2luZGV4XSk7fXJldHVybiBhcHBseShmdW5jLHRoaXMsYXJncyk7fSk7fSk7LyoqXG4gICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZVxuICAgICAgICogYXJndW1lbnRzIGl0IHJlY2VpdmVzLiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmJpbmRgIGV4Y2VwdCBpdCBkb2VzICoqbm90KipcbiAgICAgICAqIGFsdGVyIHRoZSBgdGhpc2AgYmluZGluZy5cbiAgICAgICAqXG4gICAgICAgKiBUaGUgYF8ucGFydGlhbC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgICAqXG4gICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gICAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDAuMi4wXG4gICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkge1xuICAgICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAgICogfVxuICAgICAgICpcbiAgICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTtcbiAgICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJ1xuICAgICAgICpcbiAgICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbChncmVldCwgXywgJ2ZyZWQnKTtcbiAgICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAgICovdmFyIHBhcnRpYWw9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxwYXJ0aWFscyl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKHBhcnRpYWwpKTtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfUEFSVElBTF9GTEFHLHVuZGVmaW5lZCxwYXJ0aWFscyxob2xkZXJzKTt9KTsvKipcbiAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucGFydGlhbGAgZXhjZXB0IHRoYXQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzXG4gICAgICAgKiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgICAqXG4gICAgICAgKiBUaGUgYF8ucGFydGlhbFJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAgICpcbiAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICAgKiB9XG4gICAgICAgKlxuICAgICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnZnJlZCcpO1xuICAgICAgICogZ3JlZXRGcmVkKCdoaScpO1xuICAgICAgICogLy8gPT4gJ2hpIGZyZWQnXG4gICAgICAgKlxuICAgICAgICogLy8gUGFydGlhbGx5IGFwcGxpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICAgKiB2YXIgc2F5SGVsbG9UbyA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnaGVsbG8nLCBfKTtcbiAgICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJ1xuICAgICAgICovdmFyIHBhcnRpYWxSaWdodD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHBhcnRpYWxzKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIocGFydGlhbFJpZ2h0KSk7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyx1bmRlZmluZWQscGFydGlhbHMsaG9sZGVycyk7fSk7LyoqXG4gICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGFyZ3VtZW50cyBhcnJhbmdlZCBhY2NvcmRpbmdcbiAgICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAgICAgICAqIHByb3ZpZGVkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBzZWNvbmQgaW5kZXggaXNcbiAgICAgICAqIHByb3ZpZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGFuZCBzbyBvbi5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlYXJyYW5nZSBhcmd1bWVudHMgZm9yLlxuICAgICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy5cbiAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgcmVhcmdlZCA9IF8ucmVhcmcoZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAgICogfSwgWzIsIDAsIDFdKTtcbiAgICAgICAqXG4gICAgICAgKiByZWFyZ2VkKCdiJywgJ2MnLCAnYScpXG4gICAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgICAqL3ZhciByZWFyZz1mbGF0UmVzdChmdW5jdGlvbihmdW5jLGluZGV4ZXMpe3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9SRUFSR19GTEFHLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGluZGV4ZXMpO30pOy8qKlxuICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgZnJvbSBgc3RhcnRgIGFuZCBiZXlvbmQgcHJvdmlkZWQgYXNcbiAgICAgICAqIGFuIGFycmF5LlxuICAgICAgICpcbiAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgICAqIFtyZXN0IHBhcmFtZXRlcl0oaHR0cHM6Ly9tZG4uaW8vcmVzdF9wYXJhbWV0ZXJzKS5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogdmFyIHNheSA9IF8ucmVzdChmdW5jdGlvbih3aGF0LCBuYW1lcykge1xuICAgICAgICogICByZXR1cm4gd2hhdCArICcgJyArIF8uaW5pdGlhbChuYW1lcykuam9pbignLCAnKSArXG4gICAgICAgKiAgICAgKF8uc2l6ZShuYW1lcykgPiAxID8gJywgJiAnIDogJycpICsgXy5sYXN0KG5hbWVzKTtcbiAgICAgICAqIH0pO1xuICAgICAgICpcbiAgICAgICAqIHNheSgnaGVsbG8nLCAnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcycpO1xuICAgICAgICogLy8gPT4gJ2hlbGxvIGZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAgICovZnVuY3Rpb24gcmVzdChmdW5jLHN0YXJ0KXtpZih0eXBlb2YgZnVuYyE9PSdmdW5jdGlvbicpe3Rocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt9c3RhcnQ9c3RhcnQ9PT11bmRlZmluZWQ/c3RhcnQ6dG9JbnRlZ2VyKHN0YXJ0KTtyZXR1cm4gYmFzZVJlc3QoZnVuYyxzdGFydCk7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGVcbiAgICAgICAgICogY3JlYXRlIGZ1bmN0aW9uIGFuZCBhbiBhcnJheSBvZiBhcmd1bWVudHMgbXVjaCBsaWtlXG4gICAgICAgICAqIFtgRnVuY3Rpb24jYXBwbHlgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KS5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIHRoZVxuICAgICAgICAgKiBbc3ByZWFkIG9wZXJhdG9yXShodHRwczovL21kbi5pby9zcHJlYWRfb3BlcmF0b3IpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc3ByZWFkLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIHNheSA9IF8uc3ByZWFkKGZ1bmN0aW9uKHdobywgd2hhdCkge1xuICAgICAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pO1xuICAgICAgICAgKiAvLyA9PiAnZnJlZCBzYXlzIGhlbGxvJ1xuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgbnVtYmVycyA9IFByb21pc2UuYWxsKFtcbiAgICAgICAgICogICBQcm9taXNlLnJlc29sdmUoNDApLFxuICAgICAgICAgKiAgIFByb21pc2UucmVzb2x2ZSgzNilcbiAgICAgICAgICogXSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIG51bWJlcnMudGhlbihfLnNwcmVhZChmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgICAqICAgcmV0dXJuIHggKyB5O1xuICAgICAgICAgKiB9KSk7XG4gICAgICAgICAqIC8vID0+IGEgUHJvbWlzZSBvZiA3NlxuICAgICAgICAgKi9mdW5jdGlvbiBzcHJlYWQoZnVuYyxzdGFydCl7aWYodHlwZW9mIGZ1bmMhPT0nZnVuY3Rpb24nKXt0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7fXN0YXJ0PXN0YXJ0PT1udWxsPzA6bmF0aXZlTWF4KHRvSW50ZWdlcihzdGFydCksMCk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciBhcnJheT1hcmdzW3N0YXJ0XSxvdGhlckFyZ3M9Y2FzdFNsaWNlKGFyZ3MsMCxzdGFydCk7aWYoYXJyYXkpe2FycmF5UHVzaChvdGhlckFyZ3MsYXJyYXkpO31yZXR1cm4gYXBwbHkoZnVuYyx0aGlzLG90aGVyQXJncyk7fSk7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gICAgICAgICAqIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgXG4gICAgICAgICAqIG1ldGhvZCB0byBjYW5jZWwgZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG9cbiAgICAgICAgICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gICAgICAgICAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGBcbiAgICAgICAgICogdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZVxuICAgICAgICAgKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gICAgICAgICAqIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRocm90dGxlZCBmdW5jdGlvblxuICAgICAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLnRocm90dGxlYCBhbmQgYF8uZGVib3VuY2VgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXVxuICAgICAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gICAgICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gICAgICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwgeyAndHJhaWxpbmcnOiBmYWxzZSB9KTtcbiAgICAgICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHRocm90dGxlZCk7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgdGhyb3R0bGVkIGludm9jYXRpb24uXG4gICAgICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRocm90dGxlZC5jYW5jZWwpO1xuICAgICAgICAgKi9mdW5jdGlvbiB0aHJvdHRsZShmdW5jLHdhaXQsb3B0aW9ucyl7dmFyIGxlYWRpbmc9dHJ1ZSx0cmFpbGluZz10cnVlO2lmKHR5cGVvZiBmdW5jIT09J2Z1bmN0aW9uJyl7dGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO31pZihpc09iamVjdChvcHRpb25zKSl7bGVhZGluZz0nbGVhZGluZydpbiBvcHRpb25zPyEhb3B0aW9ucy5sZWFkaW5nOmxlYWRpbmc7dHJhaWxpbmc9J3RyYWlsaW5nJ2luIG9wdGlvbnM/ISFvcHRpb25zLnRyYWlsaW5nOnRyYWlsaW5nO31yZXR1cm4gZGVib3VuY2UoZnVuYyx3YWl0LHtsZWFkaW5nOmxlYWRpbmcsbWF4V2FpdDp3YWl0LHRyYWlsaW5nOnRyYWlsaW5nfSk7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHVwIHRvIG9uZSBhcmd1bWVudCwgaWdub3JpbmcgYW55XG4gICAgICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy51bmFyeShwYXJzZUludCkpO1xuICAgICAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICAgICAqL2Z1bmN0aW9uIHVuYXJ5KGZ1bmMpe3JldHVybiBhcnkoZnVuYywxKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIGB2YWx1ZWAgdG8gYHdyYXBwZXJgIGFzIGl0cyBmaXJzdFxuICAgICAgICAgKiBhcmd1bWVudC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWRcbiAgICAgICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGB3cmFwcGVyYC4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgICAgICogYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFt3cmFwcGVyPWlkZW50aXR5XSBUaGUgd3JhcHBlciBmdW5jdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7XG4gICAgICAgICAqICAgcmV0dXJuICc8cD4nICsgZnVuYyh0ZXh0KSArICc8L3A+JztcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIHAoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICAgICAqIC8vID0+ICc8cD5mcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXM8L3A+J1xuICAgICAgICAgKi9mdW5jdGlvbiB3cmFwKHZhbHVlLHdyYXBwZXIpe3JldHVybiBwYXJ0aWFsKGNhc3RGdW5jdGlvbih3cmFwcGVyKSx2YWx1ZSk7fS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqXG4gICAgICAgICAqIENhc3RzIGB2YWx1ZWAgYXMgYW4gYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgYXJyYXkuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uY2FzdEFycmF5KDEpO1xuICAgICAgICAgKiAvLyA9PiBbMV1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5jYXN0QXJyYXkoeyAnYSc6IDEgfSk7XG4gICAgICAgICAqIC8vID0+IFt7ICdhJzogMSB9XVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmNhc3RBcnJheSgnYWJjJyk7XG4gICAgICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgICAgICpcbiAgICAgICAgICogXy5jYXN0QXJyYXkobnVsbCk7XG4gICAgICAgICAqIC8vID0+IFtudWxsXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmNhc3RBcnJheSh1bmRlZmluZWQpO1xuICAgICAgICAgKiAvLyA9PiBbdW5kZWZpbmVkXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmNhc3RBcnJheSgpO1xuICAgICAgICAgKiAvLyA9PiBbXVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICAgICAqIGNvbnNvbGUubG9nKF8uY2FzdEFycmF5KGFycmF5KSA9PT0gYXJyYXkpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqL2Z1bmN0aW9uIGNhc3RBcnJheSgpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXtyZXR1cm5bXTt9dmFyIHZhbHVlPWFyZ3VtZW50c1swXTtyZXR1cm4gaXNBcnJheSh2YWx1ZSk/dmFsdWU6W3ZhbHVlXTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGB2YWx1ZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAgICAgKiBbc3RydWN0dXJlZCBjbG9uZSBhbGdvcml0aG1dKGh0dHBzOi8vbWRuLmlvL1N0cnVjdHVyZWRfY2xvbmVfYWxnb3JpdGhtKVxuICAgICAgICAgKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gICAgICAgICAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICAgICAgICAgKiBhcnJheXMuIFRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYXJlIGNsb25lZFxuICAgICAgICAgKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gICAgICAgICAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgc2hhbGxvdyA9IF8uY2xvbmUob2JqZWN0cyk7XG4gICAgICAgICAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqL2Z1bmN0aW9uIGNsb25lKHZhbHVlKXtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX1NZTUJPTFNfRkxBRyk7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZS4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gICAgICAgICAqIGNsb25pbmcgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoXG4gICAgICAgICAqIHVwIHRvIGZvdXIgYXJndW1lbnRzOyAodmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIHN0YWNrXSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aFxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKHZhbHVlKSB7XG4gICAgICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZShmYWxzZSk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBlbCA9IF8uY2xvbmVXaXRoKGRvY3VtZW50LmJvZHksIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgICAgICogLy8gPT4gJ0JPRFknXG4gICAgICAgICAqIGNvbnNvbGUubG9nKGVsLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgICAgICogLy8gPT4gMFxuICAgICAgICAgKi9mdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09PSdmdW5jdGlvbic/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcik7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgICAgICogQHNlZSBfLmNsb25lXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgZGVlcCA9IF8uY2xvbmVEZWVwKG9iamVjdHMpO1xuICAgICAgICAgKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKXtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcpO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZVdpdGhgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAgICAgKiBAc2VlIF8uY2xvbmVXaXRoXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgICAgICogICBpZiAoXy5pc0VsZW1lbnQodmFsdWUpKSB7XG4gICAgICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgKiAgIH1cbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgZWwgPSBfLmNsb25lRGVlcFdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICAgICAqXG4gICAgICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICogY29uc29sZS5sb2coZWwubm9kZU5hbWUpO1xuICAgICAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAgICAgKiAvLyA9PiAyMFxuICAgICAgICAgKi9mdW5jdGlvbiBjbG9uZURlZXBXaXRoKHZhbHVlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PT0nZnVuY3Rpb24nP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfREVFUF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21pemVyKTt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgb2JqZWN0YCBjb25mb3JtcyB0byBgc291cmNlYCBieSBpbnZva2luZyB0aGUgcHJlZGljYXRlXG4gICAgICAgICAqIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLmNvbmZvcm1zYCB3aGVuIGBzb3VyY2VgIGlzXG4gICAgICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBjb25mb3JtcywgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5jb25mb3Jtc1RvKG9iamVjdCwgeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAyOyB9IH0pO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi9mdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCxzb3VyY2Upe3JldHVybiBzb3VyY2U9PW51bGx8fGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2Usa2V5cyhzb3VyY2UpKTt9LyoqXG4gICAgICAgICAqIFBlcmZvcm1zIGFcbiAgICAgICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgICAgICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmVxKCdhJywgJ2EnKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmVxKE5hTiwgTmFOKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKi9mdW5jdGlvbiBlcSh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPT09b3RoZXJ8fHZhbHVlIT09dmFsdWUmJm90aGVyIT09b3RoZXI7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBzZWUgXy5sdFxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmd0KDMsIDEpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZ3QoMywgMyk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZ3QoMSwgMyk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqL3ZhciBndD1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgb3RoZXJgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgICAgICogIGBvdGhlcmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQHNlZSBfLmx0ZVxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmd0ZSgzLCAxKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmd0ZSgzLCAzKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmd0ZSgxLCAzKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovdmFyIGd0ZT1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU+PW90aGVyO30pOy8qKlxuICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICpcbiAgICAgICAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgKi92YXIgaXNBcmd1bWVudHM9YmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50czt9KCkpP2Jhc2VJc0FyZ3VtZW50czpmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsJ2NhbGxlZScpJiYhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwnY2FsbGVlJyk7fTsvKipcbiAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgKlxuICAgICAgICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAqXG4gICAgICAgKiBfLmlzQXJyYXkoJ2FiYycpO1xuICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAqXG4gICAgICAgKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgKi92YXIgaXNBcnJheT1BcnJheS5pc0FycmF5Oy8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheUJ1ZmZlcmAgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXlCdWZmZXIoMikpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXkoMikpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi92YXIgaXNBcnJheUJ1ZmZlcj1ub2RlSXNBcnJheUJ1ZmZlcj9iYXNlVW5hcnkobm9kZUlzQXJyYXlCdWZmZXIpOmJhc2VJc0FycmF5QnVmZmVyOy8qKlxuICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICAgICAgICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICAgICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAqXG4gICAgICAgKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICpcbiAgICAgICAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICpcbiAgICAgICAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgKi9mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSl7cmV0dXJuIHZhbHVlIT1udWxsJiZpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpJiYhaXNGdW5jdGlvbih2YWx1ZSk7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gICAgICAgICAqIGlzIGFuIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICAgICAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi9mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzQXJyYXlMaWtlKHZhbHVlKTt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBib29sZWFuIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJvb2xlYW4sIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0Jvb2xlYW4oZmFsc2UpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNCb29sZWFuKG51bGwpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi9mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpe3JldHVybiB2YWx1ZT09PXRydWV8fHZhbHVlPT09ZmFsc2V8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1ib29sVGFnO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMy4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi92YXIgaXNCdWZmZXI9bmF0aXZlSXNCdWZmZXJ8fHN0dWJGYWxzZTsvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBEYXRlYCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzRGF0ZSgnTW9uIEFwcmlsIDIzIDIwMTInKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovdmFyIGlzRGF0ZT1ub2RlSXNEYXRlP2Jhc2VVbmFyeShub2RlSXNEYXRlKTpiYXNlSXNEYXRlOy8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBET00gZWxlbWVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgRE9NIGVsZW1lbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0VsZW1lbnQoZG9jdW1lbnQuYm9keSk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0VsZW1lbnQoJzxib2R5PicpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi9mdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZ2YWx1ZS5ub2RlVHlwZT09PTEmJiFpc1BsYWluT2JqZWN0KHZhbHVlKTt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZFxuICAgICAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3JcbiAgICAgICAgICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICAgICAgICAgKiBTaW1pbGFybHksIG1hcHMgYW5kIHNldHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYHNpemVgIG9mIGAwYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNFbXB0eShudWxsKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzRW1wdHkodHJ1ZSk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0VtcHR5KDEpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqL2Z1bmN0aW9uIGlzRW1wdHkodmFsdWUpe2lmKHZhbHVlPT1udWxsKXtyZXR1cm4gdHJ1ZTt9aWYoaXNBcnJheUxpa2UodmFsdWUpJiYoaXNBcnJheSh2YWx1ZSl8fHR5cGVvZiB2YWx1ZT09PSdzdHJpbmcnfHx0eXBlb2YgdmFsdWUuc3BsaWNlPT09J2Z1bmN0aW9uJ3x8aXNCdWZmZXIodmFsdWUpfHxpc1R5cGVkQXJyYXkodmFsdWUpfHxpc0FyZ3VtZW50cyh2YWx1ZSkpKXtyZXR1cm4hdmFsdWUubGVuZ3RoO312YXIgdGFnPWdldFRhZyh2YWx1ZSk7aWYodGFnPT1tYXBUYWd8fHRhZz09c2V0VGFnKXtyZXR1cm4hdmFsdWUuc2l6ZTt9aWYoaXNQcm90b3R5cGUodmFsdWUpKXtyZXR1cm4hYmFzZUtleXModmFsdWUpLmxlbmd0aDt9Zm9yKHZhciBrZXkgaW4gdmFsdWUpe2lmKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsa2V5KSl7cmV0dXJuIGZhbHNlO319cmV0dXJuIHRydWU7fS8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlXG4gICAgICAgICAqIGVxdWl2YWxlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyBjb21wYXJpbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucyxcbiAgICAgICAgICogZGF0ZSBvYmplY3RzLCBlcnJvciBvYmplY3RzLCBtYXBzLCBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLFxuICAgICAgICAgKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICAgICAgICAgKiBieSB0aGVpciBvd24sIG5vdCBpbmhlcml0ZWQsIGVudW1lcmFibGUgcHJvcGVydGllcy4gRnVuY3Rpb25zIGFuZCBET01cbiAgICAgICAgICogbm9kZXMgYXJlIGNvbXBhcmVkIGJ5IHN0cmljdCBlcXVhbGl0eSwgaS5lLiBgPT09YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNFcXVhbChvYmplY3QsIG90aGVyKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBvYmplY3QgPT09IG90aGVyO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi9mdW5jdGlvbiBpc0VxdWFsKHZhbHVlLG90aGVyKXtyZXR1cm4gYmFzZUlzRXF1YWwodmFsdWUsb3RoZXIpO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0VxdWFsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgICAgICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCB1cCB0b1xuICAgICAgICAgKiBzaXggYXJndW1lbnRzOiAob2JqVmFsdWUsIG90aFZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2tdKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgICAgICogICByZXR1cm4gL15oKD86aXxlbGxvKSQvLnRlc3QodmFsdWUpO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlKSB7XG4gICAgICAgICAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcob3RoVmFsdWUpKSB7XG4gICAgICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICogICB9XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIGFycmF5ID0gWydoZWxsbycsICdnb29kYnllJ107XG4gICAgICAgICAqIHZhciBvdGhlciA9IFsnaGknLCAnZ29vZGJ5ZSddO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzRXF1YWxXaXRoKGFycmF5LCBvdGhlciwgY3VzdG9taXplcik7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICovZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsb3RoZXIsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09PSdmdW5jdGlvbic/Y3VzdG9taXplcjp1bmRlZmluZWQ7dmFyIHJlc3VsdD1jdXN0b21pemVyP2N1c3RvbWl6ZXIodmFsdWUsb3RoZXIpOnVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0PT09dW5kZWZpbmVkP2Jhc2VJc0VxdWFsKHZhbHVlLG90aGVyLHVuZGVmaW5lZCxjdXN0b21pemVyKTohIXJlc3VsdDt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIGBFdmFsRXJyb3JgLCBgUmFuZ2VFcnJvcmAsIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAgICAgICAqIGBTeW50YXhFcnJvcmAsIGBUeXBlRXJyb3JgLCBvciBgVVJJRXJyb3JgIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGVycm9yIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzRXJyb3IobmV3IEVycm9yKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzRXJyb3IoRXJyb3IpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi9mdW5jdGlvbiBpc0Vycm9yKHZhbHVlKXtpZighaXNPYmplY3RMaWtlKHZhbHVlKSl7cmV0dXJuIGZhbHNlO312YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PWVycm9yVGFnfHx0YWc9PWRvbUV4Y1RhZ3x8dHlwZW9mIHZhbHVlLm1lc3NhZ2U9PT0nc3RyaW5nJyYmdHlwZW9mIHZhbHVlLm5hbWU9PT0nc3RyaW5nJyYmIWlzUGxhaW5PYmplY3QodmFsdWUpO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICAgICAqIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzRmluaXRlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZmluaXRlIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzRmluaXRlKDMpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNGaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNGaW5pdGUoJzMnKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PT0nbnVtYmVyJyYmbmF0aXZlSXNGaW5pdGUodmFsdWUpO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzRnVuY3Rpb24oXyk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSl7aWYoIWlzT2JqZWN0KHZhbHVlKSl7cmV0dXJuIGZhbHNlO30vLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3Jcbi8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxudmFyIHRhZz1iYXNlR2V0VGFnKHZhbHVlKTtyZXR1cm4gdGFnPT1mdW5jVGFnfHx0YWc9PWdlblRhZ3x8dGFnPT1hc3luY1RhZ3x8dGFnPT1wcm94eVRhZzt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAgICAgKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0ludGVnZXIoMyk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0ludGVnZXIoJzMnKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT09J251bWJlcicmJnZhbHVlPT10b0ludGVnZXIodmFsdWUpO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNMZW5ndGgoMyk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNMZW5ndGgoJzMnKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PT0nbnVtYmVyJyYmdmFsdWU+LTEmJnZhbHVlJTE9PTAmJnZhbHVlPD1NQVhfU0FGRV9JTlRFR0VSO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gICAgICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAgICAgICAgICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNPYmplY3Qoe30pO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc09iamVjdChudWxsKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpe3ZhciB0eXBlPXR5cGVvZiB2YWx1ZT09PSd1bmRlZmluZWQnPyd1bmRlZmluZWQnOl90eXBlb2YodmFsdWUpO3JldHVybiB2YWx1ZSE9bnVsbCYmKHR5cGU9PSdvYmplY3QnfHx0eXBlPT0nZnVuY3Rpb24nKTt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICAgICAgICAgKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKXtyZXR1cm4gdmFsdWUhPW51bGwmJih0eXBlb2YgdmFsdWU9PT0ndW5kZWZpbmVkJz8ndW5kZWZpbmVkJzpfdHlwZW9mKHZhbHVlKSk9PT0nb2JqZWN0Jzt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMy4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzTWFwKG5ldyBNYXApO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi92YXIgaXNNYXA9bm9kZUlzTWFwP2Jhc2VVbmFyeShub2RlSXNNYXApOmJhc2VJc01hcDsvKipcbiAgICAgICAgICogUGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGBvYmplY3RgIGFuZCBgc291cmNlYCB0b1xuICAgICAgICAgKiBkZXRlcm1pbmUgaWYgYG9iamVjdGAgY29udGFpbnMgZXF1aXZhbGVudCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLm1hdGNoZXNgIHdoZW4gYHNvdXJjZWAgaXNcbiAgICAgICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICAgICAqIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlIGBfLmlzRXF1YWxgXG4gICAgICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDIgfSk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDEgfSk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqL2Z1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdD09PXNvdXJjZXx8YmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxnZXRNYXRjaERhdGEoc291cmNlKSk7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzTWF0Y2hgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIGZpdmVcbiAgICAgICAgICogYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBpbmRleHxrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBpc0dyZWV0aW5nKHZhbHVlKSB7XG4gICAgICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKHNyY1ZhbHVlKSkge1xuICAgICAgICAgKiAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdncmVldGluZyc6ICdoZWxsbycgfTtcbiAgICAgICAgICogdmFyIHNvdXJjZSA9IHsgJ2dyZWV0aW5nJzogJ2hpJyB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKi9mdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3Qsc291cmNlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PT0nZnVuY3Rpb24nP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLGdldE1hdGNoRGF0YShzb3VyY2UpLGN1c3RvbWl6ZXIpO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYE5hTmAuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAgICAgKiBbYE51bWJlci5pc05hTmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc05hTikgYW5kIGlzIG5vdCB0aGUgc2FtZSBhc1xuICAgICAgICAgKiBnbG9iYWwgW2Bpc05hTmBdKGh0dHBzOi8vbWRuLmlvL2lzTmFOKSB3aGljaCByZXR1cm5zIGB0cnVlYCBmb3JcbiAgICAgICAgICogYHVuZGVmaW5lZGAgYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc05hTihOYU4pO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNOYU4obmV3IE51bWJlcihOYU4pKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBpc05hTih1bmRlZmluZWQpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaXNOYU4odmFsdWUpey8vIEFuIGBOYU5gIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuXG4vLyBQZXJmb3JtIHRoZSBgdG9TdHJpbmdUYWdgIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWVcbi8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbnJldHVybiBpc051bWJlcih2YWx1ZSkmJnZhbHVlIT0rdmFsdWU7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByaXN0aW5lIG5hdGl2ZSBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZVxuICAgICAgICAgKiBvZiB0aGUgY29yZS1qcyBwYWNrYWdlIGJlY2F1c2UgY29yZS1qcyBjaXJjdW12ZW50cyB0aGlzIGtpbmQgb2YgZGV0ZWN0aW9uLlxuICAgICAgICAgKiBEZXNwaXRlIG11bHRpcGxlIHJlcXVlc3RzLCB0aGUgY29yZS1qcyBtYWludGFpbmVyIGhhcyBtYWRlIGl0IGNsZWFyOiBhbnlcbiAgICAgICAgICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0XG4gICAgICAgICAqIHdpdGggbGl0dGxlIGNob2ljZSBidXQgdG8gdGhyb3cgYW4gZXJyb3IuIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBhZmZlY3RzXG4gICAgICAgICAqIHBhY2thZ2VzLCBsaWtlIFtiYWJlbC1wb2x5ZmlsbF0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmFiZWwtcG9seWZpbGwpLFxuICAgICAgICAgKiB3aGljaCByZWx5IG9uIGNvcmUtanMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAgICAgICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc05hdGl2ZShBcnJheS5wcm90b3R5cGUucHVzaCk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc05hdGl2ZShfKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpe2lmKGlzTWFza2FibGUodmFsdWUpKXt0aHJvdyBuZXcgRXJyb3IoQ09SRV9FUlJPUl9URVhUKTt9cmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc051bGwobnVsbCk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc051bGwodm9pZCAwKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaXNOdWxsKHZhbHVlKXtyZXR1cm4gdmFsdWU9PT1udWxsO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzTmlsKG51bGwpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNOaWwodm9pZCAwKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzTmlsKE5hTik7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqL2Z1bmN0aW9uIGlzTmlsKHZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGw7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE51bWJlcmAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlXG4gICAgICAgICAqIGNsYXNzaWZpZWQgYXMgbnVtYmVycywgdXNlIHRoZSBgXy5pc0Zpbml0ZWAgbWV0aG9kLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc051bWJlcigzKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNOdW1iZXIoSW5maW5pdHkpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNOdW1iZXIoJzMnKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PT0nbnVtYmVyJ3x8aXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PW51bWJlclRhZzt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAgICAgICAgICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjguMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqL2Z1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpe2lmKCFpc09iamVjdExpa2UodmFsdWUpfHxiYXNlR2V0VGFnKHZhbHVlKSE9b2JqZWN0VGFnKXtyZXR1cm4gZmFsc2U7fXZhciBwcm90bz1nZXRQcm90b3R5cGUodmFsdWUpO2lmKHByb3RvPT09bnVsbCl7cmV0dXJuIHRydWU7fXZhciBDdG9yPWhhc093blByb3BlcnR5LmNhbGwocHJvdG8sJ2NvbnN0cnVjdG9yJykmJnByb3RvLmNvbnN0cnVjdG9yO3JldHVybiB0eXBlb2YgQ3Rvcj09PSdmdW5jdGlvbicmJkN0b3IgaW5zdGFuY2VvZiBDdG9yJiZmdW5jVG9TdHJpbmcuY2FsbChDdG9yKT09b2JqZWN0Q3RvclN0cmluZzt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgUmVnRXhwYCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzUmVnRXhwKC9hYmMvKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzUmVnRXhwKCcvYWJjLycpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi92YXIgaXNSZWdFeHA9bm9kZUlzUmVnRXhwP2Jhc2VVbmFyeShub2RlSXNSZWdFeHApOmJhc2VJc1JlZ0V4cDsvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIuIEFuIGludGVnZXIgaXMgc2FmZSBpZiBpdCdzIGFuIElFRUUtNzU0XG4gICAgICAgICAqIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIHdoaWNoIGlzbid0IHRoZSByZXN1bHQgb2YgYSByb3VuZGVkIHVuc2FmZSBpbnRlZ2VyLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgICAgICogW2BOdW1iZXIuaXNTYWZlSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc1NhZmVJbnRlZ2VyKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNTYWZlSW50ZWdlcigzKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzU2FmZUludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNTYWZlSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNTYWZlSW50ZWdlcignMycpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi9mdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSYmdmFsdWU+PS1NQVhfU0FGRV9JTlRFR0VSJiZ2YWx1ZTw9TUFYX1NBRkVfSU5URUdFUjt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMy4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzU2V0KG5ldyBTZXQpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNTZXQobmV3IFdlYWtTZXQpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi92YXIgaXNTZXQ9bm9kZUlzU2V0P2Jhc2VVbmFyeShub2RlSXNTZXQpOmJhc2VJc1NldDsvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzU3RyaW5nKDEpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi9mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09PSdzdHJpbmcnfHwhaXNBcnJheSh2YWx1ZSkmJmlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1zdHJpbmdUYWc7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpe3JldHVybih0eXBlb2YgdmFsdWU9PT0ndW5kZWZpbmVkJz8ndW5kZWZpbmVkJzpfdHlwZW9mKHZhbHVlKSk9PT0nc3ltYm9sJ3x8aXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PXN5bWJvbFRhZzt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovdmFyIGlzVHlwZWRBcnJheT1ub2RlSXNUeXBlZEFycmF5P2Jhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KTpiYXNlSXNUeXBlZEFycmF5Oy8qKlxuICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICpcbiAgICAgICAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICovZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpe3JldHVybiB2YWx1ZT09PXVuZGVmaW5lZDt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgV2Vha01hcGAgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmlzV2Vha01hcChuZXcgV2Vha01hcCk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc1dlYWtNYXAobmV3IE1hcCk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqL2Z1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmdldFRhZyh2YWx1ZSk9PXdlYWtNYXBUYWc7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtTZXRgIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pc1dlYWtTZXQobmV3IFdlYWtTZXQpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaXNXZWFrU2V0KG5ldyBTZXQpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi9mdW5jdGlvbiBpc1dlYWtTZXQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09d2Vha1NldFRhZzt9LyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQHNlZSBfLmd0XG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubHQoMSwgMyk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5sdCgzLCAzKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICpcbiAgICAgICAgICogXy5sdCgzLCAxKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovdmFyIGx0PWNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUx0KTsvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuOS4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0b1xuICAgICAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAc2VlIF8uZ3RlXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubHRlKDEsIDMpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubHRlKDMsIDMpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubHRlKDMsIDEpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi92YXIgbHRlPWNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZTw9b3RoZXI7fSk7LyoqXG4gICAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGFycmF5LlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIF8udG9BcnJheSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAgICogLy8gPT4gWzEsIDJdXG4gICAgICAgKlxuICAgICAgICogXy50b0FycmF5KCdhYmMnKTtcbiAgICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAgICpcbiAgICAgICAqIF8udG9BcnJheSgxKTtcbiAgICAgICAqIC8vID0+IFtdXG4gICAgICAgKlxuICAgICAgICogXy50b0FycmF5KG51bGwpO1xuICAgICAgICogLy8gPT4gW11cbiAgICAgICAqL2Z1bmN0aW9uIHRvQXJyYXkodmFsdWUpe2lmKCF2YWx1ZSl7cmV0dXJuW107fWlmKGlzQXJyYXlMaWtlKHZhbHVlKSl7cmV0dXJuIGlzU3RyaW5nKHZhbHVlKT9zdHJpbmdUb0FycmF5KHZhbHVlKTpjb3B5QXJyYXkodmFsdWUpO31pZihzeW1JdGVyYXRvciYmdmFsdWVbc3ltSXRlcmF0b3JdKXtyZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTt9dmFyIHRhZz1nZXRUYWcodmFsdWUpLGZ1bmM9dGFnPT1tYXBUYWc/bWFwVG9BcnJheTp0YWc9PXNldFRhZz9zZXRUb0FycmF5OnZhbHVlcztyZXR1cm4gZnVuYyh2YWx1ZSk7fS8qKlxuICAgICAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4xMi4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udG9GaW5pdGUoMy4yKTtcbiAgICAgICAgICogLy8gPT4gMy4yXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAgICAgICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgICAgICpcbiAgICAgICAgICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gICAgICAgICAqIC8vID0+IDMuMlxuICAgICAgICAgKi9mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSl7aWYoIXZhbHVlKXtyZXR1cm4gdmFsdWU9PT0wP3ZhbHVlOjA7fXZhbHVlPXRvTnVtYmVyKHZhbHVlKTtpZih2YWx1ZT09PUlORklOSVRZfHx2YWx1ZT09PS1JTkZJTklUWSl7dmFyIHNpZ249dmFsdWU8MD8tMToxO3JldHVybiBzaWduKk1BWF9JTlRFR0VSO31yZXR1cm4gdmFsdWU9PT12YWx1ZT92YWx1ZTowO30vKipcbiAgICAgICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAgICAgKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy50b0ludGVnZXIoMy4yKTtcbiAgICAgICAgICogLy8gPT4gM1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgICAgICogLy8gPT4gMFxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICAgICAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gICAgICAgICAqXG4gICAgICAgICAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAgICAgICAgICogLy8gPT4gM1xuICAgICAgICAgKi9mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpe3ZhciByZXN1bHQ9dG9GaW5pdGUodmFsdWUpLHJlbWFpbmRlcj1yZXN1bHQlMTtyZXR1cm4gcmVzdWx0PT09cmVzdWx0P3JlbWFpbmRlcj9yZXN1bHQtcmVtYWluZGVyOnJlc3VsdDowO30vKipcbiAgICAgICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyIHN1aXRhYmxlIGZvciB1c2UgYXMgdGhlIGxlbmd0aCBvZiBhblxuICAgICAgICAgKiBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICAgICAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvTGVuZ3RoKDMuMik7XG4gICAgICAgICAqIC8vID0+IDNcbiAgICAgICAgICpcbiAgICAgICAgICogXy50b0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgICAgICogLy8gPT4gMFxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgICAgICogLy8gPT4gNDI5NDk2NzI5NVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvTGVuZ3RoKCczLjInKTtcbiAgICAgICAgICogLy8gPT4gM1xuICAgICAgICAgKi9mdW5jdGlvbiB0b0xlbmd0aCh2YWx1ZSl7cmV0dXJuIHZhbHVlP2Jhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLDAsTUFYX0FSUkFZX0xFTkdUSCk6MDt9LyoqXG4gICAgICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy50b051bWJlcigzLjIpO1xuICAgICAgICAgKiAvLyA9PiAzLjJcbiAgICAgICAgICpcbiAgICAgICAgICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgICAgICogLy8gPT4gNWUtMzI0XG4gICAgICAgICAqXG4gICAgICAgICAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICAgICAgICAgKiAvLyA9PiBJbmZpbml0eVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvTnVtYmVyKCczLjInKTtcbiAgICAgICAgICogLy8gPT4gMy4yXG4gICAgICAgICAqL2Z1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PT0nbnVtYmVyJyl7cmV0dXJuIHZhbHVlO31pZihpc1N5bWJvbCh2YWx1ZSkpe3JldHVybiBOQU47fWlmKGlzT2JqZWN0KHZhbHVlKSl7dmFyIG90aGVyPXR5cGVvZiB2YWx1ZS52YWx1ZU9mPT09J2Z1bmN0aW9uJz92YWx1ZS52YWx1ZU9mKCk6dmFsdWU7dmFsdWU9aXNPYmplY3Qob3RoZXIpP290aGVyKycnOm90aGVyO31pZih0eXBlb2YgdmFsdWUhPT0nc3RyaW5nJyl7cmV0dXJuIHZhbHVlPT09MD92YWx1ZTordmFsdWU7fXZhbHVlPXZhbHVlLnJlcGxhY2UocmVUcmltLCcnKTt2YXIgaXNCaW5hcnk9cmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtyZXR1cm4gaXNCaW5hcnl8fHJlSXNPY3RhbC50ZXN0KHZhbHVlKT9mcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksaXNCaW5hcnk/Mjo4KTpyZUlzQmFkSGV4LnRlc3QodmFsdWUpP05BTjordmFsdWU7fS8qKlxuICAgICAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcGxhaW4gb2JqZWN0IGZsYXR0ZW5pbmcgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nXG4gICAgICAgICAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAgICAgICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gICAgICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9XG4gICAgICAgICAqL2Z1bmN0aW9uIHRvUGxhaW5PYmplY3QodmFsdWUpe3JldHVybiBjb3B5T2JqZWN0KHZhbHVlLGtleXNJbih2YWx1ZSkpO30vKipcbiAgICAgICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHNhZmUgaW50ZWdlci4gQSBzYWZlIGludGVnZXIgY2FuIGJlIGNvbXBhcmVkIGFuZFxuICAgICAgICAgKiByZXByZXNlbnRlZCBjb3JyZWN0bHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvU2FmZUludGVnZXIoMy4yKTtcbiAgICAgICAgICogLy8gPT4gM1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvU2FmZUludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICAgICAqIC8vID0+IDBcbiAgICAgICAgICpcbiAgICAgICAgICogXy50b1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgICAgICogLy8gPT4gOTAwNzE5OTI1NDc0MDk5MVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvU2FmZUludGVnZXIoJzMuMicpO1xuICAgICAgICAgKiAvLyA9PiAzXG4gICAgICAgICAqL2Z1bmN0aW9uIHRvU2FmZUludGVnZXIodmFsdWUpe3JldHVybiB2YWx1ZT9iYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwtTUFYX1NBRkVfSU5URUdFUixNQVhfU0FGRV9JTlRFR0VSKTp2YWx1ZT09PTA/dmFsdWU6MDt9LyoqXG4gICAgICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gICAgICAgICAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvU3RyaW5nKG51bGwpO1xuICAgICAgICAgKiAvLyA9PiAnJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvU3RyaW5nKC0wKTtcbiAgICAgICAgICogLy8gPT4gJy0wJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gICAgICAgICAqIC8vID0+ICcxLDIsMydcbiAgICAgICAgICovZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpe3JldHVybiB2YWx1ZT09bnVsbD8nJzpiYXNlVG9TdHJpbmcodmFsdWUpO30vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKlxuICAgICAgICAgKiBBc3NpZ25zIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZVxuICAgICAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgICAgICogU3Vic2VxdWVudCBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAgICAgKiBbYE9iamVjdC5hc3NpZ25gXShodHRwczovL21kbi5pby9PYmplY3QvYXNzaWduKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAgICogQHNlZSBfLmFzc2lnbkluXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgICAgICogICB0aGlzLmEgPSAxO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgICAgICogICB0aGlzLmMgPSAzO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICAgICAqXG4gICAgICAgICAqIF8uYXNzaWduKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgICAgICovdmFyIGFzc2lnbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtpZihpc1Byb3RvdHlwZShzb3VyY2UpfHxpc0FycmF5TGlrZShzb3VyY2UpKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0KTtyZXR1cm47fWZvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7YXNzaWduVmFsdWUob2JqZWN0LGtleSxzb3VyY2Vba2V5XSk7fX19KTsvKipcbiAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIG93biBhbmRcbiAgICAgICAqIGluaGVyaXRlZCBzb3VyY2UgcHJvcGVydGllcy5cbiAgICAgICAqXG4gICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAYWxpYXMgZXh0ZW5kXG4gICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgKiBAc2VlIF8uYXNzaWduXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgICAqIH1cbiAgICAgICAqXG4gICAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICAgKiB9XG4gICAgICAgKlxuICAgICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICAgKlxuICAgICAgICogXy5hc3NpZ25Jbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMywgJ2QnOiA0IH1cbiAgICAgICAqL3ZhciBhc3NpZ25Jbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzSW4oc291cmNlKSxvYmplY3QpO30pOy8qKlxuICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25JbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAgICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgICAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICAgKlxuICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICogQGFsaWFzIGV4dGVuZFdpdGhcbiAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgKiBAc2VlIF8uYXNzaWduV2l0aFxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAgICogfVxuICAgICAgICpcbiAgICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduSW5XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgICAqXG4gICAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAgICovdmFyIGFzc2lnbkluV2l0aD1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIpe2NvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCxjdXN0b21pemVyKTt9KTsvKipcbiAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICAgKiBgdW5kZWZpbmVkYCwgYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYFxuICAgICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgICAqXG4gICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAgICogQHNlZSBfLmFzc2lnbkluV2l0aFxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAgICogfVxuICAgICAgICpcbiAgICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduV2l0aCwgY3VzdG9taXplcik7XG4gICAgICAgKlxuICAgICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgICAqL3ZhciBhc3NpZ25XaXRoPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil7Y29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCxjdXN0b21pemVyKTt9KTsvKipcbiAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gYHBhdGhzYCBvZiBgb2JqZWN0YC5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDEuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIHZhbHVlcy5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgICAqXG4gICAgICAgKiBfLmF0KG9iamVjdCwgWydhWzBdLmIuYycsICdhWzFdJ10pO1xuICAgICAgICogLy8gPT4gWzMsIDRdXG4gICAgICAgKi92YXIgYXQ9ZmxhdFJlc3QoYmFzZUF0KTsvKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBgcHJvdG90eXBlYCBvYmplY3QuIElmIGFcbiAgICAgICAgICogYHByb3BlcnRpZXNgIG9iamVjdCBpcyBnaXZlbiwgaXRzIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzXG4gICAgICAgICAqIGFyZSBhc3NpZ25lZCB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDIuMy4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXSBUaGUgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIG9iamVjdC5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogZnVuY3Rpb24gU2hhcGUoKSB7XG4gICAgICAgICAqICAgdGhpcy54ID0gMDtcbiAgICAgICAgICogICB0aGlzLnkgPSAwO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIENpcmNsZSgpIHtcbiAgICAgICAgICogICBTaGFwZS5jYWxsKHRoaXMpO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIENpcmNsZS5wcm90b3R5cGUgPSBfLmNyZWF0ZShTaGFwZS5wcm90b3R5cGUsIHtcbiAgICAgICAgICogICAnY29uc3RydWN0b3InOiBDaXJjbGVcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBjaXJjbGUgPSBuZXcgQ2lyY2xlO1xuICAgICAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBDaXJjbGU7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogY2lyY2xlIGluc3RhbmNlb2YgU2hhcGU7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICovZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSxwcm9wZXJ0aWVzKXt2YXIgcmVzdWx0PWJhc2VDcmVhdGUocHJvdG90eXBlKTtyZXR1cm4gcHJvcGVydGllcz09bnVsbD9yZXN1bHQ6YmFzZUFzc2lnbihyZXN1bHQscHJvcGVydGllcyk7fS8qKlxuICAgICAgICAgKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlXG4gICAgICAgICAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICAgICAgICAgKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gICAgICAgICAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAgICAgKiBAc2VlIF8uZGVmYXVsdHNEZWVwXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAgICAgKi92YXIgZGVmYXVsdHM9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZXMpe29iamVjdD1PYmplY3Qob2JqZWN0KTt2YXIgaW5kZXg9LTE7dmFyIGxlbmd0aD1zb3VyY2VzLmxlbmd0aDt2YXIgZ3VhcmQ9bGVuZ3RoPjI/c291cmNlc1syXTp1bmRlZmluZWQ7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sc291cmNlc1sxXSxndWFyZCkpe2xlbmd0aD0xO313aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTt2YXIgcHJvcHM9a2V5c0luKHNvdXJjZSk7dmFyIHByb3BzSW5kZXg9LTE7dmFyIHByb3BzTGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZSgrK3Byb3BzSW5kZXg8cHJvcHNMZW5ndGgpe3ZhciBrZXk9cHJvcHNbcHJvcHNJbmRleF07dmFyIHZhbHVlPW9iamVjdFtrZXldO2lmKHZhbHVlPT09dW5kZWZpbmVkfHxlcSh2YWx1ZSxvYmplY3RQcm90b1trZXldKSYmIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpe29iamVjdFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiBvYmplY3Q7fSk7LyoqXG4gICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRlZmF1bHRzYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBhc3NpZ25zXG4gICAgICAgKiBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICAgKlxuICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAqIEBzZWUgXy5kZWZhdWx0c1xuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBfLmRlZmF1bHRzRGVlcCh7ICdhJzogeyAnYic6IDIgfSB9LCB7ICdhJzogeyAnYic6IDEsICdjJzogMyB9IH0pO1xuICAgICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiAyLCAnYyc6IDMgfSB9XG4gICAgICAgKi92YXIgZGVmYXVsdHNEZWVwPWJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe2FyZ3MucHVzaCh1bmRlZmluZWQsY3VzdG9tRGVmYXVsdHNNZXJnZSk7cmV0dXJuIGFwcGx5KG1lcmdlV2l0aCx1bmRlZmluZWQsYXJncyk7fSk7LyoqXG4gICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGtleSBvZiB0aGUgZmlyc3RcbiAgICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFJldHVybnMgdGhlIGtleSBvZiB0aGUgbWF0Y2hlZCBlbGVtZW50LFxuICAgICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgICAqICAgJ2ZyZWQnOiAgICB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgICAqIH07XG4gICAgICAgKlxuICAgICAgICogXy5maW5kS2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgICAqIC8vID0+ICdiYXJuZXknIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICAgKlxuICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAqIF8uZmluZEtleSh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgICAqXG4gICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgKiBfLmZpbmRLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAgICpcbiAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICogXy5maW5kS2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAgICovZnVuY3Rpb24gZmluZEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duKTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEtleWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAgICAgKiBhIGNvbGxlY3Rpb24gaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgICAgICogICAnYmFybmV5JzogIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgICAgICogfTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5maW5kTGFzdEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICAgICAqIC8vID0+IHJldHVybnMgJ3BlYmJsZXMnIGFzc3VtaW5nIGBfLmZpbmRLZXlgIHJldHVybnMgJ2Jhcm5leSdcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5maW5kTGFzdEtleSh1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAgICAgKi9mdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duUmlnaHQpO30vKipcbiAgICAgICAgICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gICAgICAgICAqIG9iamVjdCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdFxuICAgICAgICAgKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAgICogQHNlZSBfLmZvckluUmlnaHRcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmZvckluKG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAgICAgKiB9KTtcbiAgICAgICAgICogLy8gPT4gTG9ncyAnYScsICdiJywgdGhlbiAnYycgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gICAgICAgICAqL2Z1bmN0aW9uIGZvckluKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvcihvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksa2V5c0luKTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9ySW5gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDIuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgICAqIEBzZWUgXy5mb3JJblxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgICAgICogICB0aGlzLmIgPSAyO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZm9ySW5SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqIC8vID0+IExvZ3MgJ2MnLCAnYicsIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvckluYCBsb2dzICdhJywgJ2InLCB0aGVuICdjJy5cbiAgICAgICAgICovZnVuY3Rpb24gZm9ySW5SaWdodChvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VGb3JSaWdodChvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksa2V5c0luKTt9LyoqXG4gICAgICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFuZFxuICAgICAgICAgKiBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvblxuICAgICAgICAgKiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAgICAgKiBAc2VlIF8uZm9yT3duUmlnaHRcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmZvck93bihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAgICAgKi9mdW5jdGlvbiBmb3JPd24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yT3duKG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSk7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvck93bmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAgICogQHNlZSBfLmZvck93blxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgICAgICogICB0aGlzLmIgPSAyO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZm9yT3duUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiAvLyA9PiBMb2dzICdiJyB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JPd25gIGxvZ3MgJ2EnIHRoZW4gJ2InLlxuICAgICAgICAgKi9mdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JPd25SaWdodChvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgICAgICogb2YgYG9iamVjdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICAgICAqIEBzZWUgXy5mdW5jdGlvbnNJblxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICAgICAqICAgdGhpcy5hID0gXy5jb25zdGFudCgnYScpO1xuICAgICAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZnVuY3Rpb25zKG5ldyBGb28pO1xuICAgICAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICAgICAqL2Z1bmN0aW9uIGZ1bmN0aW9ucyhvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/W106YmFzZUZ1bmN0aW9ucyhvYmplY3Qsa2V5cyhvYmplY3QpKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZnJvbSBvd24gYW5kIGluaGVyaXRlZFxuICAgICAgICAgKiBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYG9iamVjdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICAgICAqIEBzZWUgXy5mdW5jdGlvbnNcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmZ1bmN0aW9uc0luKG5ldyBGb28pO1xuICAgICAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgICAgICovZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXNJbihvYmplY3QpKTt9LyoqXG4gICAgICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gICAgICAgICAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAgICAgKiAvLyA9PiAzXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAgICAgKiAvLyA9PiAzXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAgICAgICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICAgICAqL2Z1bmN0aW9uIGdldChvYmplY3QscGF0aCxkZWZhdWx0VmFsdWUpe3ZhciByZXN1bHQ9b2JqZWN0PT1udWxsP3VuZGVmaW5lZDpiYXNlR2V0KG9iamVjdCxwYXRoKTtyZXR1cm4gcmVzdWx0PT09dW5kZWZpbmVkP2RlZmF1bHRWYWx1ZTpyZXN1bHQ7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogeyAnYic6IDIgfSB9O1xuICAgICAgICAgKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaGFzKG9iamVjdCwgJ2EnKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmhhcyhvYmplY3QsICdhLmInKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmhhcyhvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaGFzKG90aGVyLCAnYScpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi9mdW5jdGlvbiBoYXMob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc1BhdGgob2JqZWN0LHBhdGgsYmFzZUhhcyk7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EnKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EuYicpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaGFzSW4ob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2InKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICovZnVuY3Rpb24gaGFzSW4ob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc1BhdGgob2JqZWN0LHBhdGgsYmFzZUhhc0luKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBpbnZlcnRlZCBrZXlzIGFuZCB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICAgICAqIElmIGBvYmplY3RgIGNvbnRhaW5zIGR1cGxpY2F0ZSB2YWx1ZXMsIHN1YnNlcXVlbnQgdmFsdWVzIG92ZXJ3cml0ZVxuICAgICAgICAgKiBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyB2YWx1ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDAuNy4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmludmVydChvYmplY3QpO1xuICAgICAgICAgKiAvLyA9PiB7ICcxJzogJ2MnLCAnMic6ICdiJyB9XG4gICAgICAgICAqL3ZhciBpbnZlcnQ9Y3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYodmFsdWUhPW51bGwmJnR5cGVvZiB2YWx1ZS50b1N0cmluZyE9PSdmdW5jdGlvbicpe3ZhbHVlPW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO31yZXN1bHRbdmFsdWVdPWtleTt9LGNvbnN0YW50KGlkZW50aXR5KSk7LyoqXG4gICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludmVydGAgZXhjZXB0IHRoYXQgdGhlIGludmVydGVkIG9iamVjdCBpcyBnZW5lcmF0ZWRcbiAgICAgICAqIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZyBlYWNoIGVsZW1lbnQgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGVcbiAgICAgICAqIGNvcnJlc3BvbmRpbmcgaW52ZXJ0ZWQgdmFsdWUgb2YgZWFjaCBpbnZlcnRlZCBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5c1xuICAgICAgICogcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGludmVydGVkIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAgICogd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgICAqXG4gICAgICAgKiBfLmludmVydEJ5KG9iamVjdCk7XG4gICAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICAgKlxuICAgICAgICogXy5pbnZlcnRCeShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgKiAgIHJldHVybiAnZ3JvdXAnICsgdmFsdWU7XG4gICAgICAgKiB9KTtcbiAgICAgICAqIC8vID0+IHsgJ2dyb3VwMSc6IFsnYScsICdjJ10sICdncm91cDInOiBbJ2InXSB9XG4gICAgICAgKi92YXIgaW52ZXJ0Qnk9Y3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYodmFsdWUhPW51bGwmJnR5cGVvZiB2YWx1ZS50b1N0cmluZyE9PSdmdW5jdGlvbicpe3ZhbHVlPW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO31pZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCx2YWx1ZSkpe3Jlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO31lbHNle3Jlc3VsdFt2YWx1ZV09W2tleV07fX0sZ2V0SXRlcmF0ZWUpOy8qKlxuICAgICAgICogSW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IFsxLCAyLCAzLCA0XSB9IH1dIH07XG4gICAgICAgKlxuICAgICAgICogXy5pbnZva2Uob2JqZWN0LCAnYVswXS5iLmMuc2xpY2UnLCAxLCAzKTtcbiAgICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAgICovdmFyIGludm9rZT1iYXNlUmVzdChiYXNlSW52b2tlKTsvKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gICAgICAgICAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAgICAgICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgICAgICogICB0aGlzLmEgPSAxO1xuICAgICAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgICAgICpcbiAgICAgICAgICogXy5rZXlzKG5ldyBGb28pO1xuICAgICAgICAgKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ua2V5cygnaGknKTtcbiAgICAgICAgICogLy8gPT4gWycwJywgJzEnXVxuICAgICAgICAgKi9mdW5jdGlvbiBrZXlzKG9iamVjdCl7cmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCk/YXJyYXlMaWtlS2V5cyhvYmplY3QpOmJhc2VLZXlzKG9iamVjdCk7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgICAgICogICB0aGlzLmEgPSAxO1xuICAgICAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgICAgICpcbiAgICAgICAgICogXy5rZXlzSW4obmV3IEZvbyk7XG4gICAgICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAgICAgKi9mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCx0cnVlKTpiYXNlS2V5c0luKG9iamVjdCk7fS8qKlxuICAgICAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWFwVmFsdWVzYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICAgICAgICogc2FtZSB2YWx1ZXMgYXMgYG9iamVjdGAgYW5kIGtleXMgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZVxuICAgICAgICAgKiBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuOC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAgICAgKiBAc2VlIF8ubWFwVmFsdWVzXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubWFwS2V5cyh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICogICByZXR1cm4ga2V5ICsgdmFsdWU7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiAvLyA9PiB7ICdhMSc6IDEsICdiMic6IDIgfVxuICAgICAgICAgKi9mdW5jdGlvbiBtYXBLZXlzKG9iamVjdCxpdGVyYXRlZSl7dmFyIHJlc3VsdD17fTtpdGVyYXRlZT1nZXRJdGVyYXRlZShpdGVyYXRlZSwzKTtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtiYXNlQXNzaWduVmFsdWUocmVzdWx0LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpLHZhbHVlKTt9KTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIGBvYmplY3RgIGFuZCB2YWx1ZXMgZ2VuZXJhdGVkXG4gICAgICAgICAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydVxuICAgICAgICAgKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDIuNC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAgICAgKiBAc2VlIF8ubWFwS2V5c1xuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICAgICAqICAgJ2ZyZWQnOiAgICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgICAgICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgICAgICogfTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5tYXBWYWx1ZXModXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlOyB9KTtcbiAgICAgICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5tYXBWYWx1ZXModXNlcnMsICdhZ2UnKTtcbiAgICAgICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAgICAgKi9mdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LGl0ZXJhdGVlKXt2YXIgcmVzdWx0PXt9O2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpO2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpKTt9KTtyZXR1cm4gcmVzdWx0O30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kXG4gICAgICAgICAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gICAgICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgIGFyZVxuICAgICAgICAgKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgICAgICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAgICAgICAgICogYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50XG4gICAgICAgICAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICAgICAqICAgJ2EnOiBbeyAnYic6IDIgfSwgeyAnZCc6IDQgfV1cbiAgICAgICAgICogfTtcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG90aGVyID0ge1xuICAgICAgICAgKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dXG4gICAgICAgICAqIH07XG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7XG4gICAgICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAgICAgICAgICovdmFyIG1lcmdlPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgpe2Jhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4KTt9KTsvKipcbiAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVyZ2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG1lcmdlZCB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2VcbiAgICAgICAqIHByb3BlcnRpZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBtZXJnaW5nIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgICAgKiBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggc2l4IGFyZ3VtZW50czpcbiAgICAgICAqIChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKS5cbiAgICAgICAqXG4gICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgICAqICAgaWYgKF8uaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgICAqICAgICByZXR1cm4gb2JqVmFsdWUuY29uY2F0KHNyY1ZhbHVlKTtcbiAgICAgICAqICAgfVxuICAgICAgICogfVxuICAgICAgICpcbiAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogWzFdLCAnYic6IFsyXSB9O1xuICAgICAgICogdmFyIG90aGVyID0geyAnYSc6IFszXSwgJ2InOiBbNF0gfTtcbiAgICAgICAqXG4gICAgICAgKiBfLm1lcmdlV2l0aChvYmplY3QsIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgICAqIC8vID0+IHsgJ2EnOiBbMSwgM10sICdiJzogWzIsIDRdIH1cbiAgICAgICAqL3ZhciBtZXJnZVdpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKTt9KTsvKipcbiAgICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlXG4gICAgICAgKiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IHBhdGhzIG9mIGBvYmplY3RgIHRoYXQgYXJlIG5vdCBvbWl0dGVkLlxuICAgICAgICpcbiAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgc2xvd2VyIHRoYW4gYF8ucGlja2AuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIG9taXQuXG4gICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgICAqXG4gICAgICAgKiBfLm9taXQob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgICAqIC8vID0+IHsgJ2InOiAnMicgfVxuICAgICAgICovdmFyIG9taXQ9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LHBhdGhzKXt2YXIgcmVzdWx0PXt9O2lmKG9iamVjdD09bnVsbCl7cmV0dXJuIHJlc3VsdDt9dmFyIGlzRGVlcD1mYWxzZTtwYXRocz1hcnJheU1hcChwYXRocyxmdW5jdGlvbihwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtpc0RlZXB8fChpc0RlZXA9cGF0aC5sZW5ndGg+MSk7cmV0dXJuIHBhdGg7fSk7Y29weU9iamVjdChvYmplY3QsZ2V0QWxsS2V5c0luKG9iamVjdCkscmVzdWx0KTtpZihpc0RlZXApe3Jlc3VsdD1iYXNlQ2xvbmUocmVzdWx0LENMT05FX0RFRVBfRkxBR3xDTE9ORV9GTEFUX0ZMQUd8Q0xPTkVfU1lNQk9MU19GTEFHLGN1c3RvbU9taXRDbG9uZSk7fXZhciBsZW5ndGg9cGF0aHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXtiYXNlVW5zZXQocmVzdWx0LHBhdGhzW2xlbmd0aF0pO31yZXR1cm4gcmVzdWx0O30pOy8qKlxuICAgICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tCeWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mXG4gICAgICAgKiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBgb2JqZWN0YCB0aGF0XG4gICAgICAgKiBgcHJlZGljYXRlYCBkb2Vzbid0IHJldHVybiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d29cbiAgICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAgICpcbiAgICAgICAqIF8ub21pdEJ5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgICAqL2Z1bmN0aW9uIG9taXRCeShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gcGlja0J5KG9iamVjdCxuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICAgICAqL3ZhciBwaWNrPWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7cmV0dXJuIG9iamVjdD09bnVsbD97fTpiYXNlUGljayhvYmplY3QscGF0aHMpO30pOy8qKlxuICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGBvYmplY3RgIHByb3BlcnRpZXMgYHByZWRpY2F0ZWAgcmV0dXJuc1xuICAgICAgICogdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAgICpcbiAgICAgICAqIF8ucGlja0J5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgICAqL2Z1bmN0aW9uIHBpY2tCeShvYmplY3QscHJlZGljYXRlKXtpZihvYmplY3Q9PW51bGwpe3JldHVybnt9O312YXIgcHJvcHM9YXJyYXlNYXAoZ2V0QWxsS2V5c0luKG9iamVjdCksZnVuY3Rpb24ocHJvcCl7cmV0dXJuW3Byb3BdO30pO3ByZWRpY2F0ZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUpO3JldHVybiBiYXNlUGlja0J5KG9iamVjdCxwcm9wcyxmdW5jdGlvbih2YWx1ZSxwYXRoKXtyZXR1cm4gcHJlZGljYXRlKHZhbHVlLHBhdGhbMF0pO30pO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5nZXRgIGV4Y2VwdCB0aGF0IGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBpcyBhXG4gICAgICAgICAqIGZ1bmN0aW9uIGl0J3MgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBpdHMgcGFyZW50IG9iamVjdCBhbmRcbiAgICAgICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byByZXNvbHZlLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjMSc6IDMsICdjMic6IF8uY29uc3RhbnQoNCkgfSB9XSB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzEnKTtcbiAgICAgICAgICogLy8gPT4gM1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzInKTtcbiAgICAgICAgICogLy8gPT4gNFxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCAnZGVmYXVsdCcpO1xuICAgICAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgICAgICpcbiAgICAgICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgXy5jb25zdGFudCgnZGVmYXVsdCcpKTtcbiAgICAgICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICAgICAqL2Z1bmN0aW9uIHJlc3VsdChvYmplY3QscGF0aCxkZWZhdWx0VmFsdWUpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aC5sZW5ndGg7Ly8gRW5zdXJlIHRoZSBsb29wIGlzIGVudGVyZWQgd2hlbiBwYXRoIGlzIGVtcHR5LlxuaWYoIWxlbmd0aCl7bGVuZ3RoPTE7b2JqZWN0PXVuZGVmaW5lZDt9d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1vYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFt0b0tleShwYXRoW2luZGV4XSldO2lmKHZhbHVlPT09dW5kZWZpbmVkKXtpbmRleD1sZW5ndGg7dmFsdWU9ZGVmYXVsdFZhbHVlO31vYmplY3Q9aXNGdW5jdGlvbih2YWx1ZSk/dmFsdWUuY2FsbChvYmplY3QpOnZhbHVlO31yZXR1cm4gb2JqZWN0O30vKipcbiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiBhIHBvcnRpb24gb2YgYHBhdGhgIGRvZXNuJ3QgZXhpc3QsXG4gICAgICAgICAqIGl0J3MgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0c1xuICAgICAgICAgKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICAgICAgICAgKiBgcGF0aGAgY3JlYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5zZXQob2JqZWN0LCAnYVswXS5iLmMnLCA0KTtcbiAgICAgICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgICAgICogLy8gPT4gNFxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAgICAgICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgICAgICogLy8gPT4gNVxuICAgICAgICAgKi9mdW5jdGlvbiBzZXQob2JqZWN0LHBhdGgsdmFsdWUpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUpO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICAgICAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3QgPSB7fTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5zZXRXaXRoKG9iamVjdCwgJ1swXVsxXScsICdhJywgT2JqZWN0KTtcbiAgICAgICAgICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gICAgICAgICAqL2Z1bmN0aW9uIHNldFdpdGgob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09PSdmdW5jdGlvbic/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YFxuICAgICAgICAgKiB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXAgb3Igc2V0LCBpdHNcbiAgICAgICAgICogZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBhbGlhcyBlbnRyaWVzXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvUGFpcnMobmV3IEZvbyk7XG4gICAgICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl1dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICAgICAqL3ZhciB0b1BhaXJzPWNyZWF0ZVRvUGFpcnMoa2V5cyk7LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnNcbiAgICAgICAgICogZm9yIGBvYmplY3RgIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcFxuICAgICAgICAgKiBvciBzZXQsIGl0cyBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGFsaWFzIGVudHJpZXNJblxuICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgICAgICogICB0aGlzLmEgPSAxO1xuICAgICAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgICAgICpcbiAgICAgICAgICogXy50b1BhaXJzSW4obmV3IEZvbyk7XG4gICAgICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl0sIFsnYycsIDNdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAgICAgKi92YXIgdG9QYWlyc0luPWNyZWF0ZVRvUGFpcnMoa2V5c0luKTsvKipcbiAgICAgICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICAgICAgICAgKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gICAgICAgICAqIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgdGhydSBgaXRlcmF0ZWVgLCB3aXRoIGVhY2ggaW52b2NhdGlvblxuICAgICAgICAgKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gICAgICAgICAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAgICAgICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOiAoYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBjdXN0b20gYWNjdW11bGF0b3IgdmFsdWUuXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAgICAgICAgICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICAgICAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAgICAgKiB9LCBbXSk7XG4gICAgICAgICAqIC8vID0+IFs0LCA5XVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgICAgICogfSwge30pO1xuICAgICAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICAgICAqL2Z1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBpc0Fycj1pc0FycmF5KG9iamVjdCksaXNBcnJMaWtlPWlzQXJyfHxpc0J1ZmZlcihvYmplY3QpfHxpc1R5cGVkQXJyYXkob2JqZWN0KTtpdGVyYXRlZT1nZXRJdGVyYXRlZShpdGVyYXRlZSw0KTtpZihhY2N1bXVsYXRvcj09bnVsbCl7dmFyIEN0b3I9b2JqZWN0JiZvYmplY3QuY29uc3RydWN0b3I7aWYoaXNBcnJMaWtlKXthY2N1bXVsYXRvcj1pc0Fycj9uZXcgQ3RvcigpOltdO31lbHNlIGlmKGlzT2JqZWN0KG9iamVjdCkpe2FjY3VtdWxhdG9yPWlzRnVuY3Rpb24oQ3Rvcik/YmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSk6e307fWVsc2V7YWNjdW11bGF0b3I9e307fX0oaXNBcnJMaWtlP2FycmF5RWFjaDpiYXNlRm9yT3duKShvYmplY3QsZnVuY3Rpb24odmFsdWUsaW5kZXgsb2JqZWN0KXtyZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsb2JqZWN0KTt9KTtyZXR1cm4gYWNjdW11bGF0b3I7fS8qKlxuICAgICAgICAgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1bnNldC5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogNyB9IH1dIH07XG4gICAgICAgICAqIF8udW5zZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnVuc2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICAgICAqL2Z1bmN0aW9uIHVuc2V0KG9iamVjdCxwYXRoKXtyZXR1cm4gb2JqZWN0PT1udWxsP3RydWU6YmFzZVVuc2V0KG9iamVjdCxwYXRoKTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBhY2NlcHRzIGB1cGRhdGVyYCB0byBwcm9kdWNlIHRoZVxuICAgICAgICAgKiB2YWx1ZSB0byBzZXQuIFVzZSBgXy51cGRhdGVXaXRoYCB0byBjdXN0b21pemUgYHBhdGhgIGNyZWF0aW9uLiBUaGUgYHVwZGF0ZXJgXG4gICAgICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICAgICAqXG4gICAgICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ2FbMF0uYi5jJywgZnVuY3Rpb24obikgeyByZXR1cm4gbiAqIG47IH0pO1xuICAgICAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAgICAgKiAvLyA9PiA5XG4gICAgICAgICAqXG4gICAgICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ3hbMF0ueS56JywgZnVuY3Rpb24obikgeyByZXR1cm4gbiA/IG4gKyAxIDogMDsgfSk7XG4gICAgICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gICAgICAgICAqIC8vID0+IDBcbiAgICAgICAgICovZnVuY3Rpb24gdXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VVcGRhdGUob2JqZWN0LHBhdGgsY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpKTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udXBkYXRlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpc1xuICAgICAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnVwZGF0ZVdpdGgob2JqZWN0LCAnWzBdWzFdJywgXy5jb25zdGFudCgnYScpLCBPYmplY3QpO1xuICAgICAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgICAgICovZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QscGF0aCx1cGRhdGVyLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PT0nZnVuY3Rpb24nP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VVcGRhdGUob2JqZWN0LHBhdGgsY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpLGN1c3RvbWl6ZXIpO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAgICAgICAgICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udmFsdWVzKCdoaScpO1xuICAgICAgICAgKiAvLyA9PiBbJ2gnLCAnaSddXG4gICAgICAgICAqL2Z1bmN0aW9uIHZhbHVlcyhvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/W106YmFzZVZhbHVlcyhvYmplY3Qsa2V5cyhvYmplY3QpKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5XG4gICAgICAgICAqIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgICAgICogfVxuICAgICAgICAgKlxuICAgICAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnZhbHVlc0luKG5ldyBGb28pO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMiwgM10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgICAgICovZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VWYWx1ZXMob2JqZWN0LGtleXNJbihvYmplY3QpKTt9LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKipcbiAgICAgICAgICogQ2xhbXBzIGBudW1iZXJgIHdpdGhpbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5jbGFtcCgtMTAsIC01LCA1KTtcbiAgICAgICAgICogLy8gPT4gLTVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5jbGFtcCgxMCwgLTUsIDUpO1xuICAgICAgICAgKiAvLyA9PiA1XG4gICAgICAgICAqL2Z1bmN0aW9uIGNsYW1wKG51bWJlcixsb3dlcix1cHBlcil7aWYodXBwZXI9PT11bmRlZmluZWQpe3VwcGVyPWxvd2VyO2xvd2VyPXVuZGVmaW5lZDt9aWYodXBwZXIhPT11bmRlZmluZWQpe3VwcGVyPXRvTnVtYmVyKHVwcGVyKTt1cHBlcj11cHBlcj09PXVwcGVyP3VwcGVyOjA7fWlmKGxvd2VyIT09dW5kZWZpbmVkKXtsb3dlcj10b051bWJlcihsb3dlcik7bG93ZXI9bG93ZXI9PT1sb3dlcj9sb3dlcjowO31yZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksbG93ZXIsdXBwZXIpO30vKipcbiAgICAgICAgICogQ2hlY2tzIGlmIGBuYCBpcyBiZXR3ZWVuIGBzdGFydGAgYW5kIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIElmXG4gICAgICAgICAqIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgICAgICogSWYgYHN0YXJ0YCBpcyBncmVhdGVyIHRoYW4gYGVuZGAgdGhlIHBhcmFtcyBhcmUgc3dhcHBlZCB0byBzdXBwb3J0XG4gICAgICAgICAqIG5lZ2F0aXZlIHJhbmdlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4zLjBcbiAgICAgICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKiBAc2VlIF8ucmFuZ2UsIF8ucmFuZ2VSaWdodFxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmluUmFuZ2UoMywgMiwgNCk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pblJhbmdlKDQsIDgpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uaW5SYW5nZSg0LCAyKTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pblJhbmdlKDIsIDIpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmluUmFuZ2UoMS4yLCAyKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmluUmFuZ2UoNS4yLCA0KTtcbiAgICAgICAgICogLy8gPT4gZmFsc2VcbiAgICAgICAgICpcbiAgICAgICAgICogXy5pblJhbmdlKC0zLCAtMiwgLTYpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqL2Z1bmN0aW9uIGluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PXVuZGVmaW5lZCl7ZW5kPXN0YXJ0O3N0YXJ0PTA7fWVsc2V7ZW5kPXRvRmluaXRlKGVuZCk7fW51bWJlcj10b051bWJlcihudW1iZXIpO3JldHVybiBiYXNlSW5SYW5nZShudW1iZXIsc3RhcnQsZW5kKTt9LyoqXG4gICAgICAgICAqIFByb2R1Y2VzIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gICAgICAgICAqIElmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGEgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAgICAgICAqIGlzIHJldHVybmVkLiBJZiBgZmxvYXRpbmdgIGlzIGB0cnVlYCwgb3IgZWl0aGVyIGBsb3dlcmAgb3IgYHVwcGVyYCBhcmVcbiAgICAgICAgICogZmxvYXRzLCBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGludGVnZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyPTBdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFt1cHBlcj0xXSBUaGUgdXBwZXIgYm91bmQuXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zsb2F0aW5nXSBTcGVjaWZ5IHJldHVybmluZyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcmFuZG9tIG51bWJlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5yYW5kb20oMCwgNSk7XG4gICAgICAgICAqIC8vID0+IGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucmFuZG9tKDUpO1xuICAgICAgICAgKiAvLyA9PiBhbHNvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucmFuZG9tKDUsIHRydWUpO1xuICAgICAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5yYW5kb20oMS4yLCA1LjIpO1xuICAgICAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDEuMiBhbmQgNS4yXG4gICAgICAgICAqL2Z1bmN0aW9uIHJhbmRvbShsb3dlcix1cHBlcixmbG9hdGluZyl7aWYoZmxvYXRpbmcmJnR5cGVvZiBmbG9hdGluZyE9PSdib29sZWFuJyYmaXNJdGVyYXRlZUNhbGwobG93ZXIsdXBwZXIsZmxvYXRpbmcpKXt1cHBlcj1mbG9hdGluZz11bmRlZmluZWQ7fWlmKGZsb2F0aW5nPT09dW5kZWZpbmVkKXtpZih0eXBlb2YgdXBwZXI9PT0nYm9vbGVhbicpe2Zsb2F0aW5nPXVwcGVyO3VwcGVyPXVuZGVmaW5lZDt9ZWxzZSBpZih0eXBlb2YgbG93ZXI9PT0nYm9vbGVhbicpe2Zsb2F0aW5nPWxvd2VyO2xvd2VyPXVuZGVmaW5lZDt9fWlmKGxvd2VyPT09dW5kZWZpbmVkJiZ1cHBlcj09PXVuZGVmaW5lZCl7bG93ZXI9MDt1cHBlcj0xO31lbHNle2xvd2VyPXRvRmluaXRlKGxvd2VyKTtpZih1cHBlcj09PXVuZGVmaW5lZCl7dXBwZXI9bG93ZXI7bG93ZXI9MDt9ZWxzZXt1cHBlcj10b0Zpbml0ZSh1cHBlcik7fX1pZihsb3dlcj51cHBlcil7dmFyIHRlbXA9bG93ZXI7bG93ZXI9dXBwZXI7dXBwZXI9dGVtcDt9aWYoZmxvYXRpbmd8fGxvd2VyJTF8fHVwcGVyJTEpe3ZhciByYW5kPW5hdGl2ZVJhbmRvbSgpO3JldHVybiBuYXRpdmVNaW4obG93ZXIrcmFuZCoodXBwZXItbG93ZXIrZnJlZVBhcnNlRmxvYXQoJzFlLScrKChyYW5kKycnKS5sZW5ndGgtMSkpKSx1cHBlcik7fXJldHVybiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKTt9LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKipcbiAgICAgICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gW2NhbWVsIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhbWVsQ2FzZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FtZWwgY2FzZWQgc3RyaW5nLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmNhbWVsQ2FzZSgnRm9vIEJhcicpO1xuICAgICAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmNhbWVsQ2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgICAgICpcbiAgICAgICAgICogXy5jYW1lbENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICAgICAqL3ZhciBjYW1lbENhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7d29yZD13b3JkLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHJlc3VsdCsoaW5kZXg/Y2FwaXRhbGl6ZSh3b3JkKTp3b3JkKTt9KTsvKipcbiAgICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZSBhbmQgdGhlIHJlbWFpbmluZ1xuICAgICAgICogdG8gbG93ZXIgY2FzZS5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgc3RyaW5nLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBfLmNhcGl0YWxpemUoJ0ZSRUQnKTtcbiAgICAgICAqIC8vID0+ICdGcmVkJ1xuICAgICAgICovZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpe3JldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSk7fS8qKlxuICAgICAgICAgKiBEZWJ1cnJzIGBzdHJpbmdgIGJ5IGNvbnZlcnRpbmdcbiAgICAgICAgICogW0xhdGluLTEgU3VwcGxlbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW4tMV9TdXBwbGVtZW50XyhVbmljb2RlX2Jsb2NrKSNDaGFyYWN0ZXJfdGFibGUpXG4gICAgICAgICAqIGFuZCBbTGF0aW4gRXh0ZW5kZWQtQV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fRXh0ZW5kZWQtQSlcbiAgICAgICAgICogbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzIGFuZCByZW1vdmluZ1xuICAgICAgICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGRlYnVyci5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgc3RyaW5nLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmRlYnVycignZMOpasOgIHZ1Jyk7XG4gICAgICAgICAqIC8vID0+ICdkZWphIHZ1J1xuICAgICAgICAgKi9mdW5jdGlvbiBkZWJ1cnIoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZzdHJpbmcucmVwbGFjZShyZUxhdGluLGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywnJyk7fS8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249c3RyaW5nLmxlbmd0aF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCB1cCB0by5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCBgdGFyZ2V0YCxcbiAgICAgICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2MnKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicsIDIpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqL2Z1bmN0aW9uIGVuZHNXaXRoKHN0cmluZyx0YXJnZXQscG9zaXRpb24pe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7cG9zaXRpb249cG9zaXRpb249PT11bmRlZmluZWQ/bGVuZ3RoOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLDAsbGVuZ3RoKTt2YXIgZW5kPXBvc2l0aW9uO3Bvc2l0aW9uLT10YXJnZXQubGVuZ3RoO3JldHVybiBwb3NpdGlvbj49MCYmc3RyaW5nLnNsaWNlKHBvc2l0aW9uLGVuZCk9PXRhcmdldDt9LyoqXG4gICAgICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIFwiJlwiLCBcIjxcIiwgXCI+XCIsICdcIicsIGFuZCBcIidcIiBpbiBgc3RyaW5nYCB0byB0aGVpclxuICAgICAgICAgKiBjb3JyZXNwb25kaW5nIEhUTUwgZW50aXRpZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBObyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLiBUbyBlc2NhcGUgYWRkaXRpb25hbFxuICAgICAgICAgKiBjaGFyYWN0ZXJzIHVzZSBhIHRoaXJkLXBhcnR5IGxpYnJhcnkgbGlrZSBbX2hlX10oaHR0cHM6Ly9tdGhzLmJlL2hlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhvdWdoIHRoZSBcIj5cIiBjaGFyYWN0ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZVxuICAgICAgICAgKiBcIj5cIiBhbmQgXCIvXCIgZG9uJ3QgbmVlZCBlc2NhcGluZyBpbiBIVE1MIGFuZCBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZ1xuICAgICAgICAgKiB1bmxlc3MgdGhleSdyZSBwYXJ0IG9mIGEgdGFnIG9yIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gU2VlXG4gICAgICAgICAqIFtNYXRoaWFzIEJ5bmVucydzIGFydGljbGVdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcylcbiAgICAgICAgICogKHVuZGVyIFwic2VtaS1yZWxhdGVkIGZ1biBmYWN0XCIpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFdoZW4gd29ya2luZyB3aXRoIEhUTUwgeW91IHNob3VsZCBhbHdheXNcbiAgICAgICAgICogW3F1b3RlIGF0dHJpYnV0ZSB2YWx1ZXNdKGh0dHA6Ly93b25rby5jb20vcG9zdC9odG1sLWVzY2FwaW5nKSB0byByZWR1Y2VcbiAgICAgICAgICogWFNTIHZlY3RvcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXMnXG4gICAgICAgICAqL2Z1bmN0aW9uIGVzY2FwZShzdHJpbmcpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3JldHVybiBzdHJpbmcmJnJlSGFzVW5lc2NhcGVkSHRtbC50ZXN0KHN0cmluZyk/c3RyaW5nLnJlcGxhY2UocmVVbmVzY2FwZWRIdG1sLGVzY2FwZUh0bWxDaGFyKTpzdHJpbmc7fS8qKlxuICAgICAgICAgKiBFc2NhcGVzIHRoZSBgUmVnRXhwYCBzcGVjaWFsIGNoYXJhY3RlcnMgXCJeXCIsIFwiJFwiLCBcIlxcXCIsIFwiLlwiLCBcIipcIiwgXCIrXCIsXG4gICAgICAgICAqIFwiP1wiLCBcIihcIiwgXCIpXCIsIFwiW1wiLCBcIl1cIiwgXCJ7XCIsIFwifVwiLCBhbmQgXCJ8XCIgaW4gYHN0cmluZ2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5lc2NhcGVSZWdFeHAoJ1tsb2Rhc2hdKGh0dHBzOi8vbG9kYXNoLmNvbS8pJyk7XG4gICAgICAgICAqIC8vID0+ICdcXFtsb2Rhc2hcXF1cXChodHRwczovL2xvZGFzaFxcLmNvbS9cXCknXG4gICAgICAgICAqL2Z1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHJpbmcpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3JldHVybiBzdHJpbmcmJnJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZyk/c3RyaW5nLnJlcGxhY2UocmVSZWdFeHBDaGFyLCdcXFxcJCYnKTpzdHJpbmc7fS8qKlxuICAgICAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAgICAgKiBba2ViYWIgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3BlY2lhbF9jYXNlX3N0eWxlcykuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUga2ViYWIgY2FzZWQgc3RyaW5nLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmtlYmFiQ2FzZSgnRm9vIEJhcicpO1xuICAgICAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgICAgICpcbiAgICAgICAgICogXy5rZWJhYkNhc2UoJ2Zvb0JhcicpO1xuICAgICAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgICAgICpcbiAgICAgICAgICogXy5rZWJhYkNhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAgICAgKi92YXIga2ViYWJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyctJzonJykrd29yZC50b0xvd2VyQ2FzZSgpO30pOy8qKlxuICAgICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gbG93ZXIgY2FzZS5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBfLmxvd2VyQ2FzZSgnLS1Gb28tQmFyLS0nKTtcbiAgICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAgICpcbiAgICAgICAqIF8ubG93ZXJDYXNlKCdmb29CYXInKTtcbiAgICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAgICpcbiAgICAgICAqIF8ubG93ZXJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICAgKi92YXIgbG93ZXJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PycgJzonJykrd29yZC50b0xvd2VyQ2FzZSgpO30pOy8qKlxuICAgICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byBsb3dlciBjYXNlLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZyZWQnKTtcbiAgICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAgICpcbiAgICAgICAqIF8ubG93ZXJGaXJzdCgnRlJFRCcpO1xuICAgICAgICogLy8gPT4gJ2ZSRUQnXG4gICAgICAgKi92YXIgbG93ZXJGaXJzdD1jcmVhdGVDYXNlRmlyc3QoJ3RvTG93ZXJDYXNlJyk7LyoqXG4gICAgICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLlxuICAgICAgICAgKiBQYWRkaW5nIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGNhbid0IGJlIGV2ZW5seSBkaXZpZGVkIGJ5IGBsZW5ndGhgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucGFkKCdhYmMnLCA4KTtcbiAgICAgICAgICogLy8gPT4gJyAgYWJjICAgJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnBhZCgnYWJjJywgOCwgJ18tJyk7XG4gICAgICAgICAqIC8vID0+ICdfLWFiY18tXydcbiAgICAgICAgICpcbiAgICAgICAgICogXy5wYWQoJ2FiYycsIDMpO1xuICAgICAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAgICAgKi9mdW5jdGlvbiBwYWQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7bGVuZ3RoPXRvSW50ZWdlcihsZW5ndGgpO3ZhciBzdHJMZW5ndGg9bGVuZ3RoP3N0cmluZ1NpemUoc3RyaW5nKTowO2lmKCFsZW5ndGh8fHN0ckxlbmd0aD49bGVuZ3RoKXtyZXR1cm4gc3RyaW5nO312YXIgbWlkPShsZW5ndGgtc3RyTGVuZ3RoKS8yO3JldHVybiBjcmVhdGVQYWRkaW5nKG5hdGl2ZUZsb29yKG1pZCksY2hhcnMpK3N0cmluZytjcmVhdGVQYWRkaW5nKG5hdGl2ZUNlaWwobWlkKSxjaGFycyk7fS8qKlxuICAgICAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSByaWdodCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnBhZEVuZCgnYWJjJywgNik7XG4gICAgICAgICAqIC8vID0+ICdhYmMgICAnXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2LCAnXy0nKTtcbiAgICAgICAgICogLy8gPT4gJ2FiY18tXydcbiAgICAgICAgICpcbiAgICAgICAgICogXy5wYWRFbmQoJ2FiYycsIDMpO1xuICAgICAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAgICAgKi9mdW5jdGlvbiBwYWRFbmQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7bGVuZ3RoPXRvSW50ZWdlcihsZW5ndGgpO3ZhciBzdHJMZW5ndGg9bGVuZ3RoP3N0cmluZ1NpemUoc3RyaW5nKTowO3JldHVybiBsZW5ndGgmJnN0ckxlbmd0aDxsZW5ndGg/c3RyaW5nK2NyZWF0ZVBhZGRpbmcobGVuZ3RoLXN0ckxlbmd0aCxjaGFycyk6c3RyaW5nO30vKipcbiAgICAgICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2KTtcbiAgICAgICAgICogLy8gPT4gJyAgIGFiYydcbiAgICAgICAgICpcbiAgICAgICAgICogXy5wYWRTdGFydCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICAgICAqIC8vID0+ICdfLV9hYmMnXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDMpO1xuICAgICAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAgICAgKi9mdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtsZW5ndGg9dG9JbnRlZ2VyKGxlbmd0aCk7dmFyIHN0ckxlbmd0aD1sZW5ndGg/c3RyaW5nU2l6ZShzdHJpbmcpOjA7cmV0dXJuIGxlbmd0aCYmc3RyTGVuZ3RoPGxlbmd0aD9jcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpK3N0cmluZzpzdHJpbmc7fS8qKlxuICAgICAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXguIElmIGByYWRpeGAgaXNcbiAgICAgICAgICogYHVuZGVmaW5lZGAgb3IgYDBgLCBhIGByYWRpeGAgb2YgYDEwYCBpcyB1c2VkIHVubGVzcyBgdmFsdWVgIGlzIGFcbiAgICAgICAgICogaGV4YWRlY2ltYWwsIGluIHdoaWNoIGNhc2UgYSBgcmFkaXhgIG9mIGAxNmAgaXMgdXNlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGFsaWducyB3aXRoIHRoZVxuICAgICAgICAgKiBbRVM1IGltcGxlbWVudGF0aW9uXShodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS4xLjIuMikgb2YgYHBhcnNlSW50YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpeD0xMF0gVGhlIHJhZGl4IHRvIGludGVycHJldCBgdmFsdWVgIGJ5LlxuICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5wYXJzZUludCgnMDgnKTtcbiAgICAgICAgICogLy8gPT4gOFxuICAgICAgICAgKlxuICAgICAgICAgKiBfLm1hcChbJzYnLCAnMDgnLCAnMTAnXSwgXy5wYXJzZUludCk7XG4gICAgICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgICAgICovZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLHJhZGl4LGd1YXJkKXtpZihndWFyZHx8cmFkaXg9PW51bGwpe3JhZGl4PTA7fWVsc2UgaWYocmFkaXgpe3JhZGl4PStyYWRpeDt9cmV0dXJuIG5hdGl2ZVBhcnNlSW50KHRvU3RyaW5nKHN0cmluZykucmVwbGFjZShyZVRyaW1TdGFydCwnJykscmFkaXh8fDApO30vKipcbiAgICAgICAgICogUmVwZWF0cyB0aGUgZ2l2ZW4gc3RyaW5nIGBuYCB0aW1lcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucmVwZWF0KCcqJywgMyk7XG4gICAgICAgICAqIC8vID0+ICcqKionXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucmVwZWF0KCdhYmMnLCAyKTtcbiAgICAgICAgICogLy8gPT4gJ2FiY2FiYydcbiAgICAgICAgICpcbiAgICAgICAgICogXy5yZXBlYXQoJ2FiYycsIDApO1xuICAgICAgICAgKiAvLyA9PiAnJ1xuICAgICAgICAgKi9mdW5jdGlvbiByZXBlYXQoc3RyaW5nLG4sZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKHN0cmluZyxuLGd1YXJkKTpuPT09dW5kZWZpbmVkKXtuPTE7fWVsc2V7bj10b0ludGVnZXIobik7fXJldHVybiBiYXNlUmVwZWF0KHRvU3RyaW5nKHN0cmluZyksbik7fS8qKlxuICAgICAgICAgKiBSZXBsYWNlcyBtYXRjaGVzIGZvciBgcGF0dGVybmAgaW4gYHN0cmluZ2Agd2l0aCBgcmVwbGFjZW1lbnRgLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgICAgICogW2BTdHJpbmcjcmVwbGFjZWBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9yZXBsYWNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBtb2RpZnkuXG4gICAgICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gcGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gcmVwbGFjZW1lbnQgVGhlIG1hdGNoIHJlcGxhY2VtZW50LlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzdHJpbmcuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucmVwbGFjZSgnSGkgRnJlZCcsICdGcmVkJywgJ0Jhcm5leScpO1xuICAgICAgICAgKiAvLyA9PiAnSGkgQmFybmV5J1xuICAgICAgICAgKi9mdW5jdGlvbiByZXBsYWNlKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHN0cmluZz10b1N0cmluZyhhcmdzWzBdKTtyZXR1cm4gYXJncy5sZW5ndGg8Mz9zdHJpbmc6c3RyaW5nLnJlcGxhY2UoYXJnc1sxXSxhcmdzWzJdKTt9LyoqXG4gICAgICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICAgICAqIFtzbmFrZSBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzbmFrZSBjYXNlZCBzdHJpbmcuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uc25ha2VDYXNlKCdGb28gQmFyJyk7XG4gICAgICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnNuYWtlQ2FzZSgnZm9vQmFyJyk7XG4gICAgICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnNuYWtlQ2FzZSgnLS1GT08tQkFSLS0nKTtcbiAgICAgICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICAgICAqL3ZhciBzbmFrZUNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/J18nOicnKSt3b3JkLnRvTG93ZXJDYXNlKCk7fSk7LyoqXG4gICAgICAgKiBTcGxpdHMgYHN0cmluZ2AgYnkgYHNlcGFyYXRvcmAuXG4gICAgICAgKlxuICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICAgKiBbYFN0cmluZyNzcGxpdGBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9zcGxpdCkuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gc3BsaXQuXG4gICAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHNlcGFyYXRvciBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gc3BsaXQgYnkuXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xpbWl0XSBUaGUgbGVuZ3RoIHRvIHRydW5jYXRlIHJlc3VsdHMgdG8uXG4gICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHN0cmluZyBzZWdtZW50cy5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogXy5zcGxpdCgnYS1iLWMnLCAnLScsIDIpO1xuICAgICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAgICovZnVuY3Rpb24gc3BsaXQoc3RyaW5nLHNlcGFyYXRvcixsaW1pdCl7aWYobGltaXQmJnR5cGVvZiBsaW1pdCE9PSdudW1iZXInJiZpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsc2VwYXJhdG9yLGxpbWl0KSl7c2VwYXJhdG9yPWxpbWl0PXVuZGVmaW5lZDt9bGltaXQ9bGltaXQ9PT11bmRlZmluZWQ/TUFYX0FSUkFZX0xFTkdUSDpsaW1pdD4+PjA7aWYoIWxpbWl0KXtyZXR1cm5bXTt9c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYodHlwZW9mIHNlcGFyYXRvcj09PSdzdHJpbmcnfHxzZXBhcmF0b3IhPW51bGwmJiFpc1JlZ0V4cChzZXBhcmF0b3IpKSl7c2VwYXJhdG9yPWJhc2VUb1N0cmluZyhzZXBhcmF0b3IpO2lmKCFzZXBhcmF0b3ImJmhhc1VuaWNvZGUoc3RyaW5nKSl7cmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksMCxsaW1pdCk7fX1yZXR1cm4gc3RyaW5nLnNwbGl0KHNlcGFyYXRvcixsaW1pdCk7fS8qKlxuICAgICAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAgICAgKiBbc3RhcnQgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3R5bGlzdGljX29yX3NwZWNpYWxpc2VkX3VzYWdlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4xLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdGFydCBjYXNlZCBzdHJpbmcuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uc3RhcnRDYXNlKCctLWZvby1iYXItLScpO1xuICAgICAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgICAgICpcbiAgICAgICAgICogXy5zdGFydENhc2UoJ2Zvb0JhcicpO1xuICAgICAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgICAgICpcbiAgICAgICAgICogXy5zdGFydENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAgICAgKi92YXIgc3RhcnRDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PycgJzonJykrdXBwZXJGaXJzdCh3b3JkKTt9KTsvKipcbiAgICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249MF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCBmcm9tLlxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIGB0YXJnZXRgLFxuICAgICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYScpO1xuICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICpcbiAgICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgKlxuICAgICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicsIDEpO1xuICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICovZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsdGFyZ2V0LHBvc2l0aW9uKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtwb3NpdGlvbj1wb3NpdGlvbj09bnVsbD8wOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLDAsc3RyaW5nLmxlbmd0aCk7dGFyZ2V0PWJhc2VUb1N0cmluZyh0YXJnZXQpO3JldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24scG9zaXRpb24rdGFyZ2V0Lmxlbmd0aCk9PXRhcmdldDt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGNhbiBpbnRlcnBvbGF0ZSBkYXRhIHByb3BlcnRpZXNcbiAgICAgICAgICogaW4gXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlcnMsIEhUTUwtZXNjYXBlIGludGVycG9sYXRlZCBkYXRhIHByb3BlcnRpZXMgaW5cbiAgICAgICAgICogXCJlc2NhcGVcIiBkZWxpbWl0ZXJzLCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLiBEYXRhXG4gICAgICAgICAqIHByb3BlcnRpZXMgbWF5IGJlIGFjY2Vzc2VkIGFzIGZyZWUgdmFyaWFibGVzIGluIHRoZSB0ZW1wbGF0ZS4gSWYgYSBzZXR0aW5nXG4gICAgICAgICAqIG9iamVjdCBpcyBnaXZlbiwgaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGBfLnRlbXBsYXRlU2V0dGluZ3NgIHZhbHVlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCBgXy50ZW1wbGF0ZWAgdXRpbGl6ZXNcbiAgICAgICAgICogW3NvdXJjZVVSTHNdKGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmwpXG4gICAgICAgICAqIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwcmVjb21waWxpbmcgdGVtcGxhdGVzIHNlZVxuICAgICAgICAgKiBbbG9kYXNoJ3MgY3VzdG9tIGJ1aWxkcyBkb2N1bWVudGF0aW9uXShodHRwczovL2xvZGFzaC5jb20vY3VzdG9tLWJ1aWxkcykuXG4gICAgICAgICAqXG4gICAgICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIENocm9tZSBleHRlbnNpb24gc2FuZGJveGVzIHNlZVxuICAgICAgICAgKiBbQ2hyb21lJ3MgZXh0ZW5zaW9ucyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvc2FuZGJveGluZ0V2YWwpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgdGVtcGxhdGUgc3RyaW5nLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmVzY2FwZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXNjYXBlXVxuICAgICAgICAgKiAgVGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXZhbHVhdGVdXG4gICAgICAgICAqICBUaGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlci5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmltcG9ydHM9Xy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNdXG4gICAgICAgICAqICBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGZyZWUgdmFyaWFibGVzLlxuICAgICAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuaW50ZXJwb2xhdGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlXVxuICAgICAgICAgKiAgVGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VVUkw9J2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbbl0nXVxuICAgICAgICAgKiAgVGhlIHNvdXJjZVVSTCBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy52YXJpYWJsZT0nb2JqJ11cbiAgICAgICAgICogIFRoZSBkYXRhIG9iamVjdCB2YXJpYWJsZSBuYW1lLlxuICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBVc2UgdGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIgdG8gY3JlYXRlIGEgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScpO1xuICAgICAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2ZyZWQnIH0pO1xuICAgICAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCEnXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFVzZSB0aGUgSFRNTCBcImVzY2FwZVwiIGRlbGltaXRlciB0byBlc2NhcGUgZGF0YSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzxiPjwlLSB2YWx1ZSAlPjwvYj4nKTtcbiAgICAgICAgICogY29tcGlsZWQoeyAndmFsdWUnOiAnPHNjcmlwdD4nIH0pO1xuICAgICAgICAgKiAvLyA9PiAnPGI+Jmx0O3NjcmlwdCZndDs8L2I+J1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBVc2UgdGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIgdG8gZXhlY3V0ZSBKYXZhU2NyaXB0IGFuZCBnZW5lcmF0ZSBIVE1MLlxuICAgICAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBfLmZvckVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPicpO1xuICAgICAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFVzZSB0aGUgaW50ZXJuYWwgYHByaW50YCBmdW5jdGlvbiBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy5cbiAgICAgICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgcHJpbnQoXCJoZWxsbyBcIiArIHVzZXIpOyAlPiEnKTtcbiAgICAgICAgICogY29tcGlsZWQoeyAndXNlcic6ICdiYXJuZXknIH0pO1xuICAgICAgICAgKiAvLyA9PiAnaGVsbG8gYmFybmV5ISdcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVXNlIHRoZSBFUyB0ZW1wbGF0ZSBsaXRlcmFsIGRlbGltaXRlciBhcyBhbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAgICAgKiAvLyBEaXNhYmxlIHN1cHBvcnQgYnkgcmVwbGFjaW5nIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyAkeyB1c2VyIH0hJyk7XG4gICAgICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAncGViYmxlcycgfSk7XG4gICAgICAgICAqIC8vID0+ICdoZWxsbyBwZWJibGVzISdcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVXNlIGJhY2tzbGFzaGVzIHRvIHRyZWF0IGRlbGltaXRlcnMgYXMgcGxhaW4gdGV4dC5cbiAgICAgICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCU9IFwiXFxcXDwlLSB2YWx1ZSAlXFxcXD5cIiAlPicpO1xuICAgICAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICdpZ25vcmVkJyB9KTtcbiAgICAgICAgICogLy8gPT4gJzwlLSB2YWx1ZSAlPidcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVXNlIHRoZSBgaW1wb3J0c2Agb3B0aW9uIHRvIGltcG9ydCBgalF1ZXJ5YCBhcyBganFgLlxuICAgICAgICAgKiB2YXIgdGV4dCA9ICc8JSBqcS5lYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nO1xuICAgICAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKHRleHQsIHsgJ2ltcG9ydHMnOiB7ICdqcSc6IGpRdWVyeSB9IH0pO1xuICAgICAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScsIHsgJ3NvdXJjZVVSTCc6ICcvYmFzaWMvZ3JlZXRpbmcuanN0JyB9KTtcbiAgICAgICAgICogY29tcGlsZWQoZGF0YSk7XG4gICAgICAgICAqIC8vID0+IEZpbmQgdGhlIHNvdXJjZSBvZiBcImdyZWV0aW5nLmpzdFwiIHVuZGVyIHRoZSBTb3VyY2VzIHRhYiBvciBSZXNvdXJjZXMgcGFuZWwgb2YgdGhlIHdlYiBpbnNwZWN0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFVzZSB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hpIDwlPSBkYXRhLnVzZXIgJT4hJywgeyAndmFyaWFibGUnOiAnZGF0YScgfSk7XG4gICAgICAgICAqIGNvbXBpbGVkLnNvdXJjZTtcbiAgICAgICAgICogLy8gPT4gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgKiAvLyAgIHZhciBfX3QsIF9fcCA9ICcnO1xuICAgICAgICAgKiAvLyAgIF9fcCArPSAnaGkgJyArICgoX190ID0gKCBkYXRhLnVzZXIgKSkgPT0gbnVsbCA/ICcnIDogX190KSArICchJztcbiAgICAgICAgICogLy8gICByZXR1cm4gX19wO1xuICAgICAgICAgKiAvLyB9XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFVzZSBjdXN0b20gdGVtcGxhdGUgZGVsaW1pdGVycy5cbiAgICAgICAgICogXy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlID0gL3t7KFtcXHNcXFNdKz8pfX0vZztcbiAgICAgICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8ge3sgdXNlciB9fSEnKTtcbiAgICAgICAgICogY29tcGlsZWQoeyAndXNlcic6ICdtdXN0YWNoZScgfSk7XG4gICAgICAgICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZWAgcHJvcGVydHkgdG8gaW5saW5lIGNvbXBpbGVkIHRlbXBsYXRlcyBmb3IgbWVhbmluZ2Z1bFxuICAgICAgICAgKiAvLyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcy5cbiAgICAgICAgICogZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2pzdC5qcycpLCAnXFxcbiAgICAgICAgICogICB2YXIgSlNUID0ge1xcXG4gICAgICAgICAqICAgICBcIm1haW5cIjogJyArIF8udGVtcGxhdGUobWFpblRleHQpLnNvdXJjZSArICdcXFxuICAgICAgICAgKiAgIH07XFxcbiAgICAgICAgICogJyk7XG4gICAgICAgICAqL2Z1bmN0aW9uIHRlbXBsYXRlKHN0cmluZyxvcHRpb25zLGd1YXJkKXsvLyBCYXNlZCBvbiBKb2huIFJlc2lnJ3MgYHRtcGxgIGltcGxlbWVudGF0aW9uXG4vLyAoaHR0cDovL2Vqb2huLm9yZy9ibG9nL2phdmFzY3JpcHQtbWljcm8tdGVtcGxhdGluZy8pXG4vLyBhbmQgTGF1cmEgRG9rdG9yb3ZhJ3MgZG9ULmpzIChodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UKS5cbnZhciBzZXR0aW5ncz1sb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpKXtvcHRpb25zPXVuZGVmaW5lZDt9c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7b3B0aW9ucz1hc3NpZ25JbldpdGgoe30sb3B0aW9ucyxzZXR0aW5ncyxjdXN0b21EZWZhdWx0c0Fzc2lnbkluKTt2YXIgaW1wb3J0cz1hc3NpZ25JbldpdGgoe30sb3B0aW9ucy5pbXBvcnRzLHNldHRpbmdzLmltcG9ydHMsY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiksaW1wb3J0c0tleXM9a2V5cyhpbXBvcnRzKSxpbXBvcnRzVmFsdWVzPWJhc2VWYWx1ZXMoaW1wb3J0cyxpbXBvcnRzS2V5cyk7dmFyIGlzRXNjYXBpbmcsaXNFdmFsdWF0aW5nLGluZGV4PTAsaW50ZXJwb2xhdGU9b3B0aW9ucy5pbnRlcnBvbGF0ZXx8cmVOb01hdGNoLHNvdXJjZT1cIl9fcCArPSAnXCI7Ly8gQ29tcGlsZSB0aGUgcmVnZXhwIHRvIG1hdGNoIGVhY2ggZGVsaW1pdGVyLlxudmFyIHJlRGVsaW1pdGVycz1SZWdFeHAoKG9wdGlvbnMuZXNjYXBlfHxyZU5vTWF0Y2gpLnNvdXJjZSsnfCcraW50ZXJwb2xhdGUuc291cmNlKyd8JysoaW50ZXJwb2xhdGU9PT1yZUludGVycG9sYXRlP3JlRXNUZW1wbGF0ZTpyZU5vTWF0Y2gpLnNvdXJjZSsnfCcrKG9wdGlvbnMuZXZhbHVhdGV8fHJlTm9NYXRjaCkuc291cmNlKyd8JCcsJ2cnKTsvLyBVc2UgYSBzb3VyY2VVUkwgZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG52YXIgc291cmNlVVJMPScvLyMgc291cmNlVVJMPScrKCdzb3VyY2VVUkwnaW4gb3B0aW9ucz9vcHRpb25zLnNvdXJjZVVSTDonbG9kYXNoLnRlbXBsYXRlU291cmNlc1snKyArK3RlbXBsYXRlQ291bnRlcisnXScpKydcXG4nO3N0cmluZy5yZXBsYWNlKHJlRGVsaW1pdGVycyxmdW5jdGlvbihtYXRjaCxlc2NhcGVWYWx1ZSxpbnRlcnBvbGF0ZVZhbHVlLGVzVGVtcGxhdGVWYWx1ZSxldmFsdWF0ZVZhbHVlLG9mZnNldCl7aW50ZXJwb2xhdGVWYWx1ZXx8KGludGVycG9sYXRlVmFsdWU9ZXNUZW1wbGF0ZVZhbHVlKTsvLyBFc2NhcGUgY2hhcmFjdGVycyB0aGF0IGNhbid0IGJlIGluY2x1ZGVkIGluIHN0cmluZyBsaXRlcmFscy5cbnNvdXJjZSs9c3RyaW5nLnNsaWNlKGluZGV4LG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZyxlc2NhcGVTdHJpbmdDaGFyKTsvLyBSZXBsYWNlIGRlbGltaXRlcnMgd2l0aCBzbmlwcGV0cy5cbmlmKGVzY2FwZVZhbHVlKXtpc0VzY2FwaW5nPXRydWU7c291cmNlKz1cIicgK1xcbl9fZShcIitlc2NhcGVWYWx1ZStcIikgK1xcbidcIjt9aWYoZXZhbHVhdGVWYWx1ZSl7aXNFdmFsdWF0aW5nPXRydWU7c291cmNlKz1cIic7XFxuXCIrZXZhbHVhdGVWYWx1ZStcIjtcXG5fX3AgKz0gJ1wiO31pZihpbnRlcnBvbGF0ZVZhbHVlKXtzb3VyY2UrPVwiJyArXFxuKChfX3QgPSAoXCIraW50ZXJwb2xhdGVWYWx1ZStcIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xcbidcIjt9aW5kZXg9b2Zmc2V0K21hdGNoLmxlbmd0aDsvLyBUaGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIHByb2R1Y3RzIG5lZWRzIGBtYXRjaGAgcmV0dXJuZWQgaW5cbi8vIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3QgYG9mZnNldGAgdmFsdWUuXG5yZXR1cm4gbWF0Y2g7fSk7c291cmNlKz1cIic7XFxuXCI7Ly8gSWYgYHZhcmlhYmxlYCBpcyBub3Qgc3BlY2lmaWVkIHdyYXAgYSB3aXRoLXN0YXRlbWVudCBhcm91bmQgdGhlIGdlbmVyYXRlZFxuLy8gY29kZSB0byBhZGQgdGhlIGRhdGEgb2JqZWN0IHRvIHRoZSB0b3Agb2YgdGhlIHNjb3BlIGNoYWluLlxudmFyIHZhcmlhYmxlPW9wdGlvbnMudmFyaWFibGU7aWYoIXZhcmlhYmxlKXtzb3VyY2U9J3dpdGggKG9iaikge1xcbicrc291cmNlKydcXG59XFxuJzt9Ly8gQ2xlYW51cCBjb2RlIGJ5IHN0cmlwcGluZyBlbXB0eSBzdHJpbmdzLlxuc291cmNlPShpc0V2YWx1YXRpbmc/c291cmNlLnJlcGxhY2UocmVFbXB0eVN0cmluZ0xlYWRpbmcsJycpOnNvdXJjZSkucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCckMScpLnJlcGxhY2UocmVFbXB0eVN0cmluZ1RyYWlsaW5nLCckMTsnKTsvLyBGcmFtZSBjb2RlIGFzIHRoZSBmdW5jdGlvbiBib2R5Llxuc291cmNlPSdmdW5jdGlvbignKyh2YXJpYWJsZXx8J29iaicpKycpIHtcXG4nKyh2YXJpYWJsZT8nJzonb2JqIHx8IChvYmogPSB7fSk7XFxuJykrXCJ2YXIgX190LCBfX3AgPSAnJ1wiKyhpc0VzY2FwaW5nPycsIF9fZSA9IF8uZXNjYXBlJzonJykrKGlzRXZhbHVhdGluZz8nLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcXG4nK1wiZnVuY3Rpb24gcHJpbnQoKSB7IF9fcCArPSBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XFxuXCI6JztcXG4nKStzb3VyY2UrJ3JldHVybiBfX3BcXG59Jzt2YXIgcmVzdWx0PWF0dGVtcHQoZnVuY3Rpb24oKXtyZXR1cm4gRnVuY3Rpb24oaW1wb3J0c0tleXMsc291cmNlVVJMKydyZXR1cm4gJytzb3VyY2UpLmFwcGx5KHVuZGVmaW5lZCxpbXBvcnRzVmFsdWVzKTt9KTsvLyBQcm92aWRlIHRoZSBjb21waWxlZCBmdW5jdGlvbidzIHNvdXJjZSBieSBpdHMgYHRvU3RyaW5nYCBtZXRob2Qgb3Jcbi8vIHRoZSBgc291cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvciBpbmxpbmluZyBjb21waWxlZCB0ZW1wbGF0ZXMuXG5yZXN1bHQuc291cmNlPXNvdXJjZTtpZihpc0Vycm9yKHJlc3VsdCkpe3Rocm93IHJlc3VsdDt9cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byBsb3dlciBjYXNlIGp1c3QgbGlrZVxuICAgICAgICAgKiBbU3RyaW5nI3RvTG93ZXJDYXNlXShodHRwczovL21kbi5pby90b0xvd2VyQ2FzZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvTG93ZXIoJy0tRm9vLUJhci0tJyk7XG4gICAgICAgICAqIC8vID0+ICctLWZvby1iYXItLSdcbiAgICAgICAgICpcbiAgICAgICAgICogXy50b0xvd2VyKCdmb29CYXInKTtcbiAgICAgICAgICogLy8gPT4gJ2Zvb2JhcidcbiAgICAgICAgICpcbiAgICAgICAgICogXy50b0xvd2VyKCdfX0ZPT19CQVJfXycpO1xuICAgICAgICAgKiAvLyA9PiAnX19mb29fYmFyX18nXG4gICAgICAgICAqL2Z1bmN0aW9uIHRvTG93ZXIodmFsdWUpe3JldHVybiB0b1N0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTt9LyoqXG4gICAgICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byB1cHBlciBjYXNlIGp1c3QgbGlrZVxuICAgICAgICAgKiBbU3RyaW5nI3RvVXBwZXJDYXNlXShodHRwczovL21kbi5pby90b1VwcGVyQ2FzZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvVXBwZXIoJy0tZm9vLWJhci0tJyk7XG4gICAgICAgICAqIC8vID0+ICctLUZPTy1CQVItLSdcbiAgICAgICAgICpcbiAgICAgICAgICogXy50b1VwcGVyKCdmb29CYXInKTtcbiAgICAgICAgICogLy8gPT4gJ0ZPT0JBUidcbiAgICAgICAgICpcbiAgICAgICAgICogXy50b1VwcGVyKCdfX2Zvb19iYXJfXycpO1xuICAgICAgICAgKiAvLyA9PiAnX19GT09fQkFSX18nXG4gICAgICAgICAqL2Z1bmN0aW9uIHRvVXBwZXIodmFsdWUpe3JldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKTt9LyoqXG4gICAgICAgICAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udHJpbSgnICBhYmMgICcpO1xuICAgICAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRyaW0oJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLm1hcChbJyAgZm9vICAnLCAnICBiYXIgICddLCBfLnRyaW0pO1xuICAgICAgICAgKiAvLyA9PiBbJ2ZvbycsICdiYXInXVxuICAgICAgICAgKi9mdW5jdGlvbiB0cmltKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSl7cmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbSwnJyk7fWlmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpe3JldHVybiBzdHJpbmc7fXZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxjaHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoY2hhcnMpLHN0YXJ0PWNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scykrMTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsc3RhcnQsZW5kKS5qb2luKCcnKTt9LyoqXG4gICAgICAgICAqIFJlbW92ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udHJpbUVuZCgnICBhYmMgICcpO1xuICAgICAgICAgKiAvLyA9PiAnICBhYmMnXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udHJpbUVuZCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICAgICAqIC8vID0+ICctXy1hYmMnXG4gICAgICAgICAqL2Z1bmN0aW9uIHRyaW1FbmQoc3RyaW5nLGNoYXJzLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJihndWFyZHx8Y2hhcnM9PT11bmRlZmluZWQpKXtyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCcnKTt9aWYoIXN0cmluZ3x8IShjaGFycz1iYXNlVG9TdHJpbmcoY2hhcnMpKSl7cmV0dXJuIHN0cmluZzt9dmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpKzE7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLDAsZW5kKS5qb2luKCcnKTt9LyoqXG4gICAgICAgICAqIFJlbW92ZXMgbGVhZGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy50cmltU3RhcnQoJyAgYWJjICAnKTtcbiAgICAgICAgICogLy8gPT4gJ2FiYyAgJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRyaW1TdGFydCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICAgICAqIC8vID0+ICdhYmMtXy0nXG4gICAgICAgICAqL2Z1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcsY2hhcnMsZ3VhcmQpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2lmKHN0cmluZyYmKGd1YXJkfHxjaGFycz09PXVuZGVmaW5lZCkpe3JldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW1TdGFydCwnJyk7fWlmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpe3JldHVybiBzdHJpbmc7fXZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxzdGFydD1jaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scyxzdHJpbmdUb0FycmF5KGNoYXJzKSk7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLHN0YXJ0KS5qb2luKCcnKTt9LyoqXG4gICAgICAgICAqIFRydW5jYXRlcyBgc3RyaW5nYCBpZiBpdCdzIGxvbmdlciB0aGFuIHRoZSBnaXZlbiBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICAgICAqIFRoZSBsYXN0IGNoYXJhY3RlcnMgb2YgdGhlIHRydW5jYXRlZCBzdHJpbmcgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9taXNzaW9uXG4gICAgICAgICAqIHN0cmluZyB3aGljaCBkZWZhdWx0cyB0byBcIi4uLlwiLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRydW5jYXRlLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxlbmd0aD0zMF0gVGhlIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9taXNzaW9uPScuLi4nXSBUaGUgc3RyaW5nIHRvIGluZGljYXRlIHRleHQgaXMgb21pdHRlZC5cbiAgICAgICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbb3B0aW9ucy5zZXBhcmF0b3JdIFRoZSBzZXBhcmF0b3IgcGF0dGVybiB0byB0cnVuY2F0ZSB0by5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJ1bmNhdGVkIHN0cmluZy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycpO1xuICAgICAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvLi4uJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgICAgICogICAnc2VwYXJhdG9yJzogJyAnXG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLC4uLidcbiAgICAgICAgICpcbiAgICAgICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICAgICAqICAgJ3NlcGFyYXRvcic6IC8sPyArL1xuICAgICAgICAgKiB9KTtcbiAgICAgICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZS4uLidcbiAgICAgICAgICpcbiAgICAgICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgICAgICogICAnb21pc3Npb24nOiAnIFsuLi5dJ1xuICAgICAgICAgKiB9KTtcbiAgICAgICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZyBbLi4uXSdcbiAgICAgICAgICovZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLG9wdGlvbnMpe3ZhciBsZW5ndGg9REVGQVVMVF9UUlVOQ19MRU5HVEgsb21pc3Npb249REVGQVVMVF9UUlVOQ19PTUlTU0lPTjtpZihpc09iamVjdChvcHRpb25zKSl7dmFyIHNlcGFyYXRvcj0nc2VwYXJhdG9yJ2luIG9wdGlvbnM/b3B0aW9ucy5zZXBhcmF0b3I6c2VwYXJhdG9yO2xlbmd0aD0nbGVuZ3RoJ2luIG9wdGlvbnM/dG9JbnRlZ2VyKG9wdGlvbnMubGVuZ3RoKTpsZW5ndGg7b21pc3Npb249J29taXNzaW9uJ2luIG9wdGlvbnM/YmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pOm9taXNzaW9uO31zdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTt2YXIgc3RyTGVuZ3RoPXN0cmluZy5sZW5ndGg7aWYoaGFzVW5pY29kZShzdHJpbmcpKXt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyk7c3RyTGVuZ3RoPXN0clN5bWJvbHMubGVuZ3RoO31pZihsZW5ndGg+PXN0ckxlbmd0aCl7cmV0dXJuIHN0cmluZzt9dmFyIGVuZD1sZW5ndGgtc3RyaW5nU2l6ZShvbWlzc2lvbik7aWYoZW5kPDEpe3JldHVybiBvbWlzc2lvbjt9dmFyIHJlc3VsdD1zdHJTeW1ib2xzP2Nhc3RTbGljZShzdHJTeW1ib2xzLDAsZW5kKS5qb2luKCcnKTpzdHJpbmcuc2xpY2UoMCxlbmQpO2lmKHNlcGFyYXRvcj09PXVuZGVmaW5lZCl7cmV0dXJuIHJlc3VsdCtvbWlzc2lvbjt9aWYoc3RyU3ltYm9scyl7ZW5kKz1yZXN1bHQubGVuZ3RoLWVuZDt9aWYoaXNSZWdFeHAoc2VwYXJhdG9yKSl7aWYoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpe3ZhciBtYXRjaCxzdWJzdHJpbmc9cmVzdWx0O2lmKCFzZXBhcmF0b3IuZ2xvYmFsKXtzZXBhcmF0b3I9UmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpKydnJyk7fXNlcGFyYXRvci5sYXN0SW5kZXg9MDt3aGlsZShtYXRjaD1zZXBhcmF0b3IuZXhlYyhzdWJzdHJpbmcpKXt2YXIgbmV3RW5kPW1hdGNoLmluZGV4O31yZXN1bHQ9cmVzdWx0LnNsaWNlKDAsbmV3RW5kPT09dW5kZWZpbmVkP2VuZDpuZXdFbmQpO319ZWxzZSBpZihzdHJpbmcuaW5kZXhPZihiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKSxlbmQpIT1lbmQpe3ZhciBpbmRleD1yZXN1bHQubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTtpZihpbmRleD4tMSl7cmVzdWx0PXJlc3VsdC5zbGljZSgwLGluZGV4KTt9fXJldHVybiByZXN1bHQrb21pc3Npb247fS8qKlxuICAgICAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy5lc2NhcGVgOyB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgSFRNTCBlbnRpdGllc1xuICAgICAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvXG4gICAgICAgICAqIHRoZWlyIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIE5vIG90aGVyIEhUTUwgZW50aXRpZXMgYXJlIHVuZXNjYXBlZC4gVG8gdW5lc2NhcGUgYWRkaXRpb25hbFxuICAgICAgICAgKiBIVE1MIGVudGl0aWVzIHVzZSBhIHRoaXJkLXBhcnR5IGxpYnJhcnkgbGlrZSBbX2hlX10oaHR0cHM6Ly9tdGhzLmJlL2hlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMC42LjBcbiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB1bmVzY2FwZS5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIHN0cmluZy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy51bmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJyk7XG4gICAgICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgICAgICovZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLHVuZXNjYXBlSHRtbENoYXIpOnN0cmluZzt9LyoqXG4gICAgICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIHVwcGVyIGNhc2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnVwcGVyQ2FzZSgnLS1mb28tYmFyJyk7XG4gICAgICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnVwcGVyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnVwcGVyQ2FzZSgnX19mb29fYmFyX18nKTtcbiAgICAgICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICAgICAqL3ZhciB1cHBlckNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/JyAnOicnKSt3b3JkLnRvVXBwZXJDYXNlKCk7fSk7LyoqXG4gICAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIF8udXBwZXJGaXJzdCgnZnJlZCcpO1xuICAgICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICAgKlxuICAgICAgICogXy51cHBlckZpcnN0KCdGUkVEJyk7XG4gICAgICAgKiAvLyA9PiAnRlJFRCdcbiAgICAgICAqL3ZhciB1cHBlckZpcnN0PWNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTsvKipcbiAgICAgICAgICogU3BsaXRzIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLlxuICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycsIC9bXiwgXSsvZyk7XG4gICAgICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ11cbiAgICAgICAgICovZnVuY3Rpb24gd29yZHMoc3RyaW5nLHBhdHRlcm4sZ3VhcmQpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3BhdHRlcm49Z3VhcmQ/dW5kZWZpbmVkOnBhdHRlcm47aWYocGF0dGVybj09PXVuZGVmaW5lZCl7cmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZyk/dW5pY29kZVdvcmRzKHN0cmluZyk6YXNjaWlXb3JkcyhzdHJpbmcpO31yZXR1cm4gc3RyaW5nLm1hdGNoKHBhdHRlcm4pfHxbXTt9LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKipcbiAgICAgICAgICogQXR0ZW1wdHMgdG8gaW52b2tlIGBmdW5jYCwgcmV0dXJuaW5nIGVpdGhlciB0aGUgcmVzdWx0IG9yIHRoZSBjYXVnaHQgZXJyb3JcbiAgICAgICAgICogb2JqZWN0LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXR0ZW1wdC5cbiAgICAgICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBgZnVuY2AgcmVzdWx0IG9yIGVycm9yIG9iamVjdC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gQXZvaWQgdGhyb3dpbmcgZXJyb3JzIGZvciBpbnZhbGlkIHNlbGVjdG9ycy5cbiAgICAgICAgICogdmFyIGVsZW1lbnRzID0gXy5hdHRlbXB0KGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgICAqICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICAgKiB9LCAnPl8+Jyk7XG4gICAgICAgICAqXG4gICAgICAgICAqIGlmIChfLmlzRXJyb3IoZWxlbWVudHMpKSB7XG4gICAgICAgICAqICAgZWxlbWVudHMgPSBbXTtcbiAgICAgICAgICogfVxuICAgICAgICAgKi92YXIgYXR0ZW1wdD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3RyeXtyZXR1cm4gYXBwbHkoZnVuYyx1bmRlZmluZWQsYXJncyk7fWNhdGNoKGUpe3JldHVybiBpc0Vycm9yKGUpP2U6bmV3IEVycm9yKGUpO319KTsvKipcbiAgICAgICAqIEJpbmRzIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmdcbiAgICAgICAqIG1ldGhvZC5cbiAgICAgICAqXG4gICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmluZCBhbmQgYXNzaWduIHRoZSBib3VuZCBtZXRob2RzIHRvLlxuICAgICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gbWV0aG9kTmFtZXMgVGhlIG9iamVjdCBtZXRob2QgbmFtZXMgdG8gYmluZC5cbiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAgICogICAnbGFiZWwnOiAnZG9jcycsXG4gICAgICAgKiAgICdjbGljayc6IGZ1bmN0aW9uKCkge1xuICAgICAgICogICAgIGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTtcbiAgICAgICAqICAgfVxuICAgICAgICogfTtcbiAgICAgICAqXG4gICAgICAgKiBfLmJpbmRBbGwodmlldywgWydjbGljayddKTtcbiAgICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCB2aWV3LmNsaWNrKTtcbiAgICAgICAqIC8vID0+IExvZ3MgJ2NsaWNrZWQgZG9jcycgd2hlbiBjbGlja2VkLlxuICAgICAgICovdmFyIGJpbmRBbGw9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LG1ldGhvZE5hbWVzKXthcnJheUVhY2gobWV0aG9kTmFtZXMsZnVuY3Rpb24oa2V5KXtrZXk9dG9LZXkoa2V5KTtiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxiaW5kKG9iamVjdFtrZXldLG9iamVjdCkpO30pO3JldHVybiBvYmplY3Q7fSk7LyoqXG4gICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpdGVyYXRlcyBvdmVyIGBwYWlyc2AgYW5kIGludm9rZXMgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgICAqIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBwcmVkaWNhdGUgdG8gcmV0dXJuIHRydXRoeS4gVGhlIHByZWRpY2F0ZS1mdW5jdGlvblxuICAgICAgICogcGFpcnMgYXJlIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAgICogZnVuY3Rpb24uXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIFRoZSBwcmVkaWNhdGUtZnVuY3Rpb24gcGFpcnMuXG4gICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIHZhciBmdW5jID0gXy5jb25kKFtcbiAgICAgICAqICAgW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgICAgICAgICAgIF8uY29uc3RhbnQoJ21hdGNoZXMgQScpXSxcbiAgICAgICAqICAgW18uY29uZm9ybXMoeyAnYic6IF8uaXNOdW1iZXIgfSksIF8uY29uc3RhbnQoJ21hdGNoZXMgQicpXSxcbiAgICAgICAqICAgW18uc3R1YlRydWUsICAgICAgICAgICAgICAgICAgICAgIF8uY29uc3RhbnQoJ25vIG1hdGNoJyldXG4gICAgICAgKiBdKTtcbiAgICAgICAqXG4gICAgICAgKiBmdW5jKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICAgKiAvLyA9PiAnbWF0Y2hlcyBBJ1xuICAgICAgICpcbiAgICAgICAqIGZ1bmMoeyAnYSc6IDAsICdiJzogMSB9KTtcbiAgICAgICAqIC8vID0+ICdtYXRjaGVzIEInXG4gICAgICAgKlxuICAgICAgICogZnVuYyh7ICdhJzogJzEnLCAnYic6ICcyJyB9KTtcbiAgICAgICAqIC8vID0+ICdubyBtYXRjaCdcbiAgICAgICAqL2Z1bmN0aW9uIGNvbmQocGFpcnMpe3ZhciBsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgsdG9JdGVyYXRlZT1nZXRJdGVyYXRlZSgpO3BhaXJzPSFsZW5ndGg/W106YXJyYXlNYXAocGFpcnMsZnVuY3Rpb24ocGFpcil7aWYodHlwZW9mIHBhaXJbMV0hPT0nZnVuY3Rpb24nKXt0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7fXJldHVyblt0b0l0ZXJhdGVlKHBhaXJbMF0pLHBhaXJbMV1dO30pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTE7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYWlyPXBhaXJzW2luZGV4XTtpZihhcHBseShwYWlyWzBdLHRoaXMsYXJncykpe3JldHVybiBhcHBseShwYWlyWzFdLHRoaXMsYXJncyk7fX19KTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHByZWRpY2F0ZSBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGhcbiAgICAgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGEgZ2l2ZW4gb2JqZWN0LCByZXR1cm5pbmcgYHRydWVgIGlmXG4gICAgICAgICAqIGFsbCBwcmVkaWNhdGVzIHJldHVybiB0cnV0aHksIGVsc2UgYGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNUb2Agd2l0aFxuICAgICAgICAgKiBgc291cmNlYCBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICAgICAqICAgeyAnYSc6IDIsICdiJzogMSB9LFxuICAgICAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAgICAgKiBdO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLmNvbmZvcm1zKHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KSk7XG4gICAgICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyIH1dXG4gICAgICAgICAqL2Z1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSl7cmV0dXJuIGJhc2VDb25mb3JtcyhiYXNlQ2xvbmUoc291cmNlLENMT05FX0RFRVBfRkxBRykpO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgdmFsdWVgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgICAgICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gICAgICAgICAqXG4gICAgICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqL2Z1bmN0aW9uIGNvbnN0YW50KHZhbHVlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdmFsdWU7fTt9LyoqXG4gICAgICAgICAqIENoZWNrcyBgdmFsdWVgIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQgaW5cbiAgICAgICAgICogaXRzIHBsYWNlLiBUaGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaWYgYHZhbHVlYCBpcyBgTmFOYCwgYG51bGxgLFxuICAgICAgICAgKiBvciBgdW5kZWZpbmVkYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4xNC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAgICAgKiBAcGFyYW0geyp9IGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmRlZmF1bHRUbygxLCAxMCk7XG4gICAgICAgICAqIC8vID0+IDFcbiAgICAgICAgICpcbiAgICAgICAgICogXy5kZWZhdWx0VG8odW5kZWZpbmVkLCAxMCk7XG4gICAgICAgICAqIC8vID0+IDEwXG4gICAgICAgICAqL2Z1bmN0aW9uIGRlZmF1bHRUbyh2YWx1ZSxkZWZhdWx0VmFsdWUpe3JldHVybiB2YWx1ZT09bnVsbHx8dmFsdWUhPT12YWx1ZT9kZWZhdWx0VmFsdWU6dmFsdWU7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uc1xuICAgICAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICAgICAqIGludm9jYXRpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbZnVuY3NdIFRoZSBmdW5jdGlvbnMgdG8gaW52b2tlLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICAgICAqIEBzZWUgXy5mbG93UmlnaHRcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICAgICAqIH1cbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIGFkZFNxdWFyZSA9IF8uZmxvdyhbXy5hZGQsIHNxdWFyZV0pO1xuICAgICAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICAgICAqIC8vID0+IDlcbiAgICAgICAgICovdmFyIGZsb3c9Y3JlYXRlRmxvdygpOy8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsb3dgIGV4Y2VwdCB0aGF0IGl0IGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0XG4gICAgICAgICAqIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbZnVuY3NdIFRoZSBmdW5jdGlvbnMgdG8gaW52b2tlLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICAgICAqIEBzZWUgXy5mbG93XG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3dSaWdodChbc3F1YXJlLCBfLmFkZF0pO1xuICAgICAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICAgICAqIC8vID0+IDlcbiAgICAgICAgICovdmFyIGZsb3dSaWdodD1jcmVhdGVGbG93KHRydWUpOy8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICovZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpe3JldHVybiB2YWx1ZTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAgICAgKiBmdW5jdGlvbi4gSWYgYGZ1bmNgIGlzIGEgcHJvcGVydHkgbmFtZSwgdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyB0aGVcbiAgICAgICAgICogcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgYGZ1bmNgIGlzIGFuIGFycmF5IG9yIG9iamVjdCwgdGhlXG4gICAgICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudFxuICAgICAgICAgKiBzb3VyY2UgcHJvcGVydGllcywgb3RoZXJ3aXNlIGl0IHJldHVybnMgYGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHBhcmFtIHsqfSBbZnVuYz1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhIGNhbGxiYWNrLlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNhbGxiYWNrLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICAgICAqIF07XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSkpO1xuICAgICAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH1dXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoWyd1c2VyJywgJ2ZyZWQnXSkpO1xuICAgICAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdmcmVkJywgJ2FnZSc6IDQwIH1dXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLm1hcCh1c2VycywgXy5pdGVyYXRlZSgndXNlcicpKTtcbiAgICAgICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIENyZWF0ZSBjdXN0b20gaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgICAgICogXy5pdGVyYXRlZSA9IF8ud3JhcChfLml0ZXJhdGVlLCBmdW5jdGlvbihpdGVyYXRlZSwgZnVuYykge1xuICAgICAgICAgKiAgIHJldHVybiAhXy5pc1JlZ0V4cChmdW5jKSA/IGl0ZXJhdGVlKGZ1bmMpIDogZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgICAqICAgICByZXR1cm4gZnVuYy50ZXN0KHN0cmluZyk7XG4gICAgICAgICAqICAgfTtcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZmlsdGVyKFsnYWJjJywgJ2RlZiddLCAvZWYvKTtcbiAgICAgICAgICogLy8gPT4gWydkZWYnXVxuICAgICAgICAgKi9mdW5jdGlvbiBpdGVyYXRlZShmdW5jKXtyZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jPT09J2Z1bmN0aW9uJz9mdW5jOmJhc2VDbG9uZShmdW5jLENMT05FX0RFRVBfRkxBRykpO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGEgZ2l2ZW5cbiAgICAgICAgICogb2JqZWN0IGFuZCBgc291cmNlYCwgcmV0dXJuaW5nIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGhhcyBlcXVpdmFsZW50XG4gICAgICAgICAqIHByb3BlcnR5IHZhbHVlcywgZWxzZSBgZmFsc2VgLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5pc01hdGNoYCB3aXRoIGBzb3VyY2VgXG4gICAgICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdCBgc291cmNlYFxuICAgICAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgICAgICogXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5tYXRjaGVzKHsgJ2EnOiA0LCAnYyc6IDYgfSkpO1xuICAgICAgICAgKiAvLyA9PiBbeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICAgICAqL2Z1bmN0aW9uIG1hdGNoZXMoc291cmNlKXtyZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0aGVcbiAgICAgICAgICogdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0IHRvIGBzcmNWYWx1ZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlXG4gICAgICAgICAqIG9iamVjdCB2YWx1ZSBpcyBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdFxuICAgICAgICAgKiBgc3JjVmFsdWVgIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlXG4gICAgICAgICAqIGBfLmlzRXF1YWxgIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgICAgICogXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5maW5kKG9iamVjdHMsIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCkpO1xuICAgICAgICAgKiAvLyA9PiB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAgICAgKi9mdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCxzcmNWYWx1ZSl7cmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCxiYXNlQ2xvbmUoc3JjVmFsdWUsQ0xPTkVfREVFUF9GTEFHKSk7fS8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAgICAgKiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICAgICAqICAgeyAnYSc6IHsgJ2InOiBfLmNvbnN0YW50KDIpIH0gfSxcbiAgICAgICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMSkgfSB9XG4gICAgICAgICAqIF07XG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKCdhLmInKSk7XG4gICAgICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZChbJ2EnLCAnYiddKSk7XG4gICAgICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAgICAgKi92YXIgbWV0aG9kPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyk7fTt9KTsvKipcbiAgICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tZXRob2RgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICAgKiB0aGUgbWV0aG9kIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAgICogcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiB2YXIgYXJyYXkgPSBfLnRpbWVzKDMsIF8uY29uc3RhbnQpLFxuICAgICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAgICpcbiAgICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgICAqXG4gICAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgICAqL3ZhciBtZXRob2RPZj1iYXNlUmVzdChmdW5jdGlvbihvYmplY3QsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKHBhdGgpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpO307fSk7LyoqXG4gICAgICAgKiBBZGRzIGFsbCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgZnVuY3Rpb24gcHJvcGVydGllcyBvZiBhIHNvdXJjZVxuICAgICAgICogb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuIElmIGBvYmplY3RgIGlzIGEgZnVuY3Rpb24sIHRoZW4gbWV0aG9kc1xuICAgICAgICogYXJlIGFkZGVkIHRvIGl0cyBwcm90b3R5cGUgYXMgd2VsbC5cbiAgICAgICAqXG4gICAgICAgKiAqKk5vdGU6KiogVXNlIGBfLnJ1bkluQ29udGV4dGAgdG8gY3JlYXRlIGEgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdG9cbiAgICAgICAqIGF2b2lkIGNvbmZsaWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbC5cbiAgICAgICAqXG4gICAgICAgKiBAc3RhdGljXG4gICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IFtvYmplY3Q9bG9kYXNoXSBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIGZ1bmN0aW9ucyB0byBhZGQuXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIG1peGlucyBhcmUgY2hhaW5hYmxlLlxuICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgICAqIEBleGFtcGxlXG4gICAgICAgKlxuICAgICAgICogZnVuY3Rpb24gdm93ZWxzKHN0cmluZykge1xuICAgICAgICogICByZXR1cm4gXy5maWx0ZXIoc3RyaW5nLCBmdW5jdGlvbih2KSB7XG4gICAgICAgKiAgICAgcmV0dXJuIC9bYWVpb3VdL2kudGVzdCh2KTtcbiAgICAgICAqICAgfSk7XG4gICAgICAgKiB9XG4gICAgICAgKlxuICAgICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSk7XG4gICAgICAgKiBfLnZvd2VscygnZnJlZCcpO1xuICAgICAgICogLy8gPT4gWydlJ11cbiAgICAgICAqXG4gICAgICAgKiBfKCdmcmVkJykudm93ZWxzKCkudmFsdWUoKTtcbiAgICAgICAqIC8vID0+IFsnZSddXG4gICAgICAgKlxuICAgICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSwgeyAnY2hhaW4nOiBmYWxzZSB9KTtcbiAgICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKTtcbiAgICAgICAqIC8vID0+IFsnZSddXG4gICAgICAgKi9mdW5jdGlvbiBtaXhpbihvYmplY3Qsc291cmNlLG9wdGlvbnMpe3ZhciBwcm9wcz1rZXlzKHNvdXJjZSksbWV0aG9kTmFtZXM9YmFzZUZ1bmN0aW9ucyhzb3VyY2UscHJvcHMpO2lmKG9wdGlvbnM9PW51bGwmJiEoaXNPYmplY3Qoc291cmNlKSYmKG1ldGhvZE5hbWVzLmxlbmd0aHx8IXByb3BzLmxlbmd0aCkpKXtvcHRpb25zPXNvdXJjZTtzb3VyY2U9b2JqZWN0O29iamVjdD10aGlzO21ldGhvZE5hbWVzPWJhc2VGdW5jdGlvbnMoc291cmNlLGtleXMoc291cmNlKSk7fXZhciBjaGFpbj0hKGlzT2JqZWN0KG9wdGlvbnMpJiYnY2hhaW4naW4gb3B0aW9ucyl8fCEhb3B0aW9ucy5jaGFpbixpc0Z1bmM9aXNGdW5jdGlvbihvYmplY3QpO2FycmF5RWFjaChtZXRob2ROYW1lcyxmdW5jdGlvbihtZXRob2ROYW1lKXt2YXIgZnVuYz1zb3VyY2VbbWV0aG9kTmFtZV07b2JqZWN0W21ldGhvZE5hbWVdPWZ1bmM7aWYoaXNGdW5jKXtvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7dmFyIGNoYWluQWxsPXRoaXMuX19jaGFpbl9fO2lmKGNoYWlufHxjaGFpbkFsbCl7dmFyIHJlc3VsdD1vYmplY3QodGhpcy5fX3dyYXBwZWRfXyksYWN0aW9ucz1yZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO2FjdGlvbnMucHVzaCh7ZnVuYzpmdW5jLGFyZ3M6YXJndW1lbnRzLHRoaXNBcmc6b2JqZWN0fSk7cmVzdWx0Ll9fY2hhaW5fXz1jaGFpbkFsbDtyZXR1cm4gcmVzdWx0O31yZXR1cm4gZnVuYy5hcHBseShvYmplY3QsYXJyYXlQdXNoKFt0aGlzLnZhbHVlKCldLGFyZ3VtZW50cykpO307fX0pO3JldHVybiBvYmplY3Q7fS8qKlxuICAgICAgICAgKiBSZXZlcnRzIHRoZSBgX2AgdmFyaWFibGUgdG8gaXRzIHByZXZpb3VzIHZhbHVlIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvXG4gICAgICAgICAqIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIGxvZGFzaCA9IF8ubm9Db25mbGljdCgpO1xuICAgICAgICAgKi9mdW5jdGlvbiBub0NvbmZsaWN0KCl7aWYocm9vdC5fPT09dGhpcyl7cm9vdC5fPW9sZERhc2g7fXJldHVybiB0aGlzO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgMi4zLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy50aW1lcygyLCBfLm5vb3ApO1xuICAgICAgICAgKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gICAgICAgICAqL2Z1bmN0aW9uIG5vb3AoKXt9Ly8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbi8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBnZXRzIHRoZSBhcmd1bWVudCBhdCBpbmRleCBgbmAuIElmIGBuYCBpcyBuZWdhdGl2ZSxcbiAgICAgICAgICogdGhlIG50aCBhcmd1bWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHJldHVybi5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFzcy10aHJ1IGZ1bmN0aW9uLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKDEpO1xuICAgICAgICAgKiBmdW5jKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICAgICAqIC8vID0+ICdiJ1xuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKC0yKTtcbiAgICAgICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAgICAgKiAvLyA9PiAnYydcbiAgICAgICAgICovZnVuY3Rpb24gbnRoQXJnKG4pe249dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXtyZXR1cm4gYmFzZU50aChhcmdzLG4pO30pO30vKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgaXRlcmF0ZWVzYCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXNcbiAgICAgICAgICogYW5kIHJldHVybnMgdGhlaXIgcmVzdWx0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlcihbTWF0aC5tYXgsIE1hdGgubWluXSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmMoMSwgMiwgMywgNCk7XG4gICAgICAgICAqIC8vID0+IFs0LCAxXVxuICAgICAgICAgKi92YXIgb3Zlcj1jcmVhdGVPdmVyKGFycmF5TWFwKTsvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYWxsKiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm5cbiAgICAgICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBmdW5jID0gXy5vdmVyRXZlcnkoW0Jvb2xlYW4sIGlzRmluaXRlXSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgICAgICogLy8gPT4gdHJ1ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jKG51bGwpO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBmdW5jKE5hTik7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqL3ZhciBvdmVyRXZlcnk9Y3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTsvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYW55Kiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm5cbiAgICAgICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBmdW5jID0gXy5vdmVyU29tZShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgICAgICpcbiAgICAgICAgICogZnVuYygnMScpO1xuICAgICAgICAgKiAvLyA9PiB0cnVlXG4gICAgICAgICAqXG4gICAgICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICAgICAqIC8vID0+IHRydWVcbiAgICAgICAgICpcbiAgICAgICAgICogZnVuYyhOYU4pO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi92YXIgb3ZlclNvbWU9Y3JlYXRlT3ZlcihhcnJheVNvbWUpOy8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDIuNC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgICAgICogICB7ICdhJzogeyAnYic6IDIgfSB9LFxuICAgICAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAgICAgICAgICogXTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICAgICAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAgICAgICAgICogLy8gPT4gWzEsIDJdXG4gICAgICAgICAqL2Z1bmN0aW9uIHByb3BlcnR5KHBhdGgpe3JldHVybiBpc0tleShwYXRoKT9iYXNlUHJvcGVydHkodG9LZXkocGF0aCkpOmJhc2VQcm9wZXJ0eURlZXAocGF0aCk7fS8qKlxuICAgICAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucHJvcGVydHlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXG4gICAgICAgICAqIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDMuMC4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBhcnJheSA9IFswLCAxLCAyXSxcbiAgICAgICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLm1hcChbJ2FbMl0nLCAnY1swXSddLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7XG4gICAgICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgICAgICogLy8gPT4gWzIsIDBdXG4gICAgICAgICAqL2Z1bmN0aW9uIHByb3BlcnR5T2Yob2JqZWN0KXtyZXR1cm4gZnVuY3Rpb24ocGF0aCl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6YmFzZUdldChvYmplY3QscGF0aCk7fTt9LyoqXG4gICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gICAgICAgICAqIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gQSBzdGVwIG9mIGAtMWAgaXMgdXNlZCBpZiBhIG5lZ2F0aXZlXG4gICAgICAgICAqIGBzdGFydGAgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYW4gYGVuZGAgb3IgYHN0ZXBgLiBJZiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAgICAgKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VSaWdodFxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnJhbmdlKDQpO1xuICAgICAgICAgKiAvLyA9PiBbMCwgMSwgMiwgM11cbiAgICAgICAgICpcbiAgICAgICAgICogXy5yYW5nZSgtNCk7XG4gICAgICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnJhbmdlKDEsIDUpO1xuICAgICAgICAgKiAvLyA9PiBbMSwgMiwgMywgNF1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5yYW5nZSgwLCAyMCwgNSk7XG4gICAgICAgICAqIC8vID0+IFswLCA1LCAxMCwgMTVdXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucmFuZ2UoMCwgLTQsIC0xKTtcbiAgICAgICAgICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ucmFuZ2UoMSwgNCwgMCk7XG4gICAgICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnJhbmdlKDApO1xuICAgICAgICAgKiAvLyA9PiBbXVxuICAgICAgICAgKi92YXIgcmFuZ2U9Y3JlYXRlUmFuZ2UoKTsvKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yYW5nZWAgZXhjZXB0IHRoYXQgaXQgcG9wdWxhdGVzIHZhbHVlcyBpblxuICAgICAgICAgKiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnJhbmdlUmlnaHQoNCk7XG4gICAgICAgICAqIC8vID0+IFszLCAyLCAxLCAwXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnJhbmdlUmlnaHQoLTQpO1xuICAgICAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5yYW5nZVJpZ2h0KDEsIDUpO1xuICAgICAgICAgKiAvLyA9PiBbNCwgMywgMiwgMV1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5yYW5nZVJpZ2h0KDAsIDIwLCA1KTtcbiAgICAgICAgICogLy8gPT4gWzE1LCAxMCwgNSwgMF1cbiAgICAgICAgICpcbiAgICAgICAgICogXy5yYW5nZVJpZ2h0KDAsIC00LCAtMSk7XG4gICAgICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnJhbmdlUmlnaHQoMSwgNCwgMCk7XG4gICAgICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnJhbmdlUmlnaHQoMCk7XG4gICAgICAgICAqIC8vID0+IFtdXG4gICAgICAgICAqL3ZhciByYW5nZVJpZ2h0PWNyZWF0ZVJhbmdlKHRydWUpOy8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAgICAgICAgICpcbiAgICAgICAgICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAgICAgICAgICogLy8gPT4gW1tdLCBbXV1cbiAgICAgICAgICpcbiAgICAgICAgICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICAgICAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAgICAgKi9mdW5jdGlvbiBzdHViQXJyYXkoKXtyZXR1cm5bXTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICAgICAgICAgKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICAgICAgICAgKi9mdW5jdGlvbiBzdHViRmFsc2UoKXtyZXR1cm4gZmFsc2U7fS8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBvYmplY3QuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLnN0dWJPYmplY3QpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgICAgICogLy8gPT4gW3t9LCB7fV1cbiAgICAgICAgICpcbiAgICAgICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICAgICAqIC8vID0+IGZhbHNlXG4gICAgICAgICAqL2Z1bmN0aW9uIHN0dWJPYmplY3QoKXtyZXR1cm57fTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlN0cmluZyk7XG4gICAgICAgICAqIC8vID0+IFsnJywgJyddXG4gICAgICAgICAqL2Z1bmN0aW9uIHN0dWJTdHJpbmcoKXtyZXR1cm4nJzt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlRydWUpO1xuICAgICAgICAgKiAvLyA9PiBbdHJ1ZSwgdHJ1ZV1cbiAgICAgICAgICovZnVuY3Rpb24gc3R1YlRydWUoKXtyZXR1cm4gdHJ1ZTt9LyoqXG4gICAgICAgICAqIEludm9rZXMgdGhlIGl0ZXJhdGVlIGBuYCB0aW1lcywgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mXG4gICAgICAgICAqIGVhY2ggaW52b2NhdGlvbi4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7IChpbmRleCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udGltZXMoMywgU3RyaW5nKTtcbiAgICAgICAgICogLy8gPT4gWycwJywgJzEnLCAnMiddXG4gICAgICAgICAqXG4gICAgICAgICAqICBfLnRpbWVzKDQsIF8uY29uc3RhbnQoMCkpO1xuICAgICAgICAgKiAvLyA9PiBbMCwgMCwgMCwgMF1cbiAgICAgICAgICovZnVuY3Rpb24gdGltZXMobixpdGVyYXRlZSl7bj10b0ludGVnZXIobik7aWYobjwxfHxuPk1BWF9TQUZFX0lOVEVHRVIpe3JldHVybltdO312YXIgaW5kZXg9TUFYX0FSUkFZX0xFTkdUSCxsZW5ndGg9bmF0aXZlTWluKG4sTUFYX0FSUkFZX0xFTkdUSCk7aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUpO24tPU1BWF9BUlJBWV9MRU5HVEg7dmFyIHJlc3VsdD1iYXNlVGltZXMobGVuZ3RoLGl0ZXJhdGVlKTt3aGlsZSgrK2luZGV4PG4pe2l0ZXJhdGVlKGluZGV4KTt9cmV0dXJuIHJlc3VsdDt9LyoqXG4gICAgICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnRvUGF0aCgnYS5iLmMnKTtcbiAgICAgICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICAgICAqXG4gICAgICAgICAqIF8udG9QYXRoKCdhWzBdLmIuYycpO1xuICAgICAgICAgKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICAgICAgICAgKi9mdW5jdGlvbiB0b1BhdGgodmFsdWUpe2lmKGlzQXJyYXkodmFsdWUpKXtyZXR1cm4gYXJyYXlNYXAodmFsdWUsdG9LZXkpO31yZXR1cm4gaXNTeW1ib2wodmFsdWUpP1t2YWx1ZV06Y29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKTt9LyoqXG4gICAgICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgZ2l2ZW4sIHRoZSBJRCBpcyBhcHBlbmRlZCB0byBpdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9JyddIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuaXF1ZSBJRC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy51bmlxdWVJZCgnY29udGFjdF8nKTtcbiAgICAgICAgICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnVuaXF1ZUlkKCk7XG4gICAgICAgICAqIC8vID0+ICcxMDUnXG4gICAgICAgICAqL2Z1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCl7dmFyIGlkPSsraWRDb3VudGVyO3JldHVybiB0b1N0cmluZyhwcmVmaXgpK2lkO30vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKlxuICAgICAgICAgKiBBZGRzIHR3byBudW1iZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gYXVnZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhZGRlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRvdGFsLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLmFkZCg2LCA0KTtcbiAgICAgICAgICogLy8gPT4gMTBcbiAgICAgICAgICovdmFyIGFkZD1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGF1Z2VuZCxhZGRlbmQpe3JldHVybiBhdWdlbmQrYWRkZW5kO30sMCk7LyoqXG4gICAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHVwIHRvIGBwcmVjaXNpb25gLlxuICAgICAgICpcbiAgICAgICAqIEBzdGF0aWNcbiAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIHVwLlxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCB1cCB0by5cbiAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgdXAgbnVtYmVyLlxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqXG4gICAgICAgKiBfLmNlaWwoNC4wMDYpO1xuICAgICAgICogLy8gPT4gNVxuICAgICAgICpcbiAgICAgICAqIF8uY2VpbCg2LjAwNCwgMik7XG4gICAgICAgKiAvLyA9PiA2LjAxXG4gICAgICAgKlxuICAgICAgICogXy5jZWlsKDYwNDAsIC0yKTtcbiAgICAgICAqIC8vID0+IDYxMDBcbiAgICAgICAqL3ZhciBjZWlsPWNyZWF0ZVJvdW5kKCdjZWlsJyk7LyoqXG4gICAgICAgICAqIERpdmlkZSB0d28gbnVtYmVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlkZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzb3IgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcXVvdGllbnQuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8uZGl2aWRlKDYsIDQpO1xuICAgICAgICAgKiAvLyA9PiAxLjVcbiAgICAgICAgICovdmFyIGRpdmlkZT1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLGRpdmlzb3Ipe3JldHVybiBkaXZpZGVuZC9kaXZpc29yO30sMSk7LyoqXG4gICAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIGRvd24gdG8gYHByZWNpc2lvbmAuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgZG93bi5cbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgZG93biB0by5cbiAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgZG93biBudW1iZXIuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIF8uZmxvb3IoNC4wMDYpO1xuICAgICAgICogLy8gPT4gNFxuICAgICAgICpcbiAgICAgICAqIF8uZmxvb3IoMC4wNDYsIDIpO1xuICAgICAgICogLy8gPT4gMC4wNFxuICAgICAgICpcbiAgICAgICAqIF8uZmxvb3IoNDA2MCwgLTIpO1xuICAgICAgICogLy8gPT4gNDAwMFxuICAgICAgICovdmFyIGZsb29yPWNyZWF0ZVJvdW5kKCdmbG9vcicpOy8qKlxuICAgICAgICAgKiBDb21wdXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAgICAgICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHNpbmNlIDAuMS4wXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAgICAgKiAvLyA9PiA4XG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubWF4KFtdKTtcbiAgICAgICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICAgICAqL2Z1bmN0aW9uIG1heChhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VHdCk6dW5kZWZpbmVkO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tYXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogMSB9LCB7ICduJzogMiB9XTtcbiAgICAgICAgICpcbiAgICAgICAgICogXy5tYXhCeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLm1heEJ5KG9iamVjdHMsICduJyk7XG4gICAgICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgICAgICovZnVuY3Rpb24gbWF4QnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VFeHRyZW11bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSxiYXNlR3QpOnVuZGVmaW5lZDt9LyoqXG4gICAgICAgICAqIENvbXB1dGVzIHRoZSBtZWFuIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5tZWFuKFs0LCAyLCA4LCA2XSk7XG4gICAgICAgICAqIC8vID0+IDVcbiAgICAgICAgICovZnVuY3Rpb24gbWVhbihhcnJheSl7cmV0dXJuIGJhc2VNZWFuKGFycmF5LGlkZW50aXR5KTt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVhbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBhdmVyYWdlZC5cbiAgICAgICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHNpbmNlIDQuNy4wXG4gICAgICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICAgICAqIC8vID0+IDVcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsICduJyk7XG4gICAgICAgICAqIC8vID0+IDVcbiAgICAgICAgICovZnVuY3Rpb24gbWVhbkJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYmFzZU1lYW4oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpO30vKipcbiAgICAgICAgICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogXy5taW4oWzQsIDIsIDgsIDZdKTtcbiAgICAgICAgICogLy8gPT4gMlxuICAgICAgICAgKlxuICAgICAgICAgKiBfLm1pbihbXSk7XG4gICAgICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAgICAgKi9mdW5jdGlvbiBtaW4oYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VFeHRyZW11bShhcnJheSxpZGVudGl0eSxiYXNlTHQpOnVuZGVmaW5lZDt9LyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgICAgICogLy8gPT4geyAnbic6IDEgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgICAgICogXy5taW5CeShvYmplY3RzLCAnbicpO1xuICAgICAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICAgICAqL2Z1bmN0aW9uIG1pbkJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUx0KTp1bmRlZmluZWQ7fS8qKlxuICAgICAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpZXIgVGhlIGZpcnN0IG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbXVsdGlwbGljYW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgbXVsdGlwbGljYXRpb24uXG4gICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHByb2R1Y3QuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIF8ubXVsdGlwbHkoNiwgNCk7XG4gICAgICAgICAqIC8vID0+IDI0XG4gICAgICAgICAqL3ZhciBtdWx0aXBseT1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG11bHRpcGxpZXIsbXVsdGlwbGljYW5kKXtyZXR1cm4gbXVsdGlwbGllciptdWx0aXBsaWNhbmQ7fSwxKTsvKipcbiAgICAgICAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgdG8gYHByZWNpc2lvbmAuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQuXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHRvLlxuICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBudW1iZXIuXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIF8ucm91bmQoNC4wMDYpO1xuICAgICAgICogLy8gPT4gNFxuICAgICAgICpcbiAgICAgICAqIF8ucm91bmQoNC4wMDYsIDIpO1xuICAgICAgICogLy8gPT4gNC4wMVxuICAgICAgICpcbiAgICAgICAqIF8ucm91bmQoNDA2MCwgLTIpO1xuICAgICAgICogLy8gPT4gNDEwMFxuICAgICAgICovdmFyIHJvdW5kPWNyZWF0ZVJvdW5kKCdyb3VuZCcpOy8qKlxuICAgICAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnVlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3VidHJhaGVuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBfLnN1YnRyYWN0KDYsIDQpO1xuICAgICAgICAgKiAvLyA9PiAyXG4gICAgICAgICAqL3ZhciBzdWJ0cmFjdD1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsc3VidHJhaGVuZCl7cmV0dXJuIG1pbnVlbmQtc3VidHJhaGVuZDt9LDApOy8qKlxuICAgICAgICogQ29tcHV0ZXMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICAgKlxuICAgICAgICogQHN0YXRpY1xuICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICpcbiAgICAgICAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7XG4gICAgICAgKiAvLyA9PiAyMFxuICAgICAgICovZnVuY3Rpb24gc3VtKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGlkZW50aXR5KTowO30vKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zdW1gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgc3VtbWVkLlxuICAgICAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dO1xuICAgICAgICAgKlxuICAgICAgICAgKiBfLnN1bUJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICAgICAqIC8vID0+IDIwXG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAgICAgKiBfLnN1bUJ5KG9iamVjdHMsICduJyk7XG4gICAgICAgICAqIC8vID0+IDIwXG4gICAgICAgICAqL2Z1bmN0aW9uIHN1bUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTowO30vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHdyYXBwZWQgdmFsdWVzIGluIGNoYWluIHNlcXVlbmNlcy5cbmxvZGFzaC5hZnRlcj1hZnRlcjtsb2Rhc2guYXJ5PWFyeTtsb2Rhc2guYXNzaWduPWFzc2lnbjtsb2Rhc2guYXNzaWduSW49YXNzaWduSW47bG9kYXNoLmFzc2lnbkluV2l0aD1hc3NpZ25JbldpdGg7bG9kYXNoLmFzc2lnbldpdGg9YXNzaWduV2l0aDtsb2Rhc2guYXQ9YXQ7bG9kYXNoLmJlZm9yZT1iZWZvcmU7bG9kYXNoLmJpbmQ9YmluZDtsb2Rhc2guYmluZEFsbD1iaW5kQWxsO2xvZGFzaC5iaW5kS2V5PWJpbmRLZXk7bG9kYXNoLmNhc3RBcnJheT1jYXN0QXJyYXk7bG9kYXNoLmNoYWluPWNoYWluO2xvZGFzaC5jaHVuaz1jaHVuaztsb2Rhc2guY29tcGFjdD1jb21wYWN0O2xvZGFzaC5jb25jYXQ9Y29uY2F0O2xvZGFzaC5jb25kPWNvbmQ7bG9kYXNoLmNvbmZvcm1zPWNvbmZvcm1zO2xvZGFzaC5jb25zdGFudD1jb25zdGFudDtsb2Rhc2guY291bnRCeT1jb3VudEJ5O2xvZGFzaC5jcmVhdGU9Y3JlYXRlO2xvZGFzaC5jdXJyeT1jdXJyeTtsb2Rhc2guY3VycnlSaWdodD1jdXJyeVJpZ2h0O2xvZGFzaC5kZWJvdW5jZT1kZWJvdW5jZTtsb2Rhc2guZGVmYXVsdHM9ZGVmYXVsdHM7bG9kYXNoLmRlZmF1bHRzRGVlcD1kZWZhdWx0c0RlZXA7bG9kYXNoLmRlZmVyPWRlZmVyO2xvZGFzaC5kZWxheT1kZWxheTtsb2Rhc2guZGlmZmVyZW5jZT1kaWZmZXJlbmNlO2xvZGFzaC5kaWZmZXJlbmNlQnk9ZGlmZmVyZW5jZUJ5O2xvZGFzaC5kaWZmZXJlbmNlV2l0aD1kaWZmZXJlbmNlV2l0aDtsb2Rhc2guZHJvcD1kcm9wO2xvZGFzaC5kcm9wUmlnaHQ9ZHJvcFJpZ2h0O2xvZGFzaC5kcm9wUmlnaHRXaGlsZT1kcm9wUmlnaHRXaGlsZTtsb2Rhc2guZHJvcFdoaWxlPWRyb3BXaGlsZTtsb2Rhc2guZmlsbD1maWxsO2xvZGFzaC5maWx0ZXI9ZmlsdGVyO2xvZGFzaC5mbGF0TWFwPWZsYXRNYXA7bG9kYXNoLmZsYXRNYXBEZWVwPWZsYXRNYXBEZWVwO2xvZGFzaC5mbGF0TWFwRGVwdGg9ZmxhdE1hcERlcHRoO2xvZGFzaC5mbGF0dGVuPWZsYXR0ZW47bG9kYXNoLmZsYXR0ZW5EZWVwPWZsYXR0ZW5EZWVwO2xvZGFzaC5mbGF0dGVuRGVwdGg9ZmxhdHRlbkRlcHRoO2xvZGFzaC5mbGlwPWZsaXA7bG9kYXNoLmZsb3c9Zmxvdztsb2Rhc2guZmxvd1JpZ2h0PWZsb3dSaWdodDtsb2Rhc2guZnJvbVBhaXJzPWZyb21QYWlycztsb2Rhc2guZnVuY3Rpb25zPWZ1bmN0aW9ucztsb2Rhc2guZnVuY3Rpb25zSW49ZnVuY3Rpb25zSW47bG9kYXNoLmdyb3VwQnk9Z3JvdXBCeTtsb2Rhc2guaW5pdGlhbD1pbml0aWFsO2xvZGFzaC5pbnRlcnNlY3Rpb249aW50ZXJzZWN0aW9uO2xvZGFzaC5pbnRlcnNlY3Rpb25CeT1pbnRlcnNlY3Rpb25CeTtsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aD1pbnRlcnNlY3Rpb25XaXRoO2xvZGFzaC5pbnZlcnQ9aW52ZXJ0O2xvZGFzaC5pbnZlcnRCeT1pbnZlcnRCeTtsb2Rhc2guaW52b2tlTWFwPWludm9rZU1hcDtsb2Rhc2guaXRlcmF0ZWU9aXRlcmF0ZWU7bG9kYXNoLmtleUJ5PWtleUJ5O2xvZGFzaC5rZXlzPWtleXM7bG9kYXNoLmtleXNJbj1rZXlzSW47bG9kYXNoLm1hcD1tYXA7bG9kYXNoLm1hcEtleXM9bWFwS2V5cztsb2Rhc2gubWFwVmFsdWVzPW1hcFZhbHVlcztsb2Rhc2gubWF0Y2hlcz1tYXRjaGVzO2xvZGFzaC5tYXRjaGVzUHJvcGVydHk9bWF0Y2hlc1Byb3BlcnR5O2xvZGFzaC5tZW1vaXplPW1lbW9pemU7bG9kYXNoLm1lcmdlPW1lcmdlO2xvZGFzaC5tZXJnZVdpdGg9bWVyZ2VXaXRoO2xvZGFzaC5tZXRob2Q9bWV0aG9kO2xvZGFzaC5tZXRob2RPZj1tZXRob2RPZjtsb2Rhc2gubWl4aW49bWl4aW47bG9kYXNoLm5lZ2F0ZT1uZWdhdGU7bG9kYXNoLm50aEFyZz1udGhBcmc7bG9kYXNoLm9taXQ9b21pdDtsb2Rhc2gub21pdEJ5PW9taXRCeTtsb2Rhc2gub25jZT1vbmNlO2xvZGFzaC5vcmRlckJ5PW9yZGVyQnk7bG9kYXNoLm92ZXI9b3Zlcjtsb2Rhc2gub3ZlckFyZ3M9b3ZlckFyZ3M7bG9kYXNoLm92ZXJFdmVyeT1vdmVyRXZlcnk7bG9kYXNoLm92ZXJTb21lPW92ZXJTb21lO2xvZGFzaC5wYXJ0aWFsPXBhcnRpYWw7bG9kYXNoLnBhcnRpYWxSaWdodD1wYXJ0aWFsUmlnaHQ7bG9kYXNoLnBhcnRpdGlvbj1wYXJ0aXRpb247bG9kYXNoLnBpY2s9cGljaztsb2Rhc2gucGlja0J5PXBpY2tCeTtsb2Rhc2gucHJvcGVydHk9cHJvcGVydHk7bG9kYXNoLnByb3BlcnR5T2Y9cHJvcGVydHlPZjtsb2Rhc2gucHVsbD1wdWxsO2xvZGFzaC5wdWxsQWxsPXB1bGxBbGw7bG9kYXNoLnB1bGxBbGxCeT1wdWxsQWxsQnk7bG9kYXNoLnB1bGxBbGxXaXRoPXB1bGxBbGxXaXRoO2xvZGFzaC5wdWxsQXQ9cHVsbEF0O2xvZGFzaC5yYW5nZT1yYW5nZTtsb2Rhc2gucmFuZ2VSaWdodD1yYW5nZVJpZ2h0O2xvZGFzaC5yZWFyZz1yZWFyZztsb2Rhc2gucmVqZWN0PXJlamVjdDtsb2Rhc2gucmVtb3ZlPXJlbW92ZTtsb2Rhc2gucmVzdD1yZXN0O2xvZGFzaC5yZXZlcnNlPXJldmVyc2U7bG9kYXNoLnNhbXBsZVNpemU9c2FtcGxlU2l6ZTtsb2Rhc2guc2V0PXNldDtsb2Rhc2guc2V0V2l0aD1zZXRXaXRoO2xvZGFzaC5zaHVmZmxlPXNodWZmbGU7bG9kYXNoLnNsaWNlPXNsaWNlO2xvZGFzaC5zb3J0Qnk9c29ydEJ5O2xvZGFzaC5zb3J0ZWRVbmlxPXNvcnRlZFVuaXE7bG9kYXNoLnNvcnRlZFVuaXFCeT1zb3J0ZWRVbmlxQnk7bG9kYXNoLnNwbGl0PXNwbGl0O2xvZGFzaC5zcHJlYWQ9c3ByZWFkO2xvZGFzaC50YWlsPXRhaWw7bG9kYXNoLnRha2U9dGFrZTtsb2Rhc2gudGFrZVJpZ2h0PXRha2VSaWdodDtsb2Rhc2gudGFrZVJpZ2h0V2hpbGU9dGFrZVJpZ2h0V2hpbGU7bG9kYXNoLnRha2VXaGlsZT10YWtlV2hpbGU7bG9kYXNoLnRhcD10YXA7bG9kYXNoLnRocm90dGxlPXRocm90dGxlO2xvZGFzaC50aHJ1PXRocnU7bG9kYXNoLnRvQXJyYXk9dG9BcnJheTtsb2Rhc2gudG9QYWlycz10b1BhaXJzO2xvZGFzaC50b1BhaXJzSW49dG9QYWlyc0luO2xvZGFzaC50b1BhdGg9dG9QYXRoO2xvZGFzaC50b1BsYWluT2JqZWN0PXRvUGxhaW5PYmplY3Q7bG9kYXNoLnRyYW5zZm9ybT10cmFuc2Zvcm07bG9kYXNoLnVuYXJ5PXVuYXJ5O2xvZGFzaC51bmlvbj11bmlvbjtsb2Rhc2gudW5pb25CeT11bmlvbkJ5O2xvZGFzaC51bmlvbldpdGg9dW5pb25XaXRoO2xvZGFzaC51bmlxPXVuaXE7bG9kYXNoLnVuaXFCeT11bmlxQnk7bG9kYXNoLnVuaXFXaXRoPXVuaXFXaXRoO2xvZGFzaC51bnNldD11bnNldDtsb2Rhc2gudW56aXA9dW56aXA7bG9kYXNoLnVuemlwV2l0aD11bnppcFdpdGg7bG9kYXNoLnVwZGF0ZT11cGRhdGU7bG9kYXNoLnVwZGF0ZVdpdGg9dXBkYXRlV2l0aDtsb2Rhc2gudmFsdWVzPXZhbHVlcztsb2Rhc2gudmFsdWVzSW49dmFsdWVzSW47bG9kYXNoLndpdGhvdXQ9d2l0aG91dDtsb2Rhc2gud29yZHM9d29yZHM7bG9kYXNoLndyYXA9d3JhcDtsb2Rhc2gueG9yPXhvcjtsb2Rhc2gueG9yQnk9eG9yQnk7bG9kYXNoLnhvcldpdGg9eG9yV2l0aDtsb2Rhc2guemlwPXppcDtsb2Rhc2guemlwT2JqZWN0PXppcE9iamVjdDtsb2Rhc2guemlwT2JqZWN0RGVlcD16aXBPYmplY3REZWVwO2xvZGFzaC56aXBXaXRoPXppcFdpdGg7Ly8gQWRkIGFsaWFzZXMuXG5sb2Rhc2guZW50cmllcz10b1BhaXJzO2xvZGFzaC5lbnRyaWVzSW49dG9QYWlyc0luO2xvZGFzaC5leHRlbmQ9YXNzaWduSW47bG9kYXNoLmV4dGVuZFdpdGg9YXNzaWduSW5XaXRoOy8vIEFkZCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbm1peGluKGxvZGFzaCxsb2Rhc2gpOy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG5sb2Rhc2guYWRkPWFkZDtsb2Rhc2guYXR0ZW1wdD1hdHRlbXB0O2xvZGFzaC5jYW1lbENhc2U9Y2FtZWxDYXNlO2xvZGFzaC5jYXBpdGFsaXplPWNhcGl0YWxpemU7bG9kYXNoLmNlaWw9Y2VpbDtsb2Rhc2guY2xhbXA9Y2xhbXA7bG9kYXNoLmNsb25lPWNsb25lO2xvZGFzaC5jbG9uZURlZXA9Y2xvbmVEZWVwO2xvZGFzaC5jbG9uZURlZXBXaXRoPWNsb25lRGVlcFdpdGg7bG9kYXNoLmNsb25lV2l0aD1jbG9uZVdpdGg7bG9kYXNoLmNvbmZvcm1zVG89Y29uZm9ybXNUbztsb2Rhc2guZGVidXJyPWRlYnVycjtsb2Rhc2guZGVmYXVsdFRvPWRlZmF1bHRUbztsb2Rhc2guZGl2aWRlPWRpdmlkZTtsb2Rhc2guZW5kc1dpdGg9ZW5kc1dpdGg7bG9kYXNoLmVxPWVxO2xvZGFzaC5lc2NhcGU9ZXNjYXBlO2xvZGFzaC5lc2NhcGVSZWdFeHA9ZXNjYXBlUmVnRXhwO2xvZGFzaC5ldmVyeT1ldmVyeTtsb2Rhc2guZmluZD1maW5kO2xvZGFzaC5maW5kSW5kZXg9ZmluZEluZGV4O2xvZGFzaC5maW5kS2V5PWZpbmRLZXk7bG9kYXNoLmZpbmRMYXN0PWZpbmRMYXN0O2xvZGFzaC5maW5kTGFzdEluZGV4PWZpbmRMYXN0SW5kZXg7bG9kYXNoLmZpbmRMYXN0S2V5PWZpbmRMYXN0S2V5O2xvZGFzaC5mbG9vcj1mbG9vcjtsb2Rhc2guZm9yRWFjaD1mb3JFYWNoO2xvZGFzaC5mb3JFYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5mb3JJbj1mb3JJbjtsb2Rhc2guZm9ySW5SaWdodD1mb3JJblJpZ2h0O2xvZGFzaC5mb3JPd249Zm9yT3duO2xvZGFzaC5mb3JPd25SaWdodD1mb3JPd25SaWdodDtsb2Rhc2guZ2V0PWdldDtsb2Rhc2guZ3Q9Z3Q7bG9kYXNoLmd0ZT1ndGU7bG9kYXNoLmhhcz1oYXM7bG9kYXNoLmhhc0luPWhhc0luO2xvZGFzaC5oZWFkPWhlYWQ7bG9kYXNoLmlkZW50aXR5PWlkZW50aXR5O2xvZGFzaC5pbmNsdWRlcz1pbmNsdWRlcztsb2Rhc2guaW5kZXhPZj1pbmRleE9mO2xvZGFzaC5pblJhbmdlPWluUmFuZ2U7bG9kYXNoLmludm9rZT1pbnZva2U7bG9kYXNoLmlzQXJndW1lbnRzPWlzQXJndW1lbnRzO2xvZGFzaC5pc0FycmF5PWlzQXJyYXk7bG9kYXNoLmlzQXJyYXlCdWZmZXI9aXNBcnJheUJ1ZmZlcjtsb2Rhc2guaXNBcnJheUxpa2U9aXNBcnJheUxpa2U7bG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0PWlzQXJyYXlMaWtlT2JqZWN0O2xvZGFzaC5pc0Jvb2xlYW49aXNCb29sZWFuO2xvZGFzaC5pc0J1ZmZlcj1pc0J1ZmZlcjtsb2Rhc2guaXNEYXRlPWlzRGF0ZTtsb2Rhc2guaXNFbGVtZW50PWlzRWxlbWVudDtsb2Rhc2guaXNFbXB0eT1pc0VtcHR5O2xvZGFzaC5pc0VxdWFsPWlzRXF1YWw7bG9kYXNoLmlzRXF1YWxXaXRoPWlzRXF1YWxXaXRoO2xvZGFzaC5pc0Vycm9yPWlzRXJyb3I7bG9kYXNoLmlzRmluaXRlPWlzRmluaXRlO2xvZGFzaC5pc0Z1bmN0aW9uPWlzRnVuY3Rpb247bG9kYXNoLmlzSW50ZWdlcj1pc0ludGVnZXI7bG9kYXNoLmlzTGVuZ3RoPWlzTGVuZ3RoO2xvZGFzaC5pc01hcD1pc01hcDtsb2Rhc2guaXNNYXRjaD1pc01hdGNoO2xvZGFzaC5pc01hdGNoV2l0aD1pc01hdGNoV2l0aDtsb2Rhc2guaXNOYU49aXNOYU47bG9kYXNoLmlzTmF0aXZlPWlzTmF0aXZlO2xvZGFzaC5pc05pbD1pc05pbDtsb2Rhc2guaXNOdWxsPWlzTnVsbDtsb2Rhc2guaXNOdW1iZXI9aXNOdW1iZXI7bG9kYXNoLmlzT2JqZWN0PWlzT2JqZWN0O2xvZGFzaC5pc09iamVjdExpa2U9aXNPYmplY3RMaWtlO2xvZGFzaC5pc1BsYWluT2JqZWN0PWlzUGxhaW5PYmplY3Q7bG9kYXNoLmlzUmVnRXhwPWlzUmVnRXhwO2xvZGFzaC5pc1NhZmVJbnRlZ2VyPWlzU2FmZUludGVnZXI7bG9kYXNoLmlzU2V0PWlzU2V0O2xvZGFzaC5pc1N0cmluZz1pc1N0cmluZztsb2Rhc2guaXNTeW1ib2w9aXNTeW1ib2w7bG9kYXNoLmlzVHlwZWRBcnJheT1pc1R5cGVkQXJyYXk7bG9kYXNoLmlzVW5kZWZpbmVkPWlzVW5kZWZpbmVkO2xvZGFzaC5pc1dlYWtNYXA9aXNXZWFrTWFwO2xvZGFzaC5pc1dlYWtTZXQ9aXNXZWFrU2V0O2xvZGFzaC5qb2luPWpvaW47bG9kYXNoLmtlYmFiQ2FzZT1rZWJhYkNhc2U7bG9kYXNoLmxhc3Q9bGFzdDtsb2Rhc2gubGFzdEluZGV4T2Y9bGFzdEluZGV4T2Y7bG9kYXNoLmxvd2VyQ2FzZT1sb3dlckNhc2U7bG9kYXNoLmxvd2VyRmlyc3Q9bG93ZXJGaXJzdDtsb2Rhc2gubHQ9bHQ7bG9kYXNoLmx0ZT1sdGU7bG9kYXNoLm1heD1tYXg7bG9kYXNoLm1heEJ5PW1heEJ5O2xvZGFzaC5tZWFuPW1lYW47bG9kYXNoLm1lYW5CeT1tZWFuQnk7bG9kYXNoLm1pbj1taW47bG9kYXNoLm1pbkJ5PW1pbkJ5O2xvZGFzaC5zdHViQXJyYXk9c3R1YkFycmF5O2xvZGFzaC5zdHViRmFsc2U9c3R1YkZhbHNlO2xvZGFzaC5zdHViT2JqZWN0PXN0dWJPYmplY3Q7bG9kYXNoLnN0dWJTdHJpbmc9c3R1YlN0cmluZztsb2Rhc2guc3R1YlRydWU9c3R1YlRydWU7bG9kYXNoLm11bHRpcGx5PW11bHRpcGx5O2xvZGFzaC5udGg9bnRoO2xvZGFzaC5ub0NvbmZsaWN0PW5vQ29uZmxpY3Q7bG9kYXNoLm5vb3A9bm9vcDtsb2Rhc2gubm93PW5vdztsb2Rhc2gucGFkPXBhZDtsb2Rhc2gucGFkRW5kPXBhZEVuZDtsb2Rhc2gucGFkU3RhcnQ9cGFkU3RhcnQ7bG9kYXNoLnBhcnNlSW50PXBhcnNlSW50O2xvZGFzaC5yYW5kb209cmFuZG9tO2xvZGFzaC5yZWR1Y2U9cmVkdWNlO2xvZGFzaC5yZWR1Y2VSaWdodD1yZWR1Y2VSaWdodDtsb2Rhc2gucmVwZWF0PXJlcGVhdDtsb2Rhc2gucmVwbGFjZT1yZXBsYWNlO2xvZGFzaC5yZXN1bHQ9cmVzdWx0O2xvZGFzaC5yb3VuZD1yb3VuZDtsb2Rhc2gucnVuSW5Db250ZXh0PXJ1bkluQ29udGV4dDtsb2Rhc2guc2FtcGxlPXNhbXBsZTtsb2Rhc2guc2l6ZT1zaXplO2xvZGFzaC5zbmFrZUNhc2U9c25ha2VDYXNlO2xvZGFzaC5zb21lPXNvbWU7bG9kYXNoLnNvcnRlZEluZGV4PXNvcnRlZEluZGV4O2xvZGFzaC5zb3J0ZWRJbmRleEJ5PXNvcnRlZEluZGV4Qnk7bG9kYXNoLnNvcnRlZEluZGV4T2Y9c29ydGVkSW5kZXhPZjtsb2Rhc2guc29ydGVkTGFzdEluZGV4PXNvcnRlZExhc3RJbmRleDtsb2Rhc2guc29ydGVkTGFzdEluZGV4Qnk9c29ydGVkTGFzdEluZGV4Qnk7bG9kYXNoLnNvcnRlZExhc3RJbmRleE9mPXNvcnRlZExhc3RJbmRleE9mO2xvZGFzaC5zdGFydENhc2U9c3RhcnRDYXNlO2xvZGFzaC5zdGFydHNXaXRoPXN0YXJ0c1dpdGg7bG9kYXNoLnN1YnRyYWN0PXN1YnRyYWN0O2xvZGFzaC5zdW09c3VtO2xvZGFzaC5zdW1CeT1zdW1CeTtsb2Rhc2gudGVtcGxhdGU9dGVtcGxhdGU7bG9kYXNoLnRpbWVzPXRpbWVzO2xvZGFzaC50b0Zpbml0ZT10b0Zpbml0ZTtsb2Rhc2gudG9JbnRlZ2VyPXRvSW50ZWdlcjtsb2Rhc2gudG9MZW5ndGg9dG9MZW5ndGg7bG9kYXNoLnRvTG93ZXI9dG9Mb3dlcjtsb2Rhc2gudG9OdW1iZXI9dG9OdW1iZXI7bG9kYXNoLnRvU2FmZUludGVnZXI9dG9TYWZlSW50ZWdlcjtsb2Rhc2gudG9TdHJpbmc9dG9TdHJpbmc7bG9kYXNoLnRvVXBwZXI9dG9VcHBlcjtsb2Rhc2gudHJpbT10cmltO2xvZGFzaC50cmltRW5kPXRyaW1FbmQ7bG9kYXNoLnRyaW1TdGFydD10cmltU3RhcnQ7bG9kYXNoLnRydW5jYXRlPXRydW5jYXRlO2xvZGFzaC51bmVzY2FwZT11bmVzY2FwZTtsb2Rhc2gudW5pcXVlSWQ9dW5pcXVlSWQ7bG9kYXNoLnVwcGVyQ2FzZT11cHBlckNhc2U7bG9kYXNoLnVwcGVyRmlyc3Q9dXBwZXJGaXJzdDsvLyBBZGQgYWxpYXNlcy5cbmxvZGFzaC5lYWNoPWZvckVhY2g7bG9kYXNoLmVhY2hSaWdodD1mb3JFYWNoUmlnaHQ7bG9kYXNoLmZpcnN0PWhlYWQ7bWl4aW4obG9kYXNoLGZ1bmN0aW9uKCl7dmFyIHNvdXJjZT17fTtiYXNlRm9yT3duKGxvZGFzaCxmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe2lmKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaC5wcm90b3R5cGUsbWV0aG9kTmFtZSkpe3NvdXJjZVttZXRob2ROYW1lXT1mdW5jO319KTtyZXR1cm4gc291cmNlO30oKSx7Y2hhaW46ZmFsc2V9KTsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKlxuICAgICAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1lbWJlck9mIF9cbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovbG9kYXNoLlZFUlNJT049VkVSU0lPTjsvLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG5hcnJheUVhY2goWydiaW5kJywnYmluZEtleScsJ2N1cnJ5JywnY3VycnlSaWdodCcsJ3BhcnRpYWwnLCdwYXJ0aWFsUmlnaHQnXSxmdW5jdGlvbihtZXRob2ROYW1lKXtsb2Rhc2hbbWV0aG9kTmFtZV0ucGxhY2Vob2xkZXI9bG9kYXNoO30pOy8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmRyb3BgIGFuZCBgXy50YWtlYCB2YXJpYW50cy5cbmFycmF5RWFjaChbJ2Ryb3AnLCd0YWtlJ10sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKG4pe249bj09PXVuZGVmaW5lZD8xOm5hdGl2ZU1heCh0b0ludGVnZXIobiksMCk7dmFyIHJlc3VsdD10aGlzLl9fZmlsdGVyZWRfXyYmIWluZGV4P25ldyBMYXp5V3JhcHBlcih0aGlzKTp0aGlzLmNsb25lKCk7aWYocmVzdWx0Ll9fZmlsdGVyZWRfXyl7cmVzdWx0Ll9fdGFrZUNvdW50X189bmF0aXZlTWluKG4scmVzdWx0Ll9fdGFrZUNvdW50X18pO31lbHNle3Jlc3VsdC5fX3ZpZXdzX18ucHVzaCh7c2l6ZTpuYXRpdmVNaW4obixNQVhfQVJSQVlfTEVOR1RIKSx0eXBlOm1ldGhvZE5hbWUrKHJlc3VsdC5fX2Rpcl9fPDA/J1JpZ2h0JzonJyl9KTt9cmV0dXJuIHJlc3VsdDt9O0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lKydSaWdodCddPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLnJldmVyc2UoKVttZXRob2ROYW1lXShuKS5yZXZlcnNlKCk7fTt9KTsvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRoYXQgYWNjZXB0IGFuIGBpdGVyYXRlZWAgdmFsdWUuXG5hcnJheUVhY2goWydmaWx0ZXInLCdtYXAnLCd0YWtlV2hpbGUnXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgdHlwZT1pbmRleCsxLGlzRmlsdGVyPXR5cGU9PUxBWllfRklMVEVSX0ZMQUd8fHR5cGU9PUxBWllfV0hJTEVfRkxBRztMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oaXRlcmF0ZWUpe3ZhciByZXN1bHQ9dGhpcy5jbG9uZSgpO3Jlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goe2l0ZXJhdGVlOmdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpLHR5cGU6dHlwZX0pO3Jlc3VsdC5fX2ZpbHRlcmVkX189cmVzdWx0Ll9fZmlsdGVyZWRfX3x8aXNGaWx0ZXI7cmV0dXJuIHJlc3VsdDt9O30pOy8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmhlYWRgIGFuZCBgXy5sYXN0YC5cbmFycmF5RWFjaChbJ2hlYWQnLCdsYXN0J10sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7dmFyIHRha2VOYW1lPSd0YWtlJysoaW5kZXg/J1JpZ2h0JzonJyk7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF07fTt9KTsvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5pbml0aWFsYCBhbmQgYF8udGFpbGAuXG5hcnJheUVhY2goWydpbml0aWFsJywndGFpbCddLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe3ZhciBkcm9wTmFtZT0nZHJvcCcrKGluZGV4PycnOidSaWdodCcpO0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZmlsdGVyZWRfXz9uZXcgTGF6eVdyYXBwZXIodGhpcyk6dGhpc1tkcm9wTmFtZV0oMSk7fTt9KTtMYXp5V3JhcHBlci5wcm90b3R5cGUuY29tcGFjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcihpZGVudGl0eSk7fTtMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZD1mdW5jdGlvbihwcmVkaWNhdGUpe3JldHVybiB0aGlzLmZpbHRlcihwcmVkaWNhdGUpLmhlYWQoKTt9O0xhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kTGFzdD1mdW5jdGlvbihwcmVkaWNhdGUpe3JldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSk7fTtMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7aWYodHlwZW9mIHBhdGg9PT0nZnVuY3Rpb24nKXtyZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO31yZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpe3JldHVybiBiYXNlSW52b2tlKHZhbHVlLHBhdGgsYXJncyk7fSk7fSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbihwcmVkaWNhdGUpe3JldHVybiB0aGlzLmZpbHRlcihuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO307TGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHN0YXJ0LGVuZCl7c3RhcnQ9dG9JbnRlZ2VyKHN0YXJ0KTt2YXIgcmVzdWx0PXRoaXM7aWYocmVzdWx0Ll9fZmlsdGVyZWRfXyYmKHN0YXJ0PjB8fGVuZDwwKSl7cmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO31pZihzdGFydDwwKXtyZXN1bHQ9cmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO31lbHNlIGlmKHN0YXJ0KXtyZXN1bHQ9cmVzdWx0LmRyb3Aoc3RhcnQpO31pZihlbmQhPT11bmRlZmluZWQpe2VuZD10b0ludGVnZXIoZW5kKTtyZXN1bHQ9ZW5kPDA/cmVzdWx0LmRyb3BSaWdodCgtZW5kKTpyZXN1bHQudGFrZShlbmQtc3RhcnQpO31yZXR1cm4gcmVzdWx0O307TGF6eVdyYXBwZXIucHJvdG90eXBlLnRha2VSaWdodFdoaWxlPWZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLnRha2VXaGlsZShwcmVkaWNhdGUpLnJldmVyc2UoKTt9O0xhenlXcmFwcGVyLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKTt9Oy8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXt2YXIgY2hlY2tJdGVyYXRlZT0vXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChtZXRob2ROYW1lKSxpc1Rha2VyPS9eKD86aGVhZHxsYXN0KSQvLnRlc3QobWV0aG9kTmFtZSksbG9kYXNoRnVuYz1sb2Rhc2hbaXNUYWtlcj8ndGFrZScrKG1ldGhvZE5hbWU9PSdsYXN0Jz8nUmlnaHQnOicnKTptZXRob2ROYW1lXSxyZXRVbndyYXBwZWQ9aXNUYWtlcnx8L15maW5kLy50ZXN0KG1ldGhvZE5hbWUpO2lmKCFsb2Rhc2hGdW5jKXtyZXR1cm47fWxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgdmFsdWU9dGhpcy5fX3dyYXBwZWRfXyxhcmdzPWlzVGFrZXI/WzFdOmFyZ3VtZW50cyxpc0xhenk9dmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixpdGVyYXRlZT1hcmdzWzBdLHVzZUxhenk9aXNMYXp5fHxpc0FycmF5KHZhbHVlKTt2YXIgaW50ZXJjZXB0b3I9ZnVuY3Rpb24gaW50ZXJjZXB0b3IodmFsdWUpe3ZhciByZXN1bHQ9bG9kYXNoRnVuYy5hcHBseShsb2Rhc2gsYXJyYXlQdXNoKFt2YWx1ZV0sYXJncykpO3JldHVybiBpc1Rha2VyJiZjaGFpbkFsbD9yZXN1bHRbMF06cmVzdWx0O307aWYodXNlTGF6eSYmY2hlY2tJdGVyYXRlZSYmdHlwZW9mIGl0ZXJhdGVlPT09J2Z1bmN0aW9uJyYmaXRlcmF0ZWUubGVuZ3RoIT0xKXsvLyBBdm9pZCBsYXp5IHVzZSBpZiB0aGUgaXRlcmF0ZWUgaGFzIGEgXCJsZW5ndGhcIiB2YWx1ZSBvdGhlciB0aGFuIGAxYC5cbmlzTGF6eT11c2VMYXp5PWZhbHNlO312YXIgY2hhaW5BbGw9dGhpcy5fX2NoYWluX18saXNIeWJyaWQ9ISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxpc1Vud3JhcHBlZD1yZXRVbndyYXBwZWQmJiFjaGFpbkFsbCxvbmx5TGF6eT1pc0xhenkmJiFpc0h5YnJpZDtpZighcmV0VW53cmFwcGVkJiZ1c2VMYXp5KXt2YWx1ZT1vbmx5TGF6eT92YWx1ZTpuZXcgTGF6eVdyYXBwZXIodGhpcyk7dmFyIHJlc3VsdD1mdW5jLmFwcGx5KHZhbHVlLGFyZ3MpO3Jlc3VsdC5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOnRocnUsYXJnczpbaW50ZXJjZXB0b3JdLHRoaXNBcmc6dW5kZWZpbmVkfSk7cmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHJlc3VsdCxjaGFpbkFsbCk7fWlmKGlzVW53cmFwcGVkJiZvbmx5TGF6eSl7cmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmdzKTt9cmVzdWx0PXRoaXMudGhydShpbnRlcmNlcHRvcik7cmV0dXJuIGlzVW53cmFwcGVkP2lzVGFrZXI/cmVzdWx0LnZhbHVlKClbMF06cmVzdWx0LnZhbHVlKCk6cmVzdWx0O307fSk7Ly8gQWRkIGBBcnJheWAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG5hcnJheUVhY2goWydwb3AnLCdwdXNoJywnc2hpZnQnLCdzb3J0Jywnc3BsaWNlJywndW5zaGlmdCddLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe3ZhciBmdW5jPWFycmF5UHJvdG9bbWV0aG9kTmFtZV0sY2hhaW5OYW1lPS9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdChtZXRob2ROYW1lKT8ndGFwJzondGhydScscmV0VW53cmFwcGVkPS9eKD86cG9wfHNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk7bG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztpZihyZXRVbndyYXBwZWQmJiF0aGlzLl9fY2hhaW5fXyl7dmFyIHZhbHVlPXRoaXMudmFsdWUoKTtyZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKT92YWx1ZTpbXSxhcmdzKTt9cmV0dXJuIHRoaXNbY2hhaW5OYW1lXShmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSk/dmFsdWU6W10sYXJncyk7fSk7fTt9KTsvLyBNYXAgbWluaWZpZWQgbWV0aG9kIG5hbWVzIHRvIHRoZWlyIHJlYWwgbmFtZXMuXG5iYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSxmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe3ZhciBsb2Rhc2hGdW5jPWxvZGFzaFttZXRob2ROYW1lXTtpZihsb2Rhc2hGdW5jKXt2YXIga2V5PWxvZGFzaEZ1bmMubmFtZSsnJyxuYW1lcz1yZWFsTmFtZXNba2V5XXx8KHJlYWxOYW1lc1trZXldPVtdKTtuYW1lcy5wdXNoKHtuYW1lOm1ldGhvZE5hbWUsZnVuYzpsb2Rhc2hGdW5jfSk7fX0pO3JlYWxOYW1lc1tjcmVhdGVIeWJyaWQodW5kZWZpbmVkLFdSQVBfQklORF9LRVlfRkxBRykubmFtZV09W3tuYW1lOid3cmFwcGVyJyxmdW5jOnVuZGVmaW5lZH1dOy8vIEFkZCBtZXRob2RzIHRvIGBMYXp5V3JhcHBlcmAuXG5MYXp5V3JhcHBlci5wcm90b3R5cGUuY2xvbmU9bGF6eUNsb25lO0xhenlXcmFwcGVyLnByb3RvdHlwZS5yZXZlcnNlPWxhenlSZXZlcnNlO0xhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZT1sYXp5VmFsdWU7Ly8gQWRkIGNoYWluIHNlcXVlbmNlIG1ldGhvZHMgdG8gdGhlIGBsb2Rhc2hgIHdyYXBwZXIuXG5sb2Rhc2gucHJvdG90eXBlLmF0PXdyYXBwZXJBdDtsb2Rhc2gucHJvdG90eXBlLmNoYWluPXdyYXBwZXJDaGFpbjtsb2Rhc2gucHJvdG90eXBlLmNvbW1pdD13cmFwcGVyQ29tbWl0O2xvZGFzaC5wcm90b3R5cGUubmV4dD13cmFwcGVyTmV4dDtsb2Rhc2gucHJvdG90eXBlLnBsYW50PXdyYXBwZXJQbGFudDtsb2Rhc2gucHJvdG90eXBlLnJldmVyc2U9d3JhcHBlclJldmVyc2U7bG9kYXNoLnByb3RvdHlwZS50b0pTT049bG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mPWxvZGFzaC5wcm90b3R5cGUudmFsdWU9d3JhcHBlclZhbHVlOy8vIEFkZCBsYXp5IGFsaWFzZXMuXG5sb2Rhc2gucHJvdG90eXBlLmZpcnN0PWxvZGFzaC5wcm90b3R5cGUuaGVhZDtpZihzeW1JdGVyYXRvcil7bG9kYXNoLnByb3RvdHlwZVtzeW1JdGVyYXRvcl09d3JhcHBlclRvSXRlcmF0b3I7fXJldHVybiBsb2Rhc2g7fTsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLy8gRXhwb3J0IGxvZGFzaC5cbnZhciBfPXJ1bkluQ29udGV4dCgpOy8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIGNvbmRpdGlvbiBwYXR0ZXJucyBsaWtlOlxuaWYodHlwZW9mIGRlZmluZT09PSdmdW5jdGlvbicmJl90eXBlb2YoZGVmaW5lLmFtZCk9PT0nb2JqZWN0JyYmZGVmaW5lLmFtZCl7Ly8gRXhwb3NlIExvZGFzaCBvbiB0aGUgZ2xvYmFsIG9iamVjdCB0byBwcmV2ZW50IGVycm9ycyB3aGVuIExvZGFzaCBpc1xuLy8gbG9hZGVkIGJ5IGEgc2NyaXB0IHRhZyBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQU1EIGxvYWRlci5cbi8vIFNlZSBodHRwOi8vcmVxdWlyZWpzLm9yZy9kb2NzL2Vycm9ycy5odG1sI21pc21hdGNoIGZvciBtb3JlIGRldGFpbHMuXG4vLyBVc2UgYF8ubm9Db25mbGljdGAgdG8gcmVtb3ZlIExvZGFzaCBmcm9tIHRoZSBnbG9iYWwgb2JqZWN0Llxucm9vdC5fPV87Ly8gRGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmVcbi8vIHJlZmVyZW5jZWQgYXMgdGhlIFwidW5kZXJzY29yZVwiIG1vZHVsZS5cbmRlZmluZShmdW5jdGlvbigpe3JldHVybiBfO30pO30vLyBDaGVjayBmb3IgYGV4cG9ydHNgIGFmdGVyIGBkZWZpbmVgIGluIGNhc2UgYSBidWlsZCBvcHRpbWl6ZXIgYWRkcyBpdC5cbmVsc2UgaWYoZnJlZU1vZHVsZSl7Ly8gRXhwb3J0IGZvciBOb2RlLmpzLlxuKGZyZWVNb2R1bGUuZXhwb3J0cz1fKS5fPV87Ly8gRXhwb3J0IGZvciBDb21tb25KUyBzdXBwb3J0LlxuZnJlZUV4cG9ydHMuXz1fO31lbHNley8vIEV4cG9ydCB0byB0aGUgZ2xvYmFsIG9iamVjdC5cbnJvb3QuXz1fO319KS5jYWxsKHVuZGVmaW5lZCk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5858\n")},5924:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.isInContainer = exports.getScrollContainer = exports.isScroll = exports.getStyle = exports.once = exports.off = exports.on = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; /* istanbul ignore next */\n\nexports.hasClass = hasClass;\nexports.addClass = addClass;\nexports.removeClass = removeClass;\nexports.setStyle = setStyle;\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isServer = _vue2.default.prototype.$isServer;\nvar SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\nvar MOZ_HACK_REGEXP = /^moz([A-Z])/;\nvar ieVersion = isServer ? 0 : Number(document.documentMode);\n\n/* istanbul ignore next */\nvar trim = function trim(string) {\n return (string || '').replace(/^[\\s\\uFEFF]+|[\\s\\uFEFF]+$/g, '');\n};\n/* istanbul ignore next */\nvar camelCase = function camelCase(name) {\n return name.replace(SPECIAL_CHARS_REGEXP, function (_, separator, letter, offset) {\n return offset ? letter.toUpperCase() : letter;\n }).replace(MOZ_HACK_REGEXP, 'Moz$1');\n};\n\n/* istanbul ignore next */\nvar on = exports.on = function () {\n if (!isServer && document.addEventListener) {\n return function (element, event, handler) {\n if (element && event && handler) {\n element.addEventListener(event, handler, false);\n }\n };\n } else {\n return function (element, event, handler) {\n if (element && event && handler) {\n element.attachEvent('on' + event, handler);\n }\n };\n }\n}();\n\n/* istanbul ignore next */\nvar off = exports.off = function () {\n if (!isServer && document.removeEventListener) {\n return function (element, event, handler) {\n if (element && event) {\n element.removeEventListener(event, handler, false);\n }\n };\n } else {\n return function (element, event, handler) {\n if (element && event) {\n element.detachEvent('on' + event, handler);\n }\n };\n }\n}();\n\n/* istanbul ignore next */\nvar once = exports.once = function once(el, event, fn) {\n var listener = function listener() {\n if (fn) {\n fn.apply(this, arguments);\n }\n off(el, event, listener);\n };\n on(el, event, listener);\n};\n\n/* istanbul ignore next */\nfunction hasClass(el, cls) {\n if (!el || !cls) return false;\n if (cls.indexOf(' ') !== -1) throw new Error('className should not contain space.');\n if (el.classList) {\n return el.classList.contains(cls);\n } else {\n return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1;\n }\n};\n\n/* istanbul ignore next */\nfunction addClass(el, cls) {\n if (!el) return;\n var curClass = el.className;\n var classes = (cls || '').split(' ');\n\n for (var i = 0, j = classes.length; i < j; i++) {\n var clsName = classes[i];\n if (!clsName) continue;\n\n if (el.classList) {\n el.classList.add(clsName);\n } else if (!hasClass(el, clsName)) {\n curClass += ' ' + clsName;\n }\n }\n if (!el.classList) {\n el.setAttribute('class', curClass);\n }\n};\n\n/* istanbul ignore next */\nfunction removeClass(el, cls) {\n if (!el || !cls) return;\n var classes = cls.split(' ');\n var curClass = ' ' + el.className + ' ';\n\n for (var i = 0, j = classes.length; i < j; i++) {\n var clsName = classes[i];\n if (!clsName) continue;\n\n if (el.classList) {\n el.classList.remove(clsName);\n } else if (hasClass(el, clsName)) {\n curClass = curClass.replace(' ' + clsName + ' ', ' ');\n }\n }\n if (!el.classList) {\n el.setAttribute('class', trim(curClass));\n }\n};\n\n/* istanbul ignore next */\nvar getStyle = exports.getStyle = ieVersion < 9 ? function (element, styleName) {\n if (isServer) return;\n if (!element || !styleName) return null;\n styleName = camelCase(styleName);\n if (styleName === 'float') {\n styleName = 'styleFloat';\n }\n try {\n switch (styleName) {\n case 'opacity':\n try {\n return element.filters.item('alpha').opacity / 100;\n } catch (e) {\n return 1.0;\n }\n default:\n return element.style[styleName] || element.currentStyle ? element.currentStyle[styleName] : null;\n }\n } catch (e) {\n return element.style[styleName];\n }\n} : function (element, styleName) {\n if (isServer) return;\n if (!element || !styleName) return null;\n styleName = camelCase(styleName);\n if (styleName === 'float') {\n styleName = 'cssFloat';\n }\n try {\n var computed = document.defaultView.getComputedStyle(element, '');\n return element.style[styleName] || computed ? computed[styleName] : null;\n } catch (e) {\n return element.style[styleName];\n }\n};\n\n/* istanbul ignore next */\nfunction setStyle(element, styleName, value) {\n if (!element || !styleName) return;\n\n if ((typeof styleName === 'undefined' ? 'undefined' : _typeof(styleName)) === 'object') {\n for (var prop in styleName) {\n if (styleName.hasOwnProperty(prop)) {\n setStyle(element, prop, styleName[prop]);\n }\n }\n } else {\n styleName = camelCase(styleName);\n if (styleName === 'opacity' && ieVersion < 9) {\n element.style.filter = isNaN(value) ? '' : 'alpha(opacity=' + value * 100 + ')';\n } else {\n element.style[styleName] = value;\n }\n }\n};\n\nvar isScroll = exports.isScroll = function isScroll(el, vertical) {\n if (isServer) return;\n\n var determinedDirection = vertical !== null && vertical !== undefined;\n var overflow = determinedDirection ? vertical ? getStyle(el, 'overflow-y') : getStyle(el, 'overflow-x') : getStyle(el, 'overflow');\n\n return overflow.match(/(scroll|auto|overlay)/);\n};\n\nvar getScrollContainer = exports.getScrollContainer = function getScrollContainer(el, vertical) {\n if (isServer) return;\n\n var parent = el;\n while (parent) {\n if ([window, document, document.documentElement].includes(parent)) {\n return window;\n }\n if (isScroll(parent, vertical)) {\n return parent;\n }\n parent = parent.parentNode;\n }\n\n return parent;\n};\n\nvar isInContainer = exports.isInContainer = function isInContainer(el, container) {\n if (isServer || !el || !container) return false;\n\n var elRect = el.getBoundingClientRect();\n var containerRect = void 0;\n\n if ([window, document, document.documentElement, null, undefined].includes(container)) {\n containerRect = {\n top: 0,\n right: window.innerWidth,\n bottom: window.innerHeight,\n left: 0\n };\n } else {\n containerRect = container.getBoundingClientRect();\n }\n\n return elRect.top < containerRect.bottom && elRect.bottom > containerRect.top && elRect.right > containerRect.left && elRect.left < containerRect.right;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvZG9tLmpzPzU5MjQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTs7QUFFQSxvR0FBb0csbUJBQW1CLEVBQUUsbUJBQW1CLDhIQUE4SCxHQUFHOztBQUU3UTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLG1CQUFPLENBQUMsTUFBSzs7QUFFeEI7O0FBRUEsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDLE9BQU87QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDLE9BQU87QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjU5MjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmlzSW5Db250YWluZXIgPSBleHBvcnRzLmdldFNjcm9sbENvbnRhaW5lciA9IGV4cG9ydHMuaXNTY3JvbGwgPSBleHBvcnRzLmdldFN0eWxlID0gZXhwb3J0cy5vbmNlID0gZXhwb3J0cy5vZmYgPSBleHBvcnRzLm9uID0gdW5kZWZpbmVkO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbmV4cG9ydHMuaGFzQ2xhc3MgPSBoYXNDbGFzcztcbmV4cG9ydHMuYWRkQ2xhc3MgPSBhZGRDbGFzcztcbmV4cG9ydHMucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzcztcbmV4cG9ydHMuc2V0U3R5bGUgPSBzZXRTdHlsZTtcblxudmFyIF92dWUgPSByZXF1aXJlKCd2dWUnKTtcblxudmFyIF92dWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdnVlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGlzU2VydmVyID0gX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyO1xudmFyIFNQRUNJQUxfQ0hBUlNfUkVHRVhQID0gLyhbXFw6XFwtXFxfXSsoLikpL2c7XG52YXIgTU9aX0hBQ0tfUkVHRVhQID0gL15tb3ooW0EtWl0pLztcbnZhciBpZVZlcnNpb24gPSBpc1NlcnZlciA/IDAgOiBOdW1iZXIoZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnZhciB0cmltID0gZnVuY3Rpb24gdHJpbShzdHJpbmcpIHtcbiAgcmV0dXJuIChzdHJpbmcgfHwgJycpLnJlcGxhY2UoL15bXFxzXFx1RkVGRl0rfFtcXHNcXHVGRUZGXSskL2csICcnKTtcbn07XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIGNhbWVsQ2FzZSA9IGZ1bmN0aW9uIGNhbWVsQ2FzZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UoU1BFQ0lBTF9DSEFSU19SRUdFWFAsIGZ1bmN0aW9uIChfLCBzZXBhcmF0b3IsIGxldHRlciwgb2Zmc2V0KSB7XG4gICAgcmV0dXJuIG9mZnNldCA/IGxldHRlci50b1VwcGVyQ2FzZSgpIDogbGV0dGVyO1xuICB9KS5yZXBsYWNlKE1PWl9IQUNLX1JFR0VYUCwgJ01veiQxJyk7XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIG9uID0gZXhwb3J0cy5vbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCFpc1NlcnZlciAmJiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbGVtZW50LCBldmVudCwgaGFuZGxlcikge1xuICAgICAgaWYgKGVsZW1lbnQgJiYgZXZlbnQgJiYgaGFuZGxlcikge1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgIGlmIChlbGVtZW50ICYmIGV2ZW50ICYmIGhhbmRsZXIpIHtcbiAgICAgICAgZWxlbWVudC5hdHRhY2hFdmVudCgnb24nICsgZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn0oKTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnZhciBvZmYgPSBleHBvcnRzLm9mZiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCFpc1NlcnZlciAmJiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbGVtZW50LCBldmVudCwgaGFuZGxlcikge1xuICAgICAgaWYgKGVsZW1lbnQgJiYgZXZlbnQpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICBpZiAoZWxlbWVudCAmJiBldmVudCkge1xuICAgICAgICBlbGVtZW50LmRldGFjaEV2ZW50KCdvbicgKyBldmVudCwgaGFuZGxlcik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufSgpO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIG9uY2UgPSBleHBvcnRzLm9uY2UgPSBmdW5jdGlvbiBvbmNlKGVsLCBldmVudCwgZm4pIHtcbiAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gbGlzdGVuZXIoKSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBvZmYoZWwsIGV2ZW50LCBsaXN0ZW5lcik7XG4gIH07XG4gIG9uKGVsLCBldmVudCwgbGlzdGVuZXIpO1xufTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGhhc0NsYXNzKGVsLCBjbHMpIHtcbiAgaWYgKCFlbCB8fCAhY2xzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjbHMuaW5kZXhPZignICcpICE9PSAtMSkgdGhyb3cgbmV3IEVycm9yKCdjbGFzc05hbWUgc2hvdWxkIG5vdCBjb250YWluIHNwYWNlLicpO1xuICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgcmV0dXJuIGVsLmNsYXNzTGlzdC5jb250YWlucyhjbHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoJyAnICsgZWwuY2xhc3NOYW1lICsgJyAnKS5pbmRleE9mKCcgJyArIGNscyArICcgJykgPiAtMTtcbiAgfVxufTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsLCBjbHMpIHtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICB2YXIgY3VyQ2xhc3MgPSBlbC5jbGFzc05hbWU7XG4gIHZhciBjbGFzc2VzID0gKGNscyB8fCAnJykuc3BsaXQoJyAnKTtcblxuICBmb3IgKHZhciBpID0gMCwgaiA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgdmFyIGNsc05hbWUgPSBjbGFzc2VzW2ldO1xuICAgIGlmICghY2xzTmFtZSkgY29udGludWU7XG5cbiAgICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKGNsc05hbWUpO1xuICAgIH0gZWxzZSBpZiAoIWhhc0NsYXNzKGVsLCBjbHNOYW1lKSkge1xuICAgICAgY3VyQ2xhc3MgKz0gJyAnICsgY2xzTmFtZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFlbC5jbGFzc0xpc3QpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgY3VyQ2xhc3MpO1xuICB9XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWwsIGNscykge1xuICBpZiAoIWVsIHx8ICFjbHMpIHJldHVybjtcbiAgdmFyIGNsYXNzZXMgPSBjbHMuc3BsaXQoJyAnKTtcbiAgdmFyIGN1ckNsYXNzID0gJyAnICsgZWwuY2xhc3NOYW1lICsgJyAnO1xuXG4gIGZvciAodmFyIGkgPSAwLCBqID0gY2xhc3Nlcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICB2YXIgY2xzTmFtZSA9IGNsYXNzZXNbaV07XG4gICAgaWYgKCFjbHNOYW1lKSBjb250aW51ZTtcblxuICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xzTmFtZSk7XG4gICAgfSBlbHNlIGlmIChoYXNDbGFzcyhlbCwgY2xzTmFtZSkpIHtcbiAgICAgIGN1ckNsYXNzID0gY3VyQ2xhc3MucmVwbGFjZSgnICcgKyBjbHNOYW1lICsgJyAnLCAnICcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWVsLmNsYXNzTGlzdCkge1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCB0cmltKGN1ckNsYXNzKSk7XG4gIH1cbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgZ2V0U3R5bGUgPSBleHBvcnRzLmdldFN0eWxlID0gaWVWZXJzaW9uIDwgOSA/IGZ1bmN0aW9uIChlbGVtZW50LCBzdHlsZU5hbWUpIHtcbiAgaWYgKGlzU2VydmVyKSByZXR1cm47XG4gIGlmICghZWxlbWVudCB8fCAhc3R5bGVOYW1lKSByZXR1cm4gbnVsbDtcbiAgc3R5bGVOYW1lID0gY2FtZWxDYXNlKHN0eWxlTmFtZSk7XG4gIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICBzdHlsZU5hbWUgPSAnc3R5bGVGbG9hdCc7XG4gIH1cbiAgdHJ5IHtcbiAgICBzd2l0Y2ggKHN0eWxlTmFtZSkge1xuICAgICAgY2FzZSAnb3BhY2l0eSc6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZmlsdGVycy5pdGVtKCdhbHBoYScpLm9wYWNpdHkgLyAxMDA7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZWxlbWVudC5zdHlsZVtzdHlsZU5hbWVdIHx8IGVsZW1lbnQuY3VycmVudFN0eWxlID8gZWxlbWVudC5jdXJyZW50U3R5bGVbc3R5bGVOYW1lXSA6IG51bGw7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXTtcbiAgfVxufSA6IGZ1bmN0aW9uIChlbGVtZW50LCBzdHlsZU5hbWUpIHtcbiAgaWYgKGlzU2VydmVyKSByZXR1cm47XG4gIGlmICghZWxlbWVudCB8fCAhc3R5bGVOYW1lKSByZXR1cm4gbnVsbDtcbiAgc3R5bGVOYW1lID0gY2FtZWxDYXNlKHN0eWxlTmFtZSk7XG4gIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICBzdHlsZU5hbWUgPSAnY3NzRmxvYXQnO1xuICB9XG4gIHRyeSB7XG4gICAgdmFyIGNvbXB1dGVkID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCAnJyk7XG4gICAgcmV0dXJuIGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXSB8fCBjb21wdXRlZCA/IGNvbXB1dGVkW3N0eWxlTmFtZV0gOiBudWxsO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXTtcbiAgfVxufTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIHNldFN0eWxlKGVsZW1lbnQsIHN0eWxlTmFtZSwgdmFsdWUpIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFzdHlsZU5hbWUpIHJldHVybjtcblxuICBpZiAoKHR5cGVvZiBzdHlsZU5hbWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHN0eWxlTmFtZSkpID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIHByb3AgaW4gc3R5bGVOYW1lKSB7XG4gICAgICBpZiAoc3R5bGVOYW1lLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIHNldFN0eWxlKGVsZW1lbnQsIHByb3AsIHN0eWxlTmFtZVtwcm9wXSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0eWxlTmFtZSA9IGNhbWVsQ2FzZShzdHlsZU5hbWUpO1xuICAgIGlmIChzdHlsZU5hbWUgPT09ICdvcGFjaXR5JyAmJiBpZVZlcnNpb24gPCA5KSB7XG4gICAgICBlbGVtZW50LnN0eWxlLmZpbHRlciA9IGlzTmFOKHZhbHVlKSA/ICcnIDogJ2FscGhhKG9wYWNpdHk9JyArIHZhbHVlICogMTAwICsgJyknO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3N0eWxlTmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBpc1Njcm9sbCA9IGV4cG9ydHMuaXNTY3JvbGwgPSBmdW5jdGlvbiBpc1Njcm9sbChlbCwgdmVydGljYWwpIHtcbiAgaWYgKGlzU2VydmVyKSByZXR1cm47XG5cbiAgdmFyIGRldGVybWluZWREaXJlY3Rpb24gPSB2ZXJ0aWNhbCAhPT0gbnVsbCAmJiB2ZXJ0aWNhbCAhPT0gdW5kZWZpbmVkO1xuICB2YXIgb3ZlcmZsb3cgPSBkZXRlcm1pbmVkRGlyZWN0aW9uID8gdmVydGljYWwgPyBnZXRTdHlsZShlbCwgJ292ZXJmbG93LXknKSA6IGdldFN0eWxlKGVsLCAnb3ZlcmZsb3cteCcpIDogZ2V0U3R5bGUoZWwsICdvdmVyZmxvdycpO1xuXG4gIHJldHVybiBvdmVyZmxvdy5tYXRjaCgvKHNjcm9sbHxhdXRvfG92ZXJsYXkpLyk7XG59O1xuXG52YXIgZ2V0U2Nyb2xsQ29udGFpbmVyID0gZXhwb3J0cy5nZXRTY3JvbGxDb250YWluZXIgPSBmdW5jdGlvbiBnZXRTY3JvbGxDb250YWluZXIoZWwsIHZlcnRpY2FsKSB7XG4gIGlmIChpc1NlcnZlcikgcmV0dXJuO1xuXG4gIHZhciBwYXJlbnQgPSBlbDtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChbd2luZG93LCBkb2N1bWVudCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XS5pbmNsdWRlcyhwYXJlbnQpKSB7XG4gICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBpZiAoaXNTY3JvbGwocGFyZW50LCB2ZXJ0aWNhbCkpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIHBhcmVudDtcbn07XG5cbnZhciBpc0luQ29udGFpbmVyID0gZXhwb3J0cy5pc0luQ29udGFpbmVyID0gZnVuY3Rpb24gaXNJbkNvbnRhaW5lcihlbCwgY29udGFpbmVyKSB7XG4gIGlmIChpc1NlcnZlciB8fCAhZWwgfHwgIWNvbnRhaW5lcikgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBlbFJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIGNvbnRhaW5lclJlY3QgPSB2b2lkIDA7XG5cbiAgaWYgKFt3aW5kb3csIGRvY3VtZW50LCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG51bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoY29udGFpbmVyKSkge1xuICAgIGNvbnRhaW5lclJlY3QgPSB7XG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBib3R0b206IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgIGxlZnQ6IDBcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIH1cblxuICByZXR1cm4gZWxSZWN0LnRvcCA8IGNvbnRhaW5lclJlY3QuYm90dG9tICYmIGVsUmVjdC5ib3R0b20gPiBjb250YWluZXJSZWN0LnRvcCAmJiBlbFJlY3QucmlnaHQgPiBjb250YWluZXJSZWN0LmxlZnQgJiYgZWxSZWN0LmxlZnQgPCBjb250YWluZXJSZWN0LnJpZ2h0O1xufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5924\n")},"5c96":function(module,exports,__webpack_require__){eval('module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: \'Module\' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, \'__esModule\', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === \'object\' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, \'default\', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != \'string\') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module[\'default\']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, \'a\', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = "/dist/";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 46);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("d940");\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("5924");\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("8122");\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("d010");\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("6b7c");\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("e974");\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("2b0e");\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("7f4d");\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("f3ad");\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("2bb5");\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("417f");\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("5128");\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("4897");\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("eedf");\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("dcdc");\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("4010");\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("a742");\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("0e15");\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("14e9");\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("d397");\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("d7d1");\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("5488");\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("41f8");\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("12f2");\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("92fa");\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("597f");\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("299c");\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("2a5e");\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("5858");\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("845f");\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("8bbc");\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("e62d");\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("7fc1");\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("c56a");\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("c284");\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("e452");\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("9619");\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("4e4b");\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("e772");\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("c098");\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("722f");\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("a15e");\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("e450");\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("4726");\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("f494");\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("6ac9");\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(47);\n\n\n/***/ }),\n/* 47 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/pagination/src/pager.vue?vue&type=template&id=7274f267&\nvar pagervue_type_template_id_7274f267_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "ul",\n { staticClass: "el-pager", on: { click: _vm.onPagerClick } },\n [\n _vm.pageCount > 0\n ? _c(\n "li",\n {\n staticClass: "number",\n class: { active: _vm.currentPage === 1, disabled: _vm.disabled }\n },\n [_vm._v("1")]\n )\n : _vm._e(),\n _vm.showPrevMore\n ? _c("li", {\n staticClass: "el-icon more btn-quickprev",\n class: [_vm.quickprevIconClass, { disabled: _vm.disabled }],\n on: {\n mouseenter: function($event) {\n _vm.onMouseenter("left")\n },\n mouseleave: function($event) {\n _vm.quickprevIconClass = "el-icon-more"\n }\n }\n })\n : _vm._e(),\n _vm._l(_vm.pagers, function(pager) {\n return _c(\n "li",\n {\n key: pager,\n staticClass: "number",\n class: { active: _vm.currentPage === pager, disabled: _vm.disabled }\n },\n [_vm._v(_vm._s(pager))]\n )\n }),\n _vm.showNextMore\n ? _c("li", {\n staticClass: "el-icon more btn-quicknext",\n class: [_vm.quicknextIconClass, { disabled: _vm.disabled }],\n on: {\n mouseenter: function($event) {\n _vm.onMouseenter("right")\n },\n mouseleave: function($event) {\n _vm.quicknextIconClass = "el-icon-more"\n }\n }\n })\n : _vm._e(),\n _vm.pageCount > 1\n ? _c(\n "li",\n {\n staticClass: "number",\n class: {\n active: _vm.currentPage === _vm.pageCount,\n disabled: _vm.disabled\n }\n },\n [_vm._v(_vm._s(_vm.pageCount))]\n )\n : _vm._e()\n ],\n 2\n )\n}\nvar staticRenderFns = []\npagervue_type_template_id_7274f267_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/pagination/src/pager.vue?vue&type=template&id=7274f267&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/pagination/src/pager.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/* harmony default export */ var pagervue_type_script_lang_js_ = ({\n name: \'ElPager\',\n\n props: {\n currentPage: Number,\n\n pageCount: Number,\n\n pagerCount: Number,\n\n disabled: Boolean\n },\n\n watch: {\n showPrevMore: function showPrevMore(val) {\n if (!val) this.quickprevIconClass = \'el-icon-more\';\n },\n showNextMore: function showNextMore(val) {\n if (!val) this.quicknextIconClass = \'el-icon-more\';\n }\n },\n\n methods: {\n onPagerClick: function onPagerClick(event) {\n var target = event.target;\n if (target.tagName === \'UL\' || this.disabled) {\n return;\n }\n\n var newPage = Number(event.target.textContent);\n var pageCount = this.pageCount;\n var currentPage = this.currentPage;\n var pagerCountOffset = this.pagerCount - 2;\n\n if (target.className.indexOf(\'more\') !== -1) {\n if (target.className.indexOf(\'quickprev\') !== -1) {\n newPage = currentPage - pagerCountOffset;\n } else if (target.className.indexOf(\'quicknext\') !== -1) {\n newPage = currentPage + pagerCountOffset;\n }\n }\n\n /* istanbul ignore if */\n if (!isNaN(newPage)) {\n if (newPage < 1) {\n newPage = 1;\n }\n\n if (newPage > pageCount) {\n newPage = pageCount;\n }\n }\n\n if (newPage !== currentPage) {\n this.$emit(\'change\', newPage);\n }\n },\n onMouseenter: function onMouseenter(direction) {\n if (this.disabled) return;\n if (direction === \'left\') {\n this.quickprevIconClass = \'el-icon-d-arrow-left\';\n } else {\n this.quicknextIconClass = \'el-icon-d-arrow-right\';\n }\n }\n },\n\n computed: {\n pagers: function pagers() {\n var pagerCount = this.pagerCount;\n var halfPagerCount = (pagerCount - 1) / 2;\n\n var currentPage = Number(this.currentPage);\n var pageCount = Number(this.pageCount);\n\n var showPrevMore = false;\n var showNextMore = false;\n\n if (pageCount > pagerCount) {\n if (currentPage > pagerCount - halfPagerCount) {\n showPrevMore = true;\n }\n\n if (currentPage < pageCount - halfPagerCount) {\n showNextMore = true;\n }\n }\n\n var array = [];\n\n if (showPrevMore && !showNextMore) {\n var startPage = pageCount - (pagerCount - 2);\n for (var i = startPage; i < pageCount; i++) {\n array.push(i);\n }\n } else if (!showPrevMore && showNextMore) {\n for (var _i = 2; _i < pagerCount; _i++) {\n array.push(_i);\n }\n } else if (showPrevMore && showNextMore) {\n var offset = Math.floor(pagerCount / 2) - 1;\n for (var _i2 = currentPage - offset; _i2 <= currentPage + offset; _i2++) {\n array.push(_i2);\n }\n } else {\n for (var _i3 = 2; _i3 < pageCount; _i3++) {\n array.push(_i3);\n }\n }\n\n this.showPrevMore = showPrevMore;\n this.showNextMore = showNextMore;\n\n return array;\n }\n },\n\n data: function data() {\n return {\n current: null,\n showPrevMore: false,\n showNextMore: false,\n quicknextIconClass: \'el-icon-more\',\n quickprevIconClass: \'el-icon-more\'\n };\n }\n});\n// CONCATENATED MODULE: ./packages/pagination/src/pager.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_pagervue_type_script_lang_js_ = (pagervue_type_script_lang_js_); \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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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: ./packages/pagination/src/pager.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = normalizeComponent(\n src_pagervue_type_script_lang_js_,\n pagervue_type_template_id_7274f267_render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = "packages/pagination/src/pager.vue"\n/* harmony default export */ var pager = (component.exports);\n// EXTERNAL MODULE: external "element-ui/lib/select"\nvar select_ = __webpack_require__(37);\nvar select_default = /*#__PURE__*/__webpack_require__.n(select_);\n\n// EXTERNAL MODULE: external "element-ui/lib/option"\nvar option_ = __webpack_require__(38);\nvar option_default = /*#__PURE__*/__webpack_require__.n(option_);\n\n// EXTERNAL MODULE: external "element-ui/lib/input"\nvar input_ = __webpack_require__(8);\nvar input_default = /*#__PURE__*/__webpack_require__.n(input_);\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/locale"\nvar locale_ = __webpack_require__(4);\nvar locale_default = /*#__PURE__*/__webpack_require__.n(locale_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/util"\nvar util_ = __webpack_require__(2);\n\n// CONCATENATED MODULE: ./packages/pagination/src/pagination.js\n\n\n\n\n\n\n\n/* harmony default export */ var pagination = ({\n name: \'ElPagination\',\n\n props: {\n pageSize: {\n type: Number,\n default: 10\n },\n\n small: Boolean,\n\n total: Number,\n\n pageCount: Number,\n\n pagerCount: {\n type: Number,\n validator: function validator(value) {\n return (value | 0) === value && value > 4 && value < 22 && value % 2 === 1;\n },\n\n default: 7\n },\n\n currentPage: {\n type: Number,\n default: 1\n },\n\n layout: {\n default: \'prev, pager, next, jumper, ->, total\'\n },\n\n pageSizes: {\n type: Array,\n default: function _default() {\n return [10, 20, 30, 40, 50, 100];\n }\n },\n\n popperClass: String,\n\n prevText: String,\n\n nextText: String,\n\n background: Boolean,\n\n disabled: Boolean,\n\n hideOnSinglePage: Boolean\n },\n\n data: function data() {\n return {\n internalCurrentPage: 1,\n internalPageSize: 0,\n lastEmittedPage: -1,\n userChangePageSize: false\n };\n },\n render: function render(h) {\n var layout = this.layout;\n if (!layout) return null;\n if (this.hideOnSinglePage && (!this.internalPageCount || this.internalPageCount === 1)) return null;\n\n var template = h(\'div\', { \'class\': [\'el-pagination\', {\n \'is-background\': this.background,\n \'el-pagination--small\': this.small\n }] });\n var TEMPLATE_MAP = {\n prev: h(\'prev\'),\n jumper: h(\'jumper\'),\n pager: h(\'pager\', {\n attrs: { currentPage: this.internalCurrentPage, pageCount: this.internalPageCount, pagerCount: this.pagerCount, disabled: this.disabled },\n on: {\n \'change\': this.handleCurrentChange\n }\n }),\n next: h(\'next\'),\n sizes: h(\'sizes\', {\n attrs: { pageSizes: this.pageSizes }\n }),\n slot: h(\'slot\', [this.$slots.default ? this.$slots.default : \'\']),\n total: h(\'total\')\n };\n var components = layout.split(\',\').map(function (item) {\n return item.trim();\n });\n var rightWrapper = h(\'div\', { \'class\': \'el-pagination__rightwrapper\' });\n var haveRightWrapper = false;\n\n template.children = template.children || [];\n rightWrapper.children = rightWrapper.children || [];\n components.forEach(function (compo) {\n if (compo === \'->\') {\n haveRightWrapper = true;\n return;\n }\n\n if (!haveRightWrapper) {\n template.children.push(TEMPLATE_MAP[compo]);\n } else {\n rightWrapper.children.push(TEMPLATE_MAP[compo]);\n }\n });\n\n if (haveRightWrapper) {\n template.children.unshift(rightWrapper);\n }\n\n return template;\n },\n\n\n components: {\n Prev: {\n render: function render(h) {\n return h(\n \'button\',\n {\n attrs: {\n type: \'button\',\n\n disabled: this.$parent.disabled || this.$parent.internalCurrentPage <= 1\n },\n \'class\': \'btn-prev\', on: {\n \'click\': this.$parent.prev\n }\n },\n [this.$parent.prevText ? h(\'span\', [this.$parent.prevText]) : h(\'i\', { \'class\': \'el-icon el-icon-arrow-left\' })]\n );\n }\n },\n\n Next: {\n render: function render(h) {\n return h(\n \'button\',\n {\n attrs: {\n type: \'button\',\n\n disabled: this.$parent.disabled || this.$parent.internalCurrentPage === this.$parent.internalPageCount || this.$parent.internalPageCount === 0\n },\n \'class\': \'btn-next\', on: {\n \'click\': this.$parent.next\n }\n },\n [this.$parent.nextText ? h(\'span\', [this.$parent.nextText]) : h(\'i\', { \'class\': \'el-icon el-icon-arrow-right\' })]\n );\n }\n },\n\n Sizes: {\n mixins: [locale_default.a],\n\n props: {\n pageSizes: Array\n },\n\n watch: {\n pageSizes: {\n immediate: true,\n handler: function handler(newVal, oldVal) {\n if (Object(util_["valueEquals"])(newVal, oldVal)) return;\n if (Array.isArray(newVal)) {\n this.$parent.internalPageSize = newVal.indexOf(this.$parent.pageSize) > -1 ? this.$parent.pageSize : this.pageSizes[0];\n }\n }\n }\n },\n\n render: function render(h) {\n var _this = this;\n\n return h(\n \'span\',\n { \'class\': \'el-pagination__sizes\' },\n [h(\n \'el-select\',\n {\n attrs: {\n value: this.$parent.internalPageSize,\n popperClass: this.$parent.popperClass || \'\',\n size: \'mini\',\n\n disabled: this.$parent.disabled },\n on: {\n \'input\': this.handleChange\n }\n },\n [this.pageSizes.map(function (item) {\n return h(\'el-option\', {\n attrs: {\n value: item,\n label: item + _this.t(\'el.pagination.pagesize\') }\n });\n })]\n )]\n );\n },\n\n\n components: {\n ElSelect: select_default.a,\n ElOption: option_default.a\n },\n\n methods: {\n handleChange: function handleChange(val) {\n if (val !== this.$parent.internalPageSize) {\n this.$parent.internalPageSize = val = parseInt(val, 10);\n this.$parent.userChangePageSize = true;\n this.$parent.$emit(\'update:pageSize\', val);\n this.$parent.$emit(\'size-change\', val);\n }\n }\n }\n },\n\n Jumper: {\n mixins: [locale_default.a],\n\n components: { ElInput: input_default.a },\n\n data: function data() {\n return {\n userInput: null\n };\n },\n\n\n watch: {\n \'$parent.internalCurrentPage\': function $parentInternalCurrentPage() {\n this.userInput = null;\n }\n },\n\n methods: {\n handleKeyup: function handleKeyup(_ref) {\n var keyCode = _ref.keyCode,\n target = _ref.target;\n\n // Chrome, Safari, Firefox triggers change event on Enter\n // Hack for IE: https://github.com/ElemeFE/element/issues/11710\n // Drop this method when we no longer supports IE\n if (keyCode === 13) {\n this.handleChange(target.value);\n }\n },\n handleInput: function handleInput(value) {\n this.userInput = value;\n },\n handleChange: function handleChange(value) {\n this.$parent.internalCurrentPage = this.$parent.getValidCurrentPage(value);\n this.$parent.emitChange();\n this.userInput = null;\n }\n },\n\n render: function render(h) {\n return h(\n \'span\',\n { \'class\': \'el-pagination__jump\' },\n [this.t(\'el.pagination.goto\'), h(\'el-input\', {\n \'class\': \'el-pagination__editor is-in-pagination\',\n attrs: { min: 1,\n max: this.$parent.internalPageCount,\n value: this.userInput !== null ? this.userInput : this.$parent.internalCurrentPage,\n type: \'number\',\n disabled: this.$parent.disabled\n },\n nativeOn: {\n \'keyup\': this.handleKeyup\n },\n on: {\n \'input\': this.handleInput,\n \'change\': this.handleChange\n }\n }), this.t(\'el.pagination.pageClassifier\')]\n );\n }\n },\n\n Total: {\n mixins: [locale_default.a],\n\n render: function render(h) {\n return typeof this.$parent.total === \'number\' ? h(\n \'span\',\n { \'class\': \'el-pagination__total\' },\n [this.t(\'el.pagination.total\', { total: this.$parent.total })]\n ) : \'\';\n }\n },\n\n Pager: pager\n },\n\n methods: {\n handleCurrentChange: function handleCurrentChange(val) {\n this.internalCurrentPage = this.getValidCurrentPage(val);\n this.userChangePageSize = true;\n this.emitChange();\n },\n prev: function prev() {\n if (this.disabled) return;\n var newVal = this.internalCurrentPage - 1;\n this.internalCurrentPage = this.getValidCurrentPage(newVal);\n this.$emit(\'prev-click\', this.internalCurrentPage);\n this.emitChange();\n },\n next: function next() {\n if (this.disabled) return;\n var newVal = this.internalCurrentPage + 1;\n this.internalCurrentPage = this.getValidCurrentPage(newVal);\n this.$emit(\'next-click\', this.internalCurrentPage);\n this.emitChange();\n },\n getValidCurrentPage: function getValidCurrentPage(value) {\n value = parseInt(value, 10);\n\n var havePageCount = typeof this.internalPageCount === \'number\';\n\n var resetValue = void 0;\n if (!havePageCount) {\n if (isNaN(value) || value < 1) resetValue = 1;\n } else {\n if (value < 1) {\n resetValue = 1;\n } else if (value > this.internalPageCount) {\n resetValue = this.internalPageCount;\n }\n }\n\n if (resetValue === undefined && isNaN(value)) {\n resetValue = 1;\n } else if (resetValue === 0) {\n resetValue = 1;\n }\n\n return resetValue === undefined ? value : resetValue;\n },\n emitChange: function emitChange() {\n var _this2 = this;\n\n this.$nextTick(function () {\n if (_this2.internalCurrentPage !== _this2.lastEmittedPage || _this2.userChangePageSize) {\n _this2.$emit(\'current-change\', _this2.internalCurrentPage);\n _this2.lastEmittedPage = _this2.internalCurrentPage;\n _this2.userChangePageSize = false;\n }\n });\n }\n },\n\n computed: {\n internalPageCount: function internalPageCount() {\n if (typeof this.total === \'number\') {\n return Math.max(1, Math.ceil(this.total / this.internalPageSize));\n } else if (typeof this.pageCount === \'number\') {\n return Math.max(1, this.pageCount);\n }\n return null;\n }\n },\n\n watch: {\n currentPage: {\n immediate: true,\n handler: function handler(val) {\n this.internalCurrentPage = this.getValidCurrentPage(val);\n }\n },\n\n pageSize: {\n immediate: true,\n handler: function handler(val) {\n this.internalPageSize = isNaN(val) ? 10 : val;\n }\n },\n\n internalCurrentPage: {\n immediate: true,\n handler: function handler(newVal) {\n this.$emit(\'update:currentPage\', newVal);\n this.lastEmittedPage = -1;\n }\n },\n\n internalPageCount: function internalPageCount(newVal) {\n /* istanbul ignore if */\n var oldPage = this.internalCurrentPage;\n if (newVal > 0 && oldPage === 0) {\n this.internalCurrentPage = 1;\n } else if (oldPage > newVal) {\n this.internalCurrentPage = newVal === 0 ? 1 : newVal;\n this.userChangePageSize && this.emitChange();\n }\n this.userChangePageSize = false;\n }\n }\n});\n// CONCATENATED MODULE: ./packages/pagination/index.js\n\n\n/* istanbul ignore next */\npagination.install = function (Vue) {\n Vue.component(pagination.name, pagination);\n};\n\n/* harmony default export */ var packages_pagination = (pagination);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/dialog/src/component.vue?vue&type=template&id=60140e62&\nvar componentvue_type_template_id_60140e62_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n {\n attrs: { name: "dialog-fade" },\n on: { "after-enter": _vm.afterEnter, "after-leave": _vm.afterLeave }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-dialog__wrapper",\n on: {\n click: function($event) {\n if ($event.target !== $event.currentTarget) {\n return null\n }\n return _vm.handleWrapperClick($event)\n }\n }\n },\n [\n _c(\n "div",\n {\n key: _vm.key,\n ref: "dialog",\n class: [\n "el-dialog",\n {\n "is-fullscreen": _vm.fullscreen,\n "el-dialog--center": _vm.center\n },\n _vm.customClass\n ],\n style: _vm.style,\n attrs: {\n role: "dialog",\n "aria-modal": "true",\n "aria-label": _vm.title || "dialog"\n }\n },\n [\n _c(\n "div",\n { staticClass: "el-dialog__header" },\n [\n _vm._t("title", [\n _c("span", { staticClass: "el-dialog__title" }, [\n _vm._v(_vm._s(_vm.title))\n ])\n ]),\n _vm.showClose\n ? _c(\n "button",\n {\n staticClass: "el-dialog__headerbtn",\n attrs: { type: "button", "aria-label": "Close" },\n on: { click: _vm.handleClose }\n },\n [\n _c("i", {\n staticClass:\n "el-dialog__close el-icon el-icon-close"\n })\n ]\n )\n : _vm._e()\n ],\n 2\n ),\n _vm.rendered\n ? _c(\n "div",\n { staticClass: "el-dialog__body" },\n [_vm._t("default")],\n 2\n )\n : _vm._e(),\n _vm.$slots.footer\n ? _c(\n "div",\n { staticClass: "el-dialog__footer" },\n [_vm._t("footer")],\n 2\n )\n : _vm._e()\n ]\n )\n ]\n )\n ]\n )\n}\nvar componentvue_type_template_id_60140e62_staticRenderFns = []\ncomponentvue_type_template_id_60140e62_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/dialog/src/component.vue?vue&type=template&id=60140e62&\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/popup"\nvar popup_ = __webpack_require__(11);\nvar popup_default = /*#__PURE__*/__webpack_require__.n(popup_);\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/migrating"\nvar migrating_ = __webpack_require__(9);\nvar migrating_default = /*#__PURE__*/__webpack_require__.n(migrating_);\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/emitter"\nvar emitter_ = __webpack_require__(3);\nvar emitter_default = /*#__PURE__*/__webpack_require__.n(emitter_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/dialog/src/component.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\n\n/* harmony default export */ var componentvue_type_script_lang_js_ = ({\n name: \'ElDialog\',\n\n mixins: [popup_default.a, emitter_default.a, migrating_default.a],\n\n props: {\n title: {\n type: String,\n default: \'\'\n },\n\n modal: {\n type: Boolean,\n default: true\n },\n\n modalAppendToBody: {\n type: Boolean,\n default: true\n },\n\n appendToBody: {\n type: Boolean,\n default: false\n },\n\n lockScroll: {\n type: Boolean,\n default: true\n },\n\n closeOnClickModal: {\n type: Boolean,\n default: true\n },\n\n closeOnPressEscape: {\n type: Boolean,\n default: true\n },\n\n showClose: {\n type: Boolean,\n default: true\n },\n\n width: String,\n\n fullscreen: Boolean,\n\n customClass: {\n type: String,\n default: \'\'\n },\n\n top: {\n type: String,\n default: \'15vh\'\n },\n beforeClose: Function,\n center: {\n type: Boolean,\n default: false\n },\n\n destroyOnClose: Boolean\n },\n\n data: function data() {\n return {\n closed: false,\n key: 0\n };\n },\n\n\n watch: {\n visible: function visible(val) {\n var _this = this;\n\n if (val) {\n this.closed = false;\n this.$emit(\'open\');\n this.$el.addEventListener(\'scroll\', this.updatePopper);\n this.$nextTick(function () {\n _this.$refs.dialog.scrollTop = 0;\n });\n if (this.appendToBody) {\n document.body.appendChild(this.$el);\n }\n } else {\n this.$el.removeEventListener(\'scroll\', this.updatePopper);\n if (!this.closed) this.$emit(\'close\');\n if (this.destroyOnClose) {\n this.$nextTick(function () {\n _this.key++;\n });\n }\n }\n }\n },\n\n computed: {\n style: function style() {\n var style = {};\n if (!this.fullscreen) {\n style.marginTop = this.top;\n if (this.width) {\n style.width = this.width;\n }\n }\n return style;\n }\n },\n\n methods: {\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n \'size\': \'size is removed.\'\n }\n };\n },\n handleWrapperClick: function handleWrapperClick() {\n if (!this.closeOnClickModal) return;\n this.handleClose();\n },\n handleClose: function handleClose() {\n if (typeof this.beforeClose === \'function\') {\n this.beforeClose(this.hide);\n } else {\n this.hide();\n }\n },\n hide: function hide(cancel) {\n if (cancel !== false) {\n this.$emit(\'update:visible\', false);\n this.$emit(\'close\');\n this.closed = true;\n }\n },\n updatePopper: function updatePopper() {\n this.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n this.broadcast(\'ElDropdownMenu\', \'updatePopper\');\n },\n afterEnter: function afterEnter() {\n this.$emit(\'opened\');\n },\n afterLeave: function afterLeave() {\n this.$emit(\'closed\');\n }\n },\n\n mounted: function mounted() {\n if (this.visible) {\n this.rendered = true;\n this.open();\n if (this.appendToBody) {\n document.body.appendChild(this.$el);\n }\n }\n },\n destroyed: function destroyed() {\n // if appendToBody is true, remove DOM node after destroy\n if (this.appendToBody && this.$el && this.$el.parentNode) {\n this.$el.parentNode.removeChild(this.$el);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/dialog/src/component.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_componentvue_type_script_lang_js_ = (componentvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/dialog/src/component.vue\n\n\n\n\n\n/* normalize component */\n\nvar component_component = normalizeComponent(\n src_componentvue_type_script_lang_js_,\n componentvue_type_template_id_60140e62_render,\n componentvue_type_template_id_60140e62_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var component_api; }\ncomponent_component.options.__file = "packages/dialog/src/component.vue"\n/* harmony default export */ var src_component = (component_component.exports);\n// CONCATENATED MODULE: ./packages/dialog/index.js\n\n\n/* istanbul ignore next */\nsrc_component.install = function (Vue) {\n Vue.component(src_component.name, src_component);\n};\n\n/* harmony default export */ var dialog = (src_component);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/autocomplete/src/autocomplete.vue?vue&type=template&id=152f2ee6&\nvar autocompletevue_type_template_id_152f2ee6_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: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.close,\n expression: "close"\n }\n ],\n staticClass: "el-autocomplete",\n attrs: {\n "aria-haspopup": "listbox",\n role: "combobox",\n "aria-expanded": _vm.suggestionVisible,\n "aria-owns": _vm.id\n }\n },\n [\n _c(\n "el-input",\n _vm._b(\n {\n ref: "input",\n on: {\n input: _vm.handleInput,\n change: _vm.handleChange,\n focus: _vm.handleFocus,\n blur: _vm.handleBlur,\n clear: _vm.handleClear\n },\n nativeOn: {\n keydown: [\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "up", 38, $event.key, [\n "Up",\n "ArrowUp"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n _vm.highlight(_vm.highlightedIndex - 1)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "down", 40, $event.key, [\n "Down",\n "ArrowDown"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n _vm.highlight(_vm.highlightedIndex + 1)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n return _vm.handleKeyEnter($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "tab", 9, $event.key, "Tab")\n ) {\n return null\n }\n return _vm.close($event)\n }\n ]\n }\n },\n "el-input",\n [_vm.$props, _vm.$attrs],\n false\n ),\n [\n _vm.$slots.prepend\n ? _c("template", { slot: "prepend" }, [_vm._t("prepend")], 2)\n : _vm._e(),\n _vm.$slots.append\n ? _c("template", { slot: "append" }, [_vm._t("append")], 2)\n : _vm._e(),\n _vm.$slots.prefix\n ? _c("template", { slot: "prefix" }, [_vm._t("prefix")], 2)\n : _vm._e(),\n _vm.$slots.suffix\n ? _c("template", { slot: "suffix" }, [_vm._t("suffix")], 2)\n : _vm._e()\n ],\n 2\n ),\n _c(\n "el-autocomplete-suggestions",\n {\n ref: "suggestions",\n class: [_vm.popperClass ? _vm.popperClass : ""],\n attrs: {\n "visible-arrow": "",\n "popper-options": _vm.popperOptions,\n "append-to-body": _vm.popperAppendToBody,\n placement: _vm.placement,\n id: _vm.id\n }\n },\n _vm._l(_vm.suggestions, function(item, index) {\n return _c(\n "li",\n {\n key: index,\n class: { highlighted: _vm.highlightedIndex === index },\n attrs: {\n id: _vm.id + "-item-" + index,\n role: "option",\n "aria-selected": _vm.highlightedIndex === index\n },\n on: {\n click: function($event) {\n _vm.select(item)\n }\n }\n },\n [\n _vm._t(\n "default",\n [\n _vm._v("\\n " + _vm._s(item[_vm.valueKey]) + "\\n ")\n ],\n { item: item }\n )\n ],\n 2\n )\n }),\n 0\n )\n ],\n 1\n )\n}\nvar autocompletevue_type_template_id_152f2ee6_staticRenderFns = []\nautocompletevue_type_template_id_152f2ee6_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/autocomplete/src/autocomplete.vue?vue&type=template&id=152f2ee6&\n\n// EXTERNAL MODULE: external "throttle-debounce/debounce"\nvar debounce_ = __webpack_require__(17);\nvar debounce_default = /*#__PURE__*/__webpack_require__.n(debounce_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/clickoutside"\nvar clickoutside_ = __webpack_require__(10);\nvar clickoutside_default = /*#__PURE__*/__webpack_require__.n(clickoutside_);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/autocomplete/src/autocomplete-suggestions.vue?vue&type=template&id=cd10dcf0&\nvar autocomplete_suggestionsvue_type_template_id_cd10dcf0_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n { attrs: { name: "el-zoom-in-top" }, on: { "after-leave": _vm.doDestroy } },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.showPopper,\n expression: "showPopper"\n }\n ],\n staticClass: "el-autocomplete-suggestion el-popper",\n class: {\n "is-loading": !_vm.parent.hideLoading && _vm.parent.loading\n },\n style: { width: _vm.dropdownWidth },\n attrs: { role: "region" }\n },\n [\n _c(\n "el-scrollbar",\n {\n attrs: {\n tag: "ul",\n "wrap-class": "el-autocomplete-suggestion__wrap",\n "view-class": "el-autocomplete-suggestion__list"\n }\n },\n [\n !_vm.parent.hideLoading && _vm.parent.loading\n ? _c("li", [_c("i", { staticClass: "el-icon-loading" })])\n : _vm._t("default")\n ],\n 2\n )\n ],\n 1\n )\n ]\n )\n}\nvar autocomplete_suggestionsvue_type_template_id_cd10dcf0_staticRenderFns = []\nautocomplete_suggestionsvue_type_template_id_cd10dcf0_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/autocomplete/src/autocomplete-suggestions.vue?vue&type=template&id=cd10dcf0&\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/vue-popper"\nvar vue_popper_ = __webpack_require__(5);\nvar vue_popper_default = /*#__PURE__*/__webpack_require__.n(vue_popper_);\n\n// EXTERNAL MODULE: external "element-ui/lib/scrollbar"\nvar scrollbar_ = __webpack_require__(18);\nvar scrollbar_default = /*#__PURE__*/__webpack_require__.n(scrollbar_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/autocomplete/src/autocomplete-suggestions.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 */ var autocomplete_suggestionsvue_type_script_lang_js_ = ({\n components: { ElScrollbar: scrollbar_default.a },\n mixins: [vue_popper_default.a, emitter_default.a],\n\n componentName: \'ElAutocompleteSuggestions\',\n\n data: function data() {\n return {\n parent: this.$parent,\n dropdownWidth: \'\'\n };\n },\n\n\n props: {\n options: {\n default: function _default() {\n return {\n gpuAcceleration: false\n };\n }\n },\n id: String\n },\n\n methods: {\n select: function select(item) {\n this.dispatch(\'ElAutocomplete\', \'item-click\', item);\n }\n },\n\n updated: function updated() {\n var _this = this;\n\n this.$nextTick(function (_) {\n _this.popperJS && _this.updatePopper();\n });\n },\n mounted: function mounted() {\n this.$parent.popperElm = this.popperElm = this.$el;\n this.referenceElm = this.$parent.$refs.input.$refs.input || this.$parent.$refs.input.$refs.textarea;\n this.referenceList = this.$el.querySelector(\'.el-autocomplete-suggestion__list\');\n this.referenceList.setAttribute(\'role\', \'listbox\');\n this.referenceList.setAttribute(\'id\', this.id);\n },\n created: function created() {\n var _this2 = this;\n\n this.$on(\'visible\', function (val, inputWidth) {\n _this2.dropdownWidth = inputWidth + \'px\';\n _this2.showPopper = val;\n });\n }\n});\n// CONCATENATED MODULE: ./packages/autocomplete/src/autocomplete-suggestions.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_autocomplete_suggestionsvue_type_script_lang_js_ = (autocomplete_suggestionsvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/autocomplete/src/autocomplete-suggestions.vue\n\n\n\n\n\n/* normalize component */\n\nvar autocomplete_suggestions_component = normalizeComponent(\n src_autocomplete_suggestionsvue_type_script_lang_js_,\n autocomplete_suggestionsvue_type_template_id_cd10dcf0_render,\n autocomplete_suggestionsvue_type_template_id_cd10dcf0_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var autocomplete_suggestions_api; }\nautocomplete_suggestions_component.options.__file = "packages/autocomplete/src/autocomplete-suggestions.vue"\n/* harmony default export */ var autocomplete_suggestions = (autocomplete_suggestions_component.exports);\n// EXTERNAL MODULE: external "element-ui/lib/mixins/focus"\nvar focus_ = __webpack_require__(23);\nvar focus_default = /*#__PURE__*/__webpack_require__.n(focus_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/autocomplete/src/autocomplete.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//\n//\n//\n//\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 */ var autocompletevue_type_script_lang_js_ = ({\n name: \'ElAutocomplete\',\n\n mixins: [emitter_default.a, focus_default()(\'input\'), migrating_default.a],\n\n inheritAttrs: false,\n\n componentName: \'ElAutocomplete\',\n\n components: {\n ElInput: input_default.a,\n ElAutocompleteSuggestions: autocomplete_suggestions\n },\n\n directives: { Clickoutside: clickoutside_default.a },\n\n props: {\n valueKey: {\n type: String,\n default: \'value\'\n },\n popperClass: String,\n popperOptions: Object,\n placeholder: String,\n clearable: {\n type: Boolean,\n default: false\n },\n disabled: Boolean,\n name: String,\n size: String,\n value: String,\n maxlength: Number,\n minlength: Number,\n autofocus: Boolean,\n fetchSuggestions: Function,\n triggerOnFocus: {\n type: Boolean,\n default: true\n },\n customItem: String,\n selectWhenUnmatched: {\n type: Boolean,\n default: false\n },\n prefixIcon: String,\n suffixIcon: String,\n label: String,\n debounce: {\n type: Number,\n default: 300\n },\n placement: {\n type: String,\n default: \'bottom-start\'\n },\n hideLoading: Boolean,\n popperAppendToBody: {\n type: Boolean,\n default: true\n },\n highlightFirstItem: {\n type: Boolean,\n default: false\n }\n },\n data: function data() {\n return {\n activated: false,\n suggestions: [],\n loading: false,\n highlightedIndex: -1,\n suggestionDisabled: false\n };\n },\n\n computed: {\n suggestionVisible: function suggestionVisible() {\n var suggestions = this.suggestions;\n var isValidData = Array.isArray(suggestions) && suggestions.length > 0;\n return (isValidData || this.loading) && this.activated;\n },\n id: function id() {\n return \'el-autocomplete-\' + Object(util_["generateId"])();\n }\n },\n watch: {\n suggestionVisible: function suggestionVisible(val) {\n var $input = this.getInput();\n if ($input) {\n this.broadcast(\'ElAutocompleteSuggestions\', \'visible\', [val, $input.offsetWidth]);\n }\n }\n },\n methods: {\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n \'custom-item\': \'custom-item is removed, use scoped slot instead.\',\n \'props\': \'props is removed, use value-key instead.\'\n }\n };\n },\n getData: function getData(queryString) {\n var _this = this;\n\n if (this.suggestionDisabled) {\n return;\n }\n this.loading = true;\n this.fetchSuggestions(queryString, function (suggestions) {\n _this.loading = false;\n if (_this.suggestionDisabled) {\n return;\n }\n if (Array.isArray(suggestions)) {\n _this.suggestions = suggestions;\n _this.highlightedIndex = _this.highlightFirstItem ? 0 : -1;\n } else {\n console.error(\'[Element Error][Autocomplete]autocomplete suggestions must be an array\');\n }\n });\n },\n handleInput: function handleInput(value) {\n this.$emit(\'input\', value);\n this.suggestionDisabled = false;\n if (!this.triggerOnFocus && !value) {\n this.suggestionDisabled = true;\n this.suggestions = [];\n return;\n }\n this.debouncedGetData(value);\n },\n handleChange: function handleChange(value) {\n this.$emit(\'change\', value);\n },\n handleFocus: function handleFocus(event) {\n this.activated = true;\n this.$emit(\'focus\', event);\n if (this.triggerOnFocus) {\n this.debouncedGetData(this.value);\n }\n },\n handleBlur: function handleBlur(event) {\n this.$emit(\'blur\', event);\n },\n handleClear: function handleClear() {\n this.activated = false;\n this.$emit(\'clear\');\n },\n close: function close(e) {\n this.activated = false;\n },\n handleKeyEnter: function handleKeyEnter(e) {\n var _this2 = this;\n\n if (this.suggestionVisible && this.highlightedIndex >= 0 && this.highlightedIndex < this.suggestions.length) {\n e.preventDefault();\n this.select(this.suggestions[this.highlightedIndex]);\n } else if (this.selectWhenUnmatched) {\n this.$emit(\'select\', { value: this.value });\n this.$nextTick(function (_) {\n _this2.suggestions = [];\n _this2.highlightedIndex = -1;\n });\n }\n },\n select: function select(item) {\n var _this3 = this;\n\n this.$emit(\'input\', item[this.valueKey]);\n this.$emit(\'select\', item);\n this.$nextTick(function (_) {\n _this3.suggestions = [];\n _this3.highlightedIndex = -1;\n });\n },\n highlight: function highlight(index) {\n if (!this.suggestionVisible || this.loading) {\n return;\n }\n if (index < 0) {\n this.highlightedIndex = -1;\n return;\n }\n if (index >= this.suggestions.length) {\n index = this.suggestions.length - 1;\n }\n var suggestion = this.$refs.suggestions.$el.querySelector(\'.el-autocomplete-suggestion__wrap\');\n var suggestionList = suggestion.querySelectorAll(\'.el-autocomplete-suggestion__list li\');\n\n var highlightItem = suggestionList[index];\n var scrollTop = suggestion.scrollTop;\n var offsetTop = highlightItem.offsetTop;\n\n if (offsetTop + highlightItem.scrollHeight > scrollTop + suggestion.clientHeight) {\n suggestion.scrollTop += highlightItem.scrollHeight;\n }\n if (offsetTop < scrollTop) {\n suggestion.scrollTop -= highlightItem.scrollHeight;\n }\n this.highlightedIndex = index;\n var $input = this.getInput();\n $input.setAttribute(\'aria-activedescendant\', this.id + \'-item-\' + this.highlightedIndex);\n },\n getInput: function getInput() {\n return this.$refs.input.getInput();\n }\n },\n mounted: function mounted() {\n var _this4 = this;\n\n this.debouncedGetData = debounce_default()(this.debounce, this.getData);\n this.$on(\'item-click\', function (item) {\n _this4.select(item);\n });\n var $input = this.getInput();\n $input.setAttribute(\'role\', \'textbox\');\n $input.setAttribute(\'aria-autocomplete\', \'list\');\n $input.setAttribute(\'aria-controls\', \'id\');\n $input.setAttribute(\'aria-activedescendant\', this.id + \'-item-\' + this.highlightedIndex);\n },\n beforeDestroy: function beforeDestroy() {\n this.$refs.suggestions.$destroy();\n }\n});\n// CONCATENATED MODULE: ./packages/autocomplete/src/autocomplete.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_autocompletevue_type_script_lang_js_ = (autocompletevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/autocomplete/src/autocomplete.vue\n\n\n\n\n\n/* normalize component */\n\nvar autocomplete_component = normalizeComponent(\n src_autocompletevue_type_script_lang_js_,\n autocompletevue_type_template_id_152f2ee6_render,\n autocompletevue_type_template_id_152f2ee6_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var autocomplete_api; }\nautocomplete_component.options.__file = "packages/autocomplete/src/autocomplete.vue"\n/* harmony default export */ var autocomplete = (autocomplete_component.exports);\n// CONCATENATED MODULE: ./packages/autocomplete/index.js\n\n\n/* istanbul ignore next */\nautocomplete.install = function (Vue) {\n Vue.component(autocomplete.name, autocomplete);\n};\n\n/* harmony default export */ var packages_autocomplete = (autocomplete);\n// EXTERNAL MODULE: external "element-ui/lib/button"\nvar button_ = __webpack_require__(13);\nvar button_default = /*#__PURE__*/__webpack_require__.n(button_);\n\n// EXTERNAL MODULE: external "element-ui/lib/button-group"\nvar button_group_ = __webpack_require__(29);\nvar button_group_default = /*#__PURE__*/__webpack_require__.n(button_group_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/dropdown/src/dropdown.vue?vue&type=script&lang=js&\n\n\n\n\n\n\n\n\n/* harmony default export */ var dropdownvue_type_script_lang_js_ = ({\n name: \'ElDropdown\',\n\n componentName: \'ElDropdown\',\n\n mixins: [emitter_default.a, migrating_default.a],\n\n directives: { Clickoutside: clickoutside_default.a },\n\n components: {\n ElButton: button_default.a,\n ElButtonGroup: button_group_default.a\n },\n\n provide: function provide() {\n return {\n dropdown: this\n };\n },\n\n\n props: {\n trigger: {\n type: String,\n default: \'hover\'\n },\n type: String,\n size: {\n type: String,\n default: \'\'\n },\n splitButton: Boolean,\n hideOnClick: {\n type: Boolean,\n default: true\n },\n placement: {\n type: String,\n default: \'bottom-end\'\n },\n visibleArrow: {\n default: true\n },\n showTimeout: {\n type: Number,\n default: 250\n },\n hideTimeout: {\n type: Number,\n default: 150\n },\n tabindex: {\n type: Number,\n default: 0\n },\n disabled: {\n type: Boolean,\n default: false\n }\n },\n\n data: function data() {\n return {\n timeout: null,\n visible: false,\n triggerElm: null,\n menuItems: null,\n menuItemsArray: null,\n dropdownElm: null,\n focusing: false,\n listId: \'dropdown-menu-\' + Object(util_["generateId"])()\n };\n },\n\n\n computed: {\n dropdownSize: function dropdownSize() {\n return this.size || (this.$ELEMENT || {}).size;\n }\n },\n\n mounted: function mounted() {\n this.$on(\'menu-item-click\', this.handleMenuItemClick);\n },\n\n\n watch: {\n visible: function visible(val) {\n this.broadcast(\'ElDropdownMenu\', \'visible\', val);\n this.$emit(\'visible-change\', val);\n },\n focusing: function focusing(val) {\n var selfDefine = this.$el.querySelector(\'.el-dropdown-selfdefine\');\n if (selfDefine) {\n // 自定义\n if (val) {\n selfDefine.className += \' focusing\';\n } else {\n selfDefine.className = selfDefine.className.replace(\'focusing\', \'\');\n }\n }\n }\n },\n\n methods: {\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n \'menu-align\': \'menu-align is renamed to placement.\'\n }\n };\n },\n show: function show() {\n var _this = this;\n\n if (this.disabled) return;\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () {\n _this.visible = true;\n }, this.trigger === \'click\' ? 0 : this.showTimeout);\n },\n hide: function hide() {\n var _this2 = this;\n\n if (this.disabled) return;\n this.removeTabindex();\n if (this.tabindex >= 0) {\n this.resetTabindex(this.triggerElm);\n }\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () {\n _this2.visible = false;\n }, this.trigger === \'click\' ? 0 : this.hideTimeout);\n },\n handleClick: function handleClick() {\n if (this.disabled) return;\n if (this.visible) {\n this.hide();\n } else {\n this.show();\n }\n },\n handleTriggerKeyDown: function handleTriggerKeyDown(ev) {\n var keyCode = ev.keyCode;\n if ([38, 40].indexOf(keyCode) > -1) {\n // up/down\n this.removeTabindex();\n this.resetTabindex(this.menuItems[0]);\n this.menuItems[0].focus();\n ev.preventDefault();\n ev.stopPropagation();\n } else if (keyCode === 13) {\n // space enter选中\n this.handleClick();\n } else if ([9, 27].indexOf(keyCode) > -1) {\n // tab || esc\n this.hide();\n }\n },\n handleItemKeyDown: function handleItemKeyDown(ev) {\n var keyCode = ev.keyCode;\n var target = ev.target;\n var currentIndex = this.menuItemsArray.indexOf(target);\n var max = this.menuItemsArray.length - 1;\n var nextIndex = void 0;\n if ([38, 40].indexOf(keyCode) > -1) {\n // up/down\n if (keyCode === 38) {\n // up\n nextIndex = currentIndex !== 0 ? currentIndex - 1 : 0;\n } else {\n // down\n nextIndex = currentIndex < max ? currentIndex + 1 : max;\n }\n this.removeTabindex();\n this.resetTabindex(this.menuItems[nextIndex]);\n this.menuItems[nextIndex].focus();\n ev.preventDefault();\n ev.stopPropagation();\n } else if (keyCode === 13) {\n // enter选中\n this.triggerElmFocus();\n target.click();\n if (this.hideOnClick) {\n // click关闭\n this.visible = false;\n }\n } else if ([9, 27].indexOf(keyCode) > -1) {\n // tab // esc\n this.hide();\n this.triggerElmFocus();\n }\n },\n resetTabindex: function resetTabindex(ele) {\n // 下次tab时组件聚焦元素\n this.removeTabindex();\n ele.setAttribute(\'tabindex\', \'0\'); // 下次期望的聚焦元素\n },\n removeTabindex: function removeTabindex() {\n this.triggerElm.setAttribute(\'tabindex\', \'-1\');\n this.menuItemsArray.forEach(function (item) {\n item.setAttribute(\'tabindex\', \'-1\');\n });\n },\n initAria: function initAria() {\n this.dropdownElm.setAttribute(\'id\', this.listId);\n this.triggerElm.setAttribute(\'aria-haspopup\', \'list\');\n this.triggerElm.setAttribute(\'aria-controls\', this.listId);\n\n if (!this.splitButton) {\n // 自定义\n this.triggerElm.setAttribute(\'role\', \'button\');\n this.triggerElm.setAttribute(\'tabindex\', this.tabindex);\n this.triggerElm.setAttribute(\'class\', (this.triggerElm.getAttribute(\'class\') || \'\') + \' el-dropdown-selfdefine\'); // 控制\n }\n },\n initEvent: function initEvent() {\n var _this3 = this;\n\n var trigger = this.trigger,\n show = this.show,\n hide = this.hide,\n handleClick = this.handleClick,\n splitButton = this.splitButton,\n handleTriggerKeyDown = this.handleTriggerKeyDown,\n handleItemKeyDown = this.handleItemKeyDown;\n\n this.triggerElm = splitButton ? this.$refs.trigger.$el : this.$slots.default[0].elm;\n\n var dropdownElm = this.dropdownElm;\n\n this.triggerElm.addEventListener(\'keydown\', handleTriggerKeyDown); // triggerElm keydown\n dropdownElm.addEventListener(\'keydown\', handleItemKeyDown, true); // item keydown\n // 控制自定义元素的样式\n if (!splitButton) {\n this.triggerElm.addEventListener(\'focus\', function () {\n _this3.focusing = true;\n });\n this.triggerElm.addEventListener(\'blur\', function () {\n _this3.focusing = false;\n });\n this.triggerElm.addEventListener(\'click\', function () {\n _this3.focusing = false;\n });\n }\n if (trigger === \'hover\') {\n this.triggerElm.addEventListener(\'mouseenter\', show);\n this.triggerElm.addEventListener(\'mouseleave\', hide);\n dropdownElm.addEventListener(\'mouseenter\', show);\n dropdownElm.addEventListener(\'mouseleave\', hide);\n } else if (trigger === \'click\') {\n this.triggerElm.addEventListener(\'click\', handleClick);\n }\n },\n handleMenuItemClick: function handleMenuItemClick(command, instance) {\n if (this.hideOnClick) {\n this.visible = false;\n }\n this.$emit(\'command\', command, instance);\n },\n triggerElmFocus: function triggerElmFocus() {\n this.triggerElm.focus && this.triggerElm.focus();\n },\n initDomOperation: function initDomOperation() {\n this.dropdownElm = this.popperElm;\n this.menuItems = this.dropdownElm.querySelectorAll("[tabindex=\'-1\']");\n this.menuItemsArray = [].slice.call(this.menuItems);\n\n this.initEvent();\n this.initAria();\n }\n },\n\n render: function render(h) {\n var _this4 = this;\n\n var hide = this.hide,\n splitButton = this.splitButton,\n type = this.type,\n dropdownSize = this.dropdownSize,\n disabled = this.disabled;\n\n\n var handleMainButtonClick = function handleMainButtonClick(event) {\n _this4.$emit(\'click\', event);\n hide();\n };\n\n var triggerElm = null;\n if (splitButton) {\n triggerElm = h(\'el-button-group\', [h(\n \'el-button\',\n {\n attrs: { type: type, size: dropdownSize, disabled: disabled },\n nativeOn: {\n \'click\': handleMainButtonClick\n }\n },\n [this.$slots.default]\n ), h(\n \'el-button\',\n { ref: \'trigger\', attrs: { type: type, size: dropdownSize, disabled: disabled },\n \'class\': \'el-dropdown__caret-button\' },\n [h(\'i\', { \'class\': \'el-dropdown__icon el-icon-arrow-down\' })]\n )]);\n } else {\n triggerElm = this.$slots.default;\n var vnodeData = triggerElm[0].data || {};\n var _vnodeData$attrs = vnodeData.attrs,\n attrs = _vnodeData$attrs === undefined ? {} : _vnodeData$attrs;\n\n if (disabled && !attrs.disabled) {\n attrs.disabled = true;\n vnodeData.attrs = attrs;\n }\n }\n var menuElm = disabled ? null : this.$slots.dropdown;\n\n return h(\n \'div\',\n { \'class\': \'el-dropdown\', directives: [{\n name: \'clickoutside\',\n value: hide\n }],\n attrs: { \'aria-disabled\': disabled }\n },\n [triggerElm, menuElm]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/dropdown/src/dropdown.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_dropdownvue_type_script_lang_js_ = (dropdownvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/dropdown/src/dropdown.vue\nvar dropdown_render, dropdown_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar dropdown_component = normalizeComponent(\n src_dropdownvue_type_script_lang_js_,\n dropdown_render,\n dropdown_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var dropdown_api; }\ndropdown_component.options.__file = "packages/dropdown/src/dropdown.vue"\n/* harmony default export */ var dropdown = (dropdown_component.exports);\n// CONCATENATED MODULE: ./packages/dropdown/index.js\n\n\n/* istanbul ignore next */\ndropdown.install = function (Vue) {\n Vue.component(dropdown.name, dropdown);\n};\n\n/* harmony default export */ var packages_dropdown = (dropdown);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/dropdown/src/dropdown-menu.vue?vue&type=template&id=0da6b714&\nvar dropdown_menuvue_type_template_id_0da6b714_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n { attrs: { name: "el-zoom-in-top" }, on: { "after-leave": _vm.doDestroy } },\n [\n _c(\n "ul",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.showPopper,\n expression: "showPopper"\n }\n ],\n staticClass: "el-dropdown-menu el-popper",\n class: [_vm.size && "el-dropdown-menu--" + _vm.size]\n },\n [_vm._t("default")],\n 2\n )\n ]\n )\n}\nvar dropdown_menuvue_type_template_id_0da6b714_staticRenderFns = []\ndropdown_menuvue_type_template_id_0da6b714_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/dropdown/src/dropdown-menu.vue?vue&type=template&id=0da6b714&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/dropdown/src/dropdown-menu.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ var dropdown_menuvue_type_script_lang_js_ = ({\n name: \'ElDropdownMenu\',\n\n componentName: \'ElDropdownMenu\',\n\n mixins: [vue_popper_default.a],\n\n props: {\n visibleArrow: {\n type: Boolean,\n default: true\n },\n arrowOffset: {\n type: Number,\n default: 0\n }\n },\n\n data: function data() {\n return {\n size: this.dropdown.dropdownSize\n };\n },\n\n\n inject: [\'dropdown\'],\n\n created: function created() {\n var _this = this;\n\n this.$on(\'updatePopper\', function () {\n if (_this.showPopper) _this.updatePopper();\n });\n this.$on(\'visible\', function (val) {\n _this.showPopper = val;\n });\n },\n mounted: function mounted() {\n this.dropdown.popperElm = this.popperElm = this.$el;\n this.referenceElm = this.dropdown.$el;\n // compatible with 2.6 new v-slot syntax\n // issue link https://github.com/ElemeFE/element/issues/14345\n this.dropdown.initDomOperation();\n },\n\n\n watch: {\n \'dropdown.placement\': {\n immediate: true,\n handler: function handler(val) {\n this.currentPlacement = val;\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/dropdown/src/dropdown-menu.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_dropdown_menuvue_type_script_lang_js_ = (dropdown_menuvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/dropdown/src/dropdown-menu.vue\n\n\n\n\n\n/* normalize component */\n\nvar dropdown_menu_component = normalizeComponent(\n src_dropdown_menuvue_type_script_lang_js_,\n dropdown_menuvue_type_template_id_0da6b714_render,\n dropdown_menuvue_type_template_id_0da6b714_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var dropdown_menu_api; }\ndropdown_menu_component.options.__file = "packages/dropdown/src/dropdown-menu.vue"\n/* harmony default export */ var dropdown_menu = (dropdown_menu_component.exports);\n// CONCATENATED MODULE: ./packages/dropdown-menu/index.js\n\n\n/* istanbul ignore next */\ndropdown_menu.install = function (Vue) {\n Vue.component(dropdown_menu.name, dropdown_menu);\n};\n\n/* harmony default export */ var packages_dropdown_menu = (dropdown_menu);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/dropdown/src/dropdown-item.vue?vue&type=template&id=6359102a&\nvar dropdown_itemvue_type_template_id_6359102a_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "li",\n {\n staticClass: "el-dropdown-menu__item",\n class: {\n "is-disabled": _vm.disabled,\n "el-dropdown-menu__item--divided": _vm.divided\n },\n attrs: {\n "aria-disabled": _vm.disabled,\n tabindex: _vm.disabled ? null : -1\n },\n on: { click: _vm.handleClick }\n },\n [_vm.icon ? _c("i", { class: _vm.icon }) : _vm._e(), _vm._t("default")],\n 2\n )\n}\nvar dropdown_itemvue_type_template_id_6359102a_staticRenderFns = []\ndropdown_itemvue_type_template_id_6359102a_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/dropdown/src/dropdown-item.vue?vue&type=template&id=6359102a&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/dropdown/src/dropdown-item.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/* harmony default export */ var dropdown_itemvue_type_script_lang_js_ = ({\n name: \'ElDropdownItem\',\n\n mixins: [emitter_default.a],\n\n props: {\n command: {},\n disabled: Boolean,\n divided: Boolean,\n icon: String\n },\n\n methods: {\n handleClick: function handleClick(e) {\n this.dispatch(\'ElDropdown\', \'menu-item-click\', [this.command, this]);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/dropdown/src/dropdown-item.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_dropdown_itemvue_type_script_lang_js_ = (dropdown_itemvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/dropdown/src/dropdown-item.vue\n\n\n\n\n\n/* normalize component */\n\nvar dropdown_item_component = normalizeComponent(\n src_dropdown_itemvue_type_script_lang_js_,\n dropdown_itemvue_type_template_id_6359102a_render,\n dropdown_itemvue_type_template_id_6359102a_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var dropdown_item_api; }\ndropdown_item_component.options.__file = "packages/dropdown/src/dropdown-item.vue"\n/* harmony default export */ var dropdown_item = (dropdown_item_component.exports);\n// CONCATENATED MODULE: ./packages/dropdown-item/index.js\n\n\n/* istanbul ignore next */\ndropdown_item.install = function (Vue) {\n Vue.component(dropdown_item.name, dropdown_item);\n};\n\n/* harmony default export */ var packages_dropdown_item = (dropdown_item);\n// CONCATENATED MODULE: ./src/utils/aria-utils.js\nvar aria = aria || {};\n\naria.Utils = aria.Utils || {};\n\n/**\n * @desc Set focus on descendant nodes until the first focusable element is\n * found.\n * @param element\n * DOM node for which to find the first focusable descendant.\n * @returns\n * true if a focusable element is found and focus is set.\n */\naria.Utils.focusFirstDescendant = function (element) {\n for (var i = 0; i < element.childNodes.length; i++) {\n var child = element.childNodes[i];\n if (aria.Utils.attemptFocus(child) || aria.Utils.focusFirstDescendant(child)) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * @desc Find the last descendant node that is focusable.\n * @param element\n * DOM node for which to find the last focusable descendant.\n * @returns\n * true if a focusable element is found and focus is set.\n */\n\naria.Utils.focusLastDescendant = function (element) {\n for (var i = element.childNodes.length - 1; i >= 0; i--) {\n var child = element.childNodes[i];\n if (aria.Utils.attemptFocus(child) || aria.Utils.focusLastDescendant(child)) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * @desc Set Attempt to set focus on the current node.\n * @param element\n * The node to attempt to focus on.\n * @returns\n * true if element is focused.\n */\naria.Utils.attemptFocus = function (element) {\n if (!aria.Utils.isFocusable(element)) {\n return false;\n }\n aria.Utils.IgnoreUtilFocusChanges = true;\n try {\n element.focus();\n } catch (e) {}\n aria.Utils.IgnoreUtilFocusChanges = false;\n return document.activeElement === element;\n};\n\naria.Utils.isFocusable = function (element) {\n if (element.tabIndex > 0 || element.tabIndex === 0 && element.getAttribute(\'tabIndex\') !== null) {\n return true;\n }\n\n if (element.disabled) {\n return false;\n }\n\n switch (element.nodeName) {\n case \'A\':\n return !!element.href && element.rel !== \'ignore\';\n case \'INPUT\':\n return element.type !== \'hidden\' && element.type !== \'file\';\n case \'BUTTON\':\n case \'SELECT\':\n case \'TEXTAREA\':\n return true;\n default:\n return false;\n }\n};\n\n/**\n * 触发一个事件\n * mouseenter, mouseleave, mouseover, keyup, change, click 等\n * @param {Element} elm\n * @param {String} name\n * @param {*} opts\n */\naria.Utils.triggerEvent = function (elm, name) {\n var eventName = void 0;\n\n if (/^mouse|click/.test(name)) {\n eventName = \'MouseEvents\';\n } else if (/^key/.test(name)) {\n eventName = \'KeyboardEvent\';\n } else {\n eventName = \'HTMLEvents\';\n }\n var evt = document.createEvent(eventName);\n\n for (var _len = arguments.length, opts = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n opts[_key - 2] = arguments[_key];\n }\n\n evt.initEvent.apply(evt, [name].concat(opts));\n elm.dispatchEvent ? elm.dispatchEvent(evt) : elm.fireEvent(\'on\' + name, evt);\n\n return elm;\n};\n\naria.Utils.keys = {\n tab: 9,\n enter: 13,\n space: 32,\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n esc: 27\n};\n\n/* harmony default export */ var aria_utils = (aria.Utils);\n// CONCATENATED MODULE: ./src/utils/menu/aria-submenu.js\n\n\nvar SubMenu = function SubMenu(parent, domNode) {\n this.domNode = domNode;\n this.parent = parent;\n this.subMenuItems = [];\n this.subIndex = 0;\n this.init();\n};\n\nSubMenu.prototype.init = function () {\n this.subMenuItems = this.domNode.querySelectorAll(\'li\');\n this.addListeners();\n};\n\nSubMenu.prototype.gotoSubIndex = function (idx) {\n if (idx === this.subMenuItems.length) {\n idx = 0;\n } else if (idx < 0) {\n idx = this.subMenuItems.length - 1;\n }\n this.subMenuItems[idx].focus();\n this.subIndex = idx;\n};\n\nSubMenu.prototype.addListeners = function () {\n var _this = this;\n\n var keys = aria_utils.keys;\n var parentNode = this.parent.domNode;\n Array.prototype.forEach.call(this.subMenuItems, function (el) {\n el.addEventListener(\'keydown\', function (event) {\n var prevDef = false;\n switch (event.keyCode) {\n case keys.down:\n _this.gotoSubIndex(_this.subIndex + 1);\n prevDef = true;\n break;\n case keys.up:\n _this.gotoSubIndex(_this.subIndex - 1);\n prevDef = true;\n break;\n case keys.tab:\n aria_utils.triggerEvent(parentNode, \'mouseleave\');\n break;\n case keys.enter:\n case keys.space:\n prevDef = true;\n event.currentTarget.click();\n break;\n }\n if (prevDef) {\n event.preventDefault();\n event.stopPropagation();\n }\n return false;\n });\n });\n};\n\n/* harmony default export */ var aria_submenu = (SubMenu);\n// CONCATENATED MODULE: ./src/utils/menu/aria-menuitem.js\n\n\n\nvar MenuItem = function MenuItem(domNode) {\n this.domNode = domNode;\n this.submenu = null;\n this.init();\n};\n\nMenuItem.prototype.init = function () {\n this.domNode.setAttribute(\'tabindex\', \'0\');\n var menuChild = this.domNode.querySelector(\'.el-menu\');\n if (menuChild) {\n this.submenu = new aria_submenu(this, menuChild);\n }\n this.addListeners();\n};\n\nMenuItem.prototype.addListeners = function () {\n var _this = this;\n\n var keys = aria_utils.keys;\n this.domNode.addEventListener(\'keydown\', function (event) {\n var prevDef = false;\n switch (event.keyCode) {\n case keys.down:\n aria_utils.triggerEvent(event.currentTarget, \'mouseenter\');\n _this.submenu && _this.submenu.gotoSubIndex(0);\n prevDef = true;\n break;\n case keys.up:\n aria_utils.triggerEvent(event.currentTarget, \'mouseenter\');\n _this.submenu && _this.submenu.gotoSubIndex(_this.submenu.subMenuItems.length - 1);\n prevDef = true;\n break;\n case keys.tab:\n aria_utils.triggerEvent(event.currentTarget, \'mouseleave\');\n break;\n case keys.enter:\n case keys.space:\n prevDef = true;\n event.currentTarget.click();\n break;\n }\n if (prevDef) {\n event.preventDefault();\n }\n });\n};\n\n/* harmony default export */ var aria_menuitem = (MenuItem);\n// CONCATENATED MODULE: ./src/utils/menu/aria-menubar.js\n\n\nvar Menu = function Menu(domNode) {\n this.domNode = domNode;\n this.init();\n};\n\nMenu.prototype.init = function () {\n var menuChildren = this.domNode.childNodes;\n [].filter.call(menuChildren, function (child) {\n return child.nodeType === 1;\n }).forEach(function (child) {\n new aria_menuitem(child); // eslint-disable-line\n });\n};\n/* harmony default export */ var aria_menubar = (Menu);\n// EXTERNAL MODULE: external "element-ui/lib/utils/dom"\nvar dom_ = __webpack_require__(1);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/menu/src/menu.vue?vue&type=script&lang=js&\n\n\n\n\n\n\n/* harmony default export */ var menuvue_type_script_lang_js_ = ({\n name: \'ElMenu\',\n\n render: function render(h) {\n var component = h(\n \'ul\',\n {\n attrs: {\n role: \'menubar\'\n },\n key: +this.collapse,\n style: { backgroundColor: this.backgroundColor || \'\' },\n \'class\': {\n \'el-menu--horizontal\': this.mode === \'horizontal\',\n \'el-menu--collapse\': this.collapse,\n "el-menu": true\n }\n },\n [this.$slots.default]\n );\n\n if (this.collapseTransition) {\n return h(\'el-menu-collapse-transition\', [component]);\n } else {\n return component;\n }\n },\n\n\n componentName: \'ElMenu\',\n\n mixins: [emitter_default.a, migrating_default.a],\n\n provide: function provide() {\n return {\n rootMenu: this\n };\n },\n\n\n components: {\n \'el-menu-collapse-transition\': {\n functional: true,\n render: function render(createElement, context) {\n var data = {\n props: {\n mode: \'out-in\'\n },\n on: {\n beforeEnter: function beforeEnter(el) {\n el.style.opacity = 0.2;\n },\n enter: function enter(el) {\n Object(dom_["addClass"])(el, \'el-opacity-transition\');\n el.style.opacity = 1;\n },\n afterEnter: function afterEnter(el) {\n Object(dom_["removeClass"])(el, \'el-opacity-transition\');\n el.style.opacity = \'\';\n },\n beforeLeave: function beforeLeave(el) {\n if (!el.dataset) el.dataset = {};\n\n if (Object(dom_["hasClass"])(el, \'el-menu--collapse\')) {\n Object(dom_["removeClass"])(el, \'el-menu--collapse\');\n el.dataset.oldOverflow = el.style.overflow;\n el.dataset.scrollWidth = el.clientWidth;\n Object(dom_["addClass"])(el, \'el-menu--collapse\');\n } else {\n Object(dom_["addClass"])(el, \'el-menu--collapse\');\n el.dataset.oldOverflow = el.style.overflow;\n el.dataset.scrollWidth = el.clientWidth;\n Object(dom_["removeClass"])(el, \'el-menu--collapse\');\n }\n\n el.style.width = el.scrollWidth + \'px\';\n el.style.overflow = \'hidden\';\n },\n leave: function leave(el) {\n Object(dom_["addClass"])(el, \'horizontal-collapse-transition\');\n el.style.width = el.dataset.scrollWidth + \'px\';\n }\n }\n };\n return createElement(\'transition\', data, context.children);\n }\n }\n },\n\n props: {\n mode: {\n type: String,\n default: \'vertical\'\n },\n defaultActive: {\n type: String,\n default: \'\'\n },\n defaultOpeneds: Array,\n uniqueOpened: Boolean,\n router: Boolean,\n menuTrigger: {\n type: String,\n default: \'hover\'\n },\n collapse: Boolean,\n backgroundColor: String,\n textColor: String,\n activeTextColor: String,\n collapseTransition: {\n type: Boolean,\n default: true\n }\n },\n data: function data() {\n return {\n activeIndex: this.defaultActive,\n openedMenus: this.defaultOpeneds && !this.collapse ? this.defaultOpeneds.slice(0) : [],\n items: {},\n submenus: {}\n };\n },\n\n computed: {\n hoverBackground: function hoverBackground() {\n return this.backgroundColor ? this.mixColor(this.backgroundColor, 0.2) : \'\';\n },\n isMenuPopup: function isMenuPopup() {\n return this.mode === \'horizontal\' || this.mode === \'vertical\' && this.collapse;\n }\n },\n watch: {\n defaultActive: function defaultActive(value) {\n if (!this.items[value]) {\n this.activeIndex = null;\n }\n this.updateActiveIndex(value);\n },\n defaultOpeneds: function defaultOpeneds(value) {\n if (!this.collapse) {\n this.openedMenus = value;\n }\n },\n collapse: function collapse(value) {\n if (value) this.openedMenus = [];\n this.broadcast(\'ElSubmenu\', \'toggle-collapse\', value);\n }\n },\n methods: {\n updateActiveIndex: function updateActiveIndex(val) {\n var item = this.items[val] || this.items[this.activeIndex] || this.items[this.defaultActive];\n if (item) {\n this.activeIndex = item.index;\n this.initOpenedMenu();\n } else {\n this.activeIndex = null;\n }\n },\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n \'theme\': \'theme is removed.\'\n }\n };\n },\n getColorChannels: function getColorChannels(color) {\n color = color.replace(\'#\', \'\');\n if (/^[0-9a-fA-F]{3}$/.test(color)) {\n color = color.split(\'\');\n for (var i = 2; i >= 0; i--) {\n color.splice(i, 0, color[i]);\n }\n color = color.join(\'\');\n }\n if (/^[0-9a-fA-F]{6}$/.test(color)) {\n return {\n red: parseInt(color.slice(0, 2), 16),\n green: parseInt(color.slice(2, 4), 16),\n blue: parseInt(color.slice(4, 6), 16)\n };\n } else {\n return {\n red: 255,\n green: 255,\n blue: 255\n };\n }\n },\n mixColor: function mixColor(color, percent) {\n var _getColorChannels = this.getColorChannels(color),\n red = _getColorChannels.red,\n green = _getColorChannels.green,\n blue = _getColorChannels.blue;\n\n if (percent > 0) {\n // shade given color\n red *= 1 - percent;\n green *= 1 - percent;\n blue *= 1 - percent;\n } else {\n // tint given color\n red += (255 - red) * percent;\n green += (255 - green) * percent;\n blue += (255 - blue) * percent;\n }\n return \'rgb(\' + Math.round(red) + \', \' + Math.round(green) + \', \' + Math.round(blue) + \')\';\n },\n addItem: function addItem(item) {\n this.$set(this.items, item.index, item);\n },\n removeItem: function removeItem(item) {\n delete this.items[item.index];\n },\n addSubmenu: function addSubmenu(item) {\n this.$set(this.submenus, item.index, item);\n },\n removeSubmenu: function removeSubmenu(item) {\n delete this.submenus[item.index];\n },\n openMenu: function openMenu(index, indexPath) {\n var openedMenus = this.openedMenus;\n if (openedMenus.indexOf(index) !== -1) return;\n // 将不在该菜单路径下的其余菜单收起\n // collapse all menu that are not under current menu item\n if (this.uniqueOpened) {\n this.openedMenus = openedMenus.filter(function (index) {\n return indexPath.indexOf(index) !== -1;\n });\n }\n this.openedMenus.push(index);\n },\n closeMenu: function closeMenu(index) {\n var i = this.openedMenus.indexOf(index);\n if (i !== -1) {\n this.openedMenus.splice(i, 1);\n }\n },\n handleSubmenuClick: function handleSubmenuClick(submenu) {\n var index = submenu.index,\n indexPath = submenu.indexPath;\n\n var isOpened = this.openedMenus.indexOf(index) !== -1;\n\n if (isOpened) {\n this.closeMenu(index);\n this.$emit(\'close\', index, indexPath);\n } else {\n this.openMenu(index, indexPath);\n this.$emit(\'open\', index, indexPath);\n }\n },\n handleItemClick: function handleItemClick(item) {\n var _this = this;\n\n var index = item.index,\n indexPath = item.indexPath;\n\n var oldActiveIndex = this.activeIndex;\n var hasIndex = item.index !== null;\n\n if (hasIndex) {\n this.activeIndex = item.index;\n }\n\n this.$emit(\'select\', index, indexPath, item);\n\n if (this.mode === \'horizontal\' || this.collapse) {\n this.openedMenus = [];\n }\n\n if (this.router && hasIndex) {\n this.routeToItem(item, function (error) {\n _this.activeIndex = oldActiveIndex;\n if (error) {\n // vue-router 3.1.0+ push/replace cause NavigationDuplicated error \n // https://github.com/ElemeFE/element/issues/17044\n if (error.name === \'NavigationDuplicated\') return;\n console.error(error);\n }\n });\n }\n },\n\n // 初始化展开菜单\n // initialize opened menu\n initOpenedMenu: function initOpenedMenu() {\n var _this2 = this;\n\n var index = this.activeIndex;\n var activeItem = this.items[index];\n if (!activeItem || this.mode === \'horizontal\' || this.collapse) return;\n\n var indexPath = activeItem.indexPath;\n\n // 展开该菜单项的路径上所有子菜单\n // expand all submenus of the menu item\n indexPath.forEach(function (index) {\n var submenu = _this2.submenus[index];\n submenu && _this2.openMenu(index, submenu.indexPath);\n });\n },\n routeToItem: function routeToItem(item, onError) {\n var route = item.route || item.index;\n try {\n this.$router.push(route, function () {}, onError);\n } catch (e) {\n console.error(e);\n }\n },\n open: function open(index) {\n var _this3 = this;\n\n var indexPath = this.submenus[index.toString()].indexPath;\n\n indexPath.forEach(function (i) {\n return _this3.openMenu(i, indexPath);\n });\n },\n close: function close(index) {\n this.closeMenu(index);\n }\n },\n mounted: function mounted() {\n this.initOpenedMenu();\n this.$on(\'item-click\', this.handleItemClick);\n this.$on(\'submenu-click\', this.handleSubmenuClick);\n if (this.mode === \'horizontal\') {\n new aria_menubar(this.$el); // eslint-disable-line\n }\n this.$watch(\'items\', this.updateActiveIndex);\n }\n});\n// CONCATENATED MODULE: ./packages/menu/src/menu.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_menuvue_type_script_lang_js_ = (menuvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/menu/src/menu.vue\nvar menu_render, menu_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar menu_component = normalizeComponent(\n src_menuvue_type_script_lang_js_,\n menu_render,\n menu_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var menu_api; }\nmenu_component.options.__file = "packages/menu/src/menu.vue"\n/* harmony default export */ var src_menu = (menu_component.exports);\n// CONCATENATED MODULE: ./packages/menu/index.js\n\n\n/* istanbul ignore next */\nsrc_menu.install = function (Vue) {\n Vue.component(src_menu.name, src_menu);\n};\n\n/* harmony default export */ var packages_menu = (src_menu);\n// EXTERNAL MODULE: external "element-ui/lib/transitions/collapse-transition"\nvar collapse_transition_ = __webpack_require__(21);\nvar collapse_transition_default = /*#__PURE__*/__webpack_require__.n(collapse_transition_);\n\n// CONCATENATED MODULE: ./packages/menu/src/menu-mixin.js\n/* harmony default export */ var menu_mixin = ({\n inject: [\'rootMenu\'],\n computed: {\n indexPath: function indexPath() {\n var path = [this.index];\n var parent = this.$parent;\n while (parent.$options.componentName !== \'ElMenu\') {\n if (parent.index) {\n path.unshift(parent.index);\n }\n parent = parent.$parent;\n }\n return path;\n },\n parentMenu: function parentMenu() {\n var parent = this.$parent;\n while (parent && [\'ElMenu\', \'ElSubmenu\'].indexOf(parent.$options.componentName) === -1) {\n parent = parent.$parent;\n }\n return parent;\n },\n paddingStyle: function paddingStyle() {\n if (this.rootMenu.mode !== \'vertical\') return {};\n\n var padding = 20;\n var parent = this.$parent;\n\n if (this.rootMenu.collapse) {\n padding = 20;\n } else {\n while (parent && parent.$options.componentName !== \'ElMenu\') {\n if (parent.$options.componentName === \'ElSubmenu\') {\n padding += 20;\n }\n parent = parent.$parent;\n }\n }\n return { paddingLeft: padding + \'px\' };\n }\n }\n});\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/menu/src/submenu.vue?vue&type=script&lang=js&\n\n\n\n\n\n\nvar poperMixins = {\n props: {\n transformOrigin: {\n type: [Boolean, String],\n default: false\n },\n offset: vue_popper_default.a.props.offset,\n boundariesPadding: vue_popper_default.a.props.boundariesPadding,\n popperOptions: vue_popper_default.a.props.popperOptions\n },\n data: vue_popper_default.a.data,\n methods: vue_popper_default.a.methods,\n beforeDestroy: vue_popper_default.a.beforeDestroy,\n deactivated: vue_popper_default.a.deactivated\n};\n\n/* harmony default export */ var submenuvue_type_script_lang_js_ = ({\n name: \'ElSubmenu\',\n\n componentName: \'ElSubmenu\',\n\n mixins: [menu_mixin, emitter_default.a, poperMixins],\n\n components: { ElCollapseTransition: collapse_transition_default.a },\n\n props: {\n index: {\n type: String,\n required: true\n },\n showTimeout: {\n type: Number,\n default: 300\n },\n hideTimeout: {\n type: Number,\n default: 300\n },\n popperClass: String,\n disabled: Boolean,\n popperAppendToBody: {\n type: Boolean,\n default: undefined\n }\n },\n\n data: function data() {\n return {\n popperJS: null,\n timeout: null,\n items: {},\n submenus: {},\n mouseInChild: false\n };\n },\n\n watch: {\n opened: function opened(val) {\n var _this = this;\n\n if (this.isMenuPopup) {\n this.$nextTick(function (_) {\n _this.updatePopper();\n });\n }\n }\n },\n computed: {\n // popper option\n appendToBody: function appendToBody() {\n return this.popperAppendToBody === undefined ? this.isFirstLevel : this.popperAppendToBody;\n },\n menuTransitionName: function menuTransitionName() {\n return this.rootMenu.collapse ? \'el-zoom-in-left\' : \'el-zoom-in-top\';\n },\n opened: function opened() {\n return this.rootMenu.openedMenus.indexOf(this.index) > -1;\n },\n active: function active() {\n var isActive = false;\n var submenus = this.submenus;\n var items = this.items;\n\n Object.keys(items).forEach(function (index) {\n if (items[index].active) {\n isActive = true;\n }\n });\n\n Object.keys(submenus).forEach(function (index) {\n if (submenus[index].active) {\n isActive = true;\n }\n });\n\n return isActive;\n },\n hoverBackground: function hoverBackground() {\n return this.rootMenu.hoverBackground;\n },\n backgroundColor: function backgroundColor() {\n return this.rootMenu.backgroundColor || \'\';\n },\n activeTextColor: function activeTextColor() {\n return this.rootMenu.activeTextColor || \'\';\n },\n textColor: function textColor() {\n return this.rootMenu.textColor || \'\';\n },\n mode: function mode() {\n return this.rootMenu.mode;\n },\n isMenuPopup: function isMenuPopup() {\n return this.rootMenu.isMenuPopup;\n },\n titleStyle: function titleStyle() {\n if (this.mode !== \'horizontal\') {\n return {\n color: this.textColor\n };\n }\n return {\n borderBottomColor: this.active ? this.rootMenu.activeTextColor ? this.activeTextColor : \'\' : \'transparent\',\n color: this.active ? this.activeTextColor : this.textColor\n };\n },\n isFirstLevel: function isFirstLevel() {\n var isFirstLevel = true;\n var parent = this.$parent;\n while (parent && parent !== this.rootMenu) {\n if ([\'ElSubmenu\', \'ElMenuItemGroup\'].indexOf(parent.$options.componentName) > -1) {\n isFirstLevel = false;\n break;\n } else {\n parent = parent.$parent;\n }\n }\n return isFirstLevel;\n }\n },\n methods: {\n handleCollapseToggle: function handleCollapseToggle(value) {\n if (value) {\n this.initPopper();\n } else {\n this.doDestroy();\n }\n },\n addItem: function addItem(item) {\n this.$set(this.items, item.index, item);\n },\n removeItem: function removeItem(item) {\n delete this.items[item.index];\n },\n addSubmenu: function addSubmenu(item) {\n this.$set(this.submenus, item.index, item);\n },\n removeSubmenu: function removeSubmenu(item) {\n delete this.submenus[item.index];\n },\n handleClick: function handleClick() {\n var rootMenu = this.rootMenu,\n disabled = this.disabled;\n\n if (rootMenu.menuTrigger === \'hover\' && rootMenu.mode === \'horizontal\' || rootMenu.collapse && rootMenu.mode === \'vertical\' || disabled) {\n return;\n }\n this.dispatch(\'ElMenu\', \'submenu-click\', this);\n },\n handleMouseenter: function handleMouseenter(event) {\n var _this2 = this;\n\n var showTimeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.showTimeout;\n\n\n if (!(\'ActiveXObject\' in window) && event.type === \'focus\' && !event.relatedTarget) {\n return;\n }\n var rootMenu = this.rootMenu,\n disabled = this.disabled;\n\n if (rootMenu.menuTrigger === \'click\' && rootMenu.mode === \'horizontal\' || !rootMenu.collapse && rootMenu.mode === \'vertical\' || disabled) {\n return;\n }\n this.dispatch(\'ElSubmenu\', \'mouse-enter-child\');\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () {\n _this2.rootMenu.openMenu(_this2.index, _this2.indexPath);\n }, showTimeout);\n\n if (this.appendToBody) {\n this.$parent.$el.dispatchEvent(new MouseEvent(\'mouseenter\'));\n }\n },\n handleMouseleave: function handleMouseleave() {\n var _this3 = this;\n\n var deepDispatch = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var rootMenu = this.rootMenu;\n\n if (rootMenu.menuTrigger === \'click\' && rootMenu.mode === \'horizontal\' || !rootMenu.collapse && rootMenu.mode === \'vertical\') {\n return;\n }\n this.dispatch(\'ElSubmenu\', \'mouse-leave-child\');\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () {\n !_this3.mouseInChild && _this3.rootMenu.closeMenu(_this3.index);\n }, this.hideTimeout);\n\n if (this.appendToBody && deepDispatch) {\n if (this.$parent.$options.name === \'ElSubmenu\') {\n this.$parent.handleMouseleave(true);\n }\n }\n },\n handleTitleMouseenter: function handleTitleMouseenter() {\n if (this.mode === \'horizontal\' && !this.rootMenu.backgroundColor) return;\n var title = this.$refs[\'submenu-title\'];\n title && (title.style.backgroundColor = this.rootMenu.hoverBackground);\n },\n handleTitleMouseleave: function handleTitleMouseleave() {\n if (this.mode === \'horizontal\' && !this.rootMenu.backgroundColor) return;\n var title = this.$refs[\'submenu-title\'];\n title && (title.style.backgroundColor = this.rootMenu.backgroundColor || \'\');\n },\n updatePlacement: function updatePlacement() {\n this.currentPlacement = this.mode === \'horizontal\' && this.isFirstLevel ? \'bottom-start\' : \'right-start\';\n },\n initPopper: function initPopper() {\n this.referenceElm = this.$el;\n this.popperElm = this.$refs.menu;\n this.updatePlacement();\n }\n },\n created: function created() {\n var _this4 = this;\n\n this.$on(\'toggle-collapse\', this.handleCollapseToggle);\n this.$on(\'mouse-enter-child\', function () {\n _this4.mouseInChild = true;\n clearTimeout(_this4.timeout);\n });\n this.$on(\'mouse-leave-child\', function () {\n _this4.mouseInChild = false;\n clearTimeout(_this4.timeout);\n });\n },\n mounted: function mounted() {\n this.parentMenu.addSubmenu(this);\n this.rootMenu.addSubmenu(this);\n this.initPopper();\n },\n beforeDestroy: function beforeDestroy() {\n this.parentMenu.removeSubmenu(this);\n this.rootMenu.removeSubmenu(this);\n },\n render: function render(h) {\n var _this5 = this;\n\n var active = this.active,\n opened = this.opened,\n paddingStyle = this.paddingStyle,\n titleStyle = this.titleStyle,\n backgroundColor = this.backgroundColor,\n rootMenu = this.rootMenu,\n currentPlacement = this.currentPlacement,\n menuTransitionName = this.menuTransitionName,\n mode = this.mode,\n disabled = this.disabled,\n popperClass = this.popperClass,\n $slots = this.$slots,\n isFirstLevel = this.isFirstLevel;\n\n\n var popupMenu = h(\n \'transition\',\n {\n attrs: { name: menuTransitionName }\n },\n [h(\n \'div\',\n {\n ref: \'menu\',\n directives: [{\n name: \'show\',\n value: opened\n }],\n\n \'class\': [\'el-menu--\' + mode, popperClass],\n on: {\n \'mouseenter\': function mouseenter($event) {\n return _this5.handleMouseenter($event, 100);\n },\n \'mouseleave\': function mouseleave() {\n return _this5.handleMouseleave(true);\n },\n \'focus\': function focus($event) {\n return _this5.handleMouseenter($event, 100);\n }\n }\n },\n [h(\n \'ul\',\n {\n attrs: {\n role: \'menu\'\n },\n \'class\': [\'el-menu el-menu--popup\', \'el-menu--popup-\' + currentPlacement],\n style: { backgroundColor: rootMenu.backgroundColor || \'\' } },\n [$slots.default]\n )]\n )]\n );\n\n var inlineMenu = h(\'el-collapse-transition\', [h(\n \'ul\',\n {\n attrs: {\n role: \'menu\'\n },\n \'class\': \'el-menu el-menu--inline\',\n directives: [{\n name: \'show\',\n value: opened\n }],\n\n style: { backgroundColor: rootMenu.backgroundColor || \'\' } },\n [$slots.default]\n )]);\n\n var submenuTitleIcon = rootMenu.mode === \'horizontal\' && isFirstLevel || rootMenu.mode === \'vertical\' && !rootMenu.collapse ? \'el-icon-arrow-down\' : \'el-icon-arrow-right\';\n\n return h(\n \'li\',\n {\n \'class\': {\n \'el-submenu\': true,\n \'is-active\': active,\n \'is-opened\': opened,\n \'is-disabled\': disabled\n },\n attrs: { role: \'menuitem\',\n \'aria-haspopup\': \'true\',\n \'aria-expanded\': opened\n },\n on: {\n \'mouseenter\': this.handleMouseenter,\n \'mouseleave\': function mouseleave() {\n return _this5.handleMouseleave(false);\n },\n \'focus\': this.handleMouseenter\n }\n },\n [h(\n \'div\',\n {\n \'class\': \'el-submenu__title\',\n ref: \'submenu-title\',\n on: {\n \'click\': this.handleClick,\n \'mouseenter\': this.handleTitleMouseenter,\n \'mouseleave\': this.handleTitleMouseleave\n },\n\n style: [paddingStyle, titleStyle, { backgroundColor: backgroundColor }]\n },\n [$slots.title, h(\'i\', { \'class\': [\'el-submenu__icon-arrow\', submenuTitleIcon] })]\n ), this.isMenuPopup ? popupMenu : inlineMenu]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/menu/src/submenu.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_submenuvue_type_script_lang_js_ = (submenuvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/menu/src/submenu.vue\nvar submenu_render, submenu_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar submenu_component = normalizeComponent(\n src_submenuvue_type_script_lang_js_,\n submenu_render,\n submenu_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var submenu_api; }\nsubmenu_component.options.__file = "packages/menu/src/submenu.vue"\n/* harmony default export */ var submenu = (submenu_component.exports);\n// CONCATENATED MODULE: ./packages/submenu/index.js\n\n\n/* istanbul ignore next */\nsubmenu.install = function (Vue) {\n Vue.component(submenu.name, submenu);\n};\n\n/* harmony default export */ var packages_submenu = (submenu);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/menu/src/menu-item.vue?vue&type=template&id=2a5dbfea&\nvar menu_itemvue_type_template_id_2a5dbfea_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "li",\n {\n staticClass: "el-menu-item",\n class: {\n "is-active": _vm.active,\n "is-disabled": _vm.disabled\n },\n style: [\n _vm.paddingStyle,\n _vm.itemStyle,\n { backgroundColor: _vm.backgroundColor }\n ],\n attrs: { role: "menuitem", tabindex: "-1" },\n on: {\n click: _vm.handleClick,\n mouseenter: _vm.onMouseEnter,\n focus: _vm.onMouseEnter,\n blur: _vm.onMouseLeave,\n mouseleave: _vm.onMouseLeave\n }\n },\n [\n _vm.parentMenu.$options.componentName === "ElMenu" &&\n _vm.rootMenu.collapse &&\n _vm.$slots.title\n ? _c("el-tooltip", { attrs: { effect: "dark", placement: "right" } }, [\n _c(\n "div",\n { attrs: { slot: "content" }, slot: "content" },\n [_vm._t("title")],\n 2\n ),\n _c(\n "div",\n {\n staticStyle: {\n position: "absolute",\n left: "0",\n top: "0",\n height: "100%",\n width: "100%",\n display: "inline-block",\n "box-sizing": "border-box",\n padding: "0 20px"\n }\n },\n [_vm._t("default")],\n 2\n )\n ])\n : [_vm._t("default"), _vm._t("title")]\n ],\n 2\n )\n}\nvar menu_itemvue_type_template_id_2a5dbfea_staticRenderFns = []\nmenu_itemvue_type_template_id_2a5dbfea_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/menu/src/menu-item.vue?vue&type=template&id=2a5dbfea&\n\n// EXTERNAL MODULE: external "element-ui/lib/tooltip"\nvar tooltip_ = __webpack_require__(26);\nvar tooltip_default = /*#__PURE__*/__webpack_require__.n(tooltip_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/menu/src/menu-item.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/* harmony default export */ var menu_itemvue_type_script_lang_js_ = ({\n name: \'ElMenuItem\',\n\n componentName: \'ElMenuItem\',\n\n mixins: [menu_mixin, emitter_default.a],\n\n components: { ElTooltip: tooltip_default.a },\n\n props: {\n index: {\n default: null,\n validator: function validator(val) {\n return typeof val === \'string\' || val === null;\n }\n },\n route: [String, Object],\n disabled: Boolean\n },\n computed: {\n active: function active() {\n return this.index === this.rootMenu.activeIndex;\n },\n hoverBackground: function hoverBackground() {\n return this.rootMenu.hoverBackground;\n },\n backgroundColor: function backgroundColor() {\n return this.rootMenu.backgroundColor || \'\';\n },\n activeTextColor: function activeTextColor() {\n return this.rootMenu.activeTextColor || \'\';\n },\n textColor: function textColor() {\n return this.rootMenu.textColor || \'\';\n },\n mode: function mode() {\n return this.rootMenu.mode;\n },\n itemStyle: function itemStyle() {\n var style = {\n color: this.active ? this.activeTextColor : this.textColor\n };\n if (this.mode === \'horizontal\' && !this.isNested) {\n style.borderBottomColor = this.active ? this.rootMenu.activeTextColor ? this.activeTextColor : \'\' : \'transparent\';\n }\n return style;\n },\n isNested: function isNested() {\n return this.parentMenu !== this.rootMenu;\n }\n },\n methods: {\n onMouseEnter: function onMouseEnter() {\n if (this.mode === \'horizontal\' && !this.rootMenu.backgroundColor) return;\n this.$el.style.backgroundColor = this.hoverBackground;\n },\n onMouseLeave: function onMouseLeave() {\n if (this.mode === \'horizontal\' && !this.rootMenu.backgroundColor) return;\n this.$el.style.backgroundColor = this.backgroundColor;\n },\n handleClick: function handleClick() {\n if (!this.disabled) {\n this.dispatch(\'ElMenu\', \'item-click\', this);\n this.$emit(\'click\', this);\n }\n }\n },\n mounted: function mounted() {\n this.parentMenu.addItem(this);\n this.rootMenu.addItem(this);\n },\n beforeDestroy: function beforeDestroy() {\n this.parentMenu.removeItem(this);\n this.rootMenu.removeItem(this);\n }\n});\n// CONCATENATED MODULE: ./packages/menu/src/menu-item.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_menu_itemvue_type_script_lang_js_ = (menu_itemvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/menu/src/menu-item.vue\n\n\n\n\n\n/* normalize component */\n\nvar menu_item_component = normalizeComponent(\n src_menu_itemvue_type_script_lang_js_,\n menu_itemvue_type_template_id_2a5dbfea_render,\n menu_itemvue_type_template_id_2a5dbfea_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var menu_item_api; }\nmenu_item_component.options.__file = "packages/menu/src/menu-item.vue"\n/* harmony default export */ var menu_item = (menu_item_component.exports);\n// CONCATENATED MODULE: ./packages/menu-item/index.js\n\n\n/* istanbul ignore next */\nmenu_item.install = function (Vue) {\n Vue.component(menu_item.name, menu_item);\n};\n\n/* harmony default export */ var packages_menu_item = (menu_item);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/menu/src/menu-item-group.vue?vue&type=template&id=543b7bdc&\nvar menu_item_groupvue_type_template_id_543b7bdc_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("li", { staticClass: "el-menu-item-group" }, [\n _c(\n "div",\n {\n staticClass: "el-menu-item-group__title",\n style: { paddingLeft: _vm.levelPadding + "px" }\n },\n [!_vm.$slots.title ? [_vm._v(_vm._s(_vm.title))] : _vm._t("title")],\n 2\n ),\n _c("ul", [_vm._t("default")], 2)\n ])\n}\nvar menu_item_groupvue_type_template_id_543b7bdc_staticRenderFns = []\nmenu_item_groupvue_type_template_id_543b7bdc_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/menu/src/menu-item-group.vue?vue&type=template&id=543b7bdc&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/menu/src/menu-item-group.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var menu_item_groupvue_type_script_lang_js_ = ({\n name: \'ElMenuItemGroup\',\n\n componentName: \'ElMenuItemGroup\',\n\n inject: [\'rootMenu\'],\n props: {\n title: {\n type: String\n }\n },\n data: function data() {\n return {\n paddingLeft: 20\n };\n },\n\n computed: {\n levelPadding: function levelPadding() {\n var padding = 20;\n var parent = this.$parent;\n if (this.rootMenu.collapse) return 20;\n while (parent && parent.$options.componentName !== \'ElMenu\') {\n if (parent.$options.componentName === \'ElSubmenu\') {\n padding += 20;\n }\n parent = parent.$parent;\n }\n return padding;\n }\n }\n});\n// CONCATENATED MODULE: ./packages/menu/src/menu-item-group.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_menu_item_groupvue_type_script_lang_js_ = (menu_item_groupvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/menu/src/menu-item-group.vue\n\n\n\n\n\n/* normalize component */\n\nvar menu_item_group_component = normalizeComponent(\n src_menu_item_groupvue_type_script_lang_js_,\n menu_item_groupvue_type_template_id_543b7bdc_render,\n menu_item_groupvue_type_template_id_543b7bdc_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var menu_item_group_api; }\nmenu_item_group_component.options.__file = "packages/menu/src/menu-item-group.vue"\n/* harmony default export */ var menu_item_group = (menu_item_group_component.exports);\n// CONCATENATED MODULE: ./packages/menu-item-group/index.js\n\n\n/* istanbul ignore next */\nmenu_item_group.install = function (Vue) {\n Vue.component(menu_item_group.name, menu_item_group);\n};\n\n/* harmony default export */ var packages_menu_item_group = (menu_item_group);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input/src/input.vue?vue&type=template&id=343dd774&\nvar inputvue_type_template_id_343dd774_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 class: [\n _vm.type === "textarea" ? "el-textarea" : "el-input",\n _vm.inputSize ? "el-input--" + _vm.inputSize : "",\n {\n "is-disabled": _vm.inputDisabled,\n "is-exceed": _vm.inputExceed,\n "el-input-group": _vm.$slots.prepend || _vm.$slots.append,\n "el-input-group--append": _vm.$slots.append,\n "el-input-group--prepend": _vm.$slots.prepend,\n "el-input--prefix": _vm.$slots.prefix || _vm.prefixIcon,\n "el-input--suffix":\n _vm.$slots.suffix ||\n _vm.suffixIcon ||\n _vm.clearable ||\n _vm.showPassword\n }\n ],\n on: {\n mouseenter: function($event) {\n _vm.hovering = true\n },\n mouseleave: function($event) {\n _vm.hovering = false\n }\n }\n },\n [\n _vm.type !== "textarea"\n ? [\n _vm.$slots.prepend\n ? _c(\n "div",\n { staticClass: "el-input-group__prepend" },\n [_vm._t("prepend")],\n 2\n )\n : _vm._e(),\n _vm.type !== "textarea"\n ? _c(\n "input",\n _vm._b(\n {\n ref: "input",\n staticClass: "el-input__inner",\n attrs: {\n tabindex: _vm.tabindex,\n type: _vm.showPassword\n ? _vm.passwordVisible\n ? "text"\n : "password"\n : _vm.type,\n disabled: _vm.inputDisabled,\n readonly: _vm.readonly,\n autocomplete: _vm.autoComplete || _vm.autocomplete,\n "aria-label": _vm.label\n },\n on: {\n compositionstart: _vm.handleCompositionStart,\n compositionupdate: _vm.handleCompositionUpdate,\n compositionend: _vm.handleCompositionEnd,\n input: _vm.handleInput,\n focus: _vm.handleFocus,\n blur: _vm.handleBlur,\n change: _vm.handleChange\n }\n },\n "input",\n _vm.$attrs,\n false\n )\n )\n : _vm._e(),\n _vm.$slots.prefix || _vm.prefixIcon\n ? _c(\n "span",\n { staticClass: "el-input__prefix" },\n [\n _vm._t("prefix"),\n _vm.prefixIcon\n ? _c("i", {\n staticClass: "el-input__icon",\n class: _vm.prefixIcon\n })\n : _vm._e()\n ],\n 2\n )\n : _vm._e(),\n _vm.getSuffixVisible()\n ? _c("span", { staticClass: "el-input__suffix" }, [\n _c(\n "span",\n { staticClass: "el-input__suffix-inner" },\n [\n !_vm.showClear ||\n !_vm.showPwdVisible ||\n !_vm.isWordLimitVisible\n ? [\n _vm._t("suffix"),\n _vm.suffixIcon\n ? _c("i", {\n staticClass: "el-input__icon",\n class: _vm.suffixIcon\n })\n : _vm._e()\n ]\n : _vm._e(),\n _vm.showClear\n ? _c("i", {\n staticClass:\n "el-input__icon el-icon-circle-close el-input__clear",\n on: {\n mousedown: function($event) {\n $event.preventDefault()\n },\n click: _vm.clear\n }\n })\n : _vm._e(),\n _vm.showPwdVisible\n ? _c("i", {\n staticClass:\n "el-input__icon el-icon-view el-input__clear",\n on: { click: _vm.handlePasswordVisible }\n })\n : _vm._e(),\n _vm.isWordLimitVisible\n ? _c("span", { staticClass: "el-input__count" }, [\n _c(\n "span",\n { staticClass: "el-input__count-inner" },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.textLength) +\n "/" +\n _vm._s(_vm.upperLimit) +\n "\\n "\n )\n ]\n )\n ])\n : _vm._e()\n ],\n 2\n ),\n _vm.validateState\n ? _c("i", {\n staticClass: "el-input__icon",\n class: ["el-input__validateIcon", _vm.validateIcon]\n })\n : _vm._e()\n ])\n : _vm._e(),\n _vm.$slots.append\n ? _c(\n "div",\n { staticClass: "el-input-group__append" },\n [_vm._t("append")],\n 2\n )\n : _vm._e()\n ]\n : _c(\n "textarea",\n _vm._b(\n {\n ref: "textarea",\n staticClass: "el-textarea__inner",\n style: _vm.textareaStyle,\n attrs: {\n tabindex: _vm.tabindex,\n disabled: _vm.inputDisabled,\n readonly: _vm.readonly,\n autocomplete: _vm.autoComplete || _vm.autocomplete,\n "aria-label": _vm.label\n },\n on: {\n compositionstart: _vm.handleCompositionStart,\n compositionupdate: _vm.handleCompositionUpdate,\n compositionend: _vm.handleCompositionEnd,\n input: _vm.handleInput,\n focus: _vm.handleFocus,\n blur: _vm.handleBlur,\n change: _vm.handleChange\n }\n },\n "textarea",\n _vm.$attrs,\n false\n )\n ),\n _vm.isWordLimitVisible && _vm.type === "textarea"\n ? _c("span", { staticClass: "el-input__count" }, [\n _vm._v(_vm._s(_vm.textLength) + "/" + _vm._s(_vm.upperLimit))\n ])\n : _vm._e()\n ],\n 2\n )\n}\nvar inputvue_type_template_id_343dd774_staticRenderFns = []\ninputvue_type_template_id_343dd774_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/input/src/input.vue?vue&type=template&id=343dd774&\n\n// CONCATENATED MODULE: ./packages/input/src/calcTextareaHeight.js\nvar hiddenTextarea = void 0;\n\nvar HIDDEN_STYLE = \'\\n height:0 !important;\\n visibility:hidden !important;\\n overflow:hidden !important;\\n position:absolute !important;\\n z-index:-1000 !important;\\n top:0 !important;\\n right:0 !important\\n\';\n\nvar CONTEXT_STYLE = [\'letter-spacing\', \'line-height\', \'padding-top\', \'padding-bottom\', \'font-family\', \'font-weight\', \'font-size\', \'text-rendering\', \'text-transform\', \'width\', \'text-indent\', \'padding-left\', \'padding-right\', \'border-width\', \'box-sizing\'];\n\nfunction calculateNodeStyling(targetElement) {\n var style = window.getComputedStyle(targetElement);\n\n var boxSizing = style.getPropertyValue(\'box-sizing\');\n\n var paddingSize = parseFloat(style.getPropertyValue(\'padding-bottom\')) + parseFloat(style.getPropertyValue(\'padding-top\'));\n\n var borderSize = parseFloat(style.getPropertyValue(\'border-bottom-width\')) + parseFloat(style.getPropertyValue(\'border-top-width\'));\n\n var contextStyle = CONTEXT_STYLE.map(function (name) {\n return name + \':\' + style.getPropertyValue(name);\n }).join(\';\');\n\n return { contextStyle: contextStyle, paddingSize: paddingSize, borderSize: borderSize, boxSizing: boxSizing };\n}\n\nfunction calcTextareaHeight(targetElement) {\n var minRows = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var maxRows = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n if (!hiddenTextarea) {\n hiddenTextarea = document.createElement(\'textarea\');\n document.body.appendChild(hiddenTextarea);\n }\n\n var _calculateNodeStyling = calculateNodeStyling(targetElement),\n paddingSize = _calculateNodeStyling.paddingSize,\n borderSize = _calculateNodeStyling.borderSize,\n boxSizing = _calculateNodeStyling.boxSizing,\n contextStyle = _calculateNodeStyling.contextStyle;\n\n hiddenTextarea.setAttribute(\'style\', contextStyle + \';\' + HIDDEN_STYLE);\n hiddenTextarea.value = targetElement.value || targetElement.placeholder || \'\';\n\n var height = hiddenTextarea.scrollHeight;\n var result = {};\n\n if (boxSizing === \'border-box\') {\n height = height + borderSize;\n } else if (boxSizing === \'content-box\') {\n height = height - paddingSize;\n }\n\n hiddenTextarea.value = \'\';\n var singleRowHeight = hiddenTextarea.scrollHeight - paddingSize;\n\n if (minRows !== null) {\n var minHeight = singleRowHeight * minRows;\n if (boxSizing === \'border-box\') {\n minHeight = minHeight + paddingSize + borderSize;\n }\n height = Math.max(minHeight, height);\n result.minHeight = minHeight + \'px\';\n }\n if (maxRows !== null) {\n var maxHeight = singleRowHeight * maxRows;\n if (boxSizing === \'border-box\') {\n maxHeight = maxHeight + paddingSize + borderSize;\n }\n height = Math.min(maxHeight, height);\n }\n result.height = height + \'px\';\n hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n hiddenTextarea = null;\n return result;\n};\n// EXTERNAL MODULE: external "element-ui/lib/utils/merge"\nvar merge_ = __webpack_require__(7);\nvar merge_default = /*#__PURE__*/__webpack_require__.n(merge_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/shared"\nvar shared_ = __webpack_require__(19);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/input/src/input.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ var inputvue_type_script_lang_js_ = ({\n name: \'ElInput\',\n\n componentName: \'ElInput\',\n\n mixins: [emitter_default.a, migrating_default.a],\n\n inheritAttrs: false,\n\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n\n data: function data() {\n return {\n textareaCalcStyle: {},\n hovering: false,\n focused: false,\n isComposing: false,\n passwordVisible: false\n };\n },\n\n\n props: {\n value: [String, Number],\n size: String,\n resize: String,\n form: String,\n disabled: Boolean,\n readonly: Boolean,\n type: {\n type: String,\n default: \'text\'\n },\n autosize: {\n type: [Boolean, Object],\n default: false\n },\n autocomplete: {\n type: String,\n default: \'off\'\n },\n /** @Deprecated in next major version */\n autoComplete: {\n type: String,\n validator: function validator(val) {\n false && false;\n return true;\n }\n },\n validateEvent: {\n type: Boolean,\n default: true\n },\n suffixIcon: String,\n prefixIcon: String,\n label: String,\n clearable: {\n type: Boolean,\n default: false\n },\n showPassword: {\n type: Boolean,\n default: false\n },\n showWordLimit: {\n type: Boolean,\n default: false\n },\n tabindex: String\n },\n\n computed: {\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n validateState: function validateState() {\n return this.elFormItem ? this.elFormItem.validateState : \'\';\n },\n needStatusIcon: function needStatusIcon() {\n return this.elForm ? this.elForm.statusIcon : false;\n },\n validateIcon: function validateIcon() {\n return {\n validating: \'el-icon-loading\',\n success: \'el-icon-circle-check\',\n error: \'el-icon-circle-close\'\n }[this.validateState];\n },\n textareaStyle: function textareaStyle() {\n return merge_default()({}, this.textareaCalcStyle, { resize: this.resize });\n },\n inputSize: function inputSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n inputDisabled: function inputDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n },\n nativeInputValue: function nativeInputValue() {\n return this.value === null || this.value === undefined ? \'\' : String(this.value);\n },\n showClear: function showClear() {\n return this.clearable && !this.inputDisabled && !this.readonly && this.nativeInputValue && (this.focused || this.hovering);\n },\n showPwdVisible: function showPwdVisible() {\n return this.showPassword && !this.inputDisabled && !this.readonly && (!!this.nativeInputValue || this.focused);\n },\n isWordLimitVisible: function isWordLimitVisible() {\n return this.showWordLimit && this.$attrs.maxlength && (this.type === \'text\' || this.type === \'textarea\') && !this.inputDisabled && !this.readonly && !this.showPassword;\n },\n upperLimit: function upperLimit() {\n return this.$attrs.maxlength;\n },\n textLength: function textLength() {\n if (typeof this.value === \'number\') {\n return String(this.value).length;\n }\n\n return (this.value || \'\').length;\n },\n inputExceed: function inputExceed() {\n // show exceed style if length of initial value greater then maxlength\n return this.isWordLimitVisible && this.textLength > this.upperLimit;\n }\n },\n\n watch: {\n value: function value(val) {\n this.$nextTick(this.resizeTextarea);\n if (this.validateEvent) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', [val]);\n }\n },\n\n // native input value is set explicitly\n // do not use v-model / :value in template\n // see: https://github.com/ElemeFE/element/issues/14521\n nativeInputValue: function nativeInputValue() {\n this.setNativeInputValue();\n },\n\n // when change between <input> and <textarea>,\n // update DOM dependent value and styles\n // https://github.com/ElemeFE/element/issues/14857\n type: function type() {\n var _this = this;\n\n this.$nextTick(function () {\n _this.setNativeInputValue();\n _this.resizeTextarea();\n _this.updateIconOffset();\n });\n }\n },\n\n methods: {\n focus: function focus() {\n this.getInput().focus();\n },\n blur: function blur() {\n this.getInput().blur();\n },\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n \'icon\': \'icon is removed, use suffix-icon / prefix-icon instead.\',\n \'on-icon-click\': \'on-icon-click is removed.\'\n },\n events: {\n \'click\': \'click is removed.\'\n }\n };\n },\n handleBlur: function handleBlur(event) {\n this.focused = false;\n this.$emit(\'blur\', event);\n if (this.validateEvent) {\n this.dispatch(\'ElFormItem\', \'el.form.blur\', [this.value]);\n }\n },\n select: function select() {\n this.getInput().select();\n },\n resizeTextarea: function resizeTextarea() {\n if (this.$isServer) return;\n var autosize = this.autosize,\n type = this.type;\n\n if (type !== \'textarea\') return;\n if (!autosize) {\n this.textareaCalcStyle = {\n minHeight: calcTextareaHeight(this.$refs.textarea).minHeight\n };\n return;\n }\n var minRows = autosize.minRows;\n var maxRows = autosize.maxRows;\n\n this.textareaCalcStyle = calcTextareaHeight(this.$refs.textarea, minRows, maxRows);\n },\n setNativeInputValue: function setNativeInputValue() {\n var input = this.getInput();\n if (!input) return;\n if (input.value === this.nativeInputValue) return;\n input.value = this.nativeInputValue;\n },\n handleFocus: function handleFocus(event) {\n this.focused = true;\n this.$emit(\'focus\', event);\n },\n handleCompositionStart: function handleCompositionStart(event) {\n this.$emit(\'compositionstart\', event);\n this.isComposing = true;\n },\n handleCompositionUpdate: function handleCompositionUpdate(event) {\n this.$emit(\'compositionupdate\', event);\n var text = event.target.value;\n var lastCharacter = text[text.length - 1] || \'\';\n this.isComposing = !Object(shared_["isKorean"])(lastCharacter);\n },\n handleCompositionEnd: function handleCompositionEnd(event) {\n this.$emit(\'compositionend\', event);\n if (this.isComposing) {\n this.isComposing = false;\n this.handleInput(event);\n }\n },\n handleInput: function handleInput(event) {\n // should not emit input during composition\n // see: https://github.com/ElemeFE/element/issues/10516\n if (this.isComposing) return;\n\n // hack for https://github.com/ElemeFE/element/issues/8548\n // should remove the following line when we don\'t support IE\n if (event.target.value === this.nativeInputValue) return;\n\n this.$emit(\'input\', event.target.value);\n\n // ensure native input value is controlled\n // see: https://github.com/ElemeFE/element/issues/12850\n this.$nextTick(this.setNativeInputValue);\n },\n handleChange: function handleChange(event) {\n this.$emit(\'change\', event.target.value);\n },\n calcIconOffset: function calcIconOffset(place) {\n var elList = [].slice.call(this.$el.querySelectorAll(\'.el-input__\' + place) || []);\n if (!elList.length) return;\n var el = null;\n for (var i = 0; i < elList.length; i++) {\n if (elList[i].parentNode === this.$el) {\n el = elList[i];\n break;\n }\n }\n if (!el) return;\n var pendantMap = {\n suffix: \'append\',\n prefix: \'prepend\'\n };\n\n var pendant = pendantMap[place];\n if (this.$slots[pendant]) {\n el.style.transform = \'translateX(\' + (place === \'suffix\' ? \'-\' : \'\') + this.$el.querySelector(\'.el-input-group__\' + pendant).offsetWidth + \'px)\';\n } else {\n el.removeAttribute(\'style\');\n }\n },\n updateIconOffset: function updateIconOffset() {\n this.calcIconOffset(\'prefix\');\n this.calcIconOffset(\'suffix\');\n },\n clear: function clear() {\n this.$emit(\'input\', \'\');\n this.$emit(\'change\', \'\');\n this.$emit(\'clear\');\n },\n handlePasswordVisible: function handlePasswordVisible() {\n var _this2 = this;\n\n this.passwordVisible = !this.passwordVisible;\n this.$nextTick(function () {\n _this2.focus();\n });\n },\n getInput: function getInput() {\n return this.$refs.input || this.$refs.textarea;\n },\n getSuffixVisible: function getSuffixVisible() {\n return this.$slots.suffix || this.suffixIcon || this.showClear || this.showPassword || this.isWordLimitVisible || this.validateState && this.needStatusIcon;\n }\n },\n\n created: function created() {\n this.$on(\'inputSelect\', this.select);\n },\n mounted: function mounted() {\n this.setNativeInputValue();\n this.resizeTextarea();\n this.updateIconOffset();\n },\n updated: function updated() {\n this.$nextTick(this.updateIconOffset);\n }\n});\n// CONCATENATED MODULE: ./packages/input/src/input.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_inputvue_type_script_lang_js_ = (inputvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/input/src/input.vue\n\n\n\n\n\n/* normalize component */\n\nvar input_component = normalizeComponent(\n src_inputvue_type_script_lang_js_,\n inputvue_type_template_id_343dd774_render,\n inputvue_type_template_id_343dd774_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var input_api; }\ninput_component.options.__file = "packages/input/src/input.vue"\n/* harmony default export */ var src_input = (input_component.exports);\n// CONCATENATED MODULE: ./packages/input/index.js\n\n\n/* istanbul ignore next */\nsrc_input.install = function (Vue) {\n Vue.component(src_input.name, src_input);\n};\n\n/* harmony default export */ var packages_input = (src_input);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input-number/src/input-number.vue?vue&type=template&id=42f8cf66&\nvar input_numbervue_type_template_id_42f8cf66_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 class: [\n "el-input-number",\n _vm.inputNumberSize ? "el-input-number--" + _vm.inputNumberSize : "",\n { "is-disabled": _vm.inputNumberDisabled },\n { "is-without-controls": !_vm.controls },\n { "is-controls-right": _vm.controlsAtRight }\n ],\n on: {\n dragstart: function($event) {\n $event.preventDefault()\n }\n }\n },\n [\n _vm.controls\n ? _c(\n "span",\n {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.decrease,\n expression: "decrease"\n }\n ],\n staticClass: "el-input-number__decrease",\n class: { "is-disabled": _vm.minDisabled },\n attrs: { role: "button" },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n return _vm.decrease($event)\n }\n }\n },\n [\n _c("i", {\n class:\n "el-icon-" + (_vm.controlsAtRight ? "arrow-down" : "minus")\n })\n ]\n )\n : _vm._e(),\n _vm.controls\n ? _c(\n "span",\n {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.increase,\n expression: "increase"\n }\n ],\n staticClass: "el-input-number__increase",\n class: { "is-disabled": _vm.maxDisabled },\n attrs: { role: "button" },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n return _vm.increase($event)\n }\n }\n },\n [\n _c("i", {\n class: "el-icon-" + (_vm.controlsAtRight ? "arrow-up" : "plus")\n })\n ]\n )\n : _vm._e(),\n _c("el-input", {\n ref: "input",\n attrs: {\n value: _vm.displayValue,\n placeholder: _vm.placeholder,\n disabled: _vm.inputNumberDisabled,\n size: _vm.inputNumberSize,\n max: _vm.max,\n min: _vm.min,\n name: _vm.name,\n label: _vm.label\n },\n on: {\n blur: _vm.handleBlur,\n focus: _vm.handleFocus,\n input: _vm.handleInput,\n change: _vm.handleInputChange\n },\n nativeOn: {\n keydown: [\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "up", 38, $event.key, ["Up", "ArrowUp"])\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.increase($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "down", 40, $event.key, [\n "Down",\n "ArrowDown"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.decrease($event)\n }\n ]\n }\n })\n ],\n 1\n )\n}\nvar input_numbervue_type_template_id_42f8cf66_staticRenderFns = []\ninput_numbervue_type_template_id_42f8cf66_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/input-number/src/input-number.vue?vue&type=template&id=42f8cf66&\n\n// CONCATENATED MODULE: ./src/directives/repeat-click.js\n\n\n\n/* harmony default export */ var repeat_click = ({\n bind: function bind(el, binding, vnode) {\n var interval = null;\n var startTime = void 0;\n var maxIntervals = Object(util_["isMac"])() ? 100 : 200;\n var handler = function handler() {\n return vnode.context[binding.expression].apply();\n };\n var clear = function clear() {\n if (Date.now() - startTime < maxIntervals) {\n handler();\n }\n clearInterval(interval);\n interval = null;\n };\n\n Object(dom_["on"])(el, \'mousedown\', function (e) {\n if (e.button !== 0) return;\n startTime = Date.now();\n Object(dom_["once"])(document, \'mouseup\', clear);\n clearInterval(interval);\n interval = setInterval(handler, maxIntervals);\n });\n }\n});\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/input-number/src/input-number.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//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ var input_numbervue_type_script_lang_js_ = ({\n name: \'ElInputNumber\',\n mixins: [focus_default()(\'input\')],\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n directives: {\n repeatClick: repeat_click\n },\n components: {\n ElInput: input_default.a\n },\n props: {\n step: {\n type: Number,\n default: 1\n },\n stepStrictly: {\n type: Boolean,\n default: false\n },\n max: {\n type: Number,\n default: Infinity\n },\n min: {\n type: Number,\n default: -Infinity\n },\n value: {},\n disabled: Boolean,\n size: String,\n controls: {\n type: Boolean,\n default: true\n },\n controlsPosition: {\n type: String,\n default: \'\'\n },\n name: String,\n label: String,\n placeholder: String,\n precision: {\n type: Number,\n validator: function validator(val) {\n return val >= 0 && val === parseInt(val, 10);\n }\n }\n },\n data: function data() {\n return {\n currentValue: 0,\n userInput: null\n };\n },\n\n watch: {\n value: {\n immediate: true,\n handler: function handler(value) {\n var newVal = value === undefined ? value : Number(value);\n if (newVal !== undefined) {\n if (isNaN(newVal)) {\n return;\n }\n\n if (this.stepStrictly) {\n var stepPrecision = this.getPrecision(this.step);\n var precisionFactor = Math.pow(10, stepPrecision);\n newVal = Math.round(newVal / this.step) * precisionFactor * this.step / precisionFactor;\n }\n\n if (this.precision !== undefined) {\n newVal = this.toPrecision(newVal, this.precision);\n }\n }\n if (newVal >= this.max) newVal = this.max;\n if (newVal <= this.min) newVal = this.min;\n this.currentValue = newVal;\n this.userInput = null;\n this.$emit(\'input\', newVal);\n }\n }\n },\n computed: {\n minDisabled: function minDisabled() {\n return this._decrease(this.value, this.step) < this.min;\n },\n maxDisabled: function maxDisabled() {\n return this._increase(this.value, this.step) > this.max;\n },\n numPrecision: function numPrecision() {\n var value = this.value,\n step = this.step,\n getPrecision = this.getPrecision,\n precision = this.precision;\n\n var stepPrecision = getPrecision(step);\n if (precision !== undefined) {\n if (stepPrecision > precision) {\n console.warn(\'[Element Warn][InputNumber]precision should not be less than the decimal places of step\');\n }\n return precision;\n } else {\n return Math.max(getPrecision(value), stepPrecision);\n }\n },\n controlsAtRight: function controlsAtRight() {\n return this.controls && this.controlsPosition === \'right\';\n },\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n inputNumberSize: function inputNumberSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n inputNumberDisabled: function inputNumberDisabled() {\n return this.disabled || !!(this.elForm || {}).disabled;\n },\n displayValue: function displayValue() {\n if (this.userInput !== null) {\n return this.userInput;\n }\n\n var currentValue = this.currentValue;\n\n if (typeof currentValue === \'number\') {\n if (this.stepStrictly) {\n var stepPrecision = this.getPrecision(this.step);\n var precisionFactor = Math.pow(10, stepPrecision);\n currentValue = Math.round(currentValue / this.step) * precisionFactor * this.step / precisionFactor;\n }\n\n if (this.precision !== undefined) {\n currentValue = currentValue.toFixed(this.precision);\n }\n }\n\n return currentValue;\n }\n },\n methods: {\n toPrecision: function toPrecision(num, precision) {\n if (precision === undefined) precision = this.numPrecision;\n return parseFloat(Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision));\n },\n getPrecision: function getPrecision(value) {\n if (value === undefined) return 0;\n var valueString = value.toString();\n var dotPosition = valueString.indexOf(\'.\');\n var precision = 0;\n if (dotPosition !== -1) {\n precision = valueString.length - dotPosition - 1;\n }\n return precision;\n },\n _increase: function _increase(val, step) {\n if (typeof val !== \'number\' && val !== undefined) return this.currentValue;\n\n var precisionFactor = Math.pow(10, this.numPrecision);\n // Solve the accuracy problem of JS decimal calculation by converting the value to integer.\n return this.toPrecision((precisionFactor * val + precisionFactor * step) / precisionFactor);\n },\n _decrease: function _decrease(val, step) {\n if (typeof val !== \'number\' && val !== undefined) return this.currentValue;\n\n var precisionFactor = Math.pow(10, this.numPrecision);\n\n return this.toPrecision((precisionFactor * val - precisionFactor * step) / precisionFactor);\n },\n increase: function increase() {\n if (this.inputNumberDisabled || this.maxDisabled) return;\n var value = this.value || 0;\n var newVal = this._increase(value, this.step);\n this.setCurrentValue(newVal);\n },\n decrease: function decrease() {\n if (this.inputNumberDisabled || this.minDisabled) return;\n var value = this.value || 0;\n var newVal = this._decrease(value, this.step);\n this.setCurrentValue(newVal);\n },\n handleBlur: function handleBlur(event) {\n this.$emit(\'blur\', event);\n },\n handleFocus: function handleFocus(event) {\n this.$emit(\'focus\', event);\n },\n setCurrentValue: function setCurrentValue(newVal) {\n var oldVal = this.currentValue;\n if (typeof newVal === \'number\' && this.precision !== undefined) {\n newVal = this.toPrecision(newVal, this.precision);\n }\n if (newVal >= this.max) newVal = this.max;\n if (newVal <= this.min) newVal = this.min;\n if (oldVal === newVal) return;\n this.userInput = null;\n this.$emit(\'input\', newVal);\n this.$emit(\'change\', newVal, oldVal);\n this.currentValue = newVal;\n },\n handleInput: function handleInput(value) {\n this.userInput = value;\n },\n handleInputChange: function handleInputChange(value) {\n var newVal = value === \'\' ? undefined : Number(value);\n if (!isNaN(newVal) || value === \'\') {\n this.setCurrentValue(newVal);\n }\n this.userInput = null;\n },\n select: function select() {\n this.$refs.input.select();\n }\n },\n mounted: function mounted() {\n var innerInput = this.$refs.input.$refs.input;\n innerInput.setAttribute(\'role\', \'spinbutton\');\n innerInput.setAttribute(\'aria-valuemax\', this.max);\n innerInput.setAttribute(\'aria-valuemin\', this.min);\n innerInput.setAttribute(\'aria-valuenow\', this.currentValue);\n innerInput.setAttribute(\'aria-disabled\', this.inputNumberDisabled);\n },\n updated: function updated() {\n if (!this.$refs || !this.$refs.input) return;\n var innerInput = this.$refs.input.$refs.input;\n innerInput.setAttribute(\'aria-valuenow\', this.currentValue);\n }\n});\n// CONCATENATED MODULE: ./packages/input-number/src/input-number.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_input_numbervue_type_script_lang_js_ = (input_numbervue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/input-number/src/input-number.vue\n\n\n\n\n\n/* normalize component */\n\nvar input_number_component = normalizeComponent(\n src_input_numbervue_type_script_lang_js_,\n input_numbervue_type_template_id_42f8cf66_render,\n input_numbervue_type_template_id_42f8cf66_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var input_number_api; }\ninput_number_component.options.__file = "packages/input-number/src/input-number.vue"\n/* harmony default export */ var input_number = (input_number_component.exports);\n// CONCATENATED MODULE: ./packages/input-number/index.js\n\n\n/* istanbul ignore next */\ninput_number.install = function (Vue) {\n Vue.component(input_number.name, input_number);\n};\n\n/* harmony default export */ var packages_input_number = (input_number);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/radio/src/radio.vue?vue&type=template&id=69cd6268&\nvar radiovue_type_template_id_69cd6268_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "label",\n {\n staticClass: "el-radio",\n class: [\n _vm.border && _vm.radioSize ? "el-radio--" + _vm.radioSize : "",\n { "is-disabled": _vm.isDisabled },\n { "is-focus": _vm.focus },\n { "is-bordered": _vm.border },\n { "is-checked": _vm.model === _vm.label }\n ],\n attrs: {\n role: "radio",\n "aria-checked": _vm.model === _vm.label,\n "aria-disabled": _vm.isDisabled,\n tabindex: _vm.tabIndex\n },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "space", 32, $event.key, [" ", "Spacebar"])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.model = _vm.isDisabled ? _vm.model : _vm.label\n }\n }\n },\n [\n _c(\n "span",\n {\n staticClass: "el-radio__input",\n class: {\n "is-disabled": _vm.isDisabled,\n "is-checked": _vm.model === _vm.label\n }\n },\n [\n _c("span", { staticClass: "el-radio__inner" }),\n _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.model,\n expression: "model"\n }\n ],\n ref: "radio",\n staticClass: "el-radio__original",\n attrs: {\n type: "radio",\n "aria-hidden": "true",\n name: _vm.name,\n disabled: _vm.isDisabled,\n tabindex: "-1",\n autocomplete: "off"\n },\n domProps: {\n value: _vm.label,\n checked: _vm._q(_vm.model, _vm.label)\n },\n on: {\n focus: function($event) {\n _vm.focus = true\n },\n blur: function($event) {\n _vm.focus = false\n },\n change: [\n function($event) {\n _vm.model = _vm.label\n },\n _vm.handleChange\n ]\n }\n })\n ]\n ),\n _c(\n "span",\n {\n staticClass: "el-radio__label",\n on: {\n keydown: function($event) {\n $event.stopPropagation()\n }\n }\n },\n [\n _vm._t("default"),\n !_vm.$slots.default ? [_vm._v(_vm._s(_vm.label))] : _vm._e()\n ],\n 2\n )\n ]\n )\n}\nvar radiovue_type_template_id_69cd6268_staticRenderFns = []\nradiovue_type_template_id_69cd6268_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/radio/src/radio.vue?vue&type=template&id=69cd6268&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/radio/src/radio.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//\n//\n//\n\n\n\n/* harmony default export */ var radiovue_type_script_lang_js_ = ({\n name: \'ElRadio\',\n\n mixins: [emitter_default.a],\n\n inject: {\n elForm: {\n default: \'\'\n },\n\n elFormItem: {\n default: \'\'\n }\n },\n\n componentName: \'ElRadio\',\n\n props: {\n value: {},\n label: {},\n disabled: Boolean,\n name: String,\n border: Boolean,\n size: String\n },\n\n data: function data() {\n return {\n focus: false\n };\n },\n\n computed: {\n isGroup: function isGroup() {\n var parent = this.$parent;\n while (parent) {\n if (parent.$options.componentName !== \'ElRadioGroup\') {\n parent = parent.$parent;\n } else {\n this._radioGroup = parent;\n return true;\n }\n }\n return false;\n },\n\n model: {\n get: function get() {\n return this.isGroup ? this._radioGroup.value : this.value;\n },\n set: function set(val) {\n if (this.isGroup) {\n this.dispatch(\'ElRadioGroup\', \'input\', [val]);\n } else {\n this.$emit(\'input\', val);\n }\n this.$refs.radio && (this.$refs.radio.checked = this.model === this.label);\n }\n },\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n radioSize: function radioSize() {\n var temRadioSize = this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n return this.isGroup ? this._radioGroup.radioGroupSize || temRadioSize : temRadioSize;\n },\n isDisabled: function isDisabled() {\n return this.isGroup ? this._radioGroup.disabled || this.disabled || (this.elForm || {}).disabled : this.disabled || (this.elForm || {}).disabled;\n },\n tabIndex: function tabIndex() {\n return this.isDisabled || this.isGroup && this.model !== this.label ? -1 : 0;\n }\n },\n\n methods: {\n handleChange: function handleChange() {\n var _this = this;\n\n this.$nextTick(function () {\n _this.$emit(\'change\', _this.model);\n _this.isGroup && _this.dispatch(\'ElRadioGroup\', \'handleChange\', _this.model);\n });\n }\n }\n});\n// CONCATENATED MODULE: ./packages/radio/src/radio.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_radiovue_type_script_lang_js_ = (radiovue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/radio/src/radio.vue\n\n\n\n\n\n/* normalize component */\n\nvar radio_component = normalizeComponent(\n src_radiovue_type_script_lang_js_,\n radiovue_type_template_id_69cd6268_render,\n radiovue_type_template_id_69cd6268_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var radio_api; }\nradio_component.options.__file = "packages/radio/src/radio.vue"\n/* harmony default export */ var src_radio = (radio_component.exports);\n// CONCATENATED MODULE: ./packages/radio/index.js\n\n\n/* istanbul ignore next */\nsrc_radio.install = function (Vue) {\n Vue.component(src_radio.name, src_radio);\n};\n\n/* harmony default export */ var packages_radio = (src_radio);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/radio/src/radio-group.vue?vue&type=template&id=818a704c&\nvar radio_groupvue_type_template_id_818a704c_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n _vm._elTag,\n {\n tag: "component",\n staticClass: "el-radio-group",\n attrs: { role: "radiogroup" },\n on: { keydown: _vm.handleKeydown }\n },\n [_vm._t("default")],\n 2\n )\n}\nvar radio_groupvue_type_template_id_818a704c_staticRenderFns = []\nradio_groupvue_type_template_id_818a704c_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/radio/src/radio-group.vue?vue&type=template&id=818a704c&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/radio/src/radio-group.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\nvar keyCode = Object.freeze({\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40\n});\n/* harmony default export */ var radio_groupvue_type_script_lang_js_ = ({\n name: \'ElRadioGroup\',\n\n componentName: \'ElRadioGroup\',\n\n inject: {\n elFormItem: {\n default: \'\'\n }\n },\n\n mixins: [emitter_default.a],\n\n props: {\n value: {},\n size: String,\n fill: String,\n textColor: String,\n disabled: Boolean\n },\n\n computed: {\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n _elTag: function _elTag() {\n var tag = (this.$vnode.data || {}).tag;\n if (!tag || tag === \'component\') tag = \'div\';\n return tag;\n },\n radioGroupSize: function radioGroupSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n }\n },\n\n created: function created() {\n var _this = this;\n\n this.$on(\'handleChange\', function (value) {\n _this.$emit(\'change\', value);\n });\n },\n mounted: function mounted() {\n // 当radioGroup没有默认选项时,第一个可以选中Tab导航\n var radios = this.$el.querySelectorAll(\'[type=radio]\');\n var firstLabel = this.$el.querySelectorAll(\'[role=radio]\')[0];\n if (![].some.call(radios, function (radio) {\n return radio.checked;\n }) && firstLabel) {\n firstLabel.tabIndex = 0;\n }\n },\n\n methods: {\n handleKeydown: function handleKeydown(e) {\n // 左右上下按键 可以在radio组内切换不同选项\n var target = e.target;\n var className = target.nodeName === \'INPUT\' ? \'[type=radio]\' : \'[role=radio]\';\n var radios = this.$el.querySelectorAll(className);\n var length = radios.length;\n var index = [].indexOf.call(radios, target);\n var roleRadios = this.$el.querySelectorAll(\'[role=radio]\');\n switch (e.keyCode) {\n case keyCode.LEFT:\n case keyCode.UP:\n e.stopPropagation();\n e.preventDefault();\n if (index === 0) {\n roleRadios[length - 1].click();\n roleRadios[length - 1].focus();\n } else {\n roleRadios[index - 1].click();\n roleRadios[index - 1].focus();\n }\n break;\n case keyCode.RIGHT:\n case keyCode.DOWN:\n if (index === length - 1) {\n e.stopPropagation();\n e.preventDefault();\n roleRadios[0].click();\n roleRadios[0].focus();\n } else {\n roleRadios[index + 1].click();\n roleRadios[index + 1].focus();\n }\n break;\n default:\n break;\n }\n }\n },\n watch: {\n value: function value(_value) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', [this.value]);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/radio/src/radio-group.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_radio_groupvue_type_script_lang_js_ = (radio_groupvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/radio/src/radio-group.vue\n\n\n\n\n\n/* normalize component */\n\nvar radio_group_component = normalizeComponent(\n src_radio_groupvue_type_script_lang_js_,\n radio_groupvue_type_template_id_818a704c_render,\n radio_groupvue_type_template_id_818a704c_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var radio_group_api; }\nradio_group_component.options.__file = "packages/radio/src/radio-group.vue"\n/* harmony default export */ var radio_group = (radio_group_component.exports);\n// CONCATENATED MODULE: ./packages/radio-group/index.js\n\n\n/* istanbul ignore next */\nradio_group.install = function (Vue) {\n Vue.component(radio_group.name, radio_group);\n};\n\n/* harmony default export */ var packages_radio_group = (radio_group);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/radio/src/radio-button.vue?vue&type=template&id=18a77a32&\nvar radio_buttonvue_type_template_id_18a77a32_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "label",\n {\n staticClass: "el-radio-button",\n class: [\n _vm.size ? "el-radio-button--" + _vm.size : "",\n { "is-active": _vm.value === _vm.label },\n { "is-disabled": _vm.isDisabled },\n { "is-focus": _vm.focus }\n ],\n attrs: {\n role: "radio",\n "aria-checked": _vm.value === _vm.label,\n "aria-disabled": _vm.isDisabled,\n tabindex: _vm.tabIndex\n },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "space", 32, $event.key, [" ", "Spacebar"])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.value = _vm.isDisabled ? _vm.value : _vm.label\n }\n }\n },\n [\n _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.value,\n expression: "value"\n }\n ],\n staticClass: "el-radio-button__orig-radio",\n attrs: {\n type: "radio",\n name: _vm.name,\n disabled: _vm.isDisabled,\n tabindex: "-1",\n autocomplete: "off"\n },\n domProps: { value: _vm.label, checked: _vm._q(_vm.value, _vm.label) },\n on: {\n change: [\n function($event) {\n _vm.value = _vm.label\n },\n _vm.handleChange\n ],\n focus: function($event) {\n _vm.focus = true\n },\n blur: function($event) {\n _vm.focus = false\n }\n }\n }),\n _c(\n "span",\n {\n staticClass: "el-radio-button__inner",\n style: _vm.value === _vm.label ? _vm.activeStyle : null,\n on: {\n keydown: function($event) {\n $event.stopPropagation()\n }\n }\n },\n [\n _vm._t("default"),\n !_vm.$slots.default ? [_vm._v(_vm._s(_vm.label))] : _vm._e()\n ],\n 2\n )\n ]\n )\n}\nvar radio_buttonvue_type_template_id_18a77a32_staticRenderFns = []\nradio_buttonvue_type_template_id_18a77a32_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/radio/src/radio-button.vue?vue&type=template&id=18a77a32&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/radio/src/radio-button.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 */ var radio_buttonvue_type_script_lang_js_ = ({\n name: \'ElRadioButton\',\n\n mixins: [emitter_default.a],\n\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n\n props: {\n label: {},\n disabled: Boolean,\n name: String\n },\n data: function data() {\n return {\n focus: false\n };\n },\n\n computed: {\n value: {\n get: function get() {\n return this._radioGroup.value;\n },\n set: function set(value) {\n this._radioGroup.$emit(\'input\', value);\n }\n },\n _radioGroup: function _radioGroup() {\n var parent = this.$parent;\n while (parent) {\n if (parent.$options.componentName !== \'ElRadioGroup\') {\n parent = parent.$parent;\n } else {\n return parent;\n }\n }\n return false;\n },\n activeStyle: function activeStyle() {\n return {\n backgroundColor: this._radioGroup.fill || \'\',\n borderColor: this._radioGroup.fill || \'\',\n boxShadow: this._radioGroup.fill ? \'-1px 0 0 0 \' + this._radioGroup.fill : \'\',\n color: this._radioGroup.textColor || \'\'\n };\n },\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n size: function size() {\n return this._radioGroup.radioGroupSize || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n isDisabled: function isDisabled() {\n return this.disabled || this._radioGroup.disabled || (this.elForm || {}).disabled;\n },\n tabIndex: function tabIndex() {\n return this.isDisabled || this._radioGroup && this.value !== this.label ? -1 : 0;\n }\n },\n\n methods: {\n handleChange: function handleChange() {\n var _this = this;\n\n this.$nextTick(function () {\n _this.dispatch(\'ElRadioGroup\', \'handleChange\', _this.value);\n });\n }\n }\n});\n// CONCATENATED MODULE: ./packages/radio/src/radio-button.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_radio_buttonvue_type_script_lang_js_ = (radio_buttonvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/radio/src/radio-button.vue\n\n\n\n\n\n/* normalize component */\n\nvar radio_button_component = normalizeComponent(\n src_radio_buttonvue_type_script_lang_js_,\n radio_buttonvue_type_template_id_18a77a32_render,\n radio_buttonvue_type_template_id_18a77a32_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var radio_button_api; }\nradio_button_component.options.__file = "packages/radio/src/radio-button.vue"\n/* harmony default export */ var radio_button = (radio_button_component.exports);\n// CONCATENATED MODULE: ./packages/radio-button/index.js\n\n\n/* istanbul ignore next */\nradio_button.install = function (Vue) {\n Vue.component(radio_button.name, radio_button);\n};\n\n/* harmony default export */ var packages_radio_button = (radio_button);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/checkbox/src/checkbox.vue?vue&type=template&id=d0387074&\nvar checkboxvue_type_template_id_d0387074_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "label",\n {\n staticClass: "el-checkbox",\n class: [\n _vm.border && _vm.checkboxSize\n ? "el-checkbox--" + _vm.checkboxSize\n : "",\n { "is-disabled": _vm.isDisabled },\n { "is-bordered": _vm.border },\n { "is-checked": _vm.isChecked }\n ],\n attrs: { id: _vm.id }\n },\n [\n _c(\n "span",\n {\n staticClass: "el-checkbox__input",\n class: {\n "is-disabled": _vm.isDisabled,\n "is-checked": _vm.isChecked,\n "is-indeterminate": _vm.indeterminate,\n "is-focus": _vm.focus\n },\n attrs: {\n tabindex: _vm.indeterminate ? 0 : false,\n role: _vm.indeterminate ? "checkbox" : false,\n "aria-checked": _vm.indeterminate ? "mixed" : false\n }\n },\n [\n _c("span", { staticClass: "el-checkbox__inner" }),\n _vm.trueLabel || _vm.falseLabel\n ? _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.model,\n expression: "model"\n }\n ],\n staticClass: "el-checkbox__original",\n attrs: {\n type: "checkbox",\n "aria-hidden": _vm.indeterminate ? "true" : "false",\n name: _vm.name,\n disabled: _vm.isDisabled,\n "true-value": _vm.trueLabel,\n "false-value": _vm.falseLabel\n },\n domProps: {\n checked: Array.isArray(_vm.model)\n ? _vm._i(_vm.model, null) > -1\n : _vm._q(_vm.model, _vm.trueLabel)\n },\n on: {\n change: [\n function($event) {\n var $$a = _vm.model,\n $$el = $event.target,\n $$c = $$el.checked ? _vm.trueLabel : _vm.falseLabel\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 && (_vm.model = $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n (_vm.model = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.model = $$c\n }\n },\n _vm.handleChange\n ],\n focus: function($event) {\n _vm.focus = true\n },\n blur: function($event) {\n _vm.focus = false\n }\n }\n })\n : _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.model,\n expression: "model"\n }\n ],\n staticClass: "el-checkbox__original",\n attrs: {\n type: "checkbox",\n "aria-hidden": _vm.indeterminate ? "true" : "false",\n disabled: _vm.isDisabled,\n name: _vm.name\n },\n domProps: {\n value: _vm.label,\n checked: Array.isArray(_vm.model)\n ? _vm._i(_vm.model, _vm.label) > -1\n : _vm.model\n },\n on: {\n change: [\n function($event) {\n var $$a = _vm.model,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = _vm.label,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 && (_vm.model = $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n (_vm.model = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.model = $$c\n }\n },\n _vm.handleChange\n ],\n focus: function($event) {\n _vm.focus = true\n },\n blur: function($event) {\n _vm.focus = false\n }\n }\n })\n ]\n ),\n _vm.$slots.default || _vm.label\n ? _c(\n "span",\n { staticClass: "el-checkbox__label" },\n [\n _vm._t("default"),\n !_vm.$slots.default ? [_vm._v(_vm._s(_vm.label))] : _vm._e()\n ],\n 2\n )\n : _vm._e()\n ]\n )\n}\nvar checkboxvue_type_template_id_d0387074_staticRenderFns = []\ncheckboxvue_type_template_id_d0387074_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox.vue?vue&type=template&id=d0387074&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/checkbox/src/checkbox.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ var checkboxvue_type_script_lang_js_ = ({\n name: \'ElCheckbox\',\n\n mixins: [emitter_default.a],\n\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n\n componentName: \'ElCheckbox\',\n\n data: function data() {\n return {\n selfModel: false,\n focus: false,\n isLimitExceeded: false\n };\n },\n\n\n computed: {\n model: {\n get: function get() {\n return this.isGroup ? this.store : this.value !== undefined ? this.value : this.selfModel;\n },\n set: function set(val) {\n if (this.isGroup) {\n this.isLimitExceeded = false;\n this._checkboxGroup.min !== undefined && val.length < this._checkboxGroup.min && (this.isLimitExceeded = true);\n\n this._checkboxGroup.max !== undefined && val.length > this._checkboxGroup.max && (this.isLimitExceeded = true);\n\n this.isLimitExceeded === false && this.dispatch(\'ElCheckboxGroup\', \'input\', [val]);\n } else {\n this.$emit(\'input\', val);\n this.selfModel = val;\n }\n }\n },\n\n isChecked: function isChecked() {\n if ({}.toString.call(this.model) === \'[object Boolean]\') {\n return this.model;\n } else if (Array.isArray(this.model)) {\n return this.model.indexOf(this.label) > -1;\n } else if (this.model !== null && this.model !== undefined) {\n return this.model === this.trueLabel;\n }\n },\n isGroup: function isGroup() {\n var parent = this.$parent;\n while (parent) {\n if (parent.$options.componentName !== \'ElCheckboxGroup\') {\n parent = parent.$parent;\n } else {\n this._checkboxGroup = parent;\n return true;\n }\n }\n return false;\n },\n store: function store() {\n return this._checkboxGroup ? this._checkboxGroup.value : this.value;\n },\n\n\n /* used to make the isDisabled judgment under max/min props */\n isLimitDisabled: function isLimitDisabled() {\n var _checkboxGroup = this._checkboxGroup,\n max = _checkboxGroup.max,\n min = _checkboxGroup.min;\n\n return !!(max || min) && this.model.length >= max && !this.isChecked || this.model.length <= min && this.isChecked;\n },\n isDisabled: function isDisabled() {\n return this.isGroup ? this._checkboxGroup.disabled || this.disabled || (this.elForm || {}).disabled || this.isLimitDisabled : this.disabled || (this.elForm || {}).disabled;\n },\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n checkboxSize: function checkboxSize() {\n var temCheckboxSize = this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n return this.isGroup ? this._checkboxGroup.checkboxGroupSize || temCheckboxSize : temCheckboxSize;\n }\n },\n\n props: {\n value: {},\n label: {},\n indeterminate: Boolean,\n disabled: Boolean,\n checked: Boolean,\n name: String,\n trueLabel: [String, Number],\n falseLabel: [String, Number],\n id: String, /* 当indeterminate为真时,为controls提供相关连的checkbox的id,表明元素间的控制关系*/\n controls: String, /* 当indeterminate为真时,为controls提供相关连的checkbox的id,表明元素间的控制关系*/\n border: Boolean,\n size: String\n },\n\n methods: {\n addToStore: function addToStore() {\n if (Array.isArray(this.model) && this.model.indexOf(this.label) === -1) {\n this.model.push(this.label);\n } else {\n this.model = this.trueLabel || true;\n }\n },\n handleChange: function handleChange(ev) {\n var _this = this;\n\n if (this.isLimitExceeded) return;\n var value = void 0;\n if (ev.target.checked) {\n value = this.trueLabel === undefined ? true : this.trueLabel;\n } else {\n value = this.falseLabel === undefined ? false : this.falseLabel;\n }\n this.$emit(\'change\', value, ev);\n this.$nextTick(function () {\n if (_this.isGroup) {\n _this.dispatch(\'ElCheckboxGroup\', \'change\', [_this._checkboxGroup.value]);\n }\n });\n }\n },\n\n created: function created() {\n this.checked && this.addToStore();\n },\n mounted: function mounted() {\n // 为indeterminate元素 添加aria-controls 属性\n if (this.indeterminate) {\n this.$el.setAttribute(\'aria-controls\', this.controls);\n }\n },\n\n\n watch: {\n value: function value(_value) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', _value);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_checkboxvue_type_script_lang_js_ = (checkboxvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox.vue\n\n\n\n\n\n/* normalize component */\n\nvar checkbox_component = normalizeComponent(\n src_checkboxvue_type_script_lang_js_,\n checkboxvue_type_template_id_d0387074_render,\n checkboxvue_type_template_id_d0387074_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var checkbox_api; }\ncheckbox_component.options.__file = "packages/checkbox/src/checkbox.vue"\n/* harmony default export */ var src_checkbox = (checkbox_component.exports);\n// CONCATENATED MODULE: ./packages/checkbox/index.js\n\n\n/* istanbul ignore next */\nsrc_checkbox.install = function (Vue) {\n Vue.component(src_checkbox.name, src_checkbox);\n};\n\n/* harmony default export */ var packages_checkbox = (src_checkbox);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/checkbox/src/checkbox-button.vue?vue&type=template&id=478e906e&\nvar checkbox_buttonvue_type_template_id_478e906e_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "label",\n {\n staticClass: "el-checkbox-button",\n class: [\n _vm.size ? "el-checkbox-button--" + _vm.size : "",\n { "is-disabled": _vm.isDisabled },\n { "is-checked": _vm.isChecked },\n { "is-focus": _vm.focus }\n ],\n attrs: {\n role: "checkbox",\n "aria-checked": _vm.isChecked,\n "aria-disabled": _vm.isDisabled\n }\n },\n [\n _vm.trueLabel || _vm.falseLabel\n ? _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.model,\n expression: "model"\n }\n ],\n staticClass: "el-checkbox-button__original",\n attrs: {\n type: "checkbox",\n name: _vm.name,\n disabled: _vm.isDisabled,\n "true-value": _vm.trueLabel,\n "false-value": _vm.falseLabel\n },\n domProps: {\n checked: Array.isArray(_vm.model)\n ? _vm._i(_vm.model, null) > -1\n : _vm._q(_vm.model, _vm.trueLabel)\n },\n on: {\n change: [\n function($event) {\n var $$a = _vm.model,\n $$el = $event.target,\n $$c = $$el.checked ? _vm.trueLabel : _vm.falseLabel\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 && (_vm.model = $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n (_vm.model = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.model = $$c\n }\n },\n _vm.handleChange\n ],\n focus: function($event) {\n _vm.focus = true\n },\n blur: function($event) {\n _vm.focus = false\n }\n }\n })\n : _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.model,\n expression: "model"\n }\n ],\n staticClass: "el-checkbox-button__original",\n attrs: {\n type: "checkbox",\n name: _vm.name,\n disabled: _vm.isDisabled\n },\n domProps: {\n value: _vm.label,\n checked: Array.isArray(_vm.model)\n ? _vm._i(_vm.model, _vm.label) > -1\n : _vm.model\n },\n on: {\n change: [\n function($event) {\n var $$a = _vm.model,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = _vm.label,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 && (_vm.model = $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n (_vm.model = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.model = $$c\n }\n },\n _vm.handleChange\n ],\n focus: function($event) {\n _vm.focus = true\n },\n blur: function($event) {\n _vm.focus = false\n }\n }\n }),\n _vm.$slots.default || _vm.label\n ? _c(\n "span",\n {\n staticClass: "el-checkbox-button__inner",\n style: _vm.isChecked ? _vm.activeStyle : null\n },\n [_vm._t("default", [_vm._v(_vm._s(_vm.label))])],\n 2\n )\n : _vm._e()\n ]\n )\n}\nvar checkbox_buttonvue_type_template_id_478e906e_staticRenderFns = []\ncheckbox_buttonvue_type_template_id_478e906e_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox-button.vue?vue&type=template&id=478e906e&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/checkbox/src/checkbox-button.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//\n//\n//\n\n\n\n/* harmony default export */ var checkbox_buttonvue_type_script_lang_js_ = ({\n name: \'ElCheckboxButton\',\n\n mixins: [emitter_default.a],\n\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n\n data: function data() {\n return {\n selfModel: false,\n focus: false,\n isLimitExceeded: false\n };\n },\n\n\n props: {\n value: {},\n label: {},\n disabled: Boolean,\n checked: Boolean,\n name: String,\n trueLabel: [String, Number],\n falseLabel: [String, Number]\n },\n computed: {\n model: {\n get: function get() {\n return this._checkboxGroup ? this.store : this.value !== undefined ? this.value : this.selfModel;\n },\n set: function set(val) {\n if (this._checkboxGroup) {\n this.isLimitExceeded = false;\n this._checkboxGroup.min !== undefined && val.length < this._checkboxGroup.min && (this.isLimitExceeded = true);\n\n this._checkboxGroup.max !== undefined && val.length > this._checkboxGroup.max && (this.isLimitExceeded = true);\n\n this.isLimitExceeded === false && this.dispatch(\'ElCheckboxGroup\', \'input\', [val]);\n } else if (this.value !== undefined) {\n this.$emit(\'input\', val);\n } else {\n this.selfModel = val;\n }\n }\n },\n\n isChecked: function isChecked() {\n if ({}.toString.call(this.model) === \'[object Boolean]\') {\n return this.model;\n } else if (Array.isArray(this.model)) {\n return this.model.indexOf(this.label) > -1;\n } else if (this.model !== null && this.model !== undefined) {\n return this.model === this.trueLabel;\n }\n },\n _checkboxGroup: function _checkboxGroup() {\n var parent = this.$parent;\n while (parent) {\n if (parent.$options.componentName !== \'ElCheckboxGroup\') {\n parent = parent.$parent;\n } else {\n return parent;\n }\n }\n return false;\n },\n store: function store() {\n return this._checkboxGroup ? this._checkboxGroup.value : this.value;\n },\n activeStyle: function activeStyle() {\n return {\n backgroundColor: this._checkboxGroup.fill || \'\',\n borderColor: this._checkboxGroup.fill || \'\',\n color: this._checkboxGroup.textColor || \'\',\n \'box-shadow\': \'-1px 0 0 0 \' + this._checkboxGroup.fill\n\n };\n },\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n size: function size() {\n return this._checkboxGroup.checkboxGroupSize || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n\n\n /* used to make the isDisabled judgment under max/min props */\n isLimitDisabled: function isLimitDisabled() {\n var _checkboxGroup2 = this._checkboxGroup,\n max = _checkboxGroup2.max,\n min = _checkboxGroup2.min;\n\n return !!(max || min) && this.model.length >= max && !this.isChecked || this.model.length <= min && this.isChecked;\n },\n isDisabled: function isDisabled() {\n return this._checkboxGroup ? this._checkboxGroup.disabled || this.disabled || (this.elForm || {}).disabled || this.isLimitDisabled : this.disabled || (this.elForm || {}).disabled;\n }\n },\n methods: {\n addToStore: function addToStore() {\n if (Array.isArray(this.model) && this.model.indexOf(this.label) === -1) {\n this.model.push(this.label);\n } else {\n this.model = this.trueLabel || true;\n }\n },\n handleChange: function handleChange(ev) {\n var _this = this;\n\n if (this.isLimitExceeded) return;\n var value = void 0;\n if (ev.target.checked) {\n value = this.trueLabel === undefined ? true : this.trueLabel;\n } else {\n value = this.falseLabel === undefined ? false : this.falseLabel;\n }\n this.$emit(\'change\', value, ev);\n this.$nextTick(function () {\n if (_this._checkboxGroup) {\n _this.dispatch(\'ElCheckboxGroup\', \'change\', [_this._checkboxGroup.value]);\n }\n });\n }\n },\n\n created: function created() {\n this.checked && this.addToStore();\n }\n});\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox-button.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_checkbox_buttonvue_type_script_lang_js_ = (checkbox_buttonvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox-button.vue\n\n\n\n\n\n/* normalize component */\n\nvar checkbox_button_component = normalizeComponent(\n src_checkbox_buttonvue_type_script_lang_js_,\n checkbox_buttonvue_type_template_id_478e906e_render,\n checkbox_buttonvue_type_template_id_478e906e_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var checkbox_button_api; }\ncheckbox_button_component.options.__file = "packages/checkbox/src/checkbox-button.vue"\n/* harmony default export */ var checkbox_button = (checkbox_button_component.exports);\n// CONCATENATED MODULE: ./packages/checkbox-button/index.js\n\n\n/* istanbul ignore next */\ncheckbox_button.install = function (Vue) {\n Vue.component(checkbox_button.name, checkbox_button);\n};\n\n/* harmony default export */ var packages_checkbox_button = (checkbox_button);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/checkbox/src/checkbox-group.vue?vue&type=template&id=7289a290&\nvar checkbox_groupvue_type_template_id_7289a290_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 staticClass: "el-checkbox-group",\n attrs: { role: "group", "aria-label": "checkbox-group" }\n },\n [_vm._t("default")],\n 2\n )\n}\nvar checkbox_groupvue_type_template_id_7289a290_staticRenderFns = []\ncheckbox_groupvue_type_template_id_7289a290_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox-group.vue?vue&type=template&id=7289a290&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/checkbox/src/checkbox-group.vue?vue&type=script&lang=js&\n\n\n\n/* harmony default export */ var checkbox_groupvue_type_script_lang_js_ = ({\n name: \'ElCheckboxGroup\',\n\n componentName: \'ElCheckboxGroup\',\n\n mixins: [emitter_default.a],\n\n inject: {\n elFormItem: {\n default: \'\'\n }\n },\n\n props: {\n value: {},\n disabled: Boolean,\n min: Number,\n max: Number,\n size: String,\n fill: String,\n textColor: String\n },\n\n computed: {\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n checkboxGroupSize: function checkboxGroupSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n }\n },\n\n watch: {\n value: function value(_value) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', [_value]);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox-group.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_checkbox_groupvue_type_script_lang_js_ = (checkbox_groupvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox-group.vue\n\n\n\n\n\n/* normalize component */\n\nvar checkbox_group_component = normalizeComponent(\n src_checkbox_groupvue_type_script_lang_js_,\n checkbox_groupvue_type_template_id_7289a290_render,\n checkbox_groupvue_type_template_id_7289a290_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var checkbox_group_api; }\ncheckbox_group_component.options.__file = "packages/checkbox/src/checkbox-group.vue"\n/* harmony default export */ var checkbox_group = (checkbox_group_component.exports);\n// CONCATENATED MODULE: ./packages/checkbox-group/index.js\n\n\n/* istanbul ignore next */\ncheckbox_group.install = function (Vue) {\n Vue.component(checkbox_group.name, checkbox_group);\n};\n\n/* harmony default export */ var packages_checkbox_group = (checkbox_group);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/switch/src/component.vue?vue&type=template&id=2dcd8fbb&\nvar componentvue_type_template_id_2dcd8fbb_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 staticClass: "el-switch",\n class: { "is-disabled": _vm.switchDisabled, "is-checked": _vm.checked },\n attrs: {\n role: "switch",\n "aria-checked": _vm.checked,\n "aria-disabled": _vm.switchDisabled\n },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.switchValue($event)\n }\n }\n },\n [\n _c("input", {\n ref: "input",\n staticClass: "el-switch__input",\n attrs: {\n type: "checkbox",\n id: _vm.id,\n name: _vm.name,\n "true-value": _vm.activeValue,\n "false-value": _vm.inactiveValue,\n disabled: _vm.switchDisabled\n },\n on: {\n change: _vm.handleChange,\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n return _vm.switchValue($event)\n }\n }\n }),\n _vm.inactiveIconClass || _vm.inactiveText\n ? _c(\n "span",\n {\n class: [\n "el-switch__label",\n "el-switch__label--left",\n !_vm.checked ? "is-active" : ""\n ]\n },\n [\n _vm.inactiveIconClass\n ? _c("i", { class: [_vm.inactiveIconClass] })\n : _vm._e(),\n !_vm.inactiveIconClass && _vm.inactiveText\n ? _c("span", { attrs: { "aria-hidden": _vm.checked } }, [\n _vm._v(_vm._s(_vm.inactiveText))\n ])\n : _vm._e()\n ]\n )\n : _vm._e(),\n _c("span", {\n ref: "core",\n staticClass: "el-switch__core",\n style: { width: _vm.coreWidth + "px" }\n }),\n _vm.activeIconClass || _vm.activeText\n ? _c(\n "span",\n {\n class: [\n "el-switch__label",\n "el-switch__label--right",\n _vm.checked ? "is-active" : ""\n ]\n },\n [\n _vm.activeIconClass\n ? _c("i", { class: [_vm.activeIconClass] })\n : _vm._e(),\n !_vm.activeIconClass && _vm.activeText\n ? _c("span", { attrs: { "aria-hidden": !_vm.checked } }, [\n _vm._v(_vm._s(_vm.activeText))\n ])\n : _vm._e()\n ]\n )\n : _vm._e()\n ]\n )\n}\nvar componentvue_type_template_id_2dcd8fbb_staticRenderFns = []\ncomponentvue_type_template_id_2dcd8fbb_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/switch/src/component.vue?vue&type=template&id=2dcd8fbb&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/switch/src/component.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 */ var switch_src_componentvue_type_script_lang_js_ = ({\n name: \'ElSwitch\',\n mixins: [focus_default()(\'input\'), migrating_default.a, emitter_default.a],\n inject: {\n elForm: {\n default: \'\'\n }\n },\n props: {\n value: {\n type: [Boolean, String, Number],\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n width: {\n type: Number,\n default: 40\n },\n activeIconClass: {\n type: String,\n default: \'\'\n },\n inactiveIconClass: {\n type: String,\n default: \'\'\n },\n activeText: String,\n inactiveText: String,\n activeColor: {\n type: String,\n default: \'\'\n },\n inactiveColor: {\n type: String,\n default: \'\'\n },\n activeValue: {\n type: [Boolean, String, Number],\n default: true\n },\n inactiveValue: {\n type: [Boolean, String, Number],\n default: false\n },\n name: {\n type: String,\n default: \'\'\n },\n validateEvent: {\n type: Boolean,\n default: true\n },\n id: String\n },\n data: function data() {\n return {\n coreWidth: this.width\n };\n },\n created: function created() {\n if (!~[this.activeValue, this.inactiveValue].indexOf(this.value)) {\n this.$emit(\'input\', this.inactiveValue);\n }\n },\n\n computed: {\n checked: function checked() {\n return this.value === this.activeValue;\n },\n switchDisabled: function switchDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n }\n },\n watch: {\n checked: function checked() {\n this.$refs.input.checked = this.checked;\n if (this.activeColor || this.inactiveColor) {\n this.setBackgroundColor();\n }\n if (this.validateEvent) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', [this.value]);\n }\n }\n },\n methods: {\n handleChange: function handleChange(event) {\n var _this = this;\n\n var val = this.checked ? this.inactiveValue : this.activeValue;\n this.$emit(\'input\', val);\n this.$emit(\'change\', val);\n this.$nextTick(function () {\n // set input\'s checked property\n // in case parent refuses to change component\'s value\n if (_this.$refs.input) {\n _this.$refs.input.checked = _this.checked;\n }\n });\n },\n setBackgroundColor: function setBackgroundColor() {\n var newColor = this.checked ? this.activeColor : this.inactiveColor;\n this.$refs.core.style.borderColor = newColor;\n this.$refs.core.style.backgroundColor = newColor;\n },\n switchValue: function switchValue() {\n !this.switchDisabled && this.handleChange();\n },\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n \'on-color\': \'on-color is renamed to active-color.\',\n \'off-color\': \'off-color is renamed to inactive-color.\',\n \'on-text\': \'on-text is renamed to active-text.\',\n \'off-text\': \'off-text is renamed to inactive-text.\',\n \'on-value\': \'on-value is renamed to active-value.\',\n \'off-value\': \'off-value is renamed to inactive-value.\',\n \'on-icon-class\': \'on-icon-class is renamed to active-icon-class.\',\n \'off-icon-class\': \'off-icon-class is renamed to inactive-icon-class.\'\n }\n };\n }\n },\n mounted: function mounted() {\n /* istanbul ignore if */\n this.coreWidth = this.width || 40;\n if (this.activeColor || this.inactiveColor) {\n this.setBackgroundColor();\n }\n this.$refs.input.checked = this.checked;\n }\n});\n// CONCATENATED MODULE: ./packages/switch/src/component.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_switch_src_componentvue_type_script_lang_js_ = (switch_src_componentvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/switch/src/component.vue\n\n\n\n\n\n/* normalize component */\n\nvar src_component_component = normalizeComponent(\n packages_switch_src_componentvue_type_script_lang_js_,\n componentvue_type_template_id_2dcd8fbb_render,\n componentvue_type_template_id_2dcd8fbb_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var src_component_api; }\nsrc_component_component.options.__file = "packages/switch/src/component.vue"\n/* harmony default export */ var switch_src_component = (src_component_component.exports);\n// CONCATENATED MODULE: ./packages/switch/index.js\n\n\n/* istanbul ignore next */\nswitch_src_component.install = function (Vue) {\n Vue.component(switch_src_component.name, switch_src_component);\n};\n\n/* harmony default export */ var packages_switch = (switch_src_component);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select.vue?vue&type=template&id=0e4aade6&\nvar selectvue_type_template_id_0e4aade6_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: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.handleClose,\n expression: "handleClose"\n }\n ],\n staticClass: "el-select",\n class: [_vm.selectSize ? "el-select--" + _vm.selectSize : ""],\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.toggleMenu($event)\n }\n }\n },\n [\n _vm.multiple\n ? _c(\n "div",\n {\n ref: "tags",\n staticClass: "el-select__tags",\n style: { "max-width": _vm.inputWidth - 32 + "px", width: "100%" }\n },\n [\n _vm.collapseTags && _vm.selected.length\n ? _c(\n "span",\n [\n _c(\n "el-tag",\n {\n attrs: {\n closable: !_vm.selectDisabled,\n size: _vm.collapseTagSize,\n hit: _vm.selected[0].hitState,\n type: "info",\n "disable-transitions": ""\n },\n on: {\n close: function($event) {\n _vm.deleteTag($event, _vm.selected[0])\n }\n }\n },\n [\n _c("span", { staticClass: "el-select__tags-text" }, [\n _vm._v(_vm._s(_vm.selected[0].currentLabel))\n ])\n ]\n ),\n _vm.selected.length > 1\n ? _c(\n "el-tag",\n {\n attrs: {\n closable: false,\n size: _vm.collapseTagSize,\n type: "info",\n "disable-transitions": ""\n }\n },\n [\n _c(\n "span",\n { staticClass: "el-select__tags-text" },\n [_vm._v("+ " + _vm._s(_vm.selected.length - 1))]\n )\n ]\n )\n : _vm._e()\n ],\n 1\n )\n : _vm._e(),\n !_vm.collapseTags\n ? _c(\n "transition-group",\n { on: { "after-leave": _vm.resetInputHeight } },\n _vm._l(_vm.selected, function(item) {\n return _c(\n "el-tag",\n {\n key: _vm.getValueKey(item),\n attrs: {\n closable: !_vm.selectDisabled,\n size: _vm.collapseTagSize,\n hit: item.hitState,\n type: "info",\n "disable-transitions": ""\n },\n on: {\n close: function($event) {\n _vm.deleteTag($event, item)\n }\n }\n },\n [\n _c("span", { staticClass: "el-select__tags-text" }, [\n _vm._v(_vm._s(item.currentLabel))\n ])\n ]\n )\n }),\n 1\n )\n : _vm._e(),\n _vm.filterable\n ? _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.query,\n expression: "query"\n }\n ],\n ref: "input",\n staticClass: "el-select__input",\n class: [_vm.selectSize ? "is-" + _vm.selectSize : ""],\n style: {\n "flex-grow": "1",\n width: _vm.inputLength / (_vm.inputWidth - 32) + "%",\n "max-width": _vm.inputWidth - 42 + "px"\n },\n attrs: {\n type: "text",\n disabled: _vm.selectDisabled,\n autocomplete: _vm.autoComplete || _vm.autocomplete\n },\n domProps: { value: _vm.query },\n on: {\n focus: _vm.handleFocus,\n blur: function($event) {\n _vm.softFocus = false\n },\n keyup: _vm.managePlaceholder,\n keydown: [\n _vm.resetInputState,\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "down", 40, $event.key, [\n "Down",\n "ArrowDown"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n _vm.handleNavigate("next")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "up", 38, $event.key, [\n "Up",\n "ArrowUp"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n _vm.handleNavigate("prev")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "enter",\n 13,\n $event.key,\n "Enter"\n )\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.selectOption($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "esc", 27, $event.key, [\n "Esc",\n "Escape"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.visible = false\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "delete",\n [8, 46],\n $event.key,\n ["Backspace", "Delete", "Del"]\n )\n ) {\n return null\n }\n return _vm.deletePrevTag($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "tab", 9, $event.key, "Tab")\n ) {\n return null\n }\n _vm.visible = false\n }\n ],\n compositionstart: _vm.handleComposition,\n compositionupdate: _vm.handleComposition,\n compositionend: _vm.handleComposition,\n input: [\n function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.query = $event.target.value\n },\n _vm.debouncedQueryChange\n ]\n }\n })\n : _vm._e()\n ],\n 1\n )\n : _vm._e(),\n _c(\n "el-input",\n {\n ref: "reference",\n class: { "is-focus": _vm.visible },\n attrs: {\n type: "text",\n placeholder: _vm.currentPlaceholder,\n name: _vm.name,\n id: _vm.id,\n autocomplete: _vm.autoComplete || _vm.autocomplete,\n size: _vm.selectSize,\n disabled: _vm.selectDisabled,\n readonly: _vm.readonly,\n "validate-event": false,\n tabindex: _vm.multiple && _vm.filterable ? "-1" : null\n },\n on: {\n focus: _vm.handleFocus,\n blur: _vm.handleBlur,\n input: _vm.debouncedOnInputChange,\n compositionstart: _vm.handleComposition,\n compositionupdate: _vm.handleComposition,\n compositionend: _vm.handleComposition\n },\n nativeOn: {\n keydown: [\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "down", 40, $event.key, [\n "Down",\n "ArrowDown"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.handleNavigate("next")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "up", 38, $event.key, [\n "Up",\n "ArrowUp"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.handleNavigate("prev")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.selectOption($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "esc", 27, $event.key, [\n "Esc",\n "Escape"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.visible = false\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "tab", 9, $event.key, "Tab")\n ) {\n return null\n }\n _vm.visible = false\n }\n ],\n mouseenter: function($event) {\n _vm.inputHovering = true\n },\n mouseleave: function($event) {\n _vm.inputHovering = false\n }\n },\n model: {\n value: _vm.selectedLabel,\n callback: function($$v) {\n _vm.selectedLabel = $$v\n },\n expression: "selectedLabel"\n }\n },\n [\n _vm.$slots.prefix\n ? _c("template", { slot: "prefix" }, [_vm._t("prefix")], 2)\n : _vm._e(),\n _c("template", { slot: "suffix" }, [\n _c("i", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: !_vm.showClose,\n expression: "!showClose"\n }\n ],\n class: [\n "el-select__caret",\n "el-input__icon",\n "el-icon-" + _vm.iconClass\n ]\n }),\n _vm.showClose\n ? _c("i", {\n staticClass:\n "el-select__caret el-input__icon el-icon-circle-close",\n on: { click: _vm.handleClearClick }\n })\n : _vm._e()\n ])\n ],\n 2\n ),\n _c(\n "transition",\n {\n attrs: { name: "el-zoom-in-top" },\n on: {\n "before-enter": _vm.handleMenuEnter,\n "after-leave": _vm.doDestroy\n }\n },\n [\n _c(\n "el-select-menu",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible && _vm.emptyText !== false,\n expression: "visible && emptyText !== false"\n }\n ],\n ref: "popper",\n attrs: { "append-to-body": _vm.popperAppendToBody }\n },\n [\n _c(\n "el-scrollbar",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.options.length > 0 && !_vm.loading,\n expression: "options.length > 0 && !loading"\n }\n ],\n ref: "scrollbar",\n class: {\n "is-empty":\n !_vm.allowCreate &&\n _vm.query &&\n _vm.filteredOptionsCount === 0\n },\n attrs: {\n tag: "ul",\n "wrap-class": "el-select-dropdown__wrap",\n "view-class": "el-select-dropdown__list"\n }\n },\n [\n _vm.showNewOption\n ? _c("el-option", {\n attrs: { value: _vm.query, created: "" }\n })\n : _vm._e(),\n _vm._t("default")\n ],\n 2\n ),\n _vm.emptyText &&\n (!_vm.allowCreate ||\n _vm.loading ||\n (_vm.allowCreate && _vm.options.length === 0))\n ? [\n _vm.$slots.empty\n ? _vm._t("empty")\n : _c("p", { staticClass: "el-select-dropdown__empty" }, [\n _vm._v(\n "\\n " +\n _vm._s(_vm.emptyText) +\n "\\n "\n )\n ])\n ]\n : _vm._e()\n ],\n 2\n )\n ],\n 1\n )\n ],\n 1\n )\n}\nvar selectvue_type_template_id_0e4aade6_staticRenderFns = []\nselectvue_type_template_id_0e4aade6_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/select/src/select.vue?vue&type=template&id=0e4aade6&\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select-dropdown.vue?vue&type=template&id=06828748&\nvar select_dropdownvue_type_template_id_06828748_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 staticClass: "el-select-dropdown el-popper",\n class: [{ "is-multiple": _vm.$parent.multiple }, _vm.popperClass],\n style: { minWidth: _vm.minWidth }\n },\n [_vm._t("default")],\n 2\n )\n}\nvar select_dropdownvue_type_template_id_06828748_staticRenderFns = []\nselect_dropdownvue_type_template_id_06828748_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/select/src/select-dropdown.vue?vue&type=template&id=06828748&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select-dropdown.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ var select_dropdownvue_type_script_lang_js_ = ({\n name: \'ElSelectDropdown\',\n\n componentName: \'ElSelectDropdown\',\n\n mixins: [vue_popper_default.a],\n\n props: {\n placement: {\n default: \'bottom-start\'\n },\n\n boundariesPadding: {\n default: 0\n },\n\n popperOptions: {\n default: function _default() {\n return {\n gpuAcceleration: false\n };\n }\n },\n\n visibleArrow: {\n default: true\n },\n\n appendToBody: {\n type: Boolean,\n default: true\n }\n },\n\n data: function data() {\n return {\n minWidth: \'\'\n };\n },\n\n\n computed: {\n popperClass: function popperClass() {\n return this.$parent.popperClass;\n }\n },\n\n watch: {\n \'$parent.inputWidth\': function $parentInputWidth() {\n this.minWidth = this.$parent.$el.getBoundingClientRect().width + \'px\';\n }\n },\n\n mounted: function mounted() {\n var _this = this;\n\n this.referenceElm = this.$parent.$refs.reference.$el;\n this.$parent.popperElm = this.popperElm = this.$el;\n this.$on(\'updatePopper\', function () {\n if (_this.$parent.visible) _this.updatePopper();\n });\n this.$on(\'destroyPopper\', this.destroyPopper);\n }\n});\n// CONCATENATED MODULE: ./packages/select/src/select-dropdown.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_select_dropdownvue_type_script_lang_js_ = (select_dropdownvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/select/src/select-dropdown.vue\n\n\n\n\n\n/* normalize component */\n\nvar select_dropdown_component = normalizeComponent(\n src_select_dropdownvue_type_script_lang_js_,\n select_dropdownvue_type_template_id_06828748_render,\n select_dropdownvue_type_template_id_06828748_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var select_dropdown_api; }\nselect_dropdown_component.options.__file = "packages/select/src/select-dropdown.vue"\n/* harmony default export */ var select_dropdown = (select_dropdown_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/option.vue?vue&type=template&id=7a44c642&\nvar optionvue_type_template_id_7a44c642_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "li",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-select-dropdown__item",\n class: {\n selected: _vm.itemSelected,\n "is-disabled": _vm.disabled || _vm.groupDisabled || _vm.limitReached,\n hover: _vm.hover\n },\n on: {\n mouseenter: _vm.hoverItem,\n click: function($event) {\n $event.stopPropagation()\n return _vm.selectOptionClick($event)\n }\n }\n },\n [_vm._t("default", [_c("span", [_vm._v(_vm._s(_vm.currentLabel))])])],\n 2\n )\n}\nvar optionvue_type_template_id_7a44c642_staticRenderFns = []\noptionvue_type_template_id_7a44c642_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/select/src/option.vue?vue&type=template&id=7a44c642&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/option.vue?vue&type=script&lang=js&\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : 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/* harmony default export */ var optionvue_type_script_lang_js_ = ({\n mixins: [emitter_default.a],\n\n name: \'ElOption\',\n\n componentName: \'ElOption\',\n\n inject: [\'select\'],\n\n props: {\n value: {\n required: true\n },\n label: [String, Number],\n created: Boolean,\n disabled: {\n type: Boolean,\n default: false\n }\n },\n\n data: function data() {\n return {\n index: -1,\n groupDisabled: false,\n visible: true,\n hitState: false,\n hover: false\n };\n },\n\n\n computed: {\n isObject: function isObject() {\n return Object.prototype.toString.call(this.value).toLowerCase() === \'[object object]\';\n },\n currentLabel: function currentLabel() {\n return this.label || (this.isObject ? \'\' : this.value);\n },\n currentValue: function currentValue() {\n return this.value || this.label || \'\';\n },\n itemSelected: function itemSelected() {\n if (!this.select.multiple) {\n return this.isEqual(this.value, this.select.value);\n } else {\n return this.contains(this.select.value, this.value);\n }\n },\n limitReached: function limitReached() {\n if (this.select.multiple) {\n return !this.itemSelected && (this.select.value || []).length >= this.select.multipleLimit && this.select.multipleLimit > 0;\n } else {\n return false;\n }\n }\n },\n\n watch: {\n currentLabel: function currentLabel() {\n if (!this.created && !this.select.remote) this.dispatch(\'ElSelect\', \'setSelected\');\n },\n value: function value(val, oldVal) {\n var _select = this.select,\n remote = _select.remote,\n valueKey = _select.valueKey;\n\n if (!this.created && !remote) {\n if (valueKey && (typeof val === \'undefined\' ? \'undefined\' : _typeof(val)) === \'object\' && (typeof oldVal === \'undefined\' ? \'undefined\' : _typeof(oldVal)) === \'object\' && val[valueKey] === oldVal[valueKey]) {\n return;\n }\n this.dispatch(\'ElSelect\', \'setSelected\');\n }\n }\n },\n\n methods: {\n isEqual: function isEqual(a, b) {\n if (!this.isObject) {\n return a === b;\n } else {\n var valueKey = this.select.valueKey;\n return Object(util_["getValueByPath"])(a, valueKey) === Object(util_["getValueByPath"])(b, valueKey);\n }\n },\n contains: function contains() {\n var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var target = arguments[1];\n\n if (!this.isObject) {\n return arr && arr.indexOf(target) > -1;\n } else {\n var valueKey = this.select.valueKey;\n return arr && arr.some(function (item) {\n return Object(util_["getValueByPath"])(item, valueKey) === Object(util_["getValueByPath"])(target, valueKey);\n });\n }\n },\n handleGroupDisabled: function handleGroupDisabled(val) {\n this.groupDisabled = val;\n },\n hoverItem: function hoverItem() {\n if (!this.disabled && !this.groupDisabled) {\n this.select.hoverIndex = this.select.options.indexOf(this);\n }\n },\n selectOptionClick: function selectOptionClick() {\n if (this.disabled !== true && this.groupDisabled !== true) {\n this.dispatch(\'ElSelect\', \'handleOptionClick\', [this, true]);\n }\n },\n queryChange: function queryChange(query) {\n this.visible = new RegExp(Object(util_["escapeRegexpString"])(query), \'i\').test(this.currentLabel) || this.created;\n if (!this.visible) {\n this.select.filteredOptionsCount--;\n }\n }\n },\n\n created: function created() {\n this.select.options.push(this);\n this.select.cachedOptions.push(this);\n this.select.optionsCount++;\n this.select.filteredOptionsCount++;\n\n this.$on(\'queryChange\', this.queryChange);\n this.$on(\'handleGroupDisabled\', this.handleGroupDisabled);\n },\n beforeDestroy: function beforeDestroy() {\n var _select2 = this.select,\n selected = _select2.selected,\n multiple = _select2.multiple;\n\n var selectedOptions = multiple ? selected : [selected];\n var index = this.select.cachedOptions.indexOf(this);\n var selectedIndex = selectedOptions.indexOf(this);\n\n // if option is not selected, remove it from cache\n if (index > -1 && selectedIndex < 0) {\n this.select.cachedOptions.splice(index, 1);\n }\n this.select.onOptionDestroy(this.select.options.indexOf(this));\n }\n});\n// CONCATENATED MODULE: ./packages/select/src/option.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_optionvue_type_script_lang_js_ = (optionvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/select/src/option.vue\n\n\n\n\n\n/* normalize component */\n\nvar option_component = normalizeComponent(\n src_optionvue_type_script_lang_js_,\n optionvue_type_template_id_7a44c642_render,\n optionvue_type_template_id_7a44c642_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var option_api; }\noption_component.options.__file = "packages/select/src/option.vue"\n/* harmony default export */ var src_option = (option_component.exports);\n// EXTERNAL MODULE: external "element-ui/lib/tag"\nvar tag_ = __webpack_require__(30);\nvar tag_default = /*#__PURE__*/__webpack_require__.n(tag_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/resize-event"\nvar resize_event_ = __webpack_require__(15);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/scroll-into-view"\nvar scroll_into_view_ = __webpack_require__(27);\nvar scroll_into_view_default = /*#__PURE__*/__webpack_require__.n(scroll_into_view_);\n\n// CONCATENATED MODULE: ./packages/select/src/navigation-mixin.js\n/* harmony default export */ var navigation_mixin = ({\n data: function data() {\n return {\n hoverOption: -1\n };\n },\n\n\n computed: {\n optionsAllDisabled: function optionsAllDisabled() {\n return this.options.filter(function (option) {\n return option.visible;\n }).every(function (option) {\n return option.disabled;\n });\n }\n },\n\n watch: {\n hoverIndex: function hoverIndex(val) {\n var _this = this;\n\n if (typeof val === \'number\' && val > -1) {\n this.hoverOption = this.options[val] || {};\n }\n this.options.forEach(function (option) {\n option.hover = _this.hoverOption === option;\n });\n }\n },\n\n methods: {\n navigateOptions: function navigateOptions(direction) {\n var _this2 = this;\n\n if (!this.visible) {\n this.visible = true;\n return;\n }\n if (this.options.length === 0 || this.filteredOptionsCount === 0) return;\n if (!this.optionsAllDisabled) {\n if (direction === \'next\') {\n this.hoverIndex++;\n if (this.hoverIndex === this.options.length) {\n this.hoverIndex = 0;\n }\n } else if (direction === \'prev\') {\n this.hoverIndex--;\n if (this.hoverIndex < 0) {\n this.hoverIndex = this.options.length - 1;\n }\n }\n var option = this.options[this.hoverIndex];\n if (option.disabled === true || option.groupDisabled === true || !option.visible) {\n this.navigateOptions(direction);\n }\n this.$nextTick(function () {\n return _this2.scrollToOption(_this2.hoverOption);\n });\n }\n }\n }\n});\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ var selectvue_type_script_lang_js_ = ({\n mixins: [emitter_default.a, locale_default.a, focus_default()(\'reference\'), navigation_mixin],\n\n name: \'ElSelect\',\n\n componentName: \'ElSelect\',\n\n inject: {\n elForm: {\n default: \'\'\n },\n\n elFormItem: {\n default: \'\'\n }\n },\n\n provide: function provide() {\n return {\n \'select\': this\n };\n },\n\n\n computed: {\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n readonly: function readonly() {\n return !this.filterable || this.multiple || !Object(util_["isIE"])() && !Object(util_["isEdge"])() && !this.visible;\n },\n showClose: function showClose() {\n var hasValue = this.multiple ? Array.isArray(this.value) && this.value.length > 0 : this.value !== undefined && this.value !== null && this.value !== \'\';\n var criteria = this.clearable && !this.selectDisabled && this.inputHovering && hasValue;\n return criteria;\n },\n iconClass: function iconClass() {\n return this.remote && this.filterable ? \'\' : this.visible ? \'arrow-up is-reverse\' : \'arrow-up\';\n },\n debounce: function debounce() {\n return this.remote ? 300 : 0;\n },\n emptyText: function emptyText() {\n if (this.loading) {\n return this.loadingText || this.t(\'el.select.loading\');\n } else {\n if (this.remote && this.query === \'\' && this.options.length === 0) return false;\n if (this.filterable && this.query && this.options.length > 0 && this.filteredOptionsCount === 0) {\n return this.noMatchText || this.t(\'el.select.noMatch\');\n }\n if (this.options.length === 0) {\n return this.noDataText || this.t(\'el.select.noData\');\n }\n }\n return null;\n },\n showNewOption: function showNewOption() {\n var _this = this;\n\n var hasExistingOption = this.options.filter(function (option) {\n return !option.created;\n }).some(function (option) {\n return option.currentLabel === _this.query;\n });\n return this.filterable && this.allowCreate && this.query !== \'\' && !hasExistingOption;\n },\n selectSize: function selectSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n selectDisabled: function selectDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n },\n collapseTagSize: function collapseTagSize() {\n return [\'small\', \'mini\'].indexOf(this.selectSize) > -1 ? \'mini\' : \'small\';\n },\n propPlaceholder: function propPlaceholder() {\n return typeof this.placeholder !== \'undefined\' ? this.placeholder : this.t(\'el.select.placeholder\');\n }\n },\n\n components: {\n ElInput: input_default.a,\n ElSelectMenu: select_dropdown,\n ElOption: src_option,\n ElTag: tag_default.a,\n ElScrollbar: scrollbar_default.a\n },\n\n directives: { Clickoutside: clickoutside_default.a },\n\n props: {\n name: String,\n id: String,\n value: {\n required: true\n },\n autocomplete: {\n type: String,\n default: \'off\'\n },\n /** @Deprecated in next major version */\n autoComplete: {\n type: String,\n validator: function validator(val) {\n false && false;\n return true;\n }\n },\n automaticDropdown: Boolean,\n size: String,\n disabled: Boolean,\n clearable: Boolean,\n filterable: Boolean,\n allowCreate: Boolean,\n loading: Boolean,\n popperClass: String,\n remote: Boolean,\n loadingText: String,\n noMatchText: String,\n noDataText: String,\n remoteMethod: Function,\n filterMethod: Function,\n multiple: Boolean,\n multipleLimit: {\n type: Number,\n default: 0\n },\n placeholder: {\n type: String,\n required: false\n },\n defaultFirstOption: Boolean,\n reserveKeyword: Boolean,\n valueKey: {\n type: String,\n default: \'value\'\n },\n collapseTags: Boolean,\n popperAppendToBody: {\n type: Boolean,\n default: true\n }\n },\n\n data: function data() {\n return {\n options: [],\n cachedOptions: [],\n createdLabel: null,\n createdSelected: false,\n selected: this.multiple ? [] : {},\n inputLength: 20,\n inputWidth: 0,\n initialInputHeight: 0,\n cachedPlaceHolder: \'\',\n optionsCount: 0,\n filteredOptionsCount: 0,\n visible: false,\n softFocus: false,\n selectedLabel: \'\',\n hoverIndex: -1,\n query: \'\',\n previousQuery: null,\n inputHovering: false,\n currentPlaceholder: \'\',\n menuVisibleOnFocus: false,\n isOnComposition: false,\n isSilentBlur: false\n };\n },\n\n\n watch: {\n selectDisabled: function selectDisabled() {\n var _this2 = this;\n\n this.$nextTick(function () {\n _this2.resetInputHeight();\n });\n },\n propPlaceholder: function propPlaceholder(val) {\n this.cachedPlaceHolder = this.currentPlaceholder = val;\n },\n value: function value(val, oldVal) {\n if (this.multiple) {\n this.resetInputHeight();\n if (val && val.length > 0 || this.$refs.input && this.query !== \'\') {\n this.currentPlaceholder = \'\';\n } else {\n this.currentPlaceholder = this.cachedPlaceHolder;\n }\n if (this.filterable && !this.reserveKeyword) {\n this.query = \'\';\n this.handleQueryChange(this.query);\n }\n }\n this.setSelected();\n if (this.filterable && !this.multiple) {\n this.inputLength = 20;\n }\n if (!Object(util_["valueEquals"])(val, oldVal)) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', val);\n }\n },\n visible: function visible(val) {\n var _this3 = this;\n\n if (!val) {\n this.broadcast(\'ElSelectDropdown\', \'destroyPopper\');\n if (this.$refs.input) {\n this.$refs.input.blur();\n }\n this.query = \'\';\n this.previousQuery = null;\n this.selectedLabel = \'\';\n this.inputLength = 20;\n this.menuVisibleOnFocus = false;\n this.resetHoverIndex();\n this.$nextTick(function () {\n if (_this3.$refs.input && _this3.$refs.input.value === \'\' && _this3.selected.length === 0) {\n _this3.currentPlaceholder = _this3.cachedPlaceHolder;\n }\n });\n if (!this.multiple) {\n if (this.selected) {\n if (this.filterable && this.allowCreate && this.createdSelected && this.createdLabel) {\n this.selectedLabel = this.createdLabel;\n } else {\n this.selectedLabel = this.selected.currentLabel;\n }\n if (this.filterable) this.query = this.selectedLabel;\n }\n\n if (this.filterable) {\n this.currentPlaceholder = this.cachedPlaceHolder;\n }\n }\n } else {\n this.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n if (this.filterable) {\n this.query = this.remote ? \'\' : this.selectedLabel;\n this.handleQueryChange(this.query);\n if (this.multiple) {\n this.$refs.input.focus();\n } else {\n if (!this.remote) {\n this.broadcast(\'ElOption\', \'queryChange\', \'\');\n this.broadcast(\'ElOptionGroup\', \'queryChange\');\n }\n\n if (this.selectedLabel) {\n this.currentPlaceholder = this.selectedLabel;\n this.selectedLabel = \'\';\n }\n }\n }\n }\n this.$emit(\'visible-change\', val);\n },\n options: function options() {\n var _this4 = this;\n\n if (this.$isServer) return;\n this.$nextTick(function () {\n _this4.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n });\n if (this.multiple) {\n this.resetInputHeight();\n }\n var inputs = this.$el.querySelectorAll(\'input\');\n if ([].indexOf.call(inputs, document.activeElement) === -1) {\n this.setSelected();\n }\n if (this.defaultFirstOption && (this.filterable || this.remote) && this.filteredOptionsCount) {\n this.checkDefaultFirstOption();\n }\n }\n },\n\n methods: {\n handleNavigate: function handleNavigate(direction) {\n if (this.isOnComposition) return;\n\n this.navigateOptions(direction);\n },\n handleComposition: function handleComposition(event) {\n var _this5 = this;\n\n var text = event.target.value;\n if (event.type === \'compositionend\') {\n this.isOnComposition = false;\n this.$nextTick(function (_) {\n return _this5.handleQueryChange(text);\n });\n } else {\n var lastCharacter = text[text.length - 1] || \'\';\n this.isOnComposition = !Object(shared_["isKorean"])(lastCharacter);\n }\n },\n handleQueryChange: function handleQueryChange(val) {\n var _this6 = this;\n\n if (this.previousQuery === val || this.isOnComposition) return;\n if (this.previousQuery === null && (typeof this.filterMethod === \'function\' || typeof this.remoteMethod === \'function\')) {\n this.previousQuery = val;\n return;\n }\n this.previousQuery = val;\n this.$nextTick(function () {\n if (_this6.visible) _this6.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n });\n this.hoverIndex = -1;\n if (this.multiple && this.filterable) {\n this.$nextTick(function () {\n var length = _this6.$refs.input.value.length * 15 + 20;\n _this6.inputLength = _this6.collapseTags ? Math.min(50, length) : length;\n _this6.managePlaceholder();\n _this6.resetInputHeight();\n });\n }\n if (this.remote && typeof this.remoteMethod === \'function\') {\n this.hoverIndex = -1;\n this.remoteMethod(val);\n } else if (typeof this.filterMethod === \'function\') {\n this.filterMethod(val);\n this.broadcast(\'ElOptionGroup\', \'queryChange\');\n } else {\n this.filteredOptionsCount = this.optionsCount;\n this.broadcast(\'ElOption\', \'queryChange\', val);\n this.broadcast(\'ElOptionGroup\', \'queryChange\');\n }\n if (this.defaultFirstOption && (this.filterable || this.remote) && this.filteredOptionsCount) {\n this.checkDefaultFirstOption();\n }\n },\n scrollToOption: function scrollToOption(option) {\n var target = Array.isArray(option) && option[0] ? option[0].$el : option.$el;\n if (this.$refs.popper && target) {\n var menu = this.$refs.popper.$el.querySelector(\'.el-select-dropdown__wrap\');\n scroll_into_view_default()(menu, target);\n }\n this.$refs.scrollbar && this.$refs.scrollbar.handleScroll();\n },\n handleMenuEnter: function handleMenuEnter() {\n var _this7 = this;\n\n this.$nextTick(function () {\n return _this7.scrollToOption(_this7.selected);\n });\n },\n emitChange: function emitChange(val) {\n if (!Object(util_["valueEquals"])(this.value, val)) {\n this.$emit(\'change\', val);\n }\n },\n getOption: function getOption(value) {\n var option = void 0;\n var isObject = Object.prototype.toString.call(value).toLowerCase() === \'[object object]\';\n var isNull = Object.prototype.toString.call(value).toLowerCase() === \'[object null]\';\n var isUndefined = Object.prototype.toString.call(value).toLowerCase() === \'[object undefined]\';\n\n for (var i = this.cachedOptions.length - 1; i >= 0; i--) {\n var cachedOption = this.cachedOptions[i];\n var isEqual = isObject ? Object(util_["getValueByPath"])(cachedOption.value, this.valueKey) === Object(util_["getValueByPath"])(value, this.valueKey) : cachedOption.value === value;\n if (isEqual) {\n option = cachedOption;\n break;\n }\n }\n if (option) return option;\n var label = !isObject && !isNull && !isUndefined ? String(value) : \'\';\n var newOption = {\n value: value,\n currentLabel: label\n };\n if (this.multiple) {\n newOption.hitState = false;\n }\n return newOption;\n },\n setSelected: function setSelected() {\n var _this8 = this;\n\n if (!this.multiple) {\n var option = this.getOption(this.value);\n if (option.created) {\n this.createdLabel = option.currentLabel;\n this.createdSelected = true;\n } else {\n this.createdSelected = false;\n }\n this.selectedLabel = option.currentLabel;\n this.selected = option;\n if (this.filterable) this.query = this.selectedLabel;\n return;\n }\n var result = [];\n if (Array.isArray(this.value)) {\n this.value.forEach(function (value) {\n result.push(_this8.getOption(value));\n });\n }\n this.selected = result;\n this.$nextTick(function () {\n _this8.resetInputHeight();\n });\n },\n handleFocus: function handleFocus(event) {\n if (!this.softFocus) {\n if (this.automaticDropdown || this.filterable) {\n if (this.filterable && !this.visible) {\n this.menuVisibleOnFocus = true;\n }\n this.visible = true;\n }\n this.$emit(\'focus\', event);\n } else {\n this.softFocus = false;\n }\n },\n blur: function blur() {\n this.visible = false;\n this.$refs.reference.blur();\n },\n handleBlur: function handleBlur(event) {\n var _this9 = this;\n\n setTimeout(function () {\n if (_this9.isSilentBlur) {\n _this9.isSilentBlur = false;\n } else {\n _this9.$emit(\'blur\', event);\n }\n }, 50);\n this.softFocus = false;\n },\n handleClearClick: function handleClearClick(event) {\n this.deleteSelected(event);\n },\n doDestroy: function doDestroy() {\n this.$refs.popper && this.$refs.popper.doDestroy();\n },\n handleClose: function handleClose() {\n this.visible = false;\n },\n toggleLastOptionHitState: function toggleLastOptionHitState(hit) {\n if (!Array.isArray(this.selected)) return;\n var option = this.selected[this.selected.length - 1];\n if (!option) return;\n\n if (hit === true || hit === false) {\n option.hitState = hit;\n return hit;\n }\n\n option.hitState = !option.hitState;\n return option.hitState;\n },\n deletePrevTag: function deletePrevTag(e) {\n if (e.target.value.length <= 0 && !this.toggleLastOptionHitState()) {\n var value = this.value.slice();\n value.pop();\n this.$emit(\'input\', value);\n this.emitChange(value);\n }\n },\n managePlaceholder: function managePlaceholder() {\n if (this.currentPlaceholder !== \'\') {\n this.currentPlaceholder = this.$refs.input.value ? \'\' : this.cachedPlaceHolder;\n }\n },\n resetInputState: function resetInputState(e) {\n if (e.keyCode !== 8) this.toggleLastOptionHitState(false);\n this.inputLength = this.$refs.input.value.length * 15 + 20;\n this.resetInputHeight();\n },\n resetInputHeight: function resetInputHeight() {\n var _this10 = this;\n\n if (this.collapseTags && !this.filterable) return;\n this.$nextTick(function () {\n if (!_this10.$refs.reference) return;\n var inputChildNodes = _this10.$refs.reference.$el.childNodes;\n var input = [].filter.call(inputChildNodes, function (item) {\n return item.tagName === \'INPUT\';\n })[0];\n var tags = _this10.$refs.tags;\n var tagsHeight = tags ? Math.round(tags.getBoundingClientRect().height) : 0;\n var sizeInMap = _this10.initialInputHeight || 40;\n input.style.height = _this10.selected.length === 0 ? sizeInMap + \'px\' : Math.max(tags ? tagsHeight + (tagsHeight > sizeInMap ? 6 : 0) : 0, sizeInMap) + \'px\';\n if (_this10.visible && _this10.emptyText !== false) {\n _this10.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n }\n });\n },\n resetHoverIndex: function resetHoverIndex() {\n var _this11 = this;\n\n setTimeout(function () {\n if (!_this11.multiple) {\n _this11.hoverIndex = _this11.options.indexOf(_this11.selected);\n } else {\n if (_this11.selected.length > 0) {\n _this11.hoverIndex = Math.min.apply(null, _this11.selected.map(function (item) {\n return _this11.options.indexOf(item);\n }));\n } else {\n _this11.hoverIndex = -1;\n }\n }\n }, 300);\n },\n handleOptionSelect: function handleOptionSelect(option, byClick) {\n var _this12 = this;\n\n if (this.multiple) {\n var value = (this.value || []).slice();\n var optionIndex = this.getValueIndex(value, option.value);\n if (optionIndex > -1) {\n value.splice(optionIndex, 1);\n } else if (this.multipleLimit <= 0 || value.length < this.multipleLimit) {\n value.push(option.value);\n }\n this.$emit(\'input\', value);\n this.emitChange(value);\n if (option.created) {\n this.query = \'\';\n this.handleQueryChange(\'\');\n this.inputLength = 20;\n }\n if (this.filterable) this.$refs.input.focus();\n } else {\n this.$emit(\'input\', option.value);\n this.emitChange(option.value);\n this.visible = false;\n }\n this.isSilentBlur = byClick;\n this.setSoftFocus();\n if (this.visible) return;\n this.$nextTick(function () {\n _this12.scrollToOption(option);\n });\n },\n setSoftFocus: function setSoftFocus() {\n this.softFocus = true;\n var input = this.$refs.input || this.$refs.reference;\n if (input) {\n input.focus();\n }\n },\n getValueIndex: function getValueIndex() {\n var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var value = arguments[1];\n\n var isObject = Object.prototype.toString.call(value).toLowerCase() === \'[object object]\';\n if (!isObject) {\n return arr.indexOf(value);\n } else {\n var valueKey = this.valueKey;\n var index = -1;\n arr.some(function (item, i) {\n if (Object(util_["getValueByPath"])(item, valueKey) === Object(util_["getValueByPath"])(value, valueKey)) {\n index = i;\n return true;\n }\n return false;\n });\n return index;\n }\n },\n toggleMenu: function toggleMenu() {\n if (!this.selectDisabled) {\n if (this.menuVisibleOnFocus) {\n this.menuVisibleOnFocus = false;\n } else {\n this.visible = !this.visible;\n }\n if (this.visible) {\n (this.$refs.input || this.$refs.reference).focus();\n }\n }\n },\n selectOption: function selectOption() {\n if (!this.visible) {\n this.toggleMenu();\n } else {\n if (this.options[this.hoverIndex]) {\n this.handleOptionSelect(this.options[this.hoverIndex]);\n }\n }\n },\n deleteSelected: function deleteSelected(event) {\n event.stopPropagation();\n var value = this.multiple ? [] : \'\';\n this.$emit(\'input\', value);\n this.emitChange(value);\n this.visible = false;\n this.$emit(\'clear\');\n },\n deleteTag: function deleteTag(event, tag) {\n var index = this.selected.indexOf(tag);\n if (index > -1 && !this.selectDisabled) {\n var value = this.value.slice();\n value.splice(index, 1);\n this.$emit(\'input\', value);\n this.emitChange(value);\n this.$emit(\'remove-tag\', tag.value);\n }\n event.stopPropagation();\n },\n onInputChange: function onInputChange() {\n if (this.filterable && this.query !== this.selectedLabel) {\n this.query = this.selectedLabel;\n this.handleQueryChange(this.query);\n }\n },\n onOptionDestroy: function onOptionDestroy(index) {\n if (index > -1) {\n this.optionsCount--;\n this.filteredOptionsCount--;\n this.options.splice(index, 1);\n }\n },\n resetInputWidth: function resetInputWidth() {\n this.inputWidth = this.$refs.reference.$el.getBoundingClientRect().width;\n },\n handleResize: function handleResize() {\n this.resetInputWidth();\n if (this.multiple) this.resetInputHeight();\n },\n checkDefaultFirstOption: function checkDefaultFirstOption() {\n this.hoverIndex = -1;\n // highlight the created option\n var hasCreated = false;\n for (var i = this.options.length - 1; i >= 0; i--) {\n if (this.options[i].created) {\n hasCreated = true;\n this.hoverIndex = i;\n break;\n }\n }\n if (hasCreated) return;\n for (var _i = 0; _i !== this.options.length; ++_i) {\n var option = this.options[_i];\n if (this.query) {\n // highlight first options that passes the filter\n if (!option.disabled && !option.groupDisabled && option.visible) {\n this.hoverIndex = _i;\n break;\n }\n } else {\n // highlight currently selected option\n if (option.itemSelected) {\n this.hoverIndex = _i;\n break;\n }\n }\n }\n },\n getValueKey: function getValueKey(item) {\n if (Object.prototype.toString.call(item.value).toLowerCase() !== \'[object object]\') {\n return item.value;\n } else {\n return Object(util_["getValueByPath"])(item.value, this.valueKey);\n }\n }\n },\n\n created: function created() {\n var _this13 = this;\n\n this.cachedPlaceHolder = this.currentPlaceholder = this.propPlaceholder;\n if (this.multiple && !Array.isArray(this.value)) {\n this.$emit(\'input\', []);\n }\n if (!this.multiple && Array.isArray(this.value)) {\n this.$emit(\'input\', \'\');\n }\n\n this.debouncedOnInputChange = debounce_default()(this.debounce, function () {\n _this13.onInputChange();\n });\n\n this.debouncedQueryChange = debounce_default()(this.debounce, function (e) {\n _this13.handleQueryChange(e.target.value);\n });\n\n this.$on(\'handleOptionClick\', this.handleOptionSelect);\n this.$on(\'setSelected\', this.setSelected);\n },\n mounted: function mounted() {\n var _this14 = this;\n\n if (this.multiple && Array.isArray(this.value) && this.value.length > 0) {\n this.currentPlaceholder = \'\';\n }\n Object(resize_event_["addResizeListener"])(this.$el, this.handleResize);\n\n var reference = this.$refs.reference;\n if (reference && reference.$el) {\n var sizeMap = {\n medium: 36,\n small: 32,\n mini: 28\n };\n var input = reference.$el.querySelector(\'input\');\n this.initialInputHeight = input.getBoundingClientRect().height || sizeMap[this.selectSize];\n }\n if (this.remote && this.multiple) {\n this.resetInputHeight();\n }\n this.$nextTick(function () {\n if (reference && reference.$el) {\n _this14.inputWidth = reference.$el.getBoundingClientRect().width;\n }\n });\n this.setSelected();\n },\n beforeDestroy: function beforeDestroy() {\n if (this.$el && this.handleResize) Object(resize_event_["removeResizeListener"])(this.$el, this.handleResize);\n }\n});\n// CONCATENATED MODULE: ./packages/select/src/select.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_selectvue_type_script_lang_js_ = (selectvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/select/src/select.vue\n\n\n\n\n\n/* normalize component */\n\nvar select_component = normalizeComponent(\n src_selectvue_type_script_lang_js_,\n selectvue_type_template_id_0e4aade6_render,\n selectvue_type_template_id_0e4aade6_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var select_api; }\nselect_component.options.__file = "packages/select/src/select.vue"\n/* harmony default export */ var src_select = (select_component.exports);\n// CONCATENATED MODULE: ./packages/select/index.js\n\n\n/* istanbul ignore next */\nsrc_select.install = function (Vue) {\n Vue.component(src_select.name, src_select);\n};\n\n/* harmony default export */ var packages_select = (src_select);\n// CONCATENATED MODULE: ./packages/option/index.js\n\n\n/* istanbul ignore next */\nsrc_option.install = function (Vue) {\n Vue.component(src_option.name, src_option);\n};\n\n/* harmony default export */ var packages_option = (src_option);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/option-group.vue?vue&type=template&id=6685e5de&\nvar option_groupvue_type_template_id_6685e5de_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "ul",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-select-group__wrap"\n },\n [\n _c("li", { staticClass: "el-select-group__title" }, [\n _vm._v(_vm._s(_vm.label))\n ]),\n _c("li", [\n _c("ul", { staticClass: "el-select-group" }, [_vm._t("default")], 2)\n ])\n ]\n )\n}\nvar option_groupvue_type_template_id_6685e5de_staticRenderFns = []\noption_groupvue_type_template_id_6685e5de_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/select/src/option-group.vue?vue&type=template&id=6685e5de&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/option-group.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ var option_groupvue_type_script_lang_js_ = ({\n mixins: [emitter_default.a],\n\n name: \'ElOptionGroup\',\n\n componentName: \'ElOptionGroup\',\n\n props: {\n label: String,\n disabled: {\n type: Boolean,\n default: false\n }\n },\n\n data: function data() {\n return {\n visible: true\n };\n },\n\n\n watch: {\n disabled: function disabled(val) {\n this.broadcast(\'ElOption\', \'handleGroupDisabled\', val);\n }\n },\n\n methods: {\n queryChange: function queryChange() {\n this.visible = this.$children && Array.isArray(this.$children) && this.$children.some(function (option) {\n return option.visible === true;\n });\n }\n },\n\n created: function created() {\n this.$on(\'queryChange\', this.queryChange);\n },\n mounted: function mounted() {\n if (this.disabled) {\n this.broadcast(\'ElOption\', \'handleGroupDisabled\', this.disabled);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/select/src/option-group.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_option_groupvue_type_script_lang_js_ = (option_groupvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/select/src/option-group.vue\n\n\n\n\n\n/* normalize component */\n\nvar option_group_component = normalizeComponent(\n src_option_groupvue_type_script_lang_js_,\n option_groupvue_type_template_id_6685e5de_render,\n option_groupvue_type_template_id_6685e5de_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var option_group_api; }\noption_group_component.options.__file = "packages/select/src/option-group.vue"\n/* harmony default export */ var option_group = (option_group_component.exports);\n// CONCATENATED MODULE: ./packages/option-group/index.js\n\n\n/* istanbul ignore next */\noption_group.install = function (Vue) {\n Vue.component(option_group.name, option_group);\n};\n\n/* harmony default export */ var packages_option_group = (option_group);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/button/src/button.vue?vue&type=template&id=ca859fb4&\nvar buttonvue_type_template_id_ca859fb4_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "button",\n {\n staticClass: "el-button",\n class: [\n _vm.type ? "el-button--" + _vm.type : "",\n _vm.buttonSize ? "el-button--" + _vm.buttonSize : "",\n {\n "is-disabled": _vm.buttonDisabled,\n "is-loading": _vm.loading,\n "is-plain": _vm.plain,\n "is-round": _vm.round,\n "is-circle": _vm.circle\n }\n ],\n attrs: {\n disabled: _vm.buttonDisabled || _vm.loading,\n autofocus: _vm.autofocus,\n type: _vm.nativeType\n },\n on: { click: _vm.handleClick }\n },\n [\n _vm.loading ? _c("i", { staticClass: "el-icon-loading" }) : _vm._e(),\n _vm.icon && !_vm.loading ? _c("i", { class: _vm.icon }) : _vm._e(),\n _vm.$slots.default ? _c("span", [_vm._t("default")], 2) : _vm._e()\n ]\n )\n}\nvar buttonvue_type_template_id_ca859fb4_staticRenderFns = []\nbuttonvue_type_template_id_ca859fb4_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/button/src/button.vue?vue&type=template&id=ca859fb4&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/button/src/button.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/* harmony default export */ var buttonvue_type_script_lang_js_ = ({\n name: \'ElButton\',\n\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n\n props: {\n type: {\n type: String,\n default: \'default\'\n },\n size: String,\n icon: {\n type: String,\n default: \'\'\n },\n nativeType: {\n type: String,\n default: \'button\'\n },\n loading: Boolean,\n disabled: Boolean,\n plain: Boolean,\n autofocus: Boolean,\n round: Boolean,\n circle: Boolean\n },\n\n computed: {\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n buttonSize: function buttonSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n buttonDisabled: function buttonDisabled() {\n return this.$options.propsData.hasOwnProperty(\'disabled\') ? this.disabled : (this.elForm || {}).disabled;\n }\n },\n\n methods: {\n handleClick: function handleClick(evt) {\n this.$emit(\'click\', evt);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/button/src/button.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_buttonvue_type_script_lang_js_ = (buttonvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/button/src/button.vue\n\n\n\n\n\n/* normalize component */\n\nvar button_component = normalizeComponent(\n src_buttonvue_type_script_lang_js_,\n buttonvue_type_template_id_ca859fb4_render,\n buttonvue_type_template_id_ca859fb4_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var button_api; }\nbutton_component.options.__file = "packages/button/src/button.vue"\n/* harmony default export */ var src_button = (button_component.exports);\n// CONCATENATED MODULE: ./packages/button/index.js\n\n\n/* istanbul ignore next */\nsrc_button.install = function (Vue) {\n Vue.component(src_button.name, src_button);\n};\n\n/* harmony default export */ var packages_button = (src_button);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/button/src/button-group.vue?vue&type=template&id=3d8661d0&\nvar button_groupvue_type_template_id_3d8661d0_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("div", { staticClass: "el-button-group" }, [_vm._t("default")], 2)\n}\nvar button_groupvue_type_template_id_3d8661d0_staticRenderFns = []\nbutton_groupvue_type_template_id_3d8661d0_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/button/src/button-group.vue?vue&type=template&id=3d8661d0&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/button/src/button-group.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n\n/* harmony default export */ var button_groupvue_type_script_lang_js_ = ({\n name: \'ElButtonGroup\'\n});\n// CONCATENATED MODULE: ./packages/button/src/button-group.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_button_groupvue_type_script_lang_js_ = (button_groupvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/button/src/button-group.vue\n\n\n\n\n\n/* normalize component */\n\nvar button_group_component = normalizeComponent(\n src_button_groupvue_type_script_lang_js_,\n button_groupvue_type_template_id_3d8661d0_render,\n button_groupvue_type_template_id_3d8661d0_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var button_group_api; }\nbutton_group_component.options.__file = "packages/button/src/button-group.vue"\n/* harmony default export */ var button_group = (button_group_component.exports);\n// CONCATENATED MODULE: ./packages/button-group/index.js\n\n\n/* istanbul ignore next */\nbutton_group.install = function (Vue) {\n Vue.component(button_group.name, button_group);\n};\n\n/* harmony default export */ var packages_button_group = (button_group);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/table/src/table.vue?vue&type=template&id=493fe34e&\nvar tablevue_type_template_id_493fe34e_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 staticClass: "el-table",\n class: [\n {\n "el-table--fit": _vm.fit,\n "el-table--striped": _vm.stripe,\n "el-table--border": _vm.border || _vm.isGroup,\n "el-table--hidden": _vm.isHidden,\n "el-table--group": _vm.isGroup,\n "el-table--fluid-height": _vm.maxHeight,\n "el-table--scrollable-x": _vm.layout.scrollX,\n "el-table--scrollable-y": _vm.layout.scrollY,\n "el-table--enable-row-hover": !_vm.store.states.isComplex,\n "el-table--enable-row-transition":\n (_vm.store.states.data || []).length !== 0 &&\n (_vm.store.states.data || []).length < 100\n },\n _vm.tableSize ? "el-table--" + _vm.tableSize : ""\n ],\n on: {\n mouseleave: function($event) {\n _vm.handleMouseLeave($event)\n }\n }\n },\n [\n _c(\n "div",\n { ref: "hiddenColumns", staticClass: "hidden-columns" },\n [_vm._t("default")],\n 2\n ),\n _vm.showHeader\n ? _c(\n "div",\n {\n directives: [\n {\n name: "mousewheel",\n rawName: "v-mousewheel",\n value: _vm.handleHeaderFooterMousewheel,\n expression: "handleHeaderFooterMousewheel"\n }\n ],\n ref: "headerWrapper",\n staticClass: "el-table__header-wrapper"\n },\n [\n _c("table-header", {\n ref: "tableHeader",\n style: {\n width: _vm.layout.bodyWidth ? _vm.layout.bodyWidth + "px" : ""\n },\n attrs: {\n store: _vm.store,\n border: _vm.border,\n "default-sort": _vm.defaultSort\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _c(\n "div",\n {\n ref: "bodyWrapper",\n staticClass: "el-table__body-wrapper",\n class: [\n _vm.layout.scrollX\n ? "is-scrolling-" + _vm.scrollPosition\n : "is-scrolling-none"\n ],\n style: [_vm.bodyHeight]\n },\n [\n _c("table-body", {\n style: {\n width: _vm.bodyWidth\n },\n attrs: {\n context: _vm.context,\n store: _vm.store,\n stripe: _vm.stripe,\n "row-class-name": _vm.rowClassName,\n "row-style": _vm.rowStyle,\n highlight: _vm.highlightCurrentRow\n }\n }),\n !_vm.data || _vm.data.length === 0\n ? _c(\n "div",\n {\n ref: "emptyBlock",\n staticClass: "el-table__empty-block",\n style: _vm.emptyBlockStyle\n },\n [\n _c(\n "span",\n { staticClass: "el-table__empty-text" },\n [\n _vm._t("empty", [\n _vm._v(\n _vm._s(_vm.emptyText || _vm.t("el.table.emptyText"))\n )\n ])\n ],\n 2\n )\n ]\n )\n : _vm._e(),\n _vm.$slots.append\n ? _c(\n "div",\n {\n ref: "appendWrapper",\n staticClass: "el-table__append-wrapper"\n },\n [_vm._t("append")],\n 2\n )\n : _vm._e()\n ],\n 1\n ),\n _vm.showSummary\n ? _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.data && _vm.data.length > 0,\n expression: "data && data.length > 0"\n },\n {\n name: "mousewheel",\n rawName: "v-mousewheel",\n value: _vm.handleHeaderFooterMousewheel,\n expression: "handleHeaderFooterMousewheel"\n }\n ],\n ref: "footerWrapper",\n staticClass: "el-table__footer-wrapper"\n },\n [\n _c("table-footer", {\n style: {\n width: _vm.layout.bodyWidth ? _vm.layout.bodyWidth + "px" : ""\n },\n attrs: {\n store: _vm.store,\n border: _vm.border,\n "sum-text": _vm.sumText || _vm.t("el.table.sumText"),\n "summary-method": _vm.summaryMethod,\n "default-sort": _vm.defaultSort\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _vm.fixedColumns.length > 0\n ? _c(\n "div",\n {\n directives: [\n {\n name: "mousewheel",\n rawName: "v-mousewheel",\n value: _vm.handleFixedMousewheel,\n expression: "handleFixedMousewheel"\n }\n ],\n ref: "fixedWrapper",\n staticClass: "el-table__fixed",\n style: [\n {\n width: _vm.layout.fixedWidth\n ? _vm.layout.fixedWidth + "px"\n : ""\n },\n _vm.fixedHeight\n ]\n },\n [\n _vm.showHeader\n ? _c(\n "div",\n {\n ref: "fixedHeaderWrapper",\n staticClass: "el-table__fixed-header-wrapper"\n },\n [\n _c("table-header", {\n ref: "fixedTableHeader",\n style: {\n width: _vm.bodyWidth\n },\n attrs: {\n fixed: "left",\n border: _vm.border,\n store: _vm.store\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _c(\n "div",\n {\n ref: "fixedBodyWrapper",\n staticClass: "el-table__fixed-body-wrapper",\n style: [\n {\n top: _vm.layout.headerHeight + "px"\n },\n _vm.fixedBodyHeight\n ]\n },\n [\n _c("table-body", {\n style: {\n width: _vm.bodyWidth\n },\n attrs: {\n fixed: "left",\n store: _vm.store,\n stripe: _vm.stripe,\n highlight: _vm.highlightCurrentRow,\n "row-class-name": _vm.rowClassName,\n "row-style": _vm.rowStyle\n }\n }),\n _vm.$slots.append\n ? _c("div", {\n staticClass: "el-table__append-gutter",\n style: { height: _vm.layout.appendHeight + "px" }\n })\n : _vm._e()\n ],\n 1\n ),\n _vm.showSummary\n ? _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.data && _vm.data.length > 0,\n expression: "data && data.length > 0"\n }\n ],\n ref: "fixedFooterWrapper",\n staticClass: "el-table__fixed-footer-wrapper"\n },\n [\n _c("table-footer", {\n style: {\n width: _vm.bodyWidth\n },\n attrs: {\n fixed: "left",\n border: _vm.border,\n "sum-text": _vm.sumText || _vm.t("el.table.sumText"),\n "summary-method": _vm.summaryMethod,\n store: _vm.store\n }\n })\n ],\n 1\n )\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm.rightFixedColumns.length > 0\n ? _c(\n "div",\n {\n directives: [\n {\n name: "mousewheel",\n rawName: "v-mousewheel",\n value: _vm.handleFixedMousewheel,\n expression: "handleFixedMousewheel"\n }\n ],\n ref: "rightFixedWrapper",\n staticClass: "el-table__fixed-right",\n style: [\n {\n width: _vm.layout.rightFixedWidth\n ? _vm.layout.rightFixedWidth + "px"\n : "",\n right: _vm.layout.scrollY\n ? (_vm.border\n ? _vm.layout.gutterWidth\n : _vm.layout.gutterWidth || 0) + "px"\n : ""\n },\n _vm.fixedHeight\n ]\n },\n [\n _vm.showHeader\n ? _c(\n "div",\n {\n ref: "rightFixedHeaderWrapper",\n staticClass: "el-table__fixed-header-wrapper"\n },\n [\n _c("table-header", {\n ref: "rightFixedTableHeader",\n style: {\n width: _vm.bodyWidth\n },\n attrs: {\n fixed: "right",\n border: _vm.border,\n store: _vm.store\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _c(\n "div",\n {\n ref: "rightFixedBodyWrapper",\n staticClass: "el-table__fixed-body-wrapper",\n style: [\n {\n top: _vm.layout.headerHeight + "px"\n },\n _vm.fixedBodyHeight\n ]\n },\n [\n _c("table-body", {\n style: {\n width: _vm.bodyWidth\n },\n attrs: {\n fixed: "right",\n store: _vm.store,\n stripe: _vm.stripe,\n "row-class-name": _vm.rowClassName,\n "row-style": _vm.rowStyle,\n highlight: _vm.highlightCurrentRow\n }\n }),\n _vm.$slots.append\n ? _c("div", {\n staticClass: "el-table__append-gutter",\n style: { height: _vm.layout.appendHeight + "px" }\n })\n : _vm._e()\n ],\n 1\n ),\n _vm.showSummary\n ? _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.data && _vm.data.length > 0,\n expression: "data && data.length > 0"\n }\n ],\n ref: "rightFixedFooterWrapper",\n staticClass: "el-table__fixed-footer-wrapper"\n },\n [\n _c("table-footer", {\n style: {\n width: _vm.bodyWidth\n },\n attrs: {\n fixed: "right",\n border: _vm.border,\n "sum-text": _vm.sumText || _vm.t("el.table.sumText"),\n "summary-method": _vm.summaryMethod,\n store: _vm.store\n }\n })\n ],\n 1\n )\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm.rightFixedColumns.length > 0\n ? _c("div", {\n ref: "rightFixedPatch",\n staticClass: "el-table__fixed-right-patch",\n style: {\n width: _vm.layout.scrollY ? _vm.layout.gutterWidth + "px" : "0",\n height: _vm.layout.headerHeight + "px"\n }\n })\n : _vm._e(),\n _c("div", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.resizeProxyVisible,\n expression: "resizeProxyVisible"\n }\n ],\n ref: "resizeProxy",\n staticClass: "el-table__column-resize-proxy"\n })\n ]\n )\n}\nvar tablevue_type_template_id_493fe34e_staticRenderFns = []\ntablevue_type_template_id_493fe34e_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/table/src/table.vue?vue&type=template&id=493fe34e&\n\n// EXTERNAL MODULE: external "element-ui/lib/checkbox"\nvar checkbox_ = __webpack_require__(14);\nvar checkbox_default = /*#__PURE__*/__webpack_require__.n(checkbox_);\n\n// EXTERNAL MODULE: external "throttle-debounce"\nvar external_throttle_debounce_ = __webpack_require__(36);\n\n// EXTERNAL MODULE: external "normalize-wheel"\nvar external_normalize_wheel_ = __webpack_require__(39);\nvar external_normalize_wheel_default = /*#__PURE__*/__webpack_require__.n(external_normalize_wheel_);\n\n// CONCATENATED MODULE: ./src/directives/mousewheel.js\n\n\nvar isFirefox = typeof navigator !== \'undefined\' && navigator.userAgent.toLowerCase().indexOf(\'firefox\') > -1;\n\nvar mousewheel_mousewheel = function mousewheel(element, callback) {\n if (element && element.addEventListener) {\n element.addEventListener(isFirefox ? \'DOMMouseScroll\' : \'mousewheel\', function (event) {\n var normalized = external_normalize_wheel_default()(event);\n callback && callback.apply(this, [event, normalized]);\n });\n }\n};\n\n/* harmony default export */ var directives_mousewheel = ({\n bind: function bind(el, binding) {\n mousewheel_mousewheel(el, binding.value);\n }\n});\n// EXTERNAL MODULE: external "vue"\nvar external_vue_ = __webpack_require__(6);\nvar external_vue_default = /*#__PURE__*/__webpack_require__.n(external_vue_);\n\n// CONCATENATED MODULE: ./packages/table/src/util.js\nvar util_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\n\n\nvar getCell = function getCell(event) {\n var cell = event.target;\n\n while (cell && cell.tagName.toUpperCase() !== \'HTML\') {\n if (cell.tagName.toUpperCase() === \'TD\') {\n return cell;\n }\n cell = cell.parentNode;\n }\n\n return null;\n};\n\nvar util_isObject = function isObject(obj) {\n return obj !== null && (typeof obj === \'undefined\' ? \'undefined\' : util_typeof(obj)) === \'object\';\n};\n\nvar util_orderBy = function orderBy(array, sortKey, reverse, sortMethod, sortBy) {\n if (!sortKey && !sortMethod && (!sortBy || Array.isArray(sortBy) && !sortBy.length)) {\n return array;\n }\n if (typeof reverse === \'string\') {\n reverse = reverse === \'descending\' ? -1 : 1;\n } else {\n reverse = reverse && reverse < 0 ? -1 : 1;\n }\n var getKey = sortMethod ? null : function (value, index) {\n if (sortBy) {\n if (!Array.isArray(sortBy)) {\n sortBy = [sortBy];\n }\n return sortBy.map(function (by) {\n if (typeof by === \'string\') {\n return Object(util_["getValueByPath"])(value, by);\n } else {\n return by(value, index, array);\n }\n });\n }\n if (sortKey !== \'$key\') {\n if (util_isObject(value) && \'$value\' in value) value = value.$value;\n }\n return [util_isObject(value) ? Object(util_["getValueByPath"])(value, sortKey) : value];\n };\n var compare = function compare(a, b) {\n if (sortMethod) {\n return sortMethod(a.value, b.value);\n }\n for (var i = 0, len = a.key.length; i < len; i++) {\n if (a.key[i] < b.key[i]) {\n return -1;\n }\n if (a.key[i] > b.key[i]) {\n return 1;\n }\n }\n return 0;\n };\n return array.map(function (value, index) {\n return {\n value: value,\n index: index,\n key: getKey ? getKey(value, index) : null\n };\n }).sort(function (a, b) {\n var order = compare(a, b);\n if (!order) {\n // make stable https://en.wikipedia.org/wiki/Sorting_algorithm#Stability\n order = a.index - b.index;\n }\n return order * reverse;\n }).map(function (item) {\n return item.value;\n });\n};\n\nvar getColumnById = function getColumnById(table, columnId) {\n var column = null;\n table.columns.forEach(function (item) {\n if (item.id === columnId) {\n column = item;\n }\n });\n return column;\n};\n\nvar getColumnByKey = function getColumnByKey(table, columnKey) {\n var column = null;\n for (var i = 0; i < table.columns.length; i++) {\n var item = table.columns[i];\n if (item.columnKey === columnKey) {\n column = item;\n break;\n }\n }\n return column;\n};\n\nvar getColumnByCell = function getColumnByCell(table, cell) {\n var matches = (cell.className || \'\').match(/el-table_[^\\s]+/gm);\n if (matches) {\n return getColumnById(table, matches[0]);\n }\n return null;\n};\n\nvar getRowIdentity = function getRowIdentity(row, rowKey) {\n if (!row) throw new Error(\'row is required when get row identity\');\n if (typeof rowKey === \'string\') {\n if (rowKey.indexOf(\'.\') < 0) {\n return row[rowKey];\n }\n var key = rowKey.split(\'.\');\n var current = row;\n for (var i = 0; i < key.length; i++) {\n current = current[key[i]];\n }\n return current;\n } else if (typeof rowKey === \'function\') {\n return rowKey.call(null, row);\n }\n};\n\nvar getKeysMap = function getKeysMap(array, rowKey) {\n var arrayMap = {};\n (array || []).forEach(function (row, index) {\n arrayMap[getRowIdentity(row, rowKey)] = { row: row, index: index };\n });\n return arrayMap;\n};\n\nfunction hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction mergeOptions(defaults, config) {\n var options = {};\n var key = void 0;\n for (key in defaults) {\n options[key] = defaults[key];\n }\n for (key in config) {\n if (hasOwn(config, key)) {\n var value = config[key];\n if (typeof value !== \'undefined\') {\n options[key] = value;\n }\n }\n }\n return options;\n}\n\nfunction parseWidth(width) {\n if (width !== undefined) {\n width = parseInt(width, 10);\n if (isNaN(width)) {\n width = null;\n }\n }\n return width;\n}\n\nfunction parseMinWidth(minWidth) {\n if (typeof minWidth !== \'undefined\') {\n minWidth = parseWidth(minWidth);\n if (isNaN(minWidth)) {\n minWidth = 80;\n }\n }\n return minWidth;\n};\n\nfunction parseHeight(height) {\n if (typeof height === \'number\') {\n return height;\n }\n if (typeof height === \'string\') {\n if (/^\\d+(?:px)?$/.test(height)) {\n return parseInt(height, 10);\n } else {\n return height;\n }\n }\n return null;\n}\n\n// https://github.com/reduxjs/redux/blob/master/src/compose.js\nfunction compose() {\n for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n if (funcs.length === 0) {\n return function (arg) {\n return arg;\n };\n }\n if (funcs.length === 1) {\n return funcs[0];\n }\n return funcs.reduce(function (a, b) {\n return function () {\n return a(b.apply(undefined, arguments));\n };\n });\n}\n\nfunction toggleRowStatus(statusArr, row, newVal) {\n var changed = false;\n var index = statusArr.indexOf(row);\n var included = index !== -1;\n\n var addRow = function addRow() {\n statusArr.push(row);\n changed = true;\n };\n var removeRow = function removeRow() {\n statusArr.splice(index, 1);\n changed = true;\n };\n\n if (typeof newVal === \'boolean\') {\n if (newVal && !included) {\n addRow();\n } else if (!newVal && included) {\n removeRow();\n }\n } else {\n if (included) {\n removeRow();\n } else {\n addRow();\n }\n }\n return changed;\n}\n\nfunction walkTreeNode(root, cb) {\n var childrenKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \'children\';\n var lazyKey = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \'hasChildren\';\n\n var isNil = function isNil(array) {\n return !(Array.isArray(array) && array.length);\n };\n\n function _walker(parent, children, level) {\n cb(parent, children, level);\n children.forEach(function (item) {\n if (item[lazyKey]) {\n cb(item, null, level + 1);\n return;\n }\n var children = item[childrenKey];\n if (!isNil(children)) {\n _walker(item, children, level + 1);\n }\n });\n }\n\n root.forEach(function (item) {\n if (item[lazyKey]) {\n cb(item, null, 0);\n return;\n }\n var children = item[childrenKey];\n if (!isNil(children)) {\n _walker(item, children, 0);\n }\n });\n}\n// CONCATENATED MODULE: ./packages/table/src/store/expand.js\n\n\n/* harmony default export */ var expand = ({\n data: function data() {\n return {\n states: {\n defaultExpandAll: false,\n expandRows: []\n }\n };\n },\n\n\n methods: {\n updateExpandRows: function updateExpandRows() {\n var _states = this.states,\n _states$data = _states.data,\n data = _states$data === undefined ? [] : _states$data,\n rowKey = _states.rowKey,\n defaultExpandAll = _states.defaultExpandAll,\n expandRows = _states.expandRows;\n\n if (defaultExpandAll) {\n this.states.expandRows = data.slice();\n } else if (rowKey) {\n // TODO:这里的代码可以优化\n var expandRowsMap = getKeysMap(expandRows, rowKey);\n this.states.expandRows = data.reduce(function (prev, row) {\n var rowId = getRowIdentity(row, rowKey);\n var rowInfo = expandRowsMap[rowId];\n if (rowInfo) {\n prev.push(row);\n }\n return prev;\n }, []);\n } else {\n this.states.expandRows = [];\n }\n },\n toggleRowExpansion: function toggleRowExpansion(row, expanded) {\n var changed = toggleRowStatus(this.states.expandRows, row, expanded);\n if (changed) {\n this.table.$emit(\'expand-change\', row, this.states.expandRows.slice());\n this.scheduleLayout();\n }\n },\n setExpandRowKeys: function setExpandRowKeys(rowKeys) {\n this.assertRowKey();\n // TODO:这里的代码可以优化\n var _states2 = this.states,\n data = _states2.data,\n rowKey = _states2.rowKey;\n\n var keysMap = getKeysMap(data, rowKey);\n this.states.expandRows = rowKeys.reduce(function (prev, cur) {\n var info = keysMap[cur];\n if (info) {\n prev.push(info.row);\n }\n return prev;\n }, []);\n },\n isRowExpanded: function isRowExpanded(row) {\n var _states3 = this.states,\n _states3$expandRows = _states3.expandRows,\n expandRows = _states3$expandRows === undefined ? [] : _states3$expandRows,\n rowKey = _states3.rowKey;\n\n if (rowKey) {\n var expandMap = getKeysMap(expandRows, rowKey);\n return !!expandMap[getRowIdentity(row, rowKey)];\n }\n return expandRows.indexOf(row) !== -1;\n }\n }\n});\n// CONCATENATED MODULE: ./packages/table/src/store/current.js\n\n\n\n/* harmony default export */ var store_current = ({\n data: function data() {\n return {\n states: {\n // 不可响应的,设置 currentRowKey 时,data 不一定存在,也许无法算出正确的 currentRow\n // 把该值缓存一下,当用户点击修改 currentRow 时,把该值重置为 null\n _currentRowKey: null,\n currentRow: null\n }\n };\n },\n\n\n methods: {\n setCurrentRowKey: function setCurrentRowKey(key) {\n this.assertRowKey();\n this.states._currentRowKey = key;\n this.setCurrentRowByKey(key);\n },\n restoreCurrentRowKey: function restoreCurrentRowKey() {\n this.states._currentRowKey = null;\n },\n setCurrentRowByKey: function setCurrentRowByKey(key) {\n var states = this.states;\n var _states$data = states.data,\n data = _states$data === undefined ? [] : _states$data,\n rowKey = states.rowKey;\n\n var currentRow = null;\n if (rowKey) {\n currentRow = Object(util_["arrayFind"])(data, function (item) {\n return getRowIdentity(item, rowKey) === key;\n });\n }\n states.currentRow = currentRow;\n },\n updateCurrentRow: function updateCurrentRow(currentRow) {\n var states = this.states,\n table = this.table;\n\n var oldCurrentRow = states.currentRow;\n if (currentRow && currentRow !== oldCurrentRow) {\n states.currentRow = currentRow;\n table.$emit(\'current-change\', currentRow, oldCurrentRow);\n return;\n }\n if (!currentRow && oldCurrentRow) {\n states.currentRow = null;\n table.$emit(\'current-change\', null, oldCurrentRow);\n }\n },\n updateCurrentRowData: function updateCurrentRowData() {\n var states = this.states,\n table = this.table;\n var rowKey = states.rowKey,\n _currentRowKey = states._currentRowKey;\n // data 为 null 时,解构时的默认值会被忽略\n\n var data = states.data || [];\n var oldCurrentRow = states.currentRow;\n\n // 当 currentRow 不在 data 中时尝试更新数据\n if (data.indexOf(oldCurrentRow) === -1 && oldCurrentRow) {\n if (rowKey) {\n var currentRowKey = getRowIdentity(oldCurrentRow, rowKey);\n this.setCurrentRowByKey(currentRowKey);\n } else {\n states.currentRow = null;\n }\n if (states.currentRow === null) {\n table.$emit(\'current-change\', null, oldCurrentRow);\n }\n } else if (_currentRowKey) {\n // 把初始时下设置的 rowKey 转化成 rowData\n this.setCurrentRowByKey(_currentRowKey);\n this.restoreCurrentRowKey();\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/table/src/store/tree.js\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\n\n/* harmony default export */ var tree = ({\n data: function data() {\n return {\n states: {\n // defaultExpandAll 存在于 expand.js 中,这里不重复添加\n // 在展开行中,expandRowKeys 会被转化成 expandRows,expandRowKeys 这个属性只是记录了 TreeTable 行的展开\n // TODO: 拆分为独立的 TreeTable,统一用法\n expandRowKeys: [],\n treeData: {},\n indent: 16,\n lazy: false,\n lazyTreeNodeMap: {},\n lazyColumnIdentifier: \'hasChildren\',\n childrenColumnName: \'children\'\n }\n };\n },\n\n\n computed: {\n // 嵌入型的数据,watch 无法是检测到变化 https://github.com/ElemeFE/element/issues/14998\n // TODO: 使用 computed 解决该问题,是否会造成性能问题?\n // @return { id: { level, children } }\n normalizedData: function normalizedData() {\n if (!this.states.rowKey) return {};\n var data = this.states.data || [];\n return this.normalize(data);\n },\n\n // @return { id: { children } }\n // 针对懒加载的情形,不处理嵌套数据\n normalizedLazyNode: function normalizedLazyNode() {\n var _states = this.states,\n rowKey = _states.rowKey,\n lazyTreeNodeMap = _states.lazyTreeNodeMap,\n lazyColumnIdentifier = _states.lazyColumnIdentifier;\n\n var keys = Object.keys(lazyTreeNodeMap);\n var res = {};\n if (!keys.length) return res;\n keys.forEach(function (key) {\n if (lazyTreeNodeMap[key].length) {\n var item = { children: [] };\n lazyTreeNodeMap[key].forEach(function (row) {\n var currentRowKey = getRowIdentity(row, rowKey);\n item.children.push(currentRowKey);\n if (row[lazyColumnIdentifier] && !res[currentRowKey]) {\n res[currentRowKey] = { children: [] };\n }\n });\n res[key] = item;\n }\n });\n return res;\n }\n },\n\n watch: {\n normalizedData: \'updateTreeData\',\n normalizedLazyNode: \'updateTreeData\'\n },\n\n methods: {\n normalize: function normalize(data) {\n var _states2 = this.states,\n childrenColumnName = _states2.childrenColumnName,\n lazyColumnIdentifier = _states2.lazyColumnIdentifier,\n rowKey = _states2.rowKey,\n lazy = _states2.lazy;\n\n var res = {};\n walkTreeNode(data, function (parent, children, level) {\n var parentId = getRowIdentity(parent, rowKey);\n if (Array.isArray(children)) {\n res[parentId] = {\n children: children.map(function (row) {\n return getRowIdentity(row, rowKey);\n }),\n level: level\n };\n } else if (lazy) {\n // 当 children 不存在且 lazy 为 true,该节点即为懒加载的节点\n res[parentId] = {\n children: [],\n lazy: true,\n level: level\n };\n }\n }, childrenColumnName, lazyColumnIdentifier);\n return res;\n },\n updateTreeData: function updateTreeData() {\n var nested = this.normalizedData;\n var normalizedLazyNode = this.normalizedLazyNode;\n var keys = Object.keys(nested);\n var newTreeData = {};\n if (keys.length) {\n var _states3 = this.states,\n oldTreeData = _states3.treeData,\n defaultExpandAll = _states3.defaultExpandAll,\n expandRowKeys = _states3.expandRowKeys,\n lazy = _states3.lazy;\n\n var rootLazyRowKeys = [];\n var getExpanded = function getExpanded(oldValue, key) {\n var included = defaultExpandAll || expandRowKeys && expandRowKeys.indexOf(key) !== -1;\n return !!(oldValue && oldValue.expanded || included);\n };\n // 合并 expanded 与 display,确保数据刷新后,状态不变\n keys.forEach(function (key) {\n var oldValue = oldTreeData[key];\n var newValue = _extends({}, nested[key]);\n newValue.expanded = getExpanded(oldValue, key);\n if (newValue.lazy) {\n var _ref = oldValue || {},\n _ref$loaded = _ref.loaded,\n loaded = _ref$loaded === undefined ? false : _ref$loaded,\n _ref$loading = _ref.loading,\n loading = _ref$loading === undefined ? false : _ref$loading;\n\n newValue.loaded = !!loaded;\n newValue.loading = !!loading;\n rootLazyRowKeys.push(key);\n }\n newTreeData[key] = newValue;\n });\n // 根据懒加载数据更新 treeData\n var lazyKeys = Object.keys(normalizedLazyNode);\n if (lazy && lazyKeys.length && rootLazyRowKeys.length) {\n lazyKeys.forEach(function (key) {\n var oldValue = oldTreeData[key];\n var lazyNodeChildren = normalizedLazyNode[key].children;\n if (rootLazyRowKeys.indexOf(key) !== -1) {\n // 懒加载的 root 节点,更新一下原有的数据,原来的 children 一定是空数组\n if (newTreeData[key].children.length !== 0) {\n throw new Error(\'[ElTable]children must be an empty array.\');\n }\n newTreeData[key].children = lazyNodeChildren;\n } else {\n var _ref2 = oldValue || {},\n _ref2$loaded = _ref2.loaded,\n loaded = _ref2$loaded === undefined ? false : _ref2$loaded,\n _ref2$loading = _ref2.loading,\n loading = _ref2$loading === undefined ? false : _ref2$loading;\n\n newTreeData[key] = {\n lazy: true,\n loaded: !!loaded,\n loading: !!loading,\n expanded: getExpanded(oldValue, key),\n children: lazyNodeChildren,\n level: \'\'\n };\n }\n });\n }\n }\n this.states.treeData = newTreeData;\n this.updateTableScrollY();\n },\n updateTreeExpandKeys: function updateTreeExpandKeys(value) {\n this.states.expandRowKeys = value;\n this.updateTreeData();\n },\n toggleTreeExpansion: function toggleTreeExpansion(row, expanded) {\n this.assertRowKey();\n\n var _states4 = this.states,\n rowKey = _states4.rowKey,\n treeData = _states4.treeData;\n\n var id = getRowIdentity(row, rowKey);\n var data = id && treeData[id];\n if (id && data && \'expanded\' in data) {\n var oldExpanded = data.expanded;\n expanded = typeof expanded === \'undefined\' ? !data.expanded : expanded;\n treeData[id].expanded = expanded;\n if (oldExpanded !== expanded) {\n this.table.$emit(\'expand-change\', row, expanded);\n }\n this.updateTableScrollY();\n }\n },\n loadOrToggle: function loadOrToggle(row) {\n this.assertRowKey();\n var _states5 = this.states,\n lazy = _states5.lazy,\n treeData = _states5.treeData,\n rowKey = _states5.rowKey;\n\n var id = getRowIdentity(row, rowKey);\n var data = treeData[id];\n if (lazy && data && \'loaded\' in data && !data.loaded) {\n this.loadData(row, id, data);\n } else {\n this.toggleTreeExpansion(row);\n }\n },\n loadData: function loadData(row, key, treeNode) {\n var _this = this;\n\n var load = this.table.load;\n var rawTreeData = this.states.treeData;\n\n if (load && !rawTreeData[key].loaded) {\n rawTreeData[key].loading = true;\n load(row, treeNode, function (data) {\n if (!Array.isArray(data)) {\n throw new Error(\'[ElTable] data must be an array\');\n }\n var _states6 = _this.states,\n lazyTreeNodeMap = _states6.lazyTreeNodeMap,\n treeData = _states6.treeData;\n\n treeData[key].loading = false;\n treeData[key].loaded = true;\n treeData[key].expanded = true;\n if (data.length) {\n _this.$set(lazyTreeNodeMap, key, data);\n }\n _this.table.$emit(\'expand-change\', row, true);\n });\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/table/src/store/watcher.js\n\n\n\n\n\n\n\nvar watcher_sortData = function sortData(data, states) {\n var sortingColumn = states.sortingColumn;\n if (!sortingColumn || typeof sortingColumn.sortable === \'string\') {\n return data;\n }\n return util_orderBy(data, states.sortProp, states.sortOrder, sortingColumn.sortMethod, sortingColumn.sortBy);\n};\n\nvar doFlattenColumns = function doFlattenColumns(columns) {\n var result = [];\n columns.forEach(function (column) {\n if (column.children) {\n result.push.apply(result, doFlattenColumns(column.children));\n } else {\n result.push(column);\n }\n });\n return result;\n};\n\n/* harmony default export */ var watcher = (external_vue_default.a.extend({\n data: function data() {\n return {\n states: {\n // 3.0 版本后要求必须设置该属性\n rowKey: null,\n\n // 渲染的数据来源,是对 table 中的 data 过滤排序后的结果\n data: [],\n\n // 是否包含固定列\n isComplex: false,\n\n // 列\n _columns: [], // 不可响应的\n originColumns: [],\n columns: [],\n fixedColumns: [],\n rightFixedColumns: [],\n leafColumns: [],\n fixedLeafColumns: [],\n rightFixedLeafColumns: [],\n leafColumnsLength: 0,\n fixedLeafColumnsLength: 0,\n rightFixedLeafColumnsLength: 0,\n\n // 选择\n isAllSelected: false,\n selection: [],\n reserveSelection: false,\n selectOnIndeterminate: false,\n selectable: null,\n\n // 过滤\n filters: {}, // 不可响应的\n filteredData: null,\n\n // 排序\n sortingColumn: null,\n sortProp: null,\n sortOrder: null,\n\n hoverRow: null\n }\n };\n },\n\n\n mixins: [expand, store_current, tree],\n\n methods: {\n // 检查 rowKey 是否存在\n assertRowKey: function assertRowKey() {\n var rowKey = this.states.rowKey;\n if (!rowKey) throw new Error(\'[ElTable] prop row-key is required\');\n },\n\n\n // 更新列\n updateColumns: function updateColumns() {\n var states = this.states;\n var _columns = states._columns || [];\n states.fixedColumns = _columns.filter(function (column) {\n return column.fixed === true || column.fixed === \'left\';\n });\n states.rightFixedColumns = _columns.filter(function (column) {\n return column.fixed === \'right\';\n });\n\n if (states.fixedColumns.length > 0 && _columns[0] && _columns[0].type === \'selection\' && !_columns[0].fixed) {\n _columns[0].fixed = true;\n states.fixedColumns.unshift(_columns[0]);\n }\n\n var notFixedColumns = _columns.filter(function (column) {\n return !column.fixed;\n });\n states.originColumns = [].concat(states.fixedColumns).concat(notFixedColumns).concat(states.rightFixedColumns);\n\n var leafColumns = doFlattenColumns(notFixedColumns);\n var fixedLeafColumns = doFlattenColumns(states.fixedColumns);\n var rightFixedLeafColumns = doFlattenColumns(states.rightFixedColumns);\n\n states.leafColumnsLength = leafColumns.length;\n states.fixedLeafColumnsLength = fixedLeafColumns.length;\n states.rightFixedLeafColumnsLength = rightFixedLeafColumns.length;\n\n states.columns = [].concat(fixedLeafColumns).concat(leafColumns).concat(rightFixedLeafColumns);\n states.isComplex = states.fixedColumns.length > 0 || states.rightFixedColumns.length > 0;\n },\n\n\n // 更新 DOM\n scheduleLayout: function scheduleLayout(needUpdateColumns) {\n if (needUpdateColumns) {\n this.updateColumns();\n }\n this.table.debouncedUpdateLayout();\n },\n\n\n // 选择\n isSelected: function isSelected(row) {\n var _states$selection = this.states.selection,\n selection = _states$selection === undefined ? [] : _states$selection;\n\n return selection.indexOf(row) > -1;\n },\n clearSelection: function clearSelection() {\n var states = this.states;\n states.isAllSelected = false;\n var oldSelection = states.selection;\n if (oldSelection.length) {\n states.selection = [];\n this.table.$emit(\'selection-change\', []);\n }\n },\n cleanSelection: function cleanSelection() {\n var states = this.states;\n var data = states.data,\n rowKey = states.rowKey,\n selection = states.selection;\n\n var deleted = void 0;\n if (rowKey) {\n deleted = [];\n var selectedMap = getKeysMap(selection, rowKey);\n var dataMap = getKeysMap(data, rowKey);\n for (var key in selectedMap) {\n if (selectedMap.hasOwnProperty(key) && !dataMap[key]) {\n deleted.push(selectedMap[key].row);\n }\n }\n } else {\n deleted = selection.filter(function (item) {\n return data.indexOf(item) === -1;\n });\n }\n if (deleted.length) {\n var newSelection = selection.filter(function (item) {\n return deleted.indexOf(item) === -1;\n });\n states.selection = newSelection;\n this.table.$emit(\'selection-change\', newSelection.slice());\n }\n },\n toggleRowSelection: function toggleRowSelection(row, selected) {\n var emitChange = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var changed = toggleRowStatus(this.states.selection, row, selected);\n if (changed) {\n var newSelection = (this.states.selection || []).slice();\n // 调用 API 修改选中值,不触发 select 事件\n if (emitChange) {\n this.table.$emit(\'select\', newSelection, row);\n }\n this.table.$emit(\'selection-change\', newSelection);\n }\n },\n _toggleAllSelection: function _toggleAllSelection() {\n var states = this.states;\n var _states$data = states.data,\n data = _states$data === undefined ? [] : _states$data,\n selection = states.selection;\n // when only some rows are selected (but not all), select or deselect all of them\n // depending on the value of selectOnIndeterminate\n\n var value = states.selectOnIndeterminate ? !states.isAllSelected : !(states.isAllSelected || selection.length);\n states.isAllSelected = value;\n\n var selectionChanged = false;\n data.forEach(function (row, index) {\n if (states.selectable) {\n if (states.selectable.call(null, row, index) && toggleRowStatus(selection, row, value)) {\n selectionChanged = true;\n }\n } else {\n if (toggleRowStatus(selection, row, value)) {\n selectionChanged = true;\n }\n }\n });\n\n if (selectionChanged) {\n this.table.$emit(\'selection-change\', selection ? selection.slice() : []);\n }\n this.table.$emit(\'select-all\', selection);\n },\n updateSelectionByRowKey: function updateSelectionByRowKey() {\n var states = this.states;\n var selection = states.selection,\n rowKey = states.rowKey,\n data = states.data;\n\n var selectedMap = getKeysMap(selection, rowKey);\n data.forEach(function (row) {\n var rowId = getRowIdentity(row, rowKey);\n var rowInfo = selectedMap[rowId];\n if (rowInfo) {\n selection[rowInfo.index] = row;\n }\n });\n },\n updateAllSelected: function updateAllSelected() {\n var states = this.states;\n var selection = states.selection,\n rowKey = states.rowKey,\n selectable = states.selectable;\n // data 为 null 时,解构时的默认值会被忽略\n\n var data = states.data || [];\n if (data.length === 0) {\n states.isAllSelected = false;\n return;\n }\n\n var selectedMap = void 0;\n if (rowKey) {\n selectedMap = getKeysMap(selection, rowKey);\n }\n var isSelected = function isSelected(row) {\n if (selectedMap) {\n return !!selectedMap[getRowIdentity(row, rowKey)];\n } else {\n return selection.indexOf(row) !== -1;\n }\n };\n var isAllSelected = true;\n var selectedCount = 0;\n for (var i = 0, j = data.length; i < j; i++) {\n var item = data[i];\n var isRowSelectable = selectable && selectable.call(null, item, i);\n if (!isSelected(item)) {\n if (!selectable || isRowSelectable) {\n isAllSelected = false;\n break;\n }\n } else {\n selectedCount++;\n }\n }\n\n if (selectedCount === 0) isAllSelected = false;\n states.isAllSelected = isAllSelected;\n },\n\n\n // 过滤与排序\n updateFilters: function updateFilters(columns, values) {\n if (!Array.isArray(columns)) {\n columns = [columns];\n }\n var states = this.states;\n var filters = {};\n columns.forEach(function (col) {\n states.filters[col.id] = values;\n filters[col.columnKey || col.id] = values;\n });\n\n return filters;\n },\n updateSort: function updateSort(column, prop, order) {\n if (this.states.sortingColumn && this.states.sortingColumn !== column) {\n this.states.sortingColumn.order = null;\n }\n this.states.sortingColumn = column;\n this.states.sortProp = prop;\n this.states.sortOrder = order;\n },\n execFilter: function execFilter() {\n var _this = this;\n\n var states = this.states;\n var _data = states._data,\n filters = states.filters;\n\n var data = _data;\n\n Object.keys(filters).forEach(function (columnId) {\n var values = states.filters[columnId];\n if (!values || values.length === 0) return;\n var column = getColumnById(_this.states, columnId);\n if (column && column.filterMethod) {\n data = data.filter(function (row) {\n return values.some(function (value) {\n return column.filterMethod.call(null, value, row, column);\n });\n });\n }\n });\n\n states.filteredData = data;\n },\n execSort: function execSort() {\n var states = this.states;\n states.data = watcher_sortData(states.filteredData, states);\n },\n\n\n // 根据 filters 与 sort 去过滤 data\n execQuery: function execQuery(ignore) {\n if (!(ignore && ignore.filter)) {\n this.execFilter();\n }\n this.execSort();\n },\n clearFilter: function clearFilter(columnKeys) {\n var states = this.states;\n var _table$$refs = this.table.$refs,\n tableHeader = _table$$refs.tableHeader,\n fixedTableHeader = _table$$refs.fixedTableHeader,\n rightFixedTableHeader = _table$$refs.rightFixedTableHeader;\n\n\n var panels = {};\n if (tableHeader) panels = merge_default()(panels, tableHeader.filterPanels);\n if (fixedTableHeader) panels = merge_default()(panels, fixedTableHeader.filterPanels);\n if (rightFixedTableHeader) panels = merge_default()(panels, rightFixedTableHeader.filterPanels);\n\n var keys = Object.keys(panels);\n if (!keys.length) return;\n\n if (typeof columnKeys === \'string\') {\n columnKeys = [columnKeys];\n }\n\n if (Array.isArray(columnKeys)) {\n var columns = columnKeys.map(function (key) {\n return getColumnByKey(states, key);\n });\n keys.forEach(function (key) {\n var column = columns.find(function (col) {\n return col.id === key;\n });\n if (column) {\n // TODO: 优化这里的代码\n panels[key].filteredValue = [];\n }\n });\n this.commit(\'filterChange\', {\n column: columns,\n values: [],\n silent: true,\n multi: true\n });\n } else {\n keys.forEach(function (key) {\n // TODO: 优化这里的代码\n panels[key].filteredValue = [];\n });\n\n states.filters = {};\n this.commit(\'filterChange\', {\n column: {},\n values: [],\n silent: true\n });\n }\n },\n clearSort: function clearSort() {\n var states = this.states;\n if (!states.sortingColumn) return;\n\n this.updateSort(null, null, null);\n this.commit(\'changeSortCondition\', {\n silent: true\n });\n },\n\n\n // 适配层,expand-row-keys 在 Expand 与 TreeTable 中都有使用\n setExpandRowKeysAdapter: function setExpandRowKeysAdapter(val) {\n // 这里会触发额外的计算,但为了兼容性,暂时这么做\n this.setExpandRowKeys(val);\n this.updateTreeExpandKeys(val);\n },\n\n\n // 展开行与 TreeTable 都要使用\n toggleRowExpansionAdapter: function toggleRowExpansionAdapter(row, expanded) {\n var hasExpandColumn = this.states.columns.some(function (_ref) {\n var type = _ref.type;\n return type === \'expand\';\n });\n if (hasExpandColumn) {\n this.toggleRowExpansion(row, expanded);\n } else {\n this.toggleTreeExpansion(row, expanded);\n }\n }\n }\n}));\n// CONCATENATED MODULE: ./packages/table/src/store/index.js\n\n\n\n\nwatcher.prototype.mutations = {\n setData: function setData(states, data) {\n var dataInstanceChanged = states._data !== data;\n states._data = data;\n\n this.execQuery();\n // 数据变化,更新部分数据。\n // 没有使用 computed,而是手动更新部分数据 https://github.com/vuejs/vue/issues/6660#issuecomment-331417140\n this.updateCurrentRowData();\n this.updateExpandRows();\n if (states.reserveSelection) {\n this.assertRowKey();\n this.updateSelectionByRowKey();\n } else {\n if (dataInstanceChanged) {\n this.clearSelection();\n } else {\n this.cleanSelection();\n }\n }\n this.updateAllSelected();\n\n this.updateTableScrollY();\n },\n insertColumn: function insertColumn(states, column, index, parent) {\n var array = states._columns;\n if (parent) {\n array = parent.children;\n if (!array) array = parent.children = [];\n }\n\n if (typeof index !== \'undefined\') {\n array.splice(index, 0, column);\n } else {\n array.push(column);\n }\n\n if (column.type === \'selection\') {\n states.selectable = column.selectable;\n states.reserveSelection = column.reserveSelection;\n }\n\n if (this.table.$ready) {\n this.updateColumns(); // hack for dynamics insert column\n this.scheduleLayout();\n }\n },\n removeColumn: function removeColumn(states, column, parent) {\n var array = states._columns;\n if (parent) {\n array = parent.children;\n if (!array) array = parent.children = [];\n }\n if (array) {\n array.splice(array.indexOf(column), 1);\n }\n\n if (this.table.$ready) {\n this.updateColumns(); // hack for dynamics remove column\n this.scheduleLayout();\n }\n },\n sort: function sort(states, options) {\n var prop = options.prop,\n order = options.order,\n init = options.init;\n\n if (prop) {\n var column = Object(util_["arrayFind"])(states.columns, function (column) {\n return column.property === prop;\n });\n if (column) {\n column.order = order;\n this.updateSort(column, prop, order);\n this.commit(\'changeSortCondition\', { init: init });\n }\n }\n },\n changeSortCondition: function changeSortCondition(states, options) {\n // 修复 pr https://github.com/ElemeFE/element/pull/15012 导致的 bug\n var column = states.sortingColumn,\n prop = states.sortProp,\n order = states.sortOrder;\n\n if (order === null) {\n states.sortingColumn = null;\n states.sortProp = null;\n }\n var ingore = { filter: true };\n this.execQuery(ingore);\n\n if (!options || !(options.silent || options.init)) {\n this.table.$emit(\'sort-change\', {\n column: column,\n prop: prop,\n order: order\n });\n }\n\n this.updateTableScrollY();\n },\n filterChange: function filterChange(states, options) {\n var column = options.column,\n values = options.values,\n silent = options.silent;\n\n var newFilters = this.updateFilters(column, values);\n\n this.execQuery();\n\n if (!silent) {\n this.table.$emit(\'filter-change\', newFilters);\n }\n\n this.updateTableScrollY();\n },\n toggleAllSelection: function toggleAllSelection() {\n this.toggleAllSelection();\n },\n rowSelectedChanged: function rowSelectedChanged(states, row) {\n this.toggleRowSelection(row);\n this.updateAllSelected();\n },\n setHoverRow: function setHoverRow(states, row) {\n states.hoverRow = row;\n },\n setCurrentRow: function setCurrentRow(states, row) {\n this.updateCurrentRow(row);\n }\n};\n\nwatcher.prototype.commit = function (name) {\n var mutations = this.mutations;\n if (mutations[name]) {\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 mutations[name].apply(this, [this.states].concat(args));\n } else {\n throw new Error(\'Action not found: \' + name);\n }\n};\n\nwatcher.prototype.updateTableScrollY = function () {\n external_vue_default.a.nextTick(this.table.updateScrollY);\n};\n\n/* harmony default export */ var src_store = (watcher);\n// CONCATENATED MODULE: ./packages/table/src/store/helper.js\n\n\n\nfunction createStore(table) {\n var initialState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!table) {\n throw new Error(\'Table is required.\');\n }\n\n var store = new src_store();\n store.table = table;\n // fix https://github.com/ElemeFE/element/issues/14075\n // related pr https://github.com/ElemeFE/element/pull/14146\n store.toggleAllSelection = debounce_default()(10, store._toggleAllSelection);\n Object.keys(initialState).forEach(function (key) {\n store.states[key] = initialState[key];\n });\n return store;\n}\n\nfunction mapStates(mapper) {\n var res = {};\n Object.keys(mapper).forEach(function (key) {\n var value = mapper[key];\n var fn = void 0;\n if (typeof value === \'string\') {\n fn = function fn() {\n return this.store.states[value];\n };\n } else if (typeof value === \'function\') {\n fn = function fn() {\n return value.call(this, this.store.states);\n };\n } else {\n console.error(\'invalid value type\');\n }\n if (fn) {\n res[key] = fn;\n }\n });\n return res;\n};\n// EXTERNAL MODULE: external "element-ui/lib/utils/scrollbar-width"\nvar scrollbar_width_ = __webpack_require__(31);\nvar scrollbar_width_default = /*#__PURE__*/__webpack_require__.n(scrollbar_width_);\n\n// CONCATENATED MODULE: ./packages/table/src/table-layout.js\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n\n\n\n\nvar table_layout_TableLayout = function () {\n function TableLayout(options) {\n _classCallCheck(this, TableLayout);\n\n this.observers = [];\n this.table = null;\n this.store = null;\n this.columns = null;\n this.fit = true;\n this.showHeader = true;\n\n this.height = null;\n this.scrollX = false;\n this.scrollY = false;\n this.bodyWidth = null;\n this.fixedWidth = null;\n this.rightFixedWidth = null;\n this.tableHeight = null;\n this.headerHeight = 44; // Table Header Height\n this.appendHeight = 0; // Append Slot Height\n this.footerHeight = 44; // Table Footer Height\n this.viewportHeight = null; // Table Height - Scroll Bar Height\n this.bodyHeight = null; // Table Height - Table Header Height\n this.fixedBodyHeight = null; // Table Height - Table Header Height - Scroll Bar Height\n this.gutterWidth = scrollbar_width_default()();\n\n for (var name in options) {\n if (options.hasOwnProperty(name)) {\n this[name] = options[name];\n }\n }\n\n if (!this.table) {\n throw new Error(\'table is required for Table Layout\');\n }\n if (!this.store) {\n throw new Error(\'store is required for Table Layout\');\n }\n }\n\n TableLayout.prototype.updateScrollY = function updateScrollY() {\n var height = this.height;\n if (height === null) return false;\n var bodyWrapper = this.table.bodyWrapper;\n if (this.table.$el && bodyWrapper) {\n var body = bodyWrapper.querySelector(\'.el-table__body\');\n var prevScrollY = this.scrollY;\n var scrollY = body.offsetHeight > this.bodyHeight;\n this.scrollY = scrollY;\n return prevScrollY !== scrollY;\n }\n return false;\n };\n\n TableLayout.prototype.setHeight = function setHeight(value) {\n var _this = this;\n\n var prop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \'height\';\n\n if (external_vue_default.a.prototype.$isServer) return;\n var el = this.table.$el;\n value = parseHeight(value);\n this.height = value;\n\n if (!el && (value || value === 0)) return external_vue_default.a.nextTick(function () {\n return _this.setHeight(value, prop);\n });\n\n if (typeof value === \'number\') {\n el.style[prop] = value + \'px\';\n this.updateElsHeight();\n } else if (typeof value === \'string\') {\n el.style[prop] = value;\n this.updateElsHeight();\n }\n };\n\n TableLayout.prototype.setMaxHeight = function setMaxHeight(value) {\n this.setHeight(value, \'max-height\');\n };\n\n TableLayout.prototype.getFlattenColumns = function getFlattenColumns() {\n var flattenColumns = [];\n var columns = this.table.columns;\n columns.forEach(function (column) {\n if (column.isColumnGroup) {\n flattenColumns.push.apply(flattenColumns, column.columns);\n } else {\n flattenColumns.push(column);\n }\n });\n\n return flattenColumns;\n };\n\n TableLayout.prototype.updateElsHeight = function updateElsHeight() {\n var _this2 = this;\n\n if (!this.table.$ready) return external_vue_default.a.nextTick(function () {\n return _this2.updateElsHeight();\n });\n var _table$$refs = this.table.$refs,\n headerWrapper = _table$$refs.headerWrapper,\n appendWrapper = _table$$refs.appendWrapper,\n footerWrapper = _table$$refs.footerWrapper;\n\n this.appendHeight = appendWrapper ? appendWrapper.offsetHeight : 0;\n\n if (this.showHeader && !headerWrapper) return;\n\n // fix issue (https://github.com/ElemeFE/element/pull/16956)\n var headerTrElm = headerWrapper ? headerWrapper.querySelector(\'.el-table__header tr\') : null;\n var noneHeader = this.headerDisplayNone(headerTrElm);\n\n var headerHeight = this.headerHeight = !this.showHeader ? 0 : headerWrapper.offsetHeight;\n if (this.showHeader && !noneHeader && headerWrapper.offsetWidth > 0 && (this.table.columns || []).length > 0 && headerHeight < 2) {\n return external_vue_default.a.nextTick(function () {\n return _this2.updateElsHeight();\n });\n }\n var tableHeight = this.tableHeight = this.table.$el.clientHeight;\n var footerHeight = this.footerHeight = footerWrapper ? footerWrapper.offsetHeight : 0;\n if (this.height !== null) {\n this.bodyHeight = tableHeight - headerHeight - footerHeight + (footerWrapper ? 1 : 0);\n }\n this.fixedBodyHeight = this.scrollX ? this.bodyHeight - this.gutterWidth : this.bodyHeight;\n\n var noData = !(this.store.states.data && this.store.states.data.length);\n this.viewportHeight = this.scrollX ? tableHeight - (noData ? 0 : this.gutterWidth) : tableHeight;\n this.updateScrollY();\n this.notifyObservers(\'scrollable\');\n };\n\n TableLayout.prototype.headerDisplayNone = function headerDisplayNone(elm) {\n if (!elm) return true;\n var headerChild = elm;\n while (headerChild.tagName !== \'DIV\') {\n if (getComputedStyle(headerChild).display === \'none\') {\n return true;\n }\n headerChild = headerChild.parentElement;\n }\n return false;\n };\n\n TableLayout.prototype.updateColumnsWidth = function updateColumnsWidth() {\n if (external_vue_default.a.prototype.$isServer) return;\n var fit = this.fit;\n var bodyWidth = this.table.$el.clientWidth;\n var bodyMinWidth = 0;\n\n var flattenColumns = this.getFlattenColumns();\n var flexColumns = flattenColumns.filter(function (column) {\n return typeof column.width !== \'number\';\n });\n\n flattenColumns.forEach(function (column) {\n // Clean those columns whose width changed from flex to unflex\n if (typeof column.width === \'number\' && column.realWidth) column.realWidth = null;\n });\n\n if (flexColumns.length > 0 && fit) {\n flattenColumns.forEach(function (column) {\n bodyMinWidth += column.width || column.minWidth || 80;\n });\n\n var scrollYWidth = this.scrollY ? this.gutterWidth : 0;\n\n if (bodyMinWidth <= bodyWidth - scrollYWidth) {\n // DON\'T HAVE SCROLL BAR\n this.scrollX = false;\n\n var totalFlexWidth = bodyWidth - scrollYWidth - bodyMinWidth;\n\n if (flexColumns.length === 1) {\n flexColumns[0].realWidth = (flexColumns[0].minWidth || 80) + totalFlexWidth;\n } else {\n var allColumnsWidth = flexColumns.reduce(function (prev, column) {\n return prev + (column.minWidth || 80);\n }, 0);\n var flexWidthPerPixel = totalFlexWidth / allColumnsWidth;\n var noneFirstWidth = 0;\n\n flexColumns.forEach(function (column, index) {\n if (index === 0) return;\n var flexWidth = Math.floor((column.minWidth || 80) * flexWidthPerPixel);\n noneFirstWidth += flexWidth;\n column.realWidth = (column.minWidth || 80) + flexWidth;\n });\n\n flexColumns[0].realWidth = (flexColumns[0].minWidth || 80) + totalFlexWidth - noneFirstWidth;\n }\n } else {\n // HAVE HORIZONTAL SCROLL BAR\n this.scrollX = true;\n flexColumns.forEach(function (column) {\n column.realWidth = column.minWidth;\n });\n }\n\n this.bodyWidth = Math.max(bodyMinWidth, bodyWidth);\n this.table.resizeState.width = this.bodyWidth;\n } else {\n flattenColumns.forEach(function (column) {\n if (!column.width && !column.minWidth) {\n column.realWidth = 80;\n } else {\n column.realWidth = column.width || column.minWidth;\n }\n\n bodyMinWidth += column.realWidth;\n });\n this.scrollX = bodyMinWidth > bodyWidth;\n\n this.bodyWidth = bodyMinWidth;\n }\n\n var fixedColumns = this.store.states.fixedColumns;\n\n if (fixedColumns.length > 0) {\n var fixedWidth = 0;\n fixedColumns.forEach(function (column) {\n fixedWidth += column.realWidth || column.width;\n });\n\n this.fixedWidth = fixedWidth;\n }\n\n var rightFixedColumns = this.store.states.rightFixedColumns;\n if (rightFixedColumns.length > 0) {\n var rightFixedWidth = 0;\n rightFixedColumns.forEach(function (column) {\n rightFixedWidth += column.realWidth || column.width;\n });\n\n this.rightFixedWidth = rightFixedWidth;\n }\n\n this.notifyObservers(\'columns\');\n };\n\n TableLayout.prototype.addObserver = function addObserver(observer) {\n this.observers.push(observer);\n };\n\n TableLayout.prototype.removeObserver = function removeObserver(observer) {\n var index = this.observers.indexOf(observer);\n if (index !== -1) {\n this.observers.splice(index, 1);\n }\n };\n\n TableLayout.prototype.notifyObservers = function notifyObservers(event) {\n var _this3 = this;\n\n var observers = this.observers;\n observers.forEach(function (observer) {\n switch (event) {\n case \'columns\':\n observer.onColumnsChange(_this3);\n break;\n case \'scrollable\':\n observer.onScrollableChange(_this3);\n break;\n default:\n throw new Error(\'Table Layout don\\\'t have event \' + event + \'.\');\n }\n });\n };\n\n return TableLayout;\n}();\n\n/* harmony default export */ var table_layout = (table_layout_TableLayout);\n// CONCATENATED MODULE: ./packages/table/src/layout-observer.js\n/* harmony default export */ var layout_observer = ({\n created: function created() {\n this.tableLayout.addObserver(this);\n },\n destroyed: function destroyed() {\n this.tableLayout.removeObserver(this);\n },\n\n\n computed: {\n tableLayout: function tableLayout() {\n var layout = this.layout;\n if (!layout && this.table) {\n layout = this.table.layout;\n }\n if (!layout) {\n throw new Error(\'Can not find table layout.\');\n }\n return layout;\n }\n },\n\n mounted: function mounted() {\n this.onColumnsChange(this.tableLayout);\n this.onScrollableChange(this.tableLayout);\n },\n updated: function updated() {\n if (this.__updated__) return;\n this.onColumnsChange(this.tableLayout);\n this.onScrollableChange(this.tableLayout);\n this.__updated__ = true;\n },\n\n\n methods: {\n onColumnsChange: function onColumnsChange(layout) {\n var cols = this.$el.querySelectorAll(\'colgroup > col\');\n if (!cols.length) return;\n var flattenColumns = layout.getFlattenColumns();\n var columnsMap = {};\n flattenColumns.forEach(function (column) {\n columnsMap[column.id] = column;\n });\n for (var i = 0, j = cols.length; i < j; i++) {\n var col = cols[i];\n var name = col.getAttribute(\'name\');\n var column = columnsMap[name];\n if (column) {\n col.setAttribute(\'width\', column.realWidth || column.width);\n }\n }\n },\n onScrollableChange: function onScrollableChange(layout) {\n var cols = this.$el.querySelectorAll(\'colgroup > col[name=gutter]\');\n for (var i = 0, j = cols.length; i < j; i++) {\n var col = cols[i];\n col.setAttribute(\'width\', layout.scrollY ? layout.gutterWidth : \'0\');\n }\n var ths = this.$el.querySelectorAll(\'th.gutter\');\n for (var _i = 0, _j = ths.length; _i < _j; _i++) {\n var th = ths[_i];\n th.style.width = layout.scrollY ? layout.gutterWidth + \'px\' : \'0\';\n th.style.display = layout.scrollY ? \'\' : \'none\';\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/table/src/table-row.js\nvar table_row_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\n/* harmony default export */ var table_row = ({\n name: \'ElTableRow\',\n props: [\'columns\', \'row\', \'index\', \'isSelected\', \'isExpanded\', \'store\', \'context\', \'firstDefaultColumnIndex\', \'treeRowData\', \'treeIndent\', \'columnsHidden\', \'getSpan\', \'getColspanRealWidth\', \'getCellStyle\', \'getCellClass\', \'handleCellMouseLeave\', \'handleCellMouseEnter\', \'fixed\'],\n components: {\n ElCheckbox: checkbox_default.a\n },\n render: function render() {\n var _this = this;\n\n var h = arguments[0];\n var columns = this.columns,\n row = this.row,\n $index = this.index,\n store = this.store,\n context = this.context,\n firstDefaultColumnIndex = this.firstDefaultColumnIndex,\n treeRowData = this.treeRowData,\n treeIndent = this.treeIndent,\n _columnsHidden = this.columnsHidden,\n columnsHidden = _columnsHidden === undefined ? [] : _columnsHidden,\n isSelected = this.isSelected,\n isExpanded = this.isExpanded;\n\n\n return h(\'tr\', [columns.map(function (column, cellIndex) {\n var _getSpan = _this.getSpan(row, column, $index, cellIndex),\n rowspan = _getSpan.rowspan,\n colspan = _getSpan.colspan;\n\n if (!rowspan || !colspan) {\n return null;\n }\n var columnData = table_row_extends({}, column);\n columnData.realWidth = _this.getColspanRealWidth(columns, colspan, cellIndex);\n var data = {\n store: store,\n isSelected: isSelected,\n isExpanded: isExpanded,\n _self: context,\n column: columnData,\n row: row,\n $index: $index\n };\n if (cellIndex === firstDefaultColumnIndex && treeRowData) {\n data.treeNode = {\n indent: treeRowData.level * treeIndent,\n level: treeRowData.level\n };\n if (typeof treeRowData.expanded === \'boolean\') {\n data.treeNode.expanded = treeRowData.expanded;\n // 表明是懒加载\n if (\'loading\' in treeRowData) {\n data.treeNode.loading = treeRowData.loading;\n }\n if (\'noLazyChildren\' in treeRowData) {\n data.treeNode.noLazyChildren = treeRowData.noLazyChildren;\n }\n }\n }\n return h(\n \'td\',\n {\n style: _this.getCellStyle($index, cellIndex, row, column),\n \'class\': _this.getCellClass($index, cellIndex, row, column),\n attrs: { rowspan: rowspan,\n colspan: colspan\n },\n on: {\n \'mouseenter\': function mouseenter($event) {\n return _this.handleCellMouseEnter($event, row);\n },\n \'mouseleave\': _this.handleCellMouseLeave\n }\n },\n [column.renderCell.call(_this._renderProxy, _this.$createElement, data, columnsHidden[cellIndex])]\n );\n })]);\n }\n});\n// CONCATENATED MODULE: ./packages/table/src/table-body.js\nvar table_body_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\nvar table_body_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ var table_body = ({\n name: \'ElTableBody\',\n\n mixins: [layout_observer],\n\n components: {\n ElCheckbox: checkbox_default.a,\n ElTooltip: tooltip_default.a,\n TableRow: table_row\n },\n\n props: {\n store: {\n required: true\n },\n stripe: Boolean,\n context: {},\n rowClassName: [String, Function],\n rowStyle: [Object, Function],\n fixed: String,\n highlight: Boolean\n },\n\n render: function render(h) {\n var _this = this;\n\n var data = this.data || [];\n return h(\n \'table\',\n {\n \'class\': \'el-table__body\',\n attrs: { cellspacing: \'0\',\n cellpadding: \'0\',\n border: \'0\' }\n },\n [h(\'colgroup\', [this.columns.map(function (column) {\n return h(\'col\', {\n attrs: { name: column.id },\n key: column.id });\n })]), h(\'tbody\', [data.reduce(function (acc, row) {\n return acc.concat(_this.wrappedRowRender(row, acc.length));\n }, []), h(\'el-tooltip\', {\n attrs: { effect: this.table.tooltipEffect, placement: \'top\', content: this.tooltipContent },\n ref: \'tooltip\' })])]\n );\n },\n\n\n computed: table_body_extends({\n table: function table() {\n return this.$parent;\n }\n }, mapStates({\n data: \'data\',\n columns: \'columns\',\n treeIndent: \'indent\',\n leftFixedLeafCount: \'fixedLeafColumnsLength\',\n rightFixedLeafCount: \'rightFixedLeafColumnsLength\',\n columnsCount: function columnsCount(states) {\n return states.columns.length;\n },\n leftFixedCount: function leftFixedCount(states) {\n return states.fixedColumns.length;\n },\n rightFixedCount: function rightFixedCount(states) {\n return states.rightFixedColumns.length;\n },\n hasExpandColumn: function hasExpandColumn(states) {\n return states.columns.some(function (_ref) {\n var type = _ref.type;\n return type === \'expand\';\n });\n }\n }), {\n columnsHidden: function columnsHidden() {\n var _this2 = this;\n\n return this.columns.map(function (column, index) {\n return _this2.isColumnHidden(index);\n });\n },\n firstDefaultColumnIndex: function firstDefaultColumnIndex() {\n return Object(util_["arrayFindIndex"])(this.columns, function (_ref2) {\n var type = _ref2.type;\n return type === \'default\';\n });\n }\n }),\n\n watch: {\n // don\'t trigger getter of currentRow in getCellClass. see https://jsfiddle.net/oe2b4hqt/\n // update DOM manually. see https://github.com/ElemeFE/element/pull/13954/files#diff-9b450c00d0a9dec0ffad5a3176972e40\n \'store.states.hoverRow\': function storeStatesHoverRow(newVal, oldVal) {\n var _this3 = this;\n\n if (!this.store.states.isComplex || this.$isServer) return;\n var raf = window.requestAnimationFrame;\n if (!raf) {\n raf = function raf(fn) {\n return setTimeout(fn, 16);\n };\n }\n raf(function () {\n var rows = _this3.$el.querySelectorAll(\'.el-table__row\');\n var oldRow = rows[oldVal];\n var newRow = rows[newVal];\n if (oldRow) {\n Object(dom_["removeClass"])(oldRow, \'hover-row\');\n }\n if (newRow) {\n Object(dom_["addClass"])(newRow, \'hover-row\');\n }\n });\n }\n },\n\n data: function data() {\n return {\n tooltipContent: \'\'\n };\n },\n created: function created() {\n this.activateTooltip = debounce_default()(50, function (tooltip) {\n return tooltip.handleShowPopper();\n });\n },\n\n\n methods: {\n getKeyOfRow: function getKeyOfRow(row, index) {\n var rowKey = this.table.rowKey;\n if (rowKey) {\n return getRowIdentity(row, rowKey);\n }\n return index;\n },\n isColumnHidden: function isColumnHidden(index) {\n if (this.fixed === true || this.fixed === \'left\') {\n return index >= this.leftFixedLeafCount;\n } else if (this.fixed === \'right\') {\n return index < this.columnsCount - this.rightFixedLeafCount;\n } else {\n return index < this.leftFixedLeafCount || index >= this.columnsCount - this.rightFixedLeafCount;\n }\n },\n getSpan: function getSpan(row, column, rowIndex, columnIndex) {\n var rowspan = 1;\n var colspan = 1;\n var fn = this.table.spanMethod;\n if (typeof fn === \'function\') {\n var result = fn({\n row: row,\n column: column,\n rowIndex: rowIndex,\n columnIndex: columnIndex\n });\n if (Array.isArray(result)) {\n rowspan = result[0];\n colspan = result[1];\n } else if ((typeof result === \'undefined\' ? \'undefined\' : table_body_typeof(result)) === \'object\') {\n rowspan = result.rowspan;\n colspan = result.colspan;\n }\n }\n return { rowspan: rowspan, colspan: colspan };\n },\n getRowStyle: function getRowStyle(row, rowIndex) {\n var rowStyle = this.table.rowStyle;\n if (typeof rowStyle === \'function\') {\n return rowStyle.call(null, {\n row: row,\n rowIndex: rowIndex\n });\n }\n return rowStyle || null;\n },\n getRowClass: function getRowClass(row, rowIndex) {\n var classes = [\'el-table__row\'];\n if (this.table.highlightCurrentRow && row === this.store.states.currentRow) {\n classes.push(\'current-row\');\n }\n\n if (this.stripe && rowIndex % 2 === 1) {\n classes.push(\'el-table__row--striped\');\n }\n var rowClassName = this.table.rowClassName;\n if (typeof rowClassName === \'string\') {\n classes.push(rowClassName);\n } else if (typeof rowClassName === \'function\') {\n classes.push(rowClassName.call(null, {\n row: row,\n rowIndex: rowIndex\n }));\n }\n\n if (this.store.states.expandRows.indexOf(row) > -1) {\n classes.push(\'expanded\');\n }\n\n return classes;\n },\n getCellStyle: function getCellStyle(rowIndex, columnIndex, row, column) {\n var cellStyle = this.table.cellStyle;\n if (typeof cellStyle === \'function\') {\n return cellStyle.call(null, {\n rowIndex: rowIndex,\n columnIndex: columnIndex,\n row: row,\n column: column\n });\n }\n return cellStyle;\n },\n getCellClass: function getCellClass(rowIndex, columnIndex, row, column) {\n var classes = [column.id, column.align, column.className];\n\n if (this.isColumnHidden(columnIndex)) {\n classes.push(\'is-hidden\');\n }\n\n var cellClassName = this.table.cellClassName;\n if (typeof cellClassName === \'string\') {\n classes.push(cellClassName);\n } else if (typeof cellClassName === \'function\') {\n classes.push(cellClassName.call(null, {\n rowIndex: rowIndex,\n columnIndex: columnIndex,\n row: row,\n column: column\n }));\n }\n\n classes.push(\'el-table__cell\');\n\n return classes.join(\' \');\n },\n getColspanRealWidth: function getColspanRealWidth(columns, colspan, index) {\n if (colspan < 1) {\n return columns[index].realWidth;\n }\n var widthArr = columns.map(function (_ref3) {\n var realWidth = _ref3.realWidth;\n return realWidth;\n }).slice(index, index + colspan);\n return widthArr.reduce(function (acc, width) {\n return acc + width;\n }, -1);\n },\n handleCellMouseEnter: function handleCellMouseEnter(event, row) {\n var table = this.table;\n var cell = getCell(event);\n\n if (cell) {\n var column = getColumnByCell(table, cell);\n var hoverState = table.hoverState = { cell: cell, column: column, row: row };\n table.$emit(\'cell-mouse-enter\', hoverState.row, hoverState.column, hoverState.cell, event);\n }\n\n // 判断是否text-overflow, 如果是就显示tooltip\n var cellChild = event.target.querySelector(\'.cell\');\n if (!(Object(dom_["hasClass"])(cellChild, \'el-tooltip\') && cellChild.childNodes.length)) {\n return;\n }\n // use range width instead of scrollWidth to determine whether the text is overflowing\n // to address a potential FireFox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1074543#c3\n var range = document.createRange();\n range.setStart(cellChild, 0);\n range.setEnd(cellChild, cellChild.childNodes.length);\n var rangeWidth = range.getBoundingClientRect().width;\n var padding = (parseInt(Object(dom_["getStyle"])(cellChild, \'paddingLeft\'), 10) || 0) + (parseInt(Object(dom_["getStyle"])(cellChild, \'paddingRight\'), 10) || 0);\n if ((rangeWidth + padding > cellChild.offsetWidth || cellChild.scrollWidth > cellChild.offsetWidth) && this.$refs.tooltip) {\n var tooltip = this.$refs.tooltip;\n // TODO 会引起整个 Table 的重新渲染,需要优化\n this.tooltipContent = cell.innerText || cell.textContent;\n tooltip.referenceElm = cell;\n tooltip.$refs.popper && (tooltip.$refs.popper.style.display = \'none\');\n tooltip.doDestroy();\n tooltip.setExpectedState(true);\n this.activateTooltip(tooltip);\n }\n },\n handleCellMouseLeave: function handleCellMouseLeave(event) {\n var tooltip = this.$refs.tooltip;\n if (tooltip) {\n tooltip.setExpectedState(false);\n tooltip.handleClosePopper();\n }\n var cell = getCell(event);\n if (!cell) return;\n\n var oldHoverState = this.table.hoverState || {};\n this.table.$emit(\'cell-mouse-leave\', oldHoverState.row, oldHoverState.column, oldHoverState.cell, event);\n },\n\n\n handleMouseEnter: debounce_default()(30, function (index) {\n this.store.commit(\'setHoverRow\', index);\n }),\n\n handleMouseLeave: debounce_default()(30, function () {\n this.store.commit(\'setHoverRow\', null);\n }),\n\n handleContextMenu: function handleContextMenu(event, row) {\n this.handleEvent(event, row, \'contextmenu\');\n },\n handleDoubleClick: function handleDoubleClick(event, row) {\n this.handleEvent(event, row, \'dblclick\');\n },\n handleClick: function handleClick(event, row) {\n this.store.commit(\'setCurrentRow\', row);\n this.handleEvent(event, row, \'click\');\n },\n handleEvent: function handleEvent(event, row, name) {\n var table = this.table;\n var cell = getCell(event);\n var column = void 0;\n if (cell) {\n column = getColumnByCell(table, cell);\n if (column) {\n table.$emit(\'cell-\' + name, row, column, cell, event);\n }\n }\n table.$emit(\'row-\' + name, row, column, event);\n },\n rowRender: function rowRender(row, $index, treeRowData) {\n var _this4 = this;\n\n var h = this.$createElement;\n var treeIndent = this.treeIndent,\n columns = this.columns,\n firstDefaultColumnIndex = this.firstDefaultColumnIndex;\n\n var rowClasses = this.getRowClass(row, $index);\n var display = true;\n if (treeRowData) {\n rowClasses.push(\'el-table__row--level-\' + treeRowData.level);\n display = treeRowData.display;\n }\n // 指令 v-show 会覆盖 row-style 中 display\n // 使用 :style 代替 v-show https://github.com/ElemeFE/element/issues/16995\n var displayStyle = display ? null : {\n display: \'none\'\n };\n return h(table_row, {\n style: [displayStyle, this.getRowStyle(row, $index)],\n \'class\': rowClasses,\n key: this.getKeyOfRow(row, $index),\n nativeOn: {\n \'dblclick\': function dblclick($event) {\n return _this4.handleDoubleClick($event, row);\n },\n \'click\': function click($event) {\n return _this4.handleClick($event, row);\n },\n \'contextmenu\': function contextmenu($event) {\n return _this4.handleContextMenu($event, row);\n },\n \'mouseenter\': function mouseenter(_) {\n return _this4.handleMouseEnter($index);\n },\n \'mouseleave\': this.handleMouseLeave\n },\n attrs: {\n columns: columns,\n row: row,\n index: $index,\n store: this.store,\n context: this.context || this.table.$vnode.context,\n firstDefaultColumnIndex: firstDefaultColumnIndex,\n treeRowData: treeRowData,\n treeIndent: treeIndent,\n columnsHidden: this.columnsHidden,\n getSpan: this.getSpan,\n getColspanRealWidth: this.getColspanRealWidth,\n getCellStyle: this.getCellStyle,\n getCellClass: this.getCellClass,\n handleCellMouseEnter: this.handleCellMouseEnter,\n handleCellMouseLeave: this.handleCellMouseLeave,\n isSelected: this.store.isSelected(row),\n isExpanded: this.store.states.expandRows.indexOf(row) > -1,\n fixed: this.fixed\n }\n });\n },\n wrappedRowRender: function wrappedRowRender(row, $index) {\n var _this5 = this;\n\n var h = this.$createElement;\n\n var store = this.store;\n var isRowExpanded = store.isRowExpanded,\n assertRowKey = store.assertRowKey;\n var _store$states = store.states,\n treeData = _store$states.treeData,\n lazyTreeNodeMap = _store$states.lazyTreeNodeMap,\n childrenColumnName = _store$states.childrenColumnName,\n rowKey = _store$states.rowKey;\n\n if (this.hasExpandColumn && isRowExpanded(row)) {\n var renderExpanded = this.table.renderExpanded;\n var tr = this.rowRender(row, $index);\n if (!renderExpanded) {\n console.error(\'[Element Error]renderExpanded is required.\');\n return tr;\n }\n // 使用二维数组,避免修改 $index\n return [[tr, h(\n \'tr\',\n { key: \'expanded-row__\' + tr.key },\n [h(\n \'td\',\n {\n attrs: { colspan: this.columnsCount },\n \'class\': \'el-table__cell el-table__expanded-cell\' },\n [renderExpanded(this.$createElement, { row: row, $index: $index, store: this.store })]\n )]\n )]];\n } else if (Object.keys(treeData).length) {\n assertRowKey();\n // TreeTable 时,rowKey 必须由用户设定,不使用 getKeyOfRow 计算\n // 在调用 rowRender 函数时,仍然会计算 rowKey,不太好的操作\n var key = getRowIdentity(row, rowKey);\n var cur = treeData[key];\n var treeRowData = null;\n if (cur) {\n treeRowData = {\n expanded: cur.expanded,\n level: cur.level,\n display: true\n };\n if (typeof cur.lazy === \'boolean\') {\n if (typeof cur.loaded === \'boolean\' && cur.loaded) {\n treeRowData.noLazyChildren = !(cur.children && cur.children.length);\n }\n treeRowData.loading = cur.loading;\n }\n }\n var tmp = [this.rowRender(row, $index, treeRowData)];\n // 渲染嵌套数据\n if (cur) {\n // currentRow 记录的是 index,所以还需主动增加 TreeTable 的 index\n var i = 0;\n var traverse = function traverse(children, parent) {\n if (!(children && children.length && parent)) return;\n children.forEach(function (node) {\n // 父节点的 display 状态影响子节点的显示状态\n var innerTreeRowData = {\n display: parent.display && parent.expanded,\n level: parent.level + 1\n };\n var childKey = getRowIdentity(node, rowKey);\n if (childKey === undefined || childKey === null) {\n throw new Error(\'for nested data item, row-key is required.\');\n }\n cur = table_body_extends({}, treeData[childKey]);\n // 对于当前节点,分成有无子节点两种情况。\n // 如果包含子节点的,设置 expanded 属性。\n // 对于它子节点的 display 属性由它本身的 expanded 与 display 共同决定。\n if (cur) {\n innerTreeRowData.expanded = cur.expanded;\n // 懒加载的某些节点,level 未知\n cur.level = cur.level || innerTreeRowData.level;\n cur.display = !!(cur.expanded && innerTreeRowData.display);\n if (typeof cur.lazy === \'boolean\') {\n if (typeof cur.loaded === \'boolean\' && cur.loaded) {\n innerTreeRowData.noLazyChildren = !(cur.children && cur.children.length);\n }\n innerTreeRowData.loading = cur.loading;\n }\n }\n i++;\n tmp.push(_this5.rowRender(node, $index + i, innerTreeRowData));\n if (cur) {\n var _nodes = lazyTreeNodeMap[childKey] || node[childrenColumnName];\n traverse(_nodes, cur);\n }\n });\n };\n // 对于 root 节点,display 一定为 true\n cur.display = true;\n var nodes = lazyTreeNodeMap[key] || row[childrenColumnName];\n traverse(nodes, cur);\n }\n return tmp;\n } else {\n return this.rowRender(row, $index);\n }\n }\n }\n});\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/table/src/filter-panel.vue?vue&type=template&id=7f2c919f&\nvar filter_panelvue_type_template_id_7f2c919f_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("transition", { attrs: { name: "el-zoom-in-top" } }, [\n _vm.multiple\n ? _c(\n "div",\n {\n directives: [\n {\n name: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.handleOutsideClick,\n expression: "handleOutsideClick"\n },\n {\n name: "show",\n rawName: "v-show",\n value: _vm.showPopper,\n expression: "showPopper"\n }\n ],\n staticClass: "el-table-filter"\n },\n [\n _c(\n "div",\n { staticClass: "el-table-filter__content" },\n [\n _c(\n "el-scrollbar",\n { attrs: { "wrap-class": "el-table-filter__wrap" } },\n [\n _c(\n "el-checkbox-group",\n {\n staticClass: "el-table-filter__checkbox-group",\n model: {\n value: _vm.filteredValue,\n callback: function($$v) {\n _vm.filteredValue = $$v\n },\n expression: "filteredValue"\n }\n },\n _vm._l(_vm.filters, function(filter) {\n return _c(\n "el-checkbox",\n { key: filter.value, attrs: { label: filter.value } },\n [_vm._v(_vm._s(filter.text))]\n )\n }),\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c("div", { staticClass: "el-table-filter__bottom" }, [\n _c(\n "button",\n {\n class: { "is-disabled": _vm.filteredValue.length === 0 },\n attrs: { disabled: _vm.filteredValue.length === 0 },\n on: { click: _vm.handleConfirm }\n },\n [_vm._v(_vm._s(_vm.t("el.table.confirmFilter")))]\n ),\n _c("button", { on: { click: _vm.handleReset } }, [\n _vm._v(_vm._s(_vm.t("el.table.resetFilter")))\n ])\n ])\n ]\n )\n : _c(\n "div",\n {\n directives: [\n {\n name: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.handleOutsideClick,\n expression: "handleOutsideClick"\n },\n {\n name: "show",\n rawName: "v-show",\n value: _vm.showPopper,\n expression: "showPopper"\n }\n ],\n staticClass: "el-table-filter"\n },\n [\n _c(\n "ul",\n { staticClass: "el-table-filter__list" },\n [\n _c(\n "li",\n {\n staticClass: "el-table-filter__list-item",\n class: {\n "is-active":\n _vm.filterValue === undefined ||\n _vm.filterValue === null\n },\n on: {\n click: function($event) {\n _vm.handleSelect(null)\n }\n }\n },\n [_vm._v(_vm._s(_vm.t("el.table.clearFilter")))]\n ),\n _vm._l(_vm.filters, function(filter) {\n return _c(\n "li",\n {\n key: filter.value,\n staticClass: "el-table-filter__list-item",\n class: { "is-active": _vm.isActive(filter) },\n attrs: { label: filter.value },\n on: {\n click: function($event) {\n _vm.handleSelect(filter.value)\n }\n }\n },\n [_vm._v(_vm._s(filter.text))]\n )\n })\n ],\n 2\n )\n ]\n )\n ])\n}\nvar filter_panelvue_type_template_id_7f2c919f_staticRenderFns = []\nfilter_panelvue_type_template_id_7f2c919f_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/table/src/filter-panel.vue?vue&type=template&id=7f2c919f&\n\n// CONCATENATED MODULE: ./packages/table/src/dropdown.js\n\nvar dropdowns = [];\n\n!external_vue_default.a.prototype.$isServer && document.addEventListener(\'click\', function (event) {\n dropdowns.forEach(function (dropdown) {\n var target = event.target;\n if (!dropdown || !dropdown.$el) return;\n if (target === dropdown.$el || dropdown.$el.contains(target)) {\n return;\n }\n dropdown.handleOutsideClick && dropdown.handleOutsideClick(event);\n });\n});\n\n/* harmony default export */ var src_dropdown = ({\n open: function open(instance) {\n if (instance) {\n dropdowns.push(instance);\n }\n },\n close: function close(instance) {\n var index = dropdowns.indexOf(instance);\n if (index !== -1) {\n dropdowns.splice(instance, 1);\n }\n }\n});\n// EXTERNAL MODULE: external "element-ui/lib/checkbox-group"\nvar checkbox_group_ = __webpack_require__(32);\nvar checkbox_group_default = /*#__PURE__*/__webpack_require__.n(checkbox_group_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/table/src/filter-panel.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//\n//\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ var filter_panelvue_type_script_lang_js_ = ({\n name: \'ElTableFilterPanel\',\n\n mixins: [vue_popper_default.a, locale_default.a],\n\n directives: {\n Clickoutside: clickoutside_default.a\n },\n\n components: {\n ElCheckbox: checkbox_default.a,\n ElCheckboxGroup: checkbox_group_default.a,\n ElScrollbar: scrollbar_default.a\n },\n\n props: {\n placement: {\n type: String,\n default: \'bottom-end\'\n }\n },\n\n methods: {\n isActive: function isActive(filter) {\n return filter.value === this.filterValue;\n },\n handleOutsideClick: function handleOutsideClick() {\n var _this = this;\n\n setTimeout(function () {\n _this.showPopper = false;\n }, 16);\n },\n handleConfirm: function handleConfirm() {\n this.confirmFilter(this.filteredValue);\n this.handleOutsideClick();\n },\n handleReset: function handleReset() {\n this.filteredValue = [];\n this.confirmFilter(this.filteredValue);\n this.handleOutsideClick();\n },\n handleSelect: function handleSelect(filterValue) {\n this.filterValue = filterValue;\n\n if (typeof filterValue !== \'undefined\' && filterValue !== null) {\n this.confirmFilter(this.filteredValue);\n } else {\n this.confirmFilter([]);\n }\n\n this.handleOutsideClick();\n },\n confirmFilter: function confirmFilter(filteredValue) {\n this.table.store.commit(\'filterChange\', {\n column: this.column,\n values: filteredValue\n });\n this.table.store.updateAllSelected();\n }\n },\n\n data: function data() {\n return {\n table: null,\n cell: null,\n column: null\n };\n },\n\n\n computed: {\n filters: function filters() {\n return this.column && this.column.filters;\n },\n\n\n filterValue: {\n get: function get() {\n return (this.column.filteredValue || [])[0];\n },\n set: function set(value) {\n if (this.filteredValue) {\n if (typeof value !== \'undefined\' && value !== null) {\n this.filteredValue.splice(0, 1, value);\n } else {\n this.filteredValue.splice(0, 1);\n }\n }\n }\n },\n\n filteredValue: {\n get: function get() {\n if (this.column) {\n return this.column.filteredValue || [];\n }\n return [];\n },\n set: function set(value) {\n if (this.column) {\n this.column.filteredValue = value;\n }\n }\n },\n\n multiple: function multiple() {\n if (this.column) {\n return this.column.filterMultiple;\n }\n return true;\n }\n },\n\n mounted: function mounted() {\n var _this2 = this;\n\n this.popperElm = this.$el;\n this.referenceElm = this.cell;\n this.table.bodyWrapper.addEventListener(\'scroll\', function () {\n _this2.updatePopper();\n });\n\n this.$watch(\'showPopper\', function (value) {\n if (_this2.column) _this2.column.filterOpened = value;\n if (value) {\n src_dropdown.open(_this2);\n } else {\n src_dropdown.close(_this2);\n }\n });\n },\n\n watch: {\n showPopper: function showPopper(val) {\n if (val === true && parseInt(this.popperJS._popper.style.zIndex, 10) < popup_["PopupManager"].zIndex) {\n this.popperJS._popper.style.zIndex = popup_["PopupManager"].nextZIndex();\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/table/src/filter-panel.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_filter_panelvue_type_script_lang_js_ = (filter_panelvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/table/src/filter-panel.vue\n\n\n\n\n\n/* normalize component */\n\nvar filter_panel_component = normalizeComponent(\n src_filter_panelvue_type_script_lang_js_,\n filter_panelvue_type_template_id_7f2c919f_render,\n filter_panelvue_type_template_id_7f2c919f_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var filter_panel_api; }\nfilter_panel_component.options.__file = "packages/table/src/filter-panel.vue"\n/* harmony default export */ var filter_panel = (filter_panel_component.exports);\n// CONCATENATED MODULE: ./packages/table/src/table-header.js\nvar table_header_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\n\n\n\n\n\n\nvar getAllColumns = function getAllColumns(columns) {\n var result = [];\n columns.forEach(function (column) {\n if (column.children) {\n result.push(column);\n result.push.apply(result, getAllColumns(column.children));\n } else {\n result.push(column);\n }\n });\n return result;\n};\n\nvar convertToRows = function convertToRows(originColumns) {\n var maxLevel = 1;\n var traverse = function traverse(column, parent) {\n if (parent) {\n column.level = parent.level + 1;\n if (maxLevel < column.level) {\n maxLevel = column.level;\n }\n }\n if (column.children) {\n var colSpan = 0;\n column.children.forEach(function (subColumn) {\n traverse(subColumn, column);\n colSpan += subColumn.colSpan;\n });\n column.colSpan = colSpan;\n } else {\n column.colSpan = 1;\n }\n };\n\n originColumns.forEach(function (column) {\n column.level = 1;\n traverse(column);\n });\n\n var rows = [];\n for (var i = 0; i < maxLevel; i++) {\n rows.push([]);\n }\n\n var allColumns = getAllColumns(originColumns);\n\n allColumns.forEach(function (column) {\n if (!column.children) {\n column.rowSpan = maxLevel - column.level + 1;\n } else {\n column.rowSpan = 1;\n }\n rows[column.level - 1].push(column);\n });\n\n return rows;\n};\n\n/* harmony default export */ var table_header = ({\n name: \'ElTableHeader\',\n\n mixins: [layout_observer],\n\n render: function render(h) {\n var _this = this;\n\n var originColumns = this.store.states.originColumns;\n var columnRows = convertToRows(originColumns, this.columns);\n // 是否拥有多级表头\n var isGroup = columnRows.length > 1;\n if (isGroup) this.$parent.isGroup = true;\n return h(\n \'table\',\n {\n \'class\': \'el-table__header\',\n attrs: { cellspacing: \'0\',\n cellpadding: \'0\',\n border: \'0\' }\n },\n [h(\'colgroup\', [this.columns.map(function (column) {\n return h(\'col\', {\n attrs: { name: column.id },\n key: column.id });\n }), this.hasGutter ? h(\'col\', {\n attrs: { name: \'gutter\' }\n }) : \'\']), h(\n \'thead\',\n { \'class\': [{ \'is-group\': isGroup, \'has-gutter\': this.hasGutter }] },\n [this._l(columnRows, function (columns, rowIndex) {\n return h(\n \'tr\',\n {\n style: _this.getHeaderRowStyle(rowIndex),\n \'class\': _this.getHeaderRowClass(rowIndex)\n },\n [columns.map(function (column, cellIndex) {\n return h(\n \'th\',\n {\n attrs: {\n colspan: column.colSpan,\n rowspan: column.rowSpan\n },\n on: {\n \'mousemove\': function mousemove($event) {\n return _this.handleMouseMove($event, column);\n },\n \'mouseout\': _this.handleMouseOut,\n \'mousedown\': function mousedown($event) {\n return _this.handleMouseDown($event, column);\n },\n \'click\': function click($event) {\n return _this.handleHeaderClick($event, column);\n },\n \'contextmenu\': function contextmenu($event) {\n return _this.handleHeaderContextMenu($event, column);\n }\n },\n\n style: _this.getHeaderCellStyle(rowIndex, cellIndex, columns, column),\n \'class\': _this.getHeaderCellClass(rowIndex, cellIndex, columns, column),\n key: column.id },\n [h(\n \'div\',\n { \'class\': [\'cell\', column.filteredValue && column.filteredValue.length > 0 ? \'highlight\' : \'\', column.labelClassName] },\n [column.renderHeader ? column.renderHeader.call(_this._renderProxy, h, { column: column, $index: cellIndex, store: _this.store, _self: _this.$parent.$vnode.context }) : column.label, column.sortable ? h(\n \'span\',\n {\n \'class\': \'caret-wrapper\',\n on: {\n \'click\': function click($event) {\n return _this.handleSortClick($event, column);\n }\n }\n },\n [h(\'i\', { \'class\': \'sort-caret ascending\',\n on: {\n \'click\': function click($event) {\n return _this.handleSortClick($event, column, \'ascending\');\n }\n }\n }), h(\'i\', { \'class\': \'sort-caret descending\',\n on: {\n \'click\': function click($event) {\n return _this.handleSortClick($event, column, \'descending\');\n }\n }\n })]\n ) : \'\', column.filterable ? h(\n \'span\',\n {\n \'class\': \'el-table__column-filter-trigger\',\n on: {\n \'click\': function click($event) {\n return _this.handleFilterClick($event, column);\n }\n }\n },\n [h(\'i\', { \'class\': [\'el-icon-arrow-down\', column.filterOpened ? \'el-icon-arrow-up\' : \'\'] })]\n ) : \'\']\n )]\n );\n }), _this.hasGutter ? h(\'th\', { \'class\': \'el-table__cell gutter\' }) : \'\']\n );\n })]\n )]\n );\n },\n\n\n props: {\n fixed: String,\n store: {\n required: true\n },\n border: Boolean,\n defaultSort: {\n type: Object,\n default: function _default() {\n return {\n prop: \'\',\n order: \'\'\n };\n }\n }\n },\n\n components: {\n ElCheckbox: checkbox_default.a\n },\n\n computed: table_header_extends({\n table: function table() {\n return this.$parent;\n },\n hasGutter: function hasGutter() {\n return !this.fixed && this.tableLayout.gutterWidth;\n }\n }, mapStates({\n columns: \'columns\',\n isAllSelected: \'isAllSelected\',\n leftFixedLeafCount: \'fixedLeafColumnsLength\',\n rightFixedLeafCount: \'rightFixedLeafColumnsLength\',\n columnsCount: function columnsCount(states) {\n return states.columns.length;\n },\n leftFixedCount: function leftFixedCount(states) {\n return states.fixedColumns.length;\n },\n rightFixedCount: function rightFixedCount(states) {\n return states.rightFixedColumns.length;\n }\n })),\n\n created: function created() {\n this.filterPanels = {};\n },\n mounted: function mounted() {\n var _this2 = this;\n\n // nextTick 是有必要的 https://github.com/ElemeFE/element/pull/11311\n this.$nextTick(function () {\n var _defaultSort = _this2.defaultSort,\n prop = _defaultSort.prop,\n order = _defaultSort.order;\n\n var init = true;\n _this2.store.commit(\'sort\', { prop: prop, order: order, init: init });\n });\n },\n beforeDestroy: function beforeDestroy() {\n var panels = this.filterPanels;\n for (var prop in panels) {\n if (panels.hasOwnProperty(prop) && panels[prop]) {\n panels[prop].$destroy(true);\n }\n }\n },\n\n\n methods: {\n isCellHidden: function isCellHidden(index, columns) {\n var start = 0;\n for (var i = 0; i < index; i++) {\n start += columns[i].colSpan;\n }\n var after = start + columns[index].colSpan - 1;\n if (this.fixed === true || this.fixed === \'left\') {\n return after >= this.leftFixedLeafCount;\n } else if (this.fixed === \'right\') {\n return start < this.columnsCount - this.rightFixedLeafCount;\n } else {\n return after < this.leftFixedLeafCount || start >= this.columnsCount - this.rightFixedLeafCount;\n }\n },\n getHeaderRowStyle: function getHeaderRowStyle(rowIndex) {\n var headerRowStyle = this.table.headerRowStyle;\n if (typeof headerRowStyle === \'function\') {\n return headerRowStyle.call(null, { rowIndex: rowIndex });\n }\n return headerRowStyle;\n },\n getHeaderRowClass: function getHeaderRowClass(rowIndex) {\n var classes = [];\n\n var headerRowClassName = this.table.headerRowClassName;\n if (typeof headerRowClassName === \'string\') {\n classes.push(headerRowClassName);\n } else if (typeof headerRowClassName === \'function\') {\n classes.push(headerRowClassName.call(null, { rowIndex: rowIndex }));\n }\n\n return classes.join(\' \');\n },\n getHeaderCellStyle: function getHeaderCellStyle(rowIndex, columnIndex, row, column) {\n var headerCellStyle = this.table.headerCellStyle;\n if (typeof headerCellStyle === \'function\') {\n return headerCellStyle.call(null, {\n rowIndex: rowIndex,\n columnIndex: columnIndex,\n row: row,\n column: column\n });\n }\n return headerCellStyle;\n },\n getHeaderCellClass: function getHeaderCellClass(rowIndex, columnIndex, row, column) {\n var classes = [column.id, column.order, column.headerAlign, column.className, column.labelClassName];\n\n if (rowIndex === 0 && this.isCellHidden(columnIndex, row)) {\n classes.push(\'is-hidden\');\n }\n\n if (!column.children) {\n classes.push(\'is-leaf\');\n }\n\n if (column.sortable) {\n classes.push(\'is-sortable\');\n }\n\n var headerCellClassName = this.table.headerCellClassName;\n if (typeof headerCellClassName === \'string\') {\n classes.push(headerCellClassName);\n } else if (typeof headerCellClassName === \'function\') {\n classes.push(headerCellClassName.call(null, {\n rowIndex: rowIndex,\n columnIndex: columnIndex,\n row: row,\n column: column\n }));\n }\n\n classes.push(\'el-table__cell\');\n\n return classes.join(\' \');\n },\n toggleAllSelection: function toggleAllSelection() {\n this.store.commit(\'toggleAllSelection\');\n },\n handleFilterClick: function handleFilterClick(event, column) {\n event.stopPropagation();\n var target = event.target;\n var cell = target.tagName === \'TH\' ? target : target.parentNode;\n if (Object(dom_["hasClass"])(cell, \'noclick\')) return;\n cell = cell.querySelector(\'.el-table__column-filter-trigger\') || cell;\n var table = this.$parent;\n\n var filterPanel = this.filterPanels[column.id];\n\n if (filterPanel && column.filterOpened) {\n filterPanel.showPopper = false;\n return;\n }\n\n if (!filterPanel) {\n filterPanel = new external_vue_default.a(filter_panel);\n this.filterPanels[column.id] = filterPanel;\n if (column.filterPlacement) {\n filterPanel.placement = column.filterPlacement;\n }\n filterPanel.table = table;\n filterPanel.cell = cell;\n filterPanel.column = column;\n !this.$isServer && filterPanel.$mount(document.createElement(\'div\'));\n }\n\n setTimeout(function () {\n filterPanel.showPopper = true;\n }, 16);\n },\n handleHeaderClick: function handleHeaderClick(event, column) {\n if (!column.filters && column.sortable) {\n this.handleSortClick(event, column);\n } else if (column.filterable && !column.sortable) {\n this.handleFilterClick(event, column);\n }\n\n this.$parent.$emit(\'header-click\', column, event);\n },\n handleHeaderContextMenu: function handleHeaderContextMenu(event, column) {\n this.$parent.$emit(\'header-contextmenu\', column, event);\n },\n handleMouseDown: function handleMouseDown(event, column) {\n var _this3 = this;\n\n if (this.$isServer) return;\n if (column.children && column.children.length > 0) return;\n /* istanbul ignore if */\n if (this.draggingColumn && this.border) {\n this.dragging = true;\n\n this.$parent.resizeProxyVisible = true;\n\n var table = this.$parent;\n var tableEl = table.$el;\n var tableLeft = tableEl.getBoundingClientRect().left;\n var columnEl = this.$el.querySelector(\'th.\' + column.id);\n var columnRect = columnEl.getBoundingClientRect();\n var minLeft = columnRect.left - tableLeft + 30;\n\n Object(dom_["addClass"])(columnEl, \'noclick\');\n\n this.dragState = {\n startMouseLeft: event.clientX,\n startLeft: columnRect.right - tableLeft,\n startColumnLeft: columnRect.left - tableLeft,\n tableLeft: tableLeft\n };\n\n var resizeProxy = table.$refs.resizeProxy;\n resizeProxy.style.left = this.dragState.startLeft + \'px\';\n\n document.onselectstart = function () {\n return false;\n };\n document.ondragstart = function () {\n return false;\n };\n\n var handleMouseMove = function handleMouseMove(event) {\n var deltaLeft = event.clientX - _this3.dragState.startMouseLeft;\n var proxyLeft = _this3.dragState.startLeft + deltaLeft;\n\n resizeProxy.style.left = Math.max(minLeft, proxyLeft) + \'px\';\n };\n\n var handleMouseUp = function handleMouseUp() {\n if (_this3.dragging) {\n var _dragState = _this3.dragState,\n startColumnLeft = _dragState.startColumnLeft,\n startLeft = _dragState.startLeft;\n\n var finalLeft = parseInt(resizeProxy.style.left, 10);\n var columnWidth = finalLeft - startColumnLeft;\n column.width = column.realWidth = columnWidth;\n table.$emit(\'header-dragend\', column.width, startLeft - startColumnLeft, column, event);\n\n _this3.store.scheduleLayout();\n\n document.body.style.cursor = \'\';\n _this3.dragging = false;\n _this3.draggingColumn = null;\n _this3.dragState = {};\n\n table.resizeProxyVisible = false;\n }\n\n document.removeEventListener(\'mousemove\', handleMouseMove);\n document.removeEventListener(\'mouseup\', handleMouseUp);\n document.onselectstart = null;\n document.ondragstart = null;\n\n setTimeout(function () {\n Object(dom_["removeClass"])(columnEl, \'noclick\');\n }, 0);\n };\n\n document.addEventListener(\'mousemove\', handleMouseMove);\n document.addEventListener(\'mouseup\', handleMouseUp);\n }\n },\n handleMouseMove: function handleMouseMove(event, column) {\n if (column.children && column.children.length > 0) return;\n var target = event.target;\n while (target && target.tagName !== \'TH\') {\n target = target.parentNode;\n }\n\n if (!column || !column.resizable) return;\n\n if (!this.dragging && this.border) {\n var rect = target.getBoundingClientRect();\n\n var bodyStyle = document.body.style;\n if (rect.width > 12 && rect.right - event.pageX < 8) {\n bodyStyle.cursor = \'col-resize\';\n if (Object(dom_["hasClass"])(target, \'is-sortable\')) {\n target.style.cursor = \'col-resize\';\n }\n this.draggingColumn = column;\n } else if (!this.dragging) {\n bodyStyle.cursor = \'\';\n if (Object(dom_["hasClass"])(target, \'is-sortable\')) {\n target.style.cursor = \'pointer\';\n }\n this.draggingColumn = null;\n }\n }\n },\n handleMouseOut: function handleMouseOut() {\n if (this.$isServer) return;\n document.body.style.cursor = \'\';\n },\n toggleOrder: function toggleOrder(_ref) {\n var order = _ref.order,\n sortOrders = _ref.sortOrders;\n\n if (order === \'\') return sortOrders[0];\n var index = sortOrders.indexOf(order || null);\n return sortOrders[index > sortOrders.length - 2 ? 0 : index + 1];\n },\n handleSortClick: function handleSortClick(event, column, givenOrder) {\n event.stopPropagation();\n var order = column.order === givenOrder ? null : givenOrder || this.toggleOrder(column);\n\n var target = event.target;\n while (target && target.tagName !== \'TH\') {\n target = target.parentNode;\n }\n\n if (target && target.tagName === \'TH\') {\n if (Object(dom_["hasClass"])(target, \'noclick\')) {\n Object(dom_["removeClass"])(target, \'noclick\');\n return;\n }\n }\n\n if (!column.sortable) return;\n\n var states = this.store.states;\n var sortProp = states.sortProp;\n var sortOrder = void 0;\n var sortingColumn = states.sortingColumn;\n\n if (sortingColumn !== column || sortingColumn === column && sortingColumn.order === null) {\n if (sortingColumn) {\n sortingColumn.order = null;\n }\n states.sortingColumn = column;\n sortProp = column.property;\n }\n\n if (!order) {\n sortOrder = column.order = null;\n } else {\n sortOrder = column.order = order;\n }\n\n states.sortProp = sortProp;\n states.sortOrder = sortOrder;\n\n this.store.commit(\'changeSortCondition\');\n }\n },\n\n data: function data() {\n return {\n draggingColumn: null,\n dragging: false,\n dragState: {}\n };\n }\n});\n// CONCATENATED MODULE: ./packages/table/src/table-footer.js\nvar table_footer_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\n\n\n/* harmony default export */ var table_footer = ({\n name: \'ElTableFooter\',\n\n mixins: [layout_observer],\n\n render: function render(h) {\n var _this = this;\n\n var sums = [];\n if (this.summaryMethod) {\n sums = this.summaryMethod({ columns: this.columns, data: this.store.states.data });\n } else {\n this.columns.forEach(function (column, index) {\n if (index === 0) {\n sums[index] = _this.sumText;\n return;\n }\n var values = _this.store.states.data.map(function (item) {\n return Number(item[column.property]);\n });\n var precisions = [];\n var notNumber = true;\n values.forEach(function (value) {\n if (!isNaN(value)) {\n notNumber = false;\n var decimal = (\'\' + value).split(\'.\')[1];\n precisions.push(decimal ? decimal.length : 0);\n }\n });\n var precision = Math.max.apply(null, precisions);\n if (!notNumber) {\n sums[index] = values.reduce(function (prev, curr) {\n var value = Number(curr);\n if (!isNaN(value)) {\n return parseFloat((prev + curr).toFixed(Math.min(precision, 20)));\n } else {\n return prev;\n }\n }, 0);\n } else {\n sums[index] = \'\';\n }\n });\n }\n\n return h(\n \'table\',\n {\n \'class\': \'el-table__footer\',\n attrs: { cellspacing: \'0\',\n cellpadding: \'0\',\n border: \'0\' }\n },\n [h(\'colgroup\', [this.columns.map(function (column) {\n return h(\'col\', {\n attrs: { name: column.id },\n key: column.id });\n }), this.hasGutter ? h(\'col\', {\n attrs: { name: \'gutter\' }\n }) : \'\']), h(\n \'tbody\',\n { \'class\': [{ \'has-gutter\': this.hasGutter }] },\n [h(\'tr\', [this.columns.map(function (column, cellIndex) {\n return h(\n \'td\',\n {\n key: cellIndex,\n attrs: { colspan: column.colSpan,\n rowspan: column.rowSpan\n },\n \'class\': [].concat(_this.getRowClasses(column, cellIndex), [\'el-table__cell\']) },\n [h(\n \'div\',\n { \'class\': [\'cell\', column.labelClassName] },\n [sums[cellIndex]]\n )]\n );\n }), this.hasGutter ? h(\'th\', { \'class\': \'el-table__cell gutter\' }) : \'\'])]\n )]\n );\n },\n\n\n props: {\n fixed: String,\n store: {\n required: true\n },\n summaryMethod: Function,\n sumText: String,\n border: Boolean,\n defaultSort: {\n type: Object,\n default: function _default() {\n return {\n prop: \'\',\n order: \'\'\n };\n }\n }\n },\n\n computed: table_footer_extends({\n table: function table() {\n return this.$parent;\n },\n hasGutter: function hasGutter() {\n return !this.fixed && this.tableLayout.gutterWidth;\n }\n }, mapStates({\n columns: \'columns\',\n isAllSelected: \'isAllSelected\',\n leftFixedLeafCount: \'fixedLeafColumnsLength\',\n rightFixedLeafCount: \'rightFixedLeafColumnsLength\',\n columnsCount: function columnsCount(states) {\n return states.columns.length;\n },\n leftFixedCount: function leftFixedCount(states) {\n return states.fixedColumns.length;\n },\n rightFixedCount: function rightFixedCount(states) {\n return states.rightFixedColumns.length;\n }\n })),\n\n methods: {\n isCellHidden: function isCellHidden(index, columns, column) {\n if (this.fixed === true || this.fixed === \'left\') {\n return index >= this.leftFixedLeafCount;\n } else if (this.fixed === \'right\') {\n var before = 0;\n for (var i = 0; i < index; i++) {\n before += columns[i].colSpan;\n }\n return before < this.columnsCount - this.rightFixedLeafCount;\n } else if (!this.fixed && column.fixed) {\n // hide cell when footer instance is not fixed and column is fixed\n return true;\n } else {\n return index < this.leftFixedCount || index >= this.columnsCount - this.rightFixedCount;\n }\n },\n getRowClasses: function getRowClasses(column, cellIndex) {\n var classes = [column.id, column.align, column.labelClassName];\n if (column.className) {\n classes.push(column.className);\n }\n if (this.isCellHidden(cellIndex, this.columns, column)) {\n classes.push(\'is-hidden\');\n }\n if (!column.children) {\n classes.push(\'is-leaf\');\n }\n return classes;\n }\n }\n});\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/table/src/table.vue?vue&type=script&lang=js&\nvar tablevue_type_script_lang_js_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar tableIdSeed = 1;\n\n/* harmony default export */ var tablevue_type_script_lang_js_ = ({\n name: \'ElTable\',\n\n mixins: [locale_default.a, migrating_default.a],\n\n directives: {\n Mousewheel: directives_mousewheel\n },\n\n props: {\n data: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n\n size: String,\n\n width: [String, Number],\n\n height: [String, Number],\n\n maxHeight: [String, Number],\n\n fit: {\n type: Boolean,\n default: true\n },\n\n stripe: Boolean,\n\n border: Boolean,\n\n rowKey: [String, Function],\n\n context: {},\n\n showHeader: {\n type: Boolean,\n default: true\n },\n\n showSummary: Boolean,\n\n sumText: String,\n\n summaryMethod: Function,\n\n rowClassName: [String, Function],\n\n rowStyle: [Object, Function],\n\n cellClassName: [String, Function],\n\n cellStyle: [Object, Function],\n\n headerRowClassName: [String, Function],\n\n headerRowStyle: [Object, Function],\n\n headerCellClassName: [String, Function],\n\n headerCellStyle: [Object, Function],\n\n highlightCurrentRow: Boolean,\n\n currentRowKey: [String, Number],\n\n emptyText: String,\n\n expandRowKeys: Array,\n\n defaultExpandAll: Boolean,\n\n defaultSort: Object,\n\n tooltipEffect: String,\n\n spanMethod: Function,\n\n selectOnIndeterminate: {\n type: Boolean,\n default: true\n },\n\n indent: {\n type: Number,\n default: 16\n },\n\n treeProps: {\n type: Object,\n default: function _default() {\n return {\n hasChildren: \'hasChildren\',\n children: \'children\'\n };\n }\n },\n\n lazy: Boolean,\n\n load: Function\n },\n\n components: {\n TableHeader: table_header,\n TableFooter: table_footer,\n TableBody: table_body,\n ElCheckbox: checkbox_default.a\n },\n\n methods: {\n getMigratingConfig: function getMigratingConfig() {\n return {\n events: {\n expand: \'expand is renamed to expand-change\'\n }\n };\n },\n setCurrentRow: function setCurrentRow(row) {\n this.store.commit(\'setCurrentRow\', row);\n },\n toggleRowSelection: function toggleRowSelection(row, selected) {\n this.store.toggleRowSelection(row, selected, false);\n this.store.updateAllSelected();\n },\n toggleRowExpansion: function toggleRowExpansion(row, expanded) {\n this.store.toggleRowExpansionAdapter(row, expanded);\n },\n clearSelection: function clearSelection() {\n this.store.clearSelection();\n },\n clearFilter: function clearFilter(columnKeys) {\n this.store.clearFilter(columnKeys);\n },\n clearSort: function clearSort() {\n this.store.clearSort();\n },\n handleMouseLeave: function handleMouseLeave() {\n this.store.commit(\'setHoverRow\', null);\n if (this.hoverState) this.hoverState = null;\n },\n updateScrollY: function updateScrollY() {\n var changed = this.layout.updateScrollY();\n if (changed) {\n this.layout.notifyObservers(\'scrollable\');\n this.layout.updateColumnsWidth();\n }\n },\n handleFixedMousewheel: function handleFixedMousewheel(event, data) {\n var bodyWrapper = this.bodyWrapper;\n if (Math.abs(data.spinY) > 0) {\n var currentScrollTop = bodyWrapper.scrollTop;\n if (data.pixelY < 0 && currentScrollTop !== 0) {\n event.preventDefault();\n }\n if (data.pixelY > 0 && bodyWrapper.scrollHeight - bodyWrapper.clientHeight > currentScrollTop) {\n event.preventDefault();\n }\n bodyWrapper.scrollTop += Math.ceil(data.pixelY / 5);\n } else {\n bodyWrapper.scrollLeft += Math.ceil(data.pixelX / 5);\n }\n },\n handleHeaderFooterMousewheel: function handleHeaderFooterMousewheel(event, data) {\n var pixelX = data.pixelX,\n pixelY = data.pixelY;\n\n if (Math.abs(pixelX) >= Math.abs(pixelY)) {\n this.bodyWrapper.scrollLeft += data.pixelX / 5;\n }\n },\n\n\n // TODO 使用 CSS transform\n syncPostion: function syncPostion() {\n var _bodyWrapper = this.bodyWrapper,\n scrollLeft = _bodyWrapper.scrollLeft,\n scrollTop = _bodyWrapper.scrollTop,\n offsetWidth = _bodyWrapper.offsetWidth,\n scrollWidth = _bodyWrapper.scrollWidth;\n var _$refs = this.$refs,\n headerWrapper = _$refs.headerWrapper,\n footerWrapper = _$refs.footerWrapper,\n fixedBodyWrapper = _$refs.fixedBodyWrapper,\n rightFixedBodyWrapper = _$refs.rightFixedBodyWrapper;\n\n if (headerWrapper) headerWrapper.scrollLeft = scrollLeft;\n if (footerWrapper) footerWrapper.scrollLeft = scrollLeft;\n if (fixedBodyWrapper) fixedBodyWrapper.scrollTop = scrollTop;\n if (rightFixedBodyWrapper) rightFixedBodyWrapper.scrollTop = scrollTop;\n var maxScrollLeftPosition = scrollWidth - offsetWidth - 1;\n if (scrollLeft >= maxScrollLeftPosition) {\n this.scrollPosition = \'right\';\n } else if (scrollLeft === 0) {\n this.scrollPosition = \'left\';\n } else {\n this.scrollPosition = \'middle\';\n }\n },\n\n\n throttleSyncPostion: Object(external_throttle_debounce_["throttle"])(16, function () {\n this.syncPostion();\n }),\n\n onScroll: function onScroll(evt) {\n var raf = window.requestAnimationFrame;\n if (!raf) {\n this.throttleSyncPostion();\n } else {\n raf(this.syncPostion);\n }\n },\n bindEvents: function bindEvents() {\n this.bodyWrapper.addEventListener(\'scroll\', this.onScroll, { passive: true });\n if (this.fit) {\n Object(resize_event_["addResizeListener"])(this.$el, this.resizeListener);\n }\n },\n unbindEvents: function unbindEvents() {\n this.bodyWrapper.removeEventListener(\'scroll\', this.onScroll, { passive: true });\n if (this.fit) {\n Object(resize_event_["removeResizeListener"])(this.$el, this.resizeListener);\n }\n },\n resizeListener: function resizeListener() {\n if (!this.$ready) return;\n var shouldUpdateLayout = false;\n var el = this.$el;\n var _resizeState = this.resizeState,\n oldWidth = _resizeState.width,\n oldHeight = _resizeState.height;\n\n\n var width = el.offsetWidth;\n if (oldWidth !== width) {\n shouldUpdateLayout = true;\n }\n\n var height = el.offsetHeight;\n if ((this.height || this.shouldUpdateHeight) && oldHeight !== height) {\n shouldUpdateLayout = true;\n }\n\n if (shouldUpdateLayout) {\n this.resizeState.width = width;\n this.resizeState.height = height;\n this.doLayout();\n }\n },\n doLayout: function doLayout() {\n if (this.shouldUpdateHeight) {\n this.layout.updateElsHeight();\n }\n this.layout.updateColumnsWidth();\n },\n sort: function sort(prop, order) {\n this.store.commit(\'sort\', { prop: prop, order: order });\n },\n toggleAllSelection: function toggleAllSelection() {\n this.store.commit(\'toggleAllSelection\');\n }\n },\n\n computed: tablevue_type_script_lang_js_extends({\n tableSize: function tableSize() {\n return this.size || (this.$ELEMENT || {}).size;\n },\n bodyWrapper: function bodyWrapper() {\n return this.$refs.bodyWrapper;\n },\n shouldUpdateHeight: function shouldUpdateHeight() {\n return this.height || this.maxHeight || this.fixedColumns.length > 0 || this.rightFixedColumns.length > 0;\n },\n bodyWidth: function bodyWidth() {\n var _layout = this.layout,\n bodyWidth = _layout.bodyWidth,\n scrollY = _layout.scrollY,\n gutterWidth = _layout.gutterWidth;\n\n return bodyWidth ? bodyWidth - (scrollY ? gutterWidth : 0) + \'px\' : \'\';\n },\n bodyHeight: function bodyHeight() {\n var _layout2 = this.layout,\n _layout2$headerHeight = _layout2.headerHeight,\n headerHeight = _layout2$headerHeight === undefined ? 0 : _layout2$headerHeight,\n bodyHeight = _layout2.bodyHeight,\n _layout2$footerHeight = _layout2.footerHeight,\n footerHeight = _layout2$footerHeight === undefined ? 0 : _layout2$footerHeight;\n\n if (this.height) {\n return {\n height: bodyHeight ? bodyHeight + \'px\' : \'\'\n };\n } else if (this.maxHeight) {\n var maxHeight = parseHeight(this.maxHeight);\n if (typeof maxHeight === \'number\') {\n return {\n \'max-height\': maxHeight - footerHeight - (this.showHeader ? headerHeight : 0) + \'px\'\n };\n }\n }\n return {};\n },\n fixedBodyHeight: function fixedBodyHeight() {\n if (this.height) {\n return {\n height: this.layout.fixedBodyHeight ? this.layout.fixedBodyHeight + \'px\' : \'\'\n };\n } else if (this.maxHeight) {\n var maxHeight = parseHeight(this.maxHeight);\n if (typeof maxHeight === \'number\') {\n maxHeight = this.layout.scrollX ? maxHeight - this.layout.gutterWidth : maxHeight;\n if (this.showHeader) {\n maxHeight -= this.layout.headerHeight;\n }\n maxHeight -= this.layout.footerHeight;\n return {\n \'max-height\': maxHeight + \'px\'\n };\n }\n }\n return {};\n },\n fixedHeight: function fixedHeight() {\n if (this.maxHeight) {\n if (this.showSummary) {\n return {\n bottom: 0\n };\n }\n return {\n bottom: this.layout.scrollX && this.data.length ? this.layout.gutterWidth + \'px\' : \'\'\n };\n } else {\n if (this.showSummary) {\n return {\n height: this.layout.tableHeight ? this.layout.tableHeight + \'px\' : \'\'\n };\n }\n return {\n height: this.layout.viewportHeight ? this.layout.viewportHeight + \'px\' : \'\'\n };\n }\n },\n emptyBlockStyle: function emptyBlockStyle() {\n if (this.data && this.data.length) return null;\n var height = \'100%\';\n if (this.layout.appendHeight) {\n height = \'calc(100% - \' + this.layout.appendHeight + \'px)\';\n }\n return {\n width: this.bodyWidth,\n height: height\n };\n }\n }, mapStates({\n selection: \'selection\',\n columns: \'columns\',\n tableData: \'data\',\n fixedColumns: \'fixedColumns\',\n rightFixedColumns: \'rightFixedColumns\'\n })),\n\n watch: {\n height: {\n immediate: true,\n handler: function handler(value) {\n this.layout.setHeight(value);\n }\n },\n\n maxHeight: {\n immediate: true,\n handler: function handler(value) {\n this.layout.setMaxHeight(value);\n }\n },\n\n currentRowKey: {\n immediate: true,\n handler: function handler(value) {\n if (!this.rowKey) return;\n this.store.setCurrentRowKey(value);\n }\n },\n\n data: {\n immediate: true,\n handler: function handler(value) {\n this.store.commit(\'setData\', value);\n }\n },\n\n expandRowKeys: {\n immediate: true,\n handler: function handler(newVal) {\n if (newVal) {\n this.store.setExpandRowKeysAdapter(newVal);\n }\n }\n }\n },\n\n created: function created() {\n var _this = this;\n\n this.tableId = \'el-table_\' + tableIdSeed++;\n this.debouncedUpdateLayout = Object(external_throttle_debounce_["debounce"])(50, function () {\n return _this.doLayout();\n });\n },\n mounted: function mounted() {\n var _this2 = this;\n\n this.bindEvents();\n this.store.updateColumns();\n this.doLayout();\n\n this.resizeState = {\n width: this.$el.offsetWidth,\n height: this.$el.offsetHeight\n };\n\n // init filters\n this.store.states.columns.forEach(function (column) {\n if (column.filteredValue && column.filteredValue.length) {\n _this2.store.commit(\'filterChange\', {\n column: column,\n values: column.filteredValue,\n silent: true\n });\n }\n });\n\n this.$ready = true;\n },\n destroyed: function destroyed() {\n this.unbindEvents();\n },\n data: function data() {\n var _treeProps = this.treeProps,\n _treeProps$hasChildre = _treeProps.hasChildren,\n hasChildren = _treeProps$hasChildre === undefined ? \'hasChildren\' : _treeProps$hasChildre,\n _treeProps$children = _treeProps.children,\n children = _treeProps$children === undefined ? \'children\' : _treeProps$children;\n\n this.store = createStore(this, {\n rowKey: this.rowKey,\n defaultExpandAll: this.defaultExpandAll,\n selectOnIndeterminate: this.selectOnIndeterminate,\n // TreeTable 的相关配置\n indent: this.indent,\n lazy: this.lazy,\n lazyColumnIdentifier: hasChildren,\n childrenColumnName: children\n });\n var layout = new table_layout({\n store: this.store,\n table: this,\n fit: this.fit,\n showHeader: this.showHeader\n });\n return {\n layout: layout,\n isHidden: false,\n renderExpanded: null,\n resizeProxyVisible: false,\n resizeState: {\n width: null,\n height: null\n },\n // 是否拥有多级表头\n isGroup: false,\n scrollPosition: \'left\'\n };\n }\n});\n// CONCATENATED MODULE: ./packages/table/src/table.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_tablevue_type_script_lang_js_ = (tablevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/table/src/table.vue\n\n\n\n\n\n/* normalize component */\n\nvar table_component = normalizeComponent(\n src_tablevue_type_script_lang_js_,\n tablevue_type_template_id_493fe34e_render,\n tablevue_type_template_id_493fe34e_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var table_api; }\ntable_component.options.__file = "packages/table/src/table.vue"\n/* harmony default export */ var src_table = (table_component.exports);\n// CONCATENATED MODULE: ./packages/table/index.js\n\n\n/* istanbul ignore next */\nsrc_table.install = function (Vue) {\n Vue.component(src_table.name, src_table);\n};\n\n/* harmony default export */ var packages_table = (src_table);\n// CONCATENATED MODULE: ./packages/table/src/config.js\n\n\nvar cellStarts = {\n default: {\n order: \'\'\n },\n selection: {\n width: 48,\n minWidth: 48,\n realWidth: 48,\n order: \'\',\n className: \'el-table-column--selection\'\n },\n expand: {\n width: 48,\n minWidth: 48,\n realWidth: 48,\n order: \'\'\n },\n index: {\n width: 48,\n minWidth: 48,\n realWidth: 48,\n order: \'\'\n }\n};\n\n// 这些选项不应该被覆盖\nvar cellForced = {\n selection: {\n renderHeader: function renderHeader(h, _ref) {\n var store = _ref.store;\n\n return h(\'el-checkbox\', {\n attrs: {\n disabled: store.states.data && store.states.data.length === 0,\n indeterminate: store.states.selection.length > 0 && !this.isAllSelected,\n\n value: this.isAllSelected },\n on: {\n \'input\': this.toggleAllSelection\n }\n });\n },\n renderCell: function renderCell(h, _ref2) {\n var row = _ref2.row,\n column = _ref2.column,\n isSelected = _ref2.isSelected,\n store = _ref2.store,\n $index = _ref2.$index;\n\n return h(\'el-checkbox\', {\n nativeOn: {\n \'click\': function click(event) {\n return event.stopPropagation();\n }\n },\n attrs: {\n value: isSelected,\n disabled: column.selectable ? !column.selectable.call(null, row, $index) : false\n },\n on: {\n \'input\': function input() {\n store.commit(\'rowSelectedChanged\', row);\n }\n }\n });\n },\n sortable: false,\n resizable: false\n },\n index: {\n renderHeader: function renderHeader(h, _ref3) {\n var column = _ref3.column;\n\n return column.label || \'#\';\n },\n renderCell: function renderCell(h, _ref4) {\n var $index = _ref4.$index,\n column = _ref4.column;\n\n var i = $index + 1;\n var index = column.index;\n\n if (typeof index === \'number\') {\n i = $index + index;\n } else if (typeof index === \'function\') {\n i = index($index);\n }\n\n return h(\'div\', [i]);\n },\n sortable: false\n },\n expand: {\n renderHeader: function renderHeader(h, _ref5) {\n var column = _ref5.column;\n\n return column.label || \'\';\n },\n renderCell: function renderCell(h, _ref6) {\n var row = _ref6.row,\n store = _ref6.store,\n isExpanded = _ref6.isExpanded;\n\n var classes = [\'el-table__expand-icon\'];\n if (isExpanded) {\n classes.push(\'el-table__expand-icon--expanded\');\n }\n var callback = function callback(e) {\n e.stopPropagation();\n store.toggleRowExpansion(row);\n };\n return h(\n \'div\',\n { \'class\': classes,\n on: {\n \'click\': callback\n }\n },\n [h(\'i\', { \'class\': \'el-icon el-icon-arrow-right\' })]\n );\n },\n sortable: false,\n resizable: false,\n className: \'el-table__expand-column\'\n }\n};\n\nfunction defaultRenderCell(h, _ref7) {\n var row = _ref7.row,\n column = _ref7.column,\n $index = _ref7.$index;\n\n var property = column.property;\n var value = property && Object(util_["getPropByPath"])(row, property).v;\n if (column && column.formatter) {\n return column.formatter(row, column, value, $index);\n }\n return value;\n}\n\nfunction treeCellPrefix(h, _ref8) {\n var row = _ref8.row,\n treeNode = _ref8.treeNode,\n store = _ref8.store;\n\n if (!treeNode) return null;\n var ele = [];\n var callback = function callback(e) {\n e.stopPropagation();\n store.loadOrToggle(row);\n };\n if (treeNode.indent) {\n ele.push(h(\'span\', { \'class\': \'el-table__indent\', style: { \'padding-left\': treeNode.indent + \'px\' } }));\n }\n if (typeof treeNode.expanded === \'boolean\' && !treeNode.noLazyChildren) {\n var expandClasses = [\'el-table__expand-icon\', treeNode.expanded ? \'el-table__expand-icon--expanded\' : \'\'];\n var iconClasses = [\'el-icon-arrow-right\'];\n if (treeNode.loading) {\n iconClasses = [\'el-icon-loading\'];\n }\n ele.push(h(\n \'div\',\n { \'class\': expandClasses,\n on: {\n \'click\': callback\n }\n },\n [h(\'i\', { \'class\': iconClasses })]\n ));\n } else {\n ele.push(h(\'span\', { \'class\': \'el-table__placeholder\' }));\n }\n return ele;\n}\n// CONCATENATED MODULE: ./packages/table/src/table-column.js\nvar table_column_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\n\n\n\nvar columnIdSeed = 1;\n\n/* harmony default export */ var table_column = ({\n name: \'ElTableColumn\',\n\n props: {\n type: {\n type: String,\n default: \'default\'\n },\n label: String,\n className: String,\n labelClassName: String,\n property: String,\n prop: String,\n width: {},\n minWidth: {},\n renderHeader: Function,\n sortable: {\n type: [Boolean, String],\n default: false\n },\n sortMethod: Function,\n sortBy: [String, Function, Array],\n resizable: {\n type: Boolean,\n default: true\n },\n columnKey: String,\n align: String,\n headerAlign: String,\n showTooltipWhenOverflow: Boolean,\n showOverflowTooltip: Boolean,\n fixed: [Boolean, String],\n formatter: Function,\n selectable: Function,\n reserveSelection: Boolean,\n filterMethod: Function,\n filteredValue: Array,\n filters: Array,\n filterPlacement: String,\n filterMultiple: {\n type: Boolean,\n default: true\n },\n index: [Number, Function],\n sortOrders: {\n type: Array,\n default: function _default() {\n return [\'ascending\', \'descending\', null];\n },\n validator: function validator(val) {\n return val.every(function (order) {\n return [\'ascending\', \'descending\', null].indexOf(order) > -1;\n });\n }\n }\n },\n\n data: function data() {\n return {\n isSubColumn: false,\n columns: []\n };\n },\n\n\n computed: {\n owner: function owner() {\n var parent = this.$parent;\n while (parent && !parent.tableId) {\n parent = parent.$parent;\n }\n return parent;\n },\n columnOrTableParent: function columnOrTableParent() {\n var parent = this.$parent;\n while (parent && !parent.tableId && !parent.columnId) {\n parent = parent.$parent;\n }\n return parent;\n },\n realWidth: function realWidth() {\n return parseWidth(this.width);\n },\n realMinWidth: function realMinWidth() {\n return parseMinWidth(this.minWidth);\n },\n realAlign: function realAlign() {\n return this.align ? \'is-\' + this.align : null;\n },\n realHeaderAlign: function realHeaderAlign() {\n return this.headerAlign ? \'is-\' + this.headerAlign : this.realAlign;\n }\n },\n\n methods: {\n getPropsData: function getPropsData() {\n var _this = this;\n\n for (var _len = arguments.length, props = Array(_len), _key = 0; _key < _len; _key++) {\n props[_key] = arguments[_key];\n }\n\n return props.reduce(function (prev, cur) {\n if (Array.isArray(cur)) {\n cur.forEach(function (key) {\n prev[key] = _this[key];\n });\n }\n return prev;\n }, {});\n },\n getColumnElIndex: function getColumnElIndex(children, child) {\n return [].indexOf.call(children, child);\n },\n setColumnWidth: function setColumnWidth(column) {\n if (this.realWidth) {\n column.width = this.realWidth;\n }\n if (this.realMinWidth) {\n column.minWidth = this.realMinWidth;\n }\n if (!column.minWidth) {\n column.minWidth = 80;\n }\n column.realWidth = column.width === undefined ? column.minWidth : column.width;\n return column;\n },\n setColumnForcedProps: function setColumnForcedProps(column) {\n // 对于特定类型的 column,某些属性不允许设置\n var type = column.type;\n var source = cellForced[type] || {};\n Object.keys(source).forEach(function (prop) {\n var value = source[prop];\n if (value !== undefined) {\n column[prop] = prop === \'className\' ? column[prop] + \' \' + value : value;\n }\n });\n return column;\n },\n setColumnRenders: function setColumnRenders(column) {\n var _this2 = this;\n\n var h = this.$createElement;\n\n // renderHeader 属性不推荐使用。\n if (this.renderHeader) {\n console.warn(\'[Element Warn][TableColumn]Comparing to render-header, scoped-slot header is easier to use. We recommend users to use scoped-slot header.\');\n } else if (column.type !== \'selection\') {\n column.renderHeader = function (h, scope) {\n var renderHeader = _this2.$scopedSlots.header;\n return renderHeader ? renderHeader(scope) : column.label;\n };\n }\n\n var originRenderCell = column.renderCell;\n // TODO: 这里的实现调整\n if (column.type === \'expand\') {\n // 对于展开行,renderCell 不允许配置的。在上一步中已经设置过,这里需要简单封装一下。\n column.renderCell = function (h, data) {\n return h(\n \'div\',\n { \'class\': \'cell\' },\n [originRenderCell(h, data)]\n );\n };\n this.owner.renderExpanded = function (h, data) {\n return _this2.$scopedSlots.default ? _this2.$scopedSlots.default(data) : _this2.$slots.default;\n };\n } else {\n originRenderCell = originRenderCell || defaultRenderCell;\n // 对 renderCell 进行包装\n column.renderCell = function (h, data) {\n var children = null;\n if (_this2.$scopedSlots.default) {\n children = _this2.$scopedSlots.default(data);\n } else {\n children = originRenderCell(h, data);\n }\n var prefix = treeCellPrefix(h, data);\n var props = {\n class: \'cell\',\n style: {}\n };\n if (column.showOverflowTooltip) {\n props.class += \' el-tooltip\';\n props.style = { width: (data.column.realWidth || data.column.width) - 1 + \'px\' };\n }\n return h(\n \'div\',\n props,\n [prefix, children]\n );\n };\n }\n return column;\n },\n registerNormalWatchers: function registerNormalWatchers() {\n var _this3 = this;\n\n var props = [\'label\', \'property\', \'filters\', \'filterMultiple\', \'sortable\', \'index\', \'formatter\', \'className\', \'labelClassName\', \'showOverflowTooltip\'];\n // 一些属性具有别名\n var aliases = {\n prop: \'property\',\n realAlign: \'align\',\n realHeaderAlign: \'headerAlign\',\n realWidth: \'width\'\n };\n var allAliases = props.reduce(function (prev, cur) {\n prev[cur] = cur;\n return prev;\n }, aliases);\n\n Object.keys(allAliases).forEach(function (key) {\n var columnKey = aliases[key];\n\n _this3.$watch(key, function (newVal) {\n _this3.columnConfig[columnKey] = newVal;\n });\n });\n },\n registerComplexWatchers: function registerComplexWatchers() {\n var _this4 = this;\n\n var props = [\'fixed\'];\n var aliases = {\n realWidth: \'width\',\n realMinWidth: \'minWidth\'\n };\n var allAliases = props.reduce(function (prev, cur) {\n prev[cur] = cur;\n return prev;\n }, aliases);\n\n Object.keys(allAliases).forEach(function (key) {\n var columnKey = aliases[key];\n\n _this4.$watch(key, function (newVal) {\n _this4.columnConfig[columnKey] = newVal;\n var updateColumns = columnKey === \'fixed\';\n _this4.owner.store.scheduleLayout(updateColumns);\n });\n });\n }\n },\n\n components: {\n ElCheckbox: checkbox_default.a\n },\n\n beforeCreate: function beforeCreate() {\n this.row = {};\n this.column = {};\n this.$index = 0;\n this.columnId = \'\';\n },\n created: function created() {\n var parent = this.columnOrTableParent;\n this.isSubColumn = this.owner !== parent;\n this.columnId = (parent.tableId || parent.columnId) + \'_column_\' + columnIdSeed++;\n\n var type = this.type || \'default\';\n var sortable = this.sortable === \'\' ? true : this.sortable;\n var defaults = table_column_extends({}, cellStarts[type], {\n id: this.columnId,\n type: type,\n property: this.prop || this.property,\n align: this.realAlign,\n headerAlign: this.realHeaderAlign,\n showOverflowTooltip: this.showOverflowTooltip || this.showTooltipWhenOverflow,\n // filter 相关属性\n filterable: this.filters || this.filterMethod,\n filteredValue: [],\n filterPlacement: \'\',\n isColumnGroup: false,\n filterOpened: false,\n // sort 相关属性\n sortable: sortable,\n // index 列\n index: this.index\n });\n\n var basicProps = [\'columnKey\', \'label\', \'className\', \'labelClassName\', \'type\', \'renderHeader\', \'formatter\', \'fixed\', \'resizable\'];\n var sortProps = [\'sortMethod\', \'sortBy\', \'sortOrders\'];\n var selectProps = [\'selectable\', \'reserveSelection\'];\n var filterProps = [\'filterMethod\', \'filters\', \'filterMultiple\', \'filterOpened\', \'filteredValue\', \'filterPlacement\'];\n\n var column = this.getPropsData(basicProps, sortProps, selectProps, filterProps);\n column = mergeOptions(defaults, column);\n\n // 注意 compose 中函数执行的顺序是从右到左\n var chains = compose(this.setColumnRenders, this.setColumnWidth, this.setColumnForcedProps);\n column = chains(column);\n\n this.columnConfig = column;\n\n // 注册 watcher\n this.registerNormalWatchers();\n this.registerComplexWatchers();\n },\n mounted: function mounted() {\n var owner = this.owner;\n var parent = this.columnOrTableParent;\n var children = this.isSubColumn ? parent.$el.children : parent.$refs.hiddenColumns.children;\n var columnIndex = this.getColumnElIndex(children, this.$el);\n\n owner.store.commit(\'insertColumn\', this.columnConfig, columnIndex, this.isSubColumn ? parent.columnConfig : null);\n },\n destroyed: function destroyed() {\n if (!this.$parent) return;\n var parent = this.$parent;\n this.owner.store.commit(\'removeColumn\', this.columnConfig, this.isSubColumn ? parent.columnConfig : null);\n },\n render: function render(h) {\n // slots 也要渲染,需要计算合并表头\n return h(\'div\', this.$slots.default);\n }\n});\n// CONCATENATED MODULE: ./packages/table-column/index.js\n\n\n/* istanbul ignore next */\ntable_column.install = function (Vue) {\n Vue.component(table_column.name, table_column);\n};\n\n/* harmony default export */ var packages_table_column = (table_column);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/picker.vue?vue&type=template&id=79ae069f&\nvar pickervue_type_template_id_79ae069f_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return !_vm.ranged\n ? _c(\n "el-input",\n _vm._b(\n {\n directives: [\n {\n name: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.handleClose,\n expression: "handleClose"\n }\n ],\n ref: "reference",\n staticClass: "el-date-editor",\n class: "el-date-editor--" + _vm.type,\n attrs: {\n readonly:\n !_vm.editable ||\n _vm.readonly ||\n _vm.type === "dates" ||\n _vm.type === "week" ||\n _vm.type === "years" ||\n _vm.type === "months",\n disabled: _vm.pickerDisabled,\n size: _vm.pickerSize,\n name: _vm.name,\n placeholder: _vm.placeholder,\n value: _vm.displayValue,\n validateEvent: false\n },\n on: {\n focus: _vm.handleFocus,\n input: function(value) {\n return (_vm.userInput = value)\n },\n change: _vm.handleChange\n },\n nativeOn: {\n keydown: function($event) {\n return _vm.handleKeydown($event)\n },\n mouseenter: function($event) {\n return _vm.handleMouseEnter($event)\n },\n mouseleave: function($event) {\n _vm.showClose = false\n }\n }\n },\n "el-input",\n _vm.firstInputId,\n false\n ),\n [\n _c("i", {\n staticClass: "el-input__icon",\n class: _vm.triggerClass,\n attrs: { slot: "prefix" },\n on: { click: _vm.handleFocus },\n slot: "prefix"\n }),\n _vm.haveTrigger\n ? _c("i", {\n staticClass: "el-input__icon",\n class: [_vm.showClose ? "" + _vm.clearIcon : ""],\n attrs: { slot: "suffix" },\n on: { click: _vm.handleClickIcon },\n slot: "suffix"\n })\n : _vm._e()\n ]\n )\n : _c(\n "div",\n {\n directives: [\n {\n name: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.handleClose,\n expression: "handleClose"\n }\n ],\n ref: "reference",\n staticClass: "el-date-editor el-range-editor el-input__inner",\n class: [\n "el-date-editor--" + _vm.type,\n _vm.pickerSize ? "el-range-editor--" + _vm.pickerSize : "",\n _vm.pickerDisabled ? "is-disabled" : "",\n _vm.pickerVisible ? "is-active" : ""\n ],\n on: {\n click: _vm.handleRangeClick,\n mouseenter: _vm.handleMouseEnter,\n mouseleave: function($event) {\n _vm.showClose = false\n },\n keydown: _vm.handleKeydown\n }\n },\n [\n _c("i", {\n class: ["el-input__icon", "el-range__icon", _vm.triggerClass]\n }),\n _c(\n "input",\n _vm._b(\n {\n staticClass: "el-range-input",\n attrs: {\n autocomplete: "off",\n placeholder: _vm.startPlaceholder,\n disabled: _vm.pickerDisabled,\n readonly: !_vm.editable || _vm.readonly,\n name: _vm.name && _vm.name[0]\n },\n domProps: { value: _vm.displayValue && _vm.displayValue[0] },\n on: {\n input: _vm.handleStartInput,\n change: _vm.handleStartChange,\n focus: _vm.handleFocus\n }\n },\n "input",\n _vm.firstInputId,\n false\n )\n ),\n _vm._t("range-separator", [\n _c("span", { staticClass: "el-range-separator" }, [\n _vm._v(_vm._s(_vm.rangeSeparator))\n ])\n ]),\n _c(\n "input",\n _vm._b(\n {\n staticClass: "el-range-input",\n attrs: {\n autocomplete: "off",\n placeholder: _vm.endPlaceholder,\n disabled: _vm.pickerDisabled,\n readonly: !_vm.editable || _vm.readonly,\n name: _vm.name && _vm.name[1]\n },\n domProps: { value: _vm.displayValue && _vm.displayValue[1] },\n on: {\n input: _vm.handleEndInput,\n change: _vm.handleEndChange,\n focus: _vm.handleFocus\n }\n },\n "input",\n _vm.secondInputId,\n false\n )\n ),\n _vm.haveTrigger\n ? _c("i", {\n staticClass: "el-input__icon el-range__close-icon",\n class: [_vm.showClose ? "" + _vm.clearIcon : ""],\n on: { click: _vm.handleClickIcon }\n })\n : _vm._e()\n ],\n 2\n )\n}\nvar pickervue_type_template_id_79ae069f_staticRenderFns = []\npickervue_type_template_id_79ae069f_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/date-picker/src/picker.vue?vue&type=template&id=79ae069f&\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/date-util"\nvar date_util_ = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/picker.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n\nvar NewPopper = {\n props: {\n appendToBody: vue_popper_default.a.props.appendToBody,\n offset: vue_popper_default.a.props.offset,\n boundariesPadding: vue_popper_default.a.props.boundariesPadding,\n arrowOffset: vue_popper_default.a.props.arrowOffset,\n transformOrigin: vue_popper_default.a.props.transformOrigin\n },\n methods: vue_popper_default.a.methods,\n data: function data() {\n return merge_default()({ visibleArrow: true }, vue_popper_default.a.data);\n },\n\n beforeDestroy: vue_popper_default.a.beforeDestroy\n};\n\nvar DEFAULT_FORMATS = {\n date: \'yyyy-MM-dd\',\n month: \'yyyy-MM\',\n months: \'yyyy-MM\',\n datetime: \'yyyy-MM-dd HH:mm:ss\',\n time: \'HH:mm:ss\',\n week: \'yyyywWW\',\n timerange: \'HH:mm:ss\',\n daterange: \'yyyy-MM-dd\',\n monthrange: \'yyyy-MM\',\n datetimerange: \'yyyy-MM-dd HH:mm:ss\',\n year: \'yyyy\',\n years: \'yyyy\'\n};\nvar HAVE_TRIGGER_TYPES = [\'date\', \'datetime\', \'time\', \'time-select\', \'week\', \'month\', \'year\', \'daterange\', \'monthrange\', \'timerange\', \'datetimerange\', \'dates\', \'months\', \'years\'];\nvar pickervue_type_script_lang_js_DATE_FORMATTER = function DATE_FORMATTER(value, format) {\n if (format === \'timestamp\') return value.getTime();\n return Object(date_util_["formatDate"])(value, format);\n};\nvar pickervue_type_script_lang_js_DATE_PARSER = function DATE_PARSER(text, format) {\n if (format === \'timestamp\') return new Date(Number(text));\n return Object(date_util_["parseDate"])(text, format);\n};\nvar RANGE_FORMATTER = function RANGE_FORMATTER(value, format) {\n if (Array.isArray(value) && value.length === 2) {\n var start = value[0];\n var end = value[1];\n\n if (start && end) {\n return [pickervue_type_script_lang_js_DATE_FORMATTER(start, format), pickervue_type_script_lang_js_DATE_FORMATTER(end, format)];\n }\n }\n return \'\';\n};\nvar RANGE_PARSER = function RANGE_PARSER(array, format, separator) {\n if (!Array.isArray(array)) {\n array = array.split(separator);\n }\n if (array.length === 2) {\n var range1 = array[0];\n var range2 = array[1];\n\n return [pickervue_type_script_lang_js_DATE_PARSER(range1, format), pickervue_type_script_lang_js_DATE_PARSER(range2, format)];\n }\n return [];\n};\nvar TYPE_VALUE_RESOLVER_MAP = {\n default: {\n formatter: function formatter(value) {\n if (!value) return \'\';\n return \'\' + value;\n },\n parser: function parser(text) {\n if (text === undefined || text === \'\') return null;\n return text;\n }\n },\n week: {\n formatter: function formatter(value, format) {\n var week = Object(date_util_["getWeekNumber"])(value);\n var month = value.getMonth();\n var trueDate = new Date(value);\n if (week === 1 && month === 11) {\n trueDate.setHours(0, 0, 0, 0);\n trueDate.setDate(trueDate.getDate() + 3 - (trueDate.getDay() + 6) % 7);\n }\n var date = Object(date_util_["formatDate"])(trueDate, format);\n\n date = /WW/.test(date) ? date.replace(/WW/, week < 10 ? \'0\' + week : week) : date.replace(/W/, week);\n return date;\n },\n parser: function parser(text, format) {\n // parse as if a normal date\n return TYPE_VALUE_RESOLVER_MAP.date.parser(text, format);\n }\n },\n date: {\n formatter: pickervue_type_script_lang_js_DATE_FORMATTER,\n parser: pickervue_type_script_lang_js_DATE_PARSER\n },\n datetime: {\n formatter: pickervue_type_script_lang_js_DATE_FORMATTER,\n parser: pickervue_type_script_lang_js_DATE_PARSER\n },\n daterange: {\n formatter: RANGE_FORMATTER,\n parser: RANGE_PARSER\n },\n monthrange: {\n formatter: RANGE_FORMATTER,\n parser: RANGE_PARSER\n },\n datetimerange: {\n formatter: RANGE_FORMATTER,\n parser: RANGE_PARSER\n },\n timerange: {\n formatter: RANGE_FORMATTER,\n parser: RANGE_PARSER\n },\n time: {\n formatter: pickervue_type_script_lang_js_DATE_FORMATTER,\n parser: pickervue_type_script_lang_js_DATE_PARSER\n },\n month: {\n formatter: pickervue_type_script_lang_js_DATE_FORMATTER,\n parser: pickervue_type_script_lang_js_DATE_PARSER\n },\n year: {\n formatter: pickervue_type_script_lang_js_DATE_FORMATTER,\n parser: pickervue_type_script_lang_js_DATE_PARSER\n },\n number: {\n formatter: function formatter(value) {\n if (!value) return \'\';\n return \'\' + value;\n },\n parser: function parser(text) {\n var result = Number(text);\n\n if (!isNaN(text)) {\n return result;\n } else {\n return null;\n }\n }\n },\n dates: {\n formatter: function formatter(value, format) {\n return value.map(function (date) {\n return pickervue_type_script_lang_js_DATE_FORMATTER(date, format);\n });\n },\n parser: function parser(value, format) {\n return (typeof value === \'string\' ? value.split(\', \') : value).map(function (date) {\n return date instanceof Date ? date : pickervue_type_script_lang_js_DATE_PARSER(date, format);\n });\n }\n },\n months: {\n formatter: function formatter(value, format) {\n return value.map(function (date) {\n return pickervue_type_script_lang_js_DATE_FORMATTER(date, format);\n });\n },\n parser: function parser(value, format) {\n return (typeof value === \'string\' ? value.split(\', \') : value).map(function (date) {\n return date instanceof Date ? date : pickervue_type_script_lang_js_DATE_PARSER(date, format);\n });\n }\n },\n years: {\n formatter: function formatter(value, format) {\n return value.map(function (date) {\n return pickervue_type_script_lang_js_DATE_FORMATTER(date, format);\n });\n },\n parser: function parser(value, format) {\n return (typeof value === \'string\' ? value.split(\', \') : value).map(function (date) {\n return date instanceof Date ? date : pickervue_type_script_lang_js_DATE_PARSER(date, format);\n });\n }\n }\n};\nvar PLACEMENT_MAP = {\n left: \'bottom-start\',\n center: \'bottom\',\n right: \'bottom-end\'\n};\n\nvar parseAsFormatAndType = function parseAsFormatAndType(value, customFormat, type) {\n var rangeSeparator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \'-\';\n\n if (!value) return null;\n var parser = (TYPE_VALUE_RESOLVER_MAP[type] || TYPE_VALUE_RESOLVER_MAP[\'default\']).parser;\n var format = customFormat || DEFAULT_FORMATS[type];\n return parser(value, format, rangeSeparator);\n};\n\nvar formatAsFormatAndType = function formatAsFormatAndType(value, customFormat, type) {\n if (!value) return null;\n var formatter = (TYPE_VALUE_RESOLVER_MAP[type] || TYPE_VALUE_RESOLVER_MAP[\'default\']).formatter;\n var format = customFormat || DEFAULT_FORMATS[type];\n return formatter(value, format);\n};\n\n/*\n * Considers:\n * 1. Date object\n * 2. date string\n * 3. array of 1 or 2\n */\nvar valueEquals = function valueEquals(a, b) {\n // considers Date object and string\n var dateEquals = function dateEquals(a, b) {\n var aIsDate = a instanceof Date;\n var bIsDate = b instanceof Date;\n if (aIsDate && bIsDate) {\n return a.getTime() === b.getTime();\n }\n if (!aIsDate && !bIsDate) {\n return a === b;\n }\n return false;\n };\n\n var aIsArray = a instanceof Array;\n var bIsArray = b instanceof Array;\n if (aIsArray && bIsArray) {\n if (a.length !== b.length) {\n return false;\n }\n return a.every(function (item, index) {\n return dateEquals(item, b[index]);\n });\n }\n if (!aIsArray && !bIsArray) {\n return dateEquals(a, b);\n }\n return false;\n};\n\nvar isString = function isString(val) {\n return typeof val === \'string\' || val instanceof String;\n};\n\nvar pickervue_type_script_lang_js_validator = function validator(val) {\n // either: String, Array of String, null / undefined\n return val === null || val === undefined || isString(val) || Array.isArray(val) && val.length === 2 && val.every(isString);\n};\n\n/* harmony default export */ var pickervue_type_script_lang_js_ = ({\n mixins: [emitter_default.a, NewPopper],\n\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n\n props: {\n size: String,\n format: String,\n valueFormat: String,\n readonly: Boolean,\n placeholder: String,\n startPlaceholder: String,\n endPlaceholder: String,\n prefixIcon: String,\n clearIcon: {\n type: String,\n default: \'el-icon-circle-close\'\n },\n name: {\n default: \'\',\n validator: pickervue_type_script_lang_js_validator\n },\n disabled: Boolean,\n clearable: {\n type: Boolean,\n default: true\n },\n id: {\n default: \'\',\n validator: pickervue_type_script_lang_js_validator\n },\n popperClass: String,\n editable: {\n type: Boolean,\n default: true\n },\n align: {\n type: String,\n default: \'left\'\n },\n value: {},\n defaultValue: {},\n defaultTime: {},\n rangeSeparator: {\n default: \'-\'\n },\n pickerOptions: {},\n unlinkPanels: Boolean,\n validateEvent: {\n type: Boolean,\n default: true\n }\n },\n\n components: { ElInput: input_default.a },\n\n directives: { Clickoutside: clickoutside_default.a },\n\n data: function data() {\n return {\n pickerVisible: false,\n showClose: false,\n userInput: null,\n valueOnOpen: null, // value when picker opens, used to determine whether to emit change\n unwatchPickerOptions: null\n };\n },\n\n\n watch: {\n pickerVisible: function pickerVisible(val) {\n if (this.readonly || this.pickerDisabled) return;\n if (val) {\n this.showPicker();\n this.valueOnOpen = Array.isArray(this.value) ? [].concat(this.value) : this.value;\n } else {\n this.hidePicker();\n this.emitChange(this.value);\n this.userInput = null;\n if (this.validateEvent) {\n this.dispatch(\'ElFormItem\', \'el.form.blur\');\n }\n this.$emit(\'blur\', this);\n this.blur();\n }\n },\n\n parsedValue: {\n immediate: true,\n handler: function handler(val) {\n if (this.picker) {\n this.picker.value = val;\n }\n }\n },\n defaultValue: function defaultValue(val) {\n // NOTE: should eventually move to jsx style picker + panel ?\n if (this.picker) {\n this.picker.defaultValue = val;\n }\n },\n value: function value(val, oldVal) {\n if (!valueEquals(val, oldVal) && !this.pickerVisible && this.validateEvent) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', val);\n }\n }\n },\n\n computed: {\n ranged: function ranged() {\n return this.type.indexOf(\'range\') > -1;\n },\n reference: function reference() {\n var reference = this.$refs.reference;\n return reference.$el || reference;\n },\n refInput: function refInput() {\n if (this.reference) {\n return [].slice.call(this.reference.querySelectorAll(\'input\'));\n }\n return [];\n },\n valueIsEmpty: function valueIsEmpty() {\n var val = this.value;\n if (Array.isArray(val)) {\n for (var i = 0, len = val.length; i < len; i++) {\n if (val[i]) {\n return false;\n }\n }\n } else {\n if (val) {\n return false;\n }\n }\n return true;\n },\n triggerClass: function triggerClass() {\n return this.prefixIcon || (this.type.indexOf(\'time\') !== -1 ? \'el-icon-time\' : \'el-icon-date\');\n },\n selectionMode: function selectionMode() {\n if (this.type === \'week\') {\n return \'week\';\n } else if (this.type === \'month\') {\n return \'month\';\n } else if (this.type === \'year\') {\n return \'year\';\n } else if (this.type === \'dates\') {\n return \'dates\';\n } else if (this.type === \'months\') {\n return \'months\';\n } else if (this.type === \'years\') {\n return \'years\';\n }\n\n return \'day\';\n },\n haveTrigger: function haveTrigger() {\n if (typeof this.showTrigger !== \'undefined\') {\n return this.showTrigger;\n }\n return HAVE_TRIGGER_TYPES.indexOf(this.type) !== -1;\n },\n displayValue: function displayValue() {\n var formattedValue = formatAsFormatAndType(this.parsedValue, this.format, this.type, this.rangeSeparator);\n if (Array.isArray(this.userInput)) {\n return [this.userInput[0] || formattedValue && formattedValue[0] || \'\', this.userInput[1] || formattedValue && formattedValue[1] || \'\'];\n } else if (this.userInput !== null) {\n return this.userInput;\n } else if (formattedValue) {\n return this.type === \'dates\' || this.type === \'years\' || this.type === \'months\' ? formattedValue.join(\', \') : formattedValue;\n } else {\n return \'\';\n }\n },\n parsedValue: function parsedValue() {\n if (!this.value) return this.value; // component value is not set\n if (this.type === \'time-select\') return this.value; // time-select does not require parsing, this might change in next major version\n\n var valueIsDateObject = Object(date_util_["isDateObject"])(this.value) || Array.isArray(this.value) && this.value.every(date_util_["isDateObject"]);\n if (valueIsDateObject) {\n return this.value;\n }\n\n if (this.valueFormat) {\n return parseAsFormatAndType(this.value, this.valueFormat, this.type, this.rangeSeparator) || this.value;\n }\n\n // NOTE: deal with common but incorrect usage, should remove in next major version\n // user might provide string / timestamp without value-format, coerce them into date (or array of date)\n return Array.isArray(this.value) ? this.value.map(function (val) {\n return new Date(val);\n }) : new Date(this.value);\n },\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n pickerSize: function pickerSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n pickerDisabled: function pickerDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n },\n firstInputId: function firstInputId() {\n var obj = {};\n var id = void 0;\n if (this.ranged) {\n id = this.id && this.id[0];\n } else {\n id = this.id;\n }\n if (id) obj.id = id;\n return obj;\n },\n secondInputId: function secondInputId() {\n var obj = {};\n var id = void 0;\n if (this.ranged) {\n id = this.id && this.id[1];\n }\n if (id) obj.id = id;\n return obj;\n }\n },\n\n created: function created() {\n // vue-popper\n this.popperOptions = {\n boundariesPadding: 0,\n gpuAcceleration: false\n };\n this.placement = PLACEMENT_MAP[this.align] || PLACEMENT_MAP.left;\n\n this.$on(\'fieldReset\', this.handleFieldReset);\n },\n\n\n methods: {\n focus: function focus() {\n if (!this.ranged) {\n this.$refs.reference.focus();\n } else {\n this.handleFocus();\n }\n },\n blur: function blur() {\n this.refInput.forEach(function (input) {\n return input.blur();\n });\n },\n\n\n // {parse, formatTo} Value deals maps component value with internal Date\n parseValue: function parseValue(value) {\n var isParsed = Object(date_util_["isDateObject"])(value) || Array.isArray(value) && value.every(date_util_["isDateObject"]);\n if (this.valueFormat && !isParsed) {\n return parseAsFormatAndType(value, this.valueFormat, this.type, this.rangeSeparator) || value;\n } else {\n return value;\n }\n },\n formatToValue: function formatToValue(date) {\n var isFormattable = Object(date_util_["isDateObject"])(date) || Array.isArray(date) && date.every(date_util_["isDateObject"]);\n if (this.valueFormat && isFormattable) {\n return formatAsFormatAndType(date, this.valueFormat, this.type, this.rangeSeparator);\n } else {\n return date;\n }\n },\n\n\n // {parse, formatTo} String deals with user input\n parseString: function parseString(value) {\n var type = Array.isArray(value) ? this.type : this.type.replace(\'range\', \'\');\n return parseAsFormatAndType(value, this.format, type);\n },\n formatToString: function formatToString(value) {\n var type = Array.isArray(value) ? this.type : this.type.replace(\'range\', \'\');\n return formatAsFormatAndType(value, this.format, type);\n },\n handleMouseEnter: function handleMouseEnter() {\n if (this.readonly || this.pickerDisabled) return;\n if (!this.valueIsEmpty && this.clearable) {\n this.showClose = true;\n }\n },\n handleChange: function handleChange() {\n if (this.userInput) {\n var value = this.parseString(this.displayValue);\n if (value) {\n this.picker.value = value;\n if (this.isValidValue(value)) {\n this.emitInput(value);\n this.userInput = null;\n }\n }\n }\n if (this.userInput === \'\') {\n this.emitInput(null);\n this.emitChange(null);\n this.userInput = null;\n }\n },\n handleStartInput: function handleStartInput(event) {\n if (this.userInput) {\n this.userInput = [event.target.value, this.userInput[1]];\n } else {\n this.userInput = [event.target.value, null];\n }\n },\n handleEndInput: function handleEndInput(event) {\n if (this.userInput) {\n this.userInput = [this.userInput[0], event.target.value];\n } else {\n this.userInput = [null, event.target.value];\n }\n },\n handleStartChange: function handleStartChange(event) {\n var value = this.parseString(this.userInput && this.userInput[0]);\n if (value) {\n this.userInput = [this.formatToString(value), this.displayValue[1]];\n var newValue = [value, this.picker.value && this.picker.value[1]];\n this.picker.value = newValue;\n if (this.isValidValue(newValue)) {\n this.emitInput(newValue);\n this.userInput = null;\n }\n }\n },\n handleEndChange: function handleEndChange(event) {\n var value = this.parseString(this.userInput && this.userInput[1]);\n if (value) {\n this.userInput = [this.displayValue[0], this.formatToString(value)];\n var newValue = [this.picker.value && this.picker.value[0], value];\n this.picker.value = newValue;\n if (this.isValidValue(newValue)) {\n this.emitInput(newValue);\n this.userInput = null;\n }\n }\n },\n handleClickIcon: function handleClickIcon(event) {\n if (this.readonly || this.pickerDisabled) return;\n if (this.showClose) {\n this.valueOnOpen = this.value;\n event.stopPropagation();\n this.emitInput(null);\n this.emitChange(null);\n this.showClose = false;\n if (this.picker && typeof this.picker.handleClear === \'function\') {\n this.picker.handleClear();\n }\n } else {\n this.pickerVisible = !this.pickerVisible;\n }\n },\n handleClose: function handleClose() {\n if (!this.pickerVisible) return;\n this.pickerVisible = false;\n\n if (this.type === \'dates\' || this.type === \'years\' || this.type === \'months\') {\n // restore to former value\n var oldValue = parseAsFormatAndType(this.valueOnOpen, this.valueFormat, this.type, this.rangeSeparator) || this.valueOnOpen;\n this.emitInput(oldValue);\n }\n },\n handleFieldReset: function handleFieldReset(initialValue) {\n this.userInput = initialValue === \'\' ? null : initialValue;\n },\n handleFocus: function handleFocus() {\n var type = this.type;\n\n if (HAVE_TRIGGER_TYPES.indexOf(type) !== -1 && !this.pickerVisible) {\n this.pickerVisible = true;\n }\n this.$emit(\'focus\', this);\n },\n handleKeydown: function handleKeydown(event) {\n var _this = this;\n\n var keyCode = event.keyCode;\n\n // ESC\n if (keyCode === 27) {\n this.pickerVisible = false;\n event.stopPropagation();\n return;\n }\n\n // Tab\n if (keyCode === 9) {\n if (!this.ranged) {\n this.handleChange();\n this.pickerVisible = this.picker.visible = false;\n this.blur();\n event.stopPropagation();\n } else {\n // user may change focus between two input\n setTimeout(function () {\n if (_this.refInput.indexOf(document.activeElement) === -1) {\n _this.pickerVisible = false;\n _this.blur();\n event.stopPropagation();\n }\n }, 0);\n }\n return;\n }\n\n // Enter\n if (keyCode === 13) {\n if (this.userInput === \'\' || this.isValidValue(this.parseString(this.displayValue))) {\n this.handleChange();\n this.pickerVisible = this.picker.visible = false;\n this.blur();\n }\n event.stopPropagation();\n return;\n }\n\n // if user is typing, do not let picker handle key input\n if (this.userInput) {\n event.stopPropagation();\n return;\n }\n\n // delegate other keys to panel\n if (this.picker && this.picker.handleKeydown) {\n this.picker.handleKeydown(event);\n }\n },\n handleRangeClick: function handleRangeClick() {\n var type = this.type;\n\n if (HAVE_TRIGGER_TYPES.indexOf(type) !== -1 && !this.pickerVisible) {\n this.pickerVisible = true;\n }\n this.$emit(\'focus\', this);\n },\n hidePicker: function hidePicker() {\n if (this.picker) {\n this.picker.resetView && this.picker.resetView();\n this.pickerVisible = this.picker.visible = false;\n this.destroyPopper();\n }\n },\n showPicker: function showPicker() {\n var _this2 = this;\n\n if (this.$isServer) return;\n if (!this.picker) {\n this.mountPicker();\n }\n this.pickerVisible = this.picker.visible = true;\n\n this.updatePopper();\n\n this.picker.value = this.parsedValue;\n this.picker.resetView && this.picker.resetView();\n\n this.$nextTick(function () {\n _this2.picker.adjustSpinners && _this2.picker.adjustSpinners();\n });\n },\n mountPicker: function mountPicker() {\n var _this3 = this;\n\n this.picker = new external_vue_default.a(this.panel).$mount();\n this.picker.defaultValue = this.defaultValue;\n this.picker.defaultTime = this.defaultTime;\n this.picker.popperClass = this.popperClass;\n this.popperElm = this.picker.$el;\n this.picker.width = this.reference.getBoundingClientRect().width;\n this.picker.showTime = this.type === \'datetime\' || this.type === \'datetimerange\';\n this.picker.selectionMode = this.selectionMode;\n this.picker.unlinkPanels = this.unlinkPanels;\n this.picker.arrowControl = this.arrowControl || this.timeArrowControl || false;\n this.$watch(\'format\', function (format) {\n _this3.picker.format = format;\n });\n\n var updateOptions = function updateOptions() {\n var options = _this3.pickerOptions;\n\n if (options && options.selectableRange) {\n var ranges = options.selectableRange;\n var parser = TYPE_VALUE_RESOLVER_MAP.datetimerange.parser;\n var format = DEFAULT_FORMATS.timerange;\n\n ranges = Array.isArray(ranges) ? ranges : [ranges];\n _this3.picker.selectableRange = ranges.map(function (range) {\n return parser(range, format, _this3.rangeSeparator);\n });\n }\n\n for (var option in options) {\n if (options.hasOwnProperty(option) &&\n // 忽略 time-picker 的该配置项\n option !== \'selectableRange\') {\n _this3.picker[option] = options[option];\n }\n }\n\n // main format must prevail over undocumented pickerOptions.format\n if (_this3.format) {\n _this3.picker.format = _this3.format;\n }\n };\n updateOptions();\n this.unwatchPickerOptions = this.$watch(\'pickerOptions\', function () {\n return updateOptions();\n }, { deep: true });\n this.$el.appendChild(this.picker.$el);\n this.picker.resetView && this.picker.resetView();\n\n this.picker.$on(\'dodestroy\', this.doDestroy);\n this.picker.$on(\'pick\', function () {\n var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \'\';\n var visible = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n _this3.userInput = null;\n _this3.pickerVisible = _this3.picker.visible = visible;\n _this3.emitInput(date);\n _this3.picker.resetView && _this3.picker.resetView();\n });\n\n this.picker.$on(\'select-range\', function (start, end, pos) {\n if (_this3.refInput.length === 0) return;\n if (!pos || pos === \'min\') {\n _this3.refInput[0].setSelectionRange(start, end);\n _this3.refInput[0].focus();\n } else if (pos === \'max\') {\n _this3.refInput[1].setSelectionRange(start, end);\n _this3.refInput[1].focus();\n }\n });\n },\n unmountPicker: function unmountPicker() {\n if (this.picker) {\n this.picker.$destroy();\n this.picker.$off();\n if (typeof this.unwatchPickerOptions === \'function\') {\n this.unwatchPickerOptions();\n }\n this.picker.$el.parentNode.removeChild(this.picker.$el);\n }\n },\n emitChange: function emitChange(val) {\n // determine user real change only\n if (!valueEquals(val, this.valueOnOpen)) {\n this.$emit(\'change\', val);\n this.valueOnOpen = val;\n if (this.validateEvent) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', val);\n }\n }\n },\n emitInput: function emitInput(val) {\n var formatted = this.formatToValue(val);\n if (!valueEquals(this.value, formatted)) {\n this.$emit(\'input\', formatted);\n }\n },\n isValidValue: function isValidValue(value) {\n if (!this.picker) {\n this.mountPicker();\n }\n if (this.picker.isValidValue) {\n return value && this.picker.isValidValue(value);\n } else {\n return true;\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/date-picker/src/picker.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_pickervue_type_script_lang_js_ = (pickervue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/date-picker/src/picker.vue\n\n\n\n\n\n/* normalize component */\n\nvar picker_component = normalizeComponent(\n src_pickervue_type_script_lang_js_,\n pickervue_type_template_id_79ae069f_render,\n pickervue_type_template_id_79ae069f_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var picker_api; }\npicker_component.options.__file = "packages/date-picker/src/picker.vue"\n/* harmony default export */ var picker = (picker_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/date.vue?vue&type=template&id=2440d4ea&\nvar datevue_type_template_id_2440d4ea_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n {\n attrs: { name: "el-zoom-in-top" },\n on: { "after-enter": _vm.handleEnter, "after-leave": _vm.handleLeave }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-picker-panel el-date-picker el-popper",\n class: [\n {\n "has-sidebar": _vm.$slots.sidebar || _vm.shortcuts,\n "has-time": _vm.showTime\n },\n _vm.popperClass\n ]\n },\n [\n _c(\n "div",\n { staticClass: "el-picker-panel__body-wrapper" },\n [\n _vm._t("sidebar"),\n _vm.shortcuts\n ? _c(\n "div",\n { staticClass: "el-picker-panel__sidebar" },\n _vm._l(_vm.shortcuts, function(shortcut, key) {\n return _c(\n "button",\n {\n key: key,\n staticClass: "el-picker-panel__shortcut",\n attrs: { type: "button" },\n on: {\n click: function($event) {\n _vm.handleShortcutClick(shortcut)\n }\n }\n },\n [_vm._v(_vm._s(shortcut.text))]\n )\n }),\n 0\n )\n : _vm._e(),\n _c("div", { staticClass: "el-picker-panel__body" }, [\n _vm.showTime\n ? _c("div", { staticClass: "el-date-picker__time-header" }, [\n _c(\n "span",\n { staticClass: "el-date-picker__editor-wrap" },\n [\n _c("el-input", {\n attrs: {\n placeholder: _vm.t("el.datepicker.selectDate"),\n value: _vm.visibleDate,\n size: "small"\n },\n on: {\n input: function(val) {\n return (_vm.userInputDate = val)\n },\n change: _vm.handleVisibleDateChange\n }\n })\n ],\n 1\n ),\n _c(\n "span",\n {\n directives: [\n {\n name: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.handleTimePickClose,\n expression: "handleTimePickClose"\n }\n ],\n staticClass: "el-date-picker__editor-wrap"\n },\n [\n _c("el-input", {\n ref: "input",\n attrs: {\n placeholder: _vm.t("el.datepicker.selectTime"),\n value: _vm.visibleTime,\n size: "small"\n },\n on: {\n focus: function($event) {\n _vm.timePickerVisible = true\n },\n input: function(val) {\n return (_vm.userInputTime = val)\n },\n change: _vm.handleVisibleTimeChange\n }\n }),\n _c("time-picker", {\n ref: "timepicker",\n attrs: {\n "time-arrow-control": _vm.arrowControl,\n visible: _vm.timePickerVisible\n },\n on: {\n pick: _vm.handleTimePick,\n mounted: _vm.proxyTimePickerDataProperties\n }\n })\n ],\n 1\n )\n ])\n : _vm._e(),\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.currentView !== "time",\n expression: "currentView !== \'time\'"\n }\n ],\n staticClass: "el-date-picker__header",\n class: {\n "el-date-picker__header--bordered":\n _vm.currentView === "year" ||\n _vm.currentView === "month"\n }\n },\n [\n _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-date-picker__prev-btn el-icon-d-arrow-left",\n attrs: {\n type: "button",\n "aria-label": _vm.t("el.datepicker.prevYear")\n },\n on: { click: _vm.prevYear }\n }),\n _c("button", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.currentView === "date",\n expression: "currentView === \'date\'"\n }\n ],\n staticClass:\n "el-picker-panel__icon-btn el-date-picker__prev-btn el-icon-arrow-left",\n attrs: {\n type: "button",\n "aria-label": _vm.t("el.datepicker.prevMonth")\n },\n on: { click: _vm.prevMonth }\n }),\n _c(\n "span",\n {\n staticClass: "el-date-picker__header-label",\n attrs: { role: "button" },\n on: { click: _vm.showYearPicker }\n },\n [_vm._v(_vm._s(_vm.yearLabel))]\n ),\n _c(\n "span",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.currentView === "date",\n expression: "currentView === \'date\'"\n }\n ],\n staticClass: "el-date-picker__header-label",\n class: { active: _vm.currentView === "month" },\n attrs: { role: "button" },\n on: { click: _vm.showMonthPicker }\n },\n [\n _vm._v(\n _vm._s(_vm.t("el.datepicker.month" + (_vm.month + 1)))\n )\n ]\n ),\n _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-date-picker__next-btn el-icon-d-arrow-right",\n attrs: {\n type: "button",\n "aria-label": _vm.t("el.datepicker.nextYear")\n },\n on: { click: _vm.nextYear }\n }),\n _c("button", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.currentView === "date",\n expression: "currentView === \'date\'"\n }\n ],\n staticClass:\n "el-picker-panel__icon-btn el-date-picker__next-btn el-icon-arrow-right",\n attrs: {\n type: "button",\n "aria-label": _vm.t("el.datepicker.nextMonth")\n },\n on: { click: _vm.nextMonth }\n })\n ]\n ),\n _c(\n "div",\n { staticClass: "el-picker-panel__content" },\n [\n _c("date-table", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.currentView === "date",\n expression: "currentView === \'date\'"\n }\n ],\n attrs: {\n "selection-mode": _vm.selectionMode,\n "first-day-of-week": _vm.firstDayOfWeek,\n value: _vm.value,\n "default-value": _vm.defaultValue\n ? new Date(_vm.defaultValue)\n : null,\n date: _vm.date,\n "cell-class-name": _vm.cellClassName,\n "disabled-date": _vm.disabledDate\n },\n on: { pick: _vm.handleDatePick }\n }),\n _c("year-table", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.currentView === "year",\n expression: "currentView === \'year\'"\n }\n ],\n attrs: {\n "selection-mode": _vm.selectionMode,\n value: _vm.value,\n "default-value": _vm.defaultValue\n ? new Date(_vm.defaultValue)\n : null,\n date: _vm.date,\n "disabled-date": _vm.disabledDate\n },\n on: { pick: _vm.handleYearPick }\n }),\n _c("month-table", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.currentView === "month",\n expression: "currentView === \'month\'"\n }\n ],\n attrs: {\n "selection-mode": _vm.selectionMode,\n value: _vm.value,\n "default-value": _vm.defaultValue\n ? new Date(_vm.defaultValue)\n : null,\n date: _vm.date,\n "disabled-date": _vm.disabledDate\n },\n on: { pick: _vm.handleMonthPick }\n })\n ],\n 1\n )\n ])\n ],\n 2\n ),\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value:\n _vm.footerVisible &&\n (_vm.currentView === "date" ||\n _vm.currentView === "month" ||\n _vm.currentView === "year"),\n expression:\n "footerVisible && (currentView === \'date\' || currentView === \'month\' || currentView === \'year\')"\n }\n ],\n staticClass: "el-picker-panel__footer"\n },\n [\n _c(\n "el-button",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value:\n _vm.selectionMode !== "dates" &&\n _vm.selectionMode !== "months" &&\n _vm.selectionMode !== "years",\n expression:\n "selectionMode !== \'dates\' && selectionMode !== \'months\' && selectionMode !== \'years\'"\n }\n ],\n staticClass: "el-picker-panel__link-btn",\n attrs: { size: "mini", type: "text" },\n on: { click: _vm.changeToNow }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.t("el.datepicker.now")) +\n "\\n "\n )\n ]\n ),\n _c(\n "el-button",\n {\n staticClass: "el-picker-panel__link-btn",\n attrs: { plain: "", size: "mini" },\n on: { click: _vm.confirm }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.t("el.datepicker.confirm")) +\n "\\n "\n )\n ]\n )\n ],\n 1\n )\n ]\n )\n ]\n )\n}\nvar datevue_type_template_id_2440d4ea_staticRenderFns = []\ndatevue_type_template_id_2440d4ea_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/date.vue?vue&type=template&id=2440d4ea&\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/time.vue?vue&type=template&id=3d939089&\nvar timevue_type_template_id_3d939089_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n {\n attrs: { name: "el-zoom-in-top" },\n on: {\n "after-leave": function($event) {\n _vm.$emit("dodestroy")\n }\n }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-time-panel el-popper",\n class: _vm.popperClass\n },\n [\n _c(\n "div",\n {\n staticClass: "el-time-panel__content",\n class: { "has-seconds": _vm.showSeconds }\n },\n [\n _c("time-spinner", {\n ref: "spinner",\n attrs: {\n "arrow-control": _vm.useArrow,\n "show-seconds": _vm.showSeconds,\n "am-pm-mode": _vm.amPmMode,\n date: _vm.date\n },\n on: {\n change: _vm.handleChange,\n "select-range": _vm.setSelectionRange\n }\n })\n ],\n 1\n ),\n _c("div", { staticClass: "el-time-panel__footer" }, [\n _c(\n "button",\n {\n staticClass: "el-time-panel__btn cancel",\n attrs: { type: "button" },\n on: { click: _vm.handleCancel }\n },\n [_vm._v(_vm._s(_vm.t("el.datepicker.cancel")))]\n ),\n _c(\n "button",\n {\n staticClass: "el-time-panel__btn",\n class: { confirm: !_vm.disabled },\n attrs: { type: "button" },\n on: {\n click: function($event) {\n _vm.handleConfirm()\n }\n }\n },\n [_vm._v(_vm._s(_vm.t("el.datepicker.confirm")))]\n )\n ])\n ]\n )\n ]\n )\n}\nvar timevue_type_template_id_3d939089_staticRenderFns = []\ntimevue_type_template_id_3d939089_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/time.vue?vue&type=template&id=3d939089&\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/basic/time-spinner.vue?vue&type=template&id=1facadeb&\nvar time_spinnervue_type_template_id_1facadeb_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 staticClass: "el-time-spinner",\n class: { "has-seconds": _vm.showSeconds }\n },\n [\n !_vm.arrowControl\n ? [\n _c(\n "el-scrollbar",\n {\n ref: "hours",\n staticClass: "el-time-spinner__wrapper",\n attrs: {\n "wrap-style": "max-height: inherit;",\n "view-class": "el-time-spinner__list",\n noresize: "",\n tag: "ul"\n },\n nativeOn: {\n mouseenter: function($event) {\n _vm.emitSelectRange("hours")\n },\n mousemove: function($event) {\n _vm.adjustCurrentSpinner("hours")\n }\n }\n },\n _vm._l(_vm.hoursList, function(disabled, hour) {\n return _c(\n "li",\n {\n key: hour,\n staticClass: "el-time-spinner__item",\n class: { active: hour === _vm.hours, disabled: disabled },\n on: {\n click: function($event) {\n _vm.handleClick("hours", {\n value: hour,\n disabled: disabled\n })\n }\n }\n },\n [\n _vm._v(\n _vm._s(\n ("0" + (_vm.amPmMode ? hour % 12 || 12 : hour)).slice(\n -2\n )\n ) + _vm._s(_vm.amPm(hour))\n )\n ]\n )\n }),\n 0\n ),\n _c(\n "el-scrollbar",\n {\n ref: "minutes",\n staticClass: "el-time-spinner__wrapper",\n attrs: {\n "wrap-style": "max-height: inherit;",\n "view-class": "el-time-spinner__list",\n noresize: "",\n tag: "ul"\n },\n nativeOn: {\n mouseenter: function($event) {\n _vm.emitSelectRange("minutes")\n },\n mousemove: function($event) {\n _vm.adjustCurrentSpinner("minutes")\n }\n }\n },\n _vm._l(_vm.minutesList, function(enabled, key) {\n return _c(\n "li",\n {\n key: key,\n staticClass: "el-time-spinner__item",\n class: { active: key === _vm.minutes, disabled: !enabled },\n on: {\n click: function($event) {\n _vm.handleClick("minutes", {\n value: key,\n disabled: false\n })\n }\n }\n },\n [_vm._v(_vm._s(("0" + key).slice(-2)))]\n )\n }),\n 0\n ),\n _c(\n "el-scrollbar",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.showSeconds,\n expression: "showSeconds"\n }\n ],\n ref: "seconds",\n staticClass: "el-time-spinner__wrapper",\n attrs: {\n "wrap-style": "max-height: inherit;",\n "view-class": "el-time-spinner__list",\n noresize: "",\n tag: "ul"\n },\n nativeOn: {\n mouseenter: function($event) {\n _vm.emitSelectRange("seconds")\n },\n mousemove: function($event) {\n _vm.adjustCurrentSpinner("seconds")\n }\n }\n },\n _vm._l(60, function(second, key) {\n return _c(\n "li",\n {\n key: key,\n staticClass: "el-time-spinner__item",\n class: { active: key === _vm.seconds },\n on: {\n click: function($event) {\n _vm.handleClick("seconds", {\n value: key,\n disabled: false\n })\n }\n }\n },\n [_vm._v(_vm._s(("0" + key).slice(-2)))]\n )\n }),\n 0\n )\n ]\n : _vm._e(),\n _vm.arrowControl\n ? [\n _c(\n "div",\n {\n staticClass: "el-time-spinner__wrapper is-arrow",\n on: {\n mouseenter: function($event) {\n _vm.emitSelectRange("hours")\n }\n }\n },\n [\n _c("i", {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.decrease,\n expression: "decrease"\n }\n ],\n staticClass: "el-time-spinner__arrow el-icon-arrow-up"\n }),\n _c("i", {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.increase,\n expression: "increase"\n }\n ],\n staticClass: "el-time-spinner__arrow el-icon-arrow-down"\n }),\n _c(\n "ul",\n { ref: "hours", staticClass: "el-time-spinner__list" },\n _vm._l(_vm.arrowHourList, function(hour, key) {\n return _c(\n "li",\n {\n key: key,\n staticClass: "el-time-spinner__item",\n class: {\n active: hour === _vm.hours,\n disabled: _vm.hoursList[hour]\n }\n },\n [\n _vm._v(\n _vm._s(\n hour === undefined\n ? ""\n : (\n "0" + (_vm.amPmMode ? hour % 12 || 12 : hour)\n ).slice(-2) + _vm.amPm(hour)\n )\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _c(\n "div",\n {\n staticClass: "el-time-spinner__wrapper is-arrow",\n on: {\n mouseenter: function($event) {\n _vm.emitSelectRange("minutes")\n }\n }\n },\n [\n _c("i", {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.decrease,\n expression: "decrease"\n }\n ],\n staticClass: "el-time-spinner__arrow el-icon-arrow-up"\n }),\n _c("i", {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.increase,\n expression: "increase"\n }\n ],\n staticClass: "el-time-spinner__arrow el-icon-arrow-down"\n }),\n _c(\n "ul",\n { ref: "minutes", staticClass: "el-time-spinner__list" },\n _vm._l(_vm.arrowMinuteList, function(minute, key) {\n return _c(\n "li",\n {\n key: key,\n staticClass: "el-time-spinner__item",\n class: { active: minute === _vm.minutes }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(\n minute === undefined\n ? ""\n : ("0" + minute).slice(-2)\n ) +\n "\\n "\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm.showSeconds\n ? _c(\n "div",\n {\n staticClass: "el-time-spinner__wrapper is-arrow",\n on: {\n mouseenter: function($event) {\n _vm.emitSelectRange("seconds")\n }\n }\n },\n [\n _c("i", {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.decrease,\n expression: "decrease"\n }\n ],\n staticClass: "el-time-spinner__arrow el-icon-arrow-up"\n }),\n _c("i", {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.increase,\n expression: "increase"\n }\n ],\n staticClass: "el-time-spinner__arrow el-icon-arrow-down"\n }),\n _c(\n "ul",\n { ref: "seconds", staticClass: "el-time-spinner__list" },\n _vm._l(_vm.arrowSecondList, function(second, key) {\n return _c(\n "li",\n {\n key: key,\n staticClass: "el-time-spinner__item",\n class: { active: second === _vm.seconds }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(\n second === undefined\n ? ""\n : ("0" + second).slice(-2)\n ) +\n "\\n "\n )\n ]\n )\n }),\n 0\n )\n ]\n )\n : _vm._e()\n ]\n : _vm._e()\n ],\n 2\n )\n}\nvar time_spinnervue_type_template_id_1facadeb_staticRenderFns = []\ntime_spinnervue_type_template_id_1facadeb_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/date-picker/src/basic/time-spinner.vue?vue&type=template&id=1facadeb&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/basic/time-spinner.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ var time_spinnervue_type_script_lang_js_ = ({\n components: { ElScrollbar: scrollbar_default.a },\n\n directives: {\n repeatClick: repeat_click\n },\n\n props: {\n date: {},\n defaultValue: {}, // reserved for future use\n showSeconds: {\n type: Boolean,\n default: true\n },\n arrowControl: Boolean,\n amPmMode: {\n type: String,\n default: \'\' // \'a\': am/pm; \'A\': AM/PM\n }\n },\n\n computed: {\n hours: function hours() {\n return this.date.getHours();\n },\n minutes: function minutes() {\n return this.date.getMinutes();\n },\n seconds: function seconds() {\n return this.date.getSeconds();\n },\n hoursList: function hoursList() {\n return Object(date_util_["getRangeHours"])(this.selectableRange);\n },\n minutesList: function minutesList() {\n return Object(date_util_["getRangeMinutes"])(this.selectableRange, this.hours);\n },\n arrowHourList: function arrowHourList() {\n var hours = this.hours;\n return [hours > 0 ? hours - 1 : undefined, hours, hours < 23 ? hours + 1 : undefined];\n },\n arrowMinuteList: function arrowMinuteList() {\n var minutes = this.minutes;\n return [minutes > 0 ? minutes - 1 : undefined, minutes, minutes < 59 ? minutes + 1 : undefined];\n },\n arrowSecondList: function arrowSecondList() {\n var seconds = this.seconds;\n return [seconds > 0 ? seconds - 1 : undefined, seconds, seconds < 59 ? seconds + 1 : undefined];\n }\n },\n\n data: function data() {\n return {\n selectableRange: [],\n currentScrollbar: null\n };\n },\n mounted: function mounted() {\n var _this = this;\n\n this.$nextTick(function () {\n !_this.arrowControl && _this.bindScrollEvent();\n });\n },\n\n\n methods: {\n increase: function increase() {\n this.scrollDown(1);\n },\n decrease: function decrease() {\n this.scrollDown(-1);\n },\n modifyDateField: function modifyDateField(type, value) {\n switch (type) {\n case \'hours\':\n this.$emit(\'change\', Object(date_util_["modifyTime"])(this.date, value, this.minutes, this.seconds));break;\n case \'minutes\':\n this.$emit(\'change\', Object(date_util_["modifyTime"])(this.date, this.hours, value, this.seconds));break;\n case \'seconds\':\n this.$emit(\'change\', Object(date_util_["modifyTime"])(this.date, this.hours, this.minutes, value));break;\n }\n },\n handleClick: function handleClick(type, _ref) {\n var value = _ref.value,\n disabled = _ref.disabled;\n\n if (!disabled) {\n this.modifyDateField(type, value);\n this.emitSelectRange(type);\n this.adjustSpinner(type, value);\n }\n },\n emitSelectRange: function emitSelectRange(type) {\n if (type === \'hours\') {\n this.$emit(\'select-range\', 0, 2);\n } else if (type === \'minutes\') {\n this.$emit(\'select-range\', 3, 5);\n } else if (type === \'seconds\') {\n this.$emit(\'select-range\', 6, 8);\n }\n this.currentScrollbar = type;\n },\n bindScrollEvent: function bindScrollEvent() {\n var _this2 = this;\n\n var bindFunction = function bindFunction(type) {\n _this2.$refs[type].wrap.onscroll = function (e) {\n // TODO: scroll is emitted when set scrollTop programatically\n // should find better solutions in the future!\n _this2.handleScroll(type, e);\n };\n };\n bindFunction(\'hours\');\n bindFunction(\'minutes\');\n bindFunction(\'seconds\');\n },\n handleScroll: function handleScroll(type) {\n var value = Math.min(Math.round((this.$refs[type].wrap.scrollTop - (this.scrollBarHeight(type) * 0.5 - 10) / this.typeItemHeight(type) + 3) / this.typeItemHeight(type)), type === \'hours\' ? 23 : 59);\n this.modifyDateField(type, value);\n },\n\n\n // NOTE: used by datetime / date-range panel\n // renamed from adjustScrollTop\n // should try to refactory it\n adjustSpinners: function adjustSpinners() {\n this.adjustSpinner(\'hours\', this.hours);\n this.adjustSpinner(\'minutes\', this.minutes);\n this.adjustSpinner(\'seconds\', this.seconds);\n },\n adjustCurrentSpinner: function adjustCurrentSpinner(type) {\n this.adjustSpinner(type, this[type]);\n },\n adjustSpinner: function adjustSpinner(type, value) {\n if (this.arrowControl) return;\n var el = this.$refs[type].wrap;\n if (el) {\n el.scrollTop = Math.max(0, value * this.typeItemHeight(type));\n }\n },\n scrollDown: function scrollDown(step) {\n var _this3 = this;\n\n if (!this.currentScrollbar) {\n this.emitSelectRange(\'hours\');\n }\n\n var label = this.currentScrollbar;\n var hoursList = this.hoursList;\n var now = this[label];\n\n if (this.currentScrollbar === \'hours\') {\n var total = Math.abs(step);\n step = step > 0 ? 1 : -1;\n var length = hoursList.length;\n while (length-- && total) {\n now = (now + step + hoursList.length) % hoursList.length;\n if (hoursList[now]) {\n continue;\n }\n total--;\n }\n if (hoursList[now]) return;\n } else {\n now = (now + step + 60) % 60;\n }\n\n this.modifyDateField(label, now);\n this.adjustSpinner(label, now);\n this.$nextTick(function () {\n return _this3.emitSelectRange(_this3.currentScrollbar);\n });\n },\n amPm: function amPm(hour) {\n var shouldShowAmPm = this.amPmMode.toLowerCase() === \'a\';\n if (!shouldShowAmPm) return \'\';\n var isCapital = this.amPmMode === \'A\';\n var content = hour < 12 ? \' am\' : \' pm\';\n if (isCapital) content = content.toUpperCase();\n return content;\n },\n typeItemHeight: function typeItemHeight(type) {\n return this.$refs[type].$el.querySelector(\'li\').offsetHeight;\n },\n scrollBarHeight: function scrollBarHeight(type) {\n return this.$refs[type].$el.offsetHeight;\n }\n }\n});\n// CONCATENATED MODULE: ./packages/date-picker/src/basic/time-spinner.vue?vue&type=script&lang=js&\n /* harmony default export */ var basic_time_spinnervue_type_script_lang_js_ = (time_spinnervue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/date-picker/src/basic/time-spinner.vue\n\n\n\n\n\n/* normalize component */\n\nvar time_spinner_component = normalizeComponent(\n basic_time_spinnervue_type_script_lang_js_,\n time_spinnervue_type_template_id_1facadeb_render,\n time_spinnervue_type_template_id_1facadeb_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var time_spinner_api; }\ntime_spinner_component.options.__file = "packages/date-picker/src/basic/time-spinner.vue"\n/* harmony default export */ var time_spinner = (time_spinner_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/time.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/* harmony default export */ var timevue_type_script_lang_js_ = ({\n mixins: [locale_default.a],\n\n components: {\n TimeSpinner: time_spinner\n },\n\n props: {\n visible: Boolean,\n timeArrowControl: Boolean\n },\n\n watch: {\n visible: function visible(val) {\n var _this = this;\n\n if (val) {\n this.oldValue = this.value;\n this.$nextTick(function () {\n return _this.$refs.spinner.emitSelectRange(\'hours\');\n });\n } else {\n this.needInitAdjust = true;\n }\n },\n value: function value(newVal) {\n var _this2 = this;\n\n var date = void 0;\n if (newVal instanceof Date) {\n date = Object(date_util_["limitTimeRange"])(newVal, this.selectableRange, this.format);\n } else if (!newVal) {\n date = this.defaultValue ? new Date(this.defaultValue) : new Date();\n }\n\n this.date = date;\n if (this.visible && this.needInitAdjust) {\n this.$nextTick(function (_) {\n return _this2.adjustSpinners();\n });\n this.needInitAdjust = false;\n }\n },\n selectableRange: function selectableRange(val) {\n this.$refs.spinner.selectableRange = val;\n },\n defaultValue: function defaultValue(val) {\n if (!Object(date_util_["isDate"])(this.value)) {\n this.date = val ? new Date(val) : new Date();\n }\n }\n },\n\n data: function data() {\n return {\n popperClass: \'\',\n format: \'HH:mm:ss\',\n value: \'\',\n defaultValue: null,\n date: new Date(),\n oldValue: new Date(),\n selectableRange: [],\n selectionRange: [0, 2],\n disabled: false,\n arrowControl: false,\n needInitAdjust: true\n };\n },\n\n\n computed: {\n showSeconds: function showSeconds() {\n return (this.format || \'\').indexOf(\'ss\') !== -1;\n },\n useArrow: function useArrow() {\n return this.arrowControl || this.timeArrowControl || false;\n },\n amPmMode: function amPmMode() {\n if ((this.format || \'\').indexOf(\'A\') !== -1) return \'A\';\n if ((this.format || \'\').indexOf(\'a\') !== -1) return \'a\';\n return \'\';\n }\n },\n\n methods: {\n handleCancel: function handleCancel() {\n this.$emit(\'pick\', this.oldValue, false);\n },\n handleChange: function handleChange(date) {\n // this.visible avoids edge cases, when use scrolls during panel closing animation\n if (this.visible) {\n this.date = Object(date_util_["clearMilliseconds"])(date);\n // if date is out of range, do not emit\n if (this.isValidValue(this.date)) {\n this.$emit(\'pick\', this.date, true);\n }\n }\n },\n setSelectionRange: function setSelectionRange(start, end) {\n this.$emit(\'select-range\', start, end);\n this.selectionRange = [start, end];\n },\n handleConfirm: function handleConfirm() {\n var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var first = arguments[1];\n\n if (first) return;\n var date = Object(date_util_["clearMilliseconds"])(Object(date_util_["limitTimeRange"])(this.date, this.selectableRange, this.format));\n this.$emit(\'pick\', date, visible, first);\n },\n handleKeydown: function handleKeydown(event) {\n var keyCode = event.keyCode;\n var mapping = { 38: -1, 40: 1, 37: -1, 39: 1 };\n\n // Left or Right\n if (keyCode === 37 || keyCode === 39) {\n var step = mapping[keyCode];\n this.changeSelectionRange(step);\n event.preventDefault();\n return;\n }\n\n // Up or Down\n if (keyCode === 38 || keyCode === 40) {\n var _step = mapping[keyCode];\n this.$refs.spinner.scrollDown(_step);\n event.preventDefault();\n return;\n }\n },\n isValidValue: function isValidValue(date) {\n return Object(date_util_["timeWithinRange"])(date, this.selectableRange, this.format);\n },\n adjustSpinners: function adjustSpinners() {\n return this.$refs.spinner.adjustSpinners();\n },\n changeSelectionRange: function changeSelectionRange(step) {\n var list = [0, 3].concat(this.showSeconds ? [6] : []);\n var mapping = [\'hours\', \'minutes\'].concat(this.showSeconds ? [\'seconds\'] : []);\n var index = list.indexOf(this.selectionRange[0]);\n var next = (index + step + list.length) % list.length;\n this.$refs.spinner.emitSelectRange(mapping[next]);\n }\n },\n\n mounted: function mounted() {\n var _this3 = this;\n\n this.$nextTick(function () {\n return _this3.handleConfirm(true, true);\n });\n this.$emit(\'mounted\');\n }\n});\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/time.vue?vue&type=script&lang=js&\n /* harmony default export */ var panel_timevue_type_script_lang_js_ = (timevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/date-picker/src/panel/time.vue\n\n\n\n\n\n/* normalize component */\n\nvar time_component = normalizeComponent(\n panel_timevue_type_script_lang_js_,\n timevue_type_template_id_3d939089_render,\n timevue_type_template_id_3d939089_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var time_api; }\ntime_component.options.__file = "packages/date-picker/src/panel/time.vue"\n/* harmony default export */ var panel_time = (time_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/basic/year-table.vue?vue&type=template&id=c86ab5e0&\nvar year_tablevue_type_template_id_c86ab5e0_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "table",\n { staticClass: "el-year-table", on: { click: _vm.handleYearTableClick } },\n [\n _c("tbody", [\n _c("tr", [\n _c(\n "td",\n {\n staticClass: "available",\n class: _vm.getCellStyle(_vm.startYear + 0)\n },\n [_c("a", { staticClass: "cell" }, [_vm._v(_vm._s(_vm.startYear))])]\n ),\n _c(\n "td",\n {\n staticClass: "available",\n class: _vm.getCellStyle(_vm.startYear + 1)\n },\n [\n _c("a", { staticClass: "cell" }, [\n _vm._v(_vm._s(_vm.startYear + 1))\n ])\n ]\n ),\n _c(\n "td",\n {\n staticClass: "available",\n class: _vm.getCellStyle(_vm.startYear + 2)\n },\n [\n _c("a", { staticClass: "cell" }, [\n _vm._v(_vm._s(_vm.startYear + 2))\n ])\n ]\n ),\n _c(\n "td",\n {\n staticClass: "available",\n class: _vm.getCellStyle(_vm.startYear + 3)\n },\n [\n _c("a", { staticClass: "cell" }, [\n _vm._v(_vm._s(_vm.startYear + 3))\n ])\n ]\n )\n ]),\n _c("tr", [\n _c(\n "td",\n {\n staticClass: "available",\n class: _vm.getCellStyle(_vm.startYear + 4)\n },\n [\n _c("a", { staticClass: "cell" }, [\n _vm._v(_vm._s(_vm.startYear + 4))\n ])\n ]\n ),\n _c(\n "td",\n {\n staticClass: "available",\n class: _vm.getCellStyle(_vm.startYear + 5)\n },\n [\n _c("a", { staticClass: "cell" }, [\n _vm._v(_vm._s(_vm.startYear + 5))\n ])\n ]\n ),\n _c(\n "td",\n {\n staticClass: "available",\n class: _vm.getCellStyle(_vm.startYear + 6)\n },\n [\n _c("a", { staticClass: "cell" }, [\n _vm._v(_vm._s(_vm.startYear + 6))\n ])\n ]\n ),\n _c(\n "td",\n {\n staticClass: "available",\n class: _vm.getCellStyle(_vm.startYear + 7)\n },\n [\n _c("a", { staticClass: "cell" }, [\n _vm._v(_vm._s(_vm.startYear + 7))\n ])\n ]\n )\n ]),\n _c("tr", [\n _c(\n "td",\n {\n staticClass: "available",\n class: _vm.getCellStyle(_vm.startYear + 8)\n },\n [\n _c("a", { staticClass: "cell" }, [\n _vm._v(_vm._s(_vm.startYear + 8))\n ])\n ]\n ),\n _c(\n "td",\n {\n staticClass: "available",\n class: _vm.getCellStyle(_vm.startYear + 9)\n },\n [\n _c("a", { staticClass: "cell" }, [\n _vm._v(_vm._s(_vm.startYear + 9))\n ])\n ]\n ),\n _c("td"),\n _c("td")\n ])\n ])\n ]\n )\n}\nvar year_tablevue_type_template_id_c86ab5e0_staticRenderFns = []\nyear_tablevue_type_template_id_c86ab5e0_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/date-picker/src/basic/year-table.vue?vue&type=template&id=c86ab5e0&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/basic/year-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//\n//\n//\n//\n//\n\n\n\n\n\nvar year_tablevue_type_script_lang_js_datesInYear = function datesInYear(year) {\n var numOfDays = Object(date_util_["getDayCountOfYear"])(year);\n var firstDay = new Date(year, 0, 1);\n return Object(date_util_["range"])(numOfDays).map(function (n) {\n return Object(date_util_["nextDate"])(firstDay, n);\n });\n};\n\n/* harmony default export */ var year_tablevue_type_script_lang_js_ = ({\n props: {\n disabledDate: {},\n value: {},\n defaultValue: {\n validator: function validator(val) {\n // null or valid Date Object\n return val === null || val instanceof Date && Object(date_util_["isDate"])(val);\n }\n },\n date: {},\n selectionMode: {}\n },\n\n computed: {\n startYear: function startYear() {\n return Math.floor(this.date.getFullYear() / 10) * 10;\n }\n },\n\n methods: {\n getCellStyle: function getCellStyle(year) {\n var style = {};\n var today = new Date();\n\n style.disabled = typeof this.disabledDate === \'function\' ? year_tablevue_type_script_lang_js_datesInYear(year).every(this.disabledDate) : false;\n style.current = Object(util_["arrayFindIndex"])(Object(util_["coerceTruthyValueToArray"])(this.value), function (date) {\n return date.getFullYear() === year;\n }) >= 0;\n style.today = today.getFullYear() === year;\n style.default = this.defaultValue && this.defaultValue.getFullYear() === year;\n\n return style;\n },\n handleYearTableClick: function handleYearTableClick(event) {\n var target = event.target;\n if (target.tagName === \'A\') {\n if (Object(dom_["hasClass"])(target.parentNode, \'disabled\')) return;\n var year = target.textContent || target.innerText;\n if (this.selectionMode === \'years\') {\n var value = this.value || [];\n var idx = Object(util_["arrayFindIndex"])(value, function (date) {\n return date.getFullYear() === Number(year);\n });\n var newValue = idx > -1 ? [].concat(value.slice(0, idx), value.slice(idx + 1)) : [].concat(value, [new Date(year)]);\n this.$emit(\'pick\', newValue);\n } else {\n this.$emit(\'pick\', Number(year));\n }\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/date-picker/src/basic/year-table.vue?vue&type=script&lang=js&\n /* harmony default export */ var basic_year_tablevue_type_script_lang_js_ = (year_tablevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/date-picker/src/basic/year-table.vue\n\n\n\n\n\n/* normalize component */\n\nvar year_table_component = normalizeComponent(\n basic_year_tablevue_type_script_lang_js_,\n year_tablevue_type_template_id_c86ab5e0_render,\n year_tablevue_type_template_id_c86ab5e0_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var year_table_api; }\nyear_table_component.options.__file = "packages/date-picker/src/basic/year-table.vue"\n/* harmony default export */ var year_table = (year_table_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/basic/month-table.vue?vue&type=template&id=654d4f42&\nvar month_tablevue_type_template_id_654d4f42_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "table",\n {\n staticClass: "el-month-table",\n on: { click: _vm.handleMonthTableClick, mousemove: _vm.handleMouseMove }\n },\n [\n _c(\n "tbody",\n _vm._l(_vm.rows, function(row, key) {\n return _c(\n "tr",\n { key: key },\n _vm._l(row, function(cell, key) {\n return _c("td", { key: key, class: _vm.getCellStyle(cell) }, [\n _c("div", [\n _c("a", { staticClass: "cell" }, [\n _vm._v(\n _vm._s(\n _vm.t("el.datepicker.months." + _vm.months[cell.text])\n )\n )\n ])\n ])\n ])\n }),\n 0\n )\n }),\n 0\n )\n ]\n )\n}\nvar month_tablevue_type_template_id_654d4f42_staticRenderFns = []\nmonth_tablevue_type_template_id_654d4f42_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/date-picker/src/basic/month-table.vue?vue&type=template&id=654d4f42&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/basic/month-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\nvar month_tablevue_type_script_lang_js_datesInMonth = function datesInMonth(year, month) {\n var numOfDays = Object(date_util_["getDayCountOfMonth"])(year, month);\n var firstDay = new Date(year, month, 1);\n return Object(date_util_["range"])(numOfDays).map(function (n) {\n return Object(date_util_["nextDate"])(firstDay, n);\n });\n};\n\nvar clearDate = function clearDate(date) {\n return new Date(date.getFullYear(), date.getMonth());\n};\n\nvar getMonthTimestamp = function getMonthTimestamp(time) {\n if (typeof time === \'number\' || typeof time === \'string\') {\n return clearDate(new Date(time)).getTime();\n } else if (time instanceof Date) {\n return clearDate(time).getTime();\n } else {\n return NaN;\n }\n};\n\n// remove the first element that satisfies `pred` from arr\n// return a new array if modification occurs\n// return the original array otherwise\nvar month_tablevue_type_script_lang_js_removeFromArray = function removeFromArray(arr, pred) {\n var idx = typeof pred === \'function\' ? Object(util_["arrayFindIndex"])(arr, pred) : arr.indexOf(pred);\n return idx >= 0 ? [].concat(arr.slice(0, idx), arr.slice(idx + 1)) : arr;\n};\n/* harmony default export */ var month_tablevue_type_script_lang_js_ = ({\n props: {\n disabledDate: {},\n value: {},\n selectionMode: {\n default: \'month\'\n },\n minDate: {},\n\n maxDate: {},\n defaultValue: {\n validator: function validator(val) {\n // null or valid Date Object\n return val === null || Object(date_util_["isDate"])(val) || Array.isArray(val) && val.every(date_util_["isDate"]);\n }\n },\n date: {},\n rangeState: {\n default: function _default() {\n return {\n endDate: null,\n selecting: false\n };\n }\n }\n },\n\n mixins: [locale_default.a],\n\n watch: {\n \'rangeState.endDate\': function rangeStateEndDate(newVal) {\n this.markRange(this.minDate, newVal);\n },\n minDate: function minDate(newVal, oldVal) {\n if (getMonthTimestamp(newVal) !== getMonthTimestamp(oldVal)) {\n this.markRange(this.minDate, this.maxDate);\n }\n },\n maxDate: function maxDate(newVal, oldVal) {\n if (getMonthTimestamp(newVal) !== getMonthTimestamp(oldVal)) {\n this.markRange(this.minDate, this.maxDate);\n }\n }\n },\n\n data: function data() {\n return {\n months: [\'jan\', \'feb\', \'mar\', \'apr\', \'may\', \'jun\', \'jul\', \'aug\', \'sep\', \'oct\', \'nov\', \'dec\'],\n tableRows: [[], [], []],\n lastRow: null,\n lastColumn: null\n };\n },\n\n\n methods: {\n cellMatchesDate: function cellMatchesDate(cell, date) {\n var value = new Date(date);\n return this.date.getFullYear() === value.getFullYear() && Number(cell.text) === value.getMonth();\n },\n getCellStyle: function getCellStyle(cell) {\n var _this = this;\n\n var style = {};\n var year = this.date.getFullYear();\n var today = new Date();\n var month = cell.text;\n var defaultValue = this.defaultValue ? Array.isArray(this.defaultValue) ? this.defaultValue : [this.defaultValue] : [];\n style.disabled = typeof this.disabledDate === \'function\' ? month_tablevue_type_script_lang_js_datesInMonth(year, month).every(this.disabledDate) : false;\n style.current = Object(util_["arrayFindIndex"])(Object(util_["coerceTruthyValueToArray"])(this.value), function (date) {\n return date.getFullYear() === year && date.getMonth() === month;\n }) >= 0;\n style.today = today.getFullYear() === year && today.getMonth() === month;\n style.default = defaultValue.some(function (date) {\n return _this.cellMatchesDate(cell, date);\n });\n\n if (cell.inRange) {\n style[\'in-range\'] = true;\n\n if (cell.start) {\n style[\'start-date\'] = true;\n }\n\n if (cell.end) {\n style[\'end-date\'] = true;\n }\n }\n return style;\n },\n getMonthOfCell: function getMonthOfCell(month) {\n var year = this.date.getFullYear();\n return new Date(year, month, 1);\n },\n markRange: function markRange(minDate, maxDate) {\n minDate = getMonthTimestamp(minDate);\n maxDate = getMonthTimestamp(maxDate) || minDate;\n var _ref = [Math.min(minDate, maxDate), Math.max(minDate, maxDate)];\n minDate = _ref[0];\n maxDate = _ref[1];\n\n var rows = this.rows;\n for (var i = 0, k = rows.length; i < k; i++) {\n var row = rows[i];\n for (var j = 0, l = row.length; j < l; j++) {\n\n var cell = row[j];\n var index = i * 4 + j;\n var time = new Date(this.date.getFullYear(), index).getTime();\n\n cell.inRange = minDate && time >= minDate && time <= maxDate;\n cell.start = minDate && time === minDate;\n cell.end = maxDate && time === maxDate;\n }\n }\n },\n handleMouseMove: function handleMouseMove(event) {\n if (!this.rangeState.selecting) return;\n\n var target = event.target;\n if (target.tagName === \'A\') {\n target = target.parentNode.parentNode;\n }\n if (target.tagName === \'DIV\') {\n target = target.parentNode;\n }\n if (target.tagName !== \'TD\') return;\n\n var row = target.parentNode.rowIndex;\n var column = target.cellIndex;\n // can not select disabled date\n if (this.rows[row][column].disabled) return;\n\n // only update rangeState when mouse moves to a new cell\n // this avoids frequent Date object creation and improves performance\n if (row !== this.lastRow || column !== this.lastColumn) {\n this.lastRow = row;\n this.lastColumn = column;\n this.$emit(\'changerange\', {\n minDate: this.minDate,\n maxDate: this.maxDate,\n rangeState: {\n selecting: true,\n endDate: this.getMonthOfCell(row * 4 + column)\n }\n });\n }\n },\n handleMonthTableClick: function handleMonthTableClick(event) {\n var target = event.target;\n if (target.tagName === \'A\') {\n target = target.parentNode.parentNode;\n }\n if (target.tagName === \'DIV\') {\n target = target.parentNode;\n }\n if (target.tagName !== \'TD\') return;\n if (Object(dom_["hasClass"])(target, \'disabled\')) return;\n var column = target.cellIndex;\n var row = target.parentNode.rowIndex;\n var month = row * 4 + column;\n var newDate = this.getMonthOfCell(month);\n if (this.selectionMode === \'range\') {\n if (!this.rangeState.selecting) {\n this.$emit(\'pick\', { minDate: newDate, maxDate: null });\n this.rangeState.selecting = true;\n } else {\n if (newDate >= this.minDate) {\n this.$emit(\'pick\', { minDate: this.minDate, maxDate: newDate });\n } else {\n this.$emit(\'pick\', { minDate: newDate, maxDate: this.minDate });\n }\n this.rangeState.selecting = false;\n }\n } else if (this.selectionMode === \'months\') {\n var value = this.value || [];\n var year = this.date.getFullYear();\n var newValue = Object(util_["arrayFindIndex"])(value, function (date) {\n return date.getFullYear() === year && date.getMonth() === month;\n }) >= 0 ? month_tablevue_type_script_lang_js_removeFromArray(value, function (date) {\n return date.getTime() === newDate.getTime();\n }) : [].concat(value, [newDate]);\n this.$emit(\'pick\', newValue);\n } else {\n this.$emit(\'pick\', month);\n }\n }\n },\n\n computed: {\n rows: function rows() {\n var _this2 = this;\n\n // TODO: refactory rows / getCellClasses\n var rows = this.tableRows;\n var disabledDate = this.disabledDate;\n var selectedDate = [];\n var now = getMonthTimestamp(new Date());\n\n for (var i = 0; i < 3; i++) {\n var row = rows[i];\n\n var _loop = function _loop(j) {\n var cell = row[j];\n if (!cell) {\n cell = { row: i, column: j, type: \'normal\', inRange: false, start: false, end: false };\n }\n\n cell.type = \'normal\';\n\n var index = i * 4 + j;\n var time = new Date(_this2.date.getFullYear(), index).getTime();\n cell.inRange = time >= getMonthTimestamp(_this2.minDate) && time <= getMonthTimestamp(_this2.maxDate);\n cell.start = _this2.minDate && time === getMonthTimestamp(_this2.minDate);\n cell.end = _this2.maxDate && time === getMonthTimestamp(_this2.maxDate);\n var isToday = time === now;\n\n if (isToday) {\n cell.type = \'today\';\n }\n cell.text = index;\n var cellDate = new Date(time);\n cell.disabled = typeof disabledDate === \'function\' && disabledDate(cellDate);\n cell.selected = Object(util_["arrayFind"])(selectedDate, function (date) {\n return date.getTime() === cellDate.getTime();\n });\n\n _this2.$set(row, j, cell);\n };\n\n for (var j = 0; j < 4; j++) {\n _loop(j);\n }\n }\n return rows;\n }\n }\n});\n// CONCATENATED MODULE: ./packages/date-picker/src/basic/month-table.vue?vue&type=script&lang=js&\n /* harmony default export */ var basic_month_tablevue_type_script_lang_js_ = (month_tablevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/date-picker/src/basic/month-table.vue\n\n\n\n\n\n/* normalize component */\n\nvar month_table_component = normalizeComponent(\n basic_month_tablevue_type_script_lang_js_,\n month_tablevue_type_template_id_654d4f42_render,\n month_tablevue_type_template_id_654d4f42_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var month_table_api; }\nmonth_table_component.options.__file = "packages/date-picker/src/basic/month-table.vue"\n/* harmony default export */ var month_table = (month_table_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/basic/date-table.vue?vue&type=template&id=5d1f3341&\nvar date_tablevue_type_template_id_5d1f3341_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "table",\n {\n staticClass: "el-date-table",\n class: { "is-week-mode": _vm.selectionMode === "week" },\n attrs: { cellspacing: "0", cellpadding: "0" },\n on: { click: _vm.handleClick, mousemove: _vm.handleMouseMove }\n },\n [\n _c(\n "tbody",\n [\n _c(\n "tr",\n [\n _vm.showWeekNumber\n ? _c("th", [_vm._v(_vm._s(_vm.t("el.datepicker.week")))])\n : _vm._e(),\n _vm._l(_vm.WEEKS, function(week, key) {\n return _c("th", { key: key }, [\n _vm._v(_vm._s(_vm.t("el.datepicker.weeks." + week)))\n ])\n })\n ],\n 2\n ),\n _vm._l(_vm.rows, function(row, key) {\n return _c(\n "tr",\n {\n key: key,\n staticClass: "el-date-table__row",\n class: { current: _vm.isWeekActive(row[1]) }\n },\n _vm._l(row, function(cell, key) {\n return _c("td", { key: key, class: _vm.getCellClasses(cell) }, [\n _c("div", [\n _c("span", [\n _vm._v("\\n " + _vm._s(cell.text) + "\\n ")\n ])\n ])\n ])\n }),\n 0\n )\n })\n ],\n 2\n )\n ]\n )\n}\nvar date_tablevue_type_template_id_5d1f3341_staticRenderFns = []\ndate_tablevue_type_template_id_5d1f3341_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/date-picker/src/basic/date-table.vue?vue&type=template&id=5d1f3341&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/basic/date-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\nvar _WEEKS = [\'sun\', \'mon\', \'tue\', \'wed\', \'thu\', \'fri\', \'sat\'];\nvar date_tablevue_type_script_lang_js_getDateTimestamp = function getDateTimestamp(time) {\n if (typeof time === \'number\' || typeof time === \'string\') {\n return Object(date_util_["clearTime"])(new Date(time)).getTime();\n } else if (time instanceof Date) {\n return Object(date_util_["clearTime"])(time).getTime();\n } else {\n return NaN;\n }\n};\n\n// remove the first element that satisfies `pred` from arr\n// return a new array if modification occurs\n// return the original array otherwise\nvar date_tablevue_type_script_lang_js_removeFromArray = function removeFromArray(arr, pred) {\n var idx = typeof pred === \'function\' ? Object(util_["arrayFindIndex"])(arr, pred) : arr.indexOf(pred);\n return idx >= 0 ? [].concat(arr.slice(0, idx), arr.slice(idx + 1)) : arr;\n};\n\n/* harmony default export */ var date_tablevue_type_script_lang_js_ = ({\n mixins: [locale_default.a],\n\n props: {\n firstDayOfWeek: {\n default: 7,\n type: Number,\n validator: function validator(val) {\n return val >= 1 && val <= 7;\n }\n },\n\n value: {},\n\n defaultValue: {\n validator: function validator(val) {\n // either: null, valid Date object, Array of valid Date objects\n return val === null || Object(date_util_["isDate"])(val) || Array.isArray(val) && val.every(date_util_["isDate"]);\n }\n },\n\n date: {},\n\n selectionMode: {\n default: \'day\'\n },\n\n showWeekNumber: {\n type: Boolean,\n default: false\n },\n\n disabledDate: {},\n\n cellClassName: {},\n\n minDate: {},\n\n maxDate: {},\n\n rangeState: {\n default: function _default() {\n return {\n endDate: null,\n selecting: false\n };\n }\n }\n },\n\n computed: {\n offsetDay: function offsetDay() {\n var week = this.firstDayOfWeek;\n // 周日为界限,左右偏移的天数,3217654 例如周一就是 -1,目的是调整前两行日期的位置\n return week > 3 ? 7 - week : -week;\n },\n WEEKS: function WEEKS() {\n var week = this.firstDayOfWeek;\n return _WEEKS.concat(_WEEKS).slice(week, week + 7);\n },\n year: function year() {\n return this.date.getFullYear();\n },\n month: function month() {\n return this.date.getMonth();\n },\n startDate: function startDate() {\n return Object(date_util_["getStartDateOfMonth"])(this.year, this.month);\n },\n rows: function rows() {\n var _this = this;\n\n // TODO: refactory rows / getCellClasses\n var date = new Date(this.year, this.month, 1);\n var day = Object(date_util_["getFirstDayOfMonth"])(date); // day of first day\n var dateCountOfMonth = Object(date_util_["getDayCountOfMonth"])(date.getFullYear(), date.getMonth());\n var dateCountOfLastMonth = Object(date_util_["getDayCountOfMonth"])(date.getFullYear(), date.getMonth() === 0 ? 11 : date.getMonth() - 1);\n\n day = day === 0 ? 7 : day;\n\n var offset = this.offsetDay;\n var rows = this.tableRows;\n var count = 1;\n\n var startDate = this.startDate;\n var disabledDate = this.disabledDate;\n var cellClassName = this.cellClassName;\n var selectedDate = this.selectionMode === \'dates\' ? Object(util_["coerceTruthyValueToArray"])(this.value) : [];\n var now = date_tablevue_type_script_lang_js_getDateTimestamp(new Date());\n\n for (var i = 0; i < 6; i++) {\n var row = rows[i];\n\n if (this.showWeekNumber) {\n if (!row[0]) {\n row[0] = { type: \'week\', text: Object(date_util_["getWeekNumber"])(Object(date_util_["nextDate"])(startDate, i * 7 + 1)) };\n }\n }\n\n var _loop = function _loop(j) {\n var cell = row[_this.showWeekNumber ? j + 1 : j];\n if (!cell) {\n cell = { row: i, column: j, type: \'normal\', inRange: false, start: false, end: false };\n }\n\n cell.type = \'normal\';\n\n var index = i * 7 + j;\n var time = Object(date_util_["nextDate"])(startDate, index - offset).getTime();\n cell.inRange = time >= date_tablevue_type_script_lang_js_getDateTimestamp(_this.minDate) && time <= date_tablevue_type_script_lang_js_getDateTimestamp(_this.maxDate);\n cell.start = _this.minDate && time === date_tablevue_type_script_lang_js_getDateTimestamp(_this.minDate);\n cell.end = _this.maxDate && time === date_tablevue_type_script_lang_js_getDateTimestamp(_this.maxDate);\n var isToday = time === now;\n\n if (isToday) {\n cell.type = \'today\';\n }\n\n if (i >= 0 && i <= 1) {\n var numberOfDaysFromPreviousMonth = day + offset < 0 ? 7 + day + offset : day + offset;\n\n if (j + i * 7 >= numberOfDaysFromPreviousMonth) {\n cell.text = count++;\n } else {\n cell.text = dateCountOfLastMonth - (numberOfDaysFromPreviousMonth - j % 7) + 1 + i * 7;\n cell.type = \'prev-month\';\n }\n } else {\n if (count <= dateCountOfMonth) {\n cell.text = count++;\n } else {\n cell.text = count++ - dateCountOfMonth;\n cell.type = \'next-month\';\n }\n }\n\n var cellDate = new Date(time);\n cell.disabled = typeof disabledDate === \'function\' && disabledDate(cellDate);\n cell.selected = Object(util_["arrayFind"])(selectedDate, function (date) {\n return date.getTime() === cellDate.getTime();\n });\n cell.customClass = typeof cellClassName === \'function\' && cellClassName(cellDate);\n _this.$set(row, _this.showWeekNumber ? j + 1 : j, cell);\n };\n\n for (var j = 0; j < 7; j++) {\n _loop(j);\n }\n\n if (this.selectionMode === \'week\') {\n var start = this.showWeekNumber ? 1 : 0;\n var end = this.showWeekNumber ? 7 : 6;\n var isWeekActive = this.isWeekActive(row[start + 1]);\n\n row[start].inRange = isWeekActive;\n row[start].start = isWeekActive;\n row[end].inRange = isWeekActive;\n row[end].end = isWeekActive;\n }\n }\n\n return rows;\n }\n },\n\n watch: {\n \'rangeState.endDate\': function rangeStateEndDate(newVal) {\n this.markRange(this.minDate, newVal);\n },\n minDate: function minDate(newVal, oldVal) {\n if (date_tablevue_type_script_lang_js_getDateTimestamp(newVal) !== date_tablevue_type_script_lang_js_getDateTimestamp(oldVal)) {\n this.markRange(this.minDate, this.maxDate);\n }\n },\n maxDate: function maxDate(newVal, oldVal) {\n if (date_tablevue_type_script_lang_js_getDateTimestamp(newVal) !== date_tablevue_type_script_lang_js_getDateTimestamp(oldVal)) {\n this.markRange(this.minDate, this.maxDate);\n }\n }\n },\n\n data: function data() {\n return {\n tableRows: [[], [], [], [], [], []],\n lastRow: null,\n lastColumn: null\n };\n },\n\n\n methods: {\n cellMatchesDate: function cellMatchesDate(cell, date) {\n var value = new Date(date);\n return this.year === value.getFullYear() && this.month === value.getMonth() && Number(cell.text) === value.getDate();\n },\n getCellClasses: function getCellClasses(cell) {\n var _this2 = this;\n\n var selectionMode = this.selectionMode;\n var defaultValue = this.defaultValue ? Array.isArray(this.defaultValue) ? this.defaultValue : [this.defaultValue] : [];\n\n var classes = [];\n if ((cell.type === \'normal\' || cell.type === \'today\') && !cell.disabled) {\n classes.push(\'available\');\n if (cell.type === \'today\') {\n classes.push(\'today\');\n }\n } else {\n classes.push(cell.type);\n }\n\n if (cell.type === \'normal\' && defaultValue.some(function (date) {\n return _this2.cellMatchesDate(cell, date);\n })) {\n classes.push(\'default\');\n }\n\n if (selectionMode === \'day\' && (cell.type === \'normal\' || cell.type === \'today\') && this.cellMatchesDate(cell, this.value)) {\n classes.push(\'current\');\n }\n\n if (cell.inRange && (cell.type === \'normal\' || cell.type === \'today\' || this.selectionMode === \'week\')) {\n classes.push(\'in-range\');\n\n if (cell.start) {\n classes.push(\'start-date\');\n }\n\n if (cell.end) {\n classes.push(\'end-date\');\n }\n }\n\n if (cell.disabled) {\n classes.push(\'disabled\');\n }\n\n if (cell.selected) {\n classes.push(\'selected\');\n }\n\n if (cell.customClass) {\n classes.push(cell.customClass);\n }\n\n return classes.join(\' \');\n },\n getDateOfCell: function getDateOfCell(row, column) {\n var offsetFromStart = row * 7 + (column - (this.showWeekNumber ? 1 : 0)) - this.offsetDay;\n return Object(date_util_["nextDate"])(this.startDate, offsetFromStart);\n },\n isWeekActive: function isWeekActive(cell) {\n if (this.selectionMode !== \'week\') return false;\n var newDate = new Date(this.year, this.month, 1);\n var year = newDate.getFullYear();\n var month = newDate.getMonth();\n\n if (cell.type === \'prev-month\') {\n newDate.setMonth(month === 0 ? 11 : month - 1);\n newDate.setFullYear(month === 0 ? year - 1 : year);\n }\n\n if (cell.type === \'next-month\') {\n newDate.setMonth(month === 11 ? 0 : month + 1);\n newDate.setFullYear(month === 11 ? year + 1 : year);\n }\n\n newDate.setDate(parseInt(cell.text, 10));\n\n if (Object(date_util_["isDate"])(this.value)) {\n var dayOffset = (this.value.getDay() - this.firstDayOfWeek + 7) % 7 - 1;\n var weekDate = Object(date_util_["prevDate"])(this.value, dayOffset);\n return weekDate.getTime() === newDate.getTime();\n }\n return false;\n },\n markRange: function markRange(minDate, maxDate) {\n minDate = date_tablevue_type_script_lang_js_getDateTimestamp(minDate);\n maxDate = date_tablevue_type_script_lang_js_getDateTimestamp(maxDate) || minDate;\n var _ref = [Math.min(minDate, maxDate), Math.max(minDate, maxDate)];\n minDate = _ref[0];\n maxDate = _ref[1];\n\n\n var startDate = this.startDate;\n var rows = this.rows;\n for (var i = 0, k = rows.length; i < k; i++) {\n var row = rows[i];\n for (var j = 0, l = row.length; j < l; j++) {\n if (this.showWeekNumber && j === 0) continue;\n\n var _cell = row[j];\n var index = i * 7 + j + (this.showWeekNumber ? -1 : 0);\n var time = Object(date_util_["nextDate"])(startDate, index - this.offsetDay).getTime();\n\n _cell.inRange = minDate && time >= minDate && time <= maxDate;\n _cell.start = minDate && time === minDate;\n _cell.end = maxDate && time === maxDate;\n }\n }\n },\n handleMouseMove: function handleMouseMove(event) {\n if (!this.rangeState.selecting) return;\n\n var target = event.target;\n if (target.tagName === \'SPAN\') {\n target = target.parentNode.parentNode;\n }\n if (target.tagName === \'DIV\') {\n target = target.parentNode;\n }\n if (target.tagName !== \'TD\') return;\n\n var row = target.parentNode.rowIndex - 1;\n var column = target.cellIndex;\n\n // can not select disabled date\n if (this.rows[row][column].disabled) return;\n\n // only update rangeState when mouse moves to a new cell\n // this avoids frequent Date object creation and improves performance\n if (row !== this.lastRow || column !== this.lastColumn) {\n this.lastRow = row;\n this.lastColumn = column;\n this.$emit(\'changerange\', {\n minDate: this.minDate,\n maxDate: this.maxDate,\n rangeState: {\n selecting: true,\n endDate: this.getDateOfCell(row, column)\n }\n });\n }\n },\n handleClick: function handleClick(event) {\n var target = event.target;\n if (target.tagName === \'SPAN\') {\n target = target.parentNode.parentNode;\n }\n if (target.tagName === \'DIV\') {\n target = target.parentNode;\n }\n\n if (target.tagName !== \'TD\') return;\n\n var row = target.parentNode.rowIndex - 1;\n var column = this.selectionMode === \'week\' ? 1 : target.cellIndex;\n var cell = this.rows[row][column];\n\n if (cell.disabled || cell.type === \'week\') return;\n\n var newDate = this.getDateOfCell(row, column);\n\n if (this.selectionMode === \'range\') {\n if (!this.rangeState.selecting) {\n this.$emit(\'pick\', { minDate: newDate, maxDate: null });\n this.rangeState.selecting = true;\n } else {\n if (newDate >= this.minDate) {\n this.$emit(\'pick\', { minDate: this.minDate, maxDate: newDate });\n } else {\n this.$emit(\'pick\', { minDate: newDate, maxDate: this.minDate });\n }\n this.rangeState.selecting = false;\n }\n } else if (this.selectionMode === \'day\') {\n this.$emit(\'pick\', newDate);\n } else if (this.selectionMode === \'week\') {\n var weekNumber = Object(date_util_["getWeekNumber"])(newDate);\n var value = newDate.getFullYear() + \'w\' + weekNumber;\n this.$emit(\'pick\', {\n year: newDate.getFullYear(),\n week: weekNumber,\n value: value,\n date: newDate\n });\n } else if (this.selectionMode === \'dates\') {\n var _value = this.value || [];\n var newValue = cell.selected ? date_tablevue_type_script_lang_js_removeFromArray(_value, function (date) {\n return date.getTime() === newDate.getTime();\n }) : [].concat(_value, [newDate]);\n this.$emit(\'pick\', newValue);\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/date-picker/src/basic/date-table.vue?vue&type=script&lang=js&\n /* harmony default export */ var basic_date_tablevue_type_script_lang_js_ = (date_tablevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/date-picker/src/basic/date-table.vue\n\n\n\n\n\n/* normalize component */\n\nvar date_table_component = normalizeComponent(\n basic_date_tablevue_type_script_lang_js_,\n date_tablevue_type_template_id_5d1f3341_render,\n date_tablevue_type_template_id_5d1f3341_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var date_table_api; }\ndate_table_component.options.__file = "packages/date-picker/src/basic/date-table.vue"\n/* harmony default export */ var date_table = (date_table_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/date.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ var datevue_type_script_lang_js_ = ({\n mixins: [locale_default.a],\n\n directives: { Clickoutside: clickoutside_default.a },\n\n watch: {\n showTime: function showTime(val) {\n var _this = this;\n\n /* istanbul ignore if */\n if (!val) return;\n this.$nextTick(function (_) {\n var inputElm = _this.$refs.input.$el;\n if (inputElm) {\n _this.pickerWidth = inputElm.getBoundingClientRect().width + 10;\n }\n });\n },\n value: function value(val) {\n if (this.selectionMode === \'dates\' && this.value) return;\n if (this.selectionMode === \'months\' && this.value) return;\n if (this.selectionMode === \'years\' && this.value) return;\n if (Object(date_util_["isDate"])(val)) {\n this.date = new Date(val);\n } else {\n this.date = this.getDefaultValue();\n }\n },\n defaultValue: function defaultValue(val) {\n if (!Object(date_util_["isDate"])(this.value)) {\n this.date = val ? new Date(val) : new Date();\n }\n },\n timePickerVisible: function timePickerVisible(val) {\n var _this2 = this;\n\n if (val) this.$nextTick(function () {\n return _this2.$refs.timepicker.adjustSpinners();\n });\n },\n selectionMode: function selectionMode(newVal) {\n if (newVal === \'month\') {\n /* istanbul ignore next */\n if (this.currentView !== \'year\' || this.currentView !== \'month\') {\n this.currentView = \'month\';\n }\n } else if (newVal === \'dates\') {\n this.currentView = \'date\';\n } else if (newVal === \'years\') {\n this.currentView = \'year\';\n } else if (newVal === \'months\') {\n this.currentView = \'month\';\n }\n }\n },\n\n methods: {\n proxyTimePickerDataProperties: function proxyTimePickerDataProperties() {\n var _this3 = this;\n\n var format = function format(timeFormat) {\n _this3.$refs.timepicker.format = timeFormat;\n };\n var value = function value(_value) {\n _this3.$refs.timepicker.value = _value;\n };\n var date = function date(_date) {\n _this3.$refs.timepicker.date = _date;\n };\n var selectableRange = function selectableRange(_selectableRange) {\n _this3.$refs.timepicker.selectableRange = _selectableRange;\n };\n\n this.$watch(\'value\', value);\n this.$watch(\'date\', date);\n this.$watch(\'selectableRange\', selectableRange);\n\n format(this.timeFormat);\n value(this.value);\n date(this.date);\n selectableRange(this.selectableRange);\n },\n handleClear: function handleClear() {\n this.date = this.getDefaultValue();\n this.$emit(\'pick\', null);\n },\n emit: function emit(value) {\n var _this4 = this;\n\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 if (!value) {\n this.$emit.apply(this, [\'pick\', value].concat(args));\n } else if (Array.isArray(value)) {\n var dates = value.map(function (date) {\n return _this4.showTime ? Object(date_util_["clearMilliseconds"])(date) : Object(date_util_["clearTime"])(date);\n });\n this.$emit.apply(this, [\'pick\', dates].concat(args));\n } else {\n this.$emit.apply(this, [\'pick\', this.showTime ? Object(date_util_["clearMilliseconds"])(value) : Object(date_util_["clearTime"])(value)].concat(args));\n }\n this.userInputDate = null;\n this.userInputTime = null;\n },\n\n\n // resetDate() {\n // this.date = new Date(this.date);\n // },\n\n showMonthPicker: function showMonthPicker() {\n this.currentView = \'month\';\n },\n showYearPicker: function showYearPicker() {\n this.currentView = \'year\';\n },\n\n\n // XXX: 没用到\n // handleLabelClick() {\n // if (this.currentView === \'date\') {\n // this.showMonthPicker();\n // } else if (this.currentView === \'month\') {\n // this.showYearPicker();\n // }\n // },\n\n prevMonth: function prevMonth() {\n this.date = Object(date_util_["prevMonth"])(this.date);\n },\n nextMonth: function nextMonth() {\n this.date = Object(date_util_["nextMonth"])(this.date);\n },\n prevYear: function prevYear() {\n if (this.currentView === \'year\') {\n this.date = Object(date_util_["prevYear"])(this.date, 10);\n } else {\n this.date = Object(date_util_["prevYear"])(this.date);\n }\n },\n nextYear: function nextYear() {\n if (this.currentView === \'year\') {\n this.date = Object(date_util_["nextYear"])(this.date, 10);\n } else {\n this.date = Object(date_util_["nextYear"])(this.date);\n }\n },\n handleShortcutClick: function handleShortcutClick(shortcut) {\n if (shortcut.onClick) {\n shortcut.onClick(this);\n }\n },\n handleTimePick: function handleTimePick(value, visible, first) {\n if (Object(date_util_["isDate"])(value)) {\n var newDate = this.value ? Object(date_util_["modifyTime"])(this.value, value.getHours(), value.getMinutes(), value.getSeconds()) : Object(date_util_["modifyWithTimeString"])(this.getDefaultValue(), this.defaultTime);\n this.date = newDate;\n this.emit(this.date, true);\n } else {\n this.emit(value, true);\n }\n if (!first) {\n this.timePickerVisible = visible;\n }\n },\n handleTimePickClose: function handleTimePickClose() {\n this.timePickerVisible = false;\n },\n handleMonthPick: function handleMonthPick(month) {\n if (this.selectionMode === \'month\') {\n this.date = Object(date_util_["modifyDate"])(this.date, this.year, month, 1);\n this.emit(this.date);\n } else if (this.selectionMode === \'months\') {\n this.emit(month, true);\n } else {\n this.date = Object(date_util_["changeYearMonthAndClampDate"])(this.date, this.year, month);\n // TODO: should emit intermediate value ??\n // this.emit(this.date);\n this.currentView = \'date\';\n }\n },\n handleDatePick: function handleDatePick(value) {\n if (this.selectionMode === \'day\') {\n var newDate = this.value ? Object(date_util_["modifyDate"])(this.value, value.getFullYear(), value.getMonth(), value.getDate()) : Object(date_util_["modifyWithTimeString"])(value, this.defaultTime);\n // change default time while out of selectableRange\n if (!this.checkDateWithinRange(newDate)) {\n newDate = Object(date_util_["modifyDate"])(this.selectableRange[0][0], value.getFullYear(), value.getMonth(), value.getDate());\n }\n this.date = newDate;\n this.emit(this.date, this.showTime);\n } else if (this.selectionMode === \'week\') {\n this.emit(value.date);\n } else if (this.selectionMode === \'dates\') {\n this.emit(value, true); // set false to keep panel open\n }\n },\n handleYearPick: function handleYearPick(year) {\n if (this.selectionMode === \'year\') {\n this.date = Object(date_util_["modifyDate"])(this.date, year, 0, 1);\n this.emit(this.date);\n } else if (this.selectionMode === \'years\') {\n this.emit(year, true);\n } else {\n this.date = Object(date_util_["changeYearMonthAndClampDate"])(this.date, year, this.month);\n // TODO: should emit intermediate value ??\n // this.emit(this.date, true);\n this.currentView = \'month\';\n }\n },\n changeToNow: function changeToNow() {\n // NOTE: not a permanent solution\n // consider disable "now" button in the future\n if ((!this.disabledDate || !this.disabledDate(new Date())) && this.checkDateWithinRange(new Date())) {\n this.date = new Date();\n this.emit(this.date);\n }\n },\n confirm: function confirm() {\n if (this.selectionMode === \'dates\' || this.selectionMode === \'months\' || this.selectionMode === \'years\') {\n this.emit(this.value);\n } else {\n // value were emitted in handle{Date,Time}Pick, nothing to update here\n // deal with the scenario where: user opens the picker, then confirm without doing anything\n var value = this.value ? this.value : Object(date_util_["modifyWithTimeString"])(this.getDefaultValue(), this.defaultTime);\n this.date = new Date(value); // refresh date\n this.emit(value);\n }\n },\n resetView: function resetView() {\n if (this.selectionMode === \'month\' || this.selectionMode === \'months\') {\n this.currentView = \'month\';\n } else if (this.selectionMode === \'year\' || this.selectionMode === \'years\') {\n this.currentView = \'year\';\n } else {\n this.currentView = \'date\';\n }\n },\n handleEnter: function handleEnter() {\n document.body.addEventListener(\'keydown\', this.handleKeydown);\n },\n handleLeave: function handleLeave() {\n this.$emit(\'dodestroy\');\n document.body.removeEventListener(\'keydown\', this.handleKeydown);\n },\n handleKeydown: function handleKeydown(event) {\n var keyCode = event.keyCode;\n var list = [38, 40, 37, 39];\n if (this.visible && !this.timePickerVisible) {\n if (list.indexOf(keyCode) !== -1) {\n this.handleKeyControl(keyCode);\n event.stopPropagation();\n event.preventDefault();\n }\n if (keyCode === 13 && this.userInputDate === null && this.userInputTime === null) {\n // Enter\n this.emit(this.date, false);\n }\n }\n },\n handleKeyControl: function handleKeyControl(keyCode) {\n var mapping = {\n \'year\': {\n 38: -4, 40: 4, 37: -1, 39: 1, offset: function offset(date, step) {\n return date.setFullYear(date.getFullYear() + step);\n }\n },\n \'month\': {\n 38: -4, 40: 4, 37: -1, 39: 1, offset: function offset(date, step) {\n return date.setMonth(date.getMonth() + step);\n }\n },\n \'week\': {\n 38: -1, 40: 1, 37: -1, 39: 1, offset: function offset(date, step) {\n return date.setDate(date.getDate() + step * 7);\n }\n },\n \'day\': {\n 38: -7, 40: 7, 37: -1, 39: 1, offset: function offset(date, step) {\n return date.setDate(date.getDate() + step);\n }\n }\n };\n var mode = this.selectionMode;\n var year = 3.1536e10;\n var now = this.date.getTime();\n var newDate = new Date(this.date.getTime());\n while (Math.abs(now - newDate.getTime()) <= year) {\n var map = mapping[mode];\n map.offset(newDate, map[keyCode]);\n if (typeof this.disabledDate === \'function\' && this.disabledDate(newDate)) {\n continue;\n }\n this.date = newDate;\n this.$emit(\'pick\', newDate, true);\n break;\n }\n },\n handleVisibleTimeChange: function handleVisibleTimeChange(value) {\n var time = Object(date_util_["parseDate"])(value, this.timeFormat);\n if (time && this.checkDateWithinRange(time)) {\n this.date = Object(date_util_["modifyDate"])(time, this.year, this.month, this.monthDate);\n this.userInputTime = null;\n this.$refs.timepicker.value = this.date;\n this.timePickerVisible = false;\n this.emit(this.date, true);\n }\n },\n handleVisibleDateChange: function handleVisibleDateChange(value) {\n var date = Object(date_util_["parseDate"])(value, this.dateFormat);\n if (date) {\n if (typeof this.disabledDate === \'function\' && this.disabledDate(date)) {\n return;\n }\n this.date = Object(date_util_["modifyTime"])(date, this.date.getHours(), this.date.getMinutes(), this.date.getSeconds());\n this.userInputDate = null;\n this.resetView();\n this.emit(this.date, true);\n }\n },\n isValidValue: function isValidValue(value) {\n return value && !isNaN(value) && (typeof this.disabledDate === \'function\' ? !this.disabledDate(value) : true) && this.checkDateWithinRange(value);\n },\n getDefaultValue: function getDefaultValue() {\n // if default-value is set, return it\n // otherwise, return now (the moment this method gets called)\n return this.defaultValue ? new Date(this.defaultValue) : new Date();\n },\n checkDateWithinRange: function checkDateWithinRange(date) {\n return this.selectableRange.length > 0 ? Object(date_util_["timeWithinRange"])(date, this.selectableRange, this.format || \'HH:mm:ss\') : true;\n }\n },\n\n components: {\n TimePicker: panel_time, YearTable: year_table, MonthTable: month_table, DateTable: date_table, ElInput: input_default.a, ElButton: button_default.a\n },\n\n data: function data() {\n return {\n popperClass: \'\',\n date: new Date(),\n value: \'\',\n defaultValue: null, // use getDefaultValue() for time computation\n defaultTime: null,\n showTime: false,\n selectionMode: \'day\',\n shortcuts: \'\',\n visible: false,\n currentView: \'date\',\n disabledDate: \'\',\n cellClassName: \'\',\n selectableRange: [],\n firstDayOfWeek: 7,\n showWeekNumber: false,\n timePickerVisible: false,\n format: \'\',\n arrowControl: false,\n userInputDate: null,\n userInputTime: null\n };\n },\n\n\n computed: {\n year: function year() {\n return this.date.getFullYear();\n },\n month: function month() {\n return this.date.getMonth();\n },\n week: function week() {\n return Object(date_util_["getWeekNumber"])(this.date);\n },\n monthDate: function monthDate() {\n return this.date.getDate();\n },\n footerVisible: function footerVisible() {\n return this.showTime || this.selectionMode === \'dates\' || this.selectionMode === \'months\' || this.selectionMode === \'years\';\n },\n visibleTime: function visibleTime() {\n if (this.userInputTime !== null) {\n return this.userInputTime;\n } else {\n return Object(date_util_["formatDate"])(this.value || this.defaultValue, this.timeFormat);\n }\n },\n visibleDate: function visibleDate() {\n if (this.userInputDate !== null) {\n return this.userInputDate;\n } else {\n return Object(date_util_["formatDate"])(this.value || this.defaultValue, this.dateFormat);\n }\n },\n yearLabel: function yearLabel() {\n var yearTranslation = this.t(\'el.datepicker.year\');\n if (this.currentView === \'year\') {\n var startYear = Math.floor(this.year / 10) * 10;\n if (yearTranslation) {\n return startYear + \' \' + yearTranslation + \' - \' + (startYear + 9) + \' \' + yearTranslation;\n }\n return startYear + \' - \' + (startYear + 9);\n }\n return this.year + \' \' + yearTranslation;\n },\n timeFormat: function timeFormat() {\n if (this.format) {\n return Object(date_util_["extractTimeFormat"])(this.format);\n } else {\n return \'HH:mm:ss\';\n }\n },\n dateFormat: function dateFormat() {\n if (this.format) {\n return Object(date_util_["extractDateFormat"])(this.format);\n } else {\n return \'yyyy-MM-dd\';\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/date.vue?vue&type=script&lang=js&\n /* harmony default export */ var panel_datevue_type_script_lang_js_ = (datevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/date-picker/src/panel/date.vue\n\n\n\n\n\n/* normalize component */\n\nvar date_component = normalizeComponent(\n panel_datevue_type_script_lang_js_,\n datevue_type_template_id_2440d4ea_render,\n datevue_type_template_id_2440d4ea_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var date_api; }\ndate_component.options.__file = "packages/date-picker/src/panel/date.vue"\n/* harmony default export */ var panel_date = (date_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/date-range.vue?vue&type=template&id=2652849a&\nvar date_rangevue_type_template_id_2652849a_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n {\n attrs: { name: "el-zoom-in-top" },\n on: {\n "after-leave": function($event) {\n _vm.$emit("dodestroy")\n }\n }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-picker-panel el-date-range-picker el-popper",\n class: [\n {\n "has-sidebar": _vm.$slots.sidebar || _vm.shortcuts,\n "has-time": _vm.showTime\n },\n _vm.popperClass\n ]\n },\n [\n _c(\n "div",\n { staticClass: "el-picker-panel__body-wrapper" },\n [\n _vm._t("sidebar"),\n _vm.shortcuts\n ? _c(\n "div",\n { staticClass: "el-picker-panel__sidebar" },\n _vm._l(_vm.shortcuts, function(shortcut, key) {\n return _c(\n "button",\n {\n key: key,\n staticClass: "el-picker-panel__shortcut",\n attrs: { type: "button" },\n on: {\n click: function($event) {\n _vm.handleShortcutClick(shortcut)\n }\n }\n },\n [_vm._v(_vm._s(shortcut.text))]\n )\n }),\n 0\n )\n : _vm._e(),\n _c("div", { staticClass: "el-picker-panel__body" }, [\n _vm.showTime\n ? _c(\n "div",\n { staticClass: "el-date-range-picker__time-header" },\n [\n _c(\n "span",\n { staticClass: "el-date-range-picker__editors-wrap" },\n [\n _c(\n "span",\n {\n staticClass:\n "el-date-range-picker__time-picker-wrap"\n },\n [\n _c("el-input", {\n ref: "minInput",\n staticClass: "el-date-range-picker__editor",\n attrs: {\n size: "small",\n disabled: _vm.rangeState.selecting,\n placeholder: _vm.t(\n "el.datepicker.startDate"\n ),\n value: _vm.minVisibleDate\n },\n on: {\n input: function(val) {\n return _vm.handleDateInput(val, "min")\n },\n change: function(val) {\n return _vm.handleDateChange(val, "min")\n }\n }\n })\n ],\n 1\n ),\n _c(\n "span",\n {\n directives: [\n {\n name: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.handleMinTimeClose,\n expression: "handleMinTimeClose"\n }\n ],\n staticClass:\n "el-date-range-picker__time-picker-wrap"\n },\n [\n _c("el-input", {\n staticClass: "el-date-range-picker__editor",\n attrs: {\n size: "small",\n disabled: _vm.rangeState.selecting,\n placeholder: _vm.t(\n "el.datepicker.startTime"\n ),\n value: _vm.minVisibleTime\n },\n on: {\n focus: function($event) {\n _vm.minTimePickerVisible = true\n },\n input: function(val) {\n return _vm.handleTimeInput(val, "min")\n },\n change: function(val) {\n return _vm.handleTimeChange(val, "min")\n }\n }\n }),\n _c("time-picker", {\n ref: "minTimePicker",\n attrs: {\n "time-arrow-control": _vm.arrowControl,\n visible: _vm.minTimePickerVisible\n },\n on: {\n pick: _vm.handleMinTimePick,\n mounted: function($event) {\n _vm.$refs.minTimePicker.format =\n _vm.timeFormat\n }\n }\n })\n ],\n 1\n )\n ]\n ),\n _c("span", { staticClass: "el-icon-arrow-right" }),\n _c(\n "span",\n {\n staticClass:\n "el-date-range-picker__editors-wrap is-right"\n },\n [\n _c(\n "span",\n {\n staticClass:\n "el-date-range-picker__time-picker-wrap"\n },\n [\n _c("el-input", {\n staticClass: "el-date-range-picker__editor",\n attrs: {\n size: "small",\n disabled: _vm.rangeState.selecting,\n placeholder: _vm.t("el.datepicker.endDate"),\n value: _vm.maxVisibleDate,\n readonly: !_vm.minDate\n },\n on: {\n input: function(val) {\n return _vm.handleDateInput(val, "max")\n },\n change: function(val) {\n return _vm.handleDateChange(val, "max")\n }\n }\n })\n ],\n 1\n ),\n _c(\n "span",\n {\n directives: [\n {\n name: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.handleMaxTimeClose,\n expression: "handleMaxTimeClose"\n }\n ],\n staticClass:\n "el-date-range-picker__time-picker-wrap"\n },\n [\n _c("el-input", {\n staticClass: "el-date-range-picker__editor",\n attrs: {\n size: "small",\n disabled: _vm.rangeState.selecting,\n placeholder: _vm.t("el.datepicker.endTime"),\n value: _vm.maxVisibleTime,\n readonly: !_vm.minDate\n },\n on: {\n focus: function($event) {\n _vm.minDate &&\n (_vm.maxTimePickerVisible = true)\n },\n input: function(val) {\n return _vm.handleTimeInput(val, "max")\n },\n change: function(val) {\n return _vm.handleTimeChange(val, "max")\n }\n }\n }),\n _c("time-picker", {\n ref: "maxTimePicker",\n attrs: {\n "time-arrow-control": _vm.arrowControl,\n visible: _vm.maxTimePickerVisible\n },\n on: {\n pick: _vm.handleMaxTimePick,\n mounted: function($event) {\n _vm.$refs.maxTimePicker.format =\n _vm.timeFormat\n }\n }\n })\n ],\n 1\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _c(\n "div",\n {\n staticClass:\n "el-picker-panel__content el-date-range-picker__content is-left"\n },\n [\n _c("div", { staticClass: "el-date-range-picker__header" }, [\n _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-d-arrow-left",\n attrs: { type: "button" },\n on: { click: _vm.leftPrevYear }\n }),\n _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-arrow-left",\n attrs: { type: "button" },\n on: { click: _vm.leftPrevMonth }\n }),\n _vm.unlinkPanels\n ? _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-d-arrow-right",\n class: { "is-disabled": !_vm.enableYearArrow },\n attrs: {\n type: "button",\n disabled: !_vm.enableYearArrow\n },\n on: { click: _vm.leftNextYear }\n })\n : _vm._e(),\n _vm.unlinkPanels\n ? _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-arrow-right",\n class: { "is-disabled": !_vm.enableMonthArrow },\n attrs: {\n type: "button",\n disabled: !_vm.enableMonthArrow\n },\n on: { click: _vm.leftNextMonth }\n })\n : _vm._e(),\n _c("div", [_vm._v(_vm._s(_vm.leftLabel))])\n ]),\n _c("date-table", {\n attrs: {\n "selection-mode": "range",\n date: _vm.leftDate,\n "default-value": _vm.defaultValue,\n "min-date": _vm.minDate,\n "max-date": _vm.maxDate,\n "range-state": _vm.rangeState,\n "disabled-date": _vm.disabledDate,\n "cell-class-name": _vm.cellClassName,\n "first-day-of-week": _vm.firstDayOfWeek\n },\n on: {\n changerange: _vm.handleChangeRange,\n pick: _vm.handleRangePick\n }\n })\n ],\n 1\n ),\n _c(\n "div",\n {\n staticClass:\n "el-picker-panel__content el-date-range-picker__content is-right"\n },\n [\n _c("div", { staticClass: "el-date-range-picker__header" }, [\n _vm.unlinkPanels\n ? _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-d-arrow-left",\n class: { "is-disabled": !_vm.enableYearArrow },\n attrs: {\n type: "button",\n disabled: !_vm.enableYearArrow\n },\n on: { click: _vm.rightPrevYear }\n })\n : _vm._e(),\n _vm.unlinkPanels\n ? _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-arrow-left",\n class: { "is-disabled": !_vm.enableMonthArrow },\n attrs: {\n type: "button",\n disabled: !_vm.enableMonthArrow\n },\n on: { click: _vm.rightPrevMonth }\n })\n : _vm._e(),\n _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-d-arrow-right",\n attrs: { type: "button" },\n on: { click: _vm.rightNextYear }\n }),\n _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-arrow-right",\n attrs: { type: "button" },\n on: { click: _vm.rightNextMonth }\n }),\n _c("div", [_vm._v(_vm._s(_vm.rightLabel))])\n ]),\n _c("date-table", {\n attrs: {\n "selection-mode": "range",\n date: _vm.rightDate,\n "default-value": _vm.defaultValue,\n "min-date": _vm.minDate,\n "max-date": _vm.maxDate,\n "range-state": _vm.rangeState,\n "disabled-date": _vm.disabledDate,\n "cell-class-name": _vm.cellClassName,\n "first-day-of-week": _vm.firstDayOfWeek\n },\n on: {\n changerange: _vm.handleChangeRange,\n pick: _vm.handleRangePick\n }\n })\n ],\n 1\n )\n ])\n ],\n 2\n ),\n _vm.showTime\n ? _c(\n "div",\n { staticClass: "el-picker-panel__footer" },\n [\n _c(\n "el-button",\n {\n staticClass: "el-picker-panel__link-btn",\n attrs: { size: "mini", type: "text" },\n on: { click: _vm.handleClear }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.t("el.datepicker.clear")) +\n "\\n "\n )\n ]\n ),\n _c(\n "el-button",\n {\n staticClass: "el-picker-panel__link-btn",\n attrs: {\n plain: "",\n size: "mini",\n disabled: _vm.btnDisabled\n },\n on: {\n click: function($event) {\n _vm.handleConfirm(false)\n }\n }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.t("el.datepicker.confirm")) +\n "\\n "\n )\n ]\n )\n ],\n 1\n )\n : _vm._e()\n ]\n )\n ]\n )\n}\nvar date_rangevue_type_template_id_2652849a_staticRenderFns = []\ndate_rangevue_type_template_id_2652849a_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/date-range.vue?vue&type=template&id=2652849a&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/date-range.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n\nvar date_rangevue_type_script_lang_js_calcDefaultValue = function calcDefaultValue(defaultValue) {\n if (Array.isArray(defaultValue)) {\n return [new Date(defaultValue[0]), new Date(defaultValue[1])];\n } else if (defaultValue) {\n return [new Date(defaultValue), Object(date_util_["nextDate"])(new Date(defaultValue), 1)];\n } else {\n return [new Date(), Object(date_util_["nextDate"])(new Date(), 1)];\n }\n};\n\n/* harmony default export */ var date_rangevue_type_script_lang_js_ = ({\n mixins: [locale_default.a],\n\n directives: { Clickoutside: clickoutside_default.a },\n\n computed: {\n btnDisabled: function btnDisabled() {\n return !(this.minDate && this.maxDate && !this.selecting && this.isValidValue([this.minDate, this.maxDate]));\n },\n leftLabel: function leftLabel() {\n return this.leftDate.getFullYear() + \' \' + this.t(\'el.datepicker.year\') + \' \' + this.t(\'el.datepicker.month\' + (this.leftDate.getMonth() + 1));\n },\n rightLabel: function rightLabel() {\n return this.rightDate.getFullYear() + \' \' + this.t(\'el.datepicker.year\') + \' \' + this.t(\'el.datepicker.month\' + (this.rightDate.getMonth() + 1));\n },\n leftYear: function leftYear() {\n return this.leftDate.getFullYear();\n },\n leftMonth: function leftMonth() {\n return this.leftDate.getMonth();\n },\n leftMonthDate: function leftMonthDate() {\n return this.leftDate.getDate();\n },\n rightYear: function rightYear() {\n return this.rightDate.getFullYear();\n },\n rightMonth: function rightMonth() {\n return this.rightDate.getMonth();\n },\n rightMonthDate: function rightMonthDate() {\n return this.rightDate.getDate();\n },\n minVisibleDate: function minVisibleDate() {\n if (this.dateUserInput.min !== null) return this.dateUserInput.min;\n if (this.minDate) return Object(date_util_["formatDate"])(this.minDate, this.dateFormat);\n return \'\';\n },\n maxVisibleDate: function maxVisibleDate() {\n if (this.dateUserInput.max !== null) return this.dateUserInput.max;\n if (this.maxDate || this.minDate) return Object(date_util_["formatDate"])(this.maxDate || this.minDate, this.dateFormat);\n return \'\';\n },\n minVisibleTime: function minVisibleTime() {\n if (this.timeUserInput.min !== null) return this.timeUserInput.min;\n if (this.minDate) return Object(date_util_["formatDate"])(this.minDate, this.timeFormat);\n return \'\';\n },\n maxVisibleTime: function maxVisibleTime() {\n if (this.timeUserInput.max !== null) return this.timeUserInput.max;\n if (this.maxDate || this.minDate) return Object(date_util_["formatDate"])(this.maxDate || this.minDate, this.timeFormat);\n return \'\';\n },\n timeFormat: function timeFormat() {\n if (this.format) {\n return Object(date_util_["extractTimeFormat"])(this.format);\n } else {\n return \'HH:mm:ss\';\n }\n },\n dateFormat: function dateFormat() {\n if (this.format) {\n return Object(date_util_["extractDateFormat"])(this.format);\n } else {\n return \'yyyy-MM-dd\';\n }\n },\n enableMonthArrow: function enableMonthArrow() {\n var nextMonth = (this.leftMonth + 1) % 12;\n var yearOffset = this.leftMonth + 1 >= 12 ? 1 : 0;\n return this.unlinkPanels && new Date(this.leftYear + yearOffset, nextMonth) < new Date(this.rightYear, this.rightMonth);\n },\n enableYearArrow: function enableYearArrow() {\n return this.unlinkPanels && this.rightYear * 12 + this.rightMonth - (this.leftYear * 12 + this.leftMonth + 1) >= 12;\n }\n },\n\n data: function data() {\n return {\n popperClass: \'\',\n value: [],\n defaultValue: null,\n defaultTime: null,\n minDate: \'\',\n maxDate: \'\',\n leftDate: new Date(),\n rightDate: Object(date_util_["nextMonth"])(new Date()),\n rangeState: {\n endDate: null,\n selecting: false,\n row: null,\n column: null\n },\n showTime: false,\n shortcuts: \'\',\n visible: \'\',\n disabledDate: \'\',\n cellClassName: \'\',\n firstDayOfWeek: 7,\n minTimePickerVisible: false,\n maxTimePickerVisible: false,\n format: \'\',\n arrowControl: false,\n unlinkPanels: false,\n dateUserInput: {\n min: null,\n max: null\n },\n timeUserInput: {\n min: null,\n max: null\n }\n };\n },\n\n\n watch: {\n minDate: function minDate(val) {\n var _this = this;\n\n this.dateUserInput.min = null;\n this.timeUserInput.min = null;\n this.$nextTick(function () {\n if (_this.$refs.maxTimePicker && _this.maxDate && _this.maxDate < _this.minDate) {\n var format = \'HH:mm:ss\';\n _this.$refs.maxTimePicker.selectableRange = [[Object(date_util_["parseDate"])(Object(date_util_["formatDate"])(_this.minDate, format), format), Object(date_util_["parseDate"])(\'23:59:59\', format)]];\n }\n });\n if (val && this.$refs.minTimePicker) {\n this.$refs.minTimePicker.date = val;\n this.$refs.minTimePicker.value = val;\n }\n },\n maxDate: function maxDate(val) {\n this.dateUserInput.max = null;\n this.timeUserInput.max = null;\n if (val && this.$refs.maxTimePicker) {\n this.$refs.maxTimePicker.date = val;\n this.$refs.maxTimePicker.value = val;\n }\n },\n minTimePickerVisible: function minTimePickerVisible(val) {\n var _this2 = this;\n\n if (val) {\n this.$nextTick(function () {\n _this2.$refs.minTimePicker.date = _this2.minDate;\n _this2.$refs.minTimePicker.value = _this2.minDate;\n _this2.$refs.minTimePicker.adjustSpinners();\n });\n }\n },\n maxTimePickerVisible: function maxTimePickerVisible(val) {\n var _this3 = this;\n\n if (val) {\n this.$nextTick(function () {\n _this3.$refs.maxTimePicker.date = _this3.maxDate;\n _this3.$refs.maxTimePicker.value = _this3.maxDate;\n _this3.$refs.maxTimePicker.adjustSpinners();\n });\n }\n },\n value: function value(newVal) {\n if (!newVal) {\n this.minDate = null;\n this.maxDate = null;\n } else if (Array.isArray(newVal)) {\n this.minDate = Object(date_util_["isDate"])(newVal[0]) ? new Date(newVal[0]) : null;\n this.maxDate = Object(date_util_["isDate"])(newVal[1]) ? new Date(newVal[1]) : null;\n if (this.minDate) {\n this.leftDate = this.minDate;\n if (this.unlinkPanels && this.maxDate) {\n var minDateYear = this.minDate.getFullYear();\n var minDateMonth = this.minDate.getMonth();\n var maxDateYear = this.maxDate.getFullYear();\n var maxDateMonth = this.maxDate.getMonth();\n this.rightDate = minDateYear === maxDateYear && minDateMonth === maxDateMonth ? Object(date_util_["nextMonth"])(this.maxDate) : this.maxDate;\n } else {\n this.rightDate = Object(date_util_["nextMonth"])(this.leftDate);\n }\n } else {\n this.leftDate = date_rangevue_type_script_lang_js_calcDefaultValue(this.defaultValue)[0];\n this.rightDate = Object(date_util_["nextMonth"])(this.leftDate);\n }\n }\n },\n defaultValue: function defaultValue(val) {\n if (!Array.isArray(this.value)) {\n var _calcDefaultValue = date_rangevue_type_script_lang_js_calcDefaultValue(val),\n left = _calcDefaultValue[0],\n right = _calcDefaultValue[1];\n\n this.leftDate = left;\n this.rightDate = val && val[1] && this.unlinkPanels ? right : Object(date_util_["nextMonth"])(this.leftDate);\n }\n }\n },\n\n methods: {\n handleClear: function handleClear() {\n this.minDate = null;\n this.maxDate = null;\n this.leftDate = date_rangevue_type_script_lang_js_calcDefaultValue(this.defaultValue)[0];\n this.rightDate = Object(date_util_["nextMonth"])(this.leftDate);\n this.$emit(\'pick\', null);\n },\n handleChangeRange: function handleChangeRange(val) {\n this.minDate = val.minDate;\n this.maxDate = val.maxDate;\n this.rangeState = val.rangeState;\n },\n handleDateInput: function handleDateInput(value, type) {\n this.dateUserInput[type] = value;\n if (value.length !== this.dateFormat.length) return;\n var parsedValue = Object(date_util_["parseDate"])(value, this.dateFormat);\n\n if (parsedValue) {\n if (typeof this.disabledDate === \'function\' && this.disabledDate(new Date(parsedValue))) {\n return;\n }\n if (type === \'min\') {\n this.minDate = Object(date_util_["modifyDate"])(this.minDate || new Date(), parsedValue.getFullYear(), parsedValue.getMonth(), parsedValue.getDate());\n this.leftDate = new Date(parsedValue);\n if (!this.unlinkPanels) {\n this.rightDate = Object(date_util_["nextMonth"])(this.leftDate);\n }\n } else {\n this.maxDate = Object(date_util_["modifyDate"])(this.maxDate || new Date(), parsedValue.getFullYear(), parsedValue.getMonth(), parsedValue.getDate());\n this.rightDate = new Date(parsedValue);\n if (!this.unlinkPanels) {\n this.leftDate = Object(date_util_["prevMonth"])(parsedValue);\n }\n }\n }\n },\n handleDateChange: function handleDateChange(value, type) {\n var parsedValue = Object(date_util_["parseDate"])(value, this.dateFormat);\n if (parsedValue) {\n if (type === \'min\') {\n this.minDate = Object(date_util_["modifyDate"])(this.minDate, parsedValue.getFullYear(), parsedValue.getMonth(), parsedValue.getDate());\n if (this.minDate > this.maxDate) {\n this.maxDate = this.minDate;\n }\n } else {\n this.maxDate = Object(date_util_["modifyDate"])(this.maxDate, parsedValue.getFullYear(), parsedValue.getMonth(), parsedValue.getDate());\n if (this.maxDate < this.minDate) {\n this.minDate = this.maxDate;\n }\n }\n }\n },\n handleTimeInput: function handleTimeInput(value, type) {\n var _this4 = this;\n\n this.timeUserInput[type] = value;\n if (value.length !== this.timeFormat.length) return;\n var parsedValue = Object(date_util_["parseDate"])(value, this.timeFormat);\n\n if (parsedValue) {\n if (type === \'min\') {\n this.minDate = Object(date_util_["modifyTime"])(this.minDate, parsedValue.getHours(), parsedValue.getMinutes(), parsedValue.getSeconds());\n this.$nextTick(function (_) {\n return _this4.$refs.minTimePicker.adjustSpinners();\n });\n } else {\n this.maxDate = Object(date_util_["modifyTime"])(this.maxDate, parsedValue.getHours(), parsedValue.getMinutes(), parsedValue.getSeconds());\n this.$nextTick(function (_) {\n return _this4.$refs.maxTimePicker.adjustSpinners();\n });\n }\n }\n },\n handleTimeChange: function handleTimeChange(value, type) {\n var parsedValue = Object(date_util_["parseDate"])(value, this.timeFormat);\n if (parsedValue) {\n if (type === \'min\') {\n this.minDate = Object(date_util_["modifyTime"])(this.minDate, parsedValue.getHours(), parsedValue.getMinutes(), parsedValue.getSeconds());\n if (this.minDate > this.maxDate) {\n this.maxDate = this.minDate;\n }\n this.$refs.minTimePicker.value = this.minDate;\n this.minTimePickerVisible = false;\n } else {\n this.maxDate = Object(date_util_["modifyTime"])(this.maxDate, parsedValue.getHours(), parsedValue.getMinutes(), parsedValue.getSeconds());\n if (this.maxDate < this.minDate) {\n this.minDate = this.maxDate;\n }\n this.$refs.maxTimePicker.value = this.minDate;\n this.maxTimePickerVisible = false;\n }\n }\n },\n handleRangePick: function handleRangePick(val) {\n var _this5 = this;\n\n var close = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var defaultTime = this.defaultTime || [];\n var minDate = Object(date_util_["modifyWithTimeString"])(val.minDate, defaultTime[0]);\n var maxDate = Object(date_util_["modifyWithTimeString"])(val.maxDate, defaultTime[1]);\n\n if (this.maxDate === maxDate && this.minDate === minDate) {\n return;\n }\n this.onPick && this.onPick(val);\n this.maxDate = maxDate;\n this.minDate = minDate;\n\n // workaround for https://github.com/ElemeFE/element/issues/7539, should remove this block when we don\'t have to care about Chromium 55 - 57\n setTimeout(function () {\n _this5.maxDate = maxDate;\n _this5.minDate = minDate;\n }, 10);\n if (!close || this.showTime) return;\n this.handleConfirm();\n },\n handleShortcutClick: function handleShortcutClick(shortcut) {\n if (shortcut.onClick) {\n shortcut.onClick(this);\n }\n },\n handleMinTimePick: function handleMinTimePick(value, visible, first) {\n this.minDate = this.minDate || new Date();\n if (value) {\n this.minDate = Object(date_util_["modifyTime"])(this.minDate, value.getHours(), value.getMinutes(), value.getSeconds());\n }\n\n if (!first) {\n this.minTimePickerVisible = visible;\n }\n\n if (!this.maxDate || this.maxDate && this.maxDate.getTime() < this.minDate.getTime()) {\n this.maxDate = new Date(this.minDate);\n }\n },\n handleMinTimeClose: function handleMinTimeClose() {\n this.minTimePickerVisible = false;\n },\n handleMaxTimePick: function handleMaxTimePick(value, visible, first) {\n if (this.maxDate && value) {\n this.maxDate = Object(date_util_["modifyTime"])(this.maxDate, value.getHours(), value.getMinutes(), value.getSeconds());\n }\n\n if (!first) {\n this.maxTimePickerVisible = visible;\n }\n\n if (this.maxDate && this.minDate && this.minDate.getTime() > this.maxDate.getTime()) {\n this.minDate = new Date(this.maxDate);\n }\n },\n handleMaxTimeClose: function handleMaxTimeClose() {\n this.maxTimePickerVisible = false;\n },\n\n\n // leftPrev*, rightNext* need to take care of `unlinkPanels`\n leftPrevYear: function leftPrevYear() {\n this.leftDate = Object(date_util_["prevYear"])(this.leftDate);\n if (!this.unlinkPanels) {\n this.rightDate = Object(date_util_["nextMonth"])(this.leftDate);\n }\n },\n leftPrevMonth: function leftPrevMonth() {\n this.leftDate = Object(date_util_["prevMonth"])(this.leftDate);\n if (!this.unlinkPanels) {\n this.rightDate = Object(date_util_["nextMonth"])(this.leftDate);\n }\n },\n rightNextYear: function rightNextYear() {\n if (!this.unlinkPanels) {\n this.leftDate = Object(date_util_["nextYear"])(this.leftDate);\n this.rightDate = Object(date_util_["nextMonth"])(this.leftDate);\n } else {\n this.rightDate = Object(date_util_["nextYear"])(this.rightDate);\n }\n },\n rightNextMonth: function rightNextMonth() {\n if (!this.unlinkPanels) {\n this.leftDate = Object(date_util_["nextMonth"])(this.leftDate);\n this.rightDate = Object(date_util_["nextMonth"])(this.leftDate);\n } else {\n this.rightDate = Object(date_util_["nextMonth"])(this.rightDate);\n }\n },\n\n\n // leftNext*, rightPrev* are called when `unlinkPanels` is true\n leftNextYear: function leftNextYear() {\n this.leftDate = Object(date_util_["nextYear"])(this.leftDate);\n },\n leftNextMonth: function leftNextMonth() {\n this.leftDate = Object(date_util_["nextMonth"])(this.leftDate);\n },\n rightPrevYear: function rightPrevYear() {\n this.rightDate = Object(date_util_["prevYear"])(this.rightDate);\n },\n rightPrevMonth: function rightPrevMonth() {\n this.rightDate = Object(date_util_["prevMonth"])(this.rightDate);\n },\n handleConfirm: function handleConfirm() {\n var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (this.isValidValue([this.minDate, this.maxDate])) {\n this.$emit(\'pick\', [this.minDate, this.maxDate], visible);\n }\n },\n isValidValue: function isValidValue(value) {\n return Array.isArray(value) && value && value[0] && value[1] && Object(date_util_["isDate"])(value[0]) && Object(date_util_["isDate"])(value[1]) && value[0].getTime() <= value[1].getTime() && (typeof this.disabledDate === \'function\' ? !this.disabledDate(value[0]) && !this.disabledDate(value[1]) : true);\n },\n resetView: function resetView() {\n // NOTE: this is a hack to reset {min, max}Date on picker open.\n // TODO: correct way of doing so is to refactor {min, max}Date to be dependent on value and internal selection state\n // an alternative would be resetView whenever picker becomes visible, should also investigate date-panel\'s resetView\n if (this.minDate && this.maxDate == null) this.rangeState.selecting = false;\n this.minDate = this.value && Object(date_util_["isDate"])(this.value[0]) ? new Date(this.value[0]) : null;\n this.maxDate = this.value && Object(date_util_["isDate"])(this.value[0]) ? new Date(this.value[1]) : null;\n }\n },\n\n components: { TimePicker: panel_time, DateTable: date_table, ElInput: input_default.a, ElButton: button_default.a }\n});\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/date-range.vue?vue&type=script&lang=js&\n /* harmony default export */ var panel_date_rangevue_type_script_lang_js_ = (date_rangevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/date-picker/src/panel/date-range.vue\n\n\n\n\n\n/* normalize component */\n\nvar date_range_component = normalizeComponent(\n panel_date_rangevue_type_script_lang_js_,\n date_rangevue_type_template_id_2652849a_render,\n date_rangevue_type_template_id_2652849a_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var date_range_api; }\ndate_range_component.options.__file = "packages/date-picker/src/panel/date-range.vue"\n/* harmony default export */ var date_range = (date_range_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/month-range.vue?vue&type=template&id=f2645fb8&\nvar month_rangevue_type_template_id_f2645fb8_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n {\n attrs: { name: "el-zoom-in-top" },\n on: {\n "after-leave": function($event) {\n _vm.$emit("dodestroy")\n }\n }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-picker-panel el-date-range-picker el-popper",\n class: [\n {\n "has-sidebar": _vm.$slots.sidebar || _vm.shortcuts\n },\n _vm.popperClass\n ]\n },\n [\n _c(\n "div",\n { staticClass: "el-picker-panel__body-wrapper" },\n [\n _vm._t("sidebar"),\n _vm.shortcuts\n ? _c(\n "div",\n { staticClass: "el-picker-panel__sidebar" },\n _vm._l(_vm.shortcuts, function(shortcut, key) {\n return _c(\n "button",\n {\n key: key,\n staticClass: "el-picker-panel__shortcut",\n attrs: { type: "button" },\n on: {\n click: function($event) {\n _vm.handleShortcutClick(shortcut)\n }\n }\n },\n [_vm._v(_vm._s(shortcut.text))]\n )\n }),\n 0\n )\n : _vm._e(),\n _c("div", { staticClass: "el-picker-panel__body" }, [\n _c(\n "div",\n {\n staticClass:\n "el-picker-panel__content el-date-range-picker__content is-left"\n },\n [\n _c("div", { staticClass: "el-date-range-picker__header" }, [\n _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-d-arrow-left",\n attrs: { type: "button" },\n on: { click: _vm.leftPrevYear }\n }),\n _vm.unlinkPanels\n ? _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-d-arrow-right",\n class: { "is-disabled": !_vm.enableYearArrow },\n attrs: {\n type: "button",\n disabled: !_vm.enableYearArrow\n },\n on: { click: _vm.leftNextYear }\n })\n : _vm._e(),\n _c("div", [_vm._v(_vm._s(_vm.leftLabel))])\n ]),\n _c("month-table", {\n attrs: {\n "selection-mode": "range",\n date: _vm.leftDate,\n "default-value": _vm.defaultValue,\n "min-date": _vm.minDate,\n "max-date": _vm.maxDate,\n "range-state": _vm.rangeState,\n "disabled-date": _vm.disabledDate\n },\n on: {\n changerange: _vm.handleChangeRange,\n pick: _vm.handleRangePick\n }\n })\n ],\n 1\n ),\n _c(\n "div",\n {\n staticClass:\n "el-picker-panel__content el-date-range-picker__content is-right"\n },\n [\n _c("div", { staticClass: "el-date-range-picker__header" }, [\n _vm.unlinkPanels\n ? _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-d-arrow-left",\n class: { "is-disabled": !_vm.enableYearArrow },\n attrs: {\n type: "button",\n disabled: !_vm.enableYearArrow\n },\n on: { click: _vm.rightPrevYear }\n })\n : _vm._e(),\n _c("button", {\n staticClass:\n "el-picker-panel__icon-btn el-icon-d-arrow-right",\n attrs: { type: "button" },\n on: { click: _vm.rightNextYear }\n }),\n _c("div", [_vm._v(_vm._s(_vm.rightLabel))])\n ]),\n _c("month-table", {\n attrs: {\n "selection-mode": "range",\n date: _vm.rightDate,\n "default-value": _vm.defaultValue,\n "min-date": _vm.minDate,\n "max-date": _vm.maxDate,\n "range-state": _vm.rangeState,\n "disabled-date": _vm.disabledDate\n },\n on: {\n changerange: _vm.handleChangeRange,\n pick: _vm.handleRangePick\n }\n })\n ],\n 1\n )\n ])\n ],\n 2\n )\n ]\n )\n ]\n )\n}\nvar month_rangevue_type_template_id_f2645fb8_staticRenderFns = []\nmonth_rangevue_type_template_id_f2645fb8_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/month-range.vue?vue&type=template&id=f2645fb8&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/month-range.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\nvar month_rangevue_type_script_lang_js_calcDefaultValue = function calcDefaultValue(defaultValue) {\n if (Array.isArray(defaultValue)) {\n return [new Date(defaultValue[0]), new Date(defaultValue[1])];\n } else if (defaultValue) {\n return [new Date(defaultValue), Object(date_util_["nextMonth"])(new Date(defaultValue))];\n } else {\n return [new Date(), Object(date_util_["nextMonth"])(new Date())];\n }\n};\n/* harmony default export */ var month_rangevue_type_script_lang_js_ = ({\n mixins: [locale_default.a],\n\n directives: { Clickoutside: clickoutside_default.a },\n\n computed: {\n btnDisabled: function btnDisabled() {\n return !(this.minDate && this.maxDate && !this.selecting && this.isValidValue([this.minDate, this.maxDate]));\n },\n leftLabel: function leftLabel() {\n return this.leftDate.getFullYear() + \' \' + this.t(\'el.datepicker.year\');\n },\n rightLabel: function rightLabel() {\n return this.rightDate.getFullYear() + \' \' + this.t(\'el.datepicker.year\');\n },\n leftYear: function leftYear() {\n return this.leftDate.getFullYear();\n },\n rightYear: function rightYear() {\n return this.rightDate.getFullYear() === this.leftDate.getFullYear() ? this.leftDate.getFullYear() + 1 : this.rightDate.getFullYear();\n },\n enableYearArrow: function enableYearArrow() {\n return this.unlinkPanels && this.rightYear > this.leftYear + 1;\n }\n },\n\n data: function data() {\n return {\n popperClass: \'\',\n value: [],\n defaultValue: null,\n defaultTime: null,\n minDate: \'\',\n maxDate: \'\',\n leftDate: new Date(),\n rightDate: Object(date_util_["nextYear"])(new Date()),\n rangeState: {\n endDate: null,\n selecting: false,\n row: null,\n column: null\n },\n shortcuts: \'\',\n visible: \'\',\n disabledDate: \'\',\n format: \'\',\n arrowControl: false,\n unlinkPanels: false\n };\n },\n\n\n watch: {\n value: function value(newVal) {\n if (!newVal) {\n this.minDate = null;\n this.maxDate = null;\n } else if (Array.isArray(newVal)) {\n this.minDate = Object(date_util_["isDate"])(newVal[0]) ? new Date(newVal[0]) : null;\n this.maxDate = Object(date_util_["isDate"])(newVal[1]) ? new Date(newVal[1]) : null;\n if (this.minDate) {\n this.leftDate = this.minDate;\n if (this.unlinkPanels && this.maxDate) {\n var minDateYear = this.minDate.getFullYear();\n var maxDateYear = this.maxDate.getFullYear();\n this.rightDate = minDateYear === maxDateYear ? Object(date_util_["nextYear"])(this.maxDate) : this.maxDate;\n } else {\n this.rightDate = Object(date_util_["nextYear"])(this.leftDate);\n }\n } else {\n this.leftDate = month_rangevue_type_script_lang_js_calcDefaultValue(this.defaultValue)[0];\n this.rightDate = Object(date_util_["nextYear"])(this.leftDate);\n }\n }\n },\n defaultValue: function defaultValue(val) {\n if (!Array.isArray(this.value)) {\n var _calcDefaultValue = month_rangevue_type_script_lang_js_calcDefaultValue(val),\n left = _calcDefaultValue[0],\n right = _calcDefaultValue[1];\n\n this.leftDate = left;\n this.rightDate = val && val[1] && left.getFullYear() !== right.getFullYear() && this.unlinkPanels ? right : Object(date_util_["nextYear"])(this.leftDate);\n }\n }\n },\n\n methods: {\n handleClear: function handleClear() {\n this.minDate = null;\n this.maxDate = null;\n this.leftDate = month_rangevue_type_script_lang_js_calcDefaultValue(this.defaultValue)[0];\n this.rightDate = Object(date_util_["nextYear"])(this.leftDate);\n this.$emit(\'pick\', null);\n },\n handleChangeRange: function handleChangeRange(val) {\n this.minDate = val.minDate;\n this.maxDate = val.maxDate;\n this.rangeState = val.rangeState;\n },\n handleRangePick: function handleRangePick(val) {\n var _this = this;\n\n var close = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var defaultTime = this.defaultTime || [];\n var minDate = Object(date_util_["modifyWithTimeString"])(val.minDate, defaultTime[0]);\n var maxDate = Object(date_util_["modifyWithTimeString"])(val.maxDate, defaultTime[1]);\n if (this.maxDate === maxDate && this.minDate === minDate) {\n return;\n }\n this.onPick && this.onPick(val);\n this.maxDate = maxDate;\n this.minDate = minDate;\n\n // workaround for https://github.com/ElemeFE/element/issues/7539, should remove this block when we don\'t have to care about Chromium 55 - 57\n setTimeout(function () {\n _this.maxDate = maxDate;\n _this.minDate = minDate;\n }, 10);\n if (!close) return;\n this.handleConfirm();\n },\n handleShortcutClick: function handleShortcutClick(shortcut) {\n if (shortcut.onClick) {\n shortcut.onClick(this);\n }\n },\n\n\n // leftPrev*, rightNext* need to take care of `unlinkPanels`\n leftPrevYear: function leftPrevYear() {\n this.leftDate = Object(date_util_["prevYear"])(this.leftDate);\n if (!this.unlinkPanels) {\n this.rightDate = Object(date_util_["prevYear"])(this.rightDate);\n }\n },\n rightNextYear: function rightNextYear() {\n if (!this.unlinkPanels) {\n this.leftDate = Object(date_util_["nextYear"])(this.leftDate);\n }\n this.rightDate = Object(date_util_["nextYear"])(this.rightDate);\n },\n\n\n // leftNext*, rightPrev* are called when `unlinkPanels` is true\n leftNextYear: function leftNextYear() {\n this.leftDate = Object(date_util_["nextYear"])(this.leftDate);\n },\n rightPrevYear: function rightPrevYear() {\n this.rightDate = Object(date_util_["prevYear"])(this.rightDate);\n },\n handleConfirm: function handleConfirm() {\n var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (this.isValidValue([this.minDate, this.maxDate])) {\n this.$emit(\'pick\', [this.minDate, this.maxDate], visible);\n }\n },\n isValidValue: function isValidValue(value) {\n return Array.isArray(value) && value && value[0] && value[1] && Object(date_util_["isDate"])(value[0]) && Object(date_util_["isDate"])(value[1]) && value[0].getTime() <= value[1].getTime() && (typeof this.disabledDate === \'function\' ? !this.disabledDate(value[0]) && !this.disabledDate(value[1]) : true);\n },\n resetView: function resetView() {\n // NOTE: this is a hack to reset {min, max}Date on picker open.\n // TODO: correct way of doing so is to refactor {min, max}Date to be dependent on value and internal selection state\n // an alternative would be resetView whenever picker becomes visible, should also investigate date-panel\'s resetView\n this.minDate = this.value && Object(date_util_["isDate"])(this.value[0]) ? new Date(this.value[0]) : null;\n this.maxDate = this.value && Object(date_util_["isDate"])(this.value[0]) ? new Date(this.value[1]) : null;\n }\n },\n\n components: { MonthTable: month_table, ElInput: input_default.a, ElButton: button_default.a }\n});\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/month-range.vue?vue&type=script&lang=js&\n /* harmony default export */ var panel_month_rangevue_type_script_lang_js_ = (month_rangevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/date-picker/src/panel/month-range.vue\n\n\n\n\n\n/* normalize component */\n\nvar month_range_component = normalizeComponent(\n panel_month_rangevue_type_script_lang_js_,\n month_rangevue_type_template_id_f2645fb8_render,\n month_rangevue_type_template_id_f2645fb8_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var month_range_api; }\nmonth_range_component.options.__file = "packages/date-picker/src/panel/month-range.vue"\n/* harmony default export */ var month_range = (month_range_component.exports);\n// CONCATENATED MODULE: ./packages/date-picker/src/picker/date-picker.js\n\n\n\n\n\nvar date_picker_getPanel = function getPanel(type) {\n if (type === \'daterange\' || type === \'datetimerange\') {\n return date_range;\n } else if (type === \'monthrange\') {\n return month_range;\n }\n return panel_date;\n};\n\n/* harmony default export */ var date_picker = ({\n mixins: [picker],\n\n name: \'ElDatePicker\',\n\n props: {\n type: {\n type: String,\n default: \'date\'\n },\n timeArrowControl: Boolean\n },\n\n watch: {\n type: function type(_type) {\n if (this.picker) {\n this.unmountPicker();\n this.panel = date_picker_getPanel(_type);\n this.mountPicker();\n } else {\n this.panel = date_picker_getPanel(_type);\n }\n }\n },\n\n created: function created() {\n this.panel = date_picker_getPanel(this.type);\n }\n});\n// CONCATENATED MODULE: ./packages/date-picker/index.js\n\n\n/* istanbul ignore next */\ndate_picker.install = function install(Vue) {\n Vue.component(date_picker.name, date_picker);\n};\n\n/* harmony default export */ var packages_date_picker = (date_picker);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/time-select.vue?vue&type=template&id=51ab9320&\nvar time_selectvue_type_template_id_51ab9320_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n {\n attrs: { name: "el-zoom-in-top" },\n on: {\n "before-enter": _vm.handleMenuEnter,\n "after-leave": function($event) {\n _vm.$emit("dodestroy")\n }\n }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n ref: "popper",\n staticClass: "el-picker-panel time-select el-popper",\n class: _vm.popperClass,\n style: { width: _vm.width + "px" }\n },\n [\n _c(\n "el-scrollbar",\n {\n attrs: { noresize: "", "wrap-class": "el-picker-panel__content" }\n },\n _vm._l(_vm.items, function(item) {\n return _c(\n "div",\n {\n key: item.value,\n staticClass: "time-select-item",\n class: {\n selected: _vm.value === item.value,\n disabled: item.disabled,\n default: item.value === _vm.defaultValue\n },\n attrs: { disabled: item.disabled },\n on: {\n click: function($event) {\n _vm.handleClick(item)\n }\n }\n },\n [_vm._v(_vm._s(item.value))]\n )\n }),\n 0\n )\n ],\n 1\n )\n ]\n )\n}\nvar time_selectvue_type_template_id_51ab9320_staticRenderFns = []\ntime_selectvue_type_template_id_51ab9320_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/time-select.vue?vue&type=template&id=51ab9320&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/time-select.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\nvar parseTime = function parseTime(time) {\n var values = (time || \'\').split(\':\');\n if (values.length >= 2) {\n var hours = parseInt(values[0], 10);\n var minutes = parseInt(values[1], 10);\n\n return {\n hours: hours,\n minutes: minutes\n };\n }\n /* istanbul ignore next */\n return null;\n};\n\nvar compareTime = function compareTime(time1, time2) {\n var value1 = parseTime(time1);\n var value2 = parseTime(time2);\n\n var minutes1 = value1.minutes + value1.hours * 60;\n var minutes2 = value2.minutes + value2.hours * 60;\n\n if (minutes1 === minutes2) {\n return 0;\n }\n\n return minutes1 > minutes2 ? 1 : -1;\n};\n\nvar formatTime = function formatTime(time) {\n return (time.hours < 10 ? \'0\' + time.hours : time.hours) + \':\' + (time.minutes < 10 ? \'0\' + time.minutes : time.minutes);\n};\n\nvar nextTime = function nextTime(time, step) {\n var timeValue = parseTime(time);\n var stepValue = parseTime(step);\n\n var next = {\n hours: timeValue.hours,\n minutes: timeValue.minutes\n };\n\n next.minutes += stepValue.minutes;\n next.hours += stepValue.hours;\n\n next.hours += Math.floor(next.minutes / 60);\n next.minutes = next.minutes % 60;\n\n return formatTime(next);\n};\n\n/* harmony default export */ var time_selectvue_type_script_lang_js_ = ({\n components: { ElScrollbar: scrollbar_default.a },\n\n watch: {\n value: function value(val) {\n var _this = this;\n\n if (!val) return;\n this.$nextTick(function () {\n return _this.scrollToOption();\n });\n }\n },\n\n methods: {\n handleClick: function handleClick(item) {\n if (!item.disabled) {\n this.$emit(\'pick\', item.value);\n }\n },\n handleClear: function handleClear() {\n this.$emit(\'pick\', null);\n },\n scrollToOption: function scrollToOption() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \'.selected\';\n\n var menu = this.$refs.popper.querySelector(\'.el-picker-panel__content\');\n scroll_into_view_default()(menu, menu.querySelector(selector));\n },\n handleMenuEnter: function handleMenuEnter() {\n var _this2 = this;\n\n var selected = this.items.map(function (item) {\n return item.value;\n }).indexOf(this.value) !== -1;\n var hasDefault = this.items.map(function (item) {\n return item.value;\n }).indexOf(this.defaultValue) !== -1;\n var option = selected && \'.selected\' || hasDefault && \'.default\' || \'.time-select-item:not(.disabled)\';\n this.$nextTick(function () {\n return _this2.scrollToOption(option);\n });\n },\n scrollDown: function scrollDown(step) {\n var items = this.items;\n var length = items.length;\n var total = items.length;\n var index = items.map(function (item) {\n return item.value;\n }).indexOf(this.value);\n while (total--) {\n index = (index + step + length) % length;\n if (!items[index].disabled) {\n this.$emit(\'pick\', items[index].value, true);\n return;\n }\n }\n },\n isValidValue: function isValidValue(date) {\n return this.items.filter(function (item) {\n return !item.disabled;\n }).map(function (item) {\n return item.value;\n }).indexOf(date) !== -1;\n },\n handleKeydown: function handleKeydown(event) {\n var keyCode = event.keyCode;\n if (keyCode === 38 || keyCode === 40) {\n var mapping = { 40: 1, 38: -1 };\n var offset = mapping[keyCode.toString()];\n this.scrollDown(offset);\n event.stopPropagation();\n return;\n }\n }\n },\n\n data: function data() {\n return {\n popperClass: \'\',\n start: \'09:00\',\n end: \'18:00\',\n step: \'00:30\',\n value: \'\',\n defaultValue: \'\',\n visible: false,\n minTime: \'\',\n maxTime: \'\',\n width: 0\n };\n },\n\n\n computed: {\n items: function items() {\n var start = this.start;\n var end = this.end;\n var step = this.step;\n\n var result = [];\n\n if (start && end && step) {\n var current = start;\n while (compareTime(current, end) <= 0) {\n result.push({\n value: current,\n disabled: compareTime(current, this.minTime || \'-1:-1\') <= 0 || compareTime(current, this.maxTime || \'100:100\') >= 0\n });\n current = nextTime(current, step);\n }\n }\n\n return result;\n }\n }\n});\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/time-select.vue?vue&type=script&lang=js&\n /* harmony default export */ var panel_time_selectvue_type_script_lang_js_ = (time_selectvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/date-picker/src/panel/time-select.vue\n\n\n\n\n\n/* normalize component */\n\nvar time_select_component = normalizeComponent(\n panel_time_selectvue_type_script_lang_js_,\n time_selectvue_type_template_id_51ab9320_render,\n time_selectvue_type_template_id_51ab9320_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var time_select_api; }\ntime_select_component.options.__file = "packages/date-picker/src/panel/time-select.vue"\n/* harmony default export */ var time_select = (time_select_component.exports);\n// CONCATENATED MODULE: ./packages/date-picker/src/picker/time-select.js\n\n\n\n/* harmony default export */ var picker_time_select = ({\n mixins: [picker],\n\n name: \'ElTimeSelect\',\n\n componentName: \'ElTimeSelect\',\n\n props: {\n type: {\n type: String,\n default: \'time-select\'\n }\n },\n\n beforeCreate: function beforeCreate() {\n this.panel = time_select;\n }\n});\n// CONCATENATED MODULE: ./packages/time-select/index.js\n\n\n/* istanbul ignore next */\npicker_time_select.install = function (Vue) {\n Vue.component(picker_time_select.name, picker_time_select);\n};\n\n/* harmony default export */ var packages_time_select = (picker_time_select);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/time-range.vue?vue&type=template&id=fb28660e&\nvar time_rangevue_type_template_id_fb28660e_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n {\n attrs: { name: "el-zoom-in-top" },\n on: {\n "after-leave": function($event) {\n _vm.$emit("dodestroy")\n }\n }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-time-range-picker el-picker-panel el-popper",\n class: _vm.popperClass\n },\n [\n _c("div", { staticClass: "el-time-range-picker__content" }, [\n _c("div", { staticClass: "el-time-range-picker__cell" }, [\n _c("div", { staticClass: "el-time-range-picker__header" }, [\n _vm._v(_vm._s(_vm.t("el.datepicker.startTime")))\n ]),\n _c(\n "div",\n {\n staticClass:\n "el-time-range-picker__body el-time-panel__content",\n class: {\n "has-seconds": _vm.showSeconds,\n "is-arrow": _vm.arrowControl\n }\n },\n [\n _c("time-spinner", {\n ref: "minSpinner",\n attrs: {\n "show-seconds": _vm.showSeconds,\n "am-pm-mode": _vm.amPmMode,\n "arrow-control": _vm.arrowControl,\n date: _vm.minDate\n },\n on: {\n change: _vm.handleMinChange,\n "select-range": _vm.setMinSelectionRange\n }\n })\n ],\n 1\n )\n ]),\n _c("div", { staticClass: "el-time-range-picker__cell" }, [\n _c("div", { staticClass: "el-time-range-picker__header" }, [\n _vm._v(_vm._s(_vm.t("el.datepicker.endTime")))\n ]),\n _c(\n "div",\n {\n staticClass:\n "el-time-range-picker__body el-time-panel__content",\n class: {\n "has-seconds": _vm.showSeconds,\n "is-arrow": _vm.arrowControl\n }\n },\n [\n _c("time-spinner", {\n ref: "maxSpinner",\n attrs: {\n "show-seconds": _vm.showSeconds,\n "am-pm-mode": _vm.amPmMode,\n "arrow-control": _vm.arrowControl,\n date: _vm.maxDate\n },\n on: {\n change: _vm.handleMaxChange,\n "select-range": _vm.setMaxSelectionRange\n }\n })\n ],\n 1\n )\n ])\n ]),\n _c("div", { staticClass: "el-time-panel__footer" }, [\n _c(\n "button",\n {\n staticClass: "el-time-panel__btn cancel",\n attrs: { type: "button" },\n on: {\n click: function($event) {\n _vm.handleCancel()\n }\n }\n },\n [_vm._v(_vm._s(_vm.t("el.datepicker.cancel")))]\n ),\n _c(\n "button",\n {\n staticClass: "el-time-panel__btn confirm",\n attrs: { type: "button", disabled: _vm.btnDisabled },\n on: {\n click: function($event) {\n _vm.handleConfirm()\n }\n }\n },\n [_vm._v(_vm._s(_vm.t("el.datepicker.confirm")))]\n )\n ])\n ]\n )\n ]\n )\n}\nvar time_rangevue_type_template_id_fb28660e_staticRenderFns = []\ntime_rangevue_type_template_id_fb28660e_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/time-range.vue?vue&type=template&id=fb28660e&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/time-range.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\nvar MIN_TIME = Object(date_util_["parseDate"])(\'00:00:00\', \'HH:mm:ss\');\nvar MAX_TIME = Object(date_util_["parseDate"])(\'23:59:59\', \'HH:mm:ss\');\n\nvar time_rangevue_type_script_lang_js_minTimeOfDay = function minTimeOfDay(date) {\n return Object(date_util_["modifyDate"])(MIN_TIME, date.getFullYear(), date.getMonth(), date.getDate());\n};\n\nvar time_rangevue_type_script_lang_js_maxTimeOfDay = function maxTimeOfDay(date) {\n return Object(date_util_["modifyDate"])(MAX_TIME, date.getFullYear(), date.getMonth(), date.getDate());\n};\n\n// increase time by amount of milliseconds, but within the range of day\nvar advanceTime = function advanceTime(date, amount) {\n return new Date(Math.min(date.getTime() + amount, time_rangevue_type_script_lang_js_maxTimeOfDay(date).getTime()));\n};\n\n/* harmony default export */ var time_rangevue_type_script_lang_js_ = ({\n mixins: [locale_default.a],\n\n components: { TimeSpinner: time_spinner },\n\n computed: {\n showSeconds: function showSeconds() {\n return (this.format || \'\').indexOf(\'ss\') !== -1;\n },\n offset: function offset() {\n return this.showSeconds ? 11 : 8;\n },\n spinner: function spinner() {\n return this.selectionRange[0] < this.offset ? this.$refs.minSpinner : this.$refs.maxSpinner;\n },\n btnDisabled: function btnDisabled() {\n return this.minDate.getTime() > this.maxDate.getTime();\n },\n amPmMode: function amPmMode() {\n if ((this.format || \'\').indexOf(\'A\') !== -1) return \'A\';\n if ((this.format || \'\').indexOf(\'a\') !== -1) return \'a\';\n return \'\';\n }\n },\n\n data: function data() {\n return {\n popperClass: \'\',\n minDate: new Date(),\n maxDate: new Date(),\n value: [],\n oldValue: [new Date(), new Date()],\n defaultValue: null,\n format: \'HH:mm:ss\',\n visible: false,\n selectionRange: [0, 2],\n arrowControl: false\n };\n },\n\n\n watch: {\n value: function value(_value) {\n if (Array.isArray(_value)) {\n this.minDate = new Date(_value[0]);\n this.maxDate = new Date(_value[1]);\n } else {\n if (Array.isArray(this.defaultValue)) {\n this.minDate = new Date(this.defaultValue[0]);\n this.maxDate = new Date(this.defaultValue[1]);\n } else if (this.defaultValue) {\n this.minDate = new Date(this.defaultValue);\n this.maxDate = advanceTime(new Date(this.defaultValue), 60 * 60 * 1000);\n } else {\n this.minDate = new Date();\n this.maxDate = advanceTime(new Date(), 60 * 60 * 1000);\n }\n }\n },\n visible: function visible(val) {\n var _this = this;\n\n if (val) {\n this.oldValue = this.value;\n this.$nextTick(function () {\n return _this.$refs.minSpinner.emitSelectRange(\'hours\');\n });\n }\n }\n },\n\n methods: {\n handleClear: function handleClear() {\n this.$emit(\'pick\', null);\n },\n handleCancel: function handleCancel() {\n this.$emit(\'pick\', this.oldValue);\n },\n handleMinChange: function handleMinChange(date) {\n this.minDate = Object(date_util_["clearMilliseconds"])(date);\n this.handleChange();\n },\n handleMaxChange: function handleMaxChange(date) {\n this.maxDate = Object(date_util_["clearMilliseconds"])(date);\n this.handleChange();\n },\n handleChange: function handleChange() {\n if (this.isValidValue([this.minDate, this.maxDate])) {\n this.$refs.minSpinner.selectableRange = [[time_rangevue_type_script_lang_js_minTimeOfDay(this.minDate), this.maxDate]];\n this.$refs.maxSpinner.selectableRange = [[this.minDate, time_rangevue_type_script_lang_js_maxTimeOfDay(this.maxDate)]];\n this.$emit(\'pick\', [this.minDate, this.maxDate], true);\n }\n },\n setMinSelectionRange: function setMinSelectionRange(start, end) {\n this.$emit(\'select-range\', start, end, \'min\');\n this.selectionRange = [start, end];\n },\n setMaxSelectionRange: function setMaxSelectionRange(start, end) {\n this.$emit(\'select-range\', start, end, \'max\');\n this.selectionRange = [start + this.offset, end + this.offset];\n },\n handleConfirm: function handleConfirm() {\n var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n var minSelectableRange = this.$refs.minSpinner.selectableRange;\n var maxSelectableRange = this.$refs.maxSpinner.selectableRange;\n\n this.minDate = Object(date_util_["limitTimeRange"])(this.minDate, minSelectableRange, this.format);\n this.maxDate = Object(date_util_["limitTimeRange"])(this.maxDate, maxSelectableRange, this.format);\n\n this.$emit(\'pick\', [this.minDate, this.maxDate], visible);\n },\n adjustSpinners: function adjustSpinners() {\n this.$refs.minSpinner.adjustSpinners();\n this.$refs.maxSpinner.adjustSpinners();\n },\n changeSelectionRange: function changeSelectionRange(step) {\n var list = this.showSeconds ? [0, 3, 6, 11, 14, 17] : [0, 3, 8, 11];\n var mapping = [\'hours\', \'minutes\'].concat(this.showSeconds ? [\'seconds\'] : []);\n var index = list.indexOf(this.selectionRange[0]);\n var next = (index + step + list.length) % list.length;\n var half = list.length / 2;\n if (next < half) {\n this.$refs.minSpinner.emitSelectRange(mapping[next]);\n } else {\n this.$refs.maxSpinner.emitSelectRange(mapping[next - half]);\n }\n },\n isValidValue: function isValidValue(date) {\n return Array.isArray(date) && Object(date_util_["timeWithinRange"])(this.minDate, this.$refs.minSpinner.selectableRange) && Object(date_util_["timeWithinRange"])(this.maxDate, this.$refs.maxSpinner.selectableRange);\n },\n handleKeydown: function handleKeydown(event) {\n var keyCode = event.keyCode;\n var mapping = { 38: -1, 40: 1, 37: -1, 39: 1 };\n\n // Left or Right\n if (keyCode === 37 || keyCode === 39) {\n var step = mapping[keyCode];\n this.changeSelectionRange(step);\n event.preventDefault();\n return;\n }\n\n // Up or Down\n if (keyCode === 38 || keyCode === 40) {\n var _step = mapping[keyCode];\n this.spinner.scrollDown(_step);\n event.preventDefault();\n return;\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/date-picker/src/panel/time-range.vue?vue&type=script&lang=js&\n /* harmony default export */ var panel_time_rangevue_type_script_lang_js_ = (time_rangevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/date-picker/src/panel/time-range.vue\n\n\n\n\n\n/* normalize component */\n\nvar time_range_component = normalizeComponent(\n panel_time_rangevue_type_script_lang_js_,\n time_rangevue_type_template_id_fb28660e_render,\n time_rangevue_type_template_id_fb28660e_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var time_range_api; }\ntime_range_component.options.__file = "packages/date-picker/src/panel/time-range.vue"\n/* harmony default export */ var time_range = (time_range_component.exports);\n// CONCATENATED MODULE: ./packages/date-picker/src/picker/time-picker.js\n\n\n\n\n/* harmony default export */ var time_picker = ({\n mixins: [picker],\n\n name: \'ElTimePicker\',\n\n props: {\n isRange: Boolean,\n arrowControl: Boolean\n },\n\n data: function data() {\n return {\n type: \'\'\n };\n },\n\n\n watch: {\n isRange: function isRange(_isRange) {\n if (this.picker) {\n this.unmountPicker();\n this.type = _isRange ? \'timerange\' : \'time\';\n this.panel = _isRange ? time_range : panel_time;\n this.mountPicker();\n } else {\n this.type = _isRange ? \'timerange\' : \'time\';\n this.panel = _isRange ? time_range : panel_time;\n }\n }\n },\n\n created: function created() {\n this.type = this.isRange ? \'timerange\' : \'time\';\n this.panel = this.isRange ? time_range : panel_time;\n }\n});\n// CONCATENATED MODULE: ./packages/time-picker/index.js\n\n\n/* istanbul ignore next */\ntime_picker.install = function (Vue) {\n Vue.component(time_picker.name, time_picker);\n};\n\n/* harmony default export */ var packages_time_picker = (time_picker);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/popover/src/main.vue?vue&type=template&id=52060272&\nvar mainvue_type_template_id_52060272_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "span",\n [\n _c(\n "transition",\n {\n attrs: { name: _vm.transition },\n on: {\n "after-enter": _vm.handleAfterEnter,\n "after-leave": _vm.handleAfterLeave\n }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: !_vm.disabled && _vm.showPopper,\n expression: "!disabled && showPopper"\n }\n ],\n ref: "popper",\n staticClass: "el-popover el-popper",\n class: [_vm.popperClass, _vm.content && "el-popover--plain"],\n style: { width: _vm.width + "px" },\n attrs: {\n role: "tooltip",\n id: _vm.tooltipId,\n "aria-hidden":\n _vm.disabled || !_vm.showPopper ? "true" : "false"\n }\n },\n [\n _vm.title\n ? _c("div", {\n staticClass: "el-popover__title",\n domProps: { textContent: _vm._s(_vm.title) }\n })\n : _vm._e(),\n _vm._t("default", [_vm._v(_vm._s(_vm.content))])\n ],\n 2\n )\n ]\n ),\n _c(\n "span",\n { ref: "wrapper", staticClass: "el-popover__reference-wrapper" },\n [_vm._t("reference")],\n 2\n )\n ],\n 1\n )\n}\nvar mainvue_type_template_id_52060272_staticRenderFns = []\nmainvue_type_template_id_52060272_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/popover/src/main.vue?vue&type=template&id=52060272&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/popover/src/main.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/* harmony default export */ var mainvue_type_script_lang_js_ = ({\n name: \'ElPopover\',\n\n mixins: [vue_popper_default.a],\n\n props: {\n trigger: {\n type: String,\n default: \'click\',\n validator: function validator(value) {\n return [\'click\', \'focus\', \'hover\', \'manual\'].indexOf(value) > -1;\n }\n },\n openDelay: {\n type: Number,\n default: 0\n },\n closeDelay: {\n type: Number,\n default: 200\n },\n title: String,\n disabled: Boolean,\n content: String,\n reference: {},\n popperClass: String,\n width: {},\n visibleArrow: {\n default: true\n },\n arrowOffset: {\n type: Number,\n default: 0\n },\n transition: {\n type: String,\n default: \'fade-in-linear\'\n },\n tabindex: {\n type: Number,\n default: 0\n }\n },\n\n computed: {\n tooltipId: function tooltipId() {\n return \'el-popover-\' + Object(util_["generateId"])();\n }\n },\n watch: {\n showPopper: function showPopper(val) {\n if (this.disabled) {\n return;\n }\n val ? this.$emit(\'show\') : this.$emit(\'hide\');\n }\n },\n\n mounted: function mounted() {\n var _this = this;\n\n var reference = this.referenceElm = this.reference || this.$refs.reference;\n var popper = this.popper || this.$refs.popper;\n\n if (!reference && this.$refs.wrapper.children) {\n reference = this.referenceElm = this.$refs.wrapper.children[0];\n }\n // 可访问性\n if (reference) {\n Object(dom_["addClass"])(reference, \'el-popover__reference\');\n reference.setAttribute(\'aria-describedby\', this.tooltipId);\n reference.setAttribute(\'tabindex\', this.tabindex); // tab序列\n popper.setAttribute(\'tabindex\', 0);\n\n if (this.trigger !== \'click\') {\n Object(dom_["on"])(reference, \'focusin\', function () {\n _this.handleFocus();\n var instance = reference.__vue__;\n if (instance && typeof instance.focus === \'function\') {\n instance.focus();\n }\n });\n Object(dom_["on"])(popper, \'focusin\', this.handleFocus);\n Object(dom_["on"])(reference, \'focusout\', this.handleBlur);\n Object(dom_["on"])(popper, \'focusout\', this.handleBlur);\n }\n Object(dom_["on"])(reference, \'keydown\', this.handleKeydown);\n Object(dom_["on"])(reference, \'click\', this.handleClick);\n }\n if (this.trigger === \'click\') {\n Object(dom_["on"])(reference, \'click\', this.doToggle);\n Object(dom_["on"])(document, \'click\', this.handleDocumentClick);\n } else if (this.trigger === \'hover\') {\n Object(dom_["on"])(reference, \'mouseenter\', this.handleMouseEnter);\n Object(dom_["on"])(popper, \'mouseenter\', this.handleMouseEnter);\n Object(dom_["on"])(reference, \'mouseleave\', this.handleMouseLeave);\n Object(dom_["on"])(popper, \'mouseleave\', this.handleMouseLeave);\n } else if (this.trigger === \'focus\') {\n if (this.tabindex < 0) {\n console.warn(\'[Element Warn][Popover]a negative taindex means that the element cannot be focused by tab key\');\n }\n if (reference.querySelector(\'input, textarea\')) {\n Object(dom_["on"])(reference, \'focusin\', this.doShow);\n Object(dom_["on"])(reference, \'focusout\', this.doClose);\n } else {\n Object(dom_["on"])(reference, \'mousedown\', this.doShow);\n Object(dom_["on"])(reference, \'mouseup\', this.doClose);\n }\n }\n },\n beforeDestroy: function beforeDestroy() {\n this.cleanup();\n },\n deactivated: function deactivated() {\n this.cleanup();\n },\n\n\n methods: {\n doToggle: function doToggle() {\n this.showPopper = !this.showPopper;\n },\n doShow: function doShow() {\n this.showPopper = true;\n },\n doClose: function doClose() {\n this.showPopper = false;\n },\n handleFocus: function handleFocus() {\n Object(dom_["addClass"])(this.referenceElm, \'focusing\');\n if (this.trigger === \'click\' || this.trigger === \'focus\') this.showPopper = true;\n },\n handleClick: function handleClick() {\n Object(dom_["removeClass"])(this.referenceElm, \'focusing\');\n },\n handleBlur: function handleBlur() {\n Object(dom_["removeClass"])(this.referenceElm, \'focusing\');\n if (this.trigger === \'click\' || this.trigger === \'focus\') this.showPopper = false;\n },\n handleMouseEnter: function handleMouseEnter() {\n var _this2 = this;\n\n clearTimeout(this._timer);\n if (this.openDelay) {\n this._timer = setTimeout(function () {\n _this2.showPopper = true;\n }, this.openDelay);\n } else {\n this.showPopper = true;\n }\n },\n handleKeydown: function handleKeydown(ev) {\n if (ev.keyCode === 27 && this.trigger !== \'manual\') {\n // esc\n this.doClose();\n }\n },\n handleMouseLeave: function handleMouseLeave() {\n var _this3 = this;\n\n clearTimeout(this._timer);\n if (this.closeDelay) {\n this._timer = setTimeout(function () {\n _this3.showPopper = false;\n }, this.closeDelay);\n } else {\n this.showPopper = false;\n }\n },\n handleDocumentClick: function handleDocumentClick(e) {\n var reference = this.reference || this.$refs.reference;\n var popper = this.popper || this.$refs.popper;\n\n if (!reference && this.$refs.wrapper.children) {\n reference = this.referenceElm = this.$refs.wrapper.children[0];\n }\n if (!this.$el || !reference || this.$el.contains(e.target) || reference.contains(e.target) || !popper || popper.contains(e.target)) return;\n this.showPopper = false;\n },\n handleAfterEnter: function handleAfterEnter() {\n this.$emit(\'after-enter\');\n },\n handleAfterLeave: function handleAfterLeave() {\n this.$emit(\'after-leave\');\n this.doDestroy();\n },\n cleanup: function cleanup() {\n if (this.openDelay || this.closeDelay) {\n clearTimeout(this._timer);\n }\n }\n },\n\n destroyed: function destroyed() {\n var reference = this.reference;\n\n Object(dom_["off"])(reference, \'click\', this.doToggle);\n Object(dom_["off"])(reference, \'mouseup\', this.doClose);\n Object(dom_["off"])(reference, \'mousedown\', this.doShow);\n Object(dom_["off"])(reference, \'focusin\', this.doShow);\n Object(dom_["off"])(reference, \'focusout\', this.doClose);\n Object(dom_["off"])(reference, \'mousedown\', this.doShow);\n Object(dom_["off"])(reference, \'mouseup\', this.doClose);\n Object(dom_["off"])(reference, \'mouseleave\', this.handleMouseLeave);\n Object(dom_["off"])(reference, \'mouseenter\', this.handleMouseEnter);\n Object(dom_["off"])(document, \'click\', this.handleDocumentClick);\n }\n});\n// CONCATENATED MODULE: ./packages/popover/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_mainvue_type_script_lang_js_ = (mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/popover/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar main_component = normalizeComponent(\n src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_52060272_render,\n mainvue_type_template_id_52060272_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var main_api; }\nmain_component.options.__file = "packages/popover/src/main.vue"\n/* harmony default export */ var main = (main_component.exports);\n// CONCATENATED MODULE: ./packages/popover/src/directive.js\nvar getReference = function getReference(el, binding, vnode) {\n var _ref = binding.expression ? binding.value : binding.arg;\n var popper = vnode.context.$refs[_ref];\n if (popper) {\n if (Array.isArray(popper)) {\n popper[0].$refs.reference = el;\n } else {\n popper.$refs.reference = el;\n }\n }\n};\n\n/* harmony default export */ var directive = ({\n bind: function bind(el, binding, vnode) {\n getReference(el, binding, vnode);\n },\n inserted: function inserted(el, binding, vnode) {\n getReference(el, binding, vnode);\n }\n});\n// CONCATENATED MODULE: ./packages/popover/index.js\n\n\n\n\nexternal_vue_default.a.directive(\'popover\', directive);\n\n/* istanbul ignore next */\nmain.install = function (Vue) {\n Vue.directive(\'popover\', directive);\n Vue.component(main.name, main);\n};\nmain.directive = directive;\n\n/* harmony default export */ var popover = (main);\n// CONCATENATED MODULE: ./packages/tooltip/src/main.js\n\n\n\n\n\n\n/* harmony default export */ var src_main = ({\n name: \'ElTooltip\',\n\n mixins: [vue_popper_default.a],\n\n props: {\n openDelay: {\n type: Number,\n default: 0\n },\n disabled: Boolean,\n manual: Boolean,\n effect: {\n type: String,\n default: \'dark\'\n },\n arrowOffset: {\n type: Number,\n default: 0\n },\n popperClass: String,\n content: String,\n visibleArrow: {\n default: true\n },\n transition: {\n type: String,\n default: \'el-fade-in-linear\'\n },\n popperOptions: {\n default: function _default() {\n return {\n boundariesPadding: 10,\n gpuAcceleration: false\n };\n }\n },\n enterable: {\n type: Boolean,\n default: true\n },\n hideAfter: {\n type: Number,\n default: 0\n },\n tabindex: {\n type: Number,\n default: 0\n }\n },\n\n data: function data() {\n return {\n tooltipId: \'el-tooltip-\' + Object(util_["generateId"])(),\n timeoutPending: null,\n focusing: false\n };\n },\n beforeCreate: function beforeCreate() {\n var _this = this;\n\n if (this.$isServer) return;\n\n this.popperVM = new external_vue_default.a({\n data: { node: \'\' },\n render: function render(h) {\n return this.node;\n }\n }).$mount();\n\n this.debounceClose = debounce_default()(200, function () {\n return _this.handleClosePopper();\n });\n },\n render: function render(h) {\n var _this2 = this;\n\n if (this.popperVM) {\n this.popperVM.node = h(\n \'transition\',\n {\n attrs: {\n name: this.transition\n },\n on: {\n \'afterLeave\': this.doDestroy\n }\n },\n [h(\n \'div\',\n {\n on: {\n \'mouseleave\': function mouseleave() {\n _this2.setExpectedState(false);_this2.debounceClose();\n },\n \'mouseenter\': function mouseenter() {\n _this2.setExpectedState(true);\n }\n },\n\n ref: \'popper\',\n attrs: { role: \'tooltip\',\n id: this.tooltipId,\n \'aria-hidden\': this.disabled || !this.showPopper ? \'true\' : \'false\'\n },\n directives: [{\n name: \'show\',\n value: !this.disabled && this.showPopper\n }],\n\n \'class\': [\'el-tooltip__popper\', \'is-\' + this.effect, this.popperClass] },\n [this.$slots.content || this.content]\n )]\n );\n }\n\n var firstElement = this.getFirstElement();\n if (!firstElement) return null;\n\n var data = firstElement.data = firstElement.data || {};\n data.staticClass = this.addTooltipClass(data.staticClass);\n\n return firstElement;\n },\n mounted: function mounted() {\n var _this3 = this;\n\n this.referenceElm = this.$el;\n if (this.$el.nodeType === 1) {\n this.$el.setAttribute(\'aria-describedby\', this.tooltipId);\n this.$el.setAttribute(\'tabindex\', this.tabindex);\n Object(dom_["on"])(this.referenceElm, \'mouseenter\', this.show);\n Object(dom_["on"])(this.referenceElm, \'mouseleave\', this.hide);\n Object(dom_["on"])(this.referenceElm, \'focus\', function () {\n if (!_this3.$slots.default || !_this3.$slots.default.length) {\n _this3.handleFocus();\n return;\n }\n var instance = _this3.$slots.default[0].componentInstance;\n if (instance && instance.focus) {\n instance.focus();\n } else {\n _this3.handleFocus();\n }\n });\n Object(dom_["on"])(this.referenceElm, \'blur\', this.handleBlur);\n Object(dom_["on"])(this.referenceElm, \'click\', this.removeFocusing);\n }\n // fix issue https://github.com/ElemeFE/element/issues/14424\n if (this.value && this.popperVM) {\n this.popperVM.$nextTick(function () {\n if (_this3.value) {\n _this3.updatePopper();\n }\n });\n }\n },\n\n watch: {\n focusing: function focusing(val) {\n if (val) {\n Object(dom_["addClass"])(this.referenceElm, \'focusing\');\n } else {\n Object(dom_["removeClass"])(this.referenceElm, \'focusing\');\n }\n }\n },\n methods: {\n show: function show() {\n this.setExpectedState(true);\n this.handleShowPopper();\n },\n hide: function hide() {\n this.setExpectedState(false);\n this.debounceClose();\n },\n handleFocus: function handleFocus() {\n this.focusing = true;\n this.show();\n },\n handleBlur: function handleBlur() {\n this.focusing = false;\n this.hide();\n },\n removeFocusing: function removeFocusing() {\n this.focusing = false;\n },\n addTooltipClass: function addTooltipClass(prev) {\n if (!prev) {\n return \'el-tooltip\';\n } else {\n return \'el-tooltip \' + prev.replace(\'el-tooltip\', \'\');\n }\n },\n handleShowPopper: function handleShowPopper() {\n var _this4 = this;\n\n if (!this.expectedState || this.manual) return;\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () {\n _this4.showPopper = true;\n }, this.openDelay);\n\n if (this.hideAfter > 0) {\n this.timeoutPending = setTimeout(function () {\n _this4.showPopper = false;\n }, this.hideAfter);\n }\n },\n handleClosePopper: function handleClosePopper() {\n if (this.enterable && this.expectedState || this.manual) return;\n clearTimeout(this.timeout);\n\n if (this.timeoutPending) {\n clearTimeout(this.timeoutPending);\n }\n this.showPopper = false;\n\n if (this.disabled) {\n this.doDestroy();\n }\n },\n setExpectedState: function setExpectedState(expectedState) {\n if (expectedState === false) {\n clearTimeout(this.timeoutPending);\n }\n this.expectedState = expectedState;\n },\n getFirstElement: function getFirstElement() {\n var slots = this.$slots.default;\n if (!Array.isArray(slots)) return null;\n var element = null;\n for (var index = 0; index < slots.length; index++) {\n if (slots[index] && slots[index].tag) {\n element = slots[index];\n break;\n };\n }\n return element;\n }\n },\n\n beforeDestroy: function beforeDestroy() {\n this.popperVM && this.popperVM.$destroy();\n },\n destroyed: function destroyed() {\n var reference = this.referenceElm;\n if (reference.nodeType === 1) {\n Object(dom_["off"])(reference, \'mouseenter\', this.show);\n Object(dom_["off"])(reference, \'mouseleave\', this.hide);\n Object(dom_["off"])(reference, \'focus\', this.handleFocus);\n Object(dom_["off"])(reference, \'blur\', this.handleBlur);\n Object(dom_["off"])(reference, \'click\', this.removeFocusing);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/tooltip/index.js\n\n\n/* istanbul ignore next */\nsrc_main.install = function (Vue) {\n Vue.component(src_main.name, src_main);\n};\n\n/* harmony default export */ var packages_tooltip = (src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/message-box/src/main.vue?vue&type=template&id=6b29b012&\nvar mainvue_type_template_id_6b29b012_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("transition", { attrs: { name: "msgbox-fade" } }, [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-message-box__wrapper",\n attrs: {\n tabindex: "-1",\n role: "dialog",\n "aria-modal": "true",\n "aria-label": _vm.title || "dialog"\n },\n on: {\n click: function($event) {\n if ($event.target !== $event.currentTarget) {\n return null\n }\n return _vm.handleWrapperClick($event)\n }\n }\n },\n [\n _c(\n "div",\n {\n staticClass: "el-message-box",\n class: [_vm.customClass, _vm.center && "el-message-box--center"]\n },\n [\n _vm.title !== null\n ? _c("div", { staticClass: "el-message-box__header" }, [\n _c("div", { staticClass: "el-message-box__title" }, [\n _vm.icon && _vm.center\n ? _c("div", {\n class: ["el-message-box__status", _vm.icon]\n })\n : _vm._e(),\n _c("span", [_vm._v(_vm._s(_vm.title))])\n ]),\n _vm.showClose\n ? _c(\n "button",\n {\n staticClass: "el-message-box__headerbtn",\n attrs: { type: "button", "aria-label": "Close" },\n on: {\n click: function($event) {\n _vm.handleAction(\n _vm.distinguishCancelAndClose\n ? "close"\n : "cancel"\n )\n },\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "enter",\n 13,\n $event.key,\n "Enter"\n )\n ) {\n return null\n }\n _vm.handleAction(\n _vm.distinguishCancelAndClose\n ? "close"\n : "cancel"\n )\n }\n }\n },\n [\n _c("i", {\n staticClass: "el-message-box__close el-icon-close"\n })\n ]\n )\n : _vm._e()\n ])\n : _vm._e(),\n _c("div", { staticClass: "el-message-box__content" }, [\n _c("div", { staticClass: "el-message-box__container" }, [\n _vm.icon && !_vm.center && _vm.message !== ""\n ? _c("div", { class: ["el-message-box__status", _vm.icon] })\n : _vm._e(),\n _vm.message !== ""\n ? _c(\n "div",\n { staticClass: "el-message-box__message" },\n [\n _vm._t("default", [\n !_vm.dangerouslyUseHTMLString\n ? _c("p", [_vm._v(_vm._s(_vm.message))])\n : _c("p", {\n domProps: { innerHTML: _vm._s(_vm.message) }\n })\n ])\n ],\n 2\n )\n : _vm._e()\n ]),\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.showInput,\n expression: "showInput"\n }\n ],\n staticClass: "el-message-box__input"\n },\n [\n _c("el-input", {\n ref: "input",\n attrs: {\n type: _vm.inputType,\n placeholder: _vm.inputPlaceholder\n },\n nativeOn: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "enter",\n 13,\n $event.key,\n "Enter"\n )\n ) {\n return null\n }\n return _vm.handleInputEnter($event)\n }\n },\n model: {\n value: _vm.inputValue,\n callback: function($$v) {\n _vm.inputValue = $$v\n },\n expression: "inputValue"\n }\n }),\n _c(\n "div",\n {\n staticClass: "el-message-box__errormsg",\n style: {\n visibility: !!_vm.editorErrorMessage\n ? "visible"\n : "hidden"\n }\n },\n [_vm._v(_vm._s(_vm.editorErrorMessage))]\n )\n ],\n 1\n )\n ]),\n _c(\n "div",\n { staticClass: "el-message-box__btns" },\n [\n _vm.showCancelButton\n ? _c(\n "el-button",\n {\n class: [_vm.cancelButtonClasses],\n attrs: {\n loading: _vm.cancelButtonLoading,\n round: _vm.roundButton,\n size: "small"\n },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "enter",\n 13,\n $event.key,\n "Enter"\n )\n ) {\n return null\n }\n _vm.handleAction("cancel")\n }\n },\n nativeOn: {\n click: function($event) {\n _vm.handleAction("cancel")\n }\n }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(\n _vm.cancelButtonText ||\n _vm.t("el.messagebox.cancel")\n ) +\n "\\n "\n )\n ]\n )\n : _vm._e(),\n _c(\n "el-button",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.showConfirmButton,\n expression: "showConfirmButton"\n }\n ],\n ref: "confirm",\n class: [_vm.confirmButtonClasses],\n attrs: {\n loading: _vm.confirmButtonLoading,\n round: _vm.roundButton,\n size: "small"\n },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "enter",\n 13,\n $event.key,\n "Enter"\n )\n ) {\n return null\n }\n _vm.handleAction("confirm")\n }\n },\n nativeOn: {\n click: function($event) {\n _vm.handleAction("confirm")\n }\n }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(\n _vm.confirmButtonText ||\n _vm.t("el.messagebox.confirm")\n ) +\n "\\n "\n )\n ]\n )\n ],\n 1\n )\n ]\n )\n ]\n )\n ])\n}\nvar mainvue_type_template_id_6b29b012_staticRenderFns = []\nmainvue_type_template_id_6b29b012_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/message-box/src/main.vue?vue&type=template&id=6b29b012&\n\n// EXTERNAL MODULE: external "element-ui/lib/locale"\nvar lib_locale_ = __webpack_require__(12);\nvar lib_locale_default = /*#__PURE__*/__webpack_require__.n(lib_locale_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/aria-dialog"\nvar aria_dialog_ = __webpack_require__(40);\nvar aria_dialog_default = /*#__PURE__*/__webpack_require__.n(aria_dialog_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/message-box/src/main.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n\nvar messageBox = void 0;\nvar typeMap = {\n success: \'success\',\n info: \'info\',\n warning: \'warning\',\n error: \'error\'\n};\n\n/* harmony default export */ var message_box_src_mainvue_type_script_lang_js_ = ({\n mixins: [popup_default.a, locale_default.a],\n\n props: {\n modal: {\n default: true\n },\n lockScroll: {\n default: true\n },\n showClose: {\n type: Boolean,\n default: true\n },\n closeOnClickModal: {\n default: true\n },\n closeOnPressEscape: {\n default: true\n },\n closeOnHashChange: {\n default: true\n },\n center: {\n default: false,\n type: Boolean\n },\n roundButton: {\n default: false,\n type: Boolean\n }\n },\n\n components: {\n ElInput: input_default.a,\n ElButton: button_default.a\n },\n\n computed: {\n icon: function icon() {\n var type = this.type,\n iconClass = this.iconClass;\n\n return iconClass || (type && typeMap[type] ? \'el-icon-\' + typeMap[type] : \'\');\n },\n confirmButtonClasses: function confirmButtonClasses() {\n return \'el-button--primary \' + this.confirmButtonClass;\n },\n cancelButtonClasses: function cancelButtonClasses() {\n return \'\' + this.cancelButtonClass;\n }\n },\n\n methods: {\n getSafeClose: function getSafeClose() {\n var _this = this;\n\n var currentId = this.uid;\n return function () {\n _this.$nextTick(function () {\n if (currentId === _this.uid) _this.doClose();\n });\n };\n },\n doClose: function doClose() {\n var _this2 = this;\n\n if (!this.visible) return;\n this.visible = false;\n this._closing = true;\n\n this.onClose && this.onClose();\n messageBox.closeDialog(); // 解绑\n if (this.lockScroll) {\n setTimeout(this.restoreBodyStyle, 200);\n }\n this.opened = false;\n this.doAfterClose();\n setTimeout(function () {\n if (_this2.action) _this2.callback(_this2.action, _this2);\n });\n },\n handleWrapperClick: function handleWrapperClick() {\n if (this.closeOnClickModal) {\n this.handleAction(this.distinguishCancelAndClose ? \'close\' : \'cancel\');\n }\n },\n handleInputEnter: function handleInputEnter() {\n if (this.inputType !== \'textarea\') {\n return this.handleAction(\'confirm\');\n }\n },\n handleAction: function handleAction(action) {\n if (this.$type === \'prompt\' && action === \'confirm\' && !this.validate()) {\n return;\n }\n this.action = action;\n if (typeof this.beforeClose === \'function\') {\n this.close = this.getSafeClose();\n this.beforeClose(action, this, this.close);\n } else {\n this.doClose();\n }\n },\n validate: function validate() {\n if (this.$type === \'prompt\') {\n var inputPattern = this.inputPattern;\n if (inputPattern && !inputPattern.test(this.inputValue || \'\')) {\n this.editorErrorMessage = this.inputErrorMessage || Object(lib_locale_["t"])(\'el.messagebox.error\');\n Object(dom_["addClass"])(this.getInputElement(), \'invalid\');\n return false;\n }\n var inputValidator = this.inputValidator;\n if (typeof inputValidator === \'function\') {\n var validateResult = inputValidator(this.inputValue);\n if (validateResult === false) {\n this.editorErrorMessage = this.inputErrorMessage || Object(lib_locale_["t"])(\'el.messagebox.error\');\n Object(dom_["addClass"])(this.getInputElement(), \'invalid\');\n return false;\n }\n if (typeof validateResult === \'string\') {\n this.editorErrorMessage = validateResult;\n Object(dom_["addClass"])(this.getInputElement(), \'invalid\');\n return false;\n }\n }\n }\n this.editorErrorMessage = \'\';\n Object(dom_["removeClass"])(this.getInputElement(), \'invalid\');\n return true;\n },\n getFirstFocus: function getFirstFocus() {\n var btn = this.$el.querySelector(\'.el-message-box__btns .el-button\');\n var title = this.$el.querySelector(\'.el-message-box__btns .el-message-box__title\');\n return btn || title;\n },\n getInputElement: function getInputElement() {\n var inputRefs = this.$refs.input.$refs;\n return inputRefs.input || inputRefs.textarea;\n },\n handleClose: function handleClose() {\n this.handleAction(\'close\');\n }\n },\n\n watch: {\n inputValue: {\n immediate: true,\n handler: function handler(val) {\n var _this3 = this;\n\n this.$nextTick(function (_) {\n if (_this3.$type === \'prompt\' && val !== null) {\n _this3.validate();\n }\n });\n }\n },\n\n visible: function visible(val) {\n var _this4 = this;\n\n if (val) {\n this.uid++;\n if (this.$type === \'alert\' || this.$type === \'confirm\') {\n this.$nextTick(function () {\n _this4.$refs.confirm.$el.focus();\n });\n }\n this.focusAfterClosed = document.activeElement;\n messageBox = new aria_dialog_default.a(this.$el, this.focusAfterClosed, this.getFirstFocus());\n }\n\n // prompt\n if (this.$type !== \'prompt\') return;\n if (val) {\n setTimeout(function () {\n if (_this4.$refs.input && _this4.$refs.input.$el) {\n _this4.getInputElement().focus();\n }\n }, 500);\n } else {\n this.editorErrorMessage = \'\';\n Object(dom_["removeClass"])(this.getInputElement(), \'invalid\');\n }\n }\n },\n\n mounted: function mounted() {\n var _this5 = this;\n\n this.$nextTick(function () {\n if (_this5.closeOnHashChange) {\n window.addEventListener(\'hashchange\', _this5.close);\n }\n });\n },\n beforeDestroy: function beforeDestroy() {\n if (this.closeOnHashChange) {\n window.removeEventListener(\'hashchange\', this.close);\n }\n setTimeout(function () {\n messageBox.closeDialog();\n });\n },\n data: function data() {\n return {\n uid: 1,\n title: undefined,\n message: \'\',\n type: \'\',\n iconClass: \'\',\n customClass: \'\',\n showInput: false,\n inputValue: null,\n inputPlaceholder: \'\',\n inputType: \'text\',\n inputPattern: null,\n inputValidator: null,\n inputErrorMessage: \'\',\n showConfirmButton: true,\n showCancelButton: false,\n action: \'\',\n confirmButtonText: \'\',\n cancelButtonText: \'\',\n confirmButtonLoading: false,\n cancelButtonLoading: false,\n confirmButtonClass: \'\',\n confirmButtonDisabled: false,\n cancelButtonClass: \'\',\n editorErrorMessage: null,\n callback: null,\n dangerouslyUseHTMLString: false,\n focusAfterClosed: null,\n isOnComposition: false,\n distinguishCancelAndClose: false\n };\n }\n});\n// CONCATENATED MODULE: ./packages/message-box/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_message_box_src_mainvue_type_script_lang_js_ = (message_box_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/message-box/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar src_main_component = normalizeComponent(\n packages_message_box_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_6b29b012_render,\n mainvue_type_template_id_6b29b012_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var src_main_api; }\nsrc_main_component.options.__file = "packages/message-box/src/main.vue"\n/* harmony default export */ var message_box_src_main = (src_main_component.exports);\n// EXTERNAL MODULE: external "element-ui/lib/utils/vdom"\nvar vdom_ = __webpack_require__(22);\n\n// CONCATENATED MODULE: ./packages/message-box/src/main.js\nvar main_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\nvar main_defaults = {\n title: null,\n message: \'\',\n type: \'\',\n iconClass: \'\',\n showInput: false,\n showClose: true,\n modalFade: true,\n lockScroll: true,\n closeOnClickModal: true,\n closeOnPressEscape: true,\n closeOnHashChange: true,\n inputValue: null,\n inputPlaceholder: \'\',\n inputType: \'text\',\n inputPattern: null,\n inputValidator: null,\n inputErrorMessage: \'\',\n showConfirmButton: true,\n showCancelButton: false,\n confirmButtonPosition: \'right\',\n confirmButtonHighlight: false,\n cancelButtonHighlight: false,\n confirmButtonText: \'\',\n cancelButtonText: \'\',\n confirmButtonClass: \'\',\n cancelButtonClass: \'\',\n customClass: \'\',\n beforeClose: null,\n dangerouslyUseHTMLString: false,\n center: false,\n roundButton: false,\n distinguishCancelAndClose: false\n};\n\n\n\n\n\n\nvar MessageBoxConstructor = external_vue_default.a.extend(message_box_src_main);\n\nvar currentMsg = void 0,\n main_instance = void 0;\nvar msgQueue = [];\n\nvar defaultCallback = function defaultCallback(action) {\n if (currentMsg) {\n var callback = currentMsg.callback;\n if (typeof callback === \'function\') {\n if (main_instance.showInput) {\n callback(main_instance.inputValue, action);\n } else {\n callback(action);\n }\n }\n if (currentMsg.resolve) {\n if (action === \'confirm\') {\n if (main_instance.showInput) {\n currentMsg.resolve({ value: main_instance.inputValue, action: action });\n } else {\n currentMsg.resolve(action);\n }\n } else if (currentMsg.reject && (action === \'cancel\' || action === \'close\')) {\n currentMsg.reject(action);\n }\n }\n }\n};\n\nvar initInstance = function initInstance() {\n main_instance = new MessageBoxConstructor({\n el: document.createElement(\'div\')\n });\n\n main_instance.callback = defaultCallback;\n};\n\nvar main_showNextMsg = function showNextMsg() {\n if (!main_instance) {\n initInstance();\n }\n main_instance.action = \'\';\n\n if (!main_instance.visible || main_instance.closeTimer) {\n if (msgQueue.length > 0) {\n currentMsg = msgQueue.shift();\n\n var options = currentMsg.options;\n for (var prop in options) {\n if (options.hasOwnProperty(prop)) {\n main_instance[prop] = options[prop];\n }\n }\n if (options.callback === undefined) {\n main_instance.callback = defaultCallback;\n }\n\n var oldCb = main_instance.callback;\n main_instance.callback = function (action, instance) {\n oldCb(action, instance);\n showNextMsg();\n };\n if (Object(vdom_["isVNode"])(main_instance.message)) {\n main_instance.$slots.default = [main_instance.message];\n main_instance.message = null;\n } else {\n delete main_instance.$slots.default;\n }\n [\'modal\', \'showClose\', \'closeOnClickModal\', \'closeOnPressEscape\', \'closeOnHashChange\'].forEach(function (prop) {\n if (main_instance[prop] === undefined) {\n main_instance[prop] = true;\n }\n });\n document.body.appendChild(main_instance.$el);\n\n external_vue_default.a.nextTick(function () {\n main_instance.visible = true;\n });\n }\n }\n};\n\nvar main_MessageBox = function MessageBox(options, callback) {\n if (external_vue_default.a.prototype.$isServer) return;\n if (typeof options === \'string\' || Object(vdom_["isVNode"])(options)) {\n options = {\n message: options\n };\n if (typeof arguments[1] === \'string\') {\n options.title = arguments[1];\n }\n } else if (options.callback && !callback) {\n callback = options.callback;\n }\n\n if (typeof Promise !== \'undefined\') {\n return new Promise(function (resolve, reject) {\n // eslint-disable-line\n msgQueue.push({\n options: merge_default()({}, main_defaults, MessageBox.defaults, options),\n callback: callback,\n resolve: resolve,\n reject: reject\n });\n\n main_showNextMsg();\n });\n } else {\n msgQueue.push({\n options: merge_default()({}, main_defaults, MessageBox.defaults, options),\n callback: callback\n });\n\n main_showNextMsg();\n }\n};\n\nmain_MessageBox.setDefaults = function (defaults) {\n main_MessageBox.defaults = defaults;\n};\n\nmain_MessageBox.alert = function (message, title, options) {\n if ((typeof title === \'undefined\' ? \'undefined\' : main_typeof(title)) === \'object\') {\n options = title;\n title = \'\';\n } else if (title === undefined) {\n title = \'\';\n }\n return main_MessageBox(merge_default()({\n title: title,\n message: message,\n $type: \'alert\',\n closeOnPressEscape: false,\n closeOnClickModal: false\n }, options));\n};\n\nmain_MessageBox.confirm = function (message, title, options) {\n if ((typeof title === \'undefined\' ? \'undefined\' : main_typeof(title)) === \'object\') {\n options = title;\n title = \'\';\n } else if (title === undefined) {\n title = \'\';\n }\n return main_MessageBox(merge_default()({\n title: title,\n message: message,\n $type: \'confirm\',\n showCancelButton: true\n }, options));\n};\n\nmain_MessageBox.prompt = function (message, title, options) {\n if ((typeof title === \'undefined\' ? \'undefined\' : main_typeof(title)) === \'object\') {\n options = title;\n title = \'\';\n } else if (title === undefined) {\n title = \'\';\n }\n return main_MessageBox(merge_default()({\n title: title,\n message: message,\n showCancelButton: true,\n showInput: true,\n $type: \'prompt\'\n }, options));\n};\n\nmain_MessageBox.close = function () {\n main_instance.doClose();\n main_instance.visible = false;\n msgQueue = [];\n currentMsg = null;\n};\n\n/* harmony default export */ var packages_message_box_src_main = (main_MessageBox);\n\n// CONCATENATED MODULE: ./packages/message-box/index.js\n\n/* harmony default export */ var message_box = (packages_message_box_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/breadcrumb/src/breadcrumb.vue?vue&type=template&id=4b464c06&\nvar breadcrumbvue_type_template_id_4b464c06_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 staticClass: "el-breadcrumb",\n attrs: { "aria-label": "Breadcrumb", role: "navigation" }\n },\n [_vm._t("default")],\n 2\n )\n}\nvar breadcrumbvue_type_template_id_4b464c06_staticRenderFns = []\nbreadcrumbvue_type_template_id_4b464c06_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/breadcrumb/src/breadcrumb.vue?vue&type=template&id=4b464c06&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/breadcrumb/src/breadcrumb.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n\n/* harmony default export */ var breadcrumbvue_type_script_lang_js_ = ({\n name: \'ElBreadcrumb\',\n\n props: {\n separator: {\n type: String,\n default: \'/\'\n },\n separatorClass: {\n type: String,\n default: \'\'\n }\n },\n\n provide: function provide() {\n return {\n elBreadcrumb: this\n };\n },\n mounted: function mounted() {\n var items = this.$el.querySelectorAll(\'.el-breadcrumb__item\');\n if (items.length) {\n items[items.length - 1].setAttribute(\'aria-current\', \'page\');\n }\n }\n});\n// CONCATENATED MODULE: ./packages/breadcrumb/src/breadcrumb.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_breadcrumbvue_type_script_lang_js_ = (breadcrumbvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/breadcrumb/src/breadcrumb.vue\n\n\n\n\n\n/* normalize component */\n\nvar breadcrumb_component = normalizeComponent(\n src_breadcrumbvue_type_script_lang_js_,\n breadcrumbvue_type_template_id_4b464c06_render,\n breadcrumbvue_type_template_id_4b464c06_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var breadcrumb_api; }\nbreadcrumb_component.options.__file = "packages/breadcrumb/src/breadcrumb.vue"\n/* harmony default export */ var breadcrumb = (breadcrumb_component.exports);\n// CONCATENATED MODULE: ./packages/breadcrumb/index.js\n\n\n/* istanbul ignore next */\nbreadcrumb.install = function (Vue) {\n Vue.component(breadcrumb.name, breadcrumb);\n};\n\n/* harmony default export */ var packages_breadcrumb = (breadcrumb);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/breadcrumb/src/breadcrumb-item.vue?vue&type=template&id=fcf9eaac&\nvar breadcrumb_itemvue_type_template_id_fcf9eaac_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("span", { staticClass: "el-breadcrumb__item" }, [\n _c(\n "span",\n {\n ref: "link",\n class: ["el-breadcrumb__inner", _vm.to ? "is-link" : ""],\n attrs: { role: "link" }\n },\n [_vm._t("default")],\n 2\n ),\n _vm.separatorClass\n ? _c("i", {\n staticClass: "el-breadcrumb__separator",\n class: _vm.separatorClass\n })\n : _c(\n "span",\n {\n staticClass: "el-breadcrumb__separator",\n attrs: { role: "presentation" }\n },\n [_vm._v(_vm._s(_vm.separator))]\n )\n ])\n}\nvar breadcrumb_itemvue_type_template_id_fcf9eaac_staticRenderFns = []\nbreadcrumb_itemvue_type_template_id_fcf9eaac_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/breadcrumb/src/breadcrumb-item.vue?vue&type=template&id=fcf9eaac&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/breadcrumb/src/breadcrumb-item.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var breadcrumb_itemvue_type_script_lang_js_ = ({\n name: \'ElBreadcrumbItem\',\n props: {\n to: {},\n replace: Boolean\n },\n data: function data() {\n return {\n separator: \'\',\n separatorClass: \'\'\n };\n },\n\n\n inject: [\'elBreadcrumb\'],\n\n mounted: function mounted() {\n var _this = this;\n\n this.separator = this.elBreadcrumb.separator;\n this.separatorClass = this.elBreadcrumb.separatorClass;\n var link = this.$refs.link;\n link.setAttribute(\'role\', \'link\');\n link.addEventListener(\'click\', function (_) {\n var to = _this.to,\n $router = _this.$router;\n\n if (!to || !$router) return;\n _this.replace ? $router.replace(to) : $router.push(to);\n });\n }\n});\n// CONCATENATED MODULE: ./packages/breadcrumb/src/breadcrumb-item.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_breadcrumb_itemvue_type_script_lang_js_ = (breadcrumb_itemvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/breadcrumb/src/breadcrumb-item.vue\n\n\n\n\n\n/* normalize component */\n\nvar breadcrumb_item_component = normalizeComponent(\n src_breadcrumb_itemvue_type_script_lang_js_,\n breadcrumb_itemvue_type_template_id_fcf9eaac_render,\n breadcrumb_itemvue_type_template_id_fcf9eaac_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var breadcrumb_item_api; }\nbreadcrumb_item_component.options.__file = "packages/breadcrumb/src/breadcrumb-item.vue"\n/* harmony default export */ var breadcrumb_item = (breadcrumb_item_component.exports);\n// CONCATENATED MODULE: ./packages/breadcrumb-item/index.js\n\n\n/* istanbul ignore next */\nbreadcrumb_item.install = function (Vue) {\n Vue.component(breadcrumb_item.name, breadcrumb_item);\n};\n\n/* harmony default export */ var packages_breadcrumb_item = (breadcrumb_item);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/form/src/form.vue?vue&type=template&id=a1b5ff34&\nvar formvue_type_template_id_a1b5ff34_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "form",\n {\n staticClass: "el-form",\n class: [\n _vm.labelPosition ? "el-form--label-" + _vm.labelPosition : "",\n { "el-form--inline": _vm.inline }\n ]\n },\n [_vm._t("default")],\n 2\n )\n}\nvar formvue_type_template_id_a1b5ff34_staticRenderFns = []\nformvue_type_template_id_a1b5ff34_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/form/src/form.vue?vue&type=template&id=a1b5ff34&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/form/src/form.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ var formvue_type_script_lang_js_ = ({\n name: \'ElForm\',\n\n componentName: \'ElForm\',\n\n provide: function provide() {\n return {\n elForm: this\n };\n },\n\n\n props: {\n model: Object,\n rules: Object,\n labelPosition: String,\n labelWidth: String,\n labelSuffix: {\n type: String,\n default: \'\'\n },\n inline: Boolean,\n inlineMessage: Boolean,\n statusIcon: Boolean,\n showMessage: {\n type: Boolean,\n default: true\n },\n size: String,\n disabled: Boolean,\n validateOnRuleChange: {\n type: Boolean,\n default: true\n },\n hideRequiredAsterisk: {\n type: Boolean,\n default: false\n }\n },\n watch: {\n rules: function rules() {\n // remove then add event listeners on form-item after form rules change\n this.fields.forEach(function (field) {\n field.removeValidateEvents();\n field.addValidateEvents();\n });\n\n if (this.validateOnRuleChange) {\n this.validate(function () {});\n }\n }\n },\n computed: {\n autoLabelWidth: function autoLabelWidth() {\n if (!this.potentialLabelWidthArr.length) return 0;\n var max = Math.max.apply(Math, this.potentialLabelWidthArr);\n return max ? max + \'px\' : \'\';\n }\n },\n data: function data() {\n return {\n fields: [],\n potentialLabelWidthArr: [] // use this array to calculate auto width\n };\n },\n created: function created() {\n var _this = this;\n\n this.$on(\'el.form.addField\', function (field) {\n if (field) {\n _this.fields.push(field);\n }\n });\n /* istanbul ignore next */\n this.$on(\'el.form.removeField\', function (field) {\n if (field.prop) {\n _this.fields.splice(_this.fields.indexOf(field), 1);\n }\n });\n },\n\n methods: {\n resetFields: function resetFields() {\n if (!this.model) {\n console.warn(\'[Element Warn][Form]model is required for resetFields to work.\');\n return;\n }\n this.fields.forEach(function (field) {\n field.resetField();\n });\n },\n clearValidate: function clearValidate() {\n var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n var fields = props.length ? typeof props === \'string\' ? this.fields.filter(function (field) {\n return props === field.prop;\n }) : this.fields.filter(function (field) {\n return props.indexOf(field.prop) > -1;\n }) : this.fields;\n fields.forEach(function (field) {\n field.clearValidate();\n });\n },\n validate: function validate(callback) {\n var _this2 = this;\n\n if (!this.model) {\n console.warn(\'[Element Warn][Form]model is required for validate to work!\');\n return;\n }\n\n var promise = void 0;\n // if no callback, return promise\n if (typeof callback !== \'function\' && window.Promise) {\n promise = new window.Promise(function (resolve, reject) {\n callback = function callback(valid, invalidFields) {\n valid ? resolve(valid) : reject(invalidFields);\n };\n });\n }\n\n var valid = true;\n var count = 0;\n // 如果需要验证的fields为空,调用验证时立刻返回callback\n if (this.fields.length === 0 && callback) {\n callback(true);\n }\n var invalidFields = {};\n this.fields.forEach(function (field) {\n field.validate(\'\', function (message, field) {\n if (message) {\n valid = false;\n }\n invalidFields = merge_default()({}, invalidFields, field);\n if (typeof callback === \'function\' && ++count === _this2.fields.length) {\n callback(valid, invalidFields);\n }\n });\n });\n\n if (promise) {\n return promise;\n }\n },\n validateField: function validateField(props, cb) {\n props = [].concat(props);\n var fields = this.fields.filter(function (field) {\n return props.indexOf(field.prop) !== -1;\n });\n if (!fields.length) {\n console.warn(\'[Element Warn]please pass correct props!\');\n return;\n }\n\n fields.forEach(function (field) {\n field.validate(\'\', cb);\n });\n },\n getLabelWidthIndex: function getLabelWidthIndex(width) {\n var index = this.potentialLabelWidthArr.indexOf(width);\n // it\'s impossible\n if (index === -1) {\n throw new Error(\'[ElementForm]unpected width \', width);\n }\n return index;\n },\n registerLabelWidth: function registerLabelWidth(val, oldVal) {\n if (val && oldVal) {\n var index = this.getLabelWidthIndex(oldVal);\n this.potentialLabelWidthArr.splice(index, 1, val);\n } else if (val) {\n this.potentialLabelWidthArr.push(val);\n }\n },\n deregisterLabelWidth: function deregisterLabelWidth(val) {\n var index = this.getLabelWidthIndex(val);\n this.potentialLabelWidthArr.splice(index, 1);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/form/src/form.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_formvue_type_script_lang_js_ = (formvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/form/src/form.vue\n\n\n\n\n\n/* normalize component */\n\nvar form_component = normalizeComponent(\n src_formvue_type_script_lang_js_,\n formvue_type_template_id_a1b5ff34_render,\n formvue_type_template_id_a1b5ff34_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var form_api; }\nform_component.options.__file = "packages/form/src/form.vue"\n/* harmony default export */ var src_form = (form_component.exports);\n// CONCATENATED MODULE: ./packages/form/index.js\n\n\n/* istanbul ignore next */\nsrc_form.install = function (Vue) {\n Vue.component(src_form.name, src_form);\n};\n\n/* harmony default export */ var packages_form = (src_form);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/form/src/form-item.vue?vue&type=template&id=b6f3db6c&\nvar form_itemvue_type_template_id_b6f3db6c_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 staticClass: "el-form-item",\n class: [\n {\n "el-form-item--feedback": _vm.elForm && _vm.elForm.statusIcon,\n "is-error": _vm.validateState === "error",\n "is-validating": _vm.validateState === "validating",\n "is-success": _vm.validateState === "success",\n "is-required": _vm.isRequired || _vm.required,\n "is-no-asterisk": _vm.elForm && _vm.elForm.hideRequiredAsterisk\n },\n _vm.sizeClass ? "el-form-item--" + _vm.sizeClass : ""\n ]\n },\n [\n _c(\n "label-wrap",\n {\n attrs: {\n "is-auto-width": _vm.labelStyle && _vm.labelStyle.width === "auto",\n "update-all": _vm.form.labelWidth === "auto"\n }\n },\n [\n _vm.label || _vm.$slots.label\n ? _c(\n "label",\n {\n staticClass: "el-form-item__label",\n style: _vm.labelStyle,\n attrs: { for: _vm.labelFor }\n },\n [\n _vm._t("label", [\n _vm._v(_vm._s(_vm.label + _vm.form.labelSuffix))\n ])\n ],\n 2\n )\n : _vm._e()\n ]\n ),\n _c(\n "div",\n { staticClass: "el-form-item__content", style: _vm.contentStyle },\n [\n _vm._t("default"),\n _c(\n "transition",\n { attrs: { name: "el-zoom-in-top" } },\n [\n _vm.validateState === "error" &&\n _vm.showMessage &&\n _vm.form.showMessage\n ? _vm._t(\n "error",\n [\n _c(\n "div",\n {\n staticClass: "el-form-item__error",\n class: {\n "el-form-item__error--inline":\n typeof _vm.inlineMessage === "boolean"\n ? _vm.inlineMessage\n : (_vm.elForm && _vm.elForm.inlineMessage) ||\n false\n }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.validateMessage) +\n "\\n "\n )\n ]\n )\n ],\n { error: _vm.validateMessage }\n )\n : _vm._e()\n ],\n 2\n )\n ],\n 2\n )\n ],\n 1\n )\n}\nvar form_itemvue_type_template_id_b6f3db6c_staticRenderFns = []\nform_itemvue_type_template_id_b6f3db6c_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/form/src/form-item.vue?vue&type=template&id=b6f3db6c&\n\n// EXTERNAL MODULE: external "async-validator"\nvar external_async_validator_ = __webpack_require__(41);\nvar external_async_validator_default = /*#__PURE__*/__webpack_require__.n(external_async_validator_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/form/src/label-wrap.vue?vue&type=script&lang=js&\n\n\n/* harmony default export */ var label_wrapvue_type_script_lang_js_ = ({\n props: {\n isAutoWidth: Boolean,\n updateAll: Boolean\n },\n\n inject: [\'elForm\', \'elFormItem\'],\n\n render: function render() {\n var h = arguments[0];\n\n var slots = this.$slots.default;\n if (!slots) return null;\n if (this.isAutoWidth) {\n var autoLabelWidth = this.elForm.autoLabelWidth;\n var style = {};\n if (autoLabelWidth && autoLabelWidth !== \'auto\') {\n var marginLeft = parseInt(autoLabelWidth, 10) - this.computedWidth;\n if (marginLeft) {\n style.marginLeft = marginLeft + \'px\';\n }\n }\n return h(\n \'div\',\n { \'class\': \'el-form-item__label-wrap\', style: style },\n [slots]\n );\n } else {\n return slots[0];\n }\n },\n\n\n methods: {\n getLabelWidth: function getLabelWidth() {\n if (this.$el && this.$el.firstElementChild) {\n var computedWidth = window.getComputedStyle(this.$el.firstElementChild).width;\n return Math.ceil(parseFloat(computedWidth));\n } else {\n return 0;\n }\n },\n updateLabelWidth: function updateLabelWidth() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \'update\';\n\n if (this.$slots.default && this.isAutoWidth && this.$el.firstElementChild) {\n if (action === \'update\') {\n this.computedWidth = this.getLabelWidth();\n } else if (action === \'remove\') {\n this.elForm.deregisterLabelWidth(this.computedWidth);\n }\n }\n }\n },\n\n watch: {\n computedWidth: function computedWidth(val, oldVal) {\n if (this.updateAll) {\n this.elForm.registerLabelWidth(val, oldVal);\n this.elFormItem.updateComputedLabelWidth(val);\n }\n }\n },\n\n data: function data() {\n return {\n computedWidth: 0\n };\n },\n mounted: function mounted() {\n this.updateLabelWidth(\'update\');\n },\n updated: function updated() {\n this.updateLabelWidth(\'update\');\n },\n beforeDestroy: function beforeDestroy() {\n this.updateLabelWidth(\'remove\');\n }\n});\n// CONCATENATED MODULE: ./packages/form/src/label-wrap.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_label_wrapvue_type_script_lang_js_ = (label_wrapvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/form/src/label-wrap.vue\nvar label_wrap_render, label_wrap_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar label_wrap_component = normalizeComponent(\n src_label_wrapvue_type_script_lang_js_,\n label_wrap_render,\n label_wrap_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var label_wrap_api; }\nlabel_wrap_component.options.__file = "packages/form/src/label-wrap.vue"\n/* harmony default export */ var label_wrap = (label_wrap_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/form/src/form-item.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\n\n\n\n/* harmony default export */ var form_itemvue_type_script_lang_js_ = ({\n name: \'ElFormItem\',\n\n componentName: \'ElFormItem\',\n\n mixins: [emitter_default.a],\n\n provide: function provide() {\n return {\n elFormItem: this\n };\n },\n\n\n inject: [\'elForm\'],\n\n props: {\n label: String,\n labelWidth: String,\n prop: String,\n required: {\n type: Boolean,\n default: undefined\n },\n rules: [Object, Array],\n error: String,\n validateStatus: String,\n for: String,\n inlineMessage: {\n type: [String, Boolean],\n default: \'\'\n },\n showMessage: {\n type: Boolean,\n default: true\n },\n size: String\n },\n components: {\n // use this component to calculate auto width\n LabelWrap: label_wrap\n },\n watch: {\n error: {\n immediate: true,\n handler: function handler(value) {\n this.validateMessage = value;\n this.validateState = value ? \'error\' : \'\';\n }\n },\n validateStatus: function validateStatus(value) {\n this.validateState = value;\n },\n rules: function rules(value) {\n if ((!value || value.length === 0) && this.required === undefined) {\n this.clearValidate();\n }\n }\n },\n computed: {\n labelFor: function labelFor() {\n return this.for || this.prop;\n },\n labelStyle: function labelStyle() {\n var ret = {};\n if (this.form.labelPosition === \'top\') return ret;\n var labelWidth = this.labelWidth || this.form.labelWidth;\n if (labelWidth) {\n ret.width = labelWidth;\n }\n return ret;\n },\n contentStyle: function contentStyle() {\n var ret = {};\n var label = this.label;\n if (this.form.labelPosition === \'top\' || this.form.inline) return ret;\n if (!label && !this.labelWidth && this.isNested) return ret;\n var labelWidth = this.labelWidth || this.form.labelWidth;\n if (labelWidth === \'auto\') {\n if (this.labelWidth === \'auto\') {\n ret.marginLeft = this.computedLabelWidth;\n } else if (this.form.labelWidth === \'auto\') {\n ret.marginLeft = this.elForm.autoLabelWidth;\n }\n } else {\n ret.marginLeft = labelWidth;\n }\n return ret;\n },\n form: function form() {\n var parent = this.$parent;\n var parentName = parent.$options.componentName;\n while (parentName !== \'ElForm\') {\n if (parentName === \'ElFormItem\') {\n this.isNested = true;\n }\n parent = parent.$parent;\n parentName = parent.$options.componentName;\n }\n return parent;\n },\n fieldValue: function fieldValue() {\n var model = this.form.model;\n if (!model || !this.prop) {\n return;\n }\n\n var path = this.prop;\n if (path.indexOf(\':\') !== -1) {\n path = path.replace(/:/, \'.\');\n }\n\n return Object(util_["getPropByPath"])(model, path, true).v;\n },\n isRequired: function isRequired() {\n var rules = this.getRules();\n var isRequired = false;\n\n if (rules && rules.length) {\n rules.every(function (rule) {\n if (rule.required) {\n isRequired = true;\n return false;\n }\n return true;\n });\n }\n return isRequired;\n },\n _formSize: function _formSize() {\n return this.elForm.size;\n },\n elFormItemSize: function elFormItemSize() {\n return this.size || this._formSize;\n },\n sizeClass: function sizeClass() {\n return this.elFormItemSize || (this.$ELEMENT || {}).size;\n }\n },\n data: function data() {\n return {\n validateState: \'\',\n validateMessage: \'\',\n validateDisabled: false,\n validator: {},\n isNested: false,\n computedLabelWidth: \'\'\n };\n },\n\n methods: {\n validate: function validate(trigger) {\n var _this = this;\n\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : util_["noop"];\n\n this.validateDisabled = false;\n var rules = this.getFilteredRule(trigger);\n if ((!rules || rules.length === 0) && this.required === undefined) {\n callback();\n return true;\n }\n\n this.validateState = \'validating\';\n\n var descriptor = {};\n if (rules && rules.length > 0) {\n rules.forEach(function (rule) {\n delete rule.trigger;\n });\n }\n descriptor[this.prop] = rules;\n\n var validator = new external_async_validator_default.a(descriptor);\n var model = {};\n\n model[this.prop] = this.fieldValue;\n\n validator.validate(model, { firstFields: true }, function (errors, invalidFields) {\n _this.validateState = !errors ? \'success\' : \'error\';\n _this.validateMessage = errors ? errors[0].message : \'\';\n\n callback(_this.validateMessage, invalidFields);\n _this.elForm && _this.elForm.$emit(\'validate\', _this.prop, !errors, _this.validateMessage || null);\n });\n },\n clearValidate: function clearValidate() {\n this.validateState = \'\';\n this.validateMessage = \'\';\n this.validateDisabled = false;\n },\n resetField: function resetField() {\n var _this2 = this;\n\n this.validateState = \'\';\n this.validateMessage = \'\';\n\n var model = this.form.model;\n var value = this.fieldValue;\n var path = this.prop;\n if (path.indexOf(\':\') !== -1) {\n path = path.replace(/:/, \'.\');\n }\n\n var prop = Object(util_["getPropByPath"])(model, path, true);\n\n this.validateDisabled = true;\n if (Array.isArray(value)) {\n prop.o[prop.k] = [].concat(this.initialValue);\n } else {\n prop.o[prop.k] = this.initialValue;\n }\n\n // reset validateDisabled after onFieldChange triggered\n this.$nextTick(function () {\n _this2.validateDisabled = false;\n });\n\n this.broadcast(\'ElTimeSelect\', \'fieldReset\', this.initialValue);\n },\n getRules: function getRules() {\n var formRules = this.form.rules;\n var selfRules = this.rules;\n var requiredRule = this.required !== undefined ? { required: !!this.required } : [];\n\n var prop = Object(util_["getPropByPath"])(formRules, this.prop || \'\');\n formRules = formRules ? prop.o[this.prop || \'\'] || prop.v : [];\n\n return [].concat(selfRules || formRules || []).concat(requiredRule);\n },\n getFilteredRule: function getFilteredRule(trigger) {\n var rules = this.getRules();\n\n return rules.filter(function (rule) {\n if (!rule.trigger || trigger === \'\') return true;\n if (Array.isArray(rule.trigger)) {\n return rule.trigger.indexOf(trigger) > -1;\n } else {\n return rule.trigger === trigger;\n }\n }).map(function (rule) {\n return merge_default()({}, rule);\n });\n },\n onFieldBlur: function onFieldBlur() {\n this.validate(\'blur\');\n },\n onFieldChange: function onFieldChange() {\n if (this.validateDisabled) {\n this.validateDisabled = false;\n return;\n }\n\n this.validate(\'change\');\n },\n updateComputedLabelWidth: function updateComputedLabelWidth(width) {\n this.computedLabelWidth = width ? width + \'px\' : \'\';\n },\n addValidateEvents: function addValidateEvents() {\n var rules = this.getRules();\n\n if (rules.length || this.required !== undefined) {\n this.$on(\'el.form.blur\', this.onFieldBlur);\n this.$on(\'el.form.change\', this.onFieldChange);\n }\n },\n removeValidateEvents: function removeValidateEvents() {\n this.$off();\n }\n },\n mounted: function mounted() {\n if (this.prop) {\n this.dispatch(\'ElForm\', \'el.form.addField\', [this]);\n\n var initialValue = this.fieldValue;\n if (Array.isArray(initialValue)) {\n initialValue = [].concat(initialValue);\n }\n Object.defineProperty(this, \'initialValue\', {\n value: initialValue\n });\n\n this.addValidateEvents();\n }\n },\n beforeDestroy: function beforeDestroy() {\n this.dispatch(\'ElForm\', \'el.form.removeField\', [this]);\n }\n});\n// CONCATENATED MODULE: ./packages/form/src/form-item.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_form_itemvue_type_script_lang_js_ = (form_itemvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/form/src/form-item.vue\n\n\n\n\n\n/* normalize component */\n\nvar form_item_component = normalizeComponent(\n src_form_itemvue_type_script_lang_js_,\n form_itemvue_type_template_id_b6f3db6c_render,\n form_itemvue_type_template_id_b6f3db6c_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var form_item_api; }\nform_item_component.options.__file = "packages/form/src/form-item.vue"\n/* harmony default export */ var form_item = (form_item_component.exports);\n// CONCATENATED MODULE: ./packages/form-item/index.js\n\n\n/* istanbul ignore next */\nform_item.install = function (Vue) {\n Vue.component(form_item.name, form_item);\n};\n\n/* harmony default export */ var packages_form_item = (form_item);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/tabs/src/tab-bar.vue?vue&type=template&id=2031f33a&\nvar tab_barvue_type_template_id_2031f33a_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("div", {\n staticClass: "el-tabs__active-bar",\n class: "is-" + _vm.rootTabs.tabPosition,\n style: _vm.barStyle\n })\n}\nvar tab_barvue_type_template_id_2031f33a_staticRenderFns = []\ntab_barvue_type_template_id_2031f33a_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/tabs/src/tab-bar.vue?vue&type=template&id=2031f33a&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/tabs/src/tab-bar.vue?vue&type=script&lang=js&\n//\n//\n//\n\n\n/* harmony default export */ var tab_barvue_type_script_lang_js_ = ({\n name: \'TabBar\',\n\n props: {\n tabs: Array\n },\n\n inject: [\'rootTabs\'],\n\n computed: {\n barStyle: {\n get: function get() {\n var _this = this;\n\n var style = {};\n var offset = 0;\n var tabSize = 0;\n var sizeName = [\'top\', \'bottom\'].indexOf(this.rootTabs.tabPosition) !== -1 ? \'width\' : \'height\';\n var sizeDir = sizeName === \'width\' ? \'x\' : \'y\';\n var firstUpperCase = function firstUpperCase(str) {\n return str.toLowerCase().replace(/( |^)[a-z]/g, function (L) {\n return L.toUpperCase();\n });\n };\n this.tabs.every(function (tab, index) {\n var $el = Object(util_["arrayFind"])(_this.$parent.$refs.tabs || [], function (t) {\n return t.id.replace(\'tab-\', \'\') === tab.paneName;\n });\n if (!$el) {\n return false;\n }\n\n if (!tab.active) {\n offset += $el[\'client\' + firstUpperCase(sizeName)];\n return true;\n } else {\n tabSize = $el[\'client\' + firstUpperCase(sizeName)];\n var tabStyles = window.getComputedStyle($el);\n if (sizeName === \'width\' && _this.tabs.length > 1) {\n tabSize -= parseFloat(tabStyles.paddingLeft) + parseFloat(tabStyles.paddingRight);\n }\n if (sizeName === \'width\') {\n offset += parseFloat(tabStyles.paddingLeft);\n }\n return false;\n }\n });\n\n var transform = \'translate\' + firstUpperCase(sizeDir) + \'(\' + offset + \'px)\';\n style[sizeName] = tabSize + \'px\';\n style.transform = transform;\n style.msTransform = transform;\n style.webkitTransform = transform;\n\n return style;\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/tabs/src/tab-bar.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_tab_barvue_type_script_lang_js_ = (tab_barvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/tabs/src/tab-bar.vue\n\n\n\n\n\n/* normalize component */\n\nvar tab_bar_component = normalizeComponent(\n src_tab_barvue_type_script_lang_js_,\n tab_barvue_type_template_id_2031f33a_render,\n tab_barvue_type_template_id_2031f33a_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var tab_bar_api; }\ntab_bar_component.options.__file = "packages/tabs/src/tab-bar.vue"\n/* harmony default export */ var tab_bar = (tab_bar_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/tabs/src/tab-nav.vue?vue&type=script&lang=js&\n\n\n\n\nfunction noop() {}\nvar tab_navvue_type_script_lang_js_firstUpperCase = function firstUpperCase(str) {\n return str.toLowerCase().replace(/( |^)[a-z]/g, function (L) {\n return L.toUpperCase();\n });\n};\n\n/* harmony default export */ var tab_navvue_type_script_lang_js_ = ({\n name: \'TabNav\',\n\n components: {\n TabBar: tab_bar\n },\n\n inject: [\'rootTabs\'],\n\n props: {\n panes: Array,\n currentName: String,\n editable: Boolean,\n onTabClick: {\n type: Function,\n default: noop\n },\n onTabRemove: {\n type: Function,\n default: noop\n },\n type: String,\n stretch: Boolean\n },\n\n data: function data() {\n return {\n scrollable: false,\n navOffset: 0,\n isFocus: false,\n focusable: true\n };\n },\n\n\n computed: {\n navStyle: function navStyle() {\n var dir = [\'top\', \'bottom\'].indexOf(this.rootTabs.tabPosition) !== -1 ? \'X\' : \'Y\';\n return {\n transform: \'translate\' + dir + \'(-\' + this.navOffset + \'px)\'\n };\n },\n sizeName: function sizeName() {\n return [\'top\', \'bottom\'].indexOf(this.rootTabs.tabPosition) !== -1 ? \'width\' : \'height\';\n }\n },\n\n methods: {\n scrollPrev: function scrollPrev() {\n var containerSize = this.$refs.navScroll[\'offset\' + tab_navvue_type_script_lang_js_firstUpperCase(this.sizeName)];\n var currentOffset = this.navOffset;\n\n if (!currentOffset) return;\n\n var newOffset = currentOffset > containerSize ? currentOffset - containerSize : 0;\n\n this.navOffset = newOffset;\n },\n scrollNext: function scrollNext() {\n var navSize = this.$refs.nav[\'offset\' + tab_navvue_type_script_lang_js_firstUpperCase(this.sizeName)];\n var containerSize = this.$refs.navScroll[\'offset\' + tab_navvue_type_script_lang_js_firstUpperCase(this.sizeName)];\n var currentOffset = this.navOffset;\n\n if (navSize - currentOffset <= containerSize) return;\n\n var newOffset = navSize - currentOffset > containerSize * 2 ? currentOffset + containerSize : navSize - containerSize;\n\n this.navOffset = newOffset;\n },\n scrollToActiveTab: function scrollToActiveTab() {\n if (!this.scrollable) return;\n var nav = this.$refs.nav;\n var activeTab = this.$el.querySelector(\'.is-active\');\n if (!activeTab) return;\n var navScroll = this.$refs.navScroll;\n var isHorizontal = [\'top\', \'bottom\'].indexOf(this.rootTabs.tabPosition) !== -1;\n var activeTabBounding = activeTab.getBoundingClientRect();\n var navScrollBounding = navScroll.getBoundingClientRect();\n var maxOffset = isHorizontal ? nav.offsetWidth - navScrollBounding.width : nav.offsetHeight - navScrollBounding.height;\n var currentOffset = this.navOffset;\n var newOffset = currentOffset;\n\n if (isHorizontal) {\n if (activeTabBounding.left < navScrollBounding.left) {\n newOffset = currentOffset - (navScrollBounding.left - activeTabBounding.left);\n }\n if (activeTabBounding.right > navScrollBounding.right) {\n newOffset = currentOffset + activeTabBounding.right - navScrollBounding.right;\n }\n } else {\n if (activeTabBounding.top < navScrollBounding.top) {\n newOffset = currentOffset - (navScrollBounding.top - activeTabBounding.top);\n }\n if (activeTabBounding.bottom > navScrollBounding.bottom) {\n newOffset = currentOffset + (activeTabBounding.bottom - navScrollBounding.bottom);\n }\n }\n newOffset = Math.max(newOffset, 0);\n this.navOffset = Math.min(newOffset, maxOffset);\n },\n update: function update() {\n if (!this.$refs.nav) return;\n var sizeName = this.sizeName;\n var navSize = this.$refs.nav[\'offset\' + tab_navvue_type_script_lang_js_firstUpperCase(sizeName)];\n var containerSize = this.$refs.navScroll[\'offset\' + tab_navvue_type_script_lang_js_firstUpperCase(sizeName)];\n var currentOffset = this.navOffset;\n\n if (containerSize < navSize) {\n var _currentOffset = this.navOffset;\n this.scrollable = this.scrollable || {};\n this.scrollable.prev = _currentOffset;\n this.scrollable.next = _currentOffset + containerSize < navSize;\n if (navSize - _currentOffset < containerSize) {\n this.navOffset = navSize - containerSize;\n }\n } else {\n this.scrollable = false;\n if (currentOffset > 0) {\n this.navOffset = 0;\n }\n }\n },\n changeTab: function changeTab(e) {\n var keyCode = e.keyCode;\n var nextIndex = void 0;\n var currentIndex = void 0,\n tabList = void 0;\n if ([37, 38, 39, 40].indexOf(keyCode) !== -1) {\n // 左右上下键更换tab\n tabList = e.currentTarget.querySelectorAll(\'[role=tab]\');\n currentIndex = Array.prototype.indexOf.call(tabList, e.target);\n } else {\n return;\n }\n if (keyCode === 37 || keyCode === 38) {\n // left\n if (currentIndex === 0) {\n // first\n nextIndex = tabList.length - 1;\n } else {\n nextIndex = currentIndex - 1;\n }\n } else {\n // right\n if (currentIndex < tabList.length - 1) {\n // not last\n nextIndex = currentIndex + 1;\n } else {\n nextIndex = 0;\n }\n }\n tabList[nextIndex].focus(); // 改变焦点元素\n tabList[nextIndex].click(); // 选中下一个tab\n this.setFocus();\n },\n setFocus: function setFocus() {\n if (this.focusable) {\n this.isFocus = true;\n }\n },\n removeFocus: function removeFocus() {\n this.isFocus = false;\n },\n visibilityChangeHandler: function visibilityChangeHandler() {\n var _this = this;\n\n var visibility = document.visibilityState;\n if (visibility === \'hidden\') {\n this.focusable = false;\n } else if (visibility === \'visible\') {\n setTimeout(function () {\n _this.focusable = true;\n }, 50);\n }\n },\n windowBlurHandler: function windowBlurHandler() {\n this.focusable = false;\n },\n windowFocusHandler: function windowFocusHandler() {\n var _this2 = this;\n\n setTimeout(function () {\n _this2.focusable = true;\n }, 50);\n }\n },\n\n updated: function updated() {\n this.update();\n },\n render: function render(h) {\n var _this3 = this;\n\n var type = this.type,\n panes = this.panes,\n editable = this.editable,\n stretch = this.stretch,\n onTabClick = this.onTabClick,\n onTabRemove = this.onTabRemove,\n navStyle = this.navStyle,\n scrollable = this.scrollable,\n scrollNext = this.scrollNext,\n scrollPrev = this.scrollPrev,\n changeTab = this.changeTab,\n setFocus = this.setFocus,\n removeFocus = this.removeFocus;\n\n var scrollBtn = scrollable ? [h(\n \'span\',\n { \'class\': [\'el-tabs__nav-prev\', scrollable.prev ? \'\' : \'is-disabled\'], on: {\n \'click\': scrollPrev\n }\n },\n [h(\'i\', { \'class\': \'el-icon-arrow-left\' })]\n ), h(\n \'span\',\n { \'class\': [\'el-tabs__nav-next\', scrollable.next ? \'\' : \'is-disabled\'], on: {\n \'click\': scrollNext\n }\n },\n [h(\'i\', { \'class\': \'el-icon-arrow-right\' })]\n )] : null;\n\n var tabs = this._l(panes, function (pane, index) {\n var _ref;\n\n var tabName = pane.name || pane.index || index;\n var closable = pane.isClosable || editable;\n\n pane.index = \'\' + index;\n\n var btnClose = closable ? h(\'span\', { \'class\': \'el-icon-close\', on: {\n \'click\': function click(ev) {\n onTabRemove(pane, ev);\n }\n }\n }) : null;\n\n var tabLabelContent = pane.$slots.label || pane.label;\n var tabindex = pane.active ? 0 : -1;\n return h(\n \'div\',\n {\n \'class\': (_ref = {\n \'el-tabs__item\': true\n }, _ref[\'is-\' + _this3.rootTabs.tabPosition] = true, _ref[\'is-active\'] = pane.active, _ref[\'is-disabled\'] = pane.disabled, _ref[\'is-closable\'] = closable, _ref[\'is-focus\'] = _this3.isFocus, _ref),\n attrs: { id: \'tab-\' + tabName,\n\n \'aria-controls\': \'pane-\' + tabName,\n role: \'tab\',\n \'aria-selected\': pane.active,\n\n tabindex: tabindex\n },\n key: \'tab-\' + tabName, ref: \'tabs\', refInFor: true,\n on: {\n \'focus\': function focus() {\n setFocus();\n },\n \'blur\': function blur() {\n removeFocus();\n },\n \'click\': function click(ev) {\n removeFocus();onTabClick(pane, tabName, ev);\n },\n \'keydown\': function keydown(ev) {\n if (closable && (ev.keyCode === 46 || ev.keyCode === 8)) {\n onTabRemove(pane, ev);\n }\n }\n }\n },\n [tabLabelContent, btnClose]\n );\n });\n return h(\n \'div\',\n { \'class\': [\'el-tabs__nav-wrap\', scrollable ? \'is-scrollable\' : \'\', \'is-\' + this.rootTabs.tabPosition] },\n [scrollBtn, h(\n \'div\',\n { \'class\': [\'el-tabs__nav-scroll\'], ref: \'navScroll\' },\n [h(\n \'div\',\n {\n \'class\': [\'el-tabs__nav\', \'is-\' + this.rootTabs.tabPosition, stretch && [\'top\', \'bottom\'].indexOf(this.rootTabs.tabPosition) !== -1 ? \'is-stretch\' : \'\'],\n ref: \'nav\',\n style: navStyle,\n attrs: { role: \'tablist\'\n },\n on: {\n \'keydown\': changeTab\n }\n },\n [!type ? h(\'tab-bar\', {\n attrs: { tabs: panes }\n }) : null, tabs]\n )]\n )]\n );\n },\n mounted: function mounted() {\n var _this4 = this;\n\n Object(resize_event_["addResizeListener"])(this.$el, this.update);\n document.addEventListener(\'visibilitychange\', this.visibilityChangeHandler);\n window.addEventListener(\'blur\', this.windowBlurHandler);\n window.addEventListener(\'focus\', this.windowFocusHandler);\n setTimeout(function () {\n _this4.scrollToActiveTab();\n }, 0);\n },\n beforeDestroy: function beforeDestroy() {\n if (this.$el && this.update) Object(resize_event_["removeResizeListener"])(this.$el, this.update);\n document.removeEventListener(\'visibilitychange\', this.visibilityChangeHandler);\n window.removeEventListener(\'blur\', this.windowBlurHandler);\n window.removeEventListener(\'focus\', this.windowFocusHandler);\n }\n});\n// CONCATENATED MODULE: ./packages/tabs/src/tab-nav.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_tab_navvue_type_script_lang_js_ = (tab_navvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/tabs/src/tab-nav.vue\nvar tab_nav_render, tab_nav_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar tab_nav_component = normalizeComponent(\n src_tab_navvue_type_script_lang_js_,\n tab_nav_render,\n tab_nav_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var tab_nav_api; }\ntab_nav_component.options.__file = "packages/tabs/src/tab-nav.vue"\n/* harmony default export */ var tab_nav = (tab_nav_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/tabs/src/tabs.vue?vue&type=script&lang=js&\n\n\n\n/* harmony default export */ var tabsvue_type_script_lang_js_ = ({\n name: \'ElTabs\',\n\n components: {\n TabNav: tab_nav\n },\n\n props: {\n type: String,\n activeName: String,\n closable: Boolean,\n addable: Boolean,\n value: {},\n editable: Boolean,\n tabPosition: {\n type: String,\n default: \'top\'\n },\n beforeLeave: Function,\n stretch: Boolean\n },\n\n provide: function provide() {\n return {\n rootTabs: this\n };\n },\n data: function data() {\n return {\n currentName: this.value || this.activeName,\n panes: []\n };\n },\n\n\n watch: {\n activeName: function activeName(value) {\n this.setCurrentName(value);\n },\n value: function value(_value) {\n this.setCurrentName(_value);\n },\n currentName: function currentName(value) {\n var _this = this;\n\n if (this.$refs.nav) {\n this.$nextTick(function () {\n _this.$refs.nav.$nextTick(function (_) {\n _this.$refs.nav.scrollToActiveTab();\n });\n });\n }\n }\n },\n\n methods: {\n calcPaneInstances: function calcPaneInstances() {\n var _this2 = this;\n\n var isForceUpdate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (this.$slots.default) {\n var paneSlots = this.$slots.default.filter(function (vnode) {\n return vnode.tag && vnode.componentOptions && vnode.componentOptions.Ctor.options.name === \'ElTabPane\';\n });\n // update indeed\n var panes = paneSlots.map(function (_ref) {\n var componentInstance = _ref.componentInstance;\n return componentInstance;\n });\n var panesChanged = !(panes.length === this.panes.length && panes.every(function (pane, index) {\n return pane === _this2.panes[index];\n }));\n if (isForceUpdate || panesChanged) {\n this.panes = panes;\n }\n } else if (this.panes.length !== 0) {\n this.panes = [];\n }\n },\n handleTabClick: function handleTabClick(tab, tabName, event) {\n if (tab.disabled) return;\n this.setCurrentName(tabName);\n this.$emit(\'tab-click\', tab, event);\n },\n handleTabRemove: function handleTabRemove(pane, ev) {\n if (pane.disabled) return;\n ev.stopPropagation();\n this.$emit(\'edit\', pane.name, \'remove\');\n this.$emit(\'tab-remove\', pane.name);\n },\n handleTabAdd: function handleTabAdd() {\n this.$emit(\'edit\', null, \'add\');\n this.$emit(\'tab-add\');\n },\n setCurrentName: function setCurrentName(value) {\n var _this3 = this;\n\n var changeCurrentName = function changeCurrentName() {\n _this3.currentName = value;\n _this3.$emit(\'input\', value);\n };\n if (this.currentName !== value && this.beforeLeave) {\n var before = this.beforeLeave(value, this.currentName);\n if (before && before.then) {\n before.then(function () {\n changeCurrentName();\n _this3.$refs.nav && _this3.$refs.nav.removeFocus();\n }, function () {\n // https://github.com/ElemeFE/element/pull/14816\n // ignore promise rejection in `before-leave` hook\n });\n } else if (before !== false) {\n changeCurrentName();\n }\n } else {\n changeCurrentName();\n }\n }\n },\n\n render: function render(h) {\n var _ref2;\n\n var type = this.type,\n handleTabClick = this.handleTabClick,\n handleTabRemove = this.handleTabRemove,\n handleTabAdd = this.handleTabAdd,\n currentName = this.currentName,\n panes = this.panes,\n editable = this.editable,\n addable = this.addable,\n tabPosition = this.tabPosition,\n stretch = this.stretch;\n\n\n var newButton = editable || addable ? h(\n \'span\',\n {\n \'class\': \'el-tabs__new-tab\',\n on: {\n \'click\': handleTabAdd,\n \'keydown\': function keydown(ev) {\n if (ev.keyCode === 13) {\n handleTabAdd();\n }\n }\n },\n attrs: {\n tabindex: \'0\'\n }\n },\n [h(\'i\', { \'class\': \'el-icon-plus\' })]\n ) : null;\n\n var navData = {\n props: {\n currentName: currentName,\n onTabClick: handleTabClick,\n onTabRemove: handleTabRemove,\n editable: editable,\n type: type,\n panes: panes,\n stretch: stretch\n },\n ref: \'nav\'\n };\n var header = h(\n \'div\',\n { \'class\': [\'el-tabs__header\', \'is-\' + tabPosition] },\n [newButton, h(\'tab-nav\', navData)]\n );\n var panels = h(\n \'div\',\n { \'class\': \'el-tabs__content\' },\n [this.$slots.default]\n );\n\n return h(\n \'div\',\n { \'class\': (_ref2 = {\n \'el-tabs\': true,\n \'el-tabs--card\': type === \'card\'\n }, _ref2[\'el-tabs--\' + tabPosition] = true, _ref2[\'el-tabs--border-card\'] = type === \'border-card\', _ref2) },\n [tabPosition !== \'bottom\' ? [header, panels] : [panels, header]]\n );\n },\n created: function created() {\n if (!this.currentName) {\n this.setCurrentName(\'0\');\n }\n\n this.$on(\'tab-nav-update\', this.calcPaneInstances.bind(null, true));\n },\n mounted: function mounted() {\n this.calcPaneInstances();\n },\n updated: function updated() {\n this.calcPaneInstances();\n }\n});\n// CONCATENATED MODULE: ./packages/tabs/src/tabs.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_tabsvue_type_script_lang_js_ = (tabsvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/tabs/src/tabs.vue\nvar tabs_render, tabs_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar tabs_component = normalizeComponent(\n src_tabsvue_type_script_lang_js_,\n tabs_render,\n tabs_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var tabs_api; }\ntabs_component.options.__file = "packages/tabs/src/tabs.vue"\n/* harmony default export */ var tabs = (tabs_component.exports);\n// CONCATENATED MODULE: ./packages/tabs/index.js\n\n\n/* istanbul ignore next */\ntabs.install = function (Vue) {\n Vue.component(tabs.name, tabs);\n};\n\n/* harmony default export */ var packages_tabs = (tabs);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/tabs/src/tab-pane.vue?vue&type=template&id=9145a070&\nvar tab_panevue_type_template_id_9145a070_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return !_vm.lazy || _vm.loaded || _vm.active\n ? _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.active,\n expression: "active"\n }\n ],\n staticClass: "el-tab-pane",\n attrs: {\n role: "tabpanel",\n "aria-hidden": !_vm.active,\n id: "pane-" + _vm.paneName,\n "aria-labelledby": "tab-" + _vm.paneName\n }\n },\n [_vm._t("default")],\n 2\n )\n : _vm._e()\n}\nvar tab_panevue_type_template_id_9145a070_staticRenderFns = []\ntab_panevue_type_template_id_9145a070_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/tabs/src/tab-pane.vue?vue&type=template&id=9145a070&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/tabs/src/tab-pane.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var tab_panevue_type_script_lang_js_ = ({\n name: \'ElTabPane\',\n\n componentName: \'ElTabPane\',\n\n props: {\n label: String,\n labelContent: Function,\n name: String,\n closable: Boolean,\n disabled: Boolean,\n lazy: Boolean\n },\n\n data: function data() {\n return {\n index: null,\n loaded: false\n };\n },\n\n\n computed: {\n isClosable: function isClosable() {\n return this.closable || this.$parent.closable;\n },\n active: function active() {\n var active = this.$parent.currentName === (this.name || this.index);\n if (active) {\n this.loaded = true;\n }\n return active;\n },\n paneName: function paneName() {\n return this.name || this.index;\n }\n },\n\n updated: function updated() {\n this.$parent.$emit(\'tab-nav-update\');\n }\n});\n// CONCATENATED MODULE: ./packages/tabs/src/tab-pane.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_tab_panevue_type_script_lang_js_ = (tab_panevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/tabs/src/tab-pane.vue\n\n\n\n\n\n/* normalize component */\n\nvar tab_pane_component = normalizeComponent(\n src_tab_panevue_type_script_lang_js_,\n tab_panevue_type_template_id_9145a070_render,\n tab_panevue_type_template_id_9145a070_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var tab_pane_api; }\ntab_pane_component.options.__file = "packages/tabs/src/tab-pane.vue"\n/* harmony default export */ var tab_pane = (tab_pane_component.exports);\n// CONCATENATED MODULE: ./packages/tab-pane/index.js\n\n\n/* istanbul ignore next */\ntab_pane.install = function (Vue) {\n Vue.component(tab_pane.name, tab_pane);\n};\n\n/* harmony default export */ var packages_tab_pane = (tab_pane);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/tag/src/tag.vue?vue&type=script&lang=js&\n\n/* harmony default export */ var tagvue_type_script_lang_js_ = ({\n name: \'ElTag\',\n props: {\n text: String,\n closable: Boolean,\n type: String,\n hit: Boolean,\n disableTransitions: Boolean,\n color: String,\n size: String,\n effect: {\n type: String,\n default: \'light\',\n validator: function validator(val) {\n return [\'dark\', \'light\', \'plain\'].indexOf(val) !== -1;\n }\n }\n },\n methods: {\n handleClose: function handleClose(event) {\n event.stopPropagation();\n this.$emit(\'close\', event);\n },\n handleClick: function handleClick(event) {\n this.$emit(\'click\', event);\n }\n },\n computed: {\n tagSize: function tagSize() {\n return this.size || (this.$ELEMENT || {}).size;\n }\n },\n render: function render(h) {\n var type = this.type,\n tagSize = this.tagSize,\n hit = this.hit,\n effect = this.effect;\n\n var classes = [\'el-tag\', type ? \'el-tag--\' + type : \'\', tagSize ? \'el-tag--\' + tagSize : \'\', effect ? \'el-tag--\' + effect : \'\', hit && \'is-hit\'];\n var tagEl = h(\n \'span\',\n {\n \'class\': classes,\n style: { backgroundColor: this.color },\n on: {\n \'click\': this.handleClick\n }\n },\n [this.$slots.default, this.closable && h(\'i\', { \'class\': \'el-tag__close el-icon-close\', on: {\n \'click\': this.handleClose\n }\n })]\n );\n\n return this.disableTransitions ? tagEl : h(\n \'transition\',\n {\n attrs: { name: \'el-zoom-in-center\' }\n },\n [tagEl]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/tag/src/tag.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_tagvue_type_script_lang_js_ = (tagvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/tag/src/tag.vue\nvar tag_render, tag_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar tag_component = normalizeComponent(\n src_tagvue_type_script_lang_js_,\n tag_render,\n tag_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var tag_api; }\ntag_component.options.__file = "packages/tag/src/tag.vue"\n/* harmony default export */ var src_tag = (tag_component.exports);\n// CONCATENATED MODULE: ./packages/tag/index.js\n\n\n/* istanbul ignore next */\nsrc_tag.install = function (Vue) {\n Vue.component(src_tag.name, src_tag);\n};\n\n/* harmony default export */ var packages_tag = (src_tag);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/tree/src/tree.vue?vue&type=template&id=547575a6&\nvar treevue_type_template_id_547575a6_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 staticClass: "el-tree",\n class: {\n "el-tree--highlight-current": _vm.highlightCurrent,\n "is-dragging": !!_vm.dragState.draggingNode,\n "is-drop-not-allow": !_vm.dragState.allowDrop,\n "is-drop-inner": _vm.dragState.dropType === "inner"\n },\n attrs: { role: "tree" }\n },\n [\n _vm._l(_vm.root.childNodes, function(child) {\n return _c("el-tree-node", {\n key: _vm.getNodeKey(child),\n attrs: {\n node: child,\n props: _vm.props,\n "render-after-expand": _vm.renderAfterExpand,\n "show-checkbox": _vm.showCheckbox,\n "render-content": _vm.renderContent\n },\n on: { "node-expand": _vm.handleNodeExpand }\n })\n }),\n _vm.isEmpty\n ? _c("div", { staticClass: "el-tree__empty-block" }, [\n _c("span", { staticClass: "el-tree__empty-text" }, [\n _vm._v(_vm._s(_vm.emptyText))\n ])\n ])\n : _vm._e(),\n _c("div", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.dragState.showDropIndicator,\n expression: "dragState.showDropIndicator"\n }\n ],\n ref: "dropIndicator",\n staticClass: "el-tree__drop-indicator"\n })\n ],\n 2\n )\n}\nvar treevue_type_template_id_547575a6_staticRenderFns = []\ntreevue_type_template_id_547575a6_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/tree/src/tree.vue?vue&type=template&id=547575a6&\n\n// CONCATENATED MODULE: ./packages/tree/src/model/util.js\nvar NODE_KEY = \'$treeNodeId\';\n\nvar markNodeData = function markNodeData(node, data) {\n if (!data || data[NODE_KEY]) return;\n Object.defineProperty(data, NODE_KEY, {\n value: node.id,\n enumerable: false,\n configurable: false,\n writable: false\n });\n};\n\nvar util_getNodeKey = function getNodeKey(key, data) {\n if (!key) return data[NODE_KEY];\n return data[key];\n};\n\nvar findNearestComponent = function findNearestComponent(element, componentName) {\n var target = element;\n while (target && target.tagName !== \'BODY\') {\n if (target.__vue__ && target.__vue__.$options.name === componentName) {\n return target.__vue__;\n }\n target = target.parentNode;\n }\n return null;\n};\n// CONCATENATED MODULE: ./packages/tree/src/model/node.js\nvar _createClass = function () { function 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction node_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n\n\n\n\nvar getChildState = function getChildState(node) {\n var all = true;\n var none = true;\n var allWithoutDisable = true;\n for (var i = 0, j = node.length; i < j; i++) {\n var n = node[i];\n if (n.checked !== true || n.indeterminate) {\n all = false;\n if (!n.disabled) {\n allWithoutDisable = false;\n }\n }\n if (n.checked !== false || n.indeterminate) {\n none = false;\n }\n }\n\n return { all: all, none: none, allWithoutDisable: allWithoutDisable, half: !all && !none };\n};\n\nvar reInitChecked = function reInitChecked(node) {\n if (node.childNodes.length === 0 || node.loading) return;\n\n var _getChildState = getChildState(node.childNodes),\n all = _getChildState.all,\n none = _getChildState.none,\n half = _getChildState.half;\n\n if (all) {\n node.checked = true;\n node.indeterminate = false;\n } else if (half) {\n node.checked = false;\n node.indeterminate = true;\n } else if (none) {\n node.checked = false;\n node.indeterminate = false;\n }\n\n var parent = node.parent;\n if (!parent || parent.level === 0) return;\n\n if (!node.store.checkStrictly) {\n reInitChecked(parent);\n }\n};\n\nvar getPropertyFromData = function getPropertyFromData(node, prop) {\n var props = node.store.props;\n var data = node.data || {};\n var config = props[prop];\n\n if (typeof config === \'function\') {\n return config(data, node);\n } else if (typeof config === \'string\') {\n return data[config];\n } else if (typeof config === \'undefined\') {\n var dataProp = data[prop];\n return dataProp === undefined ? \'\' : dataProp;\n }\n};\n\nvar nodeIdSeed = 0;\n\nvar node_Node = function () {\n function Node(options) {\n node_classCallCheck(this, Node);\n\n this.id = nodeIdSeed++;\n this.text = null;\n this.checked = false;\n this.indeterminate = false;\n this.data = null;\n this.expanded = false;\n this.parent = null;\n this.visible = true;\n this.isCurrent = false;\n\n for (var name in options) {\n if (options.hasOwnProperty(name)) {\n this[name] = options[name];\n }\n }\n\n // internal\n this.level = 0;\n this.loaded = false;\n this.childNodes = [];\n this.loading = false;\n\n if (this.parent) {\n this.level = this.parent.level + 1;\n }\n\n var store = this.store;\n if (!store) {\n throw new Error(\'[Node]store is required!\');\n }\n store.registerNode(this);\n\n var props = store.props;\n if (props && typeof props.isLeaf !== \'undefined\') {\n var isLeaf = getPropertyFromData(this, \'isLeaf\');\n if (typeof isLeaf === \'boolean\') {\n this.isLeafByUser = isLeaf;\n }\n }\n\n if (store.lazy !== true && this.data) {\n this.setData(this.data);\n\n if (store.defaultExpandAll) {\n this.expanded = true;\n }\n } else if (this.level > 0 && store.lazy && store.defaultExpandAll) {\n this.expand();\n }\n if (!Array.isArray(this.data)) {\n markNodeData(this, this.data);\n }\n if (!this.data) return;\n var defaultExpandedKeys = store.defaultExpandedKeys;\n var key = store.key;\n if (key && defaultExpandedKeys && defaultExpandedKeys.indexOf(this.key) !== -1) {\n this.expand(null, store.autoExpandParent);\n }\n\n if (key && store.currentNodeKey !== undefined && this.key === store.currentNodeKey) {\n store.currentNode = this;\n store.currentNode.isCurrent = true;\n }\n\n if (store.lazy) {\n store._initDefaultCheckedNode(this);\n }\n\n this.updateLeafState();\n }\n\n Node.prototype.setData = function setData(data) {\n if (!Array.isArray(data)) {\n markNodeData(this, data);\n }\n\n this.data = data;\n this.childNodes = [];\n\n var children = void 0;\n if (this.level === 0 && this.data instanceof Array) {\n children = this.data;\n } else {\n children = getPropertyFromData(this, \'children\') || [];\n }\n\n for (var i = 0, j = children.length; i < j; i++) {\n this.insertChild({ data: children[i] });\n }\n };\n\n Node.prototype.contains = function contains(target) {\n var deep = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var walk = function walk(parent) {\n var children = parent.childNodes || [];\n var result = false;\n for (var i = 0, j = children.length; i < j; i++) {\n var child = children[i];\n if (child === target || deep && walk(child)) {\n result = true;\n break;\n }\n }\n return result;\n };\n\n return walk(this);\n };\n\n Node.prototype.remove = function remove() {\n var parent = this.parent;\n if (parent) {\n parent.removeChild(this);\n }\n };\n\n Node.prototype.insertChild = function insertChild(child, index, batch) {\n if (!child) throw new Error(\'insertChild error: child is required.\');\n\n if (!(child instanceof Node)) {\n if (!batch) {\n var children = this.getChildren(true) || [];\n if (children.indexOf(child.data) === -1) {\n if (typeof index === \'undefined\' || index < 0) {\n children.push(child.data);\n } else {\n children.splice(index, 0, child.data);\n }\n }\n }\n merge_default()(child, {\n parent: this,\n store: this.store\n });\n child = new Node(child);\n }\n\n child.level = this.level + 1;\n\n if (typeof index === \'undefined\' || index < 0) {\n this.childNodes.push(child);\n } else {\n this.childNodes.splice(index, 0, child);\n }\n\n this.updateLeafState();\n };\n\n Node.prototype.insertBefore = function insertBefore(child, ref) {\n var index = void 0;\n if (ref) {\n index = this.childNodes.indexOf(ref);\n }\n this.insertChild(child, index);\n };\n\n Node.prototype.insertAfter = function insertAfter(child, ref) {\n var index = void 0;\n if (ref) {\n index = this.childNodes.indexOf(ref);\n if (index !== -1) index += 1;\n }\n this.insertChild(child, index);\n };\n\n Node.prototype.removeChild = function removeChild(child) {\n var children = this.getChildren() || [];\n var dataIndex = children.indexOf(child.data);\n if (dataIndex > -1) {\n children.splice(dataIndex, 1);\n }\n\n var index = this.childNodes.indexOf(child);\n\n if (index > -1) {\n this.store && this.store.deregisterNode(child);\n child.parent = null;\n this.childNodes.splice(index, 1);\n }\n\n this.updateLeafState();\n };\n\n Node.prototype.removeChildByData = function removeChildByData(data) {\n var targetNode = null;\n\n for (var i = 0; i < this.childNodes.length; i++) {\n if (this.childNodes[i].data === data) {\n targetNode = this.childNodes[i];\n break;\n }\n }\n\n if (targetNode) {\n this.removeChild(targetNode);\n }\n };\n\n Node.prototype.expand = function expand(callback, expandParent) {\n var _this = this;\n\n var done = function done() {\n if (expandParent) {\n var parent = _this.parent;\n while (parent.level > 0) {\n parent.expanded = true;\n parent = parent.parent;\n }\n }\n _this.expanded = true;\n if (callback) callback();\n };\n\n if (this.shouldLoadData()) {\n this.loadData(function (data) {\n if (data instanceof Array) {\n if (_this.checked) {\n _this.setChecked(true, true);\n } else if (!_this.store.checkStrictly) {\n reInitChecked(_this);\n }\n done();\n }\n });\n } else {\n done();\n }\n };\n\n Node.prototype.doCreateChildren = function doCreateChildren(array) {\n var _this2 = this;\n\n var defaultProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n array.forEach(function (item) {\n _this2.insertChild(merge_default()({ data: item }, defaultProps), undefined, true);\n });\n };\n\n Node.prototype.collapse = function collapse() {\n this.expanded = false;\n };\n\n Node.prototype.shouldLoadData = function shouldLoadData() {\n return this.store.lazy === true && this.store.load && !this.loaded;\n };\n\n Node.prototype.updateLeafState = function updateLeafState() {\n if (this.store.lazy === true && this.loaded !== true && typeof this.isLeafByUser !== \'undefined\') {\n this.isLeaf = this.isLeafByUser;\n return;\n }\n var childNodes = this.childNodes;\n if (!this.store.lazy || this.store.lazy === true && this.loaded === true) {\n this.isLeaf = !childNodes || childNodes.length === 0;\n return;\n }\n this.isLeaf = false;\n };\n\n Node.prototype.setChecked = function setChecked(value, deep, recursion, passValue) {\n var _this3 = this;\n\n this.indeterminate = value === \'half\';\n this.checked = value === true;\n\n if (this.store.checkStrictly) return;\n\n if (!(this.shouldLoadData() && !this.store.checkDescendants)) {\n var _getChildState2 = getChildState(this.childNodes),\n all = _getChildState2.all,\n allWithoutDisable = _getChildState2.allWithoutDisable;\n\n if (!this.isLeaf && !all && allWithoutDisable) {\n this.checked = false;\n value = false;\n }\n\n var handleDescendants = function handleDescendants() {\n if (deep) {\n var childNodes = _this3.childNodes;\n for (var i = 0, j = childNodes.length; i < j; i++) {\n var child = childNodes[i];\n passValue = passValue || value !== false;\n var isCheck = child.disabled ? child.checked : passValue;\n child.setChecked(isCheck, deep, true, passValue);\n }\n\n var _getChildState3 = getChildState(childNodes),\n half = _getChildState3.half,\n _all = _getChildState3.all;\n\n if (!_all) {\n _this3.checked = _all;\n _this3.indeterminate = half;\n }\n }\n };\n\n if (this.shouldLoadData()) {\n // Only work on lazy load data.\n this.loadData(function () {\n handleDescendants();\n reInitChecked(_this3);\n }, {\n checked: value !== false\n });\n return;\n } else {\n handleDescendants();\n }\n }\n\n var parent = this.parent;\n if (!parent || parent.level === 0) return;\n\n if (!recursion) {\n reInitChecked(parent);\n }\n };\n\n Node.prototype.getChildren = function getChildren() {\n var forceInit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // this is data\n if (this.level === 0) return this.data;\n var data = this.data;\n if (!data) return null;\n\n var props = this.store.props;\n var children = \'children\';\n if (props) {\n children = props.children || \'children\';\n }\n\n if (data[children] === undefined) {\n data[children] = null;\n }\n\n if (forceInit && !data[children]) {\n data[children] = [];\n }\n\n return data[children];\n };\n\n Node.prototype.updateChildren = function updateChildren() {\n var _this4 = this;\n\n var newData = this.getChildren() || [];\n var oldData = this.childNodes.map(function (node) {\n return node.data;\n });\n\n var newDataMap = {};\n var newNodes = [];\n\n newData.forEach(function (item, index) {\n var key = item[NODE_KEY];\n var isNodeExists = !!key && Object(util_["arrayFindIndex"])(oldData, function (data) {\n return data[NODE_KEY] === key;\n }) >= 0;\n if (isNodeExists) {\n newDataMap[key] = { index: index, data: item };\n } else {\n newNodes.push({ index: index, data: item });\n }\n });\n\n if (!this.store.lazy) {\n oldData.forEach(function (item) {\n if (!newDataMap[item[NODE_KEY]]) _this4.removeChildByData(item);\n });\n }\n\n newNodes.forEach(function (_ref) {\n var index = _ref.index,\n data = _ref.data;\n\n _this4.insertChild({ data: data }, index);\n });\n\n this.updateLeafState();\n };\n\n Node.prototype.loadData = function loadData(callback) {\n var _this5 = this;\n\n var defaultProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (this.store.lazy === true && this.store.load && !this.loaded && (!this.loading || Object.keys(defaultProps).length)) {\n this.loading = true;\n\n var resolve = function resolve(children) {\n _this5.childNodes = [];\n\n _this5.doCreateChildren(children, defaultProps);\n _this5.loaded = true;\n _this5.loading = false;\n _this5.updateLeafState();\n if (callback) {\n callback.call(_this5, children);\n }\n };\n\n this.store.load(this, resolve);\n } else {\n if (callback) {\n callback.call(this);\n }\n }\n };\n\n _createClass(Node, [{\n key: \'label\',\n get: function get() {\n return getPropertyFromData(this, \'label\');\n }\n }, {\n key: \'key\',\n get: function get() {\n var nodeKey = this.store.key;\n if (this.data) return this.data[nodeKey];\n return null;\n }\n }, {\n key: \'disabled\',\n get: function get() {\n return getPropertyFromData(this, \'disabled\');\n }\n }, {\n key: \'nextSibling\',\n get: function get() {\n var parent = this.parent;\n if (parent) {\n var index = parent.childNodes.indexOf(this);\n if (index > -1) {\n return parent.childNodes[index + 1];\n }\n }\n return null;\n }\n }, {\n key: \'previousSibling\',\n get: function get() {\n var parent = this.parent;\n if (parent) {\n var index = parent.childNodes.indexOf(this);\n if (index > -1) {\n return index > 0 ? parent.childNodes[index - 1] : null;\n }\n }\n return null;\n }\n }]);\n\n return Node;\n}();\n\n/* harmony default export */ var model_node = (node_Node);\n// CONCATENATED MODULE: ./packages/tree/src/model/tree-store.js\nvar tree_store_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\nfunction tree_store_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n\n\n\nvar tree_store_TreeStore = function () {\n function TreeStore(options) {\n var _this = this;\n\n tree_store_classCallCheck(this, TreeStore);\n\n this.currentNode = null;\n this.currentNodeKey = null;\n\n for (var option in options) {\n if (options.hasOwnProperty(option)) {\n this[option] = options[option];\n }\n }\n\n this.nodesMap = {};\n\n this.root = new model_node({\n data: this.data,\n store: this\n });\n\n if (this.lazy && this.load) {\n var loadFn = this.load;\n loadFn(this.root, function (data) {\n _this.root.doCreateChildren(data);\n _this._initDefaultCheckedNodes();\n });\n } else {\n this._initDefaultCheckedNodes();\n }\n }\n\n TreeStore.prototype.filter = function filter(value) {\n var filterNodeMethod = this.filterNodeMethod;\n var lazy = this.lazy;\n var traverse = function traverse(node) {\n var childNodes = node.root ? node.root.childNodes : node.childNodes;\n\n childNodes.forEach(function (child) {\n child.visible = filterNodeMethod.call(child, value, child.data, child);\n\n traverse(child);\n });\n\n if (!node.visible && childNodes.length) {\n var allHidden = true;\n allHidden = !childNodes.some(function (child) {\n return child.visible;\n });\n\n if (node.root) {\n node.root.visible = allHidden === false;\n } else {\n node.visible = allHidden === false;\n }\n }\n if (!value) return;\n\n if (node.visible && !node.isLeaf && !lazy) node.expand();\n };\n\n traverse(this);\n };\n\n TreeStore.prototype.setData = function setData(newVal) {\n var instanceChanged = newVal !== this.root.data;\n if (instanceChanged) {\n this.root.setData(newVal);\n this._initDefaultCheckedNodes();\n } else {\n this.root.updateChildren();\n }\n };\n\n TreeStore.prototype.getNode = function getNode(data) {\n if (data instanceof model_node) return data;\n var key = (typeof data === \'undefined\' ? \'undefined\' : tree_store_typeof(data)) !== \'object\' ? data : util_getNodeKey(this.key, data);\n return this.nodesMap[key] || null;\n };\n\n TreeStore.prototype.insertBefore = function insertBefore(data, refData) {\n var refNode = this.getNode(refData);\n refNode.parent.insertBefore({ data: data }, refNode);\n };\n\n TreeStore.prototype.insertAfter = function insertAfter(data, refData) {\n var refNode = this.getNode(refData);\n refNode.parent.insertAfter({ data: data }, refNode);\n };\n\n TreeStore.prototype.remove = function remove(data) {\n var node = this.getNode(data);\n\n if (node && node.parent) {\n if (node === this.currentNode) {\n this.currentNode = null;\n }\n node.parent.removeChild(node);\n }\n };\n\n TreeStore.prototype.append = function append(data, parentData) {\n var parentNode = parentData ? this.getNode(parentData) : this.root;\n\n if (parentNode) {\n parentNode.insertChild({ data: data });\n }\n };\n\n TreeStore.prototype._initDefaultCheckedNodes = function _initDefaultCheckedNodes() {\n var _this2 = this;\n\n var defaultCheckedKeys = this.defaultCheckedKeys || [];\n var nodesMap = this.nodesMap;\n\n defaultCheckedKeys.forEach(function (checkedKey) {\n var node = nodesMap[checkedKey];\n\n if (node) {\n node.setChecked(true, !_this2.checkStrictly);\n }\n });\n };\n\n TreeStore.prototype._initDefaultCheckedNode = function _initDefaultCheckedNode(node) {\n var defaultCheckedKeys = this.defaultCheckedKeys || [];\n\n if (defaultCheckedKeys.indexOf(node.key) !== -1) {\n node.setChecked(true, !this.checkStrictly);\n }\n };\n\n TreeStore.prototype.setDefaultCheckedKey = function setDefaultCheckedKey(newVal) {\n if (newVal !== this.defaultCheckedKeys) {\n this.defaultCheckedKeys = newVal;\n this._initDefaultCheckedNodes();\n }\n };\n\n TreeStore.prototype.registerNode = function registerNode(node) {\n var key = this.key;\n if (!key || !node || !node.data) return;\n\n var nodeKey = node.key;\n if (nodeKey !== undefined) this.nodesMap[node.key] = node;\n };\n\n TreeStore.prototype.deregisterNode = function deregisterNode(node) {\n var _this3 = this;\n\n var key = this.key;\n if (!key || !node || !node.data) return;\n\n node.childNodes.forEach(function (child) {\n _this3.deregisterNode(child);\n });\n\n delete this.nodesMap[node.key];\n };\n\n TreeStore.prototype.getCheckedNodes = function getCheckedNodes() {\n var leafOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var includeHalfChecked = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var checkedNodes = [];\n var traverse = function traverse(node) {\n var childNodes = node.root ? node.root.childNodes : node.childNodes;\n\n childNodes.forEach(function (child) {\n if ((child.checked || includeHalfChecked && child.indeterminate) && (!leafOnly || leafOnly && child.isLeaf)) {\n checkedNodes.push(child.data);\n }\n\n traverse(child);\n });\n };\n\n traverse(this);\n\n return checkedNodes;\n };\n\n TreeStore.prototype.getCheckedKeys = function getCheckedKeys() {\n var _this4 = this;\n\n var leafOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n return this.getCheckedNodes(leafOnly).map(function (data) {\n return (data || {})[_this4.key];\n });\n };\n\n TreeStore.prototype.getHalfCheckedNodes = function getHalfCheckedNodes() {\n var nodes = [];\n var traverse = function traverse(node) {\n var childNodes = node.root ? node.root.childNodes : node.childNodes;\n\n childNodes.forEach(function (child) {\n if (child.indeterminate) {\n nodes.push(child.data);\n }\n\n traverse(child);\n });\n };\n\n traverse(this);\n\n return nodes;\n };\n\n TreeStore.prototype.getHalfCheckedKeys = function getHalfCheckedKeys() {\n var _this5 = this;\n\n return this.getHalfCheckedNodes().map(function (data) {\n return (data || {})[_this5.key];\n });\n };\n\n TreeStore.prototype._getAllNodes = function _getAllNodes() {\n var allNodes = [];\n var nodesMap = this.nodesMap;\n for (var nodeKey in nodesMap) {\n if (nodesMap.hasOwnProperty(nodeKey)) {\n allNodes.push(nodesMap[nodeKey]);\n }\n }\n\n return allNodes;\n };\n\n TreeStore.prototype.updateChildren = function updateChildren(key, data) {\n var node = this.nodesMap[key];\n if (!node) return;\n var childNodes = node.childNodes;\n for (var i = childNodes.length - 1; i >= 0; i--) {\n var child = childNodes[i];\n this.remove(child.data);\n }\n for (var _i = 0, j = data.length; _i < j; _i++) {\n var _child = data[_i];\n this.append(_child, node.data);\n }\n };\n\n TreeStore.prototype._setCheckedKeys = function _setCheckedKeys(key) {\n var leafOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var checkedKeys = arguments[2];\n\n var allNodes = this._getAllNodes().sort(function (a, b) {\n return b.level - a.level;\n });\n var cache = Object.create(null);\n var keys = Object.keys(checkedKeys);\n allNodes.forEach(function (node) {\n return node.setChecked(false, false);\n });\n for (var i = 0, j = allNodes.length; i < j; i++) {\n var node = allNodes[i];\n var nodeKey = node.data[key].toString();\n var checked = keys.indexOf(nodeKey) > -1;\n if (!checked) {\n if (node.checked && !cache[nodeKey]) {\n node.setChecked(false, false);\n }\n continue;\n }\n\n var parent = node.parent;\n while (parent && parent.level > 0) {\n cache[parent.data[key]] = true;\n parent = parent.parent;\n }\n\n if (node.isLeaf || this.checkStrictly) {\n node.setChecked(true, false);\n continue;\n }\n node.setChecked(true, true);\n\n if (leafOnly) {\n (function () {\n node.setChecked(false, false);\n var traverse = function traverse(node) {\n var childNodes = node.childNodes;\n childNodes.forEach(function (child) {\n if (!child.isLeaf) {\n child.setChecked(false, false);\n }\n traverse(child);\n });\n };\n traverse(node);\n })();\n }\n }\n };\n\n TreeStore.prototype.setCheckedNodes = function setCheckedNodes(array) {\n var leafOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var key = this.key;\n var checkedKeys = {};\n array.forEach(function (item) {\n checkedKeys[(item || {})[key]] = true;\n });\n\n this._setCheckedKeys(key, leafOnly, checkedKeys);\n };\n\n TreeStore.prototype.setCheckedKeys = function setCheckedKeys(keys) {\n var leafOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n this.defaultCheckedKeys = keys;\n var key = this.key;\n var checkedKeys = {};\n keys.forEach(function (key) {\n checkedKeys[key] = true;\n });\n\n this._setCheckedKeys(key, leafOnly, checkedKeys);\n };\n\n TreeStore.prototype.setDefaultExpandedKeys = function setDefaultExpandedKeys(keys) {\n var _this6 = this;\n\n keys = keys || [];\n this.defaultExpandedKeys = keys;\n\n keys.forEach(function (key) {\n var node = _this6.getNode(key);\n if (node) node.expand(null, _this6.autoExpandParent);\n });\n };\n\n TreeStore.prototype.setChecked = function setChecked(data, checked, deep) {\n var node = this.getNode(data);\n\n if (node) {\n node.setChecked(!!checked, deep);\n }\n };\n\n TreeStore.prototype.getCurrentNode = function getCurrentNode() {\n return this.currentNode;\n };\n\n TreeStore.prototype.setCurrentNode = function setCurrentNode(currentNode) {\n var prevCurrentNode = this.currentNode;\n if (prevCurrentNode) {\n prevCurrentNode.isCurrent = false;\n }\n this.currentNode = currentNode;\n this.currentNode.isCurrent = true;\n };\n\n TreeStore.prototype.setUserCurrentNode = function setUserCurrentNode(node) {\n var key = node[this.key];\n var currNode = this.nodesMap[key];\n this.setCurrentNode(currNode);\n };\n\n TreeStore.prototype.setCurrentNodeKey = function setCurrentNodeKey(key) {\n if (key === null || key === undefined) {\n this.currentNode && (this.currentNode.isCurrent = false);\n this.currentNode = null;\n return;\n }\n var node = this.getNode(key);\n if (node) {\n this.setCurrentNode(node);\n }\n };\n\n return TreeStore;\n}();\n\n/* harmony default export */ var tree_store = (tree_store_TreeStore);\n;\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/tree/src/tree-node.vue?vue&type=template&id=3ba3ef0e&\nvar tree_nodevue_type_template_id_3ba3ef0e_render = function() {\n var this$1 = this\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.node.visible,\n expression: "node.visible"\n }\n ],\n ref: "node",\n staticClass: "el-tree-node",\n class: {\n "is-expanded": _vm.expanded,\n "is-current": _vm.node.isCurrent,\n "is-hidden": !_vm.node.visible,\n "is-focusable": !_vm.node.disabled,\n "is-checked": !_vm.node.disabled && _vm.node.checked\n },\n attrs: {\n role: "treeitem",\n tabindex: "-1",\n "aria-expanded": _vm.expanded,\n "aria-disabled": _vm.node.disabled,\n "aria-checked": _vm.node.checked,\n draggable: _vm.tree.draggable\n },\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.handleClick($event)\n },\n contextmenu: function($event) {\n return this$1.handleContextMenu($event)\n },\n dragstart: function($event) {\n $event.stopPropagation()\n return _vm.handleDragStart($event)\n },\n dragover: function($event) {\n $event.stopPropagation()\n return _vm.handleDragOver($event)\n },\n dragend: function($event) {\n $event.stopPropagation()\n return _vm.handleDragEnd($event)\n },\n drop: function($event) {\n $event.stopPropagation()\n return _vm.handleDrop($event)\n }\n }\n },\n [\n _c(\n "div",\n {\n staticClass: "el-tree-node__content",\n style: {\n "padding-left": (_vm.node.level - 1) * _vm.tree.indent + "px"\n }\n },\n [\n _c("span", {\n class: [\n {\n "is-leaf": _vm.node.isLeaf,\n expanded: !_vm.node.isLeaf && _vm.expanded\n },\n "el-tree-node__expand-icon",\n _vm.tree.iconClass ? _vm.tree.iconClass : "el-icon-caret-right"\n ],\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.handleExpandIconClick($event)\n }\n }\n }),\n _vm.showCheckbox\n ? _c("el-checkbox", {\n attrs: {\n indeterminate: _vm.node.indeterminate,\n disabled: !!_vm.node.disabled\n },\n on: { change: _vm.handleCheckChange },\n nativeOn: {\n click: function($event) {\n $event.stopPropagation()\n }\n },\n model: {\n value: _vm.node.checked,\n callback: function($$v) {\n _vm.$set(_vm.node, "checked", $$v)\n },\n expression: "node.checked"\n }\n })\n : _vm._e(),\n _vm.node.loading\n ? _c("span", {\n staticClass: "el-tree-node__loading-icon el-icon-loading"\n })\n : _vm._e(),\n _c("node-content", { attrs: { node: _vm.node } })\n ],\n 1\n ),\n _c("el-collapse-transition", [\n !_vm.renderAfterExpand || _vm.childNodeRendered\n ? _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.expanded,\n expression: "expanded"\n }\n ],\n staticClass: "el-tree-node__children",\n attrs: { role: "group", "aria-expanded": _vm.expanded }\n },\n _vm._l(_vm.node.childNodes, function(child) {\n return _c("el-tree-node", {\n key: _vm.getNodeKey(child),\n attrs: {\n "render-content": _vm.renderContent,\n "render-after-expand": _vm.renderAfterExpand,\n "show-checkbox": _vm.showCheckbox,\n node: child\n },\n on: { "node-expand": _vm.handleChildNodeExpand }\n })\n }),\n 1\n )\n : _vm._e()\n ])\n ],\n 1\n )\n}\nvar tree_nodevue_type_template_id_3ba3ef0e_staticRenderFns = []\ntree_nodevue_type_template_id_3ba3ef0e_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/tree/src/tree-node.vue?vue&type=template&id=3ba3ef0e&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/tree/src/tree-node.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ var tree_nodevue_type_script_lang_js_ = ({\n name: \'ElTreeNode\',\n\n componentName: \'ElTreeNode\',\n\n mixins: [emitter_default.a],\n\n props: {\n node: {\n default: function _default() {\n return {};\n }\n },\n props: {},\n renderContent: Function,\n renderAfterExpand: {\n type: Boolean,\n default: true\n },\n showCheckbox: {\n type: Boolean,\n default: false\n }\n },\n\n components: {\n ElCollapseTransition: collapse_transition_default.a,\n ElCheckbox: checkbox_default.a,\n NodeContent: {\n props: {\n node: {\n required: true\n }\n },\n render: function render(h) {\n var parent = this.$parent;\n var tree = parent.tree;\n var node = this.node;\n var data = node.data,\n store = node.store;\n\n return parent.renderContent ? parent.renderContent.call(parent._renderProxy, h, { _self: tree.$vnode.context, node: node, data: data, store: store }) : tree.$scopedSlots.default ? tree.$scopedSlots.default({ node: node, data: data }) : h(\n \'span\',\n { \'class\': \'el-tree-node__label\' },\n [node.label]\n );\n }\n }\n },\n\n data: function data() {\n return {\n tree: null,\n expanded: false,\n childNodeRendered: false,\n oldChecked: null,\n oldIndeterminate: null\n };\n },\n\n\n watch: {\n \'node.indeterminate\': function nodeIndeterminate(val) {\n this.handleSelectChange(this.node.checked, val);\n },\n \'node.checked\': function nodeChecked(val) {\n this.handleSelectChange(val, this.node.indeterminate);\n },\n \'node.expanded\': function nodeExpanded(val) {\n var _this = this;\n\n this.$nextTick(function () {\n return _this.expanded = val;\n });\n if (val) {\n this.childNodeRendered = true;\n }\n }\n },\n\n methods: {\n getNodeKey: function getNodeKey(node) {\n return util_getNodeKey(this.tree.nodeKey, node.data);\n },\n handleSelectChange: function handleSelectChange(checked, indeterminate) {\n if (this.oldChecked !== checked && this.oldIndeterminate !== indeterminate) {\n this.tree.$emit(\'check-change\', this.node.data, checked, indeterminate);\n }\n this.oldChecked = checked;\n this.indeterminate = indeterminate;\n },\n handleClick: function handleClick() {\n var store = this.tree.store;\n store.setCurrentNode(this.node);\n this.tree.$emit(\'current-change\', store.currentNode ? store.currentNode.data : null, store.currentNode);\n this.tree.currentNode = this;\n if (this.tree.expandOnClickNode) {\n this.handleExpandIconClick();\n }\n if (this.tree.checkOnClickNode && !this.node.disabled) {\n this.handleCheckChange(null, {\n target: { checked: !this.node.checked }\n });\n }\n this.tree.$emit(\'node-click\', this.node.data, this.node, this);\n },\n handleContextMenu: function handleContextMenu(event) {\n if (this.tree._events[\'node-contextmenu\'] && this.tree._events[\'node-contextmenu\'].length > 0) {\n event.stopPropagation();\n event.preventDefault();\n }\n this.tree.$emit(\'node-contextmenu\', event, this.node.data, this.node, this);\n },\n handleExpandIconClick: function handleExpandIconClick() {\n if (this.node.isLeaf) return;\n if (this.expanded) {\n this.tree.$emit(\'node-collapse\', this.node.data, this.node, this);\n this.node.collapse();\n } else {\n this.node.expand();\n this.$emit(\'node-expand\', this.node.data, this.node, this);\n }\n },\n handleCheckChange: function handleCheckChange(value, ev) {\n var _this2 = this;\n\n this.node.setChecked(ev.target.checked, !this.tree.checkStrictly);\n this.$nextTick(function () {\n var store = _this2.tree.store;\n _this2.tree.$emit(\'check\', _this2.node.data, {\n checkedNodes: store.getCheckedNodes(),\n checkedKeys: store.getCheckedKeys(),\n halfCheckedNodes: store.getHalfCheckedNodes(),\n halfCheckedKeys: store.getHalfCheckedKeys()\n });\n });\n },\n handleChildNodeExpand: function handleChildNodeExpand(nodeData, node, instance) {\n this.broadcast(\'ElTreeNode\', \'tree-node-expand\', node);\n this.tree.$emit(\'node-expand\', nodeData, node, instance);\n },\n handleDragStart: function handleDragStart(event) {\n if (!this.tree.draggable) return;\n this.tree.$emit(\'tree-node-drag-start\', event, this);\n },\n handleDragOver: function handleDragOver(event) {\n if (!this.tree.draggable) return;\n this.tree.$emit(\'tree-node-drag-over\', event, this);\n event.preventDefault();\n },\n handleDrop: function handleDrop(event) {\n event.preventDefault();\n },\n handleDragEnd: function handleDragEnd(event) {\n if (!this.tree.draggable) return;\n this.tree.$emit(\'tree-node-drag-end\', event, this);\n }\n },\n\n created: function created() {\n var _this3 = this;\n\n var parent = this.$parent;\n\n if (parent.isTree) {\n this.tree = parent;\n } else {\n this.tree = parent.tree;\n }\n\n var tree = this.tree;\n if (!tree) {\n console.warn(\'Can not find node\\\'s tree.\');\n }\n\n var props = tree.props || {};\n var childrenKey = props[\'children\'] || \'children\';\n\n this.$watch(\'node.data.\' + childrenKey, function () {\n _this3.node.updateChildren();\n });\n\n if (this.node.expanded) {\n this.expanded = true;\n this.childNodeRendered = true;\n }\n\n if (this.tree.accordion) {\n this.$on(\'tree-node-expand\', function (node) {\n if (_this3.node !== node) {\n _this3.node.collapse();\n }\n });\n }\n }\n});\n// CONCATENATED MODULE: ./packages/tree/src/tree-node.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_tree_nodevue_type_script_lang_js_ = (tree_nodevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/tree/src/tree-node.vue\n\n\n\n\n\n/* normalize component */\n\nvar tree_node_component = normalizeComponent(\n src_tree_nodevue_type_script_lang_js_,\n tree_nodevue_type_template_id_3ba3ef0e_render,\n tree_nodevue_type_template_id_3ba3ef0e_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var tree_node_api; }\ntree_node_component.options.__file = "packages/tree/src/tree-node.vue"\n/* harmony default export */ var tree_node = (tree_node_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/tree/src/tree.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 */ var treevue_type_script_lang_js_ = ({\n name: \'ElTree\',\n\n mixins: [emitter_default.a],\n\n components: {\n ElTreeNode: tree_node\n },\n\n data: function data() {\n return {\n store: null,\n root: null,\n currentNode: null,\n treeItems: null,\n checkboxItems: [],\n dragState: {\n showDropIndicator: false,\n draggingNode: null,\n dropNode: null,\n allowDrop: true\n }\n };\n },\n\n\n props: {\n data: {\n type: Array\n },\n emptyText: {\n type: String,\n default: function _default() {\n return Object(lib_locale_["t"])(\'el.tree.emptyText\');\n }\n },\n renderAfterExpand: {\n type: Boolean,\n default: true\n },\n nodeKey: String,\n checkStrictly: Boolean,\n defaultExpandAll: Boolean,\n expandOnClickNode: {\n type: Boolean,\n default: true\n },\n checkOnClickNode: Boolean,\n checkDescendants: {\n type: Boolean,\n default: false\n },\n autoExpandParent: {\n type: Boolean,\n default: true\n },\n defaultCheckedKeys: Array,\n defaultExpandedKeys: Array,\n currentNodeKey: [String, Number],\n renderContent: Function,\n showCheckbox: {\n type: Boolean,\n default: false\n },\n draggable: {\n type: Boolean,\n default: false\n },\n allowDrag: Function,\n allowDrop: Function,\n props: {\n default: function _default() {\n return {\n children: \'children\',\n label: \'label\',\n disabled: \'disabled\'\n };\n }\n },\n lazy: {\n type: Boolean,\n default: false\n },\n highlightCurrent: Boolean,\n load: Function,\n filterNodeMethod: Function,\n accordion: Boolean,\n indent: {\n type: Number,\n default: 18\n },\n iconClass: String\n },\n\n computed: {\n children: {\n set: function set(value) {\n this.data = value;\n },\n get: function get() {\n return this.data;\n }\n },\n\n treeItemArray: function treeItemArray() {\n return Array.prototype.slice.call(this.treeItems);\n },\n isEmpty: function isEmpty() {\n var childNodes = this.root.childNodes;\n\n return !childNodes || childNodes.length === 0 || childNodes.every(function (_ref) {\n var visible = _ref.visible;\n return !visible;\n });\n }\n },\n\n watch: {\n defaultCheckedKeys: function defaultCheckedKeys(newVal) {\n this.store.setDefaultCheckedKey(newVal);\n },\n defaultExpandedKeys: function defaultExpandedKeys(newVal) {\n this.store.defaultExpandedKeys = newVal;\n this.store.setDefaultExpandedKeys(newVal);\n },\n data: function data(newVal) {\n this.store.setData(newVal);\n },\n checkboxItems: function checkboxItems(val) {\n Array.prototype.forEach.call(val, function (checkbox) {\n checkbox.setAttribute(\'tabindex\', -1);\n });\n },\n checkStrictly: function checkStrictly(newVal) {\n this.store.checkStrictly = newVal;\n }\n },\n\n methods: {\n filter: function filter(value) {\n if (!this.filterNodeMethod) throw new Error(\'[Tree] filterNodeMethod is required when filter\');\n this.store.filter(value);\n },\n getNodeKey: function getNodeKey(node) {\n return util_getNodeKey(this.nodeKey, node.data);\n },\n getNodePath: function getNodePath(data) {\n if (!this.nodeKey) throw new Error(\'[Tree] nodeKey is required in getNodePath\');\n var node = this.store.getNode(data);\n if (!node) return [];\n var path = [node.data];\n var parent = node.parent;\n while (parent && parent !== this.root) {\n path.push(parent.data);\n parent = parent.parent;\n }\n return path.reverse();\n },\n getCheckedNodes: function getCheckedNodes(leafOnly, includeHalfChecked) {\n return this.store.getCheckedNodes(leafOnly, includeHalfChecked);\n },\n getCheckedKeys: function getCheckedKeys(leafOnly) {\n return this.store.getCheckedKeys(leafOnly);\n },\n getCurrentNode: function getCurrentNode() {\n var currentNode = this.store.getCurrentNode();\n return currentNode ? currentNode.data : null;\n },\n getCurrentKey: function getCurrentKey() {\n if (!this.nodeKey) throw new Error(\'[Tree] nodeKey is required in getCurrentKey\');\n var currentNode = this.getCurrentNode();\n return currentNode ? currentNode[this.nodeKey] : null;\n },\n setCheckedNodes: function setCheckedNodes(nodes, leafOnly) {\n if (!this.nodeKey) throw new Error(\'[Tree] nodeKey is required in setCheckedNodes\');\n this.store.setCheckedNodes(nodes, leafOnly);\n },\n setCheckedKeys: function setCheckedKeys(keys, leafOnly) {\n if (!this.nodeKey) throw new Error(\'[Tree] nodeKey is required in setCheckedKeys\');\n this.store.setCheckedKeys(keys, leafOnly);\n },\n setChecked: function setChecked(data, checked, deep) {\n this.store.setChecked(data, checked, deep);\n },\n getHalfCheckedNodes: function getHalfCheckedNodes() {\n return this.store.getHalfCheckedNodes();\n },\n getHalfCheckedKeys: function getHalfCheckedKeys() {\n return this.store.getHalfCheckedKeys();\n },\n setCurrentNode: function setCurrentNode(node) {\n if (!this.nodeKey) throw new Error(\'[Tree] nodeKey is required in setCurrentNode\');\n this.store.setUserCurrentNode(node);\n },\n setCurrentKey: function setCurrentKey(key) {\n if (!this.nodeKey) throw new Error(\'[Tree] nodeKey is required in setCurrentKey\');\n this.store.setCurrentNodeKey(key);\n },\n getNode: function getNode(data) {\n return this.store.getNode(data);\n },\n remove: function remove(data) {\n this.store.remove(data);\n },\n append: function append(data, parentNode) {\n this.store.append(data, parentNode);\n },\n insertBefore: function insertBefore(data, refNode) {\n this.store.insertBefore(data, refNode);\n },\n insertAfter: function insertAfter(data, refNode) {\n this.store.insertAfter(data, refNode);\n },\n handleNodeExpand: function handleNodeExpand(nodeData, node, instance) {\n this.broadcast(\'ElTreeNode\', \'tree-node-expand\', node);\n this.$emit(\'node-expand\', nodeData, node, instance);\n },\n updateKeyChildren: function updateKeyChildren(key, data) {\n if (!this.nodeKey) throw new Error(\'[Tree] nodeKey is required in updateKeyChild\');\n this.store.updateChildren(key, data);\n },\n initTabIndex: function initTabIndex() {\n this.treeItems = this.$el.querySelectorAll(\'.is-focusable[role=treeitem]\');\n this.checkboxItems = this.$el.querySelectorAll(\'input[type=checkbox]\');\n var checkedItem = this.$el.querySelectorAll(\'.is-checked[role=treeitem]\');\n if (checkedItem.length) {\n checkedItem[0].setAttribute(\'tabindex\', 0);\n return;\n }\n this.treeItems[0] && this.treeItems[0].setAttribute(\'tabindex\', 0);\n },\n handleKeydown: function handleKeydown(ev) {\n var currentItem = ev.target;\n if (currentItem.className.indexOf(\'el-tree-node\') === -1) return;\n var keyCode = ev.keyCode;\n this.treeItems = this.$el.querySelectorAll(\'.is-focusable[role=treeitem]\');\n var currentIndex = this.treeItemArray.indexOf(currentItem);\n var nextIndex = void 0;\n if ([38, 40].indexOf(keyCode) > -1) {\n // up、down\n ev.preventDefault();\n if (keyCode === 38) {\n // up\n nextIndex = currentIndex !== 0 ? currentIndex - 1 : 0;\n } else {\n nextIndex = currentIndex < this.treeItemArray.length - 1 ? currentIndex + 1 : 0;\n }\n this.treeItemArray[nextIndex].focus(); // 选中\n }\n if ([37, 39].indexOf(keyCode) > -1) {\n // left、right 展开\n ev.preventDefault();\n currentItem.click(); // 选中\n }\n var hasInput = currentItem.querySelector(\'[type="checkbox"]\');\n if ([13, 32].indexOf(keyCode) > -1 && hasInput) {\n // space enter选中checkbox\n ev.preventDefault();\n hasInput.click();\n }\n }\n },\n\n created: function created() {\n var _this = this;\n\n this.isTree = true;\n\n this.store = new tree_store({\n key: this.nodeKey,\n data: this.data,\n lazy: this.lazy,\n props: this.props,\n load: this.load,\n currentNodeKey: this.currentNodeKey,\n checkStrictly: this.checkStrictly,\n checkDescendants: this.checkDescendants,\n defaultCheckedKeys: this.defaultCheckedKeys,\n defaultExpandedKeys: this.defaultExpandedKeys,\n autoExpandParent: this.autoExpandParent,\n defaultExpandAll: this.defaultExpandAll,\n filterNodeMethod: this.filterNodeMethod\n });\n\n this.root = this.store.root;\n\n var dragState = this.dragState;\n this.$on(\'tree-node-drag-start\', function (event, treeNode) {\n if (typeof _this.allowDrag === \'function\' && !_this.allowDrag(treeNode.node)) {\n event.preventDefault();\n return false;\n }\n event.dataTransfer.effectAllowed = \'move\';\n\n // wrap in try catch to address IE\'s error when first param is \'text/plain\'\n try {\n // setData is required for draggable to work in FireFox\n // the content has to be \'\' so dragging a node out of the tree won\'t open a new tab in FireFox\n event.dataTransfer.setData(\'text/plain\', \'\');\n } catch (e) {}\n dragState.draggingNode = treeNode;\n _this.$emit(\'node-drag-start\', treeNode.node, event);\n });\n\n this.$on(\'tree-node-drag-over\', function (event, treeNode) {\n var dropNode = findNearestComponent(event.target, \'ElTreeNode\');\n var oldDropNode = dragState.dropNode;\n if (oldDropNode && oldDropNode !== dropNode) {\n Object(dom_["removeClass"])(oldDropNode.$el, \'is-drop-inner\');\n }\n var draggingNode = dragState.draggingNode;\n if (!draggingNode || !dropNode) return;\n\n var dropPrev = true;\n var dropInner = true;\n var dropNext = true;\n var userAllowDropInner = true;\n if (typeof _this.allowDrop === \'function\') {\n dropPrev = _this.allowDrop(draggingNode.node, dropNode.node, \'prev\');\n userAllowDropInner = dropInner = _this.allowDrop(draggingNode.node, dropNode.node, \'inner\');\n dropNext = _this.allowDrop(draggingNode.node, dropNode.node, \'next\');\n }\n event.dataTransfer.dropEffect = dropInner ? \'move\' : \'none\';\n if ((dropPrev || dropInner || dropNext) && oldDropNode !== dropNode) {\n if (oldDropNode) {\n _this.$emit(\'node-drag-leave\', draggingNode.node, oldDropNode.node, event);\n }\n _this.$emit(\'node-drag-enter\', draggingNode.node, dropNode.node, event);\n }\n\n if (dropPrev || dropInner || dropNext) {\n dragState.dropNode = dropNode;\n }\n\n if (dropNode.node.nextSibling === draggingNode.node) {\n dropNext = false;\n }\n if (dropNode.node.previousSibling === draggingNode.node) {\n dropPrev = false;\n }\n if (dropNode.node.contains(draggingNode.node, false)) {\n dropInner = false;\n }\n if (draggingNode.node === dropNode.node || draggingNode.node.contains(dropNode.node)) {\n dropPrev = false;\n dropInner = false;\n dropNext = false;\n }\n\n var targetPosition = dropNode.$el.getBoundingClientRect();\n var treePosition = _this.$el.getBoundingClientRect();\n\n var dropType = void 0;\n var prevPercent = dropPrev ? dropInner ? 0.25 : dropNext ? 0.45 : 1 : -1;\n var nextPercent = dropNext ? dropInner ? 0.75 : dropPrev ? 0.55 : 0 : 1;\n\n var indicatorTop = -9999;\n var distance = event.clientY - targetPosition.top;\n if (distance < targetPosition.height * prevPercent) {\n dropType = \'before\';\n } else if (distance > targetPosition.height * nextPercent) {\n dropType = \'after\';\n } else if (dropInner) {\n dropType = \'inner\';\n } else {\n dropType = \'none\';\n }\n\n var iconPosition = dropNode.$el.querySelector(\'.el-tree-node__expand-icon\').getBoundingClientRect();\n var dropIndicator = _this.$refs.dropIndicator;\n if (dropType === \'before\') {\n indicatorTop = iconPosition.top - treePosition.top;\n } else if (dropType === \'after\') {\n indicatorTop = iconPosition.bottom - treePosition.top;\n }\n dropIndicator.style.top = indicatorTop + \'px\';\n dropIndicator.style.left = iconPosition.right - treePosition.left + \'px\';\n\n if (dropType === \'inner\') {\n Object(dom_["addClass"])(dropNode.$el, \'is-drop-inner\');\n } else {\n Object(dom_["removeClass"])(dropNode.$el, \'is-drop-inner\');\n }\n\n dragState.showDropIndicator = dropType === \'before\' || dropType === \'after\';\n dragState.allowDrop = dragState.showDropIndicator || userAllowDropInner;\n dragState.dropType = dropType;\n _this.$emit(\'node-drag-over\', draggingNode.node, dropNode.node, event);\n });\n\n this.$on(\'tree-node-drag-end\', function (event) {\n var draggingNode = dragState.draggingNode,\n dropType = dragState.dropType,\n dropNode = dragState.dropNode;\n\n event.preventDefault();\n event.dataTransfer.dropEffect = \'move\';\n\n if (draggingNode && dropNode) {\n var draggingNodeCopy = { data: draggingNode.node.data };\n if (dropType !== \'none\') {\n draggingNode.node.remove();\n }\n if (dropType === \'before\') {\n dropNode.node.parent.insertBefore(draggingNodeCopy, dropNode.node);\n } else if (dropType === \'after\') {\n dropNode.node.parent.insertAfter(draggingNodeCopy, dropNode.node);\n } else if (dropType === \'inner\') {\n dropNode.node.insertChild(draggingNodeCopy);\n }\n if (dropType !== \'none\') {\n _this.store.registerNode(draggingNodeCopy);\n }\n\n Object(dom_["removeClass"])(dropNode.$el, \'is-drop-inner\');\n\n _this.$emit(\'node-drag-end\', draggingNode.node, dropNode.node, dropType, event);\n if (dropType !== \'none\') {\n _this.$emit(\'node-drop\', draggingNode.node, dropNode.node, dropType, event);\n }\n }\n if (draggingNode && !dropNode) {\n _this.$emit(\'node-drag-end\', draggingNode.node, null, dropType, event);\n }\n\n dragState.showDropIndicator = false;\n dragState.draggingNode = null;\n dragState.dropNode = null;\n dragState.allowDrop = true;\n });\n },\n mounted: function mounted() {\n this.initTabIndex();\n this.$el.addEventListener(\'keydown\', this.handleKeydown);\n },\n updated: function updated() {\n this.treeItems = this.$el.querySelectorAll(\'[role=treeitem]\');\n this.checkboxItems = this.$el.querySelectorAll(\'input[type=checkbox]\');\n }\n});\n// CONCATENATED MODULE: ./packages/tree/src/tree.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_treevue_type_script_lang_js_ = (treevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/tree/src/tree.vue\n\n\n\n\n\n/* normalize component */\n\nvar tree_component = normalizeComponent(\n src_treevue_type_script_lang_js_,\n treevue_type_template_id_547575a6_render,\n treevue_type_template_id_547575a6_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var tree_api; }\ntree_component.options.__file = "packages/tree/src/tree.vue"\n/* harmony default export */ var src_tree = (tree_component.exports);\n// CONCATENATED MODULE: ./packages/tree/index.js\n\n\n/* istanbul ignore next */\nsrc_tree.install = function (Vue) {\n Vue.component(src_tree.name, src_tree);\n};\n\n/* harmony default export */ var packages_tree = (src_tree);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/alert/src/main.vue?vue&type=template&id=6e53341b&\nvar mainvue_type_template_id_6e53341b_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("transition", { attrs: { name: "el-alert-fade" } }, [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-alert",\n class: [\n _vm.typeClass,\n _vm.center ? "is-center" : "",\n "is-" + _vm.effect\n ],\n attrs: { role: "alert" }\n },\n [\n _vm.showIcon\n ? _c("i", {\n staticClass: "el-alert__icon",\n class: [_vm.iconClass, _vm.isBigIcon]\n })\n : _vm._e(),\n _c("div", { staticClass: "el-alert__content" }, [\n _vm.title || _vm.$slots.title\n ? _c(\n "span",\n { staticClass: "el-alert__title", class: [_vm.isBoldTitle] },\n [_vm._t("title", [_vm._v(_vm._s(_vm.title))])],\n 2\n )\n : _vm._e(),\n _vm.$slots.default && !_vm.description\n ? _c(\n "p",\n { staticClass: "el-alert__description" },\n [_vm._t("default")],\n 2\n )\n : _vm._e(),\n _vm.description && !_vm.$slots.default\n ? _c("p", { staticClass: "el-alert__description" }, [\n _vm._v(_vm._s(_vm.description))\n ])\n : _vm._e(),\n _c(\n "i",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.closable,\n expression: "closable"\n }\n ],\n staticClass: "el-alert__closebtn",\n class: {\n "is-customed": _vm.closeText !== "",\n "el-icon-close": _vm.closeText === ""\n },\n on: {\n click: function($event) {\n _vm.close()\n }\n }\n },\n [_vm._v(_vm._s(_vm.closeText))]\n )\n ])\n ]\n )\n ])\n}\nvar mainvue_type_template_id_6e53341b_staticRenderFns = []\nmainvue_type_template_id_6e53341b_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/alert/src/main.vue?vue&type=template&id=6e53341b&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/alert/src/main.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\nvar TYPE_CLASSES_MAP = {\n \'success\': \'el-icon-success\',\n \'warning\': \'el-icon-warning\',\n \'error\': \'el-icon-error\'\n};\n/* harmony default export */ var alert_src_mainvue_type_script_lang_js_ = ({\n name: \'ElAlert\',\n\n props: {\n title: {\n type: String,\n default: \'\'\n },\n description: {\n type: String,\n default: \'\'\n },\n type: {\n type: String,\n default: \'info\'\n },\n closable: {\n type: Boolean,\n default: true\n },\n closeText: {\n type: String,\n default: \'\'\n },\n showIcon: Boolean,\n center: Boolean,\n effect: {\n type: String,\n default: \'light\',\n validator: function validator(value) {\n return [\'light\', \'dark\'].indexOf(value) !== -1;\n }\n }\n },\n\n data: function data() {\n return {\n visible: true\n };\n },\n\n\n methods: {\n close: function close() {\n this.visible = false;\n this.$emit(\'close\');\n }\n },\n\n computed: {\n typeClass: function typeClass() {\n return \'el-alert--\' + this.type;\n },\n iconClass: function iconClass() {\n return TYPE_CLASSES_MAP[this.type] || \'el-icon-info\';\n },\n isBigIcon: function isBigIcon() {\n return this.description || this.$slots.default ? \'is-big\' : \'\';\n },\n isBoldTitle: function isBoldTitle() {\n return this.description || this.$slots.default ? \'is-bold\' : \'\';\n }\n }\n});\n// CONCATENATED MODULE: ./packages/alert/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_alert_src_mainvue_type_script_lang_js_ = (alert_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/alert/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar alert_src_main_component = normalizeComponent(\n packages_alert_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_6e53341b_render,\n mainvue_type_template_id_6e53341b_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var alert_src_main_api; }\nalert_src_main_component.options.__file = "packages/alert/src/main.vue"\n/* harmony default export */ var alert_src_main = (alert_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/alert/index.js\n\n\n/* istanbul ignore next */\nalert_src_main.install = function (Vue) {\n Vue.component(alert_src_main.name, alert_src_main);\n};\n\n/* harmony default export */ var packages_alert = (alert_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/notification/src/main.vue?vue&type=template&id=43dbc3d8&\nvar mainvue_type_template_id_43dbc3d8_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("transition", { attrs: { name: "el-notification-fade" } }, [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n class: ["el-notification", _vm.customClass, _vm.horizontalClass],\n style: _vm.positionStyle,\n attrs: { role: "alert" },\n on: {\n mouseenter: function($event) {\n _vm.clearTimer()\n },\n mouseleave: function($event) {\n _vm.startTimer()\n },\n click: _vm.click\n }\n },\n [\n _vm.type || _vm.iconClass\n ? _c("i", {\n staticClass: "el-notification__icon",\n class: [_vm.typeClass, _vm.iconClass]\n })\n : _vm._e(),\n _c(\n "div",\n {\n staticClass: "el-notification__group",\n class: { "is-with-icon": _vm.typeClass || _vm.iconClass }\n },\n [\n _c("h2", {\n staticClass: "el-notification__title",\n domProps: { textContent: _vm._s(_vm.title) }\n }),\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.message,\n expression: "message"\n }\n ],\n staticClass: "el-notification__content"\n },\n [\n _vm._t("default", [\n !_vm.dangerouslyUseHTMLString\n ? _c("p", [_vm._v(_vm._s(_vm.message))])\n : _c("p", { domProps: { innerHTML: _vm._s(_vm.message) } })\n ])\n ],\n 2\n ),\n _vm.showClose\n ? _c("div", {\n staticClass: "el-notification__closeBtn el-icon-close",\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.close($event)\n }\n }\n })\n : _vm._e()\n ]\n )\n ]\n )\n ])\n}\nvar mainvue_type_template_id_43dbc3d8_staticRenderFns = []\nmainvue_type_template_id_43dbc3d8_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/notification/src/main.vue?vue&type=template&id=43dbc3d8&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/notification/src/main.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\nvar mainvue_type_script_lang_js_typeMap = {\n success: \'success\',\n info: \'info\',\n warning: \'warning\',\n error: \'error\'\n};\n\n/* harmony default export */ var notification_src_mainvue_type_script_lang_js_ = ({\n data: function data() {\n return {\n visible: false,\n title: \'\',\n message: \'\',\n duration: 4500,\n type: \'\',\n showClose: true,\n customClass: \'\',\n iconClass: \'\',\n onClose: null,\n onClick: null,\n closed: false,\n verticalOffset: 0,\n timer: null,\n dangerouslyUseHTMLString: false,\n position: \'top-right\'\n };\n },\n\n\n computed: {\n typeClass: function typeClass() {\n return this.type && mainvue_type_script_lang_js_typeMap[this.type] ? \'el-icon-\' + mainvue_type_script_lang_js_typeMap[this.type] : \'\';\n },\n horizontalClass: function horizontalClass() {\n return this.position.indexOf(\'right\') > -1 ? \'right\' : \'left\';\n },\n verticalProperty: function verticalProperty() {\n return (/^top-/.test(this.position) ? \'top\' : \'bottom\'\n );\n },\n positionStyle: function positionStyle() {\n var _ref;\n\n return _ref = {}, _ref[this.verticalProperty] = this.verticalOffset + \'px\', _ref;\n }\n },\n\n watch: {\n closed: function closed(newVal) {\n if (newVal) {\n this.visible = false;\n this.$el.addEventListener(\'transitionend\', this.destroyElement);\n }\n }\n },\n\n methods: {\n destroyElement: function destroyElement() {\n this.$el.removeEventListener(\'transitionend\', this.destroyElement);\n this.$destroy(true);\n this.$el.parentNode.removeChild(this.$el);\n },\n click: function click() {\n if (typeof this.onClick === \'function\') {\n this.onClick();\n }\n },\n close: function close() {\n this.closed = true;\n if (typeof this.onClose === \'function\') {\n this.onClose();\n }\n },\n clearTimer: function clearTimer() {\n clearTimeout(this.timer);\n },\n startTimer: function startTimer() {\n var _this = this;\n\n if (this.duration > 0) {\n this.timer = setTimeout(function () {\n if (!_this.closed) {\n _this.close();\n }\n }, this.duration);\n }\n },\n keydown: function keydown(e) {\n if (e.keyCode === 46 || e.keyCode === 8) {\n this.clearTimer(); // detele 取消倒计时\n } else if (e.keyCode === 27) {\n // esc关闭消息\n if (!this.closed) {\n this.close();\n }\n } else {\n this.startTimer(); // 恢复倒计时\n }\n }\n },\n mounted: function mounted() {\n var _this2 = this;\n\n if (this.duration > 0) {\n this.timer = setTimeout(function () {\n if (!_this2.closed) {\n _this2.close();\n }\n }, this.duration);\n }\n document.addEventListener(\'keydown\', this.keydown);\n },\n beforeDestroy: function beforeDestroy() {\n document.removeEventListener(\'keydown\', this.keydown);\n }\n});\n// CONCATENATED MODULE: ./packages/notification/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_notification_src_mainvue_type_script_lang_js_ = (notification_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/notification/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar notification_src_main_component = normalizeComponent(\n packages_notification_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_43dbc3d8_render,\n mainvue_type_template_id_43dbc3d8_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var notification_src_main_api; }\nnotification_src_main_component.options.__file = "packages/notification/src/main.vue"\n/* harmony default export */ var notification_src_main = (notification_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/notification/src/main.js\n\n\n\n\n\nvar NotificationConstructor = external_vue_default.a.extend(notification_src_main);\n\nvar src_main_instance = void 0;\nvar instances = [];\nvar seed = 1;\n\nvar main_Notification = function Notification(options) {\n if (external_vue_default.a.prototype.$isServer) return;\n options = merge_default()({}, options);\n var userOnClose = options.onClose;\n var id = \'notification_\' + seed++;\n var position = options.position || \'top-right\';\n\n options.onClose = function () {\n Notification.close(id, userOnClose);\n };\n\n src_main_instance = new NotificationConstructor({\n data: options\n });\n\n if (Object(vdom_["isVNode"])(options.message)) {\n src_main_instance.$slots.default = [options.message];\n options.message = \'REPLACED_BY_VNODE\';\n }\n src_main_instance.id = id;\n src_main_instance.$mount();\n document.body.appendChild(src_main_instance.$el);\n src_main_instance.visible = true;\n src_main_instance.dom = src_main_instance.$el;\n src_main_instance.dom.style.zIndex = popup_["PopupManager"].nextZIndex();\n\n var verticalOffset = options.offset || 0;\n instances.filter(function (item) {\n return item.position === position;\n }).forEach(function (item) {\n verticalOffset += item.$el.offsetHeight + 16;\n });\n verticalOffset += 16;\n src_main_instance.verticalOffset = verticalOffset;\n instances.push(src_main_instance);\n return src_main_instance;\n};\n\n[\'success\', \'warning\', \'info\', \'error\'].forEach(function (type) {\n main_Notification[type] = function (options) {\n if (typeof options === \'string\' || Object(vdom_["isVNode"])(options)) {\n options = {\n message: options\n };\n }\n options.type = type;\n return main_Notification(options);\n };\n});\n\nmain_Notification.close = function (id, userOnClose) {\n var index = -1;\n var len = instances.length;\n var instance = instances.filter(function (instance, i) {\n if (instance.id === id) {\n index = i;\n return true;\n }\n return false;\n })[0];\n if (!instance) return;\n\n if (typeof userOnClose === \'function\') {\n userOnClose(instance);\n }\n instances.splice(index, 1);\n\n if (len <= 1) return;\n var position = instance.position;\n var removedHeight = instance.dom.offsetHeight;\n for (var i = index; i < len - 1; i++) {\n if (instances[i].position === position) {\n instances[i].dom.style[instance.verticalProperty] = parseInt(instances[i].dom.style[instance.verticalProperty], 10) - removedHeight - 16 + \'px\';\n }\n }\n};\n\nmain_Notification.closeAll = function () {\n for (var i = instances.length - 1; i >= 0; i--) {\n instances[i].close();\n }\n};\n\n/* harmony default export */ var packages_notification_src_main = (main_Notification);\n// CONCATENATED MODULE: ./packages/notification/index.js\n\n/* harmony default export */ var notification = (packages_notification_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/slider/src/main.vue?vue&type=template&id=32708644&\nvar mainvue_type_template_id_32708644_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 staticClass: "el-slider",\n class: {\n "is-vertical": _vm.vertical,\n "el-slider--with-input": _vm.showInput\n },\n attrs: {\n role: "slider",\n "aria-valuemin": _vm.min,\n "aria-valuemax": _vm.max,\n "aria-orientation": _vm.vertical ? "vertical" : "horizontal",\n "aria-disabled": _vm.sliderDisabled\n }\n },\n [\n _vm.showInput && !_vm.range\n ? _c("el-input-number", {\n ref: "input",\n staticClass: "el-slider__input",\n attrs: {\n step: _vm.step,\n disabled: _vm.sliderDisabled,\n controls: _vm.showInputControls,\n min: _vm.min,\n max: _vm.max,\n debounce: _vm.debounce,\n size: _vm.inputSize\n },\n on: { change: _vm.emitChange },\n model: {\n value: _vm.firstValue,\n callback: function($$v) {\n _vm.firstValue = $$v\n },\n expression: "firstValue"\n }\n })\n : _vm._e(),\n _c(\n "div",\n {\n ref: "slider",\n staticClass: "el-slider__runway",\n class: { "show-input": _vm.showInput, disabled: _vm.sliderDisabled },\n style: _vm.runwayStyle,\n on: { click: _vm.onSliderClick }\n },\n [\n _c("div", { staticClass: "el-slider__bar", style: _vm.barStyle }),\n _c("slider-button", {\n ref: "button1",\n attrs: {\n vertical: _vm.vertical,\n "tooltip-class": _vm.tooltipClass\n },\n model: {\n value: _vm.firstValue,\n callback: function($$v) {\n _vm.firstValue = $$v\n },\n expression: "firstValue"\n }\n }),\n _vm.range\n ? _c("slider-button", {\n ref: "button2",\n attrs: {\n vertical: _vm.vertical,\n "tooltip-class": _vm.tooltipClass\n },\n model: {\n value: _vm.secondValue,\n callback: function($$v) {\n _vm.secondValue = $$v\n },\n expression: "secondValue"\n }\n })\n : _vm._e(),\n _vm._l(_vm.stops, function(item, key) {\n return _vm.showStops\n ? _c("div", {\n key: key,\n staticClass: "el-slider__stop",\n style: _vm.getStopStyle(item)\n })\n : _vm._e()\n }),\n _vm.markList.length > 0\n ? [\n _c(\n "div",\n _vm._l(_vm.markList, function(item, key) {\n return _c("div", {\n key: key,\n staticClass: "el-slider__stop el-slider__marks-stop",\n style: _vm.getStopStyle(item.position)\n })\n }),\n 0\n ),\n _c(\n "div",\n { staticClass: "el-slider__marks" },\n _vm._l(_vm.markList, function(item, key) {\n return _c("slider-marker", {\n key: key,\n style: _vm.getStopStyle(item.position),\n attrs: { mark: item.mark }\n })\n }),\n 1\n )\n ]\n : _vm._e()\n ],\n 2\n )\n ],\n 1\n )\n}\nvar mainvue_type_template_id_32708644_staticRenderFns = []\nmainvue_type_template_id_32708644_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/slider/src/main.vue?vue&type=template&id=32708644&\n\n// EXTERNAL MODULE: external "element-ui/lib/input-number"\nvar input_number_ = __webpack_require__(42);\nvar input_number_default = /*#__PURE__*/__webpack_require__.n(input_number_);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/slider/src/button.vue?vue&type=template&id=e72d2ad2&\nvar buttonvue_type_template_id_e72d2ad2_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 ref: "button",\n staticClass: "el-slider__button-wrapper",\n class: { hover: _vm.hovering, dragging: _vm.dragging },\n style: _vm.wrapperStyle,\n attrs: { tabindex: "0" },\n on: {\n mouseenter: _vm.handleMouseEnter,\n mouseleave: _vm.handleMouseLeave,\n mousedown: _vm.onButtonDown,\n touchstart: _vm.onButtonDown,\n focus: _vm.handleMouseEnter,\n blur: _vm.handleMouseLeave,\n keydown: [\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "left", 37, $event.key, [\n "Left",\n "ArrowLeft"\n ])\n ) {\n return null\n }\n if ("button" in $event && $event.button !== 0) {\n return null\n }\n return _vm.onLeftKeyDown($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "right", 39, $event.key, [\n "Right",\n "ArrowRight"\n ])\n ) {\n return null\n }\n if ("button" in $event && $event.button !== 2) {\n return null\n }\n return _vm.onRightKeyDown($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "down", 40, $event.key, [\n "Down",\n "ArrowDown"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.onLeftKeyDown($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "up", 38, $event.key, ["Up", "ArrowUp"])\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.onRightKeyDown($event)\n }\n ]\n }\n },\n [\n _c(\n "el-tooltip",\n {\n ref: "tooltip",\n attrs: {\n placement: "top",\n "popper-class": _vm.tooltipClass,\n disabled: !_vm.showTooltip\n }\n },\n [\n _c("span", { attrs: { slot: "content" }, slot: "content" }, [\n _vm._v(_vm._s(_vm.formatValue))\n ]),\n _c("div", {\n staticClass: "el-slider__button",\n class: { hover: _vm.hovering, dragging: _vm.dragging }\n })\n ]\n )\n ],\n 1\n )\n}\nvar buttonvue_type_template_id_e72d2ad2_staticRenderFns = []\nbuttonvue_type_template_id_e72d2ad2_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/slider/src/button.vue?vue&type=template&id=e72d2ad2&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/slider/src/button.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/* harmony default export */ var slider_src_buttonvue_type_script_lang_js_ = ({\n name: \'ElSliderButton\',\n\n components: {\n ElTooltip: tooltip_default.a\n },\n\n props: {\n value: {\n type: Number,\n default: 0\n },\n vertical: {\n type: Boolean,\n default: false\n },\n tooltipClass: String\n },\n\n data: function data() {\n return {\n hovering: false,\n dragging: false,\n isClick: false,\n startX: 0,\n currentX: 0,\n startY: 0,\n currentY: 0,\n startPosition: 0,\n newPosition: null,\n oldValue: this.value\n };\n },\n\n\n computed: {\n disabled: function disabled() {\n return this.$parent.sliderDisabled;\n },\n max: function max() {\n return this.$parent.max;\n },\n min: function min() {\n return this.$parent.min;\n },\n step: function step() {\n return this.$parent.step;\n },\n showTooltip: function showTooltip() {\n return this.$parent.showTooltip;\n },\n precision: function precision() {\n return this.$parent.precision;\n },\n currentPosition: function currentPosition() {\n return (this.value - this.min) / (this.max - this.min) * 100 + \'%\';\n },\n enableFormat: function enableFormat() {\n return this.$parent.formatTooltip instanceof Function;\n },\n formatValue: function formatValue() {\n return this.enableFormat && this.$parent.formatTooltip(this.value) || this.value;\n },\n wrapperStyle: function wrapperStyle() {\n return this.vertical ? { bottom: this.currentPosition } : { left: this.currentPosition };\n }\n },\n\n watch: {\n dragging: function dragging(val) {\n this.$parent.dragging = val;\n }\n },\n\n methods: {\n displayTooltip: function displayTooltip() {\n this.$refs.tooltip && (this.$refs.tooltip.showPopper = true);\n },\n hideTooltip: function hideTooltip() {\n this.$refs.tooltip && (this.$refs.tooltip.showPopper = false);\n },\n handleMouseEnter: function handleMouseEnter() {\n this.hovering = true;\n this.displayTooltip();\n },\n handleMouseLeave: function handleMouseLeave() {\n this.hovering = false;\n this.hideTooltip();\n },\n onButtonDown: function onButtonDown(event) {\n if (this.disabled) return;\n event.preventDefault();\n this.onDragStart(event);\n window.addEventListener(\'mousemove\', this.onDragging);\n window.addEventListener(\'touchmove\', this.onDragging);\n window.addEventListener(\'mouseup\', this.onDragEnd);\n window.addEventListener(\'touchend\', this.onDragEnd);\n window.addEventListener(\'contextmenu\', this.onDragEnd);\n },\n onLeftKeyDown: function onLeftKeyDown() {\n if (this.disabled) return;\n this.newPosition = parseFloat(this.currentPosition) - this.step / (this.max - this.min) * 100;\n this.setPosition(this.newPosition);\n this.$parent.emitChange();\n },\n onRightKeyDown: function onRightKeyDown() {\n if (this.disabled) return;\n this.newPosition = parseFloat(this.currentPosition) + this.step / (this.max - this.min) * 100;\n this.setPosition(this.newPosition);\n this.$parent.emitChange();\n },\n onDragStart: function onDragStart(event) {\n this.dragging = true;\n this.isClick = true;\n if (event.type === \'touchstart\') {\n event.clientY = event.touches[0].clientY;\n event.clientX = event.touches[0].clientX;\n }\n if (this.vertical) {\n this.startY = event.clientY;\n } else {\n this.startX = event.clientX;\n }\n this.startPosition = parseFloat(this.currentPosition);\n this.newPosition = this.startPosition;\n },\n onDragging: function onDragging(event) {\n if (this.dragging) {\n this.isClick = false;\n this.displayTooltip();\n this.$parent.resetSize();\n var diff = 0;\n if (event.type === \'touchmove\') {\n event.clientY = event.touches[0].clientY;\n event.clientX = event.touches[0].clientX;\n }\n if (this.vertical) {\n this.currentY = event.clientY;\n diff = (this.startY - this.currentY) / this.$parent.sliderSize * 100;\n } else {\n this.currentX = event.clientX;\n diff = (this.currentX - this.startX) / this.$parent.sliderSize * 100;\n }\n this.newPosition = this.startPosition + diff;\n this.setPosition(this.newPosition);\n }\n },\n onDragEnd: function onDragEnd() {\n var _this = this;\n\n if (this.dragging) {\n /*\n * 防止在 mouseup 后立即触发 click,导致滑块有几率产生一小段位移\n * 不使用 preventDefault 是因为 mouseup 和 click 没有注册在同一个 DOM 上\n */\n setTimeout(function () {\n _this.dragging = false;\n _this.hideTooltip();\n if (!_this.isClick) {\n _this.setPosition(_this.newPosition);\n _this.$parent.emitChange();\n }\n }, 0);\n window.removeEventListener(\'mousemove\', this.onDragging);\n window.removeEventListener(\'touchmove\', this.onDragging);\n window.removeEventListener(\'mouseup\', this.onDragEnd);\n window.removeEventListener(\'touchend\', this.onDragEnd);\n window.removeEventListener(\'contextmenu\', this.onDragEnd);\n }\n },\n setPosition: function setPosition(newPosition) {\n var _this2 = this;\n\n if (newPosition === null || isNaN(newPosition)) return;\n if (newPosition < 0) {\n newPosition = 0;\n } else if (newPosition > 100) {\n newPosition = 100;\n }\n var lengthPerStep = 100 / ((this.max - this.min) / this.step);\n var steps = Math.round(newPosition / lengthPerStep);\n var value = steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min;\n value = parseFloat(value.toFixed(this.precision));\n this.$emit(\'input\', value);\n this.$nextTick(function () {\n _this2.displayTooltip();\n _this2.$refs.tooltip && _this2.$refs.tooltip.updatePopper();\n });\n if (!this.dragging && this.value !== this.oldValue) {\n this.oldValue = this.value;\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/slider/src/button.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_slider_src_buttonvue_type_script_lang_js_ = (slider_src_buttonvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/slider/src/button.vue\n\n\n\n\n\n/* normalize component */\n\nvar src_button_component = normalizeComponent(\n packages_slider_src_buttonvue_type_script_lang_js_,\n buttonvue_type_template_id_e72d2ad2_render,\n buttonvue_type_template_id_e72d2ad2_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var src_button_api; }\nsrc_button_component.options.__file = "packages/slider/src/button.vue"\n/* harmony default export */ var slider_src_button = (src_button_component.exports);\n// CONCATENATED MODULE: ./packages/slider/src/marker.js\n/* harmony default export */ var marker = ({\n name: \'ElMarker\',\n\n props: {\n mark: {\n type: [String, Object]\n }\n },\n render: function render() {\n var h = arguments[0];\n\n var label = typeof this.mark === \'string\' ? this.mark : this.mark.label;\n\n return h(\n \'div\',\n { \'class\': \'el-slider__marks-text\', style: this.mark.style || {} },\n [label]\n );\n }\n});\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/slider/src/main.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ var slider_src_mainvue_type_script_lang_js_ = ({\n name: \'ElSlider\',\n\n mixins: [emitter_default.a],\n\n inject: {\n elForm: {\n default: \'\'\n }\n },\n\n props: {\n min: {\n type: Number,\n default: 0\n },\n max: {\n type: Number,\n default: 100\n },\n step: {\n type: Number,\n default: 1\n },\n value: {\n type: [Number, Array],\n default: 0\n },\n showInput: {\n type: Boolean,\n default: false\n },\n showInputControls: {\n type: Boolean,\n default: true\n },\n inputSize: {\n type: String,\n default: \'small\'\n },\n showStops: {\n type: Boolean,\n default: false\n },\n showTooltip: {\n type: Boolean,\n default: true\n },\n formatTooltip: Function,\n disabled: {\n type: Boolean,\n default: false\n },\n range: {\n type: Boolean,\n default: false\n },\n vertical: {\n type: Boolean,\n default: false\n },\n height: {\n type: String\n },\n debounce: {\n type: Number,\n default: 300\n },\n label: {\n type: String\n },\n tooltipClass: String,\n marks: Object\n },\n\n components: {\n ElInputNumber: input_number_default.a,\n SliderButton: slider_src_button,\n SliderMarker: marker\n },\n\n data: function data() {\n return {\n firstValue: null,\n secondValue: null,\n oldValue: null,\n dragging: false,\n sliderSize: 1\n };\n },\n\n\n watch: {\n value: function value(val, oldVal) {\n if (this.dragging || Array.isArray(val) && Array.isArray(oldVal) && val.every(function (item, index) {\n return item === oldVal[index];\n })) {\n return;\n }\n this.setValues();\n },\n dragging: function dragging(val) {\n if (!val) {\n this.setValues();\n }\n },\n firstValue: function firstValue(val) {\n if (this.range) {\n this.$emit(\'input\', [this.minValue, this.maxValue]);\n } else {\n this.$emit(\'input\', val);\n }\n },\n secondValue: function secondValue() {\n if (this.range) {\n this.$emit(\'input\', [this.minValue, this.maxValue]);\n }\n },\n min: function min() {\n this.setValues();\n },\n max: function max() {\n this.setValues();\n }\n },\n\n methods: {\n valueChanged: function valueChanged() {\n var _this = this;\n\n if (this.range) {\n return ![this.minValue, this.maxValue].every(function (item, index) {\n return item === _this.oldValue[index];\n });\n } else {\n return this.value !== this.oldValue;\n }\n },\n setValues: function setValues() {\n if (this.min > this.max) {\n console.error(\'[Element Error][Slider]min should not be greater than max.\');\n return;\n }\n var val = this.value;\n if (this.range && Array.isArray(val)) {\n if (val[1] < this.min) {\n this.$emit(\'input\', [this.min, this.min]);\n } else if (val[0] > this.max) {\n this.$emit(\'input\', [this.max, this.max]);\n } else if (val[0] < this.min) {\n this.$emit(\'input\', [this.min, val[1]]);\n } else if (val[1] > this.max) {\n this.$emit(\'input\', [val[0], this.max]);\n } else {\n this.firstValue = val[0];\n this.secondValue = val[1];\n if (this.valueChanged()) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', [this.minValue, this.maxValue]);\n this.oldValue = val.slice();\n }\n }\n } else if (!this.range && typeof val === \'number\' && !isNaN(val)) {\n if (val < this.min) {\n this.$emit(\'input\', this.min);\n } else if (val > this.max) {\n this.$emit(\'input\', this.max);\n } else {\n this.firstValue = val;\n if (this.valueChanged()) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', val);\n this.oldValue = val;\n }\n }\n }\n },\n setPosition: function setPosition(percent) {\n var targetValue = this.min + percent * (this.max - this.min) / 100;\n if (!this.range) {\n this.$refs.button1.setPosition(percent);\n return;\n }\n var button = void 0;\n if (Math.abs(this.minValue - targetValue) < Math.abs(this.maxValue - targetValue)) {\n button = this.firstValue < this.secondValue ? \'button1\' : \'button2\';\n } else {\n button = this.firstValue > this.secondValue ? \'button1\' : \'button2\';\n }\n this.$refs[button].setPosition(percent);\n },\n onSliderClick: function onSliderClick(event) {\n if (this.sliderDisabled || this.dragging) return;\n this.resetSize();\n if (this.vertical) {\n var sliderOffsetBottom = this.$refs.slider.getBoundingClientRect().bottom;\n this.setPosition((sliderOffsetBottom - event.clientY) / this.sliderSize * 100);\n } else {\n var sliderOffsetLeft = this.$refs.slider.getBoundingClientRect().left;\n this.setPosition((event.clientX - sliderOffsetLeft) / this.sliderSize * 100);\n }\n this.emitChange();\n },\n resetSize: function resetSize() {\n if (this.$refs.slider) {\n this.sliderSize = this.$refs.slider[\'client\' + (this.vertical ? \'Height\' : \'Width\')];\n }\n },\n emitChange: function emitChange() {\n var _this2 = this;\n\n this.$nextTick(function () {\n _this2.$emit(\'change\', _this2.range ? [_this2.minValue, _this2.maxValue] : _this2.value);\n });\n },\n getStopStyle: function getStopStyle(position) {\n return this.vertical ? { \'bottom\': position + \'%\' } : { \'left\': position + \'%\' };\n }\n },\n\n computed: {\n stops: function stops() {\n var _this3 = this;\n\n if (!this.showStops || this.min > this.max) return [];\n if (this.step === 0) {\n false && false;\n return [];\n }\n var stopCount = (this.max - this.min) / this.step;\n var stepWidth = 100 * this.step / (this.max - this.min);\n var result = [];\n for (var i = 1; i < stopCount; i++) {\n result.push(i * stepWidth);\n }\n if (this.range) {\n return result.filter(function (step) {\n return step < 100 * (_this3.minValue - _this3.min) / (_this3.max - _this3.min) || step > 100 * (_this3.maxValue - _this3.min) / (_this3.max - _this3.min);\n });\n } else {\n return result.filter(function (step) {\n return step > 100 * (_this3.firstValue - _this3.min) / (_this3.max - _this3.min);\n });\n }\n },\n markList: function markList() {\n var _this4 = this;\n\n if (!this.marks) {\n return [];\n }\n\n var marksKeys = Object.keys(this.marks);\n return marksKeys.map(parseFloat).sort(function (a, b) {\n return a - b;\n }).filter(function (point) {\n return point <= _this4.max && point >= _this4.min;\n }).map(function (point) {\n return {\n point: point,\n position: (point - _this4.min) * 100 / (_this4.max - _this4.min),\n mark: _this4.marks[point]\n };\n });\n },\n minValue: function minValue() {\n return Math.min(this.firstValue, this.secondValue);\n },\n maxValue: function maxValue() {\n return Math.max(this.firstValue, this.secondValue);\n },\n barSize: function barSize() {\n return this.range ? 100 * (this.maxValue - this.minValue) / (this.max - this.min) + \'%\' : 100 * (this.firstValue - this.min) / (this.max - this.min) + \'%\';\n },\n barStart: function barStart() {\n return this.range ? 100 * (this.minValue - this.min) / (this.max - this.min) + \'%\' : \'0%\';\n },\n precision: function precision() {\n var precisions = [this.min, this.max, this.step].map(function (item) {\n var decimal = (\'\' + item).split(\'.\')[1];\n return decimal ? decimal.length : 0;\n });\n return Math.max.apply(null, precisions);\n },\n runwayStyle: function runwayStyle() {\n return this.vertical ? { height: this.height } : {};\n },\n barStyle: function barStyle() {\n return this.vertical ? {\n height: this.barSize,\n bottom: this.barStart\n } : {\n width: this.barSize,\n left: this.barStart\n };\n },\n sliderDisabled: function sliderDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n }\n },\n\n mounted: function mounted() {\n var valuetext = void 0;\n if (this.range) {\n if (Array.isArray(this.value)) {\n this.firstValue = Math.max(this.min, this.value[0]);\n this.secondValue = Math.min(this.max, this.value[1]);\n } else {\n this.firstValue = this.min;\n this.secondValue = this.max;\n }\n this.oldValue = [this.firstValue, this.secondValue];\n valuetext = this.firstValue + \'-\' + this.secondValue;\n } else {\n if (typeof this.value !== \'number\' || isNaN(this.value)) {\n this.firstValue = this.min;\n } else {\n this.firstValue = Math.min(this.max, Math.max(this.min, this.value));\n }\n this.oldValue = this.firstValue;\n valuetext = this.firstValue;\n }\n this.$el.setAttribute(\'aria-valuetext\', valuetext);\n\n // label screen reader\n this.$el.setAttribute(\'aria-label\', this.label ? this.label : \'slider between \' + this.min + \' and \' + this.max);\n\n this.resetSize();\n window.addEventListener(\'resize\', this.resetSize);\n },\n beforeDestroy: function beforeDestroy() {\n window.removeEventListener(\'resize\', this.resetSize);\n }\n});\n// CONCATENATED MODULE: ./packages/slider/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_slider_src_mainvue_type_script_lang_js_ = (slider_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/slider/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar slider_src_main_component = normalizeComponent(\n packages_slider_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_32708644_render,\n mainvue_type_template_id_32708644_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var slider_src_main_api; }\nslider_src_main_component.options.__file = "packages/slider/src/main.vue"\n/* harmony default export */ var slider_src_main = (slider_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/slider/index.js\n\n\n/* istanbul ignore next */\nslider_src_main.install = function (Vue) {\n Vue.component(slider_src_main.name, slider_src_main);\n};\n\n/* harmony default export */ var slider = (slider_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/loading/src/loading.vue?vue&type=template&id=eee0a7ac&\nvar loadingvue_type_template_id_eee0a7ac_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n {\n attrs: { name: "el-loading-fade" },\n on: { "after-leave": _vm.handleAfterLeave }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-loading-mask",\n class: [_vm.customClass, { "is-fullscreen": _vm.fullscreen }],\n style: { backgroundColor: _vm.background || "" }\n },\n [\n _c("div", { staticClass: "el-loading-spinner" }, [\n !_vm.spinner\n ? _c(\n "svg",\n {\n staticClass: "circular",\n attrs: { viewBox: "25 25 50 50" }\n },\n [\n _c("circle", {\n staticClass: "path",\n attrs: { cx: "50", cy: "50", r: "20", fill: "none" }\n })\n ]\n )\n : _c("i", { class: _vm.spinner }),\n _vm.text\n ? _c("p", { staticClass: "el-loading-text" }, [\n _vm._v(_vm._s(_vm.text))\n ])\n : _vm._e()\n ])\n ]\n )\n ]\n )\n}\nvar loadingvue_type_template_id_eee0a7ac_staticRenderFns = []\nloadingvue_type_template_id_eee0a7ac_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/loading/src/loading.vue?vue&type=template&id=eee0a7ac&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/loading/src/loading.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/* harmony default export */ var loadingvue_type_script_lang_js_ = ({\n data: function data() {\n return {\n text: null,\n spinner: null,\n background: null,\n fullscreen: true,\n visible: false,\n customClass: \'\'\n };\n },\n\n\n methods: {\n handleAfterLeave: function handleAfterLeave() {\n this.$emit(\'after-leave\');\n },\n setText: function setText(text) {\n this.text = text;\n }\n }\n});\n// CONCATENATED MODULE: ./packages/loading/src/loading.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_loadingvue_type_script_lang_js_ = (loadingvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/loading/src/loading.vue\n\n\n\n\n\n/* normalize component */\n\nvar loading_component = normalizeComponent(\n src_loadingvue_type_script_lang_js_,\n loadingvue_type_template_id_eee0a7ac_render,\n loadingvue_type_template_id_eee0a7ac_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var loading_api; }\nloading_component.options.__file = "packages/loading/src/loading.vue"\n/* harmony default export */ var loading = (loading_component.exports);\n// EXTERNAL MODULE: external "element-ui/lib/utils/after-leave"\nvar after_leave_ = __webpack_require__(33);\nvar after_leave_default = /*#__PURE__*/__webpack_require__.n(after_leave_);\n\n// CONCATENATED MODULE: ./packages/loading/src/directive.js\n\n\n\n\n\nvar Mask = external_vue_default.a.extend(loading);\n\nvar loadingDirective = {};\nloadingDirective.install = function (Vue) {\n if (Vue.prototype.$isServer) return;\n var toggleLoading = function toggleLoading(el, binding) {\n if (binding.value) {\n Vue.nextTick(function () {\n if (binding.modifiers.fullscreen) {\n el.originalPosition = Object(dom_["getStyle"])(document.body, \'position\');\n el.originalOverflow = Object(dom_["getStyle"])(document.body, \'overflow\');\n el.maskStyle.zIndex = popup_["PopupManager"].nextZIndex();\n\n Object(dom_["addClass"])(el.mask, \'is-fullscreen\');\n insertDom(document.body, el, binding);\n } else {\n Object(dom_["removeClass"])(el.mask, \'is-fullscreen\');\n\n if (binding.modifiers.body) {\n el.originalPosition = Object(dom_["getStyle"])(document.body, \'position\');\n\n [\'top\', \'left\'].forEach(function (property) {\n var scroll = property === \'top\' ? \'scrollTop\' : \'scrollLeft\';\n el.maskStyle[property] = el.getBoundingClientRect()[property] + document.body[scroll] + document.documentElement[scroll] - parseInt(Object(dom_["getStyle"])(document.body, \'margin-\' + property), 10) + \'px\';\n });\n [\'height\', \'width\'].forEach(function (property) {\n el.maskStyle[property] = el.getBoundingClientRect()[property] + \'px\';\n });\n\n insertDom(document.body, el, binding);\n } else {\n el.originalPosition = Object(dom_["getStyle"])(el, \'position\');\n insertDom(el, el, binding);\n }\n }\n });\n } else {\n after_leave_default()(el.instance, function (_) {\n if (!el.instance.hiding) return;\n el.domVisible = false;\n var target = binding.modifiers.fullscreen || binding.modifiers.body ? document.body : el;\n Object(dom_["removeClass"])(target, \'el-loading-parent--relative\');\n Object(dom_["removeClass"])(target, \'el-loading-parent--hidden\');\n el.instance.hiding = false;\n }, 300, true);\n el.instance.visible = false;\n el.instance.hiding = true;\n }\n };\n var insertDom = function insertDom(parent, el, binding) {\n if (!el.domVisible && Object(dom_["getStyle"])(el, \'display\') !== \'none\' && Object(dom_["getStyle"])(el, \'visibility\') !== \'hidden\') {\n Object.keys(el.maskStyle).forEach(function (property) {\n el.mask.style[property] = el.maskStyle[property];\n });\n\n if (el.originalPosition !== \'absolute\' && el.originalPosition !== \'fixed\' && el.originalPosition !== \'sticky\') {\n Object(dom_["addClass"])(parent, \'el-loading-parent--relative\');\n }\n if (binding.modifiers.fullscreen && binding.modifiers.lock) {\n Object(dom_["addClass"])(parent, \'el-loading-parent--hidden\');\n }\n el.domVisible = true;\n\n parent.appendChild(el.mask);\n Vue.nextTick(function () {\n if (el.instance.hiding) {\n el.instance.$emit(\'after-leave\');\n } else {\n el.instance.visible = true;\n }\n });\n el.domInserted = true;\n } else if (el.domVisible && el.instance.hiding === true) {\n el.instance.visible = true;\n el.instance.hiding = false;\n }\n };\n\n Vue.directive(\'loading\', {\n bind: function bind(el, binding, vnode) {\n var textExr = el.getAttribute(\'element-loading-text\');\n var spinnerExr = el.getAttribute(\'element-loading-spinner\');\n var backgroundExr = el.getAttribute(\'element-loading-background\');\n var customClassExr = el.getAttribute(\'element-loading-custom-class\');\n var vm = vnode.context;\n var mask = new Mask({\n el: document.createElement(\'div\'),\n data: {\n text: vm && vm[textExr] || textExr,\n spinner: vm && vm[spinnerExr] || spinnerExr,\n background: vm && vm[backgroundExr] || backgroundExr,\n customClass: vm && vm[customClassExr] || customClassExr,\n fullscreen: !!binding.modifiers.fullscreen\n }\n });\n el.instance = mask;\n el.mask = mask.$el;\n el.maskStyle = {};\n\n binding.value && toggleLoading(el, binding);\n },\n\n update: function update(el, binding) {\n el.instance.setText(el.getAttribute(\'element-loading-text\'));\n if (binding.oldValue !== binding.value) {\n toggleLoading(el, binding);\n }\n },\n\n unbind: function unbind(el, binding) {\n if (el.domInserted) {\n el.mask && el.mask.parentNode && el.mask.parentNode.removeChild(el.mask);\n toggleLoading(el, { value: false, modifiers: binding.modifiers });\n }\n el.instance && el.instance.$destroy();\n }\n });\n};\n\n/* harmony default export */ var src_directive = (loadingDirective);\n// CONCATENATED MODULE: ./packages/loading/src/index.js\n\n\n\n\n\n\n\nvar LoadingConstructor = external_vue_default.a.extend(loading);\n\nvar src_defaults = {\n text: null,\n fullscreen: true,\n body: false,\n lock: false,\n customClass: \'\'\n};\n\nvar fullscreenLoading = void 0;\n\nLoadingConstructor.prototype.originalPosition = \'\';\nLoadingConstructor.prototype.originalOverflow = \'\';\n\nLoadingConstructor.prototype.close = function () {\n var _this = this;\n\n if (this.fullscreen) {\n fullscreenLoading = undefined;\n }\n after_leave_default()(this, function (_) {\n var target = _this.fullscreen || _this.body ? document.body : _this.target;\n Object(dom_["removeClass"])(target, \'el-loading-parent--relative\');\n Object(dom_["removeClass"])(target, \'el-loading-parent--hidden\');\n if (_this.$el && _this.$el.parentNode) {\n _this.$el.parentNode.removeChild(_this.$el);\n }\n _this.$destroy();\n }, 300);\n this.visible = false;\n};\n\nvar src_addStyle = function addStyle(options, parent, instance) {\n var maskStyle = {};\n if (options.fullscreen) {\n instance.originalPosition = Object(dom_["getStyle"])(document.body, \'position\');\n instance.originalOverflow = Object(dom_["getStyle"])(document.body, \'overflow\');\n maskStyle.zIndex = popup_["PopupManager"].nextZIndex();\n } else if (options.body) {\n instance.originalPosition = Object(dom_["getStyle"])(document.body, \'position\');\n [\'top\', \'left\'].forEach(function (property) {\n var scroll = property === \'top\' ? \'scrollTop\' : \'scrollLeft\';\n maskStyle[property] = options.target.getBoundingClientRect()[property] + document.body[scroll] + document.documentElement[scroll] + \'px\';\n });\n [\'height\', \'width\'].forEach(function (property) {\n maskStyle[property] = options.target.getBoundingClientRect()[property] + \'px\';\n });\n } else {\n instance.originalPosition = Object(dom_["getStyle"])(parent, \'position\');\n }\n Object.keys(maskStyle).forEach(function (property) {\n instance.$el.style[property] = maskStyle[property];\n });\n};\n\nvar src_Loading = function Loading() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (external_vue_default.a.prototype.$isServer) return;\n options = merge_default()({}, src_defaults, options);\n if (typeof options.target === \'string\') {\n options.target = document.querySelector(options.target);\n }\n options.target = options.target || document.body;\n if (options.target !== document.body) {\n options.fullscreen = false;\n } else {\n options.body = true;\n }\n if (options.fullscreen && fullscreenLoading) {\n return fullscreenLoading;\n }\n\n var parent = options.body ? document.body : options.target;\n var instance = new LoadingConstructor({\n el: document.createElement(\'div\'),\n data: options\n });\n\n src_addStyle(options, parent, instance);\n if (instance.originalPosition !== \'absolute\' && instance.originalPosition !== \'fixed\' && instance.originalPosition !== \'sticky\') {\n Object(dom_["addClass"])(parent, \'el-loading-parent--relative\');\n }\n if (options.fullscreen && options.lock) {\n Object(dom_["addClass"])(parent, \'el-loading-parent--hidden\');\n }\n parent.appendChild(instance.$el);\n external_vue_default.a.nextTick(function () {\n instance.visible = true;\n });\n if (options.fullscreen) {\n fullscreenLoading = instance;\n }\n return instance;\n};\n\n/* harmony default export */ var src = (src_Loading);\n// CONCATENATED MODULE: ./packages/loading/index.js\n\n\n\n/* harmony default export */ var packages_loading = ({\n install: function install(Vue) {\n Vue.use(src_directive);\n Vue.prototype.$loading = src;\n },\n\n directive: src_directive,\n service: src\n});\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/icon/src/icon.vue?vue&type=template&id=cb3fe7f4&\nvar iconvue_type_template_id_cb3fe7f4_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("i", { class: "el-icon-" + _vm.name })\n}\nvar iconvue_type_template_id_cb3fe7f4_staticRenderFns = []\niconvue_type_template_id_cb3fe7f4_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/icon/src/icon.vue?vue&type=template&id=cb3fe7f4&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/icon/src/icon.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n\n/* harmony default export */ var iconvue_type_script_lang_js_ = ({\n name: \'ElIcon\',\n\n props: {\n name: String\n }\n});\n// CONCATENATED MODULE: ./packages/icon/src/icon.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_iconvue_type_script_lang_js_ = (iconvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/icon/src/icon.vue\n\n\n\n\n\n/* normalize component */\n\nvar icon_component = normalizeComponent(\n src_iconvue_type_script_lang_js_,\n iconvue_type_template_id_cb3fe7f4_render,\n iconvue_type_template_id_cb3fe7f4_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var icon_api; }\nicon_component.options.__file = "packages/icon/src/icon.vue"\n/* harmony default export */ var icon = (icon_component.exports);\n// CONCATENATED MODULE: ./packages/icon/index.js\n\n\n/* istanbul ignore next */\nicon.install = function (Vue) {\n Vue.component(icon.name, icon);\n};\n\n/* harmony default export */ var packages_icon = (icon);\n// CONCATENATED MODULE: ./packages/row/src/row.js\n/* harmony default export */ var src_row = ({\n name: \'ElRow\',\n\n componentName: \'ElRow\',\n\n props: {\n tag: {\n type: String,\n default: \'div\'\n },\n gutter: Number,\n type: String,\n justify: {\n type: String,\n default: \'start\'\n },\n align: String\n },\n\n computed: {\n style: function style() {\n var ret = {};\n\n if (this.gutter) {\n ret.marginLeft = \'-\' + this.gutter / 2 + \'px\';\n ret.marginRight = ret.marginLeft;\n }\n\n return ret;\n }\n },\n\n render: function render(h) {\n return h(this.tag, {\n class: [\'el-row\', this.justify !== \'start\' ? \'is-justify-\' + this.justify : \'\', this.align ? \'is-align-\' + this.align : \'\', { \'el-row--flex\': this.type === \'flex\' }],\n style: this.style\n }, this.$slots.default);\n }\n});\n// CONCATENATED MODULE: ./packages/row/index.js\n\n\n/* istanbul ignore next */\nsrc_row.install = function (Vue) {\n Vue.component(src_row.name, src_row);\n};\n\n/* harmony default export */ var packages_row = (src_row);\n// CONCATENATED MODULE: ./packages/col/src/col.js\nvar col_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\n/* harmony default export */ var col = ({\n name: \'ElCol\',\n\n props: {\n span: {\n type: Number,\n default: 24\n },\n tag: {\n type: String,\n default: \'div\'\n },\n offset: Number,\n pull: Number,\n push: Number,\n xs: [Number, Object],\n sm: [Number, Object],\n md: [Number, Object],\n lg: [Number, Object],\n xl: [Number, Object]\n },\n\n computed: {\n gutter: function gutter() {\n var parent = this.$parent;\n while (parent && parent.$options.componentName !== \'ElRow\') {\n parent = parent.$parent;\n }\n return parent ? parent.gutter : 0;\n }\n },\n render: function render(h) {\n var _this = this;\n\n var classList = [];\n var style = {};\n\n if (this.gutter) {\n style.paddingLeft = this.gutter / 2 + \'px\';\n style.paddingRight = style.paddingLeft;\n }\n\n [\'span\', \'offset\', \'pull\', \'push\'].forEach(function (prop) {\n if (_this[prop] || _this[prop] === 0) {\n classList.push(prop !== \'span\' ? \'el-col-\' + prop + \'-\' + _this[prop] : \'el-col-\' + _this[prop]);\n }\n });\n\n [\'xs\', \'sm\', \'md\', \'lg\', \'xl\'].forEach(function (size) {\n if (typeof _this[size] === \'number\') {\n classList.push(\'el-col-\' + size + \'-\' + _this[size]);\n } else if (col_typeof(_this[size]) === \'object\') {\n var props = _this[size];\n Object.keys(props).forEach(function (prop) {\n classList.push(prop !== \'span\' ? \'el-col-\' + size + \'-\' + prop + \'-\' + props[prop] : \'el-col-\' + size + \'-\' + props[prop]);\n });\n }\n });\n\n return h(this.tag, {\n class: [\'el-col\', classList],\n style: style\n }, this.$slots.default);\n }\n});\n// CONCATENATED MODULE: ./packages/col/index.js\n\n\n/* istanbul ignore next */\ncol.install = function (Vue) {\n Vue.component(col.name, col);\n};\n\n/* harmony default export */ var packages_col = (col);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/upload/src/upload-list.vue?vue&type=template&id=173fedf5&\nvar upload_listvue_type_template_id_173fedf5_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition-group",\n {\n class: [\n "el-upload-list",\n "el-upload-list--" + _vm.listType,\n { "is-disabled": _vm.disabled }\n ],\n attrs: { tag: "ul", name: "el-list" }\n },\n _vm._l(_vm.files, function(file) {\n return _c(\n "li",\n {\n key: file.uid,\n class: [\n "el-upload-list__item",\n "is-" + file.status,\n _vm.focusing ? "focusing" : ""\n ],\n attrs: { tabindex: "0" },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "delete", [8, 46], $event.key, [\n "Backspace",\n "Delete",\n "Del"\n ])\n ) {\n return null\n }\n !_vm.disabled && _vm.$emit("remove", file)\n },\n focus: function($event) {\n _vm.focusing = true\n },\n blur: function($event) {\n _vm.focusing = false\n },\n click: function($event) {\n _vm.focusing = false\n }\n }\n },\n [\n _vm._t(\n "default",\n [\n file.status !== "uploading" &&\n ["picture-card", "picture"].indexOf(_vm.listType) > -1\n ? _c("img", {\n staticClass: "el-upload-list__item-thumbnail",\n attrs: { src: file.url, alt: "" }\n })\n : _vm._e(),\n _c(\n "a",\n {\n staticClass: "el-upload-list__item-name",\n on: {\n click: function($event) {\n _vm.handleClick(file)\n }\n }\n },\n [\n _c("i", { staticClass: "el-icon-document" }),\n _vm._v(_vm._s(file.name) + "\\n ")\n ]\n ),\n _c(\n "label",\n { staticClass: "el-upload-list__item-status-label" },\n [\n _c("i", {\n class: {\n "el-icon-upload-success": true,\n "el-icon-circle-check": _vm.listType === "text",\n "el-icon-check":\n ["picture-card", "picture"].indexOf(_vm.listType) > -1\n }\n })\n ]\n ),\n !_vm.disabled\n ? _c("i", {\n staticClass: "el-icon-close",\n on: {\n click: function($event) {\n _vm.$emit("remove", file)\n }\n }\n })\n : _vm._e(),\n !_vm.disabled\n ? _c("i", { staticClass: "el-icon-close-tip" }, [\n _vm._v(_vm._s(_vm.t("el.upload.deleteTip")))\n ])\n : _vm._e(),\n file.status === "uploading"\n ? _c("el-progress", {\n attrs: {\n type: _vm.listType === "picture-card" ? "circle" : "line",\n "stroke-width": _vm.listType === "picture-card" ? 6 : 2,\n percentage: _vm.parsePercentage(file.percentage)\n }\n })\n : _vm._e(),\n _vm.listType === "picture-card"\n ? _c("span", { staticClass: "el-upload-list__item-actions" }, [\n _vm.handlePreview && _vm.listType === "picture-card"\n ? _c(\n "span",\n {\n staticClass: "el-upload-list__item-preview",\n on: {\n click: function($event) {\n _vm.handlePreview(file)\n }\n }\n },\n [_c("i", { staticClass: "el-icon-zoom-in" })]\n )\n : _vm._e(),\n !_vm.disabled\n ? _c(\n "span",\n {\n staticClass: "el-upload-list__item-delete",\n on: {\n click: function($event) {\n _vm.$emit("remove", file)\n }\n }\n },\n [_c("i", { staticClass: "el-icon-delete" })]\n )\n : _vm._e()\n ])\n : _vm._e()\n ],\n { file: file }\n )\n ],\n 2\n )\n }),\n 0\n )\n}\nvar upload_listvue_type_template_id_173fedf5_staticRenderFns = []\nupload_listvue_type_template_id_173fedf5_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/upload/src/upload-list.vue?vue&type=template&id=173fedf5&\n\n// EXTERNAL MODULE: external "element-ui/lib/progress"\nvar progress_ = __webpack_require__(34);\nvar progress_default = /*#__PURE__*/__webpack_require__.n(progress_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/upload/src/upload-list.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//\n//\n//\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 */ var upload_listvue_type_script_lang_js_ = ({\n\n name: \'ElUploadList\',\n\n mixins: [locale_default.a],\n\n data: function data() {\n return {\n focusing: false\n };\n },\n\n components: { ElProgress: progress_default.a },\n\n props: {\n files: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n disabled: {\n type: Boolean,\n default: false\n },\n handlePreview: Function,\n listType: String\n },\n methods: {\n parsePercentage: function parsePercentage(val) {\n return parseInt(val, 10);\n },\n handleClick: function handleClick(file) {\n this.handlePreview && this.handlePreview(file);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/upload/src/upload-list.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_upload_listvue_type_script_lang_js_ = (upload_listvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/upload/src/upload-list.vue\n\n\n\n\n\n/* normalize component */\n\nvar upload_list_component = normalizeComponent(\n src_upload_listvue_type_script_lang_js_,\n upload_listvue_type_template_id_173fedf5_render,\n upload_listvue_type_template_id_173fedf5_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var upload_list_api; }\nupload_list_component.options.__file = "packages/upload/src/upload-list.vue"\n/* harmony default export */ var upload_list = (upload_list_component.exports);\n// EXTERNAL MODULE: external "babel-helper-vue-jsx-merge-props"\nvar external_babel_helper_vue_jsx_merge_props_ = __webpack_require__(24);\nvar external_babel_helper_vue_jsx_merge_props_default = /*#__PURE__*/__webpack_require__.n(external_babel_helper_vue_jsx_merge_props_);\n\n// CONCATENATED MODULE: ./packages/upload/src/ajax.js\nfunction getError(action, option, xhr) {\n var msg = void 0;\n if (xhr.response) {\n msg = \'\' + (xhr.response.error || xhr.response);\n } else if (xhr.responseText) {\n msg = \'\' + xhr.responseText;\n } else {\n msg = \'fail to post \' + action + \' \' + xhr.status;\n }\n\n var err = new Error(msg);\n err.status = xhr.status;\n err.method = \'post\';\n err.url = action;\n return err;\n}\n\nfunction getBody(xhr) {\n var text = xhr.responseText || xhr.response;\n if (!text) {\n return text;\n }\n\n try {\n return JSON.parse(text);\n } catch (e) {\n return text;\n }\n}\n\nfunction upload(option) {\n if (typeof XMLHttpRequest === \'undefined\') {\n return;\n }\n\n var xhr = new XMLHttpRequest();\n var action = option.action;\n\n if (xhr.upload) {\n xhr.upload.onprogress = function progress(e) {\n if (e.total > 0) {\n e.percent = e.loaded / e.total * 100;\n }\n option.onProgress(e);\n };\n }\n\n var formData = new FormData();\n\n if (option.data) {\n Object.keys(option.data).forEach(function (key) {\n formData.append(key, option.data[key]);\n });\n }\n\n formData.append(option.filename, option.file, option.file.name);\n\n xhr.onerror = function error(e) {\n option.onError(e);\n };\n\n xhr.onload = function onload() {\n if (xhr.status < 200 || xhr.status >= 300) {\n return option.onError(getError(action, option, xhr));\n }\n\n option.onSuccess(getBody(xhr));\n };\n\n xhr.open(\'post\', action, true);\n\n if (option.withCredentials && \'withCredentials\' in xhr) {\n xhr.withCredentials = true;\n }\n\n var headers = option.headers || {};\n\n for (var item in headers) {\n if (headers.hasOwnProperty(item) && headers[item] !== null) {\n xhr.setRequestHeader(item, headers[item]);\n }\n }\n xhr.send(formData);\n return xhr;\n}\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/upload/src/upload-dragger.vue?vue&type=template&id=7ebbf219&\nvar upload_draggervue_type_template_id_7ebbf219_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 staticClass: "el-upload-dragger",\n class: {\n "is-dragover": _vm.dragover\n },\n on: {\n drop: function($event) {\n $event.preventDefault()\n return _vm.onDrop($event)\n },\n dragover: function($event) {\n $event.preventDefault()\n return _vm.onDragover($event)\n },\n dragleave: function($event) {\n $event.preventDefault()\n _vm.dragover = false\n }\n }\n },\n [_vm._t("default")],\n 2\n )\n}\nvar upload_draggervue_type_template_id_7ebbf219_staticRenderFns = []\nupload_draggervue_type_template_id_7ebbf219_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/upload/src/upload-dragger.vue?vue&type=template&id=7ebbf219&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/upload/src/upload-dragger.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var upload_draggervue_type_script_lang_js_ = ({\n name: \'ElUploadDrag\',\n props: {\n disabled: Boolean\n },\n inject: {\n uploader: {\n default: \'\'\n }\n },\n data: function data() {\n return {\n dragover: false\n };\n },\n\n methods: {\n onDragover: function onDragover() {\n if (!this.disabled) {\n this.dragover = true;\n }\n },\n onDrop: function onDrop(e) {\n if (this.disabled || !this.uploader) return;\n var accept = this.uploader.accept;\n this.dragover = false;\n if (!accept) {\n this.$emit(\'file\', e.dataTransfer.files);\n return;\n }\n this.$emit(\'file\', [].slice.call(e.dataTransfer.files).filter(function (file) {\n var type = file.type,\n name = file.name;\n\n var extension = name.indexOf(\'.\') > -1 ? \'.\' + name.split(\'.\').pop() : \'\';\n var baseType = type.replace(/\\/.*$/, \'\');\n return accept.split(\',\').map(function (type) {\n return type.trim();\n }).filter(function (type) {\n return type;\n }).some(function (acceptedType) {\n if (/\\..+$/.test(acceptedType)) {\n return extension === acceptedType;\n }\n if (/\\/\\*$/.test(acceptedType)) {\n return baseType === acceptedType.replace(/\\/\\*$/, \'\');\n }\n if (/^[^\\/]+\\/[^\\/]+$/.test(acceptedType)) {\n return type === acceptedType;\n }\n return false;\n });\n }));\n }\n }\n});\n// CONCATENATED MODULE: ./packages/upload/src/upload-dragger.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_upload_draggervue_type_script_lang_js_ = (upload_draggervue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/upload/src/upload-dragger.vue\n\n\n\n\n\n/* normalize component */\n\nvar upload_dragger_component = normalizeComponent(\n src_upload_draggervue_type_script_lang_js_,\n upload_draggervue_type_template_id_7ebbf219_render,\n upload_draggervue_type_template_id_7ebbf219_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var upload_dragger_api; }\nupload_dragger_component.options.__file = "packages/upload/src/upload-dragger.vue"\n/* harmony default export */ var upload_dragger = (upload_dragger_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/upload/src/upload.vue?vue&type=script&lang=js&\n\n\n\n\n\n/* harmony default export */ var uploadvue_type_script_lang_js_ = ({\n inject: [\'uploader\'],\n components: {\n UploadDragger: upload_dragger\n },\n props: {\n type: String,\n action: {\n type: String,\n required: true\n },\n name: {\n type: String,\n default: \'file\'\n },\n data: Object,\n headers: Object,\n withCredentials: Boolean,\n multiple: Boolean,\n accept: String,\n onStart: Function,\n onProgress: Function,\n onSuccess: Function,\n onError: Function,\n beforeUpload: Function,\n drag: Boolean,\n onPreview: {\n type: Function,\n default: function _default() {}\n },\n onRemove: {\n type: Function,\n default: function _default() {}\n },\n fileList: Array,\n autoUpload: Boolean,\n listType: String,\n httpRequest: {\n type: Function,\n default: upload\n },\n disabled: Boolean,\n limit: Number,\n onExceed: Function\n },\n\n data: function data() {\n return {\n mouseover: false,\n reqs: {}\n };\n },\n\n\n methods: {\n isImage: function isImage(str) {\n return str.indexOf(\'image\') !== -1;\n },\n handleChange: function handleChange(ev) {\n var files = ev.target.files;\n\n if (!files) return;\n this.uploadFiles(files);\n },\n uploadFiles: function uploadFiles(files) {\n var _this = this;\n\n if (this.limit && this.fileList.length + files.length > this.limit) {\n this.onExceed && this.onExceed(files, this.fileList);\n return;\n }\n\n var postFiles = Array.prototype.slice.call(files);\n if (!this.multiple) {\n postFiles = postFiles.slice(0, 1);\n }\n\n if (postFiles.length === 0) {\n return;\n }\n\n postFiles.forEach(function (rawFile) {\n _this.onStart(rawFile);\n if (_this.autoUpload) _this.upload(rawFile);\n });\n },\n upload: function upload(rawFile) {\n var _this2 = this;\n\n this.$refs.input.value = null;\n\n if (!this.beforeUpload) {\n return this.post(rawFile);\n }\n\n var before = this.beforeUpload(rawFile);\n if (before && before.then) {\n before.then(function (processedFile) {\n var fileType = Object.prototype.toString.call(processedFile);\n\n if (fileType === \'[object File]\' || fileType === \'[object Blob]\') {\n if (fileType === \'[object Blob]\') {\n processedFile = new File([processedFile], rawFile.name, {\n type: rawFile.type\n });\n }\n for (var p in rawFile) {\n if (rawFile.hasOwnProperty(p)) {\n processedFile[p] = rawFile[p];\n }\n }\n _this2.post(processedFile);\n } else {\n _this2.post(rawFile);\n }\n }, function () {\n _this2.onRemove(null, rawFile);\n });\n } else if (before !== false) {\n this.post(rawFile);\n } else {\n this.onRemove(null, rawFile);\n }\n },\n abort: function abort(file) {\n var reqs = this.reqs;\n\n if (file) {\n var uid = file;\n if (file.uid) uid = file.uid;\n if (reqs[uid]) {\n reqs[uid].abort();\n }\n } else {\n Object.keys(reqs).forEach(function (uid) {\n if (reqs[uid]) reqs[uid].abort();\n delete reqs[uid];\n });\n }\n },\n post: function post(rawFile) {\n var _this3 = this;\n\n var uid = rawFile.uid;\n\n var options = {\n headers: this.headers,\n withCredentials: this.withCredentials,\n file: rawFile,\n data: this.data,\n filename: this.name,\n action: this.action,\n onProgress: function onProgress(e) {\n _this3.onProgress(e, rawFile);\n },\n onSuccess: function onSuccess(res) {\n _this3.onSuccess(res, rawFile);\n delete _this3.reqs[uid];\n },\n onError: function onError(err) {\n _this3.onError(err, rawFile);\n delete _this3.reqs[uid];\n }\n };\n var req = this.httpRequest(options);\n this.reqs[uid] = req;\n if (req && req.then) {\n req.then(options.onSuccess, options.onError);\n }\n },\n handleClick: function handleClick() {\n if (!this.disabled) {\n this.$refs.input.value = null;\n this.$refs.input.click();\n }\n },\n handleKeydown: function handleKeydown(e) {\n if (e.target !== e.currentTarget) return;\n if (e.keyCode === 13 || e.keyCode === 32) {\n this.handleClick();\n }\n }\n },\n\n render: function render(h) {\n var handleClick = this.handleClick,\n drag = this.drag,\n name = this.name,\n handleChange = this.handleChange,\n multiple = this.multiple,\n accept = this.accept,\n listType = this.listType,\n uploadFiles = this.uploadFiles,\n disabled = this.disabled,\n handleKeydown = this.handleKeydown;\n\n var data = {\n class: {\n \'el-upload\': true\n },\n on: {\n click: handleClick,\n keydown: handleKeydown\n }\n };\n data.class[\'el-upload--\' + listType] = true;\n return h(\n \'div\',\n external_babel_helper_vue_jsx_merge_props_default()([data, {\n attrs: { tabindex: \'0\' }\n }]),\n [drag ? h(\n \'upload-dragger\',\n {\n attrs: { disabled: disabled },\n on: {\n \'file\': uploadFiles\n }\n },\n [this.$slots.default]\n ) : this.$slots.default, h(\'input\', { \'class\': \'el-upload__input\', attrs: { type: \'file\', name: name, multiple: multiple, accept: accept },\n ref: \'input\', on: {\n \'change\': handleChange\n }\n })]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/upload/src/upload.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_uploadvue_type_script_lang_js_ = (uploadvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/upload/src/upload.vue\nvar upload_render, upload_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar upload_component = normalizeComponent(\n src_uploadvue_type_script_lang_js_,\n upload_render,\n upload_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var upload_api; }\nupload_component.options.__file = "packages/upload/src/upload.vue"\n/* harmony default export */ var src_upload = (upload_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/upload/src/index.vue?vue&type=script&lang=js&\n\n\n\n\n\n\nfunction srcvue_type_script_lang_js_noop() {}\n\n/* harmony default export */ var srcvue_type_script_lang_js_ = ({\n name: \'ElUpload\',\n\n mixins: [migrating_default.a],\n\n components: {\n ElProgress: progress_default.a,\n UploadList: upload_list,\n Upload: src_upload\n },\n\n provide: function provide() {\n return {\n uploader: this\n };\n },\n\n\n inject: {\n elForm: {\n default: \'\'\n }\n },\n\n props: {\n action: {\n type: String,\n required: true\n },\n headers: {\n type: Object,\n default: function _default() {\n return {};\n }\n },\n data: Object,\n multiple: Boolean,\n name: {\n type: String,\n default: \'file\'\n },\n drag: Boolean,\n dragger: Boolean,\n withCredentials: Boolean,\n showFileList: {\n type: Boolean,\n default: true\n },\n accept: String,\n type: {\n type: String,\n default: \'select\'\n },\n beforeUpload: Function,\n beforeRemove: Function,\n onRemove: {\n type: Function,\n default: srcvue_type_script_lang_js_noop\n },\n onChange: {\n type: Function,\n default: srcvue_type_script_lang_js_noop\n },\n onPreview: {\n type: Function\n },\n onSuccess: {\n type: Function,\n default: srcvue_type_script_lang_js_noop\n },\n onProgress: {\n type: Function,\n default: srcvue_type_script_lang_js_noop\n },\n onError: {\n type: Function,\n default: srcvue_type_script_lang_js_noop\n },\n fileList: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n autoUpload: {\n type: Boolean,\n default: true\n },\n listType: {\n type: String,\n default: \'text\' // text,picture,picture-card\n },\n httpRequest: Function,\n disabled: Boolean,\n limit: Number,\n onExceed: {\n type: Function,\n default: srcvue_type_script_lang_js_noop\n }\n },\n\n data: function data() {\n return {\n uploadFiles: [],\n dragOver: false,\n draging: false,\n tempIndex: 1\n };\n },\n\n\n computed: {\n uploadDisabled: function uploadDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n }\n },\n\n watch: {\n listType: function listType(type) {\n if (type === \'picture-card\' || type === \'picture\') {\n this.uploadFiles = this.uploadFiles.map(function (file) {\n if (!file.url && file.raw) {\n try {\n file.url = URL.createObjectURL(file.raw);\n } catch (err) {\n console.error(\'[Element Error][Upload]\', err);\n }\n }\n return file;\n });\n }\n },\n\n fileList: {\n immediate: true,\n handler: function handler(fileList) {\n var _this = this;\n\n this.uploadFiles = fileList.map(function (item) {\n item.uid = item.uid || Date.now() + _this.tempIndex++;\n item.status = item.status || \'success\';\n return item;\n });\n }\n }\n },\n\n methods: {\n handleStart: function handleStart(rawFile) {\n rawFile.uid = Date.now() + this.tempIndex++;\n var file = {\n status: \'ready\',\n name: rawFile.name,\n size: rawFile.size,\n percentage: 0,\n uid: rawFile.uid,\n raw: rawFile\n };\n\n if (this.listType === \'picture-card\' || this.listType === \'picture\') {\n try {\n file.url = URL.createObjectURL(rawFile);\n } catch (err) {\n console.error(\'[Element Error][Upload]\', err);\n return;\n }\n }\n\n this.uploadFiles.push(file);\n this.onChange(file, this.uploadFiles);\n },\n handleProgress: function handleProgress(ev, rawFile) {\n var file = this.getFile(rawFile);\n this.onProgress(ev, file, this.uploadFiles);\n file.status = \'uploading\';\n file.percentage = ev.percent || 0;\n },\n handleSuccess: function handleSuccess(res, rawFile) {\n var file = this.getFile(rawFile);\n\n if (file) {\n file.status = \'success\';\n file.response = res;\n\n this.onSuccess(res, file, this.uploadFiles);\n this.onChange(file, this.uploadFiles);\n }\n },\n handleError: function handleError(err, rawFile) {\n var file = this.getFile(rawFile);\n var fileList = this.uploadFiles;\n\n file.status = \'fail\';\n\n fileList.splice(fileList.indexOf(file), 1);\n\n this.onError(err, file, this.uploadFiles);\n this.onChange(file, this.uploadFiles);\n },\n handleRemove: function handleRemove(file, raw) {\n var _this2 = this;\n\n if (raw) {\n file = this.getFile(raw);\n }\n var doRemove = function doRemove() {\n _this2.abort(file);\n var fileList = _this2.uploadFiles;\n fileList.splice(fileList.indexOf(file), 1);\n _this2.onRemove(file, fileList);\n };\n\n if (!this.beforeRemove) {\n doRemove();\n } else if (typeof this.beforeRemove === \'function\') {\n var before = this.beforeRemove(file, this.uploadFiles);\n if (before && before.then) {\n before.then(function () {\n doRemove();\n }, srcvue_type_script_lang_js_noop);\n } else if (before !== false) {\n doRemove();\n }\n }\n },\n getFile: function getFile(rawFile) {\n var fileList = this.uploadFiles;\n var target = void 0;\n fileList.every(function (item) {\n target = rawFile.uid === item.uid ? item : null;\n return !target;\n });\n return target;\n },\n abort: function abort(file) {\n this.$refs[\'upload-inner\'].abort(file);\n },\n clearFiles: function clearFiles() {\n this.uploadFiles = [];\n },\n submit: function submit() {\n var _this3 = this;\n\n this.uploadFiles.filter(function (file) {\n return file.status === \'ready\';\n }).forEach(function (file) {\n _this3.$refs[\'upload-inner\'].upload(file.raw);\n });\n },\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n \'default-file-list\': \'default-file-list is renamed to file-list.\',\n \'show-upload-list\': \'show-upload-list is renamed to show-file-list.\',\n \'thumbnail-mode\': \'thumbnail-mode has been deprecated, you can implement the same effect according to this case: http://element.eleme.io/#/zh-CN/component/upload#yong-hu-tou-xiang-shang-chuan\'\n }\n };\n }\n },\n\n beforeDestroy: function beforeDestroy() {\n this.uploadFiles.forEach(function (file) {\n if (file.url && file.url.indexOf(\'blob:\') === 0) {\n URL.revokeObjectURL(file.url);\n }\n });\n },\n render: function render(h) {\n var _this4 = this;\n\n var uploadList = void 0;\n\n if (this.showFileList) {\n uploadList = h(\n upload_list,\n {\n attrs: {\n disabled: this.uploadDisabled,\n listType: this.listType,\n files: this.uploadFiles,\n\n handlePreview: this.onPreview },\n on: {\n \'remove\': this.handleRemove\n }\n },\n [function (props) {\n if (_this4.$scopedSlots.file) {\n return _this4.$scopedSlots.file({\n file: props.file\n });\n }\n }]\n );\n }\n\n var uploadData = {\n props: {\n type: this.type,\n drag: this.drag,\n action: this.action,\n multiple: this.multiple,\n \'before-upload\': this.beforeUpload,\n \'with-credentials\': this.withCredentials,\n headers: this.headers,\n name: this.name,\n data: this.data,\n accept: this.accept,\n fileList: this.uploadFiles,\n autoUpload: this.autoUpload,\n listType: this.listType,\n disabled: this.uploadDisabled,\n limit: this.limit,\n \'on-exceed\': this.onExceed,\n \'on-start\': this.handleStart,\n \'on-progress\': this.handleProgress,\n \'on-success\': this.handleSuccess,\n \'on-error\': this.handleError,\n \'on-preview\': this.onPreview,\n \'on-remove\': this.handleRemove,\n \'http-request\': this.httpRequest\n },\n ref: \'upload-inner\'\n };\n\n var trigger = this.$slots.trigger || this.$slots.default;\n var uploadComponent = h(\n \'upload\',\n uploadData,\n [trigger]\n );\n\n return h(\'div\', [this.listType === \'picture-card\' ? uploadList : \'\', this.$slots.trigger ? [uploadComponent, this.$slots.default] : uploadComponent, this.$slots.tip, this.listType !== \'picture-card\' ? uploadList : \'\']);\n }\n});\n// CONCATENATED MODULE: ./packages/upload/src/index.vue?vue&type=script&lang=js&\n /* harmony default export */ var upload_srcvue_type_script_lang_js_ = (srcvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/upload/src/index.vue\nvar src_render, src_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar upload_src_component = normalizeComponent(\n upload_srcvue_type_script_lang_js_,\n src_render,\n src_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var src_api; }\nupload_src_component.options.__file = "packages/upload/src/index.vue"\n/* harmony default export */ var upload_src = (upload_src_component.exports);\n// CONCATENATED MODULE: ./packages/upload/index.js\n\n\n/* istanbul ignore next */\nupload_src.install = function (Vue) {\n Vue.component(upload_src.name, upload_src);\n};\n\n/* harmony default export */ var packages_upload = (upload_src);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/progress/src/progress.vue?vue&type=template&id=229ee406&\nvar progressvue_type_template_id_229ee406_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 staticClass: "el-progress",\n class: [\n "el-progress--" + _vm.type,\n _vm.status ? "is-" + _vm.status : "",\n {\n "el-progress--without-text": !_vm.showText,\n "el-progress--text-inside": _vm.textInside\n }\n ],\n attrs: {\n role: "progressbar",\n "aria-valuenow": _vm.percentage,\n "aria-valuemin": "0",\n "aria-valuemax": "100"\n }\n },\n [\n _vm.type === "line"\n ? _c("div", { staticClass: "el-progress-bar" }, [\n _c(\n "div",\n {\n staticClass: "el-progress-bar__outer",\n style: {\n height: _vm.strokeWidth + "px",\n backgroundColor: _vm.defineBackColor\n }\n },\n [\n _c(\n "div",\n {\n staticClass: "el-progress-bar__inner",\n style: _vm.barStyle\n },\n [\n _vm.showText && _vm.textInside\n ? _c(\n "div",\n {\n staticClass: "el-progress-bar__innerText",\n style: { color: _vm.textColor }\n },\n [_vm._v(_vm._s(_vm.content))]\n )\n : _vm._e()\n ]\n )\n ]\n )\n ])\n : _c(\n "div",\n {\n staticClass: "el-progress-circle",\n style: { height: _vm.width + "px", width: _vm.width + "px" }\n },\n [\n _c("svg", { attrs: { viewBox: "0 0 100 100" } }, [\n _c("path", {\n staticClass: "el-progress-circle__track",\n style: _vm.trailPathStyle,\n attrs: {\n d: _vm.trackPath,\n stroke: _vm.defineBackColor,\n "stroke-width": _vm.relativeStrokeWidth,\n fill: "none"\n }\n }),\n _c("path", {\n staticClass: "el-progress-circle__path",\n style: _vm.circlePathStyle,\n attrs: {\n d: _vm.trackPath,\n stroke: _vm.stroke,\n fill: "none",\n "stroke-linecap": _vm.strokeLinecap,\n "stroke-width": _vm.percentage ? _vm.relativeStrokeWidth : 0\n }\n })\n ])\n ]\n ),\n _vm.showText && !_vm.textInside\n ? _c(\n "div",\n {\n staticClass: "el-progress__text",\n style: {\n fontSize: _vm.progressTextSize + "px",\n color: _vm.textColor\n }\n },\n [\n !_vm.status\n ? [_vm._v(_vm._s(_vm.content))]\n : _c("i", { class: _vm.iconClass })\n ],\n 2\n )\n : _vm._e()\n ]\n )\n}\nvar progressvue_type_template_id_229ee406_staticRenderFns = []\nprogressvue_type_template_id_229ee406_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/progress/src/progress.vue?vue&type=template&id=229ee406&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/progress/src/progress.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var progressvue_type_script_lang_js_ = ({\n name: \'ElProgress\',\n props: {\n type: {\n type: String,\n default: \'line\',\n validator: function validator(val) {\n return [\'line\', \'circle\', \'dashboard\'].indexOf(val) > -1;\n }\n },\n percentage: {\n type: Number,\n default: 0,\n required: true,\n validator: function validator(val) {\n return val >= 0 && val <= 100;\n }\n },\n status: {\n type: String,\n validator: function validator(val) {\n return [\'success\', \'exception\', \'warning\'].indexOf(val) > -1;\n }\n },\n strokeWidth: {\n type: Number,\n default: 6\n },\n strokeLinecap: {\n type: String,\n default: \'round\'\n },\n textInside: {\n type: Boolean,\n default: false\n },\n width: {\n type: Number,\n default: 126\n },\n showText: {\n type: Boolean,\n default: true\n },\n color: {\n type: [String, Array, Function],\n default: \'\'\n },\n defineBackColor: {\n type: [String, Array, Function],\n default: \'#ebeef5\'\n },\n textColor: {\n type: [String, Array, Function],\n default: \'#606266\'\n },\n format: Function\n },\n computed: {\n barStyle: function barStyle() {\n var style = {};\n style.width = this.percentage + \'%\';\n style.backgroundColor = this.getCurrentColor(this.percentage);\n return style;\n },\n relativeStrokeWidth: function relativeStrokeWidth() {\n return (this.strokeWidth / this.width * 100).toFixed(1);\n },\n radius: function radius() {\n if (this.type === \'circle\' || this.type === \'dashboard\') {\n return parseInt(50 - parseFloat(this.relativeStrokeWidth) / 2, 10);\n } else {\n return 0;\n }\n },\n trackPath: function trackPath() {\n var radius = this.radius;\n var isDashboard = this.type === \'dashboard\';\n return \'\\n M 50 50\\n m 0 \' + (isDashboard ? \'\' : \'-\') + radius + \'\\n a \' + radius + \' \' + radius + \' 0 1 1 0 \' + (isDashboard ? \'-\' : \'\') + radius * 2 + \'\\n a \' + radius + \' \' + radius + \' 0 1 1 0 \' + (isDashboard ? \'\' : \'-\') + radius * 2 + \'\\n \';\n },\n perimeter: function perimeter() {\n return 2 * Math.PI * this.radius;\n },\n rate: function rate() {\n return this.type === \'dashboard\' ? 0.75 : 1;\n },\n strokeDashoffset: function strokeDashoffset() {\n var offset = -1 * this.perimeter * (1 - this.rate) / 2;\n return offset + \'px\';\n },\n trailPathStyle: function trailPathStyle() {\n return {\n strokeDasharray: this.perimeter * this.rate + \'px, \' + this.perimeter + \'px\',\n strokeDashoffset: this.strokeDashoffset\n };\n },\n circlePathStyle: function circlePathStyle() {\n return {\n strokeDasharray: this.perimeter * this.rate * (this.percentage / 100) + \'px, \' + this.perimeter + \'px\',\n strokeDashoffset: this.strokeDashoffset,\n transition: \'stroke-dasharray 0.6s ease 0s, stroke 0.6s ease\'\n };\n },\n stroke: function stroke() {\n var ret = void 0;\n if (this.color) {\n ret = this.getCurrentColor(this.percentage);\n } else {\n switch (this.status) {\n case \'success\':\n ret = \'#13ce66\';\n break;\n case \'exception\':\n ret = \'#ff4949\';\n break;\n case \'warning\':\n ret = \'#e6a23c\';\n break;\n default:\n ret = \'#20a0ff\';\n }\n }\n return ret;\n },\n iconClass: function iconClass() {\n if (this.status === \'warning\') {\n return \'el-icon-warning\';\n }\n if (this.type === \'line\') {\n return this.status === \'success\' ? \'el-icon-circle-check\' : \'el-icon-circle-close\';\n } else {\n return this.status === \'success\' ? \'el-icon-check\' : \'el-icon-close\';\n }\n },\n progressTextSize: function progressTextSize() {\n return this.type === \'line\' ? 12 + this.strokeWidth * 0.4 : this.width * 0.111111 + 2;\n },\n content: function content() {\n if (typeof this.format === \'function\') {\n return this.format(this.percentage) || \'\';\n } else {\n return this.percentage + \'%\';\n }\n }\n },\n methods: {\n getCurrentColor: function getCurrentColor(percentage) {\n if (typeof this.color === \'function\') {\n return this.color(percentage);\n } else if (typeof this.color === \'string\') {\n return this.color;\n } else {\n return this.getLevelColor(percentage);\n }\n },\n getLevelColor: function getLevelColor(percentage) {\n var colorArray = this.getColorArray().sort(function (a, b) {\n return a.percentage - b.percentage;\n });\n\n for (var i = 0; i < colorArray.length; i++) {\n if (colorArray[i].percentage > percentage) {\n return colorArray[i].color;\n }\n }\n return colorArray[colorArray.length - 1].color;\n },\n getColorArray: function getColorArray() {\n var color = this.color;\n var span = 100 / color.length;\n return color.map(function (seriesColor, index) {\n if (typeof seriesColor === \'string\') {\n return {\n color: seriesColor,\n percentage: (index + 1) * span\n };\n }\n return seriesColor;\n });\n }\n }\n});\n// CONCATENATED MODULE: ./packages/progress/src/progress.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_progressvue_type_script_lang_js_ = (progressvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/progress/src/progress.vue\n\n\n\n\n\n/* normalize component */\n\nvar progress_component = normalizeComponent(\n src_progressvue_type_script_lang_js_,\n progressvue_type_template_id_229ee406_render,\n progressvue_type_template_id_229ee406_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var progress_api; }\nprogress_component.options.__file = "packages/progress/src/progress.vue"\n/* harmony default export */ var progress = (progress_component.exports);\n// CONCATENATED MODULE: ./packages/progress/index.js\n\n\n/* istanbul ignore next */\nprogress.install = function (Vue) {\n Vue.component(progress.name, progress);\n};\n\n/* harmony default export */ var packages_progress = (progress);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/spinner/src/spinner.vue?vue&type=template&id=697b8538&\nvar spinnervue_type_template_id_697b8538_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("span", { staticClass: "el-spinner" }, [\n _c(\n "svg",\n {\n staticClass: "el-spinner-inner",\n style: { width: _vm.radius / 2 + "px", height: _vm.radius / 2 + "px" },\n attrs: { viewBox: "0 0 50 50" }\n },\n [\n _c("circle", {\n staticClass: "path",\n attrs: {\n cx: "25",\n cy: "25",\n r: "20",\n fill: "none",\n stroke: _vm.strokeColor,\n "stroke-width": _vm.strokeWidth\n }\n })\n ]\n )\n ])\n}\nvar spinnervue_type_template_id_697b8538_staticRenderFns = []\nspinnervue_type_template_id_697b8538_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/spinner/src/spinner.vue?vue&type=template&id=697b8538&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/spinner/src/spinner.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var spinnervue_type_script_lang_js_ = ({\n name: \'ElSpinner\',\n props: {\n type: String,\n radius: {\n type: Number,\n default: 100\n },\n strokeWidth: {\n type: Number,\n default: 5\n },\n strokeColor: {\n type: String,\n default: \'#efefef\'\n }\n }\n});\n// CONCATENATED MODULE: ./packages/spinner/src/spinner.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_spinnervue_type_script_lang_js_ = (spinnervue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/spinner/src/spinner.vue\n\n\n\n\n\n/* normalize component */\n\nvar spinner_component = normalizeComponent(\n src_spinnervue_type_script_lang_js_,\n spinnervue_type_template_id_697b8538_render,\n spinnervue_type_template_id_697b8538_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var spinner_api; }\nspinner_component.options.__file = "packages/spinner/src/spinner.vue"\n/* harmony default export */ var spinner = (spinner_component.exports);\n// CONCATENATED MODULE: ./packages/spinner/index.js\n\n\n/* istanbul ignore next */\nspinner.install = function (Vue) {\n Vue.component(spinner.name, spinner);\n};\n\n/* harmony default export */ var packages_spinner = (spinner);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/message/src/main.vue?vue&type=template&id=455b9f60&\nvar mainvue_type_template_id_455b9f60_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n {\n attrs: { name: "el-message-fade" },\n on: { "after-leave": _vm.handleAfterLeave }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n class: [\n "el-message",\n _vm.type && !_vm.iconClass ? "el-message--" + _vm.type : "",\n _vm.center ? "is-center" : "",\n _vm.showClose ? "is-closable" : "",\n _vm.customClass\n ],\n style: _vm.positionStyle,\n attrs: { role: "alert" },\n on: { mouseenter: _vm.clearTimer, mouseleave: _vm.startTimer }\n },\n [\n _vm.iconClass\n ? _c("i", { class: _vm.iconClass })\n : _c("i", { class: _vm.typeClass }),\n _vm._t("default", [\n !_vm.dangerouslyUseHTMLString\n ? _c("p", { staticClass: "el-message__content" }, [\n _vm._v(_vm._s(_vm.message))\n ])\n : _c("p", {\n staticClass: "el-message__content",\n domProps: { innerHTML: _vm._s(_vm.message) }\n })\n ]),\n _vm.showClose\n ? _c("i", {\n staticClass: "el-message__closeBtn el-icon-close",\n on: { click: _vm.close }\n })\n : _vm._e()\n ],\n 2\n )\n ]\n )\n}\nvar mainvue_type_template_id_455b9f60_staticRenderFns = []\nmainvue_type_template_id_455b9f60_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/message/src/main.vue?vue&type=template&id=455b9f60&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/message/src/main.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\nvar src_mainvue_type_script_lang_js_typeMap = {\n success: \'success\',\n info: \'info\',\n warning: \'warning\',\n error: \'error\'\n};\n\n/* harmony default export */ var message_src_mainvue_type_script_lang_js_ = ({\n data: function data() {\n return {\n visible: false,\n message: \'\',\n duration: 3000,\n type: \'info\',\n iconClass: \'\',\n customClass: \'\',\n onClose: null,\n showClose: false,\n closed: false,\n verticalOffset: 20,\n timer: null,\n dangerouslyUseHTMLString: false,\n center: false\n };\n },\n\n\n computed: {\n typeClass: function typeClass() {\n return this.type && !this.iconClass ? \'el-message__icon el-icon-\' + src_mainvue_type_script_lang_js_typeMap[this.type] : \'\';\n },\n positionStyle: function positionStyle() {\n return {\n \'top\': this.verticalOffset + \'px\'\n };\n }\n },\n\n watch: {\n closed: function closed(newVal) {\n if (newVal) {\n this.visible = false;\n }\n }\n },\n\n methods: {\n handleAfterLeave: function handleAfterLeave() {\n this.$destroy(true);\n this.$el.parentNode.removeChild(this.$el);\n },\n close: function close() {\n this.closed = true;\n if (typeof this.onClose === \'function\') {\n this.onClose(this);\n }\n },\n clearTimer: function clearTimer() {\n clearTimeout(this.timer);\n },\n startTimer: function startTimer() {\n var _this = this;\n\n if (this.duration > 0) {\n this.timer = setTimeout(function () {\n if (!_this.closed) {\n _this.close();\n }\n }, this.duration);\n }\n },\n keydown: function keydown(e) {\n if (e.keyCode === 27) {\n // esc关闭消息\n if (!this.closed) {\n this.close();\n }\n }\n }\n },\n mounted: function mounted() {\n this.startTimer();\n document.addEventListener(\'keydown\', this.keydown);\n },\n beforeDestroy: function beforeDestroy() {\n document.removeEventListener(\'keydown\', this.keydown);\n }\n});\n// CONCATENATED MODULE: ./packages/message/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_message_src_mainvue_type_script_lang_js_ = (message_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/message/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar message_src_main_component = normalizeComponent(\n packages_message_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_455b9f60_render,\n mainvue_type_template_id_455b9f60_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var message_src_main_api; }\nmessage_src_main_component.options.__file = "packages/message/src/main.vue"\n/* harmony default export */ var message_src_main = (message_src_main_component.exports);\n// EXTERNAL MODULE: external "element-ui/lib/utils/types"\nvar types_ = __webpack_require__(16);\n\n// CONCATENATED MODULE: ./packages/message/src/main.js\nvar main_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\n\n\n\n\nvar MessageConstructor = external_vue_default.a.extend(message_src_main);\n\nvar message_src_main_instance = void 0;\nvar main_instances = [];\nvar main_seed = 1;\n\nvar main_Message = function Message(options) {\n if (external_vue_default.a.prototype.$isServer) return;\n options = options || {};\n if (typeof options === \'string\') {\n options = {\n message: options\n };\n }\n var userOnClose = options.onClose;\n var id = \'message_\' + main_seed++;\n\n options.onClose = function () {\n Message.close(id, userOnClose);\n };\n message_src_main_instance = new MessageConstructor({\n data: options\n });\n message_src_main_instance.id = id;\n if (Object(vdom_["isVNode"])(message_src_main_instance.message)) {\n message_src_main_instance.$slots.default = [message_src_main_instance.message];\n message_src_main_instance.message = null;\n }\n message_src_main_instance.$mount();\n document.body.appendChild(message_src_main_instance.$el);\n var verticalOffset = options.offset || 20;\n main_instances.forEach(function (item) {\n verticalOffset += item.$el.offsetHeight + 16;\n });\n message_src_main_instance.verticalOffset = verticalOffset;\n message_src_main_instance.visible = true;\n message_src_main_instance.$el.style.zIndex = popup_["PopupManager"].nextZIndex();\n main_instances.push(message_src_main_instance);\n return message_src_main_instance;\n};\n\n[\'success\', \'warning\', \'info\', \'error\'].forEach(function (type) {\n main_Message[type] = function (options) {\n if (Object(types_["isObject"])(options) && !Object(vdom_["isVNode"])(options)) {\n return main_Message(main_extends({}, options, {\n type: type\n }));\n }\n return main_Message({\n type: type,\n message: options\n });\n };\n});\n\nmain_Message.close = function (id, userOnClose) {\n var len = main_instances.length;\n var index = -1;\n var removedHeight = void 0;\n for (var i = 0; i < len; i++) {\n if (id === main_instances[i].id) {\n removedHeight = main_instances[i].$el.offsetHeight;\n index = i;\n if (typeof userOnClose === \'function\') {\n userOnClose(main_instances[i]);\n }\n main_instances.splice(i, 1);\n break;\n }\n }\n if (len <= 1 || index === -1 || index > main_instances.length - 1) return;\n for (var _i = index; _i < len - 1; _i++) {\n var dom = main_instances[_i].$el;\n dom.style[\'top\'] = parseInt(dom.style[\'top\'], 10) - removedHeight - 16 + \'px\';\n }\n};\n\nmain_Message.closeAll = function () {\n for (var i = main_instances.length - 1; i >= 0; i--) {\n main_instances[i].close();\n }\n};\n\n/* harmony default export */ var packages_message_src_main = (main_Message);\n// CONCATENATED MODULE: ./packages/message/index.js\n\n/* harmony default export */ var packages_message = (packages_message_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/badge/src/main.vue?vue&type=template&id=7ccb6598&\nvar mainvue_type_template_id_7ccb6598_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "div",\n { staticClass: "el-badge" },\n [\n _vm._t("default"),\n _c("transition", { attrs: { name: "el-zoom-in-center" } }, [\n _c("sup", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value:\n !_vm.hidden && (_vm.content || _vm.content === 0 || _vm.isDot),\n expression: "!hidden && (content || content === 0 || isDot)"\n }\n ],\n staticClass: "el-badge__content",\n class: [\n _vm.type ? "el-badge__content--" + _vm.type : null,\n {\n "is-fixed": _vm.$slots.default,\n "is-dot": _vm.isDot\n }\n ],\n domProps: { textContent: _vm._s(_vm.content) }\n })\n ])\n ],\n 2\n )\n}\nvar mainvue_type_template_id_7ccb6598_staticRenderFns = []\nmainvue_type_template_id_7ccb6598_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/badge/src/main.vue?vue&type=template&id=7ccb6598&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/badge/src/main.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/* harmony default export */ var badge_src_mainvue_type_script_lang_js_ = ({\n name: \'ElBadge\',\n\n props: {\n value: [String, Number],\n max: Number,\n isDot: Boolean,\n hidden: Boolean,\n type: {\n type: String,\n validator: function validator(val) {\n return [\'primary\', \'success\', \'warning\', \'info\', \'danger\'].indexOf(val) > -1;\n }\n }\n },\n\n computed: {\n content: function content() {\n if (this.isDot) return;\n\n var value = this.value;\n var max = this.max;\n\n if (typeof value === \'number\' && typeof max === \'number\') {\n return max < value ? max + \'+\' : value;\n }\n\n return value;\n }\n }\n});\n// CONCATENATED MODULE: ./packages/badge/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_badge_src_mainvue_type_script_lang_js_ = (badge_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/badge/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar badge_src_main_component = normalizeComponent(\n packages_badge_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_7ccb6598_render,\n mainvue_type_template_id_7ccb6598_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var badge_src_main_api; }\nbadge_src_main_component.options.__file = "packages/badge/src/main.vue"\n/* harmony default export */ var badge_src_main = (badge_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/badge/index.js\n\n\n/* istanbul ignore next */\nbadge_src_main.install = function (Vue) {\n Vue.component(badge_src_main.name, badge_src_main);\n};\n\n/* harmony default export */ var badge = (badge_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/card/src/main.vue?vue&type=template&id=59a4a40f&\nvar mainvue_type_template_id_59a4a40f_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 staticClass: "el-card",\n class: _vm.shadow ? "is-" + _vm.shadow + "-shadow" : "is-always-shadow"\n },\n [\n _vm.$slots.header || _vm.header\n ? _c(\n "div",\n { staticClass: "el-card__header" },\n [_vm._t("header", [_vm._v(_vm._s(_vm.header))])],\n 2\n )\n : _vm._e(),\n _c(\n "div",\n { staticClass: "el-card__body", style: _vm.bodyStyle },\n [_vm._t("default")],\n 2\n )\n ]\n )\n}\nvar mainvue_type_template_id_59a4a40f_staticRenderFns = []\nmainvue_type_template_id_59a4a40f_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/card/src/main.vue?vue&type=template&id=59a4a40f&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/card/src/main.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var card_src_mainvue_type_script_lang_js_ = ({\n name: \'ElCard\',\n props: {\n header: {},\n bodyStyle: {},\n shadow: {\n type: String\n }\n }\n});\n// CONCATENATED MODULE: ./packages/card/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_card_src_mainvue_type_script_lang_js_ = (card_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/card/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar card_src_main_component = normalizeComponent(\n packages_card_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_59a4a40f_render,\n mainvue_type_template_id_59a4a40f_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var card_src_main_api; }\ncard_src_main_component.options.__file = "packages/card/src/main.vue"\n/* harmony default export */ var card_src_main = (card_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/card/index.js\n\n\n/* istanbul ignore next */\ncard_src_main.install = function (Vue) {\n Vue.component(card_src_main.name, card_src_main);\n};\n\n/* harmony default export */ var card = (card_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/rate/src/main.vue?vue&type=template&id=ada57782&\nvar mainvue_type_template_id_ada57782_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 staticClass: "el-rate",\n attrs: {\n role: "slider",\n "aria-valuenow": _vm.currentValue,\n "aria-valuetext": _vm.text,\n "aria-valuemin": "0",\n "aria-valuemax": _vm.max,\n tabindex: "0"\n },\n on: { keydown: _vm.handleKey }\n },\n [\n _vm._l(_vm.max, function(item, key) {\n return _c(\n "span",\n {\n key: key,\n staticClass: "el-rate__item",\n style: { cursor: _vm.rateDisabled ? "auto" : "pointer" },\n on: {\n mousemove: function($event) {\n _vm.setCurrentValue(item, $event)\n },\n mouseleave: _vm.resetCurrentValue,\n click: function($event) {\n _vm.selectValue(item)\n }\n }\n },\n [\n _c(\n "i",\n {\n staticClass: "el-rate__icon",\n class: [\n _vm.classes[item - 1],\n { hover: _vm.hoverIndex === item }\n ],\n style: _vm.getIconStyle(item)\n },\n [\n _vm.showDecimalIcon(item)\n ? _c("i", {\n staticClass: "el-rate__decimal",\n class: _vm.decimalIconClass,\n style: _vm.decimalStyle\n })\n : _vm._e()\n ]\n )\n ]\n )\n }),\n _vm.showText || _vm.showScore\n ? _c(\n "span",\n { staticClass: "el-rate__text", style: { color: _vm.textColor } },\n [_vm._v(_vm._s(_vm.text))]\n )\n : _vm._e()\n ],\n 2\n )\n}\nvar mainvue_type_template_id_ada57782_staticRenderFns = []\nmainvue_type_template_id_ada57782_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/rate/src/main.vue?vue&type=template&id=ada57782&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/rate/src/main.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/* harmony default export */ var rate_src_mainvue_type_script_lang_js_ = ({\n name: \'ElRate\',\n\n mixins: [migrating_default.a],\n\n inject: {\n elForm: {\n default: \'\'\n }\n },\n\n data: function data() {\n return {\n pointerAtLeftHalf: true,\n currentValue: this.value,\n hoverIndex: -1\n };\n },\n\n\n props: {\n value: {\n type: Number,\n default: 0\n },\n lowThreshold: {\n type: Number,\n default: 2\n },\n highThreshold: {\n type: Number,\n default: 4\n },\n max: {\n type: Number,\n default: 5\n },\n colors: {\n type: [Array, Object],\n default: function _default() {\n return [\'#F7BA2A\', \'#F7BA2A\', \'#F7BA2A\'];\n }\n },\n voidColor: {\n type: String,\n default: \'#C6D1DE\'\n },\n disabledVoidColor: {\n type: String,\n default: \'#EFF2F7\'\n },\n iconClasses: {\n type: [Array, Object],\n default: function _default() {\n return [\'el-icon-star-on\', \'el-icon-star-on\', \'el-icon-star-on\'];\n }\n },\n voidIconClass: {\n type: String,\n default: \'el-icon-star-off\'\n },\n disabledVoidIconClass: {\n type: String,\n default: \'el-icon-star-on\'\n },\n disabled: {\n type: Boolean,\n default: false\n },\n allowHalf: {\n type: Boolean,\n default: false\n },\n showText: {\n type: Boolean,\n default: false\n },\n showScore: {\n type: Boolean,\n default: false\n },\n textColor: {\n type: String,\n default: \'#1f2d3d\'\n },\n texts: {\n type: Array,\n default: function _default() {\n return [\'极差\', \'失望\', \'一般\', \'满意\', \'惊喜\'];\n }\n },\n scoreTemplate: {\n type: String,\n default: \'{value}\'\n }\n },\n\n computed: {\n text: function text() {\n var result = \'\';\n if (this.showScore) {\n result = this.scoreTemplate.replace(/\\{\\s*value\\s*\\}/, this.rateDisabled ? this.value : this.currentValue);\n } else if (this.showText) {\n result = this.texts[Math.ceil(this.currentValue) - 1];\n }\n return result;\n },\n decimalStyle: function decimalStyle() {\n var width = \'\';\n if (this.rateDisabled) {\n width = this.valueDecimal + \'%\';\n } else if (this.allowHalf) {\n width = \'50%\';\n }\n return {\n color: this.activeColor,\n width: width\n };\n },\n valueDecimal: function valueDecimal() {\n return this.value * 100 - Math.floor(this.value) * 100;\n },\n classMap: function classMap() {\n var _ref;\n\n return Array.isArray(this.iconClasses) ? (_ref = {}, _ref[this.lowThreshold] = this.iconClasses[0], _ref[this.highThreshold] = { value: this.iconClasses[1], excluded: true }, _ref[this.max] = this.iconClasses[2], _ref) : this.iconClasses;\n },\n decimalIconClass: function decimalIconClass() {\n return this.getValueFromMap(this.value, this.classMap);\n },\n voidClass: function voidClass() {\n return this.rateDisabled ? this.disabledVoidIconClass : this.voidIconClass;\n },\n activeClass: function activeClass() {\n return this.getValueFromMap(this.currentValue, this.classMap);\n },\n colorMap: function colorMap() {\n var _ref2;\n\n return Array.isArray(this.colors) ? (_ref2 = {}, _ref2[this.lowThreshold] = this.colors[0], _ref2[this.highThreshold] = { value: this.colors[1], excluded: true }, _ref2[this.max] = this.colors[2], _ref2) : this.colors;\n },\n activeColor: function activeColor() {\n return this.getValueFromMap(this.currentValue, this.colorMap);\n },\n classes: function classes() {\n var result = [];\n var i = 0;\n var threshold = this.currentValue;\n if (this.allowHalf && this.currentValue !== Math.floor(this.currentValue)) {\n threshold--;\n }\n for (; i < threshold; i++) {\n result.push(this.activeClass);\n }\n for (; i < this.max; i++) {\n result.push(this.voidClass);\n }\n return result;\n },\n rateDisabled: function rateDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n }\n },\n\n watch: {\n value: function value(val) {\n this.currentValue = val;\n this.pointerAtLeftHalf = this.value !== Math.floor(this.value);\n }\n },\n\n methods: {\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n \'text-template\': \'text-template is renamed to score-template.\'\n }\n };\n },\n getValueFromMap: function getValueFromMap(value, map) {\n var matchedKeys = Object.keys(map).filter(function (key) {\n var val = map[key];\n var excluded = Object(types_["isObject"])(val) ? val.excluded : false;\n return excluded ? value < key : value <= key;\n }).sort(function (a, b) {\n return a - b;\n });\n var matchedValue = map[matchedKeys[0]];\n return Object(types_["isObject"])(matchedValue) ? matchedValue.value : matchedValue || \'\';\n },\n showDecimalIcon: function showDecimalIcon(item) {\n var showWhenDisabled = this.rateDisabled && this.valueDecimal > 0 && item - 1 < this.value && item > this.value;\n /* istanbul ignore next */\n var showWhenAllowHalf = this.allowHalf && this.pointerAtLeftHalf && item - 0.5 <= this.currentValue && item > this.currentValue;\n return showWhenDisabled || showWhenAllowHalf;\n },\n getIconStyle: function getIconStyle(item) {\n var voidColor = this.rateDisabled ? this.disabledVoidColor : this.voidColor;\n return {\n color: item <= this.currentValue ? this.activeColor : voidColor\n };\n },\n selectValue: function selectValue(value) {\n if (this.rateDisabled) {\n return;\n }\n if (this.allowHalf && this.pointerAtLeftHalf) {\n this.$emit(\'input\', this.currentValue);\n this.$emit(\'change\', this.currentValue);\n } else {\n this.$emit(\'input\', value);\n this.$emit(\'change\', value);\n }\n },\n handleKey: function handleKey(e) {\n if (this.rateDisabled) {\n return;\n }\n var currentValue = this.currentValue;\n var keyCode = e.keyCode;\n if (keyCode === 38 || keyCode === 39) {\n // left / down\n if (this.allowHalf) {\n currentValue += 0.5;\n } else {\n currentValue += 1;\n }\n e.stopPropagation();\n e.preventDefault();\n } else if (keyCode === 37 || keyCode === 40) {\n if (this.allowHalf) {\n currentValue -= 0.5;\n } else {\n currentValue -= 1;\n }\n e.stopPropagation();\n e.preventDefault();\n }\n currentValue = currentValue < 0 ? 0 : currentValue;\n currentValue = currentValue > this.max ? this.max : currentValue;\n\n this.$emit(\'input\', currentValue);\n this.$emit(\'change\', currentValue);\n },\n setCurrentValue: function setCurrentValue(value, event) {\n if (this.rateDisabled) {\n return;\n }\n /* istanbul ignore if */\n if (this.allowHalf) {\n var target = event.target;\n if (Object(dom_["hasClass"])(target, \'el-rate__item\')) {\n target = target.querySelector(\'.el-rate__icon\');\n }\n if (Object(dom_["hasClass"])(target, \'el-rate__decimal\')) {\n target = target.parentNode;\n }\n this.pointerAtLeftHalf = event.offsetX * 2 <= target.clientWidth;\n this.currentValue = this.pointerAtLeftHalf ? value - 0.5 : value;\n } else {\n this.currentValue = value;\n }\n this.hoverIndex = value;\n },\n resetCurrentValue: function resetCurrentValue() {\n if (this.rateDisabled) {\n return;\n }\n if (this.allowHalf) {\n this.pointerAtLeftHalf = this.value !== Math.floor(this.value);\n }\n this.currentValue = this.value;\n this.hoverIndex = -1;\n }\n },\n\n created: function created() {\n if (!this.value) {\n this.$emit(\'input\', 0);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/rate/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_rate_src_mainvue_type_script_lang_js_ = (rate_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/rate/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar rate_src_main_component = normalizeComponent(\n packages_rate_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_ada57782_render,\n mainvue_type_template_id_ada57782_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var rate_src_main_api; }\nrate_src_main_component.options.__file = "packages/rate/src/main.vue"\n/* harmony default export */ var rate_src_main = (rate_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/rate/index.js\n\n\n/* istanbul ignore next */\nrate_src_main.install = function (Vue) {\n Vue.component(rate_src_main.name, rate_src_main);\n};\n\n/* harmony default export */ var packages_rate = (rate_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/steps/src/steps.vue?vue&type=template&id=3c6b6dc0&\nvar stepsvue_type_template_id_3c6b6dc0_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 staticClass: "el-steps",\n class: [\n !_vm.simple && "el-steps--" + _vm.direction,\n _vm.simple && "el-steps--simple"\n ]\n },\n [_vm._t("default")],\n 2\n )\n}\nvar stepsvue_type_template_id_3c6b6dc0_staticRenderFns = []\nstepsvue_type_template_id_3c6b6dc0_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/steps/src/steps.vue?vue&type=template&id=3c6b6dc0&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/steps/src/steps.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ var stepsvue_type_script_lang_js_ = ({\n name: \'ElSteps\',\n\n mixins: [migrating_default.a],\n\n props: {\n space: [Number, String],\n active: Number,\n direction: {\n type: String,\n default: \'horizontal\'\n },\n alignCenter: Boolean,\n simple: Boolean,\n finishStatus: {\n type: String,\n default: \'finish\'\n },\n processStatus: {\n type: String,\n default: \'process\'\n }\n },\n\n data: function data() {\n return {\n steps: [],\n stepOffset: 0\n };\n },\n\n\n methods: {\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n \'center\': \'center is removed.\'\n }\n };\n }\n },\n\n watch: {\n active: function active(newVal, oldVal) {\n this.$emit(\'change\', newVal, oldVal);\n },\n steps: function steps(_steps) {\n _steps.forEach(function (child, index) {\n child.index = index;\n });\n }\n }\n});\n// CONCATENATED MODULE: ./packages/steps/src/steps.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_stepsvue_type_script_lang_js_ = (stepsvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/steps/src/steps.vue\n\n\n\n\n\n/* normalize component */\n\nvar steps_component = normalizeComponent(\n src_stepsvue_type_script_lang_js_,\n stepsvue_type_template_id_3c6b6dc0_render,\n stepsvue_type_template_id_3c6b6dc0_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var steps_api; }\nsteps_component.options.__file = "packages/steps/src/steps.vue"\n/* harmony default export */ var steps = (steps_component.exports);\n// CONCATENATED MODULE: ./packages/steps/index.js\n\n\n/* istanbul ignore next */\nsteps.install = function (Vue) {\n Vue.component(steps.name, steps);\n};\n\n/* harmony default export */ var packages_steps = (steps);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/steps/src/step.vue?vue&type=template&id=f414a87a&\nvar stepvue_type_template_id_f414a87a_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 staticClass: "el-step",\n class: [\n !_vm.isSimple && "is-" + _vm.$parent.direction,\n _vm.isSimple && "is-simple",\n _vm.isLast && !_vm.space && !_vm.isCenter && "is-flex",\n _vm.isCenter && !_vm.isVertical && !_vm.isSimple && "is-center"\n ],\n style: _vm.style\n },\n [\n _c(\n "div",\n { staticClass: "el-step__head", class: "is-" + _vm.currentStatus },\n [\n _c(\n "div",\n {\n staticClass: "el-step__line",\n style: _vm.isLast\n ? ""\n : { marginRight: _vm.$parent.stepOffset + "px" }\n },\n [\n _c("i", {\n staticClass: "el-step__line-inner",\n style: _vm.lineStyle\n })\n ]\n ),\n _c(\n "div",\n {\n staticClass: "el-step__icon",\n class: "is-" + (_vm.icon ? "icon" : "text")\n },\n [\n _vm.currentStatus !== "success" && _vm.currentStatus !== "error"\n ? _vm._t("icon", [\n _vm.icon\n ? _c("i", {\n staticClass: "el-step__icon-inner",\n class: [_vm.icon]\n })\n : _vm._e(),\n !_vm.icon && !_vm.isSimple\n ? _c("div", { staticClass: "el-step__icon-inner" }, [\n _vm._v(_vm._s(_vm.index + 1))\n ])\n : _vm._e()\n ])\n : _c("i", {\n staticClass: "el-step__icon-inner is-status",\n class: [\n "el-icon-" +\n (_vm.currentStatus === "success" ? "check" : "close")\n ]\n })\n ],\n 2\n )\n ]\n ),\n _c("div", { staticClass: "el-step__main" }, [\n _c(\n "div",\n {\n ref: "title",\n staticClass: "el-step__title",\n class: ["is-" + _vm.currentStatus]\n },\n [_vm._t("title", [_vm._v(_vm._s(_vm.title))])],\n 2\n ),\n _vm.isSimple\n ? _c("div", { staticClass: "el-step__arrow" })\n : _c(\n "div",\n {\n staticClass: "el-step__description",\n class: ["is-" + _vm.currentStatus]\n },\n [_vm._t("description", [_vm._v(_vm._s(_vm.description))])],\n 2\n )\n ])\n ]\n )\n}\nvar stepvue_type_template_id_f414a87a_staticRenderFns = []\nstepvue_type_template_id_f414a87a_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/steps/src/step.vue?vue&type=template&id=f414a87a&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/steps/src/step.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var stepvue_type_script_lang_js_ = ({\n name: \'ElStep\',\n\n props: {\n title: String,\n icon: String,\n description: String,\n status: String\n },\n\n data: function data() {\n return {\n index: -1,\n lineStyle: {},\n internalStatus: \'\'\n };\n },\n beforeCreate: function beforeCreate() {\n this.$parent.steps.push(this);\n },\n beforeDestroy: function beforeDestroy() {\n var steps = this.$parent.steps;\n var index = steps.indexOf(this);\n if (index >= 0) {\n steps.splice(index, 1);\n }\n },\n\n\n computed: {\n currentStatus: function currentStatus() {\n return this.status || this.internalStatus;\n },\n prevStatus: function prevStatus() {\n var prevStep = this.$parent.steps[this.index - 1];\n return prevStep ? prevStep.currentStatus : \'wait\';\n },\n isCenter: function isCenter() {\n return this.$parent.alignCenter;\n },\n isVertical: function isVertical() {\n return this.$parent.direction === \'vertical\';\n },\n isSimple: function isSimple() {\n return this.$parent.simple;\n },\n isLast: function isLast() {\n var parent = this.$parent;\n return parent.steps[parent.steps.length - 1] === this;\n },\n stepsCount: function stepsCount() {\n return this.$parent.steps.length;\n },\n space: function space() {\n var isSimple = this.isSimple,\n space = this.$parent.space;\n\n return isSimple ? \'\' : space;\n },\n\n style: function style() {\n var style = {};\n var parent = this.$parent;\n var len = parent.steps.length;\n\n var space = typeof this.space === \'number\' ? this.space + \'px\' : this.space ? this.space : 100 / (len - (this.isCenter ? 0 : 1)) + \'%\';\n style.flexBasis = space;\n if (this.isVertical) return style;\n if (this.isLast) {\n style.maxWidth = 100 / this.stepsCount + \'%\';\n } else {\n style.marginRight = -this.$parent.stepOffset + \'px\';\n }\n\n return style;\n }\n },\n\n methods: {\n updateStatus: function updateStatus(val) {\n var prevChild = this.$parent.$children[this.index - 1];\n\n if (val > this.index) {\n this.internalStatus = this.$parent.finishStatus;\n } else if (val === this.index && this.prevStatus !== \'error\') {\n this.internalStatus = this.$parent.processStatus;\n } else {\n this.internalStatus = \'wait\';\n }\n\n if (prevChild) prevChild.calcProgress(this.internalStatus);\n },\n calcProgress: function calcProgress(status) {\n var step = 100;\n var style = {};\n\n style.transitionDelay = 150 * this.index + \'ms\';\n if (status === this.$parent.processStatus) {\n step = this.currentStatus !== \'error\' ? 0 : 0;\n } else if (status === \'wait\') {\n step = 0;\n style.transitionDelay = -150 * this.index + \'ms\';\n }\n\n style.borderWidth = step && !this.isSimple ? \'1px\' : 0;\n this.$parent.direction === \'vertical\' ? style.height = step + \'%\' : style.width = step + \'%\';\n\n this.lineStyle = style;\n }\n },\n\n mounted: function mounted() {\n var _this = this;\n\n var unwatch = this.$watch(\'index\', function (val) {\n _this.$watch(\'$parent.active\', _this.updateStatus, { immediate: true });\n _this.$watch(\'$parent.processStatus\', function () {\n var activeIndex = _this.$parent.active;\n _this.updateStatus(activeIndex);\n }, { immediate: true });\n unwatch();\n });\n }\n});\n// CONCATENATED MODULE: ./packages/steps/src/step.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_stepvue_type_script_lang_js_ = (stepvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/steps/src/step.vue\n\n\n\n\n\n/* normalize component */\n\nvar step_component = normalizeComponent(\n src_stepvue_type_script_lang_js_,\n stepvue_type_template_id_f414a87a_render,\n stepvue_type_template_id_f414a87a_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var step_api; }\nstep_component.options.__file = "packages/steps/src/step.vue"\n/* harmony default export */ var step = (step_component.exports);\n// CONCATENATED MODULE: ./packages/step/index.js\n\n\n/* istanbul ignore next */\nstep.install = function (Vue) {\n Vue.component(step.name, step);\n};\n\n/* harmony default export */ var packages_step = (step);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/carousel/src/main.vue?vue&type=template&id=5d5d1482&\nvar mainvue_type_template_id_5d5d1482_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 class: _vm.carouselClasses,\n on: {\n mouseenter: function($event) {\n $event.stopPropagation()\n return _vm.handleMouseEnter($event)\n },\n mouseleave: function($event) {\n $event.stopPropagation()\n return _vm.handleMouseLeave($event)\n }\n }\n },\n [\n _c(\n "div",\n {\n staticClass: "el-carousel__container",\n style: { height: _vm.height }\n },\n [\n _vm.arrowDisplay\n ? _c("transition", { attrs: { name: "carousel-arrow-left" } }, [\n _c(\n "button",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value:\n (_vm.arrow === "always" || _vm.hover) &&\n (_vm.loop || _vm.activeIndex > 0),\n expression:\n "(arrow === \'always\' || hover) && (loop || activeIndex > 0)"\n }\n ],\n staticClass: "el-carousel__arrow el-carousel__arrow--left",\n attrs: { type: "button" },\n on: {\n mouseenter: function($event) {\n _vm.handleButtonEnter("left")\n },\n mouseleave: _vm.handleButtonLeave,\n click: function($event) {\n $event.stopPropagation()\n _vm.throttledArrowClick(_vm.activeIndex - 1)\n }\n }\n },\n [_c("i", { staticClass: "el-icon-arrow-left" })]\n )\n ])\n : _vm._e(),\n _vm.arrowDisplay\n ? _c("transition", { attrs: { name: "carousel-arrow-right" } }, [\n _c(\n "button",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value:\n (_vm.arrow === "always" || _vm.hover) &&\n (_vm.loop || _vm.activeIndex < _vm.items.length - 1),\n expression:\n "(arrow === \'always\' || hover) && (loop || activeIndex < items.length - 1)"\n }\n ],\n staticClass: "el-carousel__arrow el-carousel__arrow--right",\n attrs: { type: "button" },\n on: {\n mouseenter: function($event) {\n _vm.handleButtonEnter("right")\n },\n mouseleave: _vm.handleButtonLeave,\n click: function($event) {\n $event.stopPropagation()\n _vm.throttledArrowClick(_vm.activeIndex + 1)\n }\n }\n },\n [_c("i", { staticClass: "el-icon-arrow-right" })]\n )\n ])\n : _vm._e(),\n _vm._t("default")\n ],\n 2\n ),\n _vm.indicatorPosition !== "none"\n ? _c(\n "ul",\n { class: _vm.indicatorsClasses },\n _vm._l(_vm.items, function(item, index) {\n return _c(\n "li",\n {\n key: index,\n class: [\n "el-carousel__indicator",\n "el-carousel__indicator--" + _vm.direction,\n { "is-active": index === _vm.activeIndex }\n ],\n on: {\n mouseenter: function($event) {\n _vm.throttledIndicatorHover(index)\n },\n click: function($event) {\n $event.stopPropagation()\n _vm.handleIndicatorClick(index)\n }\n }\n },\n [\n _c("button", { staticClass: "el-carousel__button" }, [\n _vm.hasLabel\n ? _c("span", [_vm._v(_vm._s(item.label))])\n : _vm._e()\n ])\n ]\n )\n }),\n 0\n )\n : _vm._e()\n ]\n )\n}\nvar mainvue_type_template_id_5d5d1482_staticRenderFns = []\nmainvue_type_template_id_5d5d1482_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/carousel/src/main.vue?vue&type=template&id=5d5d1482&\n\n// EXTERNAL MODULE: external "throttle-debounce/throttle"\nvar throttle_ = __webpack_require__(25);\nvar throttle_default = /*#__PURE__*/__webpack_require__.n(throttle_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/carousel/src/main.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ var carousel_src_mainvue_type_script_lang_js_ = ({\n name: \'ElCarousel\',\n\n props: {\n initialIndex: {\n type: Number,\n default: 0\n },\n height: String,\n trigger: {\n type: String,\n default: \'hover\'\n },\n autoplay: {\n type: Boolean,\n default: true\n },\n interval: {\n type: Number,\n default: 3000\n },\n indicatorPosition: String,\n indicator: {\n type: Boolean,\n default: true\n },\n arrow: {\n type: String,\n default: \'hover\'\n },\n type: String,\n loop: {\n type: Boolean,\n default: true\n },\n direction: {\n type: String,\n default: \'horizontal\',\n validator: function validator(val) {\n return [\'horizontal\', \'vertical\'].indexOf(val) !== -1;\n }\n }\n },\n\n data: function data() {\n return {\n items: [],\n activeIndex: -1,\n containerWidth: 0,\n timer: null,\n hover: false\n };\n },\n\n\n computed: {\n arrowDisplay: function arrowDisplay() {\n return this.arrow !== \'never\' && this.direction !== \'vertical\';\n },\n hasLabel: function hasLabel() {\n return this.items.some(function (item) {\n return item.label.toString().length > 0;\n });\n },\n carouselClasses: function carouselClasses() {\n var classes = [\'el-carousel\', \'el-carousel--\' + this.direction];\n if (this.type === \'card\') {\n classes.push(\'el-carousel--card\');\n }\n return classes;\n },\n indicatorsClasses: function indicatorsClasses() {\n var classes = [\'el-carousel__indicators\', \'el-carousel__indicators--\' + this.direction];\n if (this.hasLabel) {\n classes.push(\'el-carousel__indicators--labels\');\n }\n if (this.indicatorPosition === \'outside\' || this.type === \'card\') {\n classes.push(\'el-carousel__indicators--outside\');\n }\n return classes;\n }\n },\n\n watch: {\n items: function items(val) {\n if (val.length > 0) this.setActiveItem(this.initialIndex);\n },\n activeIndex: function activeIndex(val, oldVal) {\n this.resetItemPosition(oldVal);\n if (oldVal > -1) {\n this.$emit(\'change\', val, oldVal);\n }\n },\n autoplay: function autoplay(val) {\n val ? this.startTimer() : this.pauseTimer();\n },\n loop: function loop() {\n this.setActiveItem(this.activeIndex);\n },\n interval: function interval() {\n this.pauseTimer();\n this.startTimer();\n }\n },\n\n methods: {\n handleMouseEnter: function handleMouseEnter() {\n this.hover = true;\n this.pauseTimer();\n },\n handleMouseLeave: function handleMouseLeave() {\n this.hover = false;\n this.startTimer();\n },\n itemInStage: function itemInStage(item, index) {\n var length = this.items.length;\n if (index === length - 1 && item.inStage && this.items[0].active || item.inStage && this.items[index + 1] && this.items[index + 1].active) {\n return \'left\';\n } else if (index === 0 && item.inStage && this.items[length - 1].active || item.inStage && this.items[index - 1] && this.items[index - 1].active) {\n return \'right\';\n }\n return false;\n },\n handleButtonEnter: function handleButtonEnter(arrow) {\n var _this = this;\n\n if (this.direction === \'vertical\') return;\n this.items.forEach(function (item, index) {\n if (arrow === _this.itemInStage(item, index)) {\n item.hover = true;\n }\n });\n },\n handleButtonLeave: function handleButtonLeave() {\n if (this.direction === \'vertical\') return;\n this.items.forEach(function (item) {\n item.hover = false;\n });\n },\n updateItems: function updateItems() {\n this.items = this.$children.filter(function (child) {\n return child.$options.name === \'ElCarouselItem\';\n });\n },\n resetItemPosition: function resetItemPosition(oldIndex) {\n var _this2 = this;\n\n this.items.forEach(function (item, index) {\n item.translateItem(index, _this2.activeIndex, oldIndex);\n });\n },\n playSlides: function playSlides() {\n if (this.activeIndex < this.items.length - 1) {\n this.activeIndex++;\n } else if (this.loop) {\n this.activeIndex = 0;\n }\n },\n pauseTimer: function pauseTimer() {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n },\n startTimer: function startTimer() {\n if (this.interval <= 0 || !this.autoplay || this.timer) return;\n this.timer = setInterval(this.playSlides, this.interval);\n },\n resetTimer: function resetTimer() {\n this.pauseTimer();\n this.startTimer();\n },\n setActiveItem: function setActiveItem(index) {\n if (typeof index === \'string\') {\n var filteredItems = this.items.filter(function (item) {\n return item.name === index;\n });\n if (filteredItems.length > 0) {\n index = this.items.indexOf(filteredItems[0]);\n }\n }\n index = Number(index);\n if (isNaN(index) || index !== Math.floor(index)) {\n console.warn(\'[Element Warn][Carousel]index must be an integer.\');\n return;\n }\n var length = this.items.length;\n var oldIndex = this.activeIndex;\n if (index < 0) {\n this.activeIndex = this.loop ? length - 1 : 0;\n } else if (index >= length) {\n this.activeIndex = this.loop ? 0 : length - 1;\n } else {\n this.activeIndex = index;\n }\n if (oldIndex === this.activeIndex) {\n this.resetItemPosition(oldIndex);\n }\n this.resetTimer();\n },\n prev: function prev() {\n this.setActiveItem(this.activeIndex - 1);\n },\n next: function next() {\n this.setActiveItem(this.activeIndex + 1);\n },\n handleIndicatorClick: function handleIndicatorClick(index) {\n this.activeIndex = index;\n },\n handleIndicatorHover: function handleIndicatorHover(index) {\n if (this.trigger === \'hover\' && index !== this.activeIndex) {\n this.activeIndex = index;\n }\n }\n },\n\n created: function created() {\n var _this3 = this;\n\n this.throttledArrowClick = throttle_default()(300, true, function (index) {\n _this3.setActiveItem(index);\n });\n this.throttledIndicatorHover = throttle_default()(300, function (index) {\n _this3.handleIndicatorHover(index);\n });\n },\n mounted: function mounted() {\n var _this4 = this;\n\n this.updateItems();\n this.$nextTick(function () {\n Object(resize_event_["addResizeListener"])(_this4.$el, _this4.resetItemPosition);\n if (_this4.initialIndex < _this4.items.length && _this4.initialIndex >= 0) {\n _this4.activeIndex = _this4.initialIndex;\n }\n _this4.startTimer();\n });\n },\n beforeDestroy: function beforeDestroy() {\n if (this.$el) Object(resize_event_["removeResizeListener"])(this.$el, this.resetItemPosition);\n this.pauseTimer();\n }\n});\n// CONCATENATED MODULE: ./packages/carousel/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_carousel_src_mainvue_type_script_lang_js_ = (carousel_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/carousel/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar carousel_src_main_component = normalizeComponent(\n packages_carousel_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_5d5d1482_render,\n mainvue_type_template_id_5d5d1482_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var carousel_src_main_api; }\ncarousel_src_main_component.options.__file = "packages/carousel/src/main.vue"\n/* harmony default export */ var carousel_src_main = (carousel_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/carousel/index.js\n\n\n/* istanbul ignore next */\ncarousel_src_main.install = function (Vue) {\n Vue.component(carousel_src_main.name, carousel_src_main);\n};\n\n/* harmony default export */ var carousel = (carousel_src_main);\n// CONCATENATED MODULE: ./packages/scrollbar/src/util.js\nvar BAR_MAP = {\n vertical: {\n offset: \'offsetHeight\',\n scroll: \'scrollTop\',\n scrollSize: \'scrollHeight\',\n size: \'height\',\n key: \'vertical\',\n axis: \'Y\',\n client: \'clientY\',\n direction: \'top\'\n },\n horizontal: {\n offset: \'offsetWidth\',\n scroll: \'scrollLeft\',\n scrollSize: \'scrollWidth\',\n size: \'width\',\n key: \'horizontal\',\n axis: \'X\',\n client: \'clientX\',\n direction: \'left\'\n }\n};\n\nfunction renderThumbStyle(_ref) {\n var move = _ref.move,\n size = _ref.size,\n bar = _ref.bar;\n\n var style = {};\n var translate = \'translate\' + bar.axis + \'(\' + move + \'%)\';\n\n style[bar.size] = size;\n style.transform = translate;\n style.msTransform = translate;\n style.webkitTransform = translate;\n\n return style;\n};\n// CONCATENATED MODULE: ./packages/scrollbar/src/bar.js\n\n\n\n/* istanbul ignore next */\n/* harmony default export */ var src_bar = ({\n name: \'Bar\',\n\n props: {\n vertical: Boolean,\n size: String,\n move: Number\n },\n\n computed: {\n bar: function bar() {\n return BAR_MAP[this.vertical ? \'vertical\' : \'horizontal\'];\n },\n wrap: function wrap() {\n return this.$parent.wrap;\n }\n },\n\n render: function render(h) {\n var size = this.size,\n move = this.move,\n bar = this.bar;\n\n\n return h(\n \'div\',\n {\n \'class\': [\'el-scrollbar__bar\', \'is-\' + bar.key],\n on: {\n \'mousedown\': this.clickTrackHandler\n }\n },\n [h(\'div\', {\n ref: \'thumb\',\n \'class\': \'el-scrollbar__thumb\',\n on: {\n \'mousedown\': this.clickThumbHandler\n },\n\n style: renderThumbStyle({ size: size, move: move, bar: bar }) })]\n );\n },\n\n\n methods: {\n clickThumbHandler: function clickThumbHandler(e) {\n // prevent click event of right button\n if (e.ctrlKey || e.button === 2) {\n return;\n }\n this.startDrag(e);\n this[this.bar.axis] = e.currentTarget[this.bar.offset] - (e[this.bar.client] - e.currentTarget.getBoundingClientRect()[this.bar.direction]);\n },\n clickTrackHandler: function clickTrackHandler(e) {\n var offset = Math.abs(e.target.getBoundingClientRect()[this.bar.direction] - e[this.bar.client]);\n var thumbHalf = this.$refs.thumb[this.bar.offset] / 2;\n var thumbPositionPercentage = (offset - thumbHalf) * 100 / this.$el[this.bar.offset];\n\n this.wrap[this.bar.scroll] = thumbPositionPercentage * this.wrap[this.bar.scrollSize] / 100;\n },\n startDrag: function startDrag(e) {\n e.stopImmediatePropagation();\n this.cursorDown = true;\n\n Object(dom_["on"])(document, \'mousemove\', this.mouseMoveDocumentHandler);\n Object(dom_["on"])(document, \'mouseup\', this.mouseUpDocumentHandler);\n document.onselectstart = function () {\n return false;\n };\n },\n mouseMoveDocumentHandler: function mouseMoveDocumentHandler(e) {\n if (this.cursorDown === false) return;\n var prevPage = this[this.bar.axis];\n\n if (!prevPage) return;\n\n var offset = (this.$el.getBoundingClientRect()[this.bar.direction] - e[this.bar.client]) * -1;\n var thumbClickPosition = this.$refs.thumb[this.bar.offset] - prevPage;\n var thumbPositionPercentage = (offset - thumbClickPosition) * 100 / this.$el[this.bar.offset];\n\n this.wrap[this.bar.scroll] = thumbPositionPercentage * this.wrap[this.bar.scrollSize] / 100;\n },\n mouseUpDocumentHandler: function mouseUpDocumentHandler(e) {\n this.cursorDown = false;\n this[this.bar.axis] = 0;\n Object(dom_["off"])(document, \'mousemove\', this.mouseMoveDocumentHandler);\n document.onselectstart = null;\n }\n },\n\n destroyed: function destroyed() {\n Object(dom_["off"])(document, \'mouseup\', this.mouseUpDocumentHandler);\n }\n});\n// CONCATENATED MODULE: ./packages/scrollbar/src/main.js\n// reference https://github.com/noeldelgado/gemini-scrollbar/blob/master/index.js\n\n\n\n\n\n\n/* istanbul ignore next */\n/* harmony default export */ var scrollbar_src_main = ({\n name: \'ElScrollbar\',\n\n components: { Bar: src_bar },\n\n props: {\n native: Boolean,\n wrapStyle: {},\n wrapClass: {},\n viewClass: {},\n viewStyle: {},\n noresize: Boolean, // 如果 container 尺寸不会发生变化,最好设置它可以优化性能\n tag: {\n type: String,\n default: \'div\'\n }\n },\n\n data: function data() {\n return {\n sizeWidth: \'0\',\n sizeHeight: \'0\',\n moveX: 0,\n moveY: 0\n };\n },\n\n\n computed: {\n wrap: function wrap() {\n return this.$refs.wrap;\n }\n },\n\n render: function render(h) {\n var gutter = scrollbar_width_default()();\n var style = this.wrapStyle;\n\n if (gutter) {\n var gutterWith = \'-\' + gutter + \'px\';\n var gutterStyle = \'margin-bottom: \' + gutterWith + \'; margin-right: \' + gutterWith + \';\';\n\n if (Array.isArray(this.wrapStyle)) {\n style = Object(util_["toObject"])(this.wrapStyle);\n style.marginRight = style.marginBottom = gutterWith;\n } else if (typeof this.wrapStyle === \'string\') {\n style += gutterStyle;\n } else {\n style = gutterStyle;\n }\n }\n var view = h(this.tag, {\n class: [\'el-scrollbar__view\', this.viewClass],\n style: this.viewStyle,\n ref: \'resize\'\n }, this.$slots.default);\n var wrap = h(\n \'div\',\n {\n ref: \'wrap\',\n style: style,\n on: {\n \'scroll\': this.handleScroll\n },\n\n \'class\': [this.wrapClass, \'el-scrollbar__wrap\', gutter ? \'\' : \'el-scrollbar__wrap--hidden-default\'] },\n [[view]]\n );\n var nodes = void 0;\n\n if (!this.native) {\n nodes = [wrap, h(src_bar, {\n attrs: {\n move: this.moveX,\n size: this.sizeWidth }\n }), h(src_bar, {\n attrs: {\n vertical: true,\n move: this.moveY,\n size: this.sizeHeight }\n })];\n } else {\n nodes = [h(\n \'div\',\n {\n ref: \'wrap\',\n \'class\': [this.wrapClass, \'el-scrollbar__wrap\'],\n style: style },\n [[view]]\n )];\n }\n return h(\'div\', { class: \'el-scrollbar\' }, nodes);\n },\n\n\n methods: {\n handleScroll: function handleScroll() {\n var wrap = this.wrap;\n\n this.moveY = wrap.scrollTop * 100 / wrap.clientHeight;\n this.moveX = wrap.scrollLeft * 100 / wrap.clientWidth;\n },\n update: function update() {\n var heightPercentage = void 0,\n widthPercentage = void 0;\n var wrap = this.wrap;\n if (!wrap) return;\n\n heightPercentage = wrap.clientHeight * 100 / wrap.scrollHeight;\n widthPercentage = wrap.clientWidth * 100 / wrap.scrollWidth;\n\n this.sizeHeight = heightPercentage < 100 ? heightPercentage + \'%\' : \'\';\n this.sizeWidth = widthPercentage < 100 ? widthPercentage + \'%\' : \'\';\n }\n },\n\n mounted: function mounted() {\n if (this.native) return;\n this.$nextTick(this.update);\n !this.noresize && Object(resize_event_["addResizeListener"])(this.$refs.resize, this.update);\n },\n beforeDestroy: function beforeDestroy() {\n if (this.native) return;\n !this.noresize && Object(resize_event_["removeResizeListener"])(this.$refs.resize, this.update);\n }\n});\n// CONCATENATED MODULE: ./packages/scrollbar/index.js\n\n\n/* istanbul ignore next */\nscrollbar_src_main.install = function (Vue) {\n Vue.component(scrollbar_src_main.name, scrollbar_src_main);\n};\n\n/* harmony default export */ var scrollbar = (scrollbar_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/carousel/src/item.vue?vue&type=template&id=1801ae19&\nvar itemvue_type_template_id_1801ae19_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.ready,\n expression: "ready"\n }\n ],\n staticClass: "el-carousel__item",\n class: {\n "is-active": _vm.active,\n "el-carousel__item--card": _vm.$parent.type === "card",\n "is-in-stage": _vm.inStage,\n "is-hover": _vm.hover,\n "is-animating": _vm.animating\n },\n style: _vm.itemStyle,\n on: { click: _vm.handleItemClick }\n },\n [\n _vm.$parent.type === "card"\n ? _c("div", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: !_vm.active,\n expression: "!active"\n }\n ],\n staticClass: "el-carousel__mask"\n })\n : _vm._e(),\n _vm._t("default")\n ],\n 2\n )\n}\nvar itemvue_type_template_id_1801ae19_staticRenderFns = []\nitemvue_type_template_id_1801ae19_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/carousel/src/item.vue?vue&type=template&id=1801ae19&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/carousel/src/item.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\nvar CARD_SCALE = 0.83;\n/* harmony default export */ var itemvue_type_script_lang_js_ = ({\n name: \'ElCarouselItem\',\n\n props: {\n name: String,\n label: {\n type: [String, Number],\n default: \'\'\n }\n },\n\n data: function data() {\n return {\n hover: false,\n translate: 0,\n scale: 1,\n active: false,\n ready: false,\n inStage: false,\n animating: false\n };\n },\n\n\n methods: {\n processIndex: function processIndex(index, activeIndex, length) {\n if (activeIndex === 0 && index === length - 1) {\n return -1;\n } else if (activeIndex === length - 1 && index === 0) {\n return length;\n } else if (index < activeIndex - 1 && activeIndex - index >= length / 2) {\n return length + 1;\n } else if (index > activeIndex + 1 && index - activeIndex >= length / 2) {\n return -2;\n }\n return index;\n },\n calcCardTranslate: function calcCardTranslate(index, activeIndex) {\n var parentWidth = this.$parent.$el.offsetWidth;\n if (this.inStage) {\n return parentWidth * ((2 - CARD_SCALE) * (index - activeIndex) + 1) / 4;\n } else if (index < activeIndex) {\n return -(1 + CARD_SCALE) * parentWidth / 4;\n } else {\n return (3 + CARD_SCALE) * parentWidth / 4;\n }\n },\n calcTranslate: function calcTranslate(index, activeIndex, isVertical) {\n var distance = this.$parent.$el[isVertical ? \'offsetHeight\' : \'offsetWidth\'];\n return distance * (index - activeIndex);\n },\n translateItem: function translateItem(index, activeIndex, oldIndex) {\n var parentType = this.$parent.type;\n var parentDirection = this.parentDirection;\n var length = this.$parent.items.length;\n if (parentType !== \'card\' && oldIndex !== undefined) {\n this.animating = index === activeIndex || index === oldIndex;\n }\n if (index !== activeIndex && length > 2 && this.$parent.loop) {\n index = this.processIndex(index, activeIndex, length);\n }\n if (parentType === \'card\') {\n if (parentDirection === \'vertical\') {\n console.warn(\'[Element Warn][Carousel]vertical direction is not supported in card mode\');\n }\n this.inStage = Math.round(Math.abs(index - activeIndex)) <= 1;\n this.active = index === activeIndex;\n this.translate = this.calcCardTranslate(index, activeIndex);\n this.scale = this.active ? 1 : CARD_SCALE;\n } else {\n this.active = index === activeIndex;\n var isVertical = parentDirection === \'vertical\';\n this.translate = this.calcTranslate(index, activeIndex, isVertical);\n this.scale = 1;\n }\n this.ready = true;\n },\n handleItemClick: function handleItemClick() {\n var parent = this.$parent;\n if (parent && parent.type === \'card\') {\n var index = parent.items.indexOf(this);\n parent.setActiveItem(index);\n }\n }\n },\n\n computed: {\n parentDirection: function parentDirection() {\n return this.$parent.direction;\n },\n itemStyle: function itemStyle() {\n var translateType = this.parentDirection === \'vertical\' ? \'translateY\' : \'translateX\';\n var value = translateType + \'(\' + this.translate + \'px) scale(\' + this.scale + \')\';\n var style = {\n transform: value\n };\n return Object(util_["autoprefixer"])(style);\n }\n },\n\n created: function created() {\n this.$parent && this.$parent.updateItems();\n },\n destroyed: function destroyed() {\n this.$parent && this.$parent.updateItems();\n }\n});\n// CONCATENATED MODULE: ./packages/carousel/src/item.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_itemvue_type_script_lang_js_ = (itemvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/carousel/src/item.vue\n\n\n\n\n\n/* normalize component */\n\nvar item_component = normalizeComponent(\n src_itemvue_type_script_lang_js_,\n itemvue_type_template_id_1801ae19_render,\n itemvue_type_template_id_1801ae19_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var item_api; }\nitem_component.options.__file = "packages/carousel/src/item.vue"\n/* harmony default export */ var src_item = (item_component.exports);\n// CONCATENATED MODULE: ./packages/carousel-item/index.js\n\n\n/* istanbul ignore next */\nsrc_item.install = function (Vue) {\n Vue.component(src_item.name, src_item);\n};\n\n/* harmony default export */ var carousel_item = (src_item);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/collapse/src/collapse.vue?vue&type=template&id=461d57f4&\nvar collapsevue_type_template_id_461d57f4_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 staticClass: "el-collapse",\n attrs: { role: "tablist", "aria-multiselectable": "true" }\n },\n [_vm._t("default")],\n 2\n )\n}\nvar collapsevue_type_template_id_461d57f4_staticRenderFns = []\ncollapsevue_type_template_id_461d57f4_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/collapse/src/collapse.vue?vue&type=template&id=461d57f4&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/collapse/src/collapse.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n\n/* harmony default export */ var collapsevue_type_script_lang_js_ = ({\n name: \'ElCollapse\',\n\n componentName: \'ElCollapse\',\n\n props: {\n accordion: Boolean,\n value: {\n type: [Array, String, Number],\n default: function _default() {\n return [];\n }\n }\n },\n\n data: function data() {\n return {\n activeNames: [].concat(this.value)\n };\n },\n provide: function provide() {\n return {\n collapse: this\n };\n },\n\n\n watch: {\n value: function value(_value) {\n this.activeNames = [].concat(_value);\n }\n },\n\n methods: {\n setActiveNames: function setActiveNames(activeNames) {\n activeNames = [].concat(activeNames);\n var value = this.accordion ? activeNames[0] : activeNames;\n this.activeNames = activeNames;\n this.$emit(\'input\', value);\n this.$emit(\'change\', value);\n },\n handleItemClick: function handleItemClick(item) {\n if (this.accordion) {\n this.setActiveNames((this.activeNames[0] || this.activeNames[0] === 0) && this.activeNames[0] === item.name ? \'\' : item.name);\n } else {\n var activeNames = this.activeNames.slice(0);\n var index = activeNames.indexOf(item.name);\n\n if (index > -1) {\n activeNames.splice(index, 1);\n } else {\n activeNames.push(item.name);\n }\n this.setActiveNames(activeNames);\n }\n }\n },\n\n created: function created() {\n this.$on(\'item-click\', this.handleItemClick);\n }\n});\n// CONCATENATED MODULE: ./packages/collapse/src/collapse.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_collapsevue_type_script_lang_js_ = (collapsevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/collapse/src/collapse.vue\n\n\n\n\n\n/* normalize component */\n\nvar collapse_component = normalizeComponent(\n src_collapsevue_type_script_lang_js_,\n collapsevue_type_template_id_461d57f4_render,\n collapsevue_type_template_id_461d57f4_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var collapse_api; }\ncollapse_component.options.__file = "packages/collapse/src/collapse.vue"\n/* harmony default export */ var collapse = (collapse_component.exports);\n// CONCATENATED MODULE: ./packages/collapse/index.js\n\n\n/* istanbul ignore next */\ncollapse.install = function (Vue) {\n Vue.component(collapse.name, collapse);\n};\n\n/* harmony default export */ var packages_collapse = (collapse);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/collapse/src/collapse-item.vue?vue&type=template&id=2d05faac&\nvar collapse_itemvue_type_template_id_2d05faac_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 staticClass: "el-collapse-item",\n class: { "is-active": _vm.isActive, "is-disabled": _vm.disabled }\n },\n [\n _c(\n "div",\n {\n attrs: {\n role: "tab",\n "aria-expanded": _vm.isActive,\n "aria-controls": "el-collapse-content-" + _vm.id,\n "aria-describedby": "el-collapse-content-" + _vm.id\n }\n },\n [\n _c(\n "div",\n {\n staticClass: "el-collapse-item__header",\n class: {\n focusing: _vm.focusing,\n "is-active": _vm.isActive\n },\n attrs: {\n role: "button",\n id: "el-collapse-head-" + _vm.id,\n tabindex: _vm.disabled ? undefined : 0\n },\n on: {\n click: _vm.handleHeaderClick,\n keyup: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "space", 32, $event.key, [\n " ",\n "Spacebar"\n ]) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n $event.stopPropagation()\n return _vm.handleEnterClick($event)\n },\n focus: _vm.handleFocus,\n blur: function($event) {\n _vm.focusing = false\n }\n }\n },\n [\n _vm._t("title", [_vm._v(_vm._s(_vm.title))]),\n _c("i", {\n staticClass: "el-collapse-item__arrow el-icon-arrow-right",\n class: { "is-active": _vm.isActive }\n })\n ],\n 2\n )\n ]\n ),\n _c("el-collapse-transition", [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.isActive,\n expression: "isActive"\n }\n ],\n staticClass: "el-collapse-item__wrap",\n attrs: {\n role: "tabpanel",\n "aria-hidden": !_vm.isActive,\n "aria-labelledby": "el-collapse-head-" + _vm.id,\n id: "el-collapse-content-" + _vm.id\n }\n },\n [\n _c(\n "div",\n { staticClass: "el-collapse-item__content" },\n [_vm._t("default")],\n 2\n )\n ]\n )\n ])\n ],\n 1\n )\n}\nvar collapse_itemvue_type_template_id_2d05faac_staticRenderFns = []\ncollapse_itemvue_type_template_id_2d05faac_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/collapse/src/collapse-item.vue?vue&type=template&id=2d05faac&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/collapse/src/collapse-item.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//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ var collapse_itemvue_type_script_lang_js_ = ({\n name: \'ElCollapseItem\',\n\n componentName: \'ElCollapseItem\',\n\n mixins: [emitter_default.a],\n\n components: { ElCollapseTransition: collapse_transition_default.a },\n\n data: function data() {\n return {\n contentWrapStyle: {\n height: \'auto\',\n display: \'block\'\n },\n contentHeight: 0,\n focusing: false,\n isClick: false,\n id: Object(util_["generateId"])()\n };\n },\n\n\n inject: [\'collapse\'],\n\n props: {\n title: String,\n name: {\n type: [String, Number],\n default: function _default() {\n return this._uid;\n }\n },\n disabled: Boolean\n },\n\n computed: {\n isActive: function isActive() {\n return this.collapse.activeNames.indexOf(this.name) > -1;\n }\n },\n\n methods: {\n handleFocus: function handleFocus() {\n var _this = this;\n\n setTimeout(function () {\n if (!_this.isClick) {\n _this.focusing = true;\n } else {\n _this.isClick = false;\n }\n }, 50);\n },\n handleHeaderClick: function handleHeaderClick() {\n if (this.disabled) return;\n this.dispatch(\'ElCollapse\', \'item-click\', this);\n this.focusing = false;\n this.isClick = true;\n },\n handleEnterClick: function handleEnterClick() {\n this.dispatch(\'ElCollapse\', \'item-click\', this);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/collapse/src/collapse-item.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_collapse_itemvue_type_script_lang_js_ = (collapse_itemvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/collapse/src/collapse-item.vue\n\n\n\n\n\n/* normalize component */\n\nvar collapse_item_component = normalizeComponent(\n src_collapse_itemvue_type_script_lang_js_,\n collapse_itemvue_type_template_id_2d05faac_render,\n collapse_itemvue_type_template_id_2d05faac_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var collapse_item_api; }\ncollapse_item_component.options.__file = "packages/collapse/src/collapse-item.vue"\n/* harmony default export */ var collapse_item = (collapse_item_component.exports);\n// CONCATENATED MODULE: ./packages/collapse-item/index.js\n\n\n/* istanbul ignore next */\ncollapse_item.install = function (Vue) {\n Vue.component(collapse_item.name, collapse_item);\n};\n\n/* harmony default export */ var packages_collapse_item = (collapse_item);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader/src/cascader.vue?vue&type=template&id=032537a6&\nvar cascadervue_type_template_id_032537a6_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: "clickoutside",\n rawName: "v-clickoutside",\n value: function() {\n return _vm.toggleDropDownVisible(false)\n },\n expression: "() => toggleDropDownVisible(false)"\n }\n ],\n ref: "reference",\n class: [\n "el-cascader",\n _vm.realSize && "el-cascader--" + _vm.realSize,\n { "is-disabled": _vm.isDisabled }\n ],\n on: {\n mouseenter: function($event) {\n _vm.inputHover = true\n },\n mouseleave: function($event) {\n _vm.inputHover = false\n },\n click: function() {\n return _vm.toggleDropDownVisible(_vm.readonly ? undefined : true)\n },\n keydown: _vm.handleKeyDown\n }\n },\n [\n _c(\n "el-input",\n {\n ref: "input",\n class: { "is-focus": _vm.dropDownVisible },\n attrs: {\n size: _vm.realSize,\n placeholder: _vm.placeholder,\n readonly: _vm.readonly,\n disabled: _vm.isDisabled,\n "validate-event": false\n },\n on: {\n focus: _vm.handleFocus,\n blur: _vm.handleBlur,\n input: _vm.handleInput\n },\n model: {\n value: _vm.multiple ? _vm.presentText : _vm.inputValue,\n callback: function($$v) {\n _vm.multiple ? _vm.presentText : (_vm.inputValue = $$v)\n },\n expression: "multiple ? presentText : inputValue"\n }\n },\n [\n _c("template", { slot: "suffix" }, [\n _vm.clearBtnVisible\n ? _c("i", {\n key: "clear",\n staticClass: "el-input__icon el-icon-circle-close",\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.handleClear($event)\n }\n }\n })\n : _c("i", {\n key: "arrow-down",\n class: [\n "el-input__icon",\n "el-icon-arrow-down",\n _vm.dropDownVisible && "is-reverse"\n ],\n on: {\n click: function($event) {\n $event.stopPropagation()\n _vm.toggleDropDownVisible()\n }\n }\n })\n ])\n ],\n 2\n ),\n _vm.multiple\n ? _c(\n "div",\n { staticClass: "el-cascader__tags" },\n [\n _vm._l(_vm.presentTags, function(tag) {\n return _c(\n "el-tag",\n {\n key: tag.key,\n attrs: {\n type: "info",\n size: _vm.tagSize,\n hit: tag.hitState,\n closable: tag.closable,\n "disable-transitions": ""\n },\n on: {\n close: function($event) {\n _vm.deleteTag(tag)\n }\n }\n },\n [_c("span", [_vm._v(_vm._s(tag.text))])]\n )\n }),\n _vm.filterable && !_vm.isDisabled\n ? _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model.trim",\n value: _vm.inputValue,\n expression: "inputValue",\n modifiers: { trim: true }\n }\n ],\n staticClass: "el-cascader__search-input",\n attrs: {\n type: "text",\n placeholder: _vm.presentTags.length ? "" : _vm.placeholder\n },\n domProps: { value: _vm.inputValue },\n on: {\n input: [\n function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.inputValue = $event.target.value.trim()\n },\n function(e) {\n return _vm.handleInput(_vm.inputValue, e)\n }\n ],\n click: function($event) {\n $event.stopPropagation()\n _vm.toggleDropDownVisible(true)\n },\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "delete",\n [8, 46],\n $event.key,\n ["Backspace", "Delete", "Del"]\n )\n ) {\n return null\n }\n return _vm.handleDelete($event)\n },\n blur: function($event) {\n _vm.$forceUpdate()\n }\n }\n })\n : _vm._e()\n ],\n 2\n )\n : _vm._e(),\n _c(\n "transition",\n {\n attrs: { name: "el-zoom-in-top" },\n on: { "after-leave": _vm.handleDropdownLeave }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.dropDownVisible,\n expression: "dropDownVisible"\n }\n ],\n ref: "popper",\n class: ["el-popper", "el-cascader__dropdown", _vm.popperClass]\n },\n [\n _c("el-cascader-panel", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: !_vm.filtering,\n expression: "!filtering"\n }\n ],\n ref: "panel",\n attrs: {\n options: _vm.options,\n props: _vm.config,\n border: false,\n "render-label": _vm.$scopedSlots.default\n },\n on: {\n "expand-change": _vm.handleExpandChange,\n close: function($event) {\n _vm.toggleDropDownVisible(false)\n }\n },\n model: {\n value: _vm.checkedValue,\n callback: function($$v) {\n _vm.checkedValue = $$v\n },\n expression: "checkedValue"\n }\n }),\n _vm.filterable\n ? _c(\n "el-scrollbar",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.filtering,\n expression: "filtering"\n }\n ],\n ref: "suggestionPanel",\n staticClass: "el-cascader__suggestion-panel",\n attrs: {\n tag: "ul",\n "view-class": "el-cascader__suggestion-list"\n },\n nativeOn: {\n keydown: function($event) {\n return _vm.handleSuggestionKeyDown($event)\n }\n }\n },\n [\n _vm.suggestions.length\n ? _vm._l(_vm.suggestions, function(item, index) {\n return _c(\n "li",\n {\n key: item.uid,\n class: [\n "el-cascader__suggestion-item",\n item.checked && "is-checked"\n ],\n attrs: { tabindex: -1 },\n on: {\n click: function($event) {\n _vm.handleSuggestionClick(index)\n }\n }\n },\n [\n _c("span", [_vm._v(_vm._s(item.text))]),\n item.checked\n ? _c("i", { staticClass: "el-icon-check" })\n : _vm._e()\n ]\n )\n })\n : _vm._t("empty", [\n _c(\n "li",\n { staticClass: "el-cascader__empty-text" },\n [_vm._v(_vm._s(_vm.t("el.cascader.noMatch")))]\n )\n ])\n ],\n 2\n )\n : _vm._e()\n ],\n 1\n )\n ]\n )\n ],\n 1\n )\n}\nvar cascadervue_type_template_id_032537a6_staticRenderFns = []\ncascadervue_type_template_id_032537a6_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/cascader/src/cascader.vue?vue&type=template&id=032537a6&\n\n// EXTERNAL MODULE: external "element-ui/lib/cascader-panel"\nvar cascader_panel_ = __webpack_require__(43);\nvar cascader_panel_default = /*#__PURE__*/__webpack_require__.n(cascader_panel_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/aria-utils"\nvar aria_utils_ = __webpack_require__(35);\nvar aria_utils_default = /*#__PURE__*/__webpack_require__.n(aria_utils_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader/src/cascader.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar KeyCode = aria_utils_default.a.keys;\n\nvar MigratingProps = {\n expandTrigger: {\n newProp: \'expandTrigger\',\n type: String\n },\n changeOnSelect: {\n newProp: \'checkStrictly\',\n type: Boolean\n },\n hoverThreshold: {\n newProp: \'hoverThreshold\',\n type: Number\n }\n};\n\nvar PopperMixin = {\n props: {\n placement: {\n type: String,\n default: \'bottom-start\'\n },\n appendToBody: vue_popper_default.a.props.appendToBody,\n visibleArrow: {\n type: Boolean,\n default: true\n },\n arrowOffset: vue_popper_default.a.props.arrowOffset,\n offset: vue_popper_default.a.props.offset,\n boundariesPadding: vue_popper_default.a.props.boundariesPadding,\n popperOptions: vue_popper_default.a.props.popperOptions,\n transformOrigin: vue_popper_default.a.props.transformOrigin\n },\n methods: vue_popper_default.a.methods,\n data: vue_popper_default.a.data,\n beforeDestroy: vue_popper_default.a.beforeDestroy\n};\n\nvar InputSizeMap = {\n medium: 36,\n small: 32,\n mini: 28\n};\n\n/* harmony default export */ var cascadervue_type_script_lang_js_ = ({\n name: \'ElCascader\',\n\n directives: { Clickoutside: clickoutside_default.a },\n\n mixins: [PopperMixin, emitter_default.a, locale_default.a, migrating_default.a],\n\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n\n components: {\n ElInput: input_default.a,\n ElTag: tag_default.a,\n ElScrollbar: scrollbar_default.a,\n ElCascaderPanel: cascader_panel_default.a\n },\n\n props: {\n value: {},\n options: Array,\n props: Object,\n size: String,\n placeholder: {\n type: String,\n default: function _default() {\n return Object(lib_locale_["t"])(\'el.cascader.placeholder\');\n }\n },\n disabled: Boolean,\n clearable: Boolean,\n filterable: Boolean,\n filterMethod: Function,\n separator: {\n type: String,\n default: \' / \'\n },\n showAllLevels: {\n type: Boolean,\n default: true\n },\n collapseTags: Boolean,\n debounce: {\n type: Number,\n default: 300\n },\n beforeFilter: {\n type: Function,\n default: function _default() {\n return function () {};\n }\n },\n popperClass: String\n },\n\n data: function data() {\n return {\n dropDownVisible: false,\n checkedValue: this.value,\n inputHover: false,\n inputValue: null,\n presentText: null,\n presentTags: [],\n checkedNodes: [],\n filtering: false,\n suggestions: [],\n inputInitialHeight: 0,\n pressDeleteCount: 0\n };\n },\n\n\n computed: {\n realSize: function realSize() {\n var _elFormItemSize = (this.elFormItem || {}).elFormItemSize;\n return this.size || _elFormItemSize || (this.$ELEMENT || {}).size;\n },\n tagSize: function tagSize() {\n return [\'small\', \'mini\'].indexOf(this.realSize) > -1 ? \'mini\' : \'small\';\n },\n isDisabled: function isDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n },\n config: function config() {\n var config = this.props || {};\n var $attrs = this.$attrs;\n\n\n Object.keys(MigratingProps).forEach(function (oldProp) {\n var _MigratingProps$oldPr = MigratingProps[oldProp],\n newProp = _MigratingProps$oldPr.newProp,\n type = _MigratingProps$oldPr.type;\n\n var oldValue = $attrs[oldProp] || $attrs[Object(util_["kebabCase"])(oldProp)];\n if (Object(shared_["isDef"])(oldProp) && !Object(shared_["isDef"])(config[newProp])) {\n if (type === Boolean && oldValue === \'\') {\n oldValue = true;\n }\n config[newProp] = oldValue;\n }\n });\n\n return config;\n },\n multiple: function multiple() {\n return this.config.multiple;\n },\n leafOnly: function leafOnly() {\n return !this.config.checkStrictly;\n },\n readonly: function readonly() {\n return !this.filterable || this.multiple;\n },\n clearBtnVisible: function clearBtnVisible() {\n if (!this.clearable || this.isDisabled || this.filtering || !this.inputHover) {\n return false;\n }\n\n return this.multiple ? !!this.checkedNodes.filter(function (node) {\n return !node.isDisabled;\n }).length : !!this.presentText;\n },\n panel: function panel() {\n return this.$refs.panel;\n }\n },\n\n watch: {\n disabled: function disabled() {\n this.computePresentContent();\n },\n value: function value(val) {\n if (!Object(util_["isEqual"])(val, this.checkedValue)) {\n this.checkedValue = val;\n this.computePresentContent();\n }\n },\n checkedValue: function checkedValue(val) {\n var value = this.value,\n dropDownVisible = this.dropDownVisible;\n var _config = this.config,\n checkStrictly = _config.checkStrictly,\n multiple = _config.multiple;\n\n\n if (!Object(util_["isEqual"])(val, value) || Object(types_["isUndefined"])(value)) {\n this.computePresentContent();\n // hide dropdown when single mode\n if (!multiple && !checkStrictly && dropDownVisible) {\n this.toggleDropDownVisible(false);\n }\n\n this.$emit(\'input\', val);\n this.$emit(\'change\', val);\n this.dispatch(\'ElFormItem\', \'el.form.change\', [val]);\n }\n },\n\n options: {\n handler: function handler() {\n this.$nextTick(this.computePresentContent);\n },\n deep: true\n },\n presentText: function presentText(val) {\n this.inputValue = val;\n },\n presentTags: function presentTags(val, oldVal) {\n if (this.multiple && (val.length || oldVal.length)) {\n this.$nextTick(this.updateStyle);\n }\n },\n filtering: function filtering(val) {\n this.$nextTick(this.updatePopper);\n }\n },\n\n mounted: function mounted() {\n var _this = this;\n\n var input = this.$refs.input;\n\n if (input && input.$el) {\n this.inputInitialHeight = input.$el.offsetHeight || InputSizeMap[this.realSize] || 40;\n }\n\n if (!this.isEmptyValue(this.value)) {\n this.computePresentContent();\n }\n\n this.filterHandler = debounce_default()(this.debounce, function () {\n var inputValue = _this.inputValue;\n\n\n if (!inputValue) {\n _this.filtering = false;\n return;\n }\n\n var before = _this.beforeFilter(inputValue);\n if (before && before.then) {\n before.then(_this.getSuggestions);\n } else if (before !== false) {\n _this.getSuggestions();\n } else {\n _this.filtering = false;\n }\n });\n\n Object(resize_event_["addResizeListener"])(this.$el, this.updateStyle);\n },\n beforeDestroy: function beforeDestroy() {\n Object(resize_event_["removeResizeListener"])(this.$el, this.updateStyle);\n },\n\n\n methods: {\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n \'expand-trigger\': \'expand-trigger is removed, use `props.expandTrigger` instead.\',\n \'change-on-select\': \'change-on-select is removed, use `props.checkStrictly` instead.\',\n \'hover-threshold\': \'hover-threshold is removed, use `props.hoverThreshold` instead\'\n },\n events: {\n \'active-item-change\': \'active-item-change is renamed to expand-change\'\n }\n };\n },\n toggleDropDownVisible: function toggleDropDownVisible(visible) {\n var _this2 = this;\n\n if (this.isDisabled) return;\n\n var dropDownVisible = this.dropDownVisible;\n var input = this.$refs.input;\n\n visible = Object(shared_["isDef"])(visible) ? visible : !dropDownVisible;\n if (visible !== dropDownVisible) {\n this.dropDownVisible = visible;\n if (visible) {\n this.$nextTick(function () {\n _this2.updatePopper();\n _this2.panel.scrollIntoView();\n });\n }\n input.$refs.input.setAttribute(\'aria-expanded\', visible);\n this.$emit(\'visible-change\', visible);\n }\n },\n handleDropdownLeave: function handleDropdownLeave() {\n this.filtering = false;\n this.inputValue = this.presentText;\n this.doDestroy();\n },\n handleKeyDown: function handleKeyDown(event) {\n switch (event.keyCode) {\n case KeyCode.enter:\n this.toggleDropDownVisible();\n break;\n case KeyCode.down:\n this.toggleDropDownVisible(true);\n this.focusFirstNode();\n event.preventDefault();\n break;\n case KeyCode.esc:\n case KeyCode.tab:\n this.toggleDropDownVisible(false);\n break;\n }\n },\n handleFocus: function handleFocus(e) {\n this.$emit(\'focus\', e);\n },\n handleBlur: function handleBlur(e) {\n this.$emit(\'blur\', e);\n },\n handleInput: function handleInput(val, event) {\n !this.dropDownVisible && this.toggleDropDownVisible(true);\n\n if (event && event.isComposing) return;\n if (val) {\n this.filterHandler();\n } else {\n this.filtering = false;\n }\n },\n handleClear: function handleClear() {\n this.presentText = \'\';\n this.panel.clearCheckedNodes();\n },\n handleExpandChange: function handleExpandChange(value) {\n this.$nextTick(this.updatePopper.bind(this));\n this.$emit(\'expand-change\', value);\n this.$emit(\'active-item-change\', value); // Deprecated\n },\n focusFirstNode: function focusFirstNode() {\n var _this3 = this;\n\n this.$nextTick(function () {\n var filtering = _this3.filtering;\n var _$refs = _this3.$refs,\n popper = _$refs.popper,\n suggestionPanel = _$refs.suggestionPanel;\n\n var firstNode = null;\n\n if (filtering && suggestionPanel) {\n firstNode = suggestionPanel.$el.querySelector(\'.el-cascader__suggestion-item\');\n } else {\n var firstMenu = popper.querySelector(\'.el-cascader-menu\');\n firstNode = firstMenu.querySelector(\'.el-cascader-node[tabindex="-1"]\');\n }\n\n if (firstNode) {\n firstNode.focus();\n !filtering && firstNode.click();\n }\n });\n },\n computePresentContent: function computePresentContent() {\n var _this4 = this;\n\n // nextTick is required, because checked nodes may not change right now\n this.$nextTick(function () {\n if (_this4.config.multiple) {\n _this4.computePresentTags();\n _this4.presentText = _this4.presentTags.length ? \' \' : null;\n } else {\n _this4.computePresentText();\n }\n });\n },\n isEmptyValue: function isEmptyValue(val) {\n var multiple = this.multiple;\n var emitPath = this.panel.config.emitPath;\n\n if (multiple || emitPath) {\n return Object(util_["isEmpty"])(val);\n }\n return false;\n },\n computePresentText: function computePresentText() {\n var checkedValue = this.checkedValue,\n config = this.config;\n\n if (!this.isEmptyValue(checkedValue)) {\n var node = this.panel.getNodeByValue(checkedValue);\n if (node && (config.checkStrictly || node.isLeaf)) {\n this.presentText = node.getText(this.showAllLevels, this.separator);\n return;\n }\n }\n this.presentText = null;\n },\n computePresentTags: function computePresentTags() {\n var isDisabled = this.isDisabled,\n leafOnly = this.leafOnly,\n showAllLevels = this.showAllLevels,\n separator = this.separator,\n collapseTags = this.collapseTags;\n\n var checkedNodes = this.getCheckedNodes(leafOnly);\n var tags = [];\n\n var genTag = function genTag(node) {\n return {\n node: node,\n key: node.uid,\n text: node.getText(showAllLevels, separator),\n hitState: false,\n closable: !isDisabled && !node.isDisabled\n };\n };\n\n if (checkedNodes.length) {\n var first = checkedNodes[0],\n rest = checkedNodes.slice(1);\n\n var restCount = rest.length;\n tags.push(genTag(first));\n\n if (restCount) {\n if (collapseTags) {\n tags.push({\n key: -1,\n text: \'+ \' + restCount,\n closable: false\n });\n } else {\n rest.forEach(function (node) {\n return tags.push(genTag(node));\n });\n }\n }\n }\n\n this.checkedNodes = checkedNodes;\n this.presentTags = tags;\n },\n getSuggestions: function getSuggestions() {\n var _this5 = this;\n\n var filterMethod = this.filterMethod;\n\n\n if (!Object(types_["isFunction"])(filterMethod)) {\n filterMethod = function filterMethod(node, keyword) {\n return node.text.includes(keyword);\n };\n }\n\n var suggestions = this.panel.getFlattedNodes(this.leafOnly).filter(function (node) {\n if (node.isDisabled) return false;\n node.text = node.getText(_this5.showAllLevels, _this5.separator) || \'\';\n return filterMethod(node, _this5.inputValue);\n });\n\n if (this.multiple) {\n this.presentTags.forEach(function (tag) {\n tag.hitState = false;\n });\n } else {\n suggestions.forEach(function (node) {\n node.checked = Object(util_["isEqual"])(_this5.checkedValue, node.getValueByOption());\n });\n }\n\n this.filtering = true;\n this.suggestions = suggestions;\n this.$nextTick(this.updatePopper);\n },\n handleSuggestionKeyDown: function handleSuggestionKeyDown(event) {\n var keyCode = event.keyCode,\n target = event.target;\n\n switch (keyCode) {\n case KeyCode.enter:\n target.click();\n break;\n case KeyCode.up:\n var prev = target.previousElementSibling;\n prev && prev.focus();\n break;\n case KeyCode.down:\n var next = target.nextElementSibling;\n next && next.focus();\n break;\n case KeyCode.esc:\n case KeyCode.tab:\n this.toggleDropDownVisible(false);\n break;\n }\n },\n handleDelete: function handleDelete() {\n var inputValue = this.inputValue,\n pressDeleteCount = this.pressDeleteCount,\n presentTags = this.presentTags;\n\n var lastIndex = presentTags.length - 1;\n var lastTag = presentTags[lastIndex];\n this.pressDeleteCount = inputValue ? 0 : pressDeleteCount + 1;\n\n if (!lastTag) return;\n\n if (this.pressDeleteCount) {\n if (lastTag.hitState) {\n this.deleteTag(lastTag);\n } else {\n lastTag.hitState = true;\n }\n }\n },\n handleSuggestionClick: function handleSuggestionClick(index) {\n var multiple = this.multiple;\n\n var targetNode = this.suggestions[index];\n\n if (multiple) {\n var checked = targetNode.checked;\n\n targetNode.doCheck(!checked);\n this.panel.calculateMultiCheckedValue();\n } else {\n this.checkedValue = targetNode.getValueByOption();\n this.toggleDropDownVisible(false);\n }\n },\n deleteTag: function deleteTag(tag) {\n var checkedValue = this.checkedValue;\n\n var current = tag.node.getValueByOption();\n var val = checkedValue.find(function (n) {\n return Object(util_["isEqual"])(n, current);\n });\n this.checkedValue = checkedValue.filter(function (n) {\n return !Object(util_["isEqual"])(n, current);\n });\n this.$emit(\'remove-tag\', val);\n },\n updateStyle: function updateStyle() {\n var $el = this.$el,\n inputInitialHeight = this.inputInitialHeight;\n\n if (this.$isServer || !$el) return;\n\n var suggestionPanel = this.$refs.suggestionPanel;\n\n var inputInner = $el.querySelector(\'.el-input__inner\');\n\n if (!inputInner) return;\n\n var tags = $el.querySelector(\'.el-cascader__tags\');\n var suggestionPanelEl = null;\n\n if (suggestionPanel && (suggestionPanelEl = suggestionPanel.$el)) {\n var suggestionList = suggestionPanelEl.querySelector(\'.el-cascader__suggestion-list\');\n suggestionList.style.minWidth = inputInner.offsetWidth + \'px\';\n }\n\n if (tags) {\n var offsetHeight = Math.round(tags.getBoundingClientRect().height);\n var height = Math.max(offsetHeight + 6, inputInitialHeight) + \'px\';\n inputInner.style.height = height;\n if (this.dropDownVisible) {\n this.updatePopper();\n }\n }\n },\n\n\n /**\n * public methods\n */\n getCheckedNodes: function getCheckedNodes(leafOnly) {\n return this.panel.getCheckedNodes(leafOnly);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/cascader/src/cascader.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascadervue_type_script_lang_js_ = (cascadervue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/cascader/src/cascader.vue\n\n\n\n\n\n/* normalize component */\n\nvar cascader_component = normalizeComponent(\n src_cascadervue_type_script_lang_js_,\n cascadervue_type_template_id_032537a6_render,\n cascadervue_type_template_id_032537a6_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var cascader_api; }\ncascader_component.options.__file = "packages/cascader/src/cascader.vue"\n/* harmony default export */ var cascader = (cascader_component.exports);\n// CONCATENATED MODULE: ./packages/cascader/index.js\n\n\n/* istanbul ignore next */\ncascader.install = function (Vue) {\n Vue.component(cascader.name, cascader);\n};\n\n/* harmony default export */ var packages_cascader = (cascader);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/main.vue?vue&type=template&id=55c8ade7&\nvar mainvue_type_template_id_55c8ade7_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: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.hide,\n expression: "hide"\n }\n ],\n class: [\n "el-color-picker",\n _vm.colorDisabled ? "is-disabled" : "",\n _vm.colorSize ? "el-color-picker--" + _vm.colorSize : ""\n ]\n },\n [\n _vm.colorDisabled\n ? _c("div", { staticClass: "el-color-picker__mask" })\n : _vm._e(),\n _c(\n "div",\n {\n staticClass: "el-color-picker__trigger",\n on: { click: _vm.handleTrigger }\n },\n [\n _c(\n "span",\n {\n staticClass: "el-color-picker__color",\n class: { "is-alpha": _vm.showAlpha }\n },\n [\n _c("span", {\n staticClass: "el-color-picker__color-inner",\n style: {\n backgroundColor: _vm.displayedColor\n }\n }),\n !_vm.value && !_vm.showPanelColor\n ? _c("span", {\n staticClass: "el-color-picker__empty el-icon-close"\n })\n : _vm._e()\n ]\n ),\n _c("span", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.value || _vm.showPanelColor,\n expression: "value || showPanelColor"\n }\n ],\n staticClass: "el-color-picker__icon el-icon-arrow-down"\n })\n ]\n ),\n _c("picker-dropdown", {\n ref: "dropdown",\n class: ["el-color-picker__panel", _vm.popperClass || ""],\n attrs: {\n color: _vm.color,\n "show-alpha": _vm.showAlpha,\n predefine: _vm.predefine\n },\n on: { pick: _vm.confirmValue, clear: _vm.clearValue },\n model: {\n value: _vm.showPicker,\n callback: function($$v) {\n _vm.showPicker = $$v\n },\n expression: "showPicker"\n }\n })\n ],\n 1\n )\n}\nvar mainvue_type_template_id_55c8ade7_staticRenderFns = []\nmainvue_type_template_id_55c8ade7_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/color-picker/src/main.vue?vue&type=template&id=55c8ade7&\n\n// CONCATENATED MODULE: ./packages/color-picker/src/color.js\nvar color_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\nfunction color_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nvar hsv2hsl = function hsv2hsl(hue, sat, val) {\n return [hue, sat * val / ((hue = (2 - sat) * val) < 1 ? hue : 2 - hue) || 0, hue / 2];\n};\n\n// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\nvar isOnePointZero = function isOnePointZero(n) {\n return typeof n === \'string\' && n.indexOf(\'.\') !== -1 && parseFloat(n) === 1;\n};\n\nvar isPercentage = function isPercentage(n) {\n return typeof n === \'string\' && n.indexOf(\'%\') !== -1;\n};\n\n// Take input from [0, n] and return it as [0, 1]\nvar bound01 = function bound01(value, max) {\n if (isOnePointZero(value)) value = \'100%\';\n\n var processPercent = isPercentage(value);\n value = Math.min(max, Math.max(0, parseFloat(value)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n value = parseInt(value * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if (Math.abs(value - max) < 0.000001) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn\'t already\n return value % max / parseFloat(max);\n};\n\nvar INT_HEX_MAP = { 10: \'A\', 11: \'B\', 12: \'C\', 13: \'D\', 14: \'E\', 15: \'F\' };\n\nvar toHex = function toHex(_ref) {\n var r = _ref.r,\n g = _ref.g,\n b = _ref.b;\n\n var hexOne = function hexOne(value) {\n value = Math.min(Math.round(value), 255);\n var high = Math.floor(value / 16);\n var low = value % 16;\n return \'\' + (INT_HEX_MAP[high] || high) + (INT_HEX_MAP[low] || low);\n };\n\n if (isNaN(r) || isNaN(g) || isNaN(b)) return \'\';\n\n return \'#\' + hexOne(r) + hexOne(g) + hexOne(b);\n};\n\nvar HEX_INT_MAP = { A: 10, B: 11, C: 12, D: 13, E: 14, F: 15 };\n\nvar parseHexChannel = function parseHexChannel(hex) {\n if (hex.length === 2) {\n return (HEX_INT_MAP[hex[0].toUpperCase()] || +hex[0]) * 16 + (HEX_INT_MAP[hex[1].toUpperCase()] || +hex[1]);\n }\n\n return HEX_INT_MAP[hex[1].toUpperCase()] || +hex[1];\n};\n\nvar hsl2hsv = function hsl2hsv(hue, sat, light) {\n sat = sat / 100;\n light = light / 100;\n var smin = sat;\n var lmin = Math.max(light, 0.01);\n var sv = void 0;\n var v = void 0;\n\n light *= 2;\n sat *= light <= 1 ? light : 2 - light;\n smin *= lmin <= 1 ? lmin : 2 - lmin;\n v = (light + sat) / 2;\n sv = light === 0 ? 2 * smin / (lmin + smin) : 2 * sat / (light + sat);\n\n return {\n h: hue,\n s: sv * 100,\n v: v * 100\n };\n};\n\n// `rgbToHsv`\n// Converts an RGB color value to HSV\n// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n// *Returns:* { h, s, v } in [0,1]\nvar rgb2hsv = function rgb2hsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h = void 0,\n s = void 0;\n var v = max;\n\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n\n if (max === min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return { h: h * 360, s: s * 100, v: v * 100 };\n};\n\n// `hsvToRgb`\n// Converts an HSV color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nvar hsv2rgb = function hsv2rgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n\n var i = Math.floor(h);\n var f = h - i;\n var p = v * (1 - s);\n var q = v * (1 - f * s);\n var t = v * (1 - (1 - f) * s);\n var mod = i % 6;\n var r = [v, q, p, p, t, v][mod];\n var g = [t, v, v, q, p, p][mod];\n var b = [p, p, t, v, v, q][mod];\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255)\n };\n};\n\nvar Color = function () {\n function Color(options) {\n color_classCallCheck(this, Color);\n\n this._hue = 0;\n this._saturation = 100;\n this._value = 100;\n this._alpha = 100;\n\n this.enableAlpha = false;\n this.format = \'hex\';\n this.value = \'\';\n\n options = options || {};\n\n for (var option in options) {\n if (options.hasOwnProperty(option)) {\n this[option] = options[option];\n }\n }\n\n this.doOnChange();\n }\n\n Color.prototype.set = function set(prop, value) {\n if (arguments.length === 1 && (typeof prop === \'undefined\' ? \'undefined\' : color_typeof(prop)) === \'object\') {\n for (var p in prop) {\n if (prop.hasOwnProperty(p)) {\n this.set(p, prop[p]);\n }\n }\n\n return;\n }\n\n this[\'_\' + prop] = value;\n this.doOnChange();\n };\n\n Color.prototype.get = function get(prop) {\n return this[\'_\' + prop];\n };\n\n Color.prototype.toRgb = function toRgb() {\n return hsv2rgb(this._hue, this._saturation, this._value);\n };\n\n Color.prototype.fromString = function fromString(value) {\n var _this = this;\n\n if (!value) {\n this._hue = 0;\n this._saturation = 100;\n this._value = 100;\n\n this.doOnChange();\n return;\n }\n\n var fromHSV = function fromHSV(h, s, v) {\n _this._hue = Math.max(0, Math.min(360, h));\n _this._saturation = Math.max(0, Math.min(100, s));\n _this._value = Math.max(0, Math.min(100, v));\n\n _this.doOnChange();\n };\n\n if (value.indexOf(\'hsl\') !== -1) {\n var parts = value.replace(/hsla|hsl|\\(|\\)/gm, \'\').split(/\\s|,/g).filter(function (val) {\n return val !== \'\';\n }).map(function (val, index) {\n return index > 2 ? parseFloat(val) : parseInt(val, 10);\n });\n\n if (parts.length === 4) {\n this._alpha = Math.floor(parseFloat(parts[3]) * 100);\n } else if (parts.length === 3) {\n this._alpha = 100;\n }\n if (parts.length >= 3) {\n var _hsl2hsv = hsl2hsv(parts[0], parts[1], parts[2]),\n h = _hsl2hsv.h,\n s = _hsl2hsv.s,\n v = _hsl2hsv.v;\n\n fromHSV(h, s, v);\n }\n } else if (value.indexOf(\'hsv\') !== -1) {\n var _parts = value.replace(/hsva|hsv|\\(|\\)/gm, \'\').split(/\\s|,/g).filter(function (val) {\n return val !== \'\';\n }).map(function (val, index) {\n return index > 2 ? parseFloat(val) : parseInt(val, 10);\n });\n\n if (_parts.length === 4) {\n this._alpha = Math.floor(parseFloat(_parts[3]) * 100);\n } else if (_parts.length === 3) {\n this._alpha = 100;\n }\n if (_parts.length >= 3) {\n fromHSV(_parts[0], _parts[1], _parts[2]);\n }\n } else if (value.indexOf(\'rgb\') !== -1) {\n var _parts2 = value.replace(/rgba|rgb|\\(|\\)/gm, \'\').split(/\\s|,/g).filter(function (val) {\n return val !== \'\';\n }).map(function (val, index) {\n return index > 2 ? parseFloat(val) : parseInt(val, 10);\n });\n\n if (_parts2.length === 4) {\n this._alpha = Math.floor(parseFloat(_parts2[3]) * 100);\n } else if (_parts2.length === 3) {\n this._alpha = 100;\n }\n if (_parts2.length >= 3) {\n var _rgb2hsv = rgb2hsv(_parts2[0], _parts2[1], _parts2[2]),\n _h = _rgb2hsv.h,\n _s = _rgb2hsv.s,\n _v = _rgb2hsv.v;\n\n fromHSV(_h, _s, _v);\n }\n } else if (value.indexOf(\'#\') !== -1) {\n var hex = value.replace(\'#\', \'\').trim();\n if (!/^(?:[0-9a-fA-F]{3}){1,2}|[0-9a-fA-F]{8}$/.test(hex)) return;\n var r = void 0,\n g = void 0,\n b = void 0;\n\n if (hex.length === 3) {\n r = parseHexChannel(hex[0] + hex[0]);\n g = parseHexChannel(hex[1] + hex[1]);\n b = parseHexChannel(hex[2] + hex[2]);\n } else if (hex.length === 6 || hex.length === 8) {\n r = parseHexChannel(hex.substring(0, 2));\n g = parseHexChannel(hex.substring(2, 4));\n b = parseHexChannel(hex.substring(4, 6));\n }\n\n if (hex.length === 8) {\n this._alpha = Math.floor(parseHexChannel(hex.substring(6)) / 255 * 100);\n } else if (hex.length === 3 || hex.length === 6) {\n this._alpha = 100;\n }\n\n var _rgb2hsv2 = rgb2hsv(r, g, b),\n _h2 = _rgb2hsv2.h,\n _s2 = _rgb2hsv2.s,\n _v2 = _rgb2hsv2.v;\n\n fromHSV(_h2, _s2, _v2);\n }\n };\n\n Color.prototype.compare = function compare(color) {\n return Math.abs(color._hue - this._hue) < 2 && Math.abs(color._saturation - this._saturation) < 1 && Math.abs(color._value - this._value) < 1 && Math.abs(color._alpha - this._alpha) < 1;\n };\n\n Color.prototype.doOnChange = function doOnChange() {\n var _hue = this._hue,\n _saturation = this._saturation,\n _value = this._value,\n _alpha = this._alpha,\n format = this.format;\n\n\n if (this.enableAlpha) {\n switch (format) {\n case \'hsl\':\n var hsl = hsv2hsl(_hue, _saturation / 100, _value / 100);\n this.value = \'hsla(\' + _hue + \', \' + Math.round(hsl[1] * 100) + \'%, \' + Math.round(hsl[2] * 100) + \'%, \' + _alpha / 100 + \')\';\n break;\n case \'hsv\':\n this.value = \'hsva(\' + _hue + \', \' + Math.round(_saturation) + \'%, \' + Math.round(_value) + \'%, \' + _alpha / 100 + \')\';\n break;\n default:\n var _hsv2rgb = hsv2rgb(_hue, _saturation, _value),\n r = _hsv2rgb.r,\n g = _hsv2rgb.g,\n b = _hsv2rgb.b;\n\n this.value = \'rgba(\' + r + \', \' + g + \', \' + b + \', \' + _alpha / 100 + \')\';\n }\n } else {\n switch (format) {\n case \'hsl\':\n var _hsl = hsv2hsl(_hue, _saturation / 100, _value / 100);\n this.value = \'hsl(\' + _hue + \', \' + Math.round(_hsl[1] * 100) + \'%, \' + Math.round(_hsl[2] * 100) + \'%)\';\n break;\n case \'hsv\':\n this.value = \'hsv(\' + _hue + \', \' + Math.round(_saturation) + \'%, \' + Math.round(_value) + \'%)\';\n break;\n case \'rgb\':\n var _hsv2rgb2 = hsv2rgb(_hue, _saturation, _value),\n _r = _hsv2rgb2.r,\n _g = _hsv2rgb2.g,\n _b = _hsv2rgb2.b;\n\n this.value = \'rgb(\' + _r + \', \' + _g + \', \' + _b + \')\';\n break;\n default:\n this.value = toHex(hsv2rgb(_hue, _saturation, _value));\n }\n }\n };\n\n return Color;\n}();\n\n/* harmony default export */ var src_color = (Color);\n;\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/components/picker-dropdown.vue?vue&type=template&id=06601625&\nvar picker_dropdownvue_type_template_id_06601625_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n { attrs: { name: "el-zoom-in-top" }, on: { "after-leave": _vm.doDestroy } },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.showPopper,\n expression: "showPopper"\n }\n ],\n staticClass: "el-color-dropdown"\n },\n [\n _c(\n "div",\n { staticClass: "el-color-dropdown__main-wrapper" },\n [\n _c("hue-slider", {\n ref: "hue",\n staticStyle: { float: "right" },\n attrs: { color: _vm.color, vertical: "" }\n }),\n _c("sv-panel", { ref: "sl", attrs: { color: _vm.color } })\n ],\n 1\n ),\n _vm.showAlpha\n ? _c("alpha-slider", { ref: "alpha", attrs: { color: _vm.color } })\n : _vm._e(),\n _vm.predefine\n ? _c("predefine", {\n attrs: { color: _vm.color, colors: _vm.predefine }\n })\n : _vm._e(),\n _c(\n "div",\n { staticClass: "el-color-dropdown__btns" },\n [\n _c(\n "span",\n { staticClass: "el-color-dropdown__value" },\n [\n _c("el-input", {\n attrs: { "validate-event": false, size: "mini" },\n on: { blur: _vm.handleConfirm },\n nativeOn: {\n keyup: function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "enter",\n 13,\n $event.key,\n "Enter"\n )\n ) {\n return null\n }\n return _vm.handleConfirm($event)\n }\n },\n model: {\n value: _vm.customInput,\n callback: function($$v) {\n _vm.customInput = $$v\n },\n expression: "customInput"\n }\n })\n ],\n 1\n ),\n _c(\n "el-button",\n {\n staticClass: "el-color-dropdown__link-btn",\n attrs: { size: "mini", type: "text" },\n on: {\n click: function($event) {\n _vm.$emit("clear")\n }\n }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.t("el.colorpicker.clear")) +\n "\\n "\n )\n ]\n ),\n _c(\n "el-button",\n {\n staticClass: "el-color-dropdown__btn",\n attrs: { plain: "", size: "mini" },\n on: { click: _vm.confirmValue }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.t("el.colorpicker.confirm")) +\n "\\n "\n )\n ]\n )\n ],\n 1\n )\n ],\n 1\n )\n ]\n )\n}\nvar picker_dropdownvue_type_template_id_06601625_staticRenderFns = []\npicker_dropdownvue_type_template_id_06601625_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/color-picker/src/components/picker-dropdown.vue?vue&type=template&id=06601625&\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/components/sv-panel.vue?vue&type=template&id=d8583596&\nvar sv_panelvue_type_template_id_d8583596_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 staticClass: "el-color-svpanel",\n style: {\n backgroundColor: _vm.background\n }\n },\n [\n _c("div", { staticClass: "el-color-svpanel__white" }),\n _c("div", { staticClass: "el-color-svpanel__black" }),\n _c(\n "div",\n {\n staticClass: "el-color-svpanel__cursor",\n style: {\n top: _vm.cursorTop + "px",\n left: _vm.cursorLeft + "px"\n }\n },\n [_c("div")]\n )\n ]\n )\n}\nvar sv_panelvue_type_template_id_d8583596_staticRenderFns = []\nsv_panelvue_type_template_id_d8583596_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/color-picker/src/components/sv-panel.vue?vue&type=template&id=d8583596&\n\n// CONCATENATED MODULE: ./packages/color-picker/src/draggable.js\n\nvar isDragging = false;\n\n/* harmony default export */ var draggable = (function (element, options) {\n if (external_vue_default.a.prototype.$isServer) return;\n var moveFn = function moveFn(event) {\n if (options.drag) {\n options.drag(event);\n }\n };\n var upFn = function upFn(event) {\n document.removeEventListener(\'mousemove\', moveFn);\n document.removeEventListener(\'mouseup\', upFn);\n document.onselectstart = null;\n document.ondragstart = null;\n\n isDragging = false;\n\n if (options.end) {\n options.end(event);\n }\n };\n element.addEventListener(\'mousedown\', function (event) {\n if (isDragging) return;\n document.onselectstart = function () {\n return false;\n };\n document.ondragstart = function () {\n return false;\n };\n\n document.addEventListener(\'mousemove\', moveFn);\n document.addEventListener(\'mouseup\', upFn);\n isDragging = true;\n\n if (options.start) {\n options.start(event);\n }\n });\n});\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/components/sv-panel.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/* harmony default export */ var sv_panelvue_type_script_lang_js_ = ({\n name: \'el-sl-panel\',\n\n props: {\n color: {\n required: true\n }\n },\n\n computed: {\n colorValue: function colorValue() {\n var hue = this.color.get(\'hue\');\n var value = this.color.get(\'value\');\n return { hue: hue, value: value };\n }\n },\n\n watch: {\n colorValue: function colorValue() {\n this.update();\n }\n },\n\n methods: {\n update: function update() {\n var saturation = this.color.get(\'saturation\');\n var value = this.color.get(\'value\');\n\n var el = this.$el;\n var width = el.clientWidth,\n height = el.clientHeight;\n\n\n this.cursorLeft = saturation * width / 100;\n this.cursorTop = (100 - value) * height / 100;\n\n this.background = \'hsl(\' + this.color.get(\'hue\') + \', 100%, 50%)\';\n },\n handleDrag: function handleDrag(event) {\n var el = this.$el;\n var rect = el.getBoundingClientRect();\n\n var left = event.clientX - rect.left;\n var top = event.clientY - rect.top;\n left = Math.max(0, left);\n left = Math.min(left, rect.width);\n\n top = Math.max(0, top);\n top = Math.min(top, rect.height);\n\n this.cursorLeft = left;\n this.cursorTop = top;\n this.color.set({\n saturation: left / rect.width * 100,\n value: 100 - top / rect.height * 100\n });\n }\n },\n\n mounted: function mounted() {\n var _this = this;\n\n draggable(this.$el, {\n drag: function drag(event) {\n _this.handleDrag(event);\n },\n end: function end(event) {\n _this.handleDrag(event);\n }\n });\n\n this.update();\n },\n data: function data() {\n return {\n cursorTop: 0,\n cursorLeft: 0,\n background: \'hsl(0, 100%, 50%)\'\n };\n }\n});\n// CONCATENATED MODULE: ./packages/color-picker/src/components/sv-panel.vue?vue&type=script&lang=js&\n /* harmony default export */ var components_sv_panelvue_type_script_lang_js_ = (sv_panelvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/color-picker/src/components/sv-panel.vue\n\n\n\n\n\n/* normalize component */\n\nvar sv_panel_component = normalizeComponent(\n components_sv_panelvue_type_script_lang_js_,\n sv_panelvue_type_template_id_d8583596_render,\n sv_panelvue_type_template_id_d8583596_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var sv_panel_api; }\nsv_panel_component.options.__file = "packages/color-picker/src/components/sv-panel.vue"\n/* harmony default export */ var sv_panel = (sv_panel_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/components/hue-slider.vue?vue&type=template&id=5cdc43b1&\nvar hue_slidervue_type_template_id_5cdc43b1_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 staticClass: "el-color-hue-slider",\n class: { "is-vertical": _vm.vertical }\n },\n [\n _c("div", {\n ref: "bar",\n staticClass: "el-color-hue-slider__bar",\n on: { click: _vm.handleClick }\n }),\n _c("div", {\n ref: "thumb",\n staticClass: "el-color-hue-slider__thumb",\n style: {\n left: _vm.thumbLeft + "px",\n top: _vm.thumbTop + "px"\n }\n })\n ]\n )\n}\nvar hue_slidervue_type_template_id_5cdc43b1_staticRenderFns = []\nhue_slidervue_type_template_id_5cdc43b1_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/color-picker/src/components/hue-slider.vue?vue&type=template&id=5cdc43b1&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/components/hue-slider.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ var hue_slidervue_type_script_lang_js_ = ({\n name: \'el-color-hue-slider\',\n\n props: {\n color: {\n required: true\n },\n\n vertical: Boolean\n },\n\n data: function data() {\n return {\n thumbLeft: 0,\n thumbTop: 0\n };\n },\n\n\n computed: {\n hueValue: function hueValue() {\n var hue = this.color.get(\'hue\');\n return hue;\n }\n },\n\n watch: {\n hueValue: function hueValue() {\n this.update();\n }\n },\n\n methods: {\n handleClick: function handleClick(event) {\n var thumb = this.$refs.thumb;\n var target = event.target;\n\n if (target !== thumb) {\n this.handleDrag(event);\n }\n },\n handleDrag: function handleDrag(event) {\n var rect = this.$el.getBoundingClientRect();\n var thumb = this.$refs.thumb;\n\n var hue = void 0;\n\n if (!this.vertical) {\n var left = event.clientX - rect.left;\n left = Math.min(left, rect.width - thumb.offsetWidth / 2);\n left = Math.max(thumb.offsetWidth / 2, left);\n\n hue = Math.round((left - thumb.offsetWidth / 2) / (rect.width - thumb.offsetWidth) * 360);\n } else {\n var top = event.clientY - rect.top;\n top = Math.min(top, rect.height - thumb.offsetHeight / 2);\n top = Math.max(thumb.offsetHeight / 2, top);\n\n hue = Math.round((top - thumb.offsetHeight / 2) / (rect.height - thumb.offsetHeight) * 360);\n }\n\n this.color.set(\'hue\', hue);\n },\n getThumbLeft: function getThumbLeft() {\n if (this.vertical) return 0;\n var el = this.$el;\n var hue = this.color.get(\'hue\');\n\n if (!el) return 0;\n var thumb = this.$refs.thumb;\n return Math.round(hue * (el.offsetWidth - thumb.offsetWidth / 2) / 360);\n },\n getThumbTop: function getThumbTop() {\n if (!this.vertical) return 0;\n var el = this.$el;\n var hue = this.color.get(\'hue\');\n\n if (!el) return 0;\n var thumb = this.$refs.thumb;\n return Math.round(hue * (el.offsetHeight - thumb.offsetHeight / 2) / 360);\n },\n update: function update() {\n this.thumbLeft = this.getThumbLeft();\n this.thumbTop = this.getThumbTop();\n }\n },\n\n mounted: function mounted() {\n var _this = this;\n\n var _$refs = this.$refs,\n bar = _$refs.bar,\n thumb = _$refs.thumb;\n\n\n var dragConfig = {\n drag: function drag(event) {\n _this.handleDrag(event);\n },\n end: function end(event) {\n _this.handleDrag(event);\n }\n };\n\n draggable(bar, dragConfig);\n draggable(thumb, dragConfig);\n this.update();\n }\n});\n// CONCATENATED MODULE: ./packages/color-picker/src/components/hue-slider.vue?vue&type=script&lang=js&\n /* harmony default export */ var components_hue_slidervue_type_script_lang_js_ = (hue_slidervue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/color-picker/src/components/hue-slider.vue\n\n\n\n\n\n/* normalize component */\n\nvar hue_slider_component = normalizeComponent(\n components_hue_slidervue_type_script_lang_js_,\n hue_slidervue_type_template_id_5cdc43b1_render,\n hue_slidervue_type_template_id_5cdc43b1_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var hue_slider_api; }\nhue_slider_component.options.__file = "packages/color-picker/src/components/hue-slider.vue"\n/* harmony default export */ var hue_slider = (hue_slider_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/components/alpha-slider.vue?vue&type=template&id=068c66cb&\nvar alpha_slidervue_type_template_id_068c66cb_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 staticClass: "el-color-alpha-slider",\n class: { "is-vertical": _vm.vertical }\n },\n [\n _c("div", {\n ref: "bar",\n staticClass: "el-color-alpha-slider__bar",\n style: {\n background: _vm.background\n },\n on: { click: _vm.handleClick }\n }),\n _c("div", {\n ref: "thumb",\n staticClass: "el-color-alpha-slider__thumb",\n style: {\n left: _vm.thumbLeft + "px",\n top: _vm.thumbTop + "px"\n }\n })\n ]\n )\n}\nvar alpha_slidervue_type_template_id_068c66cb_staticRenderFns = []\nalpha_slidervue_type_template_id_068c66cb_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/color-picker/src/components/alpha-slider.vue?vue&type=template&id=068c66cb&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/components/alpha-slider.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/* harmony default export */ var alpha_slidervue_type_script_lang_js_ = ({\n name: \'el-color-alpha-slider\',\n\n props: {\n color: {\n required: true\n },\n vertical: Boolean\n },\n\n watch: {\n \'color._alpha\': function color_alpha() {\n this.update();\n },\n \'color.value\': function colorValue() {\n this.update();\n }\n },\n\n methods: {\n handleClick: function handleClick(event) {\n var thumb = this.$refs.thumb;\n var target = event.target;\n\n if (target !== thumb) {\n this.handleDrag(event);\n }\n },\n handleDrag: function handleDrag(event) {\n var rect = this.$el.getBoundingClientRect();\n var thumb = this.$refs.thumb;\n\n\n if (!this.vertical) {\n var left = event.clientX - rect.left;\n left = Math.max(thumb.offsetWidth / 2, left);\n left = Math.min(left, rect.width - thumb.offsetWidth / 2);\n\n this.color.set(\'alpha\', Math.round((left - thumb.offsetWidth / 2) / (rect.width - thumb.offsetWidth) * 100));\n } else {\n var top = event.clientY - rect.top;\n top = Math.max(thumb.offsetHeight / 2, top);\n top = Math.min(top, rect.height - thumb.offsetHeight / 2);\n\n this.color.set(\'alpha\', Math.round((top - thumb.offsetHeight / 2) / (rect.height - thumb.offsetHeight) * 100));\n }\n },\n getThumbLeft: function getThumbLeft() {\n if (this.vertical) return 0;\n var el = this.$el;\n var alpha = this.color._alpha;\n\n if (!el) return 0;\n var thumb = this.$refs.thumb;\n return Math.round(alpha * (el.offsetWidth - thumb.offsetWidth / 2) / 100);\n },\n getThumbTop: function getThumbTop() {\n if (!this.vertical) return 0;\n var el = this.$el;\n var alpha = this.color._alpha;\n\n if (!el) return 0;\n var thumb = this.$refs.thumb;\n return Math.round(alpha * (el.offsetHeight - thumb.offsetHeight / 2) / 100);\n },\n getBackground: function getBackground() {\n if (this.color && this.color.value) {\n var _color$toRgb = this.color.toRgb(),\n r = _color$toRgb.r,\n g = _color$toRgb.g,\n b = _color$toRgb.b;\n\n return \'linear-gradient(to right, rgba(\' + r + \', \' + g + \', \' + b + \', 0) 0%, rgba(\' + r + \', \' + g + \', \' + b + \', 1) 100%)\';\n }\n return null;\n },\n update: function update() {\n this.thumbLeft = this.getThumbLeft();\n this.thumbTop = this.getThumbTop();\n this.background = this.getBackground();\n }\n },\n\n data: function data() {\n return {\n thumbLeft: 0,\n thumbTop: 0,\n background: null\n };\n },\n mounted: function mounted() {\n var _this = this;\n\n var _$refs = this.$refs,\n bar = _$refs.bar,\n thumb = _$refs.thumb;\n\n\n var dragConfig = {\n drag: function drag(event) {\n _this.handleDrag(event);\n },\n end: function end(event) {\n _this.handleDrag(event);\n }\n };\n\n draggable(bar, dragConfig);\n draggable(thumb, dragConfig);\n this.update();\n }\n});\n// CONCATENATED MODULE: ./packages/color-picker/src/components/alpha-slider.vue?vue&type=script&lang=js&\n /* harmony default export */ var components_alpha_slidervue_type_script_lang_js_ = (alpha_slidervue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/color-picker/src/components/alpha-slider.vue\n\n\n\n\n\n/* normalize component */\n\nvar alpha_slider_component = normalizeComponent(\n components_alpha_slidervue_type_script_lang_js_,\n alpha_slidervue_type_template_id_068c66cb_render,\n alpha_slidervue_type_template_id_068c66cb_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var alpha_slider_api; }\nalpha_slider_component.options.__file = "packages/color-picker/src/components/alpha-slider.vue"\n/* harmony default export */ var alpha_slider = (alpha_slider_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/components/predefine.vue?vue&type=template&id=06e03093&\nvar predefinevue_type_template_id_06e03093_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("div", { staticClass: "el-color-predefine" }, [\n _c(\n "div",\n { staticClass: "el-color-predefine__colors" },\n _vm._l(_vm.rgbaColors, function(item, index) {\n return _c(\n "div",\n {\n key: _vm.colors[index],\n staticClass: "el-color-predefine__color-selector",\n class: { selected: item.selected, "is-alpha": item._alpha < 100 },\n on: {\n click: function($event) {\n _vm.handleSelect(index)\n }\n }\n },\n [_c("div", { style: { "background-color": item.value } })]\n )\n }),\n 0\n )\n ])\n}\nvar predefinevue_type_template_id_06e03093_staticRenderFns = []\npredefinevue_type_template_id_06e03093_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/color-picker/src/components/predefine.vue?vue&type=template&id=06e03093&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/components/predefine.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/* harmony default export */ var predefinevue_type_script_lang_js_ = ({\n props: {\n colors: { type: Array, required: true },\n color: { required: true }\n },\n data: function data() {\n return {\n rgbaColors: this.parseColors(this.colors, this.color)\n };\n },\n\n methods: {\n handleSelect: function handleSelect(index) {\n this.color.fromString(this.colors[index]);\n },\n parseColors: function parseColors(colors, color) {\n return colors.map(function (value) {\n var c = new src_color();\n c.enableAlpha = true;\n c.format = \'rgba\';\n c.fromString(value);\n c.selected = c.value === color.value;\n return c;\n });\n }\n },\n watch: {\n \'$parent.currentColor\': function $parentCurrentColor(val) {\n var color = new src_color();\n color.fromString(val);\n\n this.rgbaColors.forEach(function (item) {\n item.selected = color.compare(item);\n });\n },\n colors: function colors(newVal) {\n this.rgbaColors = this.parseColors(newVal, this.color);\n },\n color: function color(newVal) {\n this.rgbaColors = this.parseColors(this.colors, newVal);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/color-picker/src/components/predefine.vue?vue&type=script&lang=js&\n /* harmony default export */ var components_predefinevue_type_script_lang_js_ = (predefinevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/color-picker/src/components/predefine.vue\n\n\n\n\n\n/* normalize component */\n\nvar predefine_component = normalizeComponent(\n components_predefinevue_type_script_lang_js_,\n predefinevue_type_template_id_06e03093_render,\n predefinevue_type_template_id_06e03093_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var predefine_api; }\npredefine_component.options.__file = "packages/color-picker/src/components/predefine.vue"\n/* harmony default export */ var predefine = (predefine_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/components/picker-dropdown.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\n\n\n\n\n\n\n\n/* harmony default export */ var picker_dropdownvue_type_script_lang_js_ = ({\n name: \'el-color-picker-dropdown\',\n\n mixins: [vue_popper_default.a, locale_default.a],\n\n components: {\n SvPanel: sv_panel,\n HueSlider: hue_slider,\n AlphaSlider: alpha_slider,\n ElInput: input_default.a,\n ElButton: button_default.a,\n Predefine: predefine\n },\n\n props: {\n color: {\n required: true\n },\n showAlpha: Boolean,\n predefine: Array\n },\n\n data: function data() {\n return {\n customInput: \'\'\n };\n },\n\n\n computed: {\n currentColor: function currentColor() {\n var parent = this.$parent;\n return !parent.value && !parent.showPanelColor ? \'\' : parent.color.value;\n }\n },\n\n methods: {\n confirmValue: function confirmValue() {\n this.$emit(\'pick\');\n },\n handleConfirm: function handleConfirm() {\n this.color.fromString(this.customInput);\n }\n },\n\n mounted: function mounted() {\n this.$parent.popperElm = this.popperElm = this.$el;\n this.referenceElm = this.$parent.$el;\n },\n\n\n watch: {\n showPopper: function showPopper(val) {\n var _this = this;\n\n if (val === true) {\n this.$nextTick(function () {\n var _$refs = _this.$refs,\n sl = _$refs.sl,\n hue = _$refs.hue,\n alpha = _$refs.alpha;\n\n sl && sl.update();\n hue && hue.update();\n alpha && alpha.update();\n });\n }\n },\n\n\n currentColor: {\n immediate: true,\n handler: function handler(val) {\n this.customInput = val;\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/color-picker/src/components/picker-dropdown.vue?vue&type=script&lang=js&\n /* harmony default export */ var components_picker_dropdownvue_type_script_lang_js_ = (picker_dropdownvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/color-picker/src/components/picker-dropdown.vue\n\n\n\n\n\n/* normalize component */\n\nvar picker_dropdown_component = normalizeComponent(\n components_picker_dropdownvue_type_script_lang_js_,\n picker_dropdownvue_type_template_id_06601625_render,\n picker_dropdownvue_type_template_id_06601625_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var picker_dropdown_api; }\npicker_dropdown_component.options.__file = "packages/color-picker/src/components/picker-dropdown.vue"\n/* harmony default export */ var picker_dropdown = (picker_dropdown_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/color-picker/src/main.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/* harmony default export */ var color_picker_src_mainvue_type_script_lang_js_ = ({\n name: \'ElColorPicker\',\n\n mixins: [emitter_default.a],\n\n props: {\n value: String,\n showAlpha: Boolean,\n colorFormat: String,\n disabled: Boolean,\n size: String,\n popperClass: String,\n predefine: Array\n },\n\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n\n directives: { Clickoutside: clickoutside_default.a },\n\n computed: {\n displayedColor: function displayedColor() {\n if (!this.value && !this.showPanelColor) {\n return \'transparent\';\n }\n\n return this.displayedRgb(this.color, this.showAlpha);\n },\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n colorSize: function colorSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n colorDisabled: function colorDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n }\n },\n\n watch: {\n value: function value(val) {\n if (!val) {\n this.showPanelColor = false;\n } else if (val && val !== this.color.value) {\n this.color.fromString(val);\n }\n },\n\n color: {\n deep: true,\n handler: function handler() {\n this.showPanelColor = true;\n }\n },\n displayedColor: function displayedColor(val) {\n if (!this.showPicker) return;\n var currentValueColor = new src_color({\n enableAlpha: this.showAlpha,\n format: this.colorFormat\n });\n currentValueColor.fromString(this.value);\n\n var currentValueColorRgb = this.displayedRgb(currentValueColor, this.showAlpha);\n if (val !== currentValueColorRgb) {\n this.$emit(\'active-change\', val);\n }\n }\n },\n\n methods: {\n handleTrigger: function handleTrigger() {\n if (this.colorDisabled) return;\n this.showPicker = !this.showPicker;\n },\n confirmValue: function confirmValue() {\n var value = this.color.value;\n this.$emit(\'input\', value);\n this.$emit(\'change\', value);\n this.dispatch(\'ElFormItem\', \'el.form.change\', value);\n this.showPicker = false;\n },\n clearValue: function clearValue() {\n this.$emit(\'input\', null);\n this.$emit(\'change\', null);\n if (this.value !== null) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', null);\n }\n this.showPanelColor = false;\n this.showPicker = false;\n this.resetColor();\n },\n hide: function hide() {\n this.showPicker = false;\n this.resetColor();\n },\n resetColor: function resetColor() {\n var _this = this;\n\n this.$nextTick(function (_) {\n if (_this.value) {\n _this.color.fromString(_this.value);\n } else {\n _this.showPanelColor = false;\n }\n });\n },\n displayedRgb: function displayedRgb(color, showAlpha) {\n if (!(color instanceof src_color)) {\n throw Error(\'color should be instance of Color Class\');\n }\n\n var _color$toRgb = color.toRgb(),\n r = _color$toRgb.r,\n g = _color$toRgb.g,\n b = _color$toRgb.b;\n\n return showAlpha ? \'rgba(\' + r + \', \' + g + \', \' + b + \', \' + color.get(\'alpha\') / 100 + \')\' : \'rgb(\' + r + \', \' + g + \', \' + b + \')\';\n }\n },\n\n mounted: function mounted() {\n var value = this.value;\n if (value) {\n this.color.fromString(value);\n }\n this.popperElm = this.$refs.dropdown.$el;\n },\n data: function data() {\n var color = new src_color({\n enableAlpha: this.showAlpha,\n format: this.colorFormat\n });\n\n return {\n color: color,\n showPicker: false,\n showPanelColor: false\n };\n },\n\n\n components: {\n PickerDropdown: picker_dropdown\n }\n});\n// CONCATENATED MODULE: ./packages/color-picker/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_color_picker_src_mainvue_type_script_lang_js_ = (color_picker_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/color-picker/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar color_picker_src_main_component = normalizeComponent(\n packages_color_picker_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_55c8ade7_render,\n mainvue_type_template_id_55c8ade7_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var color_picker_src_main_api; }\ncolor_picker_src_main_component.options.__file = "packages/color-picker/src/main.vue"\n/* harmony default export */ var color_picker_src_main = (color_picker_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/color-picker/index.js\n\n\n/* istanbul ignore next */\ncolor_picker_src_main.install = function (Vue) {\n Vue.component(color_picker_src_main.name, color_picker_src_main);\n};\n\n/* harmony default export */ var color_picker = (color_picker_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/transfer/src/main.vue?vue&type=template&id=5c654dd8&\nvar mainvue_type_template_id_5c654dd8_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "div",\n { staticClass: "el-transfer" },\n [\n _c(\n "transfer-panel",\n _vm._b(\n {\n ref: "leftPanel",\n attrs: {\n data: _vm.sourceData,\n title: _vm.titles[0] || _vm.t("el.transfer.titles.0"),\n "default-checked": _vm.leftDefaultChecked,\n placeholder:\n _vm.filterPlaceholder || _vm.t("el.transfer.filterPlaceholder")\n },\n on: { "checked-change": _vm.onSourceCheckedChange }\n },\n "transfer-panel",\n _vm.$props,\n false\n ),\n [_vm._t("left-footer")],\n 2\n ),\n _c(\n "div",\n { staticClass: "el-transfer__buttons" },\n [\n _c(\n "el-button",\n {\n class: [\n "el-transfer__button",\n _vm.hasButtonTexts ? "is-with-texts" : ""\n ],\n attrs: {\n type: "primary",\n disabled: _vm.rightChecked.length === 0\n },\n nativeOn: {\n click: function($event) {\n return _vm.addToLeft($event)\n }\n }\n },\n [\n _c("i", { staticClass: "el-icon-arrow-left" }),\n _vm.buttonTexts[0] !== undefined\n ? _c("span", [_vm._v(_vm._s(_vm.buttonTexts[0]))])\n : _vm._e()\n ]\n ),\n _c(\n "el-button",\n {\n class: [\n "el-transfer__button",\n _vm.hasButtonTexts ? "is-with-texts" : ""\n ],\n attrs: {\n type: "primary",\n disabled: _vm.leftChecked.length === 0\n },\n nativeOn: {\n click: function($event) {\n return _vm.addToRight($event)\n }\n }\n },\n [\n _vm.buttonTexts[1] !== undefined\n ? _c("span", [_vm._v(_vm._s(_vm.buttonTexts[1]))])\n : _vm._e(),\n _c("i", { staticClass: "el-icon-arrow-right" })\n ]\n )\n ],\n 1\n ),\n _c(\n "transfer-panel",\n _vm._b(\n {\n ref: "rightPanel",\n attrs: {\n data: _vm.targetData,\n title: _vm.titles[1] || _vm.t("el.transfer.titles.1"),\n "default-checked": _vm.rightDefaultChecked,\n placeholder:\n _vm.filterPlaceholder || _vm.t("el.transfer.filterPlaceholder")\n },\n on: { "checked-change": _vm.onTargetCheckedChange }\n },\n "transfer-panel",\n _vm.$props,\n false\n ),\n [_vm._t("right-footer")],\n 2\n )\n ],\n 1\n )\n}\nvar mainvue_type_template_id_5c654dd8_staticRenderFns = []\nmainvue_type_template_id_5c654dd8_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/transfer/src/main.vue?vue&type=template&id=5c654dd8&\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/transfer/src/transfer-panel.vue?vue&type=template&id=2ddab8bd&\nvar transfer_panelvue_type_template_id_2ddab8bd_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("div", { staticClass: "el-transfer-panel" }, [\n _c(\n "p",\n { staticClass: "el-transfer-panel__header" },\n [\n _c(\n "el-checkbox",\n {\n attrs: { indeterminate: _vm.isIndeterminate },\n on: { change: _vm.handleAllCheckedChange },\n model: {\n value: _vm.allChecked,\n callback: function($$v) {\n _vm.allChecked = $$v\n },\n expression: "allChecked"\n }\n },\n [\n _vm._v("\\n " + _vm._s(_vm.title) + "\\n "),\n _c("span", [_vm._v(_vm._s(_vm.checkedSummary))])\n ]\n )\n ],\n 1\n ),\n _c(\n "div",\n {\n class: [\n "el-transfer-panel__body",\n _vm.hasFooter ? "is-with-footer" : ""\n ]\n },\n [\n _vm.filterable\n ? _c(\n "el-input",\n {\n staticClass: "el-transfer-panel__filter",\n attrs: { size: "small", placeholder: _vm.placeholder },\n nativeOn: {\n mouseenter: function($event) {\n _vm.inputHover = true\n },\n mouseleave: function($event) {\n _vm.inputHover = false\n }\n },\n model: {\n value: _vm.query,\n callback: function($$v) {\n _vm.query = $$v\n },\n expression: "query"\n }\n },\n [\n _c("i", {\n class: ["el-input__icon", "el-icon-" + _vm.inputIcon],\n attrs: { slot: "prefix" },\n on: { click: _vm.clearQuery },\n slot: "prefix"\n })\n ]\n )\n : _vm._e(),\n _c(\n "el-checkbox-group",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: !_vm.hasNoMatch && _vm.data.length > 0,\n expression: "!hasNoMatch && data.length > 0"\n }\n ],\n staticClass: "el-transfer-panel__list",\n class: { "is-filterable": _vm.filterable },\n model: {\n value: _vm.checked,\n callback: function($$v) {\n _vm.checked = $$v\n },\n expression: "checked"\n }\n },\n _vm._l(_vm.filteredData, function(item) {\n return _c(\n "el-checkbox",\n {\n key: item[_vm.keyProp],\n staticClass: "el-transfer-panel__item",\n attrs: {\n label: item[_vm.keyProp],\n disabled: item[_vm.disabledProp]\n }\n },\n [_c("option-content", { attrs: { option: item } })],\n 1\n )\n }),\n 1\n ),\n _c(\n "p",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.hasNoMatch,\n expression: "hasNoMatch"\n }\n ],\n staticClass: "el-transfer-panel__empty"\n },\n [_vm._v(_vm._s(_vm.t("el.transfer.noMatch")))]\n ),\n _c(\n "p",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.data.length === 0 && !_vm.hasNoMatch,\n expression: "data.length === 0 && !hasNoMatch"\n }\n ],\n staticClass: "el-transfer-panel__empty"\n },\n [_vm._v(_vm._s(_vm.t("el.transfer.noData")))]\n )\n ],\n 1\n ),\n _vm.hasFooter\n ? _c(\n "p",\n { staticClass: "el-transfer-panel__footer" },\n [_vm._t("default")],\n 2\n )\n : _vm._e()\n ])\n}\nvar transfer_panelvue_type_template_id_2ddab8bd_staticRenderFns = []\ntransfer_panelvue_type_template_id_2ddab8bd_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/transfer/src/transfer-panel.vue?vue&type=template&id=2ddab8bd&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/transfer/src/transfer-panel.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ var transfer_panelvue_type_script_lang_js_ = ({\n mixins: [locale_default.a],\n\n name: \'ElTransferPanel\',\n\n componentName: \'ElTransferPanel\',\n\n components: {\n ElCheckboxGroup: checkbox_group_default.a,\n ElCheckbox: checkbox_default.a,\n ElInput: input_default.a,\n OptionContent: {\n props: {\n option: Object\n },\n render: function render(h) {\n var getParent = function getParent(vm) {\n if (vm.$options.componentName === \'ElTransferPanel\') {\n return vm;\n } else if (vm.$parent) {\n return getParent(vm.$parent);\n } else {\n return vm;\n }\n };\n var panel = getParent(this);\n var transfer = panel.$parent || panel;\n return panel.renderContent ? panel.renderContent(h, this.option) : transfer.$scopedSlots.default ? transfer.$scopedSlots.default({ option: this.option }) : h(\'span\', [this.option[panel.labelProp] || this.option[panel.keyProp]]);\n }\n }\n },\n\n props: {\n data: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n renderContent: Function,\n placeholder: String,\n title: String,\n filterable: Boolean,\n format: Object,\n filterMethod: Function,\n defaultChecked: Array,\n props: Object\n },\n\n data: function data() {\n return {\n checked: [],\n allChecked: false,\n query: \'\',\n inputHover: false,\n checkChangeByUser: true\n };\n },\n\n\n watch: {\n checked: function checked(val, oldVal) {\n this.updateAllChecked();\n if (this.checkChangeByUser) {\n var movedKeys = val.concat(oldVal).filter(function (v) {\n return val.indexOf(v) === -1 || oldVal.indexOf(v) === -1;\n });\n this.$emit(\'checked-change\', val, movedKeys);\n } else {\n this.$emit(\'checked-change\', val);\n this.checkChangeByUser = true;\n }\n },\n data: function data() {\n var _this = this;\n\n var checked = [];\n var filteredDataKeys = this.filteredData.map(function (item) {\n return item[_this.keyProp];\n });\n this.checked.forEach(function (item) {\n if (filteredDataKeys.indexOf(item) > -1) {\n checked.push(item);\n }\n });\n this.checkChangeByUser = false;\n this.checked = checked;\n },\n checkableData: function checkableData() {\n this.updateAllChecked();\n },\n\n\n defaultChecked: {\n immediate: true,\n handler: function handler(val, oldVal) {\n var _this2 = this;\n\n if (oldVal && val.length === oldVal.length && val.every(function (item) {\n return oldVal.indexOf(item) > -1;\n })) return;\n var checked = [];\n var checkableDataKeys = this.checkableData.map(function (item) {\n return item[_this2.keyProp];\n });\n val.forEach(function (item) {\n if (checkableDataKeys.indexOf(item) > -1) {\n checked.push(item);\n }\n });\n this.checkChangeByUser = false;\n this.checked = checked;\n }\n }\n },\n\n computed: {\n filteredData: function filteredData() {\n var _this3 = this;\n\n return this.data.filter(function (item) {\n if (typeof _this3.filterMethod === \'function\') {\n return _this3.filterMethod(_this3.query, item);\n } else {\n var label = item[_this3.labelProp] || item[_this3.keyProp].toString();\n return label.toLowerCase().indexOf(_this3.query.toLowerCase()) > -1;\n }\n });\n },\n checkableData: function checkableData() {\n var _this4 = this;\n\n return this.filteredData.filter(function (item) {\n return !item[_this4.disabledProp];\n });\n },\n checkedSummary: function checkedSummary() {\n var checkedLength = this.checked.length;\n var dataLength = this.data.length;\n var _format = this.format,\n noChecked = _format.noChecked,\n hasChecked = _format.hasChecked;\n\n if (noChecked && hasChecked) {\n return checkedLength > 0 ? hasChecked.replace(/\\${checked}/g, checkedLength).replace(/\\${total}/g, dataLength) : noChecked.replace(/\\${total}/g, dataLength);\n } else {\n return checkedLength + \'/\' + dataLength;\n }\n },\n isIndeterminate: function isIndeterminate() {\n var checkedLength = this.checked.length;\n return checkedLength > 0 && checkedLength < this.checkableData.length;\n },\n hasNoMatch: function hasNoMatch() {\n return this.query.length > 0 && this.filteredData.length === 0;\n },\n inputIcon: function inputIcon() {\n return this.query.length > 0 && this.inputHover ? \'circle-close\' : \'search\';\n },\n labelProp: function labelProp() {\n return this.props.label || \'label\';\n },\n keyProp: function keyProp() {\n return this.props.key || \'key\';\n },\n disabledProp: function disabledProp() {\n return this.props.disabled || \'disabled\';\n },\n hasFooter: function hasFooter() {\n return !!this.$slots.default;\n }\n },\n\n methods: {\n updateAllChecked: function updateAllChecked() {\n var _this5 = this;\n\n var checkableDataKeys = this.checkableData.map(function (item) {\n return item[_this5.keyProp];\n });\n this.allChecked = checkableDataKeys.length > 0 && checkableDataKeys.every(function (item) {\n return _this5.checked.indexOf(item) > -1;\n });\n },\n handleAllCheckedChange: function handleAllCheckedChange(value) {\n var _this6 = this;\n\n this.checked = value ? this.checkableData.map(function (item) {\n return item[_this6.keyProp];\n }) : [];\n },\n clearQuery: function clearQuery() {\n if (this.inputIcon === \'circle-close\') {\n this.query = \'\';\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/transfer/src/transfer-panel.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_transfer_panelvue_type_script_lang_js_ = (transfer_panelvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/transfer/src/transfer-panel.vue\n\n\n\n\n\n/* normalize component */\n\nvar transfer_panel_component = normalizeComponent(\n src_transfer_panelvue_type_script_lang_js_,\n transfer_panelvue_type_template_id_2ddab8bd_render,\n transfer_panelvue_type_template_id_2ddab8bd_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var transfer_panel_api; }\ntransfer_panel_component.options.__file = "packages/transfer/src/transfer-panel.vue"\n/* harmony default export */ var transfer_panel = (transfer_panel_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/transfer/src/main.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//\n\n\n\n\n\n\n\n/* harmony default export */ var transfer_src_mainvue_type_script_lang_js_ = ({\n name: \'ElTransfer\',\n\n mixins: [emitter_default.a, locale_default.a, migrating_default.a],\n\n components: {\n TransferPanel: transfer_panel,\n ElButton: button_default.a\n },\n\n props: {\n data: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n titles: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n buttonTexts: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n filterPlaceholder: {\n type: String,\n default: \'\'\n },\n filterMethod: Function,\n leftDefaultChecked: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n rightDefaultChecked: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n renderContent: Function,\n value: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n format: {\n type: Object,\n default: function _default() {\n return {};\n }\n },\n filterable: Boolean,\n props: {\n type: Object,\n default: function _default() {\n return {\n label: \'label\',\n key: \'key\',\n disabled: \'disabled\'\n };\n }\n },\n targetOrder: {\n type: String,\n default: \'original\'\n }\n },\n\n data: function data() {\n return {\n leftChecked: [],\n rightChecked: []\n };\n },\n\n\n computed: {\n dataObj: function dataObj() {\n var key = this.props.key;\n return this.data.reduce(function (o, cur) {\n return (o[cur[key]] = cur) && o;\n }, {});\n },\n sourceData: function sourceData() {\n var _this = this;\n\n return this.data.filter(function (item) {\n return _this.value.indexOf(item[_this.props.key]) === -1;\n });\n },\n targetData: function targetData() {\n var _this2 = this;\n\n if (this.targetOrder === \'original\') {\n return this.data.filter(function (item) {\n return _this2.value.indexOf(item[_this2.props.key]) > -1;\n });\n } else {\n return this.value.reduce(function (arr, cur) {\n var val = _this2.dataObj[cur];\n if (val) {\n arr.push(val);\n }\n return arr;\n }, []);\n }\n },\n hasButtonTexts: function hasButtonTexts() {\n return this.buttonTexts.length === 2;\n }\n },\n\n watch: {\n value: function value(val) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', val);\n }\n },\n\n methods: {\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n \'footer-format\': \'footer-format is renamed to format.\'\n }\n };\n },\n onSourceCheckedChange: function onSourceCheckedChange(val, movedKeys) {\n this.leftChecked = val;\n if (movedKeys === undefined) return;\n this.$emit(\'left-check-change\', val, movedKeys);\n },\n onTargetCheckedChange: function onTargetCheckedChange(val, movedKeys) {\n this.rightChecked = val;\n if (movedKeys === undefined) return;\n this.$emit(\'right-check-change\', val, movedKeys);\n },\n addToLeft: function addToLeft() {\n var currentValue = this.value.slice();\n this.rightChecked.forEach(function (item) {\n var index = currentValue.indexOf(item);\n if (index > -1) {\n currentValue.splice(index, 1);\n }\n });\n this.$emit(\'input\', currentValue);\n this.$emit(\'change\', currentValue, \'left\', this.rightChecked);\n },\n addToRight: function addToRight() {\n var _this3 = this;\n\n var currentValue = this.value.slice();\n var itemsToBeMoved = [];\n var key = this.props.key;\n this.data.forEach(function (item) {\n var itemKey = item[key];\n if (_this3.leftChecked.indexOf(itemKey) > -1 && _this3.value.indexOf(itemKey) === -1) {\n itemsToBeMoved.push(itemKey);\n }\n });\n currentValue = this.targetOrder === \'unshift\' ? itemsToBeMoved.concat(currentValue) : currentValue.concat(itemsToBeMoved);\n this.$emit(\'input\', currentValue);\n this.$emit(\'change\', currentValue, \'right\', this.leftChecked);\n },\n clearQuery: function clearQuery(which) {\n if (which === \'left\') {\n this.$refs.leftPanel.query = \'\';\n } else if (which === \'right\') {\n this.$refs.rightPanel.query = \'\';\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/transfer/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_transfer_src_mainvue_type_script_lang_js_ = (transfer_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/transfer/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar transfer_src_main_component = normalizeComponent(\n packages_transfer_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_5c654dd8_render,\n mainvue_type_template_id_5c654dd8_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var transfer_src_main_api; }\ntransfer_src_main_component.options.__file = "packages/transfer/src/main.vue"\n/* harmony default export */ var transfer_src_main = (transfer_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/transfer/index.js\n\n\n/* istanbul ignore next */\ntransfer_src_main.install = function (Vue) {\n Vue.component(transfer_src_main.name, transfer_src_main);\n};\n\n/* harmony default export */ var transfer = (transfer_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/container/src/main.vue?vue&type=template&id=5bf181d4&\nvar mainvue_type_template_id_5bf181d4_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "section",\n { staticClass: "el-container", class: { "is-vertical": _vm.isVertical } },\n [_vm._t("default")],\n 2\n )\n}\nvar mainvue_type_template_id_5bf181d4_staticRenderFns = []\nmainvue_type_template_id_5bf181d4_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/container/src/main.vue?vue&type=template&id=5bf181d4&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/container/src/main.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var container_src_mainvue_type_script_lang_js_ = ({\n name: \'ElContainer\',\n\n componentName: \'ElContainer\',\n\n props: {\n direction: String\n },\n\n computed: {\n isVertical: function isVertical() {\n if (this.direction === \'vertical\') {\n return true;\n } else if (this.direction === \'horizontal\') {\n return false;\n }\n return this.$slots && this.$slots.default ? this.$slots.default.some(function (vnode) {\n var tag = vnode.componentOptions && vnode.componentOptions.tag;\n return tag === \'el-header\' || tag === \'el-footer\';\n }) : false;\n }\n }\n});\n// CONCATENATED MODULE: ./packages/container/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_container_src_mainvue_type_script_lang_js_ = (container_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/container/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar container_src_main_component = normalizeComponent(\n packages_container_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_5bf181d4_render,\n mainvue_type_template_id_5bf181d4_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var container_src_main_api; }\ncontainer_src_main_component.options.__file = "packages/container/src/main.vue"\n/* harmony default export */ var container_src_main = (container_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/container/index.js\n\n\n/* istanbul ignore next */\ncontainer_src_main.install = function (Vue) {\n Vue.component(container_src_main.name, container_src_main);\n};\n\n/* harmony default export */ var packages_container = (container_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/header/src/main.vue?vue&type=template&id=2b296ab2&\nvar mainvue_type_template_id_2b296ab2_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "header",\n { staticClass: "el-header", style: { height: _vm.height } },\n [_vm._t("default")],\n 2\n )\n}\nvar mainvue_type_template_id_2b296ab2_staticRenderFns = []\nmainvue_type_template_id_2b296ab2_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/header/src/main.vue?vue&type=template&id=2b296ab2&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/header/src/main.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var header_src_mainvue_type_script_lang_js_ = ({\n name: \'ElHeader\',\n\n componentName: \'ElHeader\',\n\n props: {\n height: {\n type: String,\n default: \'60px\'\n }\n }\n});\n// CONCATENATED MODULE: ./packages/header/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_header_src_mainvue_type_script_lang_js_ = (header_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/header/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar header_src_main_component = normalizeComponent(\n packages_header_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_2b296ab2_render,\n mainvue_type_template_id_2b296ab2_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var header_src_main_api; }\nheader_src_main_component.options.__file = "packages/header/src/main.vue"\n/* harmony default export */ var header_src_main = (header_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/header/index.js\n\n\n/* istanbul ignore next */\nheader_src_main.install = function (Vue) {\n Vue.component(header_src_main.name, header_src_main);\n};\n\n/* harmony default export */ var header = (header_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/aside/src/main.vue?vue&type=template&id=03411dbf&\nvar mainvue_type_template_id_03411dbf_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "aside",\n { staticClass: "el-aside", style: { width: _vm.width } },\n [_vm._t("default")],\n 2\n )\n}\nvar mainvue_type_template_id_03411dbf_staticRenderFns = []\nmainvue_type_template_id_03411dbf_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/aside/src/main.vue?vue&type=template&id=03411dbf&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/aside/src/main.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var aside_src_mainvue_type_script_lang_js_ = ({\n name: \'ElAside\',\n\n componentName: \'ElAside\',\n\n props: {\n width: {\n type: String,\n default: \'300px\'\n }\n }\n});\n// CONCATENATED MODULE: ./packages/aside/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_aside_src_mainvue_type_script_lang_js_ = (aside_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/aside/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar aside_src_main_component = normalizeComponent(\n packages_aside_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_03411dbf_render,\n mainvue_type_template_id_03411dbf_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var aside_src_main_api; }\naside_src_main_component.options.__file = "packages/aside/src/main.vue"\n/* harmony default export */ var aside_src_main = (aside_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/aside/index.js\n\n\n/* istanbul ignore next */\naside_src_main.install = function (Vue) {\n Vue.component(aside_src_main.name, aside_src_main);\n};\n\n/* harmony default export */ var aside = (aside_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/main/src/main.vue?vue&type=template&id=2a3a7406&\nvar mainvue_type_template_id_2a3a7406_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("main", { staticClass: "el-main" }, [_vm._t("default")], 2)\n}\nvar mainvue_type_template_id_2a3a7406_staticRenderFns = []\nmainvue_type_template_id_2a3a7406_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/main/src/main.vue?vue&type=template&id=2a3a7406&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/main/src/main.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var main_src_mainvue_type_script_lang_js_ = ({\n name: \'ElMain\',\n componentName: \'ElMain\'\n});\n// CONCATENATED MODULE: ./packages/main/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_main_src_mainvue_type_script_lang_js_ = (main_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/main/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar main_src_main_component = normalizeComponent(\n packages_main_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_2a3a7406_render,\n mainvue_type_template_id_2a3a7406_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var main_src_main_api; }\nmain_src_main_component.options.__file = "packages/main/src/main.vue"\n/* harmony default export */ var main_src_main = (main_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/main/index.js\n\n\n/* istanbul ignore next */\nmain_src_main.install = function (Vue) {\n Vue.component(main_src_main.name, main_src_main);\n};\n\n/* harmony default export */ var packages_main = (main_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/footer/src/main.vue?vue&type=template&id=80210338&\nvar mainvue_type_template_id_80210338_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "footer",\n { staticClass: "el-footer", style: { height: _vm.height } },\n [_vm._t("default")],\n 2\n )\n}\nvar mainvue_type_template_id_80210338_staticRenderFns = []\nmainvue_type_template_id_80210338_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/footer/src/main.vue?vue&type=template&id=80210338&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/footer/src/main.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var footer_src_mainvue_type_script_lang_js_ = ({\n name: \'ElFooter\',\n\n componentName: \'ElFooter\',\n\n props: {\n height: {\n type: String,\n default: \'60px\'\n }\n }\n});\n// CONCATENATED MODULE: ./packages/footer/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_footer_src_mainvue_type_script_lang_js_ = (footer_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/footer/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar footer_src_main_component = normalizeComponent(\n packages_footer_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_80210338_render,\n mainvue_type_template_id_80210338_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var footer_src_main_api; }\nfooter_src_main_component.options.__file = "packages/footer/src/main.vue"\n/* harmony default export */ var footer_src_main = (footer_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/footer/index.js\n\n\n/* istanbul ignore next */\nfooter_src_main.install = function (Vue) {\n Vue.component(footer_src_main.name, footer_src_main);\n};\n\n/* harmony default export */ var footer = (footer_src_main);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/timeline/src/main.vue?vue&type=script&lang=js&\n\n/* harmony default export */ var timeline_src_mainvue_type_script_lang_js_ = ({\n name: \'ElTimeline\',\n\n props: {\n reverse: {\n type: Boolean,\n default: false\n }\n },\n\n provide: function provide() {\n return {\n timeline: this\n };\n },\n render: function render() {\n var h = arguments[0];\n\n var reverse = this.reverse;\n var classes = {\n \'el-timeline\': true,\n \'is-reverse\': reverse\n };\n var slots = this.$slots.default || [];\n if (reverse) {\n slots = slots.reverse();\n }\n return h(\n \'ul\',\n { \'class\': classes },\n [slots]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/timeline/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_timeline_src_mainvue_type_script_lang_js_ = (timeline_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/timeline/src/main.vue\nvar main_render, main_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar timeline_src_main_component = normalizeComponent(\n packages_timeline_src_mainvue_type_script_lang_js_,\n main_render,\n main_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var timeline_src_main_api; }\ntimeline_src_main_component.options.__file = "packages/timeline/src/main.vue"\n/* harmony default export */ var timeline_src_main = (timeline_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/timeline/index.js\n\n\n/* istanbul ignore next */\ntimeline_src_main.install = function (Vue) {\n Vue.component(timeline_src_main.name, timeline_src_main);\n};\n\n/* harmony default export */ var timeline = (timeline_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/timeline/src/item.vue?vue&type=template&id=61a69e50&\nvar itemvue_type_template_id_61a69e50_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("li", { staticClass: "el-timeline-item" }, [\n _c("div", { staticClass: "el-timeline-item__tail" }),\n !_vm.$slots.dot\n ? _c(\n "div",\n {\n staticClass: "el-timeline-item__node",\n class: [\n "el-timeline-item__node--" + (_vm.size || ""),\n "el-timeline-item__node--" + (_vm.type || "")\n ],\n style: {\n backgroundColor: _vm.color\n }\n },\n [\n _vm.icon\n ? _c("i", {\n staticClass: "el-timeline-item__icon",\n class: _vm.icon\n })\n : _vm._e()\n ]\n )\n : _vm._e(),\n _vm.$slots.dot\n ? _c("div", { staticClass: "el-timeline-item__dot" }, [_vm._t("dot")], 2)\n : _vm._e(),\n _c("div", { staticClass: "el-timeline-item__wrapper" }, [\n !_vm.hideTimestamp && _vm.placement === "top"\n ? _c("div", { staticClass: "el-timeline-item__timestamp is-top" }, [\n _vm._v("\\n " + _vm._s(_vm.timestamp) + "\\n ")\n ])\n : _vm._e(),\n _c(\n "div",\n { staticClass: "el-timeline-item__content" },\n [_vm._t("default")],\n 2\n ),\n !_vm.hideTimestamp && _vm.placement === "bottom"\n ? _c("div", { staticClass: "el-timeline-item__timestamp is-bottom" }, [\n _vm._v("\\n " + _vm._s(_vm.timestamp) + "\\n ")\n ])\n : _vm._e()\n ])\n ])\n}\nvar itemvue_type_template_id_61a69e50_staticRenderFns = []\nitemvue_type_template_id_61a69e50_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/timeline/src/item.vue?vue&type=template&id=61a69e50&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/timeline/src/item.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 */ var timeline_src_itemvue_type_script_lang_js_ = ({\n name: \'ElTimelineItem\',\n\n inject: [\'timeline\'],\n\n props: {\n timestamp: String,\n\n hideTimestamp: {\n type: Boolean,\n default: false\n },\n\n placement: {\n type: String,\n default: \'bottom\'\n },\n\n type: String,\n\n color: String,\n\n size: {\n type: String,\n default: \'normal\'\n },\n\n icon: String\n }\n});\n// CONCATENATED MODULE: ./packages/timeline/src/item.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_timeline_src_itemvue_type_script_lang_js_ = (timeline_src_itemvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/timeline/src/item.vue\n\n\n\n\n\n/* normalize component */\n\nvar src_item_component = normalizeComponent(\n packages_timeline_src_itemvue_type_script_lang_js_,\n itemvue_type_template_id_61a69e50_render,\n itemvue_type_template_id_61a69e50_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var src_item_api; }\nsrc_item_component.options.__file = "packages/timeline/src/item.vue"\n/* harmony default export */ var timeline_src_item = (src_item_component.exports);\n// CONCATENATED MODULE: ./packages/timeline-item/index.js\n\n\n/* istanbul ignore next */\ntimeline_src_item.install = function (Vue) {\n Vue.component(timeline_src_item.name, timeline_src_item);\n};\n\n/* harmony default export */ var timeline_item = (timeline_src_item);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/link/src/main.vue?vue&type=template&id=01cf3b65&\nvar mainvue_type_template_id_01cf3b65_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "a",\n _vm._b(\n {\n class: [\n "el-link",\n _vm.type ? "el-link--" + _vm.type : "",\n _vm.disabled && "is-disabled",\n _vm.underline && !_vm.disabled && "is-underline"\n ],\n attrs: { href: _vm.disabled ? null : _vm.href },\n on: { click: _vm.handleClick }\n },\n "a",\n _vm.$attrs,\n false\n ),\n [\n _vm.icon ? _c("i", { class: _vm.icon }) : _vm._e(),\n _vm.$slots.default\n ? _c("span", { staticClass: "el-link--inner" }, [_vm._t("default")], 2)\n : _vm._e(),\n _vm.$slots.icon ? [_vm.$slots.icon ? _vm._t("icon") : _vm._e()] : _vm._e()\n ],\n 2\n )\n}\nvar mainvue_type_template_id_01cf3b65_staticRenderFns = []\nmainvue_type_template_id_01cf3b65_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/link/src/main.vue?vue&type=template&id=01cf3b65&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/link/src/main.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/* harmony default export */ var link_src_mainvue_type_script_lang_js_ = ({\n name: \'ElLink\',\n\n props: {\n type: {\n type: String,\n default: \'default\'\n },\n underline: {\n type: Boolean,\n default: true\n },\n disabled: Boolean,\n href: String,\n icon: String\n },\n\n methods: {\n handleClick: function handleClick(event) {\n if (!this.disabled) {\n if (!this.href) {\n this.$emit(\'click\', event);\n }\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/link/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_link_src_mainvue_type_script_lang_js_ = (link_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/link/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar link_src_main_component = normalizeComponent(\n packages_link_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_01cf3b65_render,\n mainvue_type_template_id_01cf3b65_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var link_src_main_api; }\nlink_src_main_component.options.__file = "packages/link/src/main.vue"\n/* harmony default export */ var link_src_main = (link_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/link/index.js\n\n\n/* istanbul ignore next */\nlink_src_main.install = function (Vue) {\n Vue.component(link_src_main.name, link_src_main);\n};\n\n/* harmony default export */ var packages_link = (link_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/divider/src/main.vue?vue&type=template&id=7fa02a7e&functional=true&\nvar mainvue_type_template_id_7fa02a7e_functional_true_render = function(_h, _vm) {\n var _c = _vm._c\n return _c(\n "div",\n _vm._g(\n _vm._b(\n {\n class: [\n _vm.data.staticClass,\n "el-divider",\n "el-divider--" + _vm.props.direction\n ]\n },\n "div",\n _vm.data.attrs,\n false\n ),\n _vm.listeners\n ),\n [\n _vm.slots().default && _vm.props.direction !== "vertical"\n ? _c(\n "div",\n { class: ["el-divider__text", "is-" + _vm.props.contentPosition] },\n [_vm._t("default")],\n 2\n )\n : _vm._e()\n ]\n )\n}\nvar mainvue_type_template_id_7fa02a7e_functional_true_staticRenderFns = []\nmainvue_type_template_id_7fa02a7e_functional_true_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/divider/src/main.vue?vue&type=template&id=7fa02a7e&functional=true&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/divider/src/main.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var divider_src_mainvue_type_script_lang_js_ = ({\n name: \'ElDivider\',\n props: {\n direction: {\n type: String,\n default: \'horizontal\',\n validator: function validator(val) {\n return [\'horizontal\', \'vertical\'].indexOf(val) !== -1;\n }\n },\n contentPosition: {\n type: String,\n default: \'center\',\n validator: function validator(val) {\n return [\'left\', \'center\', \'right\'].indexOf(val) !== -1;\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/divider/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_divider_src_mainvue_type_script_lang_js_ = (divider_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/divider/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar divider_src_main_component = normalizeComponent(\n packages_divider_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_7fa02a7e_functional_true_render,\n mainvue_type_template_id_7fa02a7e_functional_true_staticRenderFns,\n true,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var divider_src_main_api; }\ndivider_src_main_component.options.__file = "packages/divider/src/main.vue"\n/* harmony default export */ var divider_src_main = (divider_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/divider/index.js\n\n\n/* istanbul ignore next */\ndivider_src_main.install = function (Vue) {\n Vue.component(divider_src_main.name, divider_src_main);\n};\n\n/* harmony default export */ var divider = (divider_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/image/src/main.vue?vue&type=template&id=44d84a7c&\nvar mainvue_type_template_id_44d84a7c_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "div",\n { staticClass: "el-image" },\n [\n _vm.loading\n ? _vm._t("placeholder", [\n _c("div", { staticClass: "el-image__placeholder" })\n ])\n : _vm.error\n ? _vm._t("error", [\n _c("div", { staticClass: "el-image__error" }, [\n _vm._v(_vm._s(_vm.t("el.image.error")))\n ])\n ])\n : _c(\n "img",\n _vm._g(\n _vm._b(\n {\n staticClass: "el-image__inner",\n class: {\n "el-image__inner--center": _vm.alignCenter,\n "el-image__preview": _vm.preview\n },\n style: _vm.imageStyle,\n attrs: { src: _vm.src },\n on: { click: _vm.clickHandler }\n },\n "img",\n _vm.$attrs,\n false\n ),\n _vm.$listeners\n )\n ),\n _vm.preview\n ? [\n _vm.showViewer\n ? _c("image-viewer", {\n attrs: {\n "z-index": _vm.zIndex,\n "initial-index": _vm.imageIndex,\n "on-close": _vm.closeViewer,\n "url-list": _vm.previewSrcList\n }\n })\n : _vm._e()\n ]\n : _vm._e()\n ],\n 2\n )\n}\nvar mainvue_type_template_id_44d84a7c_staticRenderFns = []\nmainvue_type_template_id_44d84a7c_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/image/src/main.vue?vue&type=template&id=44d84a7c&\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/image/src/image-viewer.vue?vue&type=template&id=5e73b307&\nvar image_viewervue_type_template_id_5e73b307_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("transition", { attrs: { name: "viewer-fade" } }, [\n _c(\n "div",\n {\n ref: "el-image-viewer__wrapper",\n staticClass: "el-image-viewer__wrapper",\n style: { "z-index": _vm.viewerZIndex },\n attrs: { tabindex: "-1" }\n },\n [\n _c("div", {\n staticClass: "el-image-viewer__mask",\n on: {\n click: function($event) {\n if ($event.target !== $event.currentTarget) {\n return null\n }\n return _vm.handleMaskClick($event)\n }\n }\n }),\n _c(\n "span",\n {\n staticClass: "el-image-viewer__btn el-image-viewer__close",\n on: { click: _vm.hide }\n },\n [_c("i", { staticClass: "el-icon-close" })]\n ),\n !_vm.isSingle\n ? [\n _c(\n "span",\n {\n staticClass: "el-image-viewer__btn el-image-viewer__prev",\n class: { "is-disabled": !_vm.infinite && _vm.isFirst },\n on: { click: _vm.prev }\n },\n [_c("i", { staticClass: "el-icon-arrow-left" })]\n ),\n _c(\n "span",\n {\n staticClass: "el-image-viewer__btn el-image-viewer__next",\n class: { "is-disabled": !_vm.infinite && _vm.isLast },\n on: { click: _vm.next }\n },\n [_c("i", { staticClass: "el-icon-arrow-right" })]\n )\n ]\n : _vm._e(),\n _c(\n "div",\n { staticClass: "el-image-viewer__btn el-image-viewer__actions" },\n [\n _c("div", { staticClass: "el-image-viewer__actions__inner" }, [\n _c("i", {\n staticClass: "el-icon-zoom-out",\n on: {\n click: function($event) {\n _vm.handleActions("zoomOut")\n }\n }\n }),\n _c("i", {\n staticClass: "el-icon-zoom-in",\n on: {\n click: function($event) {\n _vm.handleActions("zoomIn")\n }\n }\n }),\n _c("i", { staticClass: "el-image-viewer__actions__divider" }),\n _c("i", { class: _vm.mode.icon, on: { click: _vm.toggleMode } }),\n _c("i", { staticClass: "el-image-viewer__actions__divider" }),\n _c("i", {\n staticClass: "el-icon-refresh-left",\n on: {\n click: function($event) {\n _vm.handleActions("anticlocelise")\n }\n }\n }),\n _c("i", {\n staticClass: "el-icon-refresh-right",\n on: {\n click: function($event) {\n _vm.handleActions("clocelise")\n }\n }\n })\n ])\n ]\n ),\n _c(\n "div",\n { staticClass: "el-image-viewer__canvas" },\n _vm._l(_vm.urlList, function(url, i) {\n return i === _vm.index\n ? _c("img", {\n key: url,\n ref: "img",\n refInFor: true,\n staticClass: "el-image-viewer__img",\n style: _vm.imgStyle,\n attrs: { src: _vm.currentImg, referrerpolicy: "no-referrer" },\n on: {\n load: _vm.handleImgLoad,\n error: _vm.handleImgError,\n mousedown: _vm.handleMouseDown\n }\n })\n : _vm._e()\n }),\n 0\n )\n ],\n 2\n )\n ])\n}\nvar image_viewervue_type_template_id_5e73b307_staticRenderFns = []\nimage_viewervue_type_template_id_5e73b307_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/image/src/image-viewer.vue?vue&type=template&id=5e73b307&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/image/src/image-viewer.vue?vue&type=script&lang=js&\nvar image_viewervue_type_script_lang_js_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\nvar Mode = {\n CONTAIN: {\n name: \'contain\',\n icon: \'el-icon-full-screen\'\n },\n ORIGINAL: {\n name: \'original\',\n icon: \'el-icon-c-scale-to-original\'\n }\n};\n\nvar mousewheelEventName = Object(util_["isFirefox"])() ? \'DOMMouseScroll\' : \'mousewheel\';\n\n/* harmony default export */ var image_viewervue_type_script_lang_js_ = ({\n name: \'elImageViewer\',\n\n props: {\n urlList: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n zIndex: {\n type: Number,\n default: 2000\n },\n onSwitch: {\n type: Function,\n default: function _default() {}\n },\n onClose: {\n type: Function,\n default: function _default() {}\n },\n initialIndex: {\n type: Number,\n default: 0\n },\n appendToBody: {\n type: Boolean,\n default: true\n },\n maskClosable: {\n type: Boolean,\n default: true\n }\n },\n\n data: function data() {\n return {\n index: this.initialIndex,\n isShow: false,\n infinite: true,\n loading: false,\n mode: Mode.CONTAIN,\n transform: {\n scale: 1,\n deg: 0,\n offsetX: 0,\n offsetY: 0,\n enableTransition: false\n }\n };\n },\n\n computed: {\n isSingle: function isSingle() {\n return this.urlList.length <= 1;\n },\n isFirst: function isFirst() {\n return this.index === 0;\n },\n isLast: function isLast() {\n return this.index === this.urlList.length - 1;\n },\n currentImg: function currentImg() {\n return this.urlList[this.index];\n },\n imgStyle: function imgStyle() {\n var _transform = this.transform,\n scale = _transform.scale,\n deg = _transform.deg,\n offsetX = _transform.offsetX,\n offsetY = _transform.offsetY,\n enableTransition = _transform.enableTransition;\n\n var style = {\n transform: \'scale(\' + scale + \') rotate(\' + deg + \'deg)\',\n transition: enableTransition ? \'transform .3s\' : \'\',\n \'margin-left\': offsetX + \'px\',\n \'margin-top\': offsetY + \'px\'\n };\n if (this.mode === Mode.CONTAIN) {\n style.maxWidth = style.maxHeight = \'100%\';\n }\n return style;\n },\n viewerZIndex: function viewerZIndex() {\n var nextZIndex = popup_["PopupManager"].nextZIndex();\n return this.zIndex > nextZIndex ? this.zIndex : nextZIndex;\n }\n },\n watch: {\n index: {\n handler: function handler(val) {\n this.reset();\n this.onSwitch(val);\n }\n },\n currentImg: function currentImg(val) {\n var _this = this;\n\n this.$nextTick(function (_) {\n var $img = _this.$refs.img[0];\n if (!$img.complete) {\n _this.loading = true;\n }\n });\n }\n },\n methods: {\n hide: function hide() {\n this.deviceSupportUninstall();\n this.onClose();\n },\n deviceSupportInstall: function deviceSupportInstall() {\n var _this2 = this;\n\n this._keyDownHandler = function (e) {\n e.stopPropagation();\n var keyCode = e.keyCode;\n switch (keyCode) {\n // ESC\n case 27:\n _this2.hide();\n break;\n // SPACE\n case 32:\n _this2.toggleMode();\n break;\n // LEFT_ARROW\n case 37:\n _this2.prev();\n break;\n // UP_ARROW\n case 38:\n _this2.handleActions(\'zoomIn\');\n break;\n // RIGHT_ARROW\n case 39:\n _this2.next();\n break;\n // DOWN_ARROW\n case 40:\n _this2.handleActions(\'zoomOut\');\n break;\n }\n };\n this._mouseWheelHandler = Object(util_["rafThrottle"])(function (e) {\n var delta = e.wheelDelta ? e.wheelDelta : -e.detail;\n if (delta > 0) {\n _this2.handleActions(\'zoomIn\', {\n zoomRate: 0.015,\n enableTransition: false\n });\n } else {\n _this2.handleActions(\'zoomOut\', {\n zoomRate: 0.015,\n enableTransition: false\n });\n }\n });\n Object(dom_["on"])(document, \'keydown\', this._keyDownHandler);\n Object(dom_["on"])(document, mousewheelEventName, this._mouseWheelHandler);\n },\n deviceSupportUninstall: function deviceSupportUninstall() {\n Object(dom_["off"])(document, \'keydown\', this._keyDownHandler);\n Object(dom_["off"])(document, mousewheelEventName, this._mouseWheelHandler);\n this._keyDownHandler = null;\n this._mouseWheelHandler = null;\n },\n handleImgLoad: function handleImgLoad(e) {\n this.loading = false;\n },\n handleImgError: function handleImgError(e) {\n this.loading = false;\n e.target.alt = \'加载失败\';\n },\n handleMouseDown: function handleMouseDown(e) {\n var _this3 = this;\n\n if (this.loading || e.button !== 0) return;\n\n var _transform2 = this.transform,\n offsetX = _transform2.offsetX,\n offsetY = _transform2.offsetY;\n\n var startX = e.pageX;\n var startY = e.pageY;\n this._dragHandler = Object(util_["rafThrottle"])(function (ev) {\n _this3.transform.offsetX = offsetX + ev.pageX - startX;\n _this3.transform.offsetY = offsetY + ev.pageY - startY;\n });\n Object(dom_["on"])(document, \'mousemove\', this._dragHandler);\n Object(dom_["on"])(document, \'mouseup\', function (ev) {\n Object(dom_["off"])(document, \'mousemove\', _this3._dragHandler);\n });\n\n e.preventDefault();\n },\n handleMaskClick: function handleMaskClick() {\n if (this.maskClosable) {\n this.hide();\n }\n },\n reset: function reset() {\n this.transform = {\n scale: 1,\n deg: 0,\n offsetX: 0,\n offsetY: 0,\n enableTransition: false\n };\n },\n toggleMode: function toggleMode() {\n if (this.loading) return;\n\n var modeNames = Object.keys(Mode);\n var modeValues = Object.values(Mode);\n var index = modeValues.indexOf(this.mode);\n var nextIndex = (index + 1) % modeNames.length;\n this.mode = Mode[modeNames[nextIndex]];\n this.reset();\n },\n prev: function prev() {\n if (this.isFirst && !this.infinite) return;\n var len = this.urlList.length;\n this.index = (this.index - 1 + len) % len;\n },\n next: function next() {\n if (this.isLast && !this.infinite) return;\n var len = this.urlList.length;\n this.index = (this.index + 1) % len;\n },\n handleActions: function handleActions(action) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (this.loading) return;\n\n var _zoomRate$rotateDeg$e = image_viewervue_type_script_lang_js_extends({\n zoomRate: 0.2,\n rotateDeg: 90,\n enableTransition: true\n }, options),\n zoomRate = _zoomRate$rotateDeg$e.zoomRate,\n rotateDeg = _zoomRate$rotateDeg$e.rotateDeg,\n enableTransition = _zoomRate$rotateDeg$e.enableTransition;\n\n var transform = this.transform;\n\n switch (action) {\n case \'zoomOut\':\n if (transform.scale > 0.2) {\n transform.scale = parseFloat((transform.scale - zoomRate).toFixed(3));\n }\n break;\n case \'zoomIn\':\n transform.scale = parseFloat((transform.scale + zoomRate).toFixed(3));\n break;\n case \'clocelise\':\n transform.deg += rotateDeg;\n break;\n case \'anticlocelise\':\n transform.deg -= rotateDeg;\n break;\n }\n transform.enableTransition = enableTransition;\n }\n },\n mounted: function mounted() {\n this.deviceSupportInstall();\n if (this.appendToBody) {\n document.body.appendChild(this.$el);\n }\n // add tabindex then wrapper can be focusable via Javascript\n // focus wrapper so arrow key can\'t cause inner scroll behavior underneath\n this.$refs[\'el-image-viewer__wrapper\'].focus();\n },\n destroyed: function destroyed() {\n // if appendToBody is true, remove DOM node after destroy\n if (this.appendToBody && this.$el && this.$el.parentNode) {\n this.$el.parentNode.removeChild(this.$el);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/image/src/image-viewer.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_image_viewervue_type_script_lang_js_ = (image_viewervue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/image/src/image-viewer.vue\n\n\n\n\n\n/* normalize component */\n\nvar image_viewer_component = normalizeComponent(\n src_image_viewervue_type_script_lang_js_,\n image_viewervue_type_template_id_5e73b307_render,\n image_viewervue_type_template_id_5e73b307_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var image_viewer_api; }\nimage_viewer_component.options.__file = "packages/image/src/image-viewer.vue"\n/* harmony default export */ var image_viewer = (image_viewer_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/image/src/main.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\nvar isSupportObjectFit = function isSupportObjectFit() {\n return document.documentElement.style.objectFit !== undefined;\n};\n\nvar ObjectFit = {\n NONE: \'none\',\n CONTAIN: \'contain\',\n COVER: \'cover\',\n FILL: \'fill\',\n SCALE_DOWN: \'scale-down\'\n};\n\nvar prevOverflow = \'\';\n\n/* harmony default export */ var image_src_mainvue_type_script_lang_js_ = ({\n name: \'ElImage\',\n\n mixins: [locale_default.a],\n inheritAttrs: false,\n\n components: {\n ImageViewer: image_viewer\n },\n\n props: {\n src: String,\n fit: String,\n lazy: Boolean,\n scrollContainer: {},\n previewSrcList: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n zIndex: {\n type: Number,\n default: 2000\n },\n initialIndex: Number\n },\n\n data: function data() {\n return {\n loading: true,\n error: false,\n show: !this.lazy,\n imageWidth: 0,\n imageHeight: 0,\n showViewer: false\n };\n },\n\n\n computed: {\n imageStyle: function imageStyle() {\n var fit = this.fit;\n\n if (!this.$isServer && fit) {\n return isSupportObjectFit() ? { \'object-fit\': fit } : this.getImageStyle(fit);\n }\n return {};\n },\n alignCenter: function alignCenter() {\n return !this.$isServer && !isSupportObjectFit() && this.fit !== ObjectFit.FILL;\n },\n preview: function preview() {\n var previewSrcList = this.previewSrcList;\n\n return Array.isArray(previewSrcList) && previewSrcList.length > 0;\n },\n imageIndex: function imageIndex() {\n var previewIndex = 0;\n var initialIndex = this.initialIndex;\n if (initialIndex >= 0) {\n previewIndex = initialIndex;\n return previewIndex;\n }\n var srcIndex = this.previewSrcList.indexOf(this.src);\n if (srcIndex >= 0) {\n previewIndex = srcIndex;\n return previewIndex;\n }\n return previewIndex;\n }\n },\n\n watch: {\n src: function src(val) {\n this.show && this.loadImage();\n },\n show: function show(val) {\n val && this.loadImage();\n }\n },\n\n mounted: function mounted() {\n if (this.lazy) {\n this.addLazyLoadListener();\n } else {\n this.loadImage();\n }\n },\n beforeDestroy: function beforeDestroy() {\n this.lazy && this.removeLazyLoadListener();\n },\n\n\n methods: {\n loadImage: function loadImage() {\n var _this = this;\n\n if (this.$isServer) return;\n\n // reset status\n this.loading = true;\n this.error = false;\n\n var img = new Image();\n img.onload = function (e) {\n return _this.handleLoad(e, img);\n };\n img.onerror = this.handleError.bind(this);\n\n // bind html attrs\n // so it can behave consistently\n Object.keys(this.$attrs).forEach(function (key) {\n var value = _this.$attrs[key];\n img.setAttribute(key, value);\n });\n img.src = this.src;\n },\n handleLoad: function handleLoad(e, img) {\n this.imageWidth = img.width;\n this.imageHeight = img.height;\n this.loading = false;\n this.error = false;\n },\n handleError: function handleError(e) {\n this.loading = false;\n this.error = true;\n this.$emit(\'error\', e);\n },\n handleLazyLoad: function handleLazyLoad() {\n if (Object(dom_["isInContainer"])(this.$el, this._scrollContainer)) {\n this.show = true;\n this.removeLazyLoadListener();\n }\n },\n addLazyLoadListener: function addLazyLoadListener() {\n if (this.$isServer) return;\n\n var scrollContainer = this.scrollContainer;\n\n var _scrollContainer = null;\n\n if (Object(types_["isHtmlElement"])(scrollContainer)) {\n _scrollContainer = scrollContainer;\n } else if (Object(types_["isString"])(scrollContainer)) {\n _scrollContainer = document.querySelector(scrollContainer);\n } else {\n _scrollContainer = Object(dom_["getScrollContainer"])(this.$el);\n }\n\n if (_scrollContainer) {\n this._scrollContainer = _scrollContainer;\n this._lazyLoadHandler = throttle_default()(200, this.handleLazyLoad);\n Object(dom_["on"])(_scrollContainer, \'scroll\', this._lazyLoadHandler);\n this.handleLazyLoad();\n }\n },\n removeLazyLoadListener: function removeLazyLoadListener() {\n var _scrollContainer = this._scrollContainer,\n _lazyLoadHandler = this._lazyLoadHandler;\n\n\n if (this.$isServer || !_scrollContainer || !_lazyLoadHandler) return;\n\n Object(dom_["off"])(_scrollContainer, \'scroll\', _lazyLoadHandler);\n this._scrollContainer = null;\n this._lazyLoadHandler = null;\n },\n\n /**\n * simulate object-fit behavior to compatible with IE11 and other browsers which not support object-fit\n */\n getImageStyle: function getImageStyle(fit) {\n var imageWidth = this.imageWidth,\n imageHeight = this.imageHeight;\n var _$el = this.$el,\n containerWidth = _$el.clientWidth,\n containerHeight = _$el.clientHeight;\n\n\n if (!imageWidth || !imageHeight || !containerWidth || !containerHeight) return {};\n\n var imageAspectRatio = imageWidth / imageHeight;\n var containerAspectRatio = containerWidth / containerHeight;\n\n if (fit === ObjectFit.SCALE_DOWN) {\n var isSmaller = imageWidth < containerWidth && imageHeight < containerHeight;\n fit = isSmaller ? ObjectFit.NONE : ObjectFit.CONTAIN;\n }\n\n switch (fit) {\n case ObjectFit.NONE:\n return { width: \'auto\', height: \'auto\' };\n case ObjectFit.CONTAIN:\n return imageAspectRatio < containerAspectRatio ? { width: \'auto\' } : { height: \'auto\' };\n case ObjectFit.COVER:\n return imageAspectRatio < containerAspectRatio ? { height: \'auto\' } : { width: \'auto\' };\n default:\n return {};\n }\n },\n clickHandler: function clickHandler() {\n // don\'t show viewer when preview is false\n if (!this.preview) {\n return;\n }\n // prevent body scroll\n prevOverflow = document.body.style.overflow;\n document.body.style.overflow = \'hidden\';\n this.showViewer = true;\n },\n closeViewer: function closeViewer() {\n document.body.style.overflow = prevOverflow;\n this.showViewer = false;\n }\n }\n});\n// CONCATENATED MODULE: ./packages/image/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_image_src_mainvue_type_script_lang_js_ = (image_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/image/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar image_src_main_component = normalizeComponent(\n packages_image_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_44d84a7c_render,\n mainvue_type_template_id_44d84a7c_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var image_src_main_api; }\nimage_src_main_component.options.__file = "packages/image/src/main.vue"\n/* harmony default export */ var image_src_main = (image_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/image/index.js\n\n\n/* istanbul ignore next */\nimage_src_main.install = function (Vue) {\n Vue.component(image_src_main.name, image_src_main);\n};\n\n/* harmony default export */ var packages_image = (image_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/calendar/src/main.vue?vue&type=template&id=6d9756be&\nvar mainvue_type_template_id_6d9756be_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("div", { staticClass: "el-calendar" }, [\n _c("div", { staticClass: "el-calendar__header" }, [\n _c("div", { staticClass: "el-calendar__title" }, [\n _vm._v("\\n " + _vm._s(_vm.i18nDate) + "\\n ")\n ]),\n _vm.validatedRange.length === 0\n ? _c(\n "div",\n { staticClass: "el-calendar__button-group" },\n [\n _c(\n "el-button-group",\n [\n _c(\n "el-button",\n {\n attrs: { type: "plain", size: "mini" },\n on: {\n click: function($event) {\n _vm.selectDate("prev-month")\n }\n }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.t("el.datepicker.prevMonth")) +\n "\\n "\n )\n ]\n ),\n _c(\n "el-button",\n {\n attrs: { type: "plain", size: "mini" },\n on: {\n click: function($event) {\n _vm.selectDate("today")\n }\n }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.t("el.datepicker.today")) +\n "\\n "\n )\n ]\n ),\n _c(\n "el-button",\n {\n attrs: { type: "plain", size: "mini" },\n on: {\n click: function($event) {\n _vm.selectDate("next-month")\n }\n }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.t("el.datepicker.nextMonth")) +\n "\\n "\n )\n ]\n )\n ],\n 1\n )\n ],\n 1\n )\n : _vm._e()\n ]),\n _vm.validatedRange.length === 0\n ? _c(\n "div",\n { key: "no-range", staticClass: "el-calendar__body" },\n [\n _c("date-table", {\n attrs: {\n date: _vm.date,\n "selected-day": _vm.realSelectedDay,\n "first-day-of-week": _vm.realFirstDayOfWeek\n },\n on: { pick: _vm.pickDay }\n })\n ],\n 1\n )\n : _c(\n "div",\n { key: "has-range", staticClass: "el-calendar__body" },\n _vm._l(_vm.validatedRange, function(range, index) {\n return _c("date-table", {\n key: index,\n attrs: {\n date: range[0],\n "selected-day": _vm.realSelectedDay,\n range: range,\n "hide-header": index !== 0,\n "first-day-of-week": _vm.realFirstDayOfWeek\n },\n on: { pick: _vm.pickDay }\n })\n }),\n 1\n )\n ])\n}\nvar mainvue_type_template_id_6d9756be_staticRenderFns = []\nmainvue_type_template_id_6d9756be_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/calendar/src/main.vue?vue&type=template&id=6d9756be&\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/date"\nvar date_ = __webpack_require__(20);\nvar date_default = /*#__PURE__*/__webpack_require__.n(date_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/calendar/src/date-table.vue?vue&type=script&lang=js&\n\n\n\n\n/* harmony default export */ var src_date_tablevue_type_script_lang_js_ = ({\n props: {\n selectedDay: String, // formated date yyyy-MM-dd\n range: {\n type: Array,\n validator: function validator(val) {\n if (!(val && val.length)) return true;\n var start = val[0],\n end = val[1];\n\n return Object(date_util_["validateRangeInOneMonth"])(start, end);\n }\n },\n date: Date,\n hideHeader: Boolean,\n firstDayOfWeek: Number\n },\n\n inject: [\'elCalendar\'],\n\n methods: {\n toNestedArr: function toNestedArr(days) {\n return Object(date_util_["range"])(days.length / 7).map(function (_, index) {\n var start = index * 7;\n return days.slice(start, start + 7);\n });\n },\n getFormateDate: function getFormateDate(day, type) {\n if (!day || [\'prev\', \'current\', \'next\'].indexOf(type) === -1) {\n throw new Error(\'invalid day or type\');\n }\n var prefix = this.curMonthDatePrefix;\n if (type === \'prev\') {\n prefix = this.prevMonthDatePrefix;\n } else if (type === \'next\') {\n prefix = this.nextMonthDatePrefix;\n }\n day = (\'00\' + day).slice(-2);\n return prefix + \'-\' + day;\n },\n getCellClass: function getCellClass(_ref) {\n var text = _ref.text,\n type = _ref.type;\n\n var classes = [type];\n if (type === \'current\') {\n var date = this.getFormateDate(text, type);\n if (date === this.selectedDay) {\n classes.push(\'is-selected\');\n }\n if (date === this.formatedToday) {\n classes.push(\'is-today\');\n }\n }\n return classes;\n },\n pickDay: function pickDay(_ref2) {\n var text = _ref2.text,\n type = _ref2.type;\n\n var date = this.getFormateDate(text, type);\n this.$emit(\'pick\', date);\n },\n cellRenderProxy: function cellRenderProxy(_ref3) {\n var text = _ref3.text,\n type = _ref3.type;\n var h = this.$createElement;\n\n var render = this.elCalendar.$scopedSlots.dateCell;\n if (!render) return h(\'span\', [text]);\n\n var day = this.getFormateDate(text, type);\n var date = new Date(day);\n var data = {\n isSelected: this.selectedDay === day,\n type: type + \'-month\',\n day: day\n };\n return render({ date: date, data: data });\n }\n },\n\n computed: {\n WEEK_DAYS: function WEEK_DAYS() {\n return Object(date_util_["getI18nSettings"])().dayNames;\n },\n prevMonthDatePrefix: function prevMonthDatePrefix() {\n var temp = new Date(this.date.getTime());\n temp.setDate(0);\n return date_default.a.format(temp, \'yyyy-MM\');\n },\n curMonthDatePrefix: function curMonthDatePrefix() {\n return date_default.a.format(this.date, \'yyyy-MM\');\n },\n nextMonthDatePrefix: function nextMonthDatePrefix() {\n var temp = new Date(this.date.getFullYear(), this.date.getMonth() + 1, 1);\n return date_default.a.format(temp, \'yyyy-MM\');\n },\n formatedToday: function formatedToday() {\n return this.elCalendar.formatedToday;\n },\n isInRange: function isInRange() {\n return this.range && this.range.length;\n },\n rows: function rows() {\n var days = [];\n // if range exists, should render days in range.\n if (this.isInRange) {\n var _range = this.range,\n start = _range[0],\n end = _range[1];\n\n var currentMonthRange = Object(date_util_["range"])(end.getDate() - start.getDate() + 1).map(function (_, index) {\n return {\n text: start.getDate() + index,\n type: \'current\'\n };\n });\n var remaining = currentMonthRange.length % 7;\n remaining = remaining === 0 ? 0 : 7 - remaining;\n var nextMonthRange = Object(date_util_["range"])(remaining).map(function (_, index) {\n return {\n text: index + 1,\n type: \'next\'\n };\n });\n days = currentMonthRange.concat(nextMonthRange);\n } else {\n var date = this.date;\n var firstDay = Object(date_util_["getFirstDayOfMonth"])(date);\n firstDay = firstDay === 0 ? 7 : firstDay;\n var firstDayOfWeek = typeof this.firstDayOfWeek === \'number\' ? this.firstDayOfWeek : 1;\n var offset = (7 + firstDay - firstDayOfWeek) % 7;\n var prevMonthDays = Object(date_util_["getPrevMonthLastDays"])(date, offset).map(function (day) {\n return {\n text: day,\n type: \'prev\'\n };\n });\n var currentMonthDays = Object(date_util_["getMonthDays"])(date).map(function (day) {\n return {\n text: day,\n type: \'current\'\n };\n });\n days = [].concat(prevMonthDays, currentMonthDays);\n var nextMonthDays = Object(date_util_["range"])(42 - days.length).map(function (_, index) {\n return {\n text: index + 1,\n type: \'next\'\n };\n });\n days = days.concat(nextMonthDays);\n }\n return this.toNestedArr(days);\n },\n weekDays: function weekDays() {\n var start = this.firstDayOfWeek;\n var WEEK_DAYS = this.WEEK_DAYS;\n\n\n if (typeof start !== \'number\' || start === 0) {\n return WEEK_DAYS.slice();\n } else {\n return WEEK_DAYS.slice(start).concat(WEEK_DAYS.slice(0, start));\n }\n }\n },\n\n render: function render() {\n var _this = this;\n\n var h = arguments[0];\n\n var thead = this.hideHeader ? null : h(\'thead\', [this.weekDays.map(function (day) {\n return h(\n \'th\',\n { key: day },\n [day]\n );\n })]);\n return h(\n \'table\',\n {\n \'class\': {\n \'el-calendar-table\': true,\n \'is-range\': this.isInRange\n },\n attrs: { cellspacing: \'0\',\n cellpadding: \'0\' }\n },\n [thead, h(\'tbody\', [this.rows.map(function (row, index) {\n return h(\n \'tr\',\n {\n \'class\': {\n \'el-calendar-table__row\': true,\n \'el-calendar-table__row--hide-border\': index === 0 && _this.hideHeader\n },\n key: index },\n [row.map(function (cell, key) {\n return h(\n \'td\',\n { key: key,\n \'class\': _this.getCellClass(cell),\n on: {\n \'click\': _this.pickDay.bind(_this, cell)\n }\n },\n [h(\n \'div\',\n { \'class\': \'el-calendar-day\' },\n [_this.cellRenderProxy(cell)]\n )]\n );\n })]\n );\n })])]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/calendar/src/date-table.vue?vue&type=script&lang=js&\n /* harmony default export */ var calendar_src_date_tablevue_type_script_lang_js_ = (src_date_tablevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/calendar/src/date-table.vue\nvar date_table_render, date_table_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar src_date_table_component = normalizeComponent(\n calendar_src_date_tablevue_type_script_lang_js_,\n date_table_render,\n date_table_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var src_date_table_api; }\nsrc_date_table_component.options.__file = "packages/calendar/src/date-table.vue"\n/* harmony default export */ var src_date_table = (src_date_table_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/calendar/src/main.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\nvar validTypes = [\'prev-month\', \'today\', \'next-month\'];\nvar weekDays = [\'Sunday\', \'Monday\', \'Tuesday\', \'Wednesday\', \'Thursday\', \'Friday\', \'Saturday\'];\nvar oneDay = 86400000;\n\n/* harmony default export */ var calendar_src_mainvue_type_script_lang_js_ = ({\n name: \'ElCalendar\',\n\n mixins: [locale_default.a],\n\n components: {\n DateTable: src_date_table,\n ElButton: button_default.a,\n ElButtonGroup: button_group_default.a\n },\n\n props: {\n value: [Date, String, Number],\n range: {\n type: Array,\n validator: function validator(range) {\n if (Array.isArray(range)) {\n return range.length === 2 && range.every(function (item) {\n return typeof item === \'string\' || typeof item === \'number\' || item instanceof Date;\n });\n } else {\n return true;\n }\n }\n },\n firstDayOfWeek: {\n type: Number,\n default: 1\n }\n },\n\n provide: function provide() {\n return {\n elCalendar: this\n };\n },\n\n\n methods: {\n pickDay: function pickDay(day) {\n this.realSelectedDay = day;\n },\n selectDate: function selectDate(type) {\n if (validTypes.indexOf(type) === -1) {\n throw new Error(\'invalid type \' + type);\n }\n var day = \'\';\n if (type === \'prev-month\') {\n day = this.prevMonthDatePrefix + \'-01\';\n } else if (type === \'next-month\') {\n day = this.nextMonthDatePrefix + \'-01\';\n } else {\n day = this.formatedToday;\n }\n\n if (day === this.formatedDate) return;\n this.pickDay(day);\n },\n toDate: function toDate(val) {\n if (!val) {\n throw new Error(\'invalid val\');\n }\n return val instanceof Date ? val : new Date(val);\n },\n rangeValidator: function rangeValidator(date, isStart) {\n var firstDayOfWeek = this.realFirstDayOfWeek;\n var expected = isStart ? firstDayOfWeek : firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;\n var message = (isStart ? \'start\' : \'end\') + \' of range should be \' + weekDays[expected] + \'.\';\n if (date.getDay() !== expected) {\n console.warn(\'[ElementCalendar]\', message, \'Invalid range will be ignored.\');\n return false;\n }\n return true;\n }\n },\n\n computed: {\n prevMonthDatePrefix: function prevMonthDatePrefix() {\n var temp = new Date(this.date.getTime());\n temp.setDate(0);\n return date_default.a.format(temp, \'yyyy-MM\');\n },\n curMonthDatePrefix: function curMonthDatePrefix() {\n return date_default.a.format(this.date, \'yyyy-MM\');\n },\n nextMonthDatePrefix: function nextMonthDatePrefix() {\n var temp = new Date(this.date.getFullYear(), this.date.getMonth() + 1, 1);\n return date_default.a.format(temp, \'yyyy-MM\');\n },\n formatedDate: function formatedDate() {\n return date_default.a.format(this.date, \'yyyy-MM-dd\');\n },\n i18nDate: function i18nDate() {\n var year = this.date.getFullYear();\n var month = this.date.getMonth() + 1;\n return year + \' \' + this.t(\'el.datepicker.year\') + \' \' + this.t(\'el.datepicker.month\' + month);\n },\n formatedToday: function formatedToday() {\n return date_default.a.format(this.now, \'yyyy-MM-dd\');\n },\n\n\n realSelectedDay: {\n get: function get() {\n if (!this.value) return this.selectedDay;\n return this.formatedDate;\n },\n set: function set(val) {\n this.selectedDay = val;\n var date = new Date(val);\n this.$emit(\'input\', date);\n }\n },\n\n date: function date() {\n if (!this.value) {\n if (this.realSelectedDay) {\n var d = this.selectedDay.split(\'-\');\n return new Date(d[0], d[1] - 1, d[2]);\n } else if (this.validatedRange.length) {\n return this.validatedRange[0][0];\n }\n return this.now;\n } else {\n return this.toDate(this.value);\n }\n },\n\n\n // if range is valid, we get a two-digit array\n validatedRange: function validatedRange() {\n var _this = this;\n\n var range = this.range;\n if (!range) return [];\n range = range.reduce(function (prev, val, index) {\n var date = _this.toDate(val);\n if (_this.rangeValidator(date, index === 0)) {\n prev = prev.concat(date);\n }\n return prev;\n }, []);\n if (range.length === 2) {\n var _range = range,\n start = _range[0],\n end = _range[1];\n\n if (start > end) {\n console.warn(\'[ElementCalendar]end time should be greater than start time\');\n return [];\n }\n // start time and end time in one month\n if (Object(date_util_["validateRangeInOneMonth"])(start, end)) {\n return [[start, end]];\n }\n var data = [];\n var startDay = new Date(start.getFullYear(), start.getMonth() + 1, 1);\n var lastDay = this.toDate(startDay.getTime() - oneDay);\n if (!Object(date_util_["validateRangeInOneMonth"])(startDay, end)) {\n console.warn(\'[ElementCalendar]start time and end time interval must not exceed two months\');\n return [];\n }\n // 第一个月的时间范围\n data.push([start, lastDay]);\n // 下一月的时间范围,需要计算一下该月的第一个周起始日\n var firstDayOfWeek = this.realFirstDayOfWeek;\n var nextMontFirstDay = startDay.getDay();\n var interval = 0;\n if (nextMontFirstDay !== firstDayOfWeek) {\n if (firstDayOfWeek === 0) {\n interval = 7 - nextMontFirstDay;\n } else {\n interval = firstDayOfWeek - nextMontFirstDay;\n interval = interval > 0 ? interval : 7 + interval;\n }\n }\n startDay = this.toDate(startDay.getTime() + interval * oneDay);\n if (startDay.getDate() < end.getDate()) {\n data.push([startDay, end]);\n }\n return data;\n }\n return [];\n },\n realFirstDayOfWeek: function realFirstDayOfWeek() {\n if (this.firstDayOfWeek < 1 || this.firstDayOfWeek > 6) {\n return 0;\n }\n return Math.floor(this.firstDayOfWeek);\n }\n },\n\n data: function data() {\n return {\n selectedDay: \'\',\n now: new Date()\n };\n }\n});\n// CONCATENATED MODULE: ./packages/calendar/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_calendar_src_mainvue_type_script_lang_js_ = (calendar_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/calendar/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar calendar_src_main_component = normalizeComponent(\n packages_calendar_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_6d9756be_render,\n mainvue_type_template_id_6d9756be_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var calendar_src_main_api; }\ncalendar_src_main_component.options.__file = "packages/calendar/src/main.vue"\n/* harmony default export */ var calendar_src_main = (calendar_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/calendar/index.js\n\n\n/* istanbul ignore next */\ncalendar_src_main.install = function (Vue) {\n Vue.component(calendar_src_main.name, calendar_src_main);\n};\n\n/* harmony default export */ var calendar = (calendar_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/backtop/src/main.vue?vue&type=template&id=257dd4a9&\nvar mainvue_type_template_id_257dd4a9_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("transition", { attrs: { name: "el-fade-in" } }, [\n _vm.visible\n ? _c(\n "div",\n {\n staticClass: "el-backtop",\n style: {\n right: _vm.styleRight,\n bottom: _vm.styleBottom\n },\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.handleClick($event)\n }\n }\n },\n [\n _vm._t("default", [_c("el-icon", { attrs: { name: "caret-top" } })])\n ],\n 2\n )\n : _vm._e()\n ])\n}\nvar mainvue_type_template_id_257dd4a9_staticRenderFns = []\nmainvue_type_template_id_257dd4a9_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/backtop/src/main.vue?vue&type=template&id=257dd4a9&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/backtop/src/main.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\nvar cubic = function cubic(value) {\n return Math.pow(value, 3);\n};\nvar easeInOutCubic = function easeInOutCubic(value) {\n return value < 0.5 ? cubic(value * 2) / 2 : 1 - cubic((1 - value) * 2) / 2;\n};\n\n/* harmony default export */ var backtop_src_mainvue_type_script_lang_js_ = ({\n name: \'ElBacktop\',\n\n props: {\n visibilityHeight: {\n type: Number,\n default: 200\n },\n target: [String],\n right: {\n type: Number,\n default: 40\n },\n bottom: {\n type: Number,\n default: 40\n }\n },\n\n data: function data() {\n return {\n el: null,\n container: null,\n visible: false\n };\n },\n\n\n computed: {\n styleBottom: function styleBottom() {\n return this.bottom + \'px\';\n },\n styleRight: function styleRight() {\n return this.right + \'px\';\n }\n },\n\n mounted: function mounted() {\n this.init();\n this.throttledScrollHandler = throttle_default()(300, this.onScroll);\n this.container.addEventListener(\'scroll\', this.throttledScrollHandler);\n },\n\n\n methods: {\n init: function init() {\n this.container = document;\n this.el = document.documentElement;\n if (this.target) {\n this.el = document.querySelector(this.target);\n if (!this.el) {\n throw new Error(\'target is not existed: \' + this.target);\n }\n this.container = this.el;\n }\n },\n onScroll: function onScroll() {\n var scrollTop = this.el.scrollTop;\n this.visible = scrollTop >= this.visibilityHeight;\n },\n handleClick: function handleClick(e) {\n this.scrollToTop();\n this.$emit(\'click\', e);\n },\n scrollToTop: function scrollToTop() {\n var el = this.el;\n var beginTime = Date.now();\n var beginValue = el.scrollTop;\n var rAF = window.requestAnimationFrame || function (func) {\n return setTimeout(func, 16);\n };\n var frameFunc = function frameFunc() {\n var progress = (Date.now() - beginTime) / 500;\n if (progress < 1) {\n el.scrollTop = beginValue * (1 - easeInOutCubic(progress));\n rAF(frameFunc);\n } else {\n el.scrollTop = 0;\n }\n };\n rAF(frameFunc);\n }\n },\n\n beforeDestroy: function beforeDestroy() {\n this.container.removeEventListener(\'scroll\', this.throttledScrollHandler);\n }\n});\n// CONCATENATED MODULE: ./packages/backtop/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_backtop_src_mainvue_type_script_lang_js_ = (backtop_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/backtop/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar backtop_src_main_component = normalizeComponent(\n packages_backtop_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_257dd4a9_render,\n mainvue_type_template_id_257dd4a9_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var backtop_src_main_api; }\nbacktop_src_main_component.options.__file = "packages/backtop/src/main.vue"\n/* harmony default export */ var backtop_src_main = (backtop_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/backtop/index.js\n\n\n/* istanbul ignore next */\nbacktop_src_main.install = function (Vue) {\n Vue.component(backtop_src_main.name, backtop_src_main);\n};\n\n/* harmony default export */ var backtop = (backtop_src_main);\n// CONCATENATED MODULE: ./packages/infinite-scroll/src/main.js\n\n\n\n\nvar getStyleComputedProperty = function getStyleComputedProperty(element, property) {\n if (element === window) {\n element = document.documentElement;\n }\n\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n};\n\nvar entries = function entries(obj) {\n return Object.keys(obj || {}).map(function (key) {\n return [key, obj[key]];\n });\n};\n\nvar getPositionSize = function getPositionSize(el, prop) {\n return el === window || el === document ? document.documentElement[prop] : el[prop];\n};\n\nvar getOffsetHeight = function getOffsetHeight(el) {\n return getPositionSize(el, \'offsetHeight\');\n};\n\nvar getClientHeight = function getClientHeight(el) {\n return getPositionSize(el, \'clientHeight\');\n};\n\nvar scope = \'ElInfiniteScroll\';\nvar attributes = {\n delay: {\n type: Number,\n default: 200\n },\n distance: {\n type: Number,\n default: 0\n },\n disabled: {\n type: Boolean,\n default: false\n },\n immediate: {\n type: Boolean,\n default: true\n }\n};\n\nvar main_getScrollOptions = function getScrollOptions(el, vm) {\n if (!Object(types_["isHtmlElement"])(el)) return {};\n\n return entries(attributes).reduce(function (map, _ref) {\n var key = _ref[0],\n option = _ref[1];\n var type = option.type,\n defaultValue = option.default;\n\n var value = el.getAttribute(\'infinite-scroll-\' + key);\n value = Object(types_["isUndefined"])(vm[value]) ? value : vm[value];\n switch (type) {\n case Number:\n value = Number(value);\n value = Number.isNaN(value) ? defaultValue : value;\n break;\n case Boolean:\n value = Object(types_["isDefined"])(value) ? value === \'false\' ? false : Boolean(value) : defaultValue;\n break;\n default:\n value = type(value);\n }\n map[key] = value;\n return map;\n }, {});\n};\n\nvar getElementTop = function getElementTop(el) {\n return el.getBoundingClientRect().top;\n};\n\nvar main_handleScroll = function handleScroll(cb) {\n var _scope = this[scope],\n el = _scope.el,\n vm = _scope.vm,\n container = _scope.container,\n observer = _scope.observer;\n\n var _getScrollOptions = main_getScrollOptions(el, vm),\n distance = _getScrollOptions.distance,\n disabled = _getScrollOptions.disabled;\n\n if (disabled) return;\n\n var containerInfo = container.getBoundingClientRect();\n if (!containerInfo.width && !containerInfo.height) return;\n\n var shouldTrigger = false;\n\n if (container === el) {\n // be aware of difference between clientHeight & offsetHeight & window.getComputedStyle().height\n var scrollBottom = container.scrollTop + getClientHeight(container);\n shouldTrigger = container.scrollHeight - scrollBottom <= distance;\n } else {\n var heightBelowTop = getOffsetHeight(el) + getElementTop(el) - getElementTop(container);\n var offsetHeight = getOffsetHeight(container);\n var borderBottom = Number.parseFloat(getStyleComputedProperty(container, \'borderBottomWidth\'));\n shouldTrigger = heightBelowTop - offsetHeight + borderBottom <= distance;\n }\n\n if (shouldTrigger && Object(types_["isFunction"])(cb)) {\n cb.call(vm);\n } else if (observer) {\n observer.disconnect();\n this[scope].observer = null;\n }\n};\n\n/* harmony default export */ var infinite_scroll_src_main = ({\n name: \'InfiniteScroll\',\n inserted: function inserted(el, binding, vnode) {\n var cb = binding.value;\n\n var vm = vnode.context;\n // only include vertical scroll\n var container = Object(dom_["getScrollContainer"])(el, true);\n\n var _getScrollOptions2 = main_getScrollOptions(el, vm),\n delay = _getScrollOptions2.delay,\n immediate = _getScrollOptions2.immediate;\n\n var onScroll = debounce_default()(delay, main_handleScroll.bind(el, cb));\n\n el[scope] = { el: el, vm: vm, container: container, onScroll: onScroll };\n\n if (container) {\n container.addEventListener(\'scroll\', onScroll);\n\n if (immediate) {\n var observer = el[scope].observer = new MutationObserver(onScroll);\n observer.observe(container, { childList: true, subtree: true });\n onScroll();\n }\n }\n },\n unbind: function unbind(el) {\n var _el$scope = el[scope],\n container = _el$scope.container,\n onScroll = _el$scope.onScroll;\n\n if (container) {\n container.removeEventListener(\'scroll\', onScroll);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/infinite-scroll/index.js\n\n\n/* istanbul ignore next */\ninfinite_scroll_src_main.install = function (Vue) {\n Vue.directive(infinite_scroll_src_main.name, infinite_scroll_src_main);\n};\n\n/* harmony default export */ var infinite_scroll = (infinite_scroll_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/page-header/src/main.vue?vue&type=template&id=5070954c&\nvar mainvue_type_template_id_5070954c_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("div", { staticClass: "el-page-header" }, [\n _c(\n "div",\n {\n staticClass: "el-page-header__left",\n on: {\n click: function($event) {\n _vm.$emit("back")\n }\n }\n },\n [\n _c("i", { staticClass: "el-icon-back" }),\n _c(\n "div",\n { staticClass: "el-page-header__title" },\n [_vm._t("title", [_vm._v(_vm._s(_vm.title))])],\n 2\n )\n ]\n ),\n _c(\n "div",\n { staticClass: "el-page-header__content" },\n [_vm._t("content", [_vm._v(_vm._s(_vm.content))])],\n 2\n )\n ])\n}\nvar mainvue_type_template_id_5070954c_staticRenderFns = []\nmainvue_type_template_id_5070954c_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/page-header/src/main.vue?vue&type=template&id=5070954c&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/page-header/src/main.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ var page_header_src_mainvue_type_script_lang_js_ = ({\n name: \'ElPageHeader\',\n\n props: {\n title: {\n type: String,\n default: function _default() {\n return Object(lib_locale_["t"])(\'el.pageHeader.title\');\n }\n },\n content: String\n }\n});\n// CONCATENATED MODULE: ./packages/page-header/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_page_header_src_mainvue_type_script_lang_js_ = (page_header_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/page-header/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar page_header_src_main_component = normalizeComponent(\n packages_page_header_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_5070954c_render,\n mainvue_type_template_id_5070954c_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var page_header_src_main_api; }\npage_header_src_main_component.options.__file = "packages/page-header/src/main.vue"\n/* harmony default export */ var page_header_src_main = (page_header_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/page-header/index.js\n\n\n/* istanbul ignore next */\npage_header_src_main.install = function (Vue) {\n Vue.component(page_header_src_main.name, page_header_src_main);\n};\n\n/* harmony default export */ var page_header = (page_header_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-panel.vue?vue&type=template&id=34932346&\nvar cascader_panelvue_type_template_id_34932346_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 class: ["el-cascader-panel", _vm.border && "is-bordered"],\n on: { keydown: _vm.handleKeyDown }\n },\n _vm._l(_vm.menus, function(menu, index) {\n return _c("cascader-menu", {\n key: index,\n ref: "menu",\n refInFor: true,\n attrs: { index: index, nodes: menu }\n })\n }),\n 1\n )\n}\nvar cascader_panelvue_type_template_id_34932346_staticRenderFns = []\ncascader_panelvue_type_template_id_34932346_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue?vue&type=template&id=34932346&\n\n// EXTERNAL MODULE: external "element-ui/lib/radio"\nvar radio_ = __webpack_require__(44);\nvar radio_default = /*#__PURE__*/__webpack_require__.n(radio_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-node.vue?vue&type=script&lang=js&\n\n\n\n\n\n\nvar stopPropagation = function stopPropagation(e) {\n return e.stopPropagation();\n};\n\n/* harmony default export */ var cascader_nodevue_type_script_lang_js_ = ({\n inject: [\'panel\'],\n\n components: {\n ElCheckbox: checkbox_default.a,\n ElRadio: radio_default.a\n },\n\n props: {\n node: {\n required: true\n },\n nodeId: String\n },\n\n computed: {\n config: function config() {\n return this.panel.config;\n },\n isLeaf: function isLeaf() {\n return this.node.isLeaf;\n },\n isDisabled: function isDisabled() {\n return this.node.isDisabled;\n },\n checkedValue: function checkedValue() {\n return this.panel.checkedValue;\n },\n isChecked: function isChecked() {\n return this.node.isSameNode(this.checkedValue);\n },\n inActivePath: function inActivePath() {\n return this.isInPath(this.panel.activePath);\n },\n inCheckedPath: function inCheckedPath() {\n var _this = this;\n\n if (!this.config.checkStrictly) return false;\n\n return this.panel.checkedNodePaths.some(function (checkedPath) {\n return _this.isInPath(checkedPath);\n });\n },\n value: function value() {\n return this.node.getValueByOption();\n }\n },\n\n methods: {\n handleExpand: function handleExpand() {\n var _this2 = this;\n\n var panel = this.panel,\n node = this.node,\n isDisabled = this.isDisabled,\n config = this.config;\n var multiple = config.multiple,\n checkStrictly = config.checkStrictly;\n\n\n if (!checkStrictly && isDisabled || node.loading) return;\n\n if (config.lazy && !node.loaded) {\n panel.lazyLoad(node, function () {\n // do not use cached leaf value here, invoke this.isLeaf to get new value.\n var isLeaf = _this2.isLeaf;\n\n\n if (!isLeaf) _this2.handleExpand();\n if (multiple) {\n // if leaf sync checked state, else clear checked state\n var checked = isLeaf ? node.checked : false;\n _this2.handleMultiCheckChange(checked);\n }\n });\n } else {\n panel.handleExpand(node);\n }\n },\n handleCheckChange: function handleCheckChange() {\n var panel = this.panel,\n value = this.value,\n node = this.node;\n\n panel.handleCheckChange(value);\n panel.handleExpand(node);\n },\n handleMultiCheckChange: function handleMultiCheckChange(checked) {\n this.node.doCheck(checked);\n this.panel.calculateMultiCheckedValue();\n },\n isInPath: function isInPath(pathNodes) {\n var node = this.node;\n\n var selectedPathNode = pathNodes[node.level - 1] || {};\n return selectedPathNode.uid === node.uid;\n },\n renderPrefix: function renderPrefix(h) {\n var isLeaf = this.isLeaf,\n isChecked = this.isChecked,\n config = this.config;\n var checkStrictly = config.checkStrictly,\n multiple = config.multiple;\n\n\n if (multiple) {\n return this.renderCheckbox(h);\n } else if (checkStrictly) {\n return this.renderRadio(h);\n } else if (isLeaf && isChecked) {\n return this.renderCheckIcon(h);\n }\n\n return null;\n },\n renderPostfix: function renderPostfix(h) {\n var node = this.node,\n isLeaf = this.isLeaf;\n\n\n if (node.loading) {\n return this.renderLoadingIcon(h);\n } else if (!isLeaf) {\n return this.renderExpandIcon(h);\n }\n\n return null;\n },\n renderCheckbox: function renderCheckbox(h) {\n var node = this.node,\n config = this.config,\n isDisabled = this.isDisabled;\n\n var events = {\n on: { change: this.handleMultiCheckChange },\n nativeOn: {}\n };\n\n if (config.checkStrictly) {\n // when every node is selectable, click event should not trigger expand event.\n events.nativeOn.click = stopPropagation;\n }\n\n return h(\'el-checkbox\', external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n value: node.checked,\n indeterminate: node.indeterminate,\n disabled: isDisabled\n }\n }, events]));\n },\n renderRadio: function renderRadio(h) {\n var checkedValue = this.checkedValue,\n value = this.value,\n isDisabled = this.isDisabled;\n\n // to keep same reference if value cause radio\'s checked state is calculated by reference comparision;\n\n if (Object(util_["isEqual"])(value, checkedValue)) {\n value = checkedValue;\n }\n\n return h(\n \'el-radio\',\n {\n attrs: {\n value: checkedValue,\n label: value,\n disabled: isDisabled\n },\n on: {\n \'change\': this.handleCheckChange\n },\n nativeOn: {\n \'click\': stopPropagation\n }\n },\n [h(\'span\')]\n );\n },\n renderCheckIcon: function renderCheckIcon(h) {\n return h(\'i\', { \'class\': \'el-icon-check el-cascader-node__prefix\' });\n },\n renderLoadingIcon: function renderLoadingIcon(h) {\n return h(\'i\', { \'class\': \'el-icon-loading el-cascader-node__postfix\' });\n },\n renderExpandIcon: function renderExpandIcon(h) {\n return h(\'i\', { \'class\': \'el-icon-arrow-right el-cascader-node__postfix\' });\n },\n renderContent: function renderContent(h) {\n var panel = this.panel,\n node = this.node;\n\n var render = panel.renderLabelFn;\n var vnode = render ? render({ node: node, data: node.data }) : null;\n\n return h(\n \'span\',\n { \'class\': \'el-cascader-node__label\' },\n [vnode || node.label]\n );\n }\n },\n\n render: function render(h) {\n var _this3 = this;\n\n var inActivePath = this.inActivePath,\n inCheckedPath = this.inCheckedPath,\n isChecked = this.isChecked,\n isLeaf = this.isLeaf,\n isDisabled = this.isDisabled,\n config = this.config,\n nodeId = this.nodeId;\n var expandTrigger = config.expandTrigger,\n checkStrictly = config.checkStrictly,\n multiple = config.multiple;\n\n var disabled = !checkStrictly && isDisabled;\n var events = { on: {} };\n\n if (expandTrigger === \'click\') {\n events.on.click = this.handleExpand;\n } else {\n events.on.mouseenter = function (e) {\n _this3.handleExpand();\n _this3.$emit(\'expand\', e);\n };\n events.on.focus = function (e) {\n _this3.handleExpand();\n _this3.$emit(\'expand\', e);\n };\n }\n if (isLeaf && !isDisabled && !checkStrictly && !multiple) {\n events.on.click = this.handleCheckChange;\n }\n\n return h(\n \'li\',\n external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n role: \'menuitem\',\n id: nodeId,\n \'aria-expanded\': inActivePath,\n tabindex: disabled ? null : -1\n },\n \'class\': {\n \'el-cascader-node\': true,\n \'is-selectable\': checkStrictly,\n \'in-active-path\': inActivePath,\n \'in-checked-path\': inCheckedPath,\n \'is-active\': isChecked,\n \'is-disabled\': disabled\n }\n }, events]),\n [this.renderPrefix(h), this.renderContent(h), this.renderPostfix(h)]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-node.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_nodevue_type_script_lang_js_ = (cascader_nodevue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-node.vue\nvar cascader_node_render, cascader_node_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar cascader_node_component = normalizeComponent(\n src_cascader_nodevue_type_script_lang_js_,\n cascader_node_render,\n cascader_node_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var cascader_node_api; }\ncascader_node_component.options.__file = "packages/cascader-panel/src/cascader-node.vue"\n/* harmony default export */ var cascader_node = (cascader_node_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-menu.vue?vue&type=script&lang=js&\n\n\n\n\n\n\n\n/* harmony default export */ var cascader_menuvue_type_script_lang_js_ = ({\n name: \'ElCascaderMenu\',\n\n mixins: [locale_default.a],\n\n inject: [\'panel\'],\n\n components: {\n ElScrollbar: scrollbar_default.a,\n CascaderNode: cascader_node\n },\n\n props: {\n nodes: {\n type: Array,\n required: true\n },\n index: Number\n },\n\n data: function data() {\n return {\n activeNode: null,\n hoverTimer: null,\n id: Object(util_["generateId"])()\n };\n },\n\n\n computed: {\n isEmpty: function isEmpty() {\n return !this.nodes.length;\n },\n menuId: function menuId() {\n return \'cascader-menu-\' + this.id + \'-\' + this.index;\n }\n },\n\n methods: {\n handleExpand: function handleExpand(e) {\n this.activeNode = e.target;\n },\n handleMouseMove: function handleMouseMove(e) {\n var activeNode = this.activeNode,\n hoverTimer = this.hoverTimer;\n var hoverZone = this.$refs.hoverZone;\n\n\n if (!activeNode || !hoverZone) return;\n\n if (activeNode.contains(e.target)) {\n clearTimeout(hoverTimer);\n\n var _$el$getBoundingClien = this.$el.getBoundingClientRect(),\n left = _$el$getBoundingClien.left;\n\n var startX = e.clientX - left;\n var _$el = this.$el,\n offsetWidth = _$el.offsetWidth,\n offsetHeight = _$el.offsetHeight;\n\n var top = activeNode.offsetTop;\n var bottom = top + activeNode.offsetHeight;\n\n hoverZone.innerHTML = \'\\n <path style="pointer-events: auto;" fill="transparent" d="M\' + startX + \' \' + top + \' L\' + offsetWidth + \' 0 V\' + top + \' Z" />\\n <path style="pointer-events: auto;" fill="transparent" d="M\' + startX + \' \' + bottom + \' L\' + offsetWidth + \' \' + offsetHeight + \' V\' + bottom + \' Z" />\\n \';\n } else if (!hoverTimer) {\n this.hoverTimer = setTimeout(this.clearHoverZone, this.panel.config.hoverThreshold);\n }\n },\n clearHoverZone: function clearHoverZone() {\n var hoverZone = this.$refs.hoverZone;\n\n if (!hoverZone) return;\n hoverZone.innerHTML = \'\';\n },\n renderEmptyText: function renderEmptyText(h) {\n return h(\n \'div\',\n { \'class\': \'el-cascader-menu__empty-text\' },\n [this.t(\'el.cascader.noData\')]\n );\n },\n renderNodeList: function renderNodeList(h) {\n var menuId = this.menuId;\n var isHoverMenu = this.panel.isHoverMenu;\n\n var events = { on: {} };\n\n if (isHoverMenu) {\n events.on.expand = this.handleExpand;\n }\n\n var nodes = this.nodes.map(function (node, index) {\n var hasChildren = node.hasChildren;\n\n return h(\'cascader-node\', external_babel_helper_vue_jsx_merge_props_default()([{\n key: node.uid,\n attrs: { node: node,\n \'node-id\': menuId + \'-\' + index,\n \'aria-haspopup\': hasChildren,\n \'aria-owns\': hasChildren ? menuId : null\n }\n }, events]));\n });\n\n return [].concat(nodes, [isHoverMenu ? h(\'svg\', { ref: \'hoverZone\', \'class\': \'el-cascader-menu__hover-zone\' }) : null]);\n }\n },\n\n render: function render(h) {\n var isEmpty = this.isEmpty,\n menuId = this.menuId;\n\n var events = { nativeOn: {} };\n\n // optimize hover to expand experience (#8010)\n if (this.panel.isHoverMenu) {\n events.nativeOn.mousemove = this.handleMouseMove;\n // events.nativeOn.mouseleave = this.clearHoverZone;\n }\n\n return h(\n \'el-scrollbar\',\n external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n tag: \'ul\',\n role: \'menu\',\n id: menuId,\n\n \'wrap-class\': \'el-cascader-menu__wrap\',\n \'view-class\': {\n \'el-cascader-menu__list\': true,\n \'is-empty\': isEmpty\n }\n },\n \'class\': \'el-cascader-menu\' }, events]),\n [isEmpty ? this.renderEmptyText(h) : this.renderNodeList(h)]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-menu.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_menuvue_type_script_lang_js_ = (cascader_menuvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-menu.vue\nvar cascader_menu_render, cascader_menu_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar cascader_menu_component = normalizeComponent(\n src_cascader_menuvue_type_script_lang_js_,\n cascader_menu_render,\n cascader_menu_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var cascader_menu_api; }\ncascader_menu_component.options.__file = "packages/cascader-panel/src/cascader-menu.vue"\n/* harmony default export */ var cascader_menu = (cascader_menu_component.exports);\n// CONCATENATED MODULE: ./packages/cascader-panel/src/node.js\nvar node_createClass = function () { function 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction src_node_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n\n\n\nvar uid = 0;\n\nvar src_node_Node = function () {\n function Node(data, config, parentNode) {\n src_node_classCallCheck(this, Node);\n\n this.data = data;\n this.config = config;\n this.parent = parentNode || null;\n this.level = !this.parent ? 1 : this.parent.level + 1;\n this.uid = uid++;\n\n this.initState();\n this.initChildren();\n }\n\n Node.prototype.initState = function initState() {\n var _config = this.config,\n valueKey = _config.value,\n labelKey = _config.label;\n\n\n this.value = this.data[valueKey];\n this.label = this.data[labelKey];\n this.pathNodes = this.calculatePathNodes();\n this.path = this.pathNodes.map(function (node) {\n return node.value;\n });\n this.pathLabels = this.pathNodes.map(function (node) {\n return node.label;\n });\n\n // lazy load\n this.loading = false;\n this.loaded = false;\n };\n\n Node.prototype.initChildren = function initChildren() {\n var _this = this;\n\n var config = this.config;\n\n var childrenKey = config.children;\n var childrenData = this.data[childrenKey];\n this.hasChildren = Array.isArray(childrenData);\n this.children = (childrenData || []).map(function (child) {\n return new Node(child, config, _this);\n });\n };\n\n Node.prototype.calculatePathNodes = function calculatePathNodes() {\n var nodes = [this];\n var parent = this.parent;\n\n while (parent) {\n nodes.unshift(parent);\n parent = parent.parent;\n }\n\n return nodes;\n };\n\n Node.prototype.getPath = function getPath() {\n return this.path;\n };\n\n Node.prototype.getValue = function getValue() {\n return this.value;\n };\n\n Node.prototype.getValueByOption = function getValueByOption() {\n return this.config.emitPath ? this.getPath() : this.getValue();\n };\n\n Node.prototype.getText = function getText(allLevels, separator) {\n return allLevels ? this.pathLabels.join(separator) : this.label;\n };\n\n Node.prototype.isSameNode = function isSameNode(checkedValue) {\n var value = this.getValueByOption();\n return this.config.multiple && Array.isArray(checkedValue) ? checkedValue.some(function (val) {\n return Object(util_["isEqual"])(val, value);\n }) : Object(util_["isEqual"])(checkedValue, value);\n };\n\n Node.prototype.broadcast = function broadcast(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 var handlerName = \'onParent\' + Object(util_["capitalize"])(event);\n\n this.children.forEach(function (child) {\n if (child) {\n // bottom up\n child.broadcast.apply(child, [event].concat(args));\n child[handlerName] && child[handlerName].apply(child, args);\n }\n });\n };\n\n Node.prototype.emit = function emit(event) {\n var parent = this.parent;\n\n var handlerName = \'onChild\' + Object(util_["capitalize"])(event);\n if (parent) {\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 parent[handlerName] && parent[handlerName].apply(parent, args);\n parent.emit.apply(parent, [event].concat(args));\n }\n };\n\n Node.prototype.onParentCheck = function onParentCheck(checked) {\n if (!this.isDisabled) {\n this.setCheckState(checked);\n }\n };\n\n Node.prototype.onChildCheck = function onChildCheck() {\n var children = this.children;\n\n var validChildren = children.filter(function (child) {\n return !child.isDisabled;\n });\n var checked = validChildren.length ? validChildren.every(function (child) {\n return child.checked;\n }) : false;\n\n this.setCheckState(checked);\n };\n\n Node.prototype.setCheckState = function setCheckState(checked) {\n var totalNum = this.children.length;\n var checkedNum = this.children.reduce(function (c, p) {\n var num = p.checked ? 1 : p.indeterminate ? 0.5 : 0;\n return c + num;\n }, 0);\n\n this.checked = checked;\n this.indeterminate = checkedNum !== totalNum && checkedNum > 0;\n };\n\n Node.prototype.syncCheckState = function syncCheckState(checkedValue) {\n var value = this.getValueByOption();\n var checked = this.isSameNode(checkedValue, value);\n\n this.doCheck(checked);\n };\n\n Node.prototype.doCheck = function doCheck(checked) {\n if (this.checked !== checked) {\n if (this.config.checkStrictly) {\n this.checked = checked;\n } else {\n // bottom up to unify the calculation of the indeterminate state\n this.broadcast(\'check\', checked);\n this.setCheckState(checked);\n this.emit(\'check\');\n }\n }\n };\n\n node_createClass(Node, [{\n key: \'isDisabled\',\n get: function get() {\n var data = this.data,\n parent = this.parent,\n config = this.config;\n\n var disabledKey = config.disabled;\n var checkStrictly = config.checkStrictly;\n\n return data[disabledKey] || !checkStrictly && parent && parent.isDisabled;\n }\n }, {\n key: \'isLeaf\',\n get: function get() {\n var data = this.data,\n loaded = this.loaded,\n hasChildren = this.hasChildren,\n children = this.children;\n var _config2 = this.config,\n lazy = _config2.lazy,\n leafKey = _config2.leaf;\n\n if (lazy) {\n var isLeaf = Object(shared_["isDef"])(data[leafKey]) ? data[leafKey] : loaded ? !children.length : false;\n this.hasChildren = !isLeaf;\n return isLeaf;\n }\n return !hasChildren;\n }\n }]);\n\n return Node;\n}();\n\n/* harmony default export */ var src_node = (src_node_Node);\n// CONCATENATED MODULE: ./packages/cascader-panel/src/store.js\nfunction store_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n\n\n\nvar flatNodes = function flatNodes(data, leafOnly) {\n return data.reduce(function (res, node) {\n if (node.isLeaf) {\n res.push(node);\n } else {\n !leafOnly && res.push(node);\n res = res.concat(flatNodes(node.children, leafOnly));\n }\n return res;\n }, []);\n};\n\nvar store_Store = function () {\n function Store(data, config) {\n store_classCallCheck(this, Store);\n\n this.config = config;\n this.initNodes(data);\n }\n\n Store.prototype.initNodes = function initNodes(data) {\n var _this = this;\n\n data = Object(util_["coerceTruthyValueToArray"])(data);\n this.nodes = data.map(function (nodeData) {\n return new src_node(nodeData, _this.config);\n });\n this.flattedNodes = this.getFlattedNodes(false, false);\n this.leafNodes = this.getFlattedNodes(true, false);\n };\n\n Store.prototype.appendNode = function appendNode(nodeData, parentNode) {\n var node = new src_node(nodeData, this.config, parentNode);\n var children = parentNode ? parentNode.children : this.nodes;\n\n children.push(node);\n };\n\n Store.prototype.appendNodes = function appendNodes(nodeDataList, parentNode) {\n var _this2 = this;\n\n nodeDataList = Object(util_["coerceTruthyValueToArray"])(nodeDataList);\n nodeDataList.forEach(function (nodeData) {\n return _this2.appendNode(nodeData, parentNode);\n });\n };\n\n Store.prototype.getNodes = function getNodes() {\n return this.nodes;\n };\n\n Store.prototype.getFlattedNodes = function getFlattedNodes(leafOnly) {\n var cached = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var cachedNodes = leafOnly ? this.leafNodes : this.flattedNodes;\n return cached ? cachedNodes : flatNodes(this.nodes, leafOnly);\n };\n\n Store.prototype.getNodeByValue = function getNodeByValue(value) {\n var nodes = this.getFlattedNodes(false, !this.config.lazy).filter(function (node) {\n return Object(util_["valueEquals"])(node.path, value) || node.value === value;\n });\n return nodes && nodes.length ? nodes[0] : null;\n };\n\n return Store;\n}();\n\n/* harmony default export */ var cascader_panel_src_store = (store_Store);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-panel.vue?vue&type=script&lang=js&\nvar cascader_panelvue_type_script_lang_js_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\nvar cascader_panelvue_type_script_lang_js_KeyCode = aria_utils_default.a.keys;\n\nvar DefaultProps = {\n expandTrigger: \'click\', // or hover\n multiple: false,\n checkStrictly: false, // whether all nodes can be selected\n emitPath: true, // wether to emit an array of all levels value in which node is located\n lazy: false,\n lazyLoad: util_["noop"],\n value: \'value\',\n label: \'label\',\n children: \'children\',\n leaf: \'leaf\',\n disabled: \'disabled\',\n hoverThreshold: 500\n};\n\nvar cascader_panelvue_type_script_lang_js_isLeaf = function isLeaf(el) {\n return !el.getAttribute(\'aria-owns\');\n};\n\nvar getSibling = function getSibling(el, distance) {\n var parentNode = el.parentNode;\n\n if (parentNode) {\n var siblings = parentNode.querySelectorAll(\'.el-cascader-node[tabindex="-1"]\');\n var index = Array.prototype.indexOf.call(siblings, el);\n return siblings[index + distance] || null;\n }\n return null;\n};\n\nvar getMenuIndex = function getMenuIndex(el, distance) {\n if (!el) return;\n var pieces = el.id.split(\'-\');\n return Number(pieces[pieces.length - 2]);\n};\n\nvar focusNode = function focusNode(el) {\n if (!el) return;\n el.focus();\n !cascader_panelvue_type_script_lang_js_isLeaf(el) && el.click();\n};\n\nvar checkNode = function checkNode(el) {\n if (!el) return;\n\n var input = el.querySelector(\'input\');\n if (input) {\n input.click();\n } else if (cascader_panelvue_type_script_lang_js_isLeaf(el)) {\n el.click();\n }\n};\n\n/* harmony default export */ var cascader_panelvue_type_script_lang_js_ = ({\n name: \'ElCascaderPanel\',\n\n components: {\n CascaderMenu: cascader_menu\n },\n\n props: {\n value: {},\n options: Array,\n props: Object,\n border: {\n type: Boolean,\n default: true\n },\n renderLabel: Function\n },\n\n provide: function provide() {\n return {\n panel: this\n };\n },\n data: function data() {\n return {\n checkedValue: null,\n checkedNodePaths: [],\n store: [],\n menus: [],\n activePath: [],\n loadCount: 0\n };\n },\n\n\n computed: {\n config: function config() {\n return merge_default()(cascader_panelvue_type_script_lang_js_extends({}, DefaultProps), this.props || {});\n },\n multiple: function multiple() {\n return this.config.multiple;\n },\n checkStrictly: function checkStrictly() {\n return this.config.checkStrictly;\n },\n leafOnly: function leafOnly() {\n return !this.checkStrictly;\n },\n isHoverMenu: function isHoverMenu() {\n return this.config.expandTrigger === \'hover\';\n },\n renderLabelFn: function renderLabelFn() {\n return this.renderLabel || this.$scopedSlots.default;\n }\n },\n\n watch: {\n value: function value() {\n this.syncCheckedValue();\n this.checkStrictly && this.calculateCheckedNodePaths();\n },\n\n options: {\n handler: function handler() {\n this.initStore();\n },\n immediate: true,\n deep: true\n },\n checkedValue: function checkedValue(val) {\n if (!Object(util_["isEqual"])(val, this.value)) {\n this.checkStrictly && this.calculateCheckedNodePaths();\n this.$emit(\'input\', val);\n this.$emit(\'change\', val);\n }\n }\n },\n\n mounted: function mounted() {\n if (!this.isEmptyValue(this.value)) {\n this.syncCheckedValue();\n }\n },\n\n\n methods: {\n initStore: function initStore() {\n var config = this.config,\n options = this.options;\n\n if (config.lazy && Object(util_["isEmpty"])(options)) {\n this.lazyLoad();\n } else {\n this.store = new cascader_panel_src_store(options, config);\n this.menus = [this.store.getNodes()];\n this.syncMenuState();\n }\n },\n syncCheckedValue: function syncCheckedValue() {\n var value = this.value,\n checkedValue = this.checkedValue;\n\n if (!Object(util_["isEqual"])(value, checkedValue)) {\n this.activePath = [];\n this.checkedValue = value;\n this.syncMenuState();\n }\n },\n syncMenuState: function syncMenuState() {\n var multiple = this.multiple,\n checkStrictly = this.checkStrictly;\n\n this.syncActivePath();\n multiple && this.syncMultiCheckState();\n checkStrictly && this.calculateCheckedNodePaths();\n this.$nextTick(this.scrollIntoView);\n },\n syncMultiCheckState: function syncMultiCheckState() {\n var _this = this;\n\n var nodes = this.getFlattedNodes(this.leafOnly);\n\n nodes.forEach(function (node) {\n node.syncCheckState(_this.checkedValue);\n });\n },\n isEmptyValue: function isEmptyValue(val) {\n var multiple = this.multiple,\n config = this.config;\n var emitPath = config.emitPath;\n\n if (multiple || emitPath) {\n return Object(util_["isEmpty"])(val);\n }\n return false;\n },\n syncActivePath: function syncActivePath() {\n var _this2 = this;\n\n var store = this.store,\n multiple = this.multiple,\n activePath = this.activePath,\n checkedValue = this.checkedValue;\n\n\n if (!Object(util_["isEmpty"])(activePath)) {\n var nodes = activePath.map(function (node) {\n return _this2.getNodeByValue(node.getValue());\n });\n this.expandNodes(nodes);\n } else if (!this.isEmptyValue(checkedValue)) {\n var value = multiple ? checkedValue[0] : checkedValue;\n var checkedNode = this.getNodeByValue(value) || {};\n var _nodes = (checkedNode.pathNodes || []).slice(0, -1);\n this.expandNodes(_nodes);\n } else {\n this.activePath = [];\n this.menus = [store.getNodes()];\n }\n },\n expandNodes: function expandNodes(nodes) {\n var _this3 = this;\n\n nodes.forEach(function (node) {\n return _this3.handleExpand(node, true /* silent */);\n });\n },\n calculateCheckedNodePaths: function calculateCheckedNodePaths() {\n var _this4 = this;\n\n var checkedValue = this.checkedValue,\n multiple = this.multiple;\n\n var checkedValues = multiple ? Object(util_["coerceTruthyValueToArray"])(checkedValue) : [checkedValue];\n this.checkedNodePaths = checkedValues.map(function (v) {\n var checkedNode = _this4.getNodeByValue(v);\n return checkedNode ? checkedNode.pathNodes : [];\n });\n },\n handleKeyDown: function handleKeyDown(e) {\n var target = e.target,\n keyCode = e.keyCode;\n\n\n switch (keyCode) {\n case cascader_panelvue_type_script_lang_js_KeyCode.up:\n var prev = getSibling(target, -1);\n focusNode(prev);\n break;\n case cascader_panelvue_type_script_lang_js_KeyCode.down:\n var next = getSibling(target, 1);\n focusNode(next);\n break;\n case cascader_panelvue_type_script_lang_js_KeyCode.left:\n var preMenu = this.$refs.menu[getMenuIndex(target) - 1];\n if (preMenu) {\n var expandedNode = preMenu.$el.querySelector(\'.el-cascader-node[aria-expanded="true"]\');\n focusNode(expandedNode);\n }\n break;\n case cascader_panelvue_type_script_lang_js_KeyCode.right:\n var nextMenu = this.$refs.menu[getMenuIndex(target) + 1];\n if (nextMenu) {\n var firstNode = nextMenu.$el.querySelector(\'.el-cascader-node[tabindex="-1"]\');\n focusNode(firstNode);\n }\n break;\n case cascader_panelvue_type_script_lang_js_KeyCode.enter:\n checkNode(target);\n break;\n case cascader_panelvue_type_script_lang_js_KeyCode.esc:\n case cascader_panelvue_type_script_lang_js_KeyCode.tab:\n this.$emit(\'close\');\n break;\n default:\n return;\n }\n },\n handleExpand: function handleExpand(node, silent) {\n var activePath = this.activePath;\n var level = node.level;\n\n var path = activePath.slice(0, level - 1);\n var menus = this.menus.slice(0, level);\n\n if (!node.isLeaf) {\n path.push(node);\n menus.push(node.children);\n }\n\n this.activePath = path;\n this.menus = menus;\n\n if (!silent) {\n var pathValues = path.map(function (node) {\n return node.getValue();\n });\n var activePathValues = activePath.map(function (node) {\n return node.getValue();\n });\n if (!Object(util_["valueEquals"])(pathValues, activePathValues)) {\n this.$emit(\'active-item-change\', pathValues); // Deprecated\n this.$emit(\'expand-change\', pathValues);\n }\n }\n },\n handleCheckChange: function handleCheckChange(value) {\n this.checkedValue = value;\n },\n lazyLoad: function lazyLoad(node, onFullfiled) {\n var _this5 = this;\n\n var config = this.config;\n\n if (!node) {\n node = node || { root: true, level: 0 };\n this.store = new cascader_panel_src_store([], config);\n this.menus = [this.store.getNodes()];\n }\n node.loading = true;\n var resolve = function resolve(dataList) {\n var parent = node.root ? null : node;\n dataList && dataList.length && _this5.store.appendNodes(dataList, parent);\n node.loading = false;\n node.loaded = true;\n\n // dispose default value on lazy load mode\n if (Array.isArray(_this5.checkedValue)) {\n var nodeValue = _this5.checkedValue[_this5.loadCount++];\n var valueKey = _this5.config.value;\n var leafKey = _this5.config.leaf;\n\n if (Array.isArray(dataList) && dataList.filter(function (item) {\n return item[valueKey] === nodeValue;\n }).length > 0) {\n var checkedNode = _this5.store.getNodeByValue(nodeValue);\n\n if (!checkedNode.data[leafKey]) {\n _this5.lazyLoad(checkedNode, function () {\n _this5.handleExpand(checkedNode);\n });\n }\n\n if (_this5.loadCount === _this5.checkedValue.length) {\n _this5.$parent.computePresentText();\n }\n }\n }\n\n onFullfiled && onFullfiled(dataList);\n };\n config.lazyLoad(node, resolve);\n },\n\n\n /**\n * public methods\n */\n calculateMultiCheckedValue: function calculateMultiCheckedValue() {\n this.checkedValue = this.getCheckedNodes(this.leafOnly).map(function (node) {\n return node.getValueByOption();\n });\n },\n scrollIntoView: function scrollIntoView() {\n if (this.$isServer) return;\n\n var menus = this.$refs.menu || [];\n menus.forEach(function (menu) {\n var menuElement = menu.$el;\n if (menuElement) {\n var container = menuElement.querySelector(\'.el-scrollbar__wrap\');\n var activeNode = menuElement.querySelector(\'.el-cascader-node.is-active\') || menuElement.querySelector(\'.el-cascader-node.in-active-path\');\n scroll_into_view_default()(container, activeNode);\n }\n });\n },\n getNodeByValue: function getNodeByValue(val) {\n return this.store.getNodeByValue(val);\n },\n getFlattedNodes: function getFlattedNodes(leafOnly) {\n var cached = !this.config.lazy;\n return this.store.getFlattedNodes(leafOnly, cached);\n },\n getCheckedNodes: function getCheckedNodes(leafOnly) {\n var checkedValue = this.checkedValue,\n multiple = this.multiple;\n\n if (multiple) {\n var nodes = this.getFlattedNodes(leafOnly);\n return nodes.filter(function (node) {\n return node.checked;\n });\n } else {\n return this.isEmptyValue(checkedValue) ? [] : [this.getNodeByValue(checkedValue)];\n }\n },\n clearCheckedNodes: function clearCheckedNodes() {\n var config = this.config,\n leafOnly = this.leafOnly;\n var multiple = config.multiple,\n emitPath = config.emitPath;\n\n if (multiple) {\n this.getCheckedNodes(leafOnly).filter(function (node) {\n return !node.isDisabled;\n }).forEach(function (node) {\n return node.doCheck(false);\n });\n this.calculateMultiCheckedValue();\n } else {\n this.checkedValue = emitPath ? [] : null;\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_panelvue_type_script_lang_js_ = (cascader_panelvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue\n\n\n\n\n\n/* normalize component */\n\nvar cascader_panel_component = normalizeComponent(\n src_cascader_panelvue_type_script_lang_js_,\n cascader_panelvue_type_template_id_34932346_render,\n cascader_panelvue_type_template_id_34932346_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var cascader_panel_api; }\ncascader_panel_component.options.__file = "packages/cascader-panel/src/cascader-panel.vue"\n/* harmony default export */ var cascader_panel = (cascader_panel_component.exports);\n// CONCATENATED MODULE: ./packages/cascader-panel/index.js\n\n\n/* istanbul ignore next */\ncascader_panel.install = function (Vue) {\n Vue.component(cascader_panel.name, cascader_panel);\n};\n\n/* harmony default export */ var packages_cascader_panel = (cascader_panel);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/avatar/src/main.vue?vue&type=script&lang=js&\n\n/* harmony default export */ var avatar_src_mainvue_type_script_lang_js_ = ({\n name: \'ElAvatar\',\n\n props: {\n size: {\n type: [Number, String],\n validator: function validator(val) {\n if (typeof val === \'string\') {\n return [\'large\', \'medium\', \'small\'].includes(val);\n }\n return typeof val === \'number\';\n }\n },\n shape: {\n type: String,\n default: \'circle\',\n validator: function validator(val) {\n return [\'circle\', \'square\'].includes(val);\n }\n },\n icon: String,\n src: String,\n alt: String,\n srcSet: String,\n error: Function,\n fit: {\n type: String,\n default: \'cover\'\n }\n },\n\n data: function data() {\n return {\n isImageExist: true\n };\n },\n\n\n computed: {\n avatarClass: function avatarClass() {\n var size = this.size,\n icon = this.icon,\n shape = this.shape;\n\n var classList = [\'el-avatar\'];\n\n if (size && typeof size === \'string\') {\n classList.push(\'el-avatar--\' + size);\n }\n\n if (icon) {\n classList.push(\'el-avatar--icon\');\n }\n\n if (shape) {\n classList.push(\'el-avatar--\' + shape);\n }\n\n return classList.join(\' \');\n }\n },\n\n methods: {\n handleError: function handleError() {\n var error = this.error;\n\n var errorFlag = error ? error() : undefined;\n if (errorFlag !== false) {\n this.isImageExist = false;\n }\n },\n renderAvatar: function renderAvatar() {\n var h = this.$createElement;\n var icon = this.icon,\n src = this.src,\n alt = this.alt,\n isImageExist = this.isImageExist,\n srcSet = this.srcSet,\n fit = this.fit;\n\n\n if (isImageExist && src) {\n return h(\'img\', {\n attrs: {\n src: src,\n\n alt: alt,\n srcSet: srcSet\n },\n on: {\n \'error\': this.handleError\n },\n style: { \'object-fit\': fit } });\n }\n\n if (icon) {\n return h(\'i\', { \'class\': icon });\n }\n\n return this.$slots.default;\n }\n },\n\n render: function render() {\n var h = arguments[0];\n var avatarClass = this.avatarClass,\n size = this.size;\n\n\n var sizeStyle = typeof size === \'number\' ? {\n height: size + \'px\',\n width: size + \'px\',\n lineHeight: size + \'px\'\n } : {};\n\n return h(\n \'span\',\n { \'class\': avatarClass, style: sizeStyle },\n [this.renderAvatar()]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/avatar/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_avatar_src_mainvue_type_script_lang_js_ = (avatar_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/avatar/src/main.vue\nvar src_main_render, src_main_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar avatar_src_main_component = normalizeComponent(\n packages_avatar_src_mainvue_type_script_lang_js_,\n src_main_render,\n src_main_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var avatar_src_main_api; }\navatar_src_main_component.options.__file = "packages/avatar/src/main.vue"\n/* harmony default export */ var avatar_src_main = (avatar_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/avatar/index.js\n\n\n/* istanbul ignore next */\navatar_src_main.install = function (Vue) {\n Vue.component(avatar_src_main.name, avatar_src_main);\n};\n\n/* harmony default export */ var avatar = (avatar_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/drawer/src/main.vue?vue&type=template&id=a4885264&\nvar mainvue_type_template_id_a4885264_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "transition",\n {\n attrs: { name: "el-drawer-fade" },\n on: { "after-enter": _vm.afterEnter, "after-leave": _vm.afterLeave }\n },\n [\n _c(\n "div",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-drawer__wrapper",\n attrs: { tabindex: "-1" }\n },\n [\n _c(\n "div",\n {\n staticClass: "el-drawer__container",\n class: _vm.visible && "el-drawer__open",\n attrs: { role: "document", tabindex: "-1" },\n on: {\n click: function($event) {\n if ($event.target !== $event.currentTarget) {\n return null\n }\n return _vm.handleWrapperClick($event)\n }\n }\n },\n [\n _c(\n "div",\n {\n ref: "drawer",\n staticClass: "el-drawer",\n class: [_vm.direction, _vm.customClass],\n style: _vm.isHorizontal\n ? "width: " + _vm.drawerSize\n : "height: " + _vm.drawerSize,\n attrs: {\n "aria-modal": "true",\n "aria-labelledby": "el-drawer__title",\n "aria-label": _vm.title,\n role: "dialog",\n tabindex: "-1"\n }\n },\n [\n _vm.withHeader\n ? _c(\n "header",\n {\n staticClass: "el-drawer__header",\n attrs: { id: "el-drawer__title" }\n },\n [\n _vm._t("title", [\n _c(\n "span",\n { attrs: { role: "heading", title: _vm.title } },\n [_vm._v(_vm._s(_vm.title))]\n )\n ]),\n _vm.showClose\n ? _c(\n "button",\n {\n staticClass: "el-drawer__close-btn",\n attrs: {\n "aria-label":\n "close " + (_vm.title || "drawer"),\n type: "button"\n },\n on: { click: _vm.closeDrawer }\n },\n [\n _c("i", {\n staticClass:\n "el-dialog__close el-icon el-icon-close"\n })\n ]\n )\n : _vm._e()\n ],\n 2\n )\n : _vm._e(),\n _vm.rendered\n ? _c(\n "section",\n { staticClass: "el-drawer__body" },\n [_vm._t("default")],\n 2\n )\n : _vm._e()\n ]\n )\n ]\n )\n ]\n )\n ]\n )\n}\nvar mainvue_type_template_id_a4885264_staticRenderFns = []\nmainvue_type_template_id_a4885264_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/drawer/src/main.vue?vue&type=template&id=a4885264&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/drawer/src/main.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//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ var drawer_src_mainvue_type_script_lang_js_ = ({\n name: \'ElDrawer\',\n mixins: [popup_default.a, emitter_default.a],\n props: {\n appendToBody: {\n type: Boolean,\n default: false\n },\n beforeClose: {\n type: Function\n },\n customClass: {\n type: String,\n default: \'\'\n },\n closeOnPressEscape: {\n type: Boolean,\n default: true\n },\n destroyOnClose: {\n type: Boolean,\n default: false\n },\n modal: {\n type: Boolean,\n default: true\n },\n direction: {\n type: String,\n default: \'rtl\',\n validator: function validator(val) {\n return [\'ltr\', \'rtl\', \'ttb\', \'btt\'].indexOf(val) !== -1;\n }\n },\n modalAppendToBody: {\n type: Boolean,\n default: true\n },\n showClose: {\n type: Boolean,\n default: true\n },\n size: {\n type: [Number, String],\n default: \'30%\'\n },\n title: {\n type: String,\n default: \'\'\n },\n visible: {\n type: Boolean\n },\n wrapperClosable: {\n type: Boolean,\n default: true\n },\n withHeader: {\n type: Boolean,\n default: true\n }\n },\n computed: {\n isHorizontal: function isHorizontal() {\n return this.direction === \'rtl\' || this.direction === \'ltr\';\n },\n drawerSize: function drawerSize() {\n return typeof this.size === \'number\' ? this.size + \'px\' : this.size;\n }\n },\n data: function data() {\n return {\n closed: false,\n prevActiveElement: null\n };\n },\n\n watch: {\n visible: function visible(val) {\n var _this = this;\n\n if (val) {\n this.closed = false;\n this.$emit(\'open\');\n if (this.appendToBody) {\n document.body.appendChild(this.$el);\n }\n this.prevActiveElement = document.activeElement;\n } else {\n if (!this.closed) {\n this.$emit(\'close\');\n if (this.destroyOnClose === true) {\n this.rendered = false;\n }\n }\n this.$nextTick(function () {\n if (_this.prevActiveElement) {\n _this.prevActiveElement.focus();\n }\n });\n }\n }\n },\n methods: {\n afterEnter: function afterEnter() {\n this.$emit(\'opened\');\n },\n afterLeave: function afterLeave() {\n this.$emit(\'closed\');\n },\n hide: function hide(cancel) {\n if (cancel !== false) {\n this.$emit(\'update:visible\', false);\n this.$emit(\'close\');\n if (this.destroyOnClose === true) {\n this.rendered = false;\n }\n this.closed = true;\n }\n },\n handleWrapperClick: function handleWrapperClick() {\n if (this.wrapperClosable) {\n this.closeDrawer();\n }\n },\n closeDrawer: function closeDrawer() {\n if (typeof this.beforeClose === \'function\') {\n this.beforeClose(this.hide);\n } else {\n this.hide();\n }\n },\n handleClose: function handleClose() {\n // This method here will be called by PopupManger, when the `closeOnPressEscape` was set to true\n // pressing `ESC` will call this method, and also close the drawer.\n // This method also calls `beforeClose` if there was one.\n this.closeDrawer();\n }\n },\n mounted: function mounted() {\n if (this.visible) {\n this.rendered = true;\n this.open();\n if (this.appendToBody) {\n document.body.appendChild(this.$el);\n }\n }\n },\n destroyed: function destroyed() {\n // if appendToBody is true, remove DOM node after destroy\n if (this.appendToBody && this.$el && this.$el.parentNode) {\n this.$el.parentNode.removeChild(this.$el);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/drawer/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_drawer_src_mainvue_type_script_lang_js_ = (drawer_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/drawer/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar drawer_src_main_component = normalizeComponent(\n packages_drawer_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_a4885264_render,\n mainvue_type_template_id_a4885264_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var drawer_src_main_api; }\ndrawer_src_main_component.options.__file = "packages/drawer/src/main.vue"\n/* harmony default export */ var drawer_src_main = (drawer_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/drawer/index.js\n\n\n/* istanbul ignore next */\ndrawer_src_main.install = function (Vue) {\n Vue.component(drawer_src_main.name, drawer_src_main);\n};\n\n/* harmony default export */ var drawer = (drawer_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/statistic/src/main.vue?vue&type=template&id=76339aa7&\nvar mainvue_type_template_id_76339aa7_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("div", { staticClass: "el-statistic" }, [\n _vm.title || _vm.$slots.title\n ? _c(\n "div",\n { staticClass: "head" },\n [\n _vm._t("title", [\n _c("span", { staticClass: "title" }, [\n _vm._v("\\n " + _vm._s(_vm.title) + "\\n ")\n ])\n ])\n ],\n 2\n )\n : _vm._e(),\n _c("div", { staticClass: "con" }, [\n _vm.prefix || _vm.$slots.prefix\n ? _c(\n "span",\n { staticClass: "prefix" },\n [\n _vm._t("prefix", [\n _vm._v("\\n " + _vm._s(_vm.prefix) + "\\n ")\n ])\n ],\n 2\n )\n : _vm._e(),\n _c(\n "span",\n { staticClass: "number", style: _vm.valueStyle },\n [_vm._t("formatter", [_vm._v(" " + _vm._s(_vm.disposeValue))])],\n 2\n ),\n _vm.suffix || _vm.$slots.suffix\n ? _c(\n "span",\n { staticClass: "suffix" },\n [\n _vm._t("suffix", [\n _vm._v("\\n " + _vm._s(_vm.suffix) + "\\n ")\n ])\n ],\n 2\n )\n : _vm._e()\n ])\n ])\n}\nvar mainvue_type_template_id_76339aa7_staticRenderFns = []\nmainvue_type_template_id_76339aa7_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/statistic/src/main.vue?vue&type=template&id=76339aa7&\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/lodash"\nvar lodash_ = __webpack_require__(28);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/statistic/src/main.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/* harmony default export */ var statistic_src_mainvue_type_script_lang_js_ = ({\n name: \'ElStatistic\',\n data: function data() {\n return {\n disposeValue: \'\',\n timeTask: null,\n REFRESH_INTERVAL: 1000 / 30\n };\n },\n\n props: {\n decimalSeparator: {\n type: String,\n default: \'.\'\n },\n groupSeparator: {\n type: String,\n default: \'\'\n },\n precision: {\n type: Number,\n default: null\n },\n value: {\n type: [String, Number],\n default: \'\'\n },\n prefix: {\n type: String,\n default: \'\'\n },\n suffix: {\n type: String,\n default: \'\'\n },\n title: {\n type: [String, Number],\n default: \'\'\n },\n timeIndices: {\n type: Boolean,\n default: false\n },\n valueStyle: {\n type: Object,\n default: function _default() {\n return {};\n }\n },\n format: {\n type: String,\n default: \'HH:mm:ss:SSS\'\n },\n rate: {\n type: Number,\n default: 1000\n }\n },\n created: function created() {\n this.branch();\n },\n\n watch: {\n value: function value() {\n this.branch();\n }\n },\n methods: {\n branch: function branch() {\n var timeIndices = this.timeIndices,\n countDown = this.countDown,\n dispose = this.dispose;\n\n timeIndices ? countDown() : dispose();\n },\n magnification: function magnification(num) {\n var mulriple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n var groupSeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \',\';\n\n // magnification factor\n var level = String(mulriple).length - 1;\n var reg = new RegExp(\'\\\\d{1,\' + level + \'}(?=(\\\\d{\' + level + \'})+$)\', \'g\');\n var result = String(num).replace(reg, \'$&,\').split(\',\').join(groupSeparator);\n return result;\n },\n dispose: function dispose() {\n var value = this.value,\n precision = this.precision,\n groupSeparator = this.groupSeparator,\n rate = this.rate;\n\n if (!Object(lodash_["isNumber"])(value)) return false;\n\n var _String$split = String(value).split(\'.\'),\n integer = _String$split[0],\n decimal = _String$split[1];\n\n if (precision) {\n decimal = \'\' + (decimal || \'\') + 1 .toFixed(precision).replace(\'.\', \'\').slice(1);\n decimal = decimal.slice(0, precision);\n }\n var result = 0;\n // 1000 multiplying power\n if (groupSeparator) {\n integer = this.magnification(integer, rate, groupSeparator);\n }\n\n result = [integer, decimal].join(decimal ? this.decimalSeparator : \'\');\n this.disposeValue = result;\n return result;\n },\n diffDate: function diffDate(minuend, subtrahend) {\n return Math.max(minuend - subtrahend, 0);\n },\n suspend: function suspend(isStop) {\n if (isStop) {\n if (this.timeTask) {\n clearInterval(this.timeTask);\n this.timeTask = null;\n }\n } else {\n this.branch();\n }\n return this.disposeValue;\n },\n\n formatTimeStr: function formatTimeStr(time) {\n var format = this.format;\n\n var escapeRegex = /\\[[^\\]]*]/g;\n var keepList = (format.match(escapeRegex) || []).map(function (str) {\n return str.slice(1, -1);\n });\n var timeUnits = [[\'Y\', 1000 * 60 * 60 * 24 * 365], // years\n [\'M\', 1000 * 60 * 60 * 24 * 30], // months\n [\'D\', 1000 * 60 * 60 * 24], // days\n [\'H\', 1000 * 60 * 60], // hours\n [\'m\', 1000 * 60], // minutes\n [\'s\', 1000], // seconds\n [\'S\', 1] // million seconds\n ];\n var formatText = Object(lodash_["reduce"])(timeUnits, function (con, item) {\n var name = item[0];\n return con.replace(new RegExp(name + \'+\', \'g\'), function (match) {\n var sum = Object(lodash_["chain"])(time).divide(item[1]).floor(0).value();\n time -= Object(lodash_["multiply"])(sum, item[1]);\n return Object(lodash_["padStart"])(String(sum), String(match).length, 0);\n });\n }, format);\n var index = 0;\n return formatText.replace(escapeRegex, function () {\n var match = keepList[index];\n index += 1;\n return match;\n });\n },\n stopTime: function stopTime(time) {\n var result = true; // stop\n if (time) {\n this.$emit(\'change\', time);\n result = false;\n } else {\n result = true;\n this.suspend(true);\n this.$emit(\'finish\', true);\n }\n return result;\n },\n countDown: function countDown() {\n var REFRESH_INTERVAL = this.REFRESH_INTERVAL,\n timeTask = this.timeTask,\n diffDate = this.diffDate,\n formatTimeStr = this.formatTimeStr,\n stopTime = this.stopTime,\n suspend = this.suspend;\n\n if (timeTask) return;\n var than = this;\n this.timeTask = setInterval(function () {\n var diffTiem = diffDate(than.value, Date.now());\n than.disposeValue = formatTimeStr(diffTiem);\n stopTime(diffTiem);\n }, REFRESH_INTERVAL);\n this.$once(\'hook:beforeDestroy\', function () {\n suspend(true);\n });\n }\n }\n});\n// CONCATENATED MODULE: ./packages/statistic/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_statistic_src_mainvue_type_script_lang_js_ = (statistic_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/statistic/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar statistic_src_main_component = normalizeComponent(\n packages_statistic_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_76339aa7_render,\n mainvue_type_template_id_76339aa7_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var statistic_src_main_api; }\nstatistic_src_main_component.options.__file = "packages/statistic/src/main.vue"\n/* harmony default export */ var statistic_src_main = (statistic_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/statistic/index.js\n\n\n/* istanbul ignore next */\nstatistic_src_main.install = function (Vue) {\n Vue.component(statistic_src_main.name, statistic_src_main);\n};\n\n/* harmony default export */ var statistic = (statistic_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/popconfirm/src/main.vue?vue&type=template&id=048de730&\nvar mainvue_type_template_id_048de730_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "el-popover",\n _vm._b(\n {\n attrs: { trigger: "click" },\n model: {\n value: _vm.visible,\n callback: function($$v) {\n _vm.visible = $$v\n },\n expression: "visible"\n }\n },\n "el-popover",\n _vm.$attrs,\n false\n ),\n [\n _c("div", { staticClass: "el-popconfirm" }, [\n _c("p", { staticClass: "el-popconfirm__main" }, [\n !_vm.hideIcon\n ? _c("i", {\n staticClass: "el-popconfirm__icon",\n class: _vm.icon,\n style: { color: _vm.iconColor }\n })\n : _vm._e(),\n _vm._v("\\n " + _vm._s(_vm.title) + "\\n ")\n ]),\n _c(\n "div",\n { staticClass: "el-popconfirm__action" },\n [\n _c(\n "el-button",\n {\n attrs: { size: "mini", type: _vm.cancelButtonType },\n on: { click: _vm.cancel }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.displayCancelButtonText) +\n "\\n "\n )\n ]\n ),\n _c(\n "el-button",\n {\n attrs: { size: "mini", type: _vm.confirmButtonType },\n on: { click: _vm.confirm }\n },\n [\n _vm._v(\n "\\n " +\n _vm._s(_vm.displayConfirmButtonText) +\n "\\n "\n )\n ]\n )\n ],\n 1\n )\n ]),\n _vm._t("reference", null, { slot: "reference" })\n ],\n 2\n )\n}\nvar mainvue_type_template_id_048de730_staticRenderFns = []\nmainvue_type_template_id_048de730_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/popconfirm/src/main.vue?vue&type=template&id=048de730&\n\n// EXTERNAL MODULE: external "element-ui/lib/popover"\nvar popover_ = __webpack_require__(45);\nvar popover_default = /*#__PURE__*/__webpack_require__.n(popover_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/popconfirm/src/main.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 */ var popconfirm_src_mainvue_type_script_lang_js_ = ({\n name: \'ElPopconfirm\',\n props: {\n title: {\n type: String\n },\n confirmButtonText: {\n type: String\n },\n cancelButtonText: {\n type: String\n },\n confirmButtonType: {\n type: String,\n default: \'primary\'\n },\n cancelButtonType: {\n type: String,\n default: \'text\'\n },\n icon: {\n type: String,\n default: \'el-icon-question\'\n },\n iconColor: {\n type: String,\n default: \'#f90\'\n },\n hideIcon: {\n type: Boolean,\n default: false\n }\n },\n components: {\n ElPopover: popover_default.a,\n ElButton: button_default.a\n },\n data: function data() {\n return {\n visible: false\n };\n },\n\n computed: {\n displayConfirmButtonText: function displayConfirmButtonText() {\n return this.confirmButtonText || Object(lib_locale_["t"])(\'el.popconfirm.confirmButtonText\');\n },\n displayCancelButtonText: function displayCancelButtonText() {\n return this.cancelButtonText || Object(lib_locale_["t"])(\'el.popconfirm.cancelButtonText\');\n }\n },\n methods: {\n confirm: function confirm() {\n this.visible = false;\n this.$emit(\'confirm\');\n },\n cancel: function cancel() {\n this.visible = false;\n this.$emit(\'cancel\');\n }\n }\n});\n// CONCATENATED MODULE: ./packages/popconfirm/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_popconfirm_src_mainvue_type_script_lang_js_ = (popconfirm_src_mainvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/popconfirm/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar popconfirm_src_main_component = normalizeComponent(\n packages_popconfirm_src_mainvue_type_script_lang_js_,\n mainvue_type_template_id_048de730_render,\n mainvue_type_template_id_048de730_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var popconfirm_src_main_api; }\npopconfirm_src_main_component.options.__file = "packages/popconfirm/src/main.vue"\n/* harmony default export */ var popconfirm_src_main = (popconfirm_src_main_component.exports);\n// CONCATENATED MODULE: ./packages/popconfirm/index.js\n\n\n/* istanbul ignore next */\npopconfirm_src_main.install = function (Vue) {\n Vue.component(popconfirm_src_main.name, popconfirm_src_main);\n};\n\n/* harmony default export */ var popconfirm = (popconfirm_src_main);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/skeleton/src/index.vue?vue&type=template&id=7f659269&\nvar srcvue_type_template_id_7f659269_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 _vm.uiLoading\n ? [\n _c(\n "div",\n _vm._b(\n { class: ["el-skeleton", _vm.animated ? "is-animated" : ""] },\n "div",\n _vm.$attrs,\n false\n ),\n [\n _vm._l(_vm.count, function(i) {\n return [\n _vm.loading\n ? _vm._t(\n "template",\n _vm._l(_vm.rows, function(item) {\n return _c("el-skeleton-item", {\n key: i + "-" + item,\n class: {\n "el-skeleton__paragraph": item !== 1,\n "is-first": item === 1,\n "is-last": item === _vm.rows && _vm.rows > 1\n },\n attrs: { variant: "p" }\n })\n })\n )\n : _vm._e()\n ]\n })\n ],\n 2\n )\n ]\n : [_vm._t("default", null, null, _vm.$attrs)]\n ],\n 2\n )\n}\nvar srcvue_type_template_id_7f659269_staticRenderFns = []\nsrcvue_type_template_id_7f659269_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/skeleton/src/index.vue?vue&type=template&id=7f659269&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/skeleton/src/index.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/* harmony default export */ var skeleton_srcvue_type_script_lang_js_ = ({\n name: \'ElSkeleton\',\n props: {\n animated: {\n type: Boolean,\n default: false\n },\n count: {\n type: Number,\n default: 1\n },\n rows: {\n type: Number,\n default: 4\n },\n loading: {\n type: Boolean,\n default: true\n },\n throttle: {\n type: Number,\n default: 0\n }\n },\n watch: {\n loading: {\n handler: function handler(loading) {\n var _this = this;\n\n if (this.throttle <= 0) {\n this.uiLoading = loading;\n return;\n }\n if (loading) {\n clearTimeout(this.timeoutHandle);\n this.timeoutHandle = setTimeout(function () {\n _this.uiLoading = _this.loading;\n }, this.throttle);\n } else {\n this.uiLoading = loading;\n }\n },\n\n immediate: true\n }\n },\n data: function data() {\n return {\n uiLoading: this.throttle <= 0 ? this.loading : false\n };\n }\n});\n// CONCATENATED MODULE: ./packages/skeleton/src/index.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_skeleton_srcvue_type_script_lang_js_ = (skeleton_srcvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/skeleton/src/index.vue\n\n\n\n\n\n/* normalize component */\n\nvar skeleton_src_component = normalizeComponent(\n packages_skeleton_srcvue_type_script_lang_js_,\n srcvue_type_template_id_7f659269_render,\n srcvue_type_template_id_7f659269_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var skeleton_src_api; }\nskeleton_src_component.options.__file = "packages/skeleton/src/index.vue"\n/* harmony default export */ var skeleton_src = (skeleton_src_component.exports);\n// CONCATENATED MODULE: ./packages/skeleton/index.js\n\n\n/* istanbul ignore next */\nskeleton_src.install = function (Vue) {\n Vue.component(skeleton_src.name, skeleton_src);\n};\n\n/* harmony default export */ var skeleton = (skeleton_src);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/skeleton/src/item.vue?vue&type=template&id=4bc8804c&\nvar itemvue_type_template_id_4bc8804c_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "div",\n { class: ["el-skeleton__item", "el-skeleton__" + _vm.variant] },\n [_vm.variant === "image" ? _c("img-placeholder") : _vm._e()],\n 1\n )\n}\nvar itemvue_type_template_id_4bc8804c_staticRenderFns = []\nitemvue_type_template_id_4bc8804c_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/skeleton/src/item.vue?vue&type=template&id=4bc8804c&\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/skeleton/src/img-placeholder.vue?vue&type=template&id=1b2cb5c0&\nvar img_placeholdervue_type_template_id_1b2cb5c0_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "svg",\n {\n attrs: { viewBox: "0 0 1024 1024", xmlns: "http://www.w3.org/2000/svg" }\n },\n [\n _c("path", {\n attrs: {\n d:\n "M64 896V128h896v768H64z m64-128l192-192 116.352 116.352L640 448l256 307.2V192H128v576z m224-480a96 96 0 1 1-0.064 192.064A96 96 0 0 1 352 288z"\n }\n })\n ]\n )\n}\nvar img_placeholdervue_type_template_id_1b2cb5c0_staticRenderFns = []\nimg_placeholdervue_type_template_id_1b2cb5c0_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/skeleton/src/img-placeholder.vue?vue&type=template&id=1b2cb5c0&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/skeleton/src/img-placeholder.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var img_placeholdervue_type_script_lang_js_ = ({\n name: \'ImgPlaceholder\'\n});\n// CONCATENATED MODULE: ./packages/skeleton/src/img-placeholder.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_img_placeholdervue_type_script_lang_js_ = (img_placeholdervue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/skeleton/src/img-placeholder.vue\n\n\n\n\n\n/* normalize component */\n\nvar img_placeholder_component = normalizeComponent(\n src_img_placeholdervue_type_script_lang_js_,\n img_placeholdervue_type_template_id_1b2cb5c0_render,\n img_placeholdervue_type_template_id_1b2cb5c0_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var img_placeholder_api; }\nimg_placeholder_component.options.__file = "packages/skeleton/src/img-placeholder.vue"\n/* harmony default export */ var img_placeholder = (img_placeholder_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/skeleton/src/item.vue?vue&type=script&lang=js&\nvar _components;\n\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ var skeleton_src_itemvue_type_script_lang_js_ = ({\n name: \'ElSkeletonItem\',\n props: {\n variant: {\n type: String,\n default: \'text\'\n }\n },\n components: (_components = {}, _components[img_placeholder.name] = img_placeholder, _components)\n});\n// CONCATENATED MODULE: ./packages/skeleton/src/item.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_skeleton_src_itemvue_type_script_lang_js_ = (skeleton_src_itemvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/skeleton/src/item.vue\n\n\n\n\n\n/* normalize component */\n\nvar skeleton_src_item_component = normalizeComponent(\n packages_skeleton_src_itemvue_type_script_lang_js_,\n itemvue_type_template_id_4bc8804c_render,\n itemvue_type_template_id_4bc8804c_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var skeleton_src_item_api; }\nskeleton_src_item_component.options.__file = "packages/skeleton/src/item.vue"\n/* harmony default export */ var skeleton_src_item = (skeleton_src_item_component.exports);\n// CONCATENATED MODULE: ./packages/skeleton-item/index.js\n\n\n/* istanbul ignore next */\nskeleton_src_item.install = function (Vue) {\n Vue.component(skeleton_src_item.name, skeleton_src_item);\n};\n\n/* harmony default export */ var skeleton_item = (skeleton_src_item);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/empty/src/index.vue?vue&type=template&id=347ced91&\nvar srcvue_type_template_id_347ced91_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("div", { staticClass: "el-empty" }, [\n _c(\n "div",\n { staticClass: "el-empty__image", style: _vm.imageStyle },\n [\n _vm.image\n ? _c("img", {\n attrs: { src: _vm.image, ondragstart: "return false" }\n })\n : _vm._t("image", [_c("img-empty")])\n ],\n 2\n ),\n _c(\n "div",\n { staticClass: "el-empty__description" },\n [\n _vm.$slots.description\n ? _vm._t("description")\n : _c("p", [_vm._v(_vm._s(_vm.emptyDescription))])\n ],\n 2\n ),\n _vm.$slots.default\n ? _c("div", { staticClass: "el-empty__bottom" }, [_vm._t("default")], 2)\n : _vm._e()\n ])\n}\nvar srcvue_type_template_id_347ced91_staticRenderFns = []\nsrcvue_type_template_id_347ced91_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/empty/src/index.vue?vue&type=template&id=347ced91&\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/empty/src/img-empty.vue?vue&type=template&id=42918b82&\nvar img_emptyvue_type_template_id_42918b82_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "svg",\n {\n attrs: {\n viewBox: "0 0 79 86",\n version: "1.1",\n xmlns: "http://www.w3.org/2000/svg",\n "xmlns:xlink": "http://www.w3.org/1999/xlink"\n }\n },\n [\n _c(\n "defs",\n [\n _c(\n "linearGradient",\n {\n attrs: {\n id: "linearGradient-1-" + _vm.id,\n x1: "38.8503086%",\n y1: "0%",\n x2: "61.1496914%",\n y2: "100%"\n }\n },\n [\n _c("stop", { attrs: { "stop-color": "#FCFCFD", offset: "0%" } }),\n _c("stop", { attrs: { "stop-color": "#EEEFF3", offset: "100%" } })\n ],\n 1\n ),\n _c(\n "linearGradient",\n {\n attrs: {\n id: "linearGradient-2-" + _vm.id,\n x1: "0%",\n y1: "9.5%",\n x2: "100%",\n y2: "90.5%"\n }\n },\n [\n _c("stop", { attrs: { "stop-color": "#FCFCFD", offset: "0%" } }),\n _c("stop", { attrs: { "stop-color": "#E9EBEF", offset: "100%" } })\n ],\n 1\n ),\n _c("rect", {\n attrs: {\n id: "path-3-" + _vm.id,\n x: "0",\n y: "0",\n width: "17",\n height: "36"\n }\n })\n ],\n 1\n ),\n _c(\n "g",\n {\n attrs: {\n id: "Illustrations",\n stroke: "none",\n "stroke-width": "1",\n fill: "none",\n "fill-rule": "evenodd"\n }\n },\n [\n _c(\n "g",\n {\n attrs: {\n id: "B-type",\n transform: "translate(-1268.000000, -535.000000)"\n }\n },\n [\n _c(\n "g",\n {\n attrs: {\n id: "Group-2",\n transform: "translate(1268.000000, 535.000000)"\n }\n },\n [\n _c("path", {\n attrs: {\n id: "Oval-Copy-2",\n d:\n "M39.5,86 C61.3152476,86 79,83.9106622 79,81.3333333 C79,78.7560045 57.3152476,78 35.5,78 C13.6847524,78 0,78.7560045 0,81.3333333 C0,83.9106622 17.6847524,86 39.5,86 Z",\n fill: "#F7F8FC"\n }\n }),\n _c("polygon", {\n attrs: {\n id: "Rectangle-Copy-14",\n fill: "#E5E7E9",\n transform:\n "translate(27.500000, 51.500000) scale(1, -1) translate(-27.500000, -51.500000) ",\n points: "13 58 53 58 42 45 2 45"\n }\n }),\n _c(\n "g",\n {\n attrs: {\n id: "Group-Copy",\n transform:\n "translate(34.500000, 31.500000) scale(-1, 1) rotate(-25.000000) translate(-34.500000, -31.500000) translate(7.000000, 10.000000)"\n }\n },\n [\n _c("polygon", {\n attrs: {\n id: "Rectangle-Copy-10",\n fill: "#E5E7E9",\n transform:\n "translate(11.500000, 5.000000) scale(1, -1) translate(-11.500000, -5.000000) ",\n points: "2.84078316e-14 3 18 3 23 7 5 7"\n }\n }),\n _c("polygon", {\n attrs: {\n id: "Rectangle-Copy-11",\n fill: "#EDEEF2",\n points:\n "-3.69149156e-15 7 38 7 38 43 -3.69149156e-15 43"\n }\n }),\n _c("rect", {\n attrs: {\n id: "Rectangle-Copy-12",\n fill: "url(#linearGradient-1-" + _vm.id + ")",\n transform:\n "translate(46.500000, 25.000000) scale(-1, 1) translate(-46.500000, -25.000000) ",\n x: "38",\n y: "7",\n width: "17",\n height: "36"\n }\n }),\n _c("polygon", {\n attrs: {\n id: "Rectangle-Copy-13",\n fill: "#F8F9FB",\n transform:\n "translate(39.500000, 3.500000) scale(-1, 1) translate(-39.500000, -3.500000) ",\n points:\n "24 7 41 7 55 -3.63806207e-12 38 -3.63806207e-12"\n }\n })\n ]\n ),\n _c("rect", {\n attrs: {\n id: "Rectangle-Copy-15",\n fill: "url(#linearGradient-2-" + _vm.id + ")",\n x: "13",\n y: "45",\n width: "40",\n height: "36"\n }\n }),\n _c(\n "g",\n {\n attrs: {\n id: "Rectangle-Copy-17",\n transform: "translate(53.000000, 45.000000)"\n }\n },\n [\n _c(\n "mask",\n { attrs: { id: "mask-4-" + _vm.id, fill: "white" } },\n [\n _c("use", {\n attrs: { "xlink:href": "#path-3-" + _vm.id }\n })\n ]\n ),\n _c("use", {\n attrs: {\n id: "Mask",\n fill: "#E0E3E9",\n transform:\n "translate(8.500000, 18.000000) scale(-1, 1) translate(-8.500000, -18.000000) ",\n "xlink:href": "#path-3-" + _vm.id\n }\n }),\n _c("polygon", {\n attrs: {\n id: "Rectangle-Copy",\n fill: "#D5D7DE",\n mask: "url(#mask-4-" + _vm.id + ")",\n transform:\n "translate(12.000000, 9.000000) scale(-1, 1) translate(-12.000000, -9.000000) ",\n points: "7 0 24 0 20 18 -1.70530257e-13 16"\n }\n })\n ]\n ),\n _c("polygon", {\n attrs: {\n id: "Rectangle-Copy-18",\n fill: "#F8F9FB",\n transform:\n "translate(66.000000, 51.500000) scale(-1, 1) translate(-66.000000, -51.500000) ",\n points: "62 45 79 45 70 58 53 58"\n }\n })\n ]\n )\n ]\n )\n ]\n )\n ]\n )\n}\nvar img_emptyvue_type_template_id_42918b82_staticRenderFns = []\nimg_emptyvue_type_template_id_42918b82_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/empty/src/img-empty.vue?vue&type=template&id=42918b82&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/empty/src/img-empty.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\nvar img_emptyvue_type_script_lang_js_id = 0;\n/* harmony default export */ var img_emptyvue_type_script_lang_js_ = ({\n name: \'ImgEmpty\',\n data: function data() {\n return {\n id: ++img_emptyvue_type_script_lang_js_id\n };\n }\n});\n// CONCATENATED MODULE: ./packages/empty/src/img-empty.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_img_emptyvue_type_script_lang_js_ = (img_emptyvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/empty/src/img-empty.vue\n\n\n\n\n\n/* normalize component */\n\nvar img_empty_component = normalizeComponent(\n src_img_emptyvue_type_script_lang_js_,\n img_emptyvue_type_template_id_42918b82_render,\n img_emptyvue_type_template_id_42918b82_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var img_empty_api; }\nimg_empty_component.options.__file = "packages/empty/src/img-empty.vue"\n/* harmony default export */ var img_empty = (img_empty_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/empty/src/index.vue?vue&type=script&lang=js&\nvar srcvue_type_script_lang_js_components;\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 */ var empty_srcvue_type_script_lang_js_ = ({\n name: \'ElEmpty\',\n components: (srcvue_type_script_lang_js_components = {}, srcvue_type_script_lang_js_components[img_empty.name] = img_empty, srcvue_type_script_lang_js_components),\n props: {\n image: {\n type: String,\n default: \'\'\n },\n imageSize: Number,\n description: {\n type: String,\n default: \'\'\n }\n },\n computed: {\n emptyDescription: function emptyDescription() {\n return this.description || Object(lib_locale_["t"])(\'el.empty.description\');\n },\n imageStyle: function imageStyle() {\n return {\n width: this.imageSize ? this.imageSize + \'px\' : \'\'\n };\n }\n }\n});\n// CONCATENATED MODULE: ./packages/empty/src/index.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_empty_srcvue_type_script_lang_js_ = (empty_srcvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/empty/src/index.vue\n\n\n\n\n\n/* normalize component */\n\nvar empty_src_component = normalizeComponent(\n packages_empty_srcvue_type_script_lang_js_,\n srcvue_type_template_id_347ced91_render,\n srcvue_type_template_id_347ced91_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var empty_src_api; }\nempty_src_component.options.__file = "packages/empty/src/index.vue"\n/* harmony default export */ var empty_src = (empty_src_component.exports);\n// CONCATENATED MODULE: ./packages/empty/index.js\n\n\nempty_src.install = function (Vue) {\n Vue.component(empty_src.name, empty_src);\n};\n\n/* harmony default export */ var empty = (empty_src);\n// CONCATENATED MODULE: ./packages/descriptions/src/descriptions-row.js\nvar descriptions_row_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n/* harmony default export */ var descriptions_row = ({\n name: \'ElDescriptionsRow\',\n props: {\n row: {\n type: Array\n }\n },\n inject: [\'elDescriptions\'],\n render: function render(h) {\n var elDescriptions = this.elDescriptions;\n\n var row = (this.row || []).map(function (item) {\n return descriptions_row_extends({}, item, {\n label: item.slots.label || item.props.label\n }, [\'labelClassName\', \'contentClassName\', \'labelStyle\', \'contentStyle\'].reduce(function (res, key) {\n res[key] = item.props[key] || elDescriptions[key];\n return res;\n }, {}));\n });\n if (elDescriptions.direction === \'vertical\') {\n return h(\'tbody\', [h(\n \'tr\',\n { \'class\': \'el-descriptions-row\' },\n [row.map(function (item) {\n var _ref;\n\n return h(\n \'th\',\n {\n \'class\': (_ref = {\n \'el-descriptions-item__cell\': true,\n \'el-descriptions-item__label\': true,\n \'has-colon\': elDescriptions.border ? false : elDescriptions.colon,\n \'is-bordered-label\': elDescriptions.border\n }, _ref[item.labelClassName] = true, _ref),\n style: item.labelStyle,\n attrs: { colSpan: item.props.span\n }\n },\n [item.label]\n );\n })]\n ), h(\n \'tr\',\n { \'class\': \'el-descriptions-row\' },\n [row.map(function (item) {\n return h(\n \'td\',\n {\n \'class\': [\'el-descriptions-item__cell\', \'el-descriptions-item__content\', item.contentClassName],\n style: item.contentStyle,\n attrs: { colSpan: item.props.span\n }\n },\n [item.slots.default]\n );\n })]\n )]);\n }\n if (elDescriptions.border) {\n return h(\'tbody\', [h(\n \'tr\',\n { \'class\': \'el-descriptions-row\' },\n [row.map(function (item) {\n var _ref2;\n\n return [h(\n \'th\',\n {\n \'class\': (_ref2 = {\n \'el-descriptions-item__cell\': true,\n \'el-descriptions-item__label\': true,\n \'is-bordered-label\': elDescriptions.border\n }, _ref2[item.labelClassName] = true, _ref2),\n style: item.labelStyle,\n attrs: { colSpan: \'1\'\n }\n },\n [item.label]\n ), h(\n \'td\',\n {\n \'class\': [\'el-descriptions-item__cell\', \'el-descriptions-item__content\', item.contentClassName],\n style: item.contentStyle,\n attrs: { colSpan: item.props.span * 2 - 1\n }\n },\n [item.slots.default]\n )];\n })]\n )]);\n }\n return h(\'tbody\', [h(\n \'tr\',\n { \'class\': \'el-descriptions-row\' },\n [row.map(function (item) {\n var _ref3;\n\n return h(\n \'td\',\n { \'class\': \'el-descriptions-item el-descriptions-item__cell\', attrs: { colSpan: item.props.span }\n },\n [h(\n \'div\',\n { \'class\': \'el-descriptions-item__container\' },\n [h(\n \'span\',\n {\n \'class\': (_ref3 = {\n \'el-descriptions-item__label\': true,\n \'has-colon\': elDescriptions.colon\n }, _ref3[item.labelClassName] = true, _ref3),\n style: item.labelStyle\n },\n [item.label]\n ), h(\n \'span\',\n {\n \'class\': [\'el-descriptions-item__content\', item.contentClassName],\n style: item.contentStyle\n },\n [item.slots.default]\n )]\n )]\n );\n })]\n )]);\n }\n});\n// CONCATENATED MODULE: ./packages/descriptions/src/index.js\nvar src_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar src_components;\n\n\n\n\n/* harmony default export */ var descriptions_src = ({\n name: \'ElDescriptions\',\n components: (src_components = {}, src_components[descriptions_row.name] = descriptions_row, src_components),\n props: {\n border: {\n type: Boolean,\n default: false\n },\n column: {\n type: Number,\n default: 3\n },\n direction: {\n type: String,\n default: \'horizontal\'\n },\n size: {\n type: String\n // validator: isValidComponentSize,\n },\n title: {\n type: String,\n default: \'\'\n },\n extra: {\n type: String,\n default: \'\'\n },\n labelStyle: {\n type: Object\n },\n contentStyle: {\n type: Object\n },\n labelClassName: {\n type: String,\n default: \'\'\n },\n contentClassName: {\n type: String,\n default: \'\'\n },\n colon: {\n type: Boolean,\n default: true\n }\n },\n computed: {\n descriptionsSize: function descriptionsSize() {\n return this.size || (this.$ELEMENT || {}).size;\n }\n },\n provide: function provide() {\n return {\n elDescriptions: this\n };\n },\n\n methods: {\n getOptionProps: function getOptionProps(vnode) {\n if (vnode.componentOptions) {\n var componentOptions = vnode.componentOptions;\n var _componentOptions$pro = componentOptions.propsData,\n propsData = _componentOptions$pro === undefined ? {} : _componentOptions$pro,\n _componentOptions$Cto = componentOptions.Ctor,\n Ctor = _componentOptions$Cto === undefined ? {} : _componentOptions$Cto;\n\n var props = (Ctor.options || {}).props || {};\n var res = {};\n for (var k in props) {\n var v = props[k];\n var defaultValue = v.default;\n if (defaultValue !== undefined) {\n res[k] = Object(types_["isFunction"])(defaultValue) ? defaultValue.call(vnode) : defaultValue;\n }\n }\n return src_extends({}, res, propsData);\n }\n return {};\n },\n getSlots: function getSlots(vnode) {\n var _this = this;\n\n var componentOptions = vnode.componentOptions || {};\n var children = vnode.children || componentOptions.children || [];\n var slots = {};\n children.forEach(function (child) {\n if (!_this.isEmptyElement(child)) {\n var name = child.data && child.data.slot || \'default\';\n slots[name] = slots[name] || [];\n if (child.tag === \'template\') {\n slots[name].push(child.children);\n } else {\n slots[name].push(child);\n }\n }\n });\n return src_extends({}, slots);\n },\n isEmptyElement: function isEmptyElement(c) {\n return !(c.tag || c.text && c.text.trim() !== \'\');\n },\n filledNode: function filledNode(node, span, count) {\n var isLast = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n if (!node.props) {\n node.props = {};\n }\n if (span > count) {\n node.props.span = count;\n }\n if (isLast) {\n // set the max span, cause of the last td\n node.props.span = count;\n }\n return node;\n },\n getRows: function getRows() {\n var _this2 = this;\n\n var children = (this.$slots.default || []).filter(function (vnode) {\n return vnode.tag && vnode.componentOptions && vnode.componentOptions.Ctor.options.name === \'ElDescriptionsItem\';\n });\n var nodes = children.map(function (vnode) {\n return {\n props: _this2.getOptionProps(vnode),\n slots: _this2.getSlots(vnode),\n vnode: vnode\n };\n });\n var rows = [];\n var temp = [];\n var count = this.column;\n\n nodes.forEach(function (node, index) {\n var span = node.props.span || 1;\n\n if (index === children.length - 1) {\n temp.push(_this2.filledNode(node, span, count, true));\n rows.push(temp);\n return;\n }\n\n if (span < count) {\n count -= span;\n temp.push(node);\n } else {\n temp.push(_this2.filledNode(node, span, count));\n rows.push(temp);\n count = _this2.column;\n temp = [];\n }\n });\n\n return rows;\n }\n },\n render: function render() {\n var h = arguments[0];\n var title = this.title,\n extra = this.extra,\n border = this.border,\n descriptionsSize = this.descriptionsSize,\n $slots = this.$slots;\n\n var rows = this.getRows();\n\n return h(\n \'div\',\n { \'class\': \'el-descriptions\' },\n [title || extra || $slots.title || $slots.extra ? h(\n \'div\',\n { \'class\': \'el-descriptions__header\' },\n [h(\n \'div\',\n { \'class\': \'el-descriptions__title\' },\n [$slots.title ? $slots.title : title]\n ), h(\n \'div\',\n { \'class\': \'el-descriptions__extra\' },\n [$slots.extra ? $slots.extra : extra]\n )]\n ) : null, h(\n \'div\',\n { \'class\': \'el-descriptions__body\' },\n [h(\n \'table\',\n { \'class\': [\'el-descriptions__table\', { \'is-bordered\': border }, descriptionsSize ? \'el-descriptions--\' + descriptionsSize : \'\'] },\n [rows.map(function (row) {\n return h(descriptions_row, {\n attrs: { row: row }\n });\n })]\n )]\n )]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/descriptions/index.js\n\n\n/* istanbul ignore next */\ndescriptions_src.install = function install(Vue) {\n Vue.component(descriptions_src.name, descriptions_src);\n};\n\n/* harmony default export */ var descriptions = (descriptions_src);\n// CONCATENATED MODULE: ./packages/descriptions/src/descriptions-item.js\n/* harmony default export */ var descriptions_item = ({\n name: \'ElDescriptionsItem\',\n props: {\n label: {\n type: String,\n default: \'\'\n },\n span: {\n type: Number,\n default: 1\n },\n contentClassName: {\n type: String,\n default: \'\'\n },\n contentStyle: {\n type: Object\n },\n labelClassName: {\n type: String,\n default: \'\'\n },\n labelStyle: {\n type: Object\n }\n },\n render: function render() {\n return null;\n }\n});\n// CONCATENATED MODULE: ./packages/descriptions-item/index.js\n\n\n/* istanbul ignore next */\ndescriptions_item.install = function install(Vue) {\n Vue.component(descriptions_item.name, descriptions_item);\n};\n\n/* harmony default export */ var packages_descriptions_item = (descriptions_item);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/result/src/index.vue?vue&type=template&id=3408b139&\nvar srcvue_type_template_id_3408b139_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c("div", { staticClass: "el-result" }, [\n _c(\n "div",\n { staticClass: "el-result__icon" },\n [\n _vm._t("icon", [\n _c(_vm.iconElement, { tag: "component", class: _vm.iconElement })\n ])\n ],\n 2\n ),\n _vm.title || _vm.$slots.title\n ? _c(\n "div",\n { staticClass: "el-result__title" },\n [_vm._t("title", [_c("p", [_vm._v(_vm._s(_vm.title))])])],\n 2\n )\n : _vm._e(),\n _vm.subTitle || _vm.$slots.subTitle\n ? _c(\n "div",\n { staticClass: "el-result__subtitle" },\n [_vm._t("subTitle", [_c("p", [_vm._v(_vm._s(_vm.subTitle))])])],\n 2\n )\n : _vm._e(),\n _vm.$slots.extra\n ? _c("div", { staticClass: "el-result__extra" }, [_vm._t("extra")], 2)\n : _vm._e()\n ])\n}\nvar srcvue_type_template_id_3408b139_staticRenderFns = []\nsrcvue_type_template_id_3408b139_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/result/src/index.vue?vue&type=template&id=3408b139&\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/result/src/icon-success.vue?vue&type=template&id=18119418&\nvar icon_successvue_type_template_id_18119418_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "svg",\n { attrs: { viewBox: "0 0 48 48", xmlns: "http://www.w3.org/2000/svg" } },\n [\n _c("path", {\n attrs: {\n d:\n "M24,4 C35.045695,4 44,12.954305 44,24 C44,35.045695 35.045695,44 24,44 C12.954305,44 4,35.045695 4,24 C4,12.954305 12.954305,4 24,4 Z M34.5548098,16.4485711 C33.9612228,15.8504763 32.9988282,15.8504763 32.4052412,16.4485711 L32.4052412,16.4485711 L21.413757,27.5805811 L21.413757,27.5805811 L21.4034642,27.590855 C21.0097542,27.9781674 20.3766105,27.9729811 19.9892981,27.5792711 L19.9892981,27.5792711 L15.5947588,23.1121428 C15.0011718,22.514048 14.0387772,22.514048 13.4451902,23.1121428 C12.8516033,23.7102376 12.8516033,24.6799409 13.4451902,25.2780357 L13.4451902,25.2780357 L19.6260786,31.5514289 C20.2196656,32.1495237 21.1820602,32.1495237 21.7756472,31.5514289 L21.7756472,31.5514289 L34.5548098,18.614464 C35.1483967,18.0163692 35.1483967,17.0466659 34.5548098,16.4485711 Z"\n }\n })\n ]\n )\n}\nvar icon_successvue_type_template_id_18119418_staticRenderFns = []\nicon_successvue_type_template_id_18119418_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/result/src/icon-success.vue?vue&type=template&id=18119418&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/result/src/icon-success.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var icon_successvue_type_script_lang_js_ = ({\n name: \'IconSuccess\'\n});\n// CONCATENATED MODULE: ./packages/result/src/icon-success.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_icon_successvue_type_script_lang_js_ = (icon_successvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/result/src/icon-success.vue\n\n\n\n\n\n/* normalize component */\n\nvar icon_success_component = normalizeComponent(\n src_icon_successvue_type_script_lang_js_,\n icon_successvue_type_template_id_18119418_render,\n icon_successvue_type_template_id_18119418_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var icon_success_api; }\nicon_success_component.options.__file = "packages/result/src/icon-success.vue"\n/* harmony default export */ var icon_success = (icon_success_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/result/src/icon-error.vue?vue&type=template&id=21199246&\nvar icon_errorvue_type_template_id_21199246_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "svg",\n { attrs: { viewBox: "0 0 48 48", xmlns: "http://www.w3.org/2000/svg" } },\n [\n _c("path", {\n attrs: {\n d:\n "M24,4 C35.045695,4 44,12.954305 44,24 C44,35.045695 35.045695,44 24,44 C12.954305,44 4,35.045695 4,24 C4,12.954305 12.954305,4 24,4 Z M32.57818,15.42182 C32.0157534,14.8593933 31.1038797,14.8593933 30.541453,15.42182 L30.541453,15.42182 L24.0006789,21.9625941 L17.458547,15.42182 C16.8961203,14.8593933 15.9842466,14.8593933 15.42182,15.42182 C14.8593933,15.9842466 14.8593933,16.8961203 15.42182,17.458547 L15.42182,17.458547 L21.9639519,23.9993211 L15.42182,30.541453 C14.8593933,31.1038797 14.8593933,32.0157534 15.42182,32.57818 C15.9842466,33.1406067 16.8961203,33.1406067 17.458547,32.57818 L17.458547,32.57818 L24.0006789,26.0360481 L30.541453,32.57818 C31.1038797,33.1406067 32.0157534,33.1406067 32.57818,32.57818 C33.1406067,32.0157534 33.1406067,31.1038797 32.57818,30.541453 L32.57818,30.541453 L26.0374059,23.9993211 L32.57818,17.458547 C33.1406067,16.8961203 33.1406067,15.9842466 32.57818,15.42182 Z"\n }\n })\n ]\n )\n}\nvar icon_errorvue_type_template_id_21199246_staticRenderFns = []\nicon_errorvue_type_template_id_21199246_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/result/src/icon-error.vue?vue&type=template&id=21199246&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/result/src/icon-error.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var icon_errorvue_type_script_lang_js_ = ({\n name: \'IconError\'\n});\n// CONCATENATED MODULE: ./packages/result/src/icon-error.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_icon_errorvue_type_script_lang_js_ = (icon_errorvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/result/src/icon-error.vue\n\n\n\n\n\n/* normalize component */\n\nvar icon_error_component = normalizeComponent(\n src_icon_errorvue_type_script_lang_js_,\n icon_errorvue_type_template_id_21199246_render,\n icon_errorvue_type_template_id_21199246_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var icon_error_api; }\nicon_error_component.options.__file = "packages/result/src/icon-error.vue"\n/* harmony default export */ var icon_error = (icon_error_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/result/src/icon-warning.vue?vue&type=template&id=46fe8f31&\nvar icon_warningvue_type_template_id_46fe8f31_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "svg",\n { attrs: { viewBox: "0 0 48 48", xmlns: "http://www.w3.org/2000/svg" } },\n [\n _c("path", {\n attrs: {\n d:\n "M24,4 C35.045695,4 44,12.954305 44,24 C44,35.045695 35.045695,44 24,44 C12.954305,44 4,35.045695 4,24 C4,12.954305 12.954305,4 24,4 Z M24,31 C22.8954305,31 22,31.8954305 22,33 C22,34.1045695 22.8954305,35 24,35 C25.1045695,35 26,34.1045695 26,33 C26,31.8954305 25.1045695,31 24,31 Z M24,14 C23.1715729,14 22.5,14.6715729 22.5,15.5 L22.5,15.5 L22.5,27.5 C22.5,28.3284271 23.1715729,29 24,29 C24.8284271,29 25.5,28.3284271 25.5,27.5 L25.5,27.5 L25.5,15.5 C25.5,14.6715729 24.8284271,14 24,14 Z"\n }\n })\n ]\n )\n}\nvar icon_warningvue_type_template_id_46fe8f31_staticRenderFns = []\nicon_warningvue_type_template_id_46fe8f31_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/result/src/icon-warning.vue?vue&type=template&id=46fe8f31&\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib??vue-loader-options!./packages/result/src/icon-warning.vue?vue&type=script&lang=ts&\n\n\n\n\n\n\n\n\n\n/* harmony default export */ var icon_warningvue_type_script_lang_ts_ = ({\n name: \'IconWarning\'\n});\n\n// CONCATENATED MODULE: ./packages/result/src/icon-warning.vue?vue&type=script&lang=ts&\n /* harmony default export */ var src_icon_warningvue_type_script_lang_ts_ = (icon_warningvue_type_script_lang_ts_); \n// CONCATENATED MODULE: ./packages/result/src/icon-warning.vue\n\n\n\n\n\n/* normalize component */\n\nvar icon_warning_component = normalizeComponent(\n src_icon_warningvue_type_script_lang_ts_,\n icon_warningvue_type_template_id_46fe8f31_render,\n icon_warningvue_type_template_id_46fe8f31_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var icon_warning_api; }\nicon_warning_component.options.__file = "packages/result/src/icon-warning.vue"\n/* harmony default export */ var icon_warning = (icon_warning_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/result/src/icon-info.vue?vue&type=template&id=19e3de69&\nvar icon_infovue_type_template_id_19e3de69_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "svg",\n { attrs: { viewBox: "0 0 48 48", xmlns: "http://www.w3.org/2000/svg" } },\n [\n _c("path", {\n attrs: {\n d:\n "M24,4 C35.045695,4 44,12.954305 44,24 C44,35.045695 35.045695,44 24,44 C12.954305,44 4,35.045695 4,24 C4,12.954305 12.954305,4 24,4 Z M24,19 L21,19 C20.1715729,19 19.5,19.6715729 19.5,20.5 C19.5,21.3284271 20.1715729,22 21,22 L21,22 L22.5,22 L22.5,31 L21,31 C20.1715729,31 19.5,31.6715729 19.5,32.5 C19.5,33.3284271 20.1715729,34 21,34 L21,34 L27,34 C27.8284271,34 28.5,33.3284271 28.5,32.5 C28.5,31.6715729 27.8284271,31 27,31 L27,31 L25.5,31 L25.5,20.5 C25.5,19.6715729 24.8284271,19 24,19 L24,19 Z M24,13 C22.8954305,13 22,13.8954305 22,15 C22,16.1045695 22.8954305,17 24,17 C25.1045695,17 26,16.1045695 26,15 C26,13.8954305 25.1045695,13 24,13 Z"\n }\n })\n ]\n )\n}\nvar icon_infovue_type_template_id_19e3de69_staticRenderFns = []\nicon_infovue_type_template_id_19e3de69_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/result/src/icon-info.vue?vue&type=template&id=19e3de69&\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib??vue-loader-options!./packages/result/src/icon-info.vue?vue&type=script&lang=ts&\n\n\n\n\n\n\n\n\n\n/* harmony default export */ var icon_infovue_type_script_lang_ts_ = ({\n name: \'IconInfo\'\n});\n\n// CONCATENATED MODULE: ./packages/result/src/icon-info.vue?vue&type=script&lang=ts&\n /* harmony default export */ var src_icon_infovue_type_script_lang_ts_ = (icon_infovue_type_script_lang_ts_); \n// CONCATENATED MODULE: ./packages/result/src/icon-info.vue\n\n\n\n\n\n/* normalize component */\n\nvar icon_info_component = normalizeComponent(\n src_icon_infovue_type_script_lang_ts_,\n icon_infovue_type_template_id_19e3de69_render,\n icon_infovue_type_template_id_19e3de69_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var icon_info_api; }\nicon_info_component.options.__file = "packages/result/src/icon-info.vue"\n/* harmony default export */ var icon_info = (icon_info_component.exports);\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/result/src/index.vue?vue&type=script&lang=js&\nvar result_srcvue_type_script_lang_js_components;\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\nvar IconMap = {\n success: \'icon-success\',\n warning: \'icon-warning\',\n error: \'icon-error\',\n info: \'icon-info\'\n};\n\n/* harmony default export */ var result_srcvue_type_script_lang_js_ = ({\n name: \'ElResult\',\n components: (result_srcvue_type_script_lang_js_components = {}, result_srcvue_type_script_lang_js_components[icon_success.name] = icon_success, result_srcvue_type_script_lang_js_components[icon_error.name] = icon_error, result_srcvue_type_script_lang_js_components[icon_warning.name] = icon_warning, result_srcvue_type_script_lang_js_components[icon_info.name] = icon_info, result_srcvue_type_script_lang_js_components),\n props: {\n title: {\n type: String,\n default: \'\'\n },\n subTitle: {\n type: String,\n default: \'\'\n },\n icon: {\n type: String,\n default: \'info\'\n }\n },\n computed: {\n iconElement: function iconElement() {\n var icon = this.icon;\n return icon && IconMap[icon] ? IconMap[icon] : \'icon-info\';\n }\n }\n});\n// CONCATENATED MODULE: ./packages/result/src/index.vue?vue&type=script&lang=js&\n /* harmony default export */ var packages_result_srcvue_type_script_lang_js_ = (result_srcvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/result/src/index.vue\n\n\n\n\n\n/* normalize component */\n\nvar result_src_component = normalizeComponent(\n packages_result_srcvue_type_script_lang_js_,\n srcvue_type_template_id_3408b139_render,\n srcvue_type_template_id_3408b139_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var result_src_api; }\nresult_src_component.options.__file = "packages/result/src/index.vue"\n/* harmony default export */ var result_src = (result_src_component.exports);\n// CONCATENATED MODULE: ./packages/result/index.js\n\n\n/* istanbul ignore next */\nresult_src.install = function (Vue) {\n Vue.component(result_src.name, result_src);\n};\n\n/* harmony default export */ var packages_result = (result_src);\n// CONCATENATED MODULE: ./src/index.js\n/* Automatically generated by \'./build/bin/build-entry.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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar components = [packages_pagination, dialog, packages_autocomplete, packages_dropdown, packages_dropdown_menu, packages_dropdown_item, packages_menu, packages_submenu, packages_menu_item, packages_menu_item_group, packages_input, packages_input_number, packages_radio, packages_radio_group, packages_radio_button, packages_checkbox, packages_checkbox_button, packages_checkbox_group, packages_switch, packages_select, packages_option, packages_option_group, packages_button, packages_button_group, packages_table, packages_table_column, packages_date_picker, packages_time_select, packages_time_picker, popover, packages_tooltip, packages_breadcrumb, packages_breadcrumb_item, packages_form, packages_form_item, packages_tabs, packages_tab_pane, packages_tag, packages_tree, packages_alert, slider, packages_icon, packages_row, packages_col, packages_upload, packages_progress, packages_spinner, badge, card, packages_rate, packages_steps, packages_step, carousel, scrollbar, carousel_item, packages_collapse, packages_collapse_item, packages_cascader, color_picker, transfer, packages_container, header, aside, packages_main, footer, timeline, timeline_item, packages_link, divider, packages_image, calendar, backtop, page_header, packages_cascader_panel, avatar, drawer, statistic, popconfirm, skeleton, skeleton_item, empty, descriptions, packages_descriptions_item, packages_result, collapse_transition_default.a];\n\nvar src_install = function install(Vue) {\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n lib_locale_default.a.use(opts.locale);\n lib_locale_default.a.i18n(opts.i18n);\n\n components.forEach(function (component) {\n Vue.component(component.name, component);\n });\n\n Vue.use(infinite_scroll);\n Vue.use(packages_loading.directive);\n\n Vue.prototype.$ELEMENT = {\n size: opts.size || \'\',\n zIndex: opts.zIndex || 2000\n };\n\n Vue.prototype.$loading = packages_loading.service;\n Vue.prototype.$msgbox = message_box;\n Vue.prototype.$alert = message_box.alert;\n Vue.prototype.$confirm = message_box.confirm;\n Vue.prototype.$prompt = message_box.prompt;\n Vue.prototype.$notify = notification;\n Vue.prototype.$message = packages_message;\n};\n\n/* istanbul ignore if */\nif (typeof window !== \'undefined\' && window.Vue) {\n src_install(window.Vue);\n}\n\n/* harmony default export */ var src_0 = __webpack_exports__["default"] = ({\n version: \'2.15.13\',\n locale: lib_locale_default.a.use,\n i18n: lib_locale_default.a.i18n,\n install: src_install,\n CollapseTransition: collapse_transition_default.a,\n Loading: packages_loading,\n Pagination: packages_pagination,\n Dialog: dialog,\n Autocomplete: packages_autocomplete,\n Dropdown: packages_dropdown,\n DropdownMenu: packages_dropdown_menu,\n DropdownItem: packages_dropdown_item,\n Menu: packages_menu,\n Submenu: packages_submenu,\n MenuItem: packages_menu_item,\n MenuItemGroup: packages_menu_item_group,\n Input: packages_input,\n InputNumber: packages_input_number,\n Radio: packages_radio,\n RadioGroup: packages_radio_group,\n RadioButton: packages_radio_button,\n Checkbox: packages_checkbox,\n CheckboxButton: packages_checkbox_button,\n CheckboxGroup: packages_checkbox_group,\n Switch: packages_switch,\n Select: packages_select,\n Option: packages_option,\n OptionGroup: packages_option_group,\n Button: packages_button,\n ButtonGroup: packages_button_group,\n Table: packages_table,\n TableColumn: packages_table_column,\n DatePicker: packages_date_picker,\n TimeSelect: packages_time_select,\n TimePicker: packages_time_picker,\n Popover: popover,\n Tooltip: packages_tooltip,\n MessageBox: message_box,\n Breadcrumb: packages_breadcrumb,\n BreadcrumbItem: packages_breadcrumb_item,\n Form: packages_form,\n FormItem: packages_form_item,\n Tabs: packages_tabs,\n TabPane: packages_tab_pane,\n Tag: packages_tag,\n Tree: packages_tree,\n Alert: packages_alert,\n Notification: notification,\n Slider: slider,\n Icon: packages_icon,\n Row: packages_row,\n Col: packages_col,\n Upload: packages_upload,\n Progress: packages_progress,\n Spinner: packages_spinner,\n Message: packages_message,\n Badge: badge,\n Card: card,\n Rate: packages_rate,\n Steps: packages_steps,\n Step: packages_step,\n Carousel: carousel,\n Scrollbar: scrollbar,\n CarouselItem: carousel_item,\n Collapse: packages_collapse,\n CollapseItem: packages_collapse_item,\n Cascader: packages_cascader,\n ColorPicker: color_picker,\n Transfer: transfer,\n Container: packages_container,\n Header: header,\n Aside: aside,\n Main: packages_main,\n Footer: footer,\n Timeline: timeline,\n TimelineItem: timeline_item,\n Link: packages_link,\n Divider: divider,\n Image: packages_image,\n Calendar: calendar,\n Backtop: backtop,\n InfiniteScroll: infinite_scroll,\n PageHeader: page_header,\n CascaderPanel: packages_cascader_panel,\n Avatar: avatar,\n Drawer: drawer,\n Statistic: statistic,\n Popconfirm: popconfirm,\n Skeleton: skeleton,\n SkeletonItem: skeleton_item,\n Empty: empty,\n Descriptions: descriptions,\n DescriptionsItem: packages_descriptions_item,\n Result: packages_result\n});\n\n/***/ })\n/******/ ])["default"];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvZWxlbWVudC11aS5jb21tb24uanM/NWM5NiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxnQ0FBZ0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLGtCQUFrQjtBQUNsRjtBQUNBLHlEQUF5RCxjQUFjO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGlDQUFpQztBQUNsRix3SEFBd0gsbUJBQW1CLEVBQUU7QUFDN0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDBCQUEwQixFQUFFO0FBQy9ELHlDQUF5QyxlQUFlO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsK0RBQStEO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQWdDOztBQUV6RCxPQUFPO0FBQ1A7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFbkQsT0FBTztBQUNQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBMkI7O0FBRXBELE9BQU87QUFDUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQStCOztBQUV4RCxP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QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7OztBQVFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBLGVBQWUsbUNBQW1DO0FBQ2xEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsNEk7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcscUNBQXFDO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxlQUFlLHVDQUF1Qzs7QUFFdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLDhCQUE4QixvQkFBb0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxvSDtBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyx5QkFBeUI7QUFDcEM7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7OztBQVNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUEsZUFBZSx1Q0FBdUM7O0FBRXREO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUhBQXlIO0FBQ3pIO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUEsd0VBQXdFO0FBQ3hFLHVFQUF1RTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FB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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsTUFBSyxJQUFJLEtBQUs7QUFDdkI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkMsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLCtCQUErQiwyQkFBMkIsc0JBQXNCO0FBQ2hGLEtBQUs7QUFDTDtBQUNBLHNFQUFzRTtBQUN0RSxLQUFLO0FBQ0w7QUFDQSxnREFBZ0Q7QUFDaEQsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG1CQUFtQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHNHO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMseUNBQXlDO0FBQ2xELFNBQVMsdUNBQXVDO0FBQ2hELFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixpQ0FBaUM7QUFDdkQsc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGlDQUFpQztBQUN2RCxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxtQ0FBbUM7QUFDbkMsS0FBSztBQUNMO0FBQ0Esc0VBQXNFO0FBQ3RFLEtBQUs7QUFDTDtBQUNBLGtEQUFrRDtBQUNsRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxvSDtBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsbUJBQW1CLDBEQUEwRDtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNB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QUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHdHO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLG1CQUFtQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBLHNFQUFzRTtBQUN0RSxLQUFLO0FBQ0w7QUFDQSxnREFBZ0Q7QUFDaEQsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILGVBQWUsdUNBQXVDOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsTUFBSyxJQUFJLEtBQUs7QUFDdkI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlEQUFpRCxRQUFRO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsMEJBQTBCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0MsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0VBQWtFLGFBQWE7QUFDL0U7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsbURBQW1ELGdCQUFnQixzQkFBc0IsT0FBTywyQkFBMkIsMEJBQTBCLHlEQUF5RCwyQkFBMkIsRUFBRSxFQUFFLEVBQUUsZUFBZTs7OztBQUk5UDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsTUFBTSxrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMLGdCQUFnQixNQUFNLFdBQVc7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2Isd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUI7QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxPQUFPO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0EsT0FBTzs7QUFFUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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Szs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1Asc0NBQXNDLE9BQU87QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHNDQUFzQyxPQUFPO0FBQzdD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FB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QUFDQTs7O0FBR0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLCtFQUErRSxnQkFBZ0Isc0JBQXNCLE9BQU8sMkJBQTJCLDBCQUEwQix5REFBeUQsMkJBQTJCLEVBQUUsRUFBRSxFQUFFLGVBQWU7O0FBRTFSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQTs7QUFFQSxlQUFlOztBQUVmO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxrRUFBa0UsZ0JBQWdCO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLHFFQUFxRSxnQkFBZ0I7QUFDckY7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxpQ0FBaUMsMkJBQTJCO0FBQzVELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUMsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxzRztBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxT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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLDRCQUE0QixxQkFBcUI7QUFDakQsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsYUFBYTtBQUNiLG9CQUFv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QUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxHQUFHLGFBQWE7QUFDdkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7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S0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLCtHQUErRztBQUMvRztBQUNBLDZHQUE2RztBQUM3RztBQUNBLDZHQUE2RztBQUM3RztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esc0g7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcseUJBQXlCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFL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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0Esc0NBQXNDLE9BQU87QUFDN0M7QUFDQSx1Q0FBdUMsT0FBTztBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLGtDQUFrQztBQUNoRTtBQUNBLFNBQVM7QUFDVDtBQUNBLGdDQUFnQywwQ0FBMEM7QUFDMUUsV0FBVztBQUNYLGdDQUFnQywwQ0FBMEM7QUFDMUU7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxrSDtBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyx1QkFBdUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FBWUE7QUFDQTs7QUFFQSxlQUFlLHVDQUF1Qzs7QUFFdEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLHdGQUF3RixhQUFhO0FBQ3JHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLCtCQUErQjtBQUMvQjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCx3Q0FBd0MsVUFBVTtBQUNsRDtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFD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QUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHlDQUF5QztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDZCQUE2QjtBQUMzRCwyQkFBMkI7QUFDM0IscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGVBQWUsdUNBQXVDOztBQUV0RDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLHVDQUF1Qzs7QUFFdEQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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LEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esa0g7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDBCQUEwQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0IsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsK0RBQStEO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxvRztBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7Ozs7O0FBS0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUFPQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGFBQWEsV0FBVztBQUN4QjtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DLGVBQWU7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsc0NBQXNDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHlJO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLHFCQUFxQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdHQUF3RyxtQkFBbUIsRUFBRSxtQkFBbUIsOEhBQThIOztBQUU5UTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGtEQUFrRDtBQUNoRixTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsZ0g7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHFDQUFxQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBLDBIO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLDRCQUE0QjtBQUN2QztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9HO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLGlCQUFpQjtBQUM1QjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsZ0VBQWdFO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTLHlCQUF5QixFQUFFO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsb0RBQW9EO0FBQzdEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxnSDtBQUNBO0FBQ0E7Ozs7O0FBS0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxpQ0FBaUMsb0JBQW9CO0FBQ3JEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCw0QkFBNEI7O0FBRXBGO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQLGlDQUFpQztBQUNqQyxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsOEc7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsc0JBQXNCO0FBQ2pDO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwRztBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxvQkFBb0I7QUFDL0I7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakM7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLGVBQWUsZ0NBQWdDO0FBQy9DO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxlQUFlLGlDQUFpQztBQUNoRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxrQkFBa0I7O0FBRWxCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsNEJBQTRCO0FBQzVCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTyx1R0FBdUc7QUFDOUc7QUFDQTtBQUNBLFNBQVMscURBQXFEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0Esb0JBQW9CO0FBQ3BCLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBHO0FBQ0E7QUFDQTs7Ozs7QUFLQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxvQkFBb0I7QUFDL0I7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtB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QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsd0NBQXdDLE9BQU87QUFDL0Msd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLE9BQU87QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtB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QUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtB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QUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSw4RztBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxzQkFBc0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBU0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esb0c7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsaUJBQWlCO0FBQzVCO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFNBQVMsd0JBQXdCLEVBQUU7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLG1CQUFtQixtQ0FBbUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDJEQUEyRDtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQix1Q0FBdUM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix1Q0FBdUM7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSw2SDtBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVywyQkFBMkI7QUFDdEM7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsU0FBUywrQkFBK0IsRUFBRTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixnQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFX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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4QkFBOEIsK0JBQStCLElBQUk7QUFDakU7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG1JO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU8sK0RBQStELEVBQUU7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNB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QUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esa0g7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsd0JBQXdCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esd0g7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsMkJBQTJCO0FBQ3RDO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSwyQ0FBMkMsc0NBQXNDLCtEQUErRDtBQUNoSjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHdHO0FBQ0E7QUFDQTs7Ozs7QUFLQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxtQkFBbUI7QUFDOUI7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EscUc7QUFDQTtBQUNBOzs7OztBQUtBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLGdCQUFnQjtBQUMzQjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EscUJBQXFCLGlDQUFpQztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEMsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QixhQUFhO0FBQ2I7QUFDQSx5QkFBeUIsU0FBUyx5QkFBeUIsRUFBRTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix1QkFBdUI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsaUJBQWlCLE1BQU07QUFDdkI7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLGFBQWE7QUFDNUQsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLHlEQUF5RCw2RUFBNkUsNkNBQTZDO0FBQ25MLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLHFEQUFxRCwwRUFBMEUsd0NBQXdDO0FBQ3ZLLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxlQUFlO0FBQzNCO0FBQ0E7QUFDQSxZQUFZLGNBQWM7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDJIO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLDBCQUEwQjtBQUNyQztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esc0c7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsa0JBQWtCO0FBQzdCO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTLGlFQUFpRTtBQUMxRTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG1JO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLDhCQUE4QjtBQUN6QztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQsaUNBQWlDLG1DQUFtQyxHQUFHO0FBQ3ZFO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxlQUFlOztBQUU5QjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGlCQUFpQjtBQUNqQixpQkFBaUI7QUFDakIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkRBQTJELGtDQUFrQzs7QUFFN0Y7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVCw2R0FBNkc7QUFDN0c7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHdCQUF3QjtBQUM3QyxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsV0FBVztBQUNYLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esb0c7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsaUJBQWlCO0FBQzVCO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSw0RztBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxxQkFBcUI7QUFDaEM7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMkNBQTJDO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxlQUFlLHNEQUFzRDs7QUFFckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxzSDtBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVywwQkFBMEI7QUFDckM7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsZUFBZSx1Q0FBdUM7O0FBRXREOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xELGlFQUFpRTtBQUNqRSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGdEQUFnRDtBQUNoRCxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUMsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsNEc7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcscUJBQXFCO0FBQ2hDO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFCQUFxQix1Q0FBdUM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsYUFBYSxnREFBZ0Q7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0EseUdBQXlHLG1CQUFtQixFQUFFLG1CQUFtQiw4SEFBOEg7O0FBRS9RLHNEQUFzRCwwQ0FBMEMsMERBQTBELEVBQUU7O0FBRTVKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1COztBQUVuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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Q0FBeUM7QUFDMUQsaUJBQWlCLHlDQUF5QztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxtSDtBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxxQkFBcUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsdUg7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxhQUFhO0FBQ2IsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMkg7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcseUJBQXlCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG9DQUFvQztBQUN4RDtBQUNBO0FBQ0EsT0FBTyw0Q0FBNEM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHlEQUF5RDtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLHNCQUFzQixTQUFTLGlDQUFpQyxFQUFFO0FBQ2xFO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0EsYUFBYSw4QkFBOEI7QUFDM0MsWUFBWTtBQUNaLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHFIO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLHNCQUFzQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsaUk7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsNEJBQTRCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUFPQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILGVBQWUsdUNBQXVDOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsbUNBQW1DO0FBQ25DLEtBQUs7QUFDTDtBQUNBLHNFQUFzRTtBQUN0RSxLQUFLO0FBQ0w7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwySTtBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxrQ0FBa0M7QUFDN0M7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUFPQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwSUFBMEksc0JBQXNCO0FBQ2hLO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMERBQTBELFFBQVEsK0JBQStCLE1BQU0sd0NBQXdDLE1BQU07QUFDckosT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esd0g7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsMkJBQTJCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLElBQUk7QUFDWCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxtSTtBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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S0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FB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OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIseUJBQXlCO0FBQzlDO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUyxXQUFXO0FBQ3BCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULGdCQUFnQjtBQUNoQjtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYix3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQSxpQkFBaUIsNkJBQTZCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsNkg7QUFDQTtBQUNBOzs7OztBQUtBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLDJCQUEyQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsbUk7QUFDQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsOEJBQThCO0FBQ3pDO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFNBQVMscUJBQXFCLEVBQUU7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSw4Q0FBOEMsU0FBUyxvQkFBb0IsRUFBRTtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLGlJO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLDZCQUE2QjtBQUN4QztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsSUFBSTtBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsaUJBQWlCOztBQUVqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQ0FBcUMsaUNBQWlDO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdDQUFnQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxpQkFBaUIsOEJBQThCO0FBQy9DO0FBQ0E7QUFDQSxXQUFXLHVDQUF1QztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8seUNBQXlDO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSx5STtBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxpQ0FBaUM7QUFDNUM7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWEsc0NBQXNDO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxzRkFBc0YsYUFBYTtBQUNuRztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0RkFBNEYsZUFBZTtBQUMzRztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLHNEQUFzRCwwQ0FBMEMsMERBQTBELEVBQUU7Ozs7O0FBSzVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLHdGQUF3RixnQkFBZ0Isc0JBQXNCLE9BQU8sMkJBQTJCLDBCQUEwQix5REFBeUQsMkJBQTJCLEVBQUUsRUFBRSxFQUFFLGVBQWU7O0FBRW5TO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFTQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0EsNkVBQTZFLGlDQUFpQztBQUM5RyxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0Es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Q0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHlIO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLHlCQUF5QjtBQUNwQztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLDhEQUE4RDtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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b0M7QUFDcEMsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFXLHNCQUFzQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxxSDtBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyx1QkFBdUI7QUFDbEM7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4RkE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPO0FBQ1AiLCJmaWxlIjoiNWM5Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC9cIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNDYpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9kYXRlLXV0aWxcIik7XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9kb21cIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2VtaXR0ZXJcIik7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvbG9jYWxlXCIpO1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvdnVlLXBvcHBlclwiKTtcblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInZ1ZVwiKTtcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL21lcmdlXCIpO1xuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvaW5wdXRcIik7XG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvbWlncmF0aW5nXCIpO1xuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL2NsaWNrb3V0c2lkZVwiKTtcblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9wb3B1cFwiKTtcblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9sb2NhbGVcIik7XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvYnV0dG9uXCIpO1xuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL2NoZWNrYm94XCIpO1xuXG4vKioqLyB9KSxcbi8qIDE1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Jlc2l6ZS1ldmVudFwiKTtcblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy90eXBlc1wiKTtcblxuLyoqKi8gfSksXG4vKiAxNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ0aHJvdHRsZS1kZWJvdW5jZS9kZWJvdW5jZVwiKTtcblxuLyoqKi8gfSksXG4vKiAxOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9zY3JvbGxiYXJcIik7XG5cbi8qKiovIH0pLFxuLyogMTkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvc2hhcmVkXCIpO1xuXG4vKioqLyB9KSxcbi8qIDIwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL2RhdGVcIik7XG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdHJhbnNpdGlvbnMvY29sbGFwc2UtdHJhbnNpdGlvblwiKTtcblxuLyoqKi8gfSksXG4vKiAyMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy92ZG9tXCIpO1xuXG4vKioqLyB9KSxcbi8qIDIzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL21peGlucy9mb2N1c1wiKTtcblxuLyoqKi8gfSksXG4vKiAyNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJiYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wc1wiKTtcblxuLyoqKi8gfSksXG4vKiAyNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ0aHJvdHRsZS1kZWJvdW5jZS90aHJvdHRsZVwiKTtcblxuLyoqKi8gfSksXG4vKiAyNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi90b29sdGlwXCIpO1xuXG4vKioqLyB9KSxcbi8qIDI3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Njcm9sbC1pbnRvLXZpZXdcIik7XG5cbi8qKiovIH0pLFxuLyogMjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvbG9kYXNoXCIpO1xuXG4vKioqLyB9KSxcbi8qIDI5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL2J1dHRvbi1ncm91cFwiKTtcblxuLyoqKi8gfSksXG4vKiAzMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi90YWdcIik7XG5cbi8qKiovIH0pLFxuLyogMzEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvc2Nyb2xsYmFyLXdpZHRoXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL2NoZWNrYm94LWdyb3VwXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL2FmdGVyLWxlYXZlXCIpO1xuXG4vKioqLyB9KSxcbi8qIDM0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3Byb2dyZXNzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDM1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL2FyaWEtdXRpbHNcIik7XG5cbi8qKiovIH0pLFxuLyogMzYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidGhyb3R0bGUtZGVib3VuY2VcIik7XG5cbi8qKiovIH0pLFxuLyogMzcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvc2VsZWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDM4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL29wdGlvblwiKTtcblxuLyoqKi8gfSksXG4vKiAzOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub3JtYWxpemUtd2hlZWxcIik7XG5cbi8qKiovIH0pLFxuLyogNDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvYXJpYS1kaWFsb2dcIik7XG5cbi8qKiovIH0pLFxuLyogNDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYXN5bmMtdmFsaWRhdG9yXCIpO1xuXG4vKioqLyB9KSxcbi8qIDQyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL2lucHV0LW51bWJlclwiKTtcblxuLyoqKi8gfSksXG4vKiA0MyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9jYXNjYWRlci1wYW5lbFwiKTtcblxuLyoqKi8gfSksXG4vKiA0NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9yYWRpb1wiKTtcblxuLyoqKi8gfSksXG4vKiA0NSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9wb3BvdmVyXCIpO1xuXG4vKioqLyB9KSxcbi8qIDQ2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Nyk7XG5cblxuLyoqKi8gfSksXG4vKiA0NyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9wYWdpbmF0aW9uL3NyYy9wYWdlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NzI3NGYyNjcmXG52YXIgcGFnZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83Mjc0ZjI2N19yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJ1bFwiLFxuICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtcGFnZXJcIiwgb246IHsgY2xpY2s6IF92bS5vblBhZ2VyQ2xpY2sgfSB9LFxuICAgIFtcbiAgICAgIF92bS5wYWdlQ291bnQgPiAwXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcImxpXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICBjbGFzczogeyBhY3RpdmU6IF92bS5jdXJyZW50UGFnZSA9PT0gMSwgZGlzYWJsZWQ6IF92bS5kaXNhYmxlZCB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW192bS5fdihcIjFcIildXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgX3ZtLnNob3dQcmV2TW9yZVxuICAgICAgICA/IF9jKFwibGlcIiwge1xuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtaWNvbiBtb3JlIGJ0bi1xdWlja3ByZXZcIixcbiAgICAgICAgICAgIGNsYXNzOiBbX3ZtLnF1aWNrcHJldkljb25DbGFzcywgeyBkaXNhYmxlZDogX3ZtLmRpc2FibGVkIH1dLFxuICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgbW91c2VlbnRlcjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgX3ZtLm9uTW91c2VlbnRlcihcImxlZnRcIilcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbW91c2VsZWF2ZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgX3ZtLnF1aWNrcHJldkljb25DbGFzcyA9IFwiZWwtaWNvbi1tb3JlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfdm0uX2woX3ZtLnBhZ2VycywgZnVuY3Rpb24ocGFnZXIpIHtcbiAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgIFwibGlcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IHBhZ2VyLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICBjbGFzczogeyBhY3RpdmU6IF92bS5jdXJyZW50UGFnZSA9PT0gcGFnZXIsIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW192bS5fdihfdm0uX3MocGFnZXIpKV1cbiAgICAgICAgKVxuICAgICAgfSksXG4gICAgICBfdm0uc2hvd05leHRNb3JlXG4gICAgICAgID8gX2MoXCJsaVwiLCB7XG4gICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1pY29uIG1vcmUgYnRuLXF1aWNrbmV4dFwiLFxuICAgICAgICAgICAgY2xhc3M6IFtfdm0ucXVpY2tuZXh0SWNvbkNsYXNzLCB7IGRpc2FibGVkOiBfdm0uZGlzYWJsZWQgfV0sXG4gICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICBtb3VzZWVudGVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBfdm0ub25Nb3VzZWVudGVyKFwicmlnaHRcIilcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbW91c2VsZWF2ZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgX3ZtLnF1aWNrbmV4dEljb25DbGFzcyA9IFwiZWwtaWNvbi1tb3JlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfdm0ucGFnZUNvdW50ID4gMVxuICAgICAgICA/IF9jKFxuICAgICAgICAgICAgXCJsaVwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgY2xhc3M6IHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IF92bS5jdXJyZW50UGFnZSA9PT0gX3ZtLnBhZ2VDb3VudCxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogX3ZtLmRpc2FibGVkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0ucGFnZUNvdW50KSldXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpXG4gICAgXSxcbiAgICAyXG4gIClcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucGFnZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83Mjc0ZjI2N19yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3BhZ2luYXRpb24vc3JjL3BhZ2VyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03Mjc0ZjI2NyZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcGFnaW5hdGlvbi9zcmMvcGFnZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhZ2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsUGFnZXInLFxuXG4gIHByb3BzOiB7XG4gICAgY3VycmVudFBhZ2U6IE51bWJlcixcblxuICAgIHBhZ2VDb3VudDogTnVtYmVyLFxuXG4gICAgcGFnZXJDb3VudDogTnVtYmVyLFxuXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW5cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHNob3dQcmV2TW9yZTogZnVuY3Rpb24gc2hvd1ByZXZNb3JlKHZhbCkge1xuICAgICAgaWYgKCF2YWwpIHRoaXMucXVpY2twcmV2SWNvbkNsYXNzID0gJ2VsLWljb24tbW9yZSc7XG4gICAgfSxcbiAgICBzaG93TmV4dE1vcmU6IGZ1bmN0aW9uIHNob3dOZXh0TW9yZSh2YWwpIHtcbiAgICAgIGlmICghdmFsKSB0aGlzLnF1aWNrbmV4dEljb25DbGFzcyA9ICdlbC1pY29uLW1vcmUnO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25QYWdlckNsaWNrOiBmdW5jdGlvbiBvblBhZ2VyQ2xpY2soZXZlbnQpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdVTCcgfHwgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdQYWdlID0gTnVtYmVyKGV2ZW50LnRhcmdldC50ZXh0Q29udGVudCk7XG4gICAgICB2YXIgcGFnZUNvdW50ID0gdGhpcy5wYWdlQ291bnQ7XG4gICAgICB2YXIgY3VycmVudFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgICAgdmFyIHBhZ2VyQ291bnRPZmZzZXQgPSB0aGlzLnBhZ2VyQ291bnQgLSAyO1xuXG4gICAgICBpZiAodGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdtb3JlJykgIT09IC0xKSB7XG4gICAgICAgIGlmICh0YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3F1aWNrcHJldicpICE9PSAtMSkge1xuICAgICAgICAgIG5ld1BhZ2UgPSBjdXJyZW50UGFnZSAtIHBhZ2VyQ291bnRPZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdxdWlja25leHQnKSAhPT0gLTEpIHtcbiAgICAgICAgICBuZXdQYWdlID0gY3VycmVudFBhZ2UgKyBwYWdlckNvdW50T2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFpc05hTihuZXdQYWdlKSkge1xuICAgICAgICBpZiAobmV3UGFnZSA8IDEpIHtcbiAgICAgICAgICBuZXdQYWdlID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdQYWdlID4gcGFnZUNvdW50KSB7XG4gICAgICAgICAgbmV3UGFnZSA9IHBhZ2VDb3VudDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV3UGFnZSAhPT0gY3VycmVudFBhZ2UpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgbmV3UGFnZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbk1vdXNlZW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VlbnRlcihkaXJlY3Rpb24pIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgdGhpcy5xdWlja3ByZXZJY29uQ2xhc3MgPSAnZWwtaWNvbi1kLWFycm93LWxlZnQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5xdWlja25leHRJY29uQ2xhc3MgPSAnZWwtaWNvbi1kLWFycm93LXJpZ2h0JztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBwYWdlcnM6IGZ1bmN0aW9uIHBhZ2VycygpIHtcbiAgICAgIHZhciBwYWdlckNvdW50ID0gdGhpcy5wYWdlckNvdW50O1xuICAgICAgdmFyIGhhbGZQYWdlckNvdW50ID0gKHBhZ2VyQ291bnQgLSAxKSAvIDI7XG5cbiAgICAgIHZhciBjdXJyZW50UGFnZSA9IE51bWJlcih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICAgIHZhciBwYWdlQ291bnQgPSBOdW1iZXIodGhpcy5wYWdlQ291bnQpO1xuXG4gICAgICB2YXIgc2hvd1ByZXZNb3JlID0gZmFsc2U7XG4gICAgICB2YXIgc2hvd05leHRNb3JlID0gZmFsc2U7XG5cbiAgICAgIGlmIChwYWdlQ291bnQgPiBwYWdlckNvdW50KSB7XG4gICAgICAgIGlmIChjdXJyZW50UGFnZSA+IHBhZ2VyQ291bnQgLSBoYWxmUGFnZXJDb3VudCkge1xuICAgICAgICAgIHNob3dQcmV2TW9yZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudFBhZ2UgPCBwYWdlQ291bnQgLSBoYWxmUGFnZXJDb3VudCkge1xuICAgICAgICAgIHNob3dOZXh0TW9yZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGFycmF5ID0gW107XG5cbiAgICAgIGlmIChzaG93UHJldk1vcmUgJiYgIXNob3dOZXh0TW9yZSkge1xuICAgICAgICB2YXIgc3RhcnRQYWdlID0gcGFnZUNvdW50IC0gKHBhZ2VyQ291bnQgLSAyKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0UGFnZTsgaSA8IHBhZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgYXJyYXkucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghc2hvd1ByZXZNb3JlICYmIHNob3dOZXh0TW9yZSkge1xuICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgcGFnZXJDb3VudDsgX2krKykge1xuICAgICAgICAgIGFycmF5LnB1c2goX2kpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNob3dQcmV2TW9yZSAmJiBzaG93TmV4dE1vcmUpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IE1hdGguZmxvb3IocGFnZXJDb3VudCAvIDIpIC0gMTtcbiAgICAgICAgZm9yICh2YXIgX2kyID0gY3VycmVudFBhZ2UgLSBvZmZzZXQ7IF9pMiA8PSBjdXJyZW50UGFnZSArIG9mZnNldDsgX2kyKyspIHtcbiAgICAgICAgICBhcnJheS5wdXNoKF9pMik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIF9pMyA9IDI7IF9pMyA8IHBhZ2VDb3VudDsgX2kzKyspIHtcbiAgICAgICAgICBhcnJheS5wdXNoKF9pMyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zaG93UHJldk1vcmUgPSBzaG93UHJldk1vcmU7XG4gICAgICB0aGlzLnNob3dOZXh0TW9yZSA9IHNob3dOZXh0TW9yZTtcblxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50OiBudWxsLFxuICAgICAgc2hvd1ByZXZNb3JlOiBmYWxzZSxcbiAgICAgIHNob3dOZXh0TW9yZTogZmFsc2UsXG4gICAgICBxdWlja25leHRJY29uQ2xhc3M6ICdlbC1pY29uLW1vcmUnLFxuICAgICAgcXVpY2twcmV2SWNvbkNsYXNzOiAnZWwtaWNvbi1tb3JlJ1xuICAgIH07XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wYWdpbmF0aW9uL3NyYy9wYWdlci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3BhZ2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHBhZ2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbi8qIGdsb2JhbHMgX19WVUVfU1NSX0NPTlRFWFRfXyAqL1xuXG4vLyBJTVBPUlRBTlQ6IERvIE5PVCB1c2UgRVMyMDE1IGZlYXR1cmVzIGluIHRoaXMgZmlsZSAoZXhjZXB0IGZvciBtb2R1bGVzKS5cbi8vIFRoaXMgbW9kdWxlIGlzIGEgcnVudGltZSB1dGlsaXR5IGZvciBjbGVhbmVyIGNvbXBvbmVudCBtb2R1bGUgb3V0cHV0IGFuZCB3aWxsXG4vLyBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgd2VicGFjayB1c2VyIGJ1bmRsZS5cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50IChcbiAgc2NyaXB0RXhwb3J0cyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZ1bmN0aW9uYWxUZW1wbGF0ZSxcbiAgaW5qZWN0U3R5bGVzLFxuICBzY29wZUlkLFxuICBtb2R1bGVJZGVudGlmaWVyLCAvKiBzZXJ2ZXIgb25seSAqL1xuICBzaGFkb3dNb2RlIC8qIHZ1ZS1jbGkgb25seSAqL1xuKSB7XG4gIC8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3BcbiAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2NyaXB0RXhwb3J0cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2NyaXB0RXhwb3J0cy5vcHRpb25zXG4gICAgOiBzY3JpcHRFeHBvcnRzXG5cbiAgLy8gcmVuZGVyIGZ1bmN0aW9uc1xuICBpZiAocmVuZGVyKSB7XG4gICAgb3B0aW9ucy5yZW5kZXIgPSByZW5kZXJcbiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IHN0YXRpY1JlbmRlckZuc1xuICAgIG9wdGlvbnMuX2NvbXBpbGVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gZnVuY3Rpb25hbCB0ZW1wbGF0ZVxuICBpZiAoZnVuY3Rpb25hbFRlbXBsYXRlKSB7XG4gICAgb3B0aW9ucy5mdW5jdGlvbmFsID0gdHJ1ZVxuICB9XG5cbiAgLy8gc2NvcGVkSWRcbiAgaWYgKHNjb3BlSWQpIHtcbiAgICBvcHRpb25zLl9zY29wZUlkID0gJ2RhdGEtdi0nICsgc2NvcGVJZFxuICB9XG5cbiAgdmFyIGhvb2tcbiAgaWYgKG1vZHVsZUlkZW50aWZpZXIpIHsgLy8gc2VydmVyIGJ1aWxkXG4gICAgaG9vayA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAvLyAyLjMgaW5qZWN0aW9uXG4gICAgICBjb250ZXh0ID1cbiAgICAgICAgY29udGV4dCB8fCAvLyBjYWNoZWQgY2FsbFxuICAgICAgICAodGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dCkgfHwgLy8gc3RhdGVmdWxcbiAgICAgICAgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LiR2bm9kZSAmJiB0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCkgLy8gZnVuY3Rpb25hbFxuICAgICAgLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlXG4gICAgICBpZiAoIWNvbnRleHQgJiYgdHlwZW9mIF9fVlVFX1NTUl9DT05URVhUX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnRleHQgPSBfX1ZVRV9TU1JfQ09OVEVYVF9fXG4gICAgICB9XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHN0eWxlc1xuICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCBjb250ZXh0KVxuICAgICAgfVxuICAgICAgLy8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlXG4gICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykge1xuICAgICAgICBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcilcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGVcbiAgICAvLyBuZXZlciBnZXRzIGNhbGxlZFxuICAgIG9wdGlvbnMuX3NzclJlZ2lzdGVyID0gaG9va1xuICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykge1xuICAgIGhvb2sgPSBzaGFkb3dNb2RlXG4gICAgICA/IGZ1bmN0aW9uICgpIHsgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgdGhpcy4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290KSB9XG4gICAgICA6IGluamVjdFN0eWxlc1xuICB9XG5cbiAgaWYgKGhvb2spIHtcbiAgICBpZiAob3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndFxuICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgbm9ybWFsaXplclxuICAgICAgb3B0aW9ucy5faW5qZWN0U3R5bGVzID0gaG9va1xuICAgICAgLy8gcmVnaXN0ZXIgZm9yIGZ1bmN0aW9hbCBjb21wb25lbnQgaW4gdnVlIGZpbGVcbiAgICAgIHZhciBvcmlnaW5hbFJlbmRlciA9IG9wdGlvbnMucmVuZGVyXG4gICAgICBvcHRpb25zLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcldpdGhTdHlsZUluamVjdGlvbiAoaCwgY29udGV4dCkge1xuICAgICAgICBob29rLmNhbGwoY29udGV4dClcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsIGNvbnRleHQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgcmVnaXN0cmF0aW9uIGFzIGJlZm9yZUNyZWF0ZSBob29rXG4gICAgICB2YXIgZXhpc3RpbmcgPSBvcHRpb25zLmJlZm9yZUNyZWF0ZVxuICAgICAgb3B0aW9ucy5iZWZvcmVDcmVhdGUgPSBleGlzdGluZ1xuICAgICAgICA/IFtdLmNvbmNhdChleGlzdGluZywgaG9vaylcbiAgICAgICAgOiBbaG9va11cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcGFnaW5hdGlvbi9zcmMvcGFnZXIudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfcGFnZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHBhZ2VydnVlX3R5cGVfdGVtcGxhdGVfaWRfNzI3NGYyNjdfcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGFwaTsgfVxuY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9wYWdpbmF0aW9uL3NyYy9wYWdlci52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFnZXIgPSAoY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3NlbGVjdFwiXG52YXIgc2VsZWN0XyA9IF9fd2VicGFja19yZXF1aXJlX18oMzcpO1xudmFyIHNlbGVjdF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzZWxlY3RfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL29wdGlvblwiXG52YXIgb3B0aW9uXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzgpO1xudmFyIG9wdGlvbl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihvcHRpb25fKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL2lucHV0XCJcbnZhciBpbnB1dF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xudmFyIGlucHV0X2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGlucHV0Xyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvbG9jYWxlXCJcbnZhciBsb2NhbGVfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBsb2NhbGVfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obG9jYWxlXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCJcbnZhciB1dGlsXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcGFnaW5hdGlvbi9zcmMvcGFnaW5hdGlvbi5qc1xuXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWdpbmF0aW9uID0gKHtcbiAgbmFtZTogJ0VsUGFnaW5hdGlvbicsXG5cbiAgcHJvcHM6IHtcbiAgICBwYWdlU2l6ZToge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMTBcbiAgICB9LFxuXG4gICAgc21hbGw6IEJvb2xlYW4sXG5cbiAgICB0b3RhbDogTnVtYmVyLFxuXG4gICAgcGFnZUNvdW50OiBOdW1iZXIsXG5cbiAgICBwYWdlckNvdW50OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKHZhbHVlIHwgMCkgPT09IHZhbHVlICYmIHZhbHVlID4gNCAmJiB2YWx1ZSA8IDIyICYmIHZhbHVlICUgMiA9PT0gMTtcbiAgICAgIH0sXG5cbiAgICAgIGRlZmF1bHQ6IDdcbiAgICB9LFxuXG4gICAgY3VycmVudFBhZ2U6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDFcbiAgICB9LFxuXG4gICAgbGF5b3V0OiB7XG4gICAgICBkZWZhdWx0OiAncHJldiwgcGFnZXIsIG5leHQsIGp1bXBlciwgLT4sIHRvdGFsJ1xuICAgIH0sXG5cbiAgICBwYWdlU2l6ZXM6IHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiBbMTAsIDIwLCAzMCwgNDAsIDUwLCAxMDBdO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBwb3BwZXJDbGFzczogU3RyaW5nLFxuXG4gICAgcHJldlRleHQ6IFN0cmluZyxcblxuICAgIG5leHRUZXh0OiBTdHJpbmcsXG5cbiAgICBiYWNrZ3JvdW5kOiBCb29sZWFuLFxuXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW4sXG5cbiAgICBoaWRlT25TaW5nbGVQYWdlOiBCb29sZWFuXG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW50ZXJuYWxDdXJyZW50UGFnZTogMSxcbiAgICAgIGludGVybmFsUGFnZVNpemU6IDAsXG4gICAgICBsYXN0RW1pdHRlZFBhZ2U6IC0xLFxuICAgICAgdXNlckNoYW5nZVBhZ2VTaXplOiBmYWxzZVxuICAgIH07XG4gIH0sXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICB2YXIgbGF5b3V0ID0gdGhpcy5sYXlvdXQ7XG4gICAgaWYgKCFsYXlvdXQpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmhpZGVPblNpbmdsZVBhZ2UgJiYgKCF0aGlzLmludGVybmFsUGFnZUNvdW50IHx8IHRoaXMuaW50ZXJuYWxQYWdlQ291bnQgPT09IDEpKSByZXR1cm4gbnVsbDtcblxuICAgIHZhciB0ZW1wbGF0ZSA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogWydlbC1wYWdpbmF0aW9uJywge1xuICAgICAgICAnaXMtYmFja2dyb3VuZCc6IHRoaXMuYmFja2dyb3VuZCxcbiAgICAgICAgJ2VsLXBhZ2luYXRpb24tLXNtYWxsJzogdGhpcy5zbWFsbFxuICAgICAgfV0gfSk7XG4gICAgdmFyIFRFTVBMQVRFX01BUCA9IHtcbiAgICAgIHByZXY6IGgoJ3ByZXYnKSxcbiAgICAgIGp1bXBlcjogaCgnanVtcGVyJyksXG4gICAgICBwYWdlcjogaCgncGFnZXInLCB7XG4gICAgICAgIGF0dHJzOiB7IGN1cnJlbnRQYWdlOiB0aGlzLmludGVybmFsQ3VycmVudFBhZ2UsIHBhZ2VDb3VudDogdGhpcy5pbnRlcm5hbFBhZ2VDb3VudCwgcGFnZXJDb3VudDogdGhpcy5wYWdlckNvdW50LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LFxuICAgICAgICBvbjoge1xuICAgICAgICAgICdjaGFuZ2UnOiB0aGlzLmhhbmRsZUN1cnJlbnRDaGFuZ2VcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBuZXh0OiBoKCduZXh0JyksXG4gICAgICBzaXplczogaCgnc2l6ZXMnLCB7XG4gICAgICAgIGF0dHJzOiB7IHBhZ2VTaXplczogdGhpcy5wYWdlU2l6ZXMgfVxuICAgICAgfSksXG4gICAgICBzbG90OiBoKCdzbG90JywgW3RoaXMuJHNsb3RzLmRlZmF1bHQgPyB0aGlzLiRzbG90cy5kZWZhdWx0IDogJyddKSxcbiAgICAgIHRvdGFsOiBoKCd0b3RhbCcpXG4gICAgfTtcbiAgICB2YXIgY29tcG9uZW50cyA9IGxheW91dC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0udHJpbSgpO1xuICAgIH0pO1xuICAgIHZhciByaWdodFdyYXBwZXIgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdlbC1wYWdpbmF0aW9uX19yaWdodHdyYXBwZXInIH0pO1xuICAgIHZhciBoYXZlUmlnaHRXcmFwcGVyID0gZmFsc2U7XG5cbiAgICB0ZW1wbGF0ZS5jaGlsZHJlbiA9IHRlbXBsYXRlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHJpZ2h0V3JhcHBlci5jaGlsZHJlbiA9IHJpZ2h0V3JhcHBlci5jaGlsZHJlbiB8fCBbXTtcbiAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvKSB7XG4gICAgICBpZiAoY29tcG8gPT09ICctPicpIHtcbiAgICAgICAgaGF2ZVJpZ2h0V3JhcHBlciA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFoYXZlUmlnaHRXcmFwcGVyKSB7XG4gICAgICAgIHRlbXBsYXRlLmNoaWxkcmVuLnB1c2goVEVNUExBVEVfTUFQW2NvbXBvXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByaWdodFdyYXBwZXIuY2hpbGRyZW4ucHVzaChURU1QTEFURV9NQVBbY29tcG9dKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChoYXZlUmlnaHRXcmFwcGVyKSB7XG4gICAgICB0ZW1wbGF0ZS5jaGlsZHJlbi51bnNoaWZ0KHJpZ2h0V3JhcHBlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9LFxuXG5cbiAgY29tcG9uZW50czoge1xuICAgIFByZXY6IHtcbiAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICAgICAgcmV0dXJuIGgoXG4gICAgICAgICAgJ2J1dHRvbicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG5cbiAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuJHBhcmVudC5kaXNhYmxlZCB8fCB0aGlzLiRwYXJlbnQuaW50ZXJuYWxDdXJyZW50UGFnZSA8PSAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2NsYXNzJzogJ2J0bi1wcmV2Jywgb246IHtcbiAgICAgICAgICAgICAgJ2NsaWNrJzogdGhpcy4kcGFyZW50LnByZXZcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFt0aGlzLiRwYXJlbnQucHJldlRleHQgPyBoKCdzcGFuJywgW3RoaXMuJHBhcmVudC5wcmV2VGV4dF0pIDogaCgnaScsIHsgJ2NsYXNzJzogJ2VsLWljb24gZWwtaWNvbi1hcnJvdy1sZWZ0JyB9KV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgTmV4dDoge1xuICAgICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgICAgICByZXR1cm4gaChcbiAgICAgICAgICAnYnV0dG9uJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcblxuICAgICAgICAgICAgICBkaXNhYmxlZDogdGhpcy4kcGFyZW50LmRpc2FibGVkIHx8IHRoaXMuJHBhcmVudC5pbnRlcm5hbEN1cnJlbnRQYWdlID09PSB0aGlzLiRwYXJlbnQuaW50ZXJuYWxQYWdlQ291bnQgfHwgdGhpcy4kcGFyZW50LmludGVybmFsUGFnZUNvdW50ID09PSAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2NsYXNzJzogJ2J0bi1uZXh0Jywgb246IHtcbiAgICAgICAgICAgICAgJ2NsaWNrJzogdGhpcy4kcGFyZW50Lm5leHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFt0aGlzLiRwYXJlbnQubmV4dFRleHQgPyBoKCdzcGFuJywgW3RoaXMuJHBhcmVudC5uZXh0VGV4dF0pIDogaCgnaScsIHsgJ2NsYXNzJzogJ2VsLWljb24gZWwtaWNvbi1hcnJvdy1yaWdodCcgfSldXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIFNpemVzOiB7XG4gICAgICBtaXhpbnM6IFtsb2NhbGVfZGVmYXVsdC5hXSxcblxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgcGFnZVNpemVzOiBBcnJheVxuICAgICAgfSxcblxuICAgICAgd2F0Y2g6IHtcbiAgICAgICAgcGFnZVNpemVzOiB7XG4gICAgICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIobmV3VmFsLCBvbGRWYWwpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QodXRpbF9bXCJ2YWx1ZUVxdWFsc1wiXSkobmV3VmFsLCBvbGRWYWwpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdWYWwpKSB7XG4gICAgICAgICAgICAgIHRoaXMuJHBhcmVudC5pbnRlcm5hbFBhZ2VTaXplID0gbmV3VmFsLmluZGV4T2YodGhpcy4kcGFyZW50LnBhZ2VTaXplKSA+IC0xID8gdGhpcy4kcGFyZW50LnBhZ2VTaXplIDogdGhpcy5wYWdlU2l6ZXNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIGgoXG4gICAgICAgICAgJ3NwYW4nLFxuICAgICAgICAgIHsgJ2NsYXNzJzogJ2VsLXBhZ2luYXRpb25fX3NpemVzJyB9LFxuICAgICAgICAgIFtoKFxuICAgICAgICAgICAgJ2VsLXNlbGVjdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuJHBhcmVudC5pbnRlcm5hbFBhZ2VTaXplLFxuICAgICAgICAgICAgICAgIHBvcHBlckNsYXNzOiB0aGlzLiRwYXJlbnQucG9wcGVyQ2xhc3MgfHwgJycsXG4gICAgICAgICAgICAgICAgc2l6ZTogJ21pbmknLFxuXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuJHBhcmVudC5kaXNhYmxlZCB9LFxuICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICdpbnB1dCc6IHRoaXMuaGFuZGxlQ2hhbmdlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbdGhpcy5wYWdlU2l6ZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoKCdlbC1vcHRpb24nLCB7XG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0gKyBfdGhpcy50KCdlbC5wYWdpbmF0aW9uLnBhZ2VzaXplJykgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXVxuICAgICAgICAgICldXG4gICAgICAgICk7XG4gICAgICB9LFxuXG5cbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgRWxTZWxlY3Q6IHNlbGVjdF9kZWZhdWx0LmEsXG4gICAgICAgIEVsT3B0aW9uOiBvcHRpb25fZGVmYXVsdC5hXG4gICAgICB9LFxuXG4gICAgICBtZXRob2RzOiB7XG4gICAgICAgIGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKHZhbCkge1xuICAgICAgICAgIGlmICh2YWwgIT09IHRoaXMuJHBhcmVudC5pbnRlcm5hbFBhZ2VTaXplKSB7XG4gICAgICAgICAgICB0aGlzLiRwYXJlbnQuaW50ZXJuYWxQYWdlU2l6ZSA9IHZhbCA9IHBhcnNlSW50KHZhbCwgMTApO1xuICAgICAgICAgICAgdGhpcy4kcGFyZW50LnVzZXJDaGFuZ2VQYWdlU2l6ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLiRwYXJlbnQuJGVtaXQoJ3VwZGF0ZTpwYWdlU2l6ZScsIHZhbCk7XG4gICAgICAgICAgICB0aGlzLiRwYXJlbnQuJGVtaXQoJ3NpemUtY2hhbmdlJywgdmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgSnVtcGVyOiB7XG4gICAgICBtaXhpbnM6IFtsb2NhbGVfZGVmYXVsdC5hXSxcblxuICAgICAgY29tcG9uZW50czogeyBFbElucHV0OiBpbnB1dF9kZWZhdWx0LmEgfSxcblxuICAgICAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySW5wdXQ6IG51bGxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cblxuICAgICAgd2F0Y2g6IHtcbiAgICAgICAgJyRwYXJlbnQuaW50ZXJuYWxDdXJyZW50UGFnZSc6IGZ1bmN0aW9uICRwYXJlbnRJbnRlcm5hbEN1cnJlbnRQYWdlKCkge1xuICAgICAgICAgIHRoaXMudXNlcklucHV0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgbWV0aG9kczoge1xuICAgICAgICBoYW5kbGVLZXl1cDogZnVuY3Rpb24gaGFuZGxlS2V5dXAoX3JlZikge1xuICAgICAgICAgIHZhciBrZXlDb2RlID0gX3JlZi5rZXlDb2RlLFxuICAgICAgICAgICAgICB0YXJnZXQgPSBfcmVmLnRhcmdldDtcblxuICAgICAgICAgIC8vIENocm9tZSwgU2FmYXJpLCBGaXJlZm94IHRyaWdnZXJzIGNoYW5nZSBldmVudCBvbiBFbnRlclxuICAgICAgICAgIC8vIEhhY2sgZm9yIElFOiBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy8xMTcxMFxuICAgICAgICAgIC8vIERyb3AgdGhpcyBtZXRob2Qgd2hlbiB3ZSBubyBsb25nZXIgc3VwcG9ydHMgSUVcbiAgICAgICAgICBpZiAoa2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKHRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVJbnB1dDogZnVuY3Rpb24gaGFuZGxlSW5wdXQodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnVzZXJJbnB1dCA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZSh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuJHBhcmVudC5pbnRlcm5hbEN1cnJlbnRQYWdlID0gdGhpcy4kcGFyZW50LmdldFZhbGlkQ3VycmVudFBhZ2UodmFsdWUpO1xuICAgICAgICAgIHRoaXMuJHBhcmVudC5lbWl0Q2hhbmdlKCk7XG4gICAgICAgICAgdGhpcy51c2VySW5wdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgICAgIHJldHVybiBoKFxuICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICB7ICdjbGFzcyc6ICdlbC1wYWdpbmF0aW9uX19qdW1wJyB9LFxuICAgICAgICAgIFt0aGlzLnQoJ2VsLnBhZ2luYXRpb24uZ290bycpLCBoKCdlbC1pbnB1dCcsIHtcbiAgICAgICAgICAgICdjbGFzcyc6ICdlbC1wYWdpbmF0aW9uX19lZGl0b3IgaXMtaW4tcGFnaW5hdGlvbicsXG4gICAgICAgICAgICBhdHRyczogeyBtaW46IDEsXG4gICAgICAgICAgICAgIG1heDogdGhpcy4kcGFyZW50LmludGVybmFsUGFnZUNvdW50LFxuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy51c2VySW5wdXQgIT09IG51bGwgPyB0aGlzLnVzZXJJbnB1dCA6IHRoaXMuJHBhcmVudC5pbnRlcm5hbEN1cnJlbnRQYWdlLFxuICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuJHBhcmVudC5kaXNhYmxlZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hdGl2ZU9uOiB7XG4gICAgICAgICAgICAgICdrZXl1cCc6IHRoaXMuaGFuZGxlS2V5dXBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAnaW5wdXQnOiB0aGlzLmhhbmRsZUlucHV0LFxuICAgICAgICAgICAgICAnY2hhbmdlJzogdGhpcy5oYW5kbGVDaGFuZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSwgdGhpcy50KCdlbC5wYWdpbmF0aW9uLnBhZ2VDbGFzc2lmaWVyJyldXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIFRvdGFsOiB7XG4gICAgICBtaXhpbnM6IFtsb2NhbGVfZGVmYXVsdC5hXSxcblxuICAgICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuJHBhcmVudC50b3RhbCA9PT0gJ251bWJlcicgPyBoKFxuICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICB7ICdjbGFzcyc6ICdlbC1wYWdpbmF0aW9uX190b3RhbCcgfSxcbiAgICAgICAgICBbdGhpcy50KCdlbC5wYWdpbmF0aW9uLnRvdGFsJywgeyB0b3RhbDogdGhpcy4kcGFyZW50LnRvdGFsIH0pXVxuICAgICAgICApIDogJyc7XG4gICAgICB9XG4gICAgfSxcblxuICAgIFBhZ2VyOiBwYWdlclxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVDdXJyZW50Q2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVDdXJyZW50Q2hhbmdlKHZhbCkge1xuICAgICAgdGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlID0gdGhpcy5nZXRWYWxpZEN1cnJlbnRQYWdlKHZhbCk7XG4gICAgICB0aGlzLnVzZXJDaGFuZ2VQYWdlU2l6ZSA9IHRydWU7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9LFxuICAgIHByZXY6IGZ1bmN0aW9uIHByZXYoKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgdmFyIG5ld1ZhbCA9IHRoaXMuaW50ZXJuYWxDdXJyZW50UGFnZSAtIDE7XG4gICAgICB0aGlzLmludGVybmFsQ3VycmVudFBhZ2UgPSB0aGlzLmdldFZhbGlkQ3VycmVudFBhZ2UobmV3VmFsKTtcbiAgICAgIHRoaXMuJGVtaXQoJ3ByZXYtY2xpY2snLCB0aGlzLmludGVybmFsQ3VycmVudFBhZ2UpO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfSxcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICAgIHZhciBuZXdWYWwgPSB0aGlzLmludGVybmFsQ3VycmVudFBhZ2UgKyAxO1xuICAgICAgdGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlID0gdGhpcy5nZXRWYWxpZEN1cnJlbnRQYWdlKG5ld1ZhbCk7XG4gICAgICB0aGlzLiRlbWl0KCduZXh0LWNsaWNrJywgdGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlKTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH0sXG4gICAgZ2V0VmFsaWRDdXJyZW50UGFnZTogZnVuY3Rpb24gZ2V0VmFsaWRDdXJyZW50UGFnZSh2YWx1ZSkge1xuICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuXG4gICAgICB2YXIgaGF2ZVBhZ2VDb3VudCA9IHR5cGVvZiB0aGlzLmludGVybmFsUGFnZUNvdW50ID09PSAnbnVtYmVyJztcblxuICAgICAgdmFyIHJlc2V0VmFsdWUgPSB2b2lkIDA7XG4gICAgICBpZiAoIWhhdmVQYWdlQ291bnQpIHtcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDEpIHJlc2V0VmFsdWUgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHZhbHVlIDwgMSkge1xuICAgICAgICAgIHJlc2V0VmFsdWUgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gdGhpcy5pbnRlcm5hbFBhZ2VDb3VudCkge1xuICAgICAgICAgIHJlc2V0VmFsdWUgPSB0aGlzLmludGVybmFsUGFnZUNvdW50O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNldFZhbHVlID09PSB1bmRlZmluZWQgJiYgaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIHJlc2V0VmFsdWUgPSAxO1xuICAgICAgfSBlbHNlIGlmIChyZXNldFZhbHVlID09PSAwKSB7XG4gICAgICAgIHJlc2V0VmFsdWUgPSAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzZXRWYWx1ZSA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiByZXNldFZhbHVlO1xuICAgIH0sXG4gICAgZW1pdENoYW5nZTogZnVuY3Rpb24gZW1pdENoYW5nZSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczIuaW50ZXJuYWxDdXJyZW50UGFnZSAhPT0gX3RoaXMyLmxhc3RFbWl0dGVkUGFnZSB8fCBfdGhpczIudXNlckNoYW5nZVBhZ2VTaXplKSB7XG4gICAgICAgICAgX3RoaXMyLiRlbWl0KCdjdXJyZW50LWNoYW5nZScsIF90aGlzMi5pbnRlcm5hbEN1cnJlbnRQYWdlKTtcbiAgICAgICAgICBfdGhpczIubGFzdEVtaXR0ZWRQYWdlID0gX3RoaXMyLmludGVybmFsQ3VycmVudFBhZ2U7XG4gICAgICAgICAgX3RoaXMyLnVzZXJDaGFuZ2VQYWdlU2l6ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpbnRlcm5hbFBhZ2VDb3VudDogZnVuY3Rpb24gaW50ZXJuYWxQYWdlQ291bnQoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMudG90YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgxLCBNYXRoLmNlaWwodGhpcy50b3RhbCAvIHRoaXMuaW50ZXJuYWxQYWdlU2l6ZSkpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5wYWdlQ291bnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgxLCB0aGlzLnBhZ2VDb3VudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBjdXJyZW50UGFnZToge1xuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcih2YWwpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlID0gdGhpcy5nZXRWYWxpZEN1cnJlbnRQYWdlKHZhbCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHBhZ2VTaXplOiB7XG4gICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKHZhbCkge1xuICAgICAgICB0aGlzLmludGVybmFsUGFnZVNpemUgPSBpc05hTih2YWwpID8gMTAgOiB2YWw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGludGVybmFsQ3VycmVudFBhZ2U6IHtcbiAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIobmV3VmFsKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpjdXJyZW50UGFnZScsIG5ld1ZhbCk7XG4gICAgICAgIHRoaXMubGFzdEVtaXR0ZWRQYWdlID0gLTE7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGludGVybmFsUGFnZUNvdW50OiBmdW5jdGlvbiBpbnRlcm5hbFBhZ2VDb3VudChuZXdWYWwpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgdmFyIG9sZFBhZ2UgPSB0aGlzLmludGVybmFsQ3VycmVudFBhZ2U7XG4gICAgICBpZiAobmV3VmFsID4gMCAmJiBvbGRQYWdlID09PSAwKSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxDdXJyZW50UGFnZSA9IDE7XG4gICAgICB9IGVsc2UgaWYgKG9sZFBhZ2UgPiBuZXdWYWwpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlID0gbmV3VmFsID09PSAwID8gMSA6IG5ld1ZhbDtcbiAgICAgICAgdGhpcy51c2VyQ2hhbmdlUGFnZVNpemUgJiYgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnVzZXJDaGFuZ2VQYWdlU2l6ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3BhZ2luYXRpb24vaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xucGFnaW5hdGlvbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHBhZ2luYXRpb24ubmFtZSwgcGFnaW5hdGlvbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19wYWdpbmF0aW9uID0gKHBhZ2luYXRpb24pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kaWFsb2cvc3JjL2NvbXBvbmVudC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NjAxNDBlNjImXG52YXIgY29tcG9uZW50dnVlX3R5cGVfdGVtcGxhdGVfaWRfNjAxNDBlNjJfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwidHJhbnNpdGlvblwiLFxuICAgIHtcbiAgICAgIGF0dHJzOiB7IG5hbWU6IFwiZGlhbG9nLWZhZGVcIiB9LFxuICAgICAgb246IHsgXCJhZnRlci1lbnRlclwiOiBfdm0uYWZ0ZXJFbnRlciwgXCJhZnRlci1sZWF2ZVwiOiBfdm0uYWZ0ZXJMZWF2ZSB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBfdm0udmlzaWJsZSxcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJ2aXNpYmxlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWRpYWxvZ19fd3JhcHBlclwiLFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgIGlmICgkZXZlbnQudGFyZ2V0ICE9PSAkZXZlbnQuY3VycmVudFRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIF92bS5oYW5kbGVXcmFwcGVyQ2xpY2soJGV2ZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBfdm0ua2V5LFxuICAgICAgICAgICAgICByZWY6IFwiZGlhbG9nXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgXCJlbC1kaWFsb2dcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBcImlzLWZ1bGxzY3JlZW5cIjogX3ZtLmZ1bGxzY3JlZW4sXG4gICAgICAgICAgICAgICAgICBcImVsLWRpYWxvZy0tY2VudGVyXCI6IF92bS5jZW50ZXJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF92bS5jdXN0b21DbGFzc1xuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBzdHlsZTogX3ZtLnN0eWxlLFxuICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgIHJvbGU6IFwiZGlhbG9nXCIsXG4gICAgICAgICAgICAgICAgXCJhcmlhLW1vZGFsXCI6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiOiBfdm0udGl0bGUgfHwgXCJkaWFsb2dcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtZGlhbG9nX19oZWFkZXJcIiB9LFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF92bS5fdChcInRpdGxlXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtZGlhbG9nX190aXRsZVwiIH0sIFtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKF92bS50aXRsZSkpXG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgIF92bS5zaG93Q2xvc2VcbiAgICAgICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWRpYWxvZ19faGVhZGVyYnRuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHR5cGU6IFwiYnV0dG9uXCIsIFwiYXJpYS1sYWJlbFwiOiBcIkNsb3NlXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5oYW5kbGVDbG9zZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC1kaWFsb2dfX2Nsb3NlIGVsLWljb24gZWwtaWNvbi1jbG9zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF92bS5yZW5kZXJlZFxuICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtZGlhbG9nX19ib2R5XCIgfSxcbiAgICAgICAgICAgICAgICAgICAgW192bS5fdChcImRlZmF1bHRcIildLFxuICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgX3ZtLiRzbG90cy5mb290ZXJcbiAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLWRpYWxvZ19fZm9vdGVyXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgW192bS5fdChcImZvb3RlclwiKV0sXG4gICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKVxuICAgICAgICBdXG4gICAgICApXG4gICAgXVxuICApXG59XG52YXIgY29tcG9uZW50dnVlX3R5cGVfdGVtcGxhdGVfaWRfNjAxNDBlNjJfc3RhdGljUmVuZGVyRm5zID0gW11cbmNvbXBvbmVudHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYwMTQwZTYyX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGlhbG9nL3NyYy9jb21wb25lbnQudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTYwMTQwZTYyJlxuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvcG9wdXBcIlxudmFyIHBvcHVwXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xudmFyIHBvcHVwX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHBvcHVwXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvbWlncmF0aW5nXCJcbnZhciBtaWdyYXRpbmdfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcbnZhciBtaWdyYXRpbmdfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obWlncmF0aW5nXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZW1pdHRlclwiXG52YXIgZW1pdHRlcl8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xudmFyIGVtaXR0ZXJfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZW1pdHRlcl8pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kaWFsb2cvc3JjL2NvbXBvbmVudC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY29tcG9uZW50dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsRGlhbG9nJyxcblxuICBtaXhpbnM6IFtwb3B1cF9kZWZhdWx0LmEsIGVtaXR0ZXJfZGVmYXVsdC5hLCBtaWdyYXRpbmdfZGVmYXVsdC5hXSxcblxuICBwcm9wczoge1xuICAgIHRpdGxlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG5cbiAgICBtb2RhbDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuXG4gICAgbW9kYWxBcHBlbmRUb0JvZHk6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcblxuICAgIGFwcGVuZFRvQm9keToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcblxuICAgIGxvY2tTY3JvbGw6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcblxuICAgIGNsb3NlT25DbGlja01vZGFsOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG5cbiAgICBjbG9zZU9uUHJlc3NFc2NhcGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcblxuICAgIHNob3dDbG9zZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuXG4gICAgd2lkdGg6IFN0cmluZyxcblxuICAgIGZ1bGxzY3JlZW46IEJvb2xlYW4sXG5cbiAgICBjdXN0b21DbGFzczoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuXG4gICAgdG9wOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnMTV2aCdcbiAgICB9LFxuICAgIGJlZm9yZUNsb3NlOiBGdW5jdGlvbixcbiAgICBjZW50ZXI6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG5cbiAgICBkZXN0cm95T25DbG9zZTogQm9vbGVhblxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICBrZXk6IDBcbiAgICB9O1xuICB9LFxuXG5cbiAgd2F0Y2g6IHtcbiAgICB2aXNpYmxlOiBmdW5jdGlvbiB2aXNpYmxlKHZhbCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHZhbCkge1xuICAgICAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiRlbWl0KCdvcGVuJyk7XG4gICAgICAgIHRoaXMuJGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudXBkYXRlUG9wcGVyKTtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLiRyZWZzLmRpYWxvZy5zY3JvbGxUb3AgPSAwO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuYXBwZW5kVG9Cb2R5KSB7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLiRlbCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuJGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudXBkYXRlUG9wcGVyKTtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkgdGhpcy4kZW1pdCgnY2xvc2UnKTtcbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveU9uQ2xvc2UpIHtcbiAgICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5rZXkrKztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHN0eWxlOiBmdW5jdGlvbiBzdHlsZSgpIHtcbiAgICAgIHZhciBzdHlsZSA9IHt9O1xuICAgICAgaWYgKCF0aGlzLmZ1bGxzY3JlZW4pIHtcbiAgICAgICAgc3R5bGUubWFyZ2luVG9wID0gdGhpcy50b3A7XG4gICAgICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICAgICAgc3R5bGUud2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3R5bGU7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRNaWdyYXRpbmdDb25maWc6IGZ1bmN0aW9uIGdldE1pZ3JhdGluZ0NvbmZpZygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgJ3NpemUnOiAnc2l6ZSBpcyByZW1vdmVkLidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgIGhhbmRsZVdyYXBwZXJDbGljazogZnVuY3Rpb24gaGFuZGxlV3JhcHBlckNsaWNrKCkge1xuICAgICAgaWYgKCF0aGlzLmNsb3NlT25DbGlja01vZGFsKSByZXR1cm47XG4gICAgICB0aGlzLmhhbmRsZUNsb3NlKCk7XG4gICAgfSxcbiAgICBoYW5kbGVDbG9zZTogZnVuY3Rpb24gaGFuZGxlQ2xvc2UoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuYmVmb3JlQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5iZWZvcmVDbG9zZSh0aGlzLmhpZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoaWRlOiBmdW5jdGlvbiBoaWRlKGNhbmNlbCkge1xuICAgICAgaWYgKGNhbmNlbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnZpc2libGUnLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2Nsb3NlJyk7XG4gICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZVBvcHBlcjogZnVuY3Rpb24gdXBkYXRlUG9wcGVyKCkge1xuICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAndXBkYXRlUG9wcGVyJyk7XG4gICAgICB0aGlzLmJyb2FkY2FzdCgnRWxEcm9wZG93bk1lbnUnLCAndXBkYXRlUG9wcGVyJyk7XG4gICAgfSxcbiAgICBhZnRlckVudGVyOiBmdW5jdGlvbiBhZnRlckVudGVyKCkge1xuICAgICAgdGhpcy4kZW1pdCgnb3BlbmVkJyk7XG4gICAgfSxcbiAgICBhZnRlckxlYXZlOiBmdW5jdGlvbiBhZnRlckxlYXZlKCkge1xuICAgICAgdGhpcy4kZW1pdCgnY2xvc2VkJyk7XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgaWYgKHRoaXMudmlzaWJsZSkge1xuICAgICAgdGhpcy5yZW5kZXJlZCA9IHRydWU7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICAgIGlmICh0aGlzLmFwcGVuZFRvQm9keSkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuJGVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGRlc3Ryb3llZDogZnVuY3Rpb24gZGVzdHJveWVkKCkge1xuICAgIC8vIGlmIGFwcGVuZFRvQm9keSBpcyB0cnVlLCByZW1vdmUgRE9NIG5vZGUgYWZ0ZXIgZGVzdHJveVxuICAgIGlmICh0aGlzLmFwcGVuZFRvQm9keSAmJiB0aGlzLiRlbCAmJiB0aGlzLiRlbC5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLiRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJGVsKTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kaWFsb2cvc3JjL2NvbXBvbmVudC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2NvbXBvbmVudHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChjb21wb25lbnR2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGlhbG9nL3NyYy9jb21wb25lbnQudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50X2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2NvbXBvbmVudHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgY29tcG9uZW50dnVlX3R5cGVfdGVtcGxhdGVfaWRfNjAxNDBlNjJfcmVuZGVyLFxuICBjb21wb25lbnR2dWVfdHlwZV90ZW1wbGF0ZV9pZF82MDE0MGU2Ml9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGNvbXBvbmVudF9hcGk7IH1cbmNvbXBvbmVudF9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2RpYWxvZy9zcmMvY29tcG9uZW50LnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfY29tcG9uZW50ID0gKGNvbXBvbmVudF9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RpYWxvZy9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zcmNfY29tcG9uZW50Lmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoc3JjX2NvbXBvbmVudC5uYW1lLCBzcmNfY29tcG9uZW50KTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGRpYWxvZyA9IChzcmNfY29tcG9uZW50KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYXV0b2NvbXBsZXRlL3NyYy9hdXRvY29tcGxldGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE1MmYyZWU2JlxudmFyIGF1dG9jb21wbGV0ZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE1MmYyZWU2X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiY2xpY2tvdXRzaWRlXCIsXG4gICAgICAgICAgcmF3TmFtZTogXCJ2LWNsaWNrb3V0c2lkZVwiLFxuICAgICAgICAgIHZhbHVlOiBfdm0uY2xvc2UsXG4gICAgICAgICAgZXhwcmVzc2lvbjogXCJjbG9zZVwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1hdXRvY29tcGxldGVcIixcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiBcImxpc3Rib3hcIixcbiAgICAgICAgcm9sZTogXCJjb21ib2JveFwiLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogX3ZtLnN1Z2dlc3Rpb25WaXNpYmxlLFxuICAgICAgICBcImFyaWEtb3duc1wiOiBfdm0uaWRcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFxuICAgICAgICBcImVsLWlucHV0XCIsXG4gICAgICAgIF92bS5fYihcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZWY6IFwiaW5wdXRcIixcbiAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgIGlucHV0OiBfdm0uaGFuZGxlSW5wdXQsXG4gICAgICAgICAgICAgIGNoYW5nZTogX3ZtLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgICAgICAgZm9jdXM6IF92bS5oYW5kbGVGb2N1cyxcbiAgICAgICAgICAgICAgYmx1cjogX3ZtLmhhbmRsZUJsdXIsXG4gICAgICAgICAgICAgIGNsZWFyOiBfdm0uaGFuZGxlQ2xlYXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYXRpdmVPbjoge1xuICAgICAgICAgICAgICBrZXlkb3duOiBbXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJ1cFwiLCAzOCwgJGV2ZW50LmtleSwgW1xuICAgICAgICAgICAgICAgICAgICAgIFwiVXBcIixcbiAgICAgICAgICAgICAgICAgICAgICBcIkFycm93VXBcIlxuICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgX3ZtLmhpZ2hsaWdodChfdm0uaGlnaGxpZ2h0ZWRJbmRleCAtIDEpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImRvd25cIiwgNDAsICRldmVudC5rZXksIFtcbiAgICAgICAgICAgICAgICAgICAgICBcIkRvd25cIixcbiAgICAgICAgICAgICAgICAgICAgICBcIkFycm93RG93blwiXG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICBfdm0uaGlnaGxpZ2h0KF92bS5oaWdobGlnaHRlZEluZGV4ICsgMSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMsICRldmVudC5rZXksIFwiRW50ZXJcIilcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5oYW5kbGVLZXlFbnRlcigkZXZlbnQpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInRhYlwiLCA5LCAkZXZlbnQua2V5LCBcIlRhYlwiKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLmNsb3NlKCRldmVudClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZWwtaW5wdXRcIixcbiAgICAgICAgICBbX3ZtLiRwcm9wcywgX3ZtLiRhdHRyc10sXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKSxcbiAgICAgICAgW1xuICAgICAgICAgIF92bS4kc2xvdHMucHJlcGVuZFxuICAgICAgICAgICAgPyBfYyhcInRlbXBsYXRlXCIsIHsgc2xvdDogXCJwcmVwZW5kXCIgfSwgW192bS5fdChcInByZXBlbmRcIildLCAyKVxuICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICBfdm0uJHNsb3RzLmFwcGVuZFxuICAgICAgICAgICAgPyBfYyhcInRlbXBsYXRlXCIsIHsgc2xvdDogXCJhcHBlbmRcIiB9LCBbX3ZtLl90KFwiYXBwZW5kXCIpXSwgMilcbiAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgX3ZtLiRzbG90cy5wcmVmaXhcbiAgICAgICAgICAgID8gX2MoXCJ0ZW1wbGF0ZVwiLCB7IHNsb3Q6IFwicHJlZml4XCIgfSwgW192bS5fdChcInByZWZpeFwiKV0sIDIpXG4gICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgIF92bS4kc2xvdHMuc3VmZml4XG4gICAgICAgICAgICA/IF9jKFwidGVtcGxhdGVcIiwgeyBzbG90OiBcInN1ZmZpeFwiIH0sIFtfdm0uX3QoXCJzdWZmaXhcIildLCAyKVxuICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICBdLFxuICAgICAgICAyXG4gICAgICApLFxuICAgICAgX2MoXG4gICAgICAgIFwiZWwtYXV0b2NvbXBsZXRlLXN1Z2dlc3Rpb25zXCIsXG4gICAgICAgIHtcbiAgICAgICAgICByZWY6IFwic3VnZ2VzdGlvbnNcIixcbiAgICAgICAgICBjbGFzczogW192bS5wb3BwZXJDbGFzcyA/IF92bS5wb3BwZXJDbGFzcyA6IFwiXCJdLFxuICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICBcInZpc2libGUtYXJyb3dcIjogXCJcIixcbiAgICAgICAgICAgIFwicG9wcGVyLW9wdGlvbnNcIjogX3ZtLnBvcHBlck9wdGlvbnMsXG4gICAgICAgICAgICBcImFwcGVuZC10by1ib2R5XCI6IF92bS5wb3BwZXJBcHBlbmRUb0JvZHksXG4gICAgICAgICAgICBwbGFjZW1lbnQ6IF92bS5wbGFjZW1lbnQsXG4gICAgICAgICAgICBpZDogX3ZtLmlkXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBfdm0uX2woX3ZtLnN1Z2dlc3Rpb25zLCBmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgIFwibGlcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgICAgICAgY2xhc3M6IHsgaGlnaGxpZ2h0ZWQ6IF92bS5oaWdobGlnaHRlZEluZGV4ID09PSBpbmRleCB9LFxuICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgIGlkOiBfdm0uaWQgKyBcIi1pdGVtLVwiICsgaW5kZXgsXG4gICAgICAgICAgICAgICAgcm9sZTogXCJvcHRpb25cIixcbiAgICAgICAgICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogX3ZtLmhpZ2hsaWdodGVkSW5kZXggPT09IGluZGV4XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgX3ZtLnNlbGVjdChpdGVtKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX3ZtLl90KFxuICAgICAgICAgICAgICAgIFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF92bS5fdihcIlxcbiAgICAgICAgXCIgKyBfdm0uX3MoaXRlbVtfdm0udmFsdWVLZXldKSArIFwiXFxuICAgICAgXCIpXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB7IGl0ZW06IGl0ZW0gfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgfSksXG4gICAgICAgIDBcbiAgICAgIClcbiAgICBdLFxuICAgIDFcbiAgKVxufVxudmFyIGF1dG9jb21wbGV0ZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE1MmYyZWU2X3N0YXRpY1JlbmRlckZucyA9IFtdXG5hdXRvY29tcGxldGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8xNTJmMmVlNl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2F1dG9jb21wbGV0ZS9zcmMvYXV0b2NvbXBsZXRlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xNTJmMmVlNiZcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcInRocm90dGxlLWRlYm91bmNlL2RlYm91bmNlXCJcbnZhciBkZWJvdW5jZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcbnZhciBkZWJvdW5jZV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihkZWJvdW5jZV8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvY2xpY2tvdXRzaWRlXCJcbnZhciBjbGlja291dHNpZGVfID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG52YXIgY2xpY2tvdXRzaWRlX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNsaWNrb3V0c2lkZV8pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2F1dG9jb21wbGV0ZS9zcmMvYXV0b2NvbXBsZXRlLXN1Z2dlc3Rpb25zLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1jZDEwZGNmMCZcbnZhciBhdXRvY29tcGxldGVfc3VnZ2VzdGlvbnN2dWVfdHlwZV90ZW1wbGF0ZV9pZF9jZDEwZGNmMF9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJ0cmFuc2l0aW9uXCIsXG4gICAgeyBhdHRyczogeyBuYW1lOiBcImVsLXpvb20taW4tdG9wXCIgfSwgb246IHsgXCJhZnRlci1sZWF2ZVwiOiBfdm0uZG9EZXN0cm95IH0gfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBfdm0uc2hvd1BvcHBlcixcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJzaG93UG9wcGVyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWF1dG9jb21wbGV0ZS1zdWdnZXN0aW9uIGVsLXBvcHBlclwiLFxuICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICBcImlzLWxvYWRpbmdcIjogIV92bS5wYXJlbnQuaGlkZUxvYWRpbmcgJiYgX3ZtLnBhcmVudC5sb2FkaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHlsZTogeyB3aWR0aDogX3ZtLmRyb3Bkb3duV2lkdGggfSxcbiAgICAgICAgICBhdHRyczogeyByb2xlOiBcInJlZ2lvblwiIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJlbC1zY3JvbGxiYXJcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICB0YWc6IFwidWxcIixcbiAgICAgICAgICAgICAgICBcIndyYXAtY2xhc3NcIjogXCJlbC1hdXRvY29tcGxldGUtc3VnZ2VzdGlvbl9fd3JhcFwiLFxuICAgICAgICAgICAgICAgIFwidmlldy1jbGFzc1wiOiBcImVsLWF1dG9jb21wbGV0ZS1zdWdnZXN0aW9uX19saXN0XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgIV92bS5wYXJlbnQuaGlkZUxvYWRpbmcgJiYgX3ZtLnBhcmVudC5sb2FkaW5nXG4gICAgICAgICAgICAgICAgPyBfYyhcImxpXCIsIFtfYyhcImlcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pY29uLWxvYWRpbmdcIiB9KV0pXG4gICAgICAgICAgICAgICAgOiBfdm0uX3QoXCJkZWZhdWx0XCIpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgXSxcbiAgICAgICAgMVxuICAgICAgKVxuICAgIF1cbiAgKVxufVxudmFyIGF1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc3Z1ZV90eXBlX3RlbXBsYXRlX2lkX2NkMTBkY2YwX3N0YXRpY1JlbmRlckZucyA9IFtdXG5hdXRvY29tcGxldGVfc3VnZ2VzdGlvbnN2dWVfdHlwZV90ZW1wbGF0ZV9pZF9jZDEwZGNmMF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2F1dG9jb21wbGV0ZS9zcmMvYXV0b2NvbXBsZXRlLXN1Z2dlc3Rpb25zLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1jZDEwZGNmMCZcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Z1ZS1wb3BwZXJcIlxudmFyIHZ1ZV9wb3BwZXJfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbnZhciB2dWVfcG9wcGVyX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHZ1ZV9wb3BwZXJfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3Njcm9sbGJhclwiXG52YXIgc2Nyb2xsYmFyXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpO1xudmFyIHNjcm9sbGJhcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzY3JvbGxiYXJfKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYXV0b2NvbXBsZXRlL3NyYy9hdXRvY29tcGxldGUtc3VnZ2VzdGlvbnMudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhdXRvY29tcGxldGVfc3VnZ2VzdGlvbnN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBjb21wb25lbnRzOiB7IEVsU2Nyb2xsYmFyOiBzY3JvbGxiYXJfZGVmYXVsdC5hIH0sXG4gIG1peGluczogW3Z1ZV9wb3BwZXJfZGVmYXVsdC5hLCBlbWl0dGVyX2RlZmF1bHQuYV0sXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsQXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnMnLFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogdGhpcy4kcGFyZW50LFxuICAgICAgZHJvcGRvd25XaWR0aDogJydcbiAgICB9O1xuICB9LFxuXG5cbiAgcHJvcHM6IHtcbiAgICBvcHRpb25zOiB7XG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBncHVBY2NlbGVyYXRpb246IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcbiAgICBpZDogU3RyaW5nXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KGl0ZW0pIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsQXV0b2NvbXBsZXRlJywgJ2l0ZW0tY2xpY2snLCBpdGVtKTtcbiAgICB9XG4gIH0sXG5cbiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKF8pIHtcbiAgICAgIF90aGlzLnBvcHBlckpTICYmIF90aGlzLnVwZGF0ZVBvcHBlcigpO1xuICAgIH0pO1xuICB9LFxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHRoaXMuJHBhcmVudC5wb3BwZXJFbG0gPSB0aGlzLnBvcHBlckVsbSA9IHRoaXMuJGVsO1xuICAgIHRoaXMucmVmZXJlbmNlRWxtID0gdGhpcy4kcGFyZW50LiRyZWZzLmlucHV0LiRyZWZzLmlucHV0IHx8IHRoaXMuJHBhcmVudC4kcmVmcy5pbnB1dC4kcmVmcy50ZXh0YXJlYTtcbiAgICB0aGlzLnJlZmVyZW5jZUxpc3QgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuZWwtYXV0b2NvbXBsZXRlLXN1Z2dlc3Rpb25fX2xpc3QnKTtcbiAgICB0aGlzLnJlZmVyZW5jZUxpc3Quc2V0QXR0cmlidXRlKCdyb2xlJywgJ2xpc3Rib3gnKTtcbiAgICB0aGlzLnJlZmVyZW5jZUxpc3Quc2V0QXR0cmlidXRlKCdpZCcsIHRoaXMuaWQpO1xuICB9LFxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdGhpcy4kb24oJ3Zpc2libGUnLCBmdW5jdGlvbiAodmFsLCBpbnB1dFdpZHRoKSB7XG4gICAgICBfdGhpczIuZHJvcGRvd25XaWR0aCA9IGlucHV0V2lkdGggKyAncHgnO1xuICAgICAgX3RoaXMyLnNob3dQb3BwZXIgPSB2YWw7XG4gICAgfSk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9hdXRvY29tcGxldGUvc3JjL2F1dG9jb21wbGV0ZS1zdWdnZXN0aW9ucy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2F1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChhdXRvY29tcGxldGVfc3VnZ2VzdGlvbnN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYXV0b2NvbXBsZXRlL3NyYy9hdXRvY29tcGxldGUtc3VnZ2VzdGlvbnMudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgYXV0b2NvbXBsZXRlX3N1Z2dlc3Rpb25zX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2F1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgYXV0b2NvbXBsZXRlX3N1Z2dlc3Rpb25zdnVlX3R5cGVfdGVtcGxhdGVfaWRfY2QxMGRjZjBfcmVuZGVyLFxuICBhdXRvY29tcGxldGVfc3VnZ2VzdGlvbnN2dWVfdHlwZV90ZW1wbGF0ZV9pZF9jZDEwZGNmMF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGF1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc19hcGk7IH1cbmF1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc19jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2F1dG9jb21wbGV0ZS9zcmMvYXV0b2NvbXBsZXRlLXN1Z2dlc3Rpb25zLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhdXRvY29tcGxldGVfc3VnZ2VzdGlvbnMgPSAoYXV0b2NvbXBsZXRlX3N1Z2dlc3Rpb25zX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZm9jdXNcIlxudmFyIGZvY3VzXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xudmFyIGZvY3VzX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGZvY3VzXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2F1dG9jb21wbGV0ZS9zcmMvYXV0b2NvbXBsZXRlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhdXRvY29tcGxldGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxBdXRvY29tcGxldGUnLFxuXG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hLCBmb2N1c19kZWZhdWx0KCkoJ2lucHV0JyksIG1pZ3JhdGluZ19kZWZhdWx0LmFdLFxuXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsQXV0b2NvbXBsZXRlJyxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxJbnB1dDogaW5wdXRfZGVmYXVsdC5hLFxuICAgIEVsQXV0b2NvbXBsZXRlU3VnZ2VzdGlvbnM6IGF1dG9jb21wbGV0ZV9zdWdnZXN0aW9uc1xuICB9LFxuXG4gIGRpcmVjdGl2ZXM6IHsgQ2xpY2tvdXRzaWRlOiBjbGlja291dHNpZGVfZGVmYXVsdC5hIH0sXG5cbiAgcHJvcHM6IHtcbiAgICB2YWx1ZUtleToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ3ZhbHVlJ1xuICAgIH0sXG4gICAgcG9wcGVyQ2xhc3M6IFN0cmluZyxcbiAgICBwb3BwZXJPcHRpb25zOiBPYmplY3QsXG4gICAgcGxhY2Vob2xkZXI6IFN0cmluZyxcbiAgICBjbGVhcmFibGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW4sXG4gICAgbmFtZTogU3RyaW5nLFxuICAgIHNpemU6IFN0cmluZyxcbiAgICB2YWx1ZTogU3RyaW5nLFxuICAgIG1heGxlbmd0aDogTnVtYmVyLFxuICAgIG1pbmxlbmd0aDogTnVtYmVyLFxuICAgIGF1dG9mb2N1czogQm9vbGVhbixcbiAgICBmZXRjaFN1Z2dlc3Rpb25zOiBGdW5jdGlvbixcbiAgICB0cmlnZ2VyT25Gb2N1czoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGN1c3RvbUl0ZW06IFN0cmluZyxcbiAgICBzZWxlY3RXaGVuVW5tYXRjaGVkOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIHByZWZpeEljb246IFN0cmluZyxcbiAgICBzdWZmaXhJY29uOiBTdHJpbmcsXG4gICAgbGFiZWw6IFN0cmluZyxcbiAgICBkZWJvdW5jZToge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMzAwXG4gICAgfSxcbiAgICBwbGFjZW1lbnQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdib3R0b20tc3RhcnQnXG4gICAgfSxcbiAgICBoaWRlTG9hZGluZzogQm9vbGVhbixcbiAgICBwb3BwZXJBcHBlbmRUb0JvZHk6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBoaWdobGlnaHRGaXJzdEl0ZW06IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZhdGVkOiBmYWxzZSxcbiAgICAgIHN1Z2dlc3Rpb25zOiBbXSxcbiAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgaGlnaGxpZ2h0ZWRJbmRleDogLTEsXG4gICAgICBzdWdnZXN0aW9uRGlzYWJsZWQ6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHN1Z2dlc3Rpb25WaXNpYmxlOiBmdW5jdGlvbiBzdWdnZXN0aW9uVmlzaWJsZSgpIHtcbiAgICAgIHZhciBzdWdnZXN0aW9ucyA9IHRoaXMuc3VnZ2VzdGlvbnM7XG4gICAgICB2YXIgaXNWYWxpZERhdGEgPSBBcnJheS5pc0FycmF5KHN1Z2dlc3Rpb25zKSAmJiBzdWdnZXN0aW9ucy5sZW5ndGggPiAwO1xuICAgICAgcmV0dXJuIChpc1ZhbGlkRGF0YSB8fCB0aGlzLmxvYWRpbmcpICYmIHRoaXMuYWN0aXZhdGVkO1xuICAgIH0sXG4gICAgaWQ6IGZ1bmN0aW9uIGlkKCkge1xuICAgICAgcmV0dXJuICdlbC1hdXRvY29tcGxldGUtJyArIE9iamVjdCh1dGlsX1tcImdlbmVyYXRlSWRcIl0pKCk7XG4gICAgfVxuICB9LFxuICB3YXRjaDoge1xuICAgIHN1Z2dlc3Rpb25WaXNpYmxlOiBmdW5jdGlvbiBzdWdnZXN0aW9uVmlzaWJsZSh2YWwpIHtcbiAgICAgIHZhciAkaW5wdXQgPSB0aGlzLmdldElucHV0KCk7XG4gICAgICBpZiAoJGlucHV0KSB7XG4gICAgICAgIHRoaXMuYnJvYWRjYXN0KCdFbEF1dG9jb21wbGV0ZVN1Z2dlc3Rpb25zJywgJ3Zpc2libGUnLCBbdmFsLCAkaW5wdXQub2Zmc2V0V2lkdGhdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRNaWdyYXRpbmdDb25maWc6IGZ1bmN0aW9uIGdldE1pZ3JhdGluZ0NvbmZpZygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgJ2N1c3RvbS1pdGVtJzogJ2N1c3RvbS1pdGVtIGlzIHJlbW92ZWQsIHVzZSBzY29wZWQgc2xvdCBpbnN0ZWFkLicsXG4gICAgICAgICAgJ3Byb3BzJzogJ3Byb3BzIGlzIHJlbW92ZWQsIHVzZSB2YWx1ZS1rZXkgaW5zdGVhZC4nXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICBnZXREYXRhOiBmdW5jdGlvbiBnZXREYXRhKHF1ZXJ5U3RyaW5nKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5zdWdnZXN0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuZmV0Y2hTdWdnZXN0aW9ucyhxdWVyeVN0cmluZywgZnVuY3Rpb24gKHN1Z2dlc3Rpb25zKSB7XG4gICAgICAgIF90aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKF90aGlzLnN1Z2dlc3Rpb25EaXNhYmxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdWdnZXN0aW9ucykpIHtcbiAgICAgICAgICBfdGhpcy5zdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zO1xuICAgICAgICAgIF90aGlzLmhpZ2hsaWdodGVkSW5kZXggPSBfdGhpcy5oaWdobGlnaHRGaXJzdEl0ZW0gPyAwIDogLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW0VsZW1lbnQgRXJyb3JdW0F1dG9jb21wbGV0ZV1hdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGhhbmRsZUlucHV0OiBmdW5jdGlvbiBoYW5kbGVJbnB1dCh2YWx1ZSkge1xuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7XG4gICAgICB0aGlzLnN1Z2dlc3Rpb25EaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgaWYgKCF0aGlzLnRyaWdnZXJPbkZvY3VzICYmICF2YWx1ZSkge1xuICAgICAgICB0aGlzLnN1Z2dlc3Rpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3VnZ2VzdGlvbnMgPSBbXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5kZWJvdW5jZWRHZXREYXRhKHZhbHVlKTtcbiAgICB9LFxuICAgIGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKHZhbHVlKSB7XG4gICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWx1ZSk7XG4gICAgfSxcbiAgICBoYW5kbGVGb2N1czogZnVuY3Rpb24gaGFuZGxlRm9jdXMoZXZlbnQpIHtcbiAgICAgIHRoaXMuYWN0aXZhdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuJGVtaXQoJ2ZvY3VzJywgZXZlbnQpO1xuICAgICAgaWYgKHRoaXMudHJpZ2dlck9uRm9jdXMpIHtcbiAgICAgICAgdGhpcy5kZWJvdW5jZWRHZXREYXRhKHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlQmx1cjogZnVuY3Rpb24gaGFuZGxlQmx1cihldmVudCkge1xuICAgICAgdGhpcy4kZW1pdCgnYmx1cicsIGV2ZW50KTtcbiAgICB9LFxuICAgIGhhbmRsZUNsZWFyOiBmdW5jdGlvbiBoYW5kbGVDbGVhcigpIHtcbiAgICAgIHRoaXMuYWN0aXZhdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLiRlbWl0KCdjbGVhcicpO1xuICAgIH0sXG4gICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKGUpIHtcbiAgICAgIHRoaXMuYWN0aXZhdGVkID0gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVLZXlFbnRlcjogZnVuY3Rpb24gaGFuZGxlS2V5RW50ZXIoZSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25WaXNpYmxlICYmIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA+PSAwICYmIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA8IHRoaXMuc3VnZ2VzdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5zdWdnZXN0aW9uc1t0aGlzLmhpZ2hsaWdodGVkSW5kZXhdKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RXaGVuVW5tYXRjaGVkKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdCcsIHsgdmFsdWU6IHRoaXMudmFsdWUgfSk7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uIChfKSB7XG4gICAgICAgICAgX3RoaXMyLnN1Z2dlc3Rpb25zID0gW107XG4gICAgICAgICAgX3RoaXMyLmhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChpdGVtKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBpdGVtW3RoaXMudmFsdWVLZXldKTtcbiAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdCcsIGl0ZW0pO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKF8pIHtcbiAgICAgICAgX3RoaXMzLnN1Z2dlc3Rpb25zID0gW107XG4gICAgICAgIF90aGlzMy5oaWdobGlnaHRlZEluZGV4ID0gLTE7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGhpZ2hsaWdodDogZnVuY3Rpb24gaGlnaGxpZ2h0KGluZGV4KSB7XG4gICAgICBpZiAoIXRoaXMuc3VnZ2VzdGlvblZpc2libGUgfHwgdGhpcy5sb2FkaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gLTE7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCA+PSB0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICBpbmRleCA9IHRoaXMuc3VnZ2VzdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICAgIHZhciBzdWdnZXN0aW9uID0gdGhpcy4kcmVmcy5zdWdnZXN0aW9ucy4kZWwucXVlcnlTZWxlY3RvcignLmVsLWF1dG9jb21wbGV0ZS1zdWdnZXN0aW9uX193cmFwJyk7XG4gICAgICB2YXIgc3VnZ2VzdGlvbkxpc3QgPSBzdWdnZXN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJy5lbC1hdXRvY29tcGxldGUtc3VnZ2VzdGlvbl9fbGlzdCBsaScpO1xuXG4gICAgICB2YXIgaGlnaGxpZ2h0SXRlbSA9IHN1Z2dlc3Rpb25MaXN0W2luZGV4XTtcbiAgICAgIHZhciBzY3JvbGxUb3AgPSBzdWdnZXN0aW9uLnNjcm9sbFRvcDtcbiAgICAgIHZhciBvZmZzZXRUb3AgPSBoaWdobGlnaHRJdGVtLm9mZnNldFRvcDtcblxuICAgICAgaWYgKG9mZnNldFRvcCArIGhpZ2hsaWdodEl0ZW0uc2Nyb2xsSGVpZ2h0ID4gc2Nyb2xsVG9wICsgc3VnZ2VzdGlvbi5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgc3VnZ2VzdGlvbi5zY3JvbGxUb3AgKz0gaGlnaGxpZ2h0SXRlbS5zY3JvbGxIZWlnaHQ7XG4gICAgICB9XG4gICAgICBpZiAob2Zmc2V0VG9wIDwgc2Nyb2xsVG9wKSB7XG4gICAgICAgIHN1Z2dlc3Rpb24uc2Nyb2xsVG9wIC09IGhpZ2hsaWdodEl0ZW0uc2Nyb2xsSGVpZ2h0O1xuICAgICAgfVxuICAgICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gaW5kZXg7XG4gICAgICB2YXIgJGlucHV0ID0gdGhpcy5nZXRJbnB1dCgpO1xuICAgICAgJGlucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1hY3RpdmVkZXNjZW5kYW50JywgdGhpcy5pZCArICctaXRlbS0nICsgdGhpcy5oaWdobGlnaHRlZEluZGV4KTtcbiAgICB9LFxuICAgIGdldElucHV0OiBmdW5jdGlvbiBnZXRJbnB1dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLmlucHV0LmdldElucHV0KCk7XG4gICAgfVxuICB9LFxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgdGhpcy5kZWJvdW5jZWRHZXREYXRhID0gZGVib3VuY2VfZGVmYXVsdCgpKHRoaXMuZGVib3VuY2UsIHRoaXMuZ2V0RGF0YSk7XG4gICAgdGhpcy4kb24oJ2l0ZW0tY2xpY2snLCBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgX3RoaXM0LnNlbGVjdChpdGVtKTtcbiAgICB9KTtcbiAgICB2YXIgJGlucHV0ID0gdGhpcy5nZXRJbnB1dCgpO1xuICAgICRpbnB1dC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGV4dGJveCcpO1xuICAgICRpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYXV0b2NvbXBsZXRlJywgJ2xpc3QnKTtcbiAgICAkaW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLWNvbnRyb2xzJywgJ2lkJyk7XG4gICAgJGlucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1hY3RpdmVkZXNjZW5kYW50JywgdGhpcy5pZCArICctaXRlbS0nICsgdGhpcy5oaWdobGlnaHRlZEluZGV4KTtcbiAgfSxcbiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICB0aGlzLiRyZWZzLnN1Z2dlc3Rpb25zLiRkZXN0cm95KCk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9hdXRvY29tcGxldGUvc3JjL2F1dG9jb21wbGV0ZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2F1dG9jb21wbGV0ZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChhdXRvY29tcGxldGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYXV0b2NvbXBsZXRlL3NyYy9hdXRvY29tcGxldGUudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgYXV0b2NvbXBsZXRlX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2F1dG9jb21wbGV0ZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgYXV0b2NvbXBsZXRldnVlX3R5cGVfdGVtcGxhdGVfaWRfMTUyZjJlZTZfcmVuZGVyLFxuICBhdXRvY29tcGxldGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8xNTJmMmVlNl9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGF1dG9jb21wbGV0ZV9hcGk7IH1cbmF1dG9jb21wbGV0ZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2F1dG9jb21wbGV0ZS9zcmMvYXV0b2NvbXBsZXRlLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhdXRvY29tcGxldGUgPSAoYXV0b2NvbXBsZXRlX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYXV0b2NvbXBsZXRlL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmF1dG9jb21wbGV0ZS5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KGF1dG9jb21wbGV0ZS5uYW1lLCBhdXRvY29tcGxldGUpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfYXV0b2NvbXBsZXRlID0gKGF1dG9jb21wbGV0ZSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvYnV0dG9uXCJcbnZhciBidXR0b25fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG52YXIgYnV0dG9uX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGJ1dHRvbl8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvYnV0dG9uLWdyb3VwXCJcbnZhciBidXR0b25fZ3JvdXBfID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSk7XG52YXIgYnV0dG9uX2dyb3VwX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGJ1dHRvbl9ncm91cF8pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kcm9wZG93bi9zcmMvZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuXG5cblxuXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGRyb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsRHJvcGRvd24nLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbERyb3Bkb3duJyxcblxuICBtaXhpbnM6IFtlbWl0dGVyX2RlZmF1bHQuYSwgbWlncmF0aW5nX2RlZmF1bHQuYV0sXG5cbiAgZGlyZWN0aXZlczogeyBDbGlja291dHNpZGU6IGNsaWNrb3V0c2lkZV9kZWZhdWx0LmEgfSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxCdXR0b246IGJ1dHRvbl9kZWZhdWx0LmEsXG4gICAgRWxCdXR0b25Hcm91cDogYnV0dG9uX2dyb3VwX2RlZmF1bHQuYVxuICB9LFxuXG4gIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRyb3Bkb3duOiB0aGlzXG4gICAgfTtcbiAgfSxcblxuXG4gIHByb3BzOiB7XG4gICAgdHJpZ2dlcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2hvdmVyJ1xuICAgIH0sXG4gICAgdHlwZTogU3RyaW5nLFxuICAgIHNpemU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBzcGxpdEJ1dHRvbjogQm9vbGVhbixcbiAgICBoaWRlT25DbGljazoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIHBsYWNlbWVudDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2JvdHRvbS1lbmQnXG4gICAgfSxcbiAgICB2aXNpYmxlQXJyb3c6IHtcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIHNob3dUaW1lb3V0OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAyNTBcbiAgICB9LFxuICAgIGhpZGVUaW1lb3V0OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAxNTBcbiAgICB9LFxuICAgIHRhYmluZGV4OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAwXG4gICAgfSxcbiAgICBkaXNhYmxlZDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpbWVvdXQ6IG51bGwsXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgIHRyaWdnZXJFbG06IG51bGwsXG4gICAgICBtZW51SXRlbXM6IG51bGwsXG4gICAgICBtZW51SXRlbXNBcnJheTogbnVsbCxcbiAgICAgIGRyb3Bkb3duRWxtOiBudWxsLFxuICAgICAgZm9jdXNpbmc6IGZhbHNlLFxuICAgICAgbGlzdElkOiAnZHJvcGRvd24tbWVudS0nICsgT2JqZWN0KHV0aWxfW1wiZ2VuZXJhdGVJZFwiXSkoKVxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIGRyb3Bkb3duU2l6ZTogZnVuY3Rpb24gZHJvcGRvd25TaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSB8fCAodGhpcy4kRUxFTUVOVCB8fCB7fSkuc2l6ZTtcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB0aGlzLiRvbignbWVudS1pdGVtLWNsaWNrJywgdGhpcy5oYW5kbGVNZW51SXRlbUNsaWNrKTtcbiAgfSxcblxuXG4gIHdhdGNoOiB7XG4gICAgdmlzaWJsZTogZnVuY3Rpb24gdmlzaWJsZSh2YWwpIHtcbiAgICAgIHRoaXMuYnJvYWRjYXN0KCdFbERyb3Bkb3duTWVudScsICd2aXNpYmxlJywgdmFsKTtcbiAgICAgIHRoaXMuJGVtaXQoJ3Zpc2libGUtY2hhbmdlJywgdmFsKTtcbiAgICB9LFxuICAgIGZvY3VzaW5nOiBmdW5jdGlvbiBmb2N1c2luZyh2YWwpIHtcbiAgICAgIHZhciBzZWxmRGVmaW5lID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmVsLWRyb3Bkb3duLXNlbGZkZWZpbmUnKTtcbiAgICAgIGlmIChzZWxmRGVmaW5lKSB7XG4gICAgICAgIC8vIOiHquWumuS5iVxuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgc2VsZkRlZmluZS5jbGFzc05hbWUgKz0gJyBmb2N1c2luZyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZkRlZmluZS5jbGFzc05hbWUgPSBzZWxmRGVmaW5lLmNsYXNzTmFtZS5yZXBsYWNlKCdmb2N1c2luZycsICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TWlncmF0aW5nQ29uZmlnOiBmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICdtZW51LWFsaWduJzogJ21lbnUtYWxpZ24gaXMgcmVuYW1lZCB0byBwbGFjZW1lbnQuJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIH0sIHRoaXMudHJpZ2dlciA9PT0gJ2NsaWNrJyA/IDAgOiB0aGlzLnNob3dUaW1lb3V0KTtcbiAgICB9LFxuICAgIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICAgIHRoaXMucmVtb3ZlVGFiaW5kZXgoKTtcbiAgICAgIGlmICh0aGlzLnRhYmluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5yZXNldFRhYmluZGV4KHRoaXMudHJpZ2dlckVsbSk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfSwgdGhpcy50cmlnZ2VyID09PSAnY2xpY2snID8gMCA6IHRoaXMuaGlkZVRpbWVvdXQpO1xuICAgIH0sXG4gICAgaGFuZGxlQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLnZpc2libGUpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZVRyaWdnZXJLZXlEb3duOiBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VyS2V5RG93bihldikge1xuICAgICAgdmFyIGtleUNvZGUgPSBldi5rZXlDb2RlO1xuICAgICAgaWYgKFszOCwgNDBdLmluZGV4T2Yoa2V5Q29kZSkgPiAtMSkge1xuICAgICAgICAvLyB1cC9kb3duXG4gICAgICAgIHRoaXMucmVtb3ZlVGFiaW5kZXgoKTtcbiAgICAgICAgdGhpcy5yZXNldFRhYmluZGV4KHRoaXMubWVudUl0ZW1zWzBdKTtcbiAgICAgICAgdGhpcy5tZW51SXRlbXNbMF0uZm9jdXMoKTtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgIC8vIHNwYWNlIGVudGVy6YCJ5LitXG4gICAgICAgIHRoaXMuaGFuZGxlQ2xpY2soKTtcbiAgICAgIH0gZWxzZSBpZiAoWzksIDI3XS5pbmRleE9mKGtleUNvZGUpID4gLTEpIHtcbiAgICAgICAgLy8gdGFiIHx8IGVzY1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUl0ZW1LZXlEb3duOiBmdW5jdGlvbiBoYW5kbGVJdGVtS2V5RG93bihldikge1xuICAgICAgdmFyIGtleUNvZGUgPSBldi5rZXlDb2RlO1xuICAgICAgdmFyIHRhcmdldCA9IGV2LnRhcmdldDtcbiAgICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLm1lbnVJdGVtc0FycmF5LmluZGV4T2YodGFyZ2V0KTtcbiAgICAgIHZhciBtYXggPSB0aGlzLm1lbnVJdGVtc0FycmF5Lmxlbmd0aCAtIDE7XG4gICAgICB2YXIgbmV4dEluZGV4ID0gdm9pZCAwO1xuICAgICAgaWYgKFszOCwgNDBdLmluZGV4T2Yoa2V5Q29kZSkgPiAtMSkge1xuICAgICAgICAvLyB1cC9kb3duXG4gICAgICAgIGlmIChrZXlDb2RlID09PSAzOCkge1xuICAgICAgICAgIC8vIHVwXG4gICAgICAgICAgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICE9PSAwID8gY3VycmVudEluZGV4IC0gMSA6IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZG93blxuICAgICAgICAgIG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCA8IG1heCA/IGN1cnJlbnRJbmRleCArIDEgOiBtYXg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVUYWJpbmRleCgpO1xuICAgICAgICB0aGlzLnJlc2V0VGFiaW5kZXgodGhpcy5tZW51SXRlbXNbbmV4dEluZGV4XSk7XG4gICAgICAgIHRoaXMubWVudUl0ZW1zW25leHRJbmRleF0uZm9jdXMoKTtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgIC8vIGVudGVy6YCJ5LitXG4gICAgICAgIHRoaXMudHJpZ2dlckVsbUZvY3VzKCk7XG4gICAgICAgIHRhcmdldC5jbGljaygpO1xuICAgICAgICBpZiAodGhpcy5oaWRlT25DbGljaykge1xuICAgICAgICAgIC8vIGNsaWNr5YWz6ZetXG4gICAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoWzksIDI3XS5pbmRleE9mKGtleUNvZGUpID4gLTEpIHtcbiAgICAgICAgLy8gdGFiIC8vIGVzY1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyRWxtRm9jdXMoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlc2V0VGFiaW5kZXg6IGZ1bmN0aW9uIHJlc2V0VGFiaW5kZXgoZWxlKSB7XG4gICAgICAvLyDkuIvmrKF0YWLml7bnu4Tku7bogZrnhKblhYPntKBcbiAgICAgIHRoaXMucmVtb3ZlVGFiaW5kZXgoKTtcbiAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsgLy8g5LiL5qyh5pyf5pyb55qE6IGa54Sm5YWD57SgXG4gICAgfSxcbiAgICByZW1vdmVUYWJpbmRleDogZnVuY3Rpb24gcmVtb3ZlVGFiaW5kZXgoKSB7XG4gICAgICB0aGlzLnRyaWdnZXJFbG0uc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgICAgdGhpcy5tZW51SXRlbXNBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBpbml0QXJpYTogZnVuY3Rpb24gaW5pdEFyaWEoKSB7XG4gICAgICB0aGlzLmRyb3Bkb3duRWxtLnNldEF0dHJpYnV0ZSgnaWQnLCB0aGlzLmxpc3RJZCk7XG4gICAgICB0aGlzLnRyaWdnZXJFbG0uc2V0QXR0cmlidXRlKCdhcmlhLWhhc3BvcHVwJywgJ2xpc3QnKTtcbiAgICAgIHRoaXMudHJpZ2dlckVsbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtY29udHJvbHMnLCB0aGlzLmxpc3RJZCk7XG5cbiAgICAgIGlmICghdGhpcy5zcGxpdEJ1dHRvbikge1xuICAgICAgICAvLyDoh6rlrprkuYlcbiAgICAgICAgdGhpcy50cmlnZ2VyRWxtLnNldEF0dHJpYnV0ZSgncm9sZScsICdidXR0b24nKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyRWxtLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCB0aGlzLnRhYmluZGV4KTtcbiAgICAgICAgdGhpcy50cmlnZ2VyRWxtLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAodGhpcy50cmlnZ2VyRWxtLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAnIGVsLWRyb3Bkb3duLXNlbGZkZWZpbmUnKTsgLy8g5o6n5Yi2XG4gICAgICB9XG4gICAgfSxcbiAgICBpbml0RXZlbnQ6IGZ1bmN0aW9uIGluaXRFdmVudCgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgdHJpZ2dlciA9IHRoaXMudHJpZ2dlcixcbiAgICAgICAgICBzaG93ID0gdGhpcy5zaG93LFxuICAgICAgICAgIGhpZGUgPSB0aGlzLmhpZGUsXG4gICAgICAgICAgaGFuZGxlQ2xpY2sgPSB0aGlzLmhhbmRsZUNsaWNrLFxuICAgICAgICAgIHNwbGl0QnV0dG9uID0gdGhpcy5zcGxpdEJ1dHRvbixcbiAgICAgICAgICBoYW5kbGVUcmlnZ2VyS2V5RG93biA9IHRoaXMuaGFuZGxlVHJpZ2dlcktleURvd24sXG4gICAgICAgICAgaGFuZGxlSXRlbUtleURvd24gPSB0aGlzLmhhbmRsZUl0ZW1LZXlEb3duO1xuXG4gICAgICB0aGlzLnRyaWdnZXJFbG0gPSBzcGxpdEJ1dHRvbiA/IHRoaXMuJHJlZnMudHJpZ2dlci4kZWwgOiB0aGlzLiRzbG90cy5kZWZhdWx0WzBdLmVsbTtcblxuICAgICAgdmFyIGRyb3Bkb3duRWxtID0gdGhpcy5kcm9wZG93bkVsbTtcblxuICAgICAgdGhpcy50cmlnZ2VyRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVUcmlnZ2VyS2V5RG93bik7IC8vIHRyaWdnZXJFbG0ga2V5ZG93blxuICAgICAgZHJvcGRvd25FbG0uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUl0ZW1LZXlEb3duLCB0cnVlKTsgLy8gaXRlbSBrZXlkb3duXG4gICAgICAvLyDmjqfliLboh6rlrprkuYnlhYPntKDnmoTmoLflvI9cbiAgICAgIGlmICghc3BsaXRCdXR0b24pIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMy5mb2N1c2luZyA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRyaWdnZXJFbG0uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczMuZm9jdXNpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudHJpZ2dlckVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczMuZm9jdXNpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlciA9PT0gJ2hvdmVyJykge1xuICAgICAgICB0aGlzLnRyaWdnZXJFbG0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHNob3cpO1xuICAgICAgICB0aGlzLnRyaWdnZXJFbG0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGhpZGUpO1xuICAgICAgICBkcm9wZG93bkVsbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgc2hvdyk7XG4gICAgICAgIGRyb3Bkb3duRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBoaWRlKTtcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICB0aGlzLnRyaWdnZXJFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDbGljayk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVNZW51SXRlbUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVNZW51SXRlbUNsaWNrKGNvbW1hbmQsIGluc3RhbmNlKSB7XG4gICAgICBpZiAodGhpcy5oaWRlT25DbGljaykge1xuICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuJGVtaXQoJ2NvbW1hbmQnLCBjb21tYW5kLCBpbnN0YW5jZSk7XG4gICAgfSxcbiAgICB0cmlnZ2VyRWxtRm9jdXM6IGZ1bmN0aW9uIHRyaWdnZXJFbG1Gb2N1cygpIHtcbiAgICAgIHRoaXMudHJpZ2dlckVsbS5mb2N1cyAmJiB0aGlzLnRyaWdnZXJFbG0uZm9jdXMoKTtcbiAgICB9LFxuICAgIGluaXREb21PcGVyYXRpb246IGZ1bmN0aW9uIGluaXREb21PcGVyYXRpb24oKSB7XG4gICAgICB0aGlzLmRyb3Bkb3duRWxtID0gdGhpcy5wb3BwZXJFbG07XG4gICAgICB0aGlzLm1lbnVJdGVtcyA9IHRoaXMuZHJvcGRvd25FbG0ucXVlcnlTZWxlY3RvckFsbChcIlt0YWJpbmRleD0nLTEnXVwiKTtcbiAgICAgIHRoaXMubWVudUl0ZW1zQXJyYXkgPSBbXS5zbGljZS5jYWxsKHRoaXMubWVudUl0ZW1zKTtcblxuICAgICAgdGhpcy5pbml0RXZlbnQoKTtcbiAgICAgIHRoaXMuaW5pdEFyaWEoKTtcbiAgICB9XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgdmFyIGhpZGUgPSB0aGlzLmhpZGUsXG4gICAgICAgIHNwbGl0QnV0dG9uID0gdGhpcy5zcGxpdEJ1dHRvbixcbiAgICAgICAgdHlwZSA9IHRoaXMudHlwZSxcbiAgICAgICAgZHJvcGRvd25TaXplID0gdGhpcy5kcm9wZG93blNpemUsXG4gICAgICAgIGRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcblxuXG4gICAgdmFyIGhhbmRsZU1haW5CdXR0b25DbGljayA9IGZ1bmN0aW9uIGhhbmRsZU1haW5CdXR0b25DbGljayhldmVudCkge1xuICAgICAgX3RoaXM0LiRlbWl0KCdjbGljaycsIGV2ZW50KTtcbiAgICAgIGhpZGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIHRyaWdnZXJFbG0gPSBudWxsO1xuICAgIGlmIChzcGxpdEJ1dHRvbikge1xuICAgICAgdHJpZ2dlckVsbSA9IGgoJ2VsLWJ1dHRvbi1ncm91cCcsIFtoKFxuICAgICAgICAnZWwtYnV0dG9uJyxcbiAgICAgICAge1xuICAgICAgICAgIGF0dHJzOiB7IHR5cGU6IHR5cGUsIHNpemU6IGRyb3Bkb3duU2l6ZSwgZGlzYWJsZWQ6IGRpc2FibGVkIH0sXG4gICAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICAgICdjbGljayc6IGhhbmRsZU1haW5CdXR0b25DbGlja1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW3RoaXMuJHNsb3RzLmRlZmF1bHRdXG4gICAgICApLCBoKFxuICAgICAgICAnZWwtYnV0dG9uJyxcbiAgICAgICAgeyByZWY6ICd0cmlnZ2VyJywgYXR0cnM6IHsgdHlwZTogdHlwZSwgc2l6ZTogZHJvcGRvd25TaXplLCBkaXNhYmxlZDogZGlzYWJsZWQgfSxcbiAgICAgICAgICAnY2xhc3MnOiAnZWwtZHJvcGRvd25fX2NhcmV0LWJ1dHRvbicgfSxcbiAgICAgICAgW2goJ2knLCB7ICdjbGFzcyc6ICdlbC1kcm9wZG93bl9faWNvbiBlbC1pY29uLWFycm93LWRvd24nIH0pXVxuICAgICAgKV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRWxtID0gdGhpcy4kc2xvdHMuZGVmYXVsdDtcbiAgICAgIHZhciB2bm9kZURhdGEgPSB0cmlnZ2VyRWxtWzBdLmRhdGEgfHwge307XG4gICAgICB2YXIgX3Zub2RlRGF0YSRhdHRycyA9IHZub2RlRGF0YS5hdHRycyxcbiAgICAgICAgICBhdHRycyA9IF92bm9kZURhdGEkYXR0cnMgPT09IHVuZGVmaW5lZCA/IHt9IDogX3Zub2RlRGF0YSRhdHRycztcblxuICAgICAgaWYgKGRpc2FibGVkICYmICFhdHRycy5kaXNhYmxlZCkge1xuICAgICAgICBhdHRycy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHZub2RlRGF0YS5hdHRycyA9IGF0dHJzO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgbWVudUVsbSA9IGRpc2FibGVkID8gbnVsbCA6IHRoaXMuJHNsb3RzLmRyb3Bkb3duO1xuXG4gICAgcmV0dXJuIGgoXG4gICAgICAnZGl2JyxcbiAgICAgIHsgJ2NsYXNzJzogJ2VsLWRyb3Bkb3duJywgZGlyZWN0aXZlczogW3tcbiAgICAgICAgICBuYW1lOiAnY2xpY2tvdXRzaWRlJyxcbiAgICAgICAgICB2YWx1ZTogaGlkZVxuICAgICAgICB9XSxcbiAgICAgICAgYXR0cnM6IHsgJ2FyaWEtZGlzYWJsZWQnOiBkaXNhYmxlZCB9XG4gICAgICB9LFxuICAgICAgW3RyaWdnZXJFbG0sIG1lbnVFbG1dXG4gICAgKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGRyb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi52dWVcbnZhciBkcm9wZG93bl9yZW5kZXIsIGRyb3Bkb3duX3N0YXRpY1JlbmRlckZuc1xuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBkcm9wZG93bl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgZHJvcGRvd25fcmVuZGVyLFxuICBkcm9wZG93bl9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGRyb3Bkb3duX2FwaTsgfVxuZHJvcGRvd25fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9kcm9wZG93bi9zcmMvZHJvcGRvd24udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGRyb3Bkb3duID0gKGRyb3Bkb3duX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZHJvcGRvd24vaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZHJvcGRvd24uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChkcm9wZG93bi5uYW1lLCBkcm9wZG93bik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19kcm9wZG93biA9IChkcm9wZG93bik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi1tZW51LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wZGE2YjcxNCZcbnZhciBkcm9wZG93bl9tZW51dnVlX3R5cGVfdGVtcGxhdGVfaWRfMGRhNmI3MTRfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwidHJhbnNpdGlvblwiLFxuICAgIHsgYXR0cnM6IHsgbmFtZTogXCJlbC16b29tLWluLXRvcFwiIH0sIG9uOiB7IFwiYWZ0ZXItbGVhdmVcIjogX3ZtLmRvRGVzdHJveSB9IH0sXG4gICAgW1xuICAgICAgX2MoXG4gICAgICAgIFwidWxcIixcbiAgICAgICAge1xuICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBfdm0uc2hvd1BvcHBlcixcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJzaG93UG9wcGVyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWRyb3Bkb3duLW1lbnUgZWwtcG9wcGVyXCIsXG4gICAgICAgICAgY2xhc3M6IFtfdm0uc2l6ZSAmJiBcImVsLWRyb3Bkb3duLW1lbnUtLVwiICsgX3ZtLnNpemVdXG4gICAgICAgIH0sXG4gICAgICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAgICAgMlxuICAgICAgKVxuICAgIF1cbiAgKVxufVxudmFyIGRyb3Bkb3duX21lbnV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wZGE2YjcxNF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuZHJvcGRvd25fbWVudXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzBkYTZiNzE0X3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLW1lbnUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTBkYTZiNzE0JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kcm9wZG93bi9zcmMvZHJvcGRvd24tbWVudS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZHJvcGRvd25fbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbERyb3Bkb3duTWVudScsXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsRHJvcGRvd25NZW51JyxcblxuICBtaXhpbnM6IFt2dWVfcG9wcGVyX2RlZmF1bHQuYV0sXG5cbiAgcHJvcHM6IHtcbiAgICB2aXNpYmxlQXJyb3c6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBhcnJvd09mZnNldDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMFxuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaXplOiB0aGlzLmRyb3Bkb3duLmRyb3Bkb3duU2l6ZVxuICAgIH07XG4gIH0sXG5cblxuICBpbmplY3Q6IFsnZHJvcGRvd24nXSxcblxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLiRvbigndXBkYXRlUG9wcGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnNob3dQb3BwZXIpIF90aGlzLnVwZGF0ZVBvcHBlcigpO1xuICAgIH0pO1xuICAgIHRoaXMuJG9uKCd2aXNpYmxlJywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgX3RoaXMuc2hvd1BvcHBlciA9IHZhbDtcbiAgICB9KTtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB0aGlzLmRyb3Bkb3duLnBvcHBlckVsbSA9IHRoaXMucG9wcGVyRWxtID0gdGhpcy4kZWw7XG4gICAgdGhpcy5yZWZlcmVuY2VFbG0gPSB0aGlzLmRyb3Bkb3duLiRlbDtcbiAgICAvLyBjb21wYXRpYmxlIHdpdGggMi42IG5ldyB2LXNsb3Qgc3ludGF4XG4gICAgLy8gaXNzdWUgbGluayBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy8xNDM0NVxuICAgIHRoaXMuZHJvcGRvd24uaW5pdERvbU9wZXJhdGlvbigpO1xuICB9LFxuXG5cbiAgd2F0Y2g6IHtcbiAgICAnZHJvcGRvd24ucGxhY2VtZW50Jzoge1xuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcih2YWwpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGxhY2VtZW50ID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi1tZW51LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfZHJvcGRvd25fbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChkcm9wZG93bl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi1tZW51LnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGRyb3Bkb3duX21lbnVfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfZHJvcGRvd25fbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgZHJvcGRvd25fbWVudXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzBkYTZiNzE0X3JlbmRlcixcbiAgZHJvcGRvd25fbWVudXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzBkYTZiNzE0X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgZHJvcGRvd25fbWVudV9hcGk7IH1cbmRyb3Bkb3duX21lbnVfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9kcm9wZG93bi9zcmMvZHJvcGRvd24tbWVudS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZHJvcGRvd25fbWVudSA9IChkcm9wZG93bl9tZW51X2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZHJvcGRvd24tbWVudS9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5kcm9wZG93bl9tZW51Lmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoZHJvcGRvd25fbWVudS5uYW1lLCBkcm9wZG93bl9tZW51KTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2Ryb3Bkb3duX21lbnUgPSAoZHJvcGRvd25fbWVudSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi1pdGVtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02MzU5MTAyYSZcbnZhciBkcm9wZG93bl9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjM1OTEwMmFfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwibGlcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1kcm9wZG93bi1tZW51X19pdGVtXCIsXG4gICAgICBjbGFzczoge1xuICAgICAgICBcImlzLWRpc2FibGVkXCI6IF92bS5kaXNhYmxlZCxcbiAgICAgICAgXCJlbC1kcm9wZG93bi1tZW51X19pdGVtLS1kaXZpZGVkXCI6IF92bS5kaXZpZGVkXG4gICAgICB9LFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IF92bS5kaXNhYmxlZCxcbiAgICAgICAgdGFiaW5kZXg6IF92bS5kaXNhYmxlZCA/IG51bGwgOiAtMVxuICAgICAgfSxcbiAgICAgIG9uOiB7IGNsaWNrOiBfdm0uaGFuZGxlQ2xpY2sgfVxuICAgIH0sXG4gICAgW192bS5pY29uID8gX2MoXCJpXCIsIHsgY2xhc3M6IF92bS5pY29uIH0pIDogX3ZtLl9lKCksIF92bS5fdChcImRlZmF1bHRcIildLFxuICAgIDJcbiAgKVxufVxudmFyIGRyb3Bkb3duX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF82MzU5MTAyYV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuZHJvcGRvd25faXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYzNTkxMDJhX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLWl0ZW0udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTYzNTkxMDJhJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kcm9wZG93bi9zcmMvZHJvcGRvd24taXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkcm9wZG93bl9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsRHJvcGRvd25JdGVtJyxcblxuICBtaXhpbnM6IFtlbWl0dGVyX2RlZmF1bHQuYV0sXG5cbiAgcHJvcHM6IHtcbiAgICBjb21tYW5kOiB7fSxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBkaXZpZGVkOiBCb29sZWFuLFxuICAgIGljb246IFN0cmluZ1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVDbGljazogZnVuY3Rpb24gaGFuZGxlQ2xpY2soZSkge1xuICAgICAgdGhpcy5kaXNwYXRjaCgnRWxEcm9wZG93bicsICdtZW51LWl0ZW0tY2xpY2snLCBbdGhpcy5jb21tYW5kLCB0aGlzXSk7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLWl0ZW0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19kcm9wZG93bl9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGRyb3Bkb3duX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLWl0ZW0udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgZHJvcGRvd25faXRlbV9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19kcm9wZG93bl9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBkcm9wZG93bl9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjM1OTEwMmFfcmVuZGVyLFxuICBkcm9wZG93bl9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjM1OTEwMmFfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBkcm9wZG93bl9pdGVtX2FwaTsgfVxuZHJvcGRvd25faXRlbV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi1pdGVtLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkcm9wZG93bl9pdGVtID0gKGRyb3Bkb3duX2l0ZW1fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kcm9wZG93bi1pdGVtL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmRyb3Bkb3duX2l0ZW0uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChkcm9wZG93bl9pdGVtLm5hbWUsIGRyb3Bkb3duX2l0ZW0pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfZHJvcGRvd25faXRlbSA9IChkcm9wZG93bl9pdGVtKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3V0aWxzL2FyaWEtdXRpbHMuanNcbnZhciBhcmlhID0gYXJpYSB8fCB7fTtcblxuYXJpYS5VdGlscyA9IGFyaWEuVXRpbHMgfHwge307XG5cbi8qKlxuICogQGRlc2MgU2V0IGZvY3VzIG9uIGRlc2NlbmRhbnQgbm9kZXMgdW50aWwgdGhlIGZpcnN0IGZvY3VzYWJsZSBlbGVtZW50IGlzXG4gKiAgICAgICBmb3VuZC5cbiAqIEBwYXJhbSBlbGVtZW50XG4gKiAgICAgICAgICBET00gbm9kZSBmb3Igd2hpY2ggdG8gZmluZCB0aGUgZmlyc3QgZm9jdXNhYmxlIGRlc2NlbmRhbnQuXG4gKiBAcmV0dXJuc1xuICogIHRydWUgaWYgYSBmb2N1c2FibGUgZWxlbWVudCBpcyBmb3VuZCBhbmQgZm9jdXMgaXMgc2V0LlxuICovXG5hcmlhLlV0aWxzLmZvY3VzRmlyc3REZXNjZW5kYW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBlbGVtZW50LmNoaWxkTm9kZXNbaV07XG4gICAgaWYgKGFyaWEuVXRpbHMuYXR0ZW1wdEZvY3VzKGNoaWxkKSB8fCBhcmlhLlV0aWxzLmZvY3VzRmlyc3REZXNjZW5kYW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQGRlc2MgRmluZCB0aGUgbGFzdCBkZXNjZW5kYW50IG5vZGUgdGhhdCBpcyBmb2N1c2FibGUuXG4gKiBAcGFyYW0gZWxlbWVudFxuICogICAgICAgICAgRE9NIG5vZGUgZm9yIHdoaWNoIHRvIGZpbmQgdGhlIGxhc3QgZm9jdXNhYmxlIGRlc2NlbmRhbnQuXG4gKiBAcmV0dXJuc1xuICogIHRydWUgaWYgYSBmb2N1c2FibGUgZWxlbWVudCBpcyBmb3VuZCBhbmQgZm9jdXMgaXMgc2V0LlxuICovXG5cbmFyaWEuVXRpbHMuZm9jdXNMYXN0RGVzY2VuZGFudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIGZvciAodmFyIGkgPSBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgY2hpbGQgPSBlbGVtZW50LmNoaWxkTm9kZXNbaV07XG4gICAgaWYgKGFyaWEuVXRpbHMuYXR0ZW1wdEZvY3VzKGNoaWxkKSB8fCBhcmlhLlV0aWxzLmZvY3VzTGFzdERlc2NlbmRhbnQoY2hpbGQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBAZGVzYyBTZXQgQXR0ZW1wdCB0byBzZXQgZm9jdXMgb24gdGhlIGN1cnJlbnQgbm9kZS5cbiAqIEBwYXJhbSBlbGVtZW50XG4gKiAgICAgICAgICBUaGUgbm9kZSB0byBhdHRlbXB0IHRvIGZvY3VzIG9uLlxuICogQHJldHVybnNcbiAqICB0cnVlIGlmIGVsZW1lbnQgaXMgZm9jdXNlZC5cbiAqL1xuYXJpYS5VdGlscy5hdHRlbXB0Rm9jdXMgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBpZiAoIWFyaWEuVXRpbHMuaXNGb2N1c2FibGUoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXJpYS5VdGlscy5JZ25vcmVVdGlsRm9jdXNDaGFuZ2VzID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBlbGVtZW50LmZvY3VzKCk7XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIGFyaWEuVXRpbHMuSWdub3JlVXRpbEZvY3VzQ2hhbmdlcyA9IGZhbHNlO1xuICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWxlbWVudDtcbn07XG5cbmFyaWEuVXRpbHMuaXNGb2N1c2FibGUgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBpZiAoZWxlbWVudC50YWJJbmRleCA+IDAgfHwgZWxlbWVudC50YWJJbmRleCA9PT0gMCAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgndGFiSW5kZXgnKSAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVsZW1lbnQuZGlzYWJsZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2ggKGVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICBjYXNlICdBJzpcbiAgICAgIHJldHVybiAhIWVsZW1lbnQuaHJlZiAmJiBlbGVtZW50LnJlbCAhPT0gJ2lnbm9yZSc7XG4gICAgY2FzZSAnSU5QVVQnOlxuICAgICAgcmV0dXJuIGVsZW1lbnQudHlwZSAhPT0gJ2hpZGRlbicgJiYgZWxlbWVudC50eXBlICE9PSAnZmlsZSc7XG4gICAgY2FzZSAnQlVUVE9OJzpcbiAgICBjYXNlICdTRUxFQ1QnOlxuICAgIGNhc2UgJ1RFWFRBUkVBJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICog6Kem5Y+R5LiA5Liq5LqL5Lu2XG4gKiBtb3VzZWVudGVyLCBtb3VzZWxlYXZlLCBtb3VzZW92ZXIsIGtleXVwLCBjaGFuZ2UsIGNsaWNrIOetiVxuICogQHBhcmFtICB7RWxlbWVudH0gZWxtXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSAgeyp9IG9wdHNcbiAqL1xuYXJpYS5VdGlscy50cmlnZ2VyRXZlbnQgPSBmdW5jdGlvbiAoZWxtLCBuYW1lKSB7XG4gIHZhciBldmVudE5hbWUgPSB2b2lkIDA7XG5cbiAgaWYgKC9ebW91c2V8Y2xpY2svLnRlc3QobmFtZSkpIHtcbiAgICBldmVudE5hbWUgPSAnTW91c2VFdmVudHMnO1xuICB9IGVsc2UgaWYgKC9ea2V5Ly50ZXN0KG5hbWUpKSB7XG4gICAgZXZlbnROYW1lID0gJ0tleWJvYXJkRXZlbnQnO1xuICB9IGVsc2Uge1xuICAgIGV2ZW50TmFtZSA9ICdIVE1MRXZlbnRzJztcbiAgfVxuICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoZXZlbnROYW1lKTtcblxuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgb3B0cyA9IEFycmF5KF9sZW4gPiAyID8gX2xlbiAtIDIgOiAwKSwgX2tleSA9IDI7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBvcHRzW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGV2dC5pbml0RXZlbnQuYXBwbHkoZXZ0LCBbbmFtZV0uY29uY2F0KG9wdHMpKTtcbiAgZWxtLmRpc3BhdGNoRXZlbnQgPyBlbG0uZGlzcGF0Y2hFdmVudChldnQpIDogZWxtLmZpcmVFdmVudCgnb24nICsgbmFtZSwgZXZ0KTtcblxuICByZXR1cm4gZWxtO1xufTtcblxuYXJpYS5VdGlscy5rZXlzID0ge1xuICB0YWI6IDksXG4gIGVudGVyOiAxMyxcbiAgc3BhY2U6IDMyLFxuICBsZWZ0OiAzNyxcbiAgdXA6IDM4LFxuICByaWdodDogMzksXG4gIGRvd246IDQwLFxuICBlc2M6IDI3XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhcmlhX3V0aWxzID0gKGFyaWEuVXRpbHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvdXRpbHMvbWVudS9hcmlhLXN1Ym1lbnUuanNcblxuXG52YXIgU3ViTWVudSA9IGZ1bmN0aW9uIFN1Yk1lbnUocGFyZW50LCBkb21Ob2RlKSB7XG4gIHRoaXMuZG9tTm9kZSA9IGRvbU5vZGU7XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB0aGlzLnN1Yk1lbnVJdGVtcyA9IFtdO1xuICB0aGlzLnN1YkluZGV4ID0gMDtcbiAgdGhpcy5pbml0KCk7XG59O1xuXG5TdWJNZW51LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnN1Yk1lbnVJdGVtcyA9IHRoaXMuZG9tTm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdsaScpO1xuICB0aGlzLmFkZExpc3RlbmVycygpO1xufTtcblxuU3ViTWVudS5wcm90b3R5cGUuZ290b1N1YkluZGV4ID0gZnVuY3Rpb24gKGlkeCkge1xuICBpZiAoaWR4ID09PSB0aGlzLnN1Yk1lbnVJdGVtcy5sZW5ndGgpIHtcbiAgICBpZHggPSAwO1xuICB9IGVsc2UgaWYgKGlkeCA8IDApIHtcbiAgICBpZHggPSB0aGlzLnN1Yk1lbnVJdGVtcy5sZW5ndGggLSAxO1xuICB9XG4gIHRoaXMuc3ViTWVudUl0ZW1zW2lkeF0uZm9jdXMoKTtcbiAgdGhpcy5zdWJJbmRleCA9IGlkeDtcbn07XG5cblN1Yk1lbnUucHJvdG90eXBlLmFkZExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIga2V5cyA9IGFyaWFfdXRpbHMua2V5cztcbiAgdmFyIHBhcmVudE5vZGUgPSB0aGlzLnBhcmVudC5kb21Ob2RlO1xuICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMuc3ViTWVudUl0ZW1zLCBmdW5jdGlvbiAoZWwpIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgcHJldkRlZiA9IGZhbHNlO1xuICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2Uga2V5cy5kb3duOlxuICAgICAgICAgIF90aGlzLmdvdG9TdWJJbmRleChfdGhpcy5zdWJJbmRleCArIDEpO1xuICAgICAgICAgIHByZXZEZWYgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGtleXMudXA6XG4gICAgICAgICAgX3RoaXMuZ290b1N1YkluZGV4KF90aGlzLnN1YkluZGV4IC0gMSk7XG4gICAgICAgICAgcHJldkRlZiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Uga2V5cy50YWI6XG4gICAgICAgICAgYXJpYV91dGlscy50cmlnZ2VyRXZlbnQocGFyZW50Tm9kZSwgJ21vdXNlbGVhdmUnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBrZXlzLmVudGVyOlxuICAgICAgICBjYXNlIGtleXMuc3BhY2U6XG4gICAgICAgICAgcHJldkRlZiA9IHRydWU7XG4gICAgICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZEZWYpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYXJpYV9zdWJtZW51ID0gKFN1Yk1lbnUpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvdXRpbHMvbWVudS9hcmlhLW1lbnVpdGVtLmpzXG5cblxuXG52YXIgTWVudUl0ZW0gPSBmdW5jdGlvbiBNZW51SXRlbShkb21Ob2RlKSB7XG4gIHRoaXMuZG9tTm9kZSA9IGRvbU5vZGU7XG4gIHRoaXMuc3VibWVudSA9IG51bGw7XG4gIHRoaXMuaW5pdCgpO1xufTtcblxuTWVudUl0ZW0ucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZG9tTm9kZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgdmFyIG1lbnVDaGlsZCA9IHRoaXMuZG9tTm9kZS5xdWVyeVNlbGVjdG9yKCcuZWwtbWVudScpO1xuICBpZiAobWVudUNoaWxkKSB7XG4gICAgdGhpcy5zdWJtZW51ID0gbmV3IGFyaWFfc3VibWVudSh0aGlzLCBtZW51Q2hpbGQpO1xuICB9XG4gIHRoaXMuYWRkTGlzdGVuZXJzKCk7XG59O1xuXG5NZW51SXRlbS5wcm90b3R5cGUuYWRkTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBrZXlzID0gYXJpYV91dGlscy5rZXlzO1xuICB0aGlzLmRvbU5vZGUuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBwcmV2RGVmID0gZmFsc2U7XG4gICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICBjYXNlIGtleXMuZG93bjpcbiAgICAgICAgYXJpYV91dGlscy50cmlnZ2VyRXZlbnQoZXZlbnQuY3VycmVudFRhcmdldCwgJ21vdXNlZW50ZXInKTtcbiAgICAgICAgX3RoaXMuc3VibWVudSAmJiBfdGhpcy5zdWJtZW51LmdvdG9TdWJJbmRleCgwKTtcbiAgICAgICAgcHJldkRlZiA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBrZXlzLnVwOlxuICAgICAgICBhcmlhX3V0aWxzLnRyaWdnZXJFdmVudChldmVudC5jdXJyZW50VGFyZ2V0LCAnbW91c2VlbnRlcicpO1xuICAgICAgICBfdGhpcy5zdWJtZW51ICYmIF90aGlzLnN1Ym1lbnUuZ290b1N1YkluZGV4KF90aGlzLnN1Ym1lbnUuc3ViTWVudUl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgICBwcmV2RGVmID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGtleXMudGFiOlxuICAgICAgICBhcmlhX3V0aWxzLnRyaWdnZXJFdmVudChldmVudC5jdXJyZW50VGFyZ2V0LCAnbW91c2VsZWF2ZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Uga2V5cy5lbnRlcjpcbiAgICAgIGNhc2Uga2V5cy5zcGFjZTpcbiAgICAgICAgcHJldkRlZiA9IHRydWU7XG4gICAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xpY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChwcmV2RGVmKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhcmlhX21lbnVpdGVtID0gKE1lbnVJdGVtKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3V0aWxzL21lbnUvYXJpYS1tZW51YmFyLmpzXG5cblxudmFyIE1lbnUgPSBmdW5jdGlvbiBNZW51KGRvbU5vZGUpIHtcbiAgdGhpcy5kb21Ob2RlID0gZG9tTm9kZTtcbiAgdGhpcy5pbml0KCk7XG59O1xuXG5NZW51LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbWVudUNoaWxkcmVuID0gdGhpcy5kb21Ob2RlLmNoaWxkTm9kZXM7XG4gIFtdLmZpbHRlci5jYWxsKG1lbnVDaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkLm5vZGVUeXBlID09PSAxO1xuICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIG5ldyBhcmlhX21lbnVpdGVtKGNoaWxkKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICB9KTtcbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhcmlhX21lbnViYXIgPSAoTWVudSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvZG9tXCJcbnZhciBkb21fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbWVudS9zcmMvbWVudS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBtZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsTWVudScsXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIHZhciBjb21wb25lbnQgPSBoKFxuICAgICAgJ3VsJyxcbiAgICAgIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICByb2xlOiAnbWVudWJhcidcbiAgICAgICAgfSxcbiAgICAgICAga2V5OiArdGhpcy5jb2xsYXBzZSxcbiAgICAgICAgc3R5bGU6IHsgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2tncm91bmRDb2xvciB8fCAnJyB9LFxuICAgICAgICAnY2xhc3MnOiB7XG4gICAgICAgICAgJ2VsLW1lbnUtLWhvcml6b250YWwnOiB0aGlzLm1vZGUgPT09ICdob3Jpem9udGFsJyxcbiAgICAgICAgICAnZWwtbWVudS0tY29sbGFwc2UnOiB0aGlzLmNvbGxhcHNlLFxuICAgICAgICAgIFwiZWwtbWVudVwiOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbdGhpcy4kc2xvdHMuZGVmYXVsdF1cbiAgICApO1xuXG4gICAgaWYgKHRoaXMuY29sbGFwc2VUcmFuc2l0aW9uKSB7XG4gICAgICByZXR1cm4gaCgnZWwtbWVudS1jb2xsYXBzZS10cmFuc2l0aW9uJywgW2NvbXBvbmVudF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbiAgfSxcblxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbE1lbnUnLFxuXG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hLCBtaWdyYXRpbmdfZGVmYXVsdC5hXSxcblxuICBwcm92aWRlOiBmdW5jdGlvbiBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICByb290TWVudTogdGhpc1xuICAgIH07XG4gIH0sXG5cblxuICBjb21wb25lbnRzOiB7XG4gICAgJ2VsLW1lbnUtY29sbGFwc2UtdHJhbnNpdGlvbic6IHtcbiAgICAgIGZ1bmN0aW9uYWw6IHRydWUsXG4gICAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihjcmVhdGVFbGVtZW50LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBtb2RlOiAnb3V0LWluJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb246IHtcbiAgICAgICAgICAgIGJlZm9yZUVudGVyOiBmdW5jdGlvbiBiZWZvcmVFbnRlcihlbCkge1xuICAgICAgICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gMC4yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudGVyOiBmdW5jdGlvbiBlbnRlcihlbCkge1xuICAgICAgICAgICAgICBPYmplY3QoZG9tX1tcImFkZENsYXNzXCJdKShlbCwgJ2VsLW9wYWNpdHktdHJhbnNpdGlvbicpO1xuICAgICAgICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlckVudGVyOiBmdW5jdGlvbiBhZnRlckVudGVyKGVsKSB7XG4gICAgICAgICAgICAgIE9iamVjdChkb21fW1wicmVtb3ZlQ2xhc3NcIl0pKGVsLCAnZWwtb3BhY2l0eS10cmFuc2l0aW9uJyk7XG4gICAgICAgICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiZWZvcmVMZWF2ZTogZnVuY3Rpb24gYmVmb3JlTGVhdmUoZWwpIHtcbiAgICAgICAgICAgICAgaWYgKCFlbC5kYXRhc2V0KSBlbC5kYXRhc2V0ID0ge307XG5cbiAgICAgICAgICAgICAgaWYgKE9iamVjdChkb21fW1wiaGFzQ2xhc3NcIl0pKGVsLCAnZWwtbWVudS0tY29sbGFwc2UnKSkge1xuICAgICAgICAgICAgICAgIE9iamVjdChkb21fW1wicmVtb3ZlQ2xhc3NcIl0pKGVsLCAnZWwtbWVudS0tY29sbGFwc2UnKTtcbiAgICAgICAgICAgICAgICBlbC5kYXRhc2V0Lm9sZE92ZXJmbG93ID0gZWwuc3R5bGUub3ZlcmZsb3c7XG4gICAgICAgICAgICAgICAgZWwuZGF0YXNldC5zY3JvbGxXaWR0aCA9IGVsLmNsaWVudFdpZHRoO1xuICAgICAgICAgICAgICAgIE9iamVjdChkb21fW1wiYWRkQ2xhc3NcIl0pKGVsLCAnZWwtbWVudS0tY29sbGFwc2UnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3QoZG9tX1tcImFkZENsYXNzXCJdKShlbCwgJ2VsLW1lbnUtLWNvbGxhcHNlJyk7XG4gICAgICAgICAgICAgICAgZWwuZGF0YXNldC5vbGRPdmVyZmxvdyA9IGVsLnN0eWxlLm92ZXJmbG93O1xuICAgICAgICAgICAgICAgIGVsLmRhdGFzZXQuc2Nyb2xsV2lkdGggPSBlbC5jbGllbnRXaWR0aDtcbiAgICAgICAgICAgICAgICBPYmplY3QoZG9tX1tcInJlbW92ZUNsYXNzXCJdKShlbCwgJ2VsLW1lbnUtLWNvbGxhcHNlJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBlbC5zdHlsZS53aWR0aCA9IGVsLnNjcm9sbFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgZWwuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWF2ZTogZnVuY3Rpb24gbGVhdmUoZWwpIHtcbiAgICAgICAgICAgICAgT2JqZWN0KGRvbV9bXCJhZGRDbGFzc1wiXSkoZWwsICdob3Jpem9udGFsLWNvbGxhcHNlLXRyYW5zaXRpb24nKTtcbiAgICAgICAgICAgICAgZWwuc3R5bGUud2lkdGggPSBlbC5kYXRhc2V0LnNjcm9sbFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCd0cmFuc2l0aW9uJywgZGF0YSwgY29udGV4dC5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ3ZlcnRpY2FsJ1xuICAgIH0sXG4gICAgZGVmYXVsdEFjdGl2ZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGRlZmF1bHRPcGVuZWRzOiBBcnJheSxcbiAgICB1bmlxdWVPcGVuZWQ6IEJvb2xlYW4sXG4gICAgcm91dGVyOiBCb29sZWFuLFxuICAgIG1lbnVUcmlnZ2VyOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnaG92ZXInXG4gICAgfSxcbiAgICBjb2xsYXBzZTogQm9vbGVhbixcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IFN0cmluZyxcbiAgICB0ZXh0Q29sb3I6IFN0cmluZyxcbiAgICBhY3RpdmVUZXh0Q29sb3I6IFN0cmluZyxcbiAgICBjb2xsYXBzZVRyYW5zaXRpb246IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmVJbmRleDogdGhpcy5kZWZhdWx0QWN0aXZlLFxuICAgICAgb3BlbmVkTWVudXM6IHRoaXMuZGVmYXVsdE9wZW5lZHMgJiYgIXRoaXMuY29sbGFwc2UgPyB0aGlzLmRlZmF1bHRPcGVuZWRzLnNsaWNlKDApIDogW10sXG4gICAgICBpdGVtczoge30sXG4gICAgICBzdWJtZW51czoge31cbiAgICB9O1xuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaG92ZXJCYWNrZ3JvdW5kOiBmdW5jdGlvbiBob3ZlckJhY2tncm91bmQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPyB0aGlzLm1peENvbG9yKHRoaXMuYmFja2dyb3VuZENvbG9yLCAwLjIpIDogJyc7XG4gICAgfSxcbiAgICBpc01lbnVQb3B1cDogZnVuY3Rpb24gaXNNZW51UG9wdXAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnaG9yaXpvbnRhbCcgfHwgdGhpcy5tb2RlID09PSAndmVydGljYWwnICYmIHRoaXMuY29sbGFwc2U7XG4gICAgfVxuICB9LFxuICB3YXRjaDoge1xuICAgIGRlZmF1bHRBY3RpdmU6IGZ1bmN0aW9uIGRlZmF1bHRBY3RpdmUodmFsdWUpIHtcbiAgICAgIGlmICghdGhpcy5pdGVtc1t2YWx1ZV0pIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUluZGV4KHZhbHVlKTtcbiAgICB9LFxuICAgIGRlZmF1bHRPcGVuZWRzOiBmdW5jdGlvbiBkZWZhdWx0T3BlbmVkcyh2YWx1ZSkge1xuICAgICAgaWYgKCF0aGlzLmNvbGxhcHNlKSB7XG4gICAgICAgIHRoaXMub3BlbmVkTWVudXMgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbGxhcHNlOiBmdW5jdGlvbiBjb2xsYXBzZSh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlKSB0aGlzLm9wZW5lZE1lbnVzID0gW107XG4gICAgICB0aGlzLmJyb2FkY2FzdCgnRWxTdWJtZW51JywgJ3RvZ2dsZS1jb2xsYXBzZScsIHZhbHVlKTtcbiAgICB9XG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICB1cGRhdGVBY3RpdmVJbmRleDogZnVuY3Rpb24gdXBkYXRlQWN0aXZlSW5kZXgodmFsKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbdmFsXSB8fCB0aGlzLml0ZW1zW3RoaXMuYWN0aXZlSW5kZXhdIHx8IHRoaXMuaXRlbXNbdGhpcy5kZWZhdWx0QWN0aXZlXTtcbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpdGVtLmluZGV4O1xuICAgICAgICB0aGlzLmluaXRPcGVuZWRNZW51KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldE1pZ3JhdGluZ0NvbmZpZzogZnVuY3Rpb24gZ2V0TWlncmF0aW5nQ29uZmlnKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAndGhlbWUnOiAndGhlbWUgaXMgcmVtb3ZlZC4nXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICBnZXRDb2xvckNoYW5uZWxzOiBmdW5jdGlvbiBnZXRDb2xvckNoYW5uZWxzKGNvbG9yKSB7XG4gICAgICBjb2xvciA9IGNvbG9yLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgICBpZiAoL15bMC05YS1mQS1GXXszfSQvLnRlc3QoY29sb3IpKSB7XG4gICAgICAgIGNvbG9yID0gY29sb3Iuc3BsaXQoJycpO1xuICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBjb2xvci5zcGxpY2UoaSwgMCwgY29sb3JbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbG9yID0gY29sb3Iuam9pbignJyk7XG4gICAgICB9XG4gICAgICBpZiAoL15bMC05YS1mQS1GXXs2fSQvLnRlc3QoY29sb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVkOiBwYXJzZUludChjb2xvci5zbGljZSgwLCAyKSwgMTYpLFxuICAgICAgICAgIGdyZWVuOiBwYXJzZUludChjb2xvci5zbGljZSgyLCA0KSwgMTYpLFxuICAgICAgICAgIGJsdWU6IHBhcnNlSW50KGNvbG9yLnNsaWNlKDQsIDYpLCAxNilcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVkOiAyNTUsXG4gICAgICAgICAgZ3JlZW46IDI1NSxcbiAgICAgICAgICBibHVlOiAyNTVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1peENvbG9yOiBmdW5jdGlvbiBtaXhDb2xvcihjb2xvciwgcGVyY2VudCkge1xuICAgICAgdmFyIF9nZXRDb2xvckNoYW5uZWxzID0gdGhpcy5nZXRDb2xvckNoYW5uZWxzKGNvbG9yKSxcbiAgICAgICAgICByZWQgPSBfZ2V0Q29sb3JDaGFubmVscy5yZWQsXG4gICAgICAgICAgZ3JlZW4gPSBfZ2V0Q29sb3JDaGFubmVscy5ncmVlbixcbiAgICAgICAgICBibHVlID0gX2dldENvbG9yQ2hhbm5lbHMuYmx1ZTtcblxuICAgICAgaWYgKHBlcmNlbnQgPiAwKSB7XG4gICAgICAgIC8vIHNoYWRlIGdpdmVuIGNvbG9yXG4gICAgICAgIHJlZCAqPSAxIC0gcGVyY2VudDtcbiAgICAgICAgZ3JlZW4gKj0gMSAtIHBlcmNlbnQ7XG4gICAgICAgIGJsdWUgKj0gMSAtIHBlcmNlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aW50IGdpdmVuIGNvbG9yXG4gICAgICAgIHJlZCArPSAoMjU1IC0gcmVkKSAqIHBlcmNlbnQ7XG4gICAgICAgIGdyZWVuICs9ICgyNTUgLSBncmVlbikgKiBwZXJjZW50O1xuICAgICAgICBibHVlICs9ICgyNTUgLSBibHVlKSAqIHBlcmNlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ3JnYignICsgTWF0aC5yb3VuZChyZWQpICsgJywgJyArIE1hdGgucm91bmQoZ3JlZW4pICsgJywgJyArIE1hdGgucm91bmQoYmx1ZSkgKyAnKSc7XG4gICAgfSxcbiAgICBhZGRJdGVtOiBmdW5jdGlvbiBhZGRJdGVtKGl0ZW0pIHtcbiAgICAgIHRoaXMuJHNldCh0aGlzLml0ZW1zLCBpdGVtLmluZGV4LCBpdGVtKTtcbiAgICB9LFxuICAgIHJlbW92ZUl0ZW06IGZ1bmN0aW9uIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgZGVsZXRlIHRoaXMuaXRlbXNbaXRlbS5pbmRleF07XG4gICAgfSxcbiAgICBhZGRTdWJtZW51OiBmdW5jdGlvbiBhZGRTdWJtZW51KGl0ZW0pIHtcbiAgICAgIHRoaXMuJHNldCh0aGlzLnN1Ym1lbnVzLCBpdGVtLmluZGV4LCBpdGVtKTtcbiAgICB9LFxuICAgIHJlbW92ZVN1Ym1lbnU6IGZ1bmN0aW9uIHJlbW92ZVN1Ym1lbnUoaXRlbSkge1xuICAgICAgZGVsZXRlIHRoaXMuc3VibWVudXNbaXRlbS5pbmRleF07XG4gICAgfSxcbiAgICBvcGVuTWVudTogZnVuY3Rpb24gb3Blbk1lbnUoaW5kZXgsIGluZGV4UGF0aCkge1xuICAgICAgdmFyIG9wZW5lZE1lbnVzID0gdGhpcy5vcGVuZWRNZW51cztcbiAgICAgIGlmIChvcGVuZWRNZW51cy5pbmRleE9mKGluZGV4KSAhPT0gLTEpIHJldHVybjtcbiAgICAgIC8vIOWwhuS4jeWcqOivpeiPnOWNlei3r+W+hOS4i+eahOWFtuS9meiPnOWNleaUtui1t1xuICAgICAgLy8gY29sbGFwc2UgYWxsIG1lbnUgdGhhdCBhcmUgbm90IHVuZGVyIGN1cnJlbnQgbWVudSBpdGVtXG4gICAgICBpZiAodGhpcy51bmlxdWVPcGVuZWQpIHtcbiAgICAgICAgdGhpcy5vcGVuZWRNZW51cyA9IG9wZW5lZE1lbnVzLmZpbHRlcihmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXhQYXRoLmluZGV4T2YoaW5kZXgpICE9PSAtMTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLm9wZW5lZE1lbnVzLnB1c2goaW5kZXgpO1xuICAgIH0sXG4gICAgY2xvc2VNZW51OiBmdW5jdGlvbiBjbG9zZU1lbnUoaW5kZXgpIHtcbiAgICAgIHZhciBpID0gdGhpcy5vcGVuZWRNZW51cy5pbmRleE9mKGluZGV4KTtcbiAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICB0aGlzLm9wZW5lZE1lbnVzLnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZVN1Ym1lbnVDbGljazogZnVuY3Rpb24gaGFuZGxlU3VibWVudUNsaWNrKHN1Ym1lbnUpIHtcbiAgICAgIHZhciBpbmRleCA9IHN1Ym1lbnUuaW5kZXgsXG4gICAgICAgICAgaW5kZXhQYXRoID0gc3VibWVudS5pbmRleFBhdGg7XG5cbiAgICAgIHZhciBpc09wZW5lZCA9IHRoaXMub3BlbmVkTWVudXMuaW5kZXhPZihpbmRleCkgIT09IC0xO1xuXG4gICAgICBpZiAoaXNPcGVuZWQpIHtcbiAgICAgICAgdGhpcy5jbG9zZU1lbnUoaW5kZXgpO1xuICAgICAgICB0aGlzLiRlbWl0KCdjbG9zZScsIGluZGV4LCBpbmRleFBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcGVuTWVudShpbmRleCwgaW5kZXhQYXRoKTtcbiAgICAgICAgdGhpcy4kZW1pdCgnb3BlbicsIGluZGV4LCBpbmRleFBhdGgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlSXRlbUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVJdGVtQ2xpY2soaXRlbSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGluZGV4ID0gaXRlbS5pbmRleCxcbiAgICAgICAgICBpbmRleFBhdGggPSBpdGVtLmluZGV4UGF0aDtcblxuICAgICAgdmFyIG9sZEFjdGl2ZUluZGV4ID0gdGhpcy5hY3RpdmVJbmRleDtcbiAgICAgIHZhciBoYXNJbmRleCA9IGl0ZW0uaW5kZXggIT09IG51bGw7XG5cbiAgICAgIGlmIChoYXNJbmRleCkge1xuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gaXRlbS5pbmRleDtcbiAgICAgIH1cblxuICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0JywgaW5kZXgsIGluZGV4UGF0aCwgaXRlbSk7XG5cbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdob3Jpem9udGFsJyB8fCB0aGlzLmNvbGxhcHNlKSB7XG4gICAgICAgIHRoaXMub3BlbmVkTWVudXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucm91dGVyICYmIGhhc0luZGV4KSB7XG4gICAgICAgIHRoaXMucm91dGVUb0l0ZW0oaXRlbSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgX3RoaXMuYWN0aXZlSW5kZXggPSBvbGRBY3RpdmVJbmRleDtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIHZ1ZS1yb3V0ZXIgMy4xLjArIHB1c2gvcmVwbGFjZSBjYXVzZSBOYXZpZ2F0aW9uRHVwbGljYXRlZCBlcnJvciBcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZUZFL2VsZW1lbnQvaXNzdWVzLzE3MDQ0XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ05hdmlnYXRpb25EdXBsaWNhdGVkJykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW5bGV5byA6I+c5Y2VXG4gICAgLy8gaW5pdGlhbGl6ZSBvcGVuZWQgbWVudVxuICAgIGluaXRPcGVuZWRNZW51OiBmdW5jdGlvbiBpbml0T3BlbmVkTWVudSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLmFjdGl2ZUluZGV4O1xuICAgICAgdmFyIGFjdGl2ZUl0ZW0gPSB0aGlzLml0ZW1zW2luZGV4XTtcbiAgICAgIGlmICghYWN0aXZlSXRlbSB8fCB0aGlzLm1vZGUgPT09ICdob3Jpem9udGFsJyB8fCB0aGlzLmNvbGxhcHNlKSByZXR1cm47XG5cbiAgICAgIHZhciBpbmRleFBhdGggPSBhY3RpdmVJdGVtLmluZGV4UGF0aDtcblxuICAgICAgLy8g5bGV5byA6K+l6I+c5Y2V6aG555qE6Lev5b6E5LiK5omA5pyJ5a2Q6I+c5Y2VXG4gICAgICAvLyBleHBhbmQgYWxsIHN1Ym1lbnVzIG9mIHRoZSBtZW51IGl0ZW1cbiAgICAgIGluZGV4UGF0aC5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgc3VibWVudSA9IF90aGlzMi5zdWJtZW51c1tpbmRleF07XG4gICAgICAgIHN1Ym1lbnUgJiYgX3RoaXMyLm9wZW5NZW51KGluZGV4LCBzdWJtZW51LmluZGV4UGF0aCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHJvdXRlVG9JdGVtOiBmdW5jdGlvbiByb3V0ZVRvSXRlbShpdGVtLCBvbkVycm9yKSB7XG4gICAgICB2YXIgcm91dGUgPSBpdGVtLnJvdXRlIHx8IGl0ZW0uaW5kZXg7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaChyb3V0ZSwgZnVuY3Rpb24gKCkge30sIG9uRXJyb3IpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb3BlbjogZnVuY3Rpb24gb3BlbihpbmRleCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBpbmRleFBhdGggPSB0aGlzLnN1Ym1lbnVzW2luZGV4LnRvU3RyaW5nKCldLmluZGV4UGF0aDtcblxuICAgICAgaW5kZXhQYXRoLmZvckVhY2goZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5vcGVuTWVudShpLCBpbmRleFBhdGgpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoaW5kZXgpIHtcbiAgICAgIHRoaXMuY2xvc2VNZW51KGluZGV4KTtcbiAgICB9XG4gIH0sXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5pbml0T3BlbmVkTWVudSgpO1xuICAgIHRoaXMuJG9uKCdpdGVtLWNsaWNrJywgdGhpcy5oYW5kbGVJdGVtQ2xpY2spO1xuICAgIHRoaXMuJG9uKCdzdWJtZW51LWNsaWNrJywgdGhpcy5oYW5kbGVTdWJtZW51Q2xpY2spO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgbmV3IGFyaWFfbWVudWJhcih0aGlzLiRlbCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICB9XG4gICAgdGhpcy4kd2F0Y2goJ2l0ZW1zJywgdGhpcy51cGRhdGVBY3RpdmVJbmRleCk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZW51L3NyYy9tZW51LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChtZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUvc3JjL21lbnUudnVlXG52YXIgbWVudV9yZW5kZXIsIG1lbnVfc3RhdGljUmVuZGVyRm5zXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIG1lbnVfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgbWVudV9yZW5kZXIsXG4gIG1lbnVfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBtZW51X2FwaTsgfVxubWVudV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL21lbnUvc3JjL21lbnUudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19tZW51ID0gKG1lbnVfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZW51L2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnNyY19tZW51Lmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoc3JjX21lbnUubmFtZSwgc3JjX21lbnUpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfbWVudSA9IChzcmNfbWVudSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdHJhbnNpdGlvbnMvY29sbGFwc2UtdHJhbnNpdGlvblwiXG52YXIgY29sbGFwc2VfdHJhbnNpdGlvbl8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTtcbnZhciBjb2xsYXBzZV90cmFuc2l0aW9uX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvbGxhcHNlX3RyYW5zaXRpb25fKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZW51L3NyYy9tZW51LW1peGluLmpzXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBtZW51X21peGluID0gKHtcbiAgaW5qZWN0OiBbJ3Jvb3RNZW51J10sXG4gIGNvbXB1dGVkOiB7XG4gICAgaW5kZXhQYXRoOiBmdW5jdGlvbiBpbmRleFBhdGgoKSB7XG4gICAgICB2YXIgcGF0aCA9IFt0aGlzLmluZGV4XTtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG4gICAgICB3aGlsZSAocGFyZW50LiRvcHRpb25zLmNvbXBvbmVudE5hbWUgIT09ICdFbE1lbnUnKSB7XG4gICAgICAgIGlmIChwYXJlbnQuaW5kZXgpIHtcbiAgICAgICAgICBwYXRoLnVuc2hpZnQocGFyZW50LmluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH0sXG4gICAgcGFyZW50TWVudTogZnVuY3Rpb24gcGFyZW50TWVudSgpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG4gICAgICB3aGlsZSAocGFyZW50ICYmIFsnRWxNZW51JywgJ0VsU3VibWVudSddLmluZGV4T2YocGFyZW50LiRvcHRpb25zLmNvbXBvbmVudE5hbWUpID09PSAtMSkge1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfSxcbiAgICBwYWRkaW5nU3R5bGU6IGZ1bmN0aW9uIHBhZGRpbmdTdHlsZSgpIHtcbiAgICAgIGlmICh0aGlzLnJvb3RNZW51Lm1vZGUgIT09ICd2ZXJ0aWNhbCcpIHJldHVybiB7fTtcblxuICAgICAgdmFyIHBhZGRpbmcgPSAyMDtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cbiAgICAgIGlmICh0aGlzLnJvb3RNZW51LmNvbGxhcHNlKSB7XG4gICAgICAgIHBhZGRpbmcgPSAyMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50LiRvcHRpb25zLmNvbXBvbmVudE5hbWUgIT09ICdFbE1lbnUnKSB7XG4gICAgICAgICAgaWYgKHBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lID09PSAnRWxTdWJtZW51Jykge1xuICAgICAgICAgICAgcGFkZGluZyArPSAyMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHBhZGRpbmdMZWZ0OiBwYWRkaW5nICsgJ3B4JyB9O1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9tZW51L3NyYy9zdWJtZW51LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcblxuXG5cblxuXG5cbnZhciBwb3Blck1peGlucyA9IHtcbiAgcHJvcHM6IHtcbiAgICB0cmFuc2Zvcm1PcmlnaW46IHtcbiAgICAgIHR5cGU6IFtCb29sZWFuLCBTdHJpbmddLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIG9mZnNldDogdnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMub2Zmc2V0LFxuICAgIGJvdW5kYXJpZXNQYWRkaW5nOiB2dWVfcG9wcGVyX2RlZmF1bHQuYS5wcm9wcy5ib3VuZGFyaWVzUGFkZGluZyxcbiAgICBwb3BwZXJPcHRpb25zOiB2dWVfcG9wcGVyX2RlZmF1bHQuYS5wcm9wcy5wb3BwZXJPcHRpb25zXG4gIH0sXG4gIGRhdGE6IHZ1ZV9wb3BwZXJfZGVmYXVsdC5hLmRhdGEsXG4gIG1ldGhvZHM6IHZ1ZV9wb3BwZXJfZGVmYXVsdC5hLm1ldGhvZHMsXG4gIGJlZm9yZURlc3Ryb3k6IHZ1ZV9wb3BwZXJfZGVmYXVsdC5hLmJlZm9yZURlc3Ryb3ksXG4gIGRlYWN0aXZhdGVkOiB2dWVfcG9wcGVyX2RlZmF1bHQuYS5kZWFjdGl2YXRlZFxufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3VibWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFN1Ym1lbnUnLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbFN1Ym1lbnUnLFxuXG4gIG1peGluczogW21lbnVfbWl4aW4sIGVtaXR0ZXJfZGVmYXVsdC5hLCBwb3Blck1peGluc10sXG5cbiAgY29tcG9uZW50czogeyBFbENvbGxhcHNlVHJhbnNpdGlvbjogY29sbGFwc2VfdHJhbnNpdGlvbl9kZWZhdWx0LmEgfSxcblxuICBwcm9wczoge1xuICAgIGluZGV4OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgc2hvd1RpbWVvdXQ6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDMwMFxuICAgIH0sXG4gICAgaGlkZVRpbWVvdXQ6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDMwMFxuICAgIH0sXG4gICAgcG9wcGVyQ2xhc3M6IFN0cmluZyxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBwb3BwZXJBcHBlbmRUb0JvZHk6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcG9wcGVySlM6IG51bGwsXG4gICAgICB0aW1lb3V0OiBudWxsLFxuICAgICAgaXRlbXM6IHt9LFxuICAgICAgc3VibWVudXM6IHt9LFxuICAgICAgbW91c2VJbkNoaWxkOiBmYWxzZVxuICAgIH07XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBvcGVuZWQ6IGZ1bmN0aW9uIG9wZW5lZCh2YWwpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLmlzTWVudVBvcHVwKSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uIChfKSB7XG4gICAgICAgICAgX3RoaXMudXBkYXRlUG9wcGVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICAvLyBwb3BwZXIgb3B0aW9uXG4gICAgYXBwZW5kVG9Cb2R5OiBmdW5jdGlvbiBhcHBlbmRUb0JvZHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3BwZXJBcHBlbmRUb0JvZHkgPT09IHVuZGVmaW5lZCA/IHRoaXMuaXNGaXJzdExldmVsIDogdGhpcy5wb3BwZXJBcHBlbmRUb0JvZHk7XG4gICAgfSxcbiAgICBtZW51VHJhbnNpdGlvbk5hbWU6IGZ1bmN0aW9uIG1lbnVUcmFuc2l0aW9uTmFtZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3RNZW51LmNvbGxhcHNlID8gJ2VsLXpvb20taW4tbGVmdCcgOiAnZWwtem9vbS1pbi10b3AnO1xuICAgIH0sXG4gICAgb3BlbmVkOiBmdW5jdGlvbiBvcGVuZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290TWVudS5vcGVuZWRNZW51cy5pbmRleE9mKHRoaXMuaW5kZXgpID4gLTE7XG4gICAgfSxcbiAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSgpIHtcbiAgICAgIHZhciBpc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdmFyIHN1Ym1lbnVzID0gdGhpcy5zdWJtZW51cztcbiAgICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG5cbiAgICAgIE9iamVjdC5rZXlzKGl0ZW1zKS5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAoaXRlbXNbaW5kZXhdLmFjdGl2ZSkge1xuICAgICAgICAgIGlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIE9iamVjdC5rZXlzKHN1Ym1lbnVzKS5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAoc3VibWVudXNbaW5kZXhdLmFjdGl2ZSkge1xuICAgICAgICAgIGlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBpc0FjdGl2ZTtcbiAgICB9LFxuICAgIGhvdmVyQmFja2dyb3VuZDogZnVuY3Rpb24gaG92ZXJCYWNrZ3JvdW5kKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdE1lbnUuaG92ZXJCYWNrZ3JvdW5kO1xuICAgIH0sXG4gICAgYmFja2dyb3VuZENvbG9yOiBmdW5jdGlvbiBiYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290TWVudS5iYWNrZ3JvdW5kQ29sb3IgfHwgJyc7XG4gICAgfSxcbiAgICBhY3RpdmVUZXh0Q29sb3I6IGZ1bmN0aW9uIGFjdGl2ZVRleHRDb2xvcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3RNZW51LmFjdGl2ZVRleHRDb2xvciB8fCAnJztcbiAgICB9LFxuICAgIHRleHRDb2xvcjogZnVuY3Rpb24gdGV4dENvbG9yKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdE1lbnUudGV4dENvbG9yIHx8ICcnO1xuICAgIH0sXG4gICAgbW9kZTogZnVuY3Rpb24gbW9kZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3RNZW51Lm1vZGU7XG4gICAgfSxcbiAgICBpc01lbnVQb3B1cDogZnVuY3Rpb24gaXNNZW51UG9wdXAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290TWVudS5pc01lbnVQb3B1cDtcbiAgICB9LFxuICAgIHRpdGxlU3R5bGU6IGZ1bmN0aW9uIHRpdGxlU3R5bGUoKSB7XG4gICAgICBpZiAodGhpcy5tb2RlICE9PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2xvcjogdGhpcy50ZXh0Q29sb3JcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJvcmRlckJvdHRvbUNvbG9yOiB0aGlzLmFjdGl2ZSA/IHRoaXMucm9vdE1lbnUuYWN0aXZlVGV4dENvbG9yID8gdGhpcy5hY3RpdmVUZXh0Q29sb3IgOiAnJyA6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIGNvbG9yOiB0aGlzLmFjdGl2ZSA/IHRoaXMuYWN0aXZlVGV4dENvbG9yIDogdGhpcy50ZXh0Q29sb3JcbiAgICAgIH07XG4gICAgfSxcbiAgICBpc0ZpcnN0TGV2ZWw6IGZ1bmN0aW9uIGlzRmlyc3RMZXZlbCgpIHtcbiAgICAgIHZhciBpc0ZpcnN0TGV2ZWwgPSB0cnVlO1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcbiAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSB0aGlzLnJvb3RNZW51KSB7XG4gICAgICAgIGlmIChbJ0VsU3VibWVudScsICdFbE1lbnVJdGVtR3JvdXAnXS5pbmRleE9mKHBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lKSA+IC0xKSB7XG4gICAgICAgICAgaXNGaXJzdExldmVsID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0ZpcnN0TGV2ZWw7XG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgaGFuZGxlQ29sbGFwc2VUb2dnbGU6IGZ1bmN0aW9uIGhhbmRsZUNvbGxhcHNlVG9nZ2xlKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5pbml0UG9wcGVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRvRGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgYWRkSXRlbTogZnVuY3Rpb24gYWRkSXRlbShpdGVtKSB7XG4gICAgICB0aGlzLiRzZXQodGhpcy5pdGVtcywgaXRlbS5pbmRleCwgaXRlbSk7XG4gICAgfSxcbiAgICByZW1vdmVJdGVtOiBmdW5jdGlvbiByZW1vdmVJdGVtKGl0ZW0pIHtcbiAgICAgIGRlbGV0ZSB0aGlzLml0ZW1zW2l0ZW0uaW5kZXhdO1xuICAgIH0sXG4gICAgYWRkU3VibWVudTogZnVuY3Rpb24gYWRkU3VibWVudShpdGVtKSB7XG4gICAgICB0aGlzLiRzZXQodGhpcy5zdWJtZW51cywgaXRlbS5pbmRleCwgaXRlbSk7XG4gICAgfSxcbiAgICByZW1vdmVTdWJtZW51OiBmdW5jdGlvbiByZW1vdmVTdWJtZW51KGl0ZW0pIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnN1Ym1lbnVzW2l0ZW0uaW5kZXhdO1xuICAgIH0sXG4gICAgaGFuZGxlQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKCkge1xuICAgICAgdmFyIHJvb3RNZW51ID0gdGhpcy5yb290TWVudSxcbiAgICAgICAgICBkaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG5cbiAgICAgIGlmIChyb290TWVudS5tZW51VHJpZ2dlciA9PT0gJ2hvdmVyJyAmJiByb290TWVudS5tb2RlID09PSAnaG9yaXpvbnRhbCcgfHwgcm9vdE1lbnUuY29sbGFwc2UgJiYgcm9vdE1lbnUubW9kZSA9PT0gJ3ZlcnRpY2FsJyB8fCBkaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmRpc3BhdGNoKCdFbE1lbnUnLCAnc3VibWVudS1jbGljaycsIHRoaXMpO1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VlbnRlcjogZnVuY3Rpb24gaGFuZGxlTW91c2VlbnRlcihldmVudCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBzaG93VGltZW91dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdGhpcy5zaG93VGltZW91dDtcblxuXG4gICAgICBpZiAoISgnQWN0aXZlWE9iamVjdCcgaW4gd2luZG93KSAmJiBldmVudC50eXBlID09PSAnZm9jdXMnICYmICFldmVudC5yZWxhdGVkVGFyZ2V0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciByb290TWVudSA9IHRoaXMucm9vdE1lbnUsXG4gICAgICAgICAgZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuXG4gICAgICBpZiAocm9vdE1lbnUubWVudVRyaWdnZXIgPT09ICdjbGljaycgJiYgcm9vdE1lbnUubW9kZSA9PT0gJ2hvcml6b250YWwnIHx8ICFyb290TWVudS5jb2xsYXBzZSAmJiByb290TWVudS5tb2RlID09PSAndmVydGljYWwnIHx8IGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsU3VibWVudScsICdtb3VzZS1lbnRlci1jaGlsZCcpO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLnJvb3RNZW51Lm9wZW5NZW51KF90aGlzMi5pbmRleCwgX3RoaXMyLmluZGV4UGF0aCk7XG4gICAgICB9LCBzaG93VGltZW91dCk7XG5cbiAgICAgIGlmICh0aGlzLmFwcGVuZFRvQm9keSkge1xuICAgICAgICB0aGlzLiRwYXJlbnQuJGVsLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ21vdXNlZW50ZXInKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVNb3VzZWxlYXZlOiBmdW5jdGlvbiBoYW5kbGVNb3VzZWxlYXZlKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBkZWVwRGlzcGF0Y2ggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgICAgdmFyIHJvb3RNZW51ID0gdGhpcy5yb290TWVudTtcblxuICAgICAgaWYgKHJvb3RNZW51Lm1lbnVUcmlnZ2VyID09PSAnY2xpY2snICYmIHJvb3RNZW51Lm1vZGUgPT09ICdob3Jpem9udGFsJyB8fCAhcm9vdE1lbnUuY29sbGFwc2UgJiYgcm9vdE1lbnUubW9kZSA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmRpc3BhdGNoKCdFbFN1Ym1lbnUnLCAnbW91c2UtbGVhdmUtY2hpbGQnKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICFfdGhpczMubW91c2VJbkNoaWxkICYmIF90aGlzMy5yb290TWVudS5jbG9zZU1lbnUoX3RoaXMzLmluZGV4KTtcbiAgICAgIH0sIHRoaXMuaGlkZVRpbWVvdXQpO1xuXG4gICAgICBpZiAodGhpcy5hcHBlbmRUb0JvZHkgJiYgZGVlcERpc3BhdGNoKSB7XG4gICAgICAgIGlmICh0aGlzLiRwYXJlbnQuJG9wdGlvbnMubmFtZSA9PT0gJ0VsU3VibWVudScpIHtcbiAgICAgICAgICB0aGlzLiRwYXJlbnQuaGFuZGxlTW91c2VsZWF2ZSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlVGl0bGVNb3VzZWVudGVyOiBmdW5jdGlvbiBoYW5kbGVUaXRsZU1vdXNlZW50ZXIoKSB7XG4gICAgICBpZiAodGhpcy5tb2RlID09PSAnaG9yaXpvbnRhbCcgJiYgIXRoaXMucm9vdE1lbnUuYmFja2dyb3VuZENvbG9yKSByZXR1cm47XG4gICAgICB2YXIgdGl0bGUgPSB0aGlzLiRyZWZzWydzdWJtZW51LXRpdGxlJ107XG4gICAgICB0aXRsZSAmJiAodGl0bGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5yb290TWVudS5ob3ZlckJhY2tncm91bmQpO1xuICAgIH0sXG4gICAgaGFuZGxlVGl0bGVNb3VzZWxlYXZlOiBmdW5jdGlvbiBoYW5kbGVUaXRsZU1vdXNlbGVhdmUoKSB7XG4gICAgICBpZiAodGhpcy5tb2RlID09PSAnaG9yaXpvbnRhbCcgJiYgIXRoaXMucm9vdE1lbnUuYmFja2dyb3VuZENvbG9yKSByZXR1cm47XG4gICAgICB2YXIgdGl0bGUgPSB0aGlzLiRyZWZzWydzdWJtZW51LXRpdGxlJ107XG4gICAgICB0aXRsZSAmJiAodGl0bGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5yb290TWVudS5iYWNrZ3JvdW5kQ29sb3IgfHwgJycpO1xuICAgIH0sXG4gICAgdXBkYXRlUGxhY2VtZW50OiBmdW5jdGlvbiB1cGRhdGVQbGFjZW1lbnQoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQbGFjZW1lbnQgPSB0aGlzLm1vZGUgPT09ICdob3Jpem9udGFsJyAmJiB0aGlzLmlzRmlyc3RMZXZlbCA/ICdib3R0b20tc3RhcnQnIDogJ3JpZ2h0LXN0YXJ0JztcbiAgICB9LFxuICAgIGluaXRQb3BwZXI6IGZ1bmN0aW9uIGluaXRQb3BwZXIoKSB7XG4gICAgICB0aGlzLnJlZmVyZW5jZUVsbSA9IHRoaXMuJGVsO1xuICAgICAgdGhpcy5wb3BwZXJFbG0gPSB0aGlzLiRyZWZzLm1lbnU7XG4gICAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCgpO1xuICAgIH1cbiAgfSxcbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIHRoaXMuJG9uKCd0b2dnbGUtY29sbGFwc2UnLCB0aGlzLmhhbmRsZUNvbGxhcHNlVG9nZ2xlKTtcbiAgICB0aGlzLiRvbignbW91c2UtZW50ZXItY2hpbGQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczQubW91c2VJbkNoaWxkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dChfdGhpczQudGltZW91dCk7XG4gICAgfSk7XG4gICAgdGhpcy4kb24oJ21vdXNlLWxlYXZlLWNoaWxkJywgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXM0Lm1vdXNlSW5DaGlsZCA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KF90aGlzNC50aW1lb3V0KTtcbiAgICB9KTtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB0aGlzLnBhcmVudE1lbnUuYWRkU3VibWVudSh0aGlzKTtcbiAgICB0aGlzLnJvb3RNZW51LmFkZFN1Ym1lbnUodGhpcyk7XG4gICAgdGhpcy5pbml0UG9wcGVyKCk7XG4gIH0sXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgdGhpcy5wYXJlbnRNZW51LnJlbW92ZVN1Ym1lbnUodGhpcyk7XG4gICAgdGhpcy5yb290TWVudS5yZW1vdmVTdWJtZW51KHRoaXMpO1xuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICB2YXIgYWN0aXZlID0gdGhpcy5hY3RpdmUsXG4gICAgICAgIG9wZW5lZCA9IHRoaXMub3BlbmVkLFxuICAgICAgICBwYWRkaW5nU3R5bGUgPSB0aGlzLnBhZGRpbmdTdHlsZSxcbiAgICAgICAgdGl0bGVTdHlsZSA9IHRoaXMudGl0bGVTdHlsZSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIHJvb3RNZW51ID0gdGhpcy5yb290TWVudSxcbiAgICAgICAgY3VycmVudFBsYWNlbWVudCA9IHRoaXMuY3VycmVudFBsYWNlbWVudCxcbiAgICAgICAgbWVudVRyYW5zaXRpb25OYW1lID0gdGhpcy5tZW51VHJhbnNpdGlvbk5hbWUsXG4gICAgICAgIG1vZGUgPSB0aGlzLm1vZGUsXG4gICAgICAgIGRpc2FibGVkID0gdGhpcy5kaXNhYmxlZCxcbiAgICAgICAgcG9wcGVyQ2xhc3MgPSB0aGlzLnBvcHBlckNsYXNzLFxuICAgICAgICAkc2xvdHMgPSB0aGlzLiRzbG90cyxcbiAgICAgICAgaXNGaXJzdExldmVsID0gdGhpcy5pc0ZpcnN0TGV2ZWw7XG5cblxuICAgIHZhciBwb3B1cE1lbnUgPSBoKFxuICAgICAgJ3RyYW5zaXRpb24nLFxuICAgICAge1xuICAgICAgICBhdHRyczogeyBuYW1lOiBtZW51VHJhbnNpdGlvbk5hbWUgfVxuICAgICAgfSxcbiAgICAgIFtoKFxuICAgICAgICAnZGl2JyxcbiAgICAgICAge1xuICAgICAgICAgIHJlZjogJ21lbnUnLFxuICAgICAgICAgIGRpcmVjdGl2ZXM6IFt7XG4gICAgICAgICAgICBuYW1lOiAnc2hvdycsXG4gICAgICAgICAgICB2YWx1ZTogb3BlbmVkXG4gICAgICAgICAgfV0sXG5cbiAgICAgICAgICAnY2xhc3MnOiBbJ2VsLW1lbnUtLScgKyBtb2RlLCBwb3BwZXJDbGFzc10sXG4gICAgICAgICAgb246IHtcbiAgICAgICAgICAgICdtb3VzZWVudGVyJzogZnVuY3Rpb24gbW91c2VlbnRlcigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNS5oYW5kbGVNb3VzZWVudGVyKCRldmVudCwgMTAwKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbW91c2VsZWF2ZSc6IGZ1bmN0aW9uIG1vdXNlbGVhdmUoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczUuaGFuZGxlTW91c2VsZWF2ZSh0cnVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZm9jdXMnOiBmdW5jdGlvbiBmb2N1cygkZXZlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNS5oYW5kbGVNb3VzZWVudGVyKCRldmVudCwgMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtoKFxuICAgICAgICAgICd1bCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgcm9sZTogJ21lbnUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2NsYXNzJzogWydlbC1tZW51IGVsLW1lbnUtLXBvcHVwJywgJ2VsLW1lbnUtLXBvcHVwLScgKyBjdXJyZW50UGxhY2VtZW50XSxcbiAgICAgICAgICAgIHN0eWxlOiB7IGJhY2tncm91bmRDb2xvcjogcm9vdE1lbnUuYmFja2dyb3VuZENvbG9yIHx8ICcnIH0gfSxcbiAgICAgICAgICBbJHNsb3RzLmRlZmF1bHRdXG4gICAgICAgICldXG4gICAgICApXVxuICAgICk7XG5cbiAgICB2YXIgaW5saW5lTWVudSA9IGgoJ2VsLWNvbGxhcHNlLXRyYW5zaXRpb24nLCBbaChcbiAgICAgICd1bCcsXG4gICAgICB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgcm9sZTogJ21lbnUnXG4gICAgICAgIH0sXG4gICAgICAgICdjbGFzcyc6ICdlbC1tZW51IGVsLW1lbnUtLWlubGluZScsXG4gICAgICAgIGRpcmVjdGl2ZXM6IFt7XG4gICAgICAgICAgbmFtZTogJ3Nob3cnLFxuICAgICAgICAgIHZhbHVlOiBvcGVuZWRcbiAgICAgICAgfV0sXG5cbiAgICAgICAgc3R5bGU6IHsgYmFja2dyb3VuZENvbG9yOiByb290TWVudS5iYWNrZ3JvdW5kQ29sb3IgfHwgJycgfSB9LFxuICAgICAgWyRzbG90cy5kZWZhdWx0XVxuICAgICldKTtcblxuICAgIHZhciBzdWJtZW51VGl0bGVJY29uID0gcm9vdE1lbnUubW9kZSA9PT0gJ2hvcml6b250YWwnICYmIGlzRmlyc3RMZXZlbCB8fCByb290TWVudS5tb2RlID09PSAndmVydGljYWwnICYmICFyb290TWVudS5jb2xsYXBzZSA/ICdlbC1pY29uLWFycm93LWRvd24nIDogJ2VsLWljb24tYXJyb3ctcmlnaHQnO1xuXG4gICAgcmV0dXJuIGgoXG4gICAgICAnbGknLFxuICAgICAge1xuICAgICAgICAnY2xhc3MnOiB7XG4gICAgICAgICAgJ2VsLXN1Ym1lbnUnOiB0cnVlLFxuICAgICAgICAgICdpcy1hY3RpdmUnOiBhY3RpdmUsXG4gICAgICAgICAgJ2lzLW9wZW5lZCc6IG9wZW5lZCxcbiAgICAgICAgICAnaXMtZGlzYWJsZWQnOiBkaXNhYmxlZFxuICAgICAgICB9LFxuICAgICAgICBhdHRyczogeyByb2xlOiAnbWVudWl0ZW0nLFxuICAgICAgICAgICdhcmlhLWhhc3BvcHVwJzogJ3RydWUnLFxuICAgICAgICAgICdhcmlhLWV4cGFuZGVkJzogb3BlbmVkXG4gICAgICAgIH0sXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgJ21vdXNlZW50ZXInOiB0aGlzLmhhbmRsZU1vdXNlZW50ZXIsXG4gICAgICAgICAgJ21vdXNlbGVhdmUnOiBmdW5jdGlvbiBtb3VzZWxlYXZlKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzNS5oYW5kbGVNb3VzZWxlYXZlKGZhbHNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICdmb2N1cyc6IHRoaXMuaGFuZGxlTW91c2VlbnRlclxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2goXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7XG4gICAgICAgICAgJ2NsYXNzJzogJ2VsLXN1Ym1lbnVfX3RpdGxlJyxcbiAgICAgICAgICByZWY6ICdzdWJtZW51LXRpdGxlJyxcbiAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgJ2NsaWNrJzogdGhpcy5oYW5kbGVDbGljayxcbiAgICAgICAgICAgICdtb3VzZWVudGVyJzogdGhpcy5oYW5kbGVUaXRsZU1vdXNlZW50ZXIsXG4gICAgICAgICAgICAnbW91c2VsZWF2ZSc6IHRoaXMuaGFuZGxlVGl0bGVNb3VzZWxlYXZlXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIHN0eWxlOiBbcGFkZGluZ1N0eWxlLCB0aXRsZVN0eWxlLCB7IGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yIH1dXG4gICAgICAgIH0sXG4gICAgICAgIFskc2xvdHMudGl0bGUsIGgoJ2knLCB7ICdjbGFzcyc6IFsnZWwtc3VibWVudV9faWNvbi1hcnJvdycsIHN1Ym1lbnVUaXRsZUljb25dIH0pXVxuICAgICAgKSwgdGhpcy5pc01lbnVQb3B1cCA/IHBvcHVwTWVudSA6IGlubGluZU1lbnVdXG4gICAgKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUvc3JjL3N1Ym1lbnUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19zdWJtZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHN1Ym1lbnV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVudS9zcmMvc3VibWVudS52dWVcbnZhciBzdWJtZW51X3JlbmRlciwgc3VibWVudV9zdGF0aWNSZW5kZXJGbnNcblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgc3VibWVudV9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19zdWJtZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBzdWJtZW51X3JlbmRlcixcbiAgc3VibWVudV9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHN1Ym1lbnVfYXBpOyB9XG5zdWJtZW51X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvbWVudS9zcmMvc3VibWVudS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3VibWVudSA9IChzdWJtZW51X2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3VibWVudS9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zdWJtZW51Lmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoc3VibWVudS5uYW1lLCBzdWJtZW51KTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3N1Ym1lbnUgPSAoc3VibWVudSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL21lbnUvc3JjL21lbnUtaXRlbS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MmE1ZGJmZWEmXG52YXIgbWVudV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmE1ZGJmZWFfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwibGlcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1tZW51LWl0ZW1cIixcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIFwiaXMtYWN0aXZlXCI6IF92bS5hY3RpdmUsXG4gICAgICAgIFwiaXMtZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG4gICAgICB9LFxuICAgICAgc3R5bGU6IFtcbiAgICAgICAgX3ZtLnBhZGRpbmdTdHlsZSxcbiAgICAgICAgX3ZtLml0ZW1TdHlsZSxcbiAgICAgICAgeyBiYWNrZ3JvdW5kQ29sb3I6IF92bS5iYWNrZ3JvdW5kQ29sb3IgfVxuICAgICAgXSxcbiAgICAgIGF0dHJzOiB7IHJvbGU6IFwibWVudWl0ZW1cIiwgdGFiaW5kZXg6IFwiLTFcIiB9LFxuICAgICAgb246IHtcbiAgICAgICAgY2xpY2s6IF92bS5oYW5kbGVDbGljayxcbiAgICAgICAgbW91c2VlbnRlcjogX3ZtLm9uTW91c2VFbnRlcixcbiAgICAgICAgZm9jdXM6IF92bS5vbk1vdXNlRW50ZXIsXG4gICAgICAgIGJsdXI6IF92bS5vbk1vdXNlTGVhdmUsXG4gICAgICAgIG1vdXNlbGVhdmU6IF92bS5vbk1vdXNlTGVhdmVcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF92bS5wYXJlbnRNZW51LiRvcHRpb25zLmNvbXBvbmVudE5hbWUgPT09IFwiRWxNZW51XCIgJiZcbiAgICAgIF92bS5yb290TWVudS5jb2xsYXBzZSAmJlxuICAgICAgX3ZtLiRzbG90cy50aXRsZVxuICAgICAgICA/IF9jKFwiZWwtdG9vbHRpcFwiLCB7IGF0dHJzOiB7IGVmZmVjdDogXCJkYXJrXCIsIHBsYWNlbWVudDogXCJyaWdodFwiIH0gfSwgW1xuICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgIHsgYXR0cnM6IHsgc2xvdDogXCJjb250ZW50XCIgfSwgc2xvdDogXCJjb250ZW50XCIgfSxcbiAgICAgICAgICAgICAgW192bS5fdChcInRpdGxlXCIpXSxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3RhdGljU3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICAgICAgICBsZWZ0OiBcIjBcIixcbiAgICAgICAgICAgICAgICAgIHRvcDogXCIwXCIsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgICAgICAgICAgIFwiYm94LXNpemluZ1wiOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMCAyMHB4XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKVxuICAgICAgICAgIF0pXG4gICAgICAgIDogW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdChcInRpdGxlXCIpXVxuICAgIF0sXG4gICAgMlxuICApXG59XG52YXIgbWVudV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmE1ZGJmZWFfc3RhdGljUmVuZGVyRm5zID0gW11cbm1lbnVfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJhNWRiZmVhX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVudS9zcmMvbWVudS1pdGVtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yYTVkYmZlYSZcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3Rvb2x0aXBcIlxudmFyIHRvb2x0aXBfID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7XG52YXIgdG9vbHRpcF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih0b29sdGlwXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL21lbnUvc3JjL21lbnUtaXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbWVudV9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsTWVudUl0ZW0nLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbE1lbnVJdGVtJyxcblxuICBtaXhpbnM6IFttZW51X21peGluLCBlbWl0dGVyX2RlZmF1bHQuYV0sXG5cbiAgY29tcG9uZW50czogeyBFbFRvb2x0aXA6IHRvb2x0aXBfZGVmYXVsdC5hIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBpbmRleDoge1xuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsID09PSBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgcm91dGU6IFtTdHJpbmcsIE9iamVjdF0sXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW5cbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSB0aGlzLnJvb3RNZW51LmFjdGl2ZUluZGV4O1xuICAgIH0sXG4gICAgaG92ZXJCYWNrZ3JvdW5kOiBmdW5jdGlvbiBob3ZlckJhY2tncm91bmQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290TWVudS5ob3ZlckJhY2tncm91bmQ7XG4gICAgfSxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IGZ1bmN0aW9uIGJhY2tncm91bmRDb2xvcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3RNZW51LmJhY2tncm91bmRDb2xvciB8fCAnJztcbiAgICB9LFxuICAgIGFjdGl2ZVRleHRDb2xvcjogZnVuY3Rpb24gYWN0aXZlVGV4dENvbG9yKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdE1lbnUuYWN0aXZlVGV4dENvbG9yIHx8ICcnO1xuICAgIH0sXG4gICAgdGV4dENvbG9yOiBmdW5jdGlvbiB0ZXh0Q29sb3IoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290TWVudS50ZXh0Q29sb3IgfHwgJyc7XG4gICAgfSxcbiAgICBtb2RlOiBmdW5jdGlvbiBtb2RlKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdE1lbnUubW9kZTtcbiAgICB9LFxuICAgIGl0ZW1TdHlsZTogZnVuY3Rpb24gaXRlbVN0eWxlKCkge1xuICAgICAgdmFyIHN0eWxlID0ge1xuICAgICAgICBjb2xvcjogdGhpcy5hY3RpdmUgPyB0aGlzLmFjdGl2ZVRleHRDb2xvciA6IHRoaXMudGV4dENvbG9yXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ2hvcml6b250YWwnICYmICF0aGlzLmlzTmVzdGVkKSB7XG4gICAgICAgIHN0eWxlLmJvcmRlckJvdHRvbUNvbG9yID0gdGhpcy5hY3RpdmUgPyB0aGlzLnJvb3RNZW51LmFjdGl2ZVRleHRDb2xvciA/IHRoaXMuYWN0aXZlVGV4dENvbG9yIDogJycgOiAndHJhbnNwYXJlbnQnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG4gICAgaXNOZXN0ZWQ6IGZ1bmN0aW9uIGlzTmVzdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50TWVudSAhPT0gdGhpcy5yb290TWVudTtcbiAgICB9XG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcigpIHtcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdob3Jpem9udGFsJyAmJiAhdGhpcy5yb290TWVudS5iYWNrZ3JvdW5kQ29sb3IpIHJldHVybjtcbiAgICAgIHRoaXMuJGVsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuaG92ZXJCYWNrZ3JvdW5kO1xuICAgIH0sXG4gICAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoKSB7XG4gICAgICBpZiAodGhpcy5tb2RlID09PSAnaG9yaXpvbnRhbCcgJiYgIXRoaXMucm9vdE1lbnUuYmFja2dyb3VuZENvbG9yKSByZXR1cm47XG4gICAgICB0aGlzLiRlbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmJhY2tncm91bmRDb2xvcjtcbiAgICB9LFxuICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVDbGljaygpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKCdFbE1lbnUnLCAnaXRlbS1jbGljaycsIHRoaXMpO1xuICAgICAgICB0aGlzLiRlbWl0KCdjbGljaycsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB0aGlzLnBhcmVudE1lbnUuYWRkSXRlbSh0aGlzKTtcbiAgICB0aGlzLnJvb3RNZW51LmFkZEl0ZW0odGhpcyk7XG4gIH0sXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgdGhpcy5wYXJlbnRNZW51LnJlbW92ZUl0ZW0odGhpcyk7XG4gICAgdGhpcy5yb290TWVudS5yZW1vdmVJdGVtKHRoaXMpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVudS9zcmMvbWVudS1pdGVtLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfbWVudV9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKG1lbnVfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZW51L3NyYy9tZW51LWl0ZW0udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgbWVudV9pdGVtX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX21lbnVfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgbWVudV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmE1ZGJmZWFfcmVuZGVyLFxuICBtZW51X2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF8yYTVkYmZlYV9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIG1lbnVfaXRlbV9hcGk7IH1cbm1lbnVfaXRlbV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL21lbnUvc3JjL21lbnUtaXRlbS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbWVudV9pdGVtID0gKG1lbnVfaXRlbV9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUtaXRlbS9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5tZW51X2l0ZW0uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChtZW51X2l0ZW0ubmFtZSwgbWVudV9pdGVtKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX21lbnVfaXRlbSA9IChtZW51X2l0ZW0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9tZW51L3NyYy9tZW51LWl0ZW0tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTU0M2I3YmRjJlxudmFyIG1lbnVfaXRlbV9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU0M2I3YmRjX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcImxpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtbWVudS1pdGVtLWdyb3VwXCIgfSwgW1xuICAgIF9jKFxuICAgICAgXCJkaXZcIixcbiAgICAgIHtcbiAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtbWVudS1pdGVtLWdyb3VwX190aXRsZVwiLFxuICAgICAgICBzdHlsZTogeyBwYWRkaW5nTGVmdDogX3ZtLmxldmVsUGFkZGluZyArIFwicHhcIiB9XG4gICAgICB9LFxuICAgICAgWyFfdm0uJHNsb3RzLnRpdGxlID8gW192bS5fdihfdm0uX3MoX3ZtLnRpdGxlKSldIDogX3ZtLl90KFwidGl0bGVcIildLFxuICAgICAgMlxuICAgICksXG4gICAgX2MoXCJ1bFwiLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG4gIF0pXG59XG52YXIgbWVudV9pdGVtX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfNTQzYjdiZGNfc3RhdGljUmVuZGVyRm5zID0gW11cbm1lbnVfaXRlbV9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU0M2I3YmRjX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVudS9zcmMvbWVudS1pdGVtLWdyb3VwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01NDNiN2JkYyZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbWVudS9zcmMvbWVudS1pdGVtLWdyb3VwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBtZW51X2l0ZW1fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxNZW51SXRlbUdyb3VwJyxcblxuICBjb21wb25lbnROYW1lOiAnRWxNZW51SXRlbUdyb3VwJyxcblxuICBpbmplY3Q6IFsncm9vdE1lbnUnXSxcbiAgcHJvcHM6IHtcbiAgICB0aXRsZToge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfVxuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwYWRkaW5nTGVmdDogMjBcbiAgICB9O1xuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbGV2ZWxQYWRkaW5nOiBmdW5jdGlvbiBsZXZlbFBhZGRpbmcoKSB7XG4gICAgICB2YXIgcGFkZGluZyA9IDIwO1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcbiAgICAgIGlmICh0aGlzLnJvb3RNZW51LmNvbGxhcHNlKSByZXR1cm4gMjA7XG4gICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lICE9PSAnRWxNZW51Jykge1xuICAgICAgICBpZiAocGFyZW50LiRvcHRpb25zLmNvbXBvbmVudE5hbWUgPT09ICdFbFN1Ym1lbnUnKSB7XG4gICAgICAgICAgcGFkZGluZyArPSAyMDtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYWRkaW5nO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lbnUvc3JjL21lbnUtaXRlbS1ncm91cC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX21lbnVfaXRlbV9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChtZW51X2l0ZW1fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVudS9zcmMvbWVudS1pdGVtLWdyb3VwLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIG1lbnVfaXRlbV9ncm91cF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19tZW51X2l0ZW1fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1lbnVfaXRlbV9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU0M2I3YmRjX3JlbmRlcixcbiAgbWVudV9pdGVtX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfNTQzYjdiZGNfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBtZW51X2l0ZW1fZ3JvdXBfYXBpOyB9XG5tZW51X2l0ZW1fZ3JvdXBfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9tZW51L3NyYy9tZW51LWl0ZW0tZ3JvdXAudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG1lbnVfaXRlbV9ncm91cCA9IChtZW51X2l0ZW1fZ3JvdXBfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZW51LWl0ZW0tZ3JvdXAvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xubWVudV9pdGVtX2dyb3VwLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQobWVudV9pdGVtX2dyb3VwLm5hbWUsIG1lbnVfaXRlbV9ncm91cCk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19tZW51X2l0ZW1fZ3JvdXAgPSAobWVudV9pdGVtX2dyb3VwKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaW5wdXQvc3JjL2lucHV0LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zNDNkZDc3NCZcbnZhciBpbnB1dHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0M2RkNzc0X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIGNsYXNzOiBbXG4gICAgICAgIF92bS50eXBlID09PSBcInRleHRhcmVhXCIgPyBcImVsLXRleHRhcmVhXCIgOiBcImVsLWlucHV0XCIsXG4gICAgICAgIF92bS5pbnB1dFNpemUgPyBcImVsLWlucHV0LS1cIiArIF92bS5pbnB1dFNpemUgOiBcIlwiLFxuICAgICAgICB7XG4gICAgICAgICAgXCJpcy1kaXNhYmxlZFwiOiBfdm0uaW5wdXREaXNhYmxlZCxcbiAgICAgICAgICBcImlzLWV4Y2VlZFwiOiBfdm0uaW5wdXRFeGNlZWQsXG4gICAgICAgICAgXCJlbC1pbnB1dC1ncm91cFwiOiBfdm0uJHNsb3RzLnByZXBlbmQgfHwgX3ZtLiRzbG90cy5hcHBlbmQsXG4gICAgICAgICAgXCJlbC1pbnB1dC1ncm91cC0tYXBwZW5kXCI6IF92bS4kc2xvdHMuYXBwZW5kLFxuICAgICAgICAgIFwiZWwtaW5wdXQtZ3JvdXAtLXByZXBlbmRcIjogX3ZtLiRzbG90cy5wcmVwZW5kLFxuICAgICAgICAgIFwiZWwtaW5wdXQtLXByZWZpeFwiOiBfdm0uJHNsb3RzLnByZWZpeCB8fCBfdm0ucHJlZml4SWNvbixcbiAgICAgICAgICBcImVsLWlucHV0LS1zdWZmaXhcIjpcbiAgICAgICAgICAgIF92bS4kc2xvdHMuc3VmZml4IHx8XG4gICAgICAgICAgICBfdm0uc3VmZml4SWNvbiB8fFxuICAgICAgICAgICAgX3ZtLmNsZWFyYWJsZSB8fFxuICAgICAgICAgICAgX3ZtLnNob3dQYXNzd29yZFxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgb246IHtcbiAgICAgICAgbW91c2VlbnRlcjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgX3ZtLmhvdmVyaW5nID0gdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBtb3VzZWxlYXZlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICBfdm0uaG92ZXJpbmcgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfdm0udHlwZSAhPT0gXCJ0ZXh0YXJlYVwiXG4gICAgICAgID8gW1xuICAgICAgICAgICAgX3ZtLiRzbG90cy5wcmVwZW5kXG4gICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1pbnB1dC1ncm91cF9fcHJlcGVuZFwiIH0sXG4gICAgICAgICAgICAgICAgICBbX3ZtLl90KFwicHJlcGVuZFwiKV0sXG4gICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgX3ZtLnR5cGUgIT09IFwidGV4dGFyZWFcIlxuICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgICAgX3ZtLl9iKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVmOiBcImlucHV0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtaW5wdXRfX2lubmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4OiBfdm0udGFiaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBfdm0uc2hvd1Bhc3N3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gX3ZtLnBhc3N3b3JkVmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5pbnB1dERpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk6IF92bS5yZWFkb25seSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZTogX3ZtLmF1dG9Db21wbGV0ZSB8fCBfdm0uYXV0b2NvbXBsZXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IF92bS5sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uc3RhcnQ6IF92bS5oYW5kbGVDb21wb3NpdGlvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb251cGRhdGU6IF92bS5oYW5kbGVDb21wb3NpdGlvblVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uZW5kOiBfdm0uaGFuZGxlQ29tcG9zaXRpb25FbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogX3ZtLmhhbmRsZUlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXM6IF92bS5oYW5kbGVGb2N1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsdXI6IF92bS5oYW5kbGVCbHVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiBfdm0uaGFuZGxlQ2hhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcImlucHV0XCIsXG4gICAgICAgICAgICAgICAgICAgIF92bS4kYXR0cnMsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgX3ZtLiRzbG90cy5wcmVmaXggfHwgX3ZtLnByZWZpeEljb25cbiAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1pbnB1dF9fcHJlZml4XCIgfSxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl90KFwicHJlZml4XCIpLFxuICAgICAgICAgICAgICAgICAgICBfdm0ucHJlZml4SWNvblxuICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtaW5wdXRfX2ljb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IF92bS5wcmVmaXhJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgX3ZtLmdldFN1ZmZpeFZpc2libGUoKVxuICAgICAgICAgICAgICA/IF9jKFwic3BhblwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWlucHV0X19zdWZmaXhcIiB9LCBbXG4gICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtaW5wdXRfX3N1ZmZpeC1pbm5lclwiIH0sXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAhX3ZtLnNob3dDbGVhciB8fFxuICAgICAgICAgICAgICAgICAgICAgICFfdm0uc2hvd1B3ZFZpc2libGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAhX3ZtLmlzV29yZExpbWl0VmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl90KFwic3VmZml4XCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zdWZmaXhJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtaW5wdXRfX2ljb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogX3ZtLnN1ZmZpeEljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uc2hvd0NsZWFyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVsLWlucHV0X19pY29uIGVsLWljb24tY2lyY2xlLWNsb3NlIGVsLWlucHV0X19jbGVhclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZWRvd246IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBfdm0uY2xlYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgICAgIF92bS5zaG93UHdkVmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC1pbnB1dF9faWNvbiBlbC1pY29uLXZpZXcgZWwtaW5wdXRfX2NsZWFyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5oYW5kbGVQYXNzd29yZFZpc2libGUgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uaXNXb3JkTGltaXRWaXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwic3BhblwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWlucHV0X19jb3VudFwiIH0sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1pbnB1dF9fY291bnQtaW5uZXJcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgICAgICBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLnRleHRMZW5ndGgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiL1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fcyhfdm0udXBwZXJMaW1pdCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIF92bS52YWxpZGF0ZVN0YXRlXG4gICAgICAgICAgICAgICAgICAgID8gX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWlucHV0X19pY29uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogW1wiZWwtaW5wdXRfX3ZhbGlkYXRlSWNvblwiLCBfdm0udmFsaWRhdGVJY29uXVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgX3ZtLiRzbG90cy5hcHBlbmRcbiAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLWlucHV0LWdyb3VwX19hcHBlbmRcIiB9LFxuICAgICAgICAgICAgICAgICAgW192bS5fdChcImFwcGVuZFwiKV0sXG4gICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgXVxuICAgICAgICA6IF9jKFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiLFxuICAgICAgICAgICAgX3ZtLl9iKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVmOiBcInRleHRhcmVhXCIsXG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGV4dGFyZWFfX2lubmVyXCIsXG4gICAgICAgICAgICAgICAgc3R5bGU6IF92bS50ZXh0YXJlYVN0eWxlLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICB0YWJpbmRleDogX3ZtLnRhYmluZGV4LFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5pbnB1dERpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgcmVhZG9ubHk6IF92bS5yZWFkb25seSxcbiAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZTogX3ZtLmF1dG9Db21wbGV0ZSB8fCBfdm0uYXV0b2NvbXBsZXRlLFxuICAgICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IF92bS5sYWJlbFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uc3RhcnQ6IF92bS5oYW5kbGVDb21wb3NpdGlvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb251cGRhdGU6IF92bS5oYW5kbGVDb21wb3NpdGlvblVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uZW5kOiBfdm0uaGFuZGxlQ29tcG9zaXRpb25FbmQsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogX3ZtLmhhbmRsZUlucHV0LFxuICAgICAgICAgICAgICAgICAgZm9jdXM6IF92bS5oYW5kbGVGb2N1cyxcbiAgICAgICAgICAgICAgICAgIGJsdXI6IF92bS5oYW5kbGVCbHVyLFxuICAgICAgICAgICAgICAgICAgY2hhbmdlOiBfdm0uaGFuZGxlQ2hhbmdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInRleHRhcmVhXCIsXG4gICAgICAgICAgICAgIF92bS4kYXR0cnMsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgIF92bS5pc1dvcmRMaW1pdFZpc2libGUgJiYgX3ZtLnR5cGUgPT09IFwidGV4dGFyZWFcIlxuICAgICAgICA/IF9jKFwic3BhblwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWlucHV0X19jb3VudFwiIH0sIFtcbiAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLnRleHRMZW5ndGgpICsgXCIvXCIgKyBfdm0uX3MoX3ZtLnVwcGVyTGltaXQpKVxuICAgICAgICAgIF0pXG4gICAgICAgIDogX3ZtLl9lKClcbiAgICBdLFxuICAgIDJcbiAgKVxufVxudmFyIGlucHV0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQzZGQ3NzRfc3RhdGljUmVuZGVyRm5zID0gW11cbmlucHV0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQzZGQ3NzRfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbnB1dC9zcmMvaW5wdXQudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTM0M2RkNzc0JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0L3NyYy9jYWxjVGV4dGFyZWFIZWlnaHQuanNcbnZhciBoaWRkZW5UZXh0YXJlYSA9IHZvaWQgMDtcblxudmFyIEhJRERFTl9TVFlMRSA9ICdcXG4gIGhlaWdodDowICFpbXBvcnRhbnQ7XFxuICB2aXNpYmlsaXR5OmhpZGRlbiAhaW1wb3J0YW50O1xcbiAgb3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnQ7XFxuICBwb3NpdGlvbjphYnNvbHV0ZSAhaW1wb3J0YW50O1xcbiAgei1pbmRleDotMTAwMCAhaW1wb3J0YW50O1xcbiAgdG9wOjAgIWltcG9ydGFudDtcXG4gIHJpZ2h0OjAgIWltcG9ydGFudFxcbic7XG5cbnZhciBDT05URVhUX1NUWUxFID0gWydsZXR0ZXItc3BhY2luZycsICdsaW5lLWhlaWdodCcsICdwYWRkaW5nLXRvcCcsICdwYWRkaW5nLWJvdHRvbScsICdmb250LWZhbWlseScsICdmb250LXdlaWdodCcsICdmb250LXNpemUnLCAndGV4dC1yZW5kZXJpbmcnLCAndGV4dC10cmFuc2Zvcm0nLCAnd2lkdGgnLCAndGV4dC1pbmRlbnQnLCAncGFkZGluZy1sZWZ0JywgJ3BhZGRpbmctcmlnaHQnLCAnYm9yZGVyLXdpZHRoJywgJ2JveC1zaXppbmcnXTtcblxuZnVuY3Rpb24gY2FsY3VsYXRlTm9kZVN0eWxpbmcodGFyZ2V0RWxlbWVudCkge1xuICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXRFbGVtZW50KTtcblxuICB2YXIgYm94U2l6aW5nID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm94LXNpemluZycpO1xuXG4gIHZhciBwYWRkaW5nU2l6ZSA9IHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1ib3R0b20nKSkgKyBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctdG9wJykpO1xuXG4gIHZhciBib3JkZXJTaXplID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItYm90dG9tLXdpZHRoJykpICsgcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItdG9wLXdpZHRoJykpO1xuXG4gIHZhciBjb250ZXh0U3R5bGUgPSBDT05URVhUX1NUWUxFLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBuYW1lICsgJzonICsgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbiAgfSkuam9pbignOycpO1xuXG4gIHJldHVybiB7IGNvbnRleHRTdHlsZTogY29udGV4dFN0eWxlLCBwYWRkaW5nU2l6ZTogcGFkZGluZ1NpemUsIGJvcmRlclNpemU6IGJvcmRlclNpemUsIGJveFNpemluZzogYm94U2l6aW5nIH07XG59XG5cbmZ1bmN0aW9uIGNhbGNUZXh0YXJlYUhlaWdodCh0YXJnZXRFbGVtZW50KSB7XG4gIHZhciBtaW5Sb3dzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxO1xuICB2YXIgbWF4Um93cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICBpZiAoIWhpZGRlblRleHRhcmVhKSB7XG4gICAgaGlkZGVuVGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlkZGVuVGV4dGFyZWEpO1xuICB9XG5cbiAgdmFyIF9jYWxjdWxhdGVOb2RlU3R5bGluZyA9IGNhbGN1bGF0ZU5vZGVTdHlsaW5nKHRhcmdldEVsZW1lbnQpLFxuICAgICAgcGFkZGluZ1NpemUgPSBfY2FsY3VsYXRlTm9kZVN0eWxpbmcucGFkZGluZ1NpemUsXG4gICAgICBib3JkZXJTaXplID0gX2NhbGN1bGF0ZU5vZGVTdHlsaW5nLmJvcmRlclNpemUsXG4gICAgICBib3hTaXppbmcgPSBfY2FsY3VsYXRlTm9kZVN0eWxpbmcuYm94U2l6aW5nLFxuICAgICAgY29udGV4dFN0eWxlID0gX2NhbGN1bGF0ZU5vZGVTdHlsaW5nLmNvbnRleHRTdHlsZTtcblxuICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgY29udGV4dFN0eWxlICsgJzsnICsgSElEREVOX1NUWUxFKTtcbiAgaGlkZGVuVGV4dGFyZWEudmFsdWUgPSB0YXJnZXRFbGVtZW50LnZhbHVlIHx8IHRhcmdldEVsZW1lbnQucGxhY2Vob2xkZXIgfHwgJyc7XG5cbiAgdmFyIGhlaWdodCA9IGhpZGRlblRleHRhcmVhLnNjcm9sbEhlaWdodDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGlmIChib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xuICAgIGhlaWdodCA9IGhlaWdodCArIGJvcmRlclNpemU7XG4gIH0gZWxzZSBpZiAoYm94U2l6aW5nID09PSAnY29udGVudC1ib3gnKSB7XG4gICAgaGVpZ2h0ID0gaGVpZ2h0IC0gcGFkZGluZ1NpemU7XG4gIH1cblxuICBoaWRkZW5UZXh0YXJlYS52YWx1ZSA9ICcnO1xuICB2YXIgc2luZ2xlUm93SGVpZ2h0ID0gaGlkZGVuVGV4dGFyZWEuc2Nyb2xsSGVpZ2h0IC0gcGFkZGluZ1NpemU7XG5cbiAgaWYgKG1pblJvd3MgIT09IG51bGwpIHtcbiAgICB2YXIgbWluSGVpZ2h0ID0gc2luZ2xlUm93SGVpZ2h0ICogbWluUm93cztcbiAgICBpZiAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCArIHBhZGRpbmdTaXplICsgYm9yZGVyU2l6ZTtcbiAgICB9XG4gICAgaGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBoZWlnaHQpO1xuICAgIHJlc3VsdC5taW5IZWlnaHQgPSBtaW5IZWlnaHQgKyAncHgnO1xuICB9XG4gIGlmIChtYXhSb3dzICE9PSBudWxsKSB7XG4gICAgdmFyIG1heEhlaWdodCA9IHNpbmdsZVJvd0hlaWdodCAqIG1heFJvd3M7XG4gICAgaWYgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgICBtYXhIZWlnaHQgPSBtYXhIZWlnaHQgKyBwYWRkaW5nU2l6ZSArIGJvcmRlclNpemU7XG4gICAgfVxuICAgIGhlaWdodCA9IE1hdGgubWluKG1heEhlaWdodCwgaGVpZ2h0KTtcbiAgfVxuICByZXN1bHQuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgaGlkZGVuVGV4dGFyZWEucGFyZW50Tm9kZSAmJiBoaWRkZW5UZXh0YXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhpZGRlblRleHRhcmVhKTtcbiAgaGlkZGVuVGV4dGFyZWEgPSBudWxsO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9tZXJnZVwiXG52YXIgbWVyZ2VfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbnZhciBtZXJnZV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihtZXJnZV8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvc2hhcmVkXCJcbnZhciBzaGFyZWRfID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2lucHV0L3NyYy9pbnB1dC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpbnB1dHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbElucHV0JyxcblxuICBjb21wb25lbnROYW1lOiAnRWxJbnB1dCcsXG5cbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmEsIG1pZ3JhdGluZ19kZWZhdWx0LmFdLFxuXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgaW5qZWN0OiB7XG4gICAgZWxGb3JtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgZWxGb3JtSXRlbToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dGFyZWFDYWxjU3R5bGU6IHt9LFxuICAgICAgaG92ZXJpbmc6IGZhbHNlLFxuICAgICAgZm9jdXNlZDogZmFsc2UsXG4gICAgICBpc0NvbXBvc2luZzogZmFsc2UsXG4gICAgICBwYXNzd29yZFZpc2libGU6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgc2l6ZTogU3RyaW5nLFxuICAgIHJlc2l6ZTogU3RyaW5nLFxuICAgIGZvcm06IFN0cmluZyxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICByZWFkb25seTogQm9vbGVhbixcbiAgICB0eXBlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAndGV4dCdcbiAgICB9LFxuICAgIGF1dG9zaXplOiB7XG4gICAgICB0eXBlOiBbQm9vbGVhbiwgT2JqZWN0XSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICBhdXRvY29tcGxldGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdvZmYnXG4gICAgfSxcbiAgICAvKiogQERlcHJlY2F0ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uICovXG4gICAgYXV0b0NvbXBsZXRlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpIHtcbiAgICAgICAgIGZhbHNlICYmIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHZhbGlkYXRlRXZlbnQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBzdWZmaXhJY29uOiBTdHJpbmcsXG4gICAgcHJlZml4SWNvbjogU3RyaW5nLFxuICAgIGxhYmVsOiBTdHJpbmcsXG4gICAgY2xlYXJhYmxlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIHNob3dQYXNzd29yZDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICBzaG93V29yZExpbWl0OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIHRhYmluZGV4OiBTdHJpbmdcbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIF9lbEZvcm1JdGVtU2l6ZTogZnVuY3Rpb24gX2VsRm9ybUl0ZW1TaXplKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmVsRm9ybUl0ZW0gfHwge30pLmVsRm9ybUl0ZW1TaXplO1xuICAgIH0sXG4gICAgdmFsaWRhdGVTdGF0ZTogZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsRm9ybUl0ZW0gPyB0aGlzLmVsRm9ybUl0ZW0udmFsaWRhdGVTdGF0ZSA6ICcnO1xuICAgIH0sXG4gICAgbmVlZFN0YXR1c0ljb246IGZ1bmN0aW9uIG5lZWRTdGF0dXNJY29uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxGb3JtID8gdGhpcy5lbEZvcm0uc3RhdHVzSWNvbiA6IGZhbHNlO1xuICAgIH0sXG4gICAgdmFsaWRhdGVJY29uOiBmdW5jdGlvbiB2YWxpZGF0ZUljb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0aW5nOiAnZWwtaWNvbi1sb2FkaW5nJyxcbiAgICAgICAgc3VjY2VzczogJ2VsLWljb24tY2lyY2xlLWNoZWNrJyxcbiAgICAgICAgZXJyb3I6ICdlbC1pY29uLWNpcmNsZS1jbG9zZSdcbiAgICAgIH1bdGhpcy52YWxpZGF0ZVN0YXRlXTtcbiAgICB9LFxuICAgIHRleHRhcmVhU3R5bGU6IGZ1bmN0aW9uIHRleHRhcmVhU3R5bGUoKSB7XG4gICAgICByZXR1cm4gbWVyZ2VfZGVmYXVsdCgpKHt9LCB0aGlzLnRleHRhcmVhQ2FsY1N0eWxlLCB7IHJlc2l6ZTogdGhpcy5yZXNpemUgfSk7XG4gICAgfSxcbiAgICBpbnB1dFNpemU6IGZ1bmN0aW9uIGlucHV0U2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgfHwgdGhpcy5fZWxGb3JtSXRlbVNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7XG4gICAgfSxcbiAgICBpbnB1dERpc2FibGVkOiBmdW5jdGlvbiBpbnB1dERpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgKHRoaXMuZWxGb3JtIHx8IHt9KS5kaXNhYmxlZDtcbiAgICB9LFxuICAgIG5hdGl2ZUlucHV0VmFsdWU6IGZ1bmN0aW9uIG5hdGl2ZUlucHV0VmFsdWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gbnVsbCB8fCB0aGlzLnZhbHVlID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyh0aGlzLnZhbHVlKTtcbiAgICB9LFxuICAgIHNob3dDbGVhcjogZnVuY3Rpb24gc2hvd0NsZWFyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xlYXJhYmxlICYmICF0aGlzLmlucHV0RGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHkgJiYgdGhpcy5uYXRpdmVJbnB1dFZhbHVlICYmICh0aGlzLmZvY3VzZWQgfHwgdGhpcy5ob3ZlcmluZyk7XG4gICAgfSxcbiAgICBzaG93UHdkVmlzaWJsZTogZnVuY3Rpb24gc2hvd1B3ZFZpc2libGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93UGFzc3dvcmQgJiYgIXRoaXMuaW5wdXREaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSAmJiAoISF0aGlzLm5hdGl2ZUlucHV0VmFsdWUgfHwgdGhpcy5mb2N1c2VkKTtcbiAgICB9LFxuICAgIGlzV29yZExpbWl0VmlzaWJsZTogZnVuY3Rpb24gaXNXb3JkTGltaXRWaXNpYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvd1dvcmRMaW1pdCAmJiB0aGlzLiRhdHRycy5tYXhsZW5ndGggJiYgKHRoaXMudHlwZSA9PT0gJ3RleHQnIHx8IHRoaXMudHlwZSA9PT0gJ3RleHRhcmVhJykgJiYgIXRoaXMuaW5wdXREaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSAmJiAhdGhpcy5zaG93UGFzc3dvcmQ7XG4gICAgfSxcbiAgICB1cHBlckxpbWl0OiBmdW5jdGlvbiB1cHBlckxpbWl0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJGF0dHJzLm1heGxlbmd0aDtcbiAgICB9LFxuICAgIHRleHRMZW5ndGg6IGZ1bmN0aW9uIHRleHRMZW5ndGgoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSkubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKHRoaXMudmFsdWUgfHwgJycpLmxlbmd0aDtcbiAgICB9LFxuICAgIGlucHV0RXhjZWVkOiBmdW5jdGlvbiBpbnB1dEV4Y2VlZCgpIHtcbiAgICAgIC8vIHNob3cgZXhjZWVkIHN0eWxlIGlmIGxlbmd0aCBvZiBpbml0aWFsIHZhbHVlIGdyZWF0ZXIgdGhlbiBtYXhsZW5ndGhcbiAgICAgIHJldHVybiB0aGlzLmlzV29yZExpbWl0VmlzaWJsZSAmJiB0aGlzLnRleHRMZW5ndGggPiB0aGlzLnVwcGVyTGltaXQ7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuICAgICAgdGhpcy4kbmV4dFRpY2sodGhpcy5yZXNpemVUZXh0YXJlYSk7XG4gICAgICBpZiAodGhpcy52YWxpZGF0ZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCAnZWwuZm9ybS5jaGFuZ2UnLCBbdmFsXSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIG5hdGl2ZSBpbnB1dCB2YWx1ZSBpcyBzZXQgZXhwbGljaXRseVxuICAgIC8vIGRvIG5vdCB1c2Ugdi1tb2RlbCAvIDp2YWx1ZSBpbiB0ZW1wbGF0ZVxuICAgIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvMTQ1MjFcbiAgICBuYXRpdmVJbnB1dFZhbHVlOiBmdW5jdGlvbiBuYXRpdmVJbnB1dFZhbHVlKCkge1xuICAgICAgdGhpcy5zZXROYXRpdmVJbnB1dFZhbHVlKCk7XG4gICAgfSxcblxuICAgIC8vIHdoZW4gY2hhbmdlIGJldHdlZW4gPGlucHV0PiBhbmQgPHRleHRhcmVhPixcbiAgICAvLyB1cGRhdGUgRE9NIGRlcGVuZGVudCB2YWx1ZSBhbmQgc3R5bGVzXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvMTQ4NTdcbiAgICB0eXBlOiBmdW5jdGlvbiB0eXBlKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5zZXROYXRpdmVJbnB1dFZhbHVlKCk7XG4gICAgICAgIF90aGlzLnJlc2l6ZVRleHRhcmVhKCk7XG4gICAgICAgIF90aGlzLnVwZGF0ZUljb25PZmZzZXQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgdGhpcy5nZXRJbnB1dCgpLmZvY3VzKCk7XG4gICAgfSxcbiAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgdGhpcy5nZXRJbnB1dCgpLmJsdXIoKTtcbiAgICB9LFxuICAgIGdldE1pZ3JhdGluZ0NvbmZpZzogZnVuY3Rpb24gZ2V0TWlncmF0aW5nQ29uZmlnKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAnaWNvbic6ICdpY29uIGlzIHJlbW92ZWQsIHVzZSBzdWZmaXgtaWNvbiAvIHByZWZpeC1pY29uIGluc3RlYWQuJyxcbiAgICAgICAgICAnb24taWNvbi1jbGljayc6ICdvbi1pY29uLWNsaWNrIGlzIHJlbW92ZWQuJ1xuICAgICAgICB9LFxuICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAnY2xpY2snOiAnY2xpY2sgaXMgcmVtb3ZlZC4nXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICBoYW5kbGVCbHVyOiBmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuJGVtaXQoJ2JsdXInLCBldmVudCk7XG4gICAgICBpZiAodGhpcy52YWxpZGF0ZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCAnZWwuZm9ybS5ibHVyJywgW3RoaXMudmFsdWVdKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KCkge1xuICAgICAgdGhpcy5nZXRJbnB1dCgpLnNlbGVjdCgpO1xuICAgIH0sXG4gICAgcmVzaXplVGV4dGFyZWE6IGZ1bmN0aW9uIHJlc2l6ZVRleHRhcmVhKCkge1xuICAgICAgaWYgKHRoaXMuJGlzU2VydmVyKSByZXR1cm47XG4gICAgICB2YXIgYXV0b3NpemUgPSB0aGlzLmF1dG9zaXplLFxuICAgICAgICAgIHR5cGUgPSB0aGlzLnR5cGU7XG5cbiAgICAgIGlmICh0eXBlICE9PSAndGV4dGFyZWEnKSByZXR1cm47XG4gICAgICBpZiAoIWF1dG9zaXplKSB7XG4gICAgICAgIHRoaXMudGV4dGFyZWFDYWxjU3R5bGUgPSB7XG4gICAgICAgICAgbWluSGVpZ2h0OiBjYWxjVGV4dGFyZWFIZWlnaHQodGhpcy4kcmVmcy50ZXh0YXJlYSkubWluSGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBtaW5Sb3dzID0gYXV0b3NpemUubWluUm93cztcbiAgICAgIHZhciBtYXhSb3dzID0gYXV0b3NpemUubWF4Um93cztcblxuICAgICAgdGhpcy50ZXh0YXJlYUNhbGNTdHlsZSA9IGNhbGNUZXh0YXJlYUhlaWdodCh0aGlzLiRyZWZzLnRleHRhcmVhLCBtaW5Sb3dzLCBtYXhSb3dzKTtcbiAgICB9LFxuICAgIHNldE5hdGl2ZUlucHV0VmFsdWU6IGZ1bmN0aW9uIHNldE5hdGl2ZUlucHV0VmFsdWUoKSB7XG4gICAgICB2YXIgaW5wdXQgPSB0aGlzLmdldElucHV0KCk7XG4gICAgICBpZiAoIWlucHV0KSByZXR1cm47XG4gICAgICBpZiAoaW5wdXQudmFsdWUgPT09IHRoaXMubmF0aXZlSW5wdXRWYWx1ZSkgcmV0dXJuO1xuICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLm5hdGl2ZUlucHV0VmFsdWU7XG4gICAgfSxcbiAgICBoYW5kbGVGb2N1czogZnVuY3Rpb24gaGFuZGxlRm9jdXMoZXZlbnQpIHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgICB0aGlzLiRlbWl0KCdmb2N1cycsIGV2ZW50KTtcbiAgICB9LFxuICAgIGhhbmRsZUNvbXBvc2l0aW9uU3RhcnQ6IGZ1bmN0aW9uIGhhbmRsZUNvbXBvc2l0aW9uU3RhcnQoZXZlbnQpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2NvbXBvc2l0aW9uc3RhcnQnLCBldmVudCk7XG4gICAgICB0aGlzLmlzQ29tcG9zaW5nID0gdHJ1ZTtcbiAgICB9LFxuICAgIGhhbmRsZUNvbXBvc2l0aW9uVXBkYXRlOiBmdW5jdGlvbiBoYW5kbGVDb21wb3NpdGlvblVwZGF0ZShldmVudCkge1xuICAgICAgdGhpcy4kZW1pdCgnY29tcG9zaXRpb251cGRhdGUnLCBldmVudCk7XG4gICAgICB2YXIgdGV4dCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgIHZhciBsYXN0Q2hhcmFjdGVyID0gdGV4dFt0ZXh0Lmxlbmd0aCAtIDFdIHx8ICcnO1xuICAgICAgdGhpcy5pc0NvbXBvc2luZyA9ICFPYmplY3Qoc2hhcmVkX1tcImlzS29yZWFuXCJdKShsYXN0Q2hhcmFjdGVyKTtcbiAgICB9LFxuICAgIGhhbmRsZUNvbXBvc2l0aW9uRW5kOiBmdW5jdGlvbiBoYW5kbGVDb21wb3NpdGlvbkVuZChldmVudCkge1xuICAgICAgdGhpcy4kZW1pdCgnY29tcG9zaXRpb25lbmQnLCBldmVudCk7XG4gICAgICBpZiAodGhpcy5pc0NvbXBvc2luZykge1xuICAgICAgICB0aGlzLmlzQ29tcG9zaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFuZGxlSW5wdXQoZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlSW5wdXQ6IGZ1bmN0aW9uIGhhbmRsZUlucHV0KGV2ZW50KSB7XG4gICAgICAvLyBzaG91bGQgbm90IGVtaXQgaW5wdXQgZHVyaW5nIGNvbXBvc2l0aW9uXG4gICAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZUZFL2VsZW1lbnQvaXNzdWVzLzEwNTE2XG4gICAgICBpZiAodGhpcy5pc0NvbXBvc2luZykgcmV0dXJuO1xuXG4gICAgICAvLyBoYWNrIGZvciBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy84NTQ4XG4gICAgICAvLyBzaG91bGQgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSB3aGVuIHdlIGRvbid0IHN1cHBvcnQgSUVcbiAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUgPT09IHRoaXMubmF0aXZlSW5wdXRWYWx1ZSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIGV2ZW50LnRhcmdldC52YWx1ZSk7XG5cbiAgICAgIC8vIGVuc3VyZSBuYXRpdmUgaW5wdXQgdmFsdWUgaXMgY29udHJvbGxlZFxuICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy8xMjg1MFxuICAgICAgdGhpcy4kbmV4dFRpY2sodGhpcy5zZXROYXRpdmVJbnB1dFZhbHVlKTtcbiAgICB9LFxuICAgIGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH0sXG4gICAgY2FsY0ljb25PZmZzZXQ6IGZ1bmN0aW9uIGNhbGNJY29uT2Zmc2V0KHBsYWNlKSB7XG4gICAgICB2YXIgZWxMaXN0ID0gW10uc2xpY2UuY2FsbCh0aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZWwtaW5wdXRfXycgKyBwbGFjZSkgfHwgW10pO1xuICAgICAgaWYgKCFlbExpc3QubGVuZ3RoKSByZXR1cm47XG4gICAgICB2YXIgZWwgPSBudWxsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGVsTGlzdFtpXS5wYXJlbnROb2RlID09PSB0aGlzLiRlbCkge1xuICAgICAgICAgIGVsID0gZWxMaXN0W2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgICB2YXIgcGVuZGFudE1hcCA9IHtcbiAgICAgICAgc3VmZml4OiAnYXBwZW5kJyxcbiAgICAgICAgcHJlZml4OiAncHJlcGVuZCdcbiAgICAgIH07XG5cbiAgICAgIHZhciBwZW5kYW50ID0gcGVuZGFudE1hcFtwbGFjZV07XG4gICAgICBpZiAodGhpcy4kc2xvdHNbcGVuZGFudF0pIHtcbiAgICAgICAgZWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoJyArIChwbGFjZSA9PT0gJ3N1ZmZpeCcgPyAnLScgOiAnJykgKyB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuZWwtaW5wdXQtZ3JvdXBfXycgKyBwZW5kYW50KS5vZmZzZXRXaWR0aCArICdweCknO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXBkYXRlSWNvbk9mZnNldDogZnVuY3Rpb24gdXBkYXRlSWNvbk9mZnNldCgpIHtcbiAgICAgIHRoaXMuY2FsY0ljb25PZmZzZXQoJ3ByZWZpeCcpO1xuICAgICAgdGhpcy5jYWxjSWNvbk9mZnNldCgnc3VmZml4Jyk7XG4gICAgfSxcbiAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsICcnKTtcbiAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsICcnKTtcbiAgICAgIHRoaXMuJGVtaXQoJ2NsZWFyJyk7XG4gICAgfSxcbiAgICBoYW5kbGVQYXNzd29yZFZpc2libGU6IGZ1bmN0aW9uIGhhbmRsZVBhc3N3b3JkVmlzaWJsZSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLnBhc3N3b3JkVmlzaWJsZSA9ICF0aGlzLnBhc3N3b3JkVmlzaWJsZTtcbiAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLmZvY3VzKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldElucHV0OiBmdW5jdGlvbiBnZXRJbnB1dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLmlucHV0IHx8IHRoaXMuJHJlZnMudGV4dGFyZWE7XG4gICAgfSxcbiAgICBnZXRTdWZmaXhWaXNpYmxlOiBmdW5jdGlvbiBnZXRTdWZmaXhWaXNpYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHNsb3RzLnN1ZmZpeCB8fCB0aGlzLnN1ZmZpeEljb24gfHwgdGhpcy5zaG93Q2xlYXIgfHwgdGhpcy5zaG93UGFzc3dvcmQgfHwgdGhpcy5pc1dvcmRMaW1pdFZpc2libGUgfHwgdGhpcy52YWxpZGF0ZVN0YXRlICYmIHRoaXMubmVlZFN0YXR1c0ljb247XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy4kb24oJ2lucHV0U2VsZWN0JywgdGhpcy5zZWxlY3QpO1xuICB9LFxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHRoaXMuc2V0TmF0aXZlSW5wdXRWYWx1ZSgpO1xuICAgIHRoaXMucmVzaXplVGV4dGFyZWEoKTtcbiAgICB0aGlzLnVwZGF0ZUljb25PZmZzZXQoKTtcbiAgfSxcbiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCgpIHtcbiAgICB0aGlzLiRuZXh0VGljayh0aGlzLnVwZGF0ZUljb25PZmZzZXQpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5wdXQvc3JjL2lucHV0LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfaW5wdXR2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoaW5wdXR2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5wdXQvc3JjL2lucHV0LnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGlucHV0X2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2lucHV0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBpbnB1dHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0M2RkNzc0X3JlbmRlcixcbiAgaW5wdXR2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDNkZDc3NF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGlucHV0X2FwaTsgfVxuaW5wdXRfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9pbnB1dC9zcmMvaW5wdXQudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19pbnB1dCA9IChpbnB1dF9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0L2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnNyY19pbnB1dC5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHNyY19pbnB1dC5uYW1lLCBzcmNfaW5wdXQpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfaW5wdXQgPSAoc3JjX2lucHV0KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaW5wdXQtbnVtYmVyL3NyYy9pbnB1dC1udW1iZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQyZjhjZjY2JlxudmFyIGlucHV0X251bWJlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQyZjhjZjY2X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIGNsYXNzOiBbXG4gICAgICAgIFwiZWwtaW5wdXQtbnVtYmVyXCIsXG4gICAgICAgIF92bS5pbnB1dE51bWJlclNpemUgPyBcImVsLWlucHV0LW51bWJlci0tXCIgKyBfdm0uaW5wdXROdW1iZXJTaXplIDogXCJcIixcbiAgICAgICAgeyBcImlzLWRpc2FibGVkXCI6IF92bS5pbnB1dE51bWJlckRpc2FibGVkIH0sXG4gICAgICAgIHsgXCJpcy13aXRob3V0LWNvbnRyb2xzXCI6ICFfdm0uY29udHJvbHMgfSxcbiAgICAgICAgeyBcImlzLWNvbnRyb2xzLXJpZ2h0XCI6IF92bS5jb250cm9sc0F0UmlnaHQgfVxuICAgICAgXSxcbiAgICAgIG9uOiB7XG4gICAgICAgIGRyYWdzdGFydDogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX3ZtLmNvbnRyb2xzXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwicmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtcmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmRlY3JlYXNlLFxuICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJkZWNyZWFzZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1pbnB1dC1udW1iZXJfX2RlY3JlYXNlXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiB7IFwiaXMtZGlzYWJsZWRcIjogX3ZtLm1pbkRpc2FibGVkIH0sXG4gICAgICAgICAgICAgIGF0dHJzOiB7IHJvbGU6IFwiYnV0dG9uXCIgfSxcbiAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICBrZXlkb3duOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzLCAkZXZlbnQua2V5LCBcIkVudGVyXCIpXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uZGVjcmVhc2UoJGV2ZW50KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICBjbGFzczpcbiAgICAgICAgICAgICAgICAgIFwiZWwtaWNvbi1cIiArIChfdm0uY29udHJvbHNBdFJpZ2h0ID8gXCJhcnJvdy1kb3duXCIgOiBcIm1pbnVzXCIpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgX3ZtLmNvbnRyb2xzXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwicmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtcmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmluY3JlYXNlLFxuICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJpbmNyZWFzZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1pbnB1dC1udW1iZXJfX2luY3JlYXNlXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiB7IFwiaXMtZGlzYWJsZWRcIjogX3ZtLm1heERpc2FibGVkIH0sXG4gICAgICAgICAgICAgIGF0dHJzOiB7IHJvbGU6IFwiYnV0dG9uXCIgfSxcbiAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICBrZXlkb3duOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzLCAkZXZlbnQua2V5LCBcIkVudGVyXCIpXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uaW5jcmVhc2UoJGV2ZW50KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICBjbGFzczogXCJlbC1pY29uLVwiICsgKF92bS5jb250cm9sc0F0UmlnaHQgPyBcImFycm93LXVwXCIgOiBcInBsdXNcIilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfYyhcImVsLWlucHV0XCIsIHtcbiAgICAgICAgcmVmOiBcImlucHV0XCIsXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdmFsdWU6IF92bS5kaXNwbGF5VmFsdWUsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IF92bS5wbGFjZWhvbGRlcixcbiAgICAgICAgICBkaXNhYmxlZDogX3ZtLmlucHV0TnVtYmVyRGlzYWJsZWQsXG4gICAgICAgICAgc2l6ZTogX3ZtLmlucHV0TnVtYmVyU2l6ZSxcbiAgICAgICAgICBtYXg6IF92bS5tYXgsXG4gICAgICAgICAgbWluOiBfdm0ubWluLFxuICAgICAgICAgIG5hbWU6IF92bS5uYW1lLFxuICAgICAgICAgIGxhYmVsOiBfdm0ubGFiZWxcbiAgICAgICAgfSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBibHVyOiBfdm0uaGFuZGxlQmx1cixcbiAgICAgICAgICBmb2N1czogX3ZtLmhhbmRsZUZvY3VzLFxuICAgICAgICAgIGlucHV0OiBfdm0uaGFuZGxlSW5wdXQsXG4gICAgICAgICAgY2hhbmdlOiBfdm0uaGFuZGxlSW5wdXRDaGFuZ2VcbiAgICAgICAgfSxcbiAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICBrZXlkb3duOiBbXG4gICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInVwXCIsIDM4LCAkZXZlbnQua2V5LCBbXCJVcFwiLCBcIkFycm93VXBcIl0pXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgcmV0dXJuIF92bS5pbmNyZWFzZSgkZXZlbnQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJkb3duXCIsIDQwLCAkZXZlbnQua2V5LCBbXG4gICAgICAgICAgICAgICAgICBcIkRvd25cIixcbiAgICAgICAgICAgICAgICAgIFwiQXJyb3dEb3duXCJcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgIHJldHVybiBfdm0uZGVjcmVhc2UoJGV2ZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICBdLFxuICAgIDFcbiAgKVxufVxudmFyIGlucHV0X251bWJlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQyZjhjZjY2X3N0YXRpY1JlbmRlckZucyA9IFtdXG5pbnB1dF9udW1iZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF80MmY4Y2Y2Nl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0LW51bWJlci9zcmMvaW5wdXQtbnVtYmVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00MmY4Y2Y2NiZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlyZWN0aXZlcy9yZXBlYXQtY2xpY2suanNcblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHJlcGVhdF9jbGljayA9ICh7XG4gIGJpbmQ6IGZ1bmN0aW9uIGJpbmQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgdmFyIGludGVydmFsID0gbnVsbDtcbiAgICB2YXIgc3RhcnRUaW1lID0gdm9pZCAwO1xuICAgIHZhciBtYXhJbnRlcnZhbHMgPSBPYmplY3QodXRpbF9bXCJpc01hY1wiXSkoKSA/IDEwMCA6IDIwMDtcbiAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICByZXR1cm4gdm5vZGUuY29udGV4dFtiaW5kaW5nLmV4cHJlc3Npb25dLmFwcGx5KCk7XG4gICAgfTtcbiAgICB2YXIgY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgbWF4SW50ZXJ2YWxzKSB7XG4gICAgICAgIGhhbmRsZXIoKTtcbiAgICAgIH1cbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgaW50ZXJ2YWwgPSBudWxsO1xuICAgIH07XG5cbiAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShlbCwgJ21vdXNlZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uY2VcIl0pKGRvY3VtZW50LCAnbW91c2V1cCcsIGNsZWFyKTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChoYW5kbGVyLCBtYXhJbnRlcnZhbHMpO1xuICAgIH0pO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2lucHV0LW51bWJlci9zcmMvaW5wdXQtbnVtYmVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGlucHV0X251bWJlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbElucHV0TnVtYmVyJyxcbiAgbWl4aW5zOiBbZm9jdXNfZGVmYXVsdCgpKCdpbnB1dCcpXSxcbiAgaW5qZWN0OiB7XG4gICAgZWxGb3JtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgZWxGb3JtSXRlbToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9XG4gIH0sXG4gIGRpcmVjdGl2ZXM6IHtcbiAgICByZXBlYXRDbGljazogcmVwZWF0X2NsaWNrXG4gIH0sXG4gIGNvbXBvbmVudHM6IHtcbiAgICBFbElucHV0OiBpbnB1dF9kZWZhdWx0LmFcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICBzdGVwOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAxXG4gICAgfSxcbiAgICBzdGVwU3RyaWN0bHk6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgbWF4OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiBJbmZpbml0eVxuICAgIH0sXG4gICAgbWluOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAtSW5maW5pdHlcbiAgICB9LFxuICAgIHZhbHVlOiB7fSxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgY29udHJvbHM6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjb250cm9sc1Bvc2l0aW9uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgbmFtZTogU3RyaW5nLFxuICAgIGxhYmVsOiBTdHJpbmcsXG4gICAgcGxhY2Vob2xkZXI6IFN0cmluZyxcbiAgICBwcmVjaXNpb246IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsID49IDAgJiYgdmFsID09PSBwYXJzZUludCh2YWwsIDEwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogMCxcbiAgICAgIHVzZXJJbnB1dDogbnVsbFxuICAgIH07XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICB2YWx1ZToge1xuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcih2YWx1ZSkge1xuICAgICAgICB2YXIgbmV3VmFsID0gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgaWYgKG5ld1ZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGlzTmFOKG5ld1ZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zdGVwU3RyaWN0bHkpIHtcbiAgICAgICAgICAgIHZhciBzdGVwUHJlY2lzaW9uID0gdGhpcy5nZXRQcmVjaXNpb24odGhpcy5zdGVwKTtcbiAgICAgICAgICAgIHZhciBwcmVjaXNpb25GYWN0b3IgPSBNYXRoLnBvdygxMCwgc3RlcFByZWNpc2lvbik7XG4gICAgICAgICAgICBuZXdWYWwgPSBNYXRoLnJvdW5kKG5ld1ZhbCAvIHRoaXMuc3RlcCkgKiBwcmVjaXNpb25GYWN0b3IgKiB0aGlzLnN0ZXAgLyBwcmVjaXNpb25GYWN0b3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbCA9IHRoaXMudG9QcmVjaXNpb24obmV3VmFsLCB0aGlzLnByZWNpc2lvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdWYWwgPj0gdGhpcy5tYXgpIG5ld1ZhbCA9IHRoaXMubWF4O1xuICAgICAgICBpZiAobmV3VmFsIDw9IHRoaXMubWluKSBuZXdWYWwgPSB0aGlzLm1pbjtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBuZXdWYWw7XG4gICAgICAgIHRoaXMudXNlcklucHV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBuZXdWYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICBtaW5EaXNhYmxlZDogZnVuY3Rpb24gbWluRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVjcmVhc2UodGhpcy52YWx1ZSwgdGhpcy5zdGVwKSA8IHRoaXMubWluO1xuICAgIH0sXG4gICAgbWF4RGlzYWJsZWQ6IGZ1bmN0aW9uIG1heERpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2luY3JlYXNlKHRoaXMudmFsdWUsIHRoaXMuc3RlcCkgPiB0aGlzLm1heDtcbiAgICB9LFxuICAgIG51bVByZWNpc2lvbjogZnVuY3Rpb24gbnVtUHJlY2lzaW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSxcbiAgICAgICAgICBzdGVwID0gdGhpcy5zdGVwLFxuICAgICAgICAgIGdldFByZWNpc2lvbiA9IHRoaXMuZ2V0UHJlY2lzaW9uLFxuICAgICAgICAgIHByZWNpc2lvbiA9IHRoaXMucHJlY2lzaW9uO1xuXG4gICAgICB2YXIgc3RlcFByZWNpc2lvbiA9IGdldFByZWNpc2lvbihzdGVwKTtcbiAgICAgIGlmIChwcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RlcFByZWNpc2lvbiA+IHByZWNpc2lvbikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW0VsZW1lbnQgV2Fybl1bSW5wdXROdW1iZXJdcHJlY2lzaW9uIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHRoZSBkZWNpbWFsIHBsYWNlcyBvZiBzdGVwJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZWNpc2lvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChnZXRQcmVjaXNpb24odmFsdWUpLCBzdGVwUHJlY2lzaW9uKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbnRyb2xzQXRSaWdodDogZnVuY3Rpb24gY29udHJvbHNBdFJpZ2h0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udHJvbHMgJiYgdGhpcy5jb250cm9sc1Bvc2l0aW9uID09PSAncmlnaHQnO1xuICAgIH0sXG4gICAgX2VsRm9ybUl0ZW1TaXplOiBmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZWxGb3JtSXRlbSB8fCB7fSkuZWxGb3JtSXRlbVNpemU7XG4gICAgfSxcbiAgICBpbnB1dE51bWJlclNpemU6IGZ1bmN0aW9uIGlucHV0TnVtYmVyU2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgfHwgdGhpcy5fZWxGb3JtSXRlbVNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7XG4gICAgfSxcbiAgICBpbnB1dE51bWJlckRpc2FibGVkOiBmdW5jdGlvbiBpbnB1dE51bWJlckRpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgISEodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkO1xuICAgIH0sXG4gICAgZGlzcGxheVZhbHVlOiBmdW5jdGlvbiBkaXNwbGF5VmFsdWUoKSB7XG4gICAgICBpZiAodGhpcy51c2VySW5wdXQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlcklucHV0O1xuICAgICAgfVxuXG4gICAgICB2YXIgY3VycmVudFZhbHVlID0gdGhpcy5jdXJyZW50VmFsdWU7XG5cbiAgICAgIGlmICh0eXBlb2YgY3VycmVudFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAodGhpcy5zdGVwU3RyaWN0bHkpIHtcbiAgICAgICAgICB2YXIgc3RlcFByZWNpc2lvbiA9IHRoaXMuZ2V0UHJlY2lzaW9uKHRoaXMuc3RlcCk7XG4gICAgICAgICAgdmFyIHByZWNpc2lvbkZhY3RvciA9IE1hdGgucG93KDEwLCBzdGVwUHJlY2lzaW9uKTtcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBNYXRoLnJvdW5kKGN1cnJlbnRWYWx1ZSAvIHRoaXMuc3RlcCkgKiBwcmVjaXNpb25GYWN0b3IgKiB0aGlzLnN0ZXAgLyBwcmVjaXNpb25GYWN0b3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS50b0ZpeGVkKHRoaXMucHJlY2lzaW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIHRvUHJlY2lzaW9uOiBmdW5jdGlvbiB0b1ByZWNpc2lvbihudW0sIHByZWNpc2lvbikge1xuICAgICAgaWYgKHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkKSBwcmVjaXNpb24gPSB0aGlzLm51bVByZWNpc2lvbjtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KE1hdGgucm91bmQobnVtICogTWF0aC5wb3coMTAsIHByZWNpc2lvbikpIC8gTWF0aC5wb3coMTAsIHByZWNpc2lvbikpO1xuICAgIH0sXG4gICAgZ2V0UHJlY2lzaW9uOiBmdW5jdGlvbiBnZXRQcmVjaXNpb24odmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgICAgIHZhciB2YWx1ZVN0cmluZyA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICB2YXIgZG90UG9zaXRpb24gPSB2YWx1ZVN0cmluZy5pbmRleE9mKCcuJyk7XG4gICAgICB2YXIgcHJlY2lzaW9uID0gMDtcbiAgICAgIGlmIChkb3RQb3NpdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgcHJlY2lzaW9uID0gdmFsdWVTdHJpbmcubGVuZ3RoIC0gZG90UG9zaXRpb24gLSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByZWNpc2lvbjtcbiAgICB9LFxuICAgIF9pbmNyZWFzZTogZnVuY3Rpb24gX2luY3JlYXNlKHZhbCwgc3RlcCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWwgIT09ICdudW1iZXInICYmIHZhbCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWU7XG5cbiAgICAgIHZhciBwcmVjaXNpb25GYWN0b3IgPSBNYXRoLnBvdygxMCwgdGhpcy5udW1QcmVjaXNpb24pO1xuICAgICAgLy8gU29sdmUgdGhlIGFjY3VyYWN5IHByb2JsZW0gb2YgSlMgZGVjaW1hbCBjYWxjdWxhdGlvbiBieSBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBpbnRlZ2VyLlxuICAgICAgcmV0dXJuIHRoaXMudG9QcmVjaXNpb24oKHByZWNpc2lvbkZhY3RvciAqIHZhbCArIHByZWNpc2lvbkZhY3RvciAqIHN0ZXApIC8gcHJlY2lzaW9uRmFjdG9yKTtcbiAgICB9LFxuICAgIF9kZWNyZWFzZTogZnVuY3Rpb24gX2RlY3JlYXNlKHZhbCwgc3RlcCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWwgIT09ICdudW1iZXInICYmIHZhbCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWU7XG5cbiAgICAgIHZhciBwcmVjaXNpb25GYWN0b3IgPSBNYXRoLnBvdygxMCwgdGhpcy5udW1QcmVjaXNpb24pO1xuXG4gICAgICByZXR1cm4gdGhpcy50b1ByZWNpc2lvbigocHJlY2lzaW9uRmFjdG9yICogdmFsIC0gcHJlY2lzaW9uRmFjdG9yICogc3RlcCkgLyBwcmVjaXNpb25GYWN0b3IpO1xuICAgIH0sXG4gICAgaW5jcmVhc2U6IGZ1bmN0aW9uIGluY3JlYXNlKCkge1xuICAgICAgaWYgKHRoaXMuaW5wdXROdW1iZXJEaXNhYmxlZCB8fCB0aGlzLm1heERpc2FibGVkKSByZXR1cm47XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlIHx8IDA7XG4gICAgICB2YXIgbmV3VmFsID0gdGhpcy5faW5jcmVhc2UodmFsdWUsIHRoaXMuc3RlcCk7XG4gICAgICB0aGlzLnNldEN1cnJlbnRWYWx1ZShuZXdWYWwpO1xuICAgIH0sXG4gICAgZGVjcmVhc2U6IGZ1bmN0aW9uIGRlY3JlYXNlKCkge1xuICAgICAgaWYgKHRoaXMuaW5wdXROdW1iZXJEaXNhYmxlZCB8fCB0aGlzLm1pbkRpc2FibGVkKSByZXR1cm47XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlIHx8IDA7XG4gICAgICB2YXIgbmV3VmFsID0gdGhpcy5fZGVjcmVhc2UodmFsdWUsIHRoaXMuc3RlcCk7XG4gICAgICB0aGlzLnNldEN1cnJlbnRWYWx1ZShuZXdWYWwpO1xuICAgIH0sXG4gICAgaGFuZGxlQmx1cjogZnVuY3Rpb24gaGFuZGxlQmx1cihldmVudCkge1xuICAgICAgdGhpcy4kZW1pdCgnYmx1cicsIGV2ZW50KTtcbiAgICB9LFxuICAgIGhhbmRsZUZvY3VzOiBmdW5jdGlvbiBoYW5kbGVGb2N1cyhldmVudCkge1xuICAgICAgdGhpcy4kZW1pdCgnZm9jdXMnLCBldmVudCk7XG4gICAgfSxcbiAgICBzZXRDdXJyZW50VmFsdWU6IGZ1bmN0aW9uIHNldEN1cnJlbnRWYWx1ZShuZXdWYWwpIHtcbiAgICAgIHZhciBvbGRWYWwgPSB0aGlzLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgbmV3VmFsID09PSAnbnVtYmVyJyAmJiB0aGlzLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbCA9IHRoaXMudG9QcmVjaXNpb24obmV3VmFsLCB0aGlzLnByZWNpc2lvbik7XG4gICAgICB9XG4gICAgICBpZiAobmV3VmFsID49IHRoaXMubWF4KSBuZXdWYWwgPSB0aGlzLm1heDtcbiAgICAgIGlmIChuZXdWYWwgPD0gdGhpcy5taW4pIG5ld1ZhbCA9IHRoaXMubWluO1xuICAgICAgaWYgKG9sZFZhbCA9PT0gbmV3VmFsKSByZXR1cm47XG4gICAgICB0aGlzLnVzZXJJbnB1dCA9IG51bGw7XG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIG5ld1ZhbCk7XG4gICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBuZXdWYWwsIG9sZFZhbCk7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IG5ld1ZhbDtcbiAgICB9LFxuICAgIGhhbmRsZUlucHV0OiBmdW5jdGlvbiBoYW5kbGVJbnB1dCh2YWx1ZSkge1xuICAgICAgdGhpcy51c2VySW5wdXQgPSB2YWx1ZTtcbiAgICB9LFxuICAgIGhhbmRsZUlucHV0Q2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVJbnB1dENoYW5nZSh2YWx1ZSkge1xuICAgICAgdmFyIG5ld1ZhbCA9IHZhbHVlID09PSAnJyA/IHVuZGVmaW5lZCA6IE51bWJlcih2YWx1ZSk7XG4gICAgICBpZiAoIWlzTmFOKG5ld1ZhbCkgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHRoaXMuc2V0Q3VycmVudFZhbHVlKG5ld1ZhbCk7XG4gICAgICB9XG4gICAgICB0aGlzLnVzZXJJbnB1dCA9IG51bGw7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdCgpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuc2VsZWN0KCk7XG4gICAgfVxuICB9LFxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBpbm5lcklucHV0ID0gdGhpcy4kcmVmcy5pbnB1dC4kcmVmcy5pbnB1dDtcbiAgICBpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgncm9sZScsICdzcGluYnV0dG9uJyk7XG4gICAgaW5uZXJJbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtYXgnLCB0aGlzLm1heCk7XG4gICAgaW5uZXJJbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtaW4nLCB0aGlzLm1pbik7XG4gICAgaW5uZXJJbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLmN1cnJlbnRWYWx1ZSk7XG4gICAgaW5uZXJJbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCB0aGlzLmlucHV0TnVtYmVyRGlzYWJsZWQpO1xuICB9LFxuICB1cGRhdGVkOiBmdW5jdGlvbiB1cGRhdGVkKCkge1xuICAgIGlmICghdGhpcy4kcmVmcyB8fCAhdGhpcy4kcmVmcy5pbnB1dCkgcmV0dXJuO1xuICAgIHZhciBpbm5lcklucHV0ID0gdGhpcy4kcmVmcy5pbnB1dC4kcmVmcy5pbnB1dDtcbiAgICBpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMuY3VycmVudFZhbHVlKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0LW51bWJlci9zcmMvaW5wdXQtbnVtYmVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfaW5wdXRfbnVtYmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGlucHV0X251bWJlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbnB1dC1udW1iZXIvc3JjL2lucHV0LW51bWJlci52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBpbnB1dF9udW1iZXJfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfaW5wdXRfbnVtYmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBpbnB1dF9udW1iZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF80MmY4Y2Y2Nl9yZW5kZXIsXG4gIGlucHV0X251bWJlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQyZjhjZjY2X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgaW5wdXRfbnVtYmVyX2FwaTsgfVxuaW5wdXRfbnVtYmVyX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvaW5wdXQtbnVtYmVyL3NyYy9pbnB1dC1udW1iZXIudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGlucHV0X251bWJlciA9IChpbnB1dF9udW1iZXJfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbnB1dC1udW1iZXIvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaW5wdXRfbnVtYmVyLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoaW5wdXRfbnVtYmVyLm5hbWUsIGlucHV0X251bWJlcik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19pbnB1dF9udW1iZXIgPSAoaW5wdXRfbnVtYmVyKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02OWNkNjI2OCZcbnZhciByYWRpb3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzY5Y2Q2MjY4X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImxhYmVsXCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcmFkaW9cIixcbiAgICAgIGNsYXNzOiBbXG4gICAgICAgIF92bS5ib3JkZXIgJiYgX3ZtLnJhZGlvU2l6ZSA/IFwiZWwtcmFkaW8tLVwiICsgX3ZtLnJhZGlvU2l6ZSA6IFwiXCIsXG4gICAgICAgIHsgXCJpcy1kaXNhYmxlZFwiOiBfdm0uaXNEaXNhYmxlZCB9LFxuICAgICAgICB7IFwiaXMtZm9jdXNcIjogX3ZtLmZvY3VzIH0sXG4gICAgICAgIHsgXCJpcy1ib3JkZXJlZFwiOiBfdm0uYm9yZGVyIH0sXG4gICAgICAgIHsgXCJpcy1jaGVja2VkXCI6IF92bS5tb2RlbCA9PT0gX3ZtLmxhYmVsIH1cbiAgICAgIF0sXG4gICAgICBhdHRyczoge1xuICAgICAgICByb2xlOiBcInJhZGlvXCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IF92bS5tb2RlbCA9PT0gX3ZtLmxhYmVsLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogX3ZtLmlzRGlzYWJsZWQsXG4gICAgICAgIHRhYmluZGV4OiBfdm0udGFiSW5kZXhcbiAgICAgIH0sXG4gICAgICBvbjoge1xuICAgICAgICBrZXlkb3duOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInNwYWNlXCIsIDMyLCAkZXZlbnQua2V5LCBbXCIgXCIsIFwiU3BhY2ViYXJcIl0pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIF92bS5tb2RlbCA9IF92bS5pc0Rpc2FibGVkID8gX3ZtLm1vZGVsIDogX3ZtLmxhYmVsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFxuICAgICAgICBcInNwYW5cIixcbiAgICAgICAge1xuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXJhZGlvX19pbnB1dFwiLFxuICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICBcImlzLWRpc2FibGVkXCI6IF92bS5pc0Rpc2FibGVkLFxuICAgICAgICAgICAgXCJpcy1jaGVja2VkXCI6IF92bS5tb2RlbCA9PT0gX3ZtLmxhYmVsXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXCJzcGFuXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtcmFkaW9fX2lubmVyXCIgfSksXG4gICAgICAgICAgX2MoXCJpbnB1dFwiLCB7XG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IF92bS5tb2RlbCxcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcIm1vZGVsXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlZjogXCJyYWRpb1wiLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcmFkaW9fX29yaWdpbmFsXCIsXG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICB0eXBlOiBcInJhZGlvXCIsXG4gICAgICAgICAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgIG5hbWU6IF92bS5uYW1lLFxuICAgICAgICAgICAgICBkaXNhYmxlZDogX3ZtLmlzRGlzYWJsZWQsXG4gICAgICAgICAgICAgIHRhYmluZGV4OiBcIi0xXCIsXG4gICAgICAgICAgICAgIGF1dG9jb21wbGV0ZTogXCJvZmZcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBfdm0ubGFiZWwsXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IF92bS5fcShfdm0ubW9kZWwsIF92bS5sYWJlbClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICBmb2N1czogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgX3ZtLmZvY3VzID0gdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBibHVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBfdm0uZm9jdXMgPSBmYWxzZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjaGFuZ2U6IFtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIF92bS5tb2RlbCA9IF92bS5sYWJlbFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgX3ZtLmhhbmRsZUNoYW5nZVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgICAgKSxcbiAgICAgIF9jKFxuICAgICAgICBcInNwYW5cIixcbiAgICAgICAge1xuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXJhZGlvX19sYWJlbFwiLFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBrZXlkb3duOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX3ZtLl90KFwiZGVmYXVsdFwiKSxcbiAgICAgICAgICAhX3ZtLiRzbG90cy5kZWZhdWx0ID8gW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldIDogX3ZtLl9lKClcbiAgICAgICAgXSxcbiAgICAgICAgMlxuICAgICAgKVxuICAgIF1cbiAgKVxufVxudmFyIHJhZGlvdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjljZDYyNjhfc3RhdGljUmVuZGVyRm5zID0gW11cbnJhZGlvdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjljZDYyNjhfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTY5Y2Q2MjY4JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcmFkaW92dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxSYWRpbycsXG5cbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmFdLFxuXG4gIGluamVjdDoge1xuICAgIGVsRm9ybToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuXG4gICAgZWxGb3JtSXRlbToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9XG4gIH0sXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsUmFkaW8nLFxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IHt9LFxuICAgIGxhYmVsOiB7fSxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBuYW1lOiBTdHJpbmcsXG4gICAgYm9yZGVyOiBCb29sZWFuLFxuICAgIHNpemU6IFN0cmluZ1xuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvY3VzOiBmYWxzZVxuICAgIH07XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpc0dyb3VwOiBmdW5jdGlvbiBpc0dyb3VwKCkge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcbiAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lICE9PSAnRWxSYWRpb0dyb3VwJykge1xuICAgICAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3JhZGlvR3JvdXAgPSBwYXJlbnQ7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgbW9kZWw6IHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0dyb3VwID8gdGhpcy5fcmFkaW9Hcm91cC52YWx1ZSA6IHRoaXMudmFsdWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsKSB7XG4gICAgICAgIGlmICh0aGlzLmlzR3JvdXApIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoKCdFbFJhZGlvR3JvdXAnLCAnaW5wdXQnLCBbdmFsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuJHJlZnMucmFkaW8gJiYgKHRoaXMuJHJlZnMucmFkaW8uY2hlY2tlZCA9IHRoaXMubW9kZWwgPT09IHRoaXMubGFiZWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgX2VsRm9ybUl0ZW1TaXplOiBmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZWxGb3JtSXRlbSB8fCB7fSkuZWxGb3JtSXRlbVNpemU7XG4gICAgfSxcbiAgICByYWRpb1NpemU6IGZ1bmN0aW9uIHJhZGlvU2l6ZSgpIHtcbiAgICAgIHZhciB0ZW1SYWRpb1NpemUgPSB0aGlzLnNpemUgfHwgdGhpcy5fZWxGb3JtSXRlbVNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7XG4gICAgICByZXR1cm4gdGhpcy5pc0dyb3VwID8gdGhpcy5fcmFkaW9Hcm91cC5yYWRpb0dyb3VwU2l6ZSB8fCB0ZW1SYWRpb1NpemUgOiB0ZW1SYWRpb1NpemU7XG4gICAgfSxcbiAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbiBpc0Rpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNHcm91cCA/IHRoaXMuX3JhZGlvR3JvdXAuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZCB8fCAodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkIDogdGhpcy5kaXNhYmxlZCB8fCAodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkO1xuICAgIH0sXG4gICAgdGFiSW5kZXg6IGZ1bmN0aW9uIHRhYkluZGV4KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNEaXNhYmxlZCB8fCB0aGlzLmlzR3JvdXAgJiYgdGhpcy5tb2RlbCAhPT0gdGhpcy5sYWJlbCA/IC0xIDogMDtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy4kZW1pdCgnY2hhbmdlJywgX3RoaXMubW9kZWwpO1xuICAgICAgICBfdGhpcy5pc0dyb3VwICYmIF90aGlzLmRpc3BhdGNoKCdFbFJhZGlvR3JvdXAnLCAnaGFuZGxlQ2hhbmdlJywgX3RoaXMubW9kZWwpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfcmFkaW92dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAocmFkaW92dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHJhZGlvX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX3JhZGlvdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICByYWRpb3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzY5Y2Q2MjY4X3JlbmRlcixcbiAgcmFkaW92dWVfdHlwZV90ZW1wbGF0ZV9pZF82OWNkNjI2OF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHJhZGlvX2FwaTsgfVxucmFkaW9fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19yYWRpbyA9IChyYWRpb19jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhZGlvL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnNyY19yYWRpby5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHNyY19yYWRpby5uYW1lLCBzcmNfcmFkaW8pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfcmFkaW8gPSAoc3JjX3JhZGlvKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLWdyb3VwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD04MThhNzA0YyZcbnZhciByYWRpb19ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzgxOGE3MDRjX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBfdm0uX2VsVGFnLFxuICAgIHtcbiAgICAgIHRhZzogXCJjb21wb25lbnRcIixcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXJhZGlvLWdyb3VwXCIsXG4gICAgICBhdHRyczogeyByb2xlOiBcInJhZGlvZ3JvdXBcIiB9LFxuICAgICAgb246IHsga2V5ZG93bjogX3ZtLmhhbmRsZUtleWRvd24gfVxuICAgIH0sXG4gICAgW192bS5fdChcImRlZmF1bHRcIildLFxuICAgIDJcbiAgKVxufVxudmFyIHJhZGlvX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfODE4YTcwNGNfc3RhdGljUmVuZGVyRm5zID0gW11cbnJhZGlvX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfODE4YTcwNGNfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTgxOGE3MDRjJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cbnZhciBrZXlDb2RlID0gT2JqZWN0LmZyZWV6ZSh7XG4gIExFRlQ6IDM3LFxuICBVUDogMzgsXG4gIFJJR0hUOiAzOSxcbiAgRE9XTjogNDBcbn0pO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcmFkaW9fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxSYWRpb0dyb3VwJyxcblxuICBjb21wb25lbnROYW1lOiAnRWxSYWRpb0dyb3VwJyxcblxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm1JdGVtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH1cbiAgfSxcblxuICBtaXhpbnM6IFtlbWl0dGVyX2RlZmF1bHQuYV0sXG5cbiAgcHJvcHM6IHtcbiAgICB2YWx1ZToge30sXG4gICAgc2l6ZTogU3RyaW5nLFxuICAgIGZpbGw6IFN0cmluZyxcbiAgICB0ZXh0Q29sb3I6IFN0cmluZyxcbiAgICBkaXNhYmxlZDogQm9vbGVhblxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgX2VsRm9ybUl0ZW1TaXplOiBmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZWxGb3JtSXRlbSB8fCB7fSkuZWxGb3JtSXRlbVNpemU7XG4gICAgfSxcbiAgICBfZWxUYWc6IGZ1bmN0aW9uIF9lbFRhZygpIHtcbiAgICAgIHZhciB0YWcgPSAodGhpcy4kdm5vZGUuZGF0YSB8fCB7fSkudGFnO1xuICAgICAgaWYgKCF0YWcgfHwgdGFnID09PSAnY29tcG9uZW50JykgdGFnID0gJ2Rpdic7XG4gICAgICByZXR1cm4gdGFnO1xuICAgIH0sXG4gICAgcmFkaW9Hcm91cFNpemU6IGZ1bmN0aW9uIHJhZGlvR3JvdXBTaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSB8fCB0aGlzLl9lbEZvcm1JdGVtU2l6ZSB8fCAodGhpcy4kRUxFTUVOVCB8fCB7fSkuc2l6ZTtcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy4kb24oJ2hhbmRsZUNoYW5nZScsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgX3RoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbHVlKTtcbiAgICB9KTtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICAvLyDlvZNyYWRpb0dyb3Vw5rKh5pyJ6buY6K6k6YCJ6aG55pe277yM56ys5LiA5Liq5Y+v5Lul6YCJ5LitVGFi5a+86IiqXG4gICAgdmFyIHJhZGlvcyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPXJhZGlvXScpO1xuICAgIHZhciBmaXJzdExhYmVsID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9cmFkaW9dJylbMF07XG4gICAgaWYgKCFbXS5zb21lLmNhbGwocmFkaW9zLCBmdW5jdGlvbiAocmFkaW8pIHtcbiAgICAgIHJldHVybiByYWRpby5jaGVja2VkO1xuICAgIH0pICYmIGZpcnN0TGFiZWwpIHtcbiAgICAgIGZpcnN0TGFiZWwudGFiSW5kZXggPSAwO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFuZGxlS2V5ZG93bjogZnVuY3Rpb24gaGFuZGxlS2V5ZG93bihlKSB7XG4gICAgICAvLyDlt6blj7PkuIrkuIvmjInplK4g5Y+v5Lul5ZyocmFkaW/nu4TlhoXliIfmjaLkuI3lkIzpgInpoblcbiAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgIHZhciBjbGFzc05hbWUgPSB0YXJnZXQubm9kZU5hbWUgPT09ICdJTlBVVCcgPyAnW3R5cGU9cmFkaW9dJyA6ICdbcm9sZT1yYWRpb10nO1xuICAgICAgdmFyIHJhZGlvcyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoY2xhc3NOYW1lKTtcbiAgICAgIHZhciBsZW5ndGggPSByYWRpb3MubGVuZ3RoO1xuICAgICAgdmFyIGluZGV4ID0gW10uaW5kZXhPZi5jYWxsKHJhZGlvcywgdGFyZ2V0KTtcbiAgICAgIHZhciByb2xlUmFkaW9zID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9cmFkaW9dJyk7XG4gICAgICBzd2l0Y2ggKGUua2V5Q29kZSkge1xuICAgICAgICBjYXNlIGtleUNvZGUuTEVGVDpcbiAgICAgICAgY2FzZSBrZXlDb2RlLlVQOlxuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgcm9sZVJhZGlvc1tsZW5ndGggLSAxXS5jbGljaygpO1xuICAgICAgICAgICAgcm9sZVJhZGlvc1tsZW5ndGggLSAxXS5mb2N1cygpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb2xlUmFkaW9zW2luZGV4IC0gMV0uY2xpY2soKTtcbiAgICAgICAgICAgIHJvbGVSYWRpb3NbaW5kZXggLSAxXS5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBrZXlDb2RlLlJJR0hUOlxuICAgICAgICBjYXNlIGtleUNvZGUuRE9XTjpcbiAgICAgICAgICBpZiAoaW5kZXggPT09IGxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByb2xlUmFkaW9zWzBdLmNsaWNrKCk7XG4gICAgICAgICAgICByb2xlUmFkaW9zWzBdLmZvY3VzKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvbGVSYWRpb3NbaW5kZXggKyAxXS5jbGljaygpO1xuICAgICAgICAgICAgcm9sZVJhZGlvc1tpbmRleCArIDFdLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoX3ZhbHVlKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoKCdFbEZvcm1JdGVtJywgJ2VsLmZvcm0uY2hhbmdlJywgW3RoaXMudmFsdWVdKTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19yYWRpb19ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChyYWRpb19ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8tZ3JvdXAudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgcmFkaW9fZ3JvdXBfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfcmFkaW9fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJhZGlvX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfODE4YTcwNGNfcmVuZGVyLFxuICByYWRpb19ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzgxOGE3MDRjX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgcmFkaW9fZ3JvdXBfYXBpOyB9XG5yYWRpb19ncm91cF9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3JhZGlvL3NyYy9yYWRpby1ncm91cC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcmFkaW9fZ3JvdXAgPSAocmFkaW9fZ3JvdXBfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYWRpby1ncm91cC9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5yYWRpb19ncm91cC5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHJhZGlvX2dyb3VwLm5hbWUsIHJhZGlvX2dyb3VwKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3JhZGlvX2dyb3VwID0gKHJhZGlvX2dyb3VwKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLWJ1dHRvbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MThhNzdhMzImXG52YXIgcmFkaW9fYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfMThhNzdhMzJfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwibGFiZWxcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1yYWRpby1idXR0b25cIixcbiAgICAgIGNsYXNzOiBbXG4gICAgICAgIF92bS5zaXplID8gXCJlbC1yYWRpby1idXR0b24tLVwiICsgX3ZtLnNpemUgOiBcIlwiLFxuICAgICAgICB7IFwiaXMtYWN0aXZlXCI6IF92bS52YWx1ZSA9PT0gX3ZtLmxhYmVsIH0sXG4gICAgICAgIHsgXCJpcy1kaXNhYmxlZFwiOiBfdm0uaXNEaXNhYmxlZCB9LFxuICAgICAgICB7IFwiaXMtZm9jdXNcIjogX3ZtLmZvY3VzIH1cbiAgICAgIF0sXG4gICAgICBhdHRyczoge1xuICAgICAgICByb2xlOiBcInJhZGlvXCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IF92bS52YWx1ZSA9PT0gX3ZtLmxhYmVsLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogX3ZtLmlzRGlzYWJsZWQsXG4gICAgICAgIHRhYmluZGV4OiBfdm0udGFiSW5kZXhcbiAgICAgIH0sXG4gICAgICBvbjoge1xuICAgICAgICBrZXlkb3duOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInNwYWNlXCIsIDMyLCAkZXZlbnQua2V5LCBbXCIgXCIsIFwiU3BhY2ViYXJcIl0pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIF92bS52YWx1ZSA9IF92bS5pc0Rpc2FibGVkID8gX3ZtLnZhbHVlIDogX3ZtLmxhYmVsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFwiaW5wdXRcIiwge1xuICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJtb2RlbFwiLFxuICAgICAgICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG4gICAgICAgICAgICB2YWx1ZTogX3ZtLnZhbHVlLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJ2YWx1ZVwiXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1yYWRpby1idXR0b25fX29yaWctcmFkaW9cIixcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB0eXBlOiBcInJhZGlvXCIsXG4gICAgICAgICAgbmFtZTogX3ZtLm5hbWUsXG4gICAgICAgICAgZGlzYWJsZWQ6IF92bS5pc0Rpc2FibGVkLFxuICAgICAgICAgIHRhYmluZGV4OiBcIi0xXCIsXG4gICAgICAgICAgYXV0b2NvbXBsZXRlOiBcIm9mZlwiXG4gICAgICAgIH0sXG4gICAgICAgIGRvbVByb3BzOiB7IHZhbHVlOiBfdm0ubGFiZWwsIGNoZWNrZWQ6IF92bS5fcShfdm0udmFsdWUsIF92bS5sYWJlbCkgfSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBjaGFuZ2U6IFtcbiAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICBfdm0udmFsdWUgPSBfdm0ubGFiZWxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfdm0uaGFuZGxlQ2hhbmdlXG4gICAgICAgICAgXSxcbiAgICAgICAgICBmb2N1czogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICBfdm0uZm9jdXMgPSB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBibHVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgIF92bS5mb2N1cyA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIF9jKFxuICAgICAgICBcInNwYW5cIixcbiAgICAgICAge1xuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXJhZGlvLWJ1dHRvbl9faW5uZXJcIixcbiAgICAgICAgICBzdHlsZTogX3ZtLnZhbHVlID09PSBfdm0ubGFiZWwgPyBfdm0uYWN0aXZlU3R5bGUgOiBudWxsLFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBrZXlkb3duOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX3ZtLl90KFwiZGVmYXVsdFwiKSxcbiAgICAgICAgICAhX3ZtLiRzbG90cy5kZWZhdWx0ID8gW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldIDogX3ZtLl9lKClcbiAgICAgICAgXSxcbiAgICAgICAgMlxuICAgICAgKVxuICAgIF1cbiAgKVxufVxudmFyIHJhZGlvX2J1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE4YTc3YTMyX3N0YXRpY1JlbmRlckZucyA9IFtdXG5yYWRpb19idXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF8xOGE3N2EzMl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhZGlvL3NyYy9yYWRpby1idXR0b24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE4YTc3YTMyJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8tYnV0dG9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciByYWRpb19idXR0b252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxSYWRpb0J1dHRvbicsXG5cbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmFdLFxuXG4gIGluamVjdDoge1xuICAgIGVsRm9ybToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGVsRm9ybUl0ZW06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgbGFiZWw6IHt9LFxuICAgIGRpc2FibGVkOiBCb29sZWFuLFxuICAgIG5hbWU6IFN0cmluZ1xuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogZmFsc2VcbiAgICB9O1xuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmFkaW9Hcm91cC52YWx1ZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9yYWRpb0dyb3VwOiBmdW5jdGlvbiBfcmFkaW9Hcm91cCgpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQuJG9wdGlvbnMuY29tcG9uZW50TmFtZSAhPT0gJ0VsUmFkaW9Hcm91cCcpIHtcbiAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBhY3RpdmVTdHlsZTogZnVuY3Rpb24gYWN0aXZlU3R5bGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuX3JhZGlvR3JvdXAuZmlsbCB8fCAnJyxcbiAgICAgICAgYm9yZGVyQ29sb3I6IHRoaXMuX3JhZGlvR3JvdXAuZmlsbCB8fCAnJyxcbiAgICAgICAgYm94U2hhZG93OiB0aGlzLl9yYWRpb0dyb3VwLmZpbGwgPyAnLTFweCAwIDAgMCAnICsgdGhpcy5fcmFkaW9Hcm91cC5maWxsIDogJycsXG4gICAgICAgIGNvbG9yOiB0aGlzLl9yYWRpb0dyb3VwLnRleHRDb2xvciB8fCAnJ1xuICAgICAgfTtcbiAgICB9LFxuICAgIF9lbEZvcm1JdGVtU2l6ZTogZnVuY3Rpb24gX2VsRm9ybUl0ZW1TaXplKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmVsRm9ybUl0ZW0gfHwge30pLmVsRm9ybUl0ZW1TaXplO1xuICAgIH0sXG4gICAgc2l6ZTogZnVuY3Rpb24gc2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yYWRpb0dyb3VwLnJhZGlvR3JvdXBTaXplIHx8IHRoaXMuX2VsRm9ybUl0ZW1TaXplIHx8ICh0aGlzLiRFTEVNRU5UIHx8IHt9KS5zaXplO1xuICAgIH0sXG4gICAgaXNEaXNhYmxlZDogZnVuY3Rpb24gaXNEaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8IHRoaXMuX3JhZGlvR3JvdXAuZGlzYWJsZWQgfHwgKHRoaXMuZWxGb3JtIHx8IHt9KS5kaXNhYmxlZDtcbiAgICB9LFxuICAgIHRhYkluZGV4OiBmdW5jdGlvbiB0YWJJbmRleCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRGlzYWJsZWQgfHwgdGhpcy5fcmFkaW9Hcm91cCAmJiB0aGlzLnZhbHVlICE9PSB0aGlzLmxhYmVsID8gLTEgOiAwO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFuZGxlQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLmRpc3BhdGNoKCdFbFJhZGlvR3JvdXAnLCAnaGFuZGxlQ2hhbmdlJywgX3RoaXMudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLWJ1dHRvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3JhZGlvX2J1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChyYWRpb19idXR0b252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLWJ1dHRvbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciByYWRpb19idXR0b25fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfcmFkaW9fYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICByYWRpb19idXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF8xOGE3N2EzMl9yZW5kZXIsXG4gIHJhZGlvX2J1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE4YTc3YTMyX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgcmFkaW9fYnV0dG9uX2FwaTsgfVxucmFkaW9fYnV0dG9uX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLWJ1dHRvbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcmFkaW9fYnV0dG9uID0gKHJhZGlvX2J1dHRvbl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhZGlvLWJ1dHRvbi9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5yYWRpb19idXR0b24uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChyYWRpb19idXR0b24ubmFtZSwgcmFkaW9fYnV0dG9uKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3JhZGlvX2J1dHRvbiA9IChyYWRpb19idXR0b24pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWQwMzg3MDc0JlxudmFyIGNoZWNrYm94dnVlX3R5cGVfdGVtcGxhdGVfaWRfZDAzODcwNzRfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwibGFiZWxcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1jaGVja2JveFwiLFxuICAgICAgY2xhc3M6IFtcbiAgICAgICAgX3ZtLmJvcmRlciAmJiBfdm0uY2hlY2tib3hTaXplXG4gICAgICAgICAgPyBcImVsLWNoZWNrYm94LS1cIiArIF92bS5jaGVja2JveFNpemVcbiAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIHsgXCJpcy1kaXNhYmxlZFwiOiBfdm0uaXNEaXNhYmxlZCB9LFxuICAgICAgICB7IFwiaXMtYm9yZGVyZWRcIjogX3ZtLmJvcmRlciB9LFxuICAgICAgICB7IFwiaXMtY2hlY2tlZFwiOiBfdm0uaXNDaGVja2VkIH1cbiAgICAgIF0sXG4gICAgICBhdHRyczogeyBpZDogX3ZtLmlkIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFxuICAgICAgICBcInNwYW5cIixcbiAgICAgICAge1xuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNoZWNrYm94X19pbnB1dFwiLFxuICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICBcImlzLWRpc2FibGVkXCI6IF92bS5pc0Rpc2FibGVkLFxuICAgICAgICAgICAgXCJpcy1jaGVja2VkXCI6IF92bS5pc0NoZWNrZWQsXG4gICAgICAgICAgICBcImlzLWluZGV0ZXJtaW5hdGVcIjogX3ZtLmluZGV0ZXJtaW5hdGUsXG4gICAgICAgICAgICBcImlzLWZvY3VzXCI6IF92bS5mb2N1c1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHRhYmluZGV4OiBfdm0uaW5kZXRlcm1pbmF0ZSA/IDAgOiBmYWxzZSxcbiAgICAgICAgICAgIHJvbGU6IF92bS5pbmRldGVybWluYXRlID8gXCJjaGVja2JveFwiIDogZmFsc2UsXG4gICAgICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiBfdm0uaW5kZXRlcm1pbmF0ZSA/IFwibWl4ZWRcIiA6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXCJzcGFuXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtY2hlY2tib3hfX2lubmVyXCIgfSksXG4gICAgICAgICAgX3ZtLnRydWVMYWJlbCB8fCBfdm0uZmFsc2VMYWJlbFxuICAgICAgICAgICAgPyBfYyhcImlucHV0XCIsIHtcbiAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibW9kZWxcIixcbiAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0ubW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwibW9kZWxcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY2hlY2tib3hfX29yaWdpbmFsXCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY2hlY2tib3hcIixcbiAgICAgICAgICAgICAgICAgIFwiYXJpYS1oaWRkZW5cIjogX3ZtLmluZGV0ZXJtaW5hdGUgPyBcInRydWVcIiA6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICAgIG5hbWU6IF92bS5uYW1lLFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5pc0Rpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgXCJ0cnVlLXZhbHVlXCI6IF92bS50cnVlTGFiZWwsXG4gICAgICAgICAgICAgICAgICBcImZhbHNlLXZhbHVlXCI6IF92bS5mYWxzZUxhYmVsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgICAgY2hlY2tlZDogQXJyYXkuaXNBcnJheShfdm0ubW9kZWwpXG4gICAgICAgICAgICAgICAgICAgID8gX3ZtLl9pKF92bS5tb2RlbCwgbnVsbCkgPiAtMVxuICAgICAgICAgICAgICAgICAgICA6IF92bS5fcShfdm0ubW9kZWwsIF92bS50cnVlTGFiZWwpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgY2hhbmdlOiBbXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAkJGEgPSBfdm0ubW9kZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAkJGVsID0gJGV2ZW50LnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICQkYyA9ICQkZWwuY2hlY2tlZCA/IF92bS50cnVlTGFiZWwgOiBfdm0uZmFsc2VMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KCQkYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkJHYgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAkJGkgPSBfdm0uX2koJCRhLCAkJHYpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCRlbC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICQkaSA8IDAgJiYgKF92bS5tb2RlbCA9ICQkYS5jb25jYXQoWyQkdl0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJCRpID4gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3ZtLm1vZGVsID0gJCRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgJCRpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCgkJGEuc2xpY2UoJCRpICsgMSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0ubW9kZWwgPSAkJGNcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVDaGFuZ2VcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICBmb2N1czogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5mb2N1cyA9IHRydWVcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBibHVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmZvY3VzID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IF9jKFwiaW5wdXRcIiwge1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJtb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5tb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJtb2RlbFwiXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jaGVja2JveF9fb3JpZ2luYWxcIixcbiAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJjaGVja2JveFwiLFxuICAgICAgICAgICAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBfdm0uaW5kZXRlcm1pbmF0ZSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5pc0Rpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgbmFtZTogX3ZtLm5hbWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgY2hlY2tlZDogQXJyYXkuaXNBcnJheShfdm0ubW9kZWwpXG4gICAgICAgICAgICAgICAgICAgID8gX3ZtLl9pKF92bS5tb2RlbCwgX3ZtLmxhYmVsKSA+IC0xXG4gICAgICAgICAgICAgICAgICAgIDogX3ZtLm1vZGVsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgY2hhbmdlOiBbXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAkJGEgPSBfdm0ubW9kZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAkJGVsID0gJGV2ZW50LnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICQkYyA9ICQkZWwuY2hlY2tlZCA/IHRydWUgOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KCQkYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkJHYgPSBfdm0ubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICQkaSA9IF92bS5faSgkJGEsICQkdilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkJGVsLmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJCRpIDwgMCAmJiAoX3ZtLm1vZGVsID0gJCRhLmNvbmNhdChbJCR2XSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAkJGkgPiAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfdm0ubW9kZWwgPSAkJGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCAkJGkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KCQkYS5zbGljZSgkJGkgKyAxKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5tb2RlbCA9ICQkY1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmhhbmRsZUNoYW5nZVxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIGZvY3VzOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmZvY3VzID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGJsdXI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBfdm0uZm9jdXMgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgICAgKSxcbiAgICAgIF92bS4kc2xvdHMuZGVmYXVsdCB8fCBfdm0ubGFiZWxcbiAgICAgICAgPyBfYyhcbiAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1jaGVja2JveF9fbGFiZWxcIiB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfdm0uX3QoXCJkZWZhdWx0XCIpLFxuICAgICAgICAgICAgICAhX3ZtLiRzbG90cy5kZWZhdWx0ID8gW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldIDogX3ZtLl9lKClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpXG4gICAgXVxuICApXG59XG52YXIgY2hlY2tib3h2dWVfdHlwZV90ZW1wbGF0ZV9pZF9kMDM4NzA3NF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuY2hlY2tib3h2dWVfdHlwZV90ZW1wbGF0ZV9pZF9kMDM4NzA3NF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZDAzODcwNzQmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY2hlY2tib3h2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxDaGVja2JveCcsXG5cbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmFdLFxuXG4gIGluamVjdDoge1xuICAgIGVsRm9ybToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGVsRm9ybUl0ZW06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbENoZWNrYm94JyxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZWxmTW9kZWw6IGZhbHNlLFxuICAgICAgZm9jdXM6IGZhbHNlLFxuICAgICAgaXNMaW1pdEV4Y2VlZGVkOiBmYWxzZVxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIG1vZGVsOiB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNHcm91cCA/IHRoaXMuc3RvcmUgOiB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQgPyB0aGlzLnZhbHVlIDogdGhpcy5zZWxmTW9kZWw7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsKSB7XG4gICAgICAgIGlmICh0aGlzLmlzR3JvdXApIHtcbiAgICAgICAgICB0aGlzLmlzTGltaXRFeGNlZWRlZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX2NoZWNrYm94R3JvdXAubWluICE9PSB1bmRlZmluZWQgJiYgdmFsLmxlbmd0aCA8IHRoaXMuX2NoZWNrYm94R3JvdXAubWluICYmICh0aGlzLmlzTGltaXRFeGNlZWRlZCA9IHRydWUpO1xuXG4gICAgICAgICAgdGhpcy5fY2hlY2tib3hHcm91cC5tYXggIT09IHVuZGVmaW5lZCAmJiB2YWwubGVuZ3RoID4gdGhpcy5fY2hlY2tib3hHcm91cC5tYXggJiYgKHRoaXMuaXNMaW1pdEV4Y2VlZGVkID0gdHJ1ZSk7XG5cbiAgICAgICAgICB0aGlzLmlzTGltaXRFeGNlZWRlZCA9PT0gZmFsc2UgJiYgdGhpcy5kaXNwYXRjaCgnRWxDaGVja2JveEdyb3VwJywgJ2lucHV0JywgW3ZhbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcbiAgICAgICAgICB0aGlzLnNlbGZNb2RlbCA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBpc0NoZWNrZWQ6IGZ1bmN0aW9uIGlzQ2hlY2tlZCgpIHtcbiAgICAgIGlmICh7fS50b1N0cmluZy5jYWxsKHRoaXMubW9kZWwpID09PSAnW29iamVjdCBCb29sZWFuXScpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5tb2RlbCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuaW5kZXhPZih0aGlzLmxhYmVsKSA+IC0xO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGVsICE9PSBudWxsICYmIHRoaXMubW9kZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbCA9PT0gdGhpcy50cnVlTGFiZWw7XG4gICAgICB9XG4gICAgfSxcbiAgICBpc0dyb3VwOiBmdW5jdGlvbiBpc0dyb3VwKCkge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcbiAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lICE9PSAnRWxDaGVja2JveEdyb3VwJykge1xuICAgICAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2NoZWNrYm94R3JvdXAgPSBwYXJlbnQ7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIHN0b3JlOiBmdW5jdGlvbiBzdG9yZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGVja2JveEdyb3VwID8gdGhpcy5fY2hlY2tib3hHcm91cC52YWx1ZSA6IHRoaXMudmFsdWU7XG4gICAgfSxcblxuXG4gICAgLyogdXNlZCB0byBtYWtlIHRoZSBpc0Rpc2FibGVkIGp1ZGdtZW50IHVuZGVyIG1heC9taW4gcHJvcHMgKi9cbiAgICBpc0xpbWl0RGlzYWJsZWQ6IGZ1bmN0aW9uIGlzTGltaXREaXNhYmxlZCgpIHtcbiAgICAgIHZhciBfY2hlY2tib3hHcm91cCA9IHRoaXMuX2NoZWNrYm94R3JvdXAsXG4gICAgICAgICAgbWF4ID0gX2NoZWNrYm94R3JvdXAubWF4LFxuICAgICAgICAgIG1pbiA9IF9jaGVja2JveEdyb3VwLm1pbjtcblxuICAgICAgcmV0dXJuICEhKG1heCB8fCBtaW4pICYmIHRoaXMubW9kZWwubGVuZ3RoID49IG1heCAmJiAhdGhpcy5pc0NoZWNrZWQgfHwgdGhpcy5tb2RlbC5sZW5ndGggPD0gbWluICYmIHRoaXMuaXNDaGVja2VkO1xuICAgIH0sXG4gICAgaXNEaXNhYmxlZDogZnVuY3Rpb24gaXNEaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzR3JvdXAgPyB0aGlzLl9jaGVja2JveEdyb3VwLmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZWQgfHwgKHRoaXMuZWxGb3JtIHx8IHt9KS5kaXNhYmxlZCB8fCB0aGlzLmlzTGltaXREaXNhYmxlZCA6IHRoaXMuZGlzYWJsZWQgfHwgKHRoaXMuZWxGb3JtIHx8IHt9KS5kaXNhYmxlZDtcbiAgICB9LFxuICAgIF9lbEZvcm1JdGVtU2l6ZTogZnVuY3Rpb24gX2VsRm9ybUl0ZW1TaXplKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmVsRm9ybUl0ZW0gfHwge30pLmVsRm9ybUl0ZW1TaXplO1xuICAgIH0sXG4gICAgY2hlY2tib3hTaXplOiBmdW5jdGlvbiBjaGVja2JveFNpemUoKSB7XG4gICAgICB2YXIgdGVtQ2hlY2tib3hTaXplID0gdGhpcy5zaXplIHx8IHRoaXMuX2VsRm9ybUl0ZW1TaXplIHx8ICh0aGlzLiRFTEVNRU5UIHx8IHt9KS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXMuaXNHcm91cCA/IHRoaXMuX2NoZWNrYm94R3JvdXAuY2hlY2tib3hHcm91cFNpemUgfHwgdGVtQ2hlY2tib3hTaXplIDogdGVtQ2hlY2tib3hTaXplO1xuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIHZhbHVlOiB7fSxcbiAgICBsYWJlbDoge30sXG4gICAgaW5kZXRlcm1pbmF0ZTogQm9vbGVhbixcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBjaGVja2VkOiBCb29sZWFuLFxuICAgIG5hbWU6IFN0cmluZyxcbiAgICB0cnVlTGFiZWw6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgZmFsc2VMYWJlbDogW1N0cmluZywgTnVtYmVyXSxcbiAgICBpZDogU3RyaW5nLCAvKiDlvZNpbmRldGVybWluYXRl5Li655yf5pe277yM5Li6Y29udHJvbHPmj5Dkvpvnm7jlhbPov57nmoRjaGVja2JveOeahGlk77yM6KGo5piO5YWD57Sg6Ze055qE5o6n5Yi25YWz57O7Ki9cbiAgICBjb250cm9sczogU3RyaW5nLCAvKiDlvZNpbmRldGVybWluYXRl5Li655yf5pe277yM5Li6Y29udHJvbHPmj5Dkvpvnm7jlhbPov57nmoRjaGVja2JveOeahGlk77yM6KGo5piO5YWD57Sg6Ze055qE5o6n5Yi25YWz57O7Ki9cbiAgICBib3JkZXI6IEJvb2xlYW4sXG4gICAgc2l6ZTogU3RyaW5nXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGFkZFRvU3RvcmU6IGZ1bmN0aW9uIGFkZFRvU3RvcmUoKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm1vZGVsKSAmJiB0aGlzLm1vZGVsLmluZGV4T2YodGhpcy5sYWJlbCkgPT09IC0xKSB7XG4gICAgICAgIHRoaXMubW9kZWwucHVzaCh0aGlzLmxhYmVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLnRydWVMYWJlbCB8fCB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoZXYpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLmlzTGltaXRFeGNlZWRlZCkgcmV0dXJuO1xuICAgICAgdmFyIHZhbHVlID0gdm9pZCAwO1xuICAgICAgaWYgKGV2LnRhcmdldC5jaGVja2VkKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy50cnVlTGFiZWwgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB0aGlzLnRydWVMYWJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5mYWxzZUxhYmVsID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMuZmFsc2VMYWJlbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbHVlLCBldik7XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpcy5pc0dyb3VwKSB7XG4gICAgICAgICAgX3RoaXMuZGlzcGF0Y2goJ0VsQ2hlY2tib3hHcm91cCcsICdjaGFuZ2UnLCBbX3RoaXMuX2NoZWNrYm94R3JvdXAudmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5jaGVja2VkICYmIHRoaXMuYWRkVG9TdG9yZSgpO1xuICB9LFxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIC8vIOS4umluZGV0ZXJtaW5hdGXlhYPntKAg5re75YqgYXJpYS1jb250cm9scyDlsZ7mgKdcbiAgICBpZiAodGhpcy5pbmRldGVybWluYXRlKSB7XG4gICAgICB0aGlzLiRlbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtY29udHJvbHMnLCB0aGlzLmNvbnRyb2xzKTtcbiAgICB9XG4gIH0sXG5cblxuICB3YXRjaDoge1xuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShfdmFsdWUpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCAnZWwuZm9ybS5jaGFuZ2UnLCBfdmFsdWUpO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2NoZWNrYm94dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGNoZWNrYm94dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBjaGVja2JveF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19jaGVja2JveHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgY2hlY2tib3h2dWVfdHlwZV90ZW1wbGF0ZV9pZF9kMDM4NzA3NF9yZW5kZXIsXG4gIGNoZWNrYm94dnVlX3R5cGVfdGVtcGxhdGVfaWRfZDAzODcwNzRfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBjaGVja2JveF9hcGk7IH1cbmNoZWNrYm94X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfY2hlY2tib3ggPSAoY2hlY2tib3hfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zcmNfY2hlY2tib3guaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChzcmNfY2hlY2tib3gubmFtZSwgc3JjX2NoZWNrYm94KTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2NoZWNrYm94ID0gKHNyY19jaGVja2JveCk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC1idXR0b24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQ3OGU5MDZlJlxudmFyIGNoZWNrYm94X2J1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ3OGU5MDZlX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImxhYmVsXCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY2hlY2tib3gtYnV0dG9uXCIsXG4gICAgICBjbGFzczogW1xuICAgICAgICBfdm0uc2l6ZSA/IFwiZWwtY2hlY2tib3gtYnV0dG9uLS1cIiArIF92bS5zaXplIDogXCJcIixcbiAgICAgICAgeyBcImlzLWRpc2FibGVkXCI6IF92bS5pc0Rpc2FibGVkIH0sXG4gICAgICAgIHsgXCJpcy1jaGVja2VkXCI6IF92bS5pc0NoZWNrZWQgfSxcbiAgICAgICAgeyBcImlzLWZvY3VzXCI6IF92bS5mb2N1cyB9XG4gICAgICBdLFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgcm9sZTogXCJjaGVja2JveFwiLFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiBfdm0uaXNDaGVja2VkLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogX3ZtLmlzRGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF92bS50cnVlTGFiZWwgfHwgX3ZtLmZhbHNlTGFiZWxcbiAgICAgICAgPyBfYyhcImlucHV0XCIsIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwibW9kZWxcIixcbiAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLm1vZGVsLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwibW9kZWxcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY2hlY2tib3gtYnV0dG9uX19vcmlnaW5hbFwiLFxuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJjaGVja2JveFwiLFxuICAgICAgICAgICAgICBuYW1lOiBfdm0ubmFtZSxcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5pc0Rpc2FibGVkLFxuICAgICAgICAgICAgICBcInRydWUtdmFsdWVcIjogX3ZtLnRydWVMYWJlbCxcbiAgICAgICAgICAgICAgXCJmYWxzZS12YWx1ZVwiOiBfdm0uZmFsc2VMYWJlbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgIGNoZWNrZWQ6IEFycmF5LmlzQXJyYXkoX3ZtLm1vZGVsKVxuICAgICAgICAgICAgICAgID8gX3ZtLl9pKF92bS5tb2RlbCwgbnVsbCkgPiAtMVxuICAgICAgICAgICAgICAgIDogX3ZtLl9xKF92bS5tb2RlbCwgX3ZtLnRydWVMYWJlbClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICBjaGFuZ2U6IFtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAkJGEgPSBfdm0ubW9kZWwsXG4gICAgICAgICAgICAgICAgICAgICQkZWwgPSAkZXZlbnQudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAkJGMgPSAkJGVsLmNoZWNrZWQgPyBfdm0udHJ1ZUxhYmVsIDogX3ZtLmZhbHNlTGFiZWxcbiAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KCQkYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyICQkdiA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgJCRpID0gX3ZtLl9pKCQkYSwgJCR2KVxuICAgICAgICAgICAgICAgICAgICBpZiAoJCRlbC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgJCRpIDwgMCAmJiAoX3ZtLm1vZGVsID0gJCRhLmNvbmNhdChbJCR2XSkpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgJCRpID4gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChfdm0ubW9kZWwgPSAkJGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsICQkaSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCgkJGEuc2xpY2UoJCRpICsgMSkpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfdm0ubW9kZWwgPSAkJGNcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF92bS5oYW5kbGVDaGFuZ2VcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgIF92bS5mb2N1cyA9IHRydWVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYmx1cjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgX3ZtLmZvY3VzID0gZmFsc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIDogX2MoXCJpbnB1dFwiLCB7XG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IF92bS5tb2RlbCxcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcIm1vZGVsXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNoZWNrYm94LWJ1dHRvbl9fb3JpZ2luYWxcIixcbiAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwiY2hlY2tib3hcIixcbiAgICAgICAgICAgICAgbmFtZTogX3ZtLm5hbWUsXG4gICAgICAgICAgICAgIGRpc2FibGVkOiBfdm0uaXNEaXNhYmxlZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBfdm0ubGFiZWwsXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IEFycmF5LmlzQXJyYXkoX3ZtLm1vZGVsKVxuICAgICAgICAgICAgICAgID8gX3ZtLl9pKF92bS5tb2RlbCwgX3ZtLmxhYmVsKSA+IC0xXG4gICAgICAgICAgICAgICAgOiBfdm0ubW9kZWxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICBjaGFuZ2U6IFtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAkJGEgPSBfdm0ubW9kZWwsXG4gICAgICAgICAgICAgICAgICAgICQkZWwgPSAkZXZlbnQudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAkJGMgPSAkJGVsLmNoZWNrZWQgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KCQkYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyICQkdiA9IF92bS5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAkJGkgPSBfdm0uX2koJCRhLCAkJHYpXG4gICAgICAgICAgICAgICAgICAgIGlmICgkJGVsLmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAkJGkgPCAwICYmIChfdm0ubW9kZWwgPSAkJGEuY29uY2F0KFskJHZdKSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAkJGkgPiAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKF92bS5tb2RlbCA9ICQkYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgJCRpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KCQkYS5zbGljZSgkJGkgKyAxKSkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5tb2RlbCA9ICQkY1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgX3ZtLmhhbmRsZUNoYW5nZVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBmb2N1czogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgX3ZtLmZvY3VzID0gdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBibHVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBfdm0uZm9jdXMgPSBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICBfdm0uJHNsb3RzLmRlZmF1bHQgfHwgX3ZtLmxhYmVsXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY2hlY2tib3gtYnV0dG9uX19pbm5lclwiLFxuICAgICAgICAgICAgICBzdHlsZTogX3ZtLmlzQ2hlY2tlZCA/IF92bS5hY3RpdmVTdHlsZSA6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbX3ZtLl90KFwiZGVmYXVsdFwiLCBbX3ZtLl92KF92bS5fcyhfdm0ubGFiZWwpKV0pXSxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIDogX3ZtLl9lKClcbiAgICBdXG4gIClcbn1cbnZhciBjaGVja2JveF9idXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF80NzhlOTA2ZV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuY2hlY2tib3hfYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfNDc4ZTkwNmVfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gtYnV0dG9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00NzhlOTA2ZSZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LWJ1dHRvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjaGVja2JveF9idXR0b252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxDaGVja2JveEJ1dHRvbicsXG5cbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmFdLFxuXG4gIGluamVjdDoge1xuICAgIGVsRm9ybToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGVsRm9ybUl0ZW06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGZNb2RlbDogZmFsc2UsXG4gICAgICBmb2N1czogZmFsc2UsXG4gICAgICBpc0xpbWl0RXhjZWVkZWQ6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IHt9LFxuICAgIGxhYmVsOiB7fSxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBjaGVja2VkOiBCb29sZWFuLFxuICAgIG5hbWU6IFN0cmluZyxcbiAgICB0cnVlTGFiZWw6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgZmFsc2VMYWJlbDogW1N0cmluZywgTnVtYmVyXVxuICB9LFxuICBjb21wdXRlZDoge1xuICAgIG1vZGVsOiB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrYm94R3JvdXAgPyB0aGlzLnN0b3JlIDogdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkID8gdGhpcy52YWx1ZSA6IHRoaXMuc2VsZk1vZGVsO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbCkge1xuICAgICAgICBpZiAodGhpcy5fY2hlY2tib3hHcm91cCkge1xuICAgICAgICAgIHRoaXMuaXNMaW1pdEV4Y2VlZGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fY2hlY2tib3hHcm91cC5taW4gIT09IHVuZGVmaW5lZCAmJiB2YWwubGVuZ3RoIDwgdGhpcy5fY2hlY2tib3hHcm91cC5taW4gJiYgKHRoaXMuaXNMaW1pdEV4Y2VlZGVkID0gdHJ1ZSk7XG5cbiAgICAgICAgICB0aGlzLl9jaGVja2JveEdyb3VwLm1heCAhPT0gdW5kZWZpbmVkICYmIHZhbC5sZW5ndGggPiB0aGlzLl9jaGVja2JveEdyb3VwLm1heCAmJiAodGhpcy5pc0xpbWl0RXhjZWVkZWQgPSB0cnVlKTtcblxuICAgICAgICAgIHRoaXMuaXNMaW1pdEV4Y2VlZGVkID09PSBmYWxzZSAmJiB0aGlzLmRpc3BhdGNoKCdFbENoZWNrYm94R3JvdXAnLCAnaW5wdXQnLCBbdmFsXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZk1vZGVsID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGlzQ2hlY2tlZDogZnVuY3Rpb24gaXNDaGVja2VkKCkge1xuICAgICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwodGhpcy5tb2RlbCkgPT09ICdbb2JqZWN0IEJvb2xlYW5dJykge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm1vZGVsKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5pbmRleE9mKHRoaXMubGFiZWwpID4gLTE7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWwgIT09IG51bGwgJiYgdGhpcy5tb2RlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsID09PSB0aGlzLnRydWVMYWJlbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9jaGVja2JveEdyb3VwOiBmdW5jdGlvbiBfY2hlY2tib3hHcm91cCgpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQuJG9wdGlvbnMuY29tcG9uZW50TmFtZSAhPT0gJ0VsQ2hlY2tib3hHcm91cCcpIHtcbiAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBzdG9yZTogZnVuY3Rpb24gc3RvcmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hlY2tib3hHcm91cCA/IHRoaXMuX2NoZWNrYm94R3JvdXAudmFsdWUgOiB0aGlzLnZhbHVlO1xuICAgIH0sXG4gICAgYWN0aXZlU3R5bGU6IGZ1bmN0aW9uIGFjdGl2ZVN0eWxlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLl9jaGVja2JveEdyb3VwLmZpbGwgfHwgJycsXG4gICAgICAgIGJvcmRlckNvbG9yOiB0aGlzLl9jaGVja2JveEdyb3VwLmZpbGwgfHwgJycsXG4gICAgICAgIGNvbG9yOiB0aGlzLl9jaGVja2JveEdyb3VwLnRleHRDb2xvciB8fCAnJyxcbiAgICAgICAgJ2JveC1zaGFkb3cnOiAnLTFweCAwIDAgMCAnICsgdGhpcy5fY2hlY2tib3hHcm91cC5maWxsXG5cbiAgICAgIH07XG4gICAgfSxcbiAgICBfZWxGb3JtSXRlbVNpemU6IGZ1bmN0aW9uIF9lbEZvcm1JdGVtU2l6ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5lbEZvcm1JdGVtIHx8IHt9KS5lbEZvcm1JdGVtU2l6ZTtcbiAgICB9LFxuICAgIHNpemU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hlY2tib3hHcm91cC5jaGVja2JveEdyb3VwU2l6ZSB8fCB0aGlzLl9lbEZvcm1JdGVtU2l6ZSB8fCAodGhpcy4kRUxFTUVOVCB8fCB7fSkuc2l6ZTtcbiAgICB9LFxuXG5cbiAgICAvKiB1c2VkIHRvIG1ha2UgdGhlIGlzRGlzYWJsZWQganVkZ21lbnQgdW5kZXIgbWF4L21pbiBwcm9wcyAqL1xuICAgIGlzTGltaXREaXNhYmxlZDogZnVuY3Rpb24gaXNMaW1pdERpc2FibGVkKCkge1xuICAgICAgdmFyIF9jaGVja2JveEdyb3VwMiA9IHRoaXMuX2NoZWNrYm94R3JvdXAsXG4gICAgICAgICAgbWF4ID0gX2NoZWNrYm94R3JvdXAyLm1heCxcbiAgICAgICAgICBtaW4gPSBfY2hlY2tib3hHcm91cDIubWluO1xuXG4gICAgICByZXR1cm4gISEobWF4IHx8IG1pbikgJiYgdGhpcy5tb2RlbC5sZW5ndGggPj0gbWF4ICYmICF0aGlzLmlzQ2hlY2tlZCB8fCB0aGlzLm1vZGVsLmxlbmd0aCA8PSBtaW4gJiYgdGhpcy5pc0NoZWNrZWQ7XG4gICAgfSxcbiAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbiBpc0Rpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrYm94R3JvdXAgPyB0aGlzLl9jaGVja2JveEdyb3VwLmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZWQgfHwgKHRoaXMuZWxGb3JtIHx8IHt9KS5kaXNhYmxlZCB8fCB0aGlzLmlzTGltaXREaXNhYmxlZCA6IHRoaXMuZGlzYWJsZWQgfHwgKHRoaXMuZWxGb3JtIHx8IHt9KS5kaXNhYmxlZDtcbiAgICB9XG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICBhZGRUb1N0b3JlOiBmdW5jdGlvbiBhZGRUb1N0b3JlKCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5tb2RlbCkgJiYgdGhpcy5tb2RlbC5pbmRleE9mKHRoaXMubGFiZWwpID09PSAtMSkge1xuICAgICAgICB0aGlzLm1vZGVsLnB1c2godGhpcy5sYWJlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy50cnVlTGFiZWwgfHwgdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5pc0xpbWl0RXhjZWVkZWQpIHJldHVybjtcbiAgICAgIHZhciB2YWx1ZSA9IHZvaWQgMDtcbiAgICAgIGlmIChldi50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMudHJ1ZUxhYmVsID09PSB1bmRlZmluZWQgPyB0cnVlIDogdGhpcy50cnVlTGFiZWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuZmFsc2VMYWJlbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLmZhbHNlTGFiZWw7XG4gICAgICB9XG4gICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWx1ZSwgZXYpO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuX2NoZWNrYm94R3JvdXApIHtcbiAgICAgICAgICBfdGhpcy5kaXNwYXRjaCgnRWxDaGVja2JveEdyb3VwJywgJ2NoYW5nZScsIFtfdGhpcy5fY2hlY2tib3hHcm91cC52YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcbiAgICB0aGlzLmNoZWNrZWQgJiYgdGhpcy5hZGRUb1N0b3JlKCk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gtYnV0dG9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfY2hlY2tib3hfYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGNoZWNrYm94X2J1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gtYnV0dG9uLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGNoZWNrYm94X2J1dHRvbl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19jaGVja2JveF9idXR0b252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGNoZWNrYm94X2J1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ3OGU5MDZlX3JlbmRlcixcbiAgY2hlY2tib3hfYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfNDc4ZTkwNmVfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBjaGVja2JveF9idXR0b25fYXBpOyB9XG5jaGVja2JveF9idXR0b25fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gtYnV0dG9uLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjaGVja2JveF9idXR0b24gPSAoY2hlY2tib3hfYnV0dG9uX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2hlY2tib3gtYnV0dG9uL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNoZWNrYm94X2J1dHRvbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KGNoZWNrYm94X2J1dHRvbi5uYW1lLCBjaGVja2JveF9idXR0b24pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfY2hlY2tib3hfYnV0dG9uID0gKGNoZWNrYm94X2J1dHRvbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC1ncm91cC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NzI4OWEyOTAmXG52YXIgY2hlY2tib3hfZ3JvdXB2dWVfdHlwZV90ZW1wbGF0ZV9pZF83Mjg5YTI5MF9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1jaGVja2JveC1ncm91cFwiLFxuICAgICAgYXR0cnM6IHsgcm9sZTogXCJncm91cFwiLCBcImFyaWEtbGFiZWxcIjogXCJjaGVja2JveC1ncm91cFwiIH1cbiAgICB9LFxuICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAyXG4gIClcbn1cbnZhciBjaGVja2JveF9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzcyODlhMjkwX3N0YXRpY1JlbmRlckZucyA9IFtdXG5jaGVja2JveF9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzcyODlhMjkwX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LWdyb3VwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03Mjg5YTI5MCZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LWdyb3VwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNoZWNrYm94X2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsQ2hlY2tib3hHcm91cCcsXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsQ2hlY2tib3hHcm91cCcsXG5cbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmFdLFxuXG4gIGluamVjdDoge1xuICAgIGVsRm9ybUl0ZW06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IHt9LFxuICAgIGRpc2FibGVkOiBCb29sZWFuLFxuICAgIG1pbjogTnVtYmVyLFxuICAgIG1heDogTnVtYmVyLFxuICAgIHNpemU6IFN0cmluZyxcbiAgICBmaWxsOiBTdHJpbmcsXG4gICAgdGV4dENvbG9yOiBTdHJpbmdcbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIF9lbEZvcm1JdGVtU2l6ZTogZnVuY3Rpb24gX2VsRm9ybUl0ZW1TaXplKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmVsRm9ybUl0ZW0gfHwge30pLmVsRm9ybUl0ZW1TaXplO1xuICAgIH0sXG4gICAgY2hlY2tib3hHcm91cFNpemU6IGZ1bmN0aW9uIGNoZWNrYm94R3JvdXBTaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSB8fCB0aGlzLl9lbEZvcm1JdGVtU2l6ZSB8fCAodGhpcy4kRUxFTUVOVCB8fCB7fSkuc2l6ZTtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoX3ZhbHVlKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoKCdFbEZvcm1JdGVtJywgJ2VsLmZvcm0uY2hhbmdlJywgW192YWx1ZV0pO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC1ncm91cC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2NoZWNrYm94X2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGNoZWNrYm94X2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC1ncm91cC52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBjaGVja2JveF9ncm91cF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19jaGVja2JveF9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgY2hlY2tib3hfZ3JvdXB2dWVfdHlwZV90ZW1wbGF0ZV9pZF83Mjg5YTI5MF9yZW5kZXIsXG4gIGNoZWNrYm94X2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfNzI4OWEyOTBfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBjaGVja2JveF9ncm91cF9hcGk7IH1cbmNoZWNrYm94X2dyb3VwX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LWdyb3VwLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjaGVja2JveF9ncm91cCA9IChjaGVja2JveF9ncm91cF9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94LWdyb3VwL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNoZWNrYm94X2dyb3VwLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoY2hlY2tib3hfZ3JvdXAubmFtZSwgY2hlY2tib3hfZ3JvdXApO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfY2hlY2tib3hfZ3JvdXAgPSAoY2hlY2tib3hfZ3JvdXApO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zd2l0Y2gvc3JjL2NvbXBvbmVudC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MmRjZDhmYmImXG52YXIgY29tcG9uZW50dnVlX3R5cGVfdGVtcGxhdGVfaWRfMmRjZDhmYmJfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtc3dpdGNoXCIsXG4gICAgICBjbGFzczogeyBcImlzLWRpc2FibGVkXCI6IF92bS5zd2l0Y2hEaXNhYmxlZCwgXCJpcy1jaGVja2VkXCI6IF92bS5jaGVja2VkIH0sXG4gICAgICBhdHRyczoge1xuICAgICAgICByb2xlOiBcInN3aXRjaFwiLFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiBfdm0uY2hlY2tlZCxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IF92bS5zd2l0Y2hEaXNhYmxlZFxuICAgICAgfSxcbiAgICAgIG9uOiB7XG4gICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIHJldHVybiBfdm0uc3dpdGNoVmFsdWUoJGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcImlucHV0XCIsIHtcbiAgICAgICAgcmVmOiBcImlucHV0XCIsXG4gICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXN3aXRjaF9faW5wdXRcIixcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB0eXBlOiBcImNoZWNrYm94XCIsXG4gICAgICAgICAgaWQ6IF92bS5pZCxcbiAgICAgICAgICBuYW1lOiBfdm0ubmFtZSxcbiAgICAgICAgICBcInRydWUtdmFsdWVcIjogX3ZtLmFjdGl2ZVZhbHVlLFxuICAgICAgICAgIFwiZmFsc2UtdmFsdWVcIjogX3ZtLmluYWN0aXZlVmFsdWUsXG4gICAgICAgICAgZGlzYWJsZWQ6IF92bS5zd2l0Y2hEaXNhYmxlZFxuICAgICAgICB9LFxuICAgICAgICBvbjoge1xuICAgICAgICAgIGNoYW5nZTogX3ZtLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgICBrZXlkb3duOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzLCAkZXZlbnQua2V5LCBcIkVudGVyXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfdm0uc3dpdGNoVmFsdWUoJGV2ZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBfdm0uaW5hY3RpdmVJY29uQ2xhc3MgfHwgX3ZtLmluYWN0aXZlVGV4dFxuICAgICAgICA/IF9jKFxuICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgXCJlbC1zd2l0Y2hfX2xhYmVsXCIsXG4gICAgICAgICAgICAgICAgXCJlbC1zd2l0Y2hfX2xhYmVsLS1sZWZ0XCIsXG4gICAgICAgICAgICAgICAgIV92bS5jaGVja2VkID8gXCJpcy1hY3RpdmVcIiA6IFwiXCJcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX3ZtLmluYWN0aXZlSWNvbkNsYXNzXG4gICAgICAgICAgICAgICAgPyBfYyhcImlcIiwgeyBjbGFzczogW192bS5pbmFjdGl2ZUljb25DbGFzc10gfSlcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAhX3ZtLmluYWN0aXZlSWNvbkNsYXNzICYmIF92bS5pbmFjdGl2ZVRleHRcbiAgICAgICAgICAgICAgICA/IF9jKFwic3BhblwiLCB7IGF0dHJzOiB7IFwiYXJpYS1oaWRkZW5cIjogX3ZtLmNoZWNrZWQgfSB9LCBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLmluYWN0aXZlVGV4dCkpXG4gICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfYyhcInNwYW5cIiwge1xuICAgICAgICByZWY6IFwiY29yZVwiLFxuICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1zd2l0Y2hfX2NvcmVcIixcbiAgICAgICAgc3R5bGU6IHsgd2lkdGg6IF92bS5jb3JlV2lkdGggKyBcInB4XCIgfVxuICAgICAgfSksXG4gICAgICBfdm0uYWN0aXZlSWNvbkNsYXNzIHx8IF92bS5hY3RpdmVUZXh0XG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICBcImVsLXN3aXRjaF9fbGFiZWxcIixcbiAgICAgICAgICAgICAgICBcImVsLXN3aXRjaF9fbGFiZWwtLXJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgX3ZtLmNoZWNrZWQgPyBcImlzLWFjdGl2ZVwiIDogXCJcIlxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfdm0uYWN0aXZlSWNvbkNsYXNzXG4gICAgICAgICAgICAgICAgPyBfYyhcImlcIiwgeyBjbGFzczogW192bS5hY3RpdmVJY29uQ2xhc3NdIH0pXG4gICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgIV92bS5hY3RpdmVJY29uQ2xhc3MgJiYgX3ZtLmFjdGl2ZVRleHRcbiAgICAgICAgICAgICAgICA/IF9jKFwic3BhblwiLCB7IGF0dHJzOiB7IFwiYXJpYS1oaWRkZW5cIjogIV92bS5jaGVja2VkIH0gfSwgW1xuICAgICAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKF92bS5hY3RpdmVUZXh0KSlcbiAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgXVxuICAgICAgICAgIClcbiAgICAgICAgOiBfdm0uX2UoKVxuICAgIF1cbiAgKVxufVxudmFyIGNvbXBvbmVudHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJkY2Q4ZmJiX3N0YXRpY1JlbmRlckZucyA9IFtdXG5jb21wb25lbnR2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZGNkOGZiYl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N3aXRjaC9zcmMvY29tcG9uZW50LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yZGNkOGZiYiZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3dpdGNoL3NyYy9jb21wb25lbnQudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzd2l0Y2hfc3JjX2NvbXBvbmVudHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFN3aXRjaCcsXG4gIG1peGluczogW2ZvY3VzX2RlZmF1bHQoKSgnaW5wdXQnKSwgbWlncmF0aW5nX2RlZmF1bHQuYSwgZW1pdHRlcl9kZWZhdWx0LmFdLFxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuICBwcm9wczoge1xuICAgIHZhbHVlOiB7XG4gICAgICB0eXBlOiBbQm9vbGVhbiwgU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIGRpc2FibGVkOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIHdpZHRoOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiA0MFxuICAgIH0sXG4gICAgYWN0aXZlSWNvbkNsYXNzOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgaW5hY3RpdmVJY29uQ2xhc3M6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBhY3RpdmVUZXh0OiBTdHJpbmcsXG4gICAgaW5hY3RpdmVUZXh0OiBTdHJpbmcsXG4gICAgYWN0aXZlQ29sb3I6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBpbmFjdGl2ZUNvbG9yOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgYWN0aXZlVmFsdWU6IHtcbiAgICAgIHR5cGU6IFtCb29sZWFuLCBTdHJpbmcsIE51bWJlcl0sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBpbmFjdGl2ZVZhbHVlOiB7XG4gICAgICB0eXBlOiBbQm9vbGVhbiwgU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIG5hbWU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICB2YWxpZGF0ZUV2ZW50OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgaWQ6IFN0cmluZ1xuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb3JlV2lkdGg6IHRoaXMud2lkdGhcbiAgICB9O1xuICB9LFxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuICAgIGlmICghflt0aGlzLmFjdGl2ZVZhbHVlLCB0aGlzLmluYWN0aXZlVmFsdWVdLmluZGV4T2YodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdGhpcy5pbmFjdGl2ZVZhbHVlKTtcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjaGVja2VkOiBmdW5jdGlvbiBjaGVja2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IHRoaXMuYWN0aXZlVmFsdWU7XG4gICAgfSxcbiAgICBzd2l0Y2hEaXNhYmxlZDogZnVuY3Rpb24gc3dpdGNoRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkO1xuICAgIH1cbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBjaGVja2VkOiBmdW5jdGlvbiBjaGVja2VkKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5jaGVja2VkID0gdGhpcy5jaGVja2VkO1xuICAgICAgaWYgKHRoaXMuYWN0aXZlQ29sb3IgfHwgdGhpcy5pbmFjdGl2ZUNvbG9yKSB7XG4gICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZENvbG9yKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52YWxpZGF0ZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCAnZWwuZm9ybS5jaGFuZ2UnLCBbdGhpcy52YWx1ZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgdmFsID0gdGhpcy5jaGVja2VkID8gdGhpcy5pbmFjdGl2ZVZhbHVlIDogdGhpcy5hY3RpdmVWYWx1ZTtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcbiAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbCk7XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHNldCBpbnB1dCdzIGNoZWNrZWQgcHJvcGVydHlcbiAgICAgICAgLy8gaW4gY2FzZSBwYXJlbnQgcmVmdXNlcyB0byBjaGFuZ2UgY29tcG9uZW50J3MgdmFsdWVcbiAgICAgICAgaWYgKF90aGlzLiRyZWZzLmlucHV0KSB7XG4gICAgICAgICAgX3RoaXMuJHJlZnMuaW5wdXQuY2hlY2tlZCA9IF90aGlzLmNoZWNrZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2V0QmFja2dyb3VuZENvbG9yOiBmdW5jdGlvbiBzZXRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICB2YXIgbmV3Q29sb3IgPSB0aGlzLmNoZWNrZWQgPyB0aGlzLmFjdGl2ZUNvbG9yIDogdGhpcy5pbmFjdGl2ZUNvbG9yO1xuICAgICAgdGhpcy4kcmVmcy5jb3JlLnN0eWxlLmJvcmRlckNvbG9yID0gbmV3Q29sb3I7XG4gICAgICB0aGlzLiRyZWZzLmNvcmUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gbmV3Q29sb3I7XG4gICAgfSxcbiAgICBzd2l0Y2hWYWx1ZTogZnVuY3Rpb24gc3dpdGNoVmFsdWUoKSB7XG4gICAgICAhdGhpcy5zd2l0Y2hEaXNhYmxlZCAmJiB0aGlzLmhhbmRsZUNoYW5nZSgpO1xuICAgIH0sXG4gICAgZ2V0TWlncmF0aW5nQ29uZmlnOiBmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICdvbi1jb2xvcic6ICdvbi1jb2xvciBpcyByZW5hbWVkIHRvIGFjdGl2ZS1jb2xvci4nLFxuICAgICAgICAgICdvZmYtY29sb3InOiAnb2ZmLWNvbG9yIGlzIHJlbmFtZWQgdG8gaW5hY3RpdmUtY29sb3IuJyxcbiAgICAgICAgICAnb24tdGV4dCc6ICdvbi10ZXh0IGlzIHJlbmFtZWQgdG8gYWN0aXZlLXRleHQuJyxcbiAgICAgICAgICAnb2ZmLXRleHQnOiAnb2ZmLXRleHQgaXMgcmVuYW1lZCB0byBpbmFjdGl2ZS10ZXh0LicsXG4gICAgICAgICAgJ29uLXZhbHVlJzogJ29uLXZhbHVlIGlzIHJlbmFtZWQgdG8gYWN0aXZlLXZhbHVlLicsXG4gICAgICAgICAgJ29mZi12YWx1ZSc6ICdvZmYtdmFsdWUgaXMgcmVuYW1lZCB0byBpbmFjdGl2ZS12YWx1ZS4nLFxuICAgICAgICAgICdvbi1pY29uLWNsYXNzJzogJ29uLWljb24tY2xhc3MgaXMgcmVuYW1lZCB0byBhY3RpdmUtaWNvbi1jbGFzcy4nLFxuICAgICAgICAgICdvZmYtaWNvbi1jbGFzcyc6ICdvZmYtaWNvbi1jbGFzcyBpcyByZW5hbWVkIHRvIGluYWN0aXZlLWljb24tY2xhc3MuJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICB0aGlzLmNvcmVXaWR0aCA9IHRoaXMud2lkdGggfHwgNDA7XG4gICAgaWYgKHRoaXMuYWN0aXZlQ29sb3IgfHwgdGhpcy5pbmFjdGl2ZUNvbG9yKSB7XG4gICAgICB0aGlzLnNldEJhY2tncm91bmRDb2xvcigpO1xuICAgIH1cbiAgICB0aGlzLiRyZWZzLmlucHV0LmNoZWNrZWQgPSB0aGlzLmNoZWNrZWQ7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zd2l0Y2gvc3JjL2NvbXBvbmVudC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfc3dpdGNoX3NyY19jb21wb25lbnR2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoc3dpdGNoX3NyY19jb21wb25lbnR2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3dpdGNoL3NyYy9jb21wb25lbnQudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgc3JjX2NvbXBvbmVudF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhY2thZ2VzX3N3aXRjaF9zcmNfY29tcG9uZW50dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBjb21wb25lbnR2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZGNkOGZiYl9yZW5kZXIsXG4gIGNvbXBvbmVudHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJkY2Q4ZmJiX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgc3JjX2NvbXBvbmVudF9hcGk7IH1cbnNyY19jb21wb25lbnRfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9zd2l0Y2gvc3JjL2NvbXBvbmVudC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3dpdGNoX3NyY19jb21wb25lbnQgPSAoc3JjX2NvbXBvbmVudF9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N3aXRjaC9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zd2l0Y2hfc3JjX2NvbXBvbmVudC5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHN3aXRjaF9zcmNfY29tcG9uZW50Lm5hbWUsIHN3aXRjaF9zcmNfY29tcG9uZW50KTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3N3aXRjaCA9IChzd2l0Y2hfc3JjX2NvbXBvbmVudCk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wZTRhYWRlNiZcbnZhciBzZWxlY3R2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wZTRhYWRlNl9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImNsaWNrb3V0c2lkZVwiLFxuICAgICAgICAgIHJhd05hbWU6IFwidi1jbGlja291dHNpZGVcIixcbiAgICAgICAgICB2YWx1ZTogX3ZtLmhhbmRsZUNsb3NlLFxuICAgICAgICAgIGV4cHJlc3Npb246IFwiaGFuZGxlQ2xvc2VcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtc2VsZWN0XCIsXG4gICAgICBjbGFzczogW192bS5zZWxlY3RTaXplID8gXCJlbC1zZWxlY3QtLVwiICsgX3ZtLnNlbGVjdFNpemUgOiBcIlwiXSxcbiAgICAgIG9uOiB7XG4gICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICByZXR1cm4gX3ZtLnRvZ2dsZU1lbnUoJGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfdm0ubXVsdGlwbGVcbiAgICAgICAgPyBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJlZjogXCJ0YWdzXCIsXG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdF9fdGFnc1wiLFxuICAgICAgICAgICAgICBzdHlsZTogeyBcIm1heC13aWR0aFwiOiBfdm0uaW5wdXRXaWR0aCAtIDMyICsgXCJweFwiLCB3aWR0aDogXCIxMDAlXCIgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX3ZtLmNvbGxhcHNlVGFncyAmJiBfdm0uc2VsZWN0ZWQubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtdGFnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6ICFfdm0uc2VsZWN0RGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogX3ZtLmNvbGxhcHNlVGFnU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXQ6IF92bS5zZWxlY3RlZFswXS5oaXRTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImluZm9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpc2FibGUtdHJhbnNpdGlvbnNcIjogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kZWxldGVUYWcoJGV2ZW50LCBfdm0uc2VsZWN0ZWRbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcInNwYW5cIiwgeyBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3RfX3RhZ3MtdGV4dFwiIH0sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKF92bS5zZWxlY3RlZFswXS5jdXJyZW50TGFiZWwpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLnNlbGVjdGVkLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC10YWdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IF92bS5jb2xsYXBzZVRhZ1NpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5mb1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpc2FibGUtdHJhbnNpdGlvbnNcIjogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdF9fdGFncy10ZXh0XCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW192bS5fdihcIisgXCIgKyBfdm0uX3MoX3ZtLnNlbGVjdGVkLmxlbmd0aCAtIDEpKV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgICFfdm0uY29sbGFwc2VUYWdzXG4gICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJ0cmFuc2l0aW9uLWdyb3VwXCIsXG4gICAgICAgICAgICAgICAgICAgIHsgb246IHsgXCJhZnRlci1sZWF2ZVwiOiBfdm0ucmVzZXRJbnB1dEhlaWdodCB9IH0sXG4gICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0uc2VsZWN0ZWQsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImVsLXRhZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IF92bS5nZXRWYWx1ZUtleShpdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zYWJsZTogIV92bS5zZWxlY3REaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBfdm0uY29sbGFwc2VUYWdTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdDogaXRlbS5oaXRTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImluZm9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpc2FibGUtdHJhbnNpdGlvbnNcIjogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kZWxldGVUYWcoJGV2ZW50LCBpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtc2VsZWN0X190YWdzLXRleHRcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhpdGVtLmN1cnJlbnRMYWJlbCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgIF92bS5maWx0ZXJhYmxlXG4gICAgICAgICAgICAgICAgPyBfYyhcImlucHV0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibW9kZWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwicXVlcnlcIlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgcmVmOiBcImlucHV0XCIsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdF9faW5wdXRcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtfdm0uc2VsZWN0U2l6ZSA/IFwiaXMtXCIgKyBfdm0uc2VsZWN0U2l6ZSA6IFwiXCJdLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgIFwiZmxleC1ncm93XCI6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBfdm0uaW5wdXRMZW5ndGggLyAoX3ZtLmlucHV0V2lkdGggLSAzMikgKyBcIiVcIixcbiAgICAgICAgICAgICAgICAgICAgICBcIm1heC13aWR0aFwiOiBfdm0uaW5wdXRXaWR0aCAtIDQyICsgXCJweFwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5zZWxlY3REaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU6IF92bS5hdXRvQ29tcGxldGUgfHwgX3ZtLmF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczogeyB2YWx1ZTogX3ZtLnF1ZXJ5IH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9jdXM6IF92bS5oYW5kbGVGb2N1cyxcbiAgICAgICAgICAgICAgICAgICAgICBibHVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zb2Z0Rm9jdXMgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAga2V5dXA6IF92bS5tYW5hZ2VQbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgICBrZXlkb3duOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0ucmVzZXRJbnB1dFN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJkb3duXCIsIDQwLCAkZXZlbnQua2V5LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkRvd25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJyb3dEb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVOYXZpZ2F0ZShcIm5leHRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInVwXCIsIDM4LCAkZXZlbnQua2V5LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFycm93VXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmhhbmRsZU5hdmlnYXRlKFwicHJldlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQua2V5Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZW50ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnNlbGVjdE9wdGlvbigkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcsICRldmVudC5rZXksIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRXNjXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVzY2FwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnZpc2libGUgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQua2V5Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOCwgNDZdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcIkJhY2tzcGFjZVwiLCBcIkRlbGV0ZVwiLCBcIkRlbFwiXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLmRlbGV0ZVByZXZUYWcoJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwidGFiXCIsIDksICRldmVudC5rZXksIFwiVGFiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnZpc2libGUgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb25zdGFydDogX3ZtLmhhbmRsZUNvbXBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9udXBkYXRlOiBfdm0uaGFuZGxlQ29tcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb25lbmQ6IF92bS5oYW5kbGVDb21wb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZXZlbnQudGFyZ2V0LmNvbXBvc2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5xdWVyeSA9ICRldmVudC50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGVib3VuY2VkUXVlcnlDaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfYyhcbiAgICAgICAgXCJlbC1pbnB1dFwiLFxuICAgICAgICB7XG4gICAgICAgICAgcmVmOiBcInJlZmVyZW5jZVwiLFxuICAgICAgICAgIGNsYXNzOiB7IFwiaXMtZm9jdXNcIjogX3ZtLnZpc2libGUgfSxcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogX3ZtLmN1cnJlbnRQbGFjZWhvbGRlcixcbiAgICAgICAgICAgIG5hbWU6IF92bS5uYW1lLFxuICAgICAgICAgICAgaWQ6IF92bS5pZCxcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZTogX3ZtLmF1dG9Db21wbGV0ZSB8fCBfdm0uYXV0b2NvbXBsZXRlLFxuICAgICAgICAgICAgc2l6ZTogX3ZtLnNlbGVjdFNpemUsXG4gICAgICAgICAgICBkaXNhYmxlZDogX3ZtLnNlbGVjdERpc2FibGVkLFxuICAgICAgICAgICAgcmVhZG9ubHk6IF92bS5yZWFkb25seSxcbiAgICAgICAgICAgIFwidmFsaWRhdGUtZXZlbnRcIjogZmFsc2UsXG4gICAgICAgICAgICB0YWJpbmRleDogX3ZtLm11bHRpcGxlICYmIF92bS5maWx0ZXJhYmxlID8gXCItMVwiIDogbnVsbFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb246IHtcbiAgICAgICAgICAgIGZvY3VzOiBfdm0uaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICBibHVyOiBfdm0uaGFuZGxlQmx1cixcbiAgICAgICAgICAgIGlucHV0OiBfdm0uZGVib3VuY2VkT25JbnB1dENoYW5nZSxcbiAgICAgICAgICAgIGNvbXBvc2l0aW9uc3RhcnQ6IF92bS5oYW5kbGVDb21wb3NpdGlvbixcbiAgICAgICAgICAgIGNvbXBvc2l0aW9udXBkYXRlOiBfdm0uaGFuZGxlQ29tcG9zaXRpb24sXG4gICAgICAgICAgICBjb21wb3NpdGlvbmVuZDogX3ZtLmhhbmRsZUNvbXBvc2l0aW9uXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuYXRpdmVPbjoge1xuICAgICAgICAgICAga2V5ZG93bjogW1xuICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImRvd25cIiwgNDAsICRldmVudC5rZXksIFtcbiAgICAgICAgICAgICAgICAgICAgXCJEb3duXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiQXJyb3dEb3duXCJcbiAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgIF92bS5oYW5kbGVOYXZpZ2F0ZShcIm5leHRcIilcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJ1cFwiLCAzOCwgJGV2ZW50LmtleSwgW1xuICAgICAgICAgICAgICAgICAgICBcIlVwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiQXJyb3dVcFwiXG4gICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICBfdm0uaGFuZGxlTmF2aWdhdGUoXCJwcmV2XCIpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMsICRldmVudC5rZXksIFwiRW50ZXJcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIF92bS5zZWxlY3RPcHRpb24oJGV2ZW50KVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNywgJGV2ZW50LmtleSwgW1xuICAgICAgICAgICAgICAgICAgICBcIkVzY1wiLFxuICAgICAgICAgICAgICAgICAgICBcIkVzY2FwZVwiXG4gICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICBfdm0udmlzaWJsZSA9IGZhbHNlXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwidGFiXCIsIDksICRldmVudC5rZXksIFwiVGFiXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdm0udmlzaWJsZSA9IGZhbHNlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBtb3VzZWVudGVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgX3ZtLmlucHV0SG92ZXJpbmcgPSB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91c2VsZWF2ZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgIF92bS5pbnB1dEhvdmVyaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICB2YWx1ZTogX3ZtLnNlbGVjdGVkTGFiZWwsXG4gICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oJCR2KSB7XG4gICAgICAgICAgICAgIF92bS5zZWxlY3RlZExhYmVsID0gJCR2XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJzZWxlY3RlZExhYmVsXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfdm0uJHNsb3RzLnByZWZpeFxuICAgICAgICAgICAgPyBfYyhcInRlbXBsYXRlXCIsIHsgc2xvdDogXCJwcmVmaXhcIiB9LCBbX3ZtLl90KFwicHJlZml4XCIpXSwgMilcbiAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgX2MoXCJ0ZW1wbGF0ZVwiLCB7IHNsb3Q6IFwic3VmZml4XCIgfSwgW1xuICAgICAgICAgICAgX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiAhX3ZtLnNob3dDbG9zZSxcbiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiIXNob3dDbG9zZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICAgIFwiZWwtc2VsZWN0X19jYXJldFwiLFxuICAgICAgICAgICAgICAgIFwiZWwtaW5wdXRfX2ljb25cIixcbiAgICAgICAgICAgICAgICBcImVsLWljb24tXCIgKyBfdm0uaWNvbkNsYXNzXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgX3ZtLnNob3dDbG9zZVxuICAgICAgICAgICAgICA/IF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgXCJlbC1zZWxlY3RfX2NhcmV0IGVsLWlucHV0X19pY29uIGVsLWljb24tY2lyY2xlLWNsb3NlXCIsXG4gICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLmhhbmRsZUNsZWFyQ2xpY2sgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICBdKVxuICAgICAgICBdLFxuICAgICAgICAyXG4gICAgICApLFxuICAgICAgX2MoXG4gICAgICAgIFwidHJhbnNpdGlvblwiLFxuICAgICAgICB7XG4gICAgICAgICAgYXR0cnM6IHsgbmFtZTogXCJlbC16b29tLWluLXRvcFwiIH0sXG4gICAgICAgICAgb246IHtcbiAgICAgICAgICAgIFwiYmVmb3JlLWVudGVyXCI6IF92bS5oYW5kbGVNZW51RW50ZXIsXG4gICAgICAgICAgICBcImFmdGVyLWxlYXZlXCI6IF92bS5kb0Rlc3Ryb3lcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwiZWwtc2VsZWN0LW1lbnVcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0udmlzaWJsZSAmJiBfdm0uZW1wdHlUZXh0ICE9PSBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwidmlzaWJsZSAmJiBlbXB0eVRleHQgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlZjogXCJwb3BwZXJcIixcbiAgICAgICAgICAgICAgYXR0cnM6IHsgXCJhcHBlbmQtdG8tYm9keVwiOiBfdm0ucG9wcGVyQXBwZW5kVG9Cb2R5IH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZWwtc2Nyb2xsYmFyXCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLm9wdGlvbnMubGVuZ3RoID4gMCAmJiAhX3ZtLmxvYWRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJvcHRpb25zLmxlbmd0aCA+IDAgJiYgIWxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgcmVmOiBcInNjcm9sbGJhclwiLFxuICAgICAgICAgICAgICAgICAgY2xhc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJpcy1lbXB0eVwiOlxuICAgICAgICAgICAgICAgICAgICAgICFfdm0uYWxsb3dDcmVhdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICBfdm0ucXVlcnkgJiZcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uZmlsdGVyZWRPcHRpb25zQ291bnQgPT09IDBcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICB0YWc6IFwidWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ3cmFwLWNsYXNzXCI6IFwiZWwtc2VsZWN0LWRyb3Bkb3duX193cmFwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidmlldy1jbGFzc1wiOiBcImVsLXNlbGVjdC1kcm9wZG93bl9fbGlzdFwiXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICBfdm0uc2hvd05ld09wdGlvblxuICAgICAgICAgICAgICAgICAgICA/IF9jKFwiZWwtb3B0aW9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHZhbHVlOiBfdm0ucXVlcnksIGNyZWF0ZWQ6IFwiXCIgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgICAgICBfdm0uX3QoXCJkZWZhdWx0XCIpXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF92bS5lbXB0eVRleHQgJiZcbiAgICAgICAgICAgICAgKCFfdm0uYWxsb3dDcmVhdGUgfHxcbiAgICAgICAgICAgICAgICBfdm0ubG9hZGluZyB8fFxuICAgICAgICAgICAgICAgIChfdm0uYWxsb3dDcmVhdGUgJiYgX3ZtLm9wdGlvbnMubGVuZ3RoID09PSAwKSlcbiAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLiRzbG90cy5lbXB0eVxuICAgICAgICAgICAgICAgICAgICAgID8gX3ZtLl90KFwiZW1wdHlcIilcbiAgICAgICAgICAgICAgICAgICAgICA6IF9jKFwicFwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdC1kcm9wZG93bl9fZW1wdHlcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgICBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLmVtcHR5VGV4dCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIF0sXG4gICAgICAgIDFcbiAgICAgIClcbiAgICBdLFxuICAgIDFcbiAgKVxufVxudmFyIHNlbGVjdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzBlNGFhZGU2X3N0YXRpY1JlbmRlckZucyA9IFtdXG5zZWxlY3R2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wZTRhYWRlNl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wZTRhYWRlNiZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDY4Mjg3NDgmXG52YXIgc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY4Mjg3NDhfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtc2VsZWN0LWRyb3Bkb3duIGVsLXBvcHBlclwiLFxuICAgICAgY2xhc3M6IFt7IFwiaXMtbXVsdGlwbGVcIjogX3ZtLiRwYXJlbnQubXVsdGlwbGUgfSwgX3ZtLnBvcHBlckNsYXNzXSxcbiAgICAgIHN0eWxlOiB7IG1pbldpZHRoOiBfdm0ubWluV2lkdGggfVxuICAgIH0sXG4gICAgW192bS5fdChcImRlZmF1bHRcIildLFxuICAgIDJcbiAgKVxufVxudmFyIHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ODI4NzQ4X3N0YXRpY1JlbmRlckZucyA9IFtdXG5zZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNjgyODc0OCZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QtZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsU2VsZWN0RHJvcGRvd24nLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbFNlbGVjdERyb3Bkb3duJyxcblxuICBtaXhpbnM6IFt2dWVfcG9wcGVyX2RlZmF1bHQuYV0sXG5cbiAgcHJvcHM6IHtcbiAgICBwbGFjZW1lbnQ6IHtcbiAgICAgIGRlZmF1bHQ6ICdib3R0b20tc3RhcnQnXG4gICAgfSxcblxuICAgIGJvdW5kYXJpZXNQYWRkaW5nOiB7XG4gICAgICBkZWZhdWx0OiAwXG4gICAgfSxcblxuICAgIHBvcHBlck9wdGlvbnM6IHtcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGdwdUFjY2VsZXJhdGlvbjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdmlzaWJsZUFycm93OiB7XG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcblxuICAgIGFwcGVuZFRvQm9keToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWluV2lkdGg6ICcnXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcG9wcGVyQ2xhc3M6IGZ1bmN0aW9uIHBvcHBlckNsYXNzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5wb3BwZXJDbGFzcztcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICAnJHBhcmVudC5pbnB1dFdpZHRoJzogZnVuY3Rpb24gJHBhcmVudElucHV0V2lkdGgoKSB7XG4gICAgICB0aGlzLm1pbldpZHRoID0gdGhpcy4kcGFyZW50LiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCArICdweCc7XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMucmVmZXJlbmNlRWxtID0gdGhpcy4kcGFyZW50LiRyZWZzLnJlZmVyZW5jZS4kZWw7XG4gICAgdGhpcy4kcGFyZW50LnBvcHBlckVsbSA9IHRoaXMucG9wcGVyRWxtID0gdGhpcy4kZWw7XG4gICAgdGhpcy4kb24oJ3VwZGF0ZVBvcHBlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy4kcGFyZW50LnZpc2libGUpIF90aGlzLnVwZGF0ZVBvcHBlcigpO1xuICAgIH0pO1xuICAgIHRoaXMuJG9uKCdkZXN0cm95UG9wcGVyJywgdGhpcy5kZXN0cm95UG9wcGVyKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBzZWxlY3RfZHJvcGRvd25fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBzZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9yZW5kZXIsXG4gIHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ODI4NzQ4X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgc2VsZWN0X2Ryb3Bkb3duX2FwaTsgfVxuc2VsZWN0X2Ryb3Bkb3duX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QtZHJvcGRvd24udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNlbGVjdF9kcm9wZG93biA9IChzZWxlY3RfZHJvcGRvd25fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9N2E0NGM2NDImXG52YXIgb3B0aW9udnVlX3R5cGVfdGVtcGxhdGVfaWRfN2E0NGM2NDJfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwibGlcIixcbiAgICB7XG4gICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgIHZhbHVlOiBfdm0udmlzaWJsZSxcbiAgICAgICAgICBleHByZXNzaW9uOiBcInZpc2libGVcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtc2VsZWN0LWRyb3Bkb3duX19pdGVtXCIsXG4gICAgICBjbGFzczoge1xuICAgICAgICBzZWxlY3RlZDogX3ZtLml0ZW1TZWxlY3RlZCxcbiAgICAgICAgXCJpcy1kaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQgfHwgX3ZtLmdyb3VwRGlzYWJsZWQgfHwgX3ZtLmxpbWl0UmVhY2hlZCxcbiAgICAgICAgaG92ZXI6IF92bS5ob3ZlclxuICAgICAgfSxcbiAgICAgIG9uOiB7XG4gICAgICAgIG1vdXNlZW50ZXI6IF92bS5ob3Zlckl0ZW0sXG4gICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICByZXR1cm4gX3ZtLnNlbGVjdE9wdGlvbkNsaWNrKCRldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW192bS5fdChcImRlZmF1bHRcIiwgW19jKFwic3BhblwiLCBbX3ZtLl92KF92bS5fcyhfdm0uY3VycmVudExhYmVsKSldKV0pXSxcbiAgICAyXG4gIClcbn1cbnZhciBvcHRpb252dWVfdHlwZV90ZW1wbGF0ZV9pZF83YTQ0YzY0Ml9zdGF0aWNSZW5kZXJGbnMgPSBbXVxub3B0aW9udnVlX3R5cGVfdGVtcGxhdGVfaWRfN2E0NGM2NDJfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9N2E0NGM2NDImXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG9wdGlvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hXSxcblxuICBuYW1lOiAnRWxPcHRpb24nLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbE9wdGlvbicsXG5cbiAgaW5qZWN0OiBbJ3NlbGVjdCddLFxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBsYWJlbDogW1N0cmluZywgTnVtYmVyXSxcbiAgICBjcmVhdGVkOiBCb29sZWFuLFxuICAgIGRpc2FibGVkOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5kZXg6IC0xLFxuICAgICAgZ3JvdXBEaXNhYmxlZDogZmFsc2UsXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgaGl0U3RhdGU6IGZhbHNlLFxuICAgICAgaG92ZXI6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNPYmplY3Q6IGZ1bmN0aW9uIGlzT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzLnZhbHVlKS50b0xvd2VyQ2FzZSgpID09PSAnW29iamVjdCBvYmplY3RdJztcbiAgICB9LFxuICAgIGN1cnJlbnRMYWJlbDogZnVuY3Rpb24gY3VycmVudExhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFiZWwgfHwgKHRoaXMuaXNPYmplY3QgPyAnJyA6IHRoaXMudmFsdWUpO1xuICAgIH0sXG4gICAgY3VycmVudFZhbHVlOiBmdW5jdGlvbiBjdXJyZW50VmFsdWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSB8fCB0aGlzLmxhYmVsIHx8ICcnO1xuICAgIH0sXG4gICAgaXRlbVNlbGVjdGVkOiBmdW5jdGlvbiBpdGVtU2VsZWN0ZWQoKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0Lm11bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWwodGhpcy52YWx1ZSwgdGhpcy5zZWxlY3QudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbnModGhpcy5zZWxlY3QudmFsdWUsIHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbGltaXRSZWFjaGVkOiBmdW5jdGlvbiBsaW1pdFJlYWNoZWQoKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3QubXVsdGlwbGUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLml0ZW1TZWxlY3RlZCAmJiAodGhpcy5zZWxlY3QudmFsdWUgfHwgW10pLmxlbmd0aCA+PSB0aGlzLnNlbGVjdC5tdWx0aXBsZUxpbWl0ICYmIHRoaXMuc2VsZWN0Lm11bHRpcGxlTGltaXQgPiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGN1cnJlbnRMYWJlbDogZnVuY3Rpb24gY3VycmVudExhYmVsKCkge1xuICAgICAgaWYgKCF0aGlzLmNyZWF0ZWQgJiYgIXRoaXMuc2VsZWN0LnJlbW90ZSkgdGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCAnc2V0U2VsZWN0ZWQnKTtcbiAgICB9LFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZFZhbCkge1xuICAgICAgdmFyIF9zZWxlY3QgPSB0aGlzLnNlbGVjdCxcbiAgICAgICAgICByZW1vdGUgPSBfc2VsZWN0LnJlbW90ZSxcbiAgICAgICAgICB2YWx1ZUtleSA9IF9zZWxlY3QudmFsdWVLZXk7XG5cbiAgICAgIGlmICghdGhpcy5jcmVhdGVkICYmICFyZW1vdGUpIHtcbiAgICAgICAgaWYgKHZhbHVlS2V5ICYmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWwpKSA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiBvbGRWYWwgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9sZFZhbCkpID09PSAnb2JqZWN0JyAmJiB2YWxbdmFsdWVLZXldID09PSBvbGRWYWxbdmFsdWVLZXldKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsU2VsZWN0JywgJ3NldFNlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBpc0VxdWFsOiBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgICAgIGlmICghdGhpcy5pc09iamVjdCkge1xuICAgICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB2YWx1ZUtleSA9IHRoaXMuc2VsZWN0LnZhbHVlS2V5O1xuICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGEsIHZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGIsIHZhbHVlS2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbnRhaW5zOiBmdW5jdGlvbiBjb250YWlucygpIHtcbiAgICAgIHZhciBhcnIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICAgICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKCF0aGlzLmlzT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBhcnIgJiYgYXJyLmluZGV4T2YodGFyZ2V0KSA+IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHZhbHVlS2V5ID0gdGhpcy5zZWxlY3QudmFsdWVLZXk7XG4gICAgICAgIHJldHVybiBhcnIgJiYgYXJyLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGl0ZW0sIHZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKHRhcmdldCwgdmFsdWVLZXkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUdyb3VwRGlzYWJsZWQ6IGZ1bmN0aW9uIGhhbmRsZUdyb3VwRGlzYWJsZWQodmFsKSB7XG4gICAgICB0aGlzLmdyb3VwRGlzYWJsZWQgPSB2YWw7XG4gICAgfSxcbiAgICBob3Zlckl0ZW06IGZ1bmN0aW9uIGhvdmVySXRlbSgpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5ncm91cERpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LmhvdmVySW5kZXggPSB0aGlzLnNlbGVjdC5vcHRpb25zLmluZGV4T2YodGhpcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZWxlY3RPcHRpb25DbGljazogZnVuY3Rpb24gc2VsZWN0T3B0aW9uQ2xpY2soKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSAmJiB0aGlzLmdyb3VwRGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCAnaGFuZGxlT3B0aW9uQ2xpY2snLCBbdGhpcywgdHJ1ZV0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlDaGFuZ2U6IGZ1bmN0aW9uIHF1ZXJ5Q2hhbmdlKHF1ZXJ5KSB7XG4gICAgICB0aGlzLnZpc2libGUgPSBuZXcgUmVnRXhwKE9iamVjdCh1dGlsX1tcImVzY2FwZVJlZ2V4cFN0cmluZ1wiXSkocXVlcnkpLCAnaScpLnRlc3QodGhpcy5jdXJyZW50TGFiZWwpIHx8IHRoaXMuY3JlYXRlZDtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LmZpbHRlcmVkT3B0aW9uc0NvdW50LS07XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5zZWxlY3Qub3B0aW9ucy5wdXNoKHRoaXMpO1xuICAgIHRoaXMuc2VsZWN0LmNhY2hlZE9wdGlvbnMucHVzaCh0aGlzKTtcbiAgICB0aGlzLnNlbGVjdC5vcHRpb25zQ291bnQrKztcbiAgICB0aGlzLnNlbGVjdC5maWx0ZXJlZE9wdGlvbnNDb3VudCsrO1xuXG4gICAgdGhpcy4kb24oJ3F1ZXJ5Q2hhbmdlJywgdGhpcy5xdWVyeUNoYW5nZSk7XG4gICAgdGhpcy4kb24oJ2hhbmRsZUdyb3VwRGlzYWJsZWQnLCB0aGlzLmhhbmRsZUdyb3VwRGlzYWJsZWQpO1xuICB9LFxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIHZhciBfc2VsZWN0MiA9IHRoaXMuc2VsZWN0LFxuICAgICAgICBzZWxlY3RlZCA9IF9zZWxlY3QyLnNlbGVjdGVkLFxuICAgICAgICBtdWx0aXBsZSA9IF9zZWxlY3QyLm11bHRpcGxlO1xuXG4gICAgdmFyIHNlbGVjdGVkT3B0aW9ucyA9IG11bHRpcGxlID8gc2VsZWN0ZWQgOiBbc2VsZWN0ZWRdO1xuICAgIHZhciBpbmRleCA9IHRoaXMuc2VsZWN0LmNhY2hlZE9wdGlvbnMuaW5kZXhPZih0aGlzKTtcbiAgICB2YXIgc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkT3B0aW9ucy5pbmRleE9mKHRoaXMpO1xuXG4gICAgLy8gaWYgb3B0aW9uIGlzIG5vdCBzZWxlY3RlZCwgcmVtb3ZlIGl0IGZyb20gY2FjaGVcbiAgICBpZiAoaW5kZXggPiAtMSAmJiBzZWxlY3RlZEluZGV4IDwgMCkge1xuICAgICAgdGhpcy5zZWxlY3QuY2FjaGVkT3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdC5vbk9wdGlvbkRlc3Ryb3kodGhpcy5zZWxlY3Qub3B0aW9ucy5pbmRleE9mKHRoaXMpKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfb3B0aW9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKG9wdGlvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBvcHRpb25fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfb3B0aW9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBvcHRpb252dWVfdHlwZV90ZW1wbGF0ZV9pZF83YTQ0YzY0Ml9yZW5kZXIsXG4gIG9wdGlvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdhNDRjNjQyX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgb3B0aW9uX2FwaTsgfVxub3B0aW9uX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19vcHRpb24gPSAob3B0aW9uX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi90YWdcIlxudmFyIHRhZ18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKTtcbnZhciB0YWdfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4odGFnXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9yZXNpemUtZXZlbnRcIlxudmFyIHJlc2l6ZV9ldmVudF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Njcm9sbC1pbnRvLXZpZXdcIlxudmFyIHNjcm9sbF9pbnRvX3ZpZXdfID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNyk7XG52YXIgc2Nyb2xsX2ludG9fdmlld19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzY3JvbGxfaW50b192aWV3Xyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9uYXZpZ2F0aW9uLW1peGluLmpzXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBuYXZpZ2F0aW9uX21peGluID0gKHtcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaG92ZXJPcHRpb246IC0xXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgb3B0aW9uc0FsbERpc2FibGVkOiBmdW5jdGlvbiBvcHRpb25zQWxsRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbHRlcihmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24udmlzaWJsZTtcbiAgICAgIH0pLmV2ZXJ5KGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi5kaXNhYmxlZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGhvdmVySW5kZXg6IGZ1bmN0aW9uIGhvdmVySW5kZXgodmFsKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicgJiYgdmFsID4gLTEpIHtcbiAgICAgICAgdGhpcy5ob3Zlck9wdGlvbiA9IHRoaXMub3B0aW9uc1t2YWxdIHx8IHt9O1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgICBvcHRpb24uaG92ZXIgPSBfdGhpcy5ob3Zlck9wdGlvbiA9PT0gb3B0aW9uO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBuYXZpZ2F0ZU9wdGlvbnM6IGZ1bmN0aW9uIG5hdmlnYXRlT3B0aW9ucyhkaXJlY3Rpb24pIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAoIXRoaXMudmlzaWJsZSkge1xuICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50ID09PSAwKSByZXR1cm47XG4gICAgICBpZiAoIXRoaXMub3B0aW9uc0FsbERpc2FibGVkKSB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICduZXh0Jykge1xuICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCsrO1xuICAgICAgICAgIGlmICh0aGlzLmhvdmVySW5kZXggPT09IHRoaXMub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3ByZXYnKSB7XG4gICAgICAgICAgdGhpcy5ob3ZlckluZGV4LS07XG4gICAgICAgICAgaWYgKHRoaXMuaG92ZXJJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IHRoaXMub3B0aW9ucy5sZW5ndGggLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgb3B0aW9uID0gdGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF07XG4gICAgICAgIGlmIChvcHRpb24uZGlzYWJsZWQgPT09IHRydWUgfHwgb3B0aW9uLmdyb3VwRGlzYWJsZWQgPT09IHRydWUgfHwgIW9wdGlvbi52aXNpYmxlKSB7XG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZU9wdGlvbnMoZGlyZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5zY3JvbGxUb09wdGlvbihfdGhpczIuaG92ZXJPcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmEsIGxvY2FsZV9kZWZhdWx0LmEsIGZvY3VzX2RlZmF1bHQoKSgncmVmZXJlbmNlJyksIG5hdmlnYXRpb25fbWl4aW5dLFxuXG4gIG5hbWU6ICdFbFNlbGVjdCcsXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsU2VsZWN0JyxcblxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcblxuICAgIGVsRm9ybUl0ZW06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdzZWxlY3QnOiB0aGlzXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgX2VsRm9ybUl0ZW1TaXplOiBmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZWxGb3JtSXRlbSB8fCB7fSkuZWxGb3JtSXRlbVNpemU7XG4gICAgfSxcbiAgICByZWFkb25seTogZnVuY3Rpb24gcmVhZG9ubHkoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuZmlsdGVyYWJsZSB8fCB0aGlzLm11bHRpcGxlIHx8ICFPYmplY3QodXRpbF9bXCJpc0lFXCJdKSgpICYmICFPYmplY3QodXRpbF9bXCJpc0VkZ2VcIl0pKCkgJiYgIXRoaXMudmlzaWJsZTtcbiAgICB9LFxuICAgIHNob3dDbG9zZTogZnVuY3Rpb24gc2hvd0Nsb3NlKCkge1xuICAgICAgdmFyIGhhc1ZhbHVlID0gdGhpcy5tdWx0aXBsZSA/IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiAwIDogdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMudmFsdWUgIT09IG51bGwgJiYgdGhpcy52YWx1ZSAhPT0gJyc7XG4gICAgICB2YXIgY3JpdGVyaWEgPSB0aGlzLmNsZWFyYWJsZSAmJiAhdGhpcy5zZWxlY3REaXNhYmxlZCAmJiB0aGlzLmlucHV0SG92ZXJpbmcgJiYgaGFzVmFsdWU7XG4gICAgICByZXR1cm4gY3JpdGVyaWE7XG4gICAgfSxcbiAgICBpY29uQ2xhc3M6IGZ1bmN0aW9uIGljb25DbGFzcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW90ZSAmJiB0aGlzLmZpbHRlcmFibGUgPyAnJyA6IHRoaXMudmlzaWJsZSA/ICdhcnJvdy11cCBpcy1yZXZlcnNlJyA6ICdhcnJvdy11cCc7XG4gICAgfSxcbiAgICBkZWJvdW5jZTogZnVuY3Rpb24gZGVib3VuY2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdGUgPyAzMDAgOiAwO1xuICAgIH0sXG4gICAgZW1wdHlUZXh0OiBmdW5jdGlvbiBlbXB0eVRleHQoKSB7XG4gICAgICBpZiAodGhpcy5sb2FkaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdUZXh0IHx8IHRoaXMudCgnZWwuc2VsZWN0LmxvYWRpbmcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJlbW90ZSAmJiB0aGlzLnF1ZXJ5ID09PSAnJyAmJiB0aGlzLm9wdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUgJiYgdGhpcy5xdWVyeSAmJiB0aGlzLm9wdGlvbnMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9NYXRjaFRleHQgfHwgdGhpcy50KCdlbC5zZWxlY3Qubm9NYXRjaCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9EYXRhVGV4dCB8fCB0aGlzLnQoJ2VsLnNlbGVjdC5ub0RhdGEnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBzaG93TmV3T3B0aW9uOiBmdW5jdGlvbiBzaG93TmV3T3B0aW9uKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGhhc0V4aXN0aW5nT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbHRlcihmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgIHJldHVybiAhb3B0aW9uLmNyZWF0ZWQ7XG4gICAgICB9KS5zb21lKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi5jdXJyZW50TGFiZWwgPT09IF90aGlzLnF1ZXJ5O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJhYmxlICYmIHRoaXMuYWxsb3dDcmVhdGUgJiYgdGhpcy5xdWVyeSAhPT0gJycgJiYgIWhhc0V4aXN0aW5nT3B0aW9uO1xuICAgIH0sXG4gICAgc2VsZWN0U2l6ZTogZnVuY3Rpb24gc2VsZWN0U2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgfHwgdGhpcy5fZWxGb3JtSXRlbVNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7XG4gICAgfSxcbiAgICBzZWxlY3REaXNhYmxlZDogZnVuY3Rpb24gc2VsZWN0RGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkO1xuICAgIH0sXG4gICAgY29sbGFwc2VUYWdTaXplOiBmdW5jdGlvbiBjb2xsYXBzZVRhZ1NpemUoKSB7XG4gICAgICByZXR1cm4gWydzbWFsbCcsICdtaW5pJ10uaW5kZXhPZih0aGlzLnNlbGVjdFNpemUpID4gLTEgPyAnbWluaScgOiAnc21hbGwnO1xuICAgIH0sXG4gICAgcHJvcFBsYWNlaG9sZGVyOiBmdW5jdGlvbiBwcm9wUGxhY2Vob2xkZXIoKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRoaXMucGxhY2Vob2xkZXIgIT09ICd1bmRlZmluZWQnID8gdGhpcy5wbGFjZWhvbGRlciA6IHRoaXMudCgnZWwuc2VsZWN0LnBsYWNlaG9sZGVyJyk7XG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBFbElucHV0OiBpbnB1dF9kZWZhdWx0LmEsXG4gICAgRWxTZWxlY3RNZW51OiBzZWxlY3RfZHJvcGRvd24sXG4gICAgRWxPcHRpb246IHNyY19vcHRpb24sXG4gICAgRWxUYWc6IHRhZ19kZWZhdWx0LmEsXG4gICAgRWxTY3JvbGxiYXI6IHNjcm9sbGJhcl9kZWZhdWx0LmFcbiAgfSxcblxuICBkaXJlY3RpdmVzOiB7IENsaWNrb3V0c2lkZTogY2xpY2tvdXRzaWRlX2RlZmF1bHQuYSB9LFxuXG4gIHByb3BzOiB7XG4gICAgbmFtZTogU3RyaW5nLFxuICAgIGlkOiBTdHJpbmcsXG4gICAgdmFsdWU6IHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBhdXRvY29tcGxldGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdvZmYnXG4gICAgfSxcbiAgICAvKiogQERlcHJlY2F0ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uICovXG4gICAgYXV0b0NvbXBsZXRlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpIHtcbiAgICAgICAgIGZhbHNlICYmIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGF1dG9tYXRpY0Ryb3Bkb3duOiBCb29sZWFuLFxuICAgIHNpemU6IFN0cmluZyxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBjbGVhcmFibGU6IEJvb2xlYW4sXG4gICAgZmlsdGVyYWJsZTogQm9vbGVhbixcbiAgICBhbGxvd0NyZWF0ZTogQm9vbGVhbixcbiAgICBsb2FkaW5nOiBCb29sZWFuLFxuICAgIHBvcHBlckNsYXNzOiBTdHJpbmcsXG4gICAgcmVtb3RlOiBCb29sZWFuLFxuICAgIGxvYWRpbmdUZXh0OiBTdHJpbmcsXG4gICAgbm9NYXRjaFRleHQ6IFN0cmluZyxcbiAgICBub0RhdGFUZXh0OiBTdHJpbmcsXG4gICAgcmVtb3RlTWV0aG9kOiBGdW5jdGlvbixcbiAgICBmaWx0ZXJNZXRob2Q6IEZ1bmN0aW9uLFxuICAgIG11bHRpcGxlOiBCb29sZWFuLFxuICAgIG11bHRpcGxlTGltaXQ6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIHBsYWNlaG9sZGVyOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogZmFsc2VcbiAgICB9LFxuICAgIGRlZmF1bHRGaXJzdE9wdGlvbjogQm9vbGVhbixcbiAgICByZXNlcnZlS2V5d29yZDogQm9vbGVhbixcbiAgICB2YWx1ZUtleToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ3ZhbHVlJ1xuICAgIH0sXG4gICAgY29sbGFwc2VUYWdzOiBCb29sZWFuLFxuICAgIHBvcHBlckFwcGVuZFRvQm9keToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3B0aW9uczogW10sXG4gICAgICBjYWNoZWRPcHRpb25zOiBbXSxcbiAgICAgIGNyZWF0ZWRMYWJlbDogbnVsbCxcbiAgICAgIGNyZWF0ZWRTZWxlY3RlZDogZmFsc2UsXG4gICAgICBzZWxlY3RlZDogdGhpcy5tdWx0aXBsZSA/IFtdIDoge30sXG4gICAgICBpbnB1dExlbmd0aDogMjAsXG4gICAgICBpbnB1dFdpZHRoOiAwLFxuICAgICAgaW5pdGlhbElucHV0SGVpZ2h0OiAwLFxuICAgICAgY2FjaGVkUGxhY2VIb2xkZXI6ICcnLFxuICAgICAgb3B0aW9uc0NvdW50OiAwLFxuICAgICAgZmlsdGVyZWRPcHRpb25zQ291bnQ6IDAsXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgIHNvZnRGb2N1czogZmFsc2UsXG4gICAgICBzZWxlY3RlZExhYmVsOiAnJyxcbiAgICAgIGhvdmVySW5kZXg6IC0xLFxuICAgICAgcXVlcnk6ICcnLFxuICAgICAgcHJldmlvdXNRdWVyeTogbnVsbCxcbiAgICAgIGlucHV0SG92ZXJpbmc6IGZhbHNlLFxuICAgICAgY3VycmVudFBsYWNlaG9sZGVyOiAnJyxcbiAgICAgIG1lbnVWaXNpYmxlT25Gb2N1czogZmFsc2UsXG4gICAgICBpc09uQ29tcG9zaXRpb246IGZhbHNlLFxuICAgICAgaXNTaWxlbnRCbHVyOiBmYWxzZVxuICAgIH07XG4gIH0sXG5cblxuICB3YXRjaDoge1xuICAgIHNlbGVjdERpc2FibGVkOiBmdW5jdGlvbiBzZWxlY3REaXNhYmxlZCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByb3BQbGFjZWhvbGRlcjogZnVuY3Rpb24gcHJvcFBsYWNlaG9sZGVyKHZhbCkge1xuICAgICAgdGhpcy5jYWNoZWRQbGFjZUhvbGRlciA9IHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gdmFsO1xuICAgIH0sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkVmFsKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB0aGlzLnJlc2V0SW5wdXRIZWlnaHQoKTtcbiAgICAgICAgaWYgKHZhbCAmJiB2YWwubGVuZ3RoID4gMCB8fCB0aGlzLiRyZWZzLmlucHV0ICYmIHRoaXMucXVlcnkgIT09ICcnKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50UGxhY2Vob2xkZXIgPSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQbGFjZWhvbGRlciA9IHRoaXMuY2FjaGVkUGxhY2VIb2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSAmJiAhdGhpcy5yZXNlcnZlS2V5d29yZCkge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5Q2hhbmdlKHRoaXMucXVlcnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNldFNlbGVjdGVkKCk7XG4gICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmICF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuaW5wdXRMZW5ndGggPSAyMDtcbiAgICAgIH1cbiAgICAgIGlmICghT2JqZWN0KHV0aWxfW1widmFsdWVFcXVhbHNcIl0pKHZhbCwgb2xkVmFsKSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKCdFbEZvcm1JdGVtJywgJ2VsLmZvcm0uY2hhbmdlJywgdmFsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHZpc2libGU6IGZ1bmN0aW9uIHZpc2libGUodmFsKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAnZGVzdHJveVBvcHBlcicpO1xuICAgICAgICBpZiAodGhpcy4kcmVmcy5pbnB1dCkge1xuICAgICAgICAgIHRoaXMuJHJlZnMuaW5wdXQuYmx1cigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgdGhpcy5wcmV2aW91c1F1ZXJ5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZExhYmVsID0gJyc7XG4gICAgICAgIHRoaXMuaW5wdXRMZW5ndGggPSAyMDtcbiAgICAgICAgdGhpcy5tZW51VmlzaWJsZU9uRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldEhvdmVySW5kZXgoKTtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChfdGhpczMuJHJlZnMuaW5wdXQgJiYgX3RoaXMzLiRyZWZzLmlucHV0LnZhbHVlID09PSAnJyAmJiBfdGhpczMuc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBfdGhpczMuY3VycmVudFBsYWNlaG9sZGVyID0gX3RoaXMzLmNhY2hlZFBsYWNlSG9sZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmIHRoaXMuYWxsb3dDcmVhdGUgJiYgdGhpcy5jcmVhdGVkU2VsZWN0ZWQgJiYgdGhpcy5jcmVhdGVkTGFiZWwpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZExhYmVsID0gdGhpcy5jcmVhdGVkTGFiZWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWwgPSB0aGlzLnNlbGVjdGVkLmN1cnJlbnRMYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUpIHRoaXMucXVlcnkgPSB0aGlzLnNlbGVjdGVkTGFiZWw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGxhY2Vob2xkZXIgPSB0aGlzLmNhY2hlZFBsYWNlSG9sZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAndXBkYXRlUG9wcGVyJyk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5yZW1vdGUgPyAnJyA6IHRoaXMuc2VsZWN0ZWRMYWJlbDtcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5Q2hhbmdlKHRoaXMucXVlcnkpO1xuICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZW1vdGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uJywgJ3F1ZXJ5Q2hhbmdlJywgJycpO1xuICAgICAgICAgICAgICB0aGlzLmJyb2FkY2FzdCgnRWxPcHRpb25Hcm91cCcsICdxdWVyeUNoYW5nZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZExhYmVsKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gdGhpcy5zZWxlY3RlZExhYmVsO1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWwgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuJGVtaXQoJ3Zpc2libGUtY2hhbmdlJywgdmFsKTtcbiAgICB9LFxuICAgIG9wdGlvbnM6IGZ1bmN0aW9uIG9wdGlvbnMoKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuJGlzU2VydmVyKSByZXR1cm47XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzNC5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAndXBkYXRlUG9wcGVyJyk7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMucmVzZXRJbnB1dEhlaWdodCgpO1xuICAgICAgfVxuICAgICAgdmFyIGlucHV0cyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Jyk7XG4gICAgICBpZiAoW10uaW5kZXhPZi5jYWxsKGlucHV0cywgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRGaXJzdE9wdGlvbiAmJiAodGhpcy5maWx0ZXJhYmxlIHx8IHRoaXMucmVtb3RlKSAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50KSB7XG4gICAgICAgIHRoaXMuY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZU5hdmlnYXRlOiBmdW5jdGlvbiBoYW5kbGVOYXZpZ2F0ZShkaXJlY3Rpb24pIHtcbiAgICAgIGlmICh0aGlzLmlzT25Db21wb3NpdGlvbikgcmV0dXJuO1xuXG4gICAgICB0aGlzLm5hdmlnYXRlT3B0aW9ucyhkaXJlY3Rpb24pO1xuICAgIH0sXG4gICAgaGFuZGxlQ29tcG9zaXRpb246IGZ1bmN0aW9uIGhhbmRsZUNvbXBvc2l0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIHRleHQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NvbXBvc2l0aW9uZW5kJykge1xuICAgICAgICB0aGlzLmlzT25Db21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoXykge1xuICAgICAgICAgIHJldHVybiBfdGhpczUuaGFuZGxlUXVlcnlDaGFuZ2UodGV4dCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGxhc3RDaGFyYWN0ZXIgPSB0ZXh0W3RleHQubGVuZ3RoIC0gMV0gfHwgJyc7XG4gICAgICAgIHRoaXMuaXNPbkNvbXBvc2l0aW9uID0gIU9iamVjdChzaGFyZWRfW1wiaXNLb3JlYW5cIl0pKGxhc3RDaGFyYWN0ZXIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlUXVlcnlDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVF1ZXJ5Q2hhbmdlKHZhbCkge1xuICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLnByZXZpb3VzUXVlcnkgPT09IHZhbCB8fCB0aGlzLmlzT25Db21wb3NpdGlvbikgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMucHJldmlvdXNRdWVyeSA9PT0gbnVsbCAmJiAodHlwZW9mIHRoaXMuZmlsdGVyTWV0aG9kID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB0aGlzLnJlbW90ZU1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1F1ZXJ5ID0gdmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnByZXZpb3VzUXVlcnkgPSB2YWw7XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczYudmlzaWJsZSkgX3RoaXM2LmJyb2FkY2FzdCgnRWxTZWxlY3REcm9wZG93bicsICd1cGRhdGVQb3BwZXInKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ob3ZlckluZGV4ID0gLTE7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiB0aGlzLmZpbHRlcmFibGUpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBsZW5ndGggPSBfdGhpczYuJHJlZnMuaW5wdXQudmFsdWUubGVuZ3RoICogMTUgKyAyMDtcbiAgICAgICAgICBfdGhpczYuaW5wdXRMZW5ndGggPSBfdGhpczYuY29sbGFwc2VUYWdzID8gTWF0aC5taW4oNTAsIGxlbmd0aCkgOiBsZW5ndGg7XG4gICAgICAgICAgX3RoaXM2Lm1hbmFnZVBsYWNlaG9sZGVyKCk7XG4gICAgICAgICAgX3RoaXM2LnJlc2V0SW5wdXRIZWlnaHQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZW1vdGUgJiYgdHlwZW9mIHRoaXMucmVtb3RlTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnJlbW90ZU1ldGhvZCh2YWwpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5maWx0ZXJNZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJNZXRob2QodmFsKTtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uR3JvdXAnLCAncXVlcnlDaGFuZ2UnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zQ291bnQgPSB0aGlzLm9wdGlvbnNDb3VudDtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uJywgJ3F1ZXJ5Q2hhbmdlJywgdmFsKTtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uR3JvdXAnLCAncXVlcnlDaGFuZ2UnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRGaXJzdE9wdGlvbiAmJiAodGhpcy5maWx0ZXJhYmxlIHx8IHRoaXMucmVtb3RlKSAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50KSB7XG4gICAgICAgIHRoaXMuY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNjcm9sbFRvT3B0aW9uOiBmdW5jdGlvbiBzY3JvbGxUb09wdGlvbihvcHRpb24pIHtcbiAgICAgIHZhciB0YXJnZXQgPSBBcnJheS5pc0FycmF5KG9wdGlvbikgJiYgb3B0aW9uWzBdID8gb3B0aW9uWzBdLiRlbCA6IG9wdGlvbi4kZWw7XG4gICAgICBpZiAodGhpcy4kcmVmcy5wb3BwZXIgJiYgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBtZW51ID0gdGhpcy4kcmVmcy5wb3BwZXIuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1zZWxlY3QtZHJvcGRvd25fX3dyYXAnKTtcbiAgICAgICAgc2Nyb2xsX2ludG9fdmlld19kZWZhdWx0KCkobWVudSwgdGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuJHJlZnMuc2Nyb2xsYmFyICYmIHRoaXMuJHJlZnMuc2Nyb2xsYmFyLmhhbmRsZVNjcm9sbCgpO1xuICAgIH0sXG4gICAgaGFuZGxlTWVudUVudGVyOiBmdW5jdGlvbiBoYW5kbGVNZW51RW50ZXIoKSB7XG4gICAgICB2YXIgX3RoaXM3ID0gdGhpcztcblxuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXM3LnNjcm9sbFRvT3B0aW9uKF90aGlzNy5zZWxlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGVtaXRDaGFuZ2U6IGZ1bmN0aW9uIGVtaXRDaGFuZ2UodmFsKSB7XG4gICAgICBpZiAoIU9iamVjdCh1dGlsX1tcInZhbHVlRXF1YWxzXCJdKSh0aGlzLnZhbHVlLCB2YWwpKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRPcHRpb246IGZ1bmN0aW9uIGdldE9wdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG9wdGlvbiA9IHZvaWQgMDtcbiAgICAgIHZhciBpc09iamVjdCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkudG9Mb3dlckNhc2UoKSA9PT0gJ1tvYmplY3Qgb2JqZWN0XSc7XG4gICAgICB2YXIgaXNOdWxsID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS50b0xvd2VyQ2FzZSgpID09PSAnW29iamVjdCBudWxsXSc7XG4gICAgICB2YXIgaXNVbmRlZmluZWQgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnRvTG93ZXJDYXNlKCkgPT09ICdbb2JqZWN0IHVuZGVmaW5lZF0nO1xuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5jYWNoZWRPcHRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjYWNoZWRPcHRpb24gPSB0aGlzLmNhY2hlZE9wdGlvbnNbaV07XG4gICAgICAgIHZhciBpc0VxdWFsID0gaXNPYmplY3QgPyBPYmplY3QodXRpbF9bXCJnZXRWYWx1ZUJ5UGF0aFwiXSkoY2FjaGVkT3B0aW9uLnZhbHVlLCB0aGlzLnZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKHZhbHVlLCB0aGlzLnZhbHVlS2V5KSA6IGNhY2hlZE9wdGlvbi52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICAgIGlmIChpc0VxdWFsKSB7XG4gICAgICAgICAgb3B0aW9uID0gY2FjaGVkT3B0aW9uO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9uKSByZXR1cm4gb3B0aW9uO1xuICAgICAgdmFyIGxhYmVsID0gIWlzT2JqZWN0ICYmICFpc051bGwgJiYgIWlzVW5kZWZpbmVkID8gU3RyaW5nKHZhbHVlKSA6ICcnO1xuICAgICAgdmFyIG5ld09wdGlvbiA9IHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBjdXJyZW50TGFiZWw6IGxhYmVsXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgbmV3T3B0aW9uLmhpdFN0YXRlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3T3B0aW9uO1xuICAgIH0sXG4gICAgc2V0U2VsZWN0ZWQ6IGZ1bmN0aW9uIHNldFNlbGVjdGVkKCkge1xuICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB2YXIgb3B0aW9uID0gdGhpcy5nZXRPcHRpb24odGhpcy52YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb24uY3JlYXRlZCkge1xuICAgICAgICAgIHRoaXMuY3JlYXRlZExhYmVsID0gb3B0aW9uLmN1cnJlbnRMYWJlbDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZWRTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVkU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWwgPSBvcHRpb24uY3VycmVudExhYmVsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gb3B0aW9uO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlKSB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWxlY3RlZExhYmVsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgICB0aGlzLnZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goX3RoaXM4LmdldE9wdGlvbih2YWx1ZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSByZXN1bHQ7XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzOC5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGhhbmRsZUZvY3VzOiBmdW5jdGlvbiBoYW5kbGVGb2N1cyhldmVudCkge1xuICAgICAgaWYgKCF0aGlzLnNvZnRGb2N1cykge1xuICAgICAgICBpZiAodGhpcy5hdXRvbWF0aWNEcm9wZG93biB8fCB0aGlzLmZpbHRlcmFibGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmICF0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMubWVudVZpc2libGVPbkZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiRlbWl0KCdmb2N1cycsIGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29mdEZvY3VzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLiRyZWZzLnJlZmVyZW5jZS5ibHVyKCk7XG4gICAgfSxcbiAgICBoYW5kbGVCbHVyOiBmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczkuaXNTaWxlbnRCbHVyKSB7XG4gICAgICAgICAgX3RoaXM5LmlzU2lsZW50Qmx1ciA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzOS4kZW1pdCgnYmx1cicsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgICAgdGhpcy5zb2Z0Rm9jdXMgPSBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZUNsZWFyQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZUNsZWFyQ2xpY2soZXZlbnQpIHtcbiAgICAgIHRoaXMuZGVsZXRlU2VsZWN0ZWQoZXZlbnQpO1xuICAgIH0sXG4gICAgZG9EZXN0cm95OiBmdW5jdGlvbiBkb0Rlc3Ryb3koKSB7XG4gICAgICB0aGlzLiRyZWZzLnBvcHBlciAmJiB0aGlzLiRyZWZzLnBvcHBlci5kb0Rlc3Ryb3koKTtcbiAgICB9LFxuICAgIGhhbmRsZUNsb3NlOiBmdW5jdGlvbiBoYW5kbGVDbG9zZSgpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIH0sXG4gICAgdG9nZ2xlTGFzdE9wdGlvbkhpdFN0YXRlOiBmdW5jdGlvbiB0b2dnbGVMYXN0T3B0aW9uSGl0U3RhdGUoaGl0KSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZCkpIHJldHVybjtcbiAgICAgIHZhciBvcHRpb24gPSB0aGlzLnNlbGVjdGVkW3RoaXMuc2VsZWN0ZWQubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBpZiAoaGl0ID09PSB0cnVlIHx8IGhpdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgb3B0aW9uLmhpdFN0YXRlID0gaGl0O1xuICAgICAgICByZXR1cm4gaGl0O1xuICAgICAgfVxuXG4gICAgICBvcHRpb24uaGl0U3RhdGUgPSAhb3B0aW9uLmhpdFN0YXRlO1xuICAgICAgcmV0dXJuIG9wdGlvbi5oaXRTdGF0ZTtcbiAgICB9LFxuICAgIGRlbGV0ZVByZXZUYWc6IGZ1bmN0aW9uIGRlbGV0ZVByZXZUYWcoZSkge1xuICAgICAgaWYgKGUudGFyZ2V0LnZhbHVlLmxlbmd0aCA8PSAwICYmICF0aGlzLnRvZ2dsZUxhc3RPcHRpb25IaXRTdGF0ZSgpKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUuc2xpY2UoKTtcbiAgICAgICAgdmFsdWUucG9wKCk7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbWFuYWdlUGxhY2Vob2xkZXI6IGZ1bmN0aW9uIG1hbmFnZVBsYWNlaG9sZGVyKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFBsYWNlaG9sZGVyICE9PSAnJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRQbGFjZWhvbGRlciA9IHRoaXMuJHJlZnMuaW5wdXQudmFsdWUgPyAnJyA6IHRoaXMuY2FjaGVkUGxhY2VIb2xkZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICByZXNldElucHV0U3RhdGU6IGZ1bmN0aW9uIHJlc2V0SW5wdXRTdGF0ZShlKSB7XG4gICAgICBpZiAoZS5rZXlDb2RlICE9PSA4KSB0aGlzLnRvZ2dsZUxhc3RPcHRpb25IaXRTdGF0ZShmYWxzZSk7XG4gICAgICB0aGlzLmlucHV0TGVuZ3RoID0gdGhpcy4kcmVmcy5pbnB1dC52YWx1ZS5sZW5ndGggKiAxNSArIDIwO1xuICAgICAgdGhpcy5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgfSxcbiAgICByZXNldElucHV0SGVpZ2h0OiBmdW5jdGlvbiByZXNldElucHV0SGVpZ2h0KCkge1xuICAgICAgdmFyIF90aGlzMTAgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5jb2xsYXBzZVRhZ3MgJiYgIXRoaXMuZmlsdGVyYWJsZSkgcmV0dXJuO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIV90aGlzMTAuJHJlZnMucmVmZXJlbmNlKSByZXR1cm47XG4gICAgICAgIHZhciBpbnB1dENoaWxkTm9kZXMgPSBfdGhpczEwLiRyZWZzLnJlZmVyZW5jZS4kZWwuY2hpbGROb2RlcztcbiAgICAgICAgdmFyIGlucHV0ID0gW10uZmlsdGVyLmNhbGwoaW5wdXRDaGlsZE5vZGVzLCBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiBpdGVtLnRhZ05hbWUgPT09ICdJTlBVVCc7XG4gICAgICAgIH0pWzBdO1xuICAgICAgICB2YXIgdGFncyA9IF90aGlzMTAuJHJlZnMudGFncztcbiAgICAgICAgdmFyIHRhZ3NIZWlnaHQgPSB0YWdzID8gTWF0aC5yb3VuZCh0YWdzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgOiAwO1xuICAgICAgICB2YXIgc2l6ZUluTWFwID0gX3RoaXMxMC5pbml0aWFsSW5wdXRIZWlnaHQgfHwgNDA7XG4gICAgICAgIGlucHV0LnN0eWxlLmhlaWdodCA9IF90aGlzMTAuc2VsZWN0ZWQubGVuZ3RoID09PSAwID8gc2l6ZUluTWFwICsgJ3B4JyA6IE1hdGgubWF4KHRhZ3MgPyB0YWdzSGVpZ2h0ICsgKHRhZ3NIZWlnaHQgPiBzaXplSW5NYXAgPyA2IDogMCkgOiAwLCBzaXplSW5NYXApICsgJ3B4JztcbiAgICAgICAgaWYgKF90aGlzMTAudmlzaWJsZSAmJiBfdGhpczEwLmVtcHR5VGV4dCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBfdGhpczEwLmJyb2FkY2FzdCgnRWxTZWxlY3REcm9wZG93bicsICd1cGRhdGVQb3BwZXInKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICByZXNldEhvdmVySW5kZXg6IGZ1bmN0aW9uIHJlc2V0SG92ZXJJbmRleCgpIHtcbiAgICAgIHZhciBfdGhpczExID0gdGhpcztcblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMxMS5tdWx0aXBsZSkge1xuICAgICAgICAgIF90aGlzMTEuaG92ZXJJbmRleCA9IF90aGlzMTEub3B0aW9ucy5pbmRleE9mKF90aGlzMTEuc2VsZWN0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChfdGhpczExLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF90aGlzMTEuaG92ZXJJbmRleCA9IE1hdGgubWluLmFwcGx5KG51bGwsIF90aGlzMTEuc2VsZWN0ZWQubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczExLm9wdGlvbnMuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMxMS5ob3ZlckluZGV4ID0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAzMDApO1xuICAgIH0sXG4gICAgaGFuZGxlT3B0aW9uU2VsZWN0OiBmdW5jdGlvbiBoYW5kbGVPcHRpb25TZWxlY3Qob3B0aW9uLCBieUNsaWNrKSB7XG4gICAgICB2YXIgX3RoaXMxMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICh0aGlzLnZhbHVlIHx8IFtdKS5zbGljZSgpO1xuICAgICAgICB2YXIgb3B0aW9uSW5kZXggPSB0aGlzLmdldFZhbHVlSW5kZXgodmFsdWUsIG9wdGlvbi52YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb25JbmRleCA+IC0xKSB7XG4gICAgICAgICAgdmFsdWUuc3BsaWNlKG9wdGlvbkluZGV4LCAxKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm11bHRpcGxlTGltaXQgPD0gMCB8fCB2YWx1ZS5sZW5ndGggPCB0aGlzLm11bHRpcGxlTGltaXQpIHtcbiAgICAgICAgICB2YWx1ZS5wdXNoKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSh2YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb24uY3JlYXRlZCkge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5Q2hhbmdlKCcnKTtcbiAgICAgICAgICB0aGlzLmlucHV0TGVuZ3RoID0gMjA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSkgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBvcHRpb24udmFsdWUpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2Uob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLmlzU2lsZW50Qmx1ciA9IGJ5Q2xpY2s7XG4gICAgICB0aGlzLnNldFNvZnRGb2N1cygpO1xuICAgICAgaWYgKHRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczEyLnNjcm9sbFRvT3B0aW9uKG9wdGlvbik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHNldFNvZnRGb2N1czogZnVuY3Rpb24gc2V0U29mdEZvY3VzKCkge1xuICAgICAgdGhpcy5zb2Z0Rm9jdXMgPSB0cnVlO1xuICAgICAgdmFyIGlucHV0ID0gdGhpcy4kcmVmcy5pbnB1dCB8fCB0aGlzLiRyZWZzLnJlZmVyZW5jZTtcbiAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0VmFsdWVJbmRleDogZnVuY3Rpb24gZ2V0VmFsdWVJbmRleCgpIHtcbiAgICAgIHZhciBhcnIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzWzFdO1xuXG4gICAgICB2YXIgaXNPYmplY3QgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnRvTG93ZXJDYXNlKCkgPT09ICdbb2JqZWN0IG9iamVjdF0nO1xuICAgICAgaWYgKCFpc09iamVjdCkge1xuICAgICAgICByZXR1cm4gYXJyLmluZGV4T2YodmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHZhbHVlS2V5ID0gdGhpcy52YWx1ZUtleTtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIGFyci5zb21lKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgICAgICAgaWYgKE9iamVjdCh1dGlsX1tcImdldFZhbHVlQnlQYXRoXCJdKShpdGVtLCB2YWx1ZUtleSkgPT09IE9iamVjdCh1dGlsX1tcImdldFZhbHVlQnlQYXRoXCJdKSh2YWx1ZSwgdmFsdWVLZXkpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH0sXG4gICAgdG9nZ2xlTWVudTogZnVuY3Rpb24gdG9nZ2xlTWVudSgpIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3REaXNhYmxlZCkge1xuICAgICAgICBpZiAodGhpcy5tZW51VmlzaWJsZU9uRm9jdXMpIHtcbiAgICAgICAgICB0aGlzLm1lbnVWaXNpYmxlT25Gb2N1cyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmlzaWJsZSA9ICF0aGlzLnZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmlzaWJsZSkge1xuICAgICAgICAgICh0aGlzLiRyZWZzLmlucHV0IHx8IHRoaXMuJHJlZnMucmVmZXJlbmNlKS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBzZWxlY3RPcHRpb246IGZ1bmN0aW9uIHNlbGVjdE9wdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlTWVudSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc1t0aGlzLmhvdmVySW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVPcHRpb25TZWxlY3QodGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkZWxldGVTZWxlY3RlZDogZnVuY3Rpb24gZGVsZXRlU2VsZWN0ZWQoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5tdWx0aXBsZSA/IFtdIDogJyc7XG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSh2YWx1ZSk7XG4gICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuJGVtaXQoJ2NsZWFyJyk7XG4gICAgfSxcbiAgICBkZWxldGVUYWc6IGZ1bmN0aW9uIGRlbGV0ZVRhZyhldmVudCwgdGFnKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLnNlbGVjdGVkLmluZGV4T2YodGFnKTtcbiAgICAgIGlmIChpbmRleCA+IC0xICYmICF0aGlzLnNlbGVjdERpc2FibGVkKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUuc2xpY2UoKTtcbiAgICAgICAgdmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3JlbW92ZS10YWcnLCB0YWcudmFsdWUpO1xuICAgICAgfVxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgICBvbklucHV0Q2hhbmdlOiBmdW5jdGlvbiBvbklucHV0Q2hhbmdlKCkge1xuICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSAmJiB0aGlzLnF1ZXJ5ICE9PSB0aGlzLnNlbGVjdGVkTGFiZWwpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuc2VsZWN0ZWRMYWJlbDtcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVyeUNoYW5nZSh0aGlzLnF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uT3B0aW9uRGVzdHJveTogZnVuY3Rpb24gb25PcHRpb25EZXN0cm95KGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3VudC0tO1xuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50LS07XG4gICAgICAgIHRoaXMub3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzZXRJbnB1dFdpZHRoOiBmdW5jdGlvbiByZXNldElucHV0V2lkdGgoKSB7XG4gICAgICB0aGlzLmlucHV0V2lkdGggPSB0aGlzLiRyZWZzLnJlZmVyZW5jZS4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgfSxcbiAgICBoYW5kbGVSZXNpemU6IGZ1bmN0aW9uIGhhbmRsZVJlc2l6ZSgpIHtcbiAgICAgIHRoaXMucmVzZXRJbnB1dFdpZHRoKCk7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkgdGhpcy5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgfSxcbiAgICBjaGVja0RlZmF1bHRGaXJzdE9wdGlvbjogZnVuY3Rpb24gY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKSB7XG4gICAgICB0aGlzLmhvdmVySW5kZXggPSAtMTtcbiAgICAgIC8vIGhpZ2hsaWdodCB0aGUgY3JlYXRlZCBvcHRpb25cbiAgICAgIHZhciBoYXNDcmVhdGVkID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5vcHRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uY3JlYXRlZCkge1xuICAgICAgICAgIGhhc0NyZWF0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IGk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChoYXNDcmVhdGVkKSByZXR1cm47XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pICE9PSB0aGlzLm9wdGlvbnMubGVuZ3RoOyArK19pKSB7XG4gICAgICAgIHZhciBvcHRpb24gPSB0aGlzLm9wdGlvbnNbX2ldO1xuICAgICAgICBpZiAodGhpcy5xdWVyeSkge1xuICAgICAgICAgIC8vIGhpZ2hsaWdodCBmaXJzdCBvcHRpb25zIHRoYXQgcGFzc2VzIHRoZSBmaWx0ZXJcbiAgICAgICAgICBpZiAoIW9wdGlvbi5kaXNhYmxlZCAmJiAhb3B0aW9uLmdyb3VwRGlzYWJsZWQgJiYgb3B0aW9uLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IF9pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGhpZ2hsaWdodCBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgaWYgKG9wdGlvbi5pdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IF9pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRWYWx1ZUtleTogZnVuY3Rpb24gZ2V0VmFsdWVLZXkoaXRlbSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVtLnZhbHVlKS50b0xvd2VyQ2FzZSgpICE9PSAnW29iamVjdCBvYmplY3RdJykge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBPYmplY3QodXRpbF9bXCJnZXRWYWx1ZUJ5UGF0aFwiXSkoaXRlbS52YWx1ZSwgdGhpcy52YWx1ZUtleSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdmFyIF90aGlzMTMgPSB0aGlzO1xuXG4gICAgdGhpcy5jYWNoZWRQbGFjZUhvbGRlciA9IHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gdGhpcy5wcm9wUGxhY2Vob2xkZXI7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgIUFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgW10pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCAnJyk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWJvdW5jZWRPbklucHV0Q2hhbmdlID0gZGVib3VuY2VfZGVmYXVsdCgpKHRoaXMuZGVib3VuY2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMTMub25JbnB1dENoYW5nZSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kZWJvdW5jZWRRdWVyeUNoYW5nZSA9IGRlYm91bmNlX2RlZmF1bHQoKSh0aGlzLmRlYm91bmNlLCBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMxMy5oYW5kbGVRdWVyeUNoYW5nZShlLnRhcmdldC52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRvbignaGFuZGxlT3B0aW9uQ2xpY2snLCB0aGlzLmhhbmRsZU9wdGlvblNlbGVjdCk7XG4gICAgdGhpcy4kb24oJ3NldFNlbGVjdGVkJywgdGhpcy5zZXRTZWxlY3RlZCk7XG4gIH0sXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIF90aGlzMTQgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gJyc7XG4gICAgfVxuICAgIE9iamVjdChyZXNpemVfZXZlbnRfW1wiYWRkUmVzaXplTGlzdGVuZXJcIl0pKHRoaXMuJGVsLCB0aGlzLmhhbmRsZVJlc2l6ZSk7XG5cbiAgICB2YXIgcmVmZXJlbmNlID0gdGhpcy4kcmVmcy5yZWZlcmVuY2U7XG4gICAgaWYgKHJlZmVyZW5jZSAmJiByZWZlcmVuY2UuJGVsKSB7XG4gICAgICB2YXIgc2l6ZU1hcCA9IHtcbiAgICAgICAgbWVkaXVtOiAzNixcbiAgICAgICAgc21hbGw6IDMyLFxuICAgICAgICBtaW5pOiAyOFxuICAgICAgfTtcbiAgICAgIHZhciBpbnB1dCA9IHJlZmVyZW5jZS4kZWwucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICAgIHRoaXMuaW5pdGlhbElucHV0SGVpZ2h0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IHx8IHNpemVNYXBbdGhpcy5zZWxlY3RTaXplXTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVtb3RlICYmIHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMucmVzZXRJbnB1dEhlaWdodCgpO1xuICAgIH1cbiAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocmVmZXJlbmNlICYmIHJlZmVyZW5jZS4kZWwpIHtcbiAgICAgICAgX3RoaXMxNC5pbnB1dFdpZHRoID0gcmVmZXJlbmNlLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNldFNlbGVjdGVkKCk7XG4gIH0sXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuJGVsICYmIHRoaXMuaGFuZGxlUmVzaXplKSBPYmplY3QocmVzaXplX2V2ZW50X1tcInJlbW92ZVJlc2l6ZUxpc3RlbmVyXCJdKSh0aGlzLiRlbCwgdGhpcy5oYW5kbGVSZXNpemUpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19zZWxlY3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHNlbGVjdF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19zZWxlY3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHNlbGVjdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzBlNGFhZGU2X3JlbmRlcixcbiAgc2VsZWN0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMGU0YWFkZTZfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBzZWxlY3RfYXBpOyB9XG5zZWxlY3RfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3NlbGVjdCA9IChzZWxlY3RfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3QvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuc3JjX3NlbGVjdC5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHNyY19zZWxlY3QubmFtZSwgc3JjX3NlbGVjdCk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19zZWxlY3QgPSAoc3JjX3NlbGVjdCk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL29wdGlvbi9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zcmNfb3B0aW9uLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoc3JjX29wdGlvbi5uYW1lLCBzcmNfb3B0aW9uKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX29wdGlvbiA9IChzcmNfb3B0aW9uKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTY2ODVlNWRlJlxudmFyIG9wdGlvbl9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY2ODVlNWRlX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcInVsXCIsXG4gICAge1xuICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICB2YWx1ZTogX3ZtLnZpc2libGUsXG4gICAgICAgICAgZXhwcmVzc2lvbjogXCJ2aXNpYmxlXCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdC1ncm91cF9fd3JhcFwiXG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcImxpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtc2VsZWN0LWdyb3VwX190aXRsZVwiIH0sIFtcbiAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0ubGFiZWwpKVxuICAgICAgXSksXG4gICAgICBfYyhcImxpXCIsIFtcbiAgICAgICAgX2MoXCJ1bFwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdC1ncm91cFwiIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcbiAgICAgIF0pXG4gICAgXVxuICApXG59XG52YXIgb3B0aW9uX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjY4NWU1ZGVfc3RhdGljUmVuZGVyRm5zID0gW11cbm9wdGlvbl9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY2ODVlNWRlX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTY2ODVlNWRlJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi1ncm91cC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG9wdGlvbl9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hXSxcblxuICBuYW1lOiAnRWxPcHRpb25Hcm91cCcsXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsT3B0aW9uR3JvdXAnLFxuXG4gIHByb3BzOiB7XG4gICAgbGFiZWw6IFN0cmluZyxcbiAgICBkaXNhYmxlZDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZpc2libGU6IHRydWVcbiAgICB9O1xuICB9LFxuXG5cbiAgd2F0Y2g6IHtcbiAgICBkaXNhYmxlZDogZnVuY3Rpb24gZGlzYWJsZWQodmFsKSB7XG4gICAgICB0aGlzLmJyb2FkY2FzdCgnRWxPcHRpb24nLCAnaGFuZGxlR3JvdXBEaXNhYmxlZCcsIHZhbCk7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBxdWVyeUNoYW5nZTogZnVuY3Rpb24gcXVlcnlDaGFuZ2UoKSB7XG4gICAgICB0aGlzLnZpc2libGUgPSB0aGlzLiRjaGlsZHJlbiAmJiBBcnJheS5pc0FycmF5KHRoaXMuJGNoaWxkcmVuKSAmJiB0aGlzLiRjaGlsZHJlbi5zb21lKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi52aXNpYmxlID09PSB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy4kb24oJ3F1ZXJ5Q2hhbmdlJywgdGhpcy5xdWVyeUNoYW5nZSk7XG4gIH0sXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuYnJvYWRjYXN0KCdFbE9wdGlvbicsICdoYW5kbGVHcm91cERpc2FibGVkJywgdGhpcy5kaXNhYmxlZCk7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19vcHRpb25fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAob3B0aW9uX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLWdyb3VwLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIG9wdGlvbl9ncm91cF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19vcHRpb25fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG9wdGlvbl9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY2ODVlNWRlX3JlbmRlcixcbiAgb3B0aW9uX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfNjY4NWU1ZGVfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBvcHRpb25fZ3JvdXBfYXBpOyB9XG5vcHRpb25fZ3JvdXBfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi1ncm91cC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgb3B0aW9uX2dyb3VwID0gKG9wdGlvbl9ncm91cF9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL29wdGlvbi1ncm91cC9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5vcHRpb25fZ3JvdXAuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChvcHRpb25fZ3JvdXAubmFtZSwgb3B0aW9uX2dyb3VwKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX29wdGlvbl9ncm91cCA9IChvcHRpb25fZ3JvdXApO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9idXR0b24vc3JjL2J1dHRvbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9Y2E4NTlmYjQmXG52YXIgYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfY2E4NTlmYjRfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiYnV0dG9uXCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtYnV0dG9uXCIsXG4gICAgICBjbGFzczogW1xuICAgICAgICBfdm0udHlwZSA/IFwiZWwtYnV0dG9uLS1cIiArIF92bS50eXBlIDogXCJcIixcbiAgICAgICAgX3ZtLmJ1dHRvblNpemUgPyBcImVsLWJ1dHRvbi0tXCIgKyBfdm0uYnV0dG9uU2l6ZSA6IFwiXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBcImlzLWRpc2FibGVkXCI6IF92bS5idXR0b25EaXNhYmxlZCxcbiAgICAgICAgICBcImlzLWxvYWRpbmdcIjogX3ZtLmxvYWRpbmcsXG4gICAgICAgICAgXCJpcy1wbGFpblwiOiBfdm0ucGxhaW4sXG4gICAgICAgICAgXCJpcy1yb3VuZFwiOiBfdm0ucm91bmQsXG4gICAgICAgICAgXCJpcy1jaXJjbGVcIjogX3ZtLmNpcmNsZVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgZGlzYWJsZWQ6IF92bS5idXR0b25EaXNhYmxlZCB8fCBfdm0ubG9hZGluZyxcbiAgICAgICAgYXV0b2ZvY3VzOiBfdm0uYXV0b2ZvY3VzLFxuICAgICAgICB0eXBlOiBfdm0ubmF0aXZlVHlwZVxuICAgICAgfSxcbiAgICAgIG9uOiB7IGNsaWNrOiBfdm0uaGFuZGxlQ2xpY2sgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX3ZtLmxvYWRpbmcgPyBfYyhcImlcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pY29uLWxvYWRpbmdcIiB9KSA6IF92bS5fZSgpLFxuICAgICAgX3ZtLmljb24gJiYgIV92bS5sb2FkaW5nID8gX2MoXCJpXCIsIHsgY2xhc3M6IF92bS5pY29uIH0pIDogX3ZtLl9lKCksXG4gICAgICBfdm0uJHNsb3RzLmRlZmF1bHQgPyBfYyhcInNwYW5cIiwgW192bS5fdChcImRlZmF1bHRcIildLCAyKSA6IF92bS5fZSgpXG4gICAgXVxuICApXG59XG52YXIgYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfY2E4NTlmYjRfc3RhdGljUmVuZGVyRm5zID0gW11cbmJ1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2NhODU5ZmI0X3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWNhODU5ZmI0JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9idXR0b24vc3JjL2J1dHRvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGJ1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbEJ1dHRvbicsXG5cbiAgaW5qZWN0OiB7XG4gICAgZWxGb3JtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgZWxGb3JtSXRlbToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9XG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICB0eXBlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnZGVmYXVsdCdcbiAgICB9LFxuICAgIHNpemU6IFN0cmluZyxcbiAgICBpY29uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgbmF0aXZlVHlwZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2J1dHRvbidcbiAgICB9LFxuICAgIGxvYWRpbmc6IEJvb2xlYW4sXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW4sXG4gICAgcGxhaW46IEJvb2xlYW4sXG4gICAgYXV0b2ZvY3VzOiBCb29sZWFuLFxuICAgIHJvdW5kOiBCb29sZWFuLFxuICAgIGNpcmNsZTogQm9vbGVhblxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgX2VsRm9ybUl0ZW1TaXplOiBmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZWxGb3JtSXRlbSB8fCB7fSkuZWxGb3JtSXRlbVNpemU7XG4gICAgfSxcbiAgICBidXR0b25TaXplOiBmdW5jdGlvbiBidXR0b25TaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSB8fCB0aGlzLl9lbEZvcm1JdGVtU2l6ZSB8fCAodGhpcy4kRUxFTUVOVCB8fCB7fSkuc2l6ZTtcbiAgICB9LFxuICAgIGJ1dHRvbkRpc2FibGVkOiBmdW5jdGlvbiBidXR0b25EaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRvcHRpb25zLnByb3BzRGF0YS5oYXNPd25Qcm9wZXJ0eSgnZGlzYWJsZWQnKSA/IHRoaXMuZGlzYWJsZWQgOiAodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFuZGxlQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2dCkge1xuICAgICAgdGhpcy4kZW1pdCgnY2xpY2snLCBldnQpO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGJ1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9idXR0b24vc3JjL2J1dHRvbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBidXR0b25fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBidXR0b252dWVfdHlwZV90ZW1wbGF0ZV9pZF9jYTg1OWZiNF9yZW5kZXIsXG4gIGJ1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2NhODU5ZmI0X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgYnV0dG9uX2FwaTsgfVxuYnV0dG9uX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19idXR0b24gPSAoYnV0dG9uX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnV0dG9uL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnNyY19idXR0b24uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChzcmNfYnV0dG9uLm5hbWUsIHNyY19idXR0b24pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfYnV0dG9uID0gKHNyY19idXR0b24pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9idXR0b24vc3JjL2J1dHRvbi1ncm91cC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2Q4NjYxZDAmXG52YXIgYnV0dG9uX2dyb3VwdnVlX3R5cGVfdGVtcGxhdGVfaWRfM2Q4NjYxZDBfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtYnV0dG9uLWdyb3VwXCIgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxufVxudmFyIGJ1dHRvbl9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNkODY2MWQwX3N0YXRpY1JlbmRlckZucyA9IFtdXG5idXR0b25fZ3JvdXB2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zZDg2NjFkMF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLWdyb3VwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zZDg2NjFkMCZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGJ1dHRvbl9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbEJ1dHRvbkdyb3VwJ1xufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLWdyb3VwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfYnV0dG9uX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGJ1dHRvbl9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9idXR0b24vc3JjL2J1dHRvbi1ncm91cC52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBidXR0b25fZ3JvdXBfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfYnV0dG9uX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBidXR0b25fZ3JvdXB2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zZDg2NjFkMF9yZW5kZXIsXG4gIGJ1dHRvbl9ncm91cHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNkODY2MWQwX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgYnV0dG9uX2dyb3VwX2FwaTsgfVxuYnV0dG9uX2dyb3VwX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24tZ3JvdXAudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGJ1dHRvbl9ncm91cCA9IChidXR0b25fZ3JvdXBfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9idXR0b24tZ3JvdXAvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuYnV0dG9uX2dyb3VwLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoYnV0dG9uX2dyb3VwLm5hbWUsIGJ1dHRvbl9ncm91cCk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19idXR0b25fZ3JvdXAgPSAoYnV0dG9uX2dyb3VwKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdGFibGUvc3JjL3RhYmxlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00OTNmZTM0ZSZcbnZhciB0YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ5M2ZlMzRlX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRhYmxlXCIsXG4gICAgICBjbGFzczogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJlbC10YWJsZS0tZml0XCI6IF92bS5maXQsXG4gICAgICAgICAgXCJlbC10YWJsZS0tc3RyaXBlZFwiOiBfdm0uc3RyaXBlLFxuICAgICAgICAgIFwiZWwtdGFibGUtLWJvcmRlclwiOiBfdm0uYm9yZGVyIHx8IF92bS5pc0dyb3VwLFxuICAgICAgICAgIFwiZWwtdGFibGUtLWhpZGRlblwiOiBfdm0uaXNIaWRkZW4sXG4gICAgICAgICAgXCJlbC10YWJsZS0tZ3JvdXBcIjogX3ZtLmlzR3JvdXAsXG4gICAgICAgICAgXCJlbC10YWJsZS0tZmx1aWQtaGVpZ2h0XCI6IF92bS5tYXhIZWlnaHQsXG4gICAgICAgICAgXCJlbC10YWJsZS0tc2Nyb2xsYWJsZS14XCI6IF92bS5sYXlvdXQuc2Nyb2xsWCxcbiAgICAgICAgICBcImVsLXRhYmxlLS1zY3JvbGxhYmxlLXlcIjogX3ZtLmxheW91dC5zY3JvbGxZLFxuICAgICAgICAgIFwiZWwtdGFibGUtLWVuYWJsZS1yb3ctaG92ZXJcIjogIV92bS5zdG9yZS5zdGF0ZXMuaXNDb21wbGV4LFxuICAgICAgICAgIFwiZWwtdGFibGUtLWVuYWJsZS1yb3ctdHJhbnNpdGlvblwiOlxuICAgICAgICAgICAgKF92bS5zdG9yZS5zdGF0ZXMuZGF0YSB8fCBbXSkubGVuZ3RoICE9PSAwICYmXG4gICAgICAgICAgICAoX3ZtLnN0b3JlLnN0YXRlcy5kYXRhIHx8IFtdKS5sZW5ndGggPCAxMDBcbiAgICAgICAgfSxcbiAgICAgICAgX3ZtLnRhYmxlU2l6ZSA/IFwiZWwtdGFibGUtLVwiICsgX3ZtLnRhYmxlU2l6ZSA6IFwiXCJcbiAgICAgIF0sXG4gICAgICBvbjoge1xuICAgICAgICBtb3VzZWxlYXZlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICBfdm0uaGFuZGxlTW91c2VMZWF2ZSgkZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7IHJlZjogXCJoaWRkZW5Db2x1bW5zXCIsIHN0YXRpY0NsYXNzOiBcImhpZGRlbi1jb2x1bW5zXCIgfSxcbiAgICAgICAgW192bS5fdChcImRlZmF1bHRcIildLFxuICAgICAgICAyXG4gICAgICApLFxuICAgICAgX3ZtLnNob3dIZWFkZXJcbiAgICAgICAgPyBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vdXNld2hlZWxcIixcbiAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb3VzZXdoZWVsXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmhhbmRsZUhlYWRlckZvb3Rlck1vdXNld2hlZWwsXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImhhbmRsZUhlYWRlckZvb3Rlck1vdXNld2hlZWxcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVmOiBcImhlYWRlcldyYXBwZXJcIixcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGFibGVfX2hlYWRlci13cmFwcGVyXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFwidGFibGUtaGVhZGVyXCIsIHtcbiAgICAgICAgICAgICAgICByZWY6IFwidGFibGVIZWFkZXJcIixcbiAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgd2lkdGg6IF92bS5sYXlvdXQuYm9keVdpZHRoID8gX3ZtLmxheW91dC5ib2R5V2lkdGggKyBcInB4XCIgOiBcIlwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgc3RvcmU6IF92bS5zdG9yZSxcbiAgICAgICAgICAgICAgICAgIGJvcmRlcjogX3ZtLmJvcmRlcixcbiAgICAgICAgICAgICAgICAgIFwiZGVmYXVsdC1zb3J0XCI6IF92bS5kZWZhdWx0U29ydFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgX2MoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICByZWY6IFwiYm9keVdyYXBwZXJcIixcbiAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10YWJsZV9fYm9keS13cmFwcGVyXCIsXG4gICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgIF92bS5sYXlvdXQuc2Nyb2xsWFxuICAgICAgICAgICAgICA/IFwiaXMtc2Nyb2xsaW5nLVwiICsgX3ZtLnNjcm9sbFBvc2l0aW9uXG4gICAgICAgICAgICAgIDogXCJpcy1zY3JvbGxpbmctbm9uZVwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBzdHlsZTogW192bS5ib2R5SGVpZ2h0XVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXCJ0YWJsZS1ib2R5XCIsIHtcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIHdpZHRoOiBfdm0uYm9keVdpZHRoXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgY29udGV4dDogX3ZtLmNvbnRleHQsXG4gICAgICAgICAgICAgIHN0b3JlOiBfdm0uc3RvcmUsXG4gICAgICAgICAgICAgIHN0cmlwZTogX3ZtLnN0cmlwZSxcbiAgICAgICAgICAgICAgXCJyb3ctY2xhc3MtbmFtZVwiOiBfdm0ucm93Q2xhc3NOYW1lLFxuICAgICAgICAgICAgICBcInJvdy1zdHlsZVwiOiBfdm0ucm93U3R5bGUsXG4gICAgICAgICAgICAgIGhpZ2hsaWdodDogX3ZtLmhpZ2hsaWdodEN1cnJlbnRSb3dcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICAhX3ZtLmRhdGEgfHwgX3ZtLmRhdGEubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmVmOiBcImVtcHR5QmxvY2tcIixcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRhYmxlX19lbXB0eS1ibG9ja1wiLFxuICAgICAgICAgICAgICAgICAgc3R5bGU6IF92bS5lbXB0eUJsb2NrU3R5bGVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC10YWJsZV9fZW1wdHktdGV4dFwiIH0sXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uX3QoXCJlbXB0eVwiLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fcyhfdm0uZW1wdHlUZXh0IHx8IF92bS50KFwiZWwudGFibGUuZW1wdHlUZXh0XCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgX3ZtLiRzbG90cy5hcHBlbmRcbiAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZWY6IFwiYXBwZW5kV3JhcHBlclwiLFxuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGFibGVfX2FwcGVuZC13cmFwcGVyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3QoXCJhcHBlbmRcIildLFxuICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICBdLFxuICAgICAgICAxXG4gICAgICApLFxuICAgICAgX3ZtLnNob3dTdW1tYXJ5XG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5kYXRhICYmIF92bS5kYXRhLmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImRhdGEgJiYgZGF0YS5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwibW91c2V3aGVlbFwiLFxuICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LW1vdXNld2hlZWxcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uaGFuZGxlSGVhZGVyRm9vdGVyTW91c2V3aGVlbCxcbiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiaGFuZGxlSGVhZGVyRm9vdGVyTW91c2V3aGVlbFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZWY6IFwiZm9vdGVyV3JhcHBlclwiLFxuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10YWJsZV9fZm9vdGVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXCJ0YWJsZS1mb290ZXJcIiwge1xuICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICB3aWR0aDogX3ZtLmxheW91dC5ib2R5V2lkdGggPyBfdm0ubGF5b3V0LmJvZHlXaWR0aCArIFwicHhcIiA6IFwiXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICBzdG9yZTogX3ZtLnN0b3JlLFxuICAgICAgICAgICAgICAgICAgYm9yZGVyOiBfdm0uYm9yZGVyLFxuICAgICAgICAgICAgICAgICAgXCJzdW0tdGV4dFwiOiBfdm0uc3VtVGV4dCB8fCBfdm0udChcImVsLnRhYmxlLnN1bVRleHRcIiksXG4gICAgICAgICAgICAgICAgICBcInN1bW1hcnktbWV0aG9kXCI6IF92bS5zdW1tYXJ5TWV0aG9kLFxuICAgICAgICAgICAgICAgICAgXCJkZWZhdWx0LXNvcnRcIjogX3ZtLmRlZmF1bHRTb3J0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfdm0uZml4ZWRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vdXNld2hlZWxcIixcbiAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb3VzZXdoZWVsXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmhhbmRsZUZpeGVkTW91c2V3aGVlbCxcbiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiaGFuZGxlRml4ZWRNb3VzZXdoZWVsXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlZjogXCJmaXhlZFdyYXBwZXJcIixcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGFibGVfX2ZpeGVkXCIsXG4gICAgICAgICAgICAgIHN0eWxlOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgd2lkdGg6IF92bS5sYXlvdXQuZml4ZWRXaWR0aFxuICAgICAgICAgICAgICAgICAgICA/IF92bS5sYXlvdXQuZml4ZWRXaWR0aCArIFwicHhcIlxuICAgICAgICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF92bS5maXhlZEhlaWdodFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfdm0uc2hvd0hlYWRlclxuICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICByZWY6IFwiZml4ZWRIZWFkZXJXcmFwcGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGFibGVfX2ZpeGVkLWhlYWRlci13cmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIF9jKFwidGFibGUtaGVhZGVyXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogXCJmaXhlZFRhYmxlSGVhZGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogX3ZtLmJvZHlXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBfdm0uYm9yZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZTogX3ZtLnN0b3JlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmVmOiBcImZpeGVkQm9keVdyYXBwZXJcIixcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRhYmxlX19maXhlZC1ib2R5LXdyYXBwZXJcIixcbiAgICAgICAgICAgICAgICAgIHN0eWxlOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICB0b3A6IF92bS5sYXlvdXQuaGVhZGVySGVpZ2h0ICsgXCJweFwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF92bS5maXhlZEJvZHlIZWlnaHRcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF9jKFwidGFibGUtYm9keVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IF92bS5ib2R5V2lkdGhcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmaXhlZDogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgc3RvcmU6IF92bS5zdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdHJpcGU6IF92bS5zdHJpcGUsXG4gICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0OiBfdm0uaGlnaGxpZ2h0Q3VycmVudFJvdyxcbiAgICAgICAgICAgICAgICAgICAgICBcInJvdy1jbGFzcy1uYW1lXCI6IF92bS5yb3dDbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgXCJyb3ctc3R5bGVcIjogX3ZtLnJvd1N0eWxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgX3ZtLiRzbG90cy5hcHBlbmRcbiAgICAgICAgICAgICAgICAgICAgPyBfYyhcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10YWJsZV9fYXBwZW5kLWd1dHRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsgaGVpZ2h0OiBfdm0ubGF5b3V0LmFwcGVuZEhlaWdodCArIFwicHhcIiB9XG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBfdm0uc2hvd1N1bW1hcnlcbiAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5kYXRhICYmIF92bS5kYXRhLmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgcmVmOiBcImZpeGVkRm9vdGVyV3JhcHBlclwiLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRhYmxlX19maXhlZC1mb290ZXItd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcInRhYmxlLWZvb3RlclwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogX3ZtLmJvZHlXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBfdm0uYm9yZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcInN1bS10ZXh0XCI6IF92bS5zdW1UZXh0IHx8IF92bS50KFwiZWwudGFibGUuc3VtVGV4dFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzdW1tYXJ5LW1ldGhvZFwiOiBfdm0uc3VtbWFyeU1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmU6IF92bS5zdG9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgX3ZtLnJpZ2h0Rml4ZWRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vdXNld2hlZWxcIixcbiAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb3VzZXdoZWVsXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmhhbmRsZUZpeGVkTW91c2V3aGVlbCxcbiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiaGFuZGxlRml4ZWRNb3VzZXdoZWVsXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlZjogXCJyaWdodEZpeGVkV3JhcHBlclwiLFxuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10YWJsZV9fZml4ZWQtcmlnaHRcIixcbiAgICAgICAgICAgICAgc3R5bGU6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3aWR0aDogX3ZtLmxheW91dC5yaWdodEZpeGVkV2lkdGhcbiAgICAgICAgICAgICAgICAgICAgPyBfdm0ubGF5b3V0LnJpZ2h0Rml4ZWRXaWR0aCArIFwicHhcIlxuICAgICAgICAgICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICByaWdodDogX3ZtLmxheW91dC5zY3JvbGxZXG4gICAgICAgICAgICAgICAgICAgID8gKF92bS5ib3JkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gX3ZtLmxheW91dC5ndXR0ZXJXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0ubGF5b3V0Lmd1dHRlcldpZHRoIHx8IDApICsgXCJweFwiXG4gICAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgX3ZtLmZpeGVkSGVpZ2h0XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF92bS5zaG93SGVhZGVyXG4gICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHJlZjogXCJyaWdodEZpeGVkSGVhZGVyV3JhcHBlclwiLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRhYmxlX19maXhlZC1oZWFkZXItd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcInRhYmxlLWhlYWRlclwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWY6IFwicmlnaHRGaXhlZFRhYmxlSGVhZGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogX3ZtLmJvZHlXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkOiBcInJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogX3ZtLmJvcmRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmU6IF92bS5zdG9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlZjogXCJyaWdodEZpeGVkQm9keVdyYXBwZXJcIixcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRhYmxlX19maXhlZC1ib2R5LXdyYXBwZXJcIixcbiAgICAgICAgICAgICAgICAgIHN0eWxlOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICB0b3A6IF92bS5sYXlvdXQuaGVhZGVySGVpZ2h0ICsgXCJweFwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF92bS5maXhlZEJvZHlIZWlnaHRcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF9jKFwidGFibGUtYm9keVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IF92bS5ib2R5V2lkdGhcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmaXhlZDogXCJyaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlOiBfdm0uc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgICAgc3RyaXBlOiBfdm0uc3RyaXBlLFxuICAgICAgICAgICAgICAgICAgICAgIFwicm93LWNsYXNzLW5hbWVcIjogX3ZtLnJvd0NsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBcInJvdy1zdHlsZVwiOiBfdm0ucm93U3R5bGUsXG4gICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0OiBfdm0uaGlnaGxpZ2h0Q3VycmVudFJvd1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIF92bS4kc2xvdHMuYXBwZW5kXG4gICAgICAgICAgICAgICAgICAgID8gX2MoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGFibGVfX2FwcGVuZC1ndXR0ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IGhlaWdodDogX3ZtLmxheW91dC5hcHBlbmRIZWlnaHQgKyBcInB4XCIgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX3ZtLnNob3dTdW1tYXJ5XG4gICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uZGF0YSAmJiBfdm0uZGF0YS5sZW5ndGggPiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImRhdGEgJiYgZGF0YS5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIHJlZjogXCJyaWdodEZpeGVkRm9vdGVyV3JhcHBlclwiLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRhYmxlX19maXhlZC1mb290ZXItd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcInRhYmxlLWZvb3RlclwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogX3ZtLmJvZHlXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkOiBcInJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogX3ZtLmJvcmRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzdW0tdGV4dFwiOiBfdm0uc3VtVGV4dCB8fCBfdm0udChcImVsLnRhYmxlLnN1bVRleHRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwic3VtbWFyeS1tZXRob2RcIjogX3ZtLnN1bW1hcnlNZXRob2QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlOiBfdm0uc3RvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgXVxuICAgICAgICAgIClcbiAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgIF92bS5yaWdodEZpeGVkQ29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgID8gX2MoXCJkaXZcIiwge1xuICAgICAgICAgICAgcmVmOiBcInJpZ2h0Rml4ZWRQYXRjaFwiLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGFibGVfX2ZpeGVkLXJpZ2h0LXBhdGNoXCIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICB3aWR0aDogX3ZtLmxheW91dC5zY3JvbGxZID8gX3ZtLmxheW91dC5ndXR0ZXJXaWR0aCArIFwicHhcIiA6IFwiMFwiLFxuICAgICAgICAgICAgICBoZWlnaHQ6IF92bS5sYXlvdXQuaGVhZGVySGVpZ2h0ICsgXCJweFwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgIF9jKFwiZGl2XCIsIHtcbiAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgIHZhbHVlOiBfdm0ucmVzaXplUHJveHlWaXNpYmxlLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJyZXNpemVQcm94eVZpc2libGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgcmVmOiBcInJlc2l6ZVByb3h5XCIsXG4gICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRhYmxlX19jb2x1bW4tcmVzaXplLXByb3h5XCJcbiAgICAgIH0pXG4gICAgXVxuICApXG59XG52YXIgdGFibGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF80OTNmZTM0ZV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxudGFibGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF80OTNmZTM0ZV9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy90YWJsZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDkzZmUzNGUmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9jaGVja2JveFwiXG52YXIgY2hlY2tib3hfID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7XG52YXIgY2hlY2tib3hfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY2hlY2tib3hfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcInRocm90dGxlLWRlYm91bmNlXCJcbnZhciBleHRlcm5hbF90aHJvdHRsZV9kZWJvdW5jZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcIm5vcm1hbGl6ZS13aGVlbFwiXG52YXIgZXh0ZXJuYWxfbm9ybWFsaXplX3doZWVsXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzkpO1xudmFyIGV4dGVybmFsX25vcm1hbGl6ZV93aGVlbF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihleHRlcm5hbF9ub3JtYWxpemVfd2hlZWxfKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlyZWN0aXZlcy9tb3VzZXdoZWVsLmpzXG5cblxudmFyIGlzRmlyZWZveCA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgPiAtMTtcblxudmFyIG1vdXNld2hlZWxfbW91c2V3aGVlbCA9IGZ1bmN0aW9uIG1vdXNld2hlZWwoZWxlbWVudCwgY2FsbGJhY2spIHtcbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGlzRmlyZWZveCA/ICdET01Nb3VzZVNjcm9sbCcgOiAnbW91c2V3aGVlbCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIG5vcm1hbGl6ZWQgPSBleHRlcm5hbF9ub3JtYWxpemVfd2hlZWxfZGVmYXVsdCgpKGV2ZW50KTtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrLmFwcGx5KHRoaXMsIFtldmVudCwgbm9ybWFsaXplZF0pO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkaXJlY3RpdmVzX21vdXNld2hlZWwgPSAoe1xuICBiaW5kOiBmdW5jdGlvbiBiaW5kKGVsLCBiaW5kaW5nKSB7XG4gICAgbW91c2V3aGVlbF9tb3VzZXdoZWVsKGVsLCBiaW5kaW5nLnZhbHVlKTtcbiAgfVxufSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwidnVlXCJcbnZhciBleHRlcm5hbF92dWVfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcbnZhciBleHRlcm5hbF92dWVfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZXh0ZXJuYWxfdnVlXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL3V0aWwuanNcbnZhciB1dGlsX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cblxuXG52YXIgZ2V0Q2VsbCA9IGZ1bmN0aW9uIGdldENlbGwoZXZlbnQpIHtcbiAgdmFyIGNlbGwgPSBldmVudC50YXJnZXQ7XG5cbiAgd2hpbGUgKGNlbGwgJiYgY2VsbC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgIT09ICdIVE1MJykge1xuICAgIGlmIChjZWxsLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1REJykge1xuICAgICAgcmV0dXJuIGNlbGw7XG4gICAgfVxuICAgIGNlbGwgPSBjZWxsLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciB1dGlsX2lzT2JqZWN0ID0gZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiB1dGlsX3R5cGVvZihvYmopKSA9PT0gJ29iamVjdCc7XG59O1xuXG52YXIgdXRpbF9vcmRlckJ5ID0gZnVuY3Rpb24gb3JkZXJCeShhcnJheSwgc29ydEtleSwgcmV2ZXJzZSwgc29ydE1ldGhvZCwgc29ydEJ5KSB7XG4gIGlmICghc29ydEtleSAmJiAhc29ydE1ldGhvZCAmJiAoIXNvcnRCeSB8fCBBcnJheS5pc0FycmF5KHNvcnRCeSkgJiYgIXNvcnRCeS5sZW5ndGgpKSB7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIGlmICh0eXBlb2YgcmV2ZXJzZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXZlcnNlID0gcmV2ZXJzZSA9PT0gJ2Rlc2NlbmRpbmcnID8gLTEgOiAxO1xuICB9IGVsc2Uge1xuICAgIHJldmVyc2UgPSByZXZlcnNlICYmIHJldmVyc2UgPCAwID8gLTEgOiAxO1xuICB9XG4gIHZhciBnZXRLZXkgPSBzb3J0TWV0aG9kID8gbnVsbCA6IGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgpIHtcbiAgICBpZiAoc29ydEJ5KSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc29ydEJ5KSkge1xuICAgICAgICBzb3J0QnkgPSBbc29ydEJ5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzb3J0QnkubWFwKGZ1bmN0aW9uIChieSkge1xuICAgICAgICBpZiAodHlwZW9mIGJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBPYmplY3QodXRpbF9bXCJnZXRWYWx1ZUJ5UGF0aFwiXSkodmFsdWUsIGJ5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYnkodmFsdWUsIGluZGV4LCBhcnJheSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc29ydEtleSAhPT0gJyRrZXknKSB7XG4gICAgICBpZiAodXRpbF9pc09iamVjdCh2YWx1ZSkgJiYgJyR2YWx1ZScgaW4gdmFsdWUpIHZhbHVlID0gdmFsdWUuJHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gW3V0aWxfaXNPYmplY3QodmFsdWUpID8gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKHZhbHVlLCBzb3J0S2V5KSA6IHZhbHVlXTtcbiAgfTtcbiAgdmFyIGNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICBpZiAoc29ydE1ldGhvZCkge1xuICAgICAgcmV0dXJuIHNvcnRNZXRob2QoYS52YWx1ZSwgYi52YWx1ZSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhLmtleS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKGEua2V5W2ldIDwgYi5rZXlbaV0pIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGEua2V5W2ldID4gYi5rZXlbaV0pIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9O1xuICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAga2V5OiBnZXRLZXkgPyBnZXRLZXkodmFsdWUsIGluZGV4KSA6IG51bGxcbiAgICB9O1xuICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIG9yZGVyID0gY29tcGFyZShhLCBiKTtcbiAgICBpZiAoIW9yZGVyKSB7XG4gICAgICAvLyBtYWtlIHN0YWJsZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Tb3J0aW5nX2FsZ29yaXRobSNTdGFiaWxpdHlcbiAgICAgIG9yZGVyID0gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBvcmRlciAqIHJldmVyc2U7XG4gIH0pLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICB9KTtcbn07XG5cbnZhciBnZXRDb2x1bW5CeUlkID0gZnVuY3Rpb24gZ2V0Q29sdW1uQnlJZCh0YWJsZSwgY29sdW1uSWQpIHtcbiAgdmFyIGNvbHVtbiA9IG51bGw7XG4gIHRhYmxlLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmIChpdGVtLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgY29sdW1uID0gaXRlbTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY29sdW1uO1xufTtcblxudmFyIGdldENvbHVtbkJ5S2V5ID0gZnVuY3Rpb24gZ2V0Q29sdW1uQnlLZXkodGFibGUsIGNvbHVtbktleSkge1xuICB2YXIgY29sdW1uID0gbnVsbDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWJsZS5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSB0YWJsZS5jb2x1bW5zW2ldO1xuICAgIGlmIChpdGVtLmNvbHVtbktleSA9PT0gY29sdW1uS2V5KSB7XG4gICAgICBjb2x1bW4gPSBpdGVtO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb2x1bW47XG59O1xuXG52YXIgZ2V0Q29sdW1uQnlDZWxsID0gZnVuY3Rpb24gZ2V0Q29sdW1uQnlDZWxsKHRhYmxlLCBjZWxsKSB7XG4gIHZhciBtYXRjaGVzID0gKGNlbGwuY2xhc3NOYW1lIHx8ICcnKS5tYXRjaCgvZWwtdGFibGVfW15cXHNdKy9nbSk7XG4gIGlmIChtYXRjaGVzKSB7XG4gICAgcmV0dXJuIGdldENvbHVtbkJ5SWQodGFibGUsIG1hdGNoZXNbMF0pO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxudmFyIGdldFJvd0lkZW50aXR5ID0gZnVuY3Rpb24gZ2V0Um93SWRlbnRpdHkocm93LCByb3dLZXkpIHtcbiAgaWYgKCFyb3cpIHRocm93IG5ldyBFcnJvcigncm93IGlzIHJlcXVpcmVkIHdoZW4gZ2V0IHJvdyBpZGVudGl0eScpO1xuICBpZiAodHlwZW9mIHJvd0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAocm93S2V5LmluZGV4T2YoJy4nKSA8IDApIHtcbiAgICAgIHJldHVybiByb3dbcm93S2V5XTtcbiAgICB9XG4gICAgdmFyIGtleSA9IHJvd0tleS5zcGxpdCgnLicpO1xuICAgIHZhciBjdXJyZW50ID0gcm93O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXlbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygcm93S2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHJvd0tleS5jYWxsKG51bGwsIHJvdyk7XG4gIH1cbn07XG5cbnZhciBnZXRLZXlzTWFwID0gZnVuY3Rpb24gZ2V0S2V5c01hcChhcnJheSwgcm93S2V5KSB7XG4gIHZhciBhcnJheU1hcCA9IHt9O1xuICAoYXJyYXkgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHJvdywgaW5kZXgpIHtcbiAgICBhcnJheU1hcFtnZXRSb3dJZGVudGl0eShyb3csIHJvd0tleSldID0geyByb3c6IHJvdywgaW5kZXg6IGluZGV4IH07XG4gIH0pO1xuICByZXR1cm4gYXJyYXlNYXA7XG59O1xuXG5mdW5jdGlvbiBoYXNPd24ob2JqLCBrZXkpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhkZWZhdWx0cywgY29uZmlnKSB7XG4gIHZhciBvcHRpb25zID0ge307XG4gIHZhciBrZXkgPSB2b2lkIDA7XG4gIGZvciAoa2V5IGluIGRlZmF1bHRzKSB7XG4gICAgb3B0aW9uc1trZXldID0gZGVmYXVsdHNba2V5XTtcbiAgfVxuICBmb3IgKGtleSBpbiBjb25maWcpIHtcbiAgICBpZiAoaGFzT3duKGNvbmZpZywga2V5KSkge1xuICAgICAgdmFyIHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2lkdGgod2lkdGgpIHtcbiAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICB3aWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCk7XG4gICAgaWYgKGlzTmFOKHdpZHRoKSkge1xuICAgICAgd2lkdGggPSBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2lkdGg7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWluV2lkdGgobWluV2lkdGgpIHtcbiAgaWYgKHR5cGVvZiBtaW5XaWR0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBtaW5XaWR0aCA9IHBhcnNlV2lkdGgobWluV2lkdGgpO1xuICAgIGlmIChpc05hTihtaW5XaWR0aCkpIHtcbiAgICAgIG1pbldpZHRoID0gODA7XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW5XaWR0aDtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlSGVpZ2h0KGhlaWdodCkge1xuICBpZiAodHlwZW9mIGhlaWdodCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG4gIGlmICh0eXBlb2YgaGVpZ2h0ID09PSAnc3RyaW5nJykge1xuICAgIGlmICgvXlxcZCsoPzpweCk/JC8udGVzdChoZWlnaHQpKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoaGVpZ2h0LCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBoZWlnaHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vcmVkdXhqcy9yZWR1eC9ibG9iL21hc3Rlci9zcmMvY29tcG9zZS5qc1xuZnVuY3Rpb24gY29tcG9zZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGZ1bmNzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZnVuY3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfTtcbiAgfVxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZ1bmNzWzBdO1xuICB9XG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVSb3dTdGF0dXMoc3RhdHVzQXJyLCByb3csIG5ld1ZhbCkge1xuICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICB2YXIgaW5kZXggPSBzdGF0dXNBcnIuaW5kZXhPZihyb3cpO1xuICB2YXIgaW5jbHVkZWQgPSBpbmRleCAhPT0gLTE7XG5cbiAgdmFyIGFkZFJvdyA9IGZ1bmN0aW9uIGFkZFJvdygpIHtcbiAgICBzdGF0dXNBcnIucHVzaChyb3cpO1xuICAgIGNoYW5nZWQgPSB0cnVlO1xuICB9O1xuICB2YXIgcmVtb3ZlUm93ID0gZnVuY3Rpb24gcmVtb3ZlUm93KCkge1xuICAgIHN0YXR1c0Fyci5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGNoYW5nZWQgPSB0cnVlO1xuICB9O1xuXG4gIGlmICh0eXBlb2YgbmV3VmFsID09PSAnYm9vbGVhbicpIHtcbiAgICBpZiAobmV3VmFsICYmICFpbmNsdWRlZCkge1xuICAgICAgYWRkUm93KCk7XG4gICAgfSBlbHNlIGlmICghbmV3VmFsICYmIGluY2x1ZGVkKSB7XG4gICAgICByZW1vdmVSb3coKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGluY2x1ZGVkKSB7XG4gICAgICByZW1vdmVSb3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkUm93KCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG5mdW5jdGlvbiB3YWxrVHJlZU5vZGUocm9vdCwgY2IpIHtcbiAgdmFyIGNoaWxkcmVuS2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAnY2hpbGRyZW4nO1xuICB2YXIgbGF6eUtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogJ2hhc0NoaWxkcmVuJztcblxuICB2YXIgaXNOaWwgPSBmdW5jdGlvbiBpc05pbChhcnJheSkge1xuICAgIHJldHVybiAhKEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5Lmxlbmd0aCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gX3dhbGtlcihwYXJlbnQsIGNoaWxkcmVuLCBsZXZlbCkge1xuICAgIGNiKHBhcmVudCwgY2hpbGRyZW4sIGxldmVsKTtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBpZiAoaXRlbVtsYXp5S2V5XSkge1xuICAgICAgICBjYihpdGVtLCBudWxsLCBsZXZlbCArIDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgY2hpbGRyZW4gPSBpdGVtW2NoaWxkcmVuS2V5XTtcbiAgICAgIGlmICghaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgICAgIF93YWxrZXIoaXRlbSwgY2hpbGRyZW4sIGxldmVsICsgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByb290LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAoaXRlbVtsYXp5S2V5XSkge1xuICAgICAgY2IoaXRlbSwgbnVsbCwgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjaGlsZHJlbiA9IGl0ZW1bY2hpbGRyZW5LZXldO1xuICAgIGlmICghaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgICBfd2Fsa2VyKGl0ZW0sIGNoaWxkcmVuLCAwKTtcbiAgICB9XG4gIH0pO1xufVxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvc3RvcmUvZXhwYW5kLmpzXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZXhwYW5kID0gKHtcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGVzOiB7XG4gICAgICAgIGRlZmF1bHRFeHBhbmRBbGw6IGZhbHNlLFxuICAgICAgICBleHBhbmRSb3dzOiBbXVxuICAgICAgfVxuICAgIH07XG4gIH0sXG5cblxuICBtZXRob2RzOiB7XG4gICAgdXBkYXRlRXhwYW5kUm93czogZnVuY3Rpb24gdXBkYXRlRXhwYW5kUm93cygpIHtcbiAgICAgIHZhciBfc3RhdGVzID0gdGhpcy5zdGF0ZXMsXG4gICAgICAgICAgX3N0YXRlcyRkYXRhID0gX3N0YXRlcy5kYXRhLFxuICAgICAgICAgIGRhdGEgPSBfc3RhdGVzJGRhdGEgPT09IHVuZGVmaW5lZCA/IFtdIDogX3N0YXRlcyRkYXRhLFxuICAgICAgICAgIHJvd0tleSA9IF9zdGF0ZXMucm93S2V5LFxuICAgICAgICAgIGRlZmF1bHRFeHBhbmRBbGwgPSBfc3RhdGVzLmRlZmF1bHRFeHBhbmRBbGwsXG4gICAgICAgICAgZXhwYW5kUm93cyA9IF9zdGF0ZXMuZXhwYW5kUm93cztcblxuICAgICAgaWYgKGRlZmF1bHRFeHBhbmRBbGwpIHtcbiAgICAgICAgdGhpcy5zdGF0ZXMuZXhwYW5kUm93cyA9IGRhdGEuc2xpY2UoKTtcbiAgICAgIH0gZWxzZSBpZiAocm93S2V5KSB7XG4gICAgICAgIC8vIFRPRE/vvJrov5nph4znmoTku6PnoIHlj6/ku6XkvJjljJZcbiAgICAgICAgdmFyIGV4cGFuZFJvd3NNYXAgPSBnZXRLZXlzTWFwKGV4cGFuZFJvd3MsIHJvd0tleSk7XG4gICAgICAgIHRoaXMuc3RhdGVzLmV4cGFuZFJvd3MgPSBkYXRhLnJlZHVjZShmdW5jdGlvbiAocHJldiwgcm93KSB7XG4gICAgICAgICAgdmFyIHJvd0lkID0gZ2V0Um93SWRlbnRpdHkocm93LCByb3dLZXkpO1xuICAgICAgICAgIHZhciByb3dJbmZvID0gZXhwYW5kUm93c01hcFtyb3dJZF07XG4gICAgICAgICAgaWYgKHJvd0luZm8pIHtcbiAgICAgICAgICAgIHByZXYucHVzaChyb3cpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgfSwgW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZXMuZXhwYW5kUm93cyA9IFtdO1xuICAgICAgfVxuICAgIH0sXG4gICAgdG9nZ2xlUm93RXhwYW5zaW9uOiBmdW5jdGlvbiB0b2dnbGVSb3dFeHBhbnNpb24ocm93LCBleHBhbmRlZCkge1xuICAgICAgdmFyIGNoYW5nZWQgPSB0b2dnbGVSb3dTdGF0dXModGhpcy5zdGF0ZXMuZXhwYW5kUm93cywgcm93LCBleHBhbmRlZCk7XG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICB0aGlzLnRhYmxlLiRlbWl0KCdleHBhbmQtY2hhbmdlJywgcm93LCB0aGlzLnN0YXRlcy5leHBhbmRSb3dzLnNsaWNlKCkpO1xuICAgICAgICB0aGlzLnNjaGVkdWxlTGF5b3V0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRFeHBhbmRSb3dLZXlzOiBmdW5jdGlvbiBzZXRFeHBhbmRSb3dLZXlzKHJvd0tleXMpIHtcbiAgICAgIHRoaXMuYXNzZXJ0Um93S2V5KCk7XG4gICAgICAvLyBUT0RP77ya6L+Z6YeM55qE5Luj56CB5Y+v5Lul5LyY5YyWXG4gICAgICB2YXIgX3N0YXRlczIgPSB0aGlzLnN0YXRlcyxcbiAgICAgICAgICBkYXRhID0gX3N0YXRlczIuZGF0YSxcbiAgICAgICAgICByb3dLZXkgPSBfc3RhdGVzMi5yb3dLZXk7XG5cbiAgICAgIHZhciBrZXlzTWFwID0gZ2V0S2V5c01hcChkYXRhLCByb3dLZXkpO1xuICAgICAgdGhpcy5zdGF0ZXMuZXhwYW5kUm93cyA9IHJvd0tleXMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXIpIHtcbiAgICAgICAgdmFyIGluZm8gPSBrZXlzTWFwW2N1cl07XG4gICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgcHJldi5wdXNoKGluZm8ucm93KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIFtdKTtcbiAgICB9LFxuICAgIGlzUm93RXhwYW5kZWQ6IGZ1bmN0aW9uIGlzUm93RXhwYW5kZWQocm93KSB7XG4gICAgICB2YXIgX3N0YXRlczMgPSB0aGlzLnN0YXRlcyxcbiAgICAgICAgICBfc3RhdGVzMyRleHBhbmRSb3dzID0gX3N0YXRlczMuZXhwYW5kUm93cyxcbiAgICAgICAgICBleHBhbmRSb3dzID0gX3N0YXRlczMkZXhwYW5kUm93cyA9PT0gdW5kZWZpbmVkID8gW10gOiBfc3RhdGVzMyRleHBhbmRSb3dzLFxuICAgICAgICAgIHJvd0tleSA9IF9zdGF0ZXMzLnJvd0tleTtcblxuICAgICAgaWYgKHJvd0tleSkge1xuICAgICAgICB2YXIgZXhwYW5kTWFwID0gZ2V0S2V5c01hcChleHBhbmRSb3dzLCByb3dLZXkpO1xuICAgICAgICByZXR1cm4gISFleHBhbmRNYXBbZ2V0Um93SWRlbnRpdHkocm93LCByb3dLZXkpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleHBhbmRSb3dzLmluZGV4T2Yocm93KSAhPT0gLTE7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL3N0b3JlL2N1cnJlbnQuanNcblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHN0b3JlX2N1cnJlbnQgPSAoe1xuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZXM6IHtcbiAgICAgICAgLy8g5LiN5Y+v5ZON5bqU55qE77yM6K6+572uIGN1cnJlbnRSb3dLZXkg5pe277yMZGF0YSDkuI3kuIDlrprlrZjlnKjvvIzkuZ/orrjml6Dms5Xnrpflh7rmraPnoa7nmoQgY3VycmVudFJvd1xuICAgICAgICAvLyDmioror6XlgLznvJPlrZjkuIDkuIvvvIzlvZPnlKjmiLfngrnlh7vkv67mlLkgY3VycmVudFJvdyDml7bvvIzmioror6XlgLzph43nva7kuLogbnVsbFxuICAgICAgICBfY3VycmVudFJvd0tleTogbnVsbCxcbiAgICAgICAgY3VycmVudFJvdzogbnVsbFxuICAgICAgfVxuICAgIH07XG4gIH0sXG5cblxuICBtZXRob2RzOiB7XG4gICAgc2V0Q3VycmVudFJvd0tleTogZnVuY3Rpb24gc2V0Q3VycmVudFJvd0tleShrZXkpIHtcbiAgICAgIHRoaXMuYXNzZXJ0Um93S2V5KCk7XG4gICAgICB0aGlzLnN0YXRlcy5fY3VycmVudFJvd0tleSA9IGtleTtcbiAgICAgIHRoaXMuc2V0Q3VycmVudFJvd0J5S2V5KGtleSk7XG4gICAgfSxcbiAgICByZXN0b3JlQ3VycmVudFJvd0tleTogZnVuY3Rpb24gcmVzdG9yZUN1cnJlbnRSb3dLZXkoKSB7XG4gICAgICB0aGlzLnN0YXRlcy5fY3VycmVudFJvd0tleSA9IG51bGw7XG4gICAgfSxcbiAgICBzZXRDdXJyZW50Um93QnlLZXk6IGZ1bmN0aW9uIHNldEN1cnJlbnRSb3dCeUtleShrZXkpIHtcbiAgICAgIHZhciBzdGF0ZXMgPSB0aGlzLnN0YXRlcztcbiAgICAgIHZhciBfc3RhdGVzJGRhdGEgPSBzdGF0ZXMuZGF0YSxcbiAgICAgICAgICBkYXRhID0gX3N0YXRlcyRkYXRhID09PSB1bmRlZmluZWQgPyBbXSA6IF9zdGF0ZXMkZGF0YSxcbiAgICAgICAgICByb3dLZXkgPSBzdGF0ZXMucm93S2V5O1xuXG4gICAgICB2YXIgY3VycmVudFJvdyA9IG51bGw7XG4gICAgICBpZiAocm93S2V5KSB7XG4gICAgICAgIGN1cnJlbnRSb3cgPSBPYmplY3QodXRpbF9bXCJhcnJheUZpbmRcIl0pKGRhdGEsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFJvd0lkZW50aXR5KGl0ZW0sIHJvd0tleSkgPT09IGtleTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzdGF0ZXMuY3VycmVudFJvdyA9IGN1cnJlbnRSb3c7XG4gICAgfSxcbiAgICB1cGRhdGVDdXJyZW50Um93OiBmdW5jdGlvbiB1cGRhdGVDdXJyZW50Um93KGN1cnJlbnRSb3cpIHtcbiAgICAgIHZhciBzdGF0ZXMgPSB0aGlzLnN0YXRlcyxcbiAgICAgICAgICB0YWJsZSA9IHRoaXMudGFibGU7XG5cbiAgICAgIHZhciBvbGRDdXJyZW50Um93ID0gc3RhdGVzLmN1cnJlbnRSb3c7XG4gICAgICBpZiAoY3VycmVudFJvdyAmJiBjdXJyZW50Um93ICE9PSBvbGRDdXJyZW50Um93KSB7XG4gICAgICAgIHN0YXRlcy5jdXJyZW50Um93ID0gY3VycmVudFJvdztcbiAgICAgICAgdGFibGUuJGVtaXQoJ2N1cnJlbnQtY2hhbmdlJywgY3VycmVudFJvdywgb2xkQ3VycmVudFJvdyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY3VycmVudFJvdyAmJiBvbGRDdXJyZW50Um93KSB7XG4gICAgICAgIHN0YXRlcy5jdXJyZW50Um93ID0gbnVsbDtcbiAgICAgICAgdGFibGUuJGVtaXQoJ2N1cnJlbnQtY2hhbmdlJywgbnVsbCwgb2xkQ3VycmVudFJvdyk7XG4gICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGVDdXJyZW50Um93RGF0YTogZnVuY3Rpb24gdXBkYXRlQ3VycmVudFJvd0RhdGEoKSB7XG4gICAgICB2YXIgc3RhdGVzID0gdGhpcy5zdGF0ZXMsXG4gICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlO1xuICAgICAgdmFyIHJvd0tleSA9IHN0YXRlcy5yb3dLZXksXG4gICAgICAgICAgX2N1cnJlbnRSb3dLZXkgPSBzdGF0ZXMuX2N1cnJlbnRSb3dLZXk7XG4gICAgICAvLyBkYXRhIOS4uiBudWxsIOaXtu+8jOino+aehOaXtueahOm7mOiupOWAvOS8muiiq+W/veeVpVxuXG4gICAgICB2YXIgZGF0YSA9IHN0YXRlcy5kYXRhIHx8IFtdO1xuICAgICAgdmFyIG9sZEN1cnJlbnRSb3cgPSBzdGF0ZXMuY3VycmVudFJvdztcblxuICAgICAgLy8g5b2TIGN1cnJlbnRSb3cg5LiN5ZyoIGRhdGEg5Lit5pe25bCd6K+V5pu05paw5pWw5o2uXG4gICAgICBpZiAoZGF0YS5pbmRleE9mKG9sZEN1cnJlbnRSb3cpID09PSAtMSAmJiBvbGRDdXJyZW50Um93KSB7XG4gICAgICAgIGlmIChyb3dLZXkpIHtcbiAgICAgICAgICB2YXIgY3VycmVudFJvd0tleSA9IGdldFJvd0lkZW50aXR5KG9sZEN1cnJlbnRSb3csIHJvd0tleSk7XG4gICAgICAgICAgdGhpcy5zZXRDdXJyZW50Um93QnlLZXkoY3VycmVudFJvd0tleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGVzLmN1cnJlbnRSb3cgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZXMuY3VycmVudFJvdyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRhYmxlLiRlbWl0KCdjdXJyZW50LWNoYW5nZScsIG51bGwsIG9sZEN1cnJlbnRSb3cpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF9jdXJyZW50Um93S2V5KSB7XG4gICAgICAgIC8vIOaKiuWIneWni+aXtuS4i+iuvue9rueahCByb3dLZXkg6L2s5YyW5oiQIHJvd0RhdGFcbiAgICAgICAgdGhpcy5zZXRDdXJyZW50Um93QnlLZXkoX2N1cnJlbnRSb3dLZXkpO1xuICAgICAgICB0aGlzLnJlc3RvcmVDdXJyZW50Um93S2V5KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL3N0b3JlL3RyZWUuanNcbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0cmVlID0gKHtcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGVzOiB7XG4gICAgICAgIC8vIGRlZmF1bHRFeHBhbmRBbGwg5a2Y5Zyo5LqOIGV4cGFuZC5qcyDkuK3vvIzov5nph4zkuI3ph43lpI3mt7vliqBcbiAgICAgICAgLy8g5Zyo5bGV5byA6KGM5Lit77yMZXhwYW5kUm93S2V5cyDkvJrooqvovazljJbmiJAgZXhwYW5kUm93c++8jGV4cGFuZFJvd0tleXMg6L+Z5Liq5bGe5oCn5Y+q5piv6K6w5b2V5LqGIFRyZWVUYWJsZSDooYznmoTlsZXlvIBcbiAgICAgICAgLy8gVE9ETzog5ouG5YiG5Li654us56uL55qEIFRyZWVUYWJsZe+8jOe7n+S4gOeUqOazlVxuICAgICAgICBleHBhbmRSb3dLZXlzOiBbXSxcbiAgICAgICAgdHJlZURhdGE6IHt9LFxuICAgICAgICBpbmRlbnQ6IDE2LFxuICAgICAgICBsYXp5OiBmYWxzZSxcbiAgICAgICAgbGF6eVRyZWVOb2RlTWFwOiB7fSxcbiAgICAgICAgbGF6eUNvbHVtbklkZW50aWZpZXI6ICdoYXNDaGlsZHJlbicsXG4gICAgICAgIGNoaWxkcmVuQ29sdW1uTmFtZTogJ2NoaWxkcmVuJ1xuICAgICAgfVxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIC8vIOW1jOWFpeWei+eahOaVsOaNru+8jHdhdGNoIOaXoOazleaYr+ajgOa1i+WIsOWPmOWMliBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy8xNDk5OFxuICAgIC8vIFRPRE86IOS9v+eUqCBjb21wdXRlZCDop6PlhrPor6Xpl67popjvvIzmmK/lkKbkvJrpgKDmiJDmgKfog73pl67popjvvJ9cbiAgICAvLyBAcmV0dXJuIHsgaWQ6IHsgbGV2ZWwsIGNoaWxkcmVuIH0gfVxuICAgIG5vcm1hbGl6ZWREYXRhOiBmdW5jdGlvbiBub3JtYWxpemVkRGF0YSgpIHtcbiAgICAgIGlmICghdGhpcy5zdGF0ZXMucm93S2V5KSByZXR1cm4ge307XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuc3RhdGVzLmRhdGEgfHwgW107XG4gICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoZGF0YSk7XG4gICAgfSxcblxuICAgIC8vIEByZXR1cm4geyBpZDogeyBjaGlsZHJlbiB9IH1cbiAgICAvLyDpkojlr7nmh5LliqDovb3nmoTmg4XlvaLvvIzkuI3lpITnkIbltYzlpZfmlbDmja5cbiAgICBub3JtYWxpemVkTGF6eU5vZGU6IGZ1bmN0aW9uIG5vcm1hbGl6ZWRMYXp5Tm9kZSgpIHtcbiAgICAgIHZhciBfc3RhdGVzID0gdGhpcy5zdGF0ZXMsXG4gICAgICAgICAgcm93S2V5ID0gX3N0YXRlcy5yb3dLZXksXG4gICAgICAgICAgbGF6eVRyZWVOb2RlTWFwID0gX3N0YXRlcy5sYXp5VHJlZU5vZGVNYXAsXG4gICAgICAgICAgbGF6eUNvbHVtbklkZW50aWZpZXIgPSBfc3RhdGVzLmxhenlDb2x1bW5JZGVudGlmaWVyO1xuXG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGxhenlUcmVlTm9kZU1hcCk7XG4gICAgICB2YXIgcmVzID0ge307XG4gICAgICBpZiAoIWtleXMubGVuZ3RoKSByZXR1cm4gcmVzO1xuICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGxhenlUcmVlTm9kZU1hcFtrZXldLmxlbmd0aCkge1xuICAgICAgICAgIHZhciBpdGVtID0geyBjaGlsZHJlbjogW10gfTtcbiAgICAgICAgICBsYXp5VHJlZU5vZGVNYXBba2V5XS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50Um93S2V5ID0gZ2V0Um93SWRlbnRpdHkocm93LCByb3dLZXkpO1xuICAgICAgICAgICAgaXRlbS5jaGlsZHJlbi5wdXNoKGN1cnJlbnRSb3dLZXkpO1xuICAgICAgICAgICAgaWYgKHJvd1tsYXp5Q29sdW1uSWRlbnRpZmllcl0gJiYgIXJlc1tjdXJyZW50Um93S2V5XSkge1xuICAgICAgICAgICAgICByZXNbY3VycmVudFJvd0tleV0gPSB7IGNoaWxkcmVuOiBbXSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc1trZXldID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG5vcm1hbGl6ZWREYXRhOiAndXBkYXRlVHJlZURhdGEnLFxuICAgIG5vcm1hbGl6ZWRMYXp5Tm9kZTogJ3VwZGF0ZVRyZWVEYXRhJ1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBub3JtYWxpemU6IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhKSB7XG4gICAgICB2YXIgX3N0YXRlczIgPSB0aGlzLnN0YXRlcyxcbiAgICAgICAgICBjaGlsZHJlbkNvbHVtbk5hbWUgPSBfc3RhdGVzMi5jaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgICAgICAgbGF6eUNvbHVtbklkZW50aWZpZXIgPSBfc3RhdGVzMi5sYXp5Q29sdW1uSWRlbnRpZmllcixcbiAgICAgICAgICByb3dLZXkgPSBfc3RhdGVzMi5yb3dLZXksXG4gICAgICAgICAgbGF6eSA9IF9zdGF0ZXMyLmxhenk7XG5cbiAgICAgIHZhciByZXMgPSB7fTtcbiAgICAgIHdhbGtUcmVlTm9kZShkYXRhLCBmdW5jdGlvbiAocGFyZW50LCBjaGlsZHJlbiwgbGV2ZWwpIHtcbiAgICAgICAgdmFyIHBhcmVudElkID0gZ2V0Um93SWRlbnRpdHkocGFyZW50LCByb3dLZXkpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICByZXNbcGFyZW50SWRdID0ge1xuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLm1hcChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRSb3dJZGVudGl0eShyb3csIHJvd0tleSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAobGF6eSkge1xuICAgICAgICAgIC8vIOW9kyBjaGlsZHJlbiDkuI3lrZjlnKjkuJQgbGF6eSDkuLogdHJ1Ze+8jOivpeiKgueCueWNs+S4uuaHkuWKoOi9veeahOiKgueCuVxuICAgICAgICAgIHJlc1twYXJlbnRJZF0gPSB7XG4gICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICBsYXp5OiB0cnVlLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSwgY2hpbGRyZW5Db2x1bW5OYW1lLCBsYXp5Q29sdW1uSWRlbnRpZmllcik7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sXG4gICAgdXBkYXRlVHJlZURhdGE6IGZ1bmN0aW9uIHVwZGF0ZVRyZWVEYXRhKCkge1xuICAgICAgdmFyIG5lc3RlZCA9IHRoaXMubm9ybWFsaXplZERhdGE7XG4gICAgICB2YXIgbm9ybWFsaXplZExhenlOb2RlID0gdGhpcy5ub3JtYWxpemVkTGF6eU5vZGU7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG5lc3RlZCk7XG4gICAgICB2YXIgbmV3VHJlZURhdGEgPSB7fTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIgX3N0YXRlczMgPSB0aGlzLnN0YXRlcyxcbiAgICAgICAgICAgIG9sZFRyZWVEYXRhID0gX3N0YXRlczMudHJlZURhdGEsXG4gICAgICAgICAgICBkZWZhdWx0RXhwYW5kQWxsID0gX3N0YXRlczMuZGVmYXVsdEV4cGFuZEFsbCxcbiAgICAgICAgICAgIGV4cGFuZFJvd0tleXMgPSBfc3RhdGVzMy5leHBhbmRSb3dLZXlzLFxuICAgICAgICAgICAgbGF6eSA9IF9zdGF0ZXMzLmxhenk7XG5cbiAgICAgICAgdmFyIHJvb3RMYXp5Um93S2V5cyA9IFtdO1xuICAgICAgICB2YXIgZ2V0RXhwYW5kZWQgPSBmdW5jdGlvbiBnZXRFeHBhbmRlZChvbGRWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgdmFyIGluY2x1ZGVkID0gZGVmYXVsdEV4cGFuZEFsbCB8fCBleHBhbmRSb3dLZXlzICYmIGV4cGFuZFJvd0tleXMuaW5kZXhPZihrZXkpICE9PSAtMTtcbiAgICAgICAgICByZXR1cm4gISEob2xkVmFsdWUgJiYgb2xkVmFsdWUuZXhwYW5kZWQgfHwgaW5jbHVkZWQpO1xuICAgICAgICB9O1xuICAgICAgICAvLyDlkIjlubYgZXhwYW5kZWQg5LiOIGRpc3BsYXnvvIznoa7kv53mlbDmja7liLfmlrDlkI7vvIznirbmgIHkuI3lj5hcbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBvbGRUcmVlRGF0YVtrZXldO1xuICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IF9leHRlbmRzKHt9LCBuZXN0ZWRba2V5XSk7XG4gICAgICAgICAgbmV3VmFsdWUuZXhwYW5kZWQgPSBnZXRFeHBhbmRlZChvbGRWYWx1ZSwga2V5KTtcbiAgICAgICAgICBpZiAobmV3VmFsdWUubGF6eSkge1xuICAgICAgICAgICAgdmFyIF9yZWYgPSBvbGRWYWx1ZSB8fCB7fSxcbiAgICAgICAgICAgICAgICBfcmVmJGxvYWRlZCA9IF9yZWYubG9hZGVkLFxuICAgICAgICAgICAgICAgIGxvYWRlZCA9IF9yZWYkbG9hZGVkID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYkbG9hZGVkLFxuICAgICAgICAgICAgICAgIF9yZWYkbG9hZGluZyA9IF9yZWYubG9hZGluZyxcbiAgICAgICAgICAgICAgICBsb2FkaW5nID0gX3JlZiRsb2FkaW5nID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYkbG9hZGluZztcblxuICAgICAgICAgICAgbmV3VmFsdWUubG9hZGVkID0gISFsb2FkZWQ7XG4gICAgICAgICAgICBuZXdWYWx1ZS5sb2FkaW5nID0gISFsb2FkaW5nO1xuICAgICAgICAgICAgcm9vdExhenlSb3dLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3VHJlZURhdGFba2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8g5qC55o2u5oeS5Yqg6L295pWw5o2u5pu05pawIHRyZWVEYXRhXG4gICAgICAgIHZhciBsYXp5S2V5cyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRMYXp5Tm9kZSk7XG4gICAgICAgIGlmIChsYXp5ICYmIGxhenlLZXlzLmxlbmd0aCAmJiByb290TGF6eVJvd0tleXMubGVuZ3RoKSB7XG4gICAgICAgICAgbGF6eUtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBvbGRUcmVlRGF0YVtrZXldO1xuICAgICAgICAgICAgdmFyIGxhenlOb2RlQ2hpbGRyZW4gPSBub3JtYWxpemVkTGF6eU5vZGVba2V5XS5jaGlsZHJlbjtcbiAgICAgICAgICAgIGlmIChyb290TGF6eVJvd0tleXMuaW5kZXhPZihrZXkpICE9PSAtMSkge1xuICAgICAgICAgICAgICAvLyDmh5LliqDovb3nmoQgcm9vdCDoioLngrnvvIzmm7TmlrDkuIDkuIvljp/mnInnmoTmlbDmja7vvIzljp/mnaXnmoQgY2hpbGRyZW4g5LiA5a6a5piv56m65pWw57uEXG4gICAgICAgICAgICAgIGlmIChuZXdUcmVlRGF0YVtrZXldLmNoaWxkcmVuLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW0VsVGFibGVdY2hpbGRyZW4gbXVzdCBiZSBhbiBlbXB0eSBhcnJheS4nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBuZXdUcmVlRGF0YVtrZXldLmNoaWxkcmVuID0gbGF6eU5vZGVDaGlsZHJlbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfcmVmMiA9IG9sZFZhbHVlIHx8IHt9LFxuICAgICAgICAgICAgICAgICAgX3JlZjIkbG9hZGVkID0gX3JlZjIubG9hZGVkLFxuICAgICAgICAgICAgICAgICAgbG9hZGVkID0gX3JlZjIkbG9hZGVkID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYyJGxvYWRlZCxcbiAgICAgICAgICAgICAgICAgIF9yZWYyJGxvYWRpbmcgPSBfcmVmMi5sb2FkaW5nLFxuICAgICAgICAgICAgICAgICAgbG9hZGluZyA9IF9yZWYyJGxvYWRpbmcgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjIkbG9hZGluZztcblxuICAgICAgICAgICAgICBuZXdUcmVlRGF0YVtrZXldID0ge1xuICAgICAgICAgICAgICAgIGxhenk6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiAhIWxvYWRlZCxcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiAhIWxvYWRpbmcsXG4gICAgICAgICAgICAgICAgZXhwYW5kZWQ6IGdldEV4cGFuZGVkKG9sZFZhbHVlLCBrZXkpLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBsYXp5Tm9kZUNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIGxldmVsOiAnJ1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXRlcy50cmVlRGF0YSA9IG5ld1RyZWVEYXRhO1xuICAgICAgdGhpcy51cGRhdGVUYWJsZVNjcm9sbFkoKTtcbiAgICB9LFxuICAgIHVwZGF0ZVRyZWVFeHBhbmRLZXlzOiBmdW5jdGlvbiB1cGRhdGVUcmVlRXhwYW5kS2V5cyh2YWx1ZSkge1xuICAgICAgdGhpcy5zdGF0ZXMuZXhwYW5kUm93S2V5cyA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVUcmVlRGF0YSgpO1xuICAgIH0sXG4gICAgdG9nZ2xlVHJlZUV4cGFuc2lvbjogZnVuY3Rpb24gdG9nZ2xlVHJlZUV4cGFuc2lvbihyb3csIGV4cGFuZGVkKSB7XG4gICAgICB0aGlzLmFzc2VydFJvd0tleSgpO1xuXG4gICAgICB2YXIgX3N0YXRlczQgPSB0aGlzLnN0YXRlcyxcbiAgICAgICAgICByb3dLZXkgPSBfc3RhdGVzNC5yb3dLZXksXG4gICAgICAgICAgdHJlZURhdGEgPSBfc3RhdGVzNC50cmVlRGF0YTtcblxuICAgICAgdmFyIGlkID0gZ2V0Um93SWRlbnRpdHkocm93LCByb3dLZXkpO1xuICAgICAgdmFyIGRhdGEgPSBpZCAmJiB0cmVlRGF0YVtpZF07XG4gICAgICBpZiAoaWQgJiYgZGF0YSAmJiAnZXhwYW5kZWQnIGluIGRhdGEpIHtcbiAgICAgICAgdmFyIG9sZEV4cGFuZGVkID0gZGF0YS5leHBhbmRlZDtcbiAgICAgICAgZXhwYW5kZWQgPSB0eXBlb2YgZXhwYW5kZWQgPT09ICd1bmRlZmluZWQnID8gIWRhdGEuZXhwYW5kZWQgOiBleHBhbmRlZDtcbiAgICAgICAgdHJlZURhdGFbaWRdLmV4cGFuZGVkID0gZXhwYW5kZWQ7XG4gICAgICAgIGlmIChvbGRFeHBhbmRlZCAhPT0gZXhwYW5kZWQpIHtcbiAgICAgICAgICB0aGlzLnRhYmxlLiRlbWl0KCdleHBhbmQtY2hhbmdlJywgcm93LCBleHBhbmRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVUYWJsZVNjcm9sbFkoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGxvYWRPclRvZ2dsZTogZnVuY3Rpb24gbG9hZE9yVG9nZ2xlKHJvdykge1xuICAgICAgdGhpcy5hc3NlcnRSb3dLZXkoKTtcbiAgICAgIHZhciBfc3RhdGVzNSA9IHRoaXMuc3RhdGVzLFxuICAgICAgICAgIGxhenkgPSBfc3RhdGVzNS5sYXp5LFxuICAgICAgICAgIHRyZWVEYXRhID0gX3N0YXRlczUudHJlZURhdGEsXG4gICAgICAgICAgcm93S2V5ID0gX3N0YXRlczUucm93S2V5O1xuXG4gICAgICB2YXIgaWQgPSBnZXRSb3dJZGVudGl0eShyb3csIHJvd0tleSk7XG4gICAgICB2YXIgZGF0YSA9IHRyZWVEYXRhW2lkXTtcbiAgICAgIGlmIChsYXp5ICYmIGRhdGEgJiYgJ2xvYWRlZCcgaW4gZGF0YSAmJiAhZGF0YS5sb2FkZWQpIHtcbiAgICAgICAgdGhpcy5sb2FkRGF0YShyb3csIGlkLCBkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9nZ2xlVHJlZUV4cGFuc2lvbihyb3cpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbG9hZERhdGE6IGZ1bmN0aW9uIGxvYWREYXRhKHJvdywga2V5LCB0cmVlTm9kZSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGxvYWQgPSB0aGlzLnRhYmxlLmxvYWQ7XG4gICAgICB2YXIgcmF3VHJlZURhdGEgPSB0aGlzLnN0YXRlcy50cmVlRGF0YTtcblxuICAgICAgaWYgKGxvYWQgJiYgIXJhd1RyZWVEYXRhW2tleV0ubG9hZGVkKSB7XG4gICAgICAgIHJhd1RyZWVEYXRhW2tleV0ubG9hZGluZyA9IHRydWU7XG4gICAgICAgIGxvYWQocm93LCB0cmVlTm9kZSwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW0VsVGFibGVdIGRhdGEgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgX3N0YXRlczYgPSBfdGhpcy5zdGF0ZXMsXG4gICAgICAgICAgICAgIGxhenlUcmVlTm9kZU1hcCA9IF9zdGF0ZXM2LmxhenlUcmVlTm9kZU1hcCxcbiAgICAgICAgICAgICAgdHJlZURhdGEgPSBfc3RhdGVzNi50cmVlRGF0YTtcblxuICAgICAgICAgIHRyZWVEYXRhW2tleV0ubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRyZWVEYXRhW2tleV0ubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cmVlRGF0YVtrZXldLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIF90aGlzLiRzZXQobGF6eVRyZWVOb2RlTWFwLCBrZXksIGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfdGhpcy50YWJsZS4kZW1pdCgnZXhwYW5kLWNoYW5nZScsIHJvdywgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy9zdG9yZS93YXRjaGVyLmpzXG5cblxuXG5cblxuXG5cbnZhciB3YXRjaGVyX3NvcnREYXRhID0gZnVuY3Rpb24gc29ydERhdGEoZGF0YSwgc3RhdGVzKSB7XG4gIHZhciBzb3J0aW5nQ29sdW1uID0gc3RhdGVzLnNvcnRpbmdDb2x1bW47XG4gIGlmICghc29ydGluZ0NvbHVtbiB8fCB0eXBlb2Ygc29ydGluZ0NvbHVtbi5zb3J0YWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICByZXR1cm4gdXRpbF9vcmRlckJ5KGRhdGEsIHN0YXRlcy5zb3J0UHJvcCwgc3RhdGVzLnNvcnRPcmRlciwgc29ydGluZ0NvbHVtbi5zb3J0TWV0aG9kLCBzb3J0aW5nQ29sdW1uLnNvcnRCeSk7XG59O1xuXG52YXIgZG9GbGF0dGVuQ29sdW1ucyA9IGZ1bmN0aW9uIGRvRmxhdHRlbkNvbHVtbnMoY29sdW1ucykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgaWYgKGNvbHVtbi5jaGlsZHJlbikge1xuICAgICAgcmVzdWx0LnB1c2guYXBwbHkocmVzdWx0LCBkb0ZsYXR0ZW5Db2x1bW5zKGNvbHVtbi5jaGlsZHJlbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB3YXRjaGVyID0gKGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEuZXh0ZW5kKHtcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGVzOiB7XG4gICAgICAgIC8vIDMuMCDniYjmnKzlkI7opoHmsYLlv4Xpobvorr7nva7or6XlsZ7mgKdcbiAgICAgICAgcm93S2V5OiBudWxsLFxuXG4gICAgICAgIC8vIOa4suafk+eahOaVsOaNruadpea6kO+8jOaYr+WvuSB0YWJsZSDkuK3nmoQgZGF0YSDov4fmu6TmjpLluo/lkI7nmoTnu5PmnpxcbiAgICAgICAgZGF0YTogW10sXG5cbiAgICAgICAgLy8g5piv5ZCm5YyF5ZCr5Zu65a6a5YiXXG4gICAgICAgIGlzQ29tcGxleDogZmFsc2UsXG5cbiAgICAgICAgLy8g5YiXXG4gICAgICAgIF9jb2x1bW5zOiBbXSwgLy8g5LiN5Y+v5ZON5bqU55qEXG4gICAgICAgIG9yaWdpbkNvbHVtbnM6IFtdLFxuICAgICAgICBjb2x1bW5zOiBbXSxcbiAgICAgICAgZml4ZWRDb2x1bW5zOiBbXSxcbiAgICAgICAgcmlnaHRGaXhlZENvbHVtbnM6IFtdLFxuICAgICAgICBsZWFmQ29sdW1uczogW10sXG4gICAgICAgIGZpeGVkTGVhZkNvbHVtbnM6IFtdLFxuICAgICAgICByaWdodEZpeGVkTGVhZkNvbHVtbnM6IFtdLFxuICAgICAgICBsZWFmQ29sdW1uc0xlbmd0aDogMCxcbiAgICAgICAgZml4ZWRMZWFmQ29sdW1uc0xlbmd0aDogMCxcbiAgICAgICAgcmlnaHRGaXhlZExlYWZDb2x1bW5zTGVuZ3RoOiAwLFxuXG4gICAgICAgIC8vIOmAieaLqVxuICAgICAgICBpc0FsbFNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgc2VsZWN0aW9uOiBbXSxcbiAgICAgICAgcmVzZXJ2ZVNlbGVjdGlvbjogZmFsc2UsXG4gICAgICAgIHNlbGVjdE9uSW5kZXRlcm1pbmF0ZTogZmFsc2UsXG4gICAgICAgIHNlbGVjdGFibGU6IG51bGwsXG5cbiAgICAgICAgLy8g6L+H5rukXG4gICAgICAgIGZpbHRlcnM6IHt9LCAvLyDkuI3lj6/lk43lupTnmoRcbiAgICAgICAgZmlsdGVyZWREYXRhOiBudWxsLFxuXG4gICAgICAgIC8vIOaOkuW6j1xuICAgICAgICBzb3J0aW5nQ29sdW1uOiBudWxsLFxuICAgICAgICBzb3J0UHJvcDogbnVsbCxcbiAgICAgICAgc29ydE9yZGVyOiBudWxsLFxuXG4gICAgICAgIGhvdmVyUm93OiBudWxsXG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuXG4gIG1peGluczogW2V4cGFuZCwgc3RvcmVfY3VycmVudCwgdHJlZV0sXG5cbiAgbWV0aG9kczoge1xuICAgIC8vIOajgOafpSByb3dLZXkg5piv5ZCm5a2Y5ZyoXG4gICAgYXNzZXJ0Um93S2V5OiBmdW5jdGlvbiBhc3NlcnRSb3dLZXkoKSB7XG4gICAgICB2YXIgcm93S2V5ID0gdGhpcy5zdGF0ZXMucm93S2V5O1xuICAgICAgaWYgKCFyb3dLZXkpIHRocm93IG5ldyBFcnJvcignW0VsVGFibGVdIHByb3Agcm93LWtleSBpcyByZXF1aXJlZCcpO1xuICAgIH0sXG5cblxuICAgIC8vIOabtOaWsOWIl1xuICAgIHVwZGF0ZUNvbHVtbnM6IGZ1bmN0aW9uIHVwZGF0ZUNvbHVtbnMoKSB7XG4gICAgICB2YXIgc3RhdGVzID0gdGhpcy5zdGF0ZXM7XG4gICAgICB2YXIgX2NvbHVtbnMgPSBzdGF0ZXMuX2NvbHVtbnMgfHwgW107XG4gICAgICBzdGF0ZXMuZml4ZWRDb2x1bW5zID0gX2NvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5maXhlZCA9PT0gdHJ1ZSB8fCBjb2x1bW4uZml4ZWQgPT09ICdsZWZ0JztcbiAgICAgIH0pO1xuICAgICAgc3RhdGVzLnJpZ2h0Rml4ZWRDb2x1bW5zID0gX2NvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5maXhlZCA9PT0gJ3JpZ2h0JztcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc3RhdGVzLmZpeGVkQ29sdW1ucy5sZW5ndGggPiAwICYmIF9jb2x1bW5zWzBdICYmIF9jb2x1bW5zWzBdLnR5cGUgPT09ICdzZWxlY3Rpb24nICYmICFfY29sdW1uc1swXS5maXhlZCkge1xuICAgICAgICBfY29sdW1uc1swXS5maXhlZCA9IHRydWU7XG4gICAgICAgIHN0YXRlcy5maXhlZENvbHVtbnMudW5zaGlmdChfY29sdW1uc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBub3RGaXhlZENvbHVtbnMgPSBfY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gIWNvbHVtbi5maXhlZDtcbiAgICAgIH0pO1xuICAgICAgc3RhdGVzLm9yaWdpbkNvbHVtbnMgPSBbXS5jb25jYXQoc3RhdGVzLmZpeGVkQ29sdW1ucykuY29uY2F0KG5vdEZpeGVkQ29sdW1ucykuY29uY2F0KHN0YXRlcy5yaWdodEZpeGVkQ29sdW1ucyk7XG5cbiAgICAgIHZhciBsZWFmQ29sdW1ucyA9IGRvRmxhdHRlbkNvbHVtbnMobm90Rml4ZWRDb2x1bW5zKTtcbiAgICAgIHZhciBmaXhlZExlYWZDb2x1bW5zID0gZG9GbGF0dGVuQ29sdW1ucyhzdGF0ZXMuZml4ZWRDb2x1bW5zKTtcbiAgICAgIHZhciByaWdodEZpeGVkTGVhZkNvbHVtbnMgPSBkb0ZsYXR0ZW5Db2x1bW5zKHN0YXRlcy5yaWdodEZpeGVkQ29sdW1ucyk7XG5cbiAgICAgIHN0YXRlcy5sZWFmQ29sdW1uc0xlbmd0aCA9IGxlYWZDb2x1bW5zLmxlbmd0aDtcbiAgICAgIHN0YXRlcy5maXhlZExlYWZDb2x1bW5zTGVuZ3RoID0gZml4ZWRMZWFmQ29sdW1ucy5sZW5ndGg7XG4gICAgICBzdGF0ZXMucmlnaHRGaXhlZExlYWZDb2x1bW5zTGVuZ3RoID0gcmlnaHRGaXhlZExlYWZDb2x1bW5zLmxlbmd0aDtcblxuICAgICAgc3RhdGVzLmNvbHVtbnMgPSBbXS5jb25jYXQoZml4ZWRMZWFmQ29sdW1ucykuY29uY2F0KGxlYWZDb2x1bW5zKS5jb25jYXQocmlnaHRGaXhlZExlYWZDb2x1bW5zKTtcbiAgICAgIHN0YXRlcy5pc0NvbXBsZXggPSBzdGF0ZXMuZml4ZWRDb2x1bW5zLmxlbmd0aCA+IDAgfHwgc3RhdGVzLnJpZ2h0Rml4ZWRDb2x1bW5zLmxlbmd0aCA+IDA7XG4gICAgfSxcblxuXG4gICAgLy8g5pu05pawIERPTVxuICAgIHNjaGVkdWxlTGF5b3V0OiBmdW5jdGlvbiBzY2hlZHVsZUxheW91dChuZWVkVXBkYXRlQ29sdW1ucykge1xuICAgICAgaWYgKG5lZWRVcGRhdGVDb2x1bW5zKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucygpO1xuICAgICAgfVxuICAgICAgdGhpcy50YWJsZS5kZWJvdW5jZWRVcGRhdGVMYXlvdXQoKTtcbiAgICB9LFxuXG5cbiAgICAvLyDpgInmi6lcbiAgICBpc1NlbGVjdGVkOiBmdW5jdGlvbiBpc1NlbGVjdGVkKHJvdykge1xuICAgICAgdmFyIF9zdGF0ZXMkc2VsZWN0aW9uID0gdGhpcy5zdGF0ZXMuc2VsZWN0aW9uLFxuICAgICAgICAgIHNlbGVjdGlvbiA9IF9zdGF0ZXMkc2VsZWN0aW9uID09PSB1bmRlZmluZWQgPyBbXSA6IF9zdGF0ZXMkc2VsZWN0aW9uO1xuXG4gICAgICByZXR1cm4gc2VsZWN0aW9uLmluZGV4T2Yocm93KSA+IC0xO1xuICAgIH0sXG4gICAgY2xlYXJTZWxlY3Rpb246IGZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgICAgdmFyIHN0YXRlcyA9IHRoaXMuc3RhdGVzO1xuICAgICAgc3RhdGVzLmlzQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHZhciBvbGRTZWxlY3Rpb24gPSBzdGF0ZXMuc2VsZWN0aW9uO1xuICAgICAgaWYgKG9sZFNlbGVjdGlvbi5sZW5ndGgpIHtcbiAgICAgICAgc3RhdGVzLnNlbGVjdGlvbiA9IFtdO1xuICAgICAgICB0aGlzLnRhYmxlLiRlbWl0KCdzZWxlY3Rpb24tY2hhbmdlJywgW10pO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xlYW5TZWxlY3Rpb246IGZ1bmN0aW9uIGNsZWFuU2VsZWN0aW9uKCkge1xuICAgICAgdmFyIHN0YXRlcyA9IHRoaXMuc3RhdGVzO1xuICAgICAgdmFyIGRhdGEgPSBzdGF0ZXMuZGF0YSxcbiAgICAgICAgICByb3dLZXkgPSBzdGF0ZXMucm93S2V5LFxuICAgICAgICAgIHNlbGVjdGlvbiA9IHN0YXRlcy5zZWxlY3Rpb247XG5cbiAgICAgIHZhciBkZWxldGVkID0gdm9pZCAwO1xuICAgICAgaWYgKHJvd0tleSkge1xuICAgICAgICBkZWxldGVkID0gW107XG4gICAgICAgIHZhciBzZWxlY3RlZE1hcCA9IGdldEtleXNNYXAoc2VsZWN0aW9uLCByb3dLZXkpO1xuICAgICAgICB2YXIgZGF0YU1hcCA9IGdldEtleXNNYXAoZGF0YSwgcm93S2V5KTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGVjdGVkTWFwKSB7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkTWFwLmhhc093blByb3BlcnR5KGtleSkgJiYgIWRhdGFNYXBba2V5XSkge1xuICAgICAgICAgICAgZGVsZXRlZC5wdXNoKHNlbGVjdGVkTWFwW2tleV0ucm93KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZWQgPSBzZWxlY3Rpb24uZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEuaW5kZXhPZihpdGVtKSA9PT0gLTE7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGRlbGV0ZWQubGVuZ3RoKSB7XG4gICAgICAgIHZhciBuZXdTZWxlY3Rpb24gPSBzZWxlY3Rpb24uZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGRlbGV0ZWQuaW5kZXhPZihpdGVtKSA9PT0gLTE7XG4gICAgICAgIH0pO1xuICAgICAgICBzdGF0ZXMuc2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uO1xuICAgICAgICB0aGlzLnRhYmxlLiRlbWl0KCdzZWxlY3Rpb24tY2hhbmdlJywgbmV3U2VsZWN0aW9uLnNsaWNlKCkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgdG9nZ2xlUm93U2VsZWN0aW9uOiBmdW5jdGlvbiB0b2dnbGVSb3dTZWxlY3Rpb24ocm93LCBzZWxlY3RlZCkge1xuICAgICAgdmFyIGVtaXRDaGFuZ2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG5cbiAgICAgIHZhciBjaGFuZ2VkID0gdG9nZ2xlUm93U3RhdHVzKHRoaXMuc3RhdGVzLnNlbGVjdGlvbiwgcm93LCBzZWxlY3RlZCk7XG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICB2YXIgbmV3U2VsZWN0aW9uID0gKHRoaXMuc3RhdGVzLnNlbGVjdGlvbiB8fCBbXSkuc2xpY2UoKTtcbiAgICAgICAgLy8g6LCD55SoIEFQSSDkv67mlLnpgInkuK3lgLzvvIzkuI3op6blj5Egc2VsZWN0IOS6i+S7tlxuICAgICAgICBpZiAoZW1pdENoYW5nZSkge1xuICAgICAgICAgIHRoaXMudGFibGUuJGVtaXQoJ3NlbGVjdCcsIG5ld1NlbGVjdGlvbiwgcm93KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlLiRlbWl0KCdzZWxlY3Rpb24tY2hhbmdlJywgbmV3U2VsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIF90b2dnbGVBbGxTZWxlY3Rpb246IGZ1bmN0aW9uIF90b2dnbGVBbGxTZWxlY3Rpb24oKSB7XG4gICAgICB2YXIgc3RhdGVzID0gdGhpcy5zdGF0ZXM7XG4gICAgICB2YXIgX3N0YXRlcyRkYXRhID0gc3RhdGVzLmRhdGEsXG4gICAgICAgICAgZGF0YSA9IF9zdGF0ZXMkZGF0YSA9PT0gdW5kZWZpbmVkID8gW10gOiBfc3RhdGVzJGRhdGEsXG4gICAgICAgICAgc2VsZWN0aW9uID0gc3RhdGVzLnNlbGVjdGlvbjtcbiAgICAgIC8vIHdoZW4gb25seSBzb21lIHJvd3MgYXJlIHNlbGVjdGVkIChidXQgbm90IGFsbCksIHNlbGVjdCBvciBkZXNlbGVjdCBhbGwgb2YgdGhlbVxuICAgICAgLy8gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBzZWxlY3RPbkluZGV0ZXJtaW5hdGVcblxuICAgICAgdmFyIHZhbHVlID0gc3RhdGVzLnNlbGVjdE9uSW5kZXRlcm1pbmF0ZSA/ICFzdGF0ZXMuaXNBbGxTZWxlY3RlZCA6ICEoc3RhdGVzLmlzQWxsU2VsZWN0ZWQgfHwgc2VsZWN0aW9uLmxlbmd0aCk7XG4gICAgICBzdGF0ZXMuaXNBbGxTZWxlY3RlZCA9IHZhbHVlO1xuXG4gICAgICB2YXIgc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGluZGV4KSB7XG4gICAgICAgIGlmIChzdGF0ZXMuc2VsZWN0YWJsZSkge1xuICAgICAgICAgIGlmIChzdGF0ZXMuc2VsZWN0YWJsZS5jYWxsKG51bGwsIHJvdywgaW5kZXgpICYmIHRvZ2dsZVJvd1N0YXR1cyhzZWxlY3Rpb24sIHJvdywgdmFsdWUpKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRvZ2dsZVJvd1N0YXR1cyhzZWxlY3Rpb24sIHJvdywgdmFsdWUpKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc2VsZWN0aW9uQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLnRhYmxlLiRlbWl0KCdzZWxlY3Rpb24tY2hhbmdlJywgc2VsZWN0aW9uID8gc2VsZWN0aW9uLnNsaWNlKCkgOiBbXSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRhYmxlLiRlbWl0KCdzZWxlY3QtYWxsJywgc2VsZWN0aW9uKTtcbiAgICB9LFxuICAgIHVwZGF0ZVNlbGVjdGlvbkJ5Um93S2V5OiBmdW5jdGlvbiB1cGRhdGVTZWxlY3Rpb25CeVJvd0tleSgpIHtcbiAgICAgIHZhciBzdGF0ZXMgPSB0aGlzLnN0YXRlcztcbiAgICAgIHZhciBzZWxlY3Rpb24gPSBzdGF0ZXMuc2VsZWN0aW9uLFxuICAgICAgICAgIHJvd0tleSA9IHN0YXRlcy5yb3dLZXksXG4gICAgICAgICAgZGF0YSA9IHN0YXRlcy5kYXRhO1xuXG4gICAgICB2YXIgc2VsZWN0ZWRNYXAgPSBnZXRLZXlzTWFwKHNlbGVjdGlvbiwgcm93S2V5KTtcbiAgICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgIHZhciByb3dJZCA9IGdldFJvd0lkZW50aXR5KHJvdywgcm93S2V5KTtcbiAgICAgICAgdmFyIHJvd0luZm8gPSBzZWxlY3RlZE1hcFtyb3dJZF07XG4gICAgICAgIGlmIChyb3dJbmZvKSB7XG4gICAgICAgICAgc2VsZWN0aW9uW3Jvd0luZm8uaW5kZXhdID0gcm93O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHVwZGF0ZUFsbFNlbGVjdGVkOiBmdW5jdGlvbiB1cGRhdGVBbGxTZWxlY3RlZCgpIHtcbiAgICAgIHZhciBzdGF0ZXMgPSB0aGlzLnN0YXRlcztcbiAgICAgIHZhciBzZWxlY3Rpb24gPSBzdGF0ZXMuc2VsZWN0aW9uLFxuICAgICAgICAgIHJvd0tleSA9IHN0YXRlcy5yb3dLZXksXG4gICAgICAgICAgc2VsZWN0YWJsZSA9IHN0YXRlcy5zZWxlY3RhYmxlO1xuICAgICAgLy8gZGF0YSDkuLogbnVsbCDml7bvvIzop6PmnoTml7bnmoTpu5jorqTlgLzkvJrooqvlv73nlaVcblxuICAgICAgdmFyIGRhdGEgPSBzdGF0ZXMuZGF0YSB8fCBbXTtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzdGF0ZXMuaXNBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzZWxlY3RlZE1hcCA9IHZvaWQgMDtcbiAgICAgIGlmIChyb3dLZXkpIHtcbiAgICAgICAgc2VsZWN0ZWRNYXAgPSBnZXRLZXlzTWFwKHNlbGVjdGlvbiwgcm93S2V5KTtcbiAgICAgIH1cbiAgICAgIHZhciBpc1NlbGVjdGVkID0gZnVuY3Rpb24gaXNTZWxlY3RlZChyb3cpIHtcbiAgICAgICAgaWYgKHNlbGVjdGVkTWFwKSB7XG4gICAgICAgICAgcmV0dXJuICEhc2VsZWN0ZWRNYXBbZ2V0Um93SWRlbnRpdHkocm93LCByb3dLZXkpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmluZGV4T2Yocm93KSAhPT0gLTE7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgaXNBbGxTZWxlY3RlZCA9IHRydWU7XG4gICAgICB2YXIgc2VsZWN0ZWRDb3VudCA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGRhdGEubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgIHZhciBpdGVtID0gZGF0YVtpXTtcbiAgICAgICAgdmFyIGlzUm93U2VsZWN0YWJsZSA9IHNlbGVjdGFibGUgJiYgc2VsZWN0YWJsZS5jYWxsKG51bGwsIGl0ZW0sIGkpO1xuICAgICAgICBpZiAoIWlzU2VsZWN0ZWQoaXRlbSkpIHtcbiAgICAgICAgICBpZiAoIXNlbGVjdGFibGUgfHwgaXNSb3dTZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICBpc0FsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0ZWRDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RlZENvdW50ID09PSAwKSBpc0FsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICBzdGF0ZXMuaXNBbGxTZWxlY3RlZCA9IGlzQWxsU2VsZWN0ZWQ7XG4gICAgfSxcblxuXG4gICAgLy8g6L+H5ruk5LiO5o6S5bqPXG4gICAgdXBkYXRlRmlsdGVyczogZnVuY3Rpb24gdXBkYXRlRmlsdGVycyhjb2x1bW5zLCB2YWx1ZXMpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb2x1bW5zKSkge1xuICAgICAgICBjb2x1bW5zID0gW2NvbHVtbnNdO1xuICAgICAgfVxuICAgICAgdmFyIHN0YXRlcyA9IHRoaXMuc3RhdGVzO1xuICAgICAgdmFyIGZpbHRlcnMgPSB7fTtcbiAgICAgIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sKSB7XG4gICAgICAgIHN0YXRlcy5maWx0ZXJzW2NvbC5pZF0gPSB2YWx1ZXM7XG4gICAgICAgIGZpbHRlcnNbY29sLmNvbHVtbktleSB8fCBjb2wuaWRdID0gdmFsdWVzO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgIH0sXG4gICAgdXBkYXRlU29ydDogZnVuY3Rpb24gdXBkYXRlU29ydChjb2x1bW4sIHByb3AsIG9yZGVyKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZXMuc29ydGluZ0NvbHVtbiAmJiB0aGlzLnN0YXRlcy5zb3J0aW5nQ29sdW1uICE9PSBjb2x1bW4pIHtcbiAgICAgICAgdGhpcy5zdGF0ZXMuc29ydGluZ0NvbHVtbi5vcmRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXRlcy5zb3J0aW5nQ29sdW1uID0gY29sdW1uO1xuICAgICAgdGhpcy5zdGF0ZXMuc29ydFByb3AgPSBwcm9wO1xuICAgICAgdGhpcy5zdGF0ZXMuc29ydE9yZGVyID0gb3JkZXI7XG4gICAgfSxcbiAgICBleGVjRmlsdGVyOiBmdW5jdGlvbiBleGVjRmlsdGVyKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHN0YXRlcyA9IHRoaXMuc3RhdGVzO1xuICAgICAgdmFyIF9kYXRhID0gc3RhdGVzLl9kYXRhLFxuICAgICAgICAgIGZpbHRlcnMgPSBzdGF0ZXMuZmlsdGVycztcblxuICAgICAgdmFyIGRhdGEgPSBfZGF0YTtcblxuICAgICAgT2JqZWN0LmtleXMoZmlsdGVycykuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uSWQpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHN0YXRlcy5maWx0ZXJzW2NvbHVtbklkXTtcbiAgICAgICAgaWYgKCF2YWx1ZXMgfHwgdmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICB2YXIgY29sdW1uID0gZ2V0Q29sdW1uQnlJZChfdGhpcy5zdGF0ZXMsIGNvbHVtbklkKTtcbiAgICAgICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZmlsdGVyTWV0aG9kKSB7XG4gICAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuc29tZShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5maWx0ZXJNZXRob2QuY2FsbChudWxsLCB2YWx1ZSwgcm93LCBjb2x1bW4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzdGF0ZXMuZmlsdGVyZWREYXRhID0gZGF0YTtcbiAgICB9LFxuICAgIGV4ZWNTb3J0OiBmdW5jdGlvbiBleGVjU29ydCgpIHtcbiAgICAgIHZhciBzdGF0ZXMgPSB0aGlzLnN0YXRlcztcbiAgICAgIHN0YXRlcy5kYXRhID0gd2F0Y2hlcl9zb3J0RGF0YShzdGF0ZXMuZmlsdGVyZWREYXRhLCBzdGF0ZXMpO1xuICAgIH0sXG5cblxuICAgIC8vIOagueaNriBmaWx0ZXJzIOS4jiBzb3J0IOWOu+i/h+a7pCBkYXRhXG4gICAgZXhlY1F1ZXJ5OiBmdW5jdGlvbiBleGVjUXVlcnkoaWdub3JlKSB7XG4gICAgICBpZiAoIShpZ25vcmUgJiYgaWdub3JlLmZpbHRlcikpIHtcbiAgICAgICAgdGhpcy5leGVjRmlsdGVyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmV4ZWNTb3J0KCk7XG4gICAgfSxcbiAgICBjbGVhckZpbHRlcjogZnVuY3Rpb24gY2xlYXJGaWx0ZXIoY29sdW1uS2V5cykge1xuICAgICAgdmFyIHN0YXRlcyA9IHRoaXMuc3RhdGVzO1xuICAgICAgdmFyIF90YWJsZSQkcmVmcyA9IHRoaXMudGFibGUuJHJlZnMsXG4gICAgICAgICAgdGFibGVIZWFkZXIgPSBfdGFibGUkJHJlZnMudGFibGVIZWFkZXIsXG4gICAgICAgICAgZml4ZWRUYWJsZUhlYWRlciA9IF90YWJsZSQkcmVmcy5maXhlZFRhYmxlSGVhZGVyLFxuICAgICAgICAgIHJpZ2h0Rml4ZWRUYWJsZUhlYWRlciA9IF90YWJsZSQkcmVmcy5yaWdodEZpeGVkVGFibGVIZWFkZXI7XG5cblxuICAgICAgdmFyIHBhbmVscyA9IHt9O1xuICAgICAgaWYgKHRhYmxlSGVhZGVyKSBwYW5lbHMgPSBtZXJnZV9kZWZhdWx0KCkocGFuZWxzLCB0YWJsZUhlYWRlci5maWx0ZXJQYW5lbHMpO1xuICAgICAgaWYgKGZpeGVkVGFibGVIZWFkZXIpIHBhbmVscyA9IG1lcmdlX2RlZmF1bHQoKShwYW5lbHMsIGZpeGVkVGFibGVIZWFkZXIuZmlsdGVyUGFuZWxzKTtcbiAgICAgIGlmIChyaWdodEZpeGVkVGFibGVIZWFkZXIpIHBhbmVscyA9IG1lcmdlX2RlZmF1bHQoKShwYW5lbHMsIHJpZ2h0Rml4ZWRUYWJsZUhlYWRlci5maWx0ZXJQYW5lbHMpO1xuXG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHBhbmVscyk7XG4gICAgICBpZiAoIWtleXMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgIGlmICh0eXBlb2YgY29sdW1uS2V5cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29sdW1uS2V5cyA9IFtjb2x1bW5LZXlzXTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sdW1uS2V5cykpIHtcbiAgICAgICAgdmFyIGNvbHVtbnMgPSBjb2x1bW5LZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGdldENvbHVtbkJ5S2V5KHN0YXRlcywga2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgdmFyIGNvbHVtbiA9IGNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sLmlkID09PSBrZXk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgLy8gVE9ETzog5LyY5YyW6L+Z6YeM55qE5Luj56CBXG4gICAgICAgICAgICBwYW5lbHNba2V5XS5maWx0ZXJlZFZhbHVlID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb21taXQoJ2ZpbHRlckNoYW5nZScsIHtcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbnMsXG4gICAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIC8vIFRPRE86IOS8mOWMlui/memHjOeahOS7o+eggVxuICAgICAgICAgIHBhbmVsc1trZXldLmZpbHRlcmVkVmFsdWUgPSBbXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3RhdGVzLmZpbHRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5jb21taXQoJ2ZpbHRlckNoYW5nZScsIHtcbiAgICAgICAgICBjb2x1bW46IHt9LFxuICAgICAgICAgIHZhbHVlczogW10sXG4gICAgICAgICAgc2lsZW50OiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xlYXJTb3J0OiBmdW5jdGlvbiBjbGVhclNvcnQoKSB7XG4gICAgICB2YXIgc3RhdGVzID0gdGhpcy5zdGF0ZXM7XG4gICAgICBpZiAoIXN0YXRlcy5zb3J0aW5nQ29sdW1uKSByZXR1cm47XG5cbiAgICAgIHRoaXMudXBkYXRlU29ydChudWxsLCBudWxsLCBudWxsKTtcbiAgICAgIHRoaXMuY29tbWl0KCdjaGFuZ2VTb3J0Q29uZGl0aW9uJywge1xuICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0sXG5cblxuICAgIC8vIOmAgumFjeWxgu+8jGV4cGFuZC1yb3cta2V5cyDlnKggRXhwYW5kIOS4jiBUcmVlVGFibGUg5Lit6YO95pyJ5L2/55SoXG4gICAgc2V0RXhwYW5kUm93S2V5c0FkYXB0ZXI6IGZ1bmN0aW9uIHNldEV4cGFuZFJvd0tleXNBZGFwdGVyKHZhbCkge1xuICAgICAgLy8g6L+Z6YeM5Lya6Kem5Y+R6aKd5aSW55qE6K6h566X77yM5L2G5Li65LqG5YW85a655oCn77yM5pqC5pe26L+Z5LmI5YGaXG4gICAgICB0aGlzLnNldEV4cGFuZFJvd0tleXModmFsKTtcbiAgICAgIHRoaXMudXBkYXRlVHJlZUV4cGFuZEtleXModmFsKTtcbiAgICB9LFxuXG5cbiAgICAvLyDlsZXlvIDooYzkuI4gVHJlZVRhYmxlIOmDveimgeS9v+eUqFxuICAgIHRvZ2dsZVJvd0V4cGFuc2lvbkFkYXB0ZXI6IGZ1bmN0aW9uIHRvZ2dsZVJvd0V4cGFuc2lvbkFkYXB0ZXIocm93LCBleHBhbmRlZCkge1xuICAgICAgdmFyIGhhc0V4cGFuZENvbHVtbiA9IHRoaXMuc3RhdGVzLmNvbHVtbnMuc29tZShmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgdHlwZSA9IF9yZWYudHlwZTtcbiAgICAgICAgcmV0dXJuIHR5cGUgPT09ICdleHBhbmQnO1xuICAgICAgfSk7XG4gICAgICBpZiAoaGFzRXhwYW5kQ29sdW1uKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlUm93RXhwYW5zaW9uKHJvdywgZXhwYW5kZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2dnbGVUcmVlRXhwYW5zaW9uKHJvdywgZXhwYW5kZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSkpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvc3RvcmUvaW5kZXguanNcblxuXG5cblxud2F0Y2hlci5wcm90b3R5cGUubXV0YXRpb25zID0ge1xuICBzZXREYXRhOiBmdW5jdGlvbiBzZXREYXRhKHN0YXRlcywgZGF0YSkge1xuICAgIHZhciBkYXRhSW5zdGFuY2VDaGFuZ2VkID0gc3RhdGVzLl9kYXRhICE9PSBkYXRhO1xuICAgIHN0YXRlcy5fZGF0YSA9IGRhdGE7XG5cbiAgICB0aGlzLmV4ZWNRdWVyeSgpO1xuICAgIC8vIOaVsOaNruWPmOWMlu+8jOabtOaWsOmDqOWIhuaVsOaNruOAglxuICAgIC8vIOayoeacieS9v+eUqCBjb21wdXRlZO+8jOiAjOaYr+aJi+WKqOabtOaWsOmDqOWIhuaVsOaNriBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlL2lzc3Vlcy82NjYwI2lzc3VlY29tbWVudC0zMzE0MTcxNDBcbiAgICB0aGlzLnVwZGF0ZUN1cnJlbnRSb3dEYXRhKCk7XG4gICAgdGhpcy51cGRhdGVFeHBhbmRSb3dzKCk7XG4gICAgaWYgKHN0YXRlcy5yZXNlcnZlU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmFzc2VydFJvd0tleSgpO1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25CeVJvd0tleSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YUluc3RhbmNlQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsZWFuU2VsZWN0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQWxsU2VsZWN0ZWQoKTtcblxuICAgIHRoaXMudXBkYXRlVGFibGVTY3JvbGxZKCk7XG4gIH0sXG4gIGluc2VydENvbHVtbjogZnVuY3Rpb24gaW5zZXJ0Q29sdW1uKHN0YXRlcywgY29sdW1uLCBpbmRleCwgcGFyZW50KSB7XG4gICAgdmFyIGFycmF5ID0gc3RhdGVzLl9jb2x1bW5zO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGFycmF5ID0gcGFyZW50LmNoaWxkcmVuO1xuICAgICAgaWYgKCFhcnJheSkgYXJyYXkgPSBwYXJlbnQuY2hpbGRyZW4gPSBbXTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluZGV4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAwLCBjb2x1bW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcnJheS5wdXNoKGNvbHVtbik7XG4gICAgfVxuXG4gICAgaWYgKGNvbHVtbi50eXBlID09PSAnc2VsZWN0aW9uJykge1xuICAgICAgc3RhdGVzLnNlbGVjdGFibGUgPSBjb2x1bW4uc2VsZWN0YWJsZTtcbiAgICAgIHN0YXRlcy5yZXNlcnZlU2VsZWN0aW9uID0gY29sdW1uLnJlc2VydmVTZWxlY3Rpb247XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFibGUuJHJlYWR5KSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTsgLy8gaGFjayBmb3IgZHluYW1pY3MgaW5zZXJ0IGNvbHVtblxuICAgICAgdGhpcy5zY2hlZHVsZUxheW91dCgpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlQ29sdW1uOiBmdW5jdGlvbiByZW1vdmVDb2x1bW4oc3RhdGVzLCBjb2x1bW4sIHBhcmVudCkge1xuICAgIHZhciBhcnJheSA9IHN0YXRlcy5fY29sdW1ucztcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBhcnJheSA9IHBhcmVudC5jaGlsZHJlbjtcbiAgICAgIGlmICghYXJyYXkpIGFycmF5ID0gcGFyZW50LmNoaWxkcmVuID0gW107XG4gICAgfVxuICAgIGlmIChhcnJheSkge1xuICAgICAgYXJyYXkuc3BsaWNlKGFycmF5LmluZGV4T2YoY29sdW1uKSwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFibGUuJHJlYWR5KSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTsgLy8gaGFjayBmb3IgZHluYW1pY3MgcmVtb3ZlIGNvbHVtblxuICAgICAgdGhpcy5zY2hlZHVsZUxheW91dCgpO1xuICAgIH1cbiAgfSxcbiAgc29ydDogZnVuY3Rpb24gc29ydChzdGF0ZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgcHJvcCA9IG9wdGlvbnMucHJvcCxcbiAgICAgICAgb3JkZXIgPSBvcHRpb25zLm9yZGVyLFxuICAgICAgICBpbml0ID0gb3B0aW9ucy5pbml0O1xuXG4gICAgaWYgKHByb3ApIHtcbiAgICAgIHZhciBjb2x1bW4gPSBPYmplY3QodXRpbF9bXCJhcnJheUZpbmRcIl0pKHN0YXRlcy5jb2x1bW5zLCBmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBjb2x1bW4ucHJvcGVydHkgPT09IHByb3A7XG4gICAgICB9KTtcbiAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgY29sdW1uLm9yZGVyID0gb3JkZXI7XG4gICAgICAgIHRoaXMudXBkYXRlU29ydChjb2x1bW4sIHByb3AsIG9yZGVyKTtcbiAgICAgICAgdGhpcy5jb21taXQoJ2NoYW5nZVNvcnRDb25kaXRpb24nLCB7IGluaXQ6IGluaXQgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBjaGFuZ2VTb3J0Q29uZGl0aW9uOiBmdW5jdGlvbiBjaGFuZ2VTb3J0Q29uZGl0aW9uKHN0YXRlcywgb3B0aW9ucykge1xuICAgIC8vIOS/ruWkjSBwciBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L3B1bGwvMTUwMTIg5a+86Ie055qEIGJ1Z1xuICAgIHZhciBjb2x1bW4gPSBzdGF0ZXMuc29ydGluZ0NvbHVtbixcbiAgICAgICAgcHJvcCA9IHN0YXRlcy5zb3J0UHJvcCxcbiAgICAgICAgb3JkZXIgPSBzdGF0ZXMuc29ydE9yZGVyO1xuXG4gICAgaWYgKG9yZGVyID09PSBudWxsKSB7XG4gICAgICBzdGF0ZXMuc29ydGluZ0NvbHVtbiA9IG51bGw7XG4gICAgICBzdGF0ZXMuc29ydFByb3AgPSBudWxsO1xuICAgIH1cbiAgICB2YXIgaW5nb3JlID0geyBmaWx0ZXI6IHRydWUgfTtcbiAgICB0aGlzLmV4ZWNRdWVyeShpbmdvcmUpO1xuXG4gICAgaWYgKCFvcHRpb25zIHx8ICEob3B0aW9ucy5zaWxlbnQgfHwgb3B0aW9ucy5pbml0KSkge1xuICAgICAgdGhpcy50YWJsZS4kZW1pdCgnc29ydC1jaGFuZ2UnLCB7XG4gICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICBwcm9wOiBwcm9wLFxuICAgICAgICBvcmRlcjogb3JkZXJcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVGFibGVTY3JvbGxZKCk7XG4gIH0sXG4gIGZpbHRlckNoYW5nZTogZnVuY3Rpb24gZmlsdGVyQ2hhbmdlKHN0YXRlcywgb3B0aW9ucykge1xuICAgIHZhciBjb2x1bW4gPSBvcHRpb25zLmNvbHVtbixcbiAgICAgICAgdmFsdWVzID0gb3B0aW9ucy52YWx1ZXMsXG4gICAgICAgIHNpbGVudCA9IG9wdGlvbnMuc2lsZW50O1xuXG4gICAgdmFyIG5ld0ZpbHRlcnMgPSB0aGlzLnVwZGF0ZUZpbHRlcnMoY29sdW1uLCB2YWx1ZXMpO1xuXG4gICAgdGhpcy5leGVjUXVlcnkoKTtcblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLnRhYmxlLiRlbWl0KCdmaWx0ZXItY2hhbmdlJywgbmV3RmlsdGVycyk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVUYWJsZVNjcm9sbFkoKTtcbiAgfSxcbiAgdG9nZ2xlQWxsU2VsZWN0aW9uOiBmdW5jdGlvbiB0b2dnbGVBbGxTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy50b2dnbGVBbGxTZWxlY3Rpb24oKTtcbiAgfSxcbiAgcm93U2VsZWN0ZWRDaGFuZ2VkOiBmdW5jdGlvbiByb3dTZWxlY3RlZENoYW5nZWQoc3RhdGVzLCByb3cpIHtcbiAgICB0aGlzLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3cpO1xuICAgIHRoaXMudXBkYXRlQWxsU2VsZWN0ZWQoKTtcbiAgfSxcbiAgc2V0SG92ZXJSb3c6IGZ1bmN0aW9uIHNldEhvdmVyUm93KHN0YXRlcywgcm93KSB7XG4gICAgc3RhdGVzLmhvdmVyUm93ID0gcm93O1xuICB9LFxuICBzZXRDdXJyZW50Um93OiBmdW5jdGlvbiBzZXRDdXJyZW50Um93KHN0YXRlcywgcm93KSB7XG4gICAgdGhpcy51cGRhdGVDdXJyZW50Um93KHJvdyk7XG4gIH1cbn07XG5cbndhdGNoZXIucHJvdG90eXBlLmNvbW1pdCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciBtdXRhdGlvbnMgPSB0aGlzLm11dGF0aW9ucztcbiAgaWYgKG11dGF0aW9uc1tuYW1lXSkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgbXV0YXRpb25zW25hbWVdLmFwcGx5KHRoaXMsIFt0aGlzLnN0YXRlc10uY29uY2F0KGFyZ3MpKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGlvbiBub3QgZm91bmQ6ICcgKyBuYW1lKTtcbiAgfVxufTtcblxud2F0Y2hlci5wcm90b3R5cGUudXBkYXRlVGFibGVTY3JvbGxZID0gZnVuY3Rpb24gKCkge1xuICBleHRlcm5hbF92dWVfZGVmYXVsdC5hLm5leHRUaWNrKHRoaXMudGFibGUudXBkYXRlU2Nyb2xsWSk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfc3RvcmUgPSAod2F0Y2hlcik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy9zdG9yZS9oZWxwZXIuanNcblxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKHRhYmxlKSB7XG4gIHZhciBpbml0aWFsU3RhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gIGlmICghdGFibGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhYmxlIGlzIHJlcXVpcmVkLicpO1xuICB9XG5cbiAgdmFyIHN0b3JlID0gbmV3IHNyY19zdG9yZSgpO1xuICBzdG9yZS50YWJsZSA9IHRhYmxlO1xuICAvLyBmaXggaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvMTQwNzVcbiAgLy8gcmVsYXRlZCBwciBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L3B1bGwvMTQxNDZcbiAgc3RvcmUudG9nZ2xlQWxsU2VsZWN0aW9uID0gZGVib3VuY2VfZGVmYXVsdCgpKDEwLCBzdG9yZS5fdG9nZ2xlQWxsU2VsZWN0aW9uKTtcbiAgT2JqZWN0LmtleXMoaW5pdGlhbFN0YXRlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBzdG9yZS5zdGF0ZXNba2V5XSA9IGluaXRpYWxTdGF0ZVtrZXldO1xuICB9KTtcbiAgcmV0dXJuIHN0b3JlO1xufVxuXG5mdW5jdGlvbiBtYXBTdGF0ZXMobWFwcGVyKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgT2JqZWN0LmtleXMobWFwcGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgdmFsdWUgPSBtYXBwZXJba2V5XTtcbiAgICB2YXIgZm4gPSB2b2lkIDA7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZuID0gZnVuY3Rpb24gZm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnN0YXRlc1t2YWx1ZV07XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmbiA9IGZ1bmN0aW9uIGZuKCkge1xuICAgICAgICByZXR1cm4gdmFsdWUuY2FsbCh0aGlzLCB0aGlzLnN0b3JlLnN0YXRlcyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdpbnZhbGlkIHZhbHVlIHR5cGUnKTtcbiAgICB9XG4gICAgaWYgKGZuKSB7XG4gICAgICByZXNba2V5XSA9IGZuO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXM7XG59O1xuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Njcm9sbGJhci13aWR0aFwiXG52YXIgc2Nyb2xsYmFyX3dpZHRoXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpO1xudmFyIHNjcm9sbGJhcl93aWR0aF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzY3JvbGxiYXJfd2lkdGhfKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvdGFibGUtbGF5b3V0LmpzXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cblxuXG5cbnZhciB0YWJsZV9sYXlvdXRfVGFibGVMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRhYmxlTGF5b3V0KG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGFibGVMYXlvdXQpO1xuXG4gICAgdGhpcy5vYnNlcnZlcnMgPSBbXTtcbiAgICB0aGlzLnRhYmxlID0gbnVsbDtcbiAgICB0aGlzLnN0b3JlID0gbnVsbDtcbiAgICB0aGlzLmNvbHVtbnMgPSBudWxsO1xuICAgIHRoaXMuZml0ID0gdHJ1ZTtcbiAgICB0aGlzLnNob3dIZWFkZXIgPSB0cnVlO1xuXG4gICAgdGhpcy5oZWlnaHQgPSBudWxsO1xuICAgIHRoaXMuc2Nyb2xsWCA9IGZhbHNlO1xuICAgIHRoaXMuc2Nyb2xsWSA9IGZhbHNlO1xuICAgIHRoaXMuYm9keVdpZHRoID0gbnVsbDtcbiAgICB0aGlzLmZpeGVkV2lkdGggPSBudWxsO1xuICAgIHRoaXMucmlnaHRGaXhlZFdpZHRoID0gbnVsbDtcbiAgICB0aGlzLnRhYmxlSGVpZ2h0ID0gbnVsbDtcbiAgICB0aGlzLmhlYWRlckhlaWdodCA9IDQ0OyAvLyBUYWJsZSBIZWFkZXIgSGVpZ2h0XG4gICAgdGhpcy5hcHBlbmRIZWlnaHQgPSAwOyAvLyBBcHBlbmQgU2xvdCBIZWlnaHRcbiAgICB0aGlzLmZvb3RlckhlaWdodCA9IDQ0OyAvLyBUYWJsZSBGb290ZXIgSGVpZ2h0XG4gICAgdGhpcy52aWV3cG9ydEhlaWdodCA9IG51bGw7IC8vIFRhYmxlIEhlaWdodCAtIFNjcm9sbCBCYXIgSGVpZ2h0XG4gICAgdGhpcy5ib2R5SGVpZ2h0ID0gbnVsbDsgLy8gVGFibGUgSGVpZ2h0IC0gVGFibGUgSGVhZGVyIEhlaWdodFxuICAgIHRoaXMuZml4ZWRCb2R5SGVpZ2h0ID0gbnVsbDsgLy8gVGFibGUgSGVpZ2h0IC0gVGFibGUgSGVhZGVyIEhlaWdodCAtIFNjcm9sbCBCYXIgSGVpZ2h0XG4gICAgdGhpcy5ndXR0ZXJXaWR0aCA9IHNjcm9sbGJhcl93aWR0aF9kZWZhdWx0KCkoKTtcblxuICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgdGhpc1tuYW1lXSA9IG9wdGlvbnNbbmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnRhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhYmxlIGlzIHJlcXVpcmVkIGZvciBUYWJsZSBMYXlvdXQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnN0b3JlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0b3JlIGlzIHJlcXVpcmVkIGZvciBUYWJsZSBMYXlvdXQnKTtcbiAgICB9XG4gIH1cblxuICBUYWJsZUxheW91dC5wcm90b3R5cGUudXBkYXRlU2Nyb2xsWSA9IGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFkoKSB7XG4gICAgdmFyIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgIGlmIChoZWlnaHQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgYm9keVdyYXBwZXIgPSB0aGlzLnRhYmxlLmJvZHlXcmFwcGVyO1xuICAgIGlmICh0aGlzLnRhYmxlLiRlbCAmJiBib2R5V3JhcHBlcikge1xuICAgICAgdmFyIGJvZHkgPSBib2R5V3JhcHBlci5xdWVyeVNlbGVjdG9yKCcuZWwtdGFibGVfX2JvZHknKTtcbiAgICAgIHZhciBwcmV2U2Nyb2xsWSA9IHRoaXMuc2Nyb2xsWTtcbiAgICAgIHZhciBzY3JvbGxZID0gYm9keS5vZmZzZXRIZWlnaHQgPiB0aGlzLmJvZHlIZWlnaHQ7XG4gICAgICB0aGlzLnNjcm9sbFkgPSBzY3JvbGxZO1xuICAgICAgcmV0dXJuIHByZXZTY3JvbGxZICE9PSBzY3JvbGxZO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgVGFibGVMYXlvdXQucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uIHNldEhlaWdodCh2YWx1ZSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgcHJvcCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ2hlaWdodCc7XG5cbiAgICBpZiAoZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5wcm90b3R5cGUuJGlzU2VydmVyKSByZXR1cm47XG4gICAgdmFyIGVsID0gdGhpcy50YWJsZS4kZWw7XG4gICAgdmFsdWUgPSBwYXJzZUhlaWdodCh2YWx1ZSk7XG4gICAgdGhpcy5oZWlnaHQgPSB2YWx1ZTtcblxuICAgIGlmICghZWwgJiYgKHZhbHVlIHx8IHZhbHVlID09PSAwKSkgcmV0dXJuIGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnNldEhlaWdodCh2YWx1ZSwgcHJvcCk7XG4gICAgfSk7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgZWwuc3R5bGVbcHJvcF0gPSB2YWx1ZSArICdweCc7XG4gICAgICB0aGlzLnVwZGF0ZUVsc0hlaWdodCgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgZWwuc3R5bGVbcHJvcF0gPSB2YWx1ZTtcbiAgICAgIHRoaXMudXBkYXRlRWxzSGVpZ2h0KCk7XG4gICAgfVxuICB9O1xuXG4gIFRhYmxlTGF5b3V0LnByb3RvdHlwZS5zZXRNYXhIZWlnaHQgPSBmdW5jdGlvbiBzZXRNYXhIZWlnaHQodmFsdWUpIHtcbiAgICB0aGlzLnNldEhlaWdodCh2YWx1ZSwgJ21heC1oZWlnaHQnKTtcbiAgfTtcblxuICBUYWJsZUxheW91dC5wcm90b3R5cGUuZ2V0RmxhdHRlbkNvbHVtbnMgPSBmdW5jdGlvbiBnZXRGbGF0dGVuQ29sdW1ucygpIHtcbiAgICB2YXIgZmxhdHRlbkNvbHVtbnMgPSBbXTtcbiAgICB2YXIgY29sdW1ucyA9IHRoaXMudGFibGUuY29sdW1ucztcbiAgICBjb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgaWYgKGNvbHVtbi5pc0NvbHVtbkdyb3VwKSB7XG4gICAgICAgIGZsYXR0ZW5Db2x1bW5zLnB1c2guYXBwbHkoZmxhdHRlbkNvbHVtbnMsIGNvbHVtbi5jb2x1bW5zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsYXR0ZW5Db2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmbGF0dGVuQ29sdW1ucztcbiAgfTtcblxuICBUYWJsZUxheW91dC5wcm90b3R5cGUudXBkYXRlRWxzSGVpZ2h0ID0gZnVuY3Rpb24gdXBkYXRlRWxzSGVpZ2h0KCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKCF0aGlzLnRhYmxlLiRyZWFkeSkgcmV0dXJuIGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzMi51cGRhdGVFbHNIZWlnaHQoKTtcbiAgICB9KTtcbiAgICB2YXIgX3RhYmxlJCRyZWZzID0gdGhpcy50YWJsZS4kcmVmcyxcbiAgICAgICAgaGVhZGVyV3JhcHBlciA9IF90YWJsZSQkcmVmcy5oZWFkZXJXcmFwcGVyLFxuICAgICAgICBhcHBlbmRXcmFwcGVyID0gX3RhYmxlJCRyZWZzLmFwcGVuZFdyYXBwZXIsXG4gICAgICAgIGZvb3RlcldyYXBwZXIgPSBfdGFibGUkJHJlZnMuZm9vdGVyV3JhcHBlcjtcblxuICAgIHRoaXMuYXBwZW5kSGVpZ2h0ID0gYXBwZW5kV3JhcHBlciA/IGFwcGVuZFdyYXBwZXIub2Zmc2V0SGVpZ2h0IDogMDtcblxuICAgIGlmICh0aGlzLnNob3dIZWFkZXIgJiYgIWhlYWRlcldyYXBwZXIpIHJldHVybjtcblxuICAgIC8vIGZpeCBpc3N1ZSAoaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9wdWxsLzE2OTU2KVxuICAgIHZhciBoZWFkZXJUckVsbSA9IGhlYWRlcldyYXBwZXIgPyBoZWFkZXJXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5lbC10YWJsZV9faGVhZGVyIHRyJykgOiBudWxsO1xuICAgIHZhciBub25lSGVhZGVyID0gdGhpcy5oZWFkZXJEaXNwbGF5Tm9uZShoZWFkZXJUckVsbSk7XG5cbiAgICB2YXIgaGVhZGVySGVpZ2h0ID0gdGhpcy5oZWFkZXJIZWlnaHQgPSAhdGhpcy5zaG93SGVhZGVyID8gMCA6IGhlYWRlcldyYXBwZXIub2Zmc2V0SGVpZ2h0O1xuICAgIGlmICh0aGlzLnNob3dIZWFkZXIgJiYgIW5vbmVIZWFkZXIgJiYgaGVhZGVyV3JhcHBlci5vZmZzZXRXaWR0aCA+IDAgJiYgKHRoaXMudGFibGUuY29sdW1ucyB8fCBbXSkubGVuZ3RoID4gMCAmJiBoZWFkZXJIZWlnaHQgPCAyKSB7XG4gICAgICByZXR1cm4gZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIudXBkYXRlRWxzSGVpZ2h0KCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHRhYmxlSGVpZ2h0ID0gdGhpcy50YWJsZUhlaWdodCA9IHRoaXMudGFibGUuJGVsLmNsaWVudEhlaWdodDtcbiAgICB2YXIgZm9vdGVySGVpZ2h0ID0gdGhpcy5mb290ZXJIZWlnaHQgPSBmb290ZXJXcmFwcGVyID8gZm9vdGVyV3JhcHBlci5vZmZzZXRIZWlnaHQgOiAwO1xuICAgIGlmICh0aGlzLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5ib2R5SGVpZ2h0ID0gdGFibGVIZWlnaHQgLSBoZWFkZXJIZWlnaHQgLSBmb290ZXJIZWlnaHQgKyAoZm9vdGVyV3JhcHBlciA/IDEgOiAwKTtcbiAgICB9XG4gICAgdGhpcy5maXhlZEJvZHlIZWlnaHQgPSB0aGlzLnNjcm9sbFggPyB0aGlzLmJvZHlIZWlnaHQgLSB0aGlzLmd1dHRlcldpZHRoIDogdGhpcy5ib2R5SGVpZ2h0O1xuXG4gICAgdmFyIG5vRGF0YSA9ICEodGhpcy5zdG9yZS5zdGF0ZXMuZGF0YSAmJiB0aGlzLnN0b3JlLnN0YXRlcy5kYXRhLmxlbmd0aCk7XG4gICAgdGhpcy52aWV3cG9ydEhlaWdodCA9IHRoaXMuc2Nyb2xsWCA/IHRhYmxlSGVpZ2h0IC0gKG5vRGF0YSA/IDAgOiB0aGlzLmd1dHRlcldpZHRoKSA6IHRhYmxlSGVpZ2h0O1xuICAgIHRoaXMudXBkYXRlU2Nyb2xsWSgpO1xuICAgIHRoaXMubm90aWZ5T2JzZXJ2ZXJzKCdzY3JvbGxhYmxlJyk7XG4gIH07XG5cbiAgVGFibGVMYXlvdXQucHJvdG90eXBlLmhlYWRlckRpc3BsYXlOb25lID0gZnVuY3Rpb24gaGVhZGVyRGlzcGxheU5vbmUoZWxtKSB7XG4gICAgaWYgKCFlbG0pIHJldHVybiB0cnVlO1xuICAgIHZhciBoZWFkZXJDaGlsZCA9IGVsbTtcbiAgICB3aGlsZSAoaGVhZGVyQ2hpbGQudGFnTmFtZSAhPT0gJ0RJVicpIHtcbiAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGhlYWRlckNoaWxkKS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBoZWFkZXJDaGlsZCA9IGhlYWRlckNoaWxkLnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBUYWJsZUxheW91dC5wcm90b3R5cGUudXBkYXRlQ29sdW1uc1dpZHRoID0gZnVuY3Rpb24gdXBkYXRlQ29sdW1uc1dpZHRoKCkge1xuICAgIGlmIChleHRlcm5hbF92dWVfZGVmYXVsdC5hLnByb3RvdHlwZS4kaXNTZXJ2ZXIpIHJldHVybjtcbiAgICB2YXIgZml0ID0gdGhpcy5maXQ7XG4gICAgdmFyIGJvZHlXaWR0aCA9IHRoaXMudGFibGUuJGVsLmNsaWVudFdpZHRoO1xuICAgIHZhciBib2R5TWluV2lkdGggPSAwO1xuXG4gICAgdmFyIGZsYXR0ZW5Db2x1bW5zID0gdGhpcy5nZXRGbGF0dGVuQ29sdW1ucygpO1xuICAgIHZhciBmbGV4Q29sdW1ucyA9IGZsYXR0ZW5Db2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGNvbHVtbi53aWR0aCAhPT0gJ251bWJlcic7XG4gICAgfSk7XG5cbiAgICBmbGF0dGVuQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIC8vIENsZWFuIHRob3NlIGNvbHVtbnMgd2hvc2Ugd2lkdGggY2hhbmdlZCBmcm9tIGZsZXggdG8gdW5mbGV4XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbi53aWR0aCA9PT0gJ251bWJlcicgJiYgY29sdW1uLnJlYWxXaWR0aCkgY29sdW1uLnJlYWxXaWR0aCA9IG51bGw7XG4gICAgfSk7XG5cbiAgICBpZiAoZmxleENvbHVtbnMubGVuZ3RoID4gMCAmJiBmaXQpIHtcbiAgICAgIGZsYXR0ZW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICBib2R5TWluV2lkdGggKz0gY29sdW1uLndpZHRoIHx8IGNvbHVtbi5taW5XaWR0aCB8fCA4MDtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc2Nyb2xsWVdpZHRoID0gdGhpcy5zY3JvbGxZID8gdGhpcy5ndXR0ZXJXaWR0aCA6IDA7XG5cbiAgICAgIGlmIChib2R5TWluV2lkdGggPD0gYm9keVdpZHRoIC0gc2Nyb2xsWVdpZHRoKSB7XG4gICAgICAgIC8vIERPTidUIEhBVkUgU0NST0xMIEJBUlxuICAgICAgICB0aGlzLnNjcm9sbFggPSBmYWxzZTtcblxuICAgICAgICB2YXIgdG90YWxGbGV4V2lkdGggPSBib2R5V2lkdGggLSBzY3JvbGxZV2lkdGggLSBib2R5TWluV2lkdGg7XG5cbiAgICAgICAgaWYgKGZsZXhDb2x1bW5zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGZsZXhDb2x1bW5zWzBdLnJlYWxXaWR0aCA9IChmbGV4Q29sdW1uc1swXS5taW5XaWR0aCB8fCA4MCkgKyB0b3RhbEZsZXhXaWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYWxsQ29sdW1uc1dpZHRoID0gZmxleENvbHVtbnMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2ICsgKGNvbHVtbi5taW5XaWR0aCB8fCA4MCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgdmFyIGZsZXhXaWR0aFBlclBpeGVsID0gdG90YWxGbGV4V2lkdGggLyBhbGxDb2x1bW5zV2lkdGg7XG4gICAgICAgICAgdmFyIG5vbmVGaXJzdFdpZHRoID0gMDtcblxuICAgICAgICAgIGZsZXhDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbiwgaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIGZsZXhXaWR0aCA9IE1hdGguZmxvb3IoKGNvbHVtbi5taW5XaWR0aCB8fCA4MCkgKiBmbGV4V2lkdGhQZXJQaXhlbCk7XG4gICAgICAgICAgICBub25lRmlyc3RXaWR0aCArPSBmbGV4V2lkdGg7XG4gICAgICAgICAgICBjb2x1bW4ucmVhbFdpZHRoID0gKGNvbHVtbi5taW5XaWR0aCB8fCA4MCkgKyBmbGV4V2lkdGg7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBmbGV4Q29sdW1uc1swXS5yZWFsV2lkdGggPSAoZmxleENvbHVtbnNbMF0ubWluV2lkdGggfHwgODApICsgdG90YWxGbGV4V2lkdGggLSBub25lRmlyc3RXaWR0aDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSEFWRSBIT1JJWk9OVEFMIFNDUk9MTCBCQVJcbiAgICAgICAgdGhpcy5zY3JvbGxYID0gdHJ1ZTtcbiAgICAgICAgZmxleENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgY29sdW1uLnJlYWxXaWR0aCA9IGNvbHVtbi5taW5XaWR0aDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYm9keVdpZHRoID0gTWF0aC5tYXgoYm9keU1pbldpZHRoLCBib2R5V2lkdGgpO1xuICAgICAgdGhpcy50YWJsZS5yZXNpemVTdGF0ZS53aWR0aCA9IHRoaXMuYm9keVdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbGF0dGVuQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgaWYgKCFjb2x1bW4ud2lkdGggJiYgIWNvbHVtbi5taW5XaWR0aCkge1xuICAgICAgICAgIGNvbHVtbi5yZWFsV2lkdGggPSA4MDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2x1bW4ucmVhbFdpZHRoID0gY29sdW1uLndpZHRoIHx8IGNvbHVtbi5taW5XaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJvZHlNaW5XaWR0aCArPSBjb2x1bW4ucmVhbFdpZHRoO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNjcm9sbFggPSBib2R5TWluV2lkdGggPiBib2R5V2lkdGg7XG5cbiAgICAgIHRoaXMuYm9keVdpZHRoID0gYm9keU1pbldpZHRoO1xuICAgIH1cblxuICAgIHZhciBmaXhlZENvbHVtbnMgPSB0aGlzLnN0b3JlLnN0YXRlcy5maXhlZENvbHVtbnM7XG5cbiAgICBpZiAoZml4ZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBmaXhlZFdpZHRoID0gMDtcbiAgICAgIGZpeGVkQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgZml4ZWRXaWR0aCArPSBjb2x1bW4ucmVhbFdpZHRoIHx8IGNvbHVtbi53aWR0aDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmZpeGVkV2lkdGggPSBmaXhlZFdpZHRoO1xuICAgIH1cblxuICAgIHZhciByaWdodEZpeGVkQ29sdW1ucyA9IHRoaXMuc3RvcmUuc3RhdGVzLnJpZ2h0Rml4ZWRDb2x1bW5zO1xuICAgIGlmIChyaWdodEZpeGVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgcmlnaHRGaXhlZFdpZHRoID0gMDtcbiAgICAgIHJpZ2h0Rml4ZWRDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByaWdodEZpeGVkV2lkdGggKz0gY29sdW1uLnJlYWxXaWR0aCB8fCBjb2x1bW4ud2lkdGg7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5yaWdodEZpeGVkV2lkdGggPSByaWdodEZpeGVkV2lkdGg7XG4gICAgfVxuXG4gICAgdGhpcy5ub3RpZnlPYnNlcnZlcnMoJ2NvbHVtbnMnKTtcbiAgfTtcblxuICBUYWJsZUxheW91dC5wcm90b3R5cGUuYWRkT2JzZXJ2ZXIgPSBmdW5jdGlvbiBhZGRPYnNlcnZlcihvYnNlcnZlcikge1xuICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICB9O1xuXG4gIFRhYmxlTGF5b3V0LnByb3RvdHlwZS5yZW1vdmVPYnNlcnZlciA9IGZ1bmN0aW9uIHJlbW92ZU9ic2VydmVyKG9ic2VydmVyKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5vYnNlcnZlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG5cbiAgVGFibGVMYXlvdXQucHJvdG90eXBlLm5vdGlmeU9ic2VydmVycyA9IGZ1bmN0aW9uIG5vdGlmeU9ic2VydmVycyhldmVudCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIG9ic2VydmVycyA9IHRoaXMub2JzZXJ2ZXJzO1xuICAgIG9ic2VydmVycy5mb3JFYWNoKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgc3dpdGNoIChldmVudCkge1xuICAgICAgICBjYXNlICdjb2x1bW5zJzpcbiAgICAgICAgICBvYnNlcnZlci5vbkNvbHVtbnNDaGFuZ2UoX3RoaXMzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2Nyb2xsYWJsZSc6XG4gICAgICAgICAgb2JzZXJ2ZXIub25TY3JvbGxhYmxlQ2hhbmdlKF90aGlzMyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYWJsZSBMYXlvdXQgZG9uXFwndCBoYXZlIGV2ZW50ICcgKyBldmVudCArICcuJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFRhYmxlTGF5b3V0O1xufSgpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0YWJsZV9sYXlvdXQgPSAodGFibGVfbGF5b3V0X1RhYmxlTGF5b3V0KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL2xheW91dC1vYnNlcnZlci5qc1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbGF5b3V0X29ic2VydmVyID0gKHtcbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcbiAgICB0aGlzLnRhYmxlTGF5b3V0LmFkZE9ic2VydmVyKHRoaXMpO1xuICB9LFxuICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICB0aGlzLnRhYmxlTGF5b3V0LnJlbW92ZU9ic2VydmVyKHRoaXMpO1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0YWJsZUxheW91dDogZnVuY3Rpb24gdGFibGVMYXlvdXQoKSB7XG4gICAgICB2YXIgbGF5b3V0ID0gdGhpcy5sYXlvdXQ7XG4gICAgICBpZiAoIWxheW91dCAmJiB0aGlzLnRhYmxlKSB7XG4gICAgICAgIGxheW91dCA9IHRoaXMudGFibGUubGF5b3V0O1xuICAgICAgfVxuICAgICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGZpbmQgdGFibGUgbGF5b3V0LicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB0aGlzLm9uQ29sdW1uc0NoYW5nZSh0aGlzLnRhYmxlTGF5b3V0KTtcbiAgICB0aGlzLm9uU2Nyb2xsYWJsZUNoYW5nZSh0aGlzLnRhYmxlTGF5b3V0KTtcbiAgfSxcbiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCgpIHtcbiAgICBpZiAodGhpcy5fX3VwZGF0ZWRfXykgcmV0dXJuO1xuICAgIHRoaXMub25Db2x1bW5zQ2hhbmdlKHRoaXMudGFibGVMYXlvdXQpO1xuICAgIHRoaXMub25TY3JvbGxhYmxlQ2hhbmdlKHRoaXMudGFibGVMYXlvdXQpO1xuICAgIHRoaXMuX191cGRhdGVkX18gPSB0cnVlO1xuICB9LFxuXG5cbiAgbWV0aG9kczoge1xuICAgIG9uQ29sdW1uc0NoYW5nZTogZnVuY3Rpb24gb25Db2x1bW5zQ2hhbmdlKGxheW91dCkge1xuICAgICAgdmFyIGNvbHMgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCdjb2xncm91cCA+IGNvbCcpO1xuICAgICAgaWYgKCFjb2xzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgdmFyIGZsYXR0ZW5Db2x1bW5zID0gbGF5b3V0LmdldEZsYXR0ZW5Db2x1bW5zKCk7XG4gICAgICB2YXIgY29sdW1uc01hcCA9IHt9O1xuICAgICAgZmxhdHRlbkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIGNvbHVtbnNNYXBbY29sdW1uLmlkXSA9IGNvbHVtbjtcbiAgICAgIH0pO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBjb2xzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICB2YXIgY29sID0gY29sc1tpXTtcbiAgICAgICAgdmFyIG5hbWUgPSBjb2wuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgIHZhciBjb2x1bW4gPSBjb2x1bW5zTWFwW25hbWVdO1xuICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgY29sLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBjb2x1bW4ucmVhbFdpZHRoIHx8IGNvbHVtbi53aWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIG9uU2Nyb2xsYWJsZUNoYW5nZTogZnVuY3Rpb24gb25TY3JvbGxhYmxlQ2hhbmdlKGxheW91dCkge1xuICAgICAgdmFyIGNvbHMgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCdjb2xncm91cCA+IGNvbFtuYW1lPWd1dHRlcl0nKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gY29scy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbCA9IGNvbHNbaV07XG4gICAgICAgIGNvbC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgbGF5b3V0LnNjcm9sbFkgPyBsYXlvdXQuZ3V0dGVyV2lkdGggOiAnMCcpO1xuICAgICAgfVxuICAgICAgdmFyIHRocyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoLmd1dHRlcicpO1xuICAgICAgZm9yICh2YXIgX2kgPSAwLCBfaiA9IHRocy5sZW5ndGg7IF9pIDwgX2o7IF9pKyspIHtcbiAgICAgICAgdmFyIHRoID0gdGhzW19pXTtcbiAgICAgICAgdGguc3R5bGUud2lkdGggPSBsYXlvdXQuc2Nyb2xsWSA/IGxheW91dC5ndXR0ZXJXaWR0aCArICdweCcgOiAnMCc7XG4gICAgICAgIHRoLnN0eWxlLmRpc3BsYXkgPSBsYXlvdXQuc2Nyb2xsWSA/ICcnIDogJ25vbmUnO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy90YWJsZS1yb3cuanNcbnZhciB0YWJsZV9yb3dfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGFibGVfcm93ID0gKHtcbiAgbmFtZTogJ0VsVGFibGVSb3cnLFxuICBwcm9wczogWydjb2x1bW5zJywgJ3JvdycsICdpbmRleCcsICdpc1NlbGVjdGVkJywgJ2lzRXhwYW5kZWQnLCAnc3RvcmUnLCAnY29udGV4dCcsICdmaXJzdERlZmF1bHRDb2x1bW5JbmRleCcsICd0cmVlUm93RGF0YScsICd0cmVlSW5kZW50JywgJ2NvbHVtbnNIaWRkZW4nLCAnZ2V0U3BhbicsICdnZXRDb2xzcGFuUmVhbFdpZHRoJywgJ2dldENlbGxTdHlsZScsICdnZXRDZWxsQ2xhc3MnLCAnaGFuZGxlQ2VsbE1vdXNlTGVhdmUnLCAnaGFuZGxlQ2VsbE1vdXNlRW50ZXInLCAnZml4ZWQnXSxcbiAgY29tcG9uZW50czoge1xuICAgIEVsQ2hlY2tib3g6IGNoZWNrYm94X2RlZmF1bHQuYVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGggPSBhcmd1bWVudHNbMF07XG4gICAgdmFyIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMsXG4gICAgICAgIHJvdyA9IHRoaXMucm93LFxuICAgICAgICAkaW5kZXggPSB0aGlzLmluZGV4LFxuICAgICAgICBzdG9yZSA9IHRoaXMuc3RvcmUsXG4gICAgICAgIGNvbnRleHQgPSB0aGlzLmNvbnRleHQsXG4gICAgICAgIGZpcnN0RGVmYXVsdENvbHVtbkluZGV4ID0gdGhpcy5maXJzdERlZmF1bHRDb2x1bW5JbmRleCxcbiAgICAgICAgdHJlZVJvd0RhdGEgPSB0aGlzLnRyZWVSb3dEYXRhLFxuICAgICAgICB0cmVlSW5kZW50ID0gdGhpcy50cmVlSW5kZW50LFxuICAgICAgICBfY29sdW1uc0hpZGRlbiA9IHRoaXMuY29sdW1uc0hpZGRlbixcbiAgICAgICAgY29sdW1uc0hpZGRlbiA9IF9jb2x1bW5zSGlkZGVuID09PSB1bmRlZmluZWQgPyBbXSA6IF9jb2x1bW5zSGlkZGVuLFxuICAgICAgICBpc1NlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkLFxuICAgICAgICBpc0V4cGFuZGVkID0gdGhpcy5pc0V4cGFuZGVkO1xuXG5cbiAgICByZXR1cm4gaCgndHInLCBbY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbiwgY2VsbEluZGV4KSB7XG4gICAgICB2YXIgX2dldFNwYW4gPSBfdGhpcy5nZXRTcGFuKHJvdywgY29sdW1uLCAkaW5kZXgsIGNlbGxJbmRleCksXG4gICAgICAgICAgcm93c3BhbiA9IF9nZXRTcGFuLnJvd3NwYW4sXG4gICAgICAgICAgY29sc3BhbiA9IF9nZXRTcGFuLmNvbHNwYW47XG5cbiAgICAgIGlmICghcm93c3BhbiB8fCAhY29sc3Bhbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBjb2x1bW5EYXRhID0gdGFibGVfcm93X2V4dGVuZHMoe30sIGNvbHVtbik7XG4gICAgICBjb2x1bW5EYXRhLnJlYWxXaWR0aCA9IF90aGlzLmdldENvbHNwYW5SZWFsV2lkdGgoY29sdW1ucywgY29sc3BhbiwgY2VsbEluZGV4KTtcbiAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICBzdG9yZTogc3RvcmUsXG4gICAgICAgIGlzU2VsZWN0ZWQ6IGlzU2VsZWN0ZWQsXG4gICAgICAgIGlzRXhwYW5kZWQ6IGlzRXhwYW5kZWQsXG4gICAgICAgIF9zZWxmOiBjb250ZXh0LFxuICAgICAgICBjb2x1bW46IGNvbHVtbkRhdGEsXG4gICAgICAgIHJvdzogcm93LFxuICAgICAgICAkaW5kZXg6ICRpbmRleFxuICAgICAgfTtcbiAgICAgIGlmIChjZWxsSW5kZXggPT09IGZpcnN0RGVmYXVsdENvbHVtbkluZGV4ICYmIHRyZWVSb3dEYXRhKSB7XG4gICAgICAgIGRhdGEudHJlZU5vZGUgPSB7XG4gICAgICAgICAgaW5kZW50OiB0cmVlUm93RGF0YS5sZXZlbCAqIHRyZWVJbmRlbnQsXG4gICAgICAgICAgbGV2ZWw6IHRyZWVSb3dEYXRhLmxldmVsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0eXBlb2YgdHJlZVJvd0RhdGEuZXhwYW5kZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIGRhdGEudHJlZU5vZGUuZXhwYW5kZWQgPSB0cmVlUm93RGF0YS5leHBhbmRlZDtcbiAgICAgICAgICAvLyDooajmmI7mmK/mh5LliqDovb1cbiAgICAgICAgICBpZiAoJ2xvYWRpbmcnIGluIHRyZWVSb3dEYXRhKSB7XG4gICAgICAgICAgICBkYXRhLnRyZWVOb2RlLmxvYWRpbmcgPSB0cmVlUm93RGF0YS5sb2FkaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ25vTGF6eUNoaWxkcmVuJyBpbiB0cmVlUm93RGF0YSkge1xuICAgICAgICAgICAgZGF0YS50cmVlTm9kZS5ub0xhenlDaGlsZHJlbiA9IHRyZWVSb3dEYXRhLm5vTGF6eUNoaWxkcmVuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGgoXG4gICAgICAgICd0ZCcsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHlsZTogX3RoaXMuZ2V0Q2VsbFN0eWxlKCRpbmRleCwgY2VsbEluZGV4LCByb3csIGNvbHVtbiksXG4gICAgICAgICAgJ2NsYXNzJzogX3RoaXMuZ2V0Q2VsbENsYXNzKCRpbmRleCwgY2VsbEluZGV4LCByb3csIGNvbHVtbiksXG4gICAgICAgICAgYXR0cnM6IHsgcm93c3Bhbjogcm93c3BhbixcbiAgICAgICAgICAgIGNvbHNwYW46IGNvbHNwYW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAnbW91c2VlbnRlcic6IGZ1bmN0aW9uIG1vdXNlZW50ZXIoJGV2ZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVDZWxsTW91c2VFbnRlcigkZXZlbnQsIHJvdyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21vdXNlbGVhdmUnOiBfdGhpcy5oYW5kbGVDZWxsTW91c2VMZWF2ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2NvbHVtbi5yZW5kZXJDZWxsLmNhbGwoX3RoaXMuX3JlbmRlclByb3h5LCBfdGhpcy4kY3JlYXRlRWxlbWVudCwgZGF0YSwgY29sdW1uc0hpZGRlbltjZWxsSW5kZXhdKV1cbiAgICAgICk7XG4gICAgfSldKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy90YWJsZS1ib2R5LmpzXG52YXIgdGFibGVfYm9keV90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG52YXIgdGFibGVfYm9keV9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0YWJsZV9ib2R5ID0gKHtcbiAgbmFtZTogJ0VsVGFibGVCb2R5JyxcblxuICBtaXhpbnM6IFtsYXlvdXRfb2JzZXJ2ZXJdLFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBFbENoZWNrYm94OiBjaGVja2JveF9kZWZhdWx0LmEsXG4gICAgRWxUb29sdGlwOiB0b29sdGlwX2RlZmF1bHQuYSxcbiAgICBUYWJsZVJvdzogdGFibGVfcm93XG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBzdG9yZToge1xuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIHN0cmlwZTogQm9vbGVhbixcbiAgICBjb250ZXh0OiB7fSxcbiAgICByb3dDbGFzc05hbWU6IFtTdHJpbmcsIEZ1bmN0aW9uXSxcbiAgICByb3dTdHlsZTogW09iamVjdCwgRnVuY3Rpb25dLFxuICAgIGZpeGVkOiBTdHJpbmcsXG4gICAgaGlnaGxpZ2h0OiBCb29sZWFuXG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICByZXR1cm4gaChcbiAgICAgICd0YWJsZScsXG4gICAgICB7XG4gICAgICAgICdjbGFzcyc6ICdlbC10YWJsZV9fYm9keScsXG4gICAgICAgIGF0dHJzOiB7IGNlbGxzcGFjaW5nOiAnMCcsXG4gICAgICAgICAgY2VsbHBhZGRpbmc6ICcwJyxcbiAgICAgICAgICBib3JkZXI6ICcwJyB9XG4gICAgICB9LFxuICAgICAgW2goJ2NvbGdyb3VwJywgW3RoaXMuY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gaCgnY29sJywge1xuICAgICAgICAgIGF0dHJzOiB7IG5hbWU6IGNvbHVtbi5pZCB9LFxuICAgICAgICAgIGtleTogY29sdW1uLmlkIH0pO1xuICAgICAgfSldKSwgaCgndGJvZHknLCBbZGF0YS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcm93KSB7XG4gICAgICAgIHJldHVybiBhY2MuY29uY2F0KF90aGlzLndyYXBwZWRSb3dSZW5kZXIocm93LCBhY2MubGVuZ3RoKSk7XG4gICAgICB9LCBbXSksIGgoJ2VsLXRvb2x0aXAnLCB7XG4gICAgICAgIGF0dHJzOiB7IGVmZmVjdDogdGhpcy50YWJsZS50b29sdGlwRWZmZWN0LCBwbGFjZW1lbnQ6ICd0b3AnLCBjb250ZW50OiB0aGlzLnRvb2x0aXBDb250ZW50IH0sXG4gICAgICAgIHJlZjogJ3Rvb2x0aXAnIH0pXSldXG4gICAgKTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB0YWJsZV9ib2R5X2V4dGVuZHMoe1xuICAgIHRhYmxlOiBmdW5jdGlvbiB0YWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQ7XG4gICAgfVxuICB9LCBtYXBTdGF0ZXMoe1xuICAgIGRhdGE6ICdkYXRhJyxcbiAgICBjb2x1bW5zOiAnY29sdW1ucycsXG4gICAgdHJlZUluZGVudDogJ2luZGVudCcsXG4gICAgbGVmdEZpeGVkTGVhZkNvdW50OiAnZml4ZWRMZWFmQ29sdW1uc0xlbmd0aCcsXG4gICAgcmlnaHRGaXhlZExlYWZDb3VudDogJ3JpZ2h0Rml4ZWRMZWFmQ29sdW1uc0xlbmd0aCcsXG4gICAgY29sdW1uc0NvdW50OiBmdW5jdGlvbiBjb2x1bW5zQ291bnQoc3RhdGVzKSB7XG4gICAgICByZXR1cm4gc3RhdGVzLmNvbHVtbnMubGVuZ3RoO1xuICAgIH0sXG4gICAgbGVmdEZpeGVkQ291bnQ6IGZ1bmN0aW9uIGxlZnRGaXhlZENvdW50KHN0YXRlcykge1xuICAgICAgcmV0dXJuIHN0YXRlcy5maXhlZENvbHVtbnMubGVuZ3RoO1xuICAgIH0sXG4gICAgcmlnaHRGaXhlZENvdW50OiBmdW5jdGlvbiByaWdodEZpeGVkQ291bnQoc3RhdGVzKSB7XG4gICAgICByZXR1cm4gc3RhdGVzLnJpZ2h0Rml4ZWRDb2x1bW5zLmxlbmd0aDtcbiAgICB9LFxuICAgIGhhc0V4cGFuZENvbHVtbjogZnVuY3Rpb24gaGFzRXhwYW5kQ29sdW1uKHN0YXRlcykge1xuICAgICAgcmV0dXJuIHN0YXRlcy5jb2x1bW5zLnNvbWUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBfcmVmLnR5cGU7XG4gICAgICAgIHJldHVybiB0eXBlID09PSAnZXhwYW5kJztcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIHtcbiAgICBjb2x1bW5zSGlkZGVuOiBmdW5jdGlvbiBjb2x1bW5zSGlkZGVuKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4sIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuaXNDb2x1bW5IaWRkZW4oaW5kZXgpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBmaXJzdERlZmF1bHRDb2x1bW5JbmRleDogZnVuY3Rpb24gZmlyc3REZWZhdWx0Q29sdW1uSW5kZXgoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiYXJyYXlGaW5kSW5kZXhcIl0pKHRoaXMuY29sdW1ucywgZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgIHZhciB0eXBlID0gX3JlZjIudHlwZTtcbiAgICAgICAgcmV0dXJuIHR5cGUgPT09ICdkZWZhdWx0JztcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksXG5cbiAgd2F0Y2g6IHtcbiAgICAvLyBkb24ndCB0cmlnZ2VyIGdldHRlciBvZiBjdXJyZW50Um93IGluIGdldENlbGxDbGFzcy4gc2VlIGh0dHBzOi8vanNmaWRkbGUubmV0L29lMmI0aHF0L1xuICAgIC8vIHVwZGF0ZSBET00gbWFudWFsbHkuIHNlZSBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L3B1bGwvMTM5NTQvZmlsZXMjZGlmZi05YjQ1MGMwMGQwYTlkZWMwZmZhZDVhMzE3Njk3MmU0MFxuICAgICdzdG9yZS5zdGF0ZXMuaG92ZXJSb3cnOiBmdW5jdGlvbiBzdG9yZVN0YXRlc0hvdmVyUm93KG5ld1ZhbCwgb2xkVmFsKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLnN0b3JlLnN0YXRlcy5pc0NvbXBsZXggfHwgdGhpcy4kaXNTZXJ2ZXIpIHJldHVybjtcbiAgICAgIHZhciByYWYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuICAgICAgaWYgKCFyYWYpIHtcbiAgICAgICAgcmFmID0gZnVuY3Rpb24gcmFmKGZuKSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZm4sIDE2KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByb3dzID0gX3RoaXMzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZWwtdGFibGVfX3JvdycpO1xuICAgICAgICB2YXIgb2xkUm93ID0gcm93c1tvbGRWYWxdO1xuICAgICAgICB2YXIgbmV3Um93ID0gcm93c1tuZXdWYWxdO1xuICAgICAgICBpZiAob2xkUm93KSB7XG4gICAgICAgICAgT2JqZWN0KGRvbV9bXCJyZW1vdmVDbGFzc1wiXSkob2xkUm93LCAnaG92ZXItcm93Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld1Jvdykge1xuICAgICAgICAgIE9iamVjdChkb21fW1wiYWRkQ2xhc3NcIl0pKG5ld1JvdywgJ2hvdmVyLXJvdycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9vbHRpcENvbnRlbnQ6ICcnXG4gICAgfTtcbiAgfSxcbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcbiAgICB0aGlzLmFjdGl2YXRlVG9vbHRpcCA9IGRlYm91bmNlX2RlZmF1bHQoKSg1MCwgZnVuY3Rpb24gKHRvb2x0aXApIHtcbiAgICAgIHJldHVybiB0b29sdGlwLmhhbmRsZVNob3dQb3BwZXIoKTtcbiAgICB9KTtcbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRLZXlPZlJvdzogZnVuY3Rpb24gZ2V0S2V5T2ZSb3cocm93LCBpbmRleCkge1xuICAgICAgdmFyIHJvd0tleSA9IHRoaXMudGFibGUucm93S2V5O1xuICAgICAgaWYgKHJvd0tleSkge1xuICAgICAgICByZXR1cm4gZ2V0Um93SWRlbnRpdHkocm93LCByb3dLZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH0sXG4gICAgaXNDb2x1bW5IaWRkZW46IGZ1bmN0aW9uIGlzQ29sdW1uSGlkZGVuKGluZGV4KSB7XG4gICAgICBpZiAodGhpcy5maXhlZCA9PT0gdHJ1ZSB8fCB0aGlzLmZpeGVkID09PSAnbGVmdCcpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IHRoaXMubGVmdEZpeGVkTGVhZkNvdW50O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZpeGVkID09PSAncmlnaHQnKSB7XG4gICAgICAgIHJldHVybiBpbmRleCA8IHRoaXMuY29sdW1uc0NvdW50IC0gdGhpcy5yaWdodEZpeGVkTGVhZkNvdW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGluZGV4IDwgdGhpcy5sZWZ0Rml4ZWRMZWFmQ291bnQgfHwgaW5kZXggPj0gdGhpcy5jb2x1bW5zQ291bnQgLSB0aGlzLnJpZ2h0Rml4ZWRMZWFmQ291bnQ7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRTcGFuOiBmdW5jdGlvbiBnZXRTcGFuKHJvdywgY29sdW1uLCByb3dJbmRleCwgY29sdW1uSW5kZXgpIHtcbiAgICAgIHZhciByb3dzcGFuID0gMTtcbiAgICAgIHZhciBjb2xzcGFuID0gMTtcbiAgICAgIHZhciBmbiA9IHRoaXMudGFibGUuc3Bhbk1ldGhvZDtcbiAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGZuKHtcbiAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgICAgcm93c3BhbiA9IHJlc3VsdFswXTtcbiAgICAgICAgICBjb2xzcGFuID0gcmVzdWx0WzFdO1xuICAgICAgICB9IGVsc2UgaWYgKCh0eXBlb2YgcmVzdWx0ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogdGFibGVfYm9keV90eXBlb2YocmVzdWx0KSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcm93c3BhbiA9IHJlc3VsdC5yb3dzcGFuO1xuICAgICAgICAgIGNvbHNwYW4gPSByZXN1bHQuY29sc3BhbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgcm93c3Bhbjogcm93c3BhbiwgY29sc3BhbjogY29sc3BhbiB9O1xuICAgIH0sXG4gICAgZ2V0Um93U3R5bGU6IGZ1bmN0aW9uIGdldFJvd1N0eWxlKHJvdywgcm93SW5kZXgpIHtcbiAgICAgIHZhciByb3dTdHlsZSA9IHRoaXMudGFibGUucm93U3R5bGU7XG4gICAgICBpZiAodHlwZW9mIHJvd1N0eWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiByb3dTdHlsZS5jYWxsKG51bGwsIHtcbiAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICByb3dJbmRleDogcm93SW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcm93U3R5bGUgfHwgbnVsbDtcbiAgICB9LFxuICAgIGdldFJvd0NsYXNzOiBmdW5jdGlvbiBnZXRSb3dDbGFzcyhyb3csIHJvd0luZGV4KSB7XG4gICAgICB2YXIgY2xhc3NlcyA9IFsnZWwtdGFibGVfX3JvdyddO1xuICAgICAgaWYgKHRoaXMudGFibGUuaGlnaGxpZ2h0Q3VycmVudFJvdyAmJiByb3cgPT09IHRoaXMuc3RvcmUuc3RhdGVzLmN1cnJlbnRSb3cpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdjdXJyZW50LXJvdycpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdHJpcGUgJiYgcm93SW5kZXggJSAyID09PSAxKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnZWwtdGFibGVfX3Jvdy0tc3RyaXBlZCcpO1xuICAgICAgfVxuICAgICAgdmFyIHJvd0NsYXNzTmFtZSA9IHRoaXMudGFibGUucm93Q2xhc3NOYW1lO1xuICAgICAgaWYgKHR5cGVvZiByb3dDbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChyb3dDbGFzc05hbWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygcm93Q2xhc3NOYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChyb3dDbGFzc05hbWUuY2FsbChudWxsLCB7XG4gICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4XG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RvcmUuc3RhdGVzLmV4cGFuZFJvd3MuaW5kZXhPZihyb3cpID4gLTEpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdleHBhbmRlZCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2xhc3NlcztcbiAgICB9LFxuICAgIGdldENlbGxTdHlsZTogZnVuY3Rpb24gZ2V0Q2VsbFN0eWxlKHJvd0luZGV4LCBjb2x1bW5JbmRleCwgcm93LCBjb2x1bW4pIHtcbiAgICAgIHZhciBjZWxsU3R5bGUgPSB0aGlzLnRhYmxlLmNlbGxTdHlsZTtcbiAgICAgIGlmICh0eXBlb2YgY2VsbFN0eWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBjZWxsU3R5bGUuY2FsbChudWxsLCB7XG4gICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgICAgIGNvbHVtbkluZGV4OiBjb2x1bW5JbmRleCxcbiAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjZWxsU3R5bGU7XG4gICAgfSxcbiAgICBnZXRDZWxsQ2xhc3M6IGZ1bmN0aW9uIGdldENlbGxDbGFzcyhyb3dJbmRleCwgY29sdW1uSW5kZXgsIHJvdywgY29sdW1uKSB7XG4gICAgICB2YXIgY2xhc3NlcyA9IFtjb2x1bW4uaWQsIGNvbHVtbi5hbGlnbiwgY29sdW1uLmNsYXNzTmFtZV07XG5cbiAgICAgIGlmICh0aGlzLmlzQ29sdW1uSGlkZGVuKGNvbHVtbkluZGV4KSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2lzLWhpZGRlbicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2VsbENsYXNzTmFtZSA9IHRoaXMudGFibGUuY2VsbENsYXNzTmFtZTtcbiAgICAgIGlmICh0eXBlb2YgY2VsbENsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGNlbGxDbGFzc05hbWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY2VsbENsYXNzTmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjbGFzc2VzLnB1c2goY2VsbENsYXNzTmFtZS5jYWxsKG51bGwsIHtcbiAgICAgICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4LFxuICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgY2xhc3Nlcy5wdXNoKCdlbC10YWJsZV9fY2VsbCcpO1xuXG4gICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfSxcbiAgICBnZXRDb2xzcGFuUmVhbFdpZHRoOiBmdW5jdGlvbiBnZXRDb2xzcGFuUmVhbFdpZHRoKGNvbHVtbnMsIGNvbHNwYW4sIGluZGV4KSB7XG4gICAgICBpZiAoY29sc3BhbiA8IDEpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnNbaW5kZXhdLnJlYWxXaWR0aDtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aEFyciA9IGNvbHVtbnMubWFwKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIgcmVhbFdpZHRoID0gX3JlZjMucmVhbFdpZHRoO1xuICAgICAgICByZXR1cm4gcmVhbFdpZHRoO1xuICAgICAgfSkuc2xpY2UoaW5kZXgsIGluZGV4ICsgY29sc3Bhbik7XG4gICAgICByZXR1cm4gd2lkdGhBcnIucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHdpZHRoKSB7XG4gICAgICAgIHJldHVybiBhY2MgKyB3aWR0aDtcbiAgICAgIH0sIC0xKTtcbiAgICB9LFxuICAgIGhhbmRsZUNlbGxNb3VzZUVudGVyOiBmdW5jdGlvbiBoYW5kbGVDZWxsTW91c2VFbnRlcihldmVudCwgcm93KSB7XG4gICAgICB2YXIgdGFibGUgPSB0aGlzLnRhYmxlO1xuICAgICAgdmFyIGNlbGwgPSBnZXRDZWxsKGV2ZW50KTtcblxuICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IGdldENvbHVtbkJ5Q2VsbCh0YWJsZSwgY2VsbCk7XG4gICAgICAgIHZhciBob3ZlclN0YXRlID0gdGFibGUuaG92ZXJTdGF0ZSA9IHsgY2VsbDogY2VsbCwgY29sdW1uOiBjb2x1bW4sIHJvdzogcm93IH07XG4gICAgICAgIHRhYmxlLiRlbWl0KCdjZWxsLW1vdXNlLWVudGVyJywgaG92ZXJTdGF0ZS5yb3csIGhvdmVyU3RhdGUuY29sdW1uLCBob3ZlclN0YXRlLmNlbGwsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8g5Yik5pat5piv5ZCmdGV4dC1vdmVyZmxvdywg5aaC5p6c5piv5bCx5pi+56S6dG9vbHRpcFxuICAgICAgdmFyIGNlbGxDaGlsZCA9IGV2ZW50LnRhcmdldC5xdWVyeVNlbGVjdG9yKCcuY2VsbCcpO1xuICAgICAgaWYgKCEoT2JqZWN0KGRvbV9bXCJoYXNDbGFzc1wiXSkoY2VsbENoaWxkLCAnZWwtdG9vbHRpcCcpICYmIGNlbGxDaGlsZC5jaGlsZE5vZGVzLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gdXNlIHJhbmdlIHdpZHRoIGluc3RlYWQgb2Ygc2Nyb2xsV2lkdGggdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHRleHQgaXMgb3ZlcmZsb3dpbmdcbiAgICAgIC8vIHRvIGFkZHJlc3MgYSBwb3RlbnRpYWwgRmlyZUZveCBidWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEwNzQ1NDMjYzNcbiAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICByYW5nZS5zZXRTdGFydChjZWxsQ2hpbGQsIDApO1xuICAgICAgcmFuZ2Uuc2V0RW5kKGNlbGxDaGlsZCwgY2VsbENoaWxkLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgIHZhciByYW5nZVdpZHRoID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICB2YXIgcGFkZGluZyA9IChwYXJzZUludChPYmplY3QoZG9tX1tcImdldFN0eWxlXCJdKShjZWxsQ2hpbGQsICdwYWRkaW5nTGVmdCcpLCAxMCkgfHwgMCkgKyAocGFyc2VJbnQoT2JqZWN0KGRvbV9bXCJnZXRTdHlsZVwiXSkoY2VsbENoaWxkLCAncGFkZGluZ1JpZ2h0JyksIDEwKSB8fCAwKTtcbiAgICAgIGlmICgocmFuZ2VXaWR0aCArIHBhZGRpbmcgPiBjZWxsQ2hpbGQub2Zmc2V0V2lkdGggfHwgY2VsbENoaWxkLnNjcm9sbFdpZHRoID4gY2VsbENoaWxkLm9mZnNldFdpZHRoKSAmJiB0aGlzLiRyZWZzLnRvb2x0aXApIHtcbiAgICAgICAgdmFyIHRvb2x0aXAgPSB0aGlzLiRyZWZzLnRvb2x0aXA7XG4gICAgICAgIC8vIFRPRE8g5Lya5byV6LW35pW05LiqIFRhYmxlIOeahOmHjeaWsOa4suafk++8jOmcgOimgeS8mOWMllxuICAgICAgICB0aGlzLnRvb2x0aXBDb250ZW50ID0gY2VsbC5pbm5lclRleHQgfHwgY2VsbC50ZXh0Q29udGVudDtcbiAgICAgICAgdG9vbHRpcC5yZWZlcmVuY2VFbG0gPSBjZWxsO1xuICAgICAgICB0b29sdGlwLiRyZWZzLnBvcHBlciAmJiAodG9vbHRpcC4kcmVmcy5wb3BwZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJyk7XG4gICAgICAgIHRvb2x0aXAuZG9EZXN0cm95KCk7XG4gICAgICAgIHRvb2x0aXAuc2V0RXhwZWN0ZWRTdGF0ZSh0cnVlKTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVRvb2x0aXAodG9vbHRpcCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVDZWxsTW91c2VMZWF2ZTogZnVuY3Rpb24gaGFuZGxlQ2VsbE1vdXNlTGVhdmUoZXZlbnQpIHtcbiAgICAgIHZhciB0b29sdGlwID0gdGhpcy4kcmVmcy50b29sdGlwO1xuICAgICAgaWYgKHRvb2x0aXApIHtcbiAgICAgICAgdG9vbHRpcC5zZXRFeHBlY3RlZFN0YXRlKGZhbHNlKTtcbiAgICAgICAgdG9vbHRpcC5oYW5kbGVDbG9zZVBvcHBlcigpO1xuICAgICAgfVxuICAgICAgdmFyIGNlbGwgPSBnZXRDZWxsKGV2ZW50KTtcbiAgICAgIGlmICghY2VsbCkgcmV0dXJuO1xuXG4gICAgICB2YXIgb2xkSG92ZXJTdGF0ZSA9IHRoaXMudGFibGUuaG92ZXJTdGF0ZSB8fCB7fTtcbiAgICAgIHRoaXMudGFibGUuJGVtaXQoJ2NlbGwtbW91c2UtbGVhdmUnLCBvbGRIb3ZlclN0YXRlLnJvdywgb2xkSG92ZXJTdGF0ZS5jb2x1bW4sIG9sZEhvdmVyU3RhdGUuY2VsbCwgZXZlbnQpO1xuICAgIH0sXG5cblxuICAgIGhhbmRsZU1vdXNlRW50ZXI6IGRlYm91bmNlX2RlZmF1bHQoKSgzMCwgZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICB0aGlzLnN0b3JlLmNvbW1pdCgnc2V0SG92ZXJSb3cnLCBpbmRleCk7XG4gICAgfSksXG5cbiAgICBoYW5kbGVNb3VzZUxlYXZlOiBkZWJvdW5jZV9kZWZhdWx0KCkoMzAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuc3RvcmUuY29tbWl0KCdzZXRIb3ZlclJvdycsIG51bGwpO1xuICAgIH0pLFxuXG4gICAgaGFuZGxlQ29udGV4dE1lbnU6IGZ1bmN0aW9uIGhhbmRsZUNvbnRleHRNZW51KGV2ZW50LCByb3cpIHtcbiAgICAgIHRoaXMuaGFuZGxlRXZlbnQoZXZlbnQsIHJvdywgJ2NvbnRleHRtZW51Jyk7XG4gICAgfSxcbiAgICBoYW5kbGVEb3VibGVDbGljazogZnVuY3Rpb24gaGFuZGxlRG91YmxlQ2xpY2soZXZlbnQsIHJvdykge1xuICAgICAgdGhpcy5oYW5kbGVFdmVudChldmVudCwgcm93LCAnZGJsY2xpY2snKTtcbiAgICB9LFxuICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCwgcm93KSB7XG4gICAgICB0aGlzLnN0b3JlLmNvbW1pdCgnc2V0Q3VycmVudFJvdycsIHJvdyk7XG4gICAgICB0aGlzLmhhbmRsZUV2ZW50KGV2ZW50LCByb3csICdjbGljaycpO1xuICAgIH0sXG4gICAgaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50LCByb3csIG5hbWUpIHtcbiAgICAgIHZhciB0YWJsZSA9IHRoaXMudGFibGU7XG4gICAgICB2YXIgY2VsbCA9IGdldENlbGwoZXZlbnQpO1xuICAgICAgdmFyIGNvbHVtbiA9IHZvaWQgMDtcbiAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgIGNvbHVtbiA9IGdldENvbHVtbkJ5Q2VsbCh0YWJsZSwgY2VsbCk7XG4gICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICB0YWJsZS4kZW1pdCgnY2VsbC0nICsgbmFtZSwgcm93LCBjb2x1bW4sIGNlbGwsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGFibGUuJGVtaXQoJ3Jvdy0nICsgbmFtZSwgcm93LCBjb2x1bW4sIGV2ZW50KTtcbiAgICB9LFxuICAgIHJvd1JlbmRlcjogZnVuY3Rpb24gcm93UmVuZGVyKHJvdywgJGluZGV4LCB0cmVlUm93RGF0YSkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHZhciBoID0gdGhpcy4kY3JlYXRlRWxlbWVudDtcbiAgICAgIHZhciB0cmVlSW5kZW50ID0gdGhpcy50cmVlSW5kZW50LFxuICAgICAgICAgIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMsXG4gICAgICAgICAgZmlyc3REZWZhdWx0Q29sdW1uSW5kZXggPSB0aGlzLmZpcnN0RGVmYXVsdENvbHVtbkluZGV4O1xuXG4gICAgICB2YXIgcm93Q2xhc3NlcyA9IHRoaXMuZ2V0Um93Q2xhc3Mocm93LCAkaW5kZXgpO1xuICAgICAgdmFyIGRpc3BsYXkgPSB0cnVlO1xuICAgICAgaWYgKHRyZWVSb3dEYXRhKSB7XG4gICAgICAgIHJvd0NsYXNzZXMucHVzaCgnZWwtdGFibGVfX3Jvdy0tbGV2ZWwtJyArIHRyZWVSb3dEYXRhLmxldmVsKTtcbiAgICAgICAgZGlzcGxheSA9IHRyZWVSb3dEYXRhLmRpc3BsYXk7XG4gICAgICB9XG4gICAgICAvLyDmjIfku6Qgdi1zaG93IOS8muimhuebliByb3ctc3R5bGUg5LitIGRpc3BsYXlcbiAgICAgIC8vIOS9v+eUqCA6c3R5bGUg5Luj5pu/IHYtc2hvdyBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy8xNjk5NVxuICAgICAgdmFyIGRpc3BsYXlTdHlsZSA9IGRpc3BsYXkgPyBudWxsIDoge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgIH07XG4gICAgICByZXR1cm4gaCh0YWJsZV9yb3csIHtcbiAgICAgICAgc3R5bGU6IFtkaXNwbGF5U3R5bGUsIHRoaXMuZ2V0Um93U3R5bGUocm93LCAkaW5kZXgpXSxcbiAgICAgICAgJ2NsYXNzJzogcm93Q2xhc3NlcyxcbiAgICAgICAga2V5OiB0aGlzLmdldEtleU9mUm93KHJvdywgJGluZGV4KSxcbiAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICAnZGJsY2xpY2snOiBmdW5jdGlvbiBkYmxjbGljaygkZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczQuaGFuZGxlRG91YmxlQ2xpY2soJGV2ZW50LCByb3cpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2NsaWNrJzogZnVuY3Rpb24gY2xpY2soJGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXM0LmhhbmRsZUNsaWNrKCRldmVudCwgcm93KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICdjb250ZXh0bWVudSc6IGZ1bmN0aW9uIGNvbnRleHRtZW51KCRldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5oYW5kbGVDb250ZXh0TWVudSgkZXZlbnQsIHJvdyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbW91c2VlbnRlcic6IGZ1bmN0aW9uIG1vdXNlZW50ZXIoXykge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5oYW5kbGVNb3VzZUVudGVyKCRpbmRleCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbW91c2VsZWF2ZSc6IHRoaXMuaGFuZGxlTW91c2VMZWF2ZVxuICAgICAgICB9LFxuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXG4gICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgaW5kZXg6ICRpbmRleCxcbiAgICAgICAgICBzdG9yZTogdGhpcy5zdG9yZSxcbiAgICAgICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQgfHwgdGhpcy50YWJsZS4kdm5vZGUuY29udGV4dCxcbiAgICAgICAgICBmaXJzdERlZmF1bHRDb2x1bW5JbmRleDogZmlyc3REZWZhdWx0Q29sdW1uSW5kZXgsXG4gICAgICAgICAgdHJlZVJvd0RhdGE6IHRyZWVSb3dEYXRhLFxuICAgICAgICAgIHRyZWVJbmRlbnQ6IHRyZWVJbmRlbnQsXG4gICAgICAgICAgY29sdW1uc0hpZGRlbjogdGhpcy5jb2x1bW5zSGlkZGVuLFxuICAgICAgICAgIGdldFNwYW46IHRoaXMuZ2V0U3BhbixcbiAgICAgICAgICBnZXRDb2xzcGFuUmVhbFdpZHRoOiB0aGlzLmdldENvbHNwYW5SZWFsV2lkdGgsXG4gICAgICAgICAgZ2V0Q2VsbFN0eWxlOiB0aGlzLmdldENlbGxTdHlsZSxcbiAgICAgICAgICBnZXRDZWxsQ2xhc3M6IHRoaXMuZ2V0Q2VsbENsYXNzLFxuICAgICAgICAgIGhhbmRsZUNlbGxNb3VzZUVudGVyOiB0aGlzLmhhbmRsZUNlbGxNb3VzZUVudGVyLFxuICAgICAgICAgIGhhbmRsZUNlbGxNb3VzZUxlYXZlOiB0aGlzLmhhbmRsZUNlbGxNb3VzZUxlYXZlLFxuICAgICAgICAgIGlzU2VsZWN0ZWQ6IHRoaXMuc3RvcmUuaXNTZWxlY3RlZChyb3cpLFxuICAgICAgICAgIGlzRXhwYW5kZWQ6IHRoaXMuc3RvcmUuc3RhdGVzLmV4cGFuZFJvd3MuaW5kZXhPZihyb3cpID4gLTEsXG4gICAgICAgICAgZml4ZWQ6IHRoaXMuZml4ZWRcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICB3cmFwcGVkUm93UmVuZGVyOiBmdW5jdGlvbiB3cmFwcGVkUm93UmVuZGVyKHJvdywgJGluZGV4KSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIGggPSB0aGlzLiRjcmVhdGVFbGVtZW50O1xuXG4gICAgICB2YXIgc3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgICAgdmFyIGlzUm93RXhwYW5kZWQgPSBzdG9yZS5pc1Jvd0V4cGFuZGVkLFxuICAgICAgICAgIGFzc2VydFJvd0tleSA9IHN0b3JlLmFzc2VydFJvd0tleTtcbiAgICAgIHZhciBfc3RvcmUkc3RhdGVzID0gc3RvcmUuc3RhdGVzLFxuICAgICAgICAgIHRyZWVEYXRhID0gX3N0b3JlJHN0YXRlcy50cmVlRGF0YSxcbiAgICAgICAgICBsYXp5VHJlZU5vZGVNYXAgPSBfc3RvcmUkc3RhdGVzLmxhenlUcmVlTm9kZU1hcCxcbiAgICAgICAgICBjaGlsZHJlbkNvbHVtbk5hbWUgPSBfc3RvcmUkc3RhdGVzLmNoaWxkcmVuQ29sdW1uTmFtZSxcbiAgICAgICAgICByb3dLZXkgPSBfc3RvcmUkc3RhdGVzLnJvd0tleTtcblxuICAgICAgaWYgKHRoaXMuaGFzRXhwYW5kQ29sdW1uICYmIGlzUm93RXhwYW5kZWQocm93KSkge1xuICAgICAgICB2YXIgcmVuZGVyRXhwYW5kZWQgPSB0aGlzLnRhYmxlLnJlbmRlckV4cGFuZGVkO1xuICAgICAgICB2YXIgdHIgPSB0aGlzLnJvd1JlbmRlcihyb3csICRpbmRleCk7XG4gICAgICAgIGlmICghcmVuZGVyRXhwYW5kZWQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbRWxlbWVudCBFcnJvcl1yZW5kZXJFeHBhbmRlZCBpcyByZXF1aXJlZC4nKTtcbiAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5L2/55So5LqM57u05pWw57uE77yM6YG/5YWN5L+u5pS5ICRpbmRleFxuICAgICAgICByZXR1cm4gW1t0ciwgaChcbiAgICAgICAgICAndHInLFxuICAgICAgICAgIHsga2V5OiAnZXhwYW5kZWQtcm93X18nICsgdHIua2V5IH0sXG4gICAgICAgICAgW2goXG4gICAgICAgICAgICAndGQnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhdHRyczogeyBjb2xzcGFuOiB0aGlzLmNvbHVtbnNDb3VudCB9LFxuICAgICAgICAgICAgICAnY2xhc3MnOiAnZWwtdGFibGVfX2NlbGwgZWwtdGFibGVfX2V4cGFuZGVkLWNlbGwnIH0sXG4gICAgICAgICAgICBbcmVuZGVyRXhwYW5kZWQodGhpcy4kY3JlYXRlRWxlbWVudCwgeyByb3c6IHJvdywgJGluZGV4OiAkaW5kZXgsIHN0b3JlOiB0aGlzLnN0b3JlIH0pXVxuICAgICAgICAgICldXG4gICAgICAgICldXTtcbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0LmtleXModHJlZURhdGEpLmxlbmd0aCkge1xuICAgICAgICBhc3NlcnRSb3dLZXkoKTtcbiAgICAgICAgLy8gVHJlZVRhYmxlIOaXtu+8jHJvd0tleSDlv4XpobvnlLHnlKjmiLforr7lrprvvIzkuI3kvb/nlKggZ2V0S2V5T2ZSb3cg6K6h566XXG4gICAgICAgIC8vIOWcqOiwg+eUqCByb3dSZW5kZXIg5Ye95pWw5pe277yM5LuN54S25Lya6K6h566XIHJvd0tlee+8jOS4jeWkquWlveeahOaTjeS9nFxuICAgICAgICB2YXIga2V5ID0gZ2V0Um93SWRlbnRpdHkocm93LCByb3dLZXkpO1xuICAgICAgICB2YXIgY3VyID0gdHJlZURhdGFba2V5XTtcbiAgICAgICAgdmFyIHRyZWVSb3dEYXRhID0gbnVsbDtcbiAgICAgICAgaWYgKGN1cikge1xuICAgICAgICAgIHRyZWVSb3dEYXRhID0ge1xuICAgICAgICAgICAgZXhwYW5kZWQ6IGN1ci5leHBhbmRlZCxcbiAgICAgICAgICAgIGxldmVsOiBjdXIubGV2ZWwsXG4gICAgICAgICAgICBkaXNwbGF5OiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodHlwZW9mIGN1ci5sYXp5ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VyLmxvYWRlZCA9PT0gJ2Jvb2xlYW4nICYmIGN1ci5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgdHJlZVJvd0RhdGEubm9MYXp5Q2hpbGRyZW4gPSAhKGN1ci5jaGlsZHJlbiAmJiBjdXIuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyZWVSb3dEYXRhLmxvYWRpbmcgPSBjdXIubG9hZGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRtcCA9IFt0aGlzLnJvd1JlbmRlcihyb3csICRpbmRleCwgdHJlZVJvd0RhdGEpXTtcbiAgICAgICAgLy8g5riy5p+T5bWM5aWX5pWw5o2uXG4gICAgICAgIGlmIChjdXIpIHtcbiAgICAgICAgICAvLyBjdXJyZW50Um93IOiusOW9leeahOaYryBpbmRleO+8jOaJgOS7pei/mOmcgOS4u+WKqOWinuWKoCBUcmVlVGFibGUg55qEIGluZGV4XG4gICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgIHZhciB0cmF2ZXJzZSA9IGZ1bmN0aW9uIHRyYXZlcnNlKGNoaWxkcmVuLCBwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmICghKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCAmJiBwYXJlbnQpKSByZXR1cm47XG4gICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAgIC8vIOeItuiKgueCueeahCBkaXNwbGF5IOeKtuaAgeW9seWTjeWtkOiKgueCueeahOaYvuekuueKtuaAgVxuICAgICAgICAgICAgICB2YXIgaW5uZXJUcmVlUm93RGF0YSA9IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBwYXJlbnQuZGlzcGxheSAmJiBwYXJlbnQuZXhwYW5kZWQsXG4gICAgICAgICAgICAgICAgbGV2ZWw6IHBhcmVudC5sZXZlbCArIDFcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdmFyIGNoaWxkS2V5ID0gZ2V0Um93SWRlbnRpdHkobm9kZSwgcm93S2V5KTtcbiAgICAgICAgICAgICAgaWYgKGNoaWxkS2V5ID09PSB1bmRlZmluZWQgfHwgY2hpbGRLZXkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZvciBuZXN0ZWQgZGF0YSBpdGVtLCByb3cta2V5IGlzIHJlcXVpcmVkLicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGN1ciA9IHRhYmxlX2JvZHlfZXh0ZW5kcyh7fSwgdHJlZURhdGFbY2hpbGRLZXldKTtcbiAgICAgICAgICAgICAgLy8g5a+55LqO5b2T5YmN6IqC54K577yM5YiG5oiQ5pyJ5peg5a2Q6IqC54K55Lik56eN5oOF5Ya144CCXG4gICAgICAgICAgICAgIC8vIOWmguaenOWMheWQq+WtkOiKgueCueeahO+8jOiuvue9riBleHBhbmRlZCDlsZ7mgKfjgIJcbiAgICAgICAgICAgICAgLy8g5a+55LqO5a6D5a2Q6IqC54K555qEIGRpc3BsYXkg5bGe5oCn55Sx5a6D5pys6Lqr55qEIGV4cGFuZGVkIOS4jiBkaXNwbGF5IOWFseWQjOWGs+WumuOAglxuICAgICAgICAgICAgICBpZiAoY3VyKSB7XG4gICAgICAgICAgICAgICAgaW5uZXJUcmVlUm93RGF0YS5leHBhbmRlZCA9IGN1ci5leHBhbmRlZDtcbiAgICAgICAgICAgICAgICAvLyDmh5LliqDovb3nmoTmn5DkupvoioLngrnvvIxsZXZlbCDmnKrnn6VcbiAgICAgICAgICAgICAgICBjdXIubGV2ZWwgPSBjdXIubGV2ZWwgfHwgaW5uZXJUcmVlUm93RGF0YS5sZXZlbDtcbiAgICAgICAgICAgICAgICBjdXIuZGlzcGxheSA9ICEhKGN1ci5leHBhbmRlZCAmJiBpbm5lclRyZWVSb3dEYXRhLmRpc3BsYXkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VyLmxhenkgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXIubG9hZGVkID09PSAnYm9vbGVhbicgJiYgY3VyLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBpbm5lclRyZWVSb3dEYXRhLm5vTGF6eUNoaWxkcmVuID0gIShjdXIuY2hpbGRyZW4gJiYgY3VyLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpbm5lclRyZWVSb3dEYXRhLmxvYWRpbmcgPSBjdXIubG9hZGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICB0bXAucHVzaChfdGhpczUucm93UmVuZGVyKG5vZGUsICRpbmRleCArIGksIGlubmVyVHJlZVJvd0RhdGEpKTtcbiAgICAgICAgICAgICAgaWYgKGN1cikge1xuICAgICAgICAgICAgICAgIHZhciBfbm9kZXMgPSBsYXp5VHJlZU5vZGVNYXBbY2hpbGRLZXldIHx8IG5vZGVbY2hpbGRyZW5Db2x1bW5OYW1lXTtcbiAgICAgICAgICAgICAgICB0cmF2ZXJzZShfbm9kZXMsIGN1cik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8g5a+55LqOIHJvb3Qg6IqC54K577yMZGlzcGxheSDkuIDlrprkuLogdHJ1ZVxuICAgICAgICAgIGN1ci5kaXNwbGF5ID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgbm9kZXMgPSBsYXp5VHJlZU5vZGVNYXBba2V5XSB8fCByb3dbY2hpbGRyZW5Db2x1bW5OYW1lXTtcbiAgICAgICAgICB0cmF2ZXJzZShub2RlcywgY3VyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG1wO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93UmVuZGVyKHJvdywgJGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90YWJsZS9zcmMvZmlsdGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03ZjJjOTE5ZiZcbnZhciBmaWx0ZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZjJjOTE5Zl9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJ0cmFuc2l0aW9uXCIsIHsgYXR0cnM6IHsgbmFtZTogXCJlbC16b29tLWluLXRvcFwiIH0gfSwgW1xuICAgIF92bS5tdWx0aXBsZVxuICAgICAgPyBfYyhcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiY2xpY2tvdXRzaWRlXCIsXG4gICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LWNsaWNrb3V0c2lkZVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uaGFuZGxlT3V0c2lkZUNsaWNrLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiaGFuZGxlT3V0c2lkZUNsaWNrXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IF92bS5zaG93UG9wcGVyLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwic2hvd1BvcHBlclwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10YWJsZS1maWx0ZXJcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgW1xuICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtdGFibGUtZmlsdGVyX19jb250ZW50XCIgfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgXCJlbC1zY3JvbGxiYXJcIixcbiAgICAgICAgICAgICAgICAgIHsgYXR0cnM6IHsgXCJ3cmFwLWNsYXNzXCI6IFwiZWwtdGFibGUtZmlsdGVyX193cmFwXCIgfSB9LFxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICBcImVsLWNoZWNrYm94LWdyb3VwXCIsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGFibGUtZmlsdGVyX19jaGVja2JveC1ncm91cFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5maWx0ZXJlZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oJCR2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmZpbHRlcmVkVmFsdWUgPSAkJHZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJmaWx0ZXJlZFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0uZmlsdGVycywgZnVuY3Rpb24oZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtY2hlY2tib3hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBrZXk6IGZpbHRlci52YWx1ZSwgYXR0cnM6IHsgbGFiZWw6IGZpbHRlci52YWx1ZSB9IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKGZpbHRlci50ZXh0KSldXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtdGFibGUtZmlsdGVyX19ib3R0b21cIiB9LCBbXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgY2xhc3M6IHsgXCJpcy1kaXNhYmxlZFwiOiBfdm0uZmlsdGVyZWRWYWx1ZS5sZW5ndGggPT09IDAgfSxcbiAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IGRpc2FibGVkOiBfdm0uZmlsdGVyZWRWYWx1ZS5sZW5ndGggPT09IDAgfSxcbiAgICAgICAgICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0uaGFuZGxlQ29uZmlybSB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0udChcImVsLnRhYmxlLmNvbmZpcm1GaWx0ZXJcIikpKV1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX2MoXCJidXR0b25cIiwgeyBvbjogeyBjbGljazogX3ZtLmhhbmRsZVJlc2V0IH0gfSwgW1xuICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLnQoXCJlbC50YWJsZS5yZXNldEZpbHRlclwiKSkpXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIF1cbiAgICAgICAgKVxuICAgICAgOiBfYyhcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiY2xpY2tvdXRzaWRlXCIsXG4gICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LWNsaWNrb3V0c2lkZVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uaGFuZGxlT3V0c2lkZUNsaWNrLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiaGFuZGxlT3V0c2lkZUNsaWNrXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IF92bS5zaG93UG9wcGVyLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwic2hvd1BvcHBlclwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10YWJsZS1maWx0ZXJcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgW1xuICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgIFwidWxcIixcbiAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC10YWJsZS1maWx0ZXJfX2xpc3RcIiB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICBcImxpXCIsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRhYmxlLWZpbHRlcl9fbGlzdC1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgXCJpcy1hY3RpdmVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5maWx0ZXJWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uZmlsdGVyVmFsdWUgPT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlU2VsZWN0KG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLnQoXCJlbC50YWJsZS5jbGVhckZpbHRlclwiKSkpXVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgX3ZtLl9sKF92bS5maWx0ZXJzLCBmdW5jdGlvbihmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJsaVwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAga2V5OiBmaWx0ZXIudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGFibGUtZmlsdGVyX19saXN0LWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzczogeyBcImlzLWFjdGl2ZVwiOiBfdm0uaXNBY3RpdmUoZmlsdGVyKSB9LFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IGxhYmVsOiBmaWx0ZXIudmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlU2VsZWN0KGZpbHRlci52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKGZpbHRlci50ZXh0KSldXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKVxuICAgICAgICAgIF1cbiAgICAgICAgKVxuICBdKVxufVxudmFyIGZpbHRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdmMmM5MTlmX3N0YXRpY1JlbmRlckZucyA9IFtdXG5maWx0ZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZjJjOTE5Zl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy9maWx0ZXItcGFuZWwudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdmMmM5MTlmJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL3NyYy9kcm9wZG93bi5qc1xuXG52YXIgZHJvcGRvd25zID0gW107XG5cbiFleHRlcm5hbF92dWVfZGVmYXVsdC5hLnByb3RvdHlwZS4kaXNTZXJ2ZXIgJiYgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgZHJvcGRvd25zLmZvckVhY2goZnVuY3Rpb24gKGRyb3Bkb3duKSB7XG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICBpZiAoIWRyb3Bkb3duIHx8ICFkcm9wZG93bi4kZWwpIHJldHVybjtcbiAgICBpZiAodGFyZ2V0ID09PSBkcm9wZG93bi4kZWwgfHwgZHJvcGRvd24uJGVsLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJvcGRvd24uaGFuZGxlT3V0c2lkZUNsaWNrICYmIGRyb3Bkb3duLmhhbmRsZU91dHNpZGVDbGljayhldmVudCk7XG4gIH0pO1xufSk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19kcm9wZG93biA9ICh7XG4gIG9wZW46IGZ1bmN0aW9uIG9wZW4oaW5zdGFuY2UpIHtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGRyb3Bkb3ducy5wdXNoKGluc3RhbmNlKTtcbiAgICB9XG4gIH0sXG4gIGNsb3NlOiBmdW5jdGlvbiBjbG9zZShpbnN0YW5jZSkge1xuICAgIHZhciBpbmRleCA9IGRyb3Bkb3ducy5pbmRleE9mKGluc3RhbmNlKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBkcm9wZG93bnMuc3BsaWNlKGluc3RhbmNlLCAxKTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL2NoZWNrYm94LWdyb3VwXCJcbnZhciBjaGVja2JveF9ncm91cF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyKTtcbnZhciBjaGVja2JveF9ncm91cF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjaGVja2JveF9ncm91cF8pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90YWJsZS9zcmMvZmlsdGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBmaWx0ZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxUYWJsZUZpbHRlclBhbmVsJyxcblxuICBtaXhpbnM6IFt2dWVfcG9wcGVyX2RlZmF1bHQuYSwgbG9jYWxlX2RlZmF1bHQuYV0sXG5cbiAgZGlyZWN0aXZlczoge1xuICAgIENsaWNrb3V0c2lkZTogY2xpY2tvdXRzaWRlX2RlZmF1bHQuYVxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBFbENoZWNrYm94OiBjaGVja2JveF9kZWZhdWx0LmEsXG4gICAgRWxDaGVja2JveEdyb3VwOiBjaGVja2JveF9ncm91cF9kZWZhdWx0LmEsXG4gICAgRWxTY3JvbGxiYXI6IHNjcm9sbGJhcl9kZWZhdWx0LmFcbiAgfSxcblxuICBwcm9wczoge1xuICAgIHBsYWNlbWVudDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2JvdHRvbS1lbmQnXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBpc0FjdGl2ZTogZnVuY3Rpb24gaXNBY3RpdmUoZmlsdGVyKSB7XG4gICAgICByZXR1cm4gZmlsdGVyLnZhbHVlID09PSB0aGlzLmZpbHRlclZhbHVlO1xuICAgIH0sXG4gICAgaGFuZGxlT3V0c2lkZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVPdXRzaWRlQ2xpY2soKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuc2hvd1BvcHBlciA9IGZhbHNlO1xuICAgICAgfSwgMTYpO1xuICAgIH0sXG4gICAgaGFuZGxlQ29uZmlybTogZnVuY3Rpb24gaGFuZGxlQ29uZmlybSgpIHtcbiAgICAgIHRoaXMuY29uZmlybUZpbHRlcih0aGlzLmZpbHRlcmVkVmFsdWUpO1xuICAgICAgdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2soKTtcbiAgICB9LFxuICAgIGhhbmRsZVJlc2V0OiBmdW5jdGlvbiBoYW5kbGVSZXNldCgpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRWYWx1ZSA9IFtdO1xuICAgICAgdGhpcy5jb25maXJtRmlsdGVyKHRoaXMuZmlsdGVyZWRWYWx1ZSk7XG4gICAgICB0aGlzLmhhbmRsZU91dHNpZGVDbGljaygpO1xuICAgIH0sXG4gICAgaGFuZGxlU2VsZWN0OiBmdW5jdGlvbiBoYW5kbGVTZWxlY3QoZmlsdGVyVmFsdWUpIHtcbiAgICAgIHRoaXMuZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmaWx0ZXJWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZmlsdGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5jb25maXJtRmlsdGVyKHRoaXMuZmlsdGVyZWRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbmZpcm1GaWx0ZXIoW10pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhhbmRsZU91dHNpZGVDbGljaygpO1xuICAgIH0sXG4gICAgY29uZmlybUZpbHRlcjogZnVuY3Rpb24gY29uZmlybUZpbHRlcihmaWx0ZXJlZFZhbHVlKSB7XG4gICAgICB0aGlzLnRhYmxlLnN0b3JlLmNvbW1pdCgnZmlsdGVyQ2hhbmdlJywge1xuICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICB2YWx1ZXM6IGZpbHRlcmVkVmFsdWVcbiAgICAgIH0pO1xuICAgICAgdGhpcy50YWJsZS5zdG9yZS51cGRhdGVBbGxTZWxlY3RlZCgpO1xuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YWJsZTogbnVsbCxcbiAgICAgIGNlbGw6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGxcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmaWx0ZXJzOiBmdW5jdGlvbiBmaWx0ZXJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sdW1uICYmIHRoaXMuY29sdW1uLmZpbHRlcnM7XG4gICAgfSxcblxuXG4gICAgZmlsdGVyVmFsdWU6IHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuY29sdW1uLmZpbHRlcmVkVmFsdWUgfHwgW10pWzBdO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkVmFsdWUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFZhbHVlLnNwbGljZSgwLCAxLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRWYWx1ZS5zcGxpY2UoMCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZpbHRlcmVkVmFsdWU6IHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZmlsdGVyZWRWYWx1ZSB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uKSB7XG4gICAgICAgICAgdGhpcy5jb2x1bW4uZmlsdGVyZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG11bHRpcGxlOiBmdW5jdGlvbiBtdWx0aXBsZSgpIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZmlsdGVyTXVsdGlwbGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHRoaXMucG9wcGVyRWxtID0gdGhpcy4kZWw7XG4gICAgdGhpcy5yZWZlcmVuY2VFbG0gPSB0aGlzLmNlbGw7XG4gICAgdGhpcy50YWJsZS5ib2R5V3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczIudXBkYXRlUG9wcGVyKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiR3YXRjaCgnc2hvd1BvcHBlcicsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKF90aGlzMi5jb2x1bW4pIF90aGlzMi5jb2x1bW4uZmlsdGVyT3BlbmVkID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgc3JjX2Ryb3Bkb3duLm9wZW4oX3RoaXMyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNyY19kcm9wZG93bi5jbG9zZShfdGhpczIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgc2hvd1BvcHBlcjogZnVuY3Rpb24gc2hvd1BvcHBlcih2YWwpIHtcbiAgICAgIGlmICh2YWwgPT09IHRydWUgJiYgcGFyc2VJbnQodGhpcy5wb3BwZXJKUy5fcG9wcGVyLnN0eWxlLnpJbmRleCwgMTApIDwgcG9wdXBfW1wiUG9wdXBNYW5hZ2VyXCJdLnpJbmRleCkge1xuICAgICAgICB0aGlzLnBvcHBlckpTLl9wb3BwZXIuc3R5bGUuekluZGV4ID0gcG9wdXBfW1wiUG9wdXBNYW5hZ2VyXCJdLm5leHRaSW5kZXgoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvZmlsdGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfZmlsdGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGZpbHRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvZmlsdGVyLXBhbmVsLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGZpbHRlcl9wYW5lbF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19maWx0ZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGZpbHRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdmMmM5MTlmX3JlbmRlcixcbiAgZmlsdGVyX3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfN2YyYzkxOWZfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBmaWx0ZXJfcGFuZWxfYXBpOyB9XG5maWx0ZXJfcGFuZWxfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy90YWJsZS9zcmMvZmlsdGVyLXBhbmVsLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBmaWx0ZXJfcGFuZWwgPSAoZmlsdGVyX3BhbmVsX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL3RhYmxlLWhlYWRlci5qc1xudmFyIHRhYmxlX2hlYWRlcl9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuXG5cblxuXG5cblxuXG52YXIgZ2V0QWxsQ29sdW1ucyA9IGZ1bmN0aW9uIGdldEFsbENvbHVtbnMoY29sdW1ucykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgaWYgKGNvbHVtbi5jaGlsZHJlbikge1xuICAgICAgcmVzdWx0LnB1c2goY29sdW1uKTtcbiAgICAgIHJlc3VsdC5wdXNoLmFwcGx5KHJlc3VsdCwgZ2V0QWxsQ29sdW1ucyhjb2x1bW4uY2hpbGRyZW4pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goY29sdW1uKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyIGNvbnZlcnRUb1Jvd3MgPSBmdW5jdGlvbiBjb252ZXJ0VG9Sb3dzKG9yaWdpbkNvbHVtbnMpIHtcbiAgdmFyIG1heExldmVsID0gMTtcbiAgdmFyIHRyYXZlcnNlID0gZnVuY3Rpb24gdHJhdmVyc2UoY29sdW1uLCBwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBjb2x1bW4ubGV2ZWwgPSBwYXJlbnQubGV2ZWwgKyAxO1xuICAgICAgaWYgKG1heExldmVsIDwgY29sdW1uLmxldmVsKSB7XG4gICAgICAgIG1heExldmVsID0gY29sdW1uLmxldmVsO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29sdW1uLmNoaWxkcmVuKSB7XG4gICAgICB2YXIgY29sU3BhbiA9IDA7XG4gICAgICBjb2x1bW4uY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoc3ViQ29sdW1uKSB7XG4gICAgICAgIHRyYXZlcnNlKHN1YkNvbHVtbiwgY29sdW1uKTtcbiAgICAgICAgY29sU3BhbiArPSBzdWJDb2x1bW4uY29sU3BhbjtcbiAgICAgIH0pO1xuICAgICAgY29sdW1uLmNvbFNwYW4gPSBjb2xTcGFuO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2x1bW4uY29sU3BhbiA9IDE7XG4gICAgfVxuICB9O1xuXG4gIG9yaWdpbkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgY29sdW1uLmxldmVsID0gMTtcbiAgICB0cmF2ZXJzZShjb2x1bW4pO1xuICB9KTtcblxuICB2YXIgcm93cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1heExldmVsOyBpKyspIHtcbiAgICByb3dzLnB1c2goW10pO1xuICB9XG5cbiAgdmFyIGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKG9yaWdpbkNvbHVtbnMpO1xuXG4gIGFsbENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgaWYgKCFjb2x1bW4uY2hpbGRyZW4pIHtcbiAgICAgIGNvbHVtbi5yb3dTcGFuID0gbWF4TGV2ZWwgLSBjb2x1bW4ubGV2ZWwgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2x1bW4ucm93U3BhbiA9IDE7XG4gICAgfVxuICAgIHJvd3NbY29sdW1uLmxldmVsIC0gMV0ucHVzaChjb2x1bW4pO1xuICB9KTtcblxuICByZXR1cm4gcm93cztcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRhYmxlX2hlYWRlciA9ICh7XG4gIG5hbWU6ICdFbFRhYmxlSGVhZGVyJyxcblxuICBtaXhpbnM6IFtsYXlvdXRfb2JzZXJ2ZXJdLFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIG9yaWdpbkNvbHVtbnMgPSB0aGlzLnN0b3JlLnN0YXRlcy5vcmlnaW5Db2x1bW5zO1xuICAgIHZhciBjb2x1bW5Sb3dzID0gY29udmVydFRvUm93cyhvcmlnaW5Db2x1bW5zLCB0aGlzLmNvbHVtbnMpO1xuICAgIC8vIOaYr+WQpuaLpeacieWkmue6p+ihqOWktFxuICAgIHZhciBpc0dyb3VwID0gY29sdW1uUm93cy5sZW5ndGggPiAxO1xuICAgIGlmIChpc0dyb3VwKSB0aGlzLiRwYXJlbnQuaXNHcm91cCA9IHRydWU7XG4gICAgcmV0dXJuIGgoXG4gICAgICAndGFibGUnLFxuICAgICAge1xuICAgICAgICAnY2xhc3MnOiAnZWwtdGFibGVfX2hlYWRlcicsXG4gICAgICAgIGF0dHJzOiB7IGNlbGxzcGFjaW5nOiAnMCcsXG4gICAgICAgICAgY2VsbHBhZGRpbmc6ICcwJyxcbiAgICAgICAgICBib3JkZXI6ICcwJyB9XG4gICAgICB9LFxuICAgICAgW2goJ2NvbGdyb3VwJywgW3RoaXMuY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gaCgnY29sJywge1xuICAgICAgICAgIGF0dHJzOiB7IG5hbWU6IGNvbHVtbi5pZCB9LFxuICAgICAgICAgIGtleTogY29sdW1uLmlkIH0pO1xuICAgICAgfSksIHRoaXMuaGFzR3V0dGVyID8gaCgnY29sJywge1xuICAgICAgICBhdHRyczogeyBuYW1lOiAnZ3V0dGVyJyB9XG4gICAgICB9KSA6ICcnXSksIGgoXG4gICAgICAgICd0aGVhZCcsXG4gICAgICAgIHsgJ2NsYXNzJzogW3sgJ2lzLWdyb3VwJzogaXNHcm91cCwgJ2hhcy1ndXR0ZXInOiB0aGlzLmhhc0d1dHRlciB9XSB9LFxuICAgICAgICBbdGhpcy5fbChjb2x1bW5Sb3dzLCBmdW5jdGlvbiAoY29sdW1ucywgcm93SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gaChcbiAgICAgICAgICAgICd0cicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0eWxlOiBfdGhpcy5nZXRIZWFkZXJSb3dTdHlsZShyb3dJbmRleCksXG4gICAgICAgICAgICAgICdjbGFzcyc6IF90aGlzLmdldEhlYWRlclJvd0NsYXNzKHJvd0luZGV4KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uLCBjZWxsSW5kZXgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGgoXG4gICAgICAgICAgICAgICAgJ3RoJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICBjb2xzcGFuOiBjb2x1bW4uY29sU3BhbixcbiAgICAgICAgICAgICAgICAgICAgcm93c3BhbjogY29sdW1uLnJvd1NwYW5cbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAnbW91c2Vtb3ZlJzogZnVuY3Rpb24gbW91c2Vtb3ZlKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVNb3VzZU1vdmUoJGV2ZW50LCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAnbW91c2VvdXQnOiBfdGhpcy5oYW5kbGVNb3VzZU91dCxcbiAgICAgICAgICAgICAgICAgICAgJ21vdXNlZG93bic6IGZ1bmN0aW9uIG1vdXNlZG93bigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuaGFuZGxlTW91c2VEb3duKCRldmVudCwgY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ2NsaWNrJzogZnVuY3Rpb24gY2xpY2soJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZUhlYWRlckNsaWNrKCRldmVudCwgY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRleHRtZW51JzogZnVuY3Rpb24gY29udGV4dG1lbnUoJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZUhlYWRlckNvbnRleHRNZW51KCRldmVudCwgY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgc3R5bGU6IF90aGlzLmdldEhlYWRlckNlbGxTdHlsZShyb3dJbmRleCwgY2VsbEluZGV4LCBjb2x1bW5zLCBjb2x1bW4pLFxuICAgICAgICAgICAgICAgICAgJ2NsYXNzJzogX3RoaXMuZ2V0SGVhZGVyQ2VsbENsYXNzKHJvd0luZGV4LCBjZWxsSW5kZXgsIGNvbHVtbnMsIGNvbHVtbiksXG4gICAgICAgICAgICAgICAgICBrZXk6IGNvbHVtbi5pZCB9LFxuICAgICAgICAgICAgICAgIFtoKFxuICAgICAgICAgICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgICAgICAgICB7ICdjbGFzcyc6IFsnY2VsbCcsIGNvbHVtbi5maWx0ZXJlZFZhbHVlICYmIGNvbHVtbi5maWx0ZXJlZFZhbHVlLmxlbmd0aCA+IDAgPyAnaGlnaGxpZ2h0JyA6ICcnLCBjb2x1bW4ubGFiZWxDbGFzc05hbWVdIH0sXG4gICAgICAgICAgICAgICAgICBbY29sdW1uLnJlbmRlckhlYWRlciA/IGNvbHVtbi5yZW5kZXJIZWFkZXIuY2FsbChfdGhpcy5fcmVuZGVyUHJveHksIGgsIHsgY29sdW1uOiBjb2x1bW4sICRpbmRleDogY2VsbEluZGV4LCBzdG9yZTogX3RoaXMuc3RvcmUsIF9zZWxmOiBfdGhpcy4kcGFyZW50LiR2bm9kZS5jb250ZXh0IH0pIDogY29sdW1uLmxhYmVsLCBjb2x1bW4uc29ydGFibGUgPyBoKFxuICAgICAgICAgICAgICAgICAgICAnc3BhbicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAnY2xhc3MnOiAnY2FyZXQtd3JhcHBlcicsXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjbGljayc6IGZ1bmN0aW9uIGNsaWNrKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuaGFuZGxlU29ydENsaWNrKCRldmVudCwgY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFtoKCdpJywgeyAnY2xhc3MnOiAnc29ydC1jYXJldCBhc2NlbmRpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnY2xpY2snOiBmdW5jdGlvbiBjbGljaygkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZVNvcnRDbGljaygkZXZlbnQsIGNvbHVtbiwgJ2FzY2VuZGluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSksIGgoJ2knLCB7ICdjbGFzcyc6ICdzb3J0LWNhcmV0IGRlc2NlbmRpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnY2xpY2snOiBmdW5jdGlvbiBjbGljaygkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZVNvcnRDbGljaygkZXZlbnQsIGNvbHVtbiwgJ2Rlc2NlbmRpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXVxuICAgICAgICAgICAgICAgICAgKSA6ICcnLCBjb2x1bW4uZmlsdGVyYWJsZSA/IGgoXG4gICAgICAgICAgICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICdjbGFzcyc6ICdlbC10YWJsZV9fY29sdW1uLWZpbHRlci10cmlnZ2VyJyxcbiAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2NsaWNrJzogZnVuY3Rpb24gY2xpY2soJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVGaWx0ZXJDbGljaygkZXZlbnQsIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBbaCgnaScsIHsgJ2NsYXNzJzogWydlbC1pY29uLWFycm93LWRvd24nLCBjb2x1bW4uZmlsdGVyT3BlbmVkID8gJ2VsLWljb24tYXJyb3ctdXAnIDogJyddIH0pXVxuICAgICAgICAgICAgICAgICAgKSA6ICcnXVxuICAgICAgICAgICAgICAgICldXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSwgX3RoaXMuaGFzR3V0dGVyID8gaCgndGgnLCB7ICdjbGFzcyc6ICdlbC10YWJsZV9fY2VsbCBndXR0ZXInIH0pIDogJyddXG4gICAgICAgICAgKTtcbiAgICAgICAgfSldXG4gICAgICApXVxuICAgICk7XG4gIH0sXG5cblxuICBwcm9wczoge1xuICAgIGZpeGVkOiBTdHJpbmcsXG4gICAgc3RvcmU6IHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBib3JkZXI6IEJvb2xlYW4sXG4gICAgZGVmYXVsdFNvcnQ6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb3A6ICcnLFxuICAgICAgICAgIG9yZGVyOiAnJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxDaGVja2JveDogY2hlY2tib3hfZGVmYXVsdC5hXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHRhYmxlX2hlYWRlcl9leHRlbmRzKHtcbiAgICB0YWJsZTogZnVuY3Rpb24gdGFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50O1xuICAgIH0sXG4gICAgaGFzR3V0dGVyOiBmdW5jdGlvbiBoYXNHdXR0ZXIoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuZml4ZWQgJiYgdGhpcy50YWJsZUxheW91dC5ndXR0ZXJXaWR0aDtcbiAgICB9XG4gIH0sIG1hcFN0YXRlcyh7XG4gICAgY29sdW1uczogJ2NvbHVtbnMnLFxuICAgIGlzQWxsU2VsZWN0ZWQ6ICdpc0FsbFNlbGVjdGVkJyxcbiAgICBsZWZ0Rml4ZWRMZWFmQ291bnQ6ICdmaXhlZExlYWZDb2x1bW5zTGVuZ3RoJyxcbiAgICByaWdodEZpeGVkTGVhZkNvdW50OiAncmlnaHRGaXhlZExlYWZDb2x1bW5zTGVuZ3RoJyxcbiAgICBjb2x1bW5zQ291bnQ6IGZ1bmN0aW9uIGNvbHVtbnNDb3VudChzdGF0ZXMpIHtcbiAgICAgIHJldHVybiBzdGF0ZXMuY29sdW1ucy5sZW5ndGg7XG4gICAgfSxcbiAgICBsZWZ0Rml4ZWRDb3VudDogZnVuY3Rpb24gbGVmdEZpeGVkQ291bnQoc3RhdGVzKSB7XG4gICAgICByZXR1cm4gc3RhdGVzLmZpeGVkQ29sdW1ucy5sZW5ndGg7XG4gICAgfSxcbiAgICByaWdodEZpeGVkQ291bnQ6IGZ1bmN0aW9uIHJpZ2h0Rml4ZWRDb3VudChzdGF0ZXMpIHtcbiAgICAgIHJldHVybiBzdGF0ZXMucmlnaHRGaXhlZENvbHVtbnMubGVuZ3RoO1xuICAgIH1cbiAgfSkpLFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5maWx0ZXJQYW5lbHMgPSB7fTtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIC8vIG5leHRUaWNrIOaYr+acieW/heimgeeahCBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L3B1bGwvMTEzMTFcbiAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2RlZmF1bHRTb3J0ID0gX3RoaXMyLmRlZmF1bHRTb3J0LFxuICAgICAgICAgIHByb3AgPSBfZGVmYXVsdFNvcnQucHJvcCxcbiAgICAgICAgICBvcmRlciA9IF9kZWZhdWx0U29ydC5vcmRlcjtcblxuICAgICAgdmFyIGluaXQgPSB0cnVlO1xuICAgICAgX3RoaXMyLnN0b3JlLmNvbW1pdCgnc29ydCcsIHsgcHJvcDogcHJvcCwgb3JkZXI6IG9yZGVyLCBpbml0OiBpbml0IH0pO1xuICAgIH0pO1xuICB9LFxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIHZhciBwYW5lbHMgPSB0aGlzLmZpbHRlclBhbmVscztcbiAgICBmb3IgKHZhciBwcm9wIGluIHBhbmVscykge1xuICAgICAgaWYgKHBhbmVscy5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBwYW5lbHNbcHJvcF0pIHtcbiAgICAgICAgcGFuZWxzW3Byb3BdLiRkZXN0cm95KHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBpc0NlbGxIaWRkZW46IGZ1bmN0aW9uIGlzQ2VsbEhpZGRlbihpbmRleCwgY29sdW1ucykge1xuICAgICAgdmFyIHN0YXJ0ID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5kZXg7IGkrKykge1xuICAgICAgICBzdGFydCArPSBjb2x1bW5zW2ldLmNvbFNwYW47XG4gICAgICB9XG4gICAgICB2YXIgYWZ0ZXIgPSBzdGFydCArIGNvbHVtbnNbaW5kZXhdLmNvbFNwYW4gLSAxO1xuICAgICAgaWYgKHRoaXMuZml4ZWQgPT09IHRydWUgfHwgdGhpcy5maXhlZCA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIHJldHVybiBhZnRlciA+PSB0aGlzLmxlZnRGaXhlZExlYWZDb3VudDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5maXhlZCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICByZXR1cm4gc3RhcnQgPCB0aGlzLmNvbHVtbnNDb3VudCAtIHRoaXMucmlnaHRGaXhlZExlYWZDb3VudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhZnRlciA8IHRoaXMubGVmdEZpeGVkTGVhZkNvdW50IHx8IHN0YXJ0ID49IHRoaXMuY29sdW1uc0NvdW50IC0gdGhpcy5yaWdodEZpeGVkTGVhZkNvdW50O1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0SGVhZGVyUm93U3R5bGU6IGZ1bmN0aW9uIGdldEhlYWRlclJvd1N0eWxlKHJvd0luZGV4KSB7XG4gICAgICB2YXIgaGVhZGVyUm93U3R5bGUgPSB0aGlzLnRhYmxlLmhlYWRlclJvd1N0eWxlO1xuICAgICAgaWYgKHR5cGVvZiBoZWFkZXJSb3dTdHlsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gaGVhZGVyUm93U3R5bGUuY2FsbChudWxsLCB7IHJvd0luZGV4OiByb3dJbmRleCB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoZWFkZXJSb3dTdHlsZTtcbiAgICB9LFxuICAgIGdldEhlYWRlclJvd0NsYXNzOiBmdW5jdGlvbiBnZXRIZWFkZXJSb3dDbGFzcyhyb3dJbmRleCkge1xuICAgICAgdmFyIGNsYXNzZXMgPSBbXTtcblxuICAgICAgdmFyIGhlYWRlclJvd0NsYXNzTmFtZSA9IHRoaXMudGFibGUuaGVhZGVyUm93Q2xhc3NOYW1lO1xuICAgICAgaWYgKHR5cGVvZiBoZWFkZXJSb3dDbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChoZWFkZXJSb3dDbGFzc05hbWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaGVhZGVyUm93Q2xhc3NOYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChoZWFkZXJSb3dDbGFzc05hbWUuY2FsbChudWxsLCB7IHJvd0luZGV4OiByb3dJbmRleCB9KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgICB9LFxuICAgIGdldEhlYWRlckNlbGxTdHlsZTogZnVuY3Rpb24gZ2V0SGVhZGVyQ2VsbFN0eWxlKHJvd0luZGV4LCBjb2x1bW5JbmRleCwgcm93LCBjb2x1bW4pIHtcbiAgICAgIHZhciBoZWFkZXJDZWxsU3R5bGUgPSB0aGlzLnRhYmxlLmhlYWRlckNlbGxTdHlsZTtcbiAgICAgIGlmICh0eXBlb2YgaGVhZGVyQ2VsbFN0eWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXJDZWxsU3R5bGUuY2FsbChudWxsLCB7XG4gICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgICAgIGNvbHVtbkluZGV4OiBjb2x1bW5JbmRleCxcbiAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoZWFkZXJDZWxsU3R5bGU7XG4gICAgfSxcbiAgICBnZXRIZWFkZXJDZWxsQ2xhc3M6IGZ1bmN0aW9uIGdldEhlYWRlckNlbGxDbGFzcyhyb3dJbmRleCwgY29sdW1uSW5kZXgsIHJvdywgY29sdW1uKSB7XG4gICAgICB2YXIgY2xhc3NlcyA9IFtjb2x1bW4uaWQsIGNvbHVtbi5vcmRlciwgY29sdW1uLmhlYWRlckFsaWduLCBjb2x1bW4uY2xhc3NOYW1lLCBjb2x1bW4ubGFiZWxDbGFzc05hbWVdO1xuXG4gICAgICBpZiAocm93SW5kZXggPT09IDAgJiYgdGhpcy5pc0NlbGxIaWRkZW4oY29sdW1uSW5kZXgsIHJvdykpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdpcy1oaWRkZW4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjb2x1bW4uY2hpbGRyZW4pIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdpcy1sZWFmJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2x1bW4uc29ydGFibGUpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdpcy1zb3J0YWJsZScpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVhZGVyQ2VsbENsYXNzTmFtZSA9IHRoaXMudGFibGUuaGVhZGVyQ2VsbENsYXNzTmFtZTtcbiAgICAgIGlmICh0eXBlb2YgaGVhZGVyQ2VsbENsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGhlYWRlckNlbGxDbGFzc05hbWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaGVhZGVyQ2VsbENsYXNzTmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjbGFzc2VzLnB1c2goaGVhZGVyQ2VsbENsYXNzTmFtZS5jYWxsKG51bGwsIHtcbiAgICAgICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4LFxuICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgY2xhc3Nlcy5wdXNoKCdlbC10YWJsZV9fY2VsbCcpO1xuXG4gICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfSxcbiAgICB0b2dnbGVBbGxTZWxlY3Rpb246IGZ1bmN0aW9uIHRvZ2dsZUFsbFNlbGVjdGlvbigpIHtcbiAgICAgIHRoaXMuc3RvcmUuY29tbWl0KCd0b2dnbGVBbGxTZWxlY3Rpb24nKTtcbiAgICB9LFxuICAgIGhhbmRsZUZpbHRlckNsaWNrOiBmdW5jdGlvbiBoYW5kbGVGaWx0ZXJDbGljayhldmVudCwgY29sdW1uKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICB2YXIgY2VsbCA9IHRhcmdldC50YWdOYW1lID09PSAnVEgnID8gdGFyZ2V0IDogdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICBpZiAoT2JqZWN0KGRvbV9bXCJoYXNDbGFzc1wiXSkoY2VsbCwgJ25vY2xpY2snKSkgcmV0dXJuO1xuICAgICAgY2VsbCA9IGNlbGwucXVlcnlTZWxlY3RvcignLmVsLXRhYmxlX19jb2x1bW4tZmlsdGVyLXRyaWdnZXInKSB8fCBjZWxsO1xuICAgICAgdmFyIHRhYmxlID0gdGhpcy4kcGFyZW50O1xuXG4gICAgICB2YXIgZmlsdGVyUGFuZWwgPSB0aGlzLmZpbHRlclBhbmVsc1tjb2x1bW4uaWRdO1xuXG4gICAgICBpZiAoZmlsdGVyUGFuZWwgJiYgY29sdW1uLmZpbHRlck9wZW5lZCkge1xuICAgICAgICBmaWx0ZXJQYW5lbC5zaG93UG9wcGVyID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmaWx0ZXJQYW5lbCkge1xuICAgICAgICBmaWx0ZXJQYW5lbCA9IG5ldyBleHRlcm5hbF92dWVfZGVmYXVsdC5hKGZpbHRlcl9wYW5lbCk7XG4gICAgICAgIHRoaXMuZmlsdGVyUGFuZWxzW2NvbHVtbi5pZF0gPSBmaWx0ZXJQYW5lbDtcbiAgICAgICAgaWYgKGNvbHVtbi5maWx0ZXJQbGFjZW1lbnQpIHtcbiAgICAgICAgICBmaWx0ZXJQYW5lbC5wbGFjZW1lbnQgPSBjb2x1bW4uZmlsdGVyUGxhY2VtZW50O1xuICAgICAgICB9XG4gICAgICAgIGZpbHRlclBhbmVsLnRhYmxlID0gdGFibGU7XG4gICAgICAgIGZpbHRlclBhbmVsLmNlbGwgPSBjZWxsO1xuICAgICAgICBmaWx0ZXJQYW5lbC5jb2x1bW4gPSBjb2x1bW47XG4gICAgICAgICF0aGlzLiRpc1NlcnZlciAmJiBmaWx0ZXJQYW5lbC4kbW91bnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmlsdGVyUGFuZWwuc2hvd1BvcHBlciA9IHRydWU7XG4gICAgICB9LCAxNik7XG4gICAgfSxcbiAgICBoYW5kbGVIZWFkZXJDbGljazogZnVuY3Rpb24gaGFuZGxlSGVhZGVyQ2xpY2soZXZlbnQsIGNvbHVtbikge1xuICAgICAgaWYgKCFjb2x1bW4uZmlsdGVycyAmJiBjb2x1bW4uc29ydGFibGUpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVTb3J0Q2xpY2soZXZlbnQsIGNvbHVtbik7XG4gICAgICB9IGVsc2UgaWYgKGNvbHVtbi5maWx0ZXJhYmxlICYmICFjb2x1bW4uc29ydGFibGUpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVGaWx0ZXJDbGljayhldmVudCwgY29sdW1uKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy4kcGFyZW50LiRlbWl0KCdoZWFkZXItY2xpY2snLCBjb2x1bW4sIGV2ZW50KTtcbiAgICB9LFxuICAgIGhhbmRsZUhlYWRlckNvbnRleHRNZW51OiBmdW5jdGlvbiBoYW5kbGVIZWFkZXJDb250ZXh0TWVudShldmVudCwgY29sdW1uKSB7XG4gICAgICB0aGlzLiRwYXJlbnQuJGVtaXQoJ2hlYWRlci1jb250ZXh0bWVudScsIGNvbHVtbiwgZXZlbnQpO1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VEb3duOiBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQsIGNvbHVtbikge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLiRpc1NlcnZlcikgcmV0dXJuO1xuICAgICAgaWYgKGNvbHVtbi5jaGlsZHJlbiAmJiBjb2x1bW4uY2hpbGRyZW4ubGVuZ3RoID4gMCkgcmV0dXJuO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAodGhpcy5kcmFnZ2luZ0NvbHVtbiAmJiB0aGlzLmJvcmRlcikge1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLiRwYXJlbnQucmVzaXplUHJveHlWaXNpYmxlID0gdHJ1ZTtcblxuICAgICAgICB2YXIgdGFibGUgPSB0aGlzLiRwYXJlbnQ7XG4gICAgICAgIHZhciB0YWJsZUVsID0gdGFibGUuJGVsO1xuICAgICAgICB2YXIgdGFibGVMZWZ0ID0gdGFibGVFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgICAgICB2YXIgY29sdW1uRWwgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCd0aC4nICsgY29sdW1uLmlkKTtcbiAgICAgICAgdmFyIGNvbHVtblJlY3QgPSBjb2x1bW5FbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIG1pbkxlZnQgPSBjb2x1bW5SZWN0LmxlZnQgLSB0YWJsZUxlZnQgKyAzMDtcblxuICAgICAgICBPYmplY3QoZG9tX1tcImFkZENsYXNzXCJdKShjb2x1bW5FbCwgJ25vY2xpY2snKTtcblxuICAgICAgICB0aGlzLmRyYWdTdGF0ZSA9IHtcbiAgICAgICAgICBzdGFydE1vdXNlTGVmdDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICBzdGFydExlZnQ6IGNvbHVtblJlY3QucmlnaHQgLSB0YWJsZUxlZnQsXG4gICAgICAgICAgc3RhcnRDb2x1bW5MZWZ0OiBjb2x1bW5SZWN0LmxlZnQgLSB0YWJsZUxlZnQsXG4gICAgICAgICAgdGFibGVMZWZ0OiB0YWJsZUxlZnRcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgcmVzaXplUHJveHkgPSB0YWJsZS4kcmVmcy5yZXNpemVQcm94eTtcbiAgICAgICAgcmVzaXplUHJveHkuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ1N0YXRlLnN0YXJ0TGVmdCArICdweCc7XG5cbiAgICAgICAgZG9jdW1lbnQub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIGRvY3VtZW50Lm9uZHJhZ3N0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgaGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICAgICAgdmFyIGRlbHRhTGVmdCA9IGV2ZW50LmNsaWVudFggLSBfdGhpczMuZHJhZ1N0YXRlLnN0YXJ0TW91c2VMZWZ0O1xuICAgICAgICAgIHZhciBwcm94eUxlZnQgPSBfdGhpczMuZHJhZ1N0YXRlLnN0YXJ0TGVmdCArIGRlbHRhTGVmdDtcblxuICAgICAgICAgIHJlc2l6ZVByb3h5LnN0eWxlLmxlZnQgPSBNYXRoLm1heChtaW5MZWZ0LCBwcm94eUxlZnQpICsgJ3B4JztcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgaGFuZGxlTW91c2VVcCA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlVXAoKSB7XG4gICAgICAgICAgaWYgKF90aGlzMy5kcmFnZ2luZykge1xuICAgICAgICAgICAgdmFyIF9kcmFnU3RhdGUgPSBfdGhpczMuZHJhZ1N0YXRlLFxuICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uTGVmdCA9IF9kcmFnU3RhdGUuc3RhcnRDb2x1bW5MZWZ0LFxuICAgICAgICAgICAgICAgIHN0YXJ0TGVmdCA9IF9kcmFnU3RhdGUuc3RhcnRMZWZ0O1xuXG4gICAgICAgICAgICB2YXIgZmluYWxMZWZ0ID0gcGFyc2VJbnQocmVzaXplUHJveHkuc3R5bGUubGVmdCwgMTApO1xuICAgICAgICAgICAgdmFyIGNvbHVtbldpZHRoID0gZmluYWxMZWZ0IC0gc3RhcnRDb2x1bW5MZWZ0O1xuICAgICAgICAgICAgY29sdW1uLndpZHRoID0gY29sdW1uLnJlYWxXaWR0aCA9IGNvbHVtbldpZHRoO1xuICAgICAgICAgICAgdGFibGUuJGVtaXQoJ2hlYWRlci1kcmFnZW5kJywgY29sdW1uLndpZHRoLCBzdGFydExlZnQgLSBzdGFydENvbHVtbkxlZnQsIGNvbHVtbiwgZXZlbnQpO1xuXG4gICAgICAgICAgICBfdGhpczMuc3RvcmUuc2NoZWR1bGVMYXlvdXQoKTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnJztcbiAgICAgICAgICAgIF90aGlzMy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgX3RoaXMzLmRyYWdnaW5nQ29sdW1uID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzMy5kcmFnU3RhdGUgPSB7fTtcblxuICAgICAgICAgICAgdGFibGUucmVzaXplUHJveHlWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlTW91c2VVcCk7XG4gICAgICAgICAgZG9jdW1lbnQub25zZWxlY3RzdGFydCA9IG51bGw7XG4gICAgICAgICAgZG9jdW1lbnQub25kcmFnc3RhcnQgPSBudWxsO1xuXG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBPYmplY3QoZG9tX1tcInJlbW92ZUNsYXNzXCJdKShjb2x1bW5FbCwgJ25vY2xpY2snKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlTW91c2VVcCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVNb3VzZU1vdmU6IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShldmVudCwgY29sdW1uKSB7XG4gICAgICBpZiAoY29sdW1uLmNoaWxkcmVuICYmIGNvbHVtbi5jaGlsZHJlbi5sZW5ndGggPiAwKSByZXR1cm47XG4gICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQudGFnTmFtZSAhPT0gJ1RIJykge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjb2x1bW4gfHwgIWNvbHVtbi5yZXNpemFibGUpIHJldHVybjtcblxuICAgICAgaWYgKCF0aGlzLmRyYWdnaW5nICYmIHRoaXMuYm9yZGVyKSB7XG4gICAgICAgIHZhciByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIHZhciBib2R5U3R5bGUgPSBkb2N1bWVudC5ib2R5LnN0eWxlO1xuICAgICAgICBpZiAocmVjdC53aWR0aCA+IDEyICYmIHJlY3QucmlnaHQgLSBldmVudC5wYWdlWCA8IDgpIHtcbiAgICAgICAgICBib2R5U3R5bGUuY3Vyc29yID0gJ2NvbC1yZXNpemUnO1xuICAgICAgICAgIGlmIChPYmplY3QoZG9tX1tcImhhc0NsYXNzXCJdKSh0YXJnZXQsICdpcy1zb3J0YWJsZScpKSB7XG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUuY3Vyc29yID0gJ2NvbC1yZXNpemUnO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRyYWdnaW5nQ29sdW1uID0gY29sdW1uO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRyYWdnaW5nKSB7XG4gICAgICAgICAgYm9keVN0eWxlLmN1cnNvciA9ICcnO1xuICAgICAgICAgIGlmIChPYmplY3QoZG9tX1tcImhhc0NsYXNzXCJdKSh0YXJnZXQsICdpcy1zb3J0YWJsZScpKSB7XG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRyYWdnaW5nQ29sdW1uID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlTW91c2VPdXQ6IGZ1bmN0aW9uIGhhbmRsZU1vdXNlT3V0KCkge1xuICAgICAgaWYgKHRoaXMuJGlzU2VydmVyKSByZXR1cm47XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICcnO1xuICAgIH0sXG4gICAgdG9nZ2xlT3JkZXI6IGZ1bmN0aW9uIHRvZ2dsZU9yZGVyKF9yZWYpIHtcbiAgICAgIHZhciBvcmRlciA9IF9yZWYub3JkZXIsXG4gICAgICAgICAgc29ydE9yZGVycyA9IF9yZWYuc29ydE9yZGVycztcblxuICAgICAgaWYgKG9yZGVyID09PSAnJykgcmV0dXJuIHNvcnRPcmRlcnNbMF07XG4gICAgICB2YXIgaW5kZXggPSBzb3J0T3JkZXJzLmluZGV4T2Yob3JkZXIgfHwgbnVsbCk7XG4gICAgICByZXR1cm4gc29ydE9yZGVyc1tpbmRleCA+IHNvcnRPcmRlcnMubGVuZ3RoIC0gMiA/IDAgOiBpbmRleCArIDFdO1xuICAgIH0sXG4gICAgaGFuZGxlU29ydENsaWNrOiBmdW5jdGlvbiBoYW5kbGVTb3J0Q2xpY2soZXZlbnQsIGNvbHVtbiwgZ2l2ZW5PcmRlcikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB2YXIgb3JkZXIgPSBjb2x1bW4ub3JkZXIgPT09IGdpdmVuT3JkZXIgPyBudWxsIDogZ2l2ZW5PcmRlciB8fCB0aGlzLnRvZ2dsZU9yZGVyKGNvbHVtbik7XG5cbiAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC50YWdOYW1lICE9PSAnVEgnKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC50YWdOYW1lID09PSAnVEgnKSB7XG4gICAgICAgIGlmIChPYmplY3QoZG9tX1tcImhhc0NsYXNzXCJdKSh0YXJnZXQsICdub2NsaWNrJykpIHtcbiAgICAgICAgICBPYmplY3QoZG9tX1tcInJlbW92ZUNsYXNzXCJdKSh0YXJnZXQsICdub2NsaWNrJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghY29sdW1uLnNvcnRhYmxlKSByZXR1cm47XG5cbiAgICAgIHZhciBzdGF0ZXMgPSB0aGlzLnN0b3JlLnN0YXRlcztcbiAgICAgIHZhciBzb3J0UHJvcCA9IHN0YXRlcy5zb3J0UHJvcDtcbiAgICAgIHZhciBzb3J0T3JkZXIgPSB2b2lkIDA7XG4gICAgICB2YXIgc29ydGluZ0NvbHVtbiA9IHN0YXRlcy5zb3J0aW5nQ29sdW1uO1xuXG4gICAgICBpZiAoc29ydGluZ0NvbHVtbiAhPT0gY29sdW1uIHx8IHNvcnRpbmdDb2x1bW4gPT09IGNvbHVtbiAmJiBzb3J0aW5nQ29sdW1uLm9yZGVyID09PSBudWxsKSB7XG4gICAgICAgIGlmIChzb3J0aW5nQ29sdW1uKSB7XG4gICAgICAgICAgc29ydGluZ0NvbHVtbi5vcmRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGVzLnNvcnRpbmdDb2x1bW4gPSBjb2x1bW47XG4gICAgICAgIHNvcnRQcm9wID0gY29sdW1uLnByb3BlcnR5O1xuICAgICAgfVxuXG4gICAgICBpZiAoIW9yZGVyKSB7XG4gICAgICAgIHNvcnRPcmRlciA9IGNvbHVtbi5vcmRlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3J0T3JkZXIgPSBjb2x1bW4ub3JkZXIgPSBvcmRlcjtcbiAgICAgIH1cblxuICAgICAgc3RhdGVzLnNvcnRQcm9wID0gc29ydFByb3A7XG4gICAgICBzdGF0ZXMuc29ydE9yZGVyID0gc29ydE9yZGVyO1xuXG4gICAgICB0aGlzLnN0b3JlLmNvbW1pdCgnY2hhbmdlU29ydENvbmRpdGlvbicpO1xuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkcmFnZ2luZ0NvbHVtbjogbnVsbCxcbiAgICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICAgIGRyYWdTdGF0ZToge31cbiAgICB9O1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL3RhYmxlLWZvb3Rlci5qc1xudmFyIHRhYmxlX2Zvb3Rlcl9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGFibGVfZm9vdGVyID0gKHtcbiAgbmFtZTogJ0VsVGFibGVGb290ZXInLFxuXG4gIG1peGluczogW2xheW91dF9vYnNlcnZlcl0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgc3VtcyA9IFtdO1xuICAgIGlmICh0aGlzLnN1bW1hcnlNZXRob2QpIHtcbiAgICAgIHN1bXMgPSB0aGlzLnN1bW1hcnlNZXRob2QoeyBjb2x1bW5zOiB0aGlzLmNvbHVtbnMsIGRhdGE6IHRoaXMuc3RvcmUuc3RhdGVzLmRhdGEgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4sIGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIHN1bXNbaW5kZXhdID0gX3RoaXMuc3VtVGV4dDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlcyA9IF90aGlzLnN0b3JlLnN0YXRlcy5kYXRhLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiBOdW1iZXIoaXRlbVtjb2x1bW4ucHJvcGVydHldKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBwcmVjaXNpb25zID0gW107XG4gICAgICAgIHZhciBub3ROdW1iZXIgPSB0cnVlO1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgbm90TnVtYmVyID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgZGVjaW1hbCA9ICgnJyArIHZhbHVlKS5zcGxpdCgnLicpWzFdO1xuICAgICAgICAgICAgcHJlY2lzaW9ucy5wdXNoKGRlY2ltYWwgPyBkZWNpbWFsLmxlbmd0aCA6IDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBwcmVjaXNpb24gPSBNYXRoLm1heC5hcHBseShudWxsLCBwcmVjaXNpb25zKTtcbiAgICAgICAgaWYgKCFub3ROdW1iZXIpIHtcbiAgICAgICAgICBzdW1zW2luZGV4XSA9IHZhbHVlcy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IE51bWJlcihjdXJyKTtcbiAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KChwcmV2ICsgY3VycikudG9GaXhlZChNYXRoLm1pbihwcmVjaXNpb24sIDIwKSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Vtc1tpbmRleF0gPSAnJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGgoXG4gICAgICAndGFibGUnLFxuICAgICAge1xuICAgICAgICAnY2xhc3MnOiAnZWwtdGFibGVfX2Zvb3RlcicsXG4gICAgICAgIGF0dHJzOiB7IGNlbGxzcGFjaW5nOiAnMCcsXG4gICAgICAgICAgY2VsbHBhZGRpbmc6ICcwJyxcbiAgICAgICAgICBib3JkZXI6ICcwJyB9XG4gICAgICB9LFxuICAgICAgW2goJ2NvbGdyb3VwJywgW3RoaXMuY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gaCgnY29sJywge1xuICAgICAgICAgIGF0dHJzOiB7IG5hbWU6IGNvbHVtbi5pZCB9LFxuICAgICAgICAgIGtleTogY29sdW1uLmlkIH0pO1xuICAgICAgfSksIHRoaXMuaGFzR3V0dGVyID8gaCgnY29sJywge1xuICAgICAgICBhdHRyczogeyBuYW1lOiAnZ3V0dGVyJyB9XG4gICAgICB9KSA6ICcnXSksIGgoXG4gICAgICAgICd0Ym9keScsXG4gICAgICAgIHsgJ2NsYXNzJzogW3sgJ2hhcy1ndXR0ZXInOiB0aGlzLmhhc0d1dHRlciB9XSB9LFxuICAgICAgICBbaCgndHInLCBbdGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uLCBjZWxsSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gaChcbiAgICAgICAgICAgICd0ZCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogY2VsbEluZGV4LFxuICAgICAgICAgICAgICBhdHRyczogeyBjb2xzcGFuOiBjb2x1bW4uY29sU3BhbixcbiAgICAgICAgICAgICAgICByb3dzcGFuOiBjb2x1bW4ucm93U3BhblxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnY2xhc3MnOiBbXS5jb25jYXQoX3RoaXMuZ2V0Um93Q2xhc3Nlcyhjb2x1bW4sIGNlbGxJbmRleCksIFsnZWwtdGFibGVfX2NlbGwnXSkgfSxcbiAgICAgICAgICAgIFtoKFxuICAgICAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICAgICAgeyAnY2xhc3MnOiBbJ2NlbGwnLCBjb2x1bW4ubGFiZWxDbGFzc05hbWVdIH0sXG4gICAgICAgICAgICAgIFtzdW1zW2NlbGxJbmRleF1dXG4gICAgICAgICAgICApXVxuICAgICAgICAgICk7XG4gICAgICAgIH0pLCB0aGlzLmhhc0d1dHRlciA/IGgoJ3RoJywgeyAnY2xhc3MnOiAnZWwtdGFibGVfX2NlbGwgZ3V0dGVyJyB9KSA6ICcnXSldXG4gICAgICApXVxuICAgICk7XG4gIH0sXG5cblxuICBwcm9wczoge1xuICAgIGZpeGVkOiBTdHJpbmcsXG4gICAgc3RvcmU6IHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBzdW1tYXJ5TWV0aG9kOiBGdW5jdGlvbixcbiAgICBzdW1UZXh0OiBTdHJpbmcsXG4gICAgYm9yZGVyOiBCb29sZWFuLFxuICAgIGRlZmF1bHRTb3J0OiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm9wOiAnJyxcbiAgICAgICAgICBvcmRlcjogJydcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHRhYmxlX2Zvb3Rlcl9leHRlbmRzKHtcbiAgICB0YWJsZTogZnVuY3Rpb24gdGFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50O1xuICAgIH0sXG4gICAgaGFzR3V0dGVyOiBmdW5jdGlvbiBoYXNHdXR0ZXIoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuZml4ZWQgJiYgdGhpcy50YWJsZUxheW91dC5ndXR0ZXJXaWR0aDtcbiAgICB9XG4gIH0sIG1hcFN0YXRlcyh7XG4gICAgY29sdW1uczogJ2NvbHVtbnMnLFxuICAgIGlzQWxsU2VsZWN0ZWQ6ICdpc0FsbFNlbGVjdGVkJyxcbiAgICBsZWZ0Rml4ZWRMZWFmQ291bnQ6ICdmaXhlZExlYWZDb2x1bW5zTGVuZ3RoJyxcbiAgICByaWdodEZpeGVkTGVhZkNvdW50OiAncmlnaHRGaXhlZExlYWZDb2x1bW5zTGVuZ3RoJyxcbiAgICBjb2x1bW5zQ291bnQ6IGZ1bmN0aW9uIGNvbHVtbnNDb3VudChzdGF0ZXMpIHtcbiAgICAgIHJldHVybiBzdGF0ZXMuY29sdW1ucy5sZW5ndGg7XG4gICAgfSxcbiAgICBsZWZ0Rml4ZWRDb3VudDogZnVuY3Rpb24gbGVmdEZpeGVkQ291bnQoc3RhdGVzKSB7XG4gICAgICByZXR1cm4gc3RhdGVzLmZpeGVkQ29sdW1ucy5sZW5ndGg7XG4gICAgfSxcbiAgICByaWdodEZpeGVkQ291bnQ6IGZ1bmN0aW9uIHJpZ2h0Rml4ZWRDb3VudChzdGF0ZXMpIHtcbiAgICAgIHJldHVybiBzdGF0ZXMucmlnaHRGaXhlZENvbHVtbnMubGVuZ3RoO1xuICAgIH1cbiAgfSkpLFxuXG4gIG1ldGhvZHM6IHtcbiAgICBpc0NlbGxIaWRkZW46IGZ1bmN0aW9uIGlzQ2VsbEhpZGRlbihpbmRleCwgY29sdW1ucywgY29sdW1uKSB7XG4gICAgICBpZiAodGhpcy5maXhlZCA9PT0gdHJ1ZSB8fCB0aGlzLmZpeGVkID09PSAnbGVmdCcpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IHRoaXMubGVmdEZpeGVkTGVhZkNvdW50O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZpeGVkID09PSAncmlnaHQnKSB7XG4gICAgICAgIHZhciBiZWZvcmUgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGV4OyBpKyspIHtcbiAgICAgICAgICBiZWZvcmUgKz0gY29sdW1uc1tpXS5jb2xTcGFuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZWZvcmUgPCB0aGlzLmNvbHVtbnNDb3VudCAtIHRoaXMucmlnaHRGaXhlZExlYWZDb3VudDtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZml4ZWQgJiYgY29sdW1uLmZpeGVkKSB7XG4gICAgICAgIC8vIGhpZGUgY2VsbCB3aGVuIGZvb3RlciBpbnN0YW5jZSBpcyBub3QgZml4ZWQgYW5kIGNvbHVtbiBpcyBmaXhlZFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbmRleCA8IHRoaXMubGVmdEZpeGVkQ291bnQgfHwgaW5kZXggPj0gdGhpcy5jb2x1bW5zQ291bnQgLSB0aGlzLnJpZ2h0Rml4ZWRDb3VudDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFJvd0NsYXNzZXM6IGZ1bmN0aW9uIGdldFJvd0NsYXNzZXMoY29sdW1uLCBjZWxsSW5kZXgpIHtcbiAgICAgIHZhciBjbGFzc2VzID0gW2NvbHVtbi5pZCwgY29sdW1uLmFsaWduLCBjb2x1bW4ubGFiZWxDbGFzc05hbWVdO1xuICAgICAgaWYgKGNvbHVtbi5jbGFzc05hbWUpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGNvbHVtbi5jbGFzc05hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNDZWxsSGlkZGVuKGNlbGxJbmRleCwgdGhpcy5jb2x1bW5zLCBjb2x1bW4pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnaXMtaGlkZGVuJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNvbHVtbi5jaGlsZHJlbikge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2lzLWxlYWYnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90YWJsZS9zcmMvdGFibGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxudmFyIHRhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxudmFyIHRhYmxlSWRTZWVkID0gMTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxUYWJsZScsXG5cbiAgbWl4aW5zOiBbbG9jYWxlX2RlZmF1bHQuYSwgbWlncmF0aW5nX2RlZmF1bHQuYV0sXG5cbiAgZGlyZWN0aXZlczoge1xuICAgIE1vdXNld2hlZWw6IGRpcmVjdGl2ZXNfbW91c2V3aGVlbFxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgZGF0YToge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBzaXplOiBTdHJpbmcsXG5cbiAgICB3aWR0aDogW1N0cmluZywgTnVtYmVyXSxcblxuICAgIGhlaWdodDogW1N0cmluZywgTnVtYmVyXSxcblxuICAgIG1heEhlaWdodDogW1N0cmluZywgTnVtYmVyXSxcblxuICAgIGZpdDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuXG4gICAgc3RyaXBlOiBCb29sZWFuLFxuXG4gICAgYm9yZGVyOiBCb29sZWFuLFxuXG4gICAgcm93S2V5OiBbU3RyaW5nLCBGdW5jdGlvbl0sXG5cbiAgICBjb250ZXh0OiB7fSxcblxuICAgIHNob3dIZWFkZXI6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcblxuICAgIHNob3dTdW1tYXJ5OiBCb29sZWFuLFxuXG4gICAgc3VtVGV4dDogU3RyaW5nLFxuXG4gICAgc3VtbWFyeU1ldGhvZDogRnVuY3Rpb24sXG5cbiAgICByb3dDbGFzc05hbWU6IFtTdHJpbmcsIEZ1bmN0aW9uXSxcblxuICAgIHJvd1N0eWxlOiBbT2JqZWN0LCBGdW5jdGlvbl0sXG5cbiAgICBjZWxsQ2xhc3NOYW1lOiBbU3RyaW5nLCBGdW5jdGlvbl0sXG5cbiAgICBjZWxsU3R5bGU6IFtPYmplY3QsIEZ1bmN0aW9uXSxcblxuICAgIGhlYWRlclJvd0NsYXNzTmFtZTogW1N0cmluZywgRnVuY3Rpb25dLFxuXG4gICAgaGVhZGVyUm93U3R5bGU6IFtPYmplY3QsIEZ1bmN0aW9uXSxcblxuICAgIGhlYWRlckNlbGxDbGFzc05hbWU6IFtTdHJpbmcsIEZ1bmN0aW9uXSxcblxuICAgIGhlYWRlckNlbGxTdHlsZTogW09iamVjdCwgRnVuY3Rpb25dLFxuXG4gICAgaGlnaGxpZ2h0Q3VycmVudFJvdzogQm9vbGVhbixcblxuICAgIGN1cnJlbnRSb3dLZXk6IFtTdHJpbmcsIE51bWJlcl0sXG5cbiAgICBlbXB0eVRleHQ6IFN0cmluZyxcblxuICAgIGV4cGFuZFJvd0tleXM6IEFycmF5LFxuXG4gICAgZGVmYXVsdEV4cGFuZEFsbDogQm9vbGVhbixcblxuICAgIGRlZmF1bHRTb3J0OiBPYmplY3QsXG5cbiAgICB0b29sdGlwRWZmZWN0OiBTdHJpbmcsXG5cbiAgICBzcGFuTWV0aG9kOiBGdW5jdGlvbixcblxuICAgIHNlbGVjdE9uSW5kZXRlcm1pbmF0ZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuXG4gICAgaW5kZW50OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAxNlxuICAgIH0sXG5cbiAgICB0cmVlUHJvcHM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhhc0NoaWxkcmVuOiAnaGFzQ2hpbGRyZW4nLFxuICAgICAgICAgIGNoaWxkcmVuOiAnY2hpbGRyZW4nXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIGxhenk6IEJvb2xlYW4sXG5cbiAgICBsb2FkOiBGdW5jdGlvblxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBUYWJsZUhlYWRlcjogdGFibGVfaGVhZGVyLFxuICAgIFRhYmxlRm9vdGVyOiB0YWJsZV9mb290ZXIsXG4gICAgVGFibGVCb2R5OiB0YWJsZV9ib2R5LFxuICAgIEVsQ2hlY2tib3g6IGNoZWNrYm94X2RlZmF1bHQuYVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRNaWdyYXRpbmdDb25maWc6IGZ1bmN0aW9uIGdldE1pZ3JhdGluZ0NvbmZpZygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIGV4cGFuZDogJ2V4cGFuZCBpcyByZW5hbWVkIHRvIGV4cGFuZC1jaGFuZ2UnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICBzZXRDdXJyZW50Um93OiBmdW5jdGlvbiBzZXRDdXJyZW50Um93KHJvdykge1xuICAgICAgdGhpcy5zdG9yZS5jb21taXQoJ3NldEN1cnJlbnRSb3cnLCByb3cpO1xuICAgIH0sXG4gICAgdG9nZ2xlUm93U2VsZWN0aW9uOiBmdW5jdGlvbiB0b2dnbGVSb3dTZWxlY3Rpb24ocm93LCBzZWxlY3RlZCkge1xuICAgICAgdGhpcy5zdG9yZS50b2dnbGVSb3dTZWxlY3Rpb24ocm93LCBzZWxlY3RlZCwgZmFsc2UpO1xuICAgICAgdGhpcy5zdG9yZS51cGRhdGVBbGxTZWxlY3RlZCgpO1xuICAgIH0sXG4gICAgdG9nZ2xlUm93RXhwYW5zaW9uOiBmdW5jdGlvbiB0b2dnbGVSb3dFeHBhbnNpb24ocm93LCBleHBhbmRlZCkge1xuICAgICAgdGhpcy5zdG9yZS50b2dnbGVSb3dFeHBhbnNpb25BZGFwdGVyKHJvdywgZXhwYW5kZWQpO1xuICAgIH0sXG4gICAgY2xlYXJTZWxlY3Rpb246IGZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgICAgdGhpcy5zdG9yZS5jbGVhclNlbGVjdGlvbigpO1xuICAgIH0sXG4gICAgY2xlYXJGaWx0ZXI6IGZ1bmN0aW9uIGNsZWFyRmlsdGVyKGNvbHVtbktleXMpIHtcbiAgICAgIHRoaXMuc3RvcmUuY2xlYXJGaWx0ZXIoY29sdW1uS2V5cyk7XG4gICAgfSxcbiAgICBjbGVhclNvcnQ6IGZ1bmN0aW9uIGNsZWFyU29ydCgpIHtcbiAgICAgIHRoaXMuc3RvcmUuY2xlYXJTb3J0KCk7XG4gICAgfSxcbiAgICBoYW5kbGVNb3VzZUxlYXZlOiBmdW5jdGlvbiBoYW5kbGVNb3VzZUxlYXZlKCkge1xuICAgICAgdGhpcy5zdG9yZS5jb21taXQoJ3NldEhvdmVyUm93JywgbnVsbCk7XG4gICAgICBpZiAodGhpcy5ob3ZlclN0YXRlKSB0aGlzLmhvdmVyU3RhdGUgPSBudWxsO1xuICAgIH0sXG4gICAgdXBkYXRlU2Nyb2xsWTogZnVuY3Rpb24gdXBkYXRlU2Nyb2xsWSgpIHtcbiAgICAgIHZhciBjaGFuZ2VkID0gdGhpcy5sYXlvdXQudXBkYXRlU2Nyb2xsWSgpO1xuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQubm90aWZ5T2JzZXJ2ZXJzKCdzY3JvbGxhYmxlJyk7XG4gICAgICAgIHRoaXMubGF5b3V0LnVwZGF0ZUNvbHVtbnNXaWR0aCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlRml4ZWRNb3VzZXdoZWVsOiBmdW5jdGlvbiBoYW5kbGVGaXhlZE1vdXNld2hlZWwoZXZlbnQsIGRhdGEpIHtcbiAgICAgIHZhciBib2R5V3JhcHBlciA9IHRoaXMuYm9keVdyYXBwZXI7XG4gICAgICBpZiAoTWF0aC5hYnMoZGF0YS5zcGluWSkgPiAwKSB7XG4gICAgICAgIHZhciBjdXJyZW50U2Nyb2xsVG9wID0gYm9keVdyYXBwZXIuc2Nyb2xsVG9wO1xuICAgICAgICBpZiAoZGF0YS5waXhlbFkgPCAwICYmIGN1cnJlbnRTY3JvbGxUb3AgIT09IDApIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLnBpeGVsWSA+IDAgJiYgYm9keVdyYXBwZXIuc2Nyb2xsSGVpZ2h0IC0gYm9keVdyYXBwZXIuY2xpZW50SGVpZ2h0ID4gY3VycmVudFNjcm9sbFRvcCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYm9keVdyYXBwZXIuc2Nyb2xsVG9wICs9IE1hdGguY2VpbChkYXRhLnBpeGVsWSAvIDUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYm9keVdyYXBwZXIuc2Nyb2xsTGVmdCArPSBNYXRoLmNlaWwoZGF0YS5waXhlbFggLyA1KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUhlYWRlckZvb3Rlck1vdXNld2hlZWw6IGZ1bmN0aW9uIGhhbmRsZUhlYWRlckZvb3Rlck1vdXNld2hlZWwoZXZlbnQsIGRhdGEpIHtcbiAgICAgIHZhciBwaXhlbFggPSBkYXRhLnBpeGVsWCxcbiAgICAgICAgICBwaXhlbFkgPSBkYXRhLnBpeGVsWTtcblxuICAgICAgaWYgKE1hdGguYWJzKHBpeGVsWCkgPj0gTWF0aC5hYnMocGl4ZWxZKSkge1xuICAgICAgICB0aGlzLmJvZHlXcmFwcGVyLnNjcm9sbExlZnQgKz0gZGF0YS5waXhlbFggLyA1O1xuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8vIFRPRE8g5L2/55SoIENTUyB0cmFuc2Zvcm1cbiAgICBzeW5jUG9zdGlvbjogZnVuY3Rpb24gc3luY1Bvc3Rpb24oKSB7XG4gICAgICB2YXIgX2JvZHlXcmFwcGVyID0gdGhpcy5ib2R5V3JhcHBlcixcbiAgICAgICAgICBzY3JvbGxMZWZ0ID0gX2JvZHlXcmFwcGVyLnNjcm9sbExlZnQsXG4gICAgICAgICAgc2Nyb2xsVG9wID0gX2JvZHlXcmFwcGVyLnNjcm9sbFRvcCxcbiAgICAgICAgICBvZmZzZXRXaWR0aCA9IF9ib2R5V3JhcHBlci5vZmZzZXRXaWR0aCxcbiAgICAgICAgICBzY3JvbGxXaWR0aCA9IF9ib2R5V3JhcHBlci5zY3JvbGxXaWR0aDtcbiAgICAgIHZhciBfJHJlZnMgPSB0aGlzLiRyZWZzLFxuICAgICAgICAgIGhlYWRlcldyYXBwZXIgPSBfJHJlZnMuaGVhZGVyV3JhcHBlcixcbiAgICAgICAgICBmb290ZXJXcmFwcGVyID0gXyRyZWZzLmZvb3RlcldyYXBwZXIsXG4gICAgICAgICAgZml4ZWRCb2R5V3JhcHBlciA9IF8kcmVmcy5maXhlZEJvZHlXcmFwcGVyLFxuICAgICAgICAgIHJpZ2h0Rml4ZWRCb2R5V3JhcHBlciA9IF8kcmVmcy5yaWdodEZpeGVkQm9keVdyYXBwZXI7XG5cbiAgICAgIGlmIChoZWFkZXJXcmFwcGVyKSBoZWFkZXJXcmFwcGVyLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICAgICAgaWYgKGZvb3RlcldyYXBwZXIpIGZvb3RlcldyYXBwZXIuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7XG4gICAgICBpZiAoZml4ZWRCb2R5V3JhcHBlcikgZml4ZWRCb2R5V3JhcHBlci5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICBpZiAocmlnaHRGaXhlZEJvZHlXcmFwcGVyKSByaWdodEZpeGVkQm9keVdyYXBwZXIuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgdmFyIG1heFNjcm9sbExlZnRQb3NpdGlvbiA9IHNjcm9sbFdpZHRoIC0gb2Zmc2V0V2lkdGggLSAxO1xuICAgICAgaWYgKHNjcm9sbExlZnQgPj0gbWF4U2Nyb2xsTGVmdFBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb24gPSAncmlnaHQnO1xuICAgICAgfSBlbHNlIGlmIChzY3JvbGxMZWZ0ID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb24gPSAnbGVmdCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNjcm9sbFBvc2l0aW9uID0gJ21pZGRsZSc7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgdGhyb3R0bGVTeW5jUG9zdGlvbjogT2JqZWN0KGV4dGVybmFsX3Rocm90dGxlX2RlYm91bmNlX1tcInRocm90dGxlXCJdKSgxNiwgZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5zeW5jUG9zdGlvbigpO1xuICAgIH0pLFxuXG4gICAgb25TY3JvbGw6IGZ1bmN0aW9uIG9uU2Nyb2xsKGV2dCkge1xuICAgICAgdmFyIHJhZiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG4gICAgICBpZiAoIXJhZikge1xuICAgICAgICB0aGlzLnRocm90dGxlU3luY1Bvc3Rpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhZih0aGlzLnN5bmNQb3N0aW9uKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGJpbmRFdmVudHM6IGZ1bmN0aW9uIGJpbmRFdmVudHMoKSB7XG4gICAgICB0aGlzLmJvZHlXcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25TY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGlmICh0aGlzLmZpdCkge1xuICAgICAgICBPYmplY3QocmVzaXplX2V2ZW50X1tcImFkZFJlc2l6ZUxpc3RlbmVyXCJdKSh0aGlzLiRlbCwgdGhpcy5yZXNpemVMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfSxcbiAgICB1bmJpbmRFdmVudHM6IGZ1bmN0aW9uIHVuYmluZEV2ZW50cygpIHtcbiAgICAgIHRoaXMuYm9keVdyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5vblNjcm9sbCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgaWYgKHRoaXMuZml0KSB7XG4gICAgICAgIE9iamVjdChyZXNpemVfZXZlbnRfW1wicmVtb3ZlUmVzaXplTGlzdGVuZXJcIl0pKHRoaXMuJGVsLCB0aGlzLnJlc2l6ZUxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlc2l6ZUxpc3RlbmVyOiBmdW5jdGlvbiByZXNpemVMaXN0ZW5lcigpIHtcbiAgICAgIGlmICghdGhpcy4kcmVhZHkpIHJldHVybjtcbiAgICAgIHZhciBzaG91bGRVcGRhdGVMYXlvdXQgPSBmYWxzZTtcbiAgICAgIHZhciBlbCA9IHRoaXMuJGVsO1xuICAgICAgdmFyIF9yZXNpemVTdGF0ZSA9IHRoaXMucmVzaXplU3RhdGUsXG4gICAgICAgICAgb2xkV2lkdGggPSBfcmVzaXplU3RhdGUud2lkdGgsXG4gICAgICAgICAgb2xkSGVpZ2h0ID0gX3Jlc2l6ZVN0YXRlLmhlaWdodDtcblxuXG4gICAgICB2YXIgd2lkdGggPSBlbC5vZmZzZXRXaWR0aDtcbiAgICAgIGlmIChvbGRXaWR0aCAhPT0gd2lkdGgpIHtcbiAgICAgICAgc2hvdWxkVXBkYXRlTGF5b3V0ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGhlaWdodCA9IGVsLm9mZnNldEhlaWdodDtcbiAgICAgIGlmICgodGhpcy5oZWlnaHQgfHwgdGhpcy5zaG91bGRVcGRhdGVIZWlnaHQpICYmIG9sZEhlaWdodCAhPT0gaGVpZ2h0KSB7XG4gICAgICAgIHNob3VsZFVwZGF0ZUxheW91dCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRVcGRhdGVMYXlvdXQpIHtcbiAgICAgICAgdGhpcy5yZXNpemVTdGF0ZS53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLnJlc2l6ZVN0YXRlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy5kb0xheW91dCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZG9MYXlvdXQ6IGZ1bmN0aW9uIGRvTGF5b3V0KCkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkVXBkYXRlSGVpZ2h0KSB7XG4gICAgICAgIHRoaXMubGF5b3V0LnVwZGF0ZUVsc0hlaWdodCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXlvdXQudXBkYXRlQ29sdW1uc1dpZHRoKCk7XG4gICAgfSxcbiAgICBzb3J0OiBmdW5jdGlvbiBzb3J0KHByb3AsIG9yZGVyKSB7XG4gICAgICB0aGlzLnN0b3JlLmNvbW1pdCgnc29ydCcsIHsgcHJvcDogcHJvcCwgb3JkZXI6IG9yZGVyIH0pO1xuICAgIH0sXG4gICAgdG9nZ2xlQWxsU2VsZWN0aW9uOiBmdW5jdGlvbiB0b2dnbGVBbGxTZWxlY3Rpb24oKSB7XG4gICAgICB0aGlzLnN0b3JlLmNvbW1pdCgndG9nZ2xlQWxsU2VsZWN0aW9uJyk7XG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB0YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2V4dGVuZHMoe1xuICAgIHRhYmxlU2l6ZTogZnVuY3Rpb24gdGFibGVTaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSB8fCAodGhpcy4kRUxFTUVOVCB8fCB7fSkuc2l6ZTtcbiAgICB9LFxuICAgIGJvZHlXcmFwcGVyOiBmdW5jdGlvbiBib2R5V3JhcHBlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLmJvZHlXcmFwcGVyO1xuICAgIH0sXG4gICAgc2hvdWxkVXBkYXRlSGVpZ2h0OiBmdW5jdGlvbiBzaG91bGRVcGRhdGVIZWlnaHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZWlnaHQgfHwgdGhpcy5tYXhIZWlnaHQgfHwgdGhpcy5maXhlZENvbHVtbnMubGVuZ3RoID4gMCB8fCB0aGlzLnJpZ2h0Rml4ZWRDb2x1bW5zLmxlbmd0aCA+IDA7XG4gICAgfSxcbiAgICBib2R5V2lkdGg6IGZ1bmN0aW9uIGJvZHlXaWR0aCgpIHtcbiAgICAgIHZhciBfbGF5b3V0ID0gdGhpcy5sYXlvdXQsXG4gICAgICAgICAgYm9keVdpZHRoID0gX2xheW91dC5ib2R5V2lkdGgsXG4gICAgICAgICAgc2Nyb2xsWSA9IF9sYXlvdXQuc2Nyb2xsWSxcbiAgICAgICAgICBndXR0ZXJXaWR0aCA9IF9sYXlvdXQuZ3V0dGVyV2lkdGg7XG5cbiAgICAgIHJldHVybiBib2R5V2lkdGggPyBib2R5V2lkdGggLSAoc2Nyb2xsWSA/IGd1dHRlcldpZHRoIDogMCkgKyAncHgnIDogJyc7XG4gICAgfSxcbiAgICBib2R5SGVpZ2h0OiBmdW5jdGlvbiBib2R5SGVpZ2h0KCkge1xuICAgICAgdmFyIF9sYXlvdXQyID0gdGhpcy5sYXlvdXQsXG4gICAgICAgICAgX2xheW91dDIkaGVhZGVySGVpZ2h0ID0gX2xheW91dDIuaGVhZGVySGVpZ2h0LFxuICAgICAgICAgIGhlYWRlckhlaWdodCA9IF9sYXlvdXQyJGhlYWRlckhlaWdodCA9PT0gdW5kZWZpbmVkID8gMCA6IF9sYXlvdXQyJGhlYWRlckhlaWdodCxcbiAgICAgICAgICBib2R5SGVpZ2h0ID0gX2xheW91dDIuYm9keUhlaWdodCxcbiAgICAgICAgICBfbGF5b3V0MiRmb290ZXJIZWlnaHQgPSBfbGF5b3V0Mi5mb290ZXJIZWlnaHQsXG4gICAgICAgICAgZm9vdGVySGVpZ2h0ID0gX2xheW91dDIkZm9vdGVySGVpZ2h0ID09PSB1bmRlZmluZWQgPyAwIDogX2xheW91dDIkZm9vdGVySGVpZ2h0O1xuXG4gICAgICBpZiAodGhpcy5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoZWlnaHQ6IGJvZHlIZWlnaHQgPyBib2R5SGVpZ2h0ICsgJ3B4JyA6ICcnXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBtYXhIZWlnaHQgPSBwYXJzZUhlaWdodCh0aGlzLm1heEhlaWdodCk7XG4gICAgICAgIGlmICh0eXBlb2YgbWF4SGVpZ2h0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbWF4LWhlaWdodCc6IG1heEhlaWdodCAtIGZvb3RlckhlaWdodCAtICh0aGlzLnNob3dIZWFkZXIgPyBoZWFkZXJIZWlnaHQgOiAwKSArICdweCdcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSxcbiAgICBmaXhlZEJvZHlIZWlnaHQ6IGZ1bmN0aW9uIGZpeGVkQm9keUhlaWdodCgpIHtcbiAgICAgIGlmICh0aGlzLmhlaWdodCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhlaWdodDogdGhpcy5sYXlvdXQuZml4ZWRCb2R5SGVpZ2h0ID8gdGhpcy5sYXlvdXQuZml4ZWRCb2R5SGVpZ2h0ICsgJ3B4JyA6ICcnXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBtYXhIZWlnaHQgPSBwYXJzZUhlaWdodCh0aGlzLm1heEhlaWdodCk7XG4gICAgICAgIGlmICh0eXBlb2YgbWF4SGVpZ2h0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIG1heEhlaWdodCA9IHRoaXMubGF5b3V0LnNjcm9sbFggPyBtYXhIZWlnaHQgLSB0aGlzLmxheW91dC5ndXR0ZXJXaWR0aCA6IG1heEhlaWdodDtcbiAgICAgICAgICBpZiAodGhpcy5zaG93SGVhZGVyKSB7XG4gICAgICAgICAgICBtYXhIZWlnaHQgLT0gdGhpcy5sYXlvdXQuaGVhZGVySGVpZ2h0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXhIZWlnaHQgLT0gdGhpcy5sYXlvdXQuZm9vdGVySGVpZ2h0O1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbWF4LWhlaWdodCc6IG1heEhlaWdodCArICdweCdcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSxcbiAgICBmaXhlZEhlaWdodDogZnVuY3Rpb24gZml4ZWRIZWlnaHQoKSB7XG4gICAgICBpZiAodGhpcy5tYXhIZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd1N1bW1hcnkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYm90dG9tOiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJvdHRvbTogdGhpcy5sYXlvdXQuc2Nyb2xsWCAmJiB0aGlzLmRhdGEubGVuZ3RoID8gdGhpcy5sYXlvdXQuZ3V0dGVyV2lkdGggKyAncHgnIDogJydcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dTdW1tYXJ5KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5sYXlvdXQudGFibGVIZWlnaHQgPyB0aGlzLmxheW91dC50YWJsZUhlaWdodCArICdweCcgOiAnJ1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMubGF5b3V0LnZpZXdwb3J0SGVpZ2h0ID8gdGhpcy5sYXlvdXQudmlld3BvcnRIZWlnaHQgKyAncHgnIDogJydcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGVtcHR5QmxvY2tTdHlsZTogZnVuY3Rpb24gZW1wdHlCbG9ja1N0eWxlKCkge1xuICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBoZWlnaHQgPSAnMTAwJSc7XG4gICAgICBpZiAodGhpcy5sYXlvdXQuYXBwZW5kSGVpZ2h0KSB7XG4gICAgICAgIGhlaWdodCA9ICdjYWxjKDEwMCUgLSAnICsgdGhpcy5sYXlvdXQuYXBwZW5kSGVpZ2h0ICsgJ3B4KSc7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogdGhpcy5ib2R5V2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICB9O1xuICAgIH1cbiAgfSwgbWFwU3RhdGVzKHtcbiAgICBzZWxlY3Rpb246ICdzZWxlY3Rpb24nLFxuICAgIGNvbHVtbnM6ICdjb2x1bW5zJyxcbiAgICB0YWJsZURhdGE6ICdkYXRhJyxcbiAgICBmaXhlZENvbHVtbnM6ICdmaXhlZENvbHVtbnMnLFxuICAgIHJpZ2h0Rml4ZWRDb2x1bW5zOiAncmlnaHRGaXhlZENvbHVtbnMnXG4gIH0pKSxcblxuICB3YXRjaDoge1xuICAgIGhlaWdodDoge1xuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcih2YWx1ZSkge1xuICAgICAgICB0aGlzLmxheW91dC5zZXRIZWlnaHQodmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBtYXhIZWlnaHQ6IHtcbiAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIodmFsdWUpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQuc2V0TWF4SGVpZ2h0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFJvd0tleToge1xuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcih2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMucm93S2V5KSByZXR1cm47XG4gICAgICAgIHRoaXMuc3RvcmUuc2V0Q3VycmVudFJvd0tleSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGRhdGE6IHtcbiAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIodmFsdWUpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5jb21taXQoJ3NldERhdGEnLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGV4cGFuZFJvd0tleXM6IHtcbiAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIobmV3VmFsKSB7XG4gICAgICAgIGlmIChuZXdWYWwpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlLnNldEV4cGFuZFJvd0tleXNBZGFwdGVyKG5ld1ZhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy50YWJsZUlkID0gJ2VsLXRhYmxlXycgKyB0YWJsZUlkU2VlZCsrO1xuICAgIHRoaXMuZGVib3VuY2VkVXBkYXRlTGF5b3V0ID0gT2JqZWN0KGV4dGVybmFsX3Rocm90dGxlX2RlYm91bmNlX1tcImRlYm91bmNlXCJdKSg1MCwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLmRvTGF5b3V0KCk7XG4gICAgfSk7XG4gIH0sXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZUNvbHVtbnMoKTtcbiAgICB0aGlzLmRvTGF5b3V0KCk7XG5cbiAgICB0aGlzLnJlc2l6ZVN0YXRlID0ge1xuICAgICAgd2lkdGg6IHRoaXMuJGVsLm9mZnNldFdpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLiRlbC5vZmZzZXRIZWlnaHRcbiAgICB9O1xuXG4gICAgLy8gaW5pdCBmaWx0ZXJzXG4gICAgdGhpcy5zdG9yZS5zdGF0ZXMuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGlmIChjb2x1bW4uZmlsdGVyZWRWYWx1ZSAmJiBjb2x1bW4uZmlsdGVyZWRWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgX3RoaXMyLnN0b3JlLmNvbW1pdCgnZmlsdGVyQ2hhbmdlJywge1xuICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgIHZhbHVlczogY29sdW1uLmZpbHRlcmVkVmFsdWUsXG4gICAgICAgICAgc2lsZW50OiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy4kcmVhZHkgPSB0cnVlO1xuICB9LFxuICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHZhciBfdHJlZVByb3BzID0gdGhpcy50cmVlUHJvcHMsXG4gICAgICAgIF90cmVlUHJvcHMkaGFzQ2hpbGRyZSA9IF90cmVlUHJvcHMuaGFzQ2hpbGRyZW4sXG4gICAgICAgIGhhc0NoaWxkcmVuID0gX3RyZWVQcm9wcyRoYXNDaGlsZHJlID09PSB1bmRlZmluZWQgPyAnaGFzQ2hpbGRyZW4nIDogX3RyZWVQcm9wcyRoYXNDaGlsZHJlLFxuICAgICAgICBfdHJlZVByb3BzJGNoaWxkcmVuID0gX3RyZWVQcm9wcy5jaGlsZHJlbixcbiAgICAgICAgY2hpbGRyZW4gPSBfdHJlZVByb3BzJGNoaWxkcmVuID09PSB1bmRlZmluZWQgPyAnY2hpbGRyZW4nIDogX3RyZWVQcm9wcyRjaGlsZHJlbjtcblxuICAgIHRoaXMuc3RvcmUgPSBjcmVhdGVTdG9yZSh0aGlzLCB7XG4gICAgICByb3dLZXk6IHRoaXMucm93S2V5LFxuICAgICAgZGVmYXVsdEV4cGFuZEFsbDogdGhpcy5kZWZhdWx0RXhwYW5kQWxsLFxuICAgICAgc2VsZWN0T25JbmRldGVybWluYXRlOiB0aGlzLnNlbGVjdE9uSW5kZXRlcm1pbmF0ZSxcbiAgICAgIC8vIFRyZWVUYWJsZSDnmoTnm7jlhbPphY3nva5cbiAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICBsYXp5OiB0aGlzLmxhenksXG4gICAgICBsYXp5Q29sdW1uSWRlbnRpZmllcjogaGFzQ2hpbGRyZW4sXG4gICAgICBjaGlsZHJlbkNvbHVtbk5hbWU6IGNoaWxkcmVuXG4gICAgfSk7XG4gICAgdmFyIGxheW91dCA9IG5ldyB0YWJsZV9sYXlvdXQoe1xuICAgICAgc3RvcmU6IHRoaXMuc3RvcmUsXG4gICAgICB0YWJsZTogdGhpcyxcbiAgICAgIGZpdDogdGhpcy5maXQsXG4gICAgICBzaG93SGVhZGVyOiB0aGlzLnNob3dIZWFkZXJcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbGF5b3V0OiBsYXlvdXQsXG4gICAgICBpc0hpZGRlbjogZmFsc2UsXG4gICAgICByZW5kZXJFeHBhbmRlZDogbnVsbCxcbiAgICAgIHJlc2l6ZVByb3h5VmlzaWJsZTogZmFsc2UsXG4gICAgICByZXNpemVTdGF0ZToge1xuICAgICAgICB3aWR0aDogbnVsbCxcbiAgICAgICAgaGVpZ2h0OiBudWxsXG4gICAgICB9LFxuICAgICAgLy8g5piv5ZCm5oul5pyJ5aSa57qn6KGo5aS0XG4gICAgICBpc0dyb3VwOiBmYWxzZSxcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiAnbGVmdCdcbiAgICB9O1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL3RhYmxlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAodGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL3RhYmxlLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHRhYmxlX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICB0YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ5M2ZlMzRlX3JlbmRlcixcbiAgdGFibGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF80OTNmZTM0ZV9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHRhYmxlX2FwaTsgfVxudGFibGVfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy90YWJsZS9zcmMvdGFibGUudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY190YWJsZSA9ICh0YWJsZV9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnNyY190YWJsZS5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHNyY190YWJsZS5uYW1lLCBzcmNfdGFibGUpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfdGFibGUgPSAoc3JjX3RhYmxlKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFibGUvc3JjL2NvbmZpZy5qc1xuXG5cbnZhciBjZWxsU3RhcnRzID0ge1xuICBkZWZhdWx0OiB7XG4gICAgb3JkZXI6ICcnXG4gIH0sXG4gIHNlbGVjdGlvbjoge1xuICAgIHdpZHRoOiA0OCxcbiAgICBtaW5XaWR0aDogNDgsXG4gICAgcmVhbFdpZHRoOiA0OCxcbiAgICBvcmRlcjogJycsXG4gICAgY2xhc3NOYW1lOiAnZWwtdGFibGUtY29sdW1uLS1zZWxlY3Rpb24nXG4gIH0sXG4gIGV4cGFuZDoge1xuICAgIHdpZHRoOiA0OCxcbiAgICBtaW5XaWR0aDogNDgsXG4gICAgcmVhbFdpZHRoOiA0OCxcbiAgICBvcmRlcjogJydcbiAgfSxcbiAgaW5kZXg6IHtcbiAgICB3aWR0aDogNDgsXG4gICAgbWluV2lkdGg6IDQ4LFxuICAgIHJlYWxXaWR0aDogNDgsXG4gICAgb3JkZXI6ICcnXG4gIH1cbn07XG5cbi8vIOi/meS6m+mAiemhueS4jeW6lOivpeiiq+imhuebllxudmFyIGNlbGxGb3JjZWQgPSB7XG4gIHNlbGVjdGlvbjoge1xuICAgIHJlbmRlckhlYWRlcjogZnVuY3Rpb24gcmVuZGVySGVhZGVyKGgsIF9yZWYpIHtcbiAgICAgIHZhciBzdG9yZSA9IF9yZWYuc3RvcmU7XG5cbiAgICAgIHJldHVybiBoKCdlbC1jaGVja2JveCcsIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBkaXNhYmxlZDogc3RvcmUuc3RhdGVzLmRhdGEgJiYgc3RvcmUuc3RhdGVzLmRhdGEubGVuZ3RoID09PSAwLFxuICAgICAgICAgIGluZGV0ZXJtaW5hdGU6IHN0b3JlLnN0YXRlcy5zZWxlY3Rpb24ubGVuZ3RoID4gMCAmJiAhdGhpcy5pc0FsbFNlbGVjdGVkLFxuXG4gICAgICAgICAgdmFsdWU6IHRoaXMuaXNBbGxTZWxlY3RlZCB9LFxuICAgICAgICBvbjoge1xuICAgICAgICAgICdpbnB1dCc6IHRoaXMudG9nZ2xlQWxsU2VsZWN0aW9uXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcmVuZGVyQ2VsbDogZnVuY3Rpb24gcmVuZGVyQ2VsbChoLCBfcmVmMikge1xuICAgICAgdmFyIHJvdyA9IF9yZWYyLnJvdyxcbiAgICAgICAgICBjb2x1bW4gPSBfcmVmMi5jb2x1bW4sXG4gICAgICAgICAgaXNTZWxlY3RlZCA9IF9yZWYyLmlzU2VsZWN0ZWQsXG4gICAgICAgICAgc3RvcmUgPSBfcmVmMi5zdG9yZSxcbiAgICAgICAgICAkaW5kZXggPSBfcmVmMi4kaW5kZXg7XG5cbiAgICAgIHJldHVybiBoKCdlbC1jaGVja2JveCcsIHtcbiAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICAnY2xpY2snOiBmdW5jdGlvbiBjbGljayhldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB2YWx1ZTogaXNTZWxlY3RlZCxcbiAgICAgICAgICBkaXNhYmxlZDogY29sdW1uLnNlbGVjdGFibGUgPyAhY29sdW1uLnNlbGVjdGFibGUuY2FsbChudWxsLCByb3csICRpbmRleCkgOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBvbjoge1xuICAgICAgICAgICdpbnB1dCc6IGZ1bmN0aW9uIGlucHV0KCkge1xuICAgICAgICAgICAgc3RvcmUuY29tbWl0KCdyb3dTZWxlY3RlZENoYW5nZWQnLCByb3cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgcmVzaXphYmxlOiBmYWxzZVxuICB9LFxuICBpbmRleDoge1xuICAgIHJlbmRlckhlYWRlcjogZnVuY3Rpb24gcmVuZGVySGVhZGVyKGgsIF9yZWYzKSB7XG4gICAgICB2YXIgY29sdW1uID0gX3JlZjMuY29sdW1uO1xuXG4gICAgICByZXR1cm4gY29sdW1uLmxhYmVsIHx8ICcjJztcbiAgICB9LFxuICAgIHJlbmRlckNlbGw6IGZ1bmN0aW9uIHJlbmRlckNlbGwoaCwgX3JlZjQpIHtcbiAgICAgIHZhciAkaW5kZXggPSBfcmVmNC4kaW5kZXgsXG4gICAgICAgICAgY29sdW1uID0gX3JlZjQuY29sdW1uO1xuXG4gICAgICB2YXIgaSA9ICRpbmRleCArIDE7XG4gICAgICB2YXIgaW5kZXggPSBjb2x1bW4uaW5kZXg7XG5cbiAgICAgIGlmICh0eXBlb2YgaW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgICAgIGkgPSAkaW5kZXggKyBpbmRleDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluZGV4ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGkgPSBpbmRleCgkaW5kZXgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaCgnZGl2JywgW2ldKTtcbiAgICB9LFxuICAgIHNvcnRhYmxlOiBmYWxzZVxuICB9LFxuICBleHBhbmQ6IHtcbiAgICByZW5kZXJIZWFkZXI6IGZ1bmN0aW9uIHJlbmRlckhlYWRlcihoLCBfcmVmNSkge1xuICAgICAgdmFyIGNvbHVtbiA9IF9yZWY1LmNvbHVtbjtcblxuICAgICAgcmV0dXJuIGNvbHVtbi5sYWJlbCB8fCAnJztcbiAgICB9LFxuICAgIHJlbmRlckNlbGw6IGZ1bmN0aW9uIHJlbmRlckNlbGwoaCwgX3JlZjYpIHtcbiAgICAgIHZhciByb3cgPSBfcmVmNi5yb3csXG4gICAgICAgICAgc3RvcmUgPSBfcmVmNi5zdG9yZSxcbiAgICAgICAgICBpc0V4cGFuZGVkID0gX3JlZjYuaXNFeHBhbmRlZDtcblxuICAgICAgdmFyIGNsYXNzZXMgPSBbJ2VsLXRhYmxlX19leHBhbmQtaWNvbiddO1xuICAgICAgaWYgKGlzRXhwYW5kZWQpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdlbC10YWJsZV9fZXhwYW5kLWljb24tLWV4cGFuZGVkJyk7XG4gICAgICB9XG4gICAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjayhlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHN0b3JlLnRvZ2dsZVJvd0V4cGFuc2lvbihyb3cpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBoKFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyAnY2xhc3MnOiBjbGFzc2VzLFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAnY2xpY2snOiBjYWxsYmFja1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2goJ2knLCB7ICdjbGFzcyc6ICdlbC1pY29uIGVsLWljb24tYXJyb3ctcmlnaHQnIH0pXVxuICAgICAgKTtcbiAgICB9LFxuICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICByZXNpemFibGU6IGZhbHNlLFxuICAgIGNsYXNzTmFtZTogJ2VsLXRhYmxlX19leHBhbmQtY29sdW1uJ1xuICB9XG59O1xuXG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyQ2VsbChoLCBfcmVmNykge1xuICB2YXIgcm93ID0gX3JlZjcucm93LFxuICAgICAgY29sdW1uID0gX3JlZjcuY29sdW1uLFxuICAgICAgJGluZGV4ID0gX3JlZjcuJGluZGV4O1xuXG4gIHZhciBwcm9wZXJ0eSA9IGNvbHVtbi5wcm9wZXJ0eTtcbiAgdmFyIHZhbHVlID0gcHJvcGVydHkgJiYgT2JqZWN0KHV0aWxfW1wiZ2V0UHJvcEJ5UGF0aFwiXSkocm93LCBwcm9wZXJ0eSkudjtcbiAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZm9ybWF0dGVyKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5mb3JtYXR0ZXIocm93LCBjb2x1bW4sIHZhbHVlLCAkaW5kZXgpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdHJlZUNlbGxQcmVmaXgoaCwgX3JlZjgpIHtcbiAgdmFyIHJvdyA9IF9yZWY4LnJvdyxcbiAgICAgIHRyZWVOb2RlID0gX3JlZjgudHJlZU5vZGUsXG4gICAgICBzdG9yZSA9IF9yZWY4LnN0b3JlO1xuXG4gIGlmICghdHJlZU5vZGUpIHJldHVybiBudWxsO1xuICB2YXIgZWxlID0gW107XG4gIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHN0b3JlLmxvYWRPclRvZ2dsZShyb3cpO1xuICB9O1xuICBpZiAodHJlZU5vZGUuaW5kZW50KSB7XG4gICAgZWxlLnB1c2goaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2VsLXRhYmxlX19pbmRlbnQnLCBzdHlsZTogeyAncGFkZGluZy1sZWZ0JzogdHJlZU5vZGUuaW5kZW50ICsgJ3B4JyB9IH0pKTtcbiAgfVxuICBpZiAodHlwZW9mIHRyZWVOb2RlLmV4cGFuZGVkID09PSAnYm9vbGVhbicgJiYgIXRyZWVOb2RlLm5vTGF6eUNoaWxkcmVuKSB7XG4gICAgdmFyIGV4cGFuZENsYXNzZXMgPSBbJ2VsLXRhYmxlX19leHBhbmQtaWNvbicsIHRyZWVOb2RlLmV4cGFuZGVkID8gJ2VsLXRhYmxlX19leHBhbmQtaWNvbi0tZXhwYW5kZWQnIDogJyddO1xuICAgIHZhciBpY29uQ2xhc3NlcyA9IFsnZWwtaWNvbi1hcnJvdy1yaWdodCddO1xuICAgIGlmICh0cmVlTm9kZS5sb2FkaW5nKSB7XG4gICAgICBpY29uQ2xhc3NlcyA9IFsnZWwtaWNvbi1sb2FkaW5nJ107XG4gICAgfVxuICAgIGVsZS5wdXNoKGgoXG4gICAgICAnZGl2JyxcbiAgICAgIHsgJ2NsYXNzJzogZXhwYW5kQ2xhc3NlcyxcbiAgICAgICAgb246IHtcbiAgICAgICAgICAnY2xpY2snOiBjYWxsYmFja1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2goJ2knLCB7ICdjbGFzcyc6IGljb25DbGFzc2VzIH0pXVxuICAgICkpO1xuICB9IGVsc2Uge1xuICAgIGVsZS5wdXNoKGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdlbC10YWJsZV9fcGxhY2Vob2xkZXInIH0pKTtcbiAgfVxuICByZXR1cm4gZWxlO1xufVxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJsZS9zcmMvdGFibGUtY29sdW1uLmpzXG52YXIgdGFibGVfY29sdW1uX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5cblxuXG5cbnZhciBjb2x1bW5JZFNlZWQgPSAxO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0YWJsZV9jb2x1bW4gPSAoe1xuICBuYW1lOiAnRWxUYWJsZUNvbHVtbicsXG5cbiAgcHJvcHM6IHtcbiAgICB0eXBlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnZGVmYXVsdCdcbiAgICB9LFxuICAgIGxhYmVsOiBTdHJpbmcsXG4gICAgY2xhc3NOYW1lOiBTdHJpbmcsXG4gICAgbGFiZWxDbGFzc05hbWU6IFN0cmluZyxcbiAgICBwcm9wZXJ0eTogU3RyaW5nLFxuICAgIHByb3A6IFN0cmluZyxcbiAgICB3aWR0aDoge30sXG4gICAgbWluV2lkdGg6IHt9LFxuICAgIHJlbmRlckhlYWRlcjogRnVuY3Rpb24sXG4gICAgc29ydGFibGU6IHtcbiAgICAgIHR5cGU6IFtCb29sZWFuLCBTdHJpbmddLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIHNvcnRNZXRob2Q6IEZ1bmN0aW9uLFxuICAgIHNvcnRCeTogW1N0cmluZywgRnVuY3Rpb24sIEFycmF5XSxcbiAgICByZXNpemFibGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjb2x1bW5LZXk6IFN0cmluZyxcbiAgICBhbGlnbjogU3RyaW5nLFxuICAgIGhlYWRlckFsaWduOiBTdHJpbmcsXG4gICAgc2hvd1Rvb2x0aXBXaGVuT3ZlcmZsb3c6IEJvb2xlYW4sXG4gICAgc2hvd092ZXJmbG93VG9vbHRpcDogQm9vbGVhbixcbiAgICBmaXhlZDogW0Jvb2xlYW4sIFN0cmluZ10sXG4gICAgZm9ybWF0dGVyOiBGdW5jdGlvbixcbiAgICBzZWxlY3RhYmxlOiBGdW5jdGlvbixcbiAgICByZXNlcnZlU2VsZWN0aW9uOiBCb29sZWFuLFxuICAgIGZpbHRlck1ldGhvZDogRnVuY3Rpb24sXG4gICAgZmlsdGVyZWRWYWx1ZTogQXJyYXksXG4gICAgZmlsdGVyczogQXJyYXksXG4gICAgZmlsdGVyUGxhY2VtZW50OiBTdHJpbmcsXG4gICAgZmlsdGVyTXVsdGlwbGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBpbmRleDogW051bWJlciwgRnVuY3Rpb25dLFxuICAgIHNvcnRPcmRlcnM6IHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiBbJ2FzY2VuZGluZycsICdkZXNjZW5kaW5nJywgbnVsbF07XG4gICAgICB9LFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsKSB7XG4gICAgICAgIHJldHVybiB2YWwuZXZlcnkoZnVuY3Rpb24gKG9yZGVyKSB7XG4gICAgICAgICAgcmV0dXJuIFsnYXNjZW5kaW5nJywgJ2Rlc2NlbmRpbmcnLCBudWxsXS5pbmRleE9mKG9yZGVyKSA+IC0xO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNTdWJDb2x1bW46IGZhbHNlLFxuICAgICAgY29sdW1uczogW11cbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBvd25lcjogZnVuY3Rpb24gb3duZXIoKSB7XG4gICAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuICAgICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50LnRhYmxlSWQpIHtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH0sXG4gICAgY29sdW1uT3JUYWJsZVBhcmVudDogZnVuY3Rpb24gY29sdW1uT3JUYWJsZVBhcmVudCgpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG4gICAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQudGFibGVJZCAmJiAhcGFyZW50LmNvbHVtbklkKSB7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9LFxuICAgIHJlYWxXaWR0aDogZnVuY3Rpb24gcmVhbFdpZHRoKCkge1xuICAgICAgcmV0dXJuIHBhcnNlV2lkdGgodGhpcy53aWR0aCk7XG4gICAgfSxcbiAgICByZWFsTWluV2lkdGg6IGZ1bmN0aW9uIHJlYWxNaW5XaWR0aCgpIHtcbiAgICAgIHJldHVybiBwYXJzZU1pbldpZHRoKHRoaXMubWluV2lkdGgpO1xuICAgIH0sXG4gICAgcmVhbEFsaWduOiBmdW5jdGlvbiByZWFsQWxpZ24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbGlnbiA/ICdpcy0nICsgdGhpcy5hbGlnbiA6IG51bGw7XG4gICAgfSxcbiAgICByZWFsSGVhZGVyQWxpZ246IGZ1bmN0aW9uIHJlYWxIZWFkZXJBbGlnbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmhlYWRlckFsaWduID8gJ2lzLScgKyB0aGlzLmhlYWRlckFsaWduIDogdGhpcy5yZWFsQWxpZ247XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRQcm9wc0RhdGE6IGZ1bmN0aW9uIGdldFByb3BzRGF0YSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwcm9wcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBwcm9wc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb3BzLnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cikpIHtcbiAgICAgICAgICBjdXIuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBwcmV2W2tleV0gPSBfdGhpc1trZXldO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSwge30pO1xuICAgIH0sXG4gICAgZ2V0Q29sdW1uRWxJbmRleDogZnVuY3Rpb24gZ2V0Q29sdW1uRWxJbmRleChjaGlsZHJlbiwgY2hpbGQpIHtcbiAgICAgIHJldHVybiBbXS5pbmRleE9mLmNhbGwoY2hpbGRyZW4sIGNoaWxkKTtcbiAgICB9LFxuICAgIHNldENvbHVtbldpZHRoOiBmdW5jdGlvbiBzZXRDb2x1bW5XaWR0aChjb2x1bW4pIHtcbiAgICAgIGlmICh0aGlzLnJlYWxXaWR0aCkge1xuICAgICAgICBjb2x1bW4ud2lkdGggPSB0aGlzLnJlYWxXaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJlYWxNaW5XaWR0aCkge1xuICAgICAgICBjb2x1bW4ubWluV2lkdGggPSB0aGlzLnJlYWxNaW5XaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmICghY29sdW1uLm1pbldpZHRoKSB7XG4gICAgICAgIGNvbHVtbi5taW5XaWR0aCA9IDgwO1xuICAgICAgfVxuICAgICAgY29sdW1uLnJlYWxXaWR0aCA9IGNvbHVtbi53aWR0aCA9PT0gdW5kZWZpbmVkID8gY29sdW1uLm1pbldpZHRoIDogY29sdW1uLndpZHRoO1xuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9LFxuICAgIHNldENvbHVtbkZvcmNlZFByb3BzOiBmdW5jdGlvbiBzZXRDb2x1bW5Gb3JjZWRQcm9wcyhjb2x1bW4pIHtcbiAgICAgIC8vIOWvueS6jueJueWumuexu+Wei+eahCBjb2x1bW7vvIzmn5DkupvlsZ7mgKfkuI3lhYHorrjorr7nva5cbiAgICAgIHZhciB0eXBlID0gY29sdW1uLnR5cGU7XG4gICAgICB2YXIgc291cmNlID0gY2VsbEZvcmNlZFt0eXBlXSB8fCB7fTtcbiAgICAgIE9iamVjdC5rZXlzKHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcF07XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29sdW1uW3Byb3BdID0gcHJvcCA9PT0gJ2NsYXNzTmFtZScgPyBjb2x1bW5bcHJvcF0gKyAnICcgKyB2YWx1ZSA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfSxcbiAgICBzZXRDb2x1bW5SZW5kZXJzOiBmdW5jdGlvbiBzZXRDb2x1bW5SZW5kZXJzKGNvbHVtbikge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBoID0gdGhpcy4kY3JlYXRlRWxlbWVudDtcblxuICAgICAgLy8gcmVuZGVySGVhZGVyIOWxnuaAp+S4jeaOqOiNkOS9v+eUqOOAglxuICAgICAgaWYgKHRoaXMucmVuZGVySGVhZGVyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW0VsZW1lbnQgV2Fybl1bVGFibGVDb2x1bW5dQ29tcGFyaW5nIHRvIHJlbmRlci1oZWFkZXIsIHNjb3BlZC1zbG90IGhlYWRlciBpcyBlYXNpZXIgdG8gdXNlLiBXZSByZWNvbW1lbmQgdXNlcnMgdG8gdXNlIHNjb3BlZC1zbG90IGhlYWRlci4nKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgIT09ICdzZWxlY3Rpb24nKSB7XG4gICAgICAgIGNvbHVtbi5yZW5kZXJIZWFkZXIgPSBmdW5jdGlvbiAoaCwgc2NvcGUpIHtcbiAgICAgICAgICB2YXIgcmVuZGVySGVhZGVyID0gX3RoaXMyLiRzY29wZWRTbG90cy5oZWFkZXI7XG4gICAgICAgICAgcmV0dXJuIHJlbmRlckhlYWRlciA/IHJlbmRlckhlYWRlcihzY29wZSkgOiBjb2x1bW4ubGFiZWw7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHZhciBvcmlnaW5SZW5kZXJDZWxsID0gY29sdW1uLnJlbmRlckNlbGw7XG4gICAgICAvLyBUT0RPOiDov5nph4znmoTlrp7njrDosIPmlbRcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2V4cGFuZCcpIHtcbiAgICAgICAgLy8g5a+55LqO5bGV5byA6KGM77yMcmVuZGVyQ2VsbCDkuI3lhYHorrjphY3nva7nmoTjgILlnKjkuIrkuIDmraXkuK3lt7Lnu4/orr7nva7ov4fvvIzov5nph4zpnIDopoHnroDljZXlsIHoo4XkuIDkuIvjgIJcbiAgICAgICAgY29sdW1uLnJlbmRlckNlbGwgPSBmdW5jdGlvbiAoaCwgZGF0YSkge1xuICAgICAgICAgIHJldHVybiBoKFxuICAgICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgICB7ICdjbGFzcyc6ICdjZWxsJyB9LFxuICAgICAgICAgICAgW29yaWdpblJlbmRlckNlbGwoaCwgZGF0YSldXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vd25lci5yZW5kZXJFeHBhbmRlZCA9IGZ1bmN0aW9uIChoLCBkYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi4kc2NvcGVkU2xvdHMuZGVmYXVsdCA/IF90aGlzMi4kc2NvcGVkU2xvdHMuZGVmYXVsdChkYXRhKSA6IF90aGlzMi4kc2xvdHMuZGVmYXVsdDtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9yaWdpblJlbmRlckNlbGwgPSBvcmlnaW5SZW5kZXJDZWxsIHx8IGRlZmF1bHRSZW5kZXJDZWxsO1xuICAgICAgICAvLyDlr7kgcmVuZGVyQ2VsbCDov5vooYzljIXoo4VcbiAgICAgICAgY29sdW1uLnJlbmRlckNlbGwgPSBmdW5jdGlvbiAoaCwgZGF0YSkge1xuICAgICAgICAgIHZhciBjaGlsZHJlbiA9IG51bGw7XG4gICAgICAgICAgaWYgKF90aGlzMi4kc2NvcGVkU2xvdHMuZGVmYXVsdCkge1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBfdGhpczIuJHNjb3BlZFNsb3RzLmRlZmF1bHQoZGF0YSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gb3JpZ2luUmVuZGVyQ2VsbChoLCBkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHByZWZpeCA9IHRyZWVDZWxsUHJlZml4KGgsIGRhdGEpO1xuICAgICAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAnY2VsbCcsXG4gICAgICAgICAgICBzdHlsZToge31cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChjb2x1bW4uc2hvd092ZXJmbG93VG9vbHRpcCkge1xuICAgICAgICAgICAgcHJvcHMuY2xhc3MgKz0gJyBlbC10b29sdGlwJztcbiAgICAgICAgICAgIHByb3BzLnN0eWxlID0geyB3aWR0aDogKGRhdGEuY29sdW1uLnJlYWxXaWR0aCB8fCBkYXRhLmNvbHVtbi53aWR0aCkgLSAxICsgJ3B4JyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaChcbiAgICAgICAgICAgICdkaXYnLFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICBbcHJlZml4LCBjaGlsZHJlbl1cbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9LFxuICAgIHJlZ2lzdGVyTm9ybWFsV2F0Y2hlcnM6IGZ1bmN0aW9uIHJlZ2lzdGVyTm9ybWFsV2F0Y2hlcnMoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIHByb3BzID0gWydsYWJlbCcsICdwcm9wZXJ0eScsICdmaWx0ZXJzJywgJ2ZpbHRlck11bHRpcGxlJywgJ3NvcnRhYmxlJywgJ2luZGV4JywgJ2Zvcm1hdHRlcicsICdjbGFzc05hbWUnLCAnbGFiZWxDbGFzc05hbWUnLCAnc2hvd092ZXJmbG93VG9vbHRpcCddO1xuICAgICAgLy8g5LiA5Lqb5bGe5oCn5YW35pyJ5Yir5ZCNXG4gICAgICB2YXIgYWxpYXNlcyA9IHtcbiAgICAgICAgcHJvcDogJ3Byb3BlcnR5JyxcbiAgICAgICAgcmVhbEFsaWduOiAnYWxpZ24nLFxuICAgICAgICByZWFsSGVhZGVyQWxpZ246ICdoZWFkZXJBbGlnbicsXG4gICAgICAgIHJlYWxXaWR0aDogJ3dpZHRoJ1xuICAgICAgfTtcbiAgICAgIHZhciBhbGxBbGlhc2VzID0gcHJvcHMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXIpIHtcbiAgICAgICAgcHJldltjdXJdID0gY3VyO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIGFsaWFzZXMpO1xuXG4gICAgICBPYmplY3Qua2V5cyhhbGxBbGlhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIGNvbHVtbktleSA9IGFsaWFzZXNba2V5XTtcblxuICAgICAgICBfdGhpczMuJHdhdGNoKGtleSwgZnVuY3Rpb24gKG5ld1ZhbCkge1xuICAgICAgICAgIF90aGlzMy5jb2x1bW5Db25maWdbY29sdW1uS2V5XSA9IG5ld1ZhbDtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHJlZ2lzdGVyQ29tcGxleFdhdGNoZXJzOiBmdW5jdGlvbiByZWdpc3RlckNvbXBsZXhXYXRjaGVycygpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICB2YXIgcHJvcHMgPSBbJ2ZpeGVkJ107XG4gICAgICB2YXIgYWxpYXNlcyA9IHtcbiAgICAgICAgcmVhbFdpZHRoOiAnd2lkdGgnLFxuICAgICAgICByZWFsTWluV2lkdGg6ICdtaW5XaWR0aCdcbiAgICAgIH07XG4gICAgICB2YXIgYWxsQWxpYXNlcyA9IHByb3BzLnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyKSB7XG4gICAgICAgIHByZXZbY3VyXSA9IGN1cjtcbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICB9LCBhbGlhc2VzKTtcblxuICAgICAgT2JqZWN0LmtleXMoYWxsQWxpYXNlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBjb2x1bW5LZXkgPSBhbGlhc2VzW2tleV07XG5cbiAgICAgICAgX3RoaXM0LiR3YXRjaChrZXksIGZ1bmN0aW9uIChuZXdWYWwpIHtcbiAgICAgICAgICBfdGhpczQuY29sdW1uQ29uZmlnW2NvbHVtbktleV0gPSBuZXdWYWw7XG4gICAgICAgICAgdmFyIHVwZGF0ZUNvbHVtbnMgPSBjb2x1bW5LZXkgPT09ICdmaXhlZCc7XG4gICAgICAgICAgX3RoaXM0Lm93bmVyLnN0b3JlLnNjaGVkdWxlTGF5b3V0KHVwZGF0ZUNvbHVtbnMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxDaGVja2JveDogY2hlY2tib3hfZGVmYXVsdC5hXG4gIH0sXG5cbiAgYmVmb3JlQ3JlYXRlOiBmdW5jdGlvbiBiZWZvcmVDcmVhdGUoKSB7XG4gICAgdGhpcy5yb3cgPSB7fTtcbiAgICB0aGlzLmNvbHVtbiA9IHt9O1xuICAgIHRoaXMuJGluZGV4ID0gMDtcbiAgICB0aGlzLmNvbHVtbklkID0gJyc7XG4gIH0sXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuY29sdW1uT3JUYWJsZVBhcmVudDtcbiAgICB0aGlzLmlzU3ViQ29sdW1uID0gdGhpcy5vd25lciAhPT0gcGFyZW50O1xuICAgIHRoaXMuY29sdW1uSWQgPSAocGFyZW50LnRhYmxlSWQgfHwgcGFyZW50LmNvbHVtbklkKSArICdfY29sdW1uXycgKyBjb2x1bW5JZFNlZWQrKztcblxuICAgIHZhciB0eXBlID0gdGhpcy50eXBlIHx8ICdkZWZhdWx0JztcbiAgICB2YXIgc29ydGFibGUgPSB0aGlzLnNvcnRhYmxlID09PSAnJyA/IHRydWUgOiB0aGlzLnNvcnRhYmxlO1xuICAgIHZhciBkZWZhdWx0cyA9IHRhYmxlX2NvbHVtbl9leHRlbmRzKHt9LCBjZWxsU3RhcnRzW3R5cGVdLCB7XG4gICAgICBpZDogdGhpcy5jb2x1bW5JZCxcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBwcm9wZXJ0eTogdGhpcy5wcm9wIHx8IHRoaXMucHJvcGVydHksXG4gICAgICBhbGlnbjogdGhpcy5yZWFsQWxpZ24sXG4gICAgICBoZWFkZXJBbGlnbjogdGhpcy5yZWFsSGVhZGVyQWxpZ24sXG4gICAgICBzaG93T3ZlcmZsb3dUb29sdGlwOiB0aGlzLnNob3dPdmVyZmxvd1Rvb2x0aXAgfHwgdGhpcy5zaG93VG9vbHRpcFdoZW5PdmVyZmxvdyxcbiAgICAgIC8vIGZpbHRlciDnm7jlhbPlsZ7mgKdcbiAgICAgIGZpbHRlcmFibGU6IHRoaXMuZmlsdGVycyB8fCB0aGlzLmZpbHRlck1ldGhvZCxcbiAgICAgIGZpbHRlcmVkVmFsdWU6IFtdLFxuICAgICAgZmlsdGVyUGxhY2VtZW50OiAnJyxcbiAgICAgIGlzQ29sdW1uR3JvdXA6IGZhbHNlLFxuICAgICAgZmlsdGVyT3BlbmVkOiBmYWxzZSxcbiAgICAgIC8vIHNvcnQg55u45YWz5bGe5oCnXG4gICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAvLyBpbmRleCDliJdcbiAgICAgIGluZGV4OiB0aGlzLmluZGV4XG4gICAgfSk7XG5cbiAgICB2YXIgYmFzaWNQcm9wcyA9IFsnY29sdW1uS2V5JywgJ2xhYmVsJywgJ2NsYXNzTmFtZScsICdsYWJlbENsYXNzTmFtZScsICd0eXBlJywgJ3JlbmRlckhlYWRlcicsICdmb3JtYXR0ZXInLCAnZml4ZWQnLCAncmVzaXphYmxlJ107XG4gICAgdmFyIHNvcnRQcm9wcyA9IFsnc29ydE1ldGhvZCcsICdzb3J0QnknLCAnc29ydE9yZGVycyddO1xuICAgIHZhciBzZWxlY3RQcm9wcyA9IFsnc2VsZWN0YWJsZScsICdyZXNlcnZlU2VsZWN0aW9uJ107XG4gICAgdmFyIGZpbHRlclByb3BzID0gWydmaWx0ZXJNZXRob2QnLCAnZmlsdGVycycsICdmaWx0ZXJNdWx0aXBsZScsICdmaWx0ZXJPcGVuZWQnLCAnZmlsdGVyZWRWYWx1ZScsICdmaWx0ZXJQbGFjZW1lbnQnXTtcblxuICAgIHZhciBjb2x1bW4gPSB0aGlzLmdldFByb3BzRGF0YShiYXNpY1Byb3BzLCBzb3J0UHJvcHMsIHNlbGVjdFByb3BzLCBmaWx0ZXJQcm9wcyk7XG4gICAgY29sdW1uID0gbWVyZ2VPcHRpb25zKGRlZmF1bHRzLCBjb2x1bW4pO1xuXG4gICAgLy8g5rOo5oSPIGNvbXBvc2Ug5Lit5Ye95pWw5omn6KGM55qE6aG65bqP5piv5LuO5Y+z5Yiw5bemXG4gICAgdmFyIGNoYWlucyA9IGNvbXBvc2UodGhpcy5zZXRDb2x1bW5SZW5kZXJzLCB0aGlzLnNldENvbHVtbldpZHRoLCB0aGlzLnNldENvbHVtbkZvcmNlZFByb3BzKTtcbiAgICBjb2x1bW4gPSBjaGFpbnMoY29sdW1uKTtcblxuICAgIHRoaXMuY29sdW1uQ29uZmlnID0gY29sdW1uO1xuXG4gICAgLy8g5rOo5YaMIHdhdGNoZXJcbiAgICB0aGlzLnJlZ2lzdGVyTm9ybWFsV2F0Y2hlcnMoKTtcbiAgICB0aGlzLnJlZ2lzdGVyQ29tcGxleFdhdGNoZXJzKCk7XG4gIH0sXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIG93bmVyID0gdGhpcy5vd25lcjtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5jb2x1bW5PclRhYmxlUGFyZW50O1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuaXNTdWJDb2x1bW4gPyBwYXJlbnQuJGVsLmNoaWxkcmVuIDogcGFyZW50LiRyZWZzLmhpZGRlbkNvbHVtbnMuY2hpbGRyZW47XG4gICAgdmFyIGNvbHVtbkluZGV4ID0gdGhpcy5nZXRDb2x1bW5FbEluZGV4KGNoaWxkcmVuLCB0aGlzLiRlbCk7XG5cbiAgICBvd25lci5zdG9yZS5jb21taXQoJ2luc2VydENvbHVtbicsIHRoaXMuY29sdW1uQ29uZmlnLCBjb2x1bW5JbmRleCwgdGhpcy5pc1N1YkNvbHVtbiA/IHBhcmVudC5jb2x1bW5Db25maWcgOiBudWxsKTtcbiAgfSxcbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgaWYgKCF0aGlzLiRwYXJlbnQpIHJldHVybjtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuICAgIHRoaXMub3duZXIuc3RvcmUuY29tbWl0KCdyZW1vdmVDb2x1bW4nLCB0aGlzLmNvbHVtbkNvbmZpZywgdGhpcy5pc1N1YkNvbHVtbiA/IHBhcmVudC5jb2x1bW5Db25maWcgOiBudWxsKTtcbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIC8vIHNsb3RzIOS5n+imgea4suafk++8jOmcgOimgeiuoeeul+WQiOW5tuihqOWktFxuICAgIHJldHVybiBoKCdkaXYnLCB0aGlzLiRzbG90cy5kZWZhdWx0KTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYmxlLWNvbHVtbi9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG50YWJsZV9jb2x1bW4uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudCh0YWJsZV9jb2x1bW4ubmFtZSwgdGFibGVfY29sdW1uKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3RhYmxlX2NvbHVtbiA9ICh0YWJsZV9jb2x1bW4pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGlja2VyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03OWFlMDY5ZiZcbnZhciBwaWNrZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83OWFlMDY5Zl9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gIV92bS5yYW5nZWRcbiAgICA/IF9jKFxuICAgICAgICBcImVsLWlucHV0XCIsXG4gICAgICAgIF92bS5fYihcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNsaWNrb3V0c2lkZVwiLFxuICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1jbGlja291dHNpZGVcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmhhbmRsZUNsb3NlLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiaGFuZGxlQ2xvc2VcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVmOiBcInJlZmVyZW5jZVwiLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtZGF0ZS1lZGl0b3JcIixcbiAgICAgICAgICAgIGNsYXNzOiBcImVsLWRhdGUtZWRpdG9yLS1cIiArIF92bS50eXBlLFxuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgcmVhZG9ubHk6XG4gICAgICAgICAgICAgICAgIV92bS5lZGl0YWJsZSB8fFxuICAgICAgICAgICAgICAgIF92bS5yZWFkb25seSB8fFxuICAgICAgICAgICAgICAgIF92bS50eXBlID09PSBcImRhdGVzXCIgfHxcbiAgICAgICAgICAgICAgICBfdm0udHlwZSA9PT0gXCJ3ZWVrXCIgfHxcbiAgICAgICAgICAgICAgICBfdm0udHlwZSA9PT0gXCJ5ZWFyc1wiIHx8XG4gICAgICAgICAgICAgICAgX3ZtLnR5cGUgPT09IFwibW9udGhzXCIsXG4gICAgICAgICAgICAgIGRpc2FibGVkOiBfdm0ucGlja2VyRGlzYWJsZWQsXG4gICAgICAgICAgICAgIHNpemU6IF92bS5waWNrZXJTaXplLFxuICAgICAgICAgICAgICBuYW1lOiBfdm0ubmFtZSxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IF92bS5wbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgdmFsdWU6IF92bS5kaXNwbGF5VmFsdWUsXG4gICAgICAgICAgICAgIHZhbGlkYXRlRXZlbnQ6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgZm9jdXM6IF92bS5oYW5kbGVGb2N1cyxcbiAgICAgICAgICAgICAgaW5wdXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChfdm0udXNlcklucHV0ID0gdmFsdWUpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNoYW5nZTogX3ZtLmhhbmRsZUNoYW5nZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hdGl2ZU9uOiB7XG4gICAgICAgICAgICAgIGtleWRvd246IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdm0uaGFuZGxlS2V5ZG93bigkZXZlbnQpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1vdXNlZW50ZXI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdm0uaGFuZGxlTW91c2VFbnRlcigkZXZlbnQpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1vdXNlbGVhdmU6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgIF92bS5zaG93Q2xvc2UgPSBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImVsLWlucHV0XCIsXG4gICAgICAgICAgX3ZtLmZpcnN0SW5wdXRJZCxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApLFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXCJpXCIsIHtcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWlucHV0X19pY29uXCIsXG4gICAgICAgICAgICBjbGFzczogX3ZtLnRyaWdnZXJDbGFzcyxcbiAgICAgICAgICAgIGF0dHJzOiB7IHNsb3Q6IFwicHJlZml4XCIgfSxcbiAgICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0uaGFuZGxlRm9jdXMgfSxcbiAgICAgICAgICAgIHNsb3Q6IFwicHJlZml4XCJcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBfdm0uaGF2ZVRyaWdnZXJcbiAgICAgICAgICAgID8gX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1pbnB1dF9faWNvblwiLFxuICAgICAgICAgICAgICAgIGNsYXNzOiBbX3ZtLnNob3dDbG9zZSA/IFwiXCIgKyBfdm0uY2xlYXJJY29uIDogXCJcIl0sXG4gICAgICAgICAgICAgICAgYXR0cnM6IHsgc2xvdDogXCJzdWZmaXhcIiB9LFxuICAgICAgICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0uaGFuZGxlQ2xpY2tJY29uIH0sXG4gICAgICAgICAgICAgICAgc2xvdDogXCJzdWZmaXhcIlxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICBdXG4gICAgICApXG4gICAgOiBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJjbGlja291dHNpZGVcIixcbiAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LWNsaWNrb3V0c2lkZVwiLFxuICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmhhbmRsZUNsb3NlLFxuICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImhhbmRsZUNsb3NlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlZjogXCJyZWZlcmVuY2VcIixcbiAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1kYXRlLWVkaXRvciBlbC1yYW5nZS1lZGl0b3IgZWwtaW5wdXRfX2lubmVyXCIsXG4gICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgIFwiZWwtZGF0ZS1lZGl0b3ItLVwiICsgX3ZtLnR5cGUsXG4gICAgICAgICAgICBfdm0ucGlja2VyU2l6ZSA/IFwiZWwtcmFuZ2UtZWRpdG9yLS1cIiArIF92bS5waWNrZXJTaXplIDogXCJcIixcbiAgICAgICAgICAgIF92bS5waWNrZXJEaXNhYmxlZCA/IFwiaXMtZGlzYWJsZWRcIiA6IFwiXCIsXG4gICAgICAgICAgICBfdm0ucGlja2VyVmlzaWJsZSA/IFwiaXMtYWN0aXZlXCIgOiBcIlwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgY2xpY2s6IF92bS5oYW5kbGVSYW5nZUNsaWNrLFxuICAgICAgICAgICAgbW91c2VlbnRlcjogX3ZtLmhhbmRsZU1vdXNlRW50ZXIsXG4gICAgICAgICAgICBtb3VzZWxlYXZlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgX3ZtLnNob3dDbG9zZSA9IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2V5ZG93bjogX3ZtLmhhbmRsZUtleWRvd25cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgY2xhc3M6IFtcImVsLWlucHV0X19pY29uXCIsIFwiZWwtcmFuZ2VfX2ljb25cIiwgX3ZtLnRyaWdnZXJDbGFzc11cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwiaW5wdXRcIixcbiAgICAgICAgICAgIF92bS5fYihcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXJhbmdlLWlucHV0XCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZTogXCJvZmZcIixcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBfdm0uc3RhcnRQbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBfdm0ucGlja2VyRGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICByZWFkb25seTogIV92bS5lZGl0YWJsZSB8fCBfdm0ucmVhZG9ubHksXG4gICAgICAgICAgICAgICAgICBuYW1lOiBfdm0ubmFtZSAmJiBfdm0ubmFtZVswXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZG9tUHJvcHM6IHsgdmFsdWU6IF92bS5kaXNwbGF5VmFsdWUgJiYgX3ZtLmRpc3BsYXlWYWx1ZVswXSB9LFxuICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICBpbnB1dDogX3ZtLmhhbmRsZVN0YXJ0SW5wdXQsXG4gICAgICAgICAgICAgICAgICBjaGFuZ2U6IF92bS5oYW5kbGVTdGFydENoYW5nZSxcbiAgICAgICAgICAgICAgICAgIGZvY3VzOiBfdm0uaGFuZGxlRm9jdXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiaW5wdXRcIixcbiAgICAgICAgICAgICAgX3ZtLmZpcnN0SW5wdXRJZCxcbiAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIF92bS5fdChcInJhbmdlLXNlcGFyYXRvclwiLCBbXG4gICAgICAgICAgICBfYyhcInNwYW5cIiwgeyBzdGF0aWNDbGFzczogXCJlbC1yYW5nZS1zZXBhcmF0b3JcIiB9LCBbXG4gICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLnJhbmdlU2VwYXJhdG9yKSlcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgXSksXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImlucHV0XCIsXG4gICAgICAgICAgICBfdm0uX2IoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1yYW5nZS1pbnB1dFwiLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU6IFwib2ZmXCIsXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogX3ZtLmVuZFBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5waWNrZXJEaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiAhX3ZtLmVkaXRhYmxlIHx8IF92bS5yZWFkb25seSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IF92bS5uYW1lICYmIF92bS5uYW1lWzFdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkb21Qcm9wczogeyB2YWx1ZTogX3ZtLmRpc3BsYXlWYWx1ZSAmJiBfdm0uZGlzcGxheVZhbHVlWzFdIH0sXG4gICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBfdm0uaGFuZGxlRW5kSW5wdXQsXG4gICAgICAgICAgICAgICAgICBjaGFuZ2U6IF92bS5oYW5kbGVFbmRDaGFuZ2UsXG4gICAgICAgICAgICAgICAgICBmb2N1czogX3ZtLmhhbmRsZUZvY3VzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcImlucHV0XCIsXG4gICAgICAgICAgICAgIF92bS5zZWNvbmRJbnB1dElkLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgX3ZtLmhhdmVUcmlnZ2VyXG4gICAgICAgICAgICA/IF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtaW5wdXRfX2ljb24gZWwtcmFuZ2VfX2Nsb3NlLWljb25cIixcbiAgICAgICAgICAgICAgICBjbGFzczogW192bS5zaG93Q2xvc2UgPyBcIlwiICsgX3ZtLmNsZWFySWNvbiA6IFwiXCJdLFxuICAgICAgICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0uaGFuZGxlQ2xpY2tJY29uIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgXSxcbiAgICAgICAgMlxuICAgICAgKVxufVxudmFyIHBpY2tlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzc5YWUwNjlmX3N0YXRpY1JlbmRlckZucyA9IFtdXG5waWNrZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83OWFlMDY5Zl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9waWNrZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTc5YWUwNjlmJlxuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvZGF0ZS11dGlsXCJcbnZhciBkYXRlX3V0aWxfID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BpY2tlci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cblxuXG5cblxudmFyIE5ld1BvcHBlciA9IHtcbiAgcHJvcHM6IHtcbiAgICBhcHBlbmRUb0JvZHk6IHZ1ZV9wb3BwZXJfZGVmYXVsdC5hLnByb3BzLmFwcGVuZFRvQm9keSxcbiAgICBvZmZzZXQ6IHZ1ZV9wb3BwZXJfZGVmYXVsdC5hLnByb3BzLm9mZnNldCxcbiAgICBib3VuZGFyaWVzUGFkZGluZzogdnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMuYm91bmRhcmllc1BhZGRpbmcsXG4gICAgYXJyb3dPZmZzZXQ6IHZ1ZV9wb3BwZXJfZGVmYXVsdC5hLnByb3BzLmFycm93T2Zmc2V0LFxuICAgIHRyYW5zZm9ybU9yaWdpbjogdnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMudHJhbnNmb3JtT3JpZ2luXG4gIH0sXG4gIG1ldGhvZHM6IHZ1ZV9wb3BwZXJfZGVmYXVsdC5hLm1ldGhvZHMsXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIG1lcmdlX2RlZmF1bHQoKSh7IHZpc2libGVBcnJvdzogdHJ1ZSB9LCB2dWVfcG9wcGVyX2RlZmF1bHQuYS5kYXRhKTtcbiAgfSxcblxuICBiZWZvcmVEZXN0cm95OiB2dWVfcG9wcGVyX2RlZmF1bHQuYS5iZWZvcmVEZXN0cm95XG59O1xuXG52YXIgREVGQVVMVF9GT1JNQVRTID0ge1xuICBkYXRlOiAneXl5eS1NTS1kZCcsXG4gIG1vbnRoOiAneXl5eS1NTScsXG4gIG1vbnRoczogJ3l5eXktTU0nLFxuICBkYXRldGltZTogJ3l5eXktTU0tZGQgSEg6bW06c3MnLFxuICB0aW1lOiAnSEg6bW06c3MnLFxuICB3ZWVrOiAneXl5eXdXVycsXG4gIHRpbWVyYW5nZTogJ0hIOm1tOnNzJyxcbiAgZGF0ZXJhbmdlOiAneXl5eS1NTS1kZCcsXG4gIG1vbnRocmFuZ2U6ICd5eXl5LU1NJyxcbiAgZGF0ZXRpbWVyYW5nZTogJ3l5eXktTU0tZGQgSEg6bW06c3MnLFxuICB5ZWFyOiAneXl5eScsXG4gIHllYXJzOiAneXl5eSdcbn07XG52YXIgSEFWRV9UUklHR0VSX1RZUEVTID0gWydkYXRlJywgJ2RhdGV0aW1lJywgJ3RpbWUnLCAndGltZS1zZWxlY3QnLCAnd2VlaycsICdtb250aCcsICd5ZWFyJywgJ2RhdGVyYW5nZScsICdtb250aHJhbmdlJywgJ3RpbWVyYW5nZScsICdkYXRldGltZXJhbmdlJywgJ2RhdGVzJywgJ21vbnRocycsICd5ZWFycyddO1xudmFyIHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfRk9STUFUVEVSID0gZnVuY3Rpb24gREFURV9GT1JNQVRURVIodmFsdWUsIGZvcm1hdCkge1xuICBpZiAoZm9ybWF0ID09PSAndGltZXN0YW1wJykgcmV0dXJuIHZhbHVlLmdldFRpbWUoKTtcbiAgcmV0dXJuIE9iamVjdChkYXRlX3V0aWxfW1wiZm9ybWF0RGF0ZVwiXSkodmFsdWUsIGZvcm1hdCk7XG59O1xudmFyIHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfUEFSU0VSID0gZnVuY3Rpb24gREFURV9QQVJTRVIodGV4dCwgZm9ybWF0KSB7XG4gIGlmIChmb3JtYXQgPT09ICd0aW1lc3RhbXAnKSByZXR1cm4gbmV3IERhdGUoTnVtYmVyKHRleHQpKTtcbiAgcmV0dXJuIE9iamVjdChkYXRlX3V0aWxfW1wicGFyc2VEYXRlXCJdKSh0ZXh0LCBmb3JtYXQpO1xufTtcbnZhciBSQU5HRV9GT1JNQVRURVIgPSBmdW5jdGlvbiBSQU5HRV9GT1JNQVRURVIodmFsdWUsIGZvcm1hdCkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAyKSB7XG4gICAgdmFyIHN0YXJ0ID0gdmFsdWVbMF07XG4gICAgdmFyIGVuZCA9IHZhbHVlWzFdO1xuXG4gICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgICAgcmV0dXJuIFtwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19EQVRFX0ZPUk1BVFRFUihzdGFydCwgZm9ybWF0KSwgcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9GT1JNQVRURVIoZW5kLCBmb3JtYXQpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufTtcbnZhciBSQU5HRV9QQVJTRVIgPSBmdW5jdGlvbiBSQU5HRV9QQVJTRVIoYXJyYXksIGZvcm1hdCwgc2VwYXJhdG9yKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkpIHtcbiAgICBhcnJheSA9IGFycmF5LnNwbGl0KHNlcGFyYXRvcik7XG4gIH1cbiAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMikge1xuICAgIHZhciByYW5nZTEgPSBhcnJheVswXTtcbiAgICB2YXIgcmFuZ2UyID0gYXJyYXlbMV07XG5cbiAgICByZXR1cm4gW3BpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfUEFSU0VSKHJhbmdlMSwgZm9ybWF0KSwgcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9QQVJTRVIocmFuZ2UyLCBmb3JtYXQpXTtcbiAgfVxuICByZXR1cm4gW107XG59O1xudmFyIFRZUEVfVkFMVUVfUkVTT0xWRVJfTUFQID0ge1xuICBkZWZhdWx0OiB7XG4gICAgZm9ybWF0dGVyOiBmdW5jdGlvbiBmb3JtYXR0ZXIodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHJldHVybiAnJztcbiAgICAgIHJldHVybiAnJyArIHZhbHVlO1xuICAgIH0sXG4gICAgcGFyc2VyOiBmdW5jdGlvbiBwYXJzZXIodGV4dCkge1xuICAgICAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCB8fCB0ZXh0ID09PSAnJykgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gIH0sXG4gIHdlZWs6IHtcbiAgICBmb3JtYXR0ZXI6IGZ1bmN0aW9uIGZvcm1hdHRlcih2YWx1ZSwgZm9ybWF0KSB7XG4gICAgICB2YXIgd2VlayA9IE9iamVjdChkYXRlX3V0aWxfW1wiZ2V0V2Vla051bWJlclwiXSkodmFsdWUpO1xuICAgICAgdmFyIG1vbnRoID0gdmFsdWUuZ2V0TW9udGgoKTtcbiAgICAgIHZhciB0cnVlRGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgIGlmICh3ZWVrID09PSAxICYmIG1vbnRoID09PSAxMSkge1xuICAgICAgICB0cnVlRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgdHJ1ZURhdGUuc2V0RGF0ZSh0cnVlRGF0ZS5nZXREYXRlKCkgKyAzIC0gKHRydWVEYXRlLmdldERheSgpICsgNikgJSA3KTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJmb3JtYXREYXRlXCJdKSh0cnVlRGF0ZSwgZm9ybWF0KTtcblxuICAgICAgZGF0ZSA9IC9XVy8udGVzdChkYXRlKSA/IGRhdGUucmVwbGFjZSgvV1cvLCB3ZWVrIDwgMTAgPyAnMCcgKyB3ZWVrIDogd2VlaykgOiBkYXRlLnJlcGxhY2UoL1cvLCB3ZWVrKTtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH0sXG4gICAgcGFyc2VyOiBmdW5jdGlvbiBwYXJzZXIodGV4dCwgZm9ybWF0KSB7XG4gICAgICAvLyBwYXJzZSBhcyBpZiBhIG5vcm1hbCBkYXRlXG4gICAgICByZXR1cm4gVFlQRV9WQUxVRV9SRVNPTFZFUl9NQVAuZGF0ZS5wYXJzZXIodGV4dCwgZm9ybWF0KTtcbiAgICB9XG4gIH0sXG4gIGRhdGU6IHtcbiAgICBmb3JtYXR0ZXI6IHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfRk9STUFUVEVSLFxuICAgIHBhcnNlcjogcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9QQVJTRVJcbiAgfSxcbiAgZGF0ZXRpbWU6IHtcbiAgICBmb3JtYXR0ZXI6IHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfRk9STUFUVEVSLFxuICAgIHBhcnNlcjogcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9QQVJTRVJcbiAgfSxcbiAgZGF0ZXJhbmdlOiB7XG4gICAgZm9ybWF0dGVyOiBSQU5HRV9GT1JNQVRURVIsXG4gICAgcGFyc2VyOiBSQU5HRV9QQVJTRVJcbiAgfSxcbiAgbW9udGhyYW5nZToge1xuICAgIGZvcm1hdHRlcjogUkFOR0VfRk9STUFUVEVSLFxuICAgIHBhcnNlcjogUkFOR0VfUEFSU0VSXG4gIH0sXG4gIGRhdGV0aW1lcmFuZ2U6IHtcbiAgICBmb3JtYXR0ZXI6IFJBTkdFX0ZPUk1BVFRFUixcbiAgICBwYXJzZXI6IFJBTkdFX1BBUlNFUlxuICB9LFxuICB0aW1lcmFuZ2U6IHtcbiAgICBmb3JtYXR0ZXI6IFJBTkdFX0ZPUk1BVFRFUixcbiAgICBwYXJzZXI6IFJBTkdFX1BBUlNFUlxuICB9LFxuICB0aW1lOiB7XG4gICAgZm9ybWF0dGVyOiBwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19EQVRFX0ZPUk1BVFRFUixcbiAgICBwYXJzZXI6IHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfUEFSU0VSXG4gIH0sXG4gIG1vbnRoOiB7XG4gICAgZm9ybWF0dGVyOiBwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19EQVRFX0ZPUk1BVFRFUixcbiAgICBwYXJzZXI6IHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfUEFSU0VSXG4gIH0sXG4gIHllYXI6IHtcbiAgICBmb3JtYXR0ZXI6IHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfRk9STUFUVEVSLFxuICAgIHBhcnNlcjogcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9QQVJTRVJcbiAgfSxcbiAgbnVtYmVyOiB7XG4gICAgZm9ybWF0dGVyOiBmdW5jdGlvbiBmb3JtYXR0ZXIodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHJldHVybiAnJztcbiAgICAgIHJldHVybiAnJyArIHZhbHVlO1xuICAgIH0sXG4gICAgcGFyc2VyOiBmdW5jdGlvbiBwYXJzZXIodGV4dCkge1xuICAgICAgdmFyIHJlc3VsdCA9IE51bWJlcih0ZXh0KTtcblxuICAgICAgaWYgKCFpc05hTih0ZXh0KSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBkYXRlczoge1xuICAgIGZvcm1hdHRlcjogZnVuY3Rpb24gZm9ybWF0dGVyKHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfRk9STUFUVEVSKGRhdGUsIGZvcm1hdCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHBhcnNlcjogZnVuY3Rpb24gcGFyc2VyKHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnNwbGl0KCcsICcpIDogdmFsdWUpLm1hcChmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICByZXR1cm4gZGF0ZSBpbnN0YW5jZW9mIERhdGUgPyBkYXRlIDogcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9QQVJTRVIoZGF0ZSwgZm9ybWF0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgbW9udGhzOiB7XG4gICAgZm9ybWF0dGVyOiBmdW5jdGlvbiBmb3JtYXR0ZXIodmFsdWUsIGZvcm1hdCkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1hcChmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICByZXR1cm4gcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9GT1JNQVRURVIoZGF0ZSwgZm9ybWF0KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcGFyc2VyOiBmdW5jdGlvbiBwYXJzZXIodmFsdWUsIGZvcm1hdCkge1xuICAgICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUuc3BsaXQoJywgJykgOiB2YWx1ZSkubWFwKGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGUgOiBwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19EQVRFX1BBUlNFUihkYXRlLCBmb3JtYXQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICB5ZWFyczoge1xuICAgIGZvcm1hdHRlcjogZnVuY3Rpb24gZm9ybWF0dGVyKHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0RBVEVfRk9STUFUVEVSKGRhdGUsIGZvcm1hdCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHBhcnNlcjogZnVuY3Rpb24gcGFyc2VyKHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnNwbGl0KCcsICcpIDogdmFsdWUpLm1hcChmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICByZXR1cm4gZGF0ZSBpbnN0YW5jZW9mIERhdGUgPyBkYXRlIDogcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfREFURV9QQVJTRVIoZGF0ZSwgZm9ybWF0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufTtcbnZhciBQTEFDRU1FTlRfTUFQID0ge1xuICBsZWZ0OiAnYm90dG9tLXN0YXJ0JyxcbiAgY2VudGVyOiAnYm90dG9tJyxcbiAgcmlnaHQ6ICdib3R0b20tZW5kJ1xufTtcblxudmFyIHBhcnNlQXNGb3JtYXRBbmRUeXBlID0gZnVuY3Rpb24gcGFyc2VBc0Zvcm1hdEFuZFR5cGUodmFsdWUsIGN1c3RvbUZvcm1hdCwgdHlwZSkge1xuICB2YXIgcmFuZ2VTZXBhcmF0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICctJztcblxuICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgdmFyIHBhcnNlciA9IChUWVBFX1ZBTFVFX1JFU09MVkVSX01BUFt0eXBlXSB8fCBUWVBFX1ZBTFVFX1JFU09MVkVSX01BUFsnZGVmYXVsdCddKS5wYXJzZXI7XG4gIHZhciBmb3JtYXQgPSBjdXN0b21Gb3JtYXQgfHwgREVGQVVMVF9GT1JNQVRTW3R5cGVdO1xuICByZXR1cm4gcGFyc2VyKHZhbHVlLCBmb3JtYXQsIHJhbmdlU2VwYXJhdG9yKTtcbn07XG5cbnZhciBmb3JtYXRBc0Zvcm1hdEFuZFR5cGUgPSBmdW5jdGlvbiBmb3JtYXRBc0Zvcm1hdEFuZFR5cGUodmFsdWUsIGN1c3RvbUZvcm1hdCwgdHlwZSkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgdmFyIGZvcm1hdHRlciA9IChUWVBFX1ZBTFVFX1JFU09MVkVSX01BUFt0eXBlXSB8fCBUWVBFX1ZBTFVFX1JFU09MVkVSX01BUFsnZGVmYXVsdCddKS5mb3JtYXR0ZXI7XG4gIHZhciBmb3JtYXQgPSBjdXN0b21Gb3JtYXQgfHwgREVGQVVMVF9GT1JNQVRTW3R5cGVdO1xuICByZXR1cm4gZm9ybWF0dGVyKHZhbHVlLCBmb3JtYXQpO1xufTtcblxuLypcbiAqIENvbnNpZGVyczpcbiAqICAgMS4gRGF0ZSBvYmplY3RcbiAqICAgMi4gZGF0ZSBzdHJpbmdcbiAqICAgMy4gYXJyYXkgb2YgMSBvciAyXG4gKi9cbnZhciB2YWx1ZUVxdWFscyA9IGZ1bmN0aW9uIHZhbHVlRXF1YWxzKGEsIGIpIHtcbiAgLy8gY29uc2lkZXJzIERhdGUgb2JqZWN0IGFuZCBzdHJpbmdcbiAgdmFyIGRhdGVFcXVhbHMgPSBmdW5jdGlvbiBkYXRlRXF1YWxzKGEsIGIpIHtcbiAgICB2YXIgYUlzRGF0ZSA9IGEgaW5zdGFuY2VvZiBEYXRlO1xuICAgIHZhciBiSXNEYXRlID0gYiBpbnN0YW5jZW9mIERhdGU7XG4gICAgaWYgKGFJc0RhdGUgJiYgYklzRGF0ZSkge1xuICAgICAgcmV0dXJuIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbiAgICB9XG4gICAgaWYgKCFhSXNEYXRlICYmICFiSXNEYXRlKSB7XG4gICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHZhciBhSXNBcnJheSA9IGEgaW5zdGFuY2VvZiBBcnJheTtcbiAgdmFyIGJJc0FycmF5ID0gYiBpbnN0YW5jZW9mIEFycmF5O1xuICBpZiAoYUlzQXJyYXkgJiYgYklzQXJyYXkpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhLmV2ZXJ5KGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgICAgcmV0dXJuIGRhdGVFcXVhbHMoaXRlbSwgYltpbmRleF0pO1xuICAgIH0pO1xuICB9XG4gIGlmICghYUlzQXJyYXkgJiYgIWJJc0FycmF5KSB7XG4gICAgcmV0dXJuIGRhdGVFcXVhbHMoYSwgYik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIGlzU3RyaW5nID0gZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyB8fCB2YWwgaW5zdGFuY2VvZiBTdHJpbmc7XG59O1xuXG52YXIgcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfdmFsaWRhdG9yID0gZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAvLyBlaXRoZXI6IFN0cmluZywgQXJyYXkgb2YgU3RyaW5nLCBudWxsIC8gdW5kZWZpbmVkXG4gIHJldHVybiB2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgfHwgaXNTdHJpbmcodmFsKSB8fCBBcnJheS5pc0FycmF5KHZhbCkgJiYgdmFsLmxlbmd0aCA9PT0gMiAmJiB2YWwuZXZlcnkoaXNTdHJpbmcpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmEsIE5ld1BvcHBlcl0sXG5cbiAgaW5qZWN0OiB7XG4gICAgZWxGb3JtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgZWxGb3JtSXRlbToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9XG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgZm9ybWF0OiBTdHJpbmcsXG4gICAgdmFsdWVGb3JtYXQ6IFN0cmluZyxcbiAgICByZWFkb25seTogQm9vbGVhbixcbiAgICBwbGFjZWhvbGRlcjogU3RyaW5nLFxuICAgIHN0YXJ0UGxhY2Vob2xkZXI6IFN0cmluZyxcbiAgICBlbmRQbGFjZWhvbGRlcjogU3RyaW5nLFxuICAgIHByZWZpeEljb246IFN0cmluZyxcbiAgICBjbGVhckljb246IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdlbC1pY29uLWNpcmNsZS1jbG9zZSdcbiAgICB9LFxuICAgIG5hbWU6IHtcbiAgICAgIGRlZmF1bHQ6ICcnLFxuICAgICAgdmFsaWRhdG9yOiBwaWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc192YWxpZGF0b3JcbiAgICB9LFxuICAgIGRpc2FibGVkOiBCb29sZWFuLFxuICAgIGNsZWFyYWJsZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGlkOiB7XG4gICAgICBkZWZhdWx0OiAnJyxcbiAgICAgIHZhbGlkYXRvcjogcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfdmFsaWRhdG9yXG4gICAgfSxcbiAgICBwb3BwZXJDbGFzczogU3RyaW5nLFxuICAgIGVkaXRhYmxlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgYWxpZ246IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdsZWZ0J1xuICAgIH0sXG4gICAgdmFsdWU6IHt9LFxuICAgIGRlZmF1bHRWYWx1ZToge30sXG4gICAgZGVmYXVsdFRpbWU6IHt9LFxuICAgIHJhbmdlU2VwYXJhdG9yOiB7XG4gICAgICBkZWZhdWx0OiAnLSdcbiAgICB9LFxuICAgIHBpY2tlck9wdGlvbnM6IHt9LFxuICAgIHVubGlua1BhbmVsczogQm9vbGVhbixcbiAgICB2YWxpZGF0ZUV2ZW50OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wb25lbnRzOiB7IEVsSW5wdXQ6IGlucHV0X2RlZmF1bHQuYSB9LFxuXG4gIGRpcmVjdGl2ZXM6IHsgQ2xpY2tvdXRzaWRlOiBjbGlja291dHNpZGVfZGVmYXVsdC5hIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGlja2VyVmlzaWJsZTogZmFsc2UsXG4gICAgICBzaG93Q2xvc2U6IGZhbHNlLFxuICAgICAgdXNlcklucHV0OiBudWxsLFxuICAgICAgdmFsdWVPbk9wZW46IG51bGwsIC8vIHZhbHVlIHdoZW4gcGlja2VyIG9wZW5zLCB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGVtaXQgY2hhbmdlXG4gICAgICB1bndhdGNoUGlja2VyT3B0aW9uczogbnVsbFxuICAgIH07XG4gIH0sXG5cblxuICB3YXRjaDoge1xuICAgIHBpY2tlclZpc2libGU6IGZ1bmN0aW9uIHBpY2tlclZpc2libGUodmFsKSB7XG4gICAgICBpZiAodGhpcy5yZWFkb25seSB8fCB0aGlzLnBpY2tlckRpc2FibGVkKSByZXR1cm47XG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHRoaXMuc2hvd1BpY2tlcigpO1xuICAgICAgICB0aGlzLnZhbHVlT25PcGVuID0gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IFtdLmNvbmNhdCh0aGlzLnZhbHVlKSA6IHRoaXMudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpZGVQaWNrZXIoKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLnVzZXJJbnB1dCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlRXZlbnQpIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoKCdFbEZvcm1JdGVtJywgJ2VsLmZvcm0uYmx1cicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuJGVtaXQoJ2JsdXInLCB0aGlzKTtcbiAgICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHBhcnNlZFZhbHVlOiB7XG4gICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKHZhbCkge1xuICAgICAgICBpZiAodGhpcy5waWNrZXIpIHtcbiAgICAgICAgICB0aGlzLnBpY2tlci52YWx1ZSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VmFsdWUodmFsKSB7XG4gICAgICAvLyBOT1RFOiBzaG91bGQgZXZlbnR1YWxseSBtb3ZlIHRvIGpzeCBzdHlsZSBwaWNrZXIgKyBwYW5lbCA/XG4gICAgICBpZiAodGhpcy5waWNrZXIpIHtcbiAgICAgICAgdGhpcy5waWNrZXIuZGVmYXVsdFZhbHVlID0gdmFsO1xuICAgICAgfVxuICAgIH0sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkVmFsKSB7XG4gICAgICBpZiAoIXZhbHVlRXF1YWxzKHZhbCwgb2xkVmFsKSAmJiAhdGhpcy5waWNrZXJWaXNpYmxlICYmIHRoaXMudmFsaWRhdGVFdmVudCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKCdFbEZvcm1JdGVtJywgJ2VsLmZvcm0uY2hhbmdlJywgdmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICByYW5nZWQ6IGZ1bmN0aW9uIHJhbmdlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUuaW5kZXhPZigncmFuZ2UnKSA+IC0xO1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiBmdW5jdGlvbiByZWZlcmVuY2UoKSB7XG4gICAgICB2YXIgcmVmZXJlbmNlID0gdGhpcy4kcmVmcy5yZWZlcmVuY2U7XG4gICAgICByZXR1cm4gcmVmZXJlbmNlLiRlbCB8fCByZWZlcmVuY2U7XG4gICAgfSxcbiAgICByZWZJbnB1dDogZnVuY3Rpb24gcmVmSW5wdXQoKSB7XG4gICAgICBpZiAodGhpcy5yZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwodGhpcy5yZWZlcmVuY2UucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSxcbiAgICB2YWx1ZUlzRW1wdHk6IGZ1bmN0aW9uIHZhbHVlSXNFbXB0eSgpIHtcbiAgICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdmFsLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgaWYgKHZhbFtpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICB0cmlnZ2VyQ2xhc3M6IGZ1bmN0aW9uIHRyaWdnZXJDbGFzcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZWZpeEljb24gfHwgKHRoaXMudHlwZS5pbmRleE9mKCd0aW1lJykgIT09IC0xID8gJ2VsLWljb24tdGltZScgOiAnZWwtaWNvbi1kYXRlJyk7XG4gICAgfSxcbiAgICBzZWxlY3Rpb25Nb2RlOiBmdW5jdGlvbiBzZWxlY3Rpb25Nb2RlKCkge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3dlZWsnKSB7XG4gICAgICAgIHJldHVybiAnd2Vlayc7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ21vbnRoJykge1xuICAgICAgICByZXR1cm4gJ21vbnRoJztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAneWVhcicpIHtcbiAgICAgICAgcmV0dXJuICd5ZWFyJztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnZGF0ZXMnKSB7XG4gICAgICAgIHJldHVybiAnZGF0ZXMnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdtb250aHMnKSB7XG4gICAgICAgIHJldHVybiAnbW9udGhzJztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAneWVhcnMnKSB7XG4gICAgICAgIHJldHVybiAneWVhcnMnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ2RheSc7XG4gICAgfSxcbiAgICBoYXZlVHJpZ2dlcjogZnVuY3Rpb24gaGF2ZVRyaWdnZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuc2hvd1RyaWdnZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dUcmlnZ2VyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEhBVkVfVFJJR0dFUl9UWVBFUy5pbmRleE9mKHRoaXMudHlwZSkgIT09IC0xO1xuICAgIH0sXG4gICAgZGlzcGxheVZhbHVlOiBmdW5jdGlvbiBkaXNwbGF5VmFsdWUoKSB7XG4gICAgICB2YXIgZm9ybWF0dGVkVmFsdWUgPSBmb3JtYXRBc0Zvcm1hdEFuZFR5cGUodGhpcy5wYXJzZWRWYWx1ZSwgdGhpcy5mb3JtYXQsIHRoaXMudHlwZSwgdGhpcy5yYW5nZVNlcGFyYXRvcik7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnVzZXJJbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLnVzZXJJbnB1dFswXSB8fCBmb3JtYXR0ZWRWYWx1ZSAmJiBmb3JtYXR0ZWRWYWx1ZVswXSB8fCAnJywgdGhpcy51c2VySW5wdXRbMV0gfHwgZm9ybWF0dGVkVmFsdWUgJiYgZm9ybWF0dGVkVmFsdWVbMV0gfHwgJyddO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnVzZXJJbnB1dCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VySW5wdXQ7XG4gICAgICB9IGVsc2UgaWYgKGZvcm1hdHRlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdkYXRlcycgfHwgdGhpcy50eXBlID09PSAneWVhcnMnIHx8IHRoaXMudHlwZSA9PT0gJ21vbnRocycgPyBmb3JtYXR0ZWRWYWx1ZS5qb2luKCcsICcpIDogZm9ybWF0dGVkVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfSxcbiAgICBwYXJzZWRWYWx1ZTogZnVuY3Rpb24gcGFyc2VkVmFsdWUoKSB7XG4gICAgICBpZiAoIXRoaXMudmFsdWUpIHJldHVybiB0aGlzLnZhbHVlOyAvLyBjb21wb25lbnQgdmFsdWUgaXMgbm90IHNldFxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3RpbWUtc2VsZWN0JykgcmV0dXJuIHRoaXMudmFsdWU7IC8vIHRpbWUtc2VsZWN0IGRvZXMgbm90IHJlcXVpcmUgcGFyc2luZywgdGhpcyBtaWdodCBjaGFuZ2UgaW4gbmV4dCBtYWpvciB2ZXJzaW9uXG5cbiAgICAgIHZhciB2YWx1ZUlzRGF0ZU9iamVjdCA9IE9iamVjdChkYXRlX3V0aWxfW1wiaXNEYXRlT2JqZWN0XCJdKSh0aGlzLnZhbHVlKSB8fCBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmIHRoaXMudmFsdWUuZXZlcnkoZGF0ZV91dGlsX1tcImlzRGF0ZU9iamVjdFwiXSk7XG4gICAgICBpZiAodmFsdWVJc0RhdGVPYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnZhbHVlRm9ybWF0KSB7XG4gICAgICAgIHJldHVybiBwYXJzZUFzRm9ybWF0QW5kVHlwZSh0aGlzLnZhbHVlLCB0aGlzLnZhbHVlRm9ybWF0LCB0aGlzLnR5cGUsIHRoaXMucmFuZ2VTZXBhcmF0b3IpIHx8IHRoaXMudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5PVEU6IGRlYWwgd2l0aCBjb21tb24gYnV0IGluY29ycmVjdCB1c2FnZSwgc2hvdWxkIHJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb25cbiAgICAgIC8vIHVzZXIgbWlnaHQgcHJvdmlkZSBzdHJpbmcgLyB0aW1lc3RhbXAgd2l0aG91dCB2YWx1ZS1mb3JtYXQsIGNvZXJjZSB0aGVtIGludG8gZGF0ZSAob3IgYXJyYXkgb2YgZGF0ZSlcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZS5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsKTtcbiAgICAgIH0pIDogbmV3IERhdGUodGhpcy52YWx1ZSk7XG4gICAgfSxcbiAgICBfZWxGb3JtSXRlbVNpemU6IGZ1bmN0aW9uIF9lbEZvcm1JdGVtU2l6ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5lbEZvcm1JdGVtIHx8IHt9KS5lbEZvcm1JdGVtU2l6ZTtcbiAgICB9LFxuICAgIHBpY2tlclNpemU6IGZ1bmN0aW9uIHBpY2tlclNpemUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaXplIHx8IHRoaXMuX2VsRm9ybUl0ZW1TaXplIHx8ICh0aGlzLiRFTEVNRU5UIHx8IHt9KS5zaXplO1xuICAgIH0sXG4gICAgcGlja2VyRGlzYWJsZWQ6IGZ1bmN0aW9uIHBpY2tlckRpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgKHRoaXMuZWxGb3JtIHx8IHt9KS5kaXNhYmxlZDtcbiAgICB9LFxuICAgIGZpcnN0SW5wdXRJZDogZnVuY3Rpb24gZmlyc3RJbnB1dElkKCkge1xuICAgICAgdmFyIG9iaiA9IHt9O1xuICAgICAgdmFyIGlkID0gdm9pZCAwO1xuICAgICAgaWYgKHRoaXMucmFuZ2VkKSB7XG4gICAgICAgIGlkID0gdGhpcy5pZCAmJiB0aGlzLmlkWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWQgPSB0aGlzLmlkO1xuICAgICAgfVxuICAgICAgaWYgKGlkKSBvYmouaWQgPSBpZDtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICBzZWNvbmRJbnB1dElkOiBmdW5jdGlvbiBzZWNvbmRJbnB1dElkKCkge1xuICAgICAgdmFyIG9iaiA9IHt9O1xuICAgICAgdmFyIGlkID0gdm9pZCAwO1xuICAgICAgaWYgKHRoaXMucmFuZ2VkKSB7XG4gICAgICAgIGlkID0gdGhpcy5pZCAmJiB0aGlzLmlkWzFdO1xuICAgICAgfVxuICAgICAgaWYgKGlkKSBvYmouaWQgPSBpZDtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgLy8gdnVlLXBvcHBlclxuICAgIHRoaXMucG9wcGVyT3B0aW9ucyA9IHtcbiAgICAgIGJvdW5kYXJpZXNQYWRkaW5nOiAwLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uOiBmYWxzZVxuICAgIH07XG4gICAgdGhpcy5wbGFjZW1lbnQgPSBQTEFDRU1FTlRfTUFQW3RoaXMuYWxpZ25dIHx8IFBMQUNFTUVOVF9NQVAubGVmdDtcblxuICAgIHRoaXMuJG9uKCdmaWVsZFJlc2V0JywgdGhpcy5oYW5kbGVGaWVsZFJlc2V0KTtcbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICBpZiAoIXRoaXMucmFuZ2VkKSB7XG4gICAgICAgIHRoaXMuJHJlZnMucmVmZXJlbmNlLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhhbmRsZUZvY3VzKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgdGhpcy5yZWZJbnB1dC5mb3JFYWNoKGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQuYmx1cigpO1xuICAgICAgfSk7XG4gICAgfSxcblxuXG4gICAgLy8ge3BhcnNlLCBmb3JtYXRUb30gVmFsdWUgZGVhbHMgbWFwcyBjb21wb25lbnQgdmFsdWUgd2l0aCBpbnRlcm5hbCBEYXRlXG4gICAgcGFyc2VWYWx1ZTogZnVuY3Rpb24gcGFyc2VWYWx1ZSh2YWx1ZSkge1xuICAgICAgdmFyIGlzUGFyc2VkID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJpc0RhdGVPYmplY3RcIl0pKHZhbHVlKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShkYXRlX3V0aWxfW1wiaXNEYXRlT2JqZWN0XCJdKTtcbiAgICAgIGlmICh0aGlzLnZhbHVlRm9ybWF0ICYmICFpc1BhcnNlZCkge1xuICAgICAgICByZXR1cm4gcGFyc2VBc0Zvcm1hdEFuZFR5cGUodmFsdWUsIHRoaXMudmFsdWVGb3JtYXQsIHRoaXMudHlwZSwgdGhpcy5yYW5nZVNlcGFyYXRvcikgfHwgdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBmb3JtYXRUb1ZhbHVlOiBmdW5jdGlvbiBmb3JtYXRUb1ZhbHVlKGRhdGUpIHtcbiAgICAgIHZhciBpc0Zvcm1hdHRhYmxlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJpc0RhdGVPYmplY3RcIl0pKGRhdGUpIHx8IEFycmF5LmlzQXJyYXkoZGF0ZSkgJiYgZGF0ZS5ldmVyeShkYXRlX3V0aWxfW1wiaXNEYXRlT2JqZWN0XCJdKTtcbiAgICAgIGlmICh0aGlzLnZhbHVlRm9ybWF0ICYmIGlzRm9ybWF0dGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdEFzRm9ybWF0QW5kVHlwZShkYXRlLCB0aGlzLnZhbHVlRm9ybWF0LCB0aGlzLnR5cGUsIHRoaXMucmFuZ2VTZXBhcmF0b3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLy8ge3BhcnNlLCBmb3JtYXRUb30gU3RyaW5nIGRlYWxzIHdpdGggdXNlciBpbnB1dFxuICAgIHBhcnNlU3RyaW5nOiBmdW5jdGlvbiBwYXJzZVN0cmluZyh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHRoaXMudHlwZSA6IHRoaXMudHlwZS5yZXBsYWNlKCdyYW5nZScsICcnKTtcbiAgICAgIHJldHVybiBwYXJzZUFzRm9ybWF0QW5kVHlwZSh2YWx1ZSwgdGhpcy5mb3JtYXQsIHR5cGUpO1xuICAgIH0sXG4gICAgZm9ybWF0VG9TdHJpbmc6IGZ1bmN0aW9uIGZvcm1hdFRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdGhpcy50eXBlIDogdGhpcy50eXBlLnJlcGxhY2UoJ3JhbmdlJywgJycpO1xuICAgICAgcmV0dXJuIGZvcm1hdEFzRm9ybWF0QW5kVHlwZSh2YWx1ZSwgdGhpcy5mb3JtYXQsIHR5cGUpO1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VFbnRlcjogZnVuY3Rpb24gaGFuZGxlTW91c2VFbnRlcigpIHtcbiAgICAgIGlmICh0aGlzLnJlYWRvbmx5IHx8IHRoaXMucGlja2VyRGlzYWJsZWQpIHJldHVybjtcbiAgICAgIGlmICghdGhpcy52YWx1ZUlzRW1wdHkgJiYgdGhpcy5jbGVhcmFibGUpIHtcbiAgICAgICAgdGhpcy5zaG93Q2xvc2UgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoKSB7XG4gICAgICBpZiAodGhpcy51c2VySW5wdXQpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5wYXJzZVN0cmluZyh0aGlzLmRpc3BsYXlWYWx1ZSk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMucGlja2VyLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZFZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0SW5wdXQodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy51c2VySW5wdXQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMudXNlcklucHV0ID09PSAnJykge1xuICAgICAgICB0aGlzLmVtaXRJbnB1dChudWxsKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLnVzZXJJbnB1dCA9IG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVTdGFydElucHV0OiBmdW5jdGlvbiBoYW5kbGVTdGFydElucHV0KGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy51c2VySW5wdXQpIHtcbiAgICAgICAgdGhpcy51c2VySW5wdXQgPSBbZXZlbnQudGFyZ2V0LnZhbHVlLCB0aGlzLnVzZXJJbnB1dFsxXV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVzZXJJbnB1dCA9IFtldmVudC50YXJnZXQudmFsdWUsIG51bGxdO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlRW5kSW5wdXQ6IGZ1bmN0aW9uIGhhbmRsZUVuZElucHV0KGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy51c2VySW5wdXQpIHtcbiAgICAgICAgdGhpcy51c2VySW5wdXQgPSBbdGhpcy51c2VySW5wdXRbMF0sIGV2ZW50LnRhcmdldC52YWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVzZXJJbnB1dCA9IFtudWxsLCBldmVudC50YXJnZXQudmFsdWVdO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlU3RhcnRDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVN0YXJ0Q2hhbmdlKGV2ZW50KSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnBhcnNlU3RyaW5nKHRoaXMudXNlcklucHV0ICYmIHRoaXMudXNlcklucHV0WzBdKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnVzZXJJbnB1dCA9IFt0aGlzLmZvcm1hdFRvU3RyaW5nKHZhbHVlKSwgdGhpcy5kaXNwbGF5VmFsdWVbMV1dO1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBbdmFsdWUsIHRoaXMucGlja2VyLnZhbHVlICYmIHRoaXMucGlja2VyLnZhbHVlWzFdXTtcbiAgICAgICAgdGhpcy5waWNrZXIudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZFZhbHVlKG5ld1ZhbHVlKSkge1xuICAgICAgICAgIHRoaXMuZW1pdElucHV0KG5ld1ZhbHVlKTtcbiAgICAgICAgICB0aGlzLnVzZXJJbnB1dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUVuZENoYW5nZTogZnVuY3Rpb24gaGFuZGxlRW5kQ2hhbmdlKGV2ZW50KSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnBhcnNlU3RyaW5nKHRoaXMudXNlcklucHV0ICYmIHRoaXMudXNlcklucHV0WzFdKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnVzZXJJbnB1dCA9IFt0aGlzLmRpc3BsYXlWYWx1ZVswXSwgdGhpcy5mb3JtYXRUb1N0cmluZyh2YWx1ZSldO1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBbdGhpcy5waWNrZXIudmFsdWUgJiYgdGhpcy5waWNrZXIudmFsdWVbMF0sIHZhbHVlXTtcbiAgICAgICAgdGhpcy5waWNrZXIudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZFZhbHVlKG5ld1ZhbHVlKSkge1xuICAgICAgICAgIHRoaXMuZW1pdElucHV0KG5ld1ZhbHVlKTtcbiAgICAgICAgICB0aGlzLnVzZXJJbnB1dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUNsaWNrSWNvbjogZnVuY3Rpb24gaGFuZGxlQ2xpY2tJY29uKGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5yZWFkb25seSB8fCB0aGlzLnBpY2tlckRpc2FibGVkKSByZXR1cm47XG4gICAgICBpZiAodGhpcy5zaG93Q2xvc2UpIHtcbiAgICAgICAgdGhpcy52YWx1ZU9uT3BlbiA9IHRoaXMudmFsdWU7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmVtaXRJbnB1dChudWxsKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLnNob3dDbG9zZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5waWNrZXIgJiYgdHlwZW9mIHRoaXMucGlja2VyLmhhbmRsZUNsZWFyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhpcy5waWNrZXIuaGFuZGxlQ2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5waWNrZXJWaXNpYmxlID0gIXRoaXMucGlja2VyVmlzaWJsZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUNsb3NlOiBmdW5jdGlvbiBoYW5kbGVDbG9zZSgpIHtcbiAgICAgIGlmICghdGhpcy5waWNrZXJWaXNpYmxlKSByZXR1cm47XG4gICAgICB0aGlzLnBpY2tlclZpc2libGUgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RhdGVzJyB8fCB0aGlzLnR5cGUgPT09ICd5ZWFycycgfHwgdGhpcy50eXBlID09PSAnbW9udGhzJykge1xuICAgICAgICAvLyByZXN0b3JlIHRvIGZvcm1lciB2YWx1ZVxuICAgICAgICB2YXIgb2xkVmFsdWUgPSBwYXJzZUFzRm9ybWF0QW5kVHlwZSh0aGlzLnZhbHVlT25PcGVuLCB0aGlzLnZhbHVlRm9ybWF0LCB0aGlzLnR5cGUsIHRoaXMucmFuZ2VTZXBhcmF0b3IpIHx8IHRoaXMudmFsdWVPbk9wZW47XG4gICAgICAgIHRoaXMuZW1pdElucHV0KG9sZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUZpZWxkUmVzZXQ6IGZ1bmN0aW9uIGhhbmRsZUZpZWxkUmVzZXQoaW5pdGlhbFZhbHVlKSB7XG4gICAgICB0aGlzLnVzZXJJbnB1dCA9IGluaXRpYWxWYWx1ZSA9PT0gJycgPyBudWxsIDogaW5pdGlhbFZhbHVlO1xuICAgIH0sXG4gICAgaGFuZGxlRm9jdXM6IGZ1bmN0aW9uIGhhbmRsZUZvY3VzKCkge1xuICAgICAgdmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cbiAgICAgIGlmIChIQVZFX1RSSUdHRVJfVFlQRVMuaW5kZXhPZih0eXBlKSAhPT0gLTEgJiYgIXRoaXMucGlja2VyVmlzaWJsZSkge1xuICAgICAgICB0aGlzLnBpY2tlclZpc2libGUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy4kZW1pdCgnZm9jdXMnLCB0aGlzKTtcbiAgICB9LFxuICAgIGhhbmRsZUtleWRvd246IGZ1bmN0aW9uIGhhbmRsZUtleWRvd24oZXZlbnQpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcblxuICAgICAgLy8gRVNDXG4gICAgICBpZiAoa2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgICAgdGhpcy5waWNrZXJWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFRhYlxuICAgICAgaWYgKGtleUNvZGUgPT09IDkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJhbmdlZCkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKCk7XG4gICAgICAgICAgdGhpcy5waWNrZXJWaXNpYmxlID0gdGhpcy5waWNrZXIudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuYmx1cigpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHVzZXIgbWF5IGNoYW5nZSBmb2N1cyBiZXR3ZWVuIHR3byBpbnB1dFxuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLnJlZklucHV0LmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIF90aGlzLnBpY2tlclZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgX3RoaXMuYmx1cigpO1xuICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEVudGVyXG4gICAgICBpZiAoa2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgaWYgKHRoaXMudXNlcklucHV0ID09PSAnJyB8fCB0aGlzLmlzVmFsaWRWYWx1ZSh0aGlzLnBhcnNlU3RyaW5nKHRoaXMuZGlzcGxheVZhbHVlKSkpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZSgpO1xuICAgICAgICAgIHRoaXMucGlja2VyVmlzaWJsZSA9IHRoaXMucGlja2VyLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB1c2VyIGlzIHR5cGluZywgZG8gbm90IGxldCBwaWNrZXIgaGFuZGxlIGtleSBpbnB1dFxuICAgICAgaWYgKHRoaXMudXNlcklucHV0KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGRlbGVnYXRlIG90aGVyIGtleXMgdG8gcGFuZWxcbiAgICAgIGlmICh0aGlzLnBpY2tlciAmJiB0aGlzLnBpY2tlci5oYW5kbGVLZXlkb3duKSB7XG4gICAgICAgIHRoaXMucGlja2VyLmhhbmRsZUtleWRvd24oZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlUmFuZ2VDbGljazogZnVuY3Rpb24gaGFuZGxlUmFuZ2VDbGljaygpIHtcbiAgICAgIHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG4gICAgICBpZiAoSEFWRV9UUklHR0VSX1RZUEVTLmluZGV4T2YodHlwZSkgIT09IC0xICYmICF0aGlzLnBpY2tlclZpc2libGUpIHtcbiAgICAgICAgdGhpcy5waWNrZXJWaXNpYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuJGVtaXQoJ2ZvY3VzJywgdGhpcyk7XG4gICAgfSxcbiAgICBoaWRlUGlja2VyOiBmdW5jdGlvbiBoaWRlUGlja2VyKCkge1xuICAgICAgaWYgKHRoaXMucGlja2VyKSB7XG4gICAgICAgIHRoaXMucGlja2VyLnJlc2V0VmlldyAmJiB0aGlzLnBpY2tlci5yZXNldFZpZXcoKTtcbiAgICAgICAgdGhpcy5waWNrZXJWaXNpYmxlID0gdGhpcy5waWNrZXIudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlc3Ryb3lQb3BwZXIoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNob3dQaWNrZXI6IGZ1bmN0aW9uIHNob3dQaWNrZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuJGlzU2VydmVyKSByZXR1cm47XG4gICAgICBpZiAoIXRoaXMucGlja2VyKSB7XG4gICAgICAgIHRoaXMubW91bnRQaWNrZXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGlja2VyVmlzaWJsZSA9IHRoaXMucGlja2VyLnZpc2libGUgPSB0cnVlO1xuXG4gICAgICB0aGlzLnVwZGF0ZVBvcHBlcigpO1xuXG4gICAgICB0aGlzLnBpY2tlci52YWx1ZSA9IHRoaXMucGFyc2VkVmFsdWU7XG4gICAgICB0aGlzLnBpY2tlci5yZXNldFZpZXcgJiYgdGhpcy5waWNrZXIucmVzZXRWaWV3KCk7XG5cbiAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLnBpY2tlci5hZGp1c3RTcGlubmVycyAmJiBfdGhpczIucGlja2VyLmFkanVzdFNwaW5uZXJzKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIG1vdW50UGlja2VyOiBmdW5jdGlvbiBtb3VudFBpY2tlcigpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB0aGlzLnBpY2tlciA9IG5ldyBleHRlcm5hbF92dWVfZGVmYXVsdC5hKHRoaXMucGFuZWwpLiRtb3VudCgpO1xuICAgICAgdGhpcy5waWNrZXIuZGVmYXVsdFZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgICB0aGlzLnBpY2tlci5kZWZhdWx0VGltZSA9IHRoaXMuZGVmYXVsdFRpbWU7XG4gICAgICB0aGlzLnBpY2tlci5wb3BwZXJDbGFzcyA9IHRoaXMucG9wcGVyQ2xhc3M7XG4gICAgICB0aGlzLnBvcHBlckVsbSA9IHRoaXMucGlja2VyLiRlbDtcbiAgICAgIHRoaXMucGlja2VyLndpZHRoID0gdGhpcy5yZWZlcmVuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICB0aGlzLnBpY2tlci5zaG93VGltZSA9IHRoaXMudHlwZSA9PT0gJ2RhdGV0aW1lJyB8fCB0aGlzLnR5cGUgPT09ICdkYXRldGltZXJhbmdlJztcbiAgICAgIHRoaXMucGlja2VyLnNlbGVjdGlvbk1vZGUgPSB0aGlzLnNlbGVjdGlvbk1vZGU7XG4gICAgICB0aGlzLnBpY2tlci51bmxpbmtQYW5lbHMgPSB0aGlzLnVubGlua1BhbmVscztcbiAgICAgIHRoaXMucGlja2VyLmFycm93Q29udHJvbCA9IHRoaXMuYXJyb3dDb250cm9sIHx8IHRoaXMudGltZUFycm93Q29udHJvbCB8fCBmYWxzZTtcbiAgICAgIHRoaXMuJHdhdGNoKCdmb3JtYXQnLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIF90aGlzMy5waWNrZXIuZm9ybWF0ID0gZm9ybWF0O1xuICAgICAgfSk7XG5cbiAgICAgIHZhciB1cGRhdGVPcHRpb25zID0gZnVuY3Rpb24gdXBkYXRlT3B0aW9ucygpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBfdGhpczMucGlja2VyT3B0aW9ucztcblxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnNlbGVjdGFibGVSYW5nZSkge1xuICAgICAgICAgIHZhciByYW5nZXMgPSBvcHRpb25zLnNlbGVjdGFibGVSYW5nZTtcbiAgICAgICAgICB2YXIgcGFyc2VyID0gVFlQRV9WQUxVRV9SRVNPTFZFUl9NQVAuZGF0ZXRpbWVyYW5nZS5wYXJzZXI7XG4gICAgICAgICAgdmFyIGZvcm1hdCA9IERFRkFVTFRfRk9STUFUUy50aW1lcmFuZ2U7XG5cbiAgICAgICAgICByYW5nZXMgPSBBcnJheS5pc0FycmF5KHJhbmdlcykgPyByYW5nZXMgOiBbcmFuZ2VzXTtcbiAgICAgICAgICBfdGhpczMucGlja2VyLnNlbGVjdGFibGVSYW5nZSA9IHJhbmdlcy5tYXAoZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VyKHJhbmdlLCBmb3JtYXQsIF90aGlzMy5yYW5nZVNlcGFyYXRvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgICAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbikgJiZcbiAgICAgICAgICAvLyDlv73nlaUgdGltZS1waWNrZXIg55qE6K+l6YWN572u6aG5XG4gICAgICAgICAgb3B0aW9uICE9PSAnc2VsZWN0YWJsZVJhbmdlJykge1xuICAgICAgICAgICAgX3RoaXMzLnBpY2tlcltvcHRpb25dID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1haW4gZm9ybWF0IG11c3QgcHJldmFpbCBvdmVyIHVuZG9jdW1lbnRlZCBwaWNrZXJPcHRpb25zLmZvcm1hdFxuICAgICAgICBpZiAoX3RoaXMzLmZvcm1hdCkge1xuICAgICAgICAgIF90aGlzMy5waWNrZXIuZm9ybWF0ID0gX3RoaXMzLmZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHVwZGF0ZU9wdGlvbnMoKTtcbiAgICAgIHRoaXMudW53YXRjaFBpY2tlck9wdGlvbnMgPSB0aGlzLiR3YXRjaCgncGlja2VyT3B0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9wdGlvbnMoKTtcbiAgICAgIH0sIHsgZGVlcDogdHJ1ZSB9KTtcbiAgICAgIHRoaXMuJGVsLmFwcGVuZENoaWxkKHRoaXMucGlja2VyLiRlbCk7XG4gICAgICB0aGlzLnBpY2tlci5yZXNldFZpZXcgJiYgdGhpcy5waWNrZXIucmVzZXRWaWV3KCk7XG5cbiAgICAgIHRoaXMucGlja2VyLiRvbignZG9kZXN0cm95JywgdGhpcy5kb0Rlc3Ryb3kpO1xuICAgICAgdGhpcy5waWNrZXIuJG9uKCdwaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gICAgICAgIHZhciB2aXNpYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICAgICAgICBfdGhpczMudXNlcklucHV0ID0gbnVsbDtcbiAgICAgICAgX3RoaXMzLnBpY2tlclZpc2libGUgPSBfdGhpczMucGlja2VyLnZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgICBfdGhpczMuZW1pdElucHV0KGRhdGUpO1xuICAgICAgICBfdGhpczMucGlja2VyLnJlc2V0VmlldyAmJiBfdGhpczMucGlja2VyLnJlc2V0VmlldygpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucGlja2VyLiRvbignc2VsZWN0LXJhbmdlJywgZnVuY3Rpb24gKHN0YXJ0LCBlbmQsIHBvcykge1xuICAgICAgICBpZiAoX3RoaXMzLnJlZklucHV0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXBvcyB8fCBwb3MgPT09ICdtaW4nKSB7XG4gICAgICAgICAgX3RoaXMzLnJlZklucHV0WzBdLnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpO1xuICAgICAgICAgIF90aGlzMy5yZWZJbnB1dFswXS5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKHBvcyA9PT0gJ21heCcpIHtcbiAgICAgICAgICBfdGhpczMucmVmSW5wdXRbMV0uc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgX3RoaXMzLnJlZklucHV0WzFdLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdW5tb3VudFBpY2tlcjogZnVuY3Rpb24gdW5tb3VudFBpY2tlcigpIHtcbiAgICAgIGlmICh0aGlzLnBpY2tlcikge1xuICAgICAgICB0aGlzLnBpY2tlci4kZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnBpY2tlci4kb2ZmKCk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51bndhdGNoUGlja2VyT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRoaXMudW53YXRjaFBpY2tlck9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBpY2tlci4kZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBpY2tlci4kZWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZW1pdENoYW5nZTogZnVuY3Rpb24gZW1pdENoYW5nZSh2YWwpIHtcbiAgICAgIC8vIGRldGVybWluZSB1c2VyIHJlYWwgY2hhbmdlIG9ubHlcbiAgICAgIGlmICghdmFsdWVFcXVhbHModmFsLCB0aGlzLnZhbHVlT25PcGVuKSkge1xuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWwpO1xuICAgICAgICB0aGlzLnZhbHVlT25PcGVuID0gdmFsO1xuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZUV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsICdlbC5mb3JtLmNoYW5nZScsIHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGVtaXRJbnB1dDogZnVuY3Rpb24gZW1pdElucHV0KHZhbCkge1xuICAgICAgdmFyIGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0VG9WYWx1ZSh2YWwpO1xuICAgICAgaWYgKCF2YWx1ZUVxdWFscyh0aGlzLnZhbHVlLCBmb3JtYXR0ZWQpKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgZm9ybWF0dGVkKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGlzVmFsaWRWYWx1ZTogZnVuY3Rpb24gaXNWYWxpZFZhbHVlKHZhbHVlKSB7XG4gICAgICBpZiAoIXRoaXMucGlja2VyKSB7XG4gICAgICAgIHRoaXMubW91bnRQaWNrZXIoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBpY2tlci5pc1ZhbGlkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIHRoaXMucGlja2VyLmlzVmFsaWRWYWx1ZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGlja2VyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfcGlja2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHBpY2tlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGlja2VyLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHBpY2tlcl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19waWNrZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHBpY2tlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzc5YWUwNjlmX3JlbmRlcixcbiAgcGlja2VydnVlX3R5cGVfdGVtcGxhdGVfaWRfNzlhZTA2OWZfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBwaWNrZXJfYXBpOyB9XG5waWNrZXJfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGlja2VyLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwaWNrZXIgPSAocGlja2VyX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL2RhdGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTI0NDBkNGVhJlxudmFyIGRhdGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yNDQwZDRlYV9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJ0cmFuc2l0aW9uXCIsXG4gICAge1xuICAgICAgYXR0cnM6IHsgbmFtZTogXCJlbC16b29tLWluLXRvcFwiIH0sXG4gICAgICBvbjogeyBcImFmdGVyLWVudGVyXCI6IF92bS5oYW5kbGVFbnRlciwgXCJhZnRlci1sZWF2ZVwiOiBfdm0uaGFuZGxlTGVhdmUgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX2MoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnZpc2libGUsXG4gICAgICAgICAgICAgIGV4cHJlc3Npb246IFwidmlzaWJsZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1waWNrZXItcGFuZWwgZWwtZGF0ZS1waWNrZXIgZWwtcG9wcGVyXCIsXG4gICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJoYXMtc2lkZWJhclwiOiBfdm0uJHNsb3RzLnNpZGViYXIgfHwgX3ZtLnNob3J0Y3V0cyxcbiAgICAgICAgICAgICAgXCJoYXMtdGltZVwiOiBfdm0uc2hvd1RpbWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfdm0ucG9wcGVyQ2xhc3NcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLXBpY2tlci1wYW5lbF9fYm9keS13cmFwcGVyXCIgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX3ZtLl90KFwic2lkZWJhclwiKSxcbiAgICAgICAgICAgICAgX3ZtLnNob3J0Y3V0c1xuICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtcGlja2VyLXBhbmVsX19zaWRlYmFyXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9sKF92bS5zaG9ydGN1dHMsIGZ1bmN0aW9uKHNob3J0Y3V0LCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcGlja2VyLXBhbmVsX19zaG9ydGN1dFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyB0eXBlOiBcImJ1dHRvblwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmhhbmRsZVNob3J0Y3V0Q2xpY2soc2hvcnRjdXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3Moc2hvcnRjdXQudGV4dCkpXVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXBpY2tlci1wYW5lbF9fYm9keVwiIH0sIFtcbiAgICAgICAgICAgICAgICBfdm0uc2hvd1RpbWVcbiAgICAgICAgICAgICAgICAgID8gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1kYXRlLXBpY2tlcl9fdGltZS1oZWFkZXJcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtZGF0ZS1waWNrZXJfX2VkaXRvci13cmFwXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJlbC1pbnB1dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBfdm0udChcImVsLmRhdGVwaWNrZXIuc2VsZWN0RGF0ZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0udmlzaWJsZURhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBcInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX3ZtLnVzZXJJbnB1dERhdGUgPSB2YWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiBfdm0uaGFuZGxlVmlzaWJsZURhdGVDaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiY2xpY2tvdXRzaWRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtY2xpY2tvdXRzaWRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmhhbmRsZVRpbWVQaWNrQ2xvc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImhhbmRsZVRpbWVQaWNrQ2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtZGF0ZS1waWNrZXJfX2VkaXRvci13cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFwiZWwtaW5wdXRcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogX3ZtLnQoXCJlbC5kYXRlcGlja2VyLnNlbGVjdFRpbWVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnZpc2libGVUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0udGltZVBpY2tlclZpc2libGUgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF92bS51c2VySW5wdXRUaW1lID0gdmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogX3ZtLmhhbmRsZVZpc2libGVUaW1lQ2hhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJ0aW1lLXBpY2tlclwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiBcInRpbWVwaWNrZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0aW1lLWFycm93LWNvbnRyb2xcIjogX3ZtLmFycm93Q29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU6IF92bS50aW1lUGlja2VyVmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2s6IF92bS5oYW5kbGVUaW1lUGljayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50ZWQ6IF92bS5wcm94eVRpbWVQaWNrZXJEYXRhUHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmN1cnJlbnRWaWV3ICE9PSBcInRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiY3VycmVudFZpZXcgIT09ICd0aW1lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1kYXRlLXBpY2tlcl9faGVhZGVyXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgXCJlbC1kYXRlLXBpY2tlcl9faGVhZGVyLS1ib3JkZXJlZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmN1cnJlbnRWaWV3ID09PSBcInllYXJcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmN1cnJlbnRWaWV3ID09PSBcIm1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWRhdGUtcGlja2VyX19wcmV2LWJ0biBlbC1pY29uLWQtYXJyb3ctbGVmdFwiLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IF92bS50KFwiZWwuZGF0ZXBpY2tlci5wcmV2WWVhclwiKVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5wcmV2WWVhciB9XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBfYyhcImJ1dHRvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5jdXJyZW50VmlldyA9PT0gXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiY3VycmVudFZpZXcgPT09ICdkYXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtcGlja2VyLXBhbmVsX19pY29uLWJ0biBlbC1kYXRlLXBpY2tlcl9fcHJldi1idG4gZWwtaWNvbi1hcnJvdy1sZWZ0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFyaWEtbGFiZWxcIjogX3ZtLnQoXCJlbC5kYXRlcGlja2VyLnByZXZNb250aFwiKVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5wcmV2TW9udGggfVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtZGF0ZS1waWNrZXJfX2hlYWRlci1sYWJlbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgcm9sZTogXCJidXR0b25cIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5zaG93WWVhclBpY2tlciB9XG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0ueWVhckxhYmVsKSldXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5jdXJyZW50VmlldyA9PT0gXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJjdXJyZW50VmlldyA9PT0gJ2RhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWRhdGUtcGlja2VyX19oZWFkZXItbGFiZWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiB7IGFjdGl2ZTogX3ZtLmN1cnJlbnRWaWV3ID09PSBcIm1vbnRoXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHJvbGU6IFwiYnV0dG9uXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0uc2hvd01vbnRoUGlja2VyIH1cbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKF92bS50KFwiZWwuZGF0ZXBpY2tlci5tb250aFwiICsgKF92bS5tb250aCArIDEpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIF9jKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtcGlja2VyLXBhbmVsX19pY29uLWJ0biBlbC1kYXRlLXBpY2tlcl9fbmV4dC1idG4gZWwtaWNvbi1kLWFycm93LXJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFyaWEtbGFiZWxcIjogX3ZtLnQoXCJlbC5kYXRlcGlja2VyLm5leHRZZWFyXCIpXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLm5leHRZZWFyIH1cbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIF9jKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmN1cnJlbnRWaWV3ID09PSBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJjdXJyZW50VmlldyA9PT0gJ2RhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWRhdGUtcGlja2VyX19uZXh0LWJ0biBlbC1pY29uLWFycm93LXJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFyaWEtbGFiZWxcIjogX3ZtLnQoXCJlbC5kYXRlcGlja2VyLm5leHRNb250aFwiKVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5uZXh0TW9udGggfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1waWNrZXItcGFuZWxfX2NvbnRlbnRcIiB9LFxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBfYyhcImRhdGUtdGFibGVcIiwge1xuICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uY3VycmVudFZpZXcgPT09IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImN1cnJlbnRWaWV3ID09PSAnZGF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2VsZWN0aW9uLW1vZGVcIjogX3ZtLnNlbGVjdGlvbk1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZpcnN0LWRheS1vZi13ZWVrXCI6IF92bS5maXJzdERheU9mV2VlayxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlZmF1bHQtdmFsdWVcIjogX3ZtLmRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKF92bS5kZWZhdWx0VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IF92bS5kYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjZWxsLWNsYXNzLW5hbWVcIjogX3ZtLmNlbGxDbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpc2FibGVkLWRhdGVcIjogX3ZtLmRpc2FibGVkRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHsgcGljazogX3ZtLmhhbmRsZURhdGVQaWNrIH1cbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIF9jKFwieWVhci10YWJsZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5jdXJyZW50VmlldyA9PT0gXCJ5ZWFyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiY3VycmVudFZpZXcgPT09ICd5ZWFyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJzZWxlY3Rpb24tbW9kZVwiOiBfdm0uc2VsZWN0aW9uTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlZmF1bHQtdmFsdWVcIjogX3ZtLmRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKF92bS5kZWZhdWx0VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IF92bS5kYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXNhYmxlZC1kYXRlXCI6IF92bS5kaXNhYmxlZERhdGVcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIG9uOiB7IHBpY2s6IF92bS5oYW5kbGVZZWFyUGljayB9XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBfYyhcIm1vbnRoLXRhYmxlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmN1cnJlbnRWaWV3ID09PSBcIm1vbnRoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiY3VycmVudFZpZXcgPT09ICdtb250aCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2VsZWN0aW9uLW1vZGVcIjogX3ZtLnNlbGVjdGlvbk1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZWZhdWx0LXZhbHVlXCI6IF92bS5kZWZhdWx0VmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShfdm0uZGVmYXVsdFZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBfdm0uZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGlzYWJsZWQtZGF0ZVwiOiBfdm0uZGlzYWJsZWREYXRlXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBvbjogeyBwaWNrOiBfdm0uaGFuZGxlTW9udGhQaWNrIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApLFxuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICBfdm0uZm9vdGVyVmlzaWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICAoX3ZtLmN1cnJlbnRWaWV3ID09PSBcImRhdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgIF92bS5jdXJyZW50VmlldyA9PT0gXCJtb250aFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLmN1cnJlbnRWaWV3ID09PSBcInllYXJcIiksXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOlxuICAgICAgICAgICAgICAgICAgICBcImZvb3RlclZpc2libGUgJiYgKGN1cnJlbnRWaWV3ID09PSAnZGF0ZScgfHwgY3VycmVudFZpZXcgPT09ICdtb250aCcgfHwgY3VycmVudFZpZXcgPT09ICd5ZWFyJylcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcGlja2VyLXBhbmVsX19mb290ZXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJlbC1idXR0b25cIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnNlbGVjdGlvbk1vZGUgIT09IFwiZGF0ZXNcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnNlbGVjdGlvbk1vZGUgIT09IFwibW9udGhzXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zZWxlY3Rpb25Nb2RlICE9PSBcInllYXJzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2VsZWN0aW9uTW9kZSAhPT0gJ2RhdGVzJyAmJiBzZWxlY3Rpb25Nb2RlICE9PSAnbW9udGhzJyAmJiBzZWxlY3Rpb25Nb2RlICE9PSAneWVhcnMnXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXBpY2tlci1wYW5lbF9fbGluay1idG5cIixcbiAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHNpemU6IFwibWluaVwiLCB0eXBlOiBcInRleHRcIiB9LFxuICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5jaGFuZ2VUb05vdyB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKF92bS50KFwiZWwuZGF0ZXBpY2tlci5ub3dcIikpICtcbiAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgIFwiXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImVsLWJ1dHRvblwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXBpY2tlci1wYW5lbF9fbGluay1idG5cIixcbiAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHBsYWluOiBcIlwiLCBzaXplOiBcIm1pbmlcIiB9LFxuICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5jb25maXJtIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLnQoXCJlbC5kYXRlcGlja2VyLmNvbmZpcm1cIikpICtcbiAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgIFwiXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMVxuICAgICAgICAgIClcbiAgICAgICAgXVxuICAgICAgKVxuICAgIF1cbiAgKVxufVxudmFyIGRhdGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yNDQwZDRlYV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuZGF0ZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI0NDBkNGVhX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL2RhdGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTI0NDBkNGVhJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC90aW1lLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zZDkzOTA4OSZcbnZhciB0aW1ldnVlX3R5cGVfdGVtcGxhdGVfaWRfM2Q5MzkwODlfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwidHJhbnNpdGlvblwiLFxuICAgIHtcbiAgICAgIGF0dHJzOiB7IG5hbWU6IFwiZWwtem9vbS1pbi10b3BcIiB9LFxuICAgICAgb246IHtcbiAgICAgICAgXCJhZnRlci1sZWF2ZVwiOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICBfdm0uJGVtaXQoXCJkb2Rlc3Ryb3lcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX2MoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnZpc2libGUsXG4gICAgICAgICAgICAgIGV4cHJlc3Npb246IFwidmlzaWJsZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10aW1lLXBhbmVsIGVsLXBvcHBlclwiLFxuICAgICAgICAgIGNsYXNzOiBfdm0ucG9wcGVyQ2xhc3NcbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1wYW5lbF9fY29udGVudFwiLFxuICAgICAgICAgICAgICBjbGFzczogeyBcImhhcy1zZWNvbmRzXCI6IF92bS5zaG93U2Vjb25kcyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcInRpbWUtc3Bpbm5lclwiLCB7XG4gICAgICAgICAgICAgICAgcmVmOiBcInNwaW5uZXJcIixcbiAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgXCJhcnJvdy1jb250cm9sXCI6IF92bS51c2VBcnJvdyxcbiAgICAgICAgICAgICAgICAgIFwic2hvdy1zZWNvbmRzXCI6IF92bS5zaG93U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgIFwiYW0tcG0tbW9kZVwiOiBfdm0uYW1QbU1vZGUsXG4gICAgICAgICAgICAgICAgICBkYXRlOiBfdm0uZGF0ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgIGNoYW5nZTogX3ZtLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgICAgICAgICAgIFwic2VsZWN0LXJhbmdlXCI6IF92bS5zZXRTZWxlY3Rpb25SYW5nZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXRpbWUtcGFuZWxfX2Zvb3RlclwiIH0sIFtcbiAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1wYW5lbF9fYnRuIGNhbmNlbFwiLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7IHR5cGU6IFwiYnV0dG9uXCIgfSxcbiAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLmhhbmRsZUNhbmNlbCB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS50KFwiZWwuZGF0ZXBpY2tlci5jYW5jZWxcIikpKV1cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRpbWUtcGFuZWxfX2J0blwiLFxuICAgICAgICAgICAgICAgIGNsYXNzOiB7IGNvbmZpcm06ICFfdm0uZGlzYWJsZWQgfSxcbiAgICAgICAgICAgICAgICBhdHRyczogeyB0eXBlOiBcImJ1dHRvblwiIH0sXG4gICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmhhbmRsZUNvbmZpcm0oKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLnQoXCJlbC5kYXRlcGlja2VyLmNvbmZpcm1cIikpKV1cbiAgICAgICAgICAgIClcbiAgICAgICAgICBdKVxuICAgICAgICBdXG4gICAgICApXG4gICAgXVxuICApXG59XG52YXIgdGltZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNkOTM5MDg5X3N0YXRpY1JlbmRlckZucyA9IFtdXG50aW1ldnVlX3R5cGVfdGVtcGxhdGVfaWRfM2Q5MzkwODlfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2Q5MzkwODkmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL3RpbWUtc3Bpbm5lci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MWZhY2FkZWImXG52YXIgdGltZV9zcGlubmVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMWZhY2FkZWJfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1zcGlubmVyXCIsXG4gICAgICBjbGFzczogeyBcImhhcy1zZWNvbmRzXCI6IF92bS5zaG93U2Vjb25kcyB9XG4gICAgfSxcbiAgICBbXG4gICAgICAhX3ZtLmFycm93Q29udHJvbFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICBcImVsLXNjcm9sbGJhclwiLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVmOiBcImhvdXJzXCIsXG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1zcGlubmVyX193cmFwcGVyXCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIFwid3JhcC1zdHlsZVwiOiBcIm1heC1oZWlnaHQ6IGluaGVyaXQ7XCIsXG4gICAgICAgICAgICAgICAgICBcInZpZXctY2xhc3NcIjogXCJlbC10aW1lLXNwaW5uZXJfX2xpc3RcIixcbiAgICAgICAgICAgICAgICAgIG5vcmVzaXplOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgdGFnOiBcInVsXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5hdGl2ZU9uOiB7XG4gICAgICAgICAgICAgICAgICBtb3VzZWVudGVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmVtaXRTZWxlY3RSYW5nZShcImhvdXJzXCIpXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgbW91c2Vtb3ZlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmFkanVzdEN1cnJlbnRTcGlubmVyKFwiaG91cnNcIilcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF92bS5fbChfdm0uaG91cnNMaXN0LCBmdW5jdGlvbihkaXNhYmxlZCwgaG91cikge1xuICAgICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICAgIFwibGlcIixcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBob3VyLFxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10aW1lLXNwaW5uZXJfX2l0ZW1cIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IHsgYWN0aXZlOiBob3VyID09PSBfdm0uaG91cnMsIGRpc2FibGVkOiBkaXNhYmxlZCB9LFxuICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVDbGljayhcImhvdXJzXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGhvdXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAoXCIwXCIgKyAoX3ZtLmFtUG1Nb2RlID8gaG91ciAlIDEyIHx8IDEyIDogaG91cikpLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAtMlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICkgKyBfdm0uX3MoX3ZtLmFtUG0oaG91cikpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgIFwiZWwtc2Nyb2xsYmFyXCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZWY6IFwibWludXRlc1wiLFxuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRpbWUtc3Bpbm5lcl9fd3JhcHBlclwiLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICBcIndyYXAtc3R5bGVcIjogXCJtYXgtaGVpZ2h0OiBpbmhlcml0O1wiLFxuICAgICAgICAgICAgICAgICAgXCJ2aWV3LWNsYXNzXCI6IFwiZWwtdGltZS1zcGlubmVyX19saXN0XCIsXG4gICAgICAgICAgICAgICAgICBub3Jlc2l6ZTogXCJcIixcbiAgICAgICAgICAgICAgICAgIHRhZzogXCJ1bFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuYXRpdmVPbjoge1xuICAgICAgICAgICAgICAgICAgbW91c2VlbnRlcjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5lbWl0U2VsZWN0UmFuZ2UoXCJtaW51dGVzXCIpXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgbW91c2Vtb3ZlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmFkanVzdEN1cnJlbnRTcGlubmVyKFwibWludXRlc1wiKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgX3ZtLl9sKF92bS5taW51dGVzTGlzdCwgZnVuY3Rpb24oZW5hYmxlZCwga2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICAgICAgXCJsaVwiLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1zcGlubmVyX19pdGVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiB7IGFjdGl2ZToga2V5ID09PSBfdm0ubWludXRlcywgZGlzYWJsZWQ6ICFlbmFibGVkIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmhhbmRsZUNsaWNrKFwibWludXRlc1wiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcygoXCIwXCIgKyBrZXkpLnNsaWNlKC0yKSkpXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgXCJlbC1zY3JvbGxiYXJcIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uc2hvd1NlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwic2hvd1NlY29uZHNcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcmVmOiBcInNlY29uZHNcIixcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10aW1lLXNwaW5uZXJfX3dyYXBwZXJcIixcbiAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgXCJ3cmFwLXN0eWxlXCI6IFwibWF4LWhlaWdodDogaW5oZXJpdDtcIixcbiAgICAgICAgICAgICAgICAgIFwidmlldy1jbGFzc1wiOiBcImVsLXRpbWUtc3Bpbm5lcl9fbGlzdFwiLFxuICAgICAgICAgICAgICAgICAgbm9yZXNpemU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICB0YWc6IFwidWxcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICAgICAgICAgIG1vdXNlZW50ZXI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBfdm0uZW1pdFNlbGVjdFJhbmdlKFwic2Vjb25kc1wiKVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIG1vdXNlbW92ZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5hZGp1c3RDdXJyZW50U3Bpbm5lcihcInNlY29uZHNcIilcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF92bS5fbCg2MCwgZnVuY3Rpb24oc2Vjb25kLCBrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgICAgICBcImxpXCIsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10aW1lLXNwaW5uZXJfX2l0ZW1cIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IHsgYWN0aXZlOiBrZXkgPT09IF92bS5zZWNvbmRzIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmhhbmRsZUNsaWNrKFwic2Vjb25kc1wiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcygoXCIwXCIgKyBrZXkpLnNsaWNlKC0yKSkpXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgIClcbiAgICAgICAgICBdXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfdm0uYXJyb3dDb250cm9sXG4gICAgICAgID8gW1xuICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10aW1lLXNwaW5uZXJfX3dyYXBwZXIgaXMtYXJyb3dcIixcbiAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgbW91c2VlbnRlcjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5lbWl0U2VsZWN0UmFuZ2UoXCJob3Vyc1wiKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInJlcGVhdC1jbGlja1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1yZXBlYXQtY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmRlY3JlYXNlLFxuICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiZGVjcmVhc2VcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1zcGlubmVyX19hcnJvdyBlbC1pY29uLWFycm93LXVwXCJcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJyZXBlYXQtY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtcmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5pbmNyZWFzZSxcbiAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImluY3JlYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRpbWUtc3Bpbm5lcl9fYXJyb3cgZWwtaWNvbi1hcnJvdy1kb3duXCJcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgIFwidWxcIixcbiAgICAgICAgICAgICAgICAgIHsgcmVmOiBcImhvdXJzXCIsIHN0YXRpY0NsYXNzOiBcImVsLXRpbWUtc3Bpbm5lcl9fbGlzdFwiIH0sXG4gICAgICAgICAgICAgICAgICBfdm0uX2woX3ZtLmFycm93SG91ckxpc3QsIGZ1bmN0aW9uKGhvdXIsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgXCJsaVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1zcGlubmVyX19pdGVtXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IGhvdXIgPT09IF92bS5ob3VycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5ob3Vyc0xpc3RbaG91cl1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjBcIiArIChfdm0uYW1QbU1vZGUgPyBob3VyICUgMTIgfHwgMTIgOiBob3VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNsaWNlKC0yKSArIF92bS5hbVBtKGhvdXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1zcGlubmVyX193cmFwcGVyIGlzLWFycm93XCIsXG4gICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgIG1vdXNlZW50ZXI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBfdm0uZW1pdFNlbGVjdFJhbmdlKFwibWludXRlc1wiKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInJlcGVhdC1jbGlja1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1yZXBlYXQtY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmRlY3JlYXNlLFxuICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiZGVjcmVhc2VcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1zcGlubmVyX19hcnJvdyBlbC1pY29uLWFycm93LXVwXCJcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJyZXBlYXQtY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtcmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5pbmNyZWFzZSxcbiAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImluY3JlYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRpbWUtc3Bpbm5lcl9fYXJyb3cgZWwtaWNvbi1hcnJvdy1kb3duXCJcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgIFwidWxcIixcbiAgICAgICAgICAgICAgICAgIHsgcmVmOiBcIm1pbnV0ZXNcIiwgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1zcGlubmVyX19saXN0XCIgfSxcbiAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0uYXJyb3dNaW51dGVMaXN0LCBmdW5jdGlvbihtaW51dGUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgXCJsaVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1zcGlubmVyX19pdGVtXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogeyBhY3RpdmU6IG1pbnV0ZSA9PT0gX3ZtLm1pbnV0ZXMgfVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgICBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKFwiMFwiICsgbWludXRlKS5zbGljZSgtMilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF92bS5zaG93U2Vjb25kc1xuICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1zcGlubmVyX193cmFwcGVyIGlzLWFycm93XCIsXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgbW91c2VlbnRlcjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uZW1pdFNlbGVjdFJhbmdlKFwic2Vjb25kc1wiKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwicmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1yZXBlYXQtY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5kZWNyZWFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJkZWNyZWFzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10aW1lLXNwaW5uZXJfX2Fycm93IGVsLWljb24tYXJyb3ctdXBcIlxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwicmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1yZXBlYXQtY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5pbmNyZWFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJpbmNyZWFzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10aW1lLXNwaW5uZXJfX2Fycm93IGVsLWljb24tYXJyb3ctZG93blwiXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgeyByZWY6IFwic2Vjb25kc1wiLCBzdGF0aWNDbGFzczogXCJlbC10aW1lLXNwaW5uZXJfX2xpc3RcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgIF92bS5fbChfdm0uYXJyb3dTZWNvbmRMaXN0LCBmdW5jdGlvbihzZWNvbmQsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10aW1lLXNwaW5uZXJfX2l0ZW1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogeyBhY3RpdmU6IHNlY29uZCA9PT0gX3ZtLnNlY29uZHMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgICAgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoXCIwXCIgKyBzZWNvbmQpLnNsaWNlKC0yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgXVxuICAgICAgICA6IF92bS5fZSgpXG4gICAgXSxcbiAgICAyXG4gIClcbn1cbnZhciB0aW1lX3NwaW5uZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8xZmFjYWRlYl9zdGF0aWNSZW5kZXJGbnMgPSBbXVxudGltZV9zcGlubmVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMWZhY2FkZWJfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvdGltZS1zcGlubmVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xZmFjYWRlYiZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL3RpbWUtc3Bpbm5lci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGltZV9zcGlubmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgY29tcG9uZW50czogeyBFbFNjcm9sbGJhcjogc2Nyb2xsYmFyX2RlZmF1bHQuYSB9LFxuXG4gIGRpcmVjdGl2ZXM6IHtcbiAgICByZXBlYXRDbGljazogcmVwZWF0X2NsaWNrXG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBkYXRlOiB7fSxcbiAgICBkZWZhdWx0VmFsdWU6IHt9LCAvLyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZVxuICAgIHNob3dTZWNvbmRzOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgYXJyb3dDb250cm9sOiBCb29sZWFuLFxuICAgIGFtUG1Nb2RlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJyAvLyAnYSc6IGFtL3BtOyAnQSc6IEFNL1BNXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaG91cnM6IGZ1bmN0aW9uIGhvdXJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0ZS5nZXRIb3VycygpO1xuICAgIH0sXG4gICAgbWludXRlczogZnVuY3Rpb24gbWludXRlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGUuZ2V0TWludXRlcygpO1xuICAgIH0sXG4gICAgc2Vjb25kczogZnVuY3Rpb24gc2Vjb25kcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGUuZ2V0U2Vjb25kcygpO1xuICAgIH0sXG4gICAgaG91cnNMaXN0OiBmdW5jdGlvbiBob3Vyc0xpc3QoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bXCJnZXRSYW5nZUhvdXJzXCJdKSh0aGlzLnNlbGVjdGFibGVSYW5nZSk7XG4gICAgfSxcbiAgICBtaW51dGVzTGlzdDogZnVuY3Rpb24gbWludXRlc0xpc3QoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bXCJnZXRSYW5nZU1pbnV0ZXNcIl0pKHRoaXMuc2VsZWN0YWJsZVJhbmdlLCB0aGlzLmhvdXJzKTtcbiAgICB9LFxuICAgIGFycm93SG91ckxpc3Q6IGZ1bmN0aW9uIGFycm93SG91ckxpc3QoKSB7XG4gICAgICB2YXIgaG91cnMgPSB0aGlzLmhvdXJzO1xuICAgICAgcmV0dXJuIFtob3VycyA+IDAgPyBob3VycyAtIDEgOiB1bmRlZmluZWQsIGhvdXJzLCBob3VycyA8IDIzID8gaG91cnMgKyAxIDogdW5kZWZpbmVkXTtcbiAgICB9LFxuICAgIGFycm93TWludXRlTGlzdDogZnVuY3Rpb24gYXJyb3dNaW51dGVMaXN0KCkge1xuICAgICAgdmFyIG1pbnV0ZXMgPSB0aGlzLm1pbnV0ZXM7XG4gICAgICByZXR1cm4gW21pbnV0ZXMgPiAwID8gbWludXRlcyAtIDEgOiB1bmRlZmluZWQsIG1pbnV0ZXMsIG1pbnV0ZXMgPCA1OSA/IG1pbnV0ZXMgKyAxIDogdW5kZWZpbmVkXTtcbiAgICB9LFxuICAgIGFycm93U2Vjb25kTGlzdDogZnVuY3Rpb24gYXJyb3dTZWNvbmRMaXN0KCkge1xuICAgICAgdmFyIHNlY29uZHMgPSB0aGlzLnNlY29uZHM7XG4gICAgICByZXR1cm4gW3NlY29uZHMgPiAwID8gc2Vjb25kcyAtIDEgOiB1bmRlZmluZWQsIHNlY29uZHMsIHNlY29uZHMgPCA1OSA/IHNlY29uZHMgKyAxIDogdW5kZWZpbmVkXTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0YWJsZVJhbmdlOiBbXSxcbiAgICAgIGN1cnJlbnRTY3JvbGxiYXI6IG51bGxcbiAgICB9O1xuICB9LFxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAhX3RoaXMuYXJyb3dDb250cm9sICYmIF90aGlzLmJpbmRTY3JvbGxFdmVudCgpO1xuICAgIH0pO1xuICB9LFxuXG5cbiAgbWV0aG9kczoge1xuICAgIGluY3JlYXNlOiBmdW5jdGlvbiBpbmNyZWFzZSgpIHtcbiAgICAgIHRoaXMuc2Nyb2xsRG93bigxKTtcbiAgICB9LFxuICAgIGRlY3JlYXNlOiBmdW5jdGlvbiBkZWNyZWFzZSgpIHtcbiAgICAgIHRoaXMuc2Nyb2xsRG93bigtMSk7XG4gICAgfSxcbiAgICBtb2RpZnlEYXRlRmllbGQ6IGZ1bmN0aW9uIG1vZGlmeURhdGVGaWVsZCh0eXBlLCB2YWx1ZSkge1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBPYmplY3QoZGF0ZV91dGlsX1tcIm1vZGlmeVRpbWVcIl0pKHRoaXMuZGF0ZSwgdmFsdWUsIHRoaXMubWludXRlcywgdGhpcy5zZWNvbmRzKSk7YnJlYWs7XG4gICAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIE9iamVjdChkYXRlX3V0aWxfW1wibW9kaWZ5VGltZVwiXSkodGhpcy5kYXRlLCB0aGlzLmhvdXJzLCB2YWx1ZSwgdGhpcy5zZWNvbmRzKSk7YnJlYWs7XG4gICAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIE9iamVjdChkYXRlX3V0aWxfW1wibW9kaWZ5VGltZVwiXSkodGhpcy5kYXRlLCB0aGlzLmhvdXJzLCB0aGlzLm1pbnV0ZXMsIHZhbHVlKSk7YnJlYWs7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVDbGljazogZnVuY3Rpb24gaGFuZGxlQ2xpY2sodHlwZSwgX3JlZikge1xuICAgICAgdmFyIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgICAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQ7XG5cbiAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5tb2RpZnlEYXRlRmllbGQodHlwZSwgdmFsdWUpO1xuICAgICAgICB0aGlzLmVtaXRTZWxlY3RSYW5nZSh0eXBlKTtcbiAgICAgICAgdGhpcy5hZGp1c3RTcGlubmVyKHR5cGUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGVtaXRTZWxlY3RSYW5nZTogZnVuY3Rpb24gZW1pdFNlbGVjdFJhbmdlKHR5cGUpIHtcbiAgICAgIGlmICh0eXBlID09PSAnaG91cnMnKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdC1yYW5nZScsIDAsIDIpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbWludXRlcycpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0LXJhbmdlJywgMywgNSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzZWNvbmRzJykge1xuICAgICAgICB0aGlzLiRlbWl0KCdzZWxlY3QtcmFuZ2UnLCA2LCA4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudFNjcm9sbGJhciA9IHR5cGU7XG4gICAgfSxcbiAgICBiaW5kU2Nyb2xsRXZlbnQ6IGZ1bmN0aW9uIGJpbmRTY3JvbGxFdmVudCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgYmluZEZ1bmN0aW9uID0gZnVuY3Rpb24gYmluZEZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgX3RoaXMyLiRyZWZzW3R5cGVdLndyYXAub25zY3JvbGwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIC8vIFRPRE86IHNjcm9sbCBpcyBlbWl0dGVkIHdoZW4gc2V0IHNjcm9sbFRvcCBwcm9ncmFtYXRpY2FsbHlcbiAgICAgICAgICAvLyBzaG91bGQgZmluZCBiZXR0ZXIgc29sdXRpb25zIGluIHRoZSBmdXR1cmUhXG4gICAgICAgICAgX3RoaXMyLmhhbmRsZVNjcm9sbCh0eXBlLCBlKTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICBiaW5kRnVuY3Rpb24oJ2hvdXJzJyk7XG4gICAgICBiaW5kRnVuY3Rpb24oJ21pbnV0ZXMnKTtcbiAgICAgIGJpbmRGdW5jdGlvbignc2Vjb25kcycpO1xuICAgIH0sXG4gICAgaGFuZGxlU2Nyb2xsOiBmdW5jdGlvbiBoYW5kbGVTY3JvbGwodHlwZSkge1xuICAgICAgdmFyIHZhbHVlID0gTWF0aC5taW4oTWF0aC5yb3VuZCgodGhpcy4kcmVmc1t0eXBlXS53cmFwLnNjcm9sbFRvcCAtICh0aGlzLnNjcm9sbEJhckhlaWdodCh0eXBlKSAqIDAuNSAtIDEwKSAvIHRoaXMudHlwZUl0ZW1IZWlnaHQodHlwZSkgKyAzKSAvIHRoaXMudHlwZUl0ZW1IZWlnaHQodHlwZSkpLCB0eXBlID09PSAnaG91cnMnID8gMjMgOiA1OSk7XG4gICAgICB0aGlzLm1vZGlmeURhdGVGaWVsZCh0eXBlLCB2YWx1ZSk7XG4gICAgfSxcblxuXG4gICAgLy8gTk9URTogdXNlZCBieSBkYXRldGltZSAvIGRhdGUtcmFuZ2UgcGFuZWxcbiAgICAvLyAgICAgICByZW5hbWVkIGZyb20gYWRqdXN0U2Nyb2xsVG9wXG4gICAgLy8gICAgICAgc2hvdWxkIHRyeSB0byByZWZhY3RvcnkgaXRcbiAgICBhZGp1c3RTcGlubmVyczogZnVuY3Rpb24gYWRqdXN0U3Bpbm5lcnMoKSB7XG4gICAgICB0aGlzLmFkanVzdFNwaW5uZXIoJ2hvdXJzJywgdGhpcy5ob3Vycyk7XG4gICAgICB0aGlzLmFkanVzdFNwaW5uZXIoJ21pbnV0ZXMnLCB0aGlzLm1pbnV0ZXMpO1xuICAgICAgdGhpcy5hZGp1c3RTcGlubmVyKCdzZWNvbmRzJywgdGhpcy5zZWNvbmRzKTtcbiAgICB9LFxuICAgIGFkanVzdEN1cnJlbnRTcGlubmVyOiBmdW5jdGlvbiBhZGp1c3RDdXJyZW50U3Bpbm5lcih0eXBlKSB7XG4gICAgICB0aGlzLmFkanVzdFNwaW5uZXIodHlwZSwgdGhpc1t0eXBlXSk7XG4gICAgfSxcbiAgICBhZGp1c3RTcGlubmVyOiBmdW5jdGlvbiBhZGp1c3RTcGlubmVyKHR5cGUsIHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5hcnJvd0NvbnRyb2wpIHJldHVybjtcbiAgICAgIHZhciBlbCA9IHRoaXMuJHJlZnNbdHlwZV0ud3JhcDtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zY3JvbGxUb3AgPSBNYXRoLm1heCgwLCB2YWx1ZSAqIHRoaXMudHlwZUl0ZW1IZWlnaHQodHlwZSkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2Nyb2xsRG93bjogZnVuY3Rpb24gc2Nyb2xsRG93bihzdGVwKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLmN1cnJlbnRTY3JvbGxiYXIpIHtcbiAgICAgICAgdGhpcy5lbWl0U2VsZWN0UmFuZ2UoJ2hvdXJzJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBsYWJlbCA9IHRoaXMuY3VycmVudFNjcm9sbGJhcjtcbiAgICAgIHZhciBob3Vyc0xpc3QgPSB0aGlzLmhvdXJzTGlzdDtcbiAgICAgIHZhciBub3cgPSB0aGlzW2xhYmVsXTtcblxuICAgICAgaWYgKHRoaXMuY3VycmVudFNjcm9sbGJhciA9PT0gJ2hvdXJzJykge1xuICAgICAgICB2YXIgdG90YWwgPSBNYXRoLmFicyhzdGVwKTtcbiAgICAgICAgc3RlcCA9IHN0ZXAgPiAwID8gMSA6IC0xO1xuICAgICAgICB2YXIgbGVuZ3RoID0gaG91cnNMaXN0Lmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tICYmIHRvdGFsKSB7XG4gICAgICAgICAgbm93ID0gKG5vdyArIHN0ZXAgKyBob3Vyc0xpc3QubGVuZ3RoKSAlIGhvdXJzTGlzdC5sZW5ndGg7XG4gICAgICAgICAgaWYgKGhvdXJzTGlzdFtub3ddKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdG90YWwtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG91cnNMaXN0W25vd10pIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vdyA9IChub3cgKyBzdGVwICsgNjApICUgNjA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubW9kaWZ5RGF0ZUZpZWxkKGxhYmVsLCBub3cpO1xuICAgICAgdGhpcy5hZGp1c3RTcGlubmVyKGxhYmVsLCBub3cpO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMzLmVtaXRTZWxlY3RSYW5nZShfdGhpczMuY3VycmVudFNjcm9sbGJhcik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGFtUG06IGZ1bmN0aW9uIGFtUG0oaG91cikge1xuICAgICAgdmFyIHNob3VsZFNob3dBbVBtID0gdGhpcy5hbVBtTW9kZS50b0xvd2VyQ2FzZSgpID09PSAnYSc7XG4gICAgICBpZiAoIXNob3VsZFNob3dBbVBtKSByZXR1cm4gJyc7XG4gICAgICB2YXIgaXNDYXBpdGFsID0gdGhpcy5hbVBtTW9kZSA9PT0gJ0EnO1xuICAgICAgdmFyIGNvbnRlbnQgPSBob3VyIDwgMTIgPyAnIGFtJyA6ICcgcG0nO1xuICAgICAgaWYgKGlzQ2FwaXRhbCkgY29udGVudCA9IGNvbnRlbnQudG9VcHBlckNhc2UoKTtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0sXG4gICAgdHlwZUl0ZW1IZWlnaHQ6IGZ1bmN0aW9uIHR5cGVJdGVtSGVpZ2h0KHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzW3R5cGVdLiRlbC5xdWVyeVNlbGVjdG9yKCdsaScpLm9mZnNldEhlaWdodDtcbiAgICB9LFxuICAgIHNjcm9sbEJhckhlaWdodDogZnVuY3Rpb24gc2Nyb2xsQmFySGVpZ2h0KHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzW3R5cGVdLiRlbC5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL3RpbWUtc3Bpbm5lci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYmFzaWNfdGltZV9zcGlubmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHRpbWVfc3Bpbm5lcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvdGltZS1zcGlubmVyLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHRpbWVfc3Bpbm5lcl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIGJhc2ljX3RpbWVfc3Bpbm5lcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgdGltZV9zcGlubmVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMWZhY2FkZWJfcmVuZGVyLFxuICB0aW1lX3NwaW5uZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8xZmFjYWRlYl9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHRpbWVfc3Bpbm5lcl9hcGk7IH1cbnRpbWVfc3Bpbm5lcl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy90aW1lLXNwaW5uZXIudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRpbWVfc3Bpbm5lciA9ICh0aW1lX3NwaW5uZXJfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL3RpbWUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGltZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG1peGluczogW2xvY2FsZV9kZWZhdWx0LmFdLFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBUaW1lU3Bpbm5lcjogdGltZV9zcGlubmVyXG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICB2aXNpYmxlOiBCb29sZWFuLFxuICAgIHRpbWVBcnJvd0NvbnRyb2w6IEJvb2xlYW5cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHZpc2libGU6IGZ1bmN0aW9uIHZpc2libGUodmFsKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHRoaXMub2xkVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLiRyZWZzLnNwaW5uZXIuZW1pdFNlbGVjdFJhbmdlKCdob3VycycpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubmVlZEluaXRBZGp1c3QgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKG5ld1ZhbCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBkYXRlID0gdm9pZCAwO1xuICAgICAgaWYgKG5ld1ZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgZGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibGltaXRUaW1lUmFuZ2VcIl0pKG5ld1ZhbCwgdGhpcy5zZWxlY3RhYmxlUmFuZ2UsIHRoaXMuZm9ybWF0KTtcbiAgICAgIH0gZWxzZSBpZiAoIW5ld1ZhbCkge1xuICAgICAgICBkYXRlID0gdGhpcy5kZWZhdWx0VmFsdWUgPyBuZXcgRGF0ZSh0aGlzLmRlZmF1bHRWYWx1ZSkgOiBuZXcgRGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRhdGUgPSBkYXRlO1xuICAgICAgaWYgKHRoaXMudmlzaWJsZSAmJiB0aGlzLm5lZWRJbml0QWRqdXN0KSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uIChfKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5hZGp1c3RTcGlubmVycygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5uZWVkSW5pdEFkanVzdCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2VsZWN0YWJsZVJhbmdlOiBmdW5jdGlvbiBzZWxlY3RhYmxlUmFuZ2UodmFsKSB7XG4gICAgICB0aGlzLiRyZWZzLnNwaW5uZXIuc2VsZWN0YWJsZVJhbmdlID0gdmFsO1xuICAgIH0sXG4gICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VmFsdWUodmFsKSB7XG4gICAgICBpZiAoIU9iamVjdChkYXRlX3V0aWxfW1wiaXNEYXRlXCJdKSh0aGlzLnZhbHVlKSkge1xuICAgICAgICB0aGlzLmRhdGUgPSB2YWwgPyBuZXcgRGF0ZSh2YWwpIDogbmV3IERhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcG9wcGVyQ2xhc3M6ICcnLFxuICAgICAgZm9ybWF0OiAnSEg6bW06c3MnLFxuICAgICAgdmFsdWU6ICcnLFxuICAgICAgZGVmYXVsdFZhbHVlOiBudWxsLFxuICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgIG9sZFZhbHVlOiBuZXcgRGF0ZSgpLFxuICAgICAgc2VsZWN0YWJsZVJhbmdlOiBbXSxcbiAgICAgIHNlbGVjdGlvblJhbmdlOiBbMCwgMl0sXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICBhcnJvd0NvbnRyb2w6IGZhbHNlLFxuICAgICAgbmVlZEluaXRBZGp1c3Q6IHRydWVcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzaG93U2Vjb25kczogZnVuY3Rpb24gc2hvd1NlY29uZHMoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZm9ybWF0IHx8ICcnKS5pbmRleE9mKCdzcycpICE9PSAtMTtcbiAgICB9LFxuICAgIHVzZUFycm93OiBmdW5jdGlvbiB1c2VBcnJvdygpIHtcbiAgICAgIHJldHVybiB0aGlzLmFycm93Q29udHJvbCB8fCB0aGlzLnRpbWVBcnJvd0NvbnRyb2wgfHwgZmFsc2U7XG4gICAgfSxcbiAgICBhbVBtTW9kZTogZnVuY3Rpb24gYW1QbU1vZGUoKSB7XG4gICAgICBpZiAoKHRoaXMuZm9ybWF0IHx8ICcnKS5pbmRleE9mKCdBJykgIT09IC0xKSByZXR1cm4gJ0EnO1xuICAgICAgaWYgKCh0aGlzLmZvcm1hdCB8fCAnJykuaW5kZXhPZignYScpICE9PSAtMSkgcmV0dXJuICdhJztcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUNhbmNlbDogZnVuY3Rpb24gaGFuZGxlQ2FuY2VsKCkge1xuICAgICAgdGhpcy4kZW1pdCgncGljaycsIHRoaXMub2xkVmFsdWUsIGZhbHNlKTtcbiAgICB9LFxuICAgIGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGRhdGUpIHtcbiAgICAgIC8vIHRoaXMudmlzaWJsZSBhdm9pZHMgZWRnZSBjYXNlcywgd2hlbiB1c2Ugc2Nyb2xscyBkdXJpbmcgcGFuZWwgY2xvc2luZyBhbmltYXRpb25cbiAgICAgIGlmICh0aGlzLnZpc2libGUpIHtcbiAgICAgICAgdGhpcy5kYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJjbGVhck1pbGxpc2Vjb25kc1wiXSkoZGF0ZSk7XG4gICAgICAgIC8vIGlmIGRhdGUgaXMgb3V0IG9mIHJhbmdlLCBkbyBub3QgZW1pdFxuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkVmFsdWUodGhpcy5kYXRlKSkge1xuICAgICAgICAgIHRoaXMuJGVtaXQoJ3BpY2snLCB0aGlzLmRhdGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRTZWxlY3Rpb25SYW5nZTogZnVuY3Rpb24gc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCkge1xuICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0LXJhbmdlJywgc3RhcnQsIGVuZCk7XG4gICAgICB0aGlzLnNlbGVjdGlvblJhbmdlID0gW3N0YXJ0LCBlbmRdO1xuICAgIH0sXG4gICAgaGFuZGxlQ29uZmlybTogZnVuY3Rpb24gaGFuZGxlQ29uZmlybSgpIHtcbiAgICAgIHZhciB2aXNpYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICAgIHZhciBmaXJzdCA9IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKGZpcnN0KSByZXR1cm47XG4gICAgICB2YXIgZGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wiY2xlYXJNaWxsaXNlY29uZHNcIl0pKE9iamVjdChkYXRlX3V0aWxfW1wibGltaXRUaW1lUmFuZ2VcIl0pKHRoaXMuZGF0ZSwgdGhpcy5zZWxlY3RhYmxlUmFuZ2UsIHRoaXMuZm9ybWF0KSk7XG4gICAgICB0aGlzLiRlbWl0KCdwaWNrJywgZGF0ZSwgdmlzaWJsZSwgZmlyc3QpO1xuICAgIH0sXG4gICAgaGFuZGxlS2V5ZG93bjogZnVuY3Rpb24gaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgICAgdmFyIGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgICAgdmFyIG1hcHBpbmcgPSB7IDM4OiAtMSwgNDA6IDEsIDM3OiAtMSwgMzk6IDEgfTtcblxuICAgICAgLy8gTGVmdCBvciBSaWdodFxuICAgICAgaWYgKGtleUNvZGUgPT09IDM3IHx8IGtleUNvZGUgPT09IDM5KSB7XG4gICAgICAgIHZhciBzdGVwID0gbWFwcGluZ1trZXlDb2RlXTtcbiAgICAgICAgdGhpcy5jaGFuZ2VTZWxlY3Rpb25SYW5nZShzdGVwKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVcCBvciBEb3duXG4gICAgICBpZiAoa2V5Q29kZSA9PT0gMzggfHwga2V5Q29kZSA9PT0gNDApIHtcbiAgICAgICAgdmFyIF9zdGVwID0gbWFwcGluZ1trZXlDb2RlXTtcbiAgICAgICAgdGhpcy4kcmVmcy5zcGlubmVyLnNjcm9sbERvd24oX3N0ZXApO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSxcbiAgICBpc1ZhbGlkVmFsdWU6IGZ1bmN0aW9uIGlzVmFsaWRWYWx1ZShkYXRlKSB7XG4gICAgICByZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bXCJ0aW1lV2l0aGluUmFuZ2VcIl0pKGRhdGUsIHRoaXMuc2VsZWN0YWJsZVJhbmdlLCB0aGlzLmZvcm1hdCk7XG4gICAgfSxcbiAgICBhZGp1c3RTcGlubmVyczogZnVuY3Rpb24gYWRqdXN0U3Bpbm5lcnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy5zcGlubmVyLmFkanVzdFNwaW5uZXJzKCk7XG4gICAgfSxcbiAgICBjaGFuZ2VTZWxlY3Rpb25SYW5nZTogZnVuY3Rpb24gY2hhbmdlU2VsZWN0aW9uUmFuZ2Uoc3RlcCkge1xuICAgICAgdmFyIGxpc3QgPSBbMCwgM10uY29uY2F0KHRoaXMuc2hvd1NlY29uZHMgPyBbNl0gOiBbXSk7XG4gICAgICB2YXIgbWFwcGluZyA9IFsnaG91cnMnLCAnbWludXRlcyddLmNvbmNhdCh0aGlzLnNob3dTZWNvbmRzID8gWydzZWNvbmRzJ10gOiBbXSk7XG4gICAgICB2YXIgaW5kZXggPSBsaXN0LmluZGV4T2YodGhpcy5zZWxlY3Rpb25SYW5nZVswXSk7XG4gICAgICB2YXIgbmV4dCA9IChpbmRleCArIHN0ZXAgKyBsaXN0Lmxlbmd0aCkgJSBsaXN0Lmxlbmd0aDtcbiAgICAgIHRoaXMuJHJlZnMuc3Bpbm5lci5lbWl0U2VsZWN0UmFuZ2UobWFwcGluZ1tuZXh0XSk7XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMzLmhhbmRsZUNvbmZpcm0odHJ1ZSwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy4kZW1pdCgnbW91bnRlZCcpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL3RpbWUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhbmVsX3RpbWV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAodGltZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciB0aW1lX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFuZWxfdGltZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgdGltZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNkOTM5MDg5X3JlbmRlcixcbiAgdGltZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNkOTM5MDg5X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgdGltZV9hcGk7IH1cbnRpbWVfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFuZWxfdGltZSA9ICh0aW1lX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL3llYXItdGFibGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWM4NmFiNWUwJlxudmFyIHllYXJfdGFibGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF9jODZhYjVlMF9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJ0YWJsZVwiLFxuICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwteWVhci10YWJsZVwiLCBvbjogeyBjbGljazogX3ZtLmhhbmRsZVllYXJUYWJsZUNsaWNrIH0gfSxcbiAgICBbXG4gICAgICBfYyhcInRib2R5XCIsIFtcbiAgICAgICAgX2MoXCJ0clwiLCBbXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcInRkXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICBjbGFzczogX3ZtLmdldENlbGxTdHlsZShfdm0uc3RhcnRZZWFyICsgMClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbX2MoXCJhXCIsIHsgc3RhdGljQ2xhc3M6IFwiY2VsbFwiIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5zdGFydFllYXIpKV0pXVxuICAgICAgICAgICksXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcInRkXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICBjbGFzczogX3ZtLmdldENlbGxTdHlsZShfdm0uc3RhcnRZZWFyICsgMSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFwiYVwiLCB7IHN0YXRpY0NsYXNzOiBcImNlbGxcIiB9LCBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uc3RhcnRZZWFyICsgMSkpXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwidGRcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiBfdm0uZ2V0Q2VsbFN0eWxlKF92bS5zdGFydFllYXIgKyAyKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXCJhXCIsIHsgc3RhdGljQ2xhc3M6IFwiY2VsbFwiIH0sIFtcbiAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKF92bS5zdGFydFllYXIgKyAyKSlcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApLFxuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJ0ZFwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJhdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgY2xhc3M6IF92bS5nZXRDZWxsU3R5bGUoX3ZtLnN0YXJ0WWVhciArIDMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcImFcIiwgeyBzdGF0aWNDbGFzczogXCJjZWxsXCIgfSwgW1xuICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLnN0YXJ0WWVhciArIDMpKVxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgXVxuICAgICAgICAgIClcbiAgICAgICAgXSksXG4gICAgICAgIF9jKFwidHJcIiwgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJ0ZFwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJhdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgY2xhc3M6IF92bS5nZXRDZWxsU3R5bGUoX3ZtLnN0YXJ0WWVhciArIDQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcImFcIiwgeyBzdGF0aWNDbGFzczogXCJjZWxsXCIgfSwgW1xuICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLnN0YXJ0WWVhciArIDQpKVxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgXVxuICAgICAgICAgICksXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcInRkXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICBjbGFzczogX3ZtLmdldENlbGxTdHlsZShfdm0uc3RhcnRZZWFyICsgNSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFwiYVwiLCB7IHN0YXRpY0NsYXNzOiBcImNlbGxcIiB9LCBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uc3RhcnRZZWFyICsgNSkpXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwidGRcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiBfdm0uZ2V0Q2VsbFN0eWxlKF92bS5zdGFydFllYXIgKyA2KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXCJhXCIsIHsgc3RhdGljQ2xhc3M6IFwiY2VsbFwiIH0sIFtcbiAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKF92bS5zdGFydFllYXIgKyA2KSlcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApLFxuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJ0ZFwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJhdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgY2xhc3M6IF92bS5nZXRDZWxsU3R5bGUoX3ZtLnN0YXJ0WWVhciArIDcpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcImFcIiwgeyBzdGF0aWNDbGFzczogXCJjZWxsXCIgfSwgW1xuICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLnN0YXJ0WWVhciArIDcpKVxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgXVxuICAgICAgICAgIClcbiAgICAgICAgXSksXG4gICAgICAgIF9jKFwidHJcIiwgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJ0ZFwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJhdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgY2xhc3M6IF92bS5nZXRDZWxsU3R5bGUoX3ZtLnN0YXJ0WWVhciArIDgpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcImFcIiwgeyBzdGF0aWNDbGFzczogXCJjZWxsXCIgfSwgW1xuICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLnN0YXJ0WWVhciArIDgpKVxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgXVxuICAgICAgICAgICksXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcInRkXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICBjbGFzczogX3ZtLmdldENlbGxTdHlsZShfdm0uc3RhcnRZZWFyICsgOSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFwiYVwiLCB7IHN0YXRpY0NsYXNzOiBcImNlbGxcIiB9LCBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uc3RhcnRZZWFyICsgOSkpXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfYyhcInRkXCIpLFxuICAgICAgICAgIF9jKFwidGRcIilcbiAgICAgICAgXSlcbiAgICAgIF0pXG4gICAgXVxuICApXG59XG52YXIgeWVhcl90YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2M4NmFiNWUwX3N0YXRpY1JlbmRlckZucyA9IFtdXG55ZWFyX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfYzg2YWI1ZTBfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMveWVhci10YWJsZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9Yzg2YWI1ZTAmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy95ZWFyLXRhYmxlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxuXG52YXIgeWVhcl90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2RhdGVzSW5ZZWFyID0gZnVuY3Rpb24gZGF0ZXNJblllYXIoeWVhcikge1xuICB2YXIgbnVtT2ZEYXlzID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJnZXREYXlDb3VudE9mWWVhclwiXSkoeWVhcik7XG4gIHZhciBmaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIDAsIDEpO1xuICByZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bXCJyYW5nZVwiXSkobnVtT2ZEYXlzKS5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bXCJuZXh0RGF0ZVwiXSkoZmlyc3REYXksIG4pO1xuICB9KTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHllYXJfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBwcm9wczoge1xuICAgIGRpc2FibGVkRGF0ZToge30sXG4gICAgdmFsdWU6IHt9LFxuICAgIGRlZmF1bHRWYWx1ZToge1xuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsKSB7XG4gICAgICAgIC8vIG51bGwgb3IgdmFsaWQgRGF0ZSBPYmplY3RcbiAgICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCB8fCB2YWwgaW5zdGFuY2VvZiBEYXRlICYmIE9iamVjdChkYXRlX3V0aWxfW1wiaXNEYXRlXCJdKSh2YWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGF0ZToge30sXG4gICAgc2VsZWN0aW9uTW9kZToge31cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHN0YXJ0WWVhcjogZnVuY3Rpb24gc3RhcnRZZWFyKCkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5kYXRlLmdldEZ1bGxZZWFyKCkgLyAxMCkgKiAxMDtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldENlbGxTdHlsZTogZnVuY3Rpb24gZ2V0Q2VsbFN0eWxlKHllYXIpIHtcbiAgICAgIHZhciBzdHlsZSA9IHt9O1xuICAgICAgdmFyIHRvZGF5ID0gbmV3IERhdGUoKTtcblxuICAgICAgc3R5bGUuZGlzYWJsZWQgPSB0eXBlb2YgdGhpcy5kaXNhYmxlZERhdGUgPT09ICdmdW5jdGlvbicgPyB5ZWFyX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZGF0ZXNJblllYXIoeWVhcikuZXZlcnkodGhpcy5kaXNhYmxlZERhdGUpIDogZmFsc2U7XG4gICAgICBzdHlsZS5jdXJyZW50ID0gT2JqZWN0KHV0aWxfW1wiYXJyYXlGaW5kSW5kZXhcIl0pKE9iamVjdCh1dGlsX1tcImNvZXJjZVRydXRoeVZhbHVlVG9BcnJheVwiXSkodGhpcy52YWx1ZSksIGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHllYXI7XG4gICAgICB9KSA+PSAwO1xuICAgICAgc3R5bGUudG9kYXkgPSB0b2RheS5nZXRGdWxsWWVhcigpID09PSB5ZWFyO1xuICAgICAgc3R5bGUuZGVmYXVsdCA9IHRoaXMuZGVmYXVsdFZhbHVlICYmIHRoaXMuZGVmYXVsdFZhbHVlLmdldEZ1bGxZZWFyKCkgPT09IHllYXI7XG5cbiAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuICAgIGhhbmRsZVllYXJUYWJsZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVZZWFyVGFibGVDbGljayhldmVudCkge1xuICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIGlmIChPYmplY3QoZG9tX1tcImhhc0NsYXNzXCJdKSh0YXJnZXQucGFyZW50Tm9kZSwgJ2Rpc2FibGVkJykpIHJldHVybjtcbiAgICAgICAgdmFyIHllYXIgPSB0YXJnZXQudGV4dENvbnRlbnQgfHwgdGFyZ2V0LmlubmVyVGV4dDtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUgfHwgW107XG4gICAgICAgICAgdmFyIGlkeCA9IE9iamVjdCh1dGlsX1tcImFycmF5RmluZEluZGV4XCJdKSh2YWx1ZSwgZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IE51bWJlcih5ZWFyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBpZHggPiAtMSA/IFtdLmNvbmNhdCh2YWx1ZS5zbGljZSgwLCBpZHgpLCB2YWx1ZS5zbGljZShpZHggKyAxKSkgOiBbXS5jb25jYXQodmFsdWUsIFtuZXcgRGF0ZSh5ZWFyKV0pO1xuICAgICAgICAgIHRoaXMuJGVtaXQoJ3BpY2snLCBuZXdWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4kZW1pdCgncGljaycsIE51bWJlcih5ZWFyKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMveWVhci10YWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYmFzaWNfeWVhcl90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh5ZWFyX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy95ZWFyLXRhYmxlLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHllYXJfdGFibGVfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBiYXNpY195ZWFyX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICB5ZWFyX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfYzg2YWI1ZTBfcmVuZGVyLFxuICB5ZWFyX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfYzg2YWI1ZTBfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciB5ZWFyX3RhYmxlX2FwaTsgfVxueWVhcl90YWJsZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy95ZWFyLXRhYmxlLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB5ZWFyX3RhYmxlID0gKHllYXJfdGFibGVfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvbW9udGgtdGFibGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTY1NGQ0ZjQyJlxudmFyIG1vbnRoX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNjU0ZDRmNDJfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwidGFibGVcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1tb250aC10YWJsZVwiLFxuICAgICAgb246IHsgY2xpY2s6IF92bS5oYW5kbGVNb250aFRhYmxlQ2xpY2ssIG1vdXNlbW92ZTogX3ZtLmhhbmRsZU1vdXNlTW92ZSB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJ0Ym9keVwiLFxuICAgICAgICBfdm0uX2woX3ZtLnJvd3MsIGZ1bmN0aW9uKHJvdywga2V5KSB7XG4gICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgXCJ0clwiLFxuICAgICAgICAgICAgeyBrZXk6IGtleSB9LFxuICAgICAgICAgICAgX3ZtLl9sKHJvdywgZnVuY3Rpb24oY2VsbCwga2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfYyhcInRkXCIsIHsga2V5OiBrZXksIGNsYXNzOiBfdm0uZ2V0Q2VsbFN0eWxlKGNlbGwpIH0sIFtcbiAgICAgICAgICAgICAgICBfYyhcImRpdlwiLCBbXG4gICAgICAgICAgICAgICAgICBfYyhcImFcIiwgeyBzdGF0aWNDbGFzczogXCJjZWxsXCIgfSwgW1xuICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnQoXCJlbC5kYXRlcGlja2VyLm1vbnRocy5cIiArIF92bS5tb250aHNbY2VsbC50ZXh0XSlcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgMFxuICAgICAgICAgIClcbiAgICAgICAgfSksXG4gICAgICAgIDBcbiAgICAgIClcbiAgICBdXG4gIClcbn1cbnZhciBtb250aF90YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY1NGQ0ZjQyX3N0YXRpY1JlbmRlckZucyA9IFtdXG5tb250aF90YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY1NGQ0ZjQyX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL21vbnRoLXRhYmxlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02NTRkNGY0MiZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL21vbnRoLXRhYmxlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cblxudmFyIG1vbnRoX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZGF0ZXNJbk1vbnRoID0gZnVuY3Rpb24gZGF0ZXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gIHZhciBudW1PZkRheXMgPSBPYmplY3QoZGF0ZV91dGlsX1tcImdldERheUNvdW50T2ZNb250aFwiXSkoeWVhciwgbW9udGgpO1xuICB2YXIgZmlyc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG4gIHJldHVybiBPYmplY3QoZGF0ZV91dGlsX1tcInJhbmdlXCJdKShudW1PZkRheXMpLm1hcChmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHREYXRlXCJdKShmaXJzdERheSwgbik7XG4gIH0pO1xufTtcblxudmFyIGNsZWFyRGF0ZSA9IGZ1bmN0aW9uIGNsZWFyRGF0ZShkYXRlKSB7XG4gIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSk7XG59O1xuXG52YXIgZ2V0TW9udGhUaW1lc3RhbXAgPSBmdW5jdGlvbiBnZXRNb250aFRpbWVzdGFtcCh0aW1lKSB7XG4gIGlmICh0eXBlb2YgdGltZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHRpbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNsZWFyRGF0ZShuZXcgRGF0ZSh0aW1lKSkuZ2V0VGltZSgpO1xuICB9IGVsc2UgaWYgKHRpbWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIGNsZWFyRGF0ZSh0aW1lKS5nZXRUaW1lKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxufTtcblxuLy8gcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgc2F0aXNmaWVzIGBwcmVkYCBmcm9tIGFyclxuLy8gcmV0dXJuIGEgbmV3IGFycmF5IGlmIG1vZGlmaWNhdGlvbiBvY2N1cnNcbi8vIHJldHVybiB0aGUgb3JpZ2luYWwgYXJyYXkgb3RoZXJ3aXNlXG52YXIgbW9udGhfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19yZW1vdmVGcm9tQXJyYXkgPSBmdW5jdGlvbiByZW1vdmVGcm9tQXJyYXkoYXJyLCBwcmVkKSB7XG4gIHZhciBpZHggPSB0eXBlb2YgcHJlZCA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdCh1dGlsX1tcImFycmF5RmluZEluZGV4XCJdKShhcnIsIHByZWQpIDogYXJyLmluZGV4T2YocHJlZCk7XG4gIHJldHVybiBpZHggPj0gMCA/IFtdLmNvbmNhdChhcnIuc2xpY2UoMCwgaWR4KSwgYXJyLnNsaWNlKGlkeCArIDEpKSA6IGFycjtcbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBtb250aF90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIHByb3BzOiB7XG4gICAgZGlzYWJsZWREYXRlOiB7fSxcbiAgICB2YWx1ZToge30sXG4gICAgc2VsZWN0aW9uTW9kZToge1xuICAgICAgZGVmYXVsdDogJ21vbnRoJ1xuICAgIH0sXG4gICAgbWluRGF0ZToge30sXG5cbiAgICBtYXhEYXRlOiB7fSxcbiAgICBkZWZhdWx0VmFsdWU6IHtcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAgICAgICAvLyBudWxsIG9yIHZhbGlkIERhdGUgT2JqZWN0XG4gICAgICAgIHJldHVybiB2YWwgPT09IG51bGwgfHwgT2JqZWN0KGRhdGVfdXRpbF9bXCJpc0RhdGVcIl0pKHZhbCkgfHwgQXJyYXkuaXNBcnJheSh2YWwpICYmIHZhbC5ldmVyeShkYXRlX3V0aWxfW1wiaXNEYXRlXCJdKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRhdGU6IHt9LFxuICAgIHJhbmdlU3RhdGU6IHtcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVuZERhdGU6IG51bGwsXG4gICAgICAgICAgc2VsZWN0aW5nOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtaXhpbnM6IFtsb2NhbGVfZGVmYXVsdC5hXSxcblxuICB3YXRjaDoge1xuICAgICdyYW5nZVN0YXRlLmVuZERhdGUnOiBmdW5jdGlvbiByYW5nZVN0YXRlRW5kRGF0ZShuZXdWYWwpIHtcbiAgICAgIHRoaXMubWFya1JhbmdlKHRoaXMubWluRGF0ZSwgbmV3VmFsKTtcbiAgICB9LFxuICAgIG1pbkRhdGU6IGZ1bmN0aW9uIG1pbkRhdGUobmV3VmFsLCBvbGRWYWwpIHtcbiAgICAgIGlmIChnZXRNb250aFRpbWVzdGFtcChuZXdWYWwpICE9PSBnZXRNb250aFRpbWVzdGFtcChvbGRWYWwpKSB7XG4gICAgICAgIHRoaXMubWFya1JhbmdlKHRoaXMubWluRGF0ZSwgdGhpcy5tYXhEYXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1heERhdGU6IGZ1bmN0aW9uIG1heERhdGUobmV3VmFsLCBvbGRWYWwpIHtcbiAgICAgIGlmIChnZXRNb250aFRpbWVzdGFtcChuZXdWYWwpICE9PSBnZXRNb250aFRpbWVzdGFtcChvbGRWYWwpKSB7XG4gICAgICAgIHRoaXMubWFya1JhbmdlKHRoaXMubWluRGF0ZSwgdGhpcy5tYXhEYXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9udGhzOiBbJ2phbicsICdmZWInLCAnbWFyJywgJ2FwcicsICdtYXknLCAnanVuJywgJ2p1bCcsICdhdWcnLCAnc2VwJywgJ29jdCcsICdub3YnLCAnZGVjJ10sXG4gICAgICB0YWJsZVJvd3M6IFtbXSwgW10sIFtdXSxcbiAgICAgIGxhc3RSb3c6IG51bGwsXG4gICAgICBsYXN0Q29sdW1uOiBudWxsXG4gICAgfTtcbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBjZWxsTWF0Y2hlc0RhdGU6IGZ1bmN0aW9uIGNlbGxNYXRjaGVzRGF0ZShjZWxsLCBkYXRlKSB7XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgIHJldHVybiB0aGlzLmRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdmFsdWUuZ2V0RnVsbFllYXIoKSAmJiBOdW1iZXIoY2VsbC50ZXh0KSA9PT0gdmFsdWUuZ2V0TW9udGgoKTtcbiAgICB9LFxuICAgIGdldENlbGxTdHlsZTogZnVuY3Rpb24gZ2V0Q2VsbFN0eWxlKGNlbGwpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBzdHlsZSA9IHt9O1xuICAgICAgdmFyIHllYXIgPSB0aGlzLmRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIHZhciB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICB2YXIgbW9udGggPSBjZWxsLnRleHQ7XG4gICAgICB2YXIgZGVmYXVsdFZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWUgPyBBcnJheS5pc0FycmF5KHRoaXMuZGVmYXVsdFZhbHVlKSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogW3RoaXMuZGVmYXVsdFZhbHVlXSA6IFtdO1xuICAgICAgc3R5bGUuZGlzYWJsZWQgPSB0eXBlb2YgdGhpcy5kaXNhYmxlZERhdGUgPT09ICdmdW5jdGlvbicgPyBtb250aF90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2RhdGVzSW5Nb250aCh5ZWFyLCBtb250aCkuZXZlcnkodGhpcy5kaXNhYmxlZERhdGUpIDogZmFsc2U7XG4gICAgICBzdHlsZS5jdXJyZW50ID0gT2JqZWN0KHV0aWxfW1wiYXJyYXlGaW5kSW5kZXhcIl0pKE9iamVjdCh1dGlsX1tcImNvZXJjZVRydXRoeVZhbHVlVG9BcnJheVwiXSkodGhpcy52YWx1ZSksIGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHllYXIgJiYgZGF0ZS5nZXRNb250aCgpID09PSBtb250aDtcbiAgICAgIH0pID49IDA7XG4gICAgICBzdHlsZS50b2RheSA9IHRvZGF5LmdldEZ1bGxZZWFyKCkgPT09IHllYXIgJiYgdG9kYXkuZ2V0TW9udGgoKSA9PT0gbW9udGg7XG4gICAgICBzdHlsZS5kZWZhdWx0ID0gZGVmYXVsdFZhbHVlLnNvbWUoZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmNlbGxNYXRjaGVzRGF0ZShjZWxsLCBkYXRlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY2VsbC5pblJhbmdlKSB7XG4gICAgICAgIHN0eWxlWydpbi1yYW5nZSddID0gdHJ1ZTtcblxuICAgICAgICBpZiAoY2VsbC5zdGFydCkge1xuICAgICAgICAgIHN0eWxlWydzdGFydC1kYXRlJ10gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNlbGwuZW5kKSB7XG4gICAgICAgICAgc3R5bGVbJ2VuZC1kYXRlJ10gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3R5bGU7XG4gICAgfSxcbiAgICBnZXRNb250aE9mQ2VsbDogZnVuY3Rpb24gZ2V0TW9udGhPZkNlbGwobW9udGgpIHtcbiAgICAgIHZhciB5ZWFyID0gdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xuICAgIH0sXG4gICAgbWFya1JhbmdlOiBmdW5jdGlvbiBtYXJrUmFuZ2UobWluRGF0ZSwgbWF4RGF0ZSkge1xuICAgICAgbWluRGF0ZSA9IGdldE1vbnRoVGltZXN0YW1wKG1pbkRhdGUpO1xuICAgICAgbWF4RGF0ZSA9IGdldE1vbnRoVGltZXN0YW1wKG1heERhdGUpIHx8IG1pbkRhdGU7XG4gICAgICB2YXIgX3JlZiA9IFtNYXRoLm1pbihtaW5EYXRlLCBtYXhEYXRlKSwgTWF0aC5tYXgobWluRGF0ZSwgbWF4RGF0ZSldO1xuICAgICAgbWluRGF0ZSA9IF9yZWZbMF07XG4gICAgICBtYXhEYXRlID0gX3JlZlsxXTtcblxuICAgICAgdmFyIHJvd3MgPSB0aGlzLnJvd3M7XG4gICAgICBmb3IgKHZhciBpID0gMCwgayA9IHJvd3MubGVuZ3RoOyBpIDwgazsgaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgbCA9IHJvdy5sZW5ndGg7IGogPCBsOyBqKyspIHtcblxuICAgICAgICAgIHZhciBjZWxsID0gcm93W2pdO1xuICAgICAgICAgIHZhciBpbmRleCA9IGkgKiA0ICsgajtcbiAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpLCBpbmRleCkuZ2V0VGltZSgpO1xuXG4gICAgICAgICAgY2VsbC5pblJhbmdlID0gbWluRGF0ZSAmJiB0aW1lID49IG1pbkRhdGUgJiYgdGltZSA8PSBtYXhEYXRlO1xuICAgICAgICAgIGNlbGwuc3RhcnQgPSBtaW5EYXRlICYmIHRpbWUgPT09IG1pbkRhdGU7XG4gICAgICAgICAgY2VsbC5lbmQgPSBtYXhEYXRlICYmIHRpbWUgPT09IG1heERhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZU1vdXNlTW92ZTogZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMucmFuZ2VTdGF0ZS5zZWxlY3RpbmcpIHJldHVybjtcblxuICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdESVYnKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgfVxuICAgICAgaWYgKHRhcmdldC50YWdOYW1lICE9PSAnVEQnKSByZXR1cm47XG5cbiAgICAgIHZhciByb3cgPSB0YXJnZXQucGFyZW50Tm9kZS5yb3dJbmRleDtcbiAgICAgIHZhciBjb2x1bW4gPSB0YXJnZXQuY2VsbEluZGV4O1xuICAgICAgLy8gY2FuIG5vdCBzZWxlY3QgZGlzYWJsZWQgZGF0ZVxuICAgICAgaWYgKHRoaXMucm93c1tyb3ddW2NvbHVtbl0uZGlzYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gb25seSB1cGRhdGUgcmFuZ2VTdGF0ZSB3aGVuIG1vdXNlIG1vdmVzIHRvIGEgbmV3IGNlbGxcbiAgICAgIC8vIHRoaXMgYXZvaWRzIGZyZXF1ZW50IERhdGUgb2JqZWN0IGNyZWF0aW9uIGFuZCBpbXByb3ZlcyBwZXJmb3JtYW5jZVxuICAgICAgaWYgKHJvdyAhPT0gdGhpcy5sYXN0Um93IHx8IGNvbHVtbiAhPT0gdGhpcy5sYXN0Q29sdW1uKSB7XG4gICAgICAgIHRoaXMubGFzdFJvdyA9IHJvdztcbiAgICAgICAgdGhpcy5sYXN0Q29sdW1uID0gY29sdW1uO1xuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2VyYW5nZScsIHtcbiAgICAgICAgICBtaW5EYXRlOiB0aGlzLm1pbkRhdGUsXG4gICAgICAgICAgbWF4RGF0ZTogdGhpcy5tYXhEYXRlLFxuICAgICAgICAgIHJhbmdlU3RhdGU6IHtcbiAgICAgICAgICAgIHNlbGVjdGluZzogdHJ1ZSxcbiAgICAgICAgICAgIGVuZERhdGU6IHRoaXMuZ2V0TW9udGhPZkNlbGwocm93ICogNCArIGNvbHVtbilcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlTW9udGhUYWJsZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVNb250aFRhYmxlQ2xpY2soZXZlbnQpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgfVxuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnRElWJykge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQudGFnTmFtZSAhPT0gJ1REJykgcmV0dXJuO1xuICAgICAgaWYgKE9iamVjdChkb21fW1wiaGFzQ2xhc3NcIl0pKHRhcmdldCwgJ2Rpc2FibGVkJykpIHJldHVybjtcbiAgICAgIHZhciBjb2x1bW4gPSB0YXJnZXQuY2VsbEluZGV4O1xuICAgICAgdmFyIHJvdyA9IHRhcmdldC5wYXJlbnROb2RlLnJvd0luZGV4O1xuICAgICAgdmFyIG1vbnRoID0gcm93ICogNCArIGNvbHVtbjtcbiAgICAgIHZhciBuZXdEYXRlID0gdGhpcy5nZXRNb250aE9mQ2VsbChtb250aCk7XG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIGlmICghdGhpcy5yYW5nZVN0YXRlLnNlbGVjdGluZykge1xuICAgICAgICAgIHRoaXMuJGVtaXQoJ3BpY2snLCB7IG1pbkRhdGU6IG5ld0RhdGUsIG1heERhdGU6IG51bGwgfSk7XG4gICAgICAgICAgdGhpcy5yYW5nZVN0YXRlLnNlbGVjdGluZyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG5ld0RhdGUgPj0gdGhpcy5taW5EYXRlKSB7XG4gICAgICAgICAgICB0aGlzLiRlbWl0KCdwaWNrJywgeyBtaW5EYXRlOiB0aGlzLm1pbkRhdGUsIG1heERhdGU6IG5ld0RhdGUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuJGVtaXQoJ3BpY2snLCB7IG1pbkRhdGU6IG5ld0RhdGUsIG1heERhdGU6IHRoaXMubWluRGF0ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5yYW5nZVN0YXRlLnNlbGVjdGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSB8fCBbXTtcbiAgICAgICAgdmFyIHllYXIgPSB0aGlzLmRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gT2JqZWN0KHV0aWxfW1wiYXJyYXlGaW5kSW5kZXhcIl0pKHZhbHVlLCBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHllYXIgJiYgZGF0ZS5nZXRNb250aCgpID09PSBtb250aDtcbiAgICAgICAgfSkgPj0gMCA/IG1vbnRoX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfcmVtb3ZlRnJvbUFycmF5KHZhbHVlLCBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICAgIHJldHVybiBkYXRlLmdldFRpbWUoKSA9PT0gbmV3RGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgIH0pIDogW10uY29uY2F0KHZhbHVlLCBbbmV3RGF0ZV0pO1xuICAgICAgICB0aGlzLiRlbWl0KCdwaWNrJywgbmV3VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4kZW1pdCgncGljaycsIG1vbnRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICByb3dzOiBmdW5jdGlvbiByb3dzKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIC8vIFRPRE86IHJlZmFjdG9yeSByb3dzIC8gZ2V0Q2VsbENsYXNzZXNcbiAgICAgIHZhciByb3dzID0gdGhpcy50YWJsZVJvd3M7XG4gICAgICB2YXIgZGlzYWJsZWREYXRlID0gdGhpcy5kaXNhYmxlZERhdGU7XG4gICAgICB2YXIgc2VsZWN0ZWREYXRlID0gW107XG4gICAgICB2YXIgbm93ID0gZ2V0TW9udGhUaW1lc3RhbXAobmV3IERhdGUoKSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuXG4gICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGopIHtcbiAgICAgICAgICB2YXIgY2VsbCA9IHJvd1tqXTtcbiAgICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICAgIGNlbGwgPSB7IHJvdzogaSwgY29sdW1uOiBqLCB0eXBlOiAnbm9ybWFsJywgaW5SYW5nZTogZmFsc2UsIHN0YXJ0OiBmYWxzZSwgZW5kOiBmYWxzZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNlbGwudHlwZSA9ICdub3JtYWwnO1xuXG4gICAgICAgICAgdmFyIGluZGV4ID0gaSAqIDQgKyBqO1xuICAgICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUoX3RoaXMyLmRhdGUuZ2V0RnVsbFllYXIoKSwgaW5kZXgpLmdldFRpbWUoKTtcbiAgICAgICAgICBjZWxsLmluUmFuZ2UgPSB0aW1lID49IGdldE1vbnRoVGltZXN0YW1wKF90aGlzMi5taW5EYXRlKSAmJiB0aW1lIDw9IGdldE1vbnRoVGltZXN0YW1wKF90aGlzMi5tYXhEYXRlKTtcbiAgICAgICAgICBjZWxsLnN0YXJ0ID0gX3RoaXMyLm1pbkRhdGUgJiYgdGltZSA9PT0gZ2V0TW9udGhUaW1lc3RhbXAoX3RoaXMyLm1pbkRhdGUpO1xuICAgICAgICAgIGNlbGwuZW5kID0gX3RoaXMyLm1heERhdGUgJiYgdGltZSA9PT0gZ2V0TW9udGhUaW1lc3RhbXAoX3RoaXMyLm1heERhdGUpO1xuICAgICAgICAgIHZhciBpc1RvZGF5ID0gdGltZSA9PT0gbm93O1xuXG4gICAgICAgICAgaWYgKGlzVG9kYXkpIHtcbiAgICAgICAgICAgIGNlbGwudHlwZSA9ICd0b2RheSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNlbGwudGV4dCA9IGluZGV4O1xuICAgICAgICAgIHZhciBjZWxsRGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgICAgICAgIGNlbGwuZGlzYWJsZWQgPSB0eXBlb2YgZGlzYWJsZWREYXRlID09PSAnZnVuY3Rpb24nICYmIGRpc2FibGVkRGF0ZShjZWxsRGF0ZSk7XG4gICAgICAgICAgY2VsbC5zZWxlY3RlZCA9IE9iamVjdCh1dGlsX1tcImFycmF5RmluZFwiXSkoc2VsZWN0ZWREYXRlLCBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpID09PSBjZWxsRGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBfdGhpczIuJHNldChyb3csIGosIGNlbGwpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgX2xvb3Aoaik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByb3dzO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy9tb250aC10YWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYmFzaWNfbW9udGhfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAobW9udGhfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL21vbnRoLXRhYmxlLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIG1vbnRoX3RhYmxlX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgYmFzaWNfbW9udGhfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1vbnRoX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNjU0ZDRmNDJfcmVuZGVyLFxuICBtb250aF90YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY1NGQ0ZjQyX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgbW9udGhfdGFibGVfYXBpOyB9XG5tb250aF90YWJsZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy9tb250aC10YWJsZS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbW9udGhfdGFibGUgPSAobW9udGhfdGFibGVfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvZGF0ZS10YWJsZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NWQxZjMzNDEmXG52YXIgZGF0ZV90YWJsZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVkMWYzMzQxX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcInRhYmxlXCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtZGF0ZS10YWJsZVwiLFxuICAgICAgY2xhc3M6IHsgXCJpcy13ZWVrLW1vZGVcIjogX3ZtLnNlbGVjdGlvbk1vZGUgPT09IFwid2Vla1wiIH0sXG4gICAgICBhdHRyczogeyBjZWxsc3BhY2luZzogXCIwXCIsIGNlbGxwYWRkaW5nOiBcIjBcIiB9LFxuICAgICAgb246IHsgY2xpY2s6IF92bS5oYW5kbGVDbGljaywgbW91c2Vtb3ZlOiBfdm0uaGFuZGxlTW91c2VNb3ZlIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFxuICAgICAgICBcInRib2R5XCIsXG4gICAgICAgIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwidHJcIixcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX3ZtLnNob3dXZWVrTnVtYmVyXG4gICAgICAgICAgICAgICAgPyBfYyhcInRoXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50KFwiZWwuZGF0ZXBpY2tlci53ZWVrXCIpKSldKVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgIF92bS5fbChfdm0uV0VFS1MsIGZ1bmN0aW9uKHdlZWssIGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfYyhcInRoXCIsIHsga2V5OiBrZXkgfSwgW1xuICAgICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0udChcImVsLmRhdGVwaWNrZXIud2Vla3MuXCIgKyB3ZWVrKSkpXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfdm0uX2woX3ZtLnJvd3MsIGZ1bmN0aW9uKHJvdywga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgIFwidHJcIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWRhdGUtdGFibGVfX3Jvd1wiLFxuICAgICAgICAgICAgICAgIGNsYXNzOiB7IGN1cnJlbnQ6IF92bS5pc1dlZWtBY3RpdmUocm93WzFdKSB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF92bS5fbChyb3csIGZ1bmN0aW9uKGNlbGwsIGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfYyhcInRkXCIsIHsga2V5OiBrZXksIGNsYXNzOiBfdm0uZ2V0Q2VsbENsYXNzZXMoY2VsbCkgfSwgW1xuICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgW1xuICAgICAgICAgICAgICAgICAgICBfYyhcInNwYW5cIiwgW1xuICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcIlxcbiAgICAgICAgICBcIiArIF92bS5fcyhjZWxsLnRleHQpICsgXCJcXG4gICAgICAgIFwiKVxuICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG4gICAgICAgIF0sXG4gICAgICAgIDJcbiAgICAgIClcbiAgICBdXG4gIClcbn1cbnZhciBkYXRlX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQxZjMzNDFfc3RhdGljUmVuZGVyRm5zID0gW11cbmRhdGVfdGFibGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF81ZDFmMzM0MV9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy9kYXRlLXRhYmxlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01ZDFmMzM0MSZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL2Jhc2ljL2RhdGUtdGFibGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cbnZhciBfV0VFS1MgPSBbJ3N1bicsICdtb24nLCAndHVlJywgJ3dlZCcsICd0aHUnLCAnZnJpJywgJ3NhdCddO1xudmFyIGRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19nZXREYXRlVGltZXN0YW1wID0gZnVuY3Rpb24gZ2V0RGF0ZVRpbWVzdGFtcCh0aW1lKSB7XG4gIGlmICh0eXBlb2YgdGltZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHRpbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIE9iamVjdChkYXRlX3V0aWxfW1wiY2xlYXJUaW1lXCJdKShuZXcgRGF0ZSh0aW1lKSkuZ2V0VGltZSgpO1xuICB9IGVsc2UgaWYgKHRpbWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIE9iamVjdChkYXRlX3V0aWxfW1wiY2xlYXJUaW1lXCJdKSh0aW1lKS5nZXRUaW1lKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxufTtcblxuLy8gcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgc2F0aXNmaWVzIGBwcmVkYCBmcm9tIGFyclxuLy8gcmV0dXJuIGEgbmV3IGFycmF5IGlmIG1vZGlmaWNhdGlvbiBvY2N1cnNcbi8vIHJldHVybiB0aGUgb3JpZ2luYWwgYXJyYXkgb3RoZXJ3aXNlXG52YXIgZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX3JlbW92ZUZyb21BcnJheSA9IGZ1bmN0aW9uIHJlbW92ZUZyb21BcnJheShhcnIsIHByZWQpIHtcbiAgdmFyIGlkeCA9IHR5cGVvZiBwcmVkID09PSAnZnVuY3Rpb24nID8gT2JqZWN0KHV0aWxfW1wiYXJyYXlGaW5kSW5kZXhcIl0pKGFyciwgcHJlZCkgOiBhcnIuaW5kZXhPZihwcmVkKTtcbiAgcmV0dXJuIGlkeCA+PSAwID8gW10uY29uY2F0KGFyci5zbGljZSgwLCBpZHgpLCBhcnIuc2xpY2UoaWR4ICsgMSkpIDogYXJyO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG1peGluczogW2xvY2FsZV9kZWZhdWx0LmFdLFxuXG4gIHByb3BzOiB7XG4gICAgZmlyc3REYXlPZldlZWs6IHtcbiAgICAgIGRlZmF1bHQ6IDcsXG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpIHtcbiAgICAgICAgcmV0dXJuIHZhbCA+PSAxICYmIHZhbCA8PSA3O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICB2YWx1ZToge30sXG5cbiAgICBkZWZhdWx0VmFsdWU6IHtcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAgICAgICAvLyBlaXRoZXI6IG51bGwsIHZhbGlkIERhdGUgb2JqZWN0LCBBcnJheSBvZiB2YWxpZCBEYXRlIG9iamVjdHNcbiAgICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCB8fCBPYmplY3QoZGF0ZV91dGlsX1tcImlzRGF0ZVwiXSkodmFsKSB8fCBBcnJheS5pc0FycmF5KHZhbCkgJiYgdmFsLmV2ZXJ5KGRhdGVfdXRpbF9bXCJpc0RhdGVcIl0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBkYXRlOiB7fSxcblxuICAgIHNlbGVjdGlvbk1vZGU6IHtcbiAgICAgIGRlZmF1bHQ6ICdkYXknXG4gICAgfSxcblxuICAgIHNob3dXZWVrTnVtYmVyOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuXG4gICAgZGlzYWJsZWREYXRlOiB7fSxcblxuICAgIGNlbGxDbGFzc05hbWU6IHt9LFxuXG4gICAgbWluRGF0ZToge30sXG5cbiAgICBtYXhEYXRlOiB7fSxcblxuICAgIHJhbmdlU3RhdGU6IHtcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVuZERhdGU6IG51bGwsXG4gICAgICAgICAgc2VsZWN0aW5nOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG9mZnNldERheTogZnVuY3Rpb24gb2Zmc2V0RGF5KCkge1xuICAgICAgdmFyIHdlZWsgPSB0aGlzLmZpcnN0RGF5T2ZXZWVrO1xuICAgICAgLy8g5ZGo5pel5Li655WM6ZmQ77yM5bem5Y+z5YGP56e755qE5aSp5pWw77yMMzIxNzY1NCDkvovlpoLlkajkuIDlsLHmmK8gLTHvvIznm67nmoTmmK/osIPmlbTliY3kuKTooYzml6XmnJ/nmoTkvY3nva5cbiAgICAgIHJldHVybiB3ZWVrID4gMyA/IDcgLSB3ZWVrIDogLXdlZWs7XG4gICAgfSxcbiAgICBXRUVLUzogZnVuY3Rpb24gV0VFS1MoKSB7XG4gICAgICB2YXIgd2VlayA9IHRoaXMuZmlyc3REYXlPZldlZWs7XG4gICAgICByZXR1cm4gX1dFRUtTLmNvbmNhdChfV0VFS1MpLnNsaWNlKHdlZWssIHdlZWsgKyA3KTtcbiAgICB9LFxuICAgIHllYXI6IGZ1bmN0aW9uIHllYXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgfSxcbiAgICBtb250aDogZnVuY3Rpb24gbW9udGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRlLmdldE1vbnRoKCk7XG4gICAgfSxcbiAgICBzdGFydERhdGU6IGZ1bmN0aW9uIHN0YXJ0RGF0ZSgpIHtcbiAgICAgIHJldHVybiBPYmplY3QoZGF0ZV91dGlsX1tcImdldFN0YXJ0RGF0ZU9mTW9udGhcIl0pKHRoaXMueWVhciwgdGhpcy5tb250aCk7XG4gICAgfSxcbiAgICByb3dzOiBmdW5jdGlvbiByb3dzKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgLy8gVE9ETzogcmVmYWN0b3J5IHJvd3MgLyBnZXRDZWxsQ2xhc3Nlc1xuICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIDEpO1xuICAgICAgdmFyIGRheSA9IE9iamVjdChkYXRlX3V0aWxfW1wiZ2V0Rmlyc3REYXlPZk1vbnRoXCJdKShkYXRlKTsgLy8gZGF5IG9mIGZpcnN0IGRheVxuICAgICAgdmFyIGRhdGVDb3VudE9mTW9udGggPSBPYmplY3QoZGF0ZV91dGlsX1tcImdldERheUNvdW50T2ZNb250aFwiXSkoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkpO1xuICAgICAgdmFyIGRhdGVDb3VudE9mTGFzdE1vbnRoID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJnZXREYXlDb3VudE9mTW9udGhcIl0pKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpID09PSAwID8gMTEgOiBkYXRlLmdldE1vbnRoKCkgLSAxKTtcblxuICAgICAgZGF5ID0gZGF5ID09PSAwID8gNyA6IGRheTtcblxuICAgICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0RGF5O1xuICAgICAgdmFyIHJvd3MgPSB0aGlzLnRhYmxlUm93cztcbiAgICAgIHZhciBjb3VudCA9IDE7XG5cbiAgICAgIHZhciBzdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZTtcbiAgICAgIHZhciBkaXNhYmxlZERhdGUgPSB0aGlzLmRpc2FibGVkRGF0ZTtcbiAgICAgIHZhciBjZWxsQ2xhc3NOYW1lID0gdGhpcy5jZWxsQ2xhc3NOYW1lO1xuICAgICAgdmFyIHNlbGVjdGVkRGF0ZSA9IHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ2RhdGVzJyA/IE9iamVjdCh1dGlsX1tcImNvZXJjZVRydXRoeVZhbHVlVG9BcnJheVwiXSkodGhpcy52YWx1ZSkgOiBbXTtcbiAgICAgIHZhciBub3cgPSBkYXRlX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZ2V0RGF0ZVRpbWVzdGFtcChuZXcgRGF0ZSgpKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgdmFyIHJvdyA9IHJvd3NbaV07XG5cbiAgICAgICAgaWYgKHRoaXMuc2hvd1dlZWtOdW1iZXIpIHtcbiAgICAgICAgICBpZiAoIXJvd1swXSkge1xuICAgICAgICAgICAgcm93WzBdID0geyB0eXBlOiAnd2VlaycsIHRleHQ6IE9iamVjdChkYXRlX3V0aWxfW1wiZ2V0V2Vla051bWJlclwiXSkoT2JqZWN0KGRhdGVfdXRpbF9bXCJuZXh0RGF0ZVwiXSkoc3RhcnREYXRlLCBpICogNyArIDEpKSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGopIHtcbiAgICAgICAgICB2YXIgY2VsbCA9IHJvd1tfdGhpcy5zaG93V2Vla051bWJlciA/IGogKyAxIDogal07XG4gICAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICBjZWxsID0geyByb3c6IGksIGNvbHVtbjogaiwgdHlwZTogJ25vcm1hbCcsIGluUmFuZ2U6IGZhbHNlLCBzdGFydDogZmFsc2UsIGVuZDogZmFsc2UgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjZWxsLnR5cGUgPSAnbm9ybWFsJztcblxuICAgICAgICAgIHZhciBpbmRleCA9IGkgKiA3ICsgajtcbiAgICAgICAgICB2YXIgdGltZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dERhdGVcIl0pKHN0YXJ0RGF0ZSwgaW5kZXggLSBvZmZzZXQpLmdldFRpbWUoKTtcbiAgICAgICAgICBjZWxsLmluUmFuZ2UgPSB0aW1lID49IGRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19nZXREYXRlVGltZXN0YW1wKF90aGlzLm1pbkRhdGUpICYmIHRpbWUgPD0gZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2dldERhdGVUaW1lc3RhbXAoX3RoaXMubWF4RGF0ZSk7XG4gICAgICAgICAgY2VsbC5zdGFydCA9IF90aGlzLm1pbkRhdGUgJiYgdGltZSA9PT0gZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2dldERhdGVUaW1lc3RhbXAoX3RoaXMubWluRGF0ZSk7XG4gICAgICAgICAgY2VsbC5lbmQgPSBfdGhpcy5tYXhEYXRlICYmIHRpbWUgPT09IGRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19nZXREYXRlVGltZXN0YW1wKF90aGlzLm1heERhdGUpO1xuICAgICAgICAgIHZhciBpc1RvZGF5ID0gdGltZSA9PT0gbm93O1xuXG4gICAgICAgICAgaWYgKGlzVG9kYXkpIHtcbiAgICAgICAgICAgIGNlbGwudHlwZSA9ICd0b2RheSc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGkgPj0gMCAmJiBpIDw9IDEpIHtcbiAgICAgICAgICAgIHZhciBudW1iZXJPZkRheXNGcm9tUHJldmlvdXNNb250aCA9IGRheSArIG9mZnNldCA8IDAgPyA3ICsgZGF5ICsgb2Zmc2V0IDogZGF5ICsgb2Zmc2V0O1xuXG4gICAgICAgICAgICBpZiAoaiArIGkgKiA3ID49IG51bWJlck9mRGF5c0Zyb21QcmV2aW91c01vbnRoKSB7XG4gICAgICAgICAgICAgIGNlbGwudGV4dCA9IGNvdW50Kys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjZWxsLnRleHQgPSBkYXRlQ291bnRPZkxhc3RNb250aCAtIChudW1iZXJPZkRheXNGcm9tUHJldmlvdXNNb250aCAtIGogJSA3KSArIDEgKyBpICogNztcbiAgICAgICAgICAgICAgY2VsbC50eXBlID0gJ3ByZXYtbW9udGgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY291bnQgPD0gZGF0ZUNvdW50T2ZNb250aCkge1xuICAgICAgICAgICAgICBjZWxsLnRleHQgPSBjb3VudCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2VsbC50ZXh0ID0gY291bnQrKyAtIGRhdGVDb3VudE9mTW9udGg7XG4gICAgICAgICAgICAgIGNlbGwudHlwZSA9ICduZXh0LW1vbnRoJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY2VsbERhdGUgPSBuZXcgRGF0ZSh0aW1lKTtcbiAgICAgICAgICBjZWxsLmRpc2FibGVkID0gdHlwZW9mIGRpc2FibGVkRGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkaXNhYmxlZERhdGUoY2VsbERhdGUpO1xuICAgICAgICAgIGNlbGwuc2VsZWN0ZWQgPSBPYmplY3QodXRpbF9bXCJhcnJheUZpbmRcIl0pKHNlbGVjdGVkRGF0ZSwgZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldFRpbWUoKSA9PT0gY2VsbERhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNlbGwuY3VzdG9tQ2xhc3MgPSB0eXBlb2YgY2VsbENsYXNzTmFtZSA9PT0gJ2Z1bmN0aW9uJyAmJiBjZWxsQ2xhc3NOYW1lKGNlbGxEYXRlKTtcbiAgICAgICAgICBfdGhpcy4kc2V0KHJvdywgX3RoaXMuc2hvd1dlZWtOdW1iZXIgPyBqICsgMSA6IGosIGNlbGwpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNzsgaisrKSB7XG4gICAgICAgICAgX2xvb3Aoaik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnd2VlaycpIHtcbiAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNob3dXZWVrTnVtYmVyID8gMSA6IDA7XG4gICAgICAgICAgdmFyIGVuZCA9IHRoaXMuc2hvd1dlZWtOdW1iZXIgPyA3IDogNjtcbiAgICAgICAgICB2YXIgaXNXZWVrQWN0aXZlID0gdGhpcy5pc1dlZWtBY3RpdmUocm93W3N0YXJ0ICsgMV0pO1xuXG4gICAgICAgICAgcm93W3N0YXJ0XS5pblJhbmdlID0gaXNXZWVrQWN0aXZlO1xuICAgICAgICAgIHJvd1tzdGFydF0uc3RhcnQgPSBpc1dlZWtBY3RpdmU7XG4gICAgICAgICAgcm93W2VuZF0uaW5SYW5nZSA9IGlzV2Vla0FjdGl2ZTtcbiAgICAgICAgICByb3dbZW5kXS5lbmQgPSBpc1dlZWtBY3RpdmU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgJ3JhbmdlU3RhdGUuZW5kRGF0ZSc6IGZ1bmN0aW9uIHJhbmdlU3RhdGVFbmREYXRlKG5ld1ZhbCkge1xuICAgICAgdGhpcy5tYXJrUmFuZ2UodGhpcy5taW5EYXRlLCBuZXdWYWwpO1xuICAgIH0sXG4gICAgbWluRGF0ZTogZnVuY3Rpb24gbWluRGF0ZShuZXdWYWwsIG9sZFZhbCkge1xuICAgICAgaWYgKGRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19nZXREYXRlVGltZXN0YW1wKG5ld1ZhbCkgIT09IGRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19nZXREYXRlVGltZXN0YW1wKG9sZFZhbCkpIHtcbiAgICAgICAgdGhpcy5tYXJrUmFuZ2UodGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbWF4RGF0ZTogZnVuY3Rpb24gbWF4RGF0ZShuZXdWYWwsIG9sZFZhbCkge1xuICAgICAgaWYgKGRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19nZXREYXRlVGltZXN0YW1wKG5ld1ZhbCkgIT09IGRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19nZXREYXRlVGltZXN0YW1wKG9sZFZhbCkpIHtcbiAgICAgICAgdGhpcy5tYXJrUmFuZ2UodGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YWJsZVJvd3M6IFtbXSwgW10sIFtdLCBbXSwgW10sIFtdXSxcbiAgICAgIGxhc3RSb3c6IG51bGwsXG4gICAgICBsYXN0Q29sdW1uOiBudWxsXG4gICAgfTtcbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBjZWxsTWF0Y2hlc0RhdGU6IGZ1bmN0aW9uIGNlbGxNYXRjaGVzRGF0ZShjZWxsLCBkYXRlKSB7XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgIHJldHVybiB0aGlzLnllYXIgPT09IHZhbHVlLmdldEZ1bGxZZWFyKCkgJiYgdGhpcy5tb250aCA9PT0gdmFsdWUuZ2V0TW9udGgoKSAmJiBOdW1iZXIoY2VsbC50ZXh0KSA9PT0gdmFsdWUuZ2V0RGF0ZSgpO1xuICAgIH0sXG4gICAgZ2V0Q2VsbENsYXNzZXM6IGZ1bmN0aW9uIGdldENlbGxDbGFzc2VzKGNlbGwpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgc2VsZWN0aW9uTW9kZSA9IHRoaXMuc2VsZWN0aW9uTW9kZTtcbiAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZSA/IEFycmF5LmlzQXJyYXkodGhpcy5kZWZhdWx0VmFsdWUpID8gdGhpcy5kZWZhdWx0VmFsdWUgOiBbdGhpcy5kZWZhdWx0VmFsdWVdIDogW107XG5cbiAgICAgIHZhciBjbGFzc2VzID0gW107XG4gICAgICBpZiAoKGNlbGwudHlwZSA9PT0gJ25vcm1hbCcgfHwgY2VsbC50eXBlID09PSAndG9kYXknKSAmJiAhY2VsbC5kaXNhYmxlZCkge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2F2YWlsYWJsZScpO1xuICAgICAgICBpZiAoY2VsbC50eXBlID09PSAndG9kYXknKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCd0b2RheScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc2VzLnB1c2goY2VsbC50eXBlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwudHlwZSA9PT0gJ25vcm1hbCcgJiYgZGVmYXVsdFZhbHVlLnNvbWUoZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5jZWxsTWF0Y2hlc0RhdGUoY2VsbCwgZGF0ZSk7XG4gICAgICB9KSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2RlZmF1bHQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdkYXknICYmIChjZWxsLnR5cGUgPT09ICdub3JtYWwnIHx8IGNlbGwudHlwZSA9PT0gJ3RvZGF5JykgJiYgdGhpcy5jZWxsTWF0Y2hlc0RhdGUoY2VsbCwgdGhpcy52YWx1ZSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdjdXJyZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZWxsLmluUmFuZ2UgJiYgKGNlbGwudHlwZSA9PT0gJ25vcm1hbCcgfHwgY2VsbC50eXBlID09PSAndG9kYXknIHx8IHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3dlZWsnKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2luLXJhbmdlJyk7XG5cbiAgICAgICAgaWYgKGNlbGwuc3RhcnQpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ3N0YXJ0LWRhdGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjZWxsLmVuZCkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnZW5kLWRhdGUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5kaXNhYmxlZCkge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2Rpc2FibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZWxsLnNlbGVjdGVkKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnc2VsZWN0ZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwuY3VzdG9tQ2xhc3MpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGNlbGwuY3VzdG9tQ2xhc3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfSxcbiAgICBnZXREYXRlT2ZDZWxsOiBmdW5jdGlvbiBnZXREYXRlT2ZDZWxsKHJvdywgY29sdW1uKSB7XG4gICAgICB2YXIgb2Zmc2V0RnJvbVN0YXJ0ID0gcm93ICogNyArIChjb2x1bW4gLSAodGhpcy5zaG93V2Vla051bWJlciA/IDEgOiAwKSkgLSB0aGlzLm9mZnNldERheTtcbiAgICAgIHJldHVybiBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHREYXRlXCJdKSh0aGlzLnN0YXJ0RGF0ZSwgb2Zmc2V0RnJvbVN0YXJ0KTtcbiAgICB9LFxuICAgIGlzV2Vla0FjdGl2ZTogZnVuY3Rpb24gaXNXZWVrQWN0aXZlKGNlbGwpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgIT09ICd3ZWVrJykgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIG5ld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIDEpO1xuICAgICAgdmFyIHllYXIgPSBuZXdEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICB2YXIgbW9udGggPSBuZXdEYXRlLmdldE1vbnRoKCk7XG5cbiAgICAgIGlmIChjZWxsLnR5cGUgPT09ICdwcmV2LW1vbnRoJykge1xuICAgICAgICBuZXdEYXRlLnNldE1vbnRoKG1vbnRoID09PSAwID8gMTEgOiBtb250aCAtIDEpO1xuICAgICAgICBuZXdEYXRlLnNldEZ1bGxZZWFyKG1vbnRoID09PSAwID8geWVhciAtIDEgOiB5ZWFyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwudHlwZSA9PT0gJ25leHQtbW9udGgnKSB7XG4gICAgICAgIG5ld0RhdGUuc2V0TW9udGgobW9udGggPT09IDExID8gMCA6IG1vbnRoICsgMSk7XG4gICAgICAgIG5ld0RhdGUuc2V0RnVsbFllYXIobW9udGggPT09IDExID8geWVhciArIDEgOiB5ZWFyKTtcbiAgICAgIH1cblxuICAgICAgbmV3RGF0ZS5zZXREYXRlKHBhcnNlSW50KGNlbGwudGV4dCwgMTApKTtcblxuICAgICAgaWYgKE9iamVjdChkYXRlX3V0aWxfW1wiaXNEYXRlXCJdKSh0aGlzLnZhbHVlKSkge1xuICAgICAgICB2YXIgZGF5T2Zmc2V0ID0gKHRoaXMudmFsdWUuZ2V0RGF5KCkgLSB0aGlzLmZpcnN0RGF5T2ZXZWVrICsgNykgJSA3IC0gMTtcbiAgICAgICAgdmFyIHdlZWtEYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJwcmV2RGF0ZVwiXSkodGhpcy52YWx1ZSwgZGF5T2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHdlZWtEYXRlLmdldFRpbWUoKSA9PT0gbmV3RGF0ZS5nZXRUaW1lKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBtYXJrUmFuZ2U6IGZ1bmN0aW9uIG1hcmtSYW5nZShtaW5EYXRlLCBtYXhEYXRlKSB7XG4gICAgICBtaW5EYXRlID0gZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2dldERhdGVUaW1lc3RhbXAobWluRGF0ZSk7XG4gICAgICBtYXhEYXRlID0gZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2dldERhdGVUaW1lc3RhbXAobWF4RGF0ZSkgfHwgbWluRGF0ZTtcbiAgICAgIHZhciBfcmVmID0gW01hdGgubWluKG1pbkRhdGUsIG1heERhdGUpLCBNYXRoLm1heChtaW5EYXRlLCBtYXhEYXRlKV07XG4gICAgICBtaW5EYXRlID0gX3JlZlswXTtcbiAgICAgIG1heERhdGUgPSBfcmVmWzFdO1xuXG5cbiAgICAgIHZhciBzdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZTtcbiAgICAgIHZhciByb3dzID0gdGhpcy5yb3dzO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGsgPSByb3dzLmxlbmd0aDsgaSA8IGs7IGkrKykge1xuICAgICAgICB2YXIgcm93ID0gcm93c1tpXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDAsIGwgPSByb3cubGVuZ3RoOyBqIDwgbDsgaisrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2hvd1dlZWtOdW1iZXIgJiYgaiA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICB2YXIgX2NlbGwgPSByb3dbal07XG4gICAgICAgICAgdmFyIGluZGV4ID0gaSAqIDcgKyBqICsgKHRoaXMuc2hvd1dlZWtOdW1iZXIgPyAtMSA6IDApO1xuICAgICAgICAgIHZhciB0aW1lID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJuZXh0RGF0ZVwiXSkoc3RhcnREYXRlLCBpbmRleCAtIHRoaXMub2Zmc2V0RGF5KS5nZXRUaW1lKCk7XG5cbiAgICAgICAgICBfY2VsbC5pblJhbmdlID0gbWluRGF0ZSAmJiB0aW1lID49IG1pbkRhdGUgJiYgdGltZSA8PSBtYXhEYXRlO1xuICAgICAgICAgIF9jZWxsLnN0YXJ0ID0gbWluRGF0ZSAmJiB0aW1lID09PSBtaW5EYXRlO1xuICAgICAgICAgIF9jZWxsLmVuZCA9IG1heERhdGUgJiYgdGltZSA9PT0gbWF4RGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlTW91c2VNb3ZlOiBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5yYW5nZVN0YXRlLnNlbGVjdGluZykgcmV0dXJuO1xuXG4gICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnU1BBTicpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0RJVicpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgIT09ICdURCcpIHJldHVybjtcblxuICAgICAgdmFyIHJvdyA9IHRhcmdldC5wYXJlbnROb2RlLnJvd0luZGV4IC0gMTtcbiAgICAgIHZhciBjb2x1bW4gPSB0YXJnZXQuY2VsbEluZGV4O1xuXG4gICAgICAvLyBjYW4gbm90IHNlbGVjdCBkaXNhYmxlZCBkYXRlXG4gICAgICBpZiAodGhpcy5yb3dzW3Jvd11bY29sdW1uXS5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgICAvLyBvbmx5IHVwZGF0ZSByYW5nZVN0YXRlIHdoZW4gbW91c2UgbW92ZXMgdG8gYSBuZXcgY2VsbFxuICAgICAgLy8gdGhpcyBhdm9pZHMgZnJlcXVlbnQgRGF0ZSBvYmplY3QgY3JlYXRpb24gYW5kIGltcHJvdmVzIHBlcmZvcm1hbmNlXG4gICAgICBpZiAocm93ICE9PSB0aGlzLmxhc3RSb3cgfHwgY29sdW1uICE9PSB0aGlzLmxhc3RDb2x1bW4pIHtcbiAgICAgICAgdGhpcy5sYXN0Um93ID0gcm93O1xuICAgICAgICB0aGlzLmxhc3RDb2x1bW4gPSBjb2x1bW47XG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZXJhbmdlJywge1xuICAgICAgICAgIG1pbkRhdGU6IHRoaXMubWluRGF0ZSxcbiAgICAgICAgICBtYXhEYXRlOiB0aGlzLm1heERhdGUsXG4gICAgICAgICAgcmFuZ2VTdGF0ZToge1xuICAgICAgICAgICAgc2VsZWN0aW5nOiB0cnVlLFxuICAgICAgICAgICAgZW5kRGF0ZTogdGhpcy5nZXREYXRlT2ZDZWxsKHJvdywgY29sdW1uKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVDbGljazogZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdTUEFOJykge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgfVxuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnRElWJykge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRhcmdldC50YWdOYW1lICE9PSAnVEQnKSByZXR1cm47XG5cbiAgICAgIHZhciByb3cgPSB0YXJnZXQucGFyZW50Tm9kZS5yb3dJbmRleCAtIDE7XG4gICAgICB2YXIgY29sdW1uID0gdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnd2VlaycgPyAxIDogdGFyZ2V0LmNlbGxJbmRleDtcbiAgICAgIHZhciBjZWxsID0gdGhpcy5yb3dzW3Jvd11bY29sdW1uXTtcblxuICAgICAgaWYgKGNlbGwuZGlzYWJsZWQgfHwgY2VsbC50eXBlID09PSAnd2VlaycpIHJldHVybjtcblxuICAgICAgdmFyIG5ld0RhdGUgPSB0aGlzLmdldERhdGVPZkNlbGwocm93LCBjb2x1bW4pO1xuXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIGlmICghdGhpcy5yYW5nZVN0YXRlLnNlbGVjdGluZykge1xuICAgICAgICAgIHRoaXMuJGVtaXQoJ3BpY2snLCB7IG1pbkRhdGU6IG5ld0RhdGUsIG1heERhdGU6IG51bGwgfSk7XG4gICAgICAgICAgdGhpcy5yYW5nZVN0YXRlLnNlbGVjdGluZyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG5ld0RhdGUgPj0gdGhpcy5taW5EYXRlKSB7XG4gICAgICAgICAgICB0aGlzLiRlbWl0KCdwaWNrJywgeyBtaW5EYXRlOiB0aGlzLm1pbkRhdGUsIG1heERhdGU6IG5ld0RhdGUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuJGVtaXQoJ3BpY2snLCB7IG1pbkRhdGU6IG5ld0RhdGUsIG1heERhdGU6IHRoaXMubWluRGF0ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5yYW5nZVN0YXRlLnNlbGVjdGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ2RheScpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgncGljaycsIG5ld0RhdGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICd3ZWVrJykge1xuICAgICAgICB2YXIgd2Vla051bWJlciA9IE9iamVjdChkYXRlX3V0aWxfW1wiZ2V0V2Vla051bWJlclwiXSkobmV3RGF0ZSk7XG4gICAgICAgIHZhciB2YWx1ZSA9IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSArICd3JyArIHdlZWtOdW1iZXI7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3BpY2snLCB7XG4gICAgICAgICAgeWVhcjogbmV3RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgIHdlZWs6IHdlZWtOdW1iZXIsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIGRhdGU6IG5ld0RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ2RhdGVzJykge1xuICAgICAgICB2YXIgX3ZhbHVlID0gdGhpcy52YWx1ZSB8fCBbXTtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gY2VsbC5zZWxlY3RlZCA/IGRhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19yZW1vdmVGcm9tQXJyYXkoX3ZhbHVlLCBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICAgIHJldHVybiBkYXRlLmdldFRpbWUoKSA9PT0gbmV3RGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgIH0pIDogW10uY29uY2F0KF92YWx1ZSwgW25ld0RhdGVdKTtcbiAgICAgICAgdGhpcy4kZW1pdCgncGljaycsIG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvYmFzaWMvZGF0ZS10YWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYmFzaWNfZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChkYXRlX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy9kYXRlLXRhYmxlLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGRhdGVfdGFibGVfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBiYXNpY19kYXRlX3RhYmxldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBkYXRlX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQxZjMzNDFfcmVuZGVyLFxuICBkYXRlX3RhYmxldnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQxZjMzNDFfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBkYXRlX3RhYmxlX2FwaTsgfVxuZGF0ZV90YWJsZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9iYXNpYy9kYXRlLXRhYmxlLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkYXRlX3RhYmxlID0gKGRhdGVfdGFibGVfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL2RhdGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZGF0ZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG1peGluczogW2xvY2FsZV9kZWZhdWx0LmFdLFxuXG4gIGRpcmVjdGl2ZXM6IHsgQ2xpY2tvdXRzaWRlOiBjbGlja291dHNpZGVfZGVmYXVsdC5hIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBzaG93VGltZTogZnVuY3Rpb24gc2hvd1RpbWUodmFsKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoXykge1xuICAgICAgICB2YXIgaW5wdXRFbG0gPSBfdGhpcy4kcmVmcy5pbnB1dC4kZWw7XG4gICAgICAgIGlmIChpbnB1dEVsbSkge1xuICAgICAgICAgIF90aGlzLnBpY2tlcldpZHRoID0gaW5wdXRFbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKyAxMDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnZGF0ZXMnICYmIHRoaXMudmFsdWUpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtb250aHMnICYmIHRoaXMudmFsdWUpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICd5ZWFycycgJiYgdGhpcy52YWx1ZSkgcmV0dXJuO1xuICAgICAgaWYgKE9iamVjdChkYXRlX3V0aWxfW1wiaXNEYXRlXCJdKSh2YWwpKSB7XG4gICAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRhdGUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VmFsdWUodmFsKSB7XG4gICAgICBpZiAoIU9iamVjdChkYXRlX3V0aWxfW1wiaXNEYXRlXCJdKSh0aGlzLnZhbHVlKSkge1xuICAgICAgICB0aGlzLmRhdGUgPSB2YWwgPyBuZXcgRGF0ZSh2YWwpIDogbmV3IERhdGUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHRpbWVQaWNrZXJWaXNpYmxlOiBmdW5jdGlvbiB0aW1lUGlja2VyVmlzaWJsZSh2YWwpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodmFsKSB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuJHJlZnMudGltZXBpY2tlci5hZGp1c3RTcGlubmVycygpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBzZWxlY3Rpb25Nb2RlOiBmdW5jdGlvbiBzZWxlY3Rpb25Nb2RlKG5ld1ZhbCkge1xuICAgICAgaWYgKG5ld1ZhbCA9PT0gJ21vbnRoJykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50VmlldyAhPT0gJ3llYXInIHx8IHRoaXMuY3VycmVudFZpZXcgIT09ICdtb250aCcpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ21vbnRoJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChuZXdWYWwgPT09ICdkYXRlcycpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICdkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAobmV3VmFsID09PSAneWVhcnMnKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAneWVhcic7XG4gICAgICB9IGVsc2UgaWYgKG5ld1ZhbCA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICdtb250aCc7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBwcm94eVRpbWVQaWNrZXJEYXRhUHJvcGVydGllczogZnVuY3Rpb24gcHJveHlUaW1lUGlja2VyRGF0YVByb3BlcnRpZXMoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIGZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdCh0aW1lRm9ybWF0KSB7XG4gICAgICAgIF90aGlzMy4kcmVmcy50aW1lcGlja2VyLmZvcm1hdCA9IHRpbWVGb3JtYXQ7XG4gICAgICB9O1xuICAgICAgdmFyIHZhbHVlID0gZnVuY3Rpb24gdmFsdWUoX3ZhbHVlKSB7XG4gICAgICAgIF90aGlzMy4kcmVmcy50aW1lcGlja2VyLnZhbHVlID0gX3ZhbHVlO1xuICAgICAgfTtcbiAgICAgIHZhciBkYXRlID0gZnVuY3Rpb24gZGF0ZShfZGF0ZSkge1xuICAgICAgICBfdGhpczMuJHJlZnMudGltZXBpY2tlci5kYXRlID0gX2RhdGU7XG4gICAgICB9O1xuICAgICAgdmFyIHNlbGVjdGFibGVSYW5nZSA9IGZ1bmN0aW9uIHNlbGVjdGFibGVSYW5nZShfc2VsZWN0YWJsZVJhbmdlKSB7XG4gICAgICAgIF90aGlzMy4kcmVmcy50aW1lcGlja2VyLnNlbGVjdGFibGVSYW5nZSA9IF9zZWxlY3RhYmxlUmFuZ2U7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLiR3YXRjaCgndmFsdWUnLCB2YWx1ZSk7XG4gICAgICB0aGlzLiR3YXRjaCgnZGF0ZScsIGRhdGUpO1xuICAgICAgdGhpcy4kd2F0Y2goJ3NlbGVjdGFibGVSYW5nZScsIHNlbGVjdGFibGVSYW5nZSk7XG5cbiAgICAgIGZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpO1xuICAgICAgdmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICBkYXRlKHRoaXMuZGF0ZSk7XG4gICAgICBzZWxlY3RhYmxlUmFuZ2UodGhpcy5zZWxlY3RhYmxlUmFuZ2UpO1xuICAgIH0sXG4gICAgaGFuZGxlQ2xlYXI6IGZ1bmN0aW9uIGhhbmRsZUNsZWFyKCkge1xuICAgICAgdGhpcy5kYXRlID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoKTtcbiAgICAgIHRoaXMuJGVtaXQoJ3BpY2snLCBudWxsKTtcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uIGVtaXQodmFsdWUpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdC5hcHBseSh0aGlzLCBbJ3BpY2snLCB2YWx1ZV0uY29uY2F0KGFyZ3MpKTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIGRhdGVzID0gdmFsdWUubWFwKGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNC5zaG93VGltZSA/IE9iamVjdChkYXRlX3V0aWxfW1wiY2xlYXJNaWxsaXNlY29uZHNcIl0pKGRhdGUpIDogT2JqZWN0KGRhdGVfdXRpbF9bXCJjbGVhclRpbWVcIl0pKGRhdGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4kZW1pdC5hcHBseSh0aGlzLCBbJ3BpY2snLCBkYXRlc10uY29uY2F0KGFyZ3MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuJGVtaXQuYXBwbHkodGhpcywgWydwaWNrJywgdGhpcy5zaG93VGltZSA/IE9iamVjdChkYXRlX3V0aWxfW1wiY2xlYXJNaWxsaXNlY29uZHNcIl0pKHZhbHVlKSA6IE9iamVjdChkYXRlX3V0aWxfW1wiY2xlYXJUaW1lXCJdKSh2YWx1ZSldLmNvbmNhdChhcmdzKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnVzZXJJbnB1dERhdGUgPSBudWxsO1xuICAgICAgdGhpcy51c2VySW5wdXRUaW1lID0gbnVsbDtcbiAgICB9LFxuXG5cbiAgICAvLyByZXNldERhdGUoKSB7XG4gICAgLy8gICB0aGlzLmRhdGUgPSBuZXcgRGF0ZSh0aGlzLmRhdGUpO1xuICAgIC8vIH0sXG5cbiAgICBzaG93TW9udGhQaWNrZXI6IGZ1bmN0aW9uIHNob3dNb250aFBpY2tlcigpIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnbW9udGgnO1xuICAgIH0sXG4gICAgc2hvd1llYXJQaWNrZXI6IGZ1bmN0aW9uIHNob3dZZWFyUGlja2VyKCkge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICd5ZWFyJztcbiAgICB9LFxuXG5cbiAgICAvLyBYWFg6IOayoeeUqOWIsFxuICAgIC8vIGhhbmRsZUxhYmVsQ2xpY2soKSB7XG4gICAgLy8gICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ2RhdGUnKSB7XG4gICAgLy8gICAgIHRoaXMuc2hvd01vbnRoUGlja2VyKCk7XG4gICAgLy8gICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcbiAgICAvLyAgICAgdGhpcy5zaG93WWVhclBpY2tlcigpO1xuICAgIC8vICAgfVxuICAgIC8vIH0sXG5cbiAgICBwcmV2TW9udGg6IGZ1bmN0aW9uIHByZXZNb250aCgpIHtcbiAgICAgIHRoaXMuZGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wicHJldk1vbnRoXCJdKSh0aGlzLmRhdGUpO1xuICAgIH0sXG4gICAgbmV4dE1vbnRoOiBmdW5jdGlvbiBuZXh0TW9udGgoKSB7XG4gICAgICB0aGlzLmRhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRNb250aFwiXSkodGhpcy5kYXRlKTtcbiAgICB9LFxuICAgIHByZXZZZWFyOiBmdW5jdGlvbiBwcmV2WWVhcigpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAneWVhcicpIHtcbiAgICAgICAgdGhpcy5kYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJwcmV2WWVhclwiXSkodGhpcy5kYXRlLCAxMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcInByZXZZZWFyXCJdKSh0aGlzLmRhdGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbmV4dFllYXI6IGZ1bmN0aW9uIG5leHRZZWFyKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd5ZWFyJykge1xuICAgICAgICB0aGlzLmRhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRZZWFyXCJdKSh0aGlzLmRhdGUsIDEwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dFllYXJcIl0pKHRoaXMuZGF0ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVTaG9ydGN1dENsaWNrOiBmdW5jdGlvbiBoYW5kbGVTaG9ydGN1dENsaWNrKHNob3J0Y3V0KSB7XG4gICAgICBpZiAoc2hvcnRjdXQub25DbGljaykge1xuICAgICAgICBzaG9ydGN1dC5vbkNsaWNrKHRoaXMpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlVGltZVBpY2s6IGZ1bmN0aW9uIGhhbmRsZVRpbWVQaWNrKHZhbHVlLCB2aXNpYmxlLCBmaXJzdCkge1xuICAgICAgaWYgKE9iamVjdChkYXRlX3V0aWxfW1wiaXNEYXRlXCJdKSh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIG5ld0RhdGUgPSB0aGlzLnZhbHVlID8gT2JqZWN0KGRhdGVfdXRpbF9bXCJtb2RpZnlUaW1lXCJdKSh0aGlzLnZhbHVlLCB2YWx1ZS5nZXRIb3VycygpLCB2YWx1ZS5nZXRNaW51dGVzKCksIHZhbHVlLmdldFNlY29uZHMoKSkgOiBPYmplY3QoZGF0ZV91dGlsX1tcIm1vZGlmeVdpdGhUaW1lU3RyaW5nXCJdKSh0aGlzLmdldERlZmF1bHRWYWx1ZSgpLCB0aGlzLmRlZmF1bHRUaW1lKTtcbiAgICAgICAgdGhpcy5kYXRlID0gbmV3RGF0ZTtcbiAgICAgICAgdGhpcy5lbWl0KHRoaXMuZGF0ZSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXQodmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICB0aGlzLnRpbWVQaWNrZXJWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZVRpbWVQaWNrQ2xvc2U6IGZ1bmN0aW9uIGhhbmRsZVRpbWVQaWNrQ2xvc2UoKSB7XG4gICAgICB0aGlzLnRpbWVQaWNrZXJWaXNpYmxlID0gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVNb250aFBpY2s6IGZ1bmN0aW9uIGhhbmRsZU1vbnRoUGljayhtb250aCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgICB0aGlzLmRhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm1vZGlmeURhdGVcIl0pKHRoaXMuZGF0ZSwgdGhpcy55ZWFyLCBtb250aCwgMSk7XG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmRhdGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtb250aHMnKSB7XG4gICAgICAgIHRoaXMuZW1pdChtb250aCwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcImNoYW5nZVllYXJNb250aEFuZENsYW1wRGF0ZVwiXSkodGhpcy5kYXRlLCB0aGlzLnllYXIsIG1vbnRoKTtcbiAgICAgICAgLy8gVE9ETzogc2hvdWxkIGVtaXQgaW50ZXJtZWRpYXRlIHZhbHVlID8/XG4gICAgICAgIC8vIHRoaXMuZW1pdCh0aGlzLmRhdGUpO1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ2RhdGUnO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlRGF0ZVBpY2s6IGZ1bmN0aW9uIGhhbmRsZURhdGVQaWNrKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnZGF5Jykge1xuICAgICAgICB2YXIgbmV3RGF0ZSA9IHRoaXMudmFsdWUgPyBPYmplY3QoZGF0ZV91dGlsX1tcIm1vZGlmeURhdGVcIl0pKHRoaXMudmFsdWUsIHZhbHVlLmdldEZ1bGxZZWFyKCksIHZhbHVlLmdldE1vbnRoKCksIHZhbHVlLmdldERhdGUoKSkgOiBPYmplY3QoZGF0ZV91dGlsX1tcIm1vZGlmeVdpdGhUaW1lU3RyaW5nXCJdKSh2YWx1ZSwgdGhpcy5kZWZhdWx0VGltZSk7XG4gICAgICAgIC8vIGNoYW5nZSBkZWZhdWx0IHRpbWUgd2hpbGUgb3V0IG9mIHNlbGVjdGFibGVSYW5nZVxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tEYXRlV2l0aGluUmFuZ2UobmV3RGF0ZSkpIHtcbiAgICAgICAgICBuZXdEYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJtb2RpZnlEYXRlXCJdKSh0aGlzLnNlbGVjdGFibGVSYW5nZVswXVswXSwgdmFsdWUuZ2V0RnVsbFllYXIoKSwgdmFsdWUuZ2V0TW9udGgoKSwgdmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGUgPSBuZXdEYXRlO1xuICAgICAgICB0aGlzLmVtaXQodGhpcy5kYXRlLCB0aGlzLnNob3dUaW1lKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnd2VlaycpIHtcbiAgICAgICAgdGhpcy5lbWl0KHZhbHVlLmRhdGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdkYXRlcycpIHtcbiAgICAgICAgdGhpcy5lbWl0KHZhbHVlLCB0cnVlKTsgLy8gc2V0IGZhbHNlIHRvIGtlZXAgcGFuZWwgb3BlblxuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlWWVhclBpY2s6IGZ1bmN0aW9uIGhhbmRsZVllYXJQaWNrKHllYXIpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICd5ZWFyJykge1xuICAgICAgICB0aGlzLmRhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm1vZGlmeURhdGVcIl0pKHRoaXMuZGF0ZSwgeWVhciwgMCwgMSk7XG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmRhdGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICd5ZWFycycpIHtcbiAgICAgICAgdGhpcy5lbWl0KHllYXIsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJjaGFuZ2VZZWFyTW9udGhBbmRDbGFtcERhdGVcIl0pKHRoaXMuZGF0ZSwgeWVhciwgdGhpcy5tb250aCk7XG4gICAgICAgIC8vIFRPRE86IHNob3VsZCBlbWl0IGludGVybWVkaWF0ZSB2YWx1ZSA/P1xuICAgICAgICAvLyB0aGlzLmVtaXQodGhpcy5kYXRlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICdtb250aCc7XG4gICAgICB9XG4gICAgfSxcbiAgICBjaGFuZ2VUb05vdzogZnVuY3Rpb24gY2hhbmdlVG9Ob3coKSB7XG4gICAgICAvLyBOT1RFOiBub3QgYSBwZXJtYW5lbnQgc29sdXRpb25cbiAgICAgIC8vICAgICAgIGNvbnNpZGVyIGRpc2FibGUgXCJub3dcIiBidXR0b24gaW4gdGhlIGZ1dHVyZVxuICAgICAgaWYgKCghdGhpcy5kaXNhYmxlZERhdGUgfHwgIXRoaXMuZGlzYWJsZWREYXRlKG5ldyBEYXRlKCkpKSAmJiB0aGlzLmNoZWNrRGF0ZVdpdGhpblJhbmdlKG5ldyBEYXRlKCkpKSB7XG4gICAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmRhdGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY29uZmlybTogZnVuY3Rpb24gY29uZmlybSgpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdkYXRlcycgfHwgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbW9udGhzJyB8fCB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICd5ZWFycycpIHtcbiAgICAgICAgdGhpcy5lbWl0KHRoaXMudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdmFsdWUgd2VyZSBlbWl0dGVkIGluIGhhbmRsZXtEYXRlLFRpbWV9UGljaywgbm90aGluZyB0byB1cGRhdGUgaGVyZVxuICAgICAgICAvLyBkZWFsIHdpdGggdGhlIHNjZW5hcmlvIHdoZXJlOiB1c2VyIG9wZW5zIHRoZSBwaWNrZXIsIHRoZW4gY29uZmlybSB3aXRob3V0IGRvaW5nIGFueXRoaW5nXG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlIDogT2JqZWN0KGRhdGVfdXRpbF9bXCJtb2RpZnlXaXRoVGltZVN0cmluZ1wiXSkodGhpcy5nZXREZWZhdWx0VmFsdWUoKSwgdGhpcy5kZWZhdWx0VGltZSk7XG4gICAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTsgLy8gcmVmcmVzaCBkYXRlXG4gICAgICAgIHRoaXMuZW1pdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICByZXNldFZpZXc6IGZ1bmN0aW9uIHJlc2V0VmlldygpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtb250aCcgfHwgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbW9udGhzJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ21vbnRoJztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAneWVhcicgfHwgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAneWVhcnMnKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAneWVhcic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ2RhdGUnO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlRW50ZXI6IGZ1bmN0aW9uIGhhbmRsZUVudGVyKCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlkb3duKTtcbiAgICB9LFxuICAgIGhhbmRsZUxlYXZlOiBmdW5jdGlvbiBoYW5kbGVMZWF2ZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2RvZGVzdHJveScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlkb3duKTtcbiAgICB9LFxuICAgIGhhbmRsZUtleWRvd246IGZ1bmN0aW9uIGhhbmRsZUtleWRvd24oZXZlbnQpIHtcbiAgICAgIHZhciBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgICAgIHZhciBsaXN0ID0gWzM4LCA0MCwgMzcsIDM5XTtcbiAgICAgIGlmICh0aGlzLnZpc2libGUgJiYgIXRoaXMudGltZVBpY2tlclZpc2libGUpIHtcbiAgICAgICAgaWYgKGxpc3QuaW5kZXhPZihrZXlDb2RlKSAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUtleUNvbnRyb2woa2V5Q29kZSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5Q29kZSA9PT0gMTMgJiYgdGhpcy51c2VySW5wdXREYXRlID09PSBudWxsICYmIHRoaXMudXNlcklucHV0VGltZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEVudGVyXG4gICAgICAgICAgdGhpcy5lbWl0KHRoaXMuZGF0ZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVLZXlDb250cm9sOiBmdW5jdGlvbiBoYW5kbGVLZXlDb250cm9sKGtleUNvZGUpIHtcbiAgICAgIHZhciBtYXBwaW5nID0ge1xuICAgICAgICAneWVhcic6IHtcbiAgICAgICAgICAzODogLTQsIDQwOiA0LCAzNzogLTEsIDM5OiAxLCBvZmZzZXQ6IGZ1bmN0aW9uIG9mZnNldChkYXRlLCBzdGVwKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBzdGVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdtb250aCc6IHtcbiAgICAgICAgICAzODogLTQsIDQwOiA0LCAzNzogLTEsIDM5OiAxLCBvZmZzZXQ6IGZ1bmN0aW9uIG9mZnNldChkYXRlLCBzdGVwKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBzdGVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICd3ZWVrJzoge1xuICAgICAgICAgIDM4OiAtMSwgNDA6IDEsIDM3OiAtMSwgMzk6IDEsIG9mZnNldDogZnVuY3Rpb24gb2Zmc2V0KGRhdGUsIHN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnZGF5Jzoge1xuICAgICAgICAgIDM4OiAtNywgNDA6IDcsIDM3OiAtMSwgMzk6IDEsIG9mZnNldDogZnVuY3Rpb24gb2Zmc2V0KGRhdGUsIHN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgbW9kZSA9IHRoaXMuc2VsZWN0aW9uTW9kZTtcbiAgICAgIHZhciB5ZWFyID0gMy4xNTM2ZTEwO1xuICAgICAgdmFyIG5vdyA9IHRoaXMuZGF0ZS5nZXRUaW1lKCk7XG4gICAgICB2YXIgbmV3RGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgd2hpbGUgKE1hdGguYWJzKG5vdyAtIG5ld0RhdGUuZ2V0VGltZSgpKSA8PSB5ZWFyKSB7XG4gICAgICAgIHZhciBtYXAgPSBtYXBwaW5nW21vZGVdO1xuICAgICAgICBtYXAub2Zmc2V0KG5ld0RhdGUsIG1hcFtrZXlDb2RlXSk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kaXNhYmxlZERhdGUgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5kaXNhYmxlZERhdGUobmV3RGF0ZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGUgPSBuZXdEYXRlO1xuICAgICAgICB0aGlzLiRlbWl0KCdwaWNrJywgbmV3RGF0ZSwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlVmlzaWJsZVRpbWVDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVZpc2libGVUaW1lQ2hhbmdlKHZhbHVlKSB7XG4gICAgICB2YXIgdGltZSA9IE9iamVjdChkYXRlX3V0aWxfW1wicGFyc2VEYXRlXCJdKSh2YWx1ZSwgdGhpcy50aW1lRm9ybWF0KTtcbiAgICAgIGlmICh0aW1lICYmIHRoaXMuY2hlY2tEYXRlV2l0aGluUmFuZ2UodGltZSkpIHtcbiAgICAgICAgdGhpcy5kYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJtb2RpZnlEYXRlXCJdKSh0aW1lLCB0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMubW9udGhEYXRlKTtcbiAgICAgICAgdGhpcy51c2VySW5wdXRUaW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy4kcmVmcy50aW1lcGlja2VyLnZhbHVlID0gdGhpcy5kYXRlO1xuICAgICAgICB0aGlzLnRpbWVQaWNrZXJWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmRhdGUsIHRydWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlVmlzaWJsZURhdGVDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVZpc2libGVEYXRlQ2hhbmdlKHZhbHVlKSB7XG4gICAgICB2YXIgZGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wicGFyc2VEYXRlXCJdKSh2YWx1ZSwgdGhpcy5kYXRlRm9ybWF0KTtcbiAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kaXNhYmxlZERhdGUgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJtb2RpZnlUaW1lXCJdKShkYXRlLCB0aGlzLmRhdGUuZ2V0SG91cnMoKSwgdGhpcy5kYXRlLmdldE1pbnV0ZXMoKSwgdGhpcy5kYXRlLmdldFNlY29uZHMoKSk7XG4gICAgICAgIHRoaXMudXNlcklucHV0RGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzZXRWaWV3KCk7XG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmRhdGUsIHRydWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaXNWYWxpZFZhbHVlOiBmdW5jdGlvbiBpc1ZhbGlkVmFsdWUodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAmJiAhaXNOYU4odmFsdWUpICYmICh0eXBlb2YgdGhpcy5kaXNhYmxlZERhdGUgPT09ICdmdW5jdGlvbicgPyAhdGhpcy5kaXNhYmxlZERhdGUodmFsdWUpIDogdHJ1ZSkgJiYgdGhpcy5jaGVja0RhdGVXaXRoaW5SYW5nZSh2YWx1ZSk7XG4gICAgfSxcbiAgICBnZXREZWZhdWx0VmFsdWU6IGZ1bmN0aW9uIGdldERlZmF1bHRWYWx1ZSgpIHtcbiAgICAgIC8vIGlmIGRlZmF1bHQtdmFsdWUgaXMgc2V0LCByZXR1cm4gaXRcbiAgICAgIC8vIG90aGVyd2lzZSwgcmV0dXJuIG5vdyAodGhlIG1vbWVudCB0aGlzIG1ldGhvZCBnZXRzIGNhbGxlZClcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZSA/IG5ldyBEYXRlKHRoaXMuZGVmYXVsdFZhbHVlKSA6IG5ldyBEYXRlKCk7XG4gICAgfSxcbiAgICBjaGVja0RhdGVXaXRoaW5SYW5nZTogZnVuY3Rpb24gY2hlY2tEYXRlV2l0aGluUmFuZ2UoZGF0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0YWJsZVJhbmdlLmxlbmd0aCA+IDAgPyBPYmplY3QoZGF0ZV91dGlsX1tcInRpbWVXaXRoaW5SYW5nZVwiXSkoZGF0ZSwgdGhpcy5zZWxlY3RhYmxlUmFuZ2UsIHRoaXMuZm9ybWF0IHx8ICdISDptbTpzcycpIDogdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgY29tcG9uZW50czoge1xuICAgIFRpbWVQaWNrZXI6IHBhbmVsX3RpbWUsIFllYXJUYWJsZTogeWVhcl90YWJsZSwgTW9udGhUYWJsZTogbW9udGhfdGFibGUsIERhdGVUYWJsZTogZGF0ZV90YWJsZSwgRWxJbnB1dDogaW5wdXRfZGVmYXVsdC5hLCBFbEJ1dHRvbjogYnV0dG9uX2RlZmF1bHQuYVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvcHBlckNsYXNzOiAnJyxcbiAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICB2YWx1ZTogJycsXG4gICAgICBkZWZhdWx0VmFsdWU6IG51bGwsIC8vIHVzZSBnZXREZWZhdWx0VmFsdWUoKSBmb3IgdGltZSBjb21wdXRhdGlvblxuICAgICAgZGVmYXVsdFRpbWU6IG51bGwsXG4gICAgICBzaG93VGltZTogZmFsc2UsXG4gICAgICBzZWxlY3Rpb25Nb2RlOiAnZGF5JyxcbiAgICAgIHNob3J0Y3V0czogJycsXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgIGN1cnJlbnRWaWV3OiAnZGF0ZScsXG4gICAgICBkaXNhYmxlZERhdGU6ICcnLFxuICAgICAgY2VsbENsYXNzTmFtZTogJycsXG4gICAgICBzZWxlY3RhYmxlUmFuZ2U6IFtdLFxuICAgICAgZmlyc3REYXlPZldlZWs6IDcsXG4gICAgICBzaG93V2Vla051bWJlcjogZmFsc2UsXG4gICAgICB0aW1lUGlja2VyVmlzaWJsZTogZmFsc2UsXG4gICAgICBmb3JtYXQ6ICcnLFxuICAgICAgYXJyb3dDb250cm9sOiBmYWxzZSxcbiAgICAgIHVzZXJJbnB1dERhdGU6IG51bGwsXG4gICAgICB1c2VySW5wdXRUaW1lOiBudWxsXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgeWVhcjogZnVuY3Rpb24geWVhcigpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICB9LFxuICAgIG1vbnRoOiBmdW5jdGlvbiBtb250aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGUuZ2V0TW9udGgoKTtcbiAgICB9LFxuICAgIHdlZWs6IGZ1bmN0aW9uIHdlZWsoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bXCJnZXRXZWVrTnVtYmVyXCJdKSh0aGlzLmRhdGUpO1xuICAgIH0sXG4gICAgbW9udGhEYXRlOiBmdW5jdGlvbiBtb250aERhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRlLmdldERhdGUoKTtcbiAgICB9LFxuICAgIGZvb3RlclZpc2libGU6IGZ1bmN0aW9uIGZvb3RlclZpc2libGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93VGltZSB8fCB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdkYXRlcycgfHwgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbW9udGhzJyB8fCB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICd5ZWFycyc7XG4gICAgfSxcbiAgICB2aXNpYmxlVGltZTogZnVuY3Rpb24gdmlzaWJsZVRpbWUoKSB7XG4gICAgICBpZiAodGhpcy51c2VySW5wdXRUaW1lICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJJbnB1dFRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bXCJmb3JtYXREYXRlXCJdKSh0aGlzLnZhbHVlIHx8IHRoaXMuZGVmYXVsdFZhbHVlLCB0aGlzLnRpbWVGb3JtYXQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgdmlzaWJsZURhdGU6IGZ1bmN0aW9uIHZpc2libGVEYXRlKCkge1xuICAgICAgaWYgKHRoaXMudXNlcklucHV0RGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VySW5wdXREYXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdChkYXRlX3V0aWxfW1wiZm9ybWF0RGF0ZVwiXSkodGhpcy52YWx1ZSB8fCB0aGlzLmRlZmF1bHRWYWx1ZSwgdGhpcy5kYXRlRm9ybWF0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHllYXJMYWJlbDogZnVuY3Rpb24geWVhckxhYmVsKCkge1xuICAgICAgdmFyIHllYXJUcmFuc2xhdGlvbiA9IHRoaXMudCgnZWwuZGF0ZXBpY2tlci55ZWFyJyk7XG4gICAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInKSB7XG4gICAgICAgIHZhciBzdGFydFllYXIgPSBNYXRoLmZsb29yKHRoaXMueWVhciAvIDEwKSAqIDEwO1xuICAgICAgICBpZiAoeWVhclRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXJ0WWVhciArICcgJyArIHllYXJUcmFuc2xhdGlvbiArICcgLSAnICsgKHN0YXJ0WWVhciArIDkpICsgJyAnICsgeWVhclRyYW5zbGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFydFllYXIgKyAnIC0gJyArIChzdGFydFllYXIgKyA5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnllYXIgKyAnICcgKyB5ZWFyVHJhbnNsYXRpb247XG4gICAgfSxcbiAgICB0aW1lRm9ybWF0OiBmdW5jdGlvbiB0aW1lRm9ybWF0KCkge1xuICAgICAgaWYgKHRoaXMuZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QoZGF0ZV91dGlsX1tcImV4dHJhY3RUaW1lRm9ybWF0XCJdKSh0aGlzLmZvcm1hdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ0hIOm1tOnNzJztcbiAgICAgIH1cbiAgICB9LFxuICAgIGRhdGVGb3JtYXQ6IGZ1bmN0aW9uIGRhdGVGb3JtYXQoKSB7XG4gICAgICBpZiAodGhpcy5mb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdChkYXRlX3V0aWxfW1wiZXh0cmFjdERhdGVGb3JtYXRcIl0pKHRoaXMuZm9ybWF0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAneXl5eS1NTS1kZCc7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL2RhdGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhbmVsX2RhdGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoZGF0ZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvZGF0ZS52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBkYXRlX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFuZWxfZGF0ZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgZGF0ZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI0NDBkNGVhX3JlbmRlcixcbiAgZGF0ZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI0NDBkNGVhX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgZGF0ZV9hcGk7IH1cbmRhdGVfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvZGF0ZS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFuZWxfZGF0ZSA9IChkYXRlX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL2RhdGUtcmFuZ2UudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTI2NTI4NDlhJlxudmFyIGRhdGVfcmFuZ2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yNjUyODQ5YV9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJ0cmFuc2l0aW9uXCIsXG4gICAge1xuICAgICAgYXR0cnM6IHsgbmFtZTogXCJlbC16b29tLWluLXRvcFwiIH0sXG4gICAgICBvbjoge1xuICAgICAgICBcImFmdGVyLWxlYXZlXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgIF92bS4kZW1pdChcImRvZGVzdHJveVwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBfdm0udmlzaWJsZSxcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJ2aXNpYmxlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXBpY2tlci1wYW5lbCBlbC1kYXRlLXJhbmdlLXBpY2tlciBlbC1wb3BwZXJcIixcbiAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImhhcy1zaWRlYmFyXCI6IF92bS4kc2xvdHMuc2lkZWJhciB8fCBfdm0uc2hvcnRjdXRzLFxuICAgICAgICAgICAgICBcImhhcy10aW1lXCI6IF92bS5zaG93VGltZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF92bS5wb3BwZXJDbGFzc1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtcGlja2VyLXBhbmVsX19ib2R5LXdyYXBwZXJcIiB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfdm0uX3QoXCJzaWRlYmFyXCIpLFxuICAgICAgICAgICAgICBfdm0uc2hvcnRjdXRzXG4gICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1waWNrZXItcGFuZWxfX3NpZGViYXJcIiB9LFxuICAgICAgICAgICAgICAgICAgICBfdm0uX2woX3ZtLnNob3J0Y3V0cywgZnVuY3Rpb24oc2hvcnRjdXQsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1waWNrZXItcGFuZWxfX3Nob3J0Y3V0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHR5cGU6IFwiYnV0dG9uXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlU2hvcnRjdXRDbGljayhzaG9ydGN1dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhzaG9ydGN1dC50ZXh0KSldXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtcGlja2VyLXBhbmVsX19ib2R5XCIgfSwgW1xuICAgICAgICAgICAgICAgIF92bS5zaG93VGltZVxuICAgICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtZGF0ZS1yYW5nZS1waWNrZXJfX3RpbWUtaGVhZGVyXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2VkaXRvcnMtd3JhcFwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVsLWRhdGUtcmFuZ2UtcGlja2VyX190aW1lLXBpY2tlci13cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFwiZWwtaW5wdXRcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogXCJtaW5JbnB1dFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWRhdGUtcmFuZ2UtcGlja2VyX19lZGl0b3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5yYW5nZVN0YXRlLnNlbGVjdGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBfdm0udChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC5kYXRlcGlja2VyLnN0YXJ0RGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5taW5WaXNpYmxlRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5oYW5kbGVEYXRlSW5wdXQodmFsLCBcIm1pblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uaGFuZGxlRGF0ZUNoYW5nZSh2YWwsIFwibWluXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImNsaWNrb3V0c2lkZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LWNsaWNrb3V0c2lkZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5oYW5kbGVNaW5UaW1lQ2xvc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImhhbmRsZU1pblRpbWVDbG9zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVsLWRhdGUtcmFuZ2UtcGlja2VyX190aW1lLXBpY2tlci13cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFwiZWwtaW5wdXRcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWRhdGUtcmFuZ2UtcGlja2VyX19lZGl0b3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5yYW5nZVN0YXRlLnNlbGVjdGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBfdm0udChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC5kYXRlcGlja2VyLnN0YXJ0VGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5taW5WaXNpYmxlVGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLm1pblRpbWVQaWNrZXJWaXNpYmxlID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5oYW5kbGVUaW1lSW5wdXQodmFsLCBcIm1pblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uaGFuZGxlVGltZUNoYW5nZSh2YWwsIFwibWluXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJ0aW1lLXBpY2tlclwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiBcIm1pblRpbWVQaWNrZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0aW1lLWFycm93LWNvbnRyb2xcIjogX3ZtLmFycm93Q29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU6IF92bS5taW5UaW1lUGlja2VyVmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2s6IF92bS5oYW5kbGVNaW5UaW1lUGljayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50ZWQ6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uJHJlZnMubWluVGltZVBpY2tlci5mb3JtYXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS50aW1lRm9ybWF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBfYyhcInNwYW5cIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pY29uLWFycm93LXJpZ2h0XCIgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2VkaXRvcnMtd3JhcCBpcy1yaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVsLWRhdGUtcmFuZ2UtcGlja2VyX190aW1lLXBpY2tlci13cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFwiZWwtaW5wdXRcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWRhdGUtcmFuZ2UtcGlja2VyX19lZGl0b3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5yYW5nZVN0YXRlLnNlbGVjdGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBfdm0udChcImVsLmRhdGVwaWNrZXIuZW5kRGF0ZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0ubWF4VmlzaWJsZURhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seTogIV92bS5taW5EYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLmhhbmRsZURhdGVJbnB1dCh2YWwsIFwibWF4XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5oYW5kbGVEYXRlQ2hhbmdlKHZhbCwgXCJtYXhcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiY2xpY2tvdXRzaWRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtY2xpY2tvdXRzaWRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmhhbmRsZU1heFRpbWVDbG9zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiaGFuZGxlTWF4VGltZUNsb3NlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtZGF0ZS1yYW5nZS1waWNrZXJfX3RpbWUtcGlja2VyLXdyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJlbC1pbnB1dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2VkaXRvclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogX3ZtLnJhbmdlU3RhdGUuc2VsZWN0aW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IF92bS50KFwiZWwuZGF0ZXBpY2tlci5lbmRUaW1lXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5tYXhWaXNpYmxlVGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiAhX3ZtLm1pbkRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1czogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5taW5EYXRlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF92bS5tYXhUaW1lUGlja2VyVmlzaWJsZSA9IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLmhhbmRsZVRpbWVJbnB1dCh2YWwsIFwibWF4XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5oYW5kbGVUaW1lQ2hhbmdlKHZhbCwgXCJtYXhcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcInRpbWUtcGlja2VyXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY6IFwibWF4VGltZVBpY2tlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRpbWUtYXJyb3ctY29udHJvbFwiOiBfdm0uYXJyb3dDb250cm9sLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogX3ZtLm1heFRpbWVQaWNrZXJWaXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljazogX3ZtLmhhbmRsZU1heFRpbWVQaWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRlZDogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS4kcmVmcy5tYXhUaW1lUGlja2VyLmZvcm1hdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnRpbWVGb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgIFwiZWwtcGlja2VyLXBhbmVsX19jb250ZW50IGVsLWRhdGUtcmFuZ2UtcGlja2VyX19jb250ZW50IGlzLWxlZnRcIlxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1kYXRlLXJhbmdlLXBpY2tlcl9faGVhZGVyXCIgfSwgW1xuICAgICAgICAgICAgICAgICAgICAgIF9jKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBcImVsLXBpY2tlci1wYW5lbF9faWNvbi1idG4gZWwtaWNvbi1kLWFycm93LWxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHR5cGU6IFwiYnV0dG9uXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0ubGVmdFByZXZZZWFyIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcImJ1dHRvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWljb24tYXJyb3ctbGVmdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgdHlwZTogXCJidXR0b25cIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5sZWZ0UHJldk1vbnRoIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBfdm0udW5saW5rUGFuZWxzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtcGlja2VyLXBhbmVsX19pY29uLWJ0biBlbC1pY29uLWQtYXJyb3ctcmlnaHRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogeyBcImlzLWRpc2FibGVkXCI6ICFfdm0uZW5hYmxlWWVhckFycm93IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogIV92bS5lbmFibGVZZWFyQXJyb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0ubGVmdE5leHRZZWFyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLnVubGlua1BhbmVsc1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcImJ1dHRvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVsLXBpY2tlci1wYW5lbF9faWNvbi1idG4gZWwtaWNvbi1hcnJvdy1yaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiB7IFwiaXMtZGlzYWJsZWRcIjogIV92bS5lbmFibGVNb250aEFycm93IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogIV92bS5lbmFibGVNb250aEFycm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLmxlZnROZXh0TW9udGggfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcImRpdlwiLCBbX3ZtLl92KF92bS5fcyhfdm0ubGVmdExhYmVsKSldKVxuICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJkYXRlLXRhYmxlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJzZWxlY3Rpb24tbW9kZVwiOiBcInJhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBfdm0ubGVmdERhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlZmF1bHQtdmFsdWVcIjogX3ZtLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibWluLWRhdGVcIjogX3ZtLm1pbkRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm1heC1kYXRlXCI6IF92bS5tYXhEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJyYW5nZS1zdGF0ZVwiOiBfdm0ucmFuZ2VTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGlzYWJsZWQtZGF0ZVwiOiBfdm0uZGlzYWJsZWREYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjZWxsLWNsYXNzLW5hbWVcIjogX3ZtLmNlbGxDbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZpcnN0LWRheS1vZi13ZWVrXCI6IF92bS5maXJzdERheU9mV2Vla1xuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXJhbmdlOiBfdm0uaGFuZGxlQ2hhbmdlUmFuZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaWNrOiBfdm0uaGFuZGxlUmFuZ2VQaWNrXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgICAgXCJlbC1waWNrZXItcGFuZWxfX2NvbnRlbnQgZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2NvbnRlbnQgaXMtcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1kYXRlLXJhbmdlLXBpY2tlcl9faGVhZGVyXCIgfSwgW1xuICAgICAgICAgICAgICAgICAgICAgIF92bS51bmxpbmtQYW5lbHNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWljb24tZC1hcnJvdy1sZWZ0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IHsgXCJpcy1kaXNhYmxlZFwiOiAhX3ZtLmVuYWJsZVllYXJBcnJvdyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFfdm0uZW5hYmxlWWVhckFycm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLnJpZ2h0UHJldlllYXIgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICBfdm0udW5saW5rUGFuZWxzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtcGlja2VyLXBhbmVsX19pY29uLWJ0biBlbC1pY29uLWFycm93LWxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogeyBcImlzLWRpc2FibGVkXCI6ICFfdm0uZW5hYmxlTW9udGhBcnJvdyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFfdm0uZW5hYmxlTW9udGhBcnJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5yaWdodFByZXZNb250aCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgICAgIF9jKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBcImVsLXBpY2tlci1wYW5lbF9faWNvbi1idG4gZWwtaWNvbi1kLWFycm93LXJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyB0eXBlOiBcImJ1dHRvblwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLnJpZ2h0TmV4dFllYXIgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgIF9jKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBcImVsLXBpY2tlci1wYW5lbF9faWNvbi1idG4gZWwtaWNvbi1hcnJvdy1yaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgdHlwZTogXCJidXR0b25cIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5yaWdodE5leHRNb250aCB9XG4gICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgW192bS5fdihfdm0uX3MoX3ZtLnJpZ2h0TGFiZWwpKV0pXG4gICAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgICBfYyhcImRhdGUtdGFibGVcIiwge1xuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInNlbGVjdGlvbi1tb2RlXCI6IFwicmFuZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IF92bS5yaWdodERhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlZmF1bHQtdmFsdWVcIjogX3ZtLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibWluLWRhdGVcIjogX3ZtLm1pbkRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm1heC1kYXRlXCI6IF92bS5tYXhEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJyYW5nZS1zdGF0ZVwiOiBfdm0ucmFuZ2VTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGlzYWJsZWQtZGF0ZVwiOiBfdm0uZGlzYWJsZWREYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjZWxsLWNsYXNzLW5hbWVcIjogX3ZtLmNlbGxDbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZpcnN0LWRheS1vZi13ZWVrXCI6IF92bS5maXJzdERheU9mV2Vla1xuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXJhbmdlOiBfdm0uaGFuZGxlQ2hhbmdlUmFuZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaWNrOiBfdm0uaGFuZGxlUmFuZ2VQaWNrXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMlxuICAgICAgICAgICksXG4gICAgICAgICAgX3ZtLnNob3dUaW1lXG4gICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1waWNrZXItcGFuZWxfX2Zvb3RlclwiIH0sXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgIFwiZWwtYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1waWNrZXItcGFuZWxfX2xpbmstYnRuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgc2l6ZTogXCJtaW5pXCIsIHR5cGU6IFwidGV4dFwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5oYW5kbGVDbGVhciB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLnQoXCJlbC5kYXRlcGlja2VyLmNsZWFyXCIpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJlbC1idXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXBpY2tlci1wYW5lbF9fbGluay1idG5cIixcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW46IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBcIm1pbmlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBfdm0uYnRuRGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVDb25maXJtKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fcyhfdm0udChcImVsLmRhdGVwaWNrZXIuY29uZmlybVwiKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgXVxuICAgICAgKVxuICAgIF1cbiAgKVxufVxudmFyIGRhdGVfcmFuZ2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yNjUyODQ5YV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuZGF0ZV9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI2NTI4NDlhX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL2RhdGUtcmFuZ2UudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTI2NTI4NDlhJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvZGF0ZS1yYW5nZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG5cblxuXG52YXIgZGF0ZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2NhbGNEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbiBjYWxjRGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShkZWZhdWx0VmFsdWUpKSB7XG4gICAgcmV0dXJuIFtuZXcgRGF0ZShkZWZhdWx0VmFsdWVbMF0pLCBuZXcgRGF0ZShkZWZhdWx0VmFsdWVbMV0pXTtcbiAgfSBlbHNlIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICByZXR1cm4gW25ldyBEYXRlKGRlZmF1bHRWYWx1ZSksIE9iamVjdChkYXRlX3V0aWxfW1wibmV4dERhdGVcIl0pKG5ldyBEYXRlKGRlZmF1bHRWYWx1ZSksIDEpXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW25ldyBEYXRlKCksIE9iamVjdChkYXRlX3V0aWxfW1wibmV4dERhdGVcIl0pKG5ldyBEYXRlKCksIDEpXTtcbiAgfVxufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZGF0ZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG1peGluczogW2xvY2FsZV9kZWZhdWx0LmFdLFxuXG4gIGRpcmVjdGl2ZXM6IHsgQ2xpY2tvdXRzaWRlOiBjbGlja291dHNpZGVfZGVmYXVsdC5hIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBidG5EaXNhYmxlZDogZnVuY3Rpb24gYnRuRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gISh0aGlzLm1pbkRhdGUgJiYgdGhpcy5tYXhEYXRlICYmICF0aGlzLnNlbGVjdGluZyAmJiB0aGlzLmlzVmFsaWRWYWx1ZShbdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGVdKSk7XG4gICAgfSxcbiAgICBsZWZ0TGFiZWw6IGZ1bmN0aW9uIGxlZnRMYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmxlZnREYXRlLmdldEZ1bGxZZWFyKCkgKyAnICcgKyB0aGlzLnQoJ2VsLmRhdGVwaWNrZXIueWVhcicpICsgJyAnICsgdGhpcy50KCdlbC5kYXRlcGlja2VyLm1vbnRoJyArICh0aGlzLmxlZnREYXRlLmdldE1vbnRoKCkgKyAxKSk7XG4gICAgfSxcbiAgICByaWdodExhYmVsOiBmdW5jdGlvbiByaWdodExhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMucmlnaHREYXRlLmdldEZ1bGxZZWFyKCkgKyAnICcgKyB0aGlzLnQoJ2VsLmRhdGVwaWNrZXIueWVhcicpICsgJyAnICsgdGhpcy50KCdlbC5kYXRlcGlja2VyLm1vbnRoJyArICh0aGlzLnJpZ2h0RGF0ZS5nZXRNb250aCgpICsgMSkpO1xuICAgIH0sXG4gICAgbGVmdFllYXI6IGZ1bmN0aW9uIGxlZnRZZWFyKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGVmdERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICB9LFxuICAgIGxlZnRNb250aDogZnVuY3Rpb24gbGVmdE1vbnRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGVmdERhdGUuZ2V0TW9udGgoKTtcbiAgICB9LFxuICAgIGxlZnRNb250aERhdGU6IGZ1bmN0aW9uIGxlZnRNb250aERhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sZWZ0RGF0ZS5nZXREYXRlKCk7XG4gICAgfSxcbiAgICByaWdodFllYXI6IGZ1bmN0aW9uIHJpZ2h0WWVhcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJpZ2h0RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIH0sXG4gICAgcmlnaHRNb250aDogZnVuY3Rpb24gcmlnaHRNb250aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJpZ2h0RGF0ZS5nZXRNb250aCgpO1xuICAgIH0sXG4gICAgcmlnaHRNb250aERhdGU6IGZ1bmN0aW9uIHJpZ2h0TW9udGhEYXRlKCkge1xuICAgICAgcmV0dXJuIHRoaXMucmlnaHREYXRlLmdldERhdGUoKTtcbiAgICB9LFxuICAgIG1pblZpc2libGVEYXRlOiBmdW5jdGlvbiBtaW5WaXNpYmxlRGF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLmRhdGVVc2VySW5wdXQubWluICE9PSBudWxsKSByZXR1cm4gdGhpcy5kYXRlVXNlcklucHV0Lm1pbjtcbiAgICAgIGlmICh0aGlzLm1pbkRhdGUpIHJldHVybiBPYmplY3QoZGF0ZV91dGlsX1tcImZvcm1hdERhdGVcIl0pKHRoaXMubWluRGF0ZSwgdGhpcy5kYXRlRm9ybWF0KTtcbiAgICAgIHJldHVybiAnJztcbiAgICB9LFxuICAgIG1heFZpc2libGVEYXRlOiBmdW5jdGlvbiBtYXhWaXNpYmxlRGF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLmRhdGVVc2VySW5wdXQubWF4ICE9PSBudWxsKSByZXR1cm4gdGhpcy5kYXRlVXNlcklucHV0Lm1heDtcbiAgICAgIGlmICh0aGlzLm1heERhdGUgfHwgdGhpcy5taW5EYXRlKSByZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bXCJmb3JtYXREYXRlXCJdKSh0aGlzLm1heERhdGUgfHwgdGhpcy5taW5EYXRlLCB0aGlzLmRhdGVGb3JtYXQpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0sXG4gICAgbWluVmlzaWJsZVRpbWU6IGZ1bmN0aW9uIG1pblZpc2libGVUaW1lKCkge1xuICAgICAgaWYgKHRoaXMudGltZVVzZXJJbnB1dC5taW4gIT09IG51bGwpIHJldHVybiB0aGlzLnRpbWVVc2VySW5wdXQubWluO1xuICAgICAgaWYgKHRoaXMubWluRGF0ZSkgcmV0dXJuIE9iamVjdChkYXRlX3V0aWxfW1wiZm9ybWF0RGF0ZVwiXSkodGhpcy5taW5EYXRlLCB0aGlzLnRpbWVGb3JtYXQpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0sXG4gICAgbWF4VmlzaWJsZVRpbWU6IGZ1bmN0aW9uIG1heFZpc2libGVUaW1lKCkge1xuICAgICAgaWYgKHRoaXMudGltZVVzZXJJbnB1dC5tYXggIT09IG51bGwpIHJldHVybiB0aGlzLnRpbWVVc2VySW5wdXQubWF4O1xuICAgICAgaWYgKHRoaXMubWF4RGF0ZSB8fCB0aGlzLm1pbkRhdGUpIHJldHVybiBPYmplY3QoZGF0ZV91dGlsX1tcImZvcm1hdERhdGVcIl0pKHRoaXMubWF4RGF0ZSB8fCB0aGlzLm1pbkRhdGUsIHRoaXMudGltZUZvcm1hdCk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSxcbiAgICB0aW1lRm9ybWF0OiBmdW5jdGlvbiB0aW1lRm9ybWF0KCkge1xuICAgICAgaWYgKHRoaXMuZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QoZGF0ZV91dGlsX1tcImV4dHJhY3RUaW1lRm9ybWF0XCJdKSh0aGlzLmZvcm1hdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ0hIOm1tOnNzJztcbiAgICAgIH1cbiAgICB9LFxuICAgIGRhdGVGb3JtYXQ6IGZ1bmN0aW9uIGRhdGVGb3JtYXQoKSB7XG4gICAgICBpZiAodGhpcy5mb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdChkYXRlX3V0aWxfW1wiZXh0cmFjdERhdGVGb3JtYXRcIl0pKHRoaXMuZm9ybWF0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAneXl5eS1NTS1kZCc7XG4gICAgICB9XG4gICAgfSxcbiAgICBlbmFibGVNb250aEFycm93OiBmdW5jdGlvbiBlbmFibGVNb250aEFycm93KCkge1xuICAgICAgdmFyIG5leHRNb250aCA9ICh0aGlzLmxlZnRNb250aCArIDEpICUgMTI7XG4gICAgICB2YXIgeWVhck9mZnNldCA9IHRoaXMubGVmdE1vbnRoICsgMSA+PSAxMiA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHRoaXMudW5saW5rUGFuZWxzICYmIG5ldyBEYXRlKHRoaXMubGVmdFllYXIgKyB5ZWFyT2Zmc2V0LCBuZXh0TW9udGgpIDwgbmV3IERhdGUodGhpcy5yaWdodFllYXIsIHRoaXMucmlnaHRNb250aCk7XG4gICAgfSxcbiAgICBlbmFibGVZZWFyQXJyb3c6IGZ1bmN0aW9uIGVuYWJsZVllYXJBcnJvdygpIHtcbiAgICAgIHJldHVybiB0aGlzLnVubGlua1BhbmVscyAmJiB0aGlzLnJpZ2h0WWVhciAqIDEyICsgdGhpcy5yaWdodE1vbnRoIC0gKHRoaXMubGVmdFllYXIgKiAxMiArIHRoaXMubGVmdE1vbnRoICsgMSkgPj0gMTI7XG4gICAgfVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvcHBlckNsYXNzOiAnJyxcbiAgICAgIHZhbHVlOiBbXSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogbnVsbCxcbiAgICAgIGRlZmF1bHRUaW1lOiBudWxsLFxuICAgICAgbWluRGF0ZTogJycsXG4gICAgICBtYXhEYXRlOiAnJyxcbiAgICAgIGxlZnREYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgcmlnaHREYXRlOiBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRNb250aFwiXSkobmV3IERhdGUoKSksXG4gICAgICByYW5nZVN0YXRlOiB7XG4gICAgICAgIGVuZERhdGU6IG51bGwsXG4gICAgICAgIHNlbGVjdGluZzogZmFsc2UsXG4gICAgICAgIHJvdzogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsXG4gICAgICB9LFxuICAgICAgc2hvd1RpbWU6IGZhbHNlLFxuICAgICAgc2hvcnRjdXRzOiAnJyxcbiAgICAgIHZpc2libGU6ICcnLFxuICAgICAgZGlzYWJsZWREYXRlOiAnJyxcbiAgICAgIGNlbGxDbGFzc05hbWU6ICcnLFxuICAgICAgZmlyc3REYXlPZldlZWs6IDcsXG4gICAgICBtaW5UaW1lUGlja2VyVmlzaWJsZTogZmFsc2UsXG4gICAgICBtYXhUaW1lUGlja2VyVmlzaWJsZTogZmFsc2UsXG4gICAgICBmb3JtYXQ6ICcnLFxuICAgICAgYXJyb3dDb250cm9sOiBmYWxzZSxcbiAgICAgIHVubGlua1BhbmVsczogZmFsc2UsXG4gICAgICBkYXRlVXNlcklucHV0OiB7XG4gICAgICAgIG1pbjogbnVsbCxcbiAgICAgICAgbWF4OiBudWxsXG4gICAgICB9LFxuICAgICAgdGltZVVzZXJJbnB1dDoge1xuICAgICAgICBtaW46IG51bGwsXG4gICAgICAgIG1heDogbnVsbFxuICAgICAgfVxuICAgIH07XG4gIH0sXG5cblxuICB3YXRjaDoge1xuICAgIG1pbkRhdGU6IGZ1bmN0aW9uIG1pbkRhdGUodmFsKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB0aGlzLmRhdGVVc2VySW5wdXQubWluID0gbnVsbDtcbiAgICAgIHRoaXMudGltZVVzZXJJbnB1dC5taW4gPSBudWxsO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuJHJlZnMubWF4VGltZVBpY2tlciAmJiBfdGhpcy5tYXhEYXRlICYmIF90aGlzLm1heERhdGUgPCBfdGhpcy5taW5EYXRlKSB7XG4gICAgICAgICAgdmFyIGZvcm1hdCA9ICdISDptbTpzcyc7XG4gICAgICAgICAgX3RoaXMuJHJlZnMubWF4VGltZVBpY2tlci5zZWxlY3RhYmxlUmFuZ2UgPSBbW09iamVjdChkYXRlX3V0aWxfW1wicGFyc2VEYXRlXCJdKShPYmplY3QoZGF0ZV91dGlsX1tcImZvcm1hdERhdGVcIl0pKF90aGlzLm1pbkRhdGUsIGZvcm1hdCksIGZvcm1hdCksIE9iamVjdChkYXRlX3V0aWxfW1wicGFyc2VEYXRlXCJdKSgnMjM6NTk6NTknLCBmb3JtYXQpXV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHZhbCAmJiB0aGlzLiRyZWZzLm1pblRpbWVQaWNrZXIpIHtcbiAgICAgICAgdGhpcy4kcmVmcy5taW5UaW1lUGlja2VyLmRhdGUgPSB2YWw7XG4gICAgICAgIHRoaXMuJHJlZnMubWluVGltZVBpY2tlci52YWx1ZSA9IHZhbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1heERhdGU6IGZ1bmN0aW9uIG1heERhdGUodmFsKSB7XG4gICAgICB0aGlzLmRhdGVVc2VySW5wdXQubWF4ID0gbnVsbDtcbiAgICAgIHRoaXMudGltZVVzZXJJbnB1dC5tYXggPSBudWxsO1xuICAgICAgaWYgKHZhbCAmJiB0aGlzLiRyZWZzLm1heFRpbWVQaWNrZXIpIHtcbiAgICAgICAgdGhpcy4kcmVmcy5tYXhUaW1lUGlja2VyLmRhdGUgPSB2YWw7XG4gICAgICAgIHRoaXMuJHJlZnMubWF4VGltZVBpY2tlci52YWx1ZSA9IHZhbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1pblRpbWVQaWNrZXJWaXNpYmxlOiBmdW5jdGlvbiBtaW5UaW1lUGlja2VyVmlzaWJsZSh2YWwpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczIuJHJlZnMubWluVGltZVBpY2tlci5kYXRlID0gX3RoaXMyLm1pbkRhdGU7XG4gICAgICAgICAgX3RoaXMyLiRyZWZzLm1pblRpbWVQaWNrZXIudmFsdWUgPSBfdGhpczIubWluRGF0ZTtcbiAgICAgICAgICBfdGhpczIuJHJlZnMubWluVGltZVBpY2tlci5hZGp1c3RTcGlubmVycygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1heFRpbWVQaWNrZXJWaXNpYmxlOiBmdW5jdGlvbiBtYXhUaW1lUGlja2VyVmlzaWJsZSh2YWwpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczMuJHJlZnMubWF4VGltZVBpY2tlci5kYXRlID0gX3RoaXMzLm1heERhdGU7XG4gICAgICAgICAgX3RoaXMzLiRyZWZzLm1heFRpbWVQaWNrZXIudmFsdWUgPSBfdGhpczMubWF4RGF0ZTtcbiAgICAgICAgICBfdGhpczMuJHJlZnMubWF4VGltZVBpY2tlci5hZGp1c3RTcGlubmVycygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShuZXdWYWwpIHtcbiAgICAgIGlmICghbmV3VmFsKSB7XG4gICAgICAgIHRoaXMubWluRGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMubWF4RGF0ZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobmV3VmFsKSkge1xuICAgICAgICB0aGlzLm1pbkRhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcImlzRGF0ZVwiXSkobmV3VmFsWzBdKSA/IG5ldyBEYXRlKG5ld1ZhbFswXSkgOiBudWxsO1xuICAgICAgICB0aGlzLm1heERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcImlzRGF0ZVwiXSkobmV3VmFsWzFdKSA/IG5ldyBEYXRlKG5ld1ZhbFsxXSkgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5taW5EYXRlKSB7XG4gICAgICAgICAgdGhpcy5sZWZ0RGF0ZSA9IHRoaXMubWluRGF0ZTtcbiAgICAgICAgICBpZiAodGhpcy51bmxpbmtQYW5lbHMgJiYgdGhpcy5tYXhEYXRlKSB7XG4gICAgICAgICAgICB2YXIgbWluRGF0ZVllYXIgPSB0aGlzLm1pbkRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgIHZhciBtaW5EYXRlTW9udGggPSB0aGlzLm1pbkRhdGUuZ2V0TW9udGgoKTtcbiAgICAgICAgICAgIHZhciBtYXhEYXRlWWVhciA9IHRoaXMubWF4RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgdmFyIG1heERhdGVNb250aCA9IHRoaXMubWF4RGF0ZS5nZXRNb250aCgpO1xuICAgICAgICAgICAgdGhpcy5yaWdodERhdGUgPSBtaW5EYXRlWWVhciA9PT0gbWF4RGF0ZVllYXIgJiYgbWluRGF0ZU1vbnRoID09PSBtYXhEYXRlTW9udGggPyBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRNb250aFwiXSkodGhpcy5tYXhEYXRlKSA6IHRoaXMubWF4RGF0ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yaWdodERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRNb250aFwiXSkodGhpcy5sZWZ0RGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubGVmdERhdGUgPSBkYXRlX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfY2FsY0RlZmF1bHRWYWx1ZSh0aGlzLmRlZmF1bHRWYWx1ZSlbMF07XG4gICAgICAgICAgdGhpcy5yaWdodERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRNb250aFwiXSkodGhpcy5sZWZ0RGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gZGVmYXVsdFZhbHVlKHZhbCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgIHZhciBfY2FsY0RlZmF1bHRWYWx1ZSA9IGRhdGVfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19jYWxjRGVmYXVsdFZhbHVlKHZhbCksXG4gICAgICAgICAgICBsZWZ0ID0gX2NhbGNEZWZhdWx0VmFsdWVbMF0sXG4gICAgICAgICAgICByaWdodCA9IF9jYWxjRGVmYXVsdFZhbHVlWzFdO1xuXG4gICAgICAgIHRoaXMubGVmdERhdGUgPSBsZWZ0O1xuICAgICAgICB0aGlzLnJpZ2h0RGF0ZSA9IHZhbCAmJiB2YWxbMV0gJiYgdGhpcy51bmxpbmtQYW5lbHMgPyByaWdodCA6IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dE1vbnRoXCJdKSh0aGlzLmxlZnREYXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUNsZWFyOiBmdW5jdGlvbiBoYW5kbGVDbGVhcigpIHtcbiAgICAgIHRoaXMubWluRGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLm1heERhdGUgPSBudWxsO1xuICAgICAgdGhpcy5sZWZ0RGF0ZSA9IGRhdGVfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19jYWxjRGVmYXVsdFZhbHVlKHRoaXMuZGVmYXVsdFZhbHVlKVswXTtcbiAgICAgIHRoaXMucmlnaHREYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJuZXh0TW9udGhcIl0pKHRoaXMubGVmdERhdGUpO1xuICAgICAgdGhpcy4kZW1pdCgncGljaycsIG51bGwpO1xuICAgIH0sXG4gICAgaGFuZGxlQ2hhbmdlUmFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZVJhbmdlKHZhbCkge1xuICAgICAgdGhpcy5taW5EYXRlID0gdmFsLm1pbkRhdGU7XG4gICAgICB0aGlzLm1heERhdGUgPSB2YWwubWF4RGF0ZTtcbiAgICAgIHRoaXMucmFuZ2VTdGF0ZSA9IHZhbC5yYW5nZVN0YXRlO1xuICAgIH0sXG4gICAgaGFuZGxlRGF0ZUlucHV0OiBmdW5jdGlvbiBoYW5kbGVEYXRlSW5wdXQodmFsdWUsIHR5cGUpIHtcbiAgICAgIHRoaXMuZGF0ZVVzZXJJbnB1dFt0eXBlXSA9IHZhbHVlO1xuICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gdGhpcy5kYXRlRm9ybWF0Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgdmFyIHBhcnNlZFZhbHVlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJwYXJzZURhdGVcIl0pKHZhbHVlLCB0aGlzLmRhdGVGb3JtYXQpO1xuXG4gICAgICBpZiAocGFyc2VkVmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRpc2FibGVkRGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLmRpc2FibGVkRGF0ZShuZXcgRGF0ZShwYXJzZWRWYWx1ZSkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSAnbWluJykge1xuICAgICAgICAgIHRoaXMubWluRGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibW9kaWZ5RGF0ZVwiXSkodGhpcy5taW5EYXRlIHx8IG5ldyBEYXRlKCksIHBhcnNlZFZhbHVlLmdldEZ1bGxZZWFyKCksIHBhcnNlZFZhbHVlLmdldE1vbnRoKCksIHBhcnNlZFZhbHVlLmdldERhdGUoKSk7XG4gICAgICAgICAgdGhpcy5sZWZ0RGF0ZSA9IG5ldyBEYXRlKHBhcnNlZFZhbHVlKTtcbiAgICAgICAgICBpZiAoIXRoaXMudW5saW5rUGFuZWxzKSB7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dE1vbnRoXCJdKSh0aGlzLmxlZnREYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tYXhEYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJtb2RpZnlEYXRlXCJdKSh0aGlzLm1heERhdGUgfHwgbmV3IERhdGUoKSwgcGFyc2VkVmFsdWUuZ2V0RnVsbFllYXIoKSwgcGFyc2VkVmFsdWUuZ2V0TW9udGgoKSwgcGFyc2VkVmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgICB0aGlzLnJpZ2h0RGF0ZSA9IG5ldyBEYXRlKHBhcnNlZFZhbHVlKTtcbiAgICAgICAgICBpZiAoIXRoaXMudW5saW5rUGFuZWxzKSB7XG4gICAgICAgICAgICB0aGlzLmxlZnREYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJwcmV2TW9udGhcIl0pKHBhcnNlZFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZURhdGVDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZURhdGVDaGFuZ2UodmFsdWUsIHR5cGUpIHtcbiAgICAgIHZhciBwYXJzZWRWYWx1ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wicGFyc2VEYXRlXCJdKSh2YWx1ZSwgdGhpcy5kYXRlRm9ybWF0KTtcbiAgICAgIGlmIChwYXJzZWRWYWx1ZSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ21pbicpIHtcbiAgICAgICAgICB0aGlzLm1pbkRhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm1vZGlmeURhdGVcIl0pKHRoaXMubWluRGF0ZSwgcGFyc2VkVmFsdWUuZ2V0RnVsbFllYXIoKSwgcGFyc2VkVmFsdWUuZ2V0TW9udGgoKSwgcGFyc2VkVmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgICBpZiAodGhpcy5taW5EYXRlID4gdGhpcy5tYXhEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLm1heERhdGUgPSB0aGlzLm1pbkRhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibW9kaWZ5RGF0ZVwiXSkodGhpcy5tYXhEYXRlLCBwYXJzZWRWYWx1ZS5nZXRGdWxsWWVhcigpLCBwYXJzZWRWYWx1ZS5nZXRNb250aCgpLCBwYXJzZWRWYWx1ZS5nZXREYXRlKCkpO1xuICAgICAgICAgIGlmICh0aGlzLm1heERhdGUgPCB0aGlzLm1pbkRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IHRoaXMubWF4RGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZVRpbWVJbnB1dDogZnVuY3Rpb24gaGFuZGxlVGltZUlucHV0KHZhbHVlLCB0eXBlKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdGhpcy50aW1lVXNlcklucHV0W3R5cGVdID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSB0aGlzLnRpbWVGb3JtYXQubGVuZ3RoKSByZXR1cm47XG4gICAgICB2YXIgcGFyc2VkVmFsdWUgPSBPYmplY3QoZGF0ZV91dGlsX1tcInBhcnNlRGF0ZVwiXSkodmFsdWUsIHRoaXMudGltZUZvcm1hdCk7XG5cbiAgICAgIGlmIChwYXJzZWRWYWx1ZSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ21pbicpIHtcbiAgICAgICAgICB0aGlzLm1pbkRhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm1vZGlmeVRpbWVcIl0pKHRoaXMubWluRGF0ZSwgcGFyc2VkVmFsdWUuZ2V0SG91cnMoKSwgcGFyc2VkVmFsdWUuZ2V0TWludXRlcygpLCBwYXJzZWRWYWx1ZS5nZXRTZWNvbmRzKCkpO1xuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uIChfKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXM0LiRyZWZzLm1pblRpbWVQaWNrZXIuYWRqdXN0U3Bpbm5lcnMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm1heERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm1vZGlmeVRpbWVcIl0pKHRoaXMubWF4RGF0ZSwgcGFyc2VkVmFsdWUuZ2V0SG91cnMoKSwgcGFyc2VkVmFsdWUuZ2V0TWludXRlcygpLCBwYXJzZWRWYWx1ZS5nZXRTZWNvbmRzKCkpO1xuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uIChfKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXM0LiRyZWZzLm1heFRpbWVQaWNrZXIuYWRqdXN0U3Bpbm5lcnMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlVGltZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlVGltZUNoYW5nZSh2YWx1ZSwgdHlwZSkge1xuICAgICAgdmFyIHBhcnNlZFZhbHVlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJwYXJzZURhdGVcIl0pKHZhbHVlLCB0aGlzLnRpbWVGb3JtYXQpO1xuICAgICAgaWYgKHBhcnNlZFZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlID09PSAnbWluJykge1xuICAgICAgICAgIHRoaXMubWluRGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibW9kaWZ5VGltZVwiXSkodGhpcy5taW5EYXRlLCBwYXJzZWRWYWx1ZS5nZXRIb3VycygpLCBwYXJzZWRWYWx1ZS5nZXRNaW51dGVzKCksIHBhcnNlZFZhbHVlLmdldFNlY29uZHMoKSk7XG4gICAgICAgICAgaWYgKHRoaXMubWluRGF0ZSA+IHRoaXMubWF4RGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXhEYXRlID0gdGhpcy5taW5EYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLiRyZWZzLm1pblRpbWVQaWNrZXIudmFsdWUgPSB0aGlzLm1pbkRhdGU7XG4gICAgICAgICAgdGhpcy5taW5UaW1lUGlja2VyVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibW9kaWZ5VGltZVwiXSkodGhpcy5tYXhEYXRlLCBwYXJzZWRWYWx1ZS5nZXRIb3VycygpLCBwYXJzZWRWYWx1ZS5nZXRNaW51dGVzKCksIHBhcnNlZFZhbHVlLmdldFNlY29uZHMoKSk7XG4gICAgICAgICAgaWYgKHRoaXMubWF4RGF0ZSA8IHRoaXMubWluRGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5taW5EYXRlID0gdGhpcy5tYXhEYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLiRyZWZzLm1heFRpbWVQaWNrZXIudmFsdWUgPSB0aGlzLm1pbkRhdGU7XG4gICAgICAgICAgdGhpcy5tYXhUaW1lUGlja2VyVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVSYW5nZVBpY2s6IGZ1bmN0aW9uIGhhbmRsZVJhbmdlUGljayh2YWwpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICB2YXIgY2xvc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG5cbiAgICAgIHZhciBkZWZhdWx0VGltZSA9IHRoaXMuZGVmYXVsdFRpbWUgfHwgW107XG4gICAgICB2YXIgbWluRGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibW9kaWZ5V2l0aFRpbWVTdHJpbmdcIl0pKHZhbC5taW5EYXRlLCBkZWZhdWx0VGltZVswXSk7XG4gICAgICB2YXIgbWF4RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibW9kaWZ5V2l0aFRpbWVTdHJpbmdcIl0pKHZhbC5tYXhEYXRlLCBkZWZhdWx0VGltZVsxXSk7XG5cbiAgICAgIGlmICh0aGlzLm1heERhdGUgPT09IG1heERhdGUgJiYgdGhpcy5taW5EYXRlID09PSBtaW5EYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMub25QaWNrICYmIHRoaXMub25QaWNrKHZhbCk7XG4gICAgICB0aGlzLm1heERhdGUgPSBtYXhEYXRlO1xuICAgICAgdGhpcy5taW5EYXRlID0gbWluRGF0ZTtcblxuICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvNzUzOSwgc2hvdWxkIHJlbW92ZSB0aGlzIGJsb2NrIHdoZW4gd2UgZG9uJ3QgaGF2ZSB0byBjYXJlIGFib3V0IENocm9taXVtIDU1IC0gNTdcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczUubWF4RGF0ZSA9IG1heERhdGU7XG4gICAgICAgIF90aGlzNS5taW5EYXRlID0gbWluRGF0ZTtcbiAgICAgIH0sIDEwKTtcbiAgICAgIGlmICghY2xvc2UgfHwgdGhpcy5zaG93VGltZSkgcmV0dXJuO1xuICAgICAgdGhpcy5oYW5kbGVDb25maXJtKCk7XG4gICAgfSxcbiAgICBoYW5kbGVTaG9ydGN1dENsaWNrOiBmdW5jdGlvbiBoYW5kbGVTaG9ydGN1dENsaWNrKHNob3J0Y3V0KSB7XG4gICAgICBpZiAoc2hvcnRjdXQub25DbGljaykge1xuICAgICAgICBzaG9ydGN1dC5vbkNsaWNrKHRoaXMpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlTWluVGltZVBpY2s6IGZ1bmN0aW9uIGhhbmRsZU1pblRpbWVQaWNrKHZhbHVlLCB2aXNpYmxlLCBmaXJzdCkge1xuICAgICAgdGhpcy5taW5EYXRlID0gdGhpcy5taW5EYXRlIHx8IG5ldyBEYXRlKCk7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5taW5EYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJtb2RpZnlUaW1lXCJdKSh0aGlzLm1pbkRhdGUsIHZhbHVlLmdldEhvdXJzKCksIHZhbHVlLmdldE1pbnV0ZXMoKSwgdmFsdWUuZ2V0U2Vjb25kcygpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICB0aGlzLm1pblRpbWVQaWNrZXJWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLm1heERhdGUgfHwgdGhpcy5tYXhEYXRlICYmIHRoaXMubWF4RGF0ZS5nZXRUaW1lKCkgPCB0aGlzLm1pbkRhdGUuZ2V0VGltZSgpKSB7XG4gICAgICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKHRoaXMubWluRGF0ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVNaW5UaW1lQ2xvc2U6IGZ1bmN0aW9uIGhhbmRsZU1pblRpbWVDbG9zZSgpIHtcbiAgICAgIHRoaXMubWluVGltZVBpY2tlclZpc2libGUgPSBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZU1heFRpbWVQaWNrOiBmdW5jdGlvbiBoYW5kbGVNYXhUaW1lUGljayh2YWx1ZSwgdmlzaWJsZSwgZmlyc3QpIHtcbiAgICAgIGlmICh0aGlzLm1heERhdGUgJiYgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5tYXhEYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJtb2RpZnlUaW1lXCJdKSh0aGlzLm1heERhdGUsIHZhbHVlLmdldEhvdXJzKCksIHZhbHVlLmdldE1pbnV0ZXMoKSwgdmFsdWUuZ2V0U2Vjb25kcygpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICB0aGlzLm1heFRpbWVQaWNrZXJWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWF4RGF0ZSAmJiB0aGlzLm1pbkRhdGUgJiYgdGhpcy5taW5EYXRlLmdldFRpbWUoKSA+IHRoaXMubWF4RGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUodGhpcy5tYXhEYXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZU1heFRpbWVDbG9zZTogZnVuY3Rpb24gaGFuZGxlTWF4VGltZUNsb3NlKCkge1xuICAgICAgdGhpcy5tYXhUaW1lUGlja2VyVmlzaWJsZSA9IGZhbHNlO1xuICAgIH0sXG5cblxuICAgIC8vIGxlZnRQcmV2KiwgcmlnaHROZXh0KiBuZWVkIHRvIHRha2UgY2FyZSBvZiBgdW5saW5rUGFuZWxzYFxuICAgIGxlZnRQcmV2WWVhcjogZnVuY3Rpb24gbGVmdFByZXZZZWFyKCkge1xuICAgICAgdGhpcy5sZWZ0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wicHJldlllYXJcIl0pKHRoaXMubGVmdERhdGUpO1xuICAgICAgaWYgKCF0aGlzLnVubGlua1BhbmVscykge1xuICAgICAgICB0aGlzLnJpZ2h0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dE1vbnRoXCJdKSh0aGlzLmxlZnREYXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGxlZnRQcmV2TW9udGg6IGZ1bmN0aW9uIGxlZnRQcmV2TW9udGgoKSB7XG4gICAgICB0aGlzLmxlZnREYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJwcmV2TW9udGhcIl0pKHRoaXMubGVmdERhdGUpO1xuICAgICAgaWYgKCF0aGlzLnVubGlua1BhbmVscykge1xuICAgICAgICB0aGlzLnJpZ2h0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dE1vbnRoXCJdKSh0aGlzLmxlZnREYXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJpZ2h0TmV4dFllYXI6IGZ1bmN0aW9uIHJpZ2h0TmV4dFllYXIoKSB7XG4gICAgICBpZiAoIXRoaXMudW5saW5rUGFuZWxzKSB7XG4gICAgICAgIHRoaXMubGVmdERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRZZWFyXCJdKSh0aGlzLmxlZnREYXRlKTtcbiAgICAgICAgdGhpcy5yaWdodERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRNb250aFwiXSkodGhpcy5sZWZ0RGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJpZ2h0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dFllYXJcIl0pKHRoaXMucmlnaHREYXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJpZ2h0TmV4dE1vbnRoOiBmdW5jdGlvbiByaWdodE5leHRNb250aCgpIHtcbiAgICAgIGlmICghdGhpcy51bmxpbmtQYW5lbHMpIHtcbiAgICAgICAgdGhpcy5sZWZ0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dE1vbnRoXCJdKSh0aGlzLmxlZnREYXRlKTtcbiAgICAgICAgdGhpcy5yaWdodERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRNb250aFwiXSkodGhpcy5sZWZ0RGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJpZ2h0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dE1vbnRoXCJdKSh0aGlzLnJpZ2h0RGF0ZSk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLy8gbGVmdE5leHQqLCByaWdodFByZXYqIGFyZSBjYWxsZWQgd2hlbiBgdW5saW5rUGFuZWxzYCBpcyB0cnVlXG4gICAgbGVmdE5leHRZZWFyOiBmdW5jdGlvbiBsZWZ0TmV4dFllYXIoKSB7XG4gICAgICB0aGlzLmxlZnREYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJuZXh0WWVhclwiXSkodGhpcy5sZWZ0RGF0ZSk7XG4gICAgfSxcbiAgICBsZWZ0TmV4dE1vbnRoOiBmdW5jdGlvbiBsZWZ0TmV4dE1vbnRoKCkge1xuICAgICAgdGhpcy5sZWZ0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dE1vbnRoXCJdKSh0aGlzLmxlZnREYXRlKTtcbiAgICB9LFxuICAgIHJpZ2h0UHJldlllYXI6IGZ1bmN0aW9uIHJpZ2h0UHJldlllYXIoKSB7XG4gICAgICB0aGlzLnJpZ2h0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wicHJldlllYXJcIl0pKHRoaXMucmlnaHREYXRlKTtcbiAgICB9LFxuICAgIHJpZ2h0UHJldk1vbnRoOiBmdW5jdGlvbiByaWdodFByZXZNb250aCgpIHtcbiAgICAgIHRoaXMucmlnaHREYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJwcmV2TW9udGhcIl0pKHRoaXMucmlnaHREYXRlKTtcbiAgICB9LFxuICAgIGhhbmRsZUNvbmZpcm06IGZ1bmN0aW9uIGhhbmRsZUNvbmZpcm0oKSB7XG4gICAgICB2YXIgdmlzaWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLmlzVmFsaWRWYWx1ZShbdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGVdKSkge1xuICAgICAgICB0aGlzLiRlbWl0KCdwaWNrJywgW3RoaXMubWluRGF0ZSwgdGhpcy5tYXhEYXRlXSwgdmlzaWJsZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBpc1ZhbGlkVmFsdWU6IGZ1bmN0aW9uIGlzVmFsaWRWYWx1ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlICYmIHZhbHVlWzBdICYmIHZhbHVlWzFdICYmIE9iamVjdChkYXRlX3V0aWxfW1wiaXNEYXRlXCJdKSh2YWx1ZVswXSkgJiYgT2JqZWN0KGRhdGVfdXRpbF9bXCJpc0RhdGVcIl0pKHZhbHVlWzFdKSAmJiB2YWx1ZVswXS5nZXRUaW1lKCkgPD0gdmFsdWVbMV0uZ2V0VGltZSgpICYmICh0eXBlb2YgdGhpcy5kaXNhYmxlZERhdGUgPT09ICdmdW5jdGlvbicgPyAhdGhpcy5kaXNhYmxlZERhdGUodmFsdWVbMF0pICYmICF0aGlzLmRpc2FibGVkRGF0ZSh2YWx1ZVsxXSkgOiB0cnVlKTtcbiAgICB9LFxuICAgIHJlc2V0VmlldzogZnVuY3Rpb24gcmVzZXRWaWV3KCkge1xuICAgICAgLy8gTk9URTogdGhpcyBpcyBhIGhhY2sgdG8gcmVzZXQge21pbiwgbWF4fURhdGUgb24gcGlja2VyIG9wZW4uXG4gICAgICAvLyBUT0RPOiBjb3JyZWN0IHdheSBvZiBkb2luZyBzbyBpcyB0byByZWZhY3RvciB7bWluLCBtYXh9RGF0ZSB0byBiZSBkZXBlbmRlbnQgb24gdmFsdWUgYW5kIGludGVybmFsIHNlbGVjdGlvbiBzdGF0ZVxuICAgICAgLy8gICAgICAgYW4gYWx0ZXJuYXRpdmUgd291bGQgYmUgcmVzZXRWaWV3IHdoZW5ldmVyIHBpY2tlciBiZWNvbWVzIHZpc2libGUsIHNob3VsZCBhbHNvIGludmVzdGlnYXRlIGRhdGUtcGFuZWwncyByZXNldFZpZXdcbiAgICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgdGhpcy5tYXhEYXRlID09IG51bGwpIHRoaXMucmFuZ2VTdGF0ZS5zZWxlY3RpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubWluRGF0ZSA9IHRoaXMudmFsdWUgJiYgT2JqZWN0KGRhdGVfdXRpbF9bXCJpc0RhdGVcIl0pKHRoaXMudmFsdWVbMF0pID8gbmV3IERhdGUodGhpcy52YWx1ZVswXSkgOiBudWxsO1xuICAgICAgdGhpcy5tYXhEYXRlID0gdGhpcy52YWx1ZSAmJiBPYmplY3QoZGF0ZV91dGlsX1tcImlzRGF0ZVwiXSkodGhpcy52YWx1ZVswXSkgPyBuZXcgRGF0ZSh0aGlzLnZhbHVlWzFdKSA6IG51bGw7XG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHsgVGltZVBpY2tlcjogcGFuZWxfdGltZSwgRGF0ZVRhYmxlOiBkYXRlX3RhYmxlLCBFbElucHV0OiBpbnB1dF9kZWZhdWx0LmEsIEVsQnV0dG9uOiBidXR0b25fZGVmYXVsdC5hIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvZGF0ZS1yYW5nZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFuZWxfZGF0ZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChkYXRlX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9kYXRlLXJhbmdlLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGRhdGVfcmFuZ2VfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBwYW5lbF9kYXRlX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBkYXRlX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfMjY1Mjg0OWFfcmVuZGVyLFxuICBkYXRlX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfMjY1Mjg0OWFfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBkYXRlX3JhbmdlX2FwaTsgfVxuZGF0ZV9yYW5nZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9kYXRlLXJhbmdlLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkYXRlX3JhbmdlID0gKGRhdGVfcmFuZ2VfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvbW9udGgtcmFuZ2UudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWYyNjQ1ZmI4JlxudmFyIG1vbnRoX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfZjI2NDVmYjhfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwidHJhbnNpdGlvblwiLFxuICAgIHtcbiAgICAgIGF0dHJzOiB7IG5hbWU6IFwiZWwtem9vbS1pbi10b3BcIiB9LFxuICAgICAgb246IHtcbiAgICAgICAgXCJhZnRlci1sZWF2ZVwiOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICBfdm0uJGVtaXQoXCJkb2Rlc3Ryb3lcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX2MoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnZpc2libGUsXG4gICAgICAgICAgICAgIGV4cHJlc3Npb246IFwidmlzaWJsZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1waWNrZXItcGFuZWwgZWwtZGF0ZS1yYW5nZS1waWNrZXIgZWwtcG9wcGVyXCIsXG4gICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJoYXMtc2lkZWJhclwiOiBfdm0uJHNsb3RzLnNpZGViYXIgfHwgX3ZtLnNob3J0Y3V0c1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF92bS5wb3BwZXJDbGFzc1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtcGlja2VyLXBhbmVsX19ib2R5LXdyYXBwZXJcIiB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfdm0uX3QoXCJzaWRlYmFyXCIpLFxuICAgICAgICAgICAgICBfdm0uc2hvcnRjdXRzXG4gICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1waWNrZXItcGFuZWxfX3NpZGViYXJcIiB9LFxuICAgICAgICAgICAgICAgICAgICBfdm0uX2woX3ZtLnNob3J0Y3V0cywgZnVuY3Rpb24oc2hvcnRjdXQsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1waWNrZXItcGFuZWxfX3Nob3J0Y3V0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHR5cGU6IFwiYnV0dG9uXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlU2hvcnRjdXRDbGljayhzaG9ydGN1dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhzaG9ydGN1dC50ZXh0KSldXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtcGlja2VyLXBhbmVsX19ib2R5XCIgfSwgW1xuICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgICAgXCJlbC1waWNrZXItcGFuZWxfX2NvbnRlbnQgZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2NvbnRlbnQgaXMtbGVmdFwiXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWRhdGUtcmFuZ2UtcGlja2VyX19oZWFkZXJcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtcGlja2VyLXBhbmVsX19pY29uLWJ0biBlbC1pY29uLWQtYXJyb3ctbGVmdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgdHlwZTogXCJidXR0b25cIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5sZWZ0UHJldlllYXIgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgIF92bS51bmxpbmtQYW5lbHNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWljb24tZC1hcnJvdy1yaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiB7IFwiaXMtZGlzYWJsZWRcIjogIV92bS5lbmFibGVZZWFyQXJyb3cgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhX3ZtLmVuYWJsZVllYXJBcnJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5sZWZ0TmV4dFllYXIgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcImRpdlwiLCBbX3ZtLl92KF92bS5fcyhfdm0ubGVmdExhYmVsKSldKVxuICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJtb250aC10YWJsZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2VsZWN0aW9uLW1vZGVcIjogXCJyYW5nZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogX3ZtLmxlZnREYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZWZhdWx0LXZhbHVlXCI6IF92bS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm1pbi1kYXRlXCI6IF92bS5taW5EYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJtYXgtZGF0ZVwiOiBfdm0ubWF4RGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicmFuZ2Utc3RhdGVcIjogX3ZtLnJhbmdlU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpc2FibGVkLWRhdGVcIjogX3ZtLmRpc2FibGVkRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXJhbmdlOiBfdm0uaGFuZGxlQ2hhbmdlUmFuZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaWNrOiBfdm0uaGFuZGxlUmFuZ2VQaWNrXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgICAgXCJlbC1waWNrZXItcGFuZWxfX2NvbnRlbnQgZWwtZGF0ZS1yYW5nZS1waWNrZXJfX2NvbnRlbnQgaXMtcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1kYXRlLXJhbmdlLXBpY2tlcl9faGVhZGVyXCIgfSwgW1xuICAgICAgICAgICAgICAgICAgICAgIF92bS51bmxpbmtQYW5lbHNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWljb24tZC1hcnJvdy1sZWZ0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IHsgXCJpcy1kaXNhYmxlZFwiOiAhX3ZtLmVuYWJsZVllYXJBcnJvdyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFfdm0uZW5hYmxlWWVhckFycm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLnJpZ2h0UHJldlllYXIgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcImJ1dHRvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC1waWNrZXItcGFuZWxfX2ljb24tYnRuIGVsLWljb24tZC1hcnJvdy1yaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgdHlwZTogXCJidXR0b25cIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5yaWdodE5leHRZZWFyIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcImRpdlwiLCBbX3ZtLl92KF92bS5fcyhfdm0ucmlnaHRMYWJlbCkpXSlcbiAgICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgICAgIF9jKFwibW9udGgtdGFibGVcIiwge1xuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInNlbGVjdGlvbi1tb2RlXCI6IFwicmFuZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IF92bS5yaWdodERhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRlZmF1bHQtdmFsdWVcIjogX3ZtLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibWluLWRhdGVcIjogX3ZtLm1pbkRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm1heC1kYXRlXCI6IF92bS5tYXhEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJyYW5nZS1zdGF0ZVwiOiBfdm0ucmFuZ2VTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGlzYWJsZWQtZGF0ZVwiOiBfdm0uZGlzYWJsZWREYXRlXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcmFuZ2U6IF92bS5oYW5kbGVDaGFuZ2VSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpY2s6IF92bS5oYW5kbGVSYW5nZVBpY2tcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICBdXG4gICAgICApXG4gICAgXVxuICApXG59XG52YXIgbW9udGhfcmFuZ2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF9mMjY0NWZiOF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxubW9udGhfcmFuZ2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF9mMjY0NWZiOF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9tb250aC1yYW5nZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZjI2NDVmYjgmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9tb250aC1yYW5nZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cblxuXG5cbnZhciBtb250aF9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2NhbGNEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbiBjYWxjRGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShkZWZhdWx0VmFsdWUpKSB7XG4gICAgcmV0dXJuIFtuZXcgRGF0ZShkZWZhdWx0VmFsdWVbMF0pLCBuZXcgRGF0ZShkZWZhdWx0VmFsdWVbMV0pXTtcbiAgfSBlbHNlIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICByZXR1cm4gW25ldyBEYXRlKGRlZmF1bHRWYWx1ZSksIE9iamVjdChkYXRlX3V0aWxfW1wibmV4dE1vbnRoXCJdKShuZXcgRGF0ZShkZWZhdWx0VmFsdWUpKV07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtuZXcgRGF0ZSgpLCBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRNb250aFwiXSkobmV3IERhdGUoKSldO1xuICB9XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbW9udGhfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBtaXhpbnM6IFtsb2NhbGVfZGVmYXVsdC5hXSxcblxuICBkaXJlY3RpdmVzOiB7IENsaWNrb3V0c2lkZTogY2xpY2tvdXRzaWRlX2RlZmF1bHQuYSB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgYnRuRGlzYWJsZWQ6IGZ1bmN0aW9uIGJ0bkRpc2FibGVkKCkge1xuICAgICAgcmV0dXJuICEodGhpcy5taW5EYXRlICYmIHRoaXMubWF4RGF0ZSAmJiAhdGhpcy5zZWxlY3RpbmcgJiYgdGhpcy5pc1ZhbGlkVmFsdWUoW3RoaXMubWluRGF0ZSwgdGhpcy5tYXhEYXRlXSkpO1xuICAgIH0sXG4gICAgbGVmdExhYmVsOiBmdW5jdGlvbiBsZWZ0TGFiZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sZWZ0RGF0ZS5nZXRGdWxsWWVhcigpICsgJyAnICsgdGhpcy50KCdlbC5kYXRlcGlja2VyLnllYXInKTtcbiAgICB9LFxuICAgIHJpZ2h0TGFiZWw6IGZ1bmN0aW9uIHJpZ2h0TGFiZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yaWdodERhdGUuZ2V0RnVsbFllYXIoKSArICcgJyArIHRoaXMudCgnZWwuZGF0ZXBpY2tlci55ZWFyJyk7XG4gICAgfSxcbiAgICBsZWZ0WWVhcjogZnVuY3Rpb24gbGVmdFllYXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sZWZ0RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIH0sXG4gICAgcmlnaHRZZWFyOiBmdW5jdGlvbiByaWdodFllYXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yaWdodERhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5sZWZ0RGF0ZS5nZXRGdWxsWWVhcigpID8gdGhpcy5sZWZ0RGF0ZS5nZXRGdWxsWWVhcigpICsgMSA6IHRoaXMucmlnaHREYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgfSxcbiAgICBlbmFibGVZZWFyQXJyb3c6IGZ1bmN0aW9uIGVuYWJsZVllYXJBcnJvdygpIHtcbiAgICAgIHJldHVybiB0aGlzLnVubGlua1BhbmVscyAmJiB0aGlzLnJpZ2h0WWVhciA+IHRoaXMubGVmdFllYXIgKyAxO1xuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb3BwZXJDbGFzczogJycsXG4gICAgICB2YWx1ZTogW10sXG4gICAgICBkZWZhdWx0VmFsdWU6IG51bGwsXG4gICAgICBkZWZhdWx0VGltZTogbnVsbCxcbiAgICAgIG1pbkRhdGU6ICcnLFxuICAgICAgbWF4RGF0ZTogJycsXG4gICAgICBsZWZ0RGF0ZTogbmV3IERhdGUoKSxcbiAgICAgIHJpZ2h0RGF0ZTogT2JqZWN0KGRhdGVfdXRpbF9bXCJuZXh0WWVhclwiXSkobmV3IERhdGUoKSksXG4gICAgICByYW5nZVN0YXRlOiB7XG4gICAgICAgIGVuZERhdGU6IG51bGwsXG4gICAgICAgIHNlbGVjdGluZzogZmFsc2UsXG4gICAgICAgIHJvdzogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsXG4gICAgICB9LFxuICAgICAgc2hvcnRjdXRzOiAnJyxcbiAgICAgIHZpc2libGU6ICcnLFxuICAgICAgZGlzYWJsZWREYXRlOiAnJyxcbiAgICAgIGZvcm1hdDogJycsXG4gICAgICBhcnJvd0NvbnRyb2w6IGZhbHNlLFxuICAgICAgdW5saW5rUGFuZWxzOiBmYWxzZVxuICAgIH07XG4gIH0sXG5cblxuICB3YXRjaDoge1xuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShuZXdWYWwpIHtcbiAgICAgIGlmICghbmV3VmFsKSB7XG4gICAgICAgIHRoaXMubWluRGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMubWF4RGF0ZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobmV3VmFsKSkge1xuICAgICAgICB0aGlzLm1pbkRhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcImlzRGF0ZVwiXSkobmV3VmFsWzBdKSA/IG5ldyBEYXRlKG5ld1ZhbFswXSkgOiBudWxsO1xuICAgICAgICB0aGlzLm1heERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcImlzRGF0ZVwiXSkobmV3VmFsWzFdKSA/IG5ldyBEYXRlKG5ld1ZhbFsxXSkgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5taW5EYXRlKSB7XG4gICAgICAgICAgdGhpcy5sZWZ0RGF0ZSA9IHRoaXMubWluRGF0ZTtcbiAgICAgICAgICBpZiAodGhpcy51bmxpbmtQYW5lbHMgJiYgdGhpcy5tYXhEYXRlKSB7XG4gICAgICAgICAgICB2YXIgbWluRGF0ZVllYXIgPSB0aGlzLm1pbkRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgIHZhciBtYXhEYXRlWWVhciA9IHRoaXMubWF4RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgdGhpcy5yaWdodERhdGUgPSBtaW5EYXRlWWVhciA9PT0gbWF4RGF0ZVllYXIgPyBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRZZWFyXCJdKSh0aGlzLm1heERhdGUpIDogdGhpcy5tYXhEYXRlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dFllYXJcIl0pKHRoaXMubGVmdERhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxlZnREYXRlID0gbW9udGhfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19jYWxjRGVmYXVsdFZhbHVlKHRoaXMuZGVmYXVsdFZhbHVlKVswXTtcbiAgICAgICAgICB0aGlzLnJpZ2h0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dFllYXJcIl0pKHRoaXMubGVmdERhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2YWwpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgICB2YXIgX2NhbGNEZWZhdWx0VmFsdWUgPSBtb250aF9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2NhbGNEZWZhdWx0VmFsdWUodmFsKSxcbiAgICAgICAgICAgIGxlZnQgPSBfY2FsY0RlZmF1bHRWYWx1ZVswXSxcbiAgICAgICAgICAgIHJpZ2h0ID0gX2NhbGNEZWZhdWx0VmFsdWVbMV07XG5cbiAgICAgICAgdGhpcy5sZWZ0RGF0ZSA9IGxlZnQ7XG4gICAgICAgIHRoaXMucmlnaHREYXRlID0gdmFsICYmIHZhbFsxXSAmJiBsZWZ0LmdldEZ1bGxZZWFyKCkgIT09IHJpZ2h0LmdldEZ1bGxZZWFyKCkgJiYgdGhpcy51bmxpbmtQYW5lbHMgPyByaWdodCA6IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dFllYXJcIl0pKHRoaXMubGVmdERhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFuZGxlQ2xlYXI6IGZ1bmN0aW9uIGhhbmRsZUNsZWFyKCkge1xuICAgICAgdGhpcy5taW5EYXRlID0gbnVsbDtcbiAgICAgIHRoaXMubWF4RGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLmxlZnREYXRlID0gbW9udGhfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19jYWxjRGVmYXVsdFZhbHVlKHRoaXMuZGVmYXVsdFZhbHVlKVswXTtcbiAgICAgIHRoaXMucmlnaHREYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJuZXh0WWVhclwiXSkodGhpcy5sZWZ0RGF0ZSk7XG4gICAgICB0aGlzLiRlbWl0KCdwaWNrJywgbnVsbCk7XG4gICAgfSxcbiAgICBoYW5kbGVDaGFuZ2VSYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hhbmdlUmFuZ2UodmFsKSB7XG4gICAgICB0aGlzLm1pbkRhdGUgPSB2YWwubWluRGF0ZTtcbiAgICAgIHRoaXMubWF4RGF0ZSA9IHZhbC5tYXhEYXRlO1xuICAgICAgdGhpcy5yYW5nZVN0YXRlID0gdmFsLnJhbmdlU3RhdGU7XG4gICAgfSxcbiAgICBoYW5kbGVSYW5nZVBpY2s6IGZ1bmN0aW9uIGhhbmRsZVJhbmdlUGljayh2YWwpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBjbG9zZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcblxuICAgICAgdmFyIGRlZmF1bHRUaW1lID0gdGhpcy5kZWZhdWx0VGltZSB8fCBbXTtcbiAgICAgIHZhciBtaW5EYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJtb2RpZnlXaXRoVGltZVN0cmluZ1wiXSkodmFsLm1pbkRhdGUsIGRlZmF1bHRUaW1lWzBdKTtcbiAgICAgIHZhciBtYXhEYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJtb2RpZnlXaXRoVGltZVN0cmluZ1wiXSkodmFsLm1heERhdGUsIGRlZmF1bHRUaW1lWzFdKTtcbiAgICAgIGlmICh0aGlzLm1heERhdGUgPT09IG1heERhdGUgJiYgdGhpcy5taW5EYXRlID09PSBtaW5EYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMub25QaWNrICYmIHRoaXMub25QaWNrKHZhbCk7XG4gICAgICB0aGlzLm1heERhdGUgPSBtYXhEYXRlO1xuICAgICAgdGhpcy5taW5EYXRlID0gbWluRGF0ZTtcblxuICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvNzUzOSwgc2hvdWxkIHJlbW92ZSB0aGlzIGJsb2NrIHdoZW4gd2UgZG9uJ3QgaGF2ZSB0byBjYXJlIGFib3V0IENocm9taXVtIDU1IC0gNTdcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5tYXhEYXRlID0gbWF4RGF0ZTtcbiAgICAgICAgX3RoaXMubWluRGF0ZSA9IG1pbkRhdGU7XG4gICAgICB9LCAxMCk7XG4gICAgICBpZiAoIWNsb3NlKSByZXR1cm47XG4gICAgICB0aGlzLmhhbmRsZUNvbmZpcm0oKTtcbiAgICB9LFxuICAgIGhhbmRsZVNob3J0Y3V0Q2xpY2s6IGZ1bmN0aW9uIGhhbmRsZVNob3J0Y3V0Q2xpY2soc2hvcnRjdXQpIHtcbiAgICAgIGlmIChzaG9ydGN1dC5vbkNsaWNrKSB7XG4gICAgICAgIHNob3J0Y3V0Lm9uQ2xpY2sodGhpcyk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLy8gbGVmdFByZXYqLCByaWdodE5leHQqIG5lZWQgdG8gdGFrZSBjYXJlIG9mIGB1bmxpbmtQYW5lbHNgXG4gICAgbGVmdFByZXZZZWFyOiBmdW5jdGlvbiBsZWZ0UHJldlllYXIoKSB7XG4gICAgICB0aGlzLmxlZnREYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJwcmV2WWVhclwiXSkodGhpcy5sZWZ0RGF0ZSk7XG4gICAgICBpZiAoIXRoaXMudW5saW5rUGFuZWxzKSB7XG4gICAgICAgIHRoaXMucmlnaHREYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJwcmV2WWVhclwiXSkodGhpcy5yaWdodERhdGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmlnaHROZXh0WWVhcjogZnVuY3Rpb24gcmlnaHROZXh0WWVhcigpIHtcbiAgICAgIGlmICghdGhpcy51bmxpbmtQYW5lbHMpIHtcbiAgICAgICAgdGhpcy5sZWZ0RGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibmV4dFllYXJcIl0pKHRoaXMubGVmdERhdGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5yaWdodERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcIm5leHRZZWFyXCJdKSh0aGlzLnJpZ2h0RGF0ZSk7XG4gICAgfSxcblxuXG4gICAgLy8gbGVmdE5leHQqLCByaWdodFByZXYqIGFyZSBjYWxsZWQgd2hlbiBgdW5saW5rUGFuZWxzYCBpcyB0cnVlXG4gICAgbGVmdE5leHRZZWFyOiBmdW5jdGlvbiBsZWZ0TmV4dFllYXIoKSB7XG4gICAgICB0aGlzLmxlZnREYXRlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJuZXh0WWVhclwiXSkodGhpcy5sZWZ0RGF0ZSk7XG4gICAgfSxcbiAgICByaWdodFByZXZZZWFyOiBmdW5jdGlvbiByaWdodFByZXZZZWFyKCkge1xuICAgICAgdGhpcy5yaWdodERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcInByZXZZZWFyXCJdKSh0aGlzLnJpZ2h0RGF0ZSk7XG4gICAgfSxcbiAgICBoYW5kbGVDb25maXJtOiBmdW5jdGlvbiBoYW5kbGVDb25maXJtKCkge1xuICAgICAgdmFyIHZpc2libGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5pc1ZhbGlkVmFsdWUoW3RoaXMubWluRGF0ZSwgdGhpcy5tYXhEYXRlXSkpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgncGljaycsIFt0aGlzLm1pbkRhdGUsIHRoaXMubWF4RGF0ZV0sIHZpc2libGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaXNWYWxpZFZhbHVlOiBmdW5jdGlvbiBpc1ZhbGlkVmFsdWUodmFsdWUpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAmJiB2YWx1ZVswXSAmJiB2YWx1ZVsxXSAmJiBPYmplY3QoZGF0ZV91dGlsX1tcImlzRGF0ZVwiXSkodmFsdWVbMF0pICYmIE9iamVjdChkYXRlX3V0aWxfW1wiaXNEYXRlXCJdKSh2YWx1ZVsxXSkgJiYgdmFsdWVbMF0uZ2V0VGltZSgpIDw9IHZhbHVlWzFdLmdldFRpbWUoKSAmJiAodHlwZW9mIHRoaXMuZGlzYWJsZWREYXRlID09PSAnZnVuY3Rpb24nID8gIXRoaXMuZGlzYWJsZWREYXRlKHZhbHVlWzBdKSAmJiAhdGhpcy5kaXNhYmxlZERhdGUodmFsdWVbMV0pIDogdHJ1ZSk7XG4gICAgfSxcbiAgICByZXNldFZpZXc6IGZ1bmN0aW9uIHJlc2V0VmlldygpIHtcbiAgICAgIC8vIE5PVEU6IHRoaXMgaXMgYSBoYWNrIHRvIHJlc2V0IHttaW4sIG1heH1EYXRlIG9uIHBpY2tlciBvcGVuLlxuICAgICAgLy8gVE9ETzogY29ycmVjdCB3YXkgb2YgZG9pbmcgc28gaXMgdG8gcmVmYWN0b3Ige21pbiwgbWF4fURhdGUgdG8gYmUgZGVwZW5kZW50IG9uIHZhbHVlIGFuZCBpbnRlcm5hbCBzZWxlY3Rpb24gc3RhdGVcbiAgICAgIC8vICAgICAgIGFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIHJlc2V0VmlldyB3aGVuZXZlciBwaWNrZXIgYmVjb21lcyB2aXNpYmxlLCBzaG91bGQgYWxzbyBpbnZlc3RpZ2F0ZSBkYXRlLXBhbmVsJ3MgcmVzZXRWaWV3XG4gICAgICB0aGlzLm1pbkRhdGUgPSB0aGlzLnZhbHVlICYmIE9iamVjdChkYXRlX3V0aWxfW1wiaXNEYXRlXCJdKSh0aGlzLnZhbHVlWzBdKSA/IG5ldyBEYXRlKHRoaXMudmFsdWVbMF0pIDogbnVsbDtcbiAgICAgIHRoaXMubWF4RGF0ZSA9IHRoaXMudmFsdWUgJiYgT2JqZWN0KGRhdGVfdXRpbF9bXCJpc0RhdGVcIl0pKHRoaXMudmFsdWVbMF0pID8gbmV3IERhdGUodGhpcy52YWx1ZVsxXSkgOiBudWxsO1xuICAgIH1cbiAgfSxcblxuICBjb21wb25lbnRzOiB7IE1vbnRoVGFibGU6IG1vbnRoX3RhYmxlLCBFbElucHV0OiBpbnB1dF9kZWZhdWx0LmEsIEVsQnV0dG9uOiBidXR0b25fZGVmYXVsdC5hIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvbW9udGgtcmFuZ2UudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhbmVsX21vbnRoX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKG1vbnRoX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC9tb250aC1yYW5nZS52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBtb250aF9yYW5nZV9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhbmVsX21vbnRoX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBtb250aF9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2YyNjQ1ZmI4X3JlbmRlcixcbiAgbW9udGhfcmFuZ2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF9mMjY0NWZiOF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIG1vbnRoX3JhbmdlX2FwaTsgfVxubW9udGhfcmFuZ2VfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvbW9udGgtcmFuZ2UudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG1vbnRoX3JhbmdlID0gKG1vbnRoX3JhbmdlX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BpY2tlci9kYXRlLXBpY2tlci5qc1xuXG5cblxuXG5cbnZhciBkYXRlX3BpY2tlcl9nZXRQYW5lbCA9IGZ1bmN0aW9uIGdldFBhbmVsKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09ICdkYXRlcmFuZ2UnIHx8IHR5cGUgPT09ICdkYXRldGltZXJhbmdlJykge1xuICAgIHJldHVybiBkYXRlX3JhbmdlO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdtb250aHJhbmdlJykge1xuICAgIHJldHVybiBtb250aF9yYW5nZTtcbiAgfVxuICByZXR1cm4gcGFuZWxfZGF0ZTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGRhdGVfcGlja2VyID0gKHtcbiAgbWl4aW5zOiBbcGlja2VyXSxcblxuICBuYW1lOiAnRWxEYXRlUGlja2VyJyxcblxuICBwcm9wczoge1xuICAgIHR5cGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdkYXRlJ1xuICAgIH0sXG4gICAgdGltZUFycm93Q29udHJvbDogQm9vbGVhblxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgdHlwZTogZnVuY3Rpb24gdHlwZShfdHlwZSkge1xuICAgICAgaWYgKHRoaXMucGlja2VyKSB7XG4gICAgICAgIHRoaXMudW5tb3VudFBpY2tlcigpO1xuICAgICAgICB0aGlzLnBhbmVsID0gZGF0ZV9waWNrZXJfZ2V0UGFuZWwoX3R5cGUpO1xuICAgICAgICB0aGlzLm1vdW50UGlja2VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhbmVsID0gZGF0ZV9waWNrZXJfZ2V0UGFuZWwoX3R5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuICAgIHRoaXMucGFuZWwgPSBkYXRlX3BpY2tlcl9nZXRQYW5lbCh0aGlzLnR5cGUpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZGF0ZV9waWNrZXIuaW5zdGFsbCA9IGZ1bmN0aW9uIGluc3RhbGwoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoZGF0ZV9waWNrZXIubmFtZSwgZGF0ZV9waWNrZXIpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfZGF0ZV9waWNrZXIgPSAoZGF0ZV9waWNrZXIpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS1zZWxlY3QudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTUxYWI5MzIwJlxudmFyIHRpbWVfc2VsZWN0dnVlX3R5cGVfdGVtcGxhdGVfaWRfNTFhYjkzMjBfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwidHJhbnNpdGlvblwiLFxuICAgIHtcbiAgICAgIGF0dHJzOiB7IG5hbWU6IFwiZWwtem9vbS1pbi10b3BcIiB9LFxuICAgICAgb246IHtcbiAgICAgICAgXCJiZWZvcmUtZW50ZXJcIjogX3ZtLmhhbmRsZU1lbnVFbnRlcixcbiAgICAgICAgXCJhZnRlci1sZWF2ZVwiOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICBfdm0uJGVtaXQoXCJkb2Rlc3Ryb3lcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX2MoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnZpc2libGUsXG4gICAgICAgICAgICAgIGV4cHJlc3Npb246IFwidmlzaWJsZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICByZWY6IFwicG9wcGVyXCIsXG4gICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcGlja2VyLXBhbmVsIHRpbWUtc2VsZWN0IGVsLXBvcHBlclwiLFxuICAgICAgICAgIGNsYXNzOiBfdm0ucG9wcGVyQ2xhc3MsXG4gICAgICAgICAgc3R5bGU6IHsgd2lkdGg6IF92bS53aWR0aCArIFwicHhcIiB9XG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwiZWwtc2Nyb2xsYmFyXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dHJzOiB7IG5vcmVzaXplOiBcIlwiLCBcIndyYXAtY2xhc3NcIjogXCJlbC1waWNrZXItcGFuZWxfX2NvbnRlbnRcIiB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX3ZtLl9sKF92bS5pdGVtcywgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBrZXk6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ0aW1lLXNlbGVjdC1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogX3ZtLnZhbHVlID09PSBpdGVtLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogaXRlbS52YWx1ZSA9PT0gX3ZtLmRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH0sXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLmhhbmRsZUNsaWNrKGl0ZW0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKGl0ZW0udmFsdWUpKV1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKVxuICAgICAgICBdLFxuICAgICAgICAxXG4gICAgICApXG4gICAgXVxuICApXG59XG52YXIgdGltZV9zZWxlY3R2dWVfdHlwZV90ZW1wbGF0ZV9pZF81MWFiOTMyMF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxudGltZV9zZWxlY3R2dWVfdHlwZV90ZW1wbGF0ZV9pZF81MWFiOTMyMF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC90aW1lLXNlbGVjdC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NTFhYjkzMjAmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC90aW1lLXNlbGVjdC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxudmFyIHBhcnNlVGltZSA9IGZ1bmN0aW9uIHBhcnNlVGltZSh0aW1lKSB7XG4gIHZhciB2YWx1ZXMgPSAodGltZSB8fCAnJykuc3BsaXQoJzonKTtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPj0gMikge1xuICAgIHZhciBob3VycyA9IHBhcnNlSW50KHZhbHVlc1swXSwgMTApO1xuICAgIHZhciBtaW51dGVzID0gcGFyc2VJbnQodmFsdWVzWzFdLCAxMCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaG91cnM6IGhvdXJzLFxuICAgICAgbWludXRlczogbWludXRlc1xuICAgIH07XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgY29tcGFyZVRpbWUgPSBmdW5jdGlvbiBjb21wYXJlVGltZSh0aW1lMSwgdGltZTIpIHtcbiAgdmFyIHZhbHVlMSA9IHBhcnNlVGltZSh0aW1lMSk7XG4gIHZhciB2YWx1ZTIgPSBwYXJzZVRpbWUodGltZTIpO1xuXG4gIHZhciBtaW51dGVzMSA9IHZhbHVlMS5taW51dGVzICsgdmFsdWUxLmhvdXJzICogNjA7XG4gIHZhciBtaW51dGVzMiA9IHZhbHVlMi5taW51dGVzICsgdmFsdWUyLmhvdXJzICogNjA7XG5cbiAgaWYgKG1pbnV0ZXMxID09PSBtaW51dGVzMikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIG1pbnV0ZXMxID4gbWludXRlczIgPyAxIDogLTE7XG59O1xuXG52YXIgZm9ybWF0VGltZSA9IGZ1bmN0aW9uIGZvcm1hdFRpbWUodGltZSkge1xuICByZXR1cm4gKHRpbWUuaG91cnMgPCAxMCA/ICcwJyArIHRpbWUuaG91cnMgOiB0aW1lLmhvdXJzKSArICc6JyArICh0aW1lLm1pbnV0ZXMgPCAxMCA/ICcwJyArIHRpbWUubWludXRlcyA6IHRpbWUubWludXRlcyk7XG59O1xuXG52YXIgbmV4dFRpbWUgPSBmdW5jdGlvbiBuZXh0VGltZSh0aW1lLCBzdGVwKSB7XG4gIHZhciB0aW1lVmFsdWUgPSBwYXJzZVRpbWUodGltZSk7XG4gIHZhciBzdGVwVmFsdWUgPSBwYXJzZVRpbWUoc3RlcCk7XG5cbiAgdmFyIG5leHQgPSB7XG4gICAgaG91cnM6IHRpbWVWYWx1ZS5ob3VycyxcbiAgICBtaW51dGVzOiB0aW1lVmFsdWUubWludXRlc1xuICB9O1xuXG4gIG5leHQubWludXRlcyArPSBzdGVwVmFsdWUubWludXRlcztcbiAgbmV4dC5ob3VycyArPSBzdGVwVmFsdWUuaG91cnM7XG5cbiAgbmV4dC5ob3VycyArPSBNYXRoLmZsb29yKG5leHQubWludXRlcyAvIDYwKTtcbiAgbmV4dC5taW51dGVzID0gbmV4dC5taW51dGVzICUgNjA7XG5cbiAgcmV0dXJuIGZvcm1hdFRpbWUobmV4dCk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0aW1lX3NlbGVjdHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIGNvbXBvbmVudHM6IHsgRWxTY3JvbGxiYXI6IHNjcm9sbGJhcl9kZWZhdWx0LmEgfSxcblxuICB3YXRjaDoge1xuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5zY3JvbGxUb09wdGlvbigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVDbGljazogZnVuY3Rpb24gaGFuZGxlQ2xpY2soaXRlbSkge1xuICAgICAgaWYgKCFpdGVtLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3BpY2snLCBpdGVtLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUNsZWFyOiBmdW5jdGlvbiBoYW5kbGVDbGVhcigpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ3BpY2snLCBudWxsKTtcbiAgICB9LFxuICAgIHNjcm9sbFRvT3B0aW9uOiBmdW5jdGlvbiBzY3JvbGxUb09wdGlvbigpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJy5zZWxlY3RlZCc7XG5cbiAgICAgIHZhciBtZW51ID0gdGhpcy4kcmVmcy5wb3BwZXIucXVlcnlTZWxlY3RvcignLmVsLXBpY2tlci1wYW5lbF9fY29udGVudCcpO1xuICAgICAgc2Nyb2xsX2ludG9fdmlld19kZWZhdWx0KCkobWVudSwgbWVudS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSk7XG4gICAgfSxcbiAgICBoYW5kbGVNZW51RW50ZXI6IGZ1bmN0aW9uIGhhbmRsZU1lbnVFbnRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgc2VsZWN0ZWQgPSB0aGlzLml0ZW1zLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgIH0pLmluZGV4T2YodGhpcy52YWx1ZSkgIT09IC0xO1xuICAgICAgdmFyIGhhc0RlZmF1bHQgPSB0aGlzLml0ZW1zLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgIH0pLmluZGV4T2YodGhpcy5kZWZhdWx0VmFsdWUpICE9PSAtMTtcbiAgICAgIHZhciBvcHRpb24gPSBzZWxlY3RlZCAmJiAnLnNlbGVjdGVkJyB8fCBoYXNEZWZhdWx0ICYmICcuZGVmYXVsdCcgfHwgJy50aW1lLXNlbGVjdC1pdGVtOm5vdCguZGlzYWJsZWQpJztcbiAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5zY3JvbGxUb09wdGlvbihvcHRpb24pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBzY3JvbGxEb3duOiBmdW5jdGlvbiBzY3JvbGxEb3duKHN0ZXApIHtcbiAgICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgICB2YXIgbGVuZ3RoID0gaXRlbXMubGVuZ3RoO1xuICAgICAgdmFyIHRvdGFsID0gaXRlbXMubGVuZ3RoO1xuICAgICAgdmFyIGluZGV4ID0gaXRlbXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgfSkuaW5kZXhPZih0aGlzLnZhbHVlKTtcbiAgICAgIHdoaWxlICh0b3RhbC0tKSB7XG4gICAgICAgIGluZGV4ID0gKGluZGV4ICsgc3RlcCArIGxlbmd0aCkgJSBsZW5ndGg7XG4gICAgICAgIGlmICghaXRlbXNbaW5kZXhdLmRpc2FibGVkKSB7XG4gICAgICAgICAgdGhpcy4kZW1pdCgncGljaycsIGl0ZW1zW2luZGV4XS52YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBpc1ZhbGlkVmFsdWU6IGZ1bmN0aW9uIGlzVmFsaWRWYWx1ZShkYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pdGVtcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuICFpdGVtLmRpc2FibGVkO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgfSkuaW5kZXhPZihkYXRlKSAhPT0gLTE7XG4gICAgfSxcbiAgICBoYW5kbGVLZXlkb3duOiBmdW5jdGlvbiBoYW5kbGVLZXlkb3duKGV2ZW50KSB7XG4gICAgICB2YXIga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG4gICAgICBpZiAoa2V5Q29kZSA9PT0gMzggfHwga2V5Q29kZSA9PT0gNDApIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSB7IDQwOiAxLCAzODogLTEgfTtcbiAgICAgICAgdmFyIG9mZnNldCA9IG1hcHBpbmdba2V5Q29kZS50b1N0cmluZygpXTtcbiAgICAgICAgdGhpcy5zY3JvbGxEb3duKG9mZnNldCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvcHBlckNsYXNzOiAnJyxcbiAgICAgIHN0YXJ0OiAnMDk6MDAnLFxuICAgICAgZW5kOiAnMTg6MDAnLFxuICAgICAgc3RlcDogJzAwOjMwJyxcbiAgICAgIHZhbHVlOiAnJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogJycsXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgIG1pblRpbWU6ICcnLFxuICAgICAgbWF4VGltZTogJycsXG4gICAgICB3aWR0aDogMFxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIGl0ZW1zOiBmdW5jdGlvbiBpdGVtcygpIHtcbiAgICAgIHZhciBzdGFydCA9IHRoaXMuc3RhcnQ7XG4gICAgICB2YXIgZW5kID0gdGhpcy5lbmQ7XG4gICAgICB2YXIgc3RlcCA9IHRoaXMuc3RlcDtcblxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICBpZiAoc3RhcnQgJiYgZW5kICYmIHN0ZXApIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBzdGFydDtcbiAgICAgICAgd2hpbGUgKGNvbXBhcmVUaW1lKGN1cnJlbnQsIGVuZCkgPD0gMCkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgIHZhbHVlOiBjdXJyZW50LFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGNvbXBhcmVUaW1lKGN1cnJlbnQsIHRoaXMubWluVGltZSB8fCAnLTE6LTEnKSA8PSAwIHx8IGNvbXBhcmVUaW1lKGN1cnJlbnQsIHRoaXMubWF4VGltZSB8fCAnMTAwOjEwMCcpID49IDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJyZW50ID0gbmV4dFRpbWUoY3VycmVudCwgc3RlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS1zZWxlY3QudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhbmVsX3RpbWVfc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHRpbWVfc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC90aW1lLXNlbGVjdC52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciB0aW1lX3NlbGVjdF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhbmVsX3RpbWVfc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICB0aW1lX3NlbGVjdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzUxYWI5MzIwX3JlbmRlcixcbiAgdGltZV9zZWxlY3R2dWVfdHlwZV90ZW1wbGF0ZV9pZF81MWFiOTMyMF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHRpbWVfc2VsZWN0X2FwaTsgfVxudGltZV9zZWxlY3RfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS1zZWxlY3QudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRpbWVfc2VsZWN0ID0gKHRpbWVfc2VsZWN0X2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BpY2tlci90aW1lLXNlbGVjdC5qc1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGlja2VyX3RpbWVfc2VsZWN0ID0gKHtcbiAgbWl4aW5zOiBbcGlja2VyXSxcblxuICBuYW1lOiAnRWxUaW1lU2VsZWN0JyxcblxuICBjb21wb25lbnROYW1lOiAnRWxUaW1lU2VsZWN0JyxcblxuICBwcm9wczoge1xuICAgIHR5cGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICd0aW1lLXNlbGVjdCdcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlQ3JlYXRlOiBmdW5jdGlvbiBiZWZvcmVDcmVhdGUoKSB7XG4gICAgdGhpcy5wYW5lbCA9IHRpbWVfc2VsZWN0O1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZS1zZWxlY3QvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xucGlja2VyX3RpbWVfc2VsZWN0Lmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQocGlja2VyX3RpbWVfc2VsZWN0Lm5hbWUsIHBpY2tlcl90aW1lX3NlbGVjdCk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc190aW1lX3NlbGVjdCA9IChwaWNrZXJfdGltZV9zZWxlY3QpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS1yYW5nZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZmIyODY2MGUmXG52YXIgdGltZV9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ZiMjg2NjBlX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcInRyYW5zaXRpb25cIixcbiAgICB7XG4gICAgICBhdHRyczogeyBuYW1lOiBcImVsLXpvb20taW4tdG9wXCIgfSxcbiAgICAgIG9uOiB7XG4gICAgICAgIFwiYWZ0ZXItbGVhdmVcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgX3ZtLiRlbWl0KFwiZG9kZXN0cm95XCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7XG4gICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgdmFsdWU6IF92bS52aXNpYmxlLFxuICAgICAgICAgICAgICBleHByZXNzaW9uOiBcInZpc2libGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1yYW5nZS1waWNrZXIgZWwtcGlja2VyLXBhbmVsIGVsLXBvcHBlclwiLFxuICAgICAgICAgIGNsYXNzOiBfdm0ucG9wcGVyQ2xhc3NcbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1yYW5nZS1waWNrZXJfX2NvbnRlbnRcIiB9LCBbXG4gICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXRpbWUtcmFuZ2UtcGlja2VyX19jZWxsXCIgfSwgW1xuICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXRpbWUtcmFuZ2UtcGlja2VyX19oZWFkZXJcIiB9LCBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0udChcImVsLmRhdGVwaWNrZXIuc3RhcnRUaW1lXCIpKSlcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgIFwiZWwtdGltZS1yYW5nZS1waWNrZXJfX2JvZHkgZWwtdGltZS1wYW5lbF9fY29udGVudFwiLFxuICAgICAgICAgICAgICAgICAgY2xhc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJoYXMtc2Vjb25kc1wiOiBfdm0uc2hvd1NlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgIFwiaXMtYXJyb3dcIjogX3ZtLmFycm93Q29udHJvbFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgX2MoXCJ0aW1lLXNwaW5uZXJcIiwge1xuICAgICAgICAgICAgICAgICAgICByZWY6IFwibWluU3Bpbm5lclwiLFxuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgIFwic2hvdy1zZWNvbmRzXCI6IF92bS5zaG93U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICBcImFtLXBtLW1vZGVcIjogX3ZtLmFtUG1Nb2RlLFxuICAgICAgICAgICAgICAgICAgICAgIFwiYXJyb3ctY29udHJvbFwiOiBfdm0uYXJyb3dDb250cm9sLFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IF92bS5taW5EYXRlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiBfdm0uaGFuZGxlTWluQ2hhbmdlLFxuICAgICAgICAgICAgICAgICAgICAgIFwic2VsZWN0LXJhbmdlXCI6IF92bS5zZXRNaW5TZWxlY3Rpb25SYW5nZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1yYW5nZS1waWNrZXJfX2NlbGxcIiB9LCBbXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1yYW5nZS1waWNrZXJfX2hlYWRlclwiIH0sIFtcbiAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKF92bS50KFwiZWwuZGF0ZXBpY2tlci5lbmRUaW1lXCIpKSlcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgIFwiZWwtdGltZS1yYW5nZS1waWNrZXJfX2JvZHkgZWwtdGltZS1wYW5lbF9fY29udGVudFwiLFxuICAgICAgICAgICAgICAgICAgY2xhc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJoYXMtc2Vjb25kc1wiOiBfdm0uc2hvd1NlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgIFwiaXMtYXJyb3dcIjogX3ZtLmFycm93Q29udHJvbFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgX2MoXCJ0aW1lLXNwaW5uZXJcIiwge1xuICAgICAgICAgICAgICAgICAgICByZWY6IFwibWF4U3Bpbm5lclwiLFxuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgIFwic2hvdy1zZWNvbmRzXCI6IF92bS5zaG93U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICBcImFtLXBtLW1vZGVcIjogX3ZtLmFtUG1Nb2RlLFxuICAgICAgICAgICAgICAgICAgICAgIFwiYXJyb3ctY29udHJvbFwiOiBfdm0uYXJyb3dDb250cm9sLFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IF92bS5tYXhEYXRlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiBfdm0uaGFuZGxlTWF4Q2hhbmdlLFxuICAgICAgICAgICAgICAgICAgICAgIFwic2VsZWN0LXJhbmdlXCI6IF92bS5zZXRNYXhTZWxlY3Rpb25SYW5nZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIF0pLFxuICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1wYW5lbF9fZm9vdGVyXCIgfSwgW1xuICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10aW1lLXBhbmVsX19idG4gY2FuY2VsXCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHsgdHlwZTogXCJidXR0b25cIiB9LFxuICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVDYW5jZWwoKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLnQoXCJlbC5kYXRlcGlja2VyLmNhbmNlbFwiKSkpXVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdGltZS1wYW5lbF9fYnRuIGNvbmZpcm1cIixcbiAgICAgICAgICAgICAgICBhdHRyczogeyB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogX3ZtLmJ0bkRpc2FibGVkIH0sXG4gICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmhhbmRsZUNvbmZpcm0oKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLnQoXCJlbC5kYXRlcGlja2VyLmNvbmZpcm1cIikpKV1cbiAgICAgICAgICAgIClcbiAgICAgICAgICBdKVxuICAgICAgICBdXG4gICAgICApXG4gICAgXVxuICApXG59XG52YXIgdGltZV9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ZiMjg2NjBlX3N0YXRpY1JlbmRlckZucyA9IFtdXG50aW1lX3JhbmdldnVlX3R5cGVfdGVtcGxhdGVfaWRfZmIyODY2MGVfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS1yYW5nZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZmIyODY2MGUmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RhdGUtcGlja2VyL3NyYy9wYW5lbC90aW1lLXJhbmdlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxuXG52YXIgTUlOX1RJTUUgPSBPYmplY3QoZGF0ZV91dGlsX1tcInBhcnNlRGF0ZVwiXSkoJzAwOjAwOjAwJywgJ0hIOm1tOnNzJyk7XG52YXIgTUFYX1RJTUUgPSBPYmplY3QoZGF0ZV91dGlsX1tcInBhcnNlRGF0ZVwiXSkoJzIzOjU5OjU5JywgJ0hIOm1tOnNzJyk7XG5cbnZhciB0aW1lX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfbWluVGltZU9mRGF5ID0gZnVuY3Rpb24gbWluVGltZU9mRGF5KGRhdGUpIHtcbiAgcmV0dXJuIE9iamVjdChkYXRlX3V0aWxfW1wibW9kaWZ5RGF0ZVwiXSkoTUlOX1RJTUUsIGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG59O1xuXG52YXIgdGltZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX21heFRpbWVPZkRheSA9IGZ1bmN0aW9uIG1heFRpbWVPZkRheShkYXRlKSB7XG4gIHJldHVybiBPYmplY3QoZGF0ZV91dGlsX1tcIm1vZGlmeURhdGVcIl0pKE1BWF9USU1FLCBkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xufTtcblxuLy8gaW5jcmVhc2UgdGltZSBieSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzLCBidXQgd2l0aGluIHRoZSByYW5nZSBvZiBkYXlcbnZhciBhZHZhbmNlVGltZSA9IGZ1bmN0aW9uIGFkdmFuY2VUaW1lKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gbmV3IERhdGUoTWF0aC5taW4oZGF0ZS5nZXRUaW1lKCkgKyBhbW91bnQsIHRpbWVfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19tYXhUaW1lT2ZEYXkoZGF0ZSkuZ2V0VGltZSgpKSk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0aW1lX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbWl4aW5zOiBbbG9jYWxlX2RlZmF1bHQuYV0sXG5cbiAgY29tcG9uZW50czogeyBUaW1lU3Bpbm5lcjogdGltZV9zcGlubmVyIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzaG93U2Vjb25kczogZnVuY3Rpb24gc2hvd1NlY29uZHMoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZm9ybWF0IHx8ICcnKS5pbmRleE9mKCdzcycpICE9PSAtMTtcbiAgICB9LFxuICAgIG9mZnNldDogZnVuY3Rpb24gb2Zmc2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvd1NlY29uZHMgPyAxMSA6IDg7XG4gICAgfSxcbiAgICBzcGlubmVyOiBmdW5jdGlvbiBzcGlubmVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uUmFuZ2VbMF0gPCB0aGlzLm9mZnNldCA/IHRoaXMuJHJlZnMubWluU3Bpbm5lciA6IHRoaXMuJHJlZnMubWF4U3Bpbm5lcjtcbiAgICB9LFxuICAgIGJ0bkRpc2FibGVkOiBmdW5jdGlvbiBidG5EaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1pbkRhdGUuZ2V0VGltZSgpID4gdGhpcy5tYXhEYXRlLmdldFRpbWUoKTtcbiAgICB9LFxuICAgIGFtUG1Nb2RlOiBmdW5jdGlvbiBhbVBtTW9kZSgpIHtcbiAgICAgIGlmICgodGhpcy5mb3JtYXQgfHwgJycpLmluZGV4T2YoJ0EnKSAhPT0gLTEpIHJldHVybiAnQSc7XG4gICAgICBpZiAoKHRoaXMuZm9ybWF0IHx8ICcnKS5pbmRleE9mKCdhJykgIT09IC0xKSByZXR1cm4gJ2EnO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb3BwZXJDbGFzczogJycsXG4gICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgbWF4RGF0ZTogbmV3IERhdGUoKSxcbiAgICAgIHZhbHVlOiBbXSxcbiAgICAgIG9sZFZhbHVlOiBbbmV3IERhdGUoKSwgbmV3IERhdGUoKV0sXG4gICAgICBkZWZhdWx0VmFsdWU6IG51bGwsXG4gICAgICBmb3JtYXQ6ICdISDptbTpzcycsXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgIHNlbGVjdGlvblJhbmdlOiBbMCwgMl0sXG4gICAgICBhcnJvd0NvbnRyb2w6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIHdhdGNoOiB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKF92YWx1ZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX3ZhbHVlKSkge1xuICAgICAgICB0aGlzLm1pbkRhdGUgPSBuZXcgRGF0ZShfdmFsdWVbMF0pO1xuICAgICAgICB0aGlzLm1heERhdGUgPSBuZXcgRGF0ZShfdmFsdWVbMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUodGhpcy5kZWZhdWx0VmFsdWVbMF0pO1xuICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGVmYXVsdFZhbHVlWzFdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB0aGlzLm1heERhdGUgPSBhZHZhbmNlVGltZShuZXcgRGF0ZSh0aGlzLmRlZmF1bHRWYWx1ZSksIDYwICogNjAgKiAxMDAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm1pbkRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IGFkdmFuY2VUaW1lKG5ldyBEYXRlKCksIDYwICogNjAgKiAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgdmlzaWJsZTogZnVuY3Rpb24gdmlzaWJsZSh2YWwpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgdGhpcy5vbGRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuJHJlZnMubWluU3Bpbm5lci5lbWl0U2VsZWN0UmFuZ2UoJ2hvdXJzJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFuZGxlQ2xlYXI6IGZ1bmN0aW9uIGhhbmRsZUNsZWFyKCkge1xuICAgICAgdGhpcy4kZW1pdCgncGljaycsIG51bGwpO1xuICAgIH0sXG4gICAgaGFuZGxlQ2FuY2VsOiBmdW5jdGlvbiBoYW5kbGVDYW5jZWwoKSB7XG4gICAgICB0aGlzLiRlbWl0KCdwaWNrJywgdGhpcy5vbGRWYWx1ZSk7XG4gICAgfSxcbiAgICBoYW5kbGVNaW5DaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZU1pbkNoYW5nZShkYXRlKSB7XG4gICAgICB0aGlzLm1pbkRhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcImNsZWFyTWlsbGlzZWNvbmRzXCJdKShkYXRlKTtcbiAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKCk7XG4gICAgfSxcbiAgICBoYW5kbGVNYXhDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZU1heENoYW5nZShkYXRlKSB7XG4gICAgICB0aGlzLm1heERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcImNsZWFyTWlsbGlzZWNvbmRzXCJdKShkYXRlKTtcbiAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKCk7XG4gICAgfSxcbiAgICBoYW5kbGVDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZSgpIHtcbiAgICAgIGlmICh0aGlzLmlzVmFsaWRWYWx1ZShbdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGVdKSkge1xuICAgICAgICB0aGlzLiRyZWZzLm1pblNwaW5uZXIuc2VsZWN0YWJsZVJhbmdlID0gW1t0aW1lX3JhbmdldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfbWluVGltZU9mRGF5KHRoaXMubWluRGF0ZSksIHRoaXMubWF4RGF0ZV1dO1xuICAgICAgICB0aGlzLiRyZWZzLm1heFNwaW5uZXIuc2VsZWN0YWJsZVJhbmdlID0gW1t0aGlzLm1pbkRhdGUsIHRpbWVfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19tYXhUaW1lT2ZEYXkodGhpcy5tYXhEYXRlKV1dO1xuICAgICAgICB0aGlzLiRlbWl0KCdwaWNrJywgW3RoaXMubWluRGF0ZSwgdGhpcy5tYXhEYXRlXSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRNaW5TZWxlY3Rpb25SYW5nZTogZnVuY3Rpb24gc2V0TWluU2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCkge1xuICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0LXJhbmdlJywgc3RhcnQsIGVuZCwgJ21pbicpO1xuICAgICAgdGhpcy5zZWxlY3Rpb25SYW5nZSA9IFtzdGFydCwgZW5kXTtcbiAgICB9LFxuICAgIHNldE1heFNlbGVjdGlvblJhbmdlOiBmdW5jdGlvbiBzZXRNYXhTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKSB7XG4gICAgICB0aGlzLiRlbWl0KCdzZWxlY3QtcmFuZ2UnLCBzdGFydCwgZW5kLCAnbWF4Jyk7XG4gICAgICB0aGlzLnNlbGVjdGlvblJhbmdlID0gW3N0YXJ0ICsgdGhpcy5vZmZzZXQsIGVuZCArIHRoaXMub2Zmc2V0XTtcbiAgICB9LFxuICAgIGhhbmRsZUNvbmZpcm06IGZ1bmN0aW9uIGhhbmRsZUNvbmZpcm0oKSB7XG4gICAgICB2YXIgdmlzaWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG5cbiAgICAgIHZhciBtaW5TZWxlY3RhYmxlUmFuZ2UgPSB0aGlzLiRyZWZzLm1pblNwaW5uZXIuc2VsZWN0YWJsZVJhbmdlO1xuICAgICAgdmFyIG1heFNlbGVjdGFibGVSYW5nZSA9IHRoaXMuJHJlZnMubWF4U3Bpbm5lci5zZWxlY3RhYmxlUmFuZ2U7XG5cbiAgICAgIHRoaXMubWluRGF0ZSA9IE9iamVjdChkYXRlX3V0aWxfW1wibGltaXRUaW1lUmFuZ2VcIl0pKHRoaXMubWluRGF0ZSwgbWluU2VsZWN0YWJsZVJhbmdlLCB0aGlzLmZvcm1hdCk7XG4gICAgICB0aGlzLm1heERhdGUgPSBPYmplY3QoZGF0ZV91dGlsX1tcImxpbWl0VGltZVJhbmdlXCJdKSh0aGlzLm1heERhdGUsIG1heFNlbGVjdGFibGVSYW5nZSwgdGhpcy5mb3JtYXQpO1xuXG4gICAgICB0aGlzLiRlbWl0KCdwaWNrJywgW3RoaXMubWluRGF0ZSwgdGhpcy5tYXhEYXRlXSwgdmlzaWJsZSk7XG4gICAgfSxcbiAgICBhZGp1c3RTcGlubmVyczogZnVuY3Rpb24gYWRqdXN0U3Bpbm5lcnMoKSB7XG4gICAgICB0aGlzLiRyZWZzLm1pblNwaW5uZXIuYWRqdXN0U3Bpbm5lcnMoKTtcbiAgICAgIHRoaXMuJHJlZnMubWF4U3Bpbm5lci5hZGp1c3RTcGlubmVycygpO1xuICAgIH0sXG4gICAgY2hhbmdlU2VsZWN0aW9uUmFuZ2U6IGZ1bmN0aW9uIGNoYW5nZVNlbGVjdGlvblJhbmdlKHN0ZXApIHtcbiAgICAgIHZhciBsaXN0ID0gdGhpcy5zaG93U2Vjb25kcyA/IFswLCAzLCA2LCAxMSwgMTQsIDE3XSA6IFswLCAzLCA4LCAxMV07XG4gICAgICB2YXIgbWFwcGluZyA9IFsnaG91cnMnLCAnbWludXRlcyddLmNvbmNhdCh0aGlzLnNob3dTZWNvbmRzID8gWydzZWNvbmRzJ10gOiBbXSk7XG4gICAgICB2YXIgaW5kZXggPSBsaXN0LmluZGV4T2YodGhpcy5zZWxlY3Rpb25SYW5nZVswXSk7XG4gICAgICB2YXIgbmV4dCA9IChpbmRleCArIHN0ZXAgKyBsaXN0Lmxlbmd0aCkgJSBsaXN0Lmxlbmd0aDtcbiAgICAgIHZhciBoYWxmID0gbGlzdC5sZW5ndGggLyAyO1xuICAgICAgaWYgKG5leHQgPCBoYWxmKSB7XG4gICAgICAgIHRoaXMuJHJlZnMubWluU3Bpbm5lci5lbWl0U2VsZWN0UmFuZ2UobWFwcGluZ1tuZXh0XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiRyZWZzLm1heFNwaW5uZXIuZW1pdFNlbGVjdFJhbmdlKG1hcHBpbmdbbmV4dCAtIGhhbGZdKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGlzVmFsaWRWYWx1ZTogZnVuY3Rpb24gaXNWYWxpZFZhbHVlKGRhdGUpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGUpICYmIE9iamVjdChkYXRlX3V0aWxfW1widGltZVdpdGhpblJhbmdlXCJdKSh0aGlzLm1pbkRhdGUsIHRoaXMuJHJlZnMubWluU3Bpbm5lci5zZWxlY3RhYmxlUmFuZ2UpICYmIE9iamVjdChkYXRlX3V0aWxfW1widGltZVdpdGhpblJhbmdlXCJdKSh0aGlzLm1heERhdGUsIHRoaXMuJHJlZnMubWF4U3Bpbm5lci5zZWxlY3RhYmxlUmFuZ2UpO1xuICAgIH0sXG4gICAgaGFuZGxlS2V5ZG93bjogZnVuY3Rpb24gaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgICAgdmFyIGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgICAgdmFyIG1hcHBpbmcgPSB7IDM4OiAtMSwgNDA6IDEsIDM3OiAtMSwgMzk6IDEgfTtcblxuICAgICAgLy8gTGVmdCBvciBSaWdodFxuICAgICAgaWYgKGtleUNvZGUgPT09IDM3IHx8IGtleUNvZGUgPT09IDM5KSB7XG4gICAgICAgIHZhciBzdGVwID0gbWFwcGluZ1trZXlDb2RlXTtcbiAgICAgICAgdGhpcy5jaGFuZ2VTZWxlY3Rpb25SYW5nZShzdGVwKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVcCBvciBEb3duXG4gICAgICBpZiAoa2V5Q29kZSA9PT0gMzggfHwga2V5Q29kZSA9PT0gNDApIHtcbiAgICAgICAgdmFyIF9zdGVwID0gbWFwcGluZ1trZXlDb2RlXTtcbiAgICAgICAgdGhpcy5zcGlubmVyLnNjcm9sbERvd24oX3N0ZXApO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BhbmVsL3RpbWUtcmFuZ2UudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhbmVsX3RpbWVfcmFuZ2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAodGltZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS1yYW5nZS52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciB0aW1lX3JhbmdlX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFuZWxfdGltZV9yYW5nZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgdGltZV9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ZiMjg2NjBlX3JlbmRlcixcbiAgdGltZV9yYW5nZXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ZiMjg2NjBlX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgdGltZV9yYW5nZV9hcGk7IH1cbnRpbWVfcmFuZ2VfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9kYXRlLXBpY2tlci9zcmMvcGFuZWwvdGltZS1yYW5nZS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGltZV9yYW5nZSA9ICh0aW1lX3JhbmdlX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGF0ZS1waWNrZXIvc3JjL3BpY2tlci90aW1lLXBpY2tlci5qc1xuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0aW1lX3BpY2tlciA9ICh7XG4gIG1peGluczogW3BpY2tlcl0sXG5cbiAgbmFtZTogJ0VsVGltZVBpY2tlcicsXG5cbiAgcHJvcHM6IHtcbiAgICBpc1JhbmdlOiBCb29sZWFuLFxuICAgIGFycm93Q29udHJvbDogQm9vbGVhblxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICcnXG4gICAgfTtcbiAgfSxcblxuXG4gIHdhdGNoOiB7XG4gICAgaXNSYW5nZTogZnVuY3Rpb24gaXNSYW5nZShfaXNSYW5nZSkge1xuICAgICAgaWYgKHRoaXMucGlja2VyKSB7XG4gICAgICAgIHRoaXMudW5tb3VudFBpY2tlcigpO1xuICAgICAgICB0aGlzLnR5cGUgPSBfaXNSYW5nZSA/ICd0aW1lcmFuZ2UnIDogJ3RpbWUnO1xuICAgICAgICB0aGlzLnBhbmVsID0gX2lzUmFuZ2UgPyB0aW1lX3JhbmdlIDogcGFuZWxfdGltZTtcbiAgICAgICAgdGhpcy5tb3VudFBpY2tlcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50eXBlID0gX2lzUmFuZ2UgPyAndGltZXJhbmdlJyA6ICd0aW1lJztcbiAgICAgICAgdGhpcy5wYW5lbCA9IF9pc1JhbmdlID8gdGltZV9yYW5nZSA6IHBhbmVsX3RpbWU7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy50eXBlID0gdGhpcy5pc1JhbmdlID8gJ3RpbWVyYW5nZScgOiAndGltZSc7XG4gICAgdGhpcy5wYW5lbCA9IHRoaXMuaXNSYW5nZSA/IHRpbWVfcmFuZ2UgOiBwYW5lbF90aW1lO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZS1waWNrZXIvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudGltZV9waWNrZXIuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudCh0aW1lX3BpY2tlci5uYW1lLCB0aW1lX3BpY2tlcik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc190aW1lX3BpY2tlciA9ICh0aW1lX3BpY2tlcik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3BvcG92ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTUyMDYwMjcyJlxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81MjA2MDI3Ml9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJzcGFuXCIsXG4gICAgW1xuICAgICAgX2MoXG4gICAgICAgIFwidHJhbnNpdGlvblwiLFxuICAgICAgICB7XG4gICAgICAgICAgYXR0cnM6IHsgbmFtZTogX3ZtLnRyYW5zaXRpb24gfSxcbiAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgXCJhZnRlci1lbnRlclwiOiBfdm0uaGFuZGxlQWZ0ZXJFbnRlcixcbiAgICAgICAgICAgIFwiYWZ0ZXItbGVhdmVcIjogX3ZtLmhhbmRsZUFmdGVyTGVhdmVcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogIV92bS5kaXNhYmxlZCAmJiBfdm0uc2hvd1BvcHBlcixcbiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiIWRpc2FibGVkICYmIHNob3dQb3BwZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVmOiBcInBvcHBlclwiLFxuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1wb3BvdmVyIGVsLXBvcHBlclwiLFxuICAgICAgICAgICAgICBjbGFzczogW192bS5wb3BwZXJDbGFzcywgX3ZtLmNvbnRlbnQgJiYgXCJlbC1wb3BvdmVyLS1wbGFpblwiXSxcbiAgICAgICAgICAgICAgc3R5bGU6IHsgd2lkdGg6IF92bS53aWR0aCArIFwicHhcIiB9LFxuICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgIHJvbGU6IFwidG9vbHRpcFwiLFxuICAgICAgICAgICAgICAgIGlkOiBfdm0udG9vbHRpcElkLFxuICAgICAgICAgICAgICAgIFwiYXJpYS1oaWRkZW5cIjpcbiAgICAgICAgICAgICAgICAgIF92bS5kaXNhYmxlZCB8fCAhX3ZtLnNob3dQb3BwZXIgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfdm0udGl0bGVcbiAgICAgICAgICAgICAgICA/IF9jKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcG9wb3Zlcl9fdGl0bGVcIixcbiAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHsgdGV4dENvbnRlbnQ6IF92bS5fcyhfdm0udGl0bGUpIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgX3ZtLl90KFwiZGVmYXVsdFwiLCBbX3ZtLl92KF92bS5fcyhfdm0uY29udGVudCkpXSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICBdXG4gICAgICApLFxuICAgICAgX2MoXG4gICAgICAgIFwic3BhblwiLFxuICAgICAgICB7IHJlZjogXCJ3cmFwcGVyXCIsIHN0YXRpY0NsYXNzOiBcImVsLXBvcG92ZXJfX3JlZmVyZW5jZS13cmFwcGVyXCIgfSxcbiAgICAgICAgW192bS5fdChcInJlZmVyZW5jZVwiKV0sXG4gICAgICAgIDJcbiAgICAgIClcbiAgICBdLFxuICAgIDFcbiAgKVxufVxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81MjA2MDI3Ml9zdGF0aWNSZW5kZXJGbnMgPSBbXVxubWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzUyMDYwMjcyX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wb3Zlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NTIwNjAyNzImXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3BvcG92ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG1haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxQb3BvdmVyJyxcblxuICBtaXhpbnM6IFt2dWVfcG9wcGVyX2RlZmF1bHQuYV0sXG5cbiAgcHJvcHM6IHtcbiAgICB0cmlnZ2VyOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnY2xpY2snLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFsnY2xpY2snLCAnZm9jdXMnLCAnaG92ZXInLCAnbWFudWFsJ10uaW5kZXhPZih2YWx1ZSkgPiAtMTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9wZW5EZWxheToge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMFxuICAgIH0sXG4gICAgY2xvc2VEZWxheToge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMjAwXG4gICAgfSxcbiAgICB0aXRsZTogU3RyaW5nLFxuICAgIGRpc2FibGVkOiBCb29sZWFuLFxuICAgIGNvbnRlbnQ6IFN0cmluZyxcbiAgICByZWZlcmVuY2U6IHt9LFxuICAgIHBvcHBlckNsYXNzOiBTdHJpbmcsXG4gICAgd2lkdGg6IHt9LFxuICAgIHZpc2libGVBcnJvdzoge1xuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgYXJyb3dPZmZzZXQ6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIHRyYW5zaXRpb246IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdmYWRlLWluLWxpbmVhcidcbiAgICB9LFxuICAgIHRhYmluZGV4OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAwXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdG9vbHRpcElkOiBmdW5jdGlvbiB0b29sdGlwSWQoKSB7XG4gICAgICByZXR1cm4gJ2VsLXBvcG92ZXItJyArIE9iamVjdCh1dGlsX1tcImdlbmVyYXRlSWRcIl0pKCk7XG4gICAgfVxuICB9LFxuICB3YXRjaDoge1xuICAgIHNob3dQb3BwZXI6IGZ1bmN0aW9uIHNob3dQb3BwZXIodmFsKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YWwgPyB0aGlzLiRlbWl0KCdzaG93JykgOiB0aGlzLiRlbWl0KCdoaWRlJyk7XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciByZWZlcmVuY2UgPSB0aGlzLnJlZmVyZW5jZUVsbSA9IHRoaXMucmVmZXJlbmNlIHx8IHRoaXMuJHJlZnMucmVmZXJlbmNlO1xuICAgIHZhciBwb3BwZXIgPSB0aGlzLnBvcHBlciB8fCB0aGlzLiRyZWZzLnBvcHBlcjtcblxuICAgIGlmICghcmVmZXJlbmNlICYmIHRoaXMuJHJlZnMud3JhcHBlci5jaGlsZHJlbikge1xuICAgICAgcmVmZXJlbmNlID0gdGhpcy5yZWZlcmVuY2VFbG0gPSB0aGlzLiRyZWZzLndyYXBwZXIuY2hpbGRyZW5bMF07XG4gICAgfVxuICAgIC8vIOWPr+iuv+mXruaAp1xuICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgIE9iamVjdChkb21fW1wiYWRkQ2xhc3NcIl0pKHJlZmVyZW5jZSwgJ2VsLXBvcG92ZXJfX3JlZmVyZW5jZScpO1xuICAgICAgcmVmZXJlbmNlLnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHRoaXMudG9vbHRpcElkKTtcbiAgICAgIHJlZmVyZW5jZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgdGhpcy50YWJpbmRleCk7IC8vIHRhYuW6j+WIl1xuICAgICAgcG9wcGVyLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAwKTtcblxuICAgICAgaWYgKHRoaXMudHJpZ2dlciAhPT0gJ2NsaWNrJykge1xuICAgICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShyZWZlcmVuY2UsICdmb2N1c2luJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmhhbmRsZUZvY3VzKCk7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gcmVmZXJlbmNlLl9fdnVlX187XG4gICAgICAgICAgaWYgKGluc3RhbmNlICYmIHR5cGVvZiBpbnN0YW5jZS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaW5zdGFuY2UuZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShwb3BwZXIsICdmb2N1c2luJywgdGhpcy5oYW5kbGVGb2N1cyk7XG4gICAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHJlZmVyZW5jZSwgJ2ZvY3Vzb3V0JywgdGhpcy5oYW5kbGVCbHVyKTtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocG9wcGVyLCAnZm9jdXNvdXQnLCB0aGlzLmhhbmRsZUJsdXIpO1xuICAgICAgfVxuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocmVmZXJlbmNlLCAna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5ZG93bik7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShyZWZlcmVuY2UsICdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuICAgIH1cbiAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShyZWZlcmVuY2UsICdjbGljaycsIHRoaXMuZG9Ub2dnbGUpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkoZG9jdW1lbnQsICdjbGljaycsIHRoaXMuaGFuZGxlRG9jdW1lbnRDbGljayk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnRyaWdnZXIgPT09ICdob3ZlcicpIHtcbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHJlZmVyZW5jZSwgJ21vdXNlZW50ZXInLCB0aGlzLmhhbmRsZU1vdXNlRW50ZXIpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocG9wcGVyLCAnbW91c2VlbnRlcicsIHRoaXMuaGFuZGxlTW91c2VFbnRlcik7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShyZWZlcmVuY2UsICdtb3VzZWxlYXZlJywgdGhpcy5oYW5kbGVNb3VzZUxlYXZlKTtcbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHBvcHBlciwgJ21vdXNlbGVhdmUnLCB0aGlzLmhhbmRsZU1vdXNlTGVhdmUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB7XG4gICAgICBpZiAodGhpcy50YWJpbmRleCA8IDApIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbRWxlbWVudCBXYXJuXVtQb3BvdmVyXWEgbmVnYXRpdmUgdGFpbmRleCBtZWFucyB0aGF0IHRoZSBlbGVtZW50IGNhbm5vdCBiZSBmb2N1c2VkIGJ5IHRhYiBrZXknKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWZlcmVuY2UucXVlcnlTZWxlY3RvcignaW5wdXQsIHRleHRhcmVhJykpIHtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocmVmZXJlbmNlLCAnZm9jdXNpbicsIHRoaXMuZG9TaG93KTtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocmVmZXJlbmNlLCAnZm9jdXNvdXQnLCB0aGlzLmRvQ2xvc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocmVmZXJlbmNlLCAnbW91c2Vkb3duJywgdGhpcy5kb1Nob3cpO1xuICAgICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShyZWZlcmVuY2UsICdtb3VzZXVwJywgdGhpcy5kb0Nsb3NlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH0sXG4gIGRlYWN0aXZhdGVkOiBmdW5jdGlvbiBkZWFjdGl2YXRlZCgpIHtcbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBkb1RvZ2dsZTogZnVuY3Rpb24gZG9Ub2dnbGUoKSB7XG4gICAgICB0aGlzLnNob3dQb3BwZXIgPSAhdGhpcy5zaG93UG9wcGVyO1xuICAgIH0sXG4gICAgZG9TaG93OiBmdW5jdGlvbiBkb1Nob3coKSB7XG4gICAgICB0aGlzLnNob3dQb3BwZXIgPSB0cnVlO1xuICAgIH0sXG4gICAgZG9DbG9zZTogZnVuY3Rpb24gZG9DbG9zZSgpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHBlciA9IGZhbHNlO1xuICAgIH0sXG4gICAgaGFuZGxlRm9jdXM6IGZ1bmN0aW9uIGhhbmRsZUZvY3VzKCkge1xuICAgICAgT2JqZWN0KGRvbV9bXCJhZGRDbGFzc1wiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdmb2N1c2luZycpO1xuICAgICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2NsaWNrJyB8fCB0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycpIHRoaXMuc2hvd1BvcHBlciA9IHRydWU7XG4gICAgfSxcbiAgICBoYW5kbGVDbGljazogZnVuY3Rpb24gaGFuZGxlQ2xpY2soKSB7XG4gICAgICBPYmplY3QoZG9tX1tcInJlbW92ZUNsYXNzXCJdKSh0aGlzLnJlZmVyZW5jZUVsbSwgJ2ZvY3VzaW5nJyk7XG4gICAgfSxcbiAgICBoYW5kbGVCbHVyOiBmdW5jdGlvbiBoYW5kbGVCbHVyKCkge1xuICAgICAgT2JqZWN0KGRvbV9bXCJyZW1vdmVDbGFzc1wiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdmb2N1c2luZycpO1xuICAgICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2NsaWNrJyB8fCB0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycpIHRoaXMuc2hvd1BvcHBlciA9IGZhbHNlO1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VFbnRlcjogZnVuY3Rpb24gaGFuZGxlTW91c2VFbnRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgICAgaWYgKHRoaXMub3BlbkRlbGF5KSB7XG4gICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLnNob3dQb3BwZXIgPSB0cnVlO1xuICAgICAgICB9LCB0aGlzLm9wZW5EZWxheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dQb3BwZXIgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlS2V5ZG93bjogZnVuY3Rpb24gaGFuZGxlS2V5ZG93bihldikge1xuICAgICAgaWYgKGV2LmtleUNvZGUgPT09IDI3ICYmIHRoaXMudHJpZ2dlciAhPT0gJ21hbnVhbCcpIHtcbiAgICAgICAgLy8gZXNjXG4gICAgICAgIHRoaXMuZG9DbG9zZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlTW91c2VMZWF2ZTogZnVuY3Rpb24gaGFuZGxlTW91c2VMZWF2ZSgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgICAgaWYgKHRoaXMuY2xvc2VEZWxheSkge1xuICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMy5zaG93UG9wcGVyID0gZmFsc2U7XG4gICAgICAgIH0sIHRoaXMuY2xvc2VEZWxheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dQb3BwZXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZURvY3VtZW50Q2xpY2s6IGZ1bmN0aW9uIGhhbmRsZURvY3VtZW50Q2xpY2soZSkge1xuICAgICAgdmFyIHJlZmVyZW5jZSA9IHRoaXMucmVmZXJlbmNlIHx8IHRoaXMuJHJlZnMucmVmZXJlbmNlO1xuICAgICAgdmFyIHBvcHBlciA9IHRoaXMucG9wcGVyIHx8IHRoaXMuJHJlZnMucG9wcGVyO1xuXG4gICAgICBpZiAoIXJlZmVyZW5jZSAmJiB0aGlzLiRyZWZzLndyYXBwZXIuY2hpbGRyZW4pIHtcbiAgICAgICAgcmVmZXJlbmNlID0gdGhpcy5yZWZlcmVuY2VFbG0gPSB0aGlzLiRyZWZzLndyYXBwZXIuY2hpbGRyZW5bMF07XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuJGVsIHx8ICFyZWZlcmVuY2UgfHwgdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpIHx8IHJlZmVyZW5jZS5jb250YWlucyhlLnRhcmdldCkgfHwgIXBvcHBlciB8fCBwb3BwZXIuY29udGFpbnMoZS50YXJnZXQpKSByZXR1cm47XG4gICAgICB0aGlzLnNob3dQb3BwZXIgPSBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZUFmdGVyRW50ZXI6IGZ1bmN0aW9uIGhhbmRsZUFmdGVyRW50ZXIoKSB7XG4gICAgICB0aGlzLiRlbWl0KCdhZnRlci1lbnRlcicpO1xuICAgIH0sXG4gICAgaGFuZGxlQWZ0ZXJMZWF2ZTogZnVuY3Rpb24gaGFuZGxlQWZ0ZXJMZWF2ZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2FmdGVyLWxlYXZlJyk7XG4gICAgICB0aGlzLmRvRGVzdHJveSgpO1xuICAgIH0sXG4gICAgY2xlYW51cDogZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICAgIGlmICh0aGlzLm9wZW5EZWxheSB8fCB0aGlzLmNsb3NlRGVsYXkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgdmFyIHJlZmVyZW5jZSA9IHRoaXMucmVmZXJlbmNlO1xuXG4gICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKHJlZmVyZW5jZSwgJ2NsaWNrJywgdGhpcy5kb1RvZ2dsZSk7XG4gICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKHJlZmVyZW5jZSwgJ21vdXNldXAnLCB0aGlzLmRvQ2xvc2UpO1xuICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdtb3VzZWRvd24nLCB0aGlzLmRvU2hvdyk7XG4gICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKHJlZmVyZW5jZSwgJ2ZvY3VzaW4nLCB0aGlzLmRvU2hvdyk7XG4gICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKHJlZmVyZW5jZSwgJ2ZvY3Vzb3V0JywgdGhpcy5kb0Nsb3NlKTtcbiAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkocmVmZXJlbmNlLCAnbW91c2Vkb3duJywgdGhpcy5kb1Nob3cpO1xuICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdtb3VzZXVwJywgdGhpcy5kb0Nsb3NlKTtcbiAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkocmVmZXJlbmNlLCAnbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSk7XG4gICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKHJlZmVyZW5jZSwgJ21vdXNlZW50ZXInLCB0aGlzLmhhbmRsZU1vdXNlRW50ZXIpO1xuICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShkb2N1bWVudCwgJ2NsaWNrJywgdGhpcy5oYW5kbGVEb2N1bWVudENsaWNrKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3BvcG92ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKG1haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wb3Zlci9zcmMvbWFpbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBtYWluX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81MjA2MDI3Ml9yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81MjA2MDI3Ml9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIG1haW5fYXBpOyB9XG5tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvcG9wb3Zlci9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbWFpbiA9IChtYWluX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wb3Zlci9zcmMvZGlyZWN0aXZlLmpzXG52YXIgZ2V0UmVmZXJlbmNlID0gZnVuY3Rpb24gZ2V0UmVmZXJlbmNlKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICB2YXIgX3JlZiA9IGJpbmRpbmcuZXhwcmVzc2lvbiA/IGJpbmRpbmcudmFsdWUgOiBiaW5kaW5nLmFyZztcbiAgdmFyIHBvcHBlciA9IHZub2RlLmNvbnRleHQuJHJlZnNbX3JlZl07XG4gIGlmIChwb3BwZXIpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwb3BwZXIpKSB7XG4gICAgICBwb3BwZXJbMF0uJHJlZnMucmVmZXJlbmNlID0gZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcHBlci4kcmVmcy5yZWZlcmVuY2UgPSBlbDtcbiAgICB9XG4gIH1cbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGRpcmVjdGl2ZSA9ICh7XG4gIGJpbmQ6IGZ1bmN0aW9uIGJpbmQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgZ2V0UmVmZXJlbmNlKGVsLCBiaW5kaW5nLCB2bm9kZSk7XG4gIH0sXG4gIGluc2VydGVkOiBmdW5jdGlvbiBpbnNlcnRlZChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBnZXRSZWZlcmVuY2UoZWwsIGJpbmRpbmcsIHZub2RlKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3BvcG92ZXIvaW5kZXguanNcblxuXG5cblxuZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5kaXJlY3RpdmUoJ3BvcG92ZXInLCBkaXJlY3RpdmUpO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xubWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuZGlyZWN0aXZlKCdwb3BvdmVyJywgZGlyZWN0aXZlKTtcbiAgVnVlLmNvbXBvbmVudChtYWluLm5hbWUsIG1haW4pO1xufTtcbm1haW4uZGlyZWN0aXZlID0gZGlyZWN0aXZlO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwb3BvdmVyID0gKG1haW4pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90b29sdGlwL3NyYy9tYWluLmpzXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfbWFpbiA9ICh7XG4gIG5hbWU6ICdFbFRvb2x0aXAnLFxuXG4gIG1peGluczogW3Z1ZV9wb3BwZXJfZGVmYXVsdC5hXSxcblxuICBwcm9wczoge1xuICAgIG9wZW5EZWxheToge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMFxuICAgIH0sXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW4sXG4gICAgbWFudWFsOiBCb29sZWFuLFxuICAgIGVmZmVjdDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2RhcmsnXG4gICAgfSxcbiAgICBhcnJvd09mZnNldDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMFxuICAgIH0sXG4gICAgcG9wcGVyQ2xhc3M6IFN0cmluZyxcbiAgICBjb250ZW50OiBTdHJpbmcsXG4gICAgdmlzaWJsZUFycm93OiB7XG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICB0cmFuc2l0aW9uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnZWwtZmFkZS1pbi1saW5lYXInXG4gICAgfSxcbiAgICBwb3BwZXJPcHRpb25zOiB7XG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBib3VuZGFyaWVzUGFkZGluZzogMTAsXG4gICAgICAgICAgZ3B1QWNjZWxlcmF0aW9uOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAgZW50ZXJhYmxlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgaGlkZUFmdGVyOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAwXG4gICAgfSxcbiAgICB0YWJpbmRleDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMFxuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0b29sdGlwSWQ6ICdlbC10b29sdGlwLScgKyBPYmplY3QodXRpbF9bXCJnZW5lcmF0ZUlkXCJdKSgpLFxuICAgICAgdGltZW91dFBlbmRpbmc6IG51bGwsXG4gICAgICBmb2N1c2luZzogZmFsc2VcbiAgICB9O1xuICB9LFxuICBiZWZvcmVDcmVhdGU6IGZ1bmN0aW9uIGJlZm9yZUNyZWF0ZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuJGlzU2VydmVyKSByZXR1cm47XG5cbiAgICB0aGlzLnBvcHBlclZNID0gbmV3IGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEoe1xuICAgICAgZGF0YTogeyBub2RlOiAnJyB9LFxuICAgICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlO1xuICAgICAgfVxuICAgIH0pLiRtb3VudCgpO1xuXG4gICAgdGhpcy5kZWJvdW5jZUNsb3NlID0gZGVib3VuY2VfZGVmYXVsdCgpKDIwMCwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZUNsb3NlUG9wcGVyKCk7XG4gICAgfSk7XG4gIH0sXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmICh0aGlzLnBvcHBlclZNKSB7XG4gICAgICB0aGlzLnBvcHBlclZNLm5vZGUgPSBoKFxuICAgICAgICAndHJhbnNpdGlvbicsXG4gICAgICAgIHtcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2l0aW9uXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgJ2FmdGVyTGVhdmUnOiB0aGlzLmRvRGVzdHJveVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2goXG4gICAgICAgICAgJ2RpdicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgJ21vdXNlbGVhdmUnOiBmdW5jdGlvbiBtb3VzZWxlYXZlKCkge1xuICAgICAgICAgICAgICAgIF90aGlzMi5zZXRFeHBlY3RlZFN0YXRlKGZhbHNlKTtfdGhpczIuZGVib3VuY2VDbG9zZSgpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnbW91c2VlbnRlcic6IGZ1bmN0aW9uIG1vdXNlZW50ZXIoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLnNldEV4cGVjdGVkU3RhdGUodHJ1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJlZjogJ3BvcHBlcicsXG4gICAgICAgICAgICBhdHRyczogeyByb2xlOiAndG9vbHRpcCcsXG4gICAgICAgICAgICAgIGlkOiB0aGlzLnRvb2x0aXBJZCxcbiAgICAgICAgICAgICAgJ2FyaWEtaGlkZGVuJzogdGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5zaG93UG9wcGVyID8gJ3RydWUnIDogJ2ZhbHNlJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFt7XG4gICAgICAgICAgICAgIG5hbWU6ICdzaG93JyxcbiAgICAgICAgICAgICAgdmFsdWU6ICF0aGlzLmRpc2FibGVkICYmIHRoaXMuc2hvd1BvcHBlclxuICAgICAgICAgICAgfV0sXG5cbiAgICAgICAgICAgICdjbGFzcyc6IFsnZWwtdG9vbHRpcF9fcG9wcGVyJywgJ2lzLScgKyB0aGlzLmVmZmVjdCwgdGhpcy5wb3BwZXJDbGFzc10gfSxcbiAgICAgICAgICBbdGhpcy4kc2xvdHMuY29udGVudCB8fCB0aGlzLmNvbnRlbnRdXG4gICAgICAgICldXG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBmaXJzdEVsZW1lbnQgPSB0aGlzLmdldEZpcnN0RWxlbWVudCgpO1xuICAgIGlmICghZmlyc3RFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIHZhciBkYXRhID0gZmlyc3RFbGVtZW50LmRhdGEgPSBmaXJzdEVsZW1lbnQuZGF0YSB8fCB7fTtcbiAgICBkYXRhLnN0YXRpY0NsYXNzID0gdGhpcy5hZGRUb29sdGlwQ2xhc3MoZGF0YS5zdGF0aWNDbGFzcyk7XG5cbiAgICByZXR1cm4gZmlyc3RFbGVtZW50O1xuICB9LFxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdGhpcy5yZWZlcmVuY2VFbG0gPSB0aGlzLiRlbDtcbiAgICBpZiAodGhpcy4kZWwubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgIHRoaXMuJGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHRoaXMudG9vbHRpcElkKTtcbiAgICAgIHRoaXMuJGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCB0aGlzLnRhYmluZGV4KTtcbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHRoaXMucmVmZXJlbmNlRWxtLCAnbW91c2VlbnRlcicsIHRoaXMuc2hvdyk7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKSh0aGlzLnJlZmVyZW5jZUVsbSwgJ21vdXNlbGVhdmUnLCB0aGlzLmhpZGUpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdmb2N1cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFfdGhpczMuJHNsb3RzLmRlZmF1bHQgfHwgIV90aGlzMy4kc2xvdHMuZGVmYXVsdC5sZW5ndGgpIHtcbiAgICAgICAgICBfdGhpczMuaGFuZGxlRm9jdXMoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGluc3RhbmNlID0gX3RoaXMzLiRzbG90cy5kZWZhdWx0WzBdLmNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuZm9jdXMpIHtcbiAgICAgICAgICBpbnN0YW5jZS5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzMy5oYW5kbGVGb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHRoaXMucmVmZXJlbmNlRWxtLCAnYmx1cicsIHRoaXMuaGFuZGxlQmx1cik7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKSh0aGlzLnJlZmVyZW5jZUVsbSwgJ2NsaWNrJywgdGhpcy5yZW1vdmVGb2N1c2luZyk7XG4gICAgfVxuICAgIC8vIGZpeCBpc3N1ZSBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy8xNDQyNFxuICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMucG9wcGVyVk0pIHtcbiAgICAgIHRoaXMucG9wcGVyVk0uJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzMy52YWx1ZSkge1xuICAgICAgICAgIF90aGlzMy51cGRhdGVQb3BwZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgZm9jdXNpbmc6IGZ1bmN0aW9uIGZvY3VzaW5nKHZhbCkge1xuICAgICAgaWYgKHZhbCkge1xuICAgICAgICBPYmplY3QoZG9tX1tcImFkZENsYXNzXCJdKSh0aGlzLnJlZmVyZW5jZUVsbSwgJ2ZvY3VzaW5nJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3QoZG9tX1tcInJlbW92ZUNsYXNzXCJdKSh0aGlzLnJlZmVyZW5jZUVsbSwgJ2ZvY3VzaW5nJyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgIHRoaXMuc2V0RXhwZWN0ZWRTdGF0ZSh0cnVlKTtcbiAgICAgIHRoaXMuaGFuZGxlU2hvd1BvcHBlcigpO1xuICAgIH0sXG4gICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgIHRoaXMuc2V0RXhwZWN0ZWRTdGF0ZShmYWxzZSk7XG4gICAgICB0aGlzLmRlYm91bmNlQ2xvc2UoKTtcbiAgICB9LFxuICAgIGhhbmRsZUZvY3VzOiBmdW5jdGlvbiBoYW5kbGVGb2N1cygpIHtcbiAgICAgIHRoaXMuZm9jdXNpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfSxcbiAgICBoYW5kbGVCbHVyOiBmdW5jdGlvbiBoYW5kbGVCbHVyKCkge1xuICAgICAgdGhpcy5mb2N1c2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSxcbiAgICByZW1vdmVGb2N1c2luZzogZnVuY3Rpb24gcmVtb3ZlRm9jdXNpbmcoKSB7XG4gICAgICB0aGlzLmZvY3VzaW5nID0gZmFsc2U7XG4gICAgfSxcbiAgICBhZGRUb29sdGlwQ2xhc3M6IGZ1bmN0aW9uIGFkZFRvb2x0aXBDbGFzcyhwcmV2KSB7XG4gICAgICBpZiAoIXByZXYpIHtcbiAgICAgICAgcmV0dXJuICdlbC10b29sdGlwJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnZWwtdG9vbHRpcCAnICsgcHJldi5yZXBsYWNlKCdlbC10b29sdGlwJywgJycpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlU2hvd1BvcHBlcjogZnVuY3Rpb24gaGFuZGxlU2hvd1BvcHBlcigpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICBpZiAoIXRoaXMuZXhwZWN0ZWRTdGF0ZSB8fCB0aGlzLm1hbnVhbCkgcmV0dXJuO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXM0LnNob3dQb3BwZXIgPSB0cnVlO1xuICAgICAgfSwgdGhpcy5vcGVuRGVsYXkpO1xuXG4gICAgICBpZiAodGhpcy5oaWRlQWZ0ZXIgPiAwKSB7XG4gICAgICAgIHRoaXMudGltZW91dFBlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczQuc2hvd1BvcHBlciA9IGZhbHNlO1xuICAgICAgICB9LCB0aGlzLmhpZGVBZnRlcik7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVDbG9zZVBvcHBlcjogZnVuY3Rpb24gaGFuZGxlQ2xvc2VQb3BwZXIoKSB7XG4gICAgICBpZiAodGhpcy5lbnRlcmFibGUgJiYgdGhpcy5leHBlY3RlZFN0YXRlIHx8IHRoaXMubWFudWFsKSByZXR1cm47XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcblxuICAgICAgaWYgKHRoaXMudGltZW91dFBlbmRpbmcpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFBlbmRpbmcpO1xuICAgICAgfVxuICAgICAgdGhpcy5zaG93UG9wcGVyID0gZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuZG9EZXN0cm95KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRFeHBlY3RlZFN0YXRlOiBmdW5jdGlvbiBzZXRFeHBlY3RlZFN0YXRlKGV4cGVjdGVkU3RhdGUpIHtcbiAgICAgIGlmIChleHBlY3RlZFN0YXRlID09PSBmYWxzZSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0UGVuZGluZyk7XG4gICAgICB9XG4gICAgICB0aGlzLmV4cGVjdGVkU3RhdGUgPSBleHBlY3RlZFN0YXRlO1xuICAgIH0sXG4gICAgZ2V0Rmlyc3RFbGVtZW50OiBmdW5jdGlvbiBnZXRGaXJzdEVsZW1lbnQoKSB7XG4gICAgICB2YXIgc2xvdHMgPSB0aGlzLiRzbG90cy5kZWZhdWx0O1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNsb3RzKSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgZWxlbWVudCA9IG51bGw7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc2xvdHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGlmIChzbG90c1tpbmRleF0gJiYgc2xvdHNbaW5kZXhdLnRhZykge1xuICAgICAgICAgIGVsZW1lbnQgPSBzbG90c1tpbmRleF07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICB0aGlzLnBvcHBlclZNICYmIHRoaXMucG9wcGVyVk0uJGRlc3Ryb3koKTtcbiAgfSxcbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgdmFyIHJlZmVyZW5jZSA9IHRoaXMucmVmZXJlbmNlRWxtO1xuICAgIGlmIChyZWZlcmVuY2Uubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdtb3VzZWVudGVyJywgdGhpcy5zaG93KTtcbiAgICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdtb3VzZWxlYXZlJywgdGhpcy5oaWRlKTtcbiAgICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdmb2N1cycsIHRoaXMuaGFuZGxlRm9jdXMpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKHJlZmVyZW5jZSwgJ2JsdXInLCB0aGlzLmhhbmRsZUJsdXIpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKHJlZmVyZW5jZSwgJ2NsaWNrJywgdGhpcy5yZW1vdmVGb2N1c2luZyk7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdG9vbHRpcC9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zcmNfbWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHNyY19tYWluLm5hbWUsIHNyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3Rvb2x0aXAgPSAoc3JjX21haW4pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9tZXNzYWdlLWJveC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NmIyOWIwMTImXG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZiMjliMDEyX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcInRyYW5zaXRpb25cIiwgeyBhdHRyczogeyBuYW1lOiBcIm1zZ2JveC1mYWRlXCIgfSB9LCBbXG4gICAgX2MoXG4gICAgICBcImRpdlwiLFxuICAgICAge1xuICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgdmFsdWU6IF92bS52aXNpYmxlLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJ2aXNpYmxlXCJcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLW1lc3NhZ2UtYm94X193cmFwcGVyXCIsXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdGFiaW5kZXg6IFwiLTFcIixcbiAgICAgICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgICAgIFwiYXJpYS1tb2RhbFwiOiBcInRydWVcIixcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogX3ZtLnRpdGxlIHx8IFwiZGlhbG9nXCJcbiAgICAgICAgfSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfdm0uaGFuZGxlV3JhcHBlckNsaWNrKCRldmVudClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbXG4gICAgICAgIF9jKFxuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtbWVzc2FnZS1ib3hcIixcbiAgICAgICAgICAgIGNsYXNzOiBbX3ZtLmN1c3RvbUNsYXNzLCBfdm0uY2VudGVyICYmIFwiZWwtbWVzc2FnZS1ib3gtLWNlbnRlclwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW1xuICAgICAgICAgICAgX3ZtLnRpdGxlICE9PSBudWxsXG4gICAgICAgICAgICAgID8gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1tZXNzYWdlLWJveF9faGVhZGVyXCIgfSwgW1xuICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1tZXNzYWdlLWJveF9fdGl0bGVcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5pY29uICYmIF92bS5jZW50ZXJcbiAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtcImVsLW1lc3NhZ2UtYm94X19zdGF0dXNcIiwgX3ZtLmljb25dXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgICAgICAgIF9jKFwic3BhblwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXG4gICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgIF92bS5zaG93Q2xvc2VcbiAgICAgICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLW1lc3NhZ2UtYm94X19oZWFkZXJidG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgdHlwZTogXCJidXR0b25cIiwgXCJhcmlhLWxhYmVsXCI6IFwiQ2xvc2VcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVBY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kaXN0aW5ndWlzaENhbmNlbEFuZENsb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImNsb3NlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiY2FuY2VsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWRvd246IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmhhbmRsZUFjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmRpc3Rpbmd1aXNoQ2FuY2VsQW5kQ2xvc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiY2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJjYW5jZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1tZXNzYWdlLWJveF9fY2xvc2UgZWwtaWNvbi1jbG9zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtbWVzc2FnZS1ib3hfX2NvbnRlbnRcIiB9LCBbXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtbWVzc2FnZS1ib3hfX2NvbnRhaW5lclwiIH0sIFtcbiAgICAgICAgICAgICAgICBfdm0uaWNvbiAmJiAhX3ZtLmNlbnRlciAmJiBfdm0ubWVzc2FnZSAhPT0gXCJcIlxuICAgICAgICAgICAgICAgICAgPyBfYyhcImRpdlwiLCB7IGNsYXNzOiBbXCJlbC1tZXNzYWdlLWJveF9fc3RhdHVzXCIsIF92bS5pY29uXSB9KVxuICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICBfdm0ubWVzc2FnZSAhPT0gXCJcIlxuICAgICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtbWVzc2FnZS1ib3hfX21lc3NhZ2VcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdChcImRlZmF1bHRcIiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAhX3ZtLmRhbmdlcm91c2x5VXNlSFRNTFN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJwXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS5tZXNzYWdlKSldKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX2MoXCJwXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHsgaW5uZXJIVE1MOiBfdm0uX3MoX3ZtLm1lc3NhZ2UpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5zaG93SW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJzaG93SW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtbWVzc2FnZS1ib3hfX2lucHV0XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF9jKFwiZWwtaW5wdXRcIiwge1xuICAgICAgICAgICAgICAgICAgICByZWY6IFwiaW5wdXRcIixcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBfdm0uaW5wdXRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBfdm0uaW5wdXRQbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVPbjoge1xuICAgICAgICAgICAgICAgICAgICAgIGtleWRvd246IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5oYW5kbGVJbnB1dEVudGVyKCRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5pbnB1dFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigkJHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5pbnB1dFZhbHVlID0gJCR2XG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImlucHV0VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtbWVzc2FnZS1ib3hfX2Vycm9ybXNnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6ICEhX3ZtLmVkaXRvckVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwidmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLmVkaXRvckVycm9yTWVzc2FnZSkpXVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLW1lc3NhZ2UtYm94X19idG5zXCIgfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIF92bS5zaG93Q2FuY2VsQnV0dG9uXG4gICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgIFwiZWwtYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtfdm0uY2FuY2VsQnV0dG9uQ2xhc3Nlc10sXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nOiBfdm0uY2FuY2VsQnV0dG9uTG9hZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQ6IF92bS5yb3VuZEJ1dHRvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZG93bjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZW50ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmhhbmRsZUFjdGlvbihcImNhbmNlbFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVBY3Rpb24oXCJjYW5jZWxcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgICBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmNhbmNlbEJ1dHRvblRleHQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnQoXCJlbC5tZXNzYWdlYm94LmNhbmNlbFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgIFwiZWwtYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnNob3dDb25maXJtQnV0dG9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJzaG93Q29uZmlybUJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICByZWY6IFwiY29uZmlybVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzczogW192bS5jb25maXJtQnV0dG9uQ2xhc3Nlc10sXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgbG9hZGluZzogX3ZtLmNvbmZpcm1CdXR0b25Mb2FkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIHJvdW5kOiBfdm0ucm91bmRCdXR0b24sXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAga2V5ZG93bjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQua2V5Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVudGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlQWN0aW9uKFwiY29uZmlybVwiKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlQWN0aW9uKFwiY29uZmlybVwiKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICAgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmNvbmZpcm1CdXR0b25UZXh0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnQoXCJlbC5tZXNzYWdlYm94LmNvbmZpcm1cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIDFcbiAgICAgICAgICAgIClcbiAgICAgICAgICBdXG4gICAgICAgIClcbiAgICAgIF1cbiAgICApXG4gIF0pXG59XG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZiMjliMDEyX3N0YXRpY1JlbmRlckZucyA9IFtdXG5tYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNmIyOWIwMTJfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZXNzYWdlLWJveC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NmIyOWIwMTImXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9sb2NhbGVcIlxudmFyIGxpYl9sb2NhbGVfID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG52YXIgbGliX2xvY2FsZV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihsaWJfbG9jYWxlXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9hcmlhLWRpYWxvZ1wiXG52YXIgYXJpYV9kaWFsb2dfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MCk7XG52YXIgYXJpYV9kaWFsb2dfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oYXJpYV9kaWFsb2dfKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbWVzc2FnZS1ib3gvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG5cblxuXG52YXIgbWVzc2FnZUJveCA9IHZvaWQgMDtcbnZhciB0eXBlTWFwID0ge1xuICBzdWNjZXNzOiAnc3VjY2VzcycsXG4gIGluZm86ICdpbmZvJyxcbiAgd2FybmluZzogJ3dhcm5pbmcnLFxuICBlcnJvcjogJ2Vycm9yJ1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbWVzc2FnZV9ib3hfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBtaXhpbnM6IFtwb3B1cF9kZWZhdWx0LmEsIGxvY2FsZV9kZWZhdWx0LmFdLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kYWw6IHtcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGxvY2tTY3JvbGw6IHtcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIHNob3dDbG9zZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGNsb3NlT25DbGlja01vZGFsOiB7XG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjbG9zZU9uUHJlc3NFc2NhcGU6IHtcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGNsb3NlT25IYXNoQ2hhbmdlOiB7XG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjZW50ZXI6IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgdHlwZTogQm9vbGVhblxuICAgIH0sXG4gICAgcm91bmRCdXR0b246IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgdHlwZTogQm9vbGVhblxuICAgIH1cbiAgfSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxJbnB1dDogaW5wdXRfZGVmYXVsdC5hLFxuICAgIEVsQnV0dG9uOiBidXR0b25fZGVmYXVsdC5hXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpY29uOiBmdW5jdGlvbiBpY29uKCkge1xuICAgICAgdmFyIHR5cGUgPSB0aGlzLnR5cGUsXG4gICAgICAgICAgaWNvbkNsYXNzID0gdGhpcy5pY29uQ2xhc3M7XG5cbiAgICAgIHJldHVybiBpY29uQ2xhc3MgfHwgKHR5cGUgJiYgdHlwZU1hcFt0eXBlXSA/ICdlbC1pY29uLScgKyB0eXBlTWFwW3R5cGVdIDogJycpO1xuICAgIH0sXG4gICAgY29uZmlybUJ1dHRvbkNsYXNzZXM6IGZ1bmN0aW9uIGNvbmZpcm1CdXR0b25DbGFzc2VzKCkge1xuICAgICAgcmV0dXJuICdlbC1idXR0b24tLXByaW1hcnkgJyArIHRoaXMuY29uZmlybUJ1dHRvbkNsYXNzO1xuICAgIH0sXG4gICAgY2FuY2VsQnV0dG9uQ2xhc3NlczogZnVuY3Rpb24gY2FuY2VsQnV0dG9uQ2xhc3NlcygpIHtcbiAgICAgIHJldHVybiAnJyArIHRoaXMuY2FuY2VsQnV0dG9uQ2xhc3M7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRTYWZlQ2xvc2U6IGZ1bmN0aW9uIGdldFNhZmVDbG9zZSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBjdXJyZW50SWQgPSB0aGlzLnVpZDtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJZCA9PT0gX3RoaXMudWlkKSBfdGhpcy5kb0Nsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9LFxuICAgIGRvQ2xvc2U6IGZ1bmN0aW9uIGRvQ2xvc2UoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLnZpc2libGUpIHJldHVybjtcbiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fY2xvc2luZyA9IHRydWU7XG5cbiAgICAgIHRoaXMub25DbG9zZSAmJiB0aGlzLm9uQ2xvc2UoKTtcbiAgICAgIG1lc3NhZ2VCb3guY2xvc2VEaWFsb2coKTsgLy8g6Kej57uRXG4gICAgICBpZiAodGhpcy5sb2NrU2Nyb2xsKSB7XG4gICAgICAgIHNldFRpbWVvdXQodGhpcy5yZXN0b3JlQm9keVN0eWxlLCAyMDApO1xuICAgICAgfVxuICAgICAgdGhpcy5vcGVuZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZG9BZnRlckNsb3NlKCk7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzMi5hY3Rpb24pIF90aGlzMi5jYWxsYmFjayhfdGhpczIuYWN0aW9uLCBfdGhpczIpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBoYW5kbGVXcmFwcGVyQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZVdyYXBwZXJDbGljaygpIHtcbiAgICAgIGlmICh0aGlzLmNsb3NlT25DbGlja01vZGFsKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQWN0aW9uKHRoaXMuZGlzdGluZ3Vpc2hDYW5jZWxBbmRDbG9zZSA/ICdjbG9zZScgOiAnY2FuY2VsJyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVJbnB1dEVudGVyOiBmdW5jdGlvbiBoYW5kbGVJbnB1dEVudGVyKCkge1xuICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlICE9PSAndGV4dGFyZWEnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUFjdGlvbignY29uZmlybScpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlQWN0aW9uOiBmdW5jdGlvbiBoYW5kbGVBY3Rpb24oYWN0aW9uKSB7XG4gICAgICBpZiAodGhpcy4kdHlwZSA9PT0gJ3Byb21wdCcgJiYgYWN0aW9uID09PSAnY29uZmlybScgJiYgIXRoaXMudmFsaWRhdGUoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5iZWZvcmVDbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLmNsb3NlID0gdGhpcy5nZXRTYWZlQ2xvc2UoKTtcbiAgICAgICAgdGhpcy5iZWZvcmVDbG9zZShhY3Rpb24sIHRoaXMsIHRoaXMuY2xvc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kb0Nsb3NlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gICAgICBpZiAodGhpcy4kdHlwZSA9PT0gJ3Byb21wdCcpIHtcbiAgICAgICAgdmFyIGlucHV0UGF0dGVybiA9IHRoaXMuaW5wdXRQYXR0ZXJuO1xuICAgICAgICBpZiAoaW5wdXRQYXR0ZXJuICYmICFpbnB1dFBhdHRlcm4udGVzdCh0aGlzLmlucHV0VmFsdWUgfHwgJycpKSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JFcnJvck1lc3NhZ2UgPSB0aGlzLmlucHV0RXJyb3JNZXNzYWdlIHx8IE9iamVjdChsaWJfbG9jYWxlX1tcInRcIl0pKCdlbC5tZXNzYWdlYm94LmVycm9yJyk7XG4gICAgICAgICAgT2JqZWN0KGRvbV9bXCJhZGRDbGFzc1wiXSkodGhpcy5nZXRJbnB1dEVsZW1lbnQoKSwgJ2ludmFsaWQnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlucHV0VmFsaWRhdG9yID0gdGhpcy5pbnB1dFZhbGlkYXRvcjtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciB2YWxpZGF0ZVJlc3VsdCA9IGlucHV0VmFsaWRhdG9yKHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRlUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JFcnJvck1lc3NhZ2UgPSB0aGlzLmlucHV0RXJyb3JNZXNzYWdlIHx8IE9iamVjdChsaWJfbG9jYWxlX1tcInRcIl0pKCdlbC5tZXNzYWdlYm94LmVycm9yJyk7XG4gICAgICAgICAgICBPYmplY3QoZG9tX1tcImFkZENsYXNzXCJdKSh0aGlzLmdldElucHV0RWxlbWVudCgpLCAnaW52YWxpZCcpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRlUmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JFcnJvck1lc3NhZ2UgPSB2YWxpZGF0ZVJlc3VsdDtcbiAgICAgICAgICAgIE9iamVjdChkb21fW1wiYWRkQ2xhc3NcIl0pKHRoaXMuZ2V0SW5wdXRFbGVtZW50KCksICdpbnZhbGlkJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmVkaXRvckVycm9yTWVzc2FnZSA9ICcnO1xuICAgICAgT2JqZWN0KGRvbV9bXCJyZW1vdmVDbGFzc1wiXSkodGhpcy5nZXRJbnB1dEVsZW1lbnQoKSwgJ2ludmFsaWQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgZ2V0Rmlyc3RGb2N1czogZnVuY3Rpb24gZ2V0Rmlyc3RGb2N1cygpIHtcbiAgICAgIHZhciBidG4gPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuZWwtbWVzc2FnZS1ib3hfX2J0bnMgLmVsLWJ1dHRvbicpO1xuICAgICAgdmFyIHRpdGxlID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmVsLW1lc3NhZ2UtYm94X19idG5zIC5lbC1tZXNzYWdlLWJveF9fdGl0bGUnKTtcbiAgICAgIHJldHVybiBidG4gfHwgdGl0bGU7XG4gICAgfSxcbiAgICBnZXRJbnB1dEVsZW1lbnQ6IGZ1bmN0aW9uIGdldElucHV0RWxlbWVudCgpIHtcbiAgICAgIHZhciBpbnB1dFJlZnMgPSB0aGlzLiRyZWZzLmlucHV0LiRyZWZzO1xuICAgICAgcmV0dXJuIGlucHV0UmVmcy5pbnB1dCB8fCBpbnB1dFJlZnMudGV4dGFyZWE7XG4gICAgfSxcbiAgICBoYW5kbGVDbG9zZTogZnVuY3Rpb24gaGFuZGxlQ2xvc2UoKSB7XG4gICAgICB0aGlzLmhhbmRsZUFjdGlvbignY2xvc2UnKTtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBpbnB1dFZhbHVlOiB7XG4gICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKHZhbCkge1xuICAgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoXykge1xuICAgICAgICAgIGlmIChfdGhpczMuJHR5cGUgPT09ICdwcm9tcHQnICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX3RoaXMzLnZhbGlkYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdmlzaWJsZTogZnVuY3Rpb24gdmlzaWJsZSh2YWwpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHRoaXMudWlkKys7XG4gICAgICAgIGlmICh0aGlzLiR0eXBlID09PSAnYWxlcnQnIHx8IHRoaXMuJHR5cGUgPT09ICdjb25maXJtJykge1xuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzNC4kcmVmcy5jb25maXJtLiRlbC5mb2N1cygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9jdXNBZnRlckNsb3NlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIG1lc3NhZ2VCb3ggPSBuZXcgYXJpYV9kaWFsb2dfZGVmYXVsdC5hKHRoaXMuJGVsLCB0aGlzLmZvY3VzQWZ0ZXJDbG9zZWQsIHRoaXMuZ2V0Rmlyc3RGb2N1cygpKTtcbiAgICAgIH1cblxuICAgICAgLy8gcHJvbXB0XG4gICAgICBpZiAodGhpcy4kdHlwZSAhPT0gJ3Byb21wdCcpIHJldHVybjtcbiAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKF90aGlzNC4kcmVmcy5pbnB1dCAmJiBfdGhpczQuJHJlZnMuaW5wdXQuJGVsKSB7XG4gICAgICAgICAgICBfdGhpczQuZ2V0SW5wdXRFbGVtZW50KCkuZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVkaXRvckVycm9yTWVzc2FnZSA9ICcnO1xuICAgICAgICBPYmplY3QoZG9tX1tcInJlbW92ZUNsYXNzXCJdKSh0aGlzLmdldElucHV0RWxlbWVudCgpLCAnaW52YWxpZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzNS5jbG9zZU9uSGFzaENoYW5nZSkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIF90aGlzNS5jbG9zZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VPbkhhc2hDaGFuZ2UpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgdGhpcy5jbG9zZSk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgbWVzc2FnZUJveC5jbG9zZURpYWxvZygpO1xuICAgIH0pO1xuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB1aWQ6IDEsXG4gICAgICB0aXRsZTogdW5kZWZpbmVkLFxuICAgICAgbWVzc2FnZTogJycsXG4gICAgICB0eXBlOiAnJyxcbiAgICAgIGljb25DbGFzczogJycsXG4gICAgICBjdXN0b21DbGFzczogJycsXG4gICAgICBzaG93SW5wdXQ6IGZhbHNlLFxuICAgICAgaW5wdXRWYWx1ZTogbnVsbCxcbiAgICAgIGlucHV0UGxhY2Vob2xkZXI6ICcnLFxuICAgICAgaW5wdXRUeXBlOiAndGV4dCcsXG4gICAgICBpbnB1dFBhdHRlcm46IG51bGwsXG4gICAgICBpbnB1dFZhbGlkYXRvcjogbnVsbCxcbiAgICAgIGlucHV0RXJyb3JNZXNzYWdlOiAnJyxcbiAgICAgIHNob3dDb25maXJtQnV0dG9uOiB0cnVlLFxuICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsXG4gICAgICBhY3Rpb246ICcnLFxuICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICcnLFxuICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJycsXG4gICAgICBjb25maXJtQnV0dG9uTG9hZGluZzogZmFsc2UsXG4gICAgICBjYW5jZWxCdXR0b25Mb2FkaW5nOiBmYWxzZSxcbiAgICAgIGNvbmZpcm1CdXR0b25DbGFzczogJycsXG4gICAgICBjb25maXJtQnV0dG9uRGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgY2FuY2VsQnV0dG9uQ2xhc3M6ICcnLFxuICAgICAgZWRpdG9yRXJyb3JNZXNzYWdlOiBudWxsLFxuICAgICAgY2FsbGJhY2s6IG51bGwsXG4gICAgICBkYW5nZXJvdXNseVVzZUhUTUxTdHJpbmc6IGZhbHNlLFxuICAgICAgZm9jdXNBZnRlckNsb3NlZDogbnVsbCxcbiAgICAgIGlzT25Db21wb3NpdGlvbjogZmFsc2UsXG4gICAgICBkaXN0aW5ndWlzaENhbmNlbEFuZENsb3NlOiBmYWxzZVxuICAgIH07XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZXNzYWdlLWJveC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfbWVzc2FnZV9ib3hfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAobWVzc2FnZV9ib3hfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVzc2FnZS1ib3gvc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgc3JjX21haW5fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBwYWNrYWdlc19tZXNzYWdlX2JveF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZiMjliMDEyX3JlbmRlcixcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZiMjliMDEyX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgc3JjX21haW5fYXBpOyB9XG5zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL21lc3NhZ2UtYm94L3NyYy9tYWluLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBtZXNzYWdlX2JveF9zcmNfbWFpbiA9IChzcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvdmRvbVwiXG52YXIgdmRvbV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZXNzYWdlLWJveC9zcmMvbWFpbi5qc1xudmFyIG1haW5fdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIG1haW5fZGVmYXVsdHMgPSB7XG4gIHRpdGxlOiBudWxsLFxuICBtZXNzYWdlOiAnJyxcbiAgdHlwZTogJycsXG4gIGljb25DbGFzczogJycsXG4gIHNob3dJbnB1dDogZmFsc2UsXG4gIHNob3dDbG9zZTogdHJ1ZSxcbiAgbW9kYWxGYWRlOiB0cnVlLFxuICBsb2NrU2Nyb2xsOiB0cnVlLFxuICBjbG9zZU9uQ2xpY2tNb2RhbDogdHJ1ZSxcbiAgY2xvc2VPblByZXNzRXNjYXBlOiB0cnVlLFxuICBjbG9zZU9uSGFzaENoYW5nZTogdHJ1ZSxcbiAgaW5wdXRWYWx1ZTogbnVsbCxcbiAgaW5wdXRQbGFjZWhvbGRlcjogJycsXG4gIGlucHV0VHlwZTogJ3RleHQnLFxuICBpbnB1dFBhdHRlcm46IG51bGwsXG4gIGlucHV0VmFsaWRhdG9yOiBudWxsLFxuICBpbnB1dEVycm9yTWVzc2FnZTogJycsXG4gIHNob3dDb25maXJtQnV0dG9uOiB0cnVlLFxuICBzaG93Q2FuY2VsQnV0dG9uOiBmYWxzZSxcbiAgY29uZmlybUJ1dHRvblBvc2l0aW9uOiAncmlnaHQnLFxuICBjb25maXJtQnV0dG9uSGlnaGxpZ2h0OiBmYWxzZSxcbiAgY2FuY2VsQnV0dG9uSGlnaGxpZ2h0OiBmYWxzZSxcbiAgY29uZmlybUJ1dHRvblRleHQ6ICcnLFxuICBjYW5jZWxCdXR0b25UZXh0OiAnJyxcbiAgY29uZmlybUJ1dHRvbkNsYXNzOiAnJyxcbiAgY2FuY2VsQnV0dG9uQ2xhc3M6ICcnLFxuICBjdXN0b21DbGFzczogJycsXG4gIGJlZm9yZUNsb3NlOiBudWxsLFxuICBkYW5nZXJvdXNseVVzZUhUTUxTdHJpbmc6IGZhbHNlLFxuICBjZW50ZXI6IGZhbHNlLFxuICByb3VuZEJ1dHRvbjogZmFsc2UsXG4gIGRpc3Rpbmd1aXNoQ2FuY2VsQW5kQ2xvc2U6IGZhbHNlXG59O1xuXG5cblxuXG5cblxudmFyIE1lc3NhZ2VCb3hDb25zdHJ1Y3RvciA9IGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEuZXh0ZW5kKG1lc3NhZ2VfYm94X3NyY19tYWluKTtcblxudmFyIGN1cnJlbnRNc2cgPSB2b2lkIDAsXG4gICAgbWFpbl9pbnN0YW5jZSA9IHZvaWQgMDtcbnZhciBtc2dRdWV1ZSA9IFtdO1xuXG52YXIgZGVmYXVsdENhbGxiYWNrID0gZnVuY3Rpb24gZGVmYXVsdENhbGxiYWNrKGFjdGlvbikge1xuICBpZiAoY3VycmVudE1zZykge1xuICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRNc2cuY2FsbGJhY2s7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKG1haW5faW5zdGFuY2Uuc2hvd0lucHV0KSB7XG4gICAgICAgIGNhbGxiYWNrKG1haW5faW5zdGFuY2UuaW5wdXRWYWx1ZSwgYWN0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKGFjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJyZW50TXNnLnJlc29sdmUpIHtcbiAgICAgIGlmIChhY3Rpb24gPT09ICdjb25maXJtJykge1xuICAgICAgICBpZiAobWFpbl9pbnN0YW5jZS5zaG93SW5wdXQpIHtcbiAgICAgICAgICBjdXJyZW50TXNnLnJlc29sdmUoeyB2YWx1ZTogbWFpbl9pbnN0YW5jZS5pbnB1dFZhbHVlLCBhY3Rpb246IGFjdGlvbiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50TXNnLnJlc29sdmUoYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50TXNnLnJlamVjdCAmJiAoYWN0aW9uID09PSAnY2FuY2VsJyB8fCBhY3Rpb24gPT09ICdjbG9zZScpKSB7XG4gICAgICAgIGN1cnJlbnRNc2cucmVqZWN0KGFjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgaW5pdEluc3RhbmNlID0gZnVuY3Rpb24gaW5pdEluc3RhbmNlKCkge1xuICBtYWluX2luc3RhbmNlID0gbmV3IE1lc3NhZ2VCb3hDb25zdHJ1Y3Rvcih7XG4gICAgZWw6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIH0pO1xuXG4gIG1haW5faW5zdGFuY2UuY2FsbGJhY2sgPSBkZWZhdWx0Q2FsbGJhY2s7XG59O1xuXG52YXIgbWFpbl9zaG93TmV4dE1zZyA9IGZ1bmN0aW9uIHNob3dOZXh0TXNnKCkge1xuICBpZiAoIW1haW5faW5zdGFuY2UpIHtcbiAgICBpbml0SW5zdGFuY2UoKTtcbiAgfVxuICBtYWluX2luc3RhbmNlLmFjdGlvbiA9ICcnO1xuXG4gIGlmICghbWFpbl9pbnN0YW5jZS52aXNpYmxlIHx8IG1haW5faW5zdGFuY2UuY2xvc2VUaW1lcikge1xuICAgIGlmIChtc2dRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjdXJyZW50TXNnID0gbXNnUXVldWUuc2hpZnQoKTtcblxuICAgICAgdmFyIG9wdGlvbnMgPSBjdXJyZW50TXNnLm9wdGlvbnM7XG4gICAgICBmb3IgKHZhciBwcm9wIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICBtYWluX2luc3RhbmNlW3Byb3BdID0gb3B0aW9uc1twcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtYWluX2luc3RhbmNlLmNhbGxiYWNrID0gZGVmYXVsdENhbGxiYWNrO1xuICAgICAgfVxuXG4gICAgICB2YXIgb2xkQ2IgPSBtYWluX2luc3RhbmNlLmNhbGxiYWNrO1xuICAgICAgbWFpbl9pbnN0YW5jZS5jYWxsYmFjayA9IGZ1bmN0aW9uIChhY3Rpb24sIGluc3RhbmNlKSB7XG4gICAgICAgIG9sZENiKGFjdGlvbiwgaW5zdGFuY2UpO1xuICAgICAgICBzaG93TmV4dE1zZygpO1xuICAgICAgfTtcbiAgICAgIGlmIChPYmplY3QodmRvbV9bXCJpc1ZOb2RlXCJdKShtYWluX2luc3RhbmNlLm1lc3NhZ2UpKSB7XG4gICAgICAgIG1haW5faW5zdGFuY2UuJHNsb3RzLmRlZmF1bHQgPSBbbWFpbl9pbnN0YW5jZS5tZXNzYWdlXTtcbiAgICAgICAgbWFpbl9pbnN0YW5jZS5tZXNzYWdlID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBtYWluX2luc3RhbmNlLiRzbG90cy5kZWZhdWx0O1xuICAgICAgfVxuICAgICAgWydtb2RhbCcsICdzaG93Q2xvc2UnLCAnY2xvc2VPbkNsaWNrTW9kYWwnLCAnY2xvc2VPblByZXNzRXNjYXBlJywgJ2Nsb3NlT25IYXNoQ2hhbmdlJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICBpZiAobWFpbl9pbnN0YW5jZVtwcm9wXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbWFpbl9pbnN0YW5jZVtwcm9wXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtYWluX2luc3RhbmNlLiRlbCk7XG5cbiAgICAgIGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBtYWluX2luc3RhbmNlLnZpc2libGUgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgbWFpbl9NZXNzYWdlQm94ID0gZnVuY3Rpb24gTWVzc2FnZUJveChvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAoZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5wcm90b3R5cGUuJGlzU2VydmVyKSByZXR1cm47XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgfHwgT2JqZWN0KHZkb21fW1wiaXNWTm9kZVwiXSkob3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgbWVzc2FnZTogb3B0aW9uc1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRpb25zLnRpdGxlID0gYXJndW1lbnRzWzFdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChvcHRpb25zLmNhbGxiYWNrICYmICFjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgfVxuXG4gIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgbXNnUXVldWUucHVzaCh7XG4gICAgICAgIG9wdGlvbnM6IG1lcmdlX2RlZmF1bHQoKSh7fSwgbWFpbl9kZWZhdWx0cywgTWVzc2FnZUJveC5kZWZhdWx0cywgb3B0aW9ucyksXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgcmVqZWN0OiByZWplY3RcbiAgICAgIH0pO1xuXG4gICAgICBtYWluX3Nob3dOZXh0TXNnKCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbXNnUXVldWUucHVzaCh7XG4gICAgICBvcHRpb25zOiBtZXJnZV9kZWZhdWx0KCkoe30sIG1haW5fZGVmYXVsdHMsIE1lc3NhZ2VCb3guZGVmYXVsdHMsIG9wdGlvbnMpLFxuICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG4gICAgfSk7XG5cbiAgICBtYWluX3Nob3dOZXh0TXNnKCk7XG4gIH1cbn07XG5cbm1haW5fTWVzc2FnZUJveC5zZXREZWZhdWx0cyA9IGZ1bmN0aW9uIChkZWZhdWx0cykge1xuICBtYWluX01lc3NhZ2VCb3guZGVmYXVsdHMgPSBkZWZhdWx0cztcbn07XG5cbm1haW5fTWVzc2FnZUJveC5hbGVydCA9IGZ1bmN0aW9uIChtZXNzYWdlLCB0aXRsZSwgb3B0aW9ucykge1xuICBpZiAoKHR5cGVvZiB0aXRsZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IG1haW5fdHlwZW9mKHRpdGxlKSkgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IHRpdGxlO1xuICAgIHRpdGxlID0gJyc7XG4gIH0gZWxzZSBpZiAodGl0bGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRpdGxlID0gJyc7XG4gIH1cbiAgcmV0dXJuIG1haW5fTWVzc2FnZUJveChtZXJnZV9kZWZhdWx0KCkoe1xuICAgIHRpdGxlOiB0aXRsZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICR0eXBlOiAnYWxlcnQnLFxuICAgIGNsb3NlT25QcmVzc0VzY2FwZTogZmFsc2UsXG4gICAgY2xvc2VPbkNsaWNrTW9kYWw6IGZhbHNlXG4gIH0sIG9wdGlvbnMpKTtcbn07XG5cbm1haW5fTWVzc2FnZUJveC5jb25maXJtID0gZnVuY3Rpb24gKG1lc3NhZ2UsIHRpdGxlLCBvcHRpb25zKSB7XG4gIGlmICgodHlwZW9mIHRpdGxlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogbWFpbl90eXBlb2YodGl0bGUpKSA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zID0gdGl0bGU7XG4gICAgdGl0bGUgPSAnJztcbiAgfSBlbHNlIGlmICh0aXRsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGl0bGUgPSAnJztcbiAgfVxuICByZXR1cm4gbWFpbl9NZXNzYWdlQm94KG1lcmdlX2RlZmF1bHQoKSh7XG4gICAgdGl0bGU6IHRpdGxlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgJHR5cGU6ICdjb25maXJtJyxcbiAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlXG4gIH0sIG9wdGlvbnMpKTtcbn07XG5cbm1haW5fTWVzc2FnZUJveC5wcm9tcHQgPSBmdW5jdGlvbiAobWVzc2FnZSwgdGl0bGUsIG9wdGlvbnMpIHtcbiAgaWYgKCh0eXBlb2YgdGl0bGUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBtYWluX3R5cGVvZih0aXRsZSkpID09PSAnb2JqZWN0Jykge1xuICAgIG9wdGlvbnMgPSB0aXRsZTtcbiAgICB0aXRsZSA9ICcnO1xuICB9IGVsc2UgaWYgKHRpdGxlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aXRsZSA9ICcnO1xuICB9XG4gIHJldHVybiBtYWluX01lc3NhZ2VCb3gobWVyZ2VfZGVmYXVsdCgpKHtcbiAgICB0aXRsZTogdGl0bGUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgIHNob3dJbnB1dDogdHJ1ZSxcbiAgICAkdHlwZTogJ3Byb21wdCdcbiAgfSwgb3B0aW9ucykpO1xufTtcblxubWFpbl9NZXNzYWdlQm94LmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICBtYWluX2luc3RhbmNlLmRvQ2xvc2UoKTtcbiAgbWFpbl9pbnN0YW5jZS52aXNpYmxlID0gZmFsc2U7XG4gIG1zZ1F1ZXVlID0gW107XG4gIGN1cnJlbnRNc2cgPSBudWxsO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfbWVzc2FnZV9ib3hfc3JjX21haW4gPSAobWFpbl9NZXNzYWdlQm94KTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZXNzYWdlLWJveC9pbmRleC5qc1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBtZXNzYWdlX2JveCA9IChwYWNrYWdlc19tZXNzYWdlX2JveF9zcmNfbWFpbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2JyZWFkY3J1bWIvc3JjL2JyZWFkY3J1bWIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTRiNDY0YzA2JlxudmFyIGJyZWFkY3J1bWJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF80YjQ2NGMwNl9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1icmVhZGNydW1iXCIsXG4gICAgICBhdHRyczogeyBcImFyaWEtbGFiZWxcIjogXCJCcmVhZGNydW1iXCIsIHJvbGU6IFwibmF2aWdhdGlvblwiIH1cbiAgICB9LFxuICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAyXG4gIClcbn1cbnZhciBicmVhZGNydW1idnVlX3R5cGVfdGVtcGxhdGVfaWRfNGI0NjRjMDZfc3RhdGljUmVuZGVyRm5zID0gW11cbmJyZWFkY3J1bWJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF80YjQ2NGMwNl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JyZWFkY3J1bWIvc3JjL2JyZWFkY3J1bWIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTRiNDY0YzA2JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9icmVhZGNydW1iL3NyYy9icmVhZGNydW1iLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBicmVhZGNydW1idnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsQnJlYWRjcnVtYicsXG5cbiAgcHJvcHM6IHtcbiAgICBzZXBhcmF0b3I6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcvJ1xuICAgIH0sXG4gICAgc2VwYXJhdG9yQ2xhc3M6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsQnJlYWRjcnVtYjogdGhpc1xuICAgIH07XG4gIH0sXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnLmVsLWJyZWFkY3J1bWJfX2l0ZW0nKTtcbiAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXS5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdwYWdlJyk7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnJlYWRjcnVtYi9zcmMvYnJlYWRjcnVtYi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2JyZWFkY3J1bWJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoYnJlYWRjcnVtYnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9icmVhZGNydW1iL3NyYy9icmVhZGNydW1iLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGJyZWFkY3J1bWJfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfYnJlYWRjcnVtYnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgYnJlYWRjcnVtYnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzRiNDY0YzA2X3JlbmRlcixcbiAgYnJlYWRjcnVtYnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzRiNDY0YzA2X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgYnJlYWRjcnVtYl9hcGk7IH1cbmJyZWFkY3J1bWJfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9icmVhZGNydW1iL3NyYy9icmVhZGNydW1iLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBicmVhZGNydW1iID0gKGJyZWFkY3J1bWJfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9icmVhZGNydW1iL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmJyZWFkY3J1bWIuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChicmVhZGNydW1iLm5hbWUsIGJyZWFkY3J1bWIpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfYnJlYWRjcnVtYiA9IChicmVhZGNydW1iKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYnJlYWRjcnVtYi9zcmMvYnJlYWRjcnVtYi1pdGVtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1mY2Y5ZWFhYyZcbnZhciBicmVhZGNydW1iX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF9mY2Y5ZWFhY19yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJzcGFuXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtYnJlYWRjcnVtYl9faXRlbVwiIH0sIFtcbiAgICBfYyhcbiAgICAgIFwic3BhblwiLFxuICAgICAge1xuICAgICAgICByZWY6IFwibGlua1wiLFxuICAgICAgICBjbGFzczogW1wiZWwtYnJlYWRjcnVtYl9faW5uZXJcIiwgX3ZtLnRvID8gXCJpcy1saW5rXCIgOiBcIlwiXSxcbiAgICAgICAgYXR0cnM6IHsgcm9sZTogXCJsaW5rXCIgfVxuICAgICAgfSxcbiAgICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAgIDJcbiAgICApLFxuICAgIF92bS5zZXBhcmF0b3JDbGFzc1xuICAgICAgPyBfYyhcImlcIiwge1xuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWJyZWFkY3J1bWJfX3NlcGFyYXRvclwiLFxuICAgICAgICAgIGNsYXNzOiBfdm0uc2VwYXJhdG9yQ2xhc3NcbiAgICAgICAgfSlcbiAgICAgIDogX2MoXG4gICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtYnJlYWRjcnVtYl9fc2VwYXJhdG9yXCIsXG4gICAgICAgICAgICBhdHRyczogeyByb2xlOiBcInByZXNlbnRhdGlvblwiIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS5zZXBhcmF0b3IpKV1cbiAgICAgICAgKVxuICBdKVxufVxudmFyIGJyZWFkY3J1bWJfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ZjZjllYWFjX3N0YXRpY1JlbmRlckZucyA9IFtdXG5icmVhZGNydW1iX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF9mY2Y5ZWFhY19yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JyZWFkY3J1bWIvc3JjL2JyZWFkY3J1bWItaXRlbS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZmNmOWVhYWMmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2JyZWFkY3J1bWIvc3JjL2JyZWFkY3J1bWItaXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGJyZWFkY3J1bWJfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbEJyZWFkY3J1bWJJdGVtJyxcbiAgcHJvcHM6IHtcbiAgICB0bzoge30sXG4gICAgcmVwbGFjZTogQm9vbGVhblxuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXBhcmF0b3I6ICcnLFxuICAgICAgc2VwYXJhdG9yQ2xhc3M6ICcnXG4gICAgfTtcbiAgfSxcblxuXG4gIGluamVjdDogWydlbEJyZWFkY3J1bWInXSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLnNlcGFyYXRvciA9IHRoaXMuZWxCcmVhZGNydW1iLnNlcGFyYXRvcjtcbiAgICB0aGlzLnNlcGFyYXRvckNsYXNzID0gdGhpcy5lbEJyZWFkY3J1bWIuc2VwYXJhdG9yQ2xhc3M7XG4gICAgdmFyIGxpbmsgPSB0aGlzLiRyZWZzLmxpbms7XG4gICAgbGluay5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnbGluaycpO1xuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoXykge1xuICAgICAgdmFyIHRvID0gX3RoaXMudG8sXG4gICAgICAgICAgJHJvdXRlciA9IF90aGlzLiRyb3V0ZXI7XG5cbiAgICAgIGlmICghdG8gfHwgISRyb3V0ZXIpIHJldHVybjtcbiAgICAgIF90aGlzLnJlcGxhY2UgPyAkcm91dGVyLnJlcGxhY2UodG8pIDogJHJvdXRlci5wdXNoKHRvKTtcbiAgICB9KTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JyZWFkY3J1bWIvc3JjL2JyZWFkY3J1bWItaXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2JyZWFkY3J1bWJfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChicmVhZGNydW1iX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnJlYWRjcnVtYi9zcmMvYnJlYWRjcnVtYi1pdGVtLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGJyZWFkY3J1bWJfaXRlbV9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19icmVhZGNydW1iX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGJyZWFkY3J1bWJfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ZjZjllYWFjX3JlbmRlcixcbiAgYnJlYWRjcnVtYl9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfZmNmOWVhYWNfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBicmVhZGNydW1iX2l0ZW1fYXBpOyB9XG5icmVhZGNydW1iX2l0ZW1fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9icmVhZGNydW1iL3NyYy9icmVhZGNydW1iLWl0ZW0udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGJyZWFkY3J1bWJfaXRlbSA9IChicmVhZGNydW1iX2l0ZW1fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9icmVhZGNydW1iLWl0ZW0vaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuYnJlYWRjcnVtYl9pdGVtLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoYnJlYWRjcnVtYl9pdGVtLm5hbWUsIGJyZWFkY3J1bWJfaXRlbSk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19icmVhZGNydW1iX2l0ZW0gPSAoYnJlYWRjcnVtYl9pdGVtKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZm9ybS9zcmMvZm9ybS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9YTFiNWZmMzQmXG52YXIgZm9ybXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ExYjVmZjM0X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImZvcm1cIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1mb3JtXCIsXG4gICAgICBjbGFzczogW1xuICAgICAgICBfdm0ubGFiZWxQb3NpdGlvbiA/IFwiZWwtZm9ybS0tbGFiZWwtXCIgKyBfdm0ubGFiZWxQb3NpdGlvbiA6IFwiXCIsXG4gICAgICAgIHsgXCJlbC1mb3JtLS1pbmxpbmVcIjogX3ZtLmlubGluZSB9XG4gICAgICBdXG4gICAgfSxcbiAgICBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sXG4gICAgMlxuICApXG59XG52YXIgZm9ybXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2ExYjVmZjM0X3N0YXRpY1JlbmRlckZucyA9IFtdXG5mb3JtdnVlX3R5cGVfdGVtcGxhdGVfaWRfYTFiNWZmMzRfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9mb3JtL3NyYy9mb3JtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1hMWI1ZmYzNCZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZm9ybS9zcmMvZm9ybS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGZvcm12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxGb3JtJyxcblxuICBjb21wb25lbnROYW1lOiAnRWxGb3JtJyxcblxuICBwcm92aWRlOiBmdW5jdGlvbiBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlbEZvcm06IHRoaXNcbiAgICB9O1xuICB9LFxuXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbDogT2JqZWN0LFxuICAgIHJ1bGVzOiBPYmplY3QsXG4gICAgbGFiZWxQb3NpdGlvbjogU3RyaW5nLFxuICAgIGxhYmVsV2lkdGg6IFN0cmluZyxcbiAgICBsYWJlbFN1ZmZpeDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGlubGluZTogQm9vbGVhbixcbiAgICBpbmxpbmVNZXNzYWdlOiBCb29sZWFuLFxuICAgIHN0YXR1c0ljb246IEJvb2xlYW4sXG4gICAgc2hvd01lc3NhZ2U6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW4sXG4gICAgdmFsaWRhdGVPblJ1bGVDaGFuZ2U6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBoaWRlUmVxdWlyZWRBc3Rlcmlzazoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICB3YXRjaDoge1xuICAgIHJ1bGVzOiBmdW5jdGlvbiBydWxlcygpIHtcbiAgICAgIC8vIHJlbW92ZSB0aGVuIGFkZCBldmVudCBsaXN0ZW5lcnMgb24gZm9ybS1pdGVtIGFmdGVyIGZvcm0gcnVsZXMgY2hhbmdlXG4gICAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICBmaWVsZC5yZW1vdmVWYWxpZGF0ZUV2ZW50cygpO1xuICAgICAgICBmaWVsZC5hZGRWYWxpZGF0ZUV2ZW50cygpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLnZhbGlkYXRlT25SdWxlQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGUoZnVuY3Rpb24gKCkge30pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICBhdXRvTGFiZWxXaWR0aDogZnVuY3Rpb24gYXV0b0xhYmVsV2lkdGgoKSB7XG4gICAgICBpZiAoIXRoaXMucG90ZW50aWFsTGFiZWxXaWR0aEFyci5sZW5ndGgpIHJldHVybiAwO1xuICAgICAgdmFyIG1heCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIHRoaXMucG90ZW50aWFsTGFiZWxXaWR0aEFycik7XG4gICAgICByZXR1cm4gbWF4ID8gbWF4ICsgJ3B4JyA6ICcnO1xuICAgIH1cbiAgfSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiBbXSxcbiAgICAgIHBvdGVudGlhbExhYmVsV2lkdGhBcnI6IFtdIC8vIHVzZSB0aGlzIGFycmF5IHRvIGNhbGN1bGF0ZSBhdXRvIHdpZHRoXG4gICAgfTtcbiAgfSxcbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy4kb24oJ2VsLmZvcm0uYWRkRmllbGQnLCBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICBfdGhpcy5maWVsZHMucHVzaChmaWVsZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aGlzLiRvbignZWwuZm9ybS5yZW1vdmVGaWVsZCcsIGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgaWYgKGZpZWxkLnByb3ApIHtcbiAgICAgICAgX3RoaXMuZmllbGRzLnNwbGljZShfdGhpcy5maWVsZHMuaW5kZXhPZihmaWVsZCksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICByZXNldEZpZWxkczogZnVuY3Rpb24gcmVzZXRGaWVsZHMoKSB7XG4gICAgICBpZiAoIXRoaXMubW9kZWwpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbRWxlbWVudCBXYXJuXVtGb3JtXW1vZGVsIGlzIHJlcXVpcmVkIGZvciByZXNldEZpZWxkcyB0byB3b3JrLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICBmaWVsZC5yZXNldEZpZWxkKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNsZWFyVmFsaWRhdGU6IGZ1bmN0aW9uIGNsZWFyVmFsaWRhdGUoKSB7XG4gICAgICB2YXIgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuXG4gICAgICB2YXIgZmllbGRzID0gcHJvcHMubGVuZ3RoID8gdHlwZW9mIHByb3BzID09PSAnc3RyaW5nJyA/IHRoaXMuZmllbGRzLmZpbHRlcihmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHByb3BzID09PSBmaWVsZC5wcm9wO1xuICAgICAgfSkgOiB0aGlzLmZpZWxkcy5maWx0ZXIoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIHJldHVybiBwcm9wcy5pbmRleE9mKGZpZWxkLnByb3ApID4gLTE7XG4gICAgICB9KSA6IHRoaXMuZmllbGRzO1xuICAgICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIGZpZWxkLmNsZWFyVmFsaWRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW0VsZW1lbnQgV2Fybl1bRm9ybV1tb2RlbCBpcyByZXF1aXJlZCBmb3IgdmFsaWRhdGUgdG8gd29yayEnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvbWlzZSA9IHZvaWQgMDtcbiAgICAgIC8vIGlmIG5vIGNhbGxiYWNrLCByZXR1cm4gcHJvbWlzZVxuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJyAmJiB3aW5kb3cuUHJvbWlzZSkge1xuICAgICAgICBwcm9taXNlID0gbmV3IHdpbmRvdy5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKHZhbGlkLCBpbnZhbGlkRmllbGRzKSB7XG4gICAgICAgICAgICB2YWxpZCA/IHJlc29sdmUodmFsaWQpIDogcmVqZWN0KGludmFsaWRGaWVsZHMpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmFsaWQgPSB0cnVlO1xuICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgIC8vIOWmguaenOmcgOimgemqjOivgeeahGZpZWxkc+S4uuepuu+8jOiwg+eUqOmqjOivgeaXtueri+WIu+i/lOWbnmNhbGxiYWNrXG4gICAgICBpZiAodGhpcy5maWVsZHMubGVuZ3RoID09PSAwICYmIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKHRydWUpO1xuICAgICAgfVxuICAgICAgdmFyIGludmFsaWRGaWVsZHMgPSB7fTtcbiAgICAgIHRoaXMuZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIGZpZWxkLnZhbGlkYXRlKCcnLCBmdW5jdGlvbiAobWVzc2FnZSwgZmllbGQpIHtcbiAgICAgICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW52YWxpZEZpZWxkcyA9IG1lcmdlX2RlZmF1bHQoKSh7fSwgaW52YWxpZEZpZWxkcywgZmllbGQpO1xuICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgJiYgKytjb3VudCA9PT0gX3RoaXMyLmZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkLCBpbnZhbGlkRmllbGRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChwcm9taXNlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfVxuICAgIH0sXG4gICAgdmFsaWRhdGVGaWVsZDogZnVuY3Rpb24gdmFsaWRhdGVGaWVsZChwcm9wcywgY2IpIHtcbiAgICAgIHByb3BzID0gW10uY29uY2F0KHByb3BzKTtcbiAgICAgIHZhciBmaWVsZHMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIHJldHVybiBwcm9wcy5pbmRleE9mKGZpZWxkLnByb3ApICE9PSAtMTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFmaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW0VsZW1lbnQgV2Fybl1wbGVhc2UgcGFzcyBjb3JyZWN0IHByb3BzIScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICBmaWVsZC52YWxpZGF0ZSgnJywgY2IpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBnZXRMYWJlbFdpZHRoSW5kZXg6IGZ1bmN0aW9uIGdldExhYmVsV2lkdGhJbmRleCh3aWR0aCkge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5wb3RlbnRpYWxMYWJlbFdpZHRoQXJyLmluZGV4T2Yod2lkdGgpO1xuICAgICAgLy8gaXQncyBpbXBvc3NpYmxlXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignW0VsZW1lbnRGb3JtXXVucGVjdGVkIHdpZHRoICcsIHdpZHRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9LFxuICAgIHJlZ2lzdGVyTGFiZWxXaWR0aDogZnVuY3Rpb24gcmVnaXN0ZXJMYWJlbFdpZHRoKHZhbCwgb2xkVmFsKSB7XG4gICAgICBpZiAodmFsICYmIG9sZFZhbCkge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmdldExhYmVsV2lkdGhJbmRleChvbGRWYWwpO1xuICAgICAgICB0aGlzLnBvdGVudGlhbExhYmVsV2lkdGhBcnIuc3BsaWNlKGluZGV4LCAxLCB2YWwpO1xuICAgICAgfSBlbHNlIGlmICh2YWwpIHtcbiAgICAgICAgdGhpcy5wb3RlbnRpYWxMYWJlbFdpZHRoQXJyLnB1c2godmFsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRlcmVnaXN0ZXJMYWJlbFdpZHRoOiBmdW5jdGlvbiBkZXJlZ2lzdGVyTGFiZWxXaWR0aCh2YWwpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuZ2V0TGFiZWxXaWR0aEluZGV4KHZhbCk7XG4gICAgICB0aGlzLnBvdGVudGlhbExhYmVsV2lkdGhBcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9mb3JtL3NyYy9mb3JtLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfZm9ybXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChmb3JtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Zvcm0vc3JjL2Zvcm0udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgZm9ybV9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19mb3JtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBmb3JtdnVlX3R5cGVfdGVtcGxhdGVfaWRfYTFiNWZmMzRfcmVuZGVyLFxuICBmb3JtdnVlX3R5cGVfdGVtcGxhdGVfaWRfYTFiNWZmMzRfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBmb3JtX2FwaTsgfVxuZm9ybV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2Zvcm0vc3JjL2Zvcm0udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19mb3JtID0gKGZvcm1fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9mb3JtL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnNyY19mb3JtLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoc3JjX2Zvcm0ubmFtZSwgc3JjX2Zvcm0pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfZm9ybSA9IChzcmNfZm9ybSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Zvcm0vc3JjL2Zvcm0taXRlbS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9YjZmM2RiNmMmXG52YXIgZm9ybV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfYjZmM2RiNmNfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtZm9ybS1pdGVtXCIsXG4gICAgICBjbGFzczogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJlbC1mb3JtLWl0ZW0tLWZlZWRiYWNrXCI6IF92bS5lbEZvcm0gJiYgX3ZtLmVsRm9ybS5zdGF0dXNJY29uLFxuICAgICAgICAgIFwiaXMtZXJyb3JcIjogX3ZtLnZhbGlkYXRlU3RhdGUgPT09IFwiZXJyb3JcIixcbiAgICAgICAgICBcImlzLXZhbGlkYXRpbmdcIjogX3ZtLnZhbGlkYXRlU3RhdGUgPT09IFwidmFsaWRhdGluZ1wiLFxuICAgICAgICAgIFwiaXMtc3VjY2Vzc1wiOiBfdm0udmFsaWRhdGVTdGF0ZSA9PT0gXCJzdWNjZXNzXCIsXG4gICAgICAgICAgXCJpcy1yZXF1aXJlZFwiOiBfdm0uaXNSZXF1aXJlZCB8fCBfdm0ucmVxdWlyZWQsXG4gICAgICAgICAgXCJpcy1uby1hc3Rlcmlza1wiOiBfdm0uZWxGb3JtICYmIF92bS5lbEZvcm0uaGlkZVJlcXVpcmVkQXN0ZXJpc2tcbiAgICAgICAgfSxcbiAgICAgICAgX3ZtLnNpemVDbGFzcyA/IFwiZWwtZm9ybS1pdGVtLS1cIiArIF92bS5zaXplQ2xhc3MgOiBcIlwiXG4gICAgICBdXG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJsYWJlbC13cmFwXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgXCJpcy1hdXRvLXdpZHRoXCI6IF92bS5sYWJlbFN0eWxlICYmIF92bS5sYWJlbFN0eWxlLndpZHRoID09PSBcImF1dG9cIixcbiAgICAgICAgICAgIFwidXBkYXRlLWFsbFwiOiBfdm0uZm9ybS5sYWJlbFdpZHRoID09PSBcImF1dG9cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF92bS5sYWJlbCB8fCBfdm0uJHNsb3RzLmxhYmVsXG4gICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgIFwibGFiZWxcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1mb3JtLWl0ZW1fX2xhYmVsXCIsXG4gICAgICAgICAgICAgICAgICBzdHlsZTogX3ZtLmxhYmVsU3R5bGUsXG4gICAgICAgICAgICAgICAgICBhdHRyczogeyBmb3I6IF92bS5sYWJlbEZvciB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICBfdm0uX3QoXCJsYWJlbFwiLCBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLmxhYmVsICsgX3ZtLmZvcm0ubGFiZWxTdWZmaXgpKVxuICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICBdXG4gICAgICApLFxuICAgICAgX2MoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtZm9ybS1pdGVtX19jb250ZW50XCIsIHN0eWxlOiBfdm0uY29udGVudFN0eWxlIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfdm0uX3QoXCJkZWZhdWx0XCIpLFxuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJ0cmFuc2l0aW9uXCIsXG4gICAgICAgICAgICB7IGF0dHJzOiB7IG5hbWU6IFwiZWwtem9vbS1pbi10b3BcIiB9IH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF92bS52YWxpZGF0ZVN0YXRlID09PSBcImVycm9yXCIgJiZcbiAgICAgICAgICAgICAgX3ZtLnNob3dNZXNzYWdlICYmXG4gICAgICAgICAgICAgIF92bS5mb3JtLnNob3dNZXNzYWdlXG4gICAgICAgICAgICAgICAgPyBfdm0uX3QoXG4gICAgICAgICAgICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtZm9ybS1pdGVtX19lcnJvclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtZm9ybS1pdGVtX19lcnJvci0taW5saW5lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgX3ZtLmlubGluZU1lc3NhZ2UgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX3ZtLmlubGluZU1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoX3ZtLmVsRm9ybSAmJiBfdm0uZWxGb3JtLmlubGluZU1lc3NhZ2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICAgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fcyhfdm0udmFsaWRhdGVNZXNzYWdlKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgeyBlcnJvcjogX3ZtLnZhbGlkYXRlTWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIF0sXG4gICAgICAgIDJcbiAgICAgIClcbiAgICBdLFxuICAgIDFcbiAgKVxufVxudmFyIGZvcm1faXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2I2ZjNkYjZjX3N0YXRpY1JlbmRlckZucyA9IFtdXG5mb3JtX2l0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF9iNmYzZGI2Y19yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Zvcm0vc3JjL2Zvcm0taXRlbS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9YjZmM2RiNmMmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJhc3luYy12YWxpZGF0b3JcIlxudmFyIGV4dGVybmFsX2FzeW5jX3ZhbGlkYXRvcl8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQxKTtcbnZhciBleHRlcm5hbF9hc3luY192YWxpZGF0b3JfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZXh0ZXJuYWxfYXN5bmNfdmFsaWRhdG9yXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Zvcm0vc3JjL2xhYmVsLXdyYXAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGxhYmVsX3dyYXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBwcm9wczoge1xuICAgIGlzQXV0b1dpZHRoOiBCb29sZWFuLFxuICAgIHVwZGF0ZUFsbDogQm9vbGVhblxuICB9LFxuXG4gIGluamVjdDogWydlbEZvcm0nLCAnZWxGb3JtSXRlbSddLFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBoID0gYXJndW1lbnRzWzBdO1xuXG4gICAgdmFyIHNsb3RzID0gdGhpcy4kc2xvdHMuZGVmYXVsdDtcbiAgICBpZiAoIXNsb3RzKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5pc0F1dG9XaWR0aCkge1xuICAgICAgdmFyIGF1dG9MYWJlbFdpZHRoID0gdGhpcy5lbEZvcm0uYXV0b0xhYmVsV2lkdGg7XG4gICAgICB2YXIgc3R5bGUgPSB7fTtcbiAgICAgIGlmIChhdXRvTGFiZWxXaWR0aCAmJiBhdXRvTGFiZWxXaWR0aCAhPT0gJ2F1dG8nKSB7XG4gICAgICAgIHZhciBtYXJnaW5MZWZ0ID0gcGFyc2VJbnQoYXV0b0xhYmVsV2lkdGgsIDEwKSAtIHRoaXMuY29tcHV0ZWRXaWR0aDtcbiAgICAgICAgaWYgKG1hcmdpbkxlZnQpIHtcbiAgICAgICAgICBzdHlsZS5tYXJnaW5MZWZ0ID0gbWFyZ2luTGVmdCArICdweCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBoKFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyAnY2xhc3MnOiAnZWwtZm9ybS1pdGVtX19sYWJlbC13cmFwJywgc3R5bGU6IHN0eWxlIH0sXG4gICAgICAgIFtzbG90c11cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzbG90c1swXTtcbiAgICB9XG4gIH0sXG5cblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TGFiZWxXaWR0aDogZnVuY3Rpb24gZ2V0TGFiZWxXaWR0aCgpIHtcbiAgICAgIGlmICh0aGlzLiRlbCAmJiB0aGlzLiRlbC5maXJzdEVsZW1lbnRDaGlsZCkge1xuICAgICAgICB2YXIgY29tcHV0ZWRXaWR0aCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuJGVsLmZpcnN0RWxlbWVudENoaWxkKS53aWR0aDtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChwYXJzZUZsb2F0KGNvbXB1dGVkV2lkdGgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXBkYXRlTGFiZWxXaWR0aDogZnVuY3Rpb24gdXBkYXRlTGFiZWxXaWR0aCgpIHtcbiAgICAgIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICd1cGRhdGUnO1xuXG4gICAgICBpZiAodGhpcy4kc2xvdHMuZGVmYXVsdCAmJiB0aGlzLmlzQXV0b1dpZHRoICYmIHRoaXMuJGVsLmZpcnN0RWxlbWVudENoaWxkKSB7XG4gICAgICAgIGlmIChhY3Rpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICAgICAgdGhpcy5jb21wdXRlZFdpZHRoID0gdGhpcy5nZXRMYWJlbFdpZHRoKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAncmVtb3ZlJykge1xuICAgICAgICAgIHRoaXMuZWxGb3JtLmRlcmVnaXN0ZXJMYWJlbFdpZHRoKHRoaXMuY29tcHV0ZWRXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBjb21wdXRlZFdpZHRoOiBmdW5jdGlvbiBjb21wdXRlZFdpZHRoKHZhbCwgb2xkVmFsKSB7XG4gICAgICBpZiAodGhpcy51cGRhdGVBbGwpIHtcbiAgICAgICAgdGhpcy5lbEZvcm0ucmVnaXN0ZXJMYWJlbFdpZHRoKHZhbCwgb2xkVmFsKTtcbiAgICAgICAgdGhpcy5lbEZvcm1JdGVtLnVwZGF0ZUNvbXB1dGVkTGFiZWxXaWR0aCh2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb21wdXRlZFdpZHRoOiAwXG4gICAgfTtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZUxhYmVsV2lkdGgoJ3VwZGF0ZScpO1xuICB9LFxuICB1cGRhdGVkOiBmdW5jdGlvbiB1cGRhdGVkKCkge1xuICAgIHRoaXMudXBkYXRlTGFiZWxXaWR0aCgndXBkYXRlJyk7XG4gIH0sXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgdGhpcy51cGRhdGVMYWJlbFdpZHRoKCdyZW1vdmUnKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Zvcm0vc3JjL2xhYmVsLXdyYXAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19sYWJlbF93cmFwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGxhYmVsX3dyYXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZm9ybS9zcmMvbGFiZWwtd3JhcC52dWVcbnZhciBsYWJlbF93cmFwX3JlbmRlciwgbGFiZWxfd3JhcF9zdGF0aWNSZW5kZXJGbnNcblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgbGFiZWxfd3JhcF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19sYWJlbF93cmFwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBsYWJlbF93cmFwX3JlbmRlcixcbiAgbGFiZWxfd3JhcF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGxhYmVsX3dyYXBfYXBpOyB9XG5sYWJlbF93cmFwX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvZm9ybS9zcmMvbGFiZWwtd3JhcC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbGFiZWxfd3JhcCA9IChsYWJlbF93cmFwX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Zvcm0vc3JjL2Zvcm0taXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZm9ybV9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsRm9ybUl0ZW0nLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbEZvcm1JdGVtJyxcblxuICBtaXhpbnM6IFtlbWl0dGVyX2RlZmF1bHQuYV0sXG5cbiAgcHJvdmlkZTogZnVuY3Rpb24gcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxGb3JtSXRlbTogdGhpc1xuICAgIH07XG4gIH0sXG5cblxuICBpbmplY3Q6IFsnZWxGb3JtJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBsYWJlbDogU3RyaW5nLFxuICAgIGxhYmVsV2lkdGg6IFN0cmluZyxcbiAgICBwcm9wOiBTdHJpbmcsXG4gICAgcmVxdWlyZWQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIHJ1bGVzOiBbT2JqZWN0LCBBcnJheV0sXG4gICAgZXJyb3I6IFN0cmluZyxcbiAgICB2YWxpZGF0ZVN0YXR1czogU3RyaW5nLFxuICAgIGZvcjogU3RyaW5nLFxuICAgIGlubGluZU1lc3NhZ2U6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIEJvb2xlYW5dLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIHNob3dNZXNzYWdlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgc2l6ZTogU3RyaW5nXG4gIH0sXG4gIGNvbXBvbmVudHM6IHtcbiAgICAvLyB1c2UgdGhpcyBjb21wb25lbnQgdG8gY2FsY3VsYXRlIGF1dG8gd2lkdGhcbiAgICBMYWJlbFdyYXA6IGxhYmVsX3dyYXBcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBlcnJvcjoge1xuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcih2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlTWVzc2FnZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnZhbGlkYXRlU3RhdGUgPSB2YWx1ZSA/ICdlcnJvcicgOiAnJztcbiAgICAgIH1cbiAgICB9LFxuICAgIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyh2YWx1ZSkge1xuICAgICAgdGhpcy52YWxpZGF0ZVN0YXRlID0gdmFsdWU7XG4gICAgfSxcbiAgICBydWxlczogZnVuY3Rpb24gcnVsZXModmFsdWUpIHtcbiAgICAgIGlmICgoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgJiYgdGhpcy5yZXF1aXJlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY2xlYXJWYWxpZGF0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICBsYWJlbEZvcjogZnVuY3Rpb24gbGFiZWxGb3IoKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3IgfHwgdGhpcy5wcm9wO1xuICAgIH0sXG4gICAgbGFiZWxTdHlsZTogZnVuY3Rpb24gbGFiZWxTdHlsZSgpIHtcbiAgICAgIHZhciByZXQgPSB7fTtcbiAgICAgIGlmICh0aGlzLmZvcm0ubGFiZWxQb3NpdGlvbiA9PT0gJ3RvcCcpIHJldHVybiByZXQ7XG4gICAgICB2YXIgbGFiZWxXaWR0aCA9IHRoaXMubGFiZWxXaWR0aCB8fCB0aGlzLmZvcm0ubGFiZWxXaWR0aDtcbiAgICAgIGlmIChsYWJlbFdpZHRoKSB7XG4gICAgICAgIHJldC53aWR0aCA9IGxhYmVsV2lkdGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0sXG4gICAgY29udGVudFN0eWxlOiBmdW5jdGlvbiBjb250ZW50U3R5bGUoKSB7XG4gICAgICB2YXIgcmV0ID0ge307XG4gICAgICB2YXIgbGFiZWwgPSB0aGlzLmxhYmVsO1xuICAgICAgaWYgKHRoaXMuZm9ybS5sYWJlbFBvc2l0aW9uID09PSAndG9wJyB8fCB0aGlzLmZvcm0uaW5saW5lKSByZXR1cm4gcmV0O1xuICAgICAgaWYgKCFsYWJlbCAmJiAhdGhpcy5sYWJlbFdpZHRoICYmIHRoaXMuaXNOZXN0ZWQpIHJldHVybiByZXQ7XG4gICAgICB2YXIgbGFiZWxXaWR0aCA9IHRoaXMubGFiZWxXaWR0aCB8fCB0aGlzLmZvcm0ubGFiZWxXaWR0aDtcbiAgICAgIGlmIChsYWJlbFdpZHRoID09PSAnYXV0bycpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxXaWR0aCA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgcmV0Lm1hcmdpbkxlZnQgPSB0aGlzLmNvbXB1dGVkTGFiZWxXaWR0aDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm0ubGFiZWxXaWR0aCA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgcmV0Lm1hcmdpbkxlZnQgPSB0aGlzLmVsRm9ybS5hdXRvTGFiZWxXaWR0aDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0Lm1hcmdpbkxlZnQgPSBsYWJlbFdpZHRoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9LFxuICAgIGZvcm06IGZ1bmN0aW9uIGZvcm0oKSB7XG4gICAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuICAgICAgdmFyIHBhcmVudE5hbWUgPSBwYXJlbnQuJG9wdGlvbnMuY29tcG9uZW50TmFtZTtcbiAgICAgIHdoaWxlIChwYXJlbnROYW1lICE9PSAnRWxGb3JtJykge1xuICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ0VsRm9ybUl0ZW0nKSB7XG4gICAgICAgICAgdGhpcy5pc05lc3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG4gICAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnQuJG9wdGlvbnMuY29tcG9uZW50TmFtZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfSxcbiAgICBmaWVsZFZhbHVlOiBmdW5jdGlvbiBmaWVsZFZhbHVlKCkge1xuICAgICAgdmFyIG1vZGVsID0gdGhpcy5mb3JtLm1vZGVsO1xuICAgICAgaWYgKCFtb2RlbCB8fCAhdGhpcy5wcm9wKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhdGggPSB0aGlzLnByb3A7XG4gICAgICBpZiAocGF0aC5pbmRleE9mKCc6JykgIT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoLzovLCAnLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiZ2V0UHJvcEJ5UGF0aFwiXSkobW9kZWwsIHBhdGgsIHRydWUpLnY7XG4gICAgfSxcbiAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbiBpc1JlcXVpcmVkKCkge1xuICAgICAgdmFyIHJ1bGVzID0gdGhpcy5nZXRSdWxlcygpO1xuICAgICAgdmFyIGlzUmVxdWlyZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKHJ1bGVzICYmIHJ1bGVzLmxlbmd0aCkge1xuICAgICAgICBydWxlcy5ldmVyeShmdW5jdGlvbiAocnVsZSkge1xuICAgICAgICAgIGlmIChydWxlLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICBpc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzUmVxdWlyZWQ7XG4gICAgfSxcbiAgICBfZm9ybVNpemU6IGZ1bmN0aW9uIF9mb3JtU2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsRm9ybS5zaXplO1xuICAgIH0sXG4gICAgZWxGb3JtSXRlbVNpemU6IGZ1bmN0aW9uIGVsRm9ybUl0ZW1TaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSB8fCB0aGlzLl9mb3JtU2l6ZTtcbiAgICB9LFxuICAgIHNpemVDbGFzczogZnVuY3Rpb24gc2l6ZUNsYXNzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxGb3JtSXRlbVNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7XG4gICAgfVxuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWxpZGF0ZVN0YXRlOiAnJyxcbiAgICAgIHZhbGlkYXRlTWVzc2FnZTogJycsXG4gICAgICB2YWxpZGF0ZURpc2FibGVkOiBmYWxzZSxcbiAgICAgIHZhbGlkYXRvcjoge30sXG4gICAgICBpc05lc3RlZDogZmFsc2UsXG4gICAgICBjb21wdXRlZExhYmVsV2lkdGg6ICcnXG4gICAgfTtcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKHRyaWdnZXIpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdXRpbF9bXCJub29wXCJdO1xuXG4gICAgICB0aGlzLnZhbGlkYXRlRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHZhciBydWxlcyA9IHRoaXMuZ2V0RmlsdGVyZWRSdWxlKHRyaWdnZXIpO1xuICAgICAgaWYgKCghcnVsZXMgfHwgcnVsZXMubGVuZ3RoID09PSAwKSAmJiB0aGlzLnJlcXVpcmVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudmFsaWRhdGVTdGF0ZSA9ICd2YWxpZGF0aW5nJztcblxuICAgICAgdmFyIGRlc2NyaXB0b3IgPSB7fTtcbiAgICAgIGlmIChydWxlcyAmJiBydWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJ1bGVzLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgICBkZWxldGUgcnVsZS50cmlnZ2VyO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRlc2NyaXB0b3JbdGhpcy5wcm9wXSA9IHJ1bGVzO1xuXG4gICAgICB2YXIgdmFsaWRhdG9yID0gbmV3IGV4dGVybmFsX2FzeW5jX3ZhbGlkYXRvcl9kZWZhdWx0LmEoZGVzY3JpcHRvcik7XG4gICAgICB2YXIgbW9kZWwgPSB7fTtcblxuICAgICAgbW9kZWxbdGhpcy5wcm9wXSA9IHRoaXMuZmllbGRWYWx1ZTtcblxuICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKG1vZGVsLCB7IGZpcnN0RmllbGRzOiB0cnVlIH0sIGZ1bmN0aW9uIChlcnJvcnMsIGludmFsaWRGaWVsZHMpIHtcbiAgICAgICAgX3RoaXMudmFsaWRhdGVTdGF0ZSA9ICFlcnJvcnMgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xuICAgICAgICBfdGhpcy52YWxpZGF0ZU1lc3NhZ2UgPSBlcnJvcnMgPyBlcnJvcnNbMF0ubWVzc2FnZSA6ICcnO1xuXG4gICAgICAgIGNhbGxiYWNrKF90aGlzLnZhbGlkYXRlTWVzc2FnZSwgaW52YWxpZEZpZWxkcyk7XG4gICAgICAgIF90aGlzLmVsRm9ybSAmJiBfdGhpcy5lbEZvcm0uJGVtaXQoJ3ZhbGlkYXRlJywgX3RoaXMucHJvcCwgIWVycm9ycywgX3RoaXMudmFsaWRhdGVNZXNzYWdlIHx8IG51bGwpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBjbGVhclZhbGlkYXRlOiBmdW5jdGlvbiBjbGVhclZhbGlkYXRlKCkge1xuICAgICAgdGhpcy52YWxpZGF0ZVN0YXRlID0gJyc7XG4gICAgICB0aGlzLnZhbGlkYXRlTWVzc2FnZSA9ICcnO1xuICAgICAgdGhpcy52YWxpZGF0ZURpc2FibGVkID0gZmFsc2U7XG4gICAgfSxcbiAgICByZXNldEZpZWxkOiBmdW5jdGlvbiByZXNldEZpZWxkKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMudmFsaWRhdGVTdGF0ZSA9ICcnO1xuICAgICAgdGhpcy52YWxpZGF0ZU1lc3NhZ2UgPSAnJztcblxuICAgICAgdmFyIG1vZGVsID0gdGhpcy5mb3JtLm1vZGVsO1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5maWVsZFZhbHVlO1xuICAgICAgdmFyIHBhdGggPSB0aGlzLnByb3A7XG4gICAgICBpZiAocGF0aC5pbmRleE9mKCc6JykgIT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoLzovLCAnLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcCA9IE9iamVjdCh1dGlsX1tcImdldFByb3BCeVBhdGhcIl0pKG1vZGVsLCBwYXRoLCB0cnVlKTtcblxuICAgICAgdGhpcy52YWxpZGF0ZURpc2FibGVkID0gdHJ1ZTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBwcm9wLm9bcHJvcC5rXSA9IFtdLmNvbmNhdCh0aGlzLmluaXRpYWxWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wLm9bcHJvcC5rXSA9IHRoaXMuaW5pdGlhbFZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyByZXNldCB2YWxpZGF0ZURpc2FibGVkIGFmdGVyIG9uRmllbGRDaGFuZ2UgdHJpZ2dlcmVkXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi52YWxpZGF0ZURpc2FibGVkID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsVGltZVNlbGVjdCcsICdmaWVsZFJlc2V0JywgdGhpcy5pbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0UnVsZXM6IGZ1bmN0aW9uIGdldFJ1bGVzKCkge1xuICAgICAgdmFyIGZvcm1SdWxlcyA9IHRoaXMuZm9ybS5ydWxlcztcbiAgICAgIHZhciBzZWxmUnVsZXMgPSB0aGlzLnJ1bGVzO1xuICAgICAgdmFyIHJlcXVpcmVkUnVsZSA9IHRoaXMucmVxdWlyZWQgIT09IHVuZGVmaW5lZCA/IHsgcmVxdWlyZWQ6ICEhdGhpcy5yZXF1aXJlZCB9IDogW107XG5cbiAgICAgIHZhciBwcm9wID0gT2JqZWN0KHV0aWxfW1wiZ2V0UHJvcEJ5UGF0aFwiXSkoZm9ybVJ1bGVzLCB0aGlzLnByb3AgfHwgJycpO1xuICAgICAgZm9ybVJ1bGVzID0gZm9ybVJ1bGVzID8gcHJvcC5vW3RoaXMucHJvcCB8fCAnJ10gfHwgcHJvcC52IDogW107XG5cbiAgICAgIHJldHVybiBbXS5jb25jYXQoc2VsZlJ1bGVzIHx8IGZvcm1SdWxlcyB8fCBbXSkuY29uY2F0KHJlcXVpcmVkUnVsZSk7XG4gICAgfSxcbiAgICBnZXRGaWx0ZXJlZFJ1bGU6IGZ1bmN0aW9uIGdldEZpbHRlcmVkUnVsZSh0cmlnZ2VyKSB7XG4gICAgICB2YXIgcnVsZXMgPSB0aGlzLmdldFJ1bGVzKCk7XG5cbiAgICAgIHJldHVybiBydWxlcy5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgaWYgKCFydWxlLnRyaWdnZXIgfHwgdHJpZ2dlciA9PT0gJycpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShydWxlLnRyaWdnZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHJ1bGUudHJpZ2dlci5pbmRleE9mKHRyaWdnZXIpID4gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJ1bGUudHJpZ2dlciA9PT0gdHJpZ2dlcjtcbiAgICAgICAgfVxuICAgICAgfSkubWFwKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgIHJldHVybiBtZXJnZV9kZWZhdWx0KCkoe30sIHJ1bGUpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbkZpZWxkQmx1cjogZnVuY3Rpb24gb25GaWVsZEJsdXIoKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlKCdibHVyJyk7XG4gICAgfSxcbiAgICBvbkZpZWxkQ2hhbmdlOiBmdW5jdGlvbiBvbkZpZWxkQ2hhbmdlKCkge1xuICAgICAgaWYgKHRoaXMudmFsaWRhdGVEaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZhbGlkYXRlKCdjaGFuZ2UnKTtcbiAgICB9LFxuICAgIHVwZGF0ZUNvbXB1dGVkTGFiZWxXaWR0aDogZnVuY3Rpb24gdXBkYXRlQ29tcHV0ZWRMYWJlbFdpZHRoKHdpZHRoKSB7XG4gICAgICB0aGlzLmNvbXB1dGVkTGFiZWxXaWR0aCA9IHdpZHRoID8gd2lkdGggKyAncHgnIDogJyc7XG4gICAgfSxcbiAgICBhZGRWYWxpZGF0ZUV2ZW50czogZnVuY3Rpb24gYWRkVmFsaWRhdGVFdmVudHMoKSB7XG4gICAgICB2YXIgcnVsZXMgPSB0aGlzLmdldFJ1bGVzKCk7XG5cbiAgICAgIGlmIChydWxlcy5sZW5ndGggfHwgdGhpcy5yZXF1aXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuJG9uKCdlbC5mb3JtLmJsdXInLCB0aGlzLm9uRmllbGRCbHVyKTtcbiAgICAgICAgdGhpcy4kb24oJ2VsLmZvcm0uY2hhbmdlJywgdGhpcy5vbkZpZWxkQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZVZhbGlkYXRlRXZlbnRzOiBmdW5jdGlvbiByZW1vdmVWYWxpZGF0ZUV2ZW50cygpIHtcbiAgICAgIHRoaXMuJG9mZigpO1xuICAgIH1cbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICBpZiAodGhpcy5wcm9wKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoKCdFbEZvcm0nLCAnZWwuZm9ybS5hZGRGaWVsZCcsIFt0aGlzXSk7XG5cbiAgICAgIHZhciBpbml0aWFsVmFsdWUgPSB0aGlzLmZpZWxkVmFsdWU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0aWFsVmFsdWUpKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZSA9IFtdLmNvbmNhdChpbml0aWFsVmFsdWUpO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdpbml0aWFsVmFsdWUnLCB7XG4gICAgICAgIHZhbHVlOiBpbml0aWFsVmFsdWVcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFkZFZhbGlkYXRlRXZlbnRzKCk7XG4gICAgfVxuICB9LFxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIHRoaXMuZGlzcGF0Y2goJ0VsRm9ybScsICdlbC5mb3JtLnJlbW92ZUZpZWxkJywgW3RoaXNdKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Zvcm0vc3JjL2Zvcm0taXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2Zvcm1faXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChmb3JtX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZm9ybS9zcmMvZm9ybS1pdGVtLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGZvcm1faXRlbV9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19mb3JtX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGZvcm1faXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkX2I2ZjNkYjZjX3JlbmRlcixcbiAgZm9ybV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfYjZmM2RiNmNfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBmb3JtX2l0ZW1fYXBpOyB9XG5mb3JtX2l0ZW1fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9mb3JtL3NyYy9mb3JtLWl0ZW0udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGZvcm1faXRlbSA9IChmb3JtX2l0ZW1fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9mb3JtLWl0ZW0vaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZm9ybV9pdGVtLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoZm9ybV9pdGVtLm5hbWUsIGZvcm1faXRlbSk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19mb3JtX2l0ZW0gPSAoZm9ybV9pdGVtKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdGFicy9zcmMvdGFiLWJhci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MjAzMWYzM2EmXG52YXIgdGFiX2JhcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzIwMzFmMzNhX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcImRpdlwiLCB7XG4gICAgc3RhdGljQ2xhc3M6IFwiZWwtdGFic19fYWN0aXZlLWJhclwiLFxuICAgIGNsYXNzOiBcImlzLVwiICsgX3ZtLnJvb3RUYWJzLnRhYlBvc2l0aW9uLFxuICAgIHN0eWxlOiBfdm0uYmFyU3R5bGVcbiAgfSlcbn1cbnZhciB0YWJfYmFydnVlX3R5cGVfdGVtcGxhdGVfaWRfMjAzMWYzM2Ffc3RhdGljUmVuZGVyRm5zID0gW11cbnRhYl9iYXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yMDMxZjMzYV9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYnMvc3JjL3RhYi1iYXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTIwMzFmMzNhJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90YWJzL3NyYy90YWItYmFyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0YWJfYmFydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ1RhYkJhcicsXG5cbiAgcHJvcHM6IHtcbiAgICB0YWJzOiBBcnJheVxuICB9LFxuXG4gIGluamVjdDogWydyb290VGFicyddLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgYmFyU3R5bGU6IHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIHZhciBzdHlsZSA9IHt9O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIHRhYlNpemUgPSAwO1xuICAgICAgICB2YXIgc2l6ZU5hbWUgPSBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHRoaXMucm9vdFRhYnMudGFiUG9zaXRpb24pICE9PSAtMSA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICAgICAgdmFyIHNpemVEaXIgPSBzaXplTmFtZSA9PT0gJ3dpZHRoJyA/ICd4JyA6ICd5JztcbiAgICAgICAgdmFyIGZpcnN0VXBwZXJDYXNlID0gZnVuY3Rpb24gZmlyc3RVcHBlckNhc2Uoc3RyKSB7XG4gICAgICAgICAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyggfF4pW2Etel0vZywgZnVuY3Rpb24gKEwpIHtcbiAgICAgICAgICAgIHJldHVybiBMLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudGFicy5ldmVyeShmdW5jdGlvbiAodGFiLCBpbmRleCkge1xuICAgICAgICAgIHZhciAkZWwgPSBPYmplY3QodXRpbF9bXCJhcnJheUZpbmRcIl0pKF90aGlzLiRwYXJlbnQuJHJlZnMudGFicyB8fCBbXSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0LmlkLnJlcGxhY2UoJ3RhYi0nLCAnJykgPT09IHRhYi5wYW5lTmFtZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoISRlbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGFiLmFjdGl2ZSkge1xuICAgICAgICAgICAgb2Zmc2V0ICs9ICRlbFsnY2xpZW50JyArIGZpcnN0VXBwZXJDYXNlKHNpemVOYW1lKV07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFiU2l6ZSA9ICRlbFsnY2xpZW50JyArIGZpcnN0VXBwZXJDYXNlKHNpemVOYW1lKV07XG4gICAgICAgICAgICB2YXIgdGFiU3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoJGVsKTtcbiAgICAgICAgICAgIGlmIChzaXplTmFtZSA9PT0gJ3dpZHRoJyAmJiBfdGhpcy50YWJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgdGFiU2l6ZSAtPSBwYXJzZUZsb2F0KHRhYlN0eWxlcy5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KHRhYlN0eWxlcy5wYWRkaW5nUmlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNpemVOYW1lID09PSAnd2lkdGgnKSB7XG4gICAgICAgICAgICAgIG9mZnNldCArPSBwYXJzZUZsb2F0KHRhYlN0eWxlcy5wYWRkaW5nTGVmdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZScgKyBmaXJzdFVwcGVyQ2FzZShzaXplRGlyKSArICcoJyArIG9mZnNldCArICdweCknO1xuICAgICAgICBzdHlsZVtzaXplTmFtZV0gPSB0YWJTaXplICsgJ3B4JztcbiAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgICAgICBzdHlsZS5tc1RyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgICAgc3R5bGUud2Via2l0VHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJzL3NyYy90YWItYmFyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfdGFiX2JhcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh0YWJfYmFydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYnMvc3JjL3RhYi1iYXIudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgdGFiX2Jhcl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY190YWJfYmFydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICB0YWJfYmFydnVlX3R5cGVfdGVtcGxhdGVfaWRfMjAzMWYzM2FfcmVuZGVyLFxuICB0YWJfYmFydnVlX3R5cGVfdGVtcGxhdGVfaWRfMjAzMWYzM2Ffc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciB0YWJfYmFyX2FwaTsgfVxudGFiX2Jhcl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3RhYnMvc3JjL3RhYi1iYXIudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRhYl9iYXIgPSAodGFiX2Jhcl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90YWJzL3NyYy90YWItbmF2LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcblxuXG5cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG52YXIgdGFiX25hdnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2ZpcnN0VXBwZXJDYXNlID0gZnVuY3Rpb24gZmlyc3RVcHBlckNhc2Uoc3RyKSB7XG4gIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oIHxeKVthLXpdL2csIGZ1bmN0aW9uIChMKSB7XG4gICAgcmV0dXJuIEwudG9VcHBlckNhc2UoKTtcbiAgfSk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0YWJfbmF2dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ1RhYk5hdicsXG5cbiAgY29tcG9uZW50czoge1xuICAgIFRhYkJhcjogdGFiX2JhclxuICB9LFxuXG4gIGluamVjdDogWydyb290VGFicyddLFxuXG4gIHByb3BzOiB7XG4gICAgcGFuZXM6IEFycmF5LFxuICAgIGN1cnJlbnROYW1lOiBTdHJpbmcsXG4gICAgZWRpdGFibGU6IEJvb2xlYW4sXG4gICAgb25UYWJDbGljazoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBub29wXG4gICAgfSxcbiAgICBvblRhYlJlbW92ZToge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBub29wXG4gICAgfSxcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgc3RyZXRjaDogQm9vbGVhblxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbGFibGU6IGZhbHNlLFxuICAgICAgbmF2T2Zmc2V0OiAwLFxuICAgICAgaXNGb2N1czogZmFsc2UsXG4gICAgICBmb2N1c2FibGU6IHRydWVcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBuYXZTdHlsZTogZnVuY3Rpb24gbmF2U3R5bGUoKSB7XG4gICAgICB2YXIgZGlyID0gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZih0aGlzLnJvb3RUYWJzLnRhYlBvc2l0aW9uKSAhPT0gLTEgPyAnWCcgOiAnWSc7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUnICsgZGlyICsgJygtJyArIHRoaXMubmF2T2Zmc2V0ICsgJ3B4KSdcbiAgICAgIH07XG4gICAgfSxcbiAgICBzaXplTmFtZTogZnVuY3Rpb24gc2l6ZU5hbWUoKSB7XG4gICAgICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZih0aGlzLnJvb3RUYWJzLnRhYlBvc2l0aW9uKSAhPT0gLTEgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBzY3JvbGxQcmV2OiBmdW5jdGlvbiBzY3JvbGxQcmV2KCkge1xuICAgICAgdmFyIGNvbnRhaW5lclNpemUgPSB0aGlzLiRyZWZzLm5hdlNjcm9sbFsnb2Zmc2V0JyArIHRhYl9uYXZ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19maXJzdFVwcGVyQ2FzZSh0aGlzLnNpemVOYW1lKV07XG4gICAgICB2YXIgY3VycmVudE9mZnNldCA9IHRoaXMubmF2T2Zmc2V0O1xuXG4gICAgICBpZiAoIWN1cnJlbnRPZmZzZXQpIHJldHVybjtcblxuICAgICAgdmFyIG5ld09mZnNldCA9IGN1cnJlbnRPZmZzZXQgPiBjb250YWluZXJTaXplID8gY3VycmVudE9mZnNldCAtIGNvbnRhaW5lclNpemUgOiAwO1xuXG4gICAgICB0aGlzLm5hdk9mZnNldCA9IG5ld09mZnNldDtcbiAgICB9LFxuICAgIHNjcm9sbE5leHQ6IGZ1bmN0aW9uIHNjcm9sbE5leHQoKSB7XG4gICAgICB2YXIgbmF2U2l6ZSA9IHRoaXMuJHJlZnMubmF2WydvZmZzZXQnICsgdGFiX25hdnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2ZpcnN0VXBwZXJDYXNlKHRoaXMuc2l6ZU5hbWUpXTtcbiAgICAgIHZhciBjb250YWluZXJTaXplID0gdGhpcy4kcmVmcy5uYXZTY3JvbGxbJ29mZnNldCcgKyB0YWJfbmF2dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZmlyc3RVcHBlckNhc2UodGhpcy5zaXplTmFtZSldO1xuICAgICAgdmFyIGN1cnJlbnRPZmZzZXQgPSB0aGlzLm5hdk9mZnNldDtcblxuICAgICAgaWYgKG5hdlNpemUgLSBjdXJyZW50T2Zmc2V0IDw9IGNvbnRhaW5lclNpemUpIHJldHVybjtcblxuICAgICAgdmFyIG5ld09mZnNldCA9IG5hdlNpemUgLSBjdXJyZW50T2Zmc2V0ID4gY29udGFpbmVyU2l6ZSAqIDIgPyBjdXJyZW50T2Zmc2V0ICsgY29udGFpbmVyU2l6ZSA6IG5hdlNpemUgLSBjb250YWluZXJTaXplO1xuXG4gICAgICB0aGlzLm5hdk9mZnNldCA9IG5ld09mZnNldDtcbiAgICB9LFxuICAgIHNjcm9sbFRvQWN0aXZlVGFiOiBmdW5jdGlvbiBzY3JvbGxUb0FjdGl2ZVRhYigpIHtcbiAgICAgIGlmICghdGhpcy5zY3JvbGxhYmxlKSByZXR1cm47XG4gICAgICB2YXIgbmF2ID0gdGhpcy4kcmVmcy5uYXY7XG4gICAgICB2YXIgYWN0aXZlVGFiID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmlzLWFjdGl2ZScpO1xuICAgICAgaWYgKCFhY3RpdmVUYWIpIHJldHVybjtcbiAgICAgIHZhciBuYXZTY3JvbGwgPSB0aGlzLiRyZWZzLm5hdlNjcm9sbDtcbiAgICAgIHZhciBpc0hvcml6b250YWwgPSBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHRoaXMucm9vdFRhYnMudGFiUG9zaXRpb24pICE9PSAtMTtcbiAgICAgIHZhciBhY3RpdmVUYWJCb3VuZGluZyA9IGFjdGl2ZVRhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHZhciBuYXZTY3JvbGxCb3VuZGluZyA9IG5hdlNjcm9sbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHZhciBtYXhPZmZzZXQgPSBpc0hvcml6b250YWwgPyBuYXYub2Zmc2V0V2lkdGggLSBuYXZTY3JvbGxCb3VuZGluZy53aWR0aCA6IG5hdi5vZmZzZXRIZWlnaHQgLSBuYXZTY3JvbGxCb3VuZGluZy5oZWlnaHQ7XG4gICAgICB2YXIgY3VycmVudE9mZnNldCA9IHRoaXMubmF2T2Zmc2V0O1xuICAgICAgdmFyIG5ld09mZnNldCA9IGN1cnJlbnRPZmZzZXQ7XG5cbiAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgaWYgKGFjdGl2ZVRhYkJvdW5kaW5nLmxlZnQgPCBuYXZTY3JvbGxCb3VuZGluZy5sZWZ0KSB7XG4gICAgICAgICAgbmV3T2Zmc2V0ID0gY3VycmVudE9mZnNldCAtIChuYXZTY3JvbGxCb3VuZGluZy5sZWZ0IC0gYWN0aXZlVGFiQm91bmRpbmcubGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGl2ZVRhYkJvdW5kaW5nLnJpZ2h0ID4gbmF2U2Nyb2xsQm91bmRpbmcucmlnaHQpIHtcbiAgICAgICAgICBuZXdPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgYWN0aXZlVGFiQm91bmRpbmcucmlnaHQgLSBuYXZTY3JvbGxCb3VuZGluZy5yaWdodDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGFjdGl2ZVRhYkJvdW5kaW5nLnRvcCA8IG5hdlNjcm9sbEJvdW5kaW5nLnRvcCkge1xuICAgICAgICAgIG5ld09mZnNldCA9IGN1cnJlbnRPZmZzZXQgLSAobmF2U2Nyb2xsQm91bmRpbmcudG9wIC0gYWN0aXZlVGFiQm91bmRpbmcudG9wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aXZlVGFiQm91bmRpbmcuYm90dG9tID4gbmF2U2Nyb2xsQm91bmRpbmcuYm90dG9tKSB7XG4gICAgICAgICAgbmV3T2Zmc2V0ID0gY3VycmVudE9mZnNldCArIChhY3RpdmVUYWJCb3VuZGluZy5ib3R0b20gLSBuYXZTY3JvbGxCb3VuZGluZy5ib3R0b20pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuZXdPZmZzZXQgPSBNYXRoLm1heChuZXdPZmZzZXQsIDApO1xuICAgICAgdGhpcy5uYXZPZmZzZXQgPSBNYXRoLm1pbihuZXdPZmZzZXQsIG1heE9mZnNldCk7XG4gICAgfSxcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIGlmICghdGhpcy4kcmVmcy5uYXYpIHJldHVybjtcbiAgICAgIHZhciBzaXplTmFtZSA9IHRoaXMuc2l6ZU5hbWU7XG4gICAgICB2YXIgbmF2U2l6ZSA9IHRoaXMuJHJlZnMubmF2WydvZmZzZXQnICsgdGFiX25hdnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2ZpcnN0VXBwZXJDYXNlKHNpemVOYW1lKV07XG4gICAgICB2YXIgY29udGFpbmVyU2l6ZSA9IHRoaXMuJHJlZnMubmF2U2Nyb2xsWydvZmZzZXQnICsgdGFiX25hdnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2ZpcnN0VXBwZXJDYXNlKHNpemVOYW1lKV07XG4gICAgICB2YXIgY3VycmVudE9mZnNldCA9IHRoaXMubmF2T2Zmc2V0O1xuXG4gICAgICBpZiAoY29udGFpbmVyU2l6ZSA8IG5hdlNpemUpIHtcbiAgICAgICAgdmFyIF9jdXJyZW50T2Zmc2V0ID0gdGhpcy5uYXZPZmZzZXQ7XG4gICAgICAgIHRoaXMuc2Nyb2xsYWJsZSA9IHRoaXMuc2Nyb2xsYWJsZSB8fCB7fTtcbiAgICAgICAgdGhpcy5zY3JvbGxhYmxlLnByZXYgPSBfY3VycmVudE9mZnNldDtcbiAgICAgICAgdGhpcy5zY3JvbGxhYmxlLm5leHQgPSBfY3VycmVudE9mZnNldCArIGNvbnRhaW5lclNpemUgPCBuYXZTaXplO1xuICAgICAgICBpZiAobmF2U2l6ZSAtIF9jdXJyZW50T2Zmc2V0IDwgY29udGFpbmVyU2l6ZSkge1xuICAgICAgICAgIHRoaXMubmF2T2Zmc2V0ID0gbmF2U2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsYWJsZSA9IGZhbHNlO1xuICAgICAgICBpZiAoY3VycmVudE9mZnNldCA+IDApIHtcbiAgICAgICAgICB0aGlzLm5hdk9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNoYW5nZVRhYjogZnVuY3Rpb24gY2hhbmdlVGFiKGUpIHtcbiAgICAgIHZhciBrZXlDb2RlID0gZS5rZXlDb2RlO1xuICAgICAgdmFyIG5leHRJbmRleCA9IHZvaWQgMDtcbiAgICAgIHZhciBjdXJyZW50SW5kZXggPSB2b2lkIDAsXG4gICAgICAgICAgdGFiTGlzdCA9IHZvaWQgMDtcbiAgICAgIGlmIChbMzcsIDM4LCAzOSwgNDBdLmluZGV4T2Yoa2V5Q29kZSkgIT09IC0xKSB7XG4gICAgICAgIC8vIOW3puWPs+S4iuS4i+mUruabtOaNonRhYlxuICAgICAgICB0YWJMaXN0ID0gZS5jdXJyZW50VGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tyb2xlPXRhYl0nKTtcbiAgICAgICAgY3VycmVudEluZGV4ID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0YWJMaXN0LCBlLnRhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5Q29kZSA9PT0gMzcgfHwga2V5Q29kZSA9PT0gMzgpIHtcbiAgICAgICAgLy8gbGVmdFxuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gZmlyc3RcbiAgICAgICAgICBuZXh0SW5kZXggPSB0YWJMaXN0Lmxlbmd0aCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmlnaHRcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IHRhYkxpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIC8vIG5vdCBsYXN0XG4gICAgICAgICAgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0YWJMaXN0W25leHRJbmRleF0uZm9jdXMoKTsgLy8g5pS55Y+Y54Sm54K55YWD57SgXG4gICAgICB0YWJMaXN0W25leHRJbmRleF0uY2xpY2soKTsgLy8g6YCJ5Lit5LiL5LiA5LiqdGFiXG4gICAgICB0aGlzLnNldEZvY3VzKCk7XG4gICAgfSxcbiAgICBzZXRGb2N1czogZnVuY3Rpb24gc2V0Rm9jdXMoKSB7XG4gICAgICBpZiAodGhpcy5mb2N1c2FibGUpIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZUZvY3VzOiBmdW5jdGlvbiByZW1vdmVGb2N1cygpIHtcbiAgICAgIHRoaXMuaXNGb2N1cyA9IGZhbHNlO1xuICAgIH0sXG4gICAgdmlzaWJpbGl0eUNoYW5nZUhhbmRsZXI6IGZ1bmN0aW9uIHZpc2liaWxpdHlDaGFuZ2VIYW5kbGVyKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHZpc2liaWxpdHkgPSBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGU7XG4gICAgICBpZiAodmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgdGhpcy5mb2N1c2FibGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodmlzaWJpbGl0eSA9PT0gJ3Zpc2libGUnKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmZvY3VzYWJsZSA9IHRydWU7XG4gICAgICAgIH0sIDUwKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHdpbmRvd0JsdXJIYW5kbGVyOiBmdW5jdGlvbiB3aW5kb3dCbHVySGFuZGxlcigpIHtcbiAgICAgIHRoaXMuZm9jdXNhYmxlID0gZmFsc2U7XG4gICAgfSxcbiAgICB3aW5kb3dGb2N1c0hhbmRsZXI6IGZ1bmN0aW9uIHdpbmRvd0ZvY3VzSGFuZGxlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLmZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB9LCA1MCk7XG4gICAgfVxuICB9LFxuXG4gIHVwZGF0ZWQ6IGZ1bmN0aW9uIHVwZGF0ZWQoKSB7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIHR5cGUgPSB0aGlzLnR5cGUsXG4gICAgICAgIHBhbmVzID0gdGhpcy5wYW5lcyxcbiAgICAgICAgZWRpdGFibGUgPSB0aGlzLmVkaXRhYmxlLFxuICAgICAgICBzdHJldGNoID0gdGhpcy5zdHJldGNoLFxuICAgICAgICBvblRhYkNsaWNrID0gdGhpcy5vblRhYkNsaWNrLFxuICAgICAgICBvblRhYlJlbW92ZSA9IHRoaXMub25UYWJSZW1vdmUsXG4gICAgICAgIG5hdlN0eWxlID0gdGhpcy5uYXZTdHlsZSxcbiAgICAgICAgc2Nyb2xsYWJsZSA9IHRoaXMuc2Nyb2xsYWJsZSxcbiAgICAgICAgc2Nyb2xsTmV4dCA9IHRoaXMuc2Nyb2xsTmV4dCxcbiAgICAgICAgc2Nyb2xsUHJldiA9IHRoaXMuc2Nyb2xsUHJldixcbiAgICAgICAgY2hhbmdlVGFiID0gdGhpcy5jaGFuZ2VUYWIsXG4gICAgICAgIHNldEZvY3VzID0gdGhpcy5zZXRGb2N1cyxcbiAgICAgICAgcmVtb3ZlRm9jdXMgPSB0aGlzLnJlbW92ZUZvY3VzO1xuXG4gICAgdmFyIHNjcm9sbEJ0biA9IHNjcm9sbGFibGUgPyBbaChcbiAgICAgICdzcGFuJyxcbiAgICAgIHsgJ2NsYXNzJzogWydlbC10YWJzX19uYXYtcHJldicsIHNjcm9sbGFibGUucHJldiA/ICcnIDogJ2lzLWRpc2FibGVkJ10sIG9uOiB7XG4gICAgICAgICAgJ2NsaWNrJzogc2Nyb2xsUHJldlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2goJ2knLCB7ICdjbGFzcyc6ICdlbC1pY29uLWFycm93LWxlZnQnIH0pXVxuICAgICksIGgoXG4gICAgICAnc3BhbicsXG4gICAgICB7ICdjbGFzcyc6IFsnZWwtdGFic19fbmF2LW5leHQnLCBzY3JvbGxhYmxlLm5leHQgPyAnJyA6ICdpcy1kaXNhYmxlZCddLCBvbjoge1xuICAgICAgICAgICdjbGljayc6IHNjcm9sbE5leHRcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtoKCdpJywgeyAnY2xhc3MnOiAnZWwtaWNvbi1hcnJvdy1yaWdodCcgfSldXG4gICAgKV0gOiBudWxsO1xuXG4gICAgdmFyIHRhYnMgPSB0aGlzLl9sKHBhbmVzLCBmdW5jdGlvbiAocGFuZSwgaW5kZXgpIHtcbiAgICAgIHZhciBfcmVmO1xuXG4gICAgICB2YXIgdGFiTmFtZSA9IHBhbmUubmFtZSB8fCBwYW5lLmluZGV4IHx8IGluZGV4O1xuICAgICAgdmFyIGNsb3NhYmxlID0gcGFuZS5pc0Nsb3NhYmxlIHx8IGVkaXRhYmxlO1xuXG4gICAgICBwYW5lLmluZGV4ID0gJycgKyBpbmRleDtcblxuICAgICAgdmFyIGJ0bkNsb3NlID0gY2xvc2FibGUgPyBoKCdzcGFuJywgeyAnY2xhc3MnOiAnZWwtaWNvbi1jbG9zZScsIG9uOiB7XG4gICAgICAgICAgJ2NsaWNrJzogZnVuY3Rpb24gY2xpY2soZXYpIHtcbiAgICAgICAgICAgIG9uVGFiUmVtb3ZlKHBhbmUsIGV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pIDogbnVsbDtcblxuICAgICAgdmFyIHRhYkxhYmVsQ29udGVudCA9IHBhbmUuJHNsb3RzLmxhYmVsIHx8IHBhbmUubGFiZWw7XG4gICAgICB2YXIgdGFiaW5kZXggPSBwYW5lLmFjdGl2ZSA/IDAgOiAtMTtcbiAgICAgIHJldHVybiBoKFxuICAgICAgICAnZGl2JyxcbiAgICAgICAge1xuICAgICAgICAgICdjbGFzcyc6IChfcmVmID0ge1xuICAgICAgICAgICAgJ2VsLXRhYnNfX2l0ZW0nOiB0cnVlXG4gICAgICAgICAgfSwgX3JlZlsnaXMtJyArIF90aGlzMy5yb290VGFicy50YWJQb3NpdGlvbl0gPSB0cnVlLCBfcmVmWydpcy1hY3RpdmUnXSA9IHBhbmUuYWN0aXZlLCBfcmVmWydpcy1kaXNhYmxlZCddID0gcGFuZS5kaXNhYmxlZCwgX3JlZlsnaXMtY2xvc2FibGUnXSA9IGNsb3NhYmxlLCBfcmVmWydpcy1mb2N1cyddID0gX3RoaXMzLmlzRm9jdXMsIF9yZWYpLFxuICAgICAgICAgIGF0dHJzOiB7IGlkOiAndGFiLScgKyB0YWJOYW1lLFxuXG4gICAgICAgICAgICAnYXJpYS1jb250cm9scyc6ICdwYW5lLScgKyB0YWJOYW1lLFxuICAgICAgICAgICAgcm9sZTogJ3RhYicsXG4gICAgICAgICAgICAnYXJpYS1zZWxlY3RlZCc6IHBhbmUuYWN0aXZlLFxuXG4gICAgICAgICAgICB0YWJpbmRleDogdGFiaW5kZXhcbiAgICAgICAgICB9LFxuICAgICAgICAgIGtleTogJ3RhYi0nICsgdGFiTmFtZSwgcmVmOiAndGFicycsIHJlZkluRm9yOiB0cnVlLFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAnZm9jdXMnOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgICAgICAgICAgc2V0Rm9jdXMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnYmx1cic6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICAgICAgICAgIHJlbW92ZUZvY3VzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2NsaWNrJzogZnVuY3Rpb24gY2xpY2soZXYpIHtcbiAgICAgICAgICAgICAgcmVtb3ZlRm9jdXMoKTtvblRhYkNsaWNrKHBhbmUsIHRhYk5hbWUsIGV2KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAna2V5ZG93bic6IGZ1bmN0aW9uIGtleWRvd24oZXYpIHtcbiAgICAgICAgICAgICAgaWYgKGNsb3NhYmxlICYmIChldi5rZXlDb2RlID09PSA0NiB8fCBldi5rZXlDb2RlID09PSA4KSkge1xuICAgICAgICAgICAgICAgIG9uVGFiUmVtb3ZlKHBhbmUsIGV2KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW3RhYkxhYmVsQ29udGVudCwgYnRuQ2xvc2VdXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiBoKFxuICAgICAgJ2RpdicsXG4gICAgICB7ICdjbGFzcyc6IFsnZWwtdGFic19fbmF2LXdyYXAnLCBzY3JvbGxhYmxlID8gJ2lzLXNjcm9sbGFibGUnIDogJycsICdpcy0nICsgdGhpcy5yb290VGFicy50YWJQb3NpdGlvbl0gfSxcbiAgICAgIFtzY3JvbGxCdG4sIGgoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7ICdjbGFzcyc6IFsnZWwtdGFic19fbmF2LXNjcm9sbCddLCByZWY6ICduYXZTY3JvbGwnIH0sXG4gICAgICAgIFtoKFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgICdjbGFzcyc6IFsnZWwtdGFic19fbmF2JywgJ2lzLScgKyB0aGlzLnJvb3RUYWJzLnRhYlBvc2l0aW9uLCBzdHJldGNoICYmIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YodGhpcy5yb290VGFicy50YWJQb3NpdGlvbikgIT09IC0xID8gJ2lzLXN0cmV0Y2gnIDogJyddLFxuICAgICAgICAgICAgcmVmOiAnbmF2JyxcbiAgICAgICAgICAgIHN0eWxlOiBuYXZTdHlsZSxcbiAgICAgICAgICAgIGF0dHJzOiB7IHJvbGU6ICd0YWJsaXN0J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICdrZXlkb3duJzogY2hhbmdlVGFiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbIXR5cGUgPyBoKCd0YWItYmFyJywge1xuICAgICAgICAgICAgYXR0cnM6IHsgdGFiczogcGFuZXMgfVxuICAgICAgICAgIH0pIDogbnVsbCwgdGFic11cbiAgICAgICAgKV1cbiAgICAgICldXG4gICAgKTtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIE9iamVjdChyZXNpemVfZXZlbnRfW1wiYWRkUmVzaXplTGlzdGVuZXJcIl0pKHRoaXMuJGVsLCB0aGlzLnVwZGF0ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMudmlzaWJpbGl0eUNoYW5nZUhhbmRsZXIpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy53aW5kb3dCbHVySGFuZGxlcik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy53aW5kb3dGb2N1c0hhbmRsZXIpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXM0LnNjcm9sbFRvQWN0aXZlVGFiKCk7XG4gICAgfSwgMCk7XG4gIH0sXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuJGVsICYmIHRoaXMudXBkYXRlKSBPYmplY3QocmVzaXplX2V2ZW50X1tcInJlbW92ZVJlc2l6ZUxpc3RlbmVyXCJdKSh0aGlzLiRlbCwgdGhpcy51cGRhdGUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLnZpc2liaWxpdHlDaGFuZ2VIYW5kbGVyKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMud2luZG93Qmx1ckhhbmRsZXIpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMud2luZG93Rm9jdXNIYW5kbGVyKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYnMvc3JjL3RhYi1uYXYudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY190YWJfbmF2dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHRhYl9uYXZ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFicy9zcmMvdGFiLW5hdi52dWVcbnZhciB0YWJfbmF2X3JlbmRlciwgdGFiX25hdl9zdGF0aWNSZW5kZXJGbnNcblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgdGFiX25hdl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY190YWJfbmF2dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICB0YWJfbmF2X3JlbmRlcixcbiAgdGFiX25hdl9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHRhYl9uYXZfYXBpOyB9XG50YWJfbmF2X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvdGFicy9zcmMvdGFiLW5hdi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGFiX25hdiA9ICh0YWJfbmF2X2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RhYnMvc3JjL3RhYnMudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGFic3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFRhYnMnLFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBUYWJOYXY6IHRhYl9uYXZcbiAgfSxcblxuICBwcm9wczoge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgICBhY3RpdmVOYW1lOiBTdHJpbmcsXG4gICAgY2xvc2FibGU6IEJvb2xlYW4sXG4gICAgYWRkYWJsZTogQm9vbGVhbixcbiAgICB2YWx1ZToge30sXG4gICAgZWRpdGFibGU6IEJvb2xlYW4sXG4gICAgdGFiUG9zaXRpb246IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICd0b3AnXG4gICAgfSxcbiAgICBiZWZvcmVMZWF2ZTogRnVuY3Rpb24sXG4gICAgc3RyZXRjaDogQm9vbGVhblxuICB9LFxuXG4gIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvb3RUYWJzOiB0aGlzXG4gICAgfTtcbiAgfSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudE5hbWU6IHRoaXMudmFsdWUgfHwgdGhpcy5hY3RpdmVOYW1lLFxuICAgICAgcGFuZXM6IFtdXG4gICAgfTtcbiAgfSxcblxuXG4gIHdhdGNoOiB7XG4gICAgYWN0aXZlTmFtZTogZnVuY3Rpb24gYWN0aXZlTmFtZSh2YWx1ZSkge1xuICAgICAgdGhpcy5zZXRDdXJyZW50TmFtZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoX3ZhbHVlKSB7XG4gICAgICB0aGlzLnNldEN1cnJlbnROYW1lKF92YWx1ZSk7XG4gICAgfSxcbiAgICBjdXJyZW50TmFtZTogZnVuY3Rpb24gY3VycmVudE5hbWUodmFsdWUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLiRyZWZzLm5hdikge1xuICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMuJHJlZnMubmF2LiRuZXh0VGljayhmdW5jdGlvbiAoXykge1xuICAgICAgICAgICAgX3RoaXMuJHJlZnMubmF2LnNjcm9sbFRvQWN0aXZlVGFiKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgY2FsY1BhbmVJbnN0YW5jZXM6IGZ1bmN0aW9uIGNhbGNQYW5lSW5zdGFuY2VzKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBpc0ZvcmNlVXBkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuJHNsb3RzLmRlZmF1bHQpIHtcbiAgICAgICAgdmFyIHBhbmVTbG90cyA9IHRoaXMuJHNsb3RzLmRlZmF1bHQuZmlsdGVyKGZ1bmN0aW9uICh2bm9kZSkge1xuICAgICAgICAgIHJldHVybiB2bm9kZS50YWcgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucyAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zLkN0b3Iub3B0aW9ucy5uYW1lID09PSAnRWxUYWJQYW5lJztcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHVwZGF0ZSBpbmRlZWRcbiAgICAgICAgdmFyIHBhbmVzID0gcGFuZVNsb3RzLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IF9yZWYuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgICAgICAgcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHBhbmVzQ2hhbmdlZCA9ICEocGFuZXMubGVuZ3RoID09PSB0aGlzLnBhbmVzLmxlbmd0aCAmJiBwYW5lcy5ldmVyeShmdW5jdGlvbiAocGFuZSwgaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gcGFuZSA9PT0gX3RoaXMyLnBhbmVzW2luZGV4XTtcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAoaXNGb3JjZVVwZGF0ZSB8fCBwYW5lc0NoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLnBhbmVzID0gcGFuZXM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wYW5lcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhpcy5wYW5lcyA9IFtdO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlVGFiQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZVRhYkNsaWNrKHRhYiwgdGFiTmFtZSwgZXZlbnQpIHtcbiAgICAgIGlmICh0YWIuZGlzYWJsZWQpIHJldHVybjtcbiAgICAgIHRoaXMuc2V0Q3VycmVudE5hbWUodGFiTmFtZSk7XG4gICAgICB0aGlzLiRlbWl0KCd0YWItY2xpY2snLCB0YWIsIGV2ZW50KTtcbiAgICB9LFxuICAgIGhhbmRsZVRhYlJlbW92ZTogZnVuY3Rpb24gaGFuZGxlVGFiUmVtb3ZlKHBhbmUsIGV2KSB7XG4gICAgICBpZiAocGFuZS5kaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLiRlbWl0KCdlZGl0JywgcGFuZS5uYW1lLCAncmVtb3ZlJyk7XG4gICAgICB0aGlzLiRlbWl0KCd0YWItcmVtb3ZlJywgcGFuZS5uYW1lKTtcbiAgICB9LFxuICAgIGhhbmRsZVRhYkFkZDogZnVuY3Rpb24gaGFuZGxlVGFiQWRkKCkge1xuICAgICAgdGhpcy4kZW1pdCgnZWRpdCcsIG51bGwsICdhZGQnKTtcbiAgICAgIHRoaXMuJGVtaXQoJ3RhYi1hZGQnKTtcbiAgICB9LFxuICAgIHNldEN1cnJlbnROYW1lOiBmdW5jdGlvbiBzZXRDdXJyZW50TmFtZSh2YWx1ZSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBjaGFuZ2VDdXJyZW50TmFtZSA9IGZ1bmN0aW9uIGNoYW5nZUN1cnJlbnROYW1lKCkge1xuICAgICAgICBfdGhpczMuY3VycmVudE5hbWUgPSB2YWx1ZTtcbiAgICAgICAgX3RoaXMzLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTtcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5jdXJyZW50TmFtZSAhPT0gdmFsdWUgJiYgdGhpcy5iZWZvcmVMZWF2ZSkge1xuICAgICAgICB2YXIgYmVmb3JlID0gdGhpcy5iZWZvcmVMZWF2ZSh2YWx1ZSwgdGhpcy5jdXJyZW50TmFtZSk7XG4gICAgICAgIGlmIChiZWZvcmUgJiYgYmVmb3JlLnRoZW4pIHtcbiAgICAgICAgICBiZWZvcmUudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjaGFuZ2VDdXJyZW50TmFtZSgpO1xuICAgICAgICAgICAgX3RoaXMzLiRyZWZzLm5hdiAmJiBfdGhpczMuJHJlZnMubmF2LnJlbW92ZUZvY3VzKCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9wdWxsLzE0ODE2XG4gICAgICAgICAgICAvLyBpZ25vcmUgcHJvbWlzZSByZWplY3Rpb24gaW4gYGJlZm9yZS1sZWF2ZWAgaG9va1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGJlZm9yZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjaGFuZ2VDdXJyZW50TmFtZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFuZ2VDdXJyZW50TmFtZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgdmFyIF9yZWYyO1xuXG4gICAgdmFyIHR5cGUgPSB0aGlzLnR5cGUsXG4gICAgICAgIGhhbmRsZVRhYkNsaWNrID0gdGhpcy5oYW5kbGVUYWJDbGljayxcbiAgICAgICAgaGFuZGxlVGFiUmVtb3ZlID0gdGhpcy5oYW5kbGVUYWJSZW1vdmUsXG4gICAgICAgIGhhbmRsZVRhYkFkZCA9IHRoaXMuaGFuZGxlVGFiQWRkLFxuICAgICAgICBjdXJyZW50TmFtZSA9IHRoaXMuY3VycmVudE5hbWUsXG4gICAgICAgIHBhbmVzID0gdGhpcy5wYW5lcyxcbiAgICAgICAgZWRpdGFibGUgPSB0aGlzLmVkaXRhYmxlLFxuICAgICAgICBhZGRhYmxlID0gdGhpcy5hZGRhYmxlLFxuICAgICAgICB0YWJQb3NpdGlvbiA9IHRoaXMudGFiUG9zaXRpb24sXG4gICAgICAgIHN0cmV0Y2ggPSB0aGlzLnN0cmV0Y2g7XG5cblxuICAgIHZhciBuZXdCdXR0b24gPSBlZGl0YWJsZSB8fCBhZGRhYmxlID8gaChcbiAgICAgICdzcGFuJyxcbiAgICAgIHtcbiAgICAgICAgJ2NsYXNzJzogJ2VsLXRhYnNfX25ldy10YWInLFxuICAgICAgICBvbjoge1xuICAgICAgICAgICdjbGljayc6IGhhbmRsZVRhYkFkZCxcbiAgICAgICAgICAna2V5ZG93bic6IGZ1bmN0aW9uIGtleWRvd24oZXYpIHtcbiAgICAgICAgICAgIGlmIChldi5rZXlDb2RlID09PSAxMykge1xuICAgICAgICAgICAgICBoYW5kbGVUYWJBZGQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdGFiaW5kZXg6ICcwJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2goJ2knLCB7ICdjbGFzcyc6ICdlbC1pY29uLXBsdXMnIH0pXVxuICAgICkgOiBudWxsO1xuXG4gICAgdmFyIG5hdkRhdGEgPSB7XG4gICAgICBwcm9wczoge1xuICAgICAgICBjdXJyZW50TmFtZTogY3VycmVudE5hbWUsXG4gICAgICAgIG9uVGFiQ2xpY2s6IGhhbmRsZVRhYkNsaWNrLFxuICAgICAgICBvblRhYlJlbW92ZTogaGFuZGxlVGFiUmVtb3ZlLFxuICAgICAgICBlZGl0YWJsZTogZWRpdGFibGUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHBhbmVzOiBwYW5lcyxcbiAgICAgICAgc3RyZXRjaDogc3RyZXRjaFxuICAgICAgfSxcbiAgICAgIHJlZjogJ25hdidcbiAgICB9O1xuICAgIHZhciBoZWFkZXIgPSBoKFxuICAgICAgJ2RpdicsXG4gICAgICB7ICdjbGFzcyc6IFsnZWwtdGFic19faGVhZGVyJywgJ2lzLScgKyB0YWJQb3NpdGlvbl0gfSxcbiAgICAgIFtuZXdCdXR0b24sIGgoJ3RhYi1uYXYnLCBuYXZEYXRhKV1cbiAgICApO1xuICAgIHZhciBwYW5lbHMgPSBoKFxuICAgICAgJ2RpdicsXG4gICAgICB7ICdjbGFzcyc6ICdlbC10YWJzX19jb250ZW50JyB9LFxuICAgICAgW3RoaXMuJHNsb3RzLmRlZmF1bHRdXG4gICAgKTtcblxuICAgIHJldHVybiBoKFxuICAgICAgJ2RpdicsXG4gICAgICB7ICdjbGFzcyc6IChfcmVmMiA9IHtcbiAgICAgICAgICAnZWwtdGFicyc6IHRydWUsXG4gICAgICAgICAgJ2VsLXRhYnMtLWNhcmQnOiB0eXBlID09PSAnY2FyZCdcbiAgICAgICAgfSwgX3JlZjJbJ2VsLXRhYnMtLScgKyB0YWJQb3NpdGlvbl0gPSB0cnVlLCBfcmVmMlsnZWwtdGFicy0tYm9yZGVyLWNhcmQnXSA9IHR5cGUgPT09ICdib3JkZXItY2FyZCcsIF9yZWYyKSB9LFxuICAgICAgW3RhYlBvc2l0aW9uICE9PSAnYm90dG9tJyA/IFtoZWFkZXIsIHBhbmVsc10gOiBbcGFuZWxzLCBoZWFkZXJdXVxuICAgICk7XG4gIH0sXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnROYW1lKSB7XG4gICAgICB0aGlzLnNldEN1cnJlbnROYW1lKCcwJyk7XG4gICAgfVxuXG4gICAgdGhpcy4kb24oJ3RhYi1uYXYtdXBkYXRlJywgdGhpcy5jYWxjUGFuZUluc3RhbmNlcy5iaW5kKG51bGwsIHRydWUpKTtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB0aGlzLmNhbGNQYW5lSW5zdGFuY2VzKCk7XG4gIH0sXG4gIHVwZGF0ZWQ6IGZ1bmN0aW9uIHVwZGF0ZWQoKSB7XG4gICAgdGhpcy5jYWxjUGFuZUluc3RhbmNlcygpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFicy9zcmMvdGFicy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3RhYnN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAodGFic3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJzL3NyYy90YWJzLnZ1ZVxudmFyIHRhYnNfcmVuZGVyLCB0YWJzX3N0YXRpY1JlbmRlckZuc1xuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciB0YWJzX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX3RhYnN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHRhYnNfcmVuZGVyLFxuICB0YWJzX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgdGFic19hcGk7IH1cbnRhYnNfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy90YWJzL3NyYy90YWJzLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0YWJzID0gKHRhYnNfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJzL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnRhYnMuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudCh0YWJzLm5hbWUsIHRhYnMpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfdGFicyA9ICh0YWJzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdGFicy9zcmMvdGFiLXBhbmUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTkxNDVhMDcwJlxudmFyIHRhYl9wYW5ldnVlX3R5cGVfdGVtcGxhdGVfaWRfOTE0NWEwNzBfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuICFfdm0ubGF6eSB8fCBfdm0ubG9hZGVkIHx8IF92bS5hY3RpdmVcbiAgICA/IF9jKFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7XG4gICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgdmFsdWU6IF92bS5hY3RpdmUsXG4gICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiYWN0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRhYi1wYW5lXCIsXG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHJvbGU6IFwidGFicGFuZWxcIixcbiAgICAgICAgICAgIFwiYXJpYS1oaWRkZW5cIjogIV92bS5hY3RpdmUsXG4gICAgICAgICAgICBpZDogXCJwYW5lLVwiICsgX3ZtLnBhbmVOYW1lLFxuICAgICAgICAgICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogXCJ0YWItXCIgKyBfdm0ucGFuZU5hbWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAgICAgMlxuICAgICAgKVxuICAgIDogX3ZtLl9lKClcbn1cbnZhciB0YWJfcGFuZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzkxNDVhMDcwX3N0YXRpY1JlbmRlckZucyA9IFtdXG50YWJfcGFuZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzkxNDVhMDcwX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGFicy9zcmMvdGFiLXBhbmUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTkxNDVhMDcwJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90YWJzL3NyYy90YWItcGFuZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0YWJfcGFuZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFRhYlBhbmUnLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbFRhYlBhbmUnLFxuXG4gIHByb3BzOiB7XG4gICAgbGFiZWw6IFN0cmluZyxcbiAgICBsYWJlbENvbnRlbnQ6IEZ1bmN0aW9uLFxuICAgIG5hbWU6IFN0cmluZyxcbiAgICBjbG9zYWJsZTogQm9vbGVhbixcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBsYXp5OiBCb29sZWFuXG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5kZXg6IG51bGwsXG4gICAgICBsb2FkZWQ6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNDbG9zYWJsZTogZnVuY3Rpb24gaXNDbG9zYWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsb3NhYmxlIHx8IHRoaXMuJHBhcmVudC5jbG9zYWJsZTtcbiAgICB9LFxuICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuICAgICAgdmFyIGFjdGl2ZSA9IHRoaXMuJHBhcmVudC5jdXJyZW50TmFtZSA9PT0gKHRoaXMubmFtZSB8fCB0aGlzLmluZGV4KTtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjdGl2ZTtcbiAgICB9LFxuICAgIHBhbmVOYW1lOiBmdW5jdGlvbiBwYW5lTmFtZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hbWUgfHwgdGhpcy5pbmRleDtcbiAgICB9XG4gIH0sXG5cbiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCgpIHtcbiAgICB0aGlzLiRwYXJlbnQuJGVtaXQoJ3RhYi1uYXYtdXBkYXRlJyk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWJzL3NyYy90YWItcGFuZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3RhYl9wYW5ldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHRhYl9wYW5ldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhYnMvc3JjL3RhYi1wYW5lLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHRhYl9wYW5lX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX3RhYl9wYW5ldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICB0YWJfcGFuZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzkxNDVhMDcwX3JlbmRlcixcbiAgdGFiX3BhbmV2dWVfdHlwZV90ZW1wbGF0ZV9pZF85MTQ1YTA3MF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHRhYl9wYW5lX2FwaTsgfVxudGFiX3BhbmVfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy90YWJzL3NyYy90YWItcGFuZS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGFiX3BhbmUgPSAodGFiX3BhbmVfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWItcGFuZS9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG50YWJfcGFuZS5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHRhYl9wYW5lLm5hbWUsIHRhYl9wYW5lKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3RhYl9wYW5lID0gKHRhYl9wYW5lKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RhZy9zcmMvdGFnLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGFndnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsVGFnJyxcbiAgcHJvcHM6IHtcbiAgICB0ZXh0OiBTdHJpbmcsXG4gICAgY2xvc2FibGU6IEJvb2xlYW4sXG4gICAgdHlwZTogU3RyaW5nLFxuICAgIGhpdDogQm9vbGVhbixcbiAgICBkaXNhYmxlVHJhbnNpdGlvbnM6IEJvb2xlYW4sXG4gICAgY29sb3I6IFN0cmluZyxcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgZWZmZWN0OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnbGlnaHQnLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsKSB7XG4gICAgICAgIHJldHVybiBbJ2RhcmsnLCAnbGlnaHQnLCAncGxhaW4nXS5pbmRleE9mKHZhbCkgIT09IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUNsb3NlOiBmdW5jdGlvbiBoYW5kbGVDbG9zZShldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLiRlbWl0KCdjbG9zZScsIGV2ZW50KTtcbiAgICB9LFxuICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgICAgdGhpcy4kZW1pdCgnY2xpY2snLCBldmVudCk7XG4gICAgfVxuICB9LFxuICBjb21wdXRlZDoge1xuICAgIHRhZ1NpemU6IGZ1bmN0aW9uIHRhZ1NpemUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaXplIHx8ICh0aGlzLiRFTEVNRU5UIHx8IHt9KS5zaXplO1xuICAgIH1cbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIHZhciB0eXBlID0gdGhpcy50eXBlLFxuICAgICAgICB0YWdTaXplID0gdGhpcy50YWdTaXplLFxuICAgICAgICBoaXQgPSB0aGlzLmhpdCxcbiAgICAgICAgZWZmZWN0ID0gdGhpcy5lZmZlY3Q7XG5cbiAgICB2YXIgY2xhc3NlcyA9IFsnZWwtdGFnJywgdHlwZSA/ICdlbC10YWctLScgKyB0eXBlIDogJycsIHRhZ1NpemUgPyAnZWwtdGFnLS0nICsgdGFnU2l6ZSA6ICcnLCBlZmZlY3QgPyAnZWwtdGFnLS0nICsgZWZmZWN0IDogJycsIGhpdCAmJiAnaXMtaGl0J107XG4gICAgdmFyIHRhZ0VsID0gaChcbiAgICAgICdzcGFuJyxcbiAgICAgIHtcbiAgICAgICAgJ2NsYXNzJzogY2xhc3NlcyxcbiAgICAgICAgc3R5bGU6IHsgYmFja2dyb3VuZENvbG9yOiB0aGlzLmNvbG9yIH0sXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgJ2NsaWNrJzogdGhpcy5oYW5kbGVDbGlja1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW3RoaXMuJHNsb3RzLmRlZmF1bHQsIHRoaXMuY2xvc2FibGUgJiYgaCgnaScsIHsgJ2NsYXNzJzogJ2VsLXRhZ19fY2xvc2UgZWwtaWNvbi1jbG9zZScsIG9uOiB7XG4gICAgICAgICAgJ2NsaWNrJzogdGhpcy5oYW5kbGVDbG9zZVxuICAgICAgICB9XG4gICAgICB9KV1cbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVRyYW5zaXRpb25zID8gdGFnRWwgOiBoKFxuICAgICAgJ3RyYW5zaXRpb24nLFxuICAgICAge1xuICAgICAgICBhdHRyczogeyBuYW1lOiAnZWwtem9vbS1pbi1jZW50ZXInIH1cbiAgICAgIH0sXG4gICAgICBbdGFnRWxdXG4gICAgKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhZy9zcmMvdGFnLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfdGFndnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHRhZ3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWcvc3JjL3RhZy52dWVcbnZhciB0YWdfcmVuZGVyLCB0YWdfc3RhdGljUmVuZGVyRm5zXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHRhZ19jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY190YWd2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHRhZ19yZW5kZXIsXG4gIHRhZ19zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHRhZ19hcGk7IH1cbnRhZ19jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3RhZy9zcmMvdGFnLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfdGFnID0gKHRhZ19jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhZy9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zcmNfdGFnLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoc3JjX3RhZy5uYW1lLCBzcmNfdGFnKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3RhZyA9IChzcmNfdGFnKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdHJlZS9zcmMvdHJlZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NTQ3NTc1YTYmXG52YXIgdHJlZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU0NzU3NWE2X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRyZWVcIixcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIFwiZWwtdHJlZS0taGlnaGxpZ2h0LWN1cnJlbnRcIjogX3ZtLmhpZ2hsaWdodEN1cnJlbnQsXG4gICAgICAgIFwiaXMtZHJhZ2dpbmdcIjogISFfdm0uZHJhZ1N0YXRlLmRyYWdnaW5nTm9kZSxcbiAgICAgICAgXCJpcy1kcm9wLW5vdC1hbGxvd1wiOiAhX3ZtLmRyYWdTdGF0ZS5hbGxvd0Ryb3AsXG4gICAgICAgIFwiaXMtZHJvcC1pbm5lclwiOiBfdm0uZHJhZ1N0YXRlLmRyb3BUeXBlID09PSBcImlubmVyXCJcbiAgICAgIH0sXG4gICAgICBhdHRyczogeyByb2xlOiBcInRyZWVcIiB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfdm0uX2woX3ZtLnJvb3QuY2hpbGROb2RlcywgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIF9jKFwiZWwtdHJlZS1ub2RlXCIsIHtcbiAgICAgICAgICBrZXk6IF92bS5nZXROb2RlS2V5KGNoaWxkKSxcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgbm9kZTogY2hpbGQsXG4gICAgICAgICAgICBwcm9wczogX3ZtLnByb3BzLFxuICAgICAgICAgICAgXCJyZW5kZXItYWZ0ZXItZXhwYW5kXCI6IF92bS5yZW5kZXJBZnRlckV4cGFuZCxcbiAgICAgICAgICAgIFwic2hvdy1jaGVja2JveFwiOiBfdm0uc2hvd0NoZWNrYm94LFxuICAgICAgICAgICAgXCJyZW5kZXItY29udGVudFwiOiBfdm0ucmVuZGVyQ29udGVudFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb246IHsgXCJub2RlLWV4cGFuZFwiOiBfdm0uaGFuZGxlTm9kZUV4cGFuZCB9XG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIF92bS5pc0VtcHR5XG4gICAgICAgID8gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC10cmVlX19lbXB0eS1ibG9ja1wiIH0sIFtcbiAgICAgICAgICAgIF9jKFwic3BhblwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXRyZWVfX2VtcHR5LXRleHRcIiB9LCBbXG4gICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLmVtcHR5VGV4dCkpXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIF0pXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfYyhcImRpdlwiLCB7XG4gICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICB2YWx1ZTogX3ZtLmRyYWdTdGF0ZS5zaG93RHJvcEluZGljYXRvcixcbiAgICAgICAgICAgIGV4cHJlc3Npb246IFwiZHJhZ1N0YXRlLnNob3dEcm9wSW5kaWNhdG9yXCJcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHJlZjogXCJkcm9wSW5kaWNhdG9yXCIsXG4gICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRyZWVfX2Ryb3AtaW5kaWNhdG9yXCJcbiAgICAgIH0pXG4gICAgXSxcbiAgICAyXG4gIClcbn1cbnZhciB0cmVldnVlX3R5cGVfdGVtcGxhdGVfaWRfNTQ3NTc1YTZfc3RhdGljUmVuZGVyRm5zID0gW11cbnRyZWV2dWVfdHlwZV90ZW1wbGF0ZV9pZF81NDc1NzVhNl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyZWUvc3JjL3RyZWUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTU0NzU3NWE2JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyZWUvc3JjL21vZGVsL3V0aWwuanNcbnZhciBOT0RFX0tFWSA9ICckdHJlZU5vZGVJZCc7XG5cbnZhciBtYXJrTm9kZURhdGEgPSBmdW5jdGlvbiBtYXJrTm9kZURhdGEobm9kZSwgZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgZGF0YVtOT0RFX0tFWV0pIHJldHVybjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGEsIE5PREVfS0VZLCB7XG4gICAgdmFsdWU6IG5vZGUuaWQsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG59O1xuXG52YXIgdXRpbF9nZXROb2RlS2V5ID0gZnVuY3Rpb24gZ2V0Tm9kZUtleShrZXksIGRhdGEpIHtcbiAgaWYgKCFrZXkpIHJldHVybiBkYXRhW05PREVfS0VZXTtcbiAgcmV0dXJuIGRhdGFba2V5XTtcbn07XG5cbnZhciBmaW5kTmVhcmVzdENvbXBvbmVudCA9IGZ1bmN0aW9uIGZpbmROZWFyZXN0Q29tcG9uZW50KGVsZW1lbnQsIGNvbXBvbmVudE5hbWUpIHtcbiAgdmFyIHRhcmdldCA9IGVsZW1lbnQ7XG4gIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0LnRhZ05hbWUgIT09ICdCT0RZJykge1xuICAgIGlmICh0YXJnZXQuX192dWVfXyAmJiB0YXJnZXQuX192dWVfXy4kb3B0aW9ucy5uYW1lID09PSBjb21wb25lbnROYW1lKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0Ll9fdnVlX187XG4gICAgfVxuICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJlZS9zcmMvbW9kZWwvbm9kZS5qc1xudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gbm9kZV9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblxuXG5cblxudmFyIGdldENoaWxkU3RhdGUgPSBmdW5jdGlvbiBnZXRDaGlsZFN0YXRlKG5vZGUpIHtcbiAgdmFyIGFsbCA9IHRydWU7XG4gIHZhciBub25lID0gdHJ1ZTtcbiAgdmFyIGFsbFdpdGhvdXREaXNhYmxlID0gdHJ1ZTtcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBub2RlLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgIHZhciBuID0gbm9kZVtpXTtcbiAgICBpZiAobi5jaGVja2VkICE9PSB0cnVlIHx8IG4uaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgYWxsID0gZmFsc2U7XG4gICAgICBpZiAoIW4uZGlzYWJsZWQpIHtcbiAgICAgICAgYWxsV2l0aG91dERpc2FibGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG4uY2hlY2tlZCAhPT0gZmFsc2UgfHwgbi5pbmRldGVybWluYXRlKSB7XG4gICAgICBub25lID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWxsOiBhbGwsIG5vbmU6IG5vbmUsIGFsbFdpdGhvdXREaXNhYmxlOiBhbGxXaXRob3V0RGlzYWJsZSwgaGFsZjogIWFsbCAmJiAhbm9uZSB9O1xufTtcblxudmFyIHJlSW5pdENoZWNrZWQgPSBmdW5jdGlvbiByZUluaXRDaGVja2VkKG5vZGUpIHtcbiAgaWYgKG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT09IDAgfHwgbm9kZS5sb2FkaW5nKSByZXR1cm47XG5cbiAgdmFyIF9nZXRDaGlsZFN0YXRlID0gZ2V0Q2hpbGRTdGF0ZShub2RlLmNoaWxkTm9kZXMpLFxuICAgICAgYWxsID0gX2dldENoaWxkU3RhdGUuYWxsLFxuICAgICAgbm9uZSA9IF9nZXRDaGlsZFN0YXRlLm5vbmUsXG4gICAgICBoYWxmID0gX2dldENoaWxkU3RhdGUuaGFsZjtcblxuICBpZiAoYWxsKSB7XG4gICAgbm9kZS5jaGVja2VkID0gdHJ1ZTtcbiAgICBub2RlLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgfSBlbHNlIGlmIChoYWxmKSB7XG4gICAgbm9kZS5jaGVja2VkID0gZmFsc2U7XG4gICAgbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChub25lKSB7XG4gICAgbm9kZS5jaGVja2VkID0gZmFsc2U7XG4gICAgbm9kZS5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gIH1cblxuICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG4gIGlmICghcGFyZW50IHx8IHBhcmVudC5sZXZlbCA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmICghbm9kZS5zdG9yZS5jaGVja1N0cmljdGx5KSB7XG4gICAgcmVJbml0Q2hlY2tlZChwYXJlbnQpO1xuICB9XG59O1xuXG52YXIgZ2V0UHJvcGVydHlGcm9tRGF0YSA9IGZ1bmN0aW9uIGdldFByb3BlcnR5RnJvbURhdGEobm9kZSwgcHJvcCkge1xuICB2YXIgcHJvcHMgPSBub2RlLnN0b3JlLnByb3BzO1xuICB2YXIgZGF0YSA9IG5vZGUuZGF0YSB8fCB7fTtcbiAgdmFyIGNvbmZpZyA9IHByb3BzW3Byb3BdO1xuXG4gIGlmICh0eXBlb2YgY29uZmlnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGNvbmZpZyhkYXRhLCBub2RlKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkYXRhW2NvbmZpZ107XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgZGF0YVByb3AgPSBkYXRhW3Byb3BdO1xuICAgIHJldHVybiBkYXRhUHJvcCA9PT0gdW5kZWZpbmVkID8gJycgOiBkYXRhUHJvcDtcbiAgfVxufTtcblxudmFyIG5vZGVJZFNlZWQgPSAwO1xuXG52YXIgbm9kZV9Ob2RlID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBOb2RlKG9wdGlvbnMpIHtcbiAgICBub2RlX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGUpO1xuXG4gICAgdGhpcy5pZCA9IG5vZGVJZFNlZWQrKztcbiAgICB0aGlzLnRleHQgPSBudWxsO1xuICAgIHRoaXMuY2hlY2tlZCA9IGZhbHNlO1xuICAgIHRoaXMuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgdGhpcy5leHBhbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMuaXNDdXJyZW50ID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHRoaXNbbmFtZV0gPSBvcHRpb25zW25hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGludGVybmFsXG4gICAgdGhpcy5sZXZlbCA9IDA7XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNoaWxkTm9kZXMgPSBbXTtcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5sZXZlbCA9IHRoaXMucGFyZW50LmxldmVsICsgMTtcbiAgICB9XG5cbiAgICB2YXIgc3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgIGlmICghc3RvcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW05vZGVdc3RvcmUgaXMgcmVxdWlyZWQhJyk7XG4gICAgfVxuICAgIHN0b3JlLnJlZ2lzdGVyTm9kZSh0aGlzKTtcblxuICAgIHZhciBwcm9wcyA9IHN0b3JlLnByb3BzO1xuICAgIGlmIChwcm9wcyAmJiB0eXBlb2YgcHJvcHMuaXNMZWFmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIGlzTGVhZiA9IGdldFByb3BlcnR5RnJvbURhdGEodGhpcywgJ2lzTGVhZicpO1xuICAgICAgaWYgKHR5cGVvZiBpc0xlYWYgPT09ICdib29sZWFuJykge1xuICAgICAgICB0aGlzLmlzTGVhZkJ5VXNlciA9IGlzTGVhZjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RvcmUubGF6eSAhPT0gdHJ1ZSAmJiB0aGlzLmRhdGEpIHtcbiAgICAgIHRoaXMuc2V0RGF0YSh0aGlzLmRhdGEpO1xuXG4gICAgICBpZiAoc3RvcmUuZGVmYXVsdEV4cGFuZEFsbCkge1xuICAgICAgICB0aGlzLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMubGV2ZWwgPiAwICYmIHN0b3JlLmxhenkgJiYgc3RvcmUuZGVmYXVsdEV4cGFuZEFsbCkge1xuICAgICAgdGhpcy5leHBhbmQoKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuZGF0YSkpIHtcbiAgICAgIG1hcmtOb2RlRGF0YSh0aGlzLCB0aGlzLmRhdGEpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuO1xuICAgIHZhciBkZWZhdWx0RXhwYW5kZWRLZXlzID0gc3RvcmUuZGVmYXVsdEV4cGFuZGVkS2V5cztcbiAgICB2YXIga2V5ID0gc3RvcmUua2V5O1xuICAgIGlmIChrZXkgJiYgZGVmYXVsdEV4cGFuZGVkS2V5cyAmJiBkZWZhdWx0RXhwYW5kZWRLZXlzLmluZGV4T2YodGhpcy5rZXkpICE9PSAtMSkge1xuICAgICAgdGhpcy5leHBhbmQobnVsbCwgc3RvcmUuYXV0b0V4cGFuZFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGtleSAmJiBzdG9yZS5jdXJyZW50Tm9kZUtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMua2V5ID09PSBzdG9yZS5jdXJyZW50Tm9kZUtleSkge1xuICAgICAgc3RvcmUuY3VycmVudE5vZGUgPSB0aGlzO1xuICAgICAgc3RvcmUuY3VycmVudE5vZGUuaXNDdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmUubGF6eSkge1xuICAgICAgc3RvcmUuX2luaXREZWZhdWx0Q2hlY2tlZE5vZGUodGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVMZWFmU3RhdGUoKTtcbiAgfVxuXG4gIE5vZGUucHJvdG90eXBlLnNldERhdGEgPSBmdW5jdGlvbiBzZXREYXRhKGRhdGEpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIG1hcmtOb2RlRGF0YSh0aGlzLCBkYXRhKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuY2hpbGROb2RlcyA9IFtdO1xuXG4gICAgdmFyIGNoaWxkcmVuID0gdm9pZCAwO1xuICAgIGlmICh0aGlzLmxldmVsID09PSAwICYmIHRoaXMuZGF0YSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW4gPSBnZXRQcm9wZXJ0eUZyb21EYXRhKHRoaXMsICdjaGlsZHJlbicpIHx8IFtdO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwLCBqID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICB0aGlzLmluc2VydENoaWxkKHsgZGF0YTogY2hpbGRyZW5baV0gfSk7XG4gICAgfVxuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnModGFyZ2V0KSB7XG4gICAgdmFyIGRlZXAgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG5cbiAgICB2YXIgd2FsayA9IGZ1bmN0aW9uIHdhbGsocGFyZW50KSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcyB8fCBbXTtcbiAgICAgIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoY2hpbGQgPT09IHRhcmdldCB8fCBkZWVwICYmIHdhbGsoY2hpbGQpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHdhbGsodGhpcyk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgfVxuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmluc2VydENoaWxkID0gZnVuY3Rpb24gaW5zZXJ0Q2hpbGQoY2hpbGQsIGluZGV4LCBiYXRjaCkge1xuICAgIGlmICghY2hpbGQpIHRocm93IG5ldyBFcnJvcignaW5zZXJ0Q2hpbGQgZXJyb3I6IGNoaWxkIGlzIHJlcXVpcmVkLicpO1xuXG4gICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBOb2RlKSkge1xuICAgICAgaWYgKCFiYXRjaCkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKHRydWUpIHx8IFtdO1xuICAgICAgICBpZiAoY2hpbGRyZW4uaW5kZXhPZihjaGlsZC5kYXRhKSA9PT0gLTEpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGluZGV4ID09PSAndW5kZWZpbmVkJyB8fCBpbmRleCA8IDApIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQuZGF0YSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShpbmRleCwgMCwgY2hpbGQuZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtZXJnZV9kZWZhdWx0KCkoY2hpbGQsIHtcbiAgICAgICAgcGFyZW50OiB0aGlzLFxuICAgICAgICBzdG9yZTogdGhpcy5zdG9yZVxuICAgICAgfSk7XG4gICAgICBjaGlsZCA9IG5ldyBOb2RlKGNoaWxkKTtcbiAgICB9XG5cbiAgICBjaGlsZC5sZXZlbCA9IHRoaXMubGV2ZWwgKyAxO1xuXG4gICAgaWYgKHR5cGVvZiBpbmRleCA9PT0gJ3VuZGVmaW5lZCcgfHwgaW5kZXggPCAwKSB7XG4gICAgICB0aGlzLmNoaWxkTm9kZXMucHVzaChjaGlsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hpbGROb2Rlcy5zcGxpY2UoaW5kZXgsIDAsIGNoaWxkKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUxlYWZTdGF0ZSgpO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uIGluc2VydEJlZm9yZShjaGlsZCwgcmVmKSB7XG4gICAgdmFyIGluZGV4ID0gdm9pZCAwO1xuICAgIGlmIChyZWYpIHtcbiAgICAgIGluZGV4ID0gdGhpcy5jaGlsZE5vZGVzLmluZGV4T2YocmVmKTtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnRDaGlsZChjaGlsZCwgaW5kZXgpO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmluc2VydEFmdGVyID0gZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIoY2hpbGQsIHJlZikge1xuICAgIHZhciBpbmRleCA9IHZvaWQgMDtcbiAgICBpZiAocmVmKSB7XG4gICAgICBpbmRleCA9IHRoaXMuY2hpbGROb2Rlcy5pbmRleE9mKHJlZik7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSBpbmRleCArPSAxO1xuICAgIH1cbiAgICB0aGlzLmluc2VydENoaWxkKGNoaWxkLCBpbmRleCk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiByZW1vdmVDaGlsZChjaGlsZCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oKSB8fCBbXTtcbiAgICB2YXIgZGF0YUluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihjaGlsZC5kYXRhKTtcbiAgICBpZiAoZGF0YUluZGV4ID4gLTEpIHtcbiAgICAgIGNoaWxkcmVuLnNwbGljZShkYXRhSW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IHRoaXMuY2hpbGROb2Rlcy5pbmRleE9mKGNoaWxkKTtcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLnN0b3JlICYmIHRoaXMuc3RvcmUuZGVyZWdpc3Rlck5vZGUoY2hpbGQpO1xuICAgICAgY2hpbGQucGFyZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuY2hpbGROb2Rlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlTGVhZlN0YXRlKCk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGRCeURhdGEgPSBmdW5jdGlvbiByZW1vdmVDaGlsZEJ5RGF0YShkYXRhKSB7XG4gICAgdmFyIHRhcmdldE5vZGUgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkTm9kZXNbaV0uZGF0YSA9PT0gZGF0YSkge1xuICAgICAgICB0YXJnZXROb2RlID0gdGhpcy5jaGlsZE5vZGVzW2ldO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0Tm9kZSkge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0YXJnZXROb2RlKTtcbiAgICB9XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuZXhwYW5kID0gZnVuY3Rpb24gZXhwYW5kKGNhbGxiYWNrLCBleHBhbmRQYXJlbnQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGRvbmUgPSBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgaWYgKGV4cGFuZFBhcmVudCkge1xuICAgICAgICB2YXIgcGFyZW50ID0gX3RoaXMucGFyZW50O1xuICAgICAgICB3aGlsZSAocGFyZW50LmxldmVsID4gMCkge1xuICAgICAgICAgIHBhcmVudC5leHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX3RoaXMuZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5zaG91bGRMb2FkRGF0YSgpKSB7XG4gICAgICB0aGlzLmxvYWREYXRhKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBpZiAoX3RoaXMuY2hlY2tlZCkge1xuICAgICAgICAgICAgX3RoaXMuc2V0Q2hlY2tlZCh0cnVlLCB0cnVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFfdGhpcy5zdG9yZS5jaGVja1N0cmljdGx5KSB7XG4gICAgICAgICAgICByZUluaXRDaGVja2VkKF90aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5kb0NyZWF0ZUNoaWxkcmVuID0gZnVuY3Rpb24gZG9DcmVhdGVDaGlsZHJlbihhcnJheSkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBfdGhpczIuaW5zZXJ0Q2hpbGQobWVyZ2VfZGVmYXVsdCgpKHsgZGF0YTogaXRlbSB9LCBkZWZhdWx0UHJvcHMpLCB1bmRlZmluZWQsIHRydWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmNvbGxhcHNlID0gZnVuY3Rpb24gY29sbGFwc2UoKSB7XG4gICAgdGhpcy5leHBhbmRlZCA9IGZhbHNlO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLnNob3VsZExvYWREYXRhID0gZnVuY3Rpb24gc2hvdWxkTG9hZERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUubGF6eSA9PT0gdHJ1ZSAmJiB0aGlzLnN0b3JlLmxvYWQgJiYgIXRoaXMubG9hZGVkO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLnVwZGF0ZUxlYWZTdGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZUxlYWZTdGF0ZSgpIHtcbiAgICBpZiAodGhpcy5zdG9yZS5sYXp5ID09PSB0cnVlICYmIHRoaXMubG9hZGVkICE9PSB0cnVlICYmIHR5cGVvZiB0aGlzLmlzTGVhZkJ5VXNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuaXNMZWFmID0gdGhpcy5pc0xlYWZCeVVzZXI7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjaGlsZE5vZGVzID0gdGhpcy5jaGlsZE5vZGVzO1xuICAgIGlmICghdGhpcy5zdG9yZS5sYXp5IHx8IHRoaXMuc3RvcmUubGF6eSA9PT0gdHJ1ZSAmJiB0aGlzLmxvYWRlZCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5pc0xlYWYgPSAhY2hpbGROb2RlcyB8fCBjaGlsZE5vZGVzLmxlbmd0aCA9PT0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0xlYWYgPSBmYWxzZTtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5zZXRDaGVja2VkID0gZnVuY3Rpb24gc2V0Q2hlY2tlZCh2YWx1ZSwgZGVlcCwgcmVjdXJzaW9uLCBwYXNzVmFsdWUpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHRoaXMuaW5kZXRlcm1pbmF0ZSA9IHZhbHVlID09PSAnaGFsZic7XG4gICAgdGhpcy5jaGVja2VkID0gdmFsdWUgPT09IHRydWU7XG5cbiAgICBpZiAodGhpcy5zdG9yZS5jaGVja1N0cmljdGx5KSByZXR1cm47XG5cbiAgICBpZiAoISh0aGlzLnNob3VsZExvYWREYXRhKCkgJiYgIXRoaXMuc3RvcmUuY2hlY2tEZXNjZW5kYW50cykpIHtcbiAgICAgIHZhciBfZ2V0Q2hpbGRTdGF0ZTIgPSBnZXRDaGlsZFN0YXRlKHRoaXMuY2hpbGROb2RlcyksXG4gICAgICAgICAgYWxsID0gX2dldENoaWxkU3RhdGUyLmFsbCxcbiAgICAgICAgICBhbGxXaXRob3V0RGlzYWJsZSA9IF9nZXRDaGlsZFN0YXRlMi5hbGxXaXRob3V0RGlzYWJsZTtcblxuICAgICAgaWYgKCF0aGlzLmlzTGVhZiAmJiAhYWxsICYmIGFsbFdpdGhvdXREaXNhYmxlKSB7XG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGFuZGxlRGVzY2VuZGFudHMgPSBmdW5jdGlvbiBoYW5kbGVEZXNjZW5kYW50cygpIHtcbiAgICAgICAgaWYgKGRlZXApIHtcbiAgICAgICAgICB2YXIgY2hpbGROb2RlcyA9IF90aGlzMy5jaGlsZE5vZGVzO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XG4gICAgICAgICAgICBwYXNzVmFsdWUgPSBwYXNzVmFsdWUgfHwgdmFsdWUgIT09IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGlzQ2hlY2sgPSBjaGlsZC5kaXNhYmxlZCA/IGNoaWxkLmNoZWNrZWQgOiBwYXNzVmFsdWU7XG4gICAgICAgICAgICBjaGlsZC5zZXRDaGVja2VkKGlzQ2hlY2ssIGRlZXAsIHRydWUsIHBhc3NWYWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9nZXRDaGlsZFN0YXRlMyA9IGdldENoaWxkU3RhdGUoY2hpbGROb2RlcyksXG4gICAgICAgICAgICAgIGhhbGYgPSBfZ2V0Q2hpbGRTdGF0ZTMuaGFsZixcbiAgICAgICAgICAgICAgX2FsbCA9IF9nZXRDaGlsZFN0YXRlMy5hbGw7XG5cbiAgICAgICAgICBpZiAoIV9hbGwpIHtcbiAgICAgICAgICAgIF90aGlzMy5jaGVja2VkID0gX2FsbDtcbiAgICAgICAgICAgIF90aGlzMy5pbmRldGVybWluYXRlID0gaGFsZjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLnNob3VsZExvYWREYXRhKCkpIHtcbiAgICAgICAgLy8gT25seSB3b3JrIG9uIGxhenkgbG9hZCBkYXRhLlxuICAgICAgICB0aGlzLmxvYWREYXRhKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBoYW5kbGVEZXNjZW5kYW50cygpO1xuICAgICAgICAgIHJlSW5pdENoZWNrZWQoX3RoaXMzKTtcbiAgICAgICAgfSwge1xuICAgICAgICAgIGNoZWNrZWQ6IHZhbHVlICE9PSBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFuZGxlRGVzY2VuZGFudHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50LmxldmVsID09PSAwKSByZXR1cm47XG5cbiAgICBpZiAoIXJlY3Vyc2lvbikge1xuICAgICAgcmVJbml0Q2hlY2tlZChwYXJlbnQpO1xuICAgIH1cbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5nZXRDaGlsZHJlbiA9IGZ1bmN0aW9uIGdldENoaWxkcmVuKCkge1xuICAgIHZhciBmb3JjZUluaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIC8vIHRoaXMgaXMgZGF0YVxuICAgIGlmICh0aGlzLmxldmVsID09PSAwKSByZXR1cm4gdGhpcy5kYXRhO1xuICAgIHZhciBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGlmICghZGF0YSkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgcHJvcHMgPSB0aGlzLnN0b3JlLnByb3BzO1xuICAgIHZhciBjaGlsZHJlbiA9ICdjaGlsZHJlbic7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuIHx8ICdjaGlsZHJlbic7XG4gICAgfVxuXG4gICAgaWYgKGRhdGFbY2hpbGRyZW5dID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRhdGFbY2hpbGRyZW5dID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZm9yY2VJbml0ICYmICFkYXRhW2NoaWxkcmVuXSkge1xuICAgICAgZGF0YVtjaGlsZHJlbl0gPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YVtjaGlsZHJlbl07XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUudXBkYXRlQ2hpbGRyZW4gPSBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbigpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIHZhciBuZXdEYXRhID0gdGhpcy5nZXRDaGlsZHJlbigpIHx8IFtdO1xuICAgIHZhciBvbGREYXRhID0gdGhpcy5jaGlsZE5vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUuZGF0YTtcbiAgICB9KTtcblxuICAgIHZhciBuZXdEYXRhTWFwID0ge307XG4gICAgdmFyIG5ld05vZGVzID0gW107XG5cbiAgICBuZXdEYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICB2YXIga2V5ID0gaXRlbVtOT0RFX0tFWV07XG4gICAgICB2YXIgaXNOb2RlRXhpc3RzID0gISFrZXkgJiYgT2JqZWN0KHV0aWxfW1wiYXJyYXlGaW5kSW5kZXhcIl0pKG9sZERhdGEsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHJldHVybiBkYXRhW05PREVfS0VZXSA9PT0ga2V5O1xuICAgICAgfSkgPj0gMDtcbiAgICAgIGlmIChpc05vZGVFeGlzdHMpIHtcbiAgICAgICAgbmV3RGF0YU1hcFtrZXldID0geyBpbmRleDogaW5kZXgsIGRhdGE6IGl0ZW0gfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld05vZGVzLnB1c2goeyBpbmRleDogaW5kZXgsIGRhdGE6IGl0ZW0gfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMuc3RvcmUubGF6eSkge1xuICAgICAgb2xkRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGlmICghbmV3RGF0YU1hcFtpdGVtW05PREVfS0VZXV0pIF90aGlzNC5yZW1vdmVDaGlsZEJ5RGF0YShpdGVtKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG5ld05vZGVzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBpbmRleCA9IF9yZWYuaW5kZXgsXG4gICAgICAgICAgZGF0YSA9IF9yZWYuZGF0YTtcblxuICAgICAgX3RoaXM0Lmluc2VydENoaWxkKHsgZGF0YTogZGF0YSB9LCBpbmRleCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZUxlYWZTdGF0ZSgpO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmxvYWREYXRhID0gZnVuY3Rpb24gbG9hZERhdGEoY2FsbGJhY2spIHtcbiAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgIHZhciBkZWZhdWx0UHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgaWYgKHRoaXMuc3RvcmUubGF6eSA9PT0gdHJ1ZSAmJiB0aGlzLnN0b3JlLmxvYWQgJiYgIXRoaXMubG9hZGVkICYmICghdGhpcy5sb2FkaW5nIHx8IE9iamVjdC5rZXlzKGRlZmF1bHRQcm9wcykubGVuZ3RoKSkge1xuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgdmFyIHJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKGNoaWxkcmVuKSB7XG4gICAgICAgIF90aGlzNS5jaGlsZE5vZGVzID0gW107XG5cbiAgICAgICAgX3RoaXM1LmRvQ3JlYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIGRlZmF1bHRQcm9wcyk7XG4gICAgICAgIF90aGlzNS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICBfdGhpczUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBfdGhpczUudXBkYXRlTGVhZlN0YXRlKCk7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrLmNhbGwoX3RoaXM1LCBjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc3RvcmUubG9hZCh0aGlzLCByZXNvbHZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhOb2RlLCBbe1xuICAgIGtleTogJ2xhYmVsJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBnZXRQcm9wZXJ0eUZyb21EYXRhKHRoaXMsICdsYWJlbCcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2tleScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgbm9kZUtleSA9IHRoaXMuc3RvcmUua2V5O1xuICAgICAgaWYgKHRoaXMuZGF0YSkgcmV0dXJuIHRoaXMuZGF0YVtub2RlS2V5XTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2Rpc2FibGVkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBnZXRQcm9wZXJ0eUZyb21EYXRhKHRoaXMsICdkaXNhYmxlZCcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ25leHRTaWJsaW5nJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gcGFyZW50LmNoaWxkTm9kZXMuaW5kZXhPZih0aGlzKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXR1cm4gcGFyZW50LmNoaWxkTm9kZXNbaW5kZXggKyAxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncHJldmlvdXNTaWJsaW5nJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gcGFyZW50LmNoaWxkTm9kZXMuaW5kZXhPZih0aGlzKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXggPiAwID8gcGFyZW50LmNoaWxkTm9kZXNbaW5kZXggLSAxXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBOb2RlO1xufSgpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBtb2RlbF9ub2RlID0gKG5vZGVfTm9kZSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyZWUvc3JjL21vZGVsL3RyZWUtc3RvcmUuanNcbnZhciB0cmVlX3N0b3JlX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmZ1bmN0aW9uIHRyZWVfc3RvcmVfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cblxuXG52YXIgdHJlZV9zdG9yZV9UcmVlU3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRyZWVTdG9yZShvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRyZWVfc3RvcmVfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJlZVN0b3JlKTtcblxuICAgIHRoaXMuY3VycmVudE5vZGUgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudE5vZGVLZXkgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgb3B0aW9uIGluIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbikpIHtcbiAgICAgICAgdGhpc1tvcHRpb25dID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubm9kZXNNYXAgPSB7fTtcblxuICAgIHRoaXMucm9vdCA9IG5ldyBtb2RlbF9ub2RlKHtcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgIHN0b3JlOiB0aGlzXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5sYXp5ICYmIHRoaXMubG9hZCkge1xuICAgICAgdmFyIGxvYWRGbiA9IHRoaXMubG9hZDtcbiAgICAgIGxvYWRGbih0aGlzLnJvb3QsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIF90aGlzLnJvb3QuZG9DcmVhdGVDaGlsZHJlbihkYXRhKTtcbiAgICAgICAgX3RoaXMuX2luaXREZWZhdWx0Q2hlY2tlZE5vZGVzKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW5pdERlZmF1bHRDaGVja2VkTm9kZXMoKTtcbiAgICB9XG4gIH1cblxuICBUcmVlU3RvcmUucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcih2YWx1ZSkge1xuICAgIHZhciBmaWx0ZXJOb2RlTWV0aG9kID0gdGhpcy5maWx0ZXJOb2RlTWV0aG9kO1xuICAgIHZhciBsYXp5ID0gdGhpcy5sYXp5O1xuICAgIHZhciB0cmF2ZXJzZSA9IGZ1bmN0aW9uIHRyYXZlcnNlKG5vZGUpIHtcbiAgICAgIHZhciBjaGlsZE5vZGVzID0gbm9kZS5yb290ID8gbm9kZS5yb290LmNoaWxkTm9kZXMgOiBub2RlLmNoaWxkTm9kZXM7XG5cbiAgICAgIGNoaWxkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgY2hpbGQudmlzaWJsZSA9IGZpbHRlck5vZGVNZXRob2QuY2FsbChjaGlsZCwgdmFsdWUsIGNoaWxkLmRhdGEsIGNoaWxkKTtcblxuICAgICAgICB0cmF2ZXJzZShjaGlsZCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFub2RlLnZpc2libGUgJiYgY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGFsbEhpZGRlbiA9IHRydWU7XG4gICAgICAgIGFsbEhpZGRlbiA9ICFjaGlsZE5vZGVzLnNvbWUoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkLnZpc2libGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChub2RlLnJvb3QpIHtcbiAgICAgICAgICBub2RlLnJvb3QudmlzaWJsZSA9IGFsbEhpZGRlbiA9PT0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS52aXNpYmxlID0gYWxsSGlkZGVuID09PSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgICBpZiAobm9kZS52aXNpYmxlICYmICFub2RlLmlzTGVhZiAmJiAhbGF6eSkgbm9kZS5leHBhbmQoKTtcbiAgICB9O1xuXG4gICAgdHJhdmVyc2UodGhpcyk7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5zZXREYXRhID0gZnVuY3Rpb24gc2V0RGF0YShuZXdWYWwpIHtcbiAgICB2YXIgaW5zdGFuY2VDaGFuZ2VkID0gbmV3VmFsICE9PSB0aGlzLnJvb3QuZGF0YTtcbiAgICBpZiAoaW5zdGFuY2VDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnJvb3Quc2V0RGF0YShuZXdWYWwpO1xuICAgICAgdGhpcy5faW5pdERlZmF1bHRDaGVja2VkTm9kZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb290LnVwZGF0ZUNoaWxkcmVuKCk7XG4gICAgfVxuICB9O1xuXG4gIFRyZWVTdG9yZS5wcm90b3R5cGUuZ2V0Tm9kZSA9IGZ1bmN0aW9uIGdldE5vZGUoZGF0YSkge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgbW9kZWxfbm9kZSkgcmV0dXJuIGRhdGE7XG4gICAgdmFyIGtleSA9ICh0eXBlb2YgZGF0YSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IHRyZWVfc3RvcmVfdHlwZW9mKGRhdGEpKSAhPT0gJ29iamVjdCcgPyBkYXRhIDogdXRpbF9nZXROb2RlS2V5KHRoaXMua2V5LCBkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5ub2Rlc01hcFtrZXldIHx8IG51bGw7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbiBpbnNlcnRCZWZvcmUoZGF0YSwgcmVmRGF0YSkge1xuICAgIHZhciByZWZOb2RlID0gdGhpcy5nZXROb2RlKHJlZkRhdGEpO1xuICAgIHJlZk5vZGUucGFyZW50Lmluc2VydEJlZm9yZSh7IGRhdGE6IGRhdGEgfSwgcmVmTm9kZSk7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uIGluc2VydEFmdGVyKGRhdGEsIHJlZkRhdGEpIHtcbiAgICB2YXIgcmVmTm9kZSA9IHRoaXMuZ2V0Tm9kZShyZWZEYXRhKTtcbiAgICByZWZOb2RlLnBhcmVudC5pbnNlcnRBZnRlcih7IGRhdGE6IGRhdGEgfSwgcmVmTm9kZSk7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoZGF0YSkge1xuICAgIHZhciBub2RlID0gdGhpcy5nZXROb2RlKGRhdGEpO1xuXG4gICAgaWYgKG5vZGUgJiYgbm9kZS5wYXJlbnQpIHtcbiAgICAgIGlmIChub2RlID09PSB0aGlzLmN1cnJlbnROb2RlKSB7XG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBudWxsO1xuICAgICAgfVxuICAgICAgbm9kZS5wYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgfVxuICB9O1xuXG4gIFRyZWVTdG9yZS5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kKGRhdGEsIHBhcmVudERhdGEpIHtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudERhdGEgPyB0aGlzLmdldE5vZGUocGFyZW50RGF0YSkgOiB0aGlzLnJvb3Q7XG5cbiAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRDaGlsZCh7IGRhdGE6IGRhdGEgfSk7XG4gICAgfVxuICB9O1xuXG4gIFRyZWVTdG9yZS5wcm90b3R5cGUuX2luaXREZWZhdWx0Q2hlY2tlZE5vZGVzID0gZnVuY3Rpb24gX2luaXREZWZhdWx0Q2hlY2tlZE5vZGVzKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGRlZmF1bHRDaGVja2VkS2V5cyA9IHRoaXMuZGVmYXVsdENoZWNrZWRLZXlzIHx8IFtdO1xuICAgIHZhciBub2Rlc01hcCA9IHRoaXMubm9kZXNNYXA7XG5cbiAgICBkZWZhdWx0Q2hlY2tlZEtleXMuZm9yRWFjaChmdW5jdGlvbiAoY2hlY2tlZEtleSkge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc01hcFtjaGVja2VkS2V5XTtcblxuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgbm9kZS5zZXRDaGVja2VkKHRydWUsICFfdGhpczIuY2hlY2tTdHJpY3RseSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5faW5pdERlZmF1bHRDaGVja2VkTm9kZSA9IGZ1bmN0aW9uIF9pbml0RGVmYXVsdENoZWNrZWROb2RlKG5vZGUpIHtcbiAgICB2YXIgZGVmYXVsdENoZWNrZWRLZXlzID0gdGhpcy5kZWZhdWx0Q2hlY2tlZEtleXMgfHwgW107XG5cbiAgICBpZiAoZGVmYXVsdENoZWNrZWRLZXlzLmluZGV4T2Yobm9kZS5rZXkpICE9PSAtMSkge1xuICAgICAgbm9kZS5zZXRDaGVja2VkKHRydWUsICF0aGlzLmNoZWNrU3RyaWN0bHkpO1xuICAgIH1cbiAgfTtcblxuICBUcmVlU3RvcmUucHJvdG90eXBlLnNldERlZmF1bHRDaGVja2VkS2V5ID0gZnVuY3Rpb24gc2V0RGVmYXVsdENoZWNrZWRLZXkobmV3VmFsKSB7XG4gICAgaWYgKG5ld1ZhbCAhPT0gdGhpcy5kZWZhdWx0Q2hlY2tlZEtleXMpIHtcbiAgICAgIHRoaXMuZGVmYXVsdENoZWNrZWRLZXlzID0gbmV3VmFsO1xuICAgICAgdGhpcy5faW5pdERlZmF1bHRDaGVja2VkTm9kZXMoKTtcbiAgICB9XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5yZWdpc3Rlck5vZGUgPSBmdW5jdGlvbiByZWdpc3Rlck5vZGUobm9kZSkge1xuICAgIHZhciBrZXkgPSB0aGlzLmtleTtcbiAgICBpZiAoIWtleSB8fCAhbm9kZSB8fCAhbm9kZS5kYXRhKSByZXR1cm47XG5cbiAgICB2YXIgbm9kZUtleSA9IG5vZGUua2V5O1xuICAgIGlmIChub2RlS2V5ICE9PSB1bmRlZmluZWQpIHRoaXMubm9kZXNNYXBbbm9kZS5rZXldID0gbm9kZTtcbiAgfTtcblxuICBUcmVlU3RvcmUucHJvdG90eXBlLmRlcmVnaXN0ZXJOb2RlID0gZnVuY3Rpb24gZGVyZWdpc3Rlck5vZGUobm9kZSkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIGtleSA9IHRoaXMua2V5O1xuICAgIGlmICgha2V5IHx8ICFub2RlIHx8ICFub2RlLmRhdGEpIHJldHVybjtcblxuICAgIG5vZGUuY2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgX3RoaXMzLmRlcmVnaXN0ZXJOb2RlKGNoaWxkKTtcbiAgICB9KTtcblxuICAgIGRlbGV0ZSB0aGlzLm5vZGVzTWFwW25vZGUua2V5XTtcbiAgfTtcblxuICBUcmVlU3RvcmUucHJvdG90eXBlLmdldENoZWNrZWROb2RlcyA9IGZ1bmN0aW9uIGdldENoZWNrZWROb2RlcygpIHtcbiAgICB2YXIgbGVhZk9ubHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIHZhciBpbmNsdWRlSGFsZkNoZWNrZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gICAgdmFyIGNoZWNrZWROb2RlcyA9IFtdO1xuICAgIHZhciB0cmF2ZXJzZSA9IGZ1bmN0aW9uIHRyYXZlcnNlKG5vZGUpIHtcbiAgICAgIHZhciBjaGlsZE5vZGVzID0gbm9kZS5yb290ID8gbm9kZS5yb290LmNoaWxkTm9kZXMgOiBub2RlLmNoaWxkTm9kZXM7XG5cbiAgICAgIGNoaWxkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKChjaGlsZC5jaGVja2VkIHx8IGluY2x1ZGVIYWxmQ2hlY2tlZCAmJiBjaGlsZC5pbmRldGVybWluYXRlKSAmJiAoIWxlYWZPbmx5IHx8IGxlYWZPbmx5ICYmIGNoaWxkLmlzTGVhZikpIHtcbiAgICAgICAgICBjaGVja2VkTm9kZXMucHVzaChjaGlsZC5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYXZlcnNlKGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0cmF2ZXJzZSh0aGlzKTtcblxuICAgIHJldHVybiBjaGVja2VkTm9kZXM7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5nZXRDaGVja2VkS2V5cyA9IGZ1bmN0aW9uIGdldENoZWNrZWRLZXlzKCkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgdmFyIGxlYWZPbmx5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgIHJldHVybiB0aGlzLmdldENoZWNrZWROb2RlcyhsZWFmT25seSkubWFwKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICByZXR1cm4gKGRhdGEgfHwge30pW190aGlzNC5rZXldO1xuICAgIH0pO1xuICB9O1xuXG4gIFRyZWVTdG9yZS5wcm90b3R5cGUuZ2V0SGFsZkNoZWNrZWROb2RlcyA9IGZ1bmN0aW9uIGdldEhhbGZDaGVja2VkTm9kZXMoKSB7XG4gICAgdmFyIG5vZGVzID0gW107XG4gICAgdmFyIHRyYXZlcnNlID0gZnVuY3Rpb24gdHJhdmVyc2Uobm9kZSkge1xuICAgICAgdmFyIGNoaWxkTm9kZXMgPSBub2RlLnJvb3QgPyBub2RlLnJvb3QuY2hpbGROb2RlcyA6IG5vZGUuY2hpbGROb2RlcztcblxuICAgICAgY2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQuaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICAgIG5vZGVzLnB1c2goY2hpbGQuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cmF2ZXJzZShjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdHJhdmVyc2UodGhpcyk7XG5cbiAgICByZXR1cm4gbm9kZXM7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5nZXRIYWxmQ2hlY2tlZEtleXMgPSBmdW5jdGlvbiBnZXRIYWxmQ2hlY2tlZEtleXMoKSB7XG4gICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRIYWxmQ2hlY2tlZE5vZGVzKCkubWFwKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICByZXR1cm4gKGRhdGEgfHwge30pW190aGlzNS5rZXldO1xuICAgIH0pO1xuICB9O1xuXG4gIFRyZWVTdG9yZS5wcm90b3R5cGUuX2dldEFsbE5vZGVzID0gZnVuY3Rpb24gX2dldEFsbE5vZGVzKCkge1xuICAgIHZhciBhbGxOb2RlcyA9IFtdO1xuICAgIHZhciBub2Rlc01hcCA9IHRoaXMubm9kZXNNYXA7XG4gICAgZm9yICh2YXIgbm9kZUtleSBpbiBub2Rlc01hcCkge1xuICAgICAgaWYgKG5vZGVzTWFwLmhhc093blByb3BlcnR5KG5vZGVLZXkpKSB7XG4gICAgICAgIGFsbE5vZGVzLnB1c2gobm9kZXNNYXBbbm9kZUtleV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhbGxOb2RlcztcbiAgfTtcblxuICBUcmVlU3RvcmUucHJvdG90eXBlLnVwZGF0ZUNoaWxkcmVuID0gZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4oa2V5LCBkYXRhKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGVzTWFwW2tleV07XG4gICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgdmFyIGNoaWxkTm9kZXMgPSBub2RlLmNoaWxkTm9kZXM7XG4gICAgZm9yICh2YXIgaSA9IGNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XG4gICAgICB0aGlzLnJlbW92ZShjaGlsZC5kYXRhKTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2kgPSAwLCBqID0gZGF0YS5sZW5ndGg7IF9pIDwgajsgX2krKykge1xuICAgICAgdmFyIF9jaGlsZCA9IGRhdGFbX2ldO1xuICAgICAgdGhpcy5hcHBlbmQoX2NoaWxkLCBub2RlLmRhdGEpO1xuICAgIH1cbiAgfTtcblxuICBUcmVlU3RvcmUucHJvdG90eXBlLl9zZXRDaGVja2VkS2V5cyA9IGZ1bmN0aW9uIF9zZXRDaGVja2VkS2V5cyhrZXkpIHtcbiAgICB2YXIgbGVhZk9ubHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIHZhciBjaGVja2VkS2V5cyA9IGFyZ3VtZW50c1syXTtcblxuICAgIHZhciBhbGxOb2RlcyA9IHRoaXMuX2dldEFsbE5vZGVzKCkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGIubGV2ZWwgLSBhLmxldmVsO1xuICAgIH0pO1xuICAgIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjaGVja2VkS2V5cyk7XG4gICAgYWxsTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUuc2V0Q2hlY2tlZChmYWxzZSwgZmFsc2UpO1xuICAgIH0pO1xuICAgIGZvciAodmFyIGkgPSAwLCBqID0gYWxsTm9kZXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgICAgdmFyIG5vZGVLZXkgPSBub2RlLmRhdGFba2V5XS50b1N0cmluZygpO1xuICAgICAgdmFyIGNoZWNrZWQgPSBrZXlzLmluZGV4T2Yobm9kZUtleSkgPiAtMTtcbiAgICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgICBpZiAobm9kZS5jaGVja2VkICYmICFjYWNoZVtub2RlS2V5XSkge1xuICAgICAgICAgIG5vZGUuc2V0Q2hlY2tlZChmYWxzZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG4gICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5sZXZlbCA+IDApIHtcbiAgICAgICAgY2FjaGVbcGFyZW50LmRhdGFba2V5XV0gPSB0cnVlO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5pc0xlYWYgfHwgdGhpcy5jaGVja1N0cmljdGx5KSB7XG4gICAgICAgIG5vZGUuc2V0Q2hlY2tlZCh0cnVlLCBmYWxzZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbm9kZS5zZXRDaGVja2VkKHRydWUsIHRydWUpO1xuXG4gICAgICBpZiAobGVhZk9ubHkpIHtcbiAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBub2RlLnNldENoZWNrZWQoZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICB2YXIgdHJhdmVyc2UgPSBmdW5jdGlvbiB0cmF2ZXJzZShub2RlKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGROb2RlcyA9IG5vZGUuY2hpbGROb2RlcztcbiAgICAgICAgICAgIGNoaWxkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgaWYgKCFjaGlsZC5pc0xlYWYpIHtcbiAgICAgICAgICAgICAgICBjaGlsZC5zZXRDaGVja2VkKGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJhdmVyc2UoY2hpbGQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB0cmF2ZXJzZShub2RlKTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5zZXRDaGVja2VkTm9kZXMgPSBmdW5jdGlvbiBzZXRDaGVja2VkTm9kZXMoYXJyYXkpIHtcbiAgICB2YXIgbGVhZk9ubHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gICAgdmFyIGtleSA9IHRoaXMua2V5O1xuICAgIHZhciBjaGVja2VkS2V5cyA9IHt9O1xuICAgIGFycmF5LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIGNoZWNrZWRLZXlzWyhpdGVtIHx8IHt9KVtrZXldXSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9zZXRDaGVja2VkS2V5cyhrZXksIGxlYWZPbmx5LCBjaGVja2VkS2V5cyk7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5zZXRDaGVja2VkS2V5cyA9IGZ1bmN0aW9uIHNldENoZWNrZWRLZXlzKGtleXMpIHtcbiAgICB2YXIgbGVhZk9ubHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gICAgdGhpcy5kZWZhdWx0Q2hlY2tlZEtleXMgPSBrZXlzO1xuICAgIHZhciBrZXkgPSB0aGlzLmtleTtcbiAgICB2YXIgY2hlY2tlZEtleXMgPSB7fTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgY2hlY2tlZEtleXNba2V5XSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9zZXRDaGVja2VkS2V5cyhrZXksIGxlYWZPbmx5LCBjaGVja2VkS2V5cyk7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5zZXREZWZhdWx0RXhwYW5kZWRLZXlzID0gZnVuY3Rpb24gc2V0RGVmYXVsdEV4cGFuZGVkS2V5cyhrZXlzKSB7XG4gICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICBrZXlzID0ga2V5cyB8fCBbXTtcbiAgICB0aGlzLmRlZmF1bHRFeHBhbmRlZEtleXMgPSBrZXlzO1xuXG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBub2RlID0gX3RoaXM2LmdldE5vZGUoa2V5KTtcbiAgICAgIGlmIChub2RlKSBub2RlLmV4cGFuZChudWxsLCBfdGhpczYuYXV0b0V4cGFuZFBhcmVudCk7XG4gICAgfSk7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5zZXRDaGVja2VkID0gZnVuY3Rpb24gc2V0Q2hlY2tlZChkYXRhLCBjaGVja2VkLCBkZWVwKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLmdldE5vZGUoZGF0YSk7XG5cbiAgICBpZiAobm9kZSkge1xuICAgICAgbm9kZS5zZXRDaGVja2VkKCEhY2hlY2tlZCwgZGVlcCk7XG4gICAgfVxuICB9O1xuXG4gIFRyZWVTdG9yZS5wcm90b3R5cGUuZ2V0Q3VycmVudE5vZGUgPSBmdW5jdGlvbiBnZXRDdXJyZW50Tm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50Tm9kZTtcbiAgfTtcblxuICBUcmVlU3RvcmUucHJvdG90eXBlLnNldEN1cnJlbnROb2RlID0gZnVuY3Rpb24gc2V0Q3VycmVudE5vZGUoY3VycmVudE5vZGUpIHtcbiAgICB2YXIgcHJldkN1cnJlbnROb2RlID0gdGhpcy5jdXJyZW50Tm9kZTtcbiAgICBpZiAocHJldkN1cnJlbnROb2RlKSB7XG4gICAgICBwcmV2Q3VycmVudE5vZGUuaXNDdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZTtcbiAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ3VycmVudCA9IHRydWU7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5zZXRVc2VyQ3VycmVudE5vZGUgPSBmdW5jdGlvbiBzZXRVc2VyQ3VycmVudE5vZGUobm9kZSkge1xuICAgIHZhciBrZXkgPSBub2RlW3RoaXMua2V5XTtcbiAgICB2YXIgY3Vyck5vZGUgPSB0aGlzLm5vZGVzTWFwW2tleV07XG4gICAgdGhpcy5zZXRDdXJyZW50Tm9kZShjdXJyTm9kZSk7XG4gIH07XG5cbiAgVHJlZVN0b3JlLnByb3RvdHlwZS5zZXRDdXJyZW50Tm9kZUtleSA9IGZ1bmN0aW9uIHNldEN1cnJlbnROb2RlS2V5KGtleSkge1xuICAgIGlmIChrZXkgPT09IG51bGwgfHwga2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY3VycmVudE5vZGUgJiYgKHRoaXMuY3VycmVudE5vZGUuaXNDdXJyZW50ID0gZmFsc2UpO1xuICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBub2RlID0gdGhpcy5nZXROb2RlKGtleSk7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIHRoaXMuc2V0Q3VycmVudE5vZGUobm9kZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBUcmVlU3RvcmU7XG59KCk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRyZWVfc3RvcmUgPSAodHJlZV9zdG9yZV9UcmVlU3RvcmUpO1xuO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90cmVlL3NyYy90cmVlLW5vZGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNiYTNlZjBlJlxudmFyIHRyZWVfbm9kZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNiYTNlZjBlX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdGhpcyQxID0gdGhpc1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgdmFsdWU6IF92bS5ub2RlLnZpc2libGUsXG4gICAgICAgICAgZXhwcmVzc2lvbjogXCJub2RlLnZpc2libGVcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgcmVmOiBcIm5vZGVcIixcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRyZWUtbm9kZVwiLFxuICAgICAgY2xhc3M6IHtcbiAgICAgICAgXCJpcy1leHBhbmRlZFwiOiBfdm0uZXhwYW5kZWQsXG4gICAgICAgIFwiaXMtY3VycmVudFwiOiBfdm0ubm9kZS5pc0N1cnJlbnQsXG4gICAgICAgIFwiaXMtaGlkZGVuXCI6ICFfdm0ubm9kZS52aXNpYmxlLFxuICAgICAgICBcImlzLWZvY3VzYWJsZVwiOiAhX3ZtLm5vZGUuZGlzYWJsZWQsXG4gICAgICAgIFwiaXMtY2hlY2tlZFwiOiAhX3ZtLm5vZGUuZGlzYWJsZWQgJiYgX3ZtLm5vZGUuY2hlY2tlZFxuICAgICAgfSxcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIHJvbGU6IFwidHJlZWl0ZW1cIixcbiAgICAgICAgdGFiaW5kZXg6IFwiLTFcIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IF92bS5leHBhbmRlZCxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IF92bS5ub2RlLmRpc2FibGVkLFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiBfdm0ubm9kZS5jaGVja2VkLFxuICAgICAgICBkcmFnZ2FibGU6IF92bS50cmVlLmRyYWdnYWJsZVxuICAgICAgfSxcbiAgICAgIG9uOiB7XG4gICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICByZXR1cm4gX3ZtLmhhbmRsZUNsaWNrKCRldmVudClcbiAgICAgICAgfSxcbiAgICAgICAgY29udGV4dG1lbnU6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgIHJldHVybiB0aGlzJDEuaGFuZGxlQ29udGV4dE1lbnUoJGV2ZW50KVxuICAgICAgICB9LFxuICAgICAgICBkcmFnc3RhcnQ6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHJldHVybiBfdm0uaGFuZGxlRHJhZ1N0YXJ0KCRldmVudClcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ292ZXI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHJldHVybiBfdm0uaGFuZGxlRHJhZ092ZXIoJGV2ZW50KVxuICAgICAgICB9LFxuICAgICAgICBkcmFnZW5kOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICByZXR1cm4gX3ZtLmhhbmRsZURyYWdFbmQoJGV2ZW50KVxuICAgICAgICB9LFxuICAgICAgICBkcm9wOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICByZXR1cm4gX3ZtLmhhbmRsZURyb3AoJGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRyZWUtbm9kZV9fY29udGVudFwiLFxuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBcInBhZGRpbmctbGVmdFwiOiAoX3ZtLm5vZGUubGV2ZWwgLSAxKSAqIF92bS50cmVlLmluZGVudCArIFwicHhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFwic3BhblwiLCB7XG4gICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJpcy1sZWFmXCI6IF92bS5ub2RlLmlzTGVhZixcbiAgICAgICAgICAgICAgICBleHBhbmRlZDogIV92bS5ub2RlLmlzTGVhZiAmJiBfdm0uZXhwYW5kZWRcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJlbC10cmVlLW5vZGVfX2V4cGFuZC1pY29uXCIsXG4gICAgICAgICAgICAgIF92bS50cmVlLmljb25DbGFzcyA/IF92bS50cmVlLmljb25DbGFzcyA6IFwiZWwtaWNvbi1jYXJldC1yaWdodFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgIHJldHVybiBfdm0uaGFuZGxlRXhwYW5kSWNvbkNsaWNrKCRldmVudClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIF92bS5zaG93Q2hlY2tib3hcbiAgICAgICAgICAgID8gX2MoXCJlbC1jaGVja2JveFwiLCB7XG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU6IF92bS5ub2RlLmluZGV0ZXJtaW5hdGUsXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZDogISFfdm0ubm9kZS5kaXNhYmxlZFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb246IHsgY2hhbmdlOiBfdm0uaGFuZGxlQ2hlY2tDaGFuZ2UgfSxcbiAgICAgICAgICAgICAgICBuYXRpdmVPbjoge1xuICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLm5vZGUuY2hlY2tlZCxcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigkJHYpIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLiRzZXQoX3ZtLm5vZGUsIFwiY2hlY2tlZFwiLCAkJHYpXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJub2RlLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgX3ZtLm5vZGUubG9hZGluZ1xuICAgICAgICAgICAgPyBfYyhcInNwYW5cIiwge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRyZWUtbm9kZV9fbG9hZGluZy1pY29uIGVsLWljb24tbG9hZGluZ1wiXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgIF9jKFwibm9kZS1jb250ZW50XCIsIHsgYXR0cnM6IHsgbm9kZTogX3ZtLm5vZGUgfSB9KVxuICAgICAgICBdLFxuICAgICAgICAxXG4gICAgICApLFxuICAgICAgX2MoXCJlbC1jb2xsYXBzZS10cmFuc2l0aW9uXCIsIFtcbiAgICAgICAgIV92bS5yZW5kZXJBZnRlckV4cGFuZCB8fCBfdm0uY2hpbGROb2RlUmVuZGVyZWRcbiAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5leHBhbmRlZCxcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJleHBhbmRlZFwiXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10cmVlLW5vZGVfX2NoaWxkcmVuXCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHsgcm9sZTogXCJncm91cFwiLCBcImFyaWEtZXhwYW5kZWRcIjogX3ZtLmV4cGFuZGVkIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgX3ZtLl9sKF92bS5ub2RlLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jKFwiZWwtdHJlZS1ub2RlXCIsIHtcbiAgICAgICAgICAgICAgICAgIGtleTogX3ZtLmdldE5vZGVLZXkoY2hpbGQpLFxuICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJyZW5kZXItY29udGVudFwiOiBfdm0ucmVuZGVyQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgXCJyZW5kZXItYWZ0ZXItZXhwYW5kXCI6IF92bS5yZW5kZXJBZnRlckV4cGFuZCxcbiAgICAgICAgICAgICAgICAgICAgXCJzaG93LWNoZWNrYm94XCI6IF92bS5zaG93Q2hlY2tib3gsXG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IGNoaWxkXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgb246IHsgXCJub2RlLWV4cGFuZFwiOiBfdm0uaGFuZGxlQ2hpbGROb2RlRXhwYW5kIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgIF0pXG4gICAgXSxcbiAgICAxXG4gIClcbn1cbnZhciB0cmVlX25vZGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zYmEzZWYwZV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxudHJlZV9ub2RldnVlX3R5cGVfdGVtcGxhdGVfaWRfM2JhM2VmMGVfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90cmVlL3NyYy90cmVlLW5vZGUudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNiYTNlZjBlJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90cmVlL3NyYy90cmVlLW5vZGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRyZWVfbm9kZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFRyZWVOb2RlJyxcblxuICBjb21wb25lbnROYW1lOiAnRWxUcmVlTm9kZScsXG5cbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmFdLFxuXG4gIHByb3BzOiB7XG4gICAgbm9kZToge1xuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHByb3BzOiB7fSxcbiAgICByZW5kZXJDb250ZW50OiBGdW5jdGlvbixcbiAgICByZW5kZXJBZnRlckV4cGFuZDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIHNob3dDaGVja2JveDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBFbENvbGxhcHNlVHJhbnNpdGlvbjogY29sbGFwc2VfdHJhbnNpdGlvbl9kZWZhdWx0LmEsXG4gICAgRWxDaGVja2JveDogY2hlY2tib3hfZGVmYXVsdC5hLFxuICAgIE5vZGVDb250ZW50OiB7XG4gICAgICBwcm9wczoge1xuICAgICAgICBub2RlOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcbiAgICAgICAgdmFyIHRyZWUgPSBwYXJlbnQudHJlZTtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGU7XG4gICAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhLFxuICAgICAgICAgICAgc3RvcmUgPSBub2RlLnN0b3JlO1xuXG4gICAgICAgIHJldHVybiBwYXJlbnQucmVuZGVyQ29udGVudCA/IHBhcmVudC5yZW5kZXJDb250ZW50LmNhbGwocGFyZW50Ll9yZW5kZXJQcm94eSwgaCwgeyBfc2VsZjogdHJlZS4kdm5vZGUuY29udGV4dCwgbm9kZTogbm9kZSwgZGF0YTogZGF0YSwgc3RvcmU6IHN0b3JlIH0pIDogdHJlZS4kc2NvcGVkU2xvdHMuZGVmYXVsdCA/IHRyZWUuJHNjb3BlZFNsb3RzLmRlZmF1bHQoeyBub2RlOiBub2RlLCBkYXRhOiBkYXRhIH0pIDogaChcbiAgICAgICAgICAnc3BhbicsXG4gICAgICAgICAgeyAnY2xhc3MnOiAnZWwtdHJlZS1ub2RlX19sYWJlbCcgfSxcbiAgICAgICAgICBbbm9kZS5sYWJlbF1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJlZTogbnVsbCxcbiAgICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICAgIGNoaWxkTm9kZVJlbmRlcmVkOiBmYWxzZSxcbiAgICAgIG9sZENoZWNrZWQ6IG51bGwsXG4gICAgICBvbGRJbmRldGVybWluYXRlOiBudWxsXG4gICAgfTtcbiAgfSxcblxuXG4gIHdhdGNoOiB7XG4gICAgJ25vZGUuaW5kZXRlcm1pbmF0ZSc6IGZ1bmN0aW9uIG5vZGVJbmRldGVybWluYXRlKHZhbCkge1xuICAgICAgdGhpcy5oYW5kbGVTZWxlY3RDaGFuZ2UodGhpcy5ub2RlLmNoZWNrZWQsIHZhbCk7XG4gICAgfSxcbiAgICAnbm9kZS5jaGVja2VkJzogZnVuY3Rpb24gbm9kZUNoZWNrZWQodmFsKSB7XG4gICAgICB0aGlzLmhhbmRsZVNlbGVjdENoYW5nZSh2YWwsIHRoaXMubm9kZS5pbmRldGVybWluYXRlKTtcbiAgICB9LFxuICAgICdub2RlLmV4cGFuZGVkJzogZnVuY3Rpb24gbm9kZUV4cGFuZGVkKHZhbCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZXhwYW5kZWQgPSB2YWw7XG4gICAgICB9KTtcbiAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgdGhpcy5jaGlsZE5vZGVSZW5kZXJlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXROb2RlS2V5OiBmdW5jdGlvbiBnZXROb2RlS2V5KG5vZGUpIHtcbiAgICAgIHJldHVybiB1dGlsX2dldE5vZGVLZXkodGhpcy50cmVlLm5vZGVLZXksIG5vZGUuZGF0YSk7XG4gICAgfSxcbiAgICBoYW5kbGVTZWxlY3RDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVNlbGVjdENoYW5nZShjaGVja2VkLCBpbmRldGVybWluYXRlKSB7XG4gICAgICBpZiAodGhpcy5vbGRDaGVja2VkICE9PSBjaGVja2VkICYmIHRoaXMub2xkSW5kZXRlcm1pbmF0ZSAhPT0gaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICB0aGlzLnRyZWUuJGVtaXQoJ2NoZWNrLWNoYW5nZScsIHRoaXMubm9kZS5kYXRhLCBjaGVja2VkLCBpbmRldGVybWluYXRlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub2xkQ2hlY2tlZCA9IGNoZWNrZWQ7XG4gICAgICB0aGlzLmluZGV0ZXJtaW5hdGUgPSBpbmRldGVybWluYXRlO1xuICAgIH0sXG4gICAgaGFuZGxlQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKCkge1xuICAgICAgdmFyIHN0b3JlID0gdGhpcy50cmVlLnN0b3JlO1xuICAgICAgc3RvcmUuc2V0Q3VycmVudE5vZGUodGhpcy5ub2RlKTtcbiAgICAgIHRoaXMudHJlZS4kZW1pdCgnY3VycmVudC1jaGFuZ2UnLCBzdG9yZS5jdXJyZW50Tm9kZSA/IHN0b3JlLmN1cnJlbnROb2RlLmRhdGEgOiBudWxsLCBzdG9yZS5jdXJyZW50Tm9kZSk7XG4gICAgICB0aGlzLnRyZWUuY3VycmVudE5vZGUgPSB0aGlzO1xuICAgICAgaWYgKHRoaXMudHJlZS5leHBhbmRPbkNsaWNrTm9kZSkge1xuICAgICAgICB0aGlzLmhhbmRsZUV4cGFuZEljb25DbGljaygpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudHJlZS5jaGVja09uQ2xpY2tOb2RlICYmICF0aGlzLm5vZGUuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVDaGVja0NoYW5nZShudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0OiB7IGNoZWNrZWQ6ICF0aGlzLm5vZGUuY2hlY2tlZCB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy50cmVlLiRlbWl0KCdub2RlLWNsaWNrJywgdGhpcy5ub2RlLmRhdGEsIHRoaXMubm9kZSwgdGhpcyk7XG4gICAgfSxcbiAgICBoYW5kbGVDb250ZXh0TWVudTogZnVuY3Rpb24gaGFuZGxlQ29udGV4dE1lbnUoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLnRyZWUuX2V2ZW50c1snbm9kZS1jb250ZXh0bWVudSddICYmIHRoaXMudHJlZS5fZXZlbnRzWydub2RlLWNvbnRleHRtZW51J10ubGVuZ3RoID4gMCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudHJlZS4kZW1pdCgnbm9kZS1jb250ZXh0bWVudScsIGV2ZW50LCB0aGlzLm5vZGUuZGF0YSwgdGhpcy5ub2RlLCB0aGlzKTtcbiAgICB9LFxuICAgIGhhbmRsZUV4cGFuZEljb25DbGljazogZnVuY3Rpb24gaGFuZGxlRXhwYW5kSWNvbkNsaWNrKCkge1xuICAgICAgaWYgKHRoaXMubm9kZS5pc0xlYWYpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLmV4cGFuZGVkKSB7XG4gICAgICAgIHRoaXMudHJlZS4kZW1pdCgnbm9kZS1jb2xsYXBzZScsIHRoaXMubm9kZS5kYXRhLCB0aGlzLm5vZGUsIHRoaXMpO1xuICAgICAgICB0aGlzLm5vZGUuY29sbGFwc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubm9kZS5leHBhbmQoKTtcbiAgICAgICAgdGhpcy4kZW1pdCgnbm9kZS1leHBhbmQnLCB0aGlzLm5vZGUuZGF0YSwgdGhpcy5ub2RlLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUNoZWNrQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVDaGVja0NoYW5nZSh2YWx1ZSwgZXYpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLm5vZGUuc2V0Q2hlY2tlZChldi50YXJnZXQuY2hlY2tlZCwgIXRoaXMudHJlZS5jaGVja1N0cmljdGx5KTtcbiAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0b3JlID0gX3RoaXMyLnRyZWUuc3RvcmU7XG4gICAgICAgIF90aGlzMi50cmVlLiRlbWl0KCdjaGVjaycsIF90aGlzMi5ub2RlLmRhdGEsIHtcbiAgICAgICAgICBjaGVja2VkTm9kZXM6IHN0b3JlLmdldENoZWNrZWROb2RlcygpLFxuICAgICAgICAgIGNoZWNrZWRLZXlzOiBzdG9yZS5nZXRDaGVja2VkS2V5cygpLFxuICAgICAgICAgIGhhbGZDaGVja2VkTm9kZXM6IHN0b3JlLmdldEhhbGZDaGVja2VkTm9kZXMoKSxcbiAgICAgICAgICBoYWxmQ2hlY2tlZEtleXM6IHN0b3JlLmdldEhhbGZDaGVja2VkS2V5cygpXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBoYW5kbGVDaGlsZE5vZGVFeHBhbmQ6IGZ1bmN0aW9uIGhhbmRsZUNoaWxkTm9kZUV4cGFuZChub2RlRGF0YSwgbm9kZSwgaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuYnJvYWRjYXN0KCdFbFRyZWVOb2RlJywgJ3RyZWUtbm9kZS1leHBhbmQnLCBub2RlKTtcbiAgICAgIHRoaXMudHJlZS4kZW1pdCgnbm9kZS1leHBhbmQnLCBub2RlRGF0YSwgbm9kZSwgaW5zdGFuY2UpO1xuICAgIH0sXG4gICAgaGFuZGxlRHJhZ1N0YXJ0OiBmdW5jdGlvbiBoYW5kbGVEcmFnU3RhcnQoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy50cmVlLmRyYWdnYWJsZSkgcmV0dXJuO1xuICAgICAgdGhpcy50cmVlLiRlbWl0KCd0cmVlLW5vZGUtZHJhZy1zdGFydCcsIGV2ZW50LCB0aGlzKTtcbiAgICB9LFxuICAgIGhhbmRsZURyYWdPdmVyOiBmdW5jdGlvbiBoYW5kbGVEcmFnT3ZlcihldmVudCkge1xuICAgICAgaWYgKCF0aGlzLnRyZWUuZHJhZ2dhYmxlKSByZXR1cm47XG4gICAgICB0aGlzLnRyZWUuJGVtaXQoJ3RyZWUtbm9kZS1kcmFnLW92ZXInLCBldmVudCwgdGhpcyk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG4gICAgaGFuZGxlRHJvcDogZnVuY3Rpb24gaGFuZGxlRHJvcChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuICAgIGhhbmRsZURyYWdFbmQ6IGZ1bmN0aW9uIGhhbmRsZURyYWdFbmQoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy50cmVlLmRyYWdnYWJsZSkgcmV0dXJuO1xuICAgICAgdGhpcy50cmVlLiRlbWl0KCd0cmVlLW5vZGUtZHJhZy1lbmQnLCBldmVudCwgdGhpcyk7XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXG4gICAgaWYgKHBhcmVudC5pc1RyZWUpIHtcbiAgICAgIHRoaXMudHJlZSA9IHBhcmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmVlID0gcGFyZW50LnRyZWU7XG4gICAgfVxuXG4gICAgdmFyIHRyZWUgPSB0aGlzLnRyZWU7XG4gICAgaWYgKCF0cmVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0NhbiBub3QgZmluZCBub2RlXFwncyB0cmVlLicpO1xuICAgIH1cblxuICAgIHZhciBwcm9wcyA9IHRyZWUucHJvcHMgfHwge307XG4gICAgdmFyIGNoaWxkcmVuS2V5ID0gcHJvcHNbJ2NoaWxkcmVuJ10gfHwgJ2NoaWxkcmVuJztcblxuICAgIHRoaXMuJHdhdGNoKCdub2RlLmRhdGEuJyArIGNoaWxkcmVuS2V5LCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczMubm9kZS51cGRhdGVDaGlsZHJlbigpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubm9kZS5leHBhbmRlZCkge1xuICAgICAgdGhpcy5leHBhbmRlZCA9IHRydWU7XG4gICAgICB0aGlzLmNoaWxkTm9kZVJlbmRlcmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmVlLmFjY29yZGlvbikge1xuICAgICAgdGhpcy4kb24oJ3RyZWUtbm9kZS1leHBhbmQnLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAoX3RoaXMzLm5vZGUgIT09IG5vZGUpIHtcbiAgICAgICAgICBfdGhpczMubm9kZS5jb2xsYXBzZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90cmVlL3NyYy90cmVlLW5vZGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY190cmVlX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAodHJlZV9ub2RldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyZWUvc3JjL3RyZWUtbm9kZS52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciB0cmVlX25vZGVfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfdHJlZV9ub2RldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICB0cmVlX25vZGV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zYmEzZWYwZV9yZW5kZXIsXG4gIHRyZWVfbm9kZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzNiYTNlZjBlX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgdHJlZV9ub2RlX2FwaTsgfVxudHJlZV9ub2RlX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvdHJlZS9zcmMvdHJlZS1ub2RlLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0cmVlX25vZGUgPSAodHJlZV9ub2RlX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RyZWUvc3JjL3RyZWUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdHJlZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFRyZWUnLFxuXG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hXSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxUcmVlTm9kZTogdHJlZV9ub2RlXG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RvcmU6IG51bGwsXG4gICAgICByb290OiBudWxsLFxuICAgICAgY3VycmVudE5vZGU6IG51bGwsXG4gICAgICB0cmVlSXRlbXM6IG51bGwsXG4gICAgICBjaGVja2JveEl0ZW1zOiBbXSxcbiAgICAgIGRyYWdTdGF0ZToge1xuICAgICAgICBzaG93RHJvcEluZGljYXRvcjogZmFsc2UsXG4gICAgICAgIGRyYWdnaW5nTm9kZTogbnVsbCxcbiAgICAgICAgZHJvcE5vZGU6IG51bGwsXG4gICAgICAgIGFsbG93RHJvcDogdHJ1ZVxuICAgICAgfVxuICAgIH07XG4gIH0sXG5cblxuICBwcm9wczoge1xuICAgIGRhdGE6IHtcbiAgICAgIHR5cGU6IEFycmF5XG4gICAgfSxcbiAgICBlbXB0eVRleHQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0KGxpYl9sb2NhbGVfW1widFwiXSkoJ2VsLnRyZWUuZW1wdHlUZXh0Jyk7XG4gICAgICB9XG4gICAgfSxcbiAgICByZW5kZXJBZnRlckV4cGFuZDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIG5vZGVLZXk6IFN0cmluZyxcbiAgICBjaGVja1N0cmljdGx5OiBCb29sZWFuLFxuICAgIGRlZmF1bHRFeHBhbmRBbGw6IEJvb2xlYW4sXG4gICAgZXhwYW5kT25DbGlja05vZGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjaGVja09uQ2xpY2tOb2RlOiBCb29sZWFuLFxuICAgIGNoZWNrRGVzY2VuZGFudHM6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgYXV0b0V4cGFuZFBhcmVudDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGRlZmF1bHRDaGVja2VkS2V5czogQXJyYXksXG4gICAgZGVmYXVsdEV4cGFuZGVkS2V5czogQXJyYXksXG4gICAgY3VycmVudE5vZGVLZXk6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgcmVuZGVyQ29udGVudDogRnVuY3Rpb24sXG4gICAgc2hvd0NoZWNrYm94OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIGRyYWdnYWJsZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICBhbGxvd0RyYWc6IEZ1bmN0aW9uLFxuICAgIGFsbG93RHJvcDogRnVuY3Rpb24sXG4gICAgcHJvcHM6IHtcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNoaWxkcmVuOiAnY2hpbGRyZW4nLFxuICAgICAgICAgIGxhYmVsOiAnbGFiZWwnLFxuICAgICAgICAgIGRpc2FibGVkOiAnZGlzYWJsZWQnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcbiAgICBsYXp5OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIGhpZ2hsaWdodEN1cnJlbnQ6IEJvb2xlYW4sXG4gICAgbG9hZDogRnVuY3Rpb24sXG4gICAgZmlsdGVyTm9kZU1ldGhvZDogRnVuY3Rpb24sXG4gICAgYWNjb3JkaW9uOiBCb29sZWFuLFxuICAgIGluZGVudDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMThcbiAgICB9LFxuICAgIGljb25DbGFzczogU3RyaW5nXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjaGlsZHJlbjoge1xuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHRyZWVJdGVtQXJyYXk6IGZ1bmN0aW9uIHRyZWVJdGVtQXJyYXkoKSB7XG4gICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy50cmVlSXRlbXMpO1xuICAgIH0sXG4gICAgaXNFbXB0eTogZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICAgIHZhciBjaGlsZE5vZGVzID0gdGhpcy5yb290LmNoaWxkTm9kZXM7XG5cbiAgICAgIHJldHVybiAhY2hpbGROb2RlcyB8fCBjaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCB8fCBjaGlsZE5vZGVzLmV2ZXJ5KGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciB2aXNpYmxlID0gX3JlZi52aXNpYmxlO1xuICAgICAgICByZXR1cm4gIXZpc2libGU7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBkZWZhdWx0Q2hlY2tlZEtleXM6IGZ1bmN0aW9uIGRlZmF1bHRDaGVja2VkS2V5cyhuZXdWYWwpIHtcbiAgICAgIHRoaXMuc3RvcmUuc2V0RGVmYXVsdENoZWNrZWRLZXkobmV3VmFsKTtcbiAgICB9LFxuICAgIGRlZmF1bHRFeHBhbmRlZEtleXM6IGZ1bmN0aW9uIGRlZmF1bHRFeHBhbmRlZEtleXMobmV3VmFsKSB7XG4gICAgICB0aGlzLnN0b3JlLmRlZmF1bHRFeHBhbmRlZEtleXMgPSBuZXdWYWw7XG4gICAgICB0aGlzLnN0b3JlLnNldERlZmF1bHRFeHBhbmRlZEtleXMobmV3VmFsKTtcbiAgICB9LFxuICAgIGRhdGE6IGZ1bmN0aW9uIGRhdGEobmV3VmFsKSB7XG4gICAgICB0aGlzLnN0b3JlLnNldERhdGEobmV3VmFsKTtcbiAgICB9LFxuICAgIGNoZWNrYm94SXRlbXM6IGZ1bmN0aW9uIGNoZWNrYm94SXRlbXModmFsKSB7XG4gICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHZhbCwgZnVuY3Rpb24gKGNoZWNrYm94KSB7XG4gICAgICAgIGNoZWNrYm94LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAtMSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNoZWNrU3RyaWN0bHk6IGZ1bmN0aW9uIGNoZWNrU3RyaWN0bHkobmV3VmFsKSB7XG4gICAgICB0aGlzLnN0b3JlLmNoZWNrU3RyaWN0bHkgPSBuZXdWYWw7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcih2YWx1ZSkge1xuICAgICAgaWYgKCF0aGlzLmZpbHRlck5vZGVNZXRob2QpIHRocm93IG5ldyBFcnJvcignW1RyZWVdIGZpbHRlck5vZGVNZXRob2QgaXMgcmVxdWlyZWQgd2hlbiBmaWx0ZXInKTtcbiAgICAgIHRoaXMuc3RvcmUuZmlsdGVyKHZhbHVlKTtcbiAgICB9LFxuICAgIGdldE5vZGVLZXk6IGZ1bmN0aW9uIGdldE5vZGVLZXkobm9kZSkge1xuICAgICAgcmV0dXJuIHV0aWxfZ2V0Tm9kZUtleSh0aGlzLm5vZGVLZXksIG5vZGUuZGF0YSk7XG4gICAgfSxcbiAgICBnZXROb2RlUGF0aDogZnVuY3Rpb24gZ2V0Tm9kZVBhdGgoZGF0YSkge1xuICAgICAgaWYgKCF0aGlzLm5vZGVLZXkpIHRocm93IG5ldyBFcnJvcignW1RyZWVdIG5vZGVLZXkgaXMgcmVxdWlyZWQgaW4gZ2V0Tm9kZVBhdGgnKTtcbiAgICAgIHZhciBub2RlID0gdGhpcy5zdG9yZS5nZXROb2RlKGRhdGEpO1xuICAgICAgaWYgKCFub2RlKSByZXR1cm4gW107XG4gICAgICB2YXIgcGF0aCA9IFtub2RlLmRhdGFdO1xuICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50O1xuICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQgIT09IHRoaXMucm9vdCkge1xuICAgICAgICBwYXRoLnB1c2gocGFyZW50LmRhdGEpO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGgucmV2ZXJzZSgpO1xuICAgIH0sXG4gICAgZ2V0Q2hlY2tlZE5vZGVzOiBmdW5jdGlvbiBnZXRDaGVja2VkTm9kZXMobGVhZk9ubHksIGluY2x1ZGVIYWxmQ2hlY2tlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2hlY2tlZE5vZGVzKGxlYWZPbmx5LCBpbmNsdWRlSGFsZkNoZWNrZWQpO1xuICAgIH0sXG4gICAgZ2V0Q2hlY2tlZEtleXM6IGZ1bmN0aW9uIGdldENoZWNrZWRLZXlzKGxlYWZPbmx5KSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDaGVja2VkS2V5cyhsZWFmT25seSk7XG4gICAgfSxcbiAgICBnZXRDdXJyZW50Tm9kZTogZnVuY3Rpb24gZ2V0Q3VycmVudE5vZGUoKSB7XG4gICAgICB2YXIgY3VycmVudE5vZGUgPSB0aGlzLnN0b3JlLmdldEN1cnJlbnROb2RlKCk7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGUgPyBjdXJyZW50Tm9kZS5kYXRhIDogbnVsbDtcbiAgICB9LFxuICAgIGdldEN1cnJlbnRLZXk6IGZ1bmN0aW9uIGdldEN1cnJlbnRLZXkoKSB7XG4gICAgICBpZiAoIXRoaXMubm9kZUtleSkgdGhyb3cgbmV3IEVycm9yKCdbVHJlZV0gbm9kZUtleSBpcyByZXF1aXJlZCBpbiBnZXRDdXJyZW50S2V5Jyk7XG4gICAgICB2YXIgY3VycmVudE5vZGUgPSB0aGlzLmdldEN1cnJlbnROb2RlKCk7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGUgPyBjdXJyZW50Tm9kZVt0aGlzLm5vZGVLZXldIDogbnVsbDtcbiAgICB9LFxuICAgIHNldENoZWNrZWROb2RlczogZnVuY3Rpb24gc2V0Q2hlY2tlZE5vZGVzKG5vZGVzLCBsZWFmT25seSkge1xuICAgICAgaWYgKCF0aGlzLm5vZGVLZXkpIHRocm93IG5ldyBFcnJvcignW1RyZWVdIG5vZGVLZXkgaXMgcmVxdWlyZWQgaW4gc2V0Q2hlY2tlZE5vZGVzJyk7XG4gICAgICB0aGlzLnN0b3JlLnNldENoZWNrZWROb2Rlcyhub2RlcywgbGVhZk9ubHkpO1xuICAgIH0sXG4gICAgc2V0Q2hlY2tlZEtleXM6IGZ1bmN0aW9uIHNldENoZWNrZWRLZXlzKGtleXMsIGxlYWZPbmx5KSB7XG4gICAgICBpZiAoIXRoaXMubm9kZUtleSkgdGhyb3cgbmV3IEVycm9yKCdbVHJlZV0gbm9kZUtleSBpcyByZXF1aXJlZCBpbiBzZXRDaGVja2VkS2V5cycpO1xuICAgICAgdGhpcy5zdG9yZS5zZXRDaGVja2VkS2V5cyhrZXlzLCBsZWFmT25seSk7XG4gICAgfSxcbiAgICBzZXRDaGVja2VkOiBmdW5jdGlvbiBzZXRDaGVja2VkKGRhdGEsIGNoZWNrZWQsIGRlZXApIHtcbiAgICAgIHRoaXMuc3RvcmUuc2V0Q2hlY2tlZChkYXRhLCBjaGVja2VkLCBkZWVwKTtcbiAgICB9LFxuICAgIGdldEhhbGZDaGVja2VkTm9kZXM6IGZ1bmN0aW9uIGdldEhhbGZDaGVja2VkTm9kZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRIYWxmQ2hlY2tlZE5vZGVzKCk7XG4gICAgfSxcbiAgICBnZXRIYWxmQ2hlY2tlZEtleXM6IGZ1bmN0aW9uIGdldEhhbGZDaGVja2VkS2V5cygpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEhhbGZDaGVja2VkS2V5cygpO1xuICAgIH0sXG4gICAgc2V0Q3VycmVudE5vZGU6IGZ1bmN0aW9uIHNldEN1cnJlbnROb2RlKG5vZGUpIHtcbiAgICAgIGlmICghdGhpcy5ub2RlS2V5KSB0aHJvdyBuZXcgRXJyb3IoJ1tUcmVlXSBub2RlS2V5IGlzIHJlcXVpcmVkIGluIHNldEN1cnJlbnROb2RlJyk7XG4gICAgICB0aGlzLnN0b3JlLnNldFVzZXJDdXJyZW50Tm9kZShub2RlKTtcbiAgICB9LFxuICAgIHNldEN1cnJlbnRLZXk6IGZ1bmN0aW9uIHNldEN1cnJlbnRLZXkoa2V5KSB7XG4gICAgICBpZiAoIXRoaXMubm9kZUtleSkgdGhyb3cgbmV3IEVycm9yKCdbVHJlZV0gbm9kZUtleSBpcyByZXF1aXJlZCBpbiBzZXRDdXJyZW50S2V5Jyk7XG4gICAgICB0aGlzLnN0b3JlLnNldEN1cnJlbnROb2RlS2V5KGtleSk7XG4gICAgfSxcbiAgICBnZXROb2RlOiBmdW5jdGlvbiBnZXROb2RlKGRhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldE5vZGUoZGF0YSk7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShkYXRhKSB7XG4gICAgICB0aGlzLnN0b3JlLnJlbW92ZShkYXRhKTtcbiAgICB9LFxuICAgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKGRhdGEsIHBhcmVudE5vZGUpIHtcbiAgICAgIHRoaXMuc3RvcmUuYXBwZW5kKGRhdGEsIHBhcmVudE5vZGUpO1xuICAgIH0sXG4gICAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbiBpbnNlcnRCZWZvcmUoZGF0YSwgcmVmTm9kZSkge1xuICAgICAgdGhpcy5zdG9yZS5pbnNlcnRCZWZvcmUoZGF0YSwgcmVmTm9kZSk7XG4gICAgfSxcbiAgICBpbnNlcnRBZnRlcjogZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIoZGF0YSwgcmVmTm9kZSkge1xuICAgICAgdGhpcy5zdG9yZS5pbnNlcnRBZnRlcihkYXRhLCByZWZOb2RlKTtcbiAgICB9LFxuICAgIGhhbmRsZU5vZGVFeHBhbmQ6IGZ1bmN0aW9uIGhhbmRsZU5vZGVFeHBhbmQobm9kZURhdGEsIG5vZGUsIGluc3RhbmNlKSB7XG4gICAgICB0aGlzLmJyb2FkY2FzdCgnRWxUcmVlTm9kZScsICd0cmVlLW5vZGUtZXhwYW5kJywgbm9kZSk7XG4gICAgICB0aGlzLiRlbWl0KCdub2RlLWV4cGFuZCcsIG5vZGVEYXRhLCBub2RlLCBpbnN0YW5jZSk7XG4gICAgfSxcbiAgICB1cGRhdGVLZXlDaGlsZHJlbjogZnVuY3Rpb24gdXBkYXRlS2V5Q2hpbGRyZW4oa2V5LCBkYXRhKSB7XG4gICAgICBpZiAoIXRoaXMubm9kZUtleSkgdGhyb3cgbmV3IEVycm9yKCdbVHJlZV0gbm9kZUtleSBpcyByZXF1aXJlZCBpbiB1cGRhdGVLZXlDaGlsZCcpO1xuICAgICAgdGhpcy5zdG9yZS51cGRhdGVDaGlsZHJlbihrZXksIGRhdGEpO1xuICAgIH0sXG4gICAgaW5pdFRhYkluZGV4OiBmdW5jdGlvbiBpbml0VGFiSW5kZXgoKSB7XG4gICAgICB0aGlzLnRyZWVJdGVtcyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5pcy1mb2N1c2FibGVbcm9sZT10cmVlaXRlbV0nKTtcbiAgICAgIHRoaXMuY2hlY2tib3hJdGVtcyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9Y2hlY2tib3hdJyk7XG4gICAgICB2YXIgY2hlY2tlZEl0ZW0gPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCcuaXMtY2hlY2tlZFtyb2xlPXRyZWVpdGVtXScpO1xuICAgICAgaWYgKGNoZWNrZWRJdGVtLmxlbmd0aCkge1xuICAgICAgICBjaGVja2VkSXRlbVswXS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMudHJlZUl0ZW1zWzBdICYmIHRoaXMudHJlZUl0ZW1zWzBdLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAwKTtcbiAgICB9LFxuICAgIGhhbmRsZUtleWRvd246IGZ1bmN0aW9uIGhhbmRsZUtleWRvd24oZXYpIHtcbiAgICAgIHZhciBjdXJyZW50SXRlbSA9IGV2LnRhcmdldDtcbiAgICAgIGlmIChjdXJyZW50SXRlbS5jbGFzc05hbWUuaW5kZXhPZignZWwtdHJlZS1ub2RlJykgPT09IC0xKSByZXR1cm47XG4gICAgICB2YXIga2V5Q29kZSA9IGV2LmtleUNvZGU7XG4gICAgICB0aGlzLnRyZWVJdGVtcyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5pcy1mb2N1c2FibGVbcm9sZT10cmVlaXRlbV0nKTtcbiAgICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLnRyZWVJdGVtQXJyYXkuaW5kZXhPZihjdXJyZW50SXRlbSk7XG4gICAgICB2YXIgbmV4dEluZGV4ID0gdm9pZCAwO1xuICAgICAgaWYgKFszOCwgNDBdLmluZGV4T2Yoa2V5Q29kZSkgPiAtMSkge1xuICAgICAgICAvLyB1cOOAgWRvd25cbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGtleUNvZGUgPT09IDM4KSB7XG4gICAgICAgICAgLy8gdXBcbiAgICAgICAgICBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggIT09IDAgPyBjdXJyZW50SW5kZXggLSAxIDogMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggPCB0aGlzLnRyZWVJdGVtQXJyYXkubGVuZ3RoIC0gMSA/IGN1cnJlbnRJbmRleCArIDEgOiAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHJlZUl0ZW1BcnJheVtuZXh0SW5kZXhdLmZvY3VzKCk7IC8vIOmAieS4rVxuICAgICAgfVxuICAgICAgaWYgKFszNywgMzldLmluZGV4T2Yoa2V5Q29kZSkgPiAtMSkge1xuICAgICAgICAvLyBsZWZ044CBcmlnaHQg5bGV5byAXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGN1cnJlbnRJdGVtLmNsaWNrKCk7IC8vIOmAieS4rVxuICAgICAgfVxuICAgICAgdmFyIGhhc0lucHV0ID0gY3VycmVudEl0ZW0ucXVlcnlTZWxlY3RvcignW3R5cGU9XCJjaGVja2JveFwiXScpO1xuICAgICAgaWYgKFsxMywgMzJdLmluZGV4T2Yoa2V5Q29kZSkgPiAtMSAmJiBoYXNJbnB1dCkge1xuICAgICAgICAvLyBzcGFjZSBlbnRlcumAieS4rWNoZWNrYm94XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGhhc0lucHV0LmNsaWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuaXNUcmVlID0gdHJ1ZTtcblxuICAgIHRoaXMuc3RvcmUgPSBuZXcgdHJlZV9zdG9yZSh7XG4gICAgICBrZXk6IHRoaXMubm9kZUtleSxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgIGxhenk6IHRoaXMubGF6eSxcbiAgICAgIHByb3BzOiB0aGlzLnByb3BzLFxuICAgICAgbG9hZDogdGhpcy5sb2FkLFxuICAgICAgY3VycmVudE5vZGVLZXk6IHRoaXMuY3VycmVudE5vZGVLZXksXG4gICAgICBjaGVja1N0cmljdGx5OiB0aGlzLmNoZWNrU3RyaWN0bHksXG4gICAgICBjaGVja0Rlc2NlbmRhbnRzOiB0aGlzLmNoZWNrRGVzY2VuZGFudHMsXG4gICAgICBkZWZhdWx0Q2hlY2tlZEtleXM6IHRoaXMuZGVmYXVsdENoZWNrZWRLZXlzLFxuICAgICAgZGVmYXVsdEV4cGFuZGVkS2V5czogdGhpcy5kZWZhdWx0RXhwYW5kZWRLZXlzLFxuICAgICAgYXV0b0V4cGFuZFBhcmVudDogdGhpcy5hdXRvRXhwYW5kUGFyZW50LFxuICAgICAgZGVmYXVsdEV4cGFuZEFsbDogdGhpcy5kZWZhdWx0RXhwYW5kQWxsLFxuICAgICAgZmlsdGVyTm9kZU1ldGhvZDogdGhpcy5maWx0ZXJOb2RlTWV0aG9kXG4gICAgfSk7XG5cbiAgICB0aGlzLnJvb3QgPSB0aGlzLnN0b3JlLnJvb3Q7XG5cbiAgICB2YXIgZHJhZ1N0YXRlID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgdGhpcy4kb24oJ3RyZWUtbm9kZS1kcmFnLXN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50LCB0cmVlTm9kZSkge1xuICAgICAgaWYgKHR5cGVvZiBfdGhpcy5hbGxvd0RyYWcgPT09ICdmdW5jdGlvbicgJiYgIV90aGlzLmFsbG93RHJhZyh0cmVlTm9kZS5ub2RlKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJztcblxuICAgICAgLy8gd3JhcCBpbiB0cnkgY2F0Y2ggdG8gYWRkcmVzcyBJRSdzIGVycm9yIHdoZW4gZmlyc3QgcGFyYW0gaXMgJ3RleHQvcGxhaW4nXG4gICAgICB0cnkge1xuICAgICAgICAvLyBzZXREYXRhIGlzIHJlcXVpcmVkIGZvciBkcmFnZ2FibGUgdG8gd29yayBpbiBGaXJlRm94XG4gICAgICAgIC8vIHRoZSBjb250ZW50IGhhcyB0byBiZSAnJyBzbyBkcmFnZ2luZyBhIG5vZGUgb3V0IG9mIHRoZSB0cmVlIHdvbid0IG9wZW4gYSBuZXcgdGFiIGluIEZpcmVGb3hcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCAnJyk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgZHJhZ1N0YXRlLmRyYWdnaW5nTm9kZSA9IHRyZWVOb2RlO1xuICAgICAgX3RoaXMuJGVtaXQoJ25vZGUtZHJhZy1zdGFydCcsIHRyZWVOb2RlLm5vZGUsIGV2ZW50KTtcbiAgICB9KTtcblxuICAgIHRoaXMuJG9uKCd0cmVlLW5vZGUtZHJhZy1vdmVyJywgZnVuY3Rpb24gKGV2ZW50LCB0cmVlTm9kZSkge1xuICAgICAgdmFyIGRyb3BOb2RlID0gZmluZE5lYXJlc3RDb21wb25lbnQoZXZlbnQudGFyZ2V0LCAnRWxUcmVlTm9kZScpO1xuICAgICAgdmFyIG9sZERyb3BOb2RlID0gZHJhZ1N0YXRlLmRyb3BOb2RlO1xuICAgICAgaWYgKG9sZERyb3BOb2RlICYmIG9sZERyb3BOb2RlICE9PSBkcm9wTm9kZSkge1xuICAgICAgICBPYmplY3QoZG9tX1tcInJlbW92ZUNsYXNzXCJdKShvbGREcm9wTm9kZS4kZWwsICdpcy1kcm9wLWlubmVyJyk7XG4gICAgICB9XG4gICAgICB2YXIgZHJhZ2dpbmdOb2RlID0gZHJhZ1N0YXRlLmRyYWdnaW5nTm9kZTtcbiAgICAgIGlmICghZHJhZ2dpbmdOb2RlIHx8ICFkcm9wTm9kZSkgcmV0dXJuO1xuXG4gICAgICB2YXIgZHJvcFByZXYgPSB0cnVlO1xuICAgICAgdmFyIGRyb3BJbm5lciA9IHRydWU7XG4gICAgICB2YXIgZHJvcE5leHQgPSB0cnVlO1xuICAgICAgdmFyIHVzZXJBbGxvd0Ryb3BJbm5lciA9IHRydWU7XG4gICAgICBpZiAodHlwZW9mIF90aGlzLmFsbG93RHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkcm9wUHJldiA9IF90aGlzLmFsbG93RHJvcChkcmFnZ2luZ05vZGUubm9kZSwgZHJvcE5vZGUubm9kZSwgJ3ByZXYnKTtcbiAgICAgICAgdXNlckFsbG93RHJvcElubmVyID0gZHJvcElubmVyID0gX3RoaXMuYWxsb3dEcm9wKGRyYWdnaW5nTm9kZS5ub2RlLCBkcm9wTm9kZS5ub2RlLCAnaW5uZXInKTtcbiAgICAgICAgZHJvcE5leHQgPSBfdGhpcy5hbGxvd0Ryb3AoZHJhZ2dpbmdOb2RlLm5vZGUsIGRyb3BOb2RlLm5vZGUsICduZXh0Jyk7XG4gICAgICB9XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IGRyb3BJbm5lciA/ICdtb3ZlJyA6ICdub25lJztcbiAgICAgIGlmICgoZHJvcFByZXYgfHwgZHJvcElubmVyIHx8IGRyb3BOZXh0KSAmJiBvbGREcm9wTm9kZSAhPT0gZHJvcE5vZGUpIHtcbiAgICAgICAgaWYgKG9sZERyb3BOb2RlKSB7XG4gICAgICAgICAgX3RoaXMuJGVtaXQoJ25vZGUtZHJhZy1sZWF2ZScsIGRyYWdnaW5nTm9kZS5ub2RlLCBvbGREcm9wTm9kZS5ub2RlLCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMuJGVtaXQoJ25vZGUtZHJhZy1lbnRlcicsIGRyYWdnaW5nTm9kZS5ub2RlLCBkcm9wTm9kZS5ub2RlLCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkcm9wUHJldiB8fCBkcm9wSW5uZXIgfHwgZHJvcE5leHQpIHtcbiAgICAgICAgZHJhZ1N0YXRlLmRyb3BOb2RlID0gZHJvcE5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkcm9wTm9kZS5ub2RlLm5leHRTaWJsaW5nID09PSBkcmFnZ2luZ05vZGUubm9kZSkge1xuICAgICAgICBkcm9wTmV4dCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGRyb3BOb2RlLm5vZGUucHJldmlvdXNTaWJsaW5nID09PSBkcmFnZ2luZ05vZGUubm9kZSkge1xuICAgICAgICBkcm9wUHJldiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGRyb3BOb2RlLm5vZGUuY29udGFpbnMoZHJhZ2dpbmdOb2RlLm5vZGUsIGZhbHNlKSkge1xuICAgICAgICBkcm9wSW5uZXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChkcmFnZ2luZ05vZGUubm9kZSA9PT0gZHJvcE5vZGUubm9kZSB8fCBkcmFnZ2luZ05vZGUubm9kZS5jb250YWlucyhkcm9wTm9kZS5ub2RlKSkge1xuICAgICAgICBkcm9wUHJldiA9IGZhbHNlO1xuICAgICAgICBkcm9wSW5uZXIgPSBmYWxzZTtcbiAgICAgICAgZHJvcE5leHQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRhcmdldFBvc2l0aW9uID0gZHJvcE5vZGUuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHRyZWVQb3NpdGlvbiA9IF90aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgdmFyIGRyb3BUeXBlID0gdm9pZCAwO1xuICAgICAgdmFyIHByZXZQZXJjZW50ID0gZHJvcFByZXYgPyBkcm9wSW5uZXIgPyAwLjI1IDogZHJvcE5leHQgPyAwLjQ1IDogMSA6IC0xO1xuICAgICAgdmFyIG5leHRQZXJjZW50ID0gZHJvcE5leHQgPyBkcm9wSW5uZXIgPyAwLjc1IDogZHJvcFByZXYgPyAwLjU1IDogMCA6IDE7XG5cbiAgICAgIHZhciBpbmRpY2F0b3JUb3AgPSAtOTk5OTtcbiAgICAgIHZhciBkaXN0YW5jZSA9IGV2ZW50LmNsaWVudFkgLSB0YXJnZXRQb3NpdGlvbi50b3A7XG4gICAgICBpZiAoZGlzdGFuY2UgPCB0YXJnZXRQb3NpdGlvbi5oZWlnaHQgKiBwcmV2UGVyY2VudCkge1xuICAgICAgICBkcm9wVHlwZSA9ICdiZWZvcmUnO1xuICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA+IHRhcmdldFBvc2l0aW9uLmhlaWdodCAqIG5leHRQZXJjZW50KSB7XG4gICAgICAgIGRyb3BUeXBlID0gJ2FmdGVyJztcbiAgICAgIH0gZWxzZSBpZiAoZHJvcElubmVyKSB7XG4gICAgICAgIGRyb3BUeXBlID0gJ2lubmVyJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyb3BUeXBlID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICB2YXIgaWNvblBvc2l0aW9uID0gZHJvcE5vZGUuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC10cmVlLW5vZGVfX2V4cGFuZC1pY29uJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB2YXIgZHJvcEluZGljYXRvciA9IF90aGlzLiRyZWZzLmRyb3BJbmRpY2F0b3I7XG4gICAgICBpZiAoZHJvcFR5cGUgPT09ICdiZWZvcmUnKSB7XG4gICAgICAgIGluZGljYXRvclRvcCA9IGljb25Qb3NpdGlvbi50b3AgLSB0cmVlUG9zaXRpb24udG9wO1xuICAgICAgfSBlbHNlIGlmIChkcm9wVHlwZSA9PT0gJ2FmdGVyJykge1xuICAgICAgICBpbmRpY2F0b3JUb3AgPSBpY29uUG9zaXRpb24uYm90dG9tIC0gdHJlZVBvc2l0aW9uLnRvcDtcbiAgICAgIH1cbiAgICAgIGRyb3BJbmRpY2F0b3Iuc3R5bGUudG9wID0gaW5kaWNhdG9yVG9wICsgJ3B4JztcbiAgICAgIGRyb3BJbmRpY2F0b3Iuc3R5bGUubGVmdCA9IGljb25Qb3NpdGlvbi5yaWdodCAtIHRyZWVQb3NpdGlvbi5sZWZ0ICsgJ3B4JztcblxuICAgICAgaWYgKGRyb3BUeXBlID09PSAnaW5uZXInKSB7XG4gICAgICAgIE9iamVjdChkb21fW1wiYWRkQ2xhc3NcIl0pKGRyb3BOb2RlLiRlbCwgJ2lzLWRyb3AtaW5uZXInKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdChkb21fW1wicmVtb3ZlQ2xhc3NcIl0pKGRyb3BOb2RlLiRlbCwgJ2lzLWRyb3AtaW5uZXInKTtcbiAgICAgIH1cblxuICAgICAgZHJhZ1N0YXRlLnNob3dEcm9wSW5kaWNhdG9yID0gZHJvcFR5cGUgPT09ICdiZWZvcmUnIHx8IGRyb3BUeXBlID09PSAnYWZ0ZXInO1xuICAgICAgZHJhZ1N0YXRlLmFsbG93RHJvcCA9IGRyYWdTdGF0ZS5zaG93RHJvcEluZGljYXRvciB8fCB1c2VyQWxsb3dEcm9wSW5uZXI7XG4gICAgICBkcmFnU3RhdGUuZHJvcFR5cGUgPSBkcm9wVHlwZTtcbiAgICAgIF90aGlzLiRlbWl0KCdub2RlLWRyYWctb3ZlcicsIGRyYWdnaW5nTm9kZS5ub2RlLCBkcm9wTm9kZS5ub2RlLCBldmVudCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRvbigndHJlZS1ub2RlLWRyYWctZW5kJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgZHJhZ2dpbmdOb2RlID0gZHJhZ1N0YXRlLmRyYWdnaW5nTm9kZSxcbiAgICAgICAgICBkcm9wVHlwZSA9IGRyYWdTdGF0ZS5kcm9wVHlwZSxcbiAgICAgICAgICBkcm9wTm9kZSA9IGRyYWdTdGF0ZS5kcm9wTm9kZTtcblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xuXG4gICAgICBpZiAoZHJhZ2dpbmdOb2RlICYmIGRyb3BOb2RlKSB7XG4gICAgICAgIHZhciBkcmFnZ2luZ05vZGVDb3B5ID0geyBkYXRhOiBkcmFnZ2luZ05vZGUubm9kZS5kYXRhIH07XG4gICAgICAgIGlmIChkcm9wVHlwZSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgZHJhZ2dpbmdOb2RlLm5vZGUucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRyb3BUeXBlID09PSAnYmVmb3JlJykge1xuICAgICAgICAgIGRyb3BOb2RlLm5vZGUucGFyZW50Lmluc2VydEJlZm9yZShkcmFnZ2luZ05vZGVDb3B5LCBkcm9wTm9kZS5ub2RlKTtcbiAgICAgICAgfSBlbHNlIGlmIChkcm9wVHlwZSA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgIGRyb3BOb2RlLm5vZGUucGFyZW50Lmluc2VydEFmdGVyKGRyYWdnaW5nTm9kZUNvcHksIGRyb3BOb2RlLm5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGRyb3BUeXBlID09PSAnaW5uZXInKSB7XG4gICAgICAgICAgZHJvcE5vZGUubm9kZS5pbnNlcnRDaGlsZChkcmFnZ2luZ05vZGVDb3B5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHJvcFR5cGUgIT09ICdub25lJykge1xuICAgICAgICAgIF90aGlzLnN0b3JlLnJlZ2lzdGVyTm9kZShkcmFnZ2luZ05vZGVDb3B5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdChkb21fW1wicmVtb3ZlQ2xhc3NcIl0pKGRyb3BOb2RlLiRlbCwgJ2lzLWRyb3AtaW5uZXInKTtcblxuICAgICAgICBfdGhpcy4kZW1pdCgnbm9kZS1kcmFnLWVuZCcsIGRyYWdnaW5nTm9kZS5ub2RlLCBkcm9wTm9kZS5ub2RlLCBkcm9wVHlwZSwgZXZlbnQpO1xuICAgICAgICBpZiAoZHJvcFR5cGUgIT09ICdub25lJykge1xuICAgICAgICAgIF90aGlzLiRlbWl0KCdub2RlLWRyb3AnLCBkcmFnZ2luZ05vZGUubm9kZSwgZHJvcE5vZGUubm9kZSwgZHJvcFR5cGUsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRyYWdnaW5nTm9kZSAmJiAhZHJvcE5vZGUpIHtcbiAgICAgICAgX3RoaXMuJGVtaXQoJ25vZGUtZHJhZy1lbmQnLCBkcmFnZ2luZ05vZGUubm9kZSwgbnVsbCwgZHJvcFR5cGUsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgZHJhZ1N0YXRlLnNob3dEcm9wSW5kaWNhdG9yID0gZmFsc2U7XG4gICAgICBkcmFnU3RhdGUuZHJhZ2dpbmdOb2RlID0gbnVsbDtcbiAgICAgIGRyYWdTdGF0ZS5kcm9wTm9kZSA9IG51bGw7XG4gICAgICBkcmFnU3RhdGUuYWxsb3dEcm9wID0gdHJ1ZTtcbiAgICB9KTtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB0aGlzLmluaXRUYWJJbmRleCgpO1xuICAgIHRoaXMuJGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleWRvd24pO1xuICB9LFxuICB1cGRhdGVkOiBmdW5jdGlvbiB1cGRhdGVkKCkge1xuICAgIHRoaXMudHJlZUl0ZW1zID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9dHJlZWl0ZW1dJyk7XG4gICAgdGhpcy5jaGVja2JveEl0ZW1zID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1jaGVja2JveF0nKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyZWUvc3JjL3RyZWUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY190cmVldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHRyZWV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJlZS9zcmMvdHJlZS52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciB0cmVlX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX3RyZWV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHRyZWV2dWVfdHlwZV90ZW1wbGF0ZV9pZF81NDc1NzVhNl9yZW5kZXIsXG4gIHRyZWV2dWVfdHlwZV90ZW1wbGF0ZV9pZF81NDc1NzVhNl9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHRyZWVfYXBpOyB9XG50cmVlX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvdHJlZS9zcmMvdHJlZS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3RyZWUgPSAodHJlZV9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyZWUvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuc3JjX3RyZWUuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChzcmNfdHJlZS5uYW1lLCBzcmNfdHJlZSk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc190cmVlID0gKHNyY190cmVlKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYWxlcnQvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZlNTMzNDFiJlxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82ZTUzMzQxYl9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJ0cmFuc2l0aW9uXCIsIHsgYXR0cnM6IHsgbmFtZTogXCJlbC1hbGVydC1mYWRlXCIgfSB9LCBbXG4gICAgX2MoXG4gICAgICBcImRpdlwiLFxuICAgICAge1xuICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgdmFsdWU6IF92bS52aXNpYmxlLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJ2aXNpYmxlXCJcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWFsZXJ0XCIsXG4gICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgX3ZtLnR5cGVDbGFzcyxcbiAgICAgICAgICBfdm0uY2VudGVyID8gXCJpcy1jZW50ZXJcIiA6IFwiXCIsXG4gICAgICAgICAgXCJpcy1cIiArIF92bS5lZmZlY3RcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IHsgcm9sZTogXCJhbGVydFwiIH1cbiAgICAgIH0sXG4gICAgICBbXG4gICAgICAgIF92bS5zaG93SWNvblxuICAgICAgICAgID8gX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtYWxlcnRfX2ljb25cIixcbiAgICAgICAgICAgICAgY2xhc3M6IFtfdm0uaWNvbkNsYXNzLCBfdm0uaXNCaWdJY29uXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWFsZXJ0X19jb250ZW50XCIgfSwgW1xuICAgICAgICAgIF92bS50aXRsZSB8fCBfdm0uJHNsb3RzLnRpdGxlXG4gICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtYWxlcnRfX3RpdGxlXCIsIGNsYXNzOiBbX3ZtLmlzQm9sZFRpdGxlXSB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3QoXCJ0aXRsZVwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXSxcbiAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgX3ZtLiRzbG90cy5kZWZhdWx0ICYmICFfdm0uZGVzY3JpcHRpb25cbiAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgXCJwXCIsXG4gICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1hbGVydF9fZGVzY3JpcHRpb25cIiB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgX3ZtLmRlc2NyaXB0aW9uICYmICFfdm0uJHNsb3RzLmRlZmF1bHRcbiAgICAgICAgICAgID8gX2MoXCJwXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtYWxlcnRfX2Rlc2NyaXB0aW9uXCIgfSwgW1xuICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLmRlc2NyaXB0aW9uKSlcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImlcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uY2xvc2FibGUsXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImNsb3NhYmxlXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWFsZXJ0X19jbG9zZWJ0blwiLFxuICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgIFwiaXMtY3VzdG9tZWRcIjogX3ZtLmNsb3NlVGV4dCAhPT0gXCJcIixcbiAgICAgICAgICAgICAgICBcImVsLWljb24tY2xvc2VcIjogX3ZtLmNsb3NlVGV4dCA9PT0gXCJcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIF92bS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLmNsb3NlVGV4dCkpXVxuICAgICAgICAgIClcbiAgICAgICAgXSlcbiAgICAgIF1cbiAgICApXG4gIF0pXG59XG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZlNTMzNDFiX3N0YXRpY1JlbmRlckZucyA9IFtdXG5tYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNmU1MzM0MWJfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9hbGVydC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NmU1MzM0MWImXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2FsZXJ0L3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxudmFyIFRZUEVfQ0xBU1NFU19NQVAgPSB7XG4gICdzdWNjZXNzJzogJ2VsLWljb24tc3VjY2VzcycsXG4gICd3YXJuaW5nJzogJ2VsLWljb24td2FybmluZycsXG4gICdlcnJvcic6ICdlbC1pY29uLWVycm9yJ1xufTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGFsZXJ0X3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsQWxlcnQnLFxuXG4gIHByb3BzOiB7XG4gICAgdGl0bGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBkZXNjcmlwdGlvbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIHR5cGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdpbmZvJ1xuICAgIH0sXG4gICAgY2xvc2FibGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjbG9zZVRleHQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBzaG93SWNvbjogQm9vbGVhbixcbiAgICBjZW50ZXI6IEJvb2xlYW4sXG4gICAgZWZmZWN0OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnbGlnaHQnLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFsnbGlnaHQnLCAnZGFyayddLmluZGV4T2YodmFsdWUpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgIH07XG4gIH0sXG5cblxuICBtZXRob2RzOiB7XG4gICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLiRlbWl0KCdjbG9zZScpO1xuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHR5cGVDbGFzczogZnVuY3Rpb24gdHlwZUNsYXNzKCkge1xuICAgICAgcmV0dXJuICdlbC1hbGVydC0tJyArIHRoaXMudHlwZTtcbiAgICB9LFxuICAgIGljb25DbGFzczogZnVuY3Rpb24gaWNvbkNsYXNzKCkge1xuICAgICAgcmV0dXJuIFRZUEVfQ0xBU1NFU19NQVBbdGhpcy50eXBlXSB8fCAnZWwtaWNvbi1pbmZvJztcbiAgICB9LFxuICAgIGlzQmlnSWNvbjogZnVuY3Rpb24gaXNCaWdJY29uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb24gfHwgdGhpcy4kc2xvdHMuZGVmYXVsdCA/ICdpcy1iaWcnIDogJyc7XG4gICAgfSxcbiAgICBpc0JvbGRUaXRsZTogZnVuY3Rpb24gaXNCb2xkVGl0bGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbiB8fCB0aGlzLiRzbG90cy5kZWZhdWx0ID8gJ2lzLWJvbGQnIDogJyc7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYWxlcnQvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2FsZXJ0X3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGFsZXJ0X3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2FsZXJ0L3NyYy9tYWluLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGFsZXJ0X3NyY19tYWluX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfYWxlcnRfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82ZTUzMzQxYl9yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82ZTUzMzQxYl9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGFsZXJ0X3NyY19tYWluX2FwaTsgfVxuYWxlcnRfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9hbGVydC9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYWxlcnRfc3JjX21haW4gPSAoYWxlcnRfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9hbGVydC9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5hbGVydF9zcmNfbWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KGFsZXJ0X3NyY19tYWluLm5hbWUsIGFsZXJ0X3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2FsZXJ0ID0gKGFsZXJ0X3NyY19tYWluKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbm90aWZpY2F0aW9uL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00M2RiYzNkOCZcbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNDNkYmMzZDhfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFwidHJhbnNpdGlvblwiLCB7IGF0dHJzOiB7IG5hbWU6IFwiZWwtbm90aWZpY2F0aW9uLWZhZGVcIiB9IH0sIFtcbiAgICBfYyhcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7XG4gICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICB2YWx1ZTogX3ZtLnZpc2libGUsXG4gICAgICAgICAgICBleHByZXNzaW9uOiBcInZpc2libGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgY2xhc3M6IFtcImVsLW5vdGlmaWNhdGlvblwiLCBfdm0uY3VzdG9tQ2xhc3MsIF92bS5ob3Jpem9udGFsQ2xhc3NdLFxuICAgICAgICBzdHlsZTogX3ZtLnBvc2l0aW9uU3R5bGUsXG4gICAgICAgIGF0dHJzOiB7IHJvbGU6IFwiYWxlcnRcIiB9LFxuICAgICAgICBvbjoge1xuICAgICAgICAgIG1vdXNlZW50ZXI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgX3ZtLmNsZWFyVGltZXIoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW91c2VsZWF2ZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICBfdm0uc3RhcnRUaW1lcigpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGljazogX3ZtLmNsaWNrXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbXG4gICAgICAgIF92bS50eXBlIHx8IF92bS5pY29uQ2xhc3NcbiAgICAgICAgICA/IF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLW5vdGlmaWNhdGlvbl9faWNvblwiLFxuICAgICAgICAgICAgICBjbGFzczogW192bS50eXBlQ2xhc3MsIF92bS5pY29uQ2xhc3NdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgIF9jKFxuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtbm90aWZpY2F0aW9uX19ncm91cFwiLFxuICAgICAgICAgICAgY2xhc3M6IHsgXCJpcy13aXRoLWljb25cIjogX3ZtLnR5cGVDbGFzcyB8fCBfdm0uaWNvbkNsYXNzIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIF9jKFwiaDJcIiwge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1ub3RpZmljYXRpb25fX3RpdGxlXCIsXG4gICAgICAgICAgICAgIGRvbVByb3BzOiB7IHRleHRDb250ZW50OiBfdm0uX3MoX3ZtLnRpdGxlKSB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcIm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtbm90aWZpY2F0aW9uX19jb250ZW50XCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIF92bS5fdChcImRlZmF1bHRcIiwgW1xuICAgICAgICAgICAgICAgICAgIV92bS5kYW5nZXJvdXNseVVzZUhUTUxTdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgPyBfYyhcInBcIiwgW192bS5fdihfdm0uX3MoX3ZtLm1lc3NhZ2UpKV0pXG4gICAgICAgICAgICAgICAgICAgIDogX2MoXCJwXCIsIHsgZG9tUHJvcHM6IHsgaW5uZXJIVE1MOiBfdm0uX3MoX3ZtLm1lc3NhZ2UpIH0gfSlcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgX3ZtLnNob3dDbG9zZVxuICAgICAgICAgICAgICA/IF9jKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLW5vdGlmaWNhdGlvbl9fY2xvc2VCdG4gZWwtaWNvbi1jbG9zZVwiLFxuICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uY2xvc2UoJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgIF1cbiAgICAgICAgKVxuICAgICAgXVxuICAgIClcbiAgXSlcbn1cbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNDNkYmMzZDhfc3RhdGljUmVuZGVyRm5zID0gW11cbm1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80M2RiYzNkOF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL25vdGlmaWNhdGlvbi9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDNkYmMzZDgmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL25vdGlmaWNhdGlvbi9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbnZhciBtYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfdHlwZU1hcCA9IHtcbiAgc3VjY2VzczogJ3N1Y2Nlc3MnLFxuICBpbmZvOiAnaW5mbycsXG4gIHdhcm5pbmc6ICd3YXJuaW5nJyxcbiAgZXJyb3I6ICdlcnJvcidcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG5vdGlmaWNhdGlvbl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgdGl0bGU6ICcnLFxuICAgICAgbWVzc2FnZTogJycsXG4gICAgICBkdXJhdGlvbjogNDUwMCxcbiAgICAgIHR5cGU6ICcnLFxuICAgICAgc2hvd0Nsb3NlOiB0cnVlLFxuICAgICAgY3VzdG9tQ2xhc3M6ICcnLFxuICAgICAgaWNvbkNsYXNzOiAnJyxcbiAgICAgIG9uQ2xvc2U6IG51bGwsXG4gICAgICBvbkNsaWNrOiBudWxsLFxuICAgICAgY2xvc2VkOiBmYWxzZSxcbiAgICAgIHZlcnRpY2FsT2Zmc2V0OiAwLFxuICAgICAgdGltZXI6IG51bGwsXG4gICAgICBkYW5nZXJvdXNseVVzZUhUTUxTdHJpbmc6IGZhbHNlLFxuICAgICAgcG9zaXRpb246ICd0b3AtcmlnaHQnXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdHlwZUNsYXNzOiBmdW5jdGlvbiB0eXBlQ2xhc3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlICYmIG1haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc190eXBlTWFwW3RoaXMudHlwZV0gPyAnZWwtaWNvbi0nICsgbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX3R5cGVNYXBbdGhpcy50eXBlXSA6ICcnO1xuICAgIH0sXG4gICAgaG9yaXpvbnRhbENsYXNzOiBmdW5jdGlvbiBob3Jpem9udGFsQ2xhc3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi5pbmRleE9mKCdyaWdodCcpID4gLTEgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgIH0sXG4gICAgdmVydGljYWxQcm9wZXJ0eTogZnVuY3Rpb24gdmVydGljYWxQcm9wZXJ0eSgpIHtcbiAgICAgIHJldHVybiAoL150b3AtLy50ZXN0KHRoaXMucG9zaXRpb24pID8gJ3RvcCcgOiAnYm90dG9tJ1xuICAgICAgKTtcbiAgICB9LFxuICAgIHBvc2l0aW9uU3R5bGU6IGZ1bmN0aW9uIHBvc2l0aW9uU3R5bGUoKSB7XG4gICAgICB2YXIgX3JlZjtcblxuICAgICAgcmV0dXJuIF9yZWYgPSB7fSwgX3JlZlt0aGlzLnZlcnRpY2FsUHJvcGVydHldID0gdGhpcy52ZXJ0aWNhbE9mZnNldCArICdweCcsIF9yZWY7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgY2xvc2VkOiBmdW5jdGlvbiBjbG9zZWQobmV3VmFsKSB7XG4gICAgICBpZiAobmV3VmFsKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLiRlbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgdGhpcy5kZXN0cm95RWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBkZXN0cm95RWxlbWVudDogZnVuY3Rpb24gZGVzdHJveUVsZW1lbnQoKSB7XG4gICAgICB0aGlzLiRlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgdGhpcy5kZXN0cm95RWxlbWVudCk7XG4gICAgICB0aGlzLiRkZXN0cm95KHRydWUpO1xuICAgICAgdGhpcy4kZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLiRlbCk7XG4gICAgfSxcbiAgICBjbGljazogZnVuY3Rpb24gY2xpY2soKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLm9uQ2xpY2soKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vbkNsb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMub25DbG9zZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xlYXJUaW1lcjogZnVuY3Rpb24gY2xlYXJUaW1lcigpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICB9LFxuICAgIHN0YXJ0VGltZXI6IGZ1bmN0aW9uIHN0YXJ0VGltZXIoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghX3RoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5kdXJhdGlvbik7XG4gICAgICB9XG4gICAgfSxcbiAgICBrZXlkb3duOiBmdW5jdGlvbiBrZXlkb3duKGUpIHtcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDQ2IHx8IGUua2V5Q29kZSA9PT0gOCkge1xuICAgICAgICB0aGlzLmNsZWFyVGltZXIoKTsgLy8gZGV0ZWxlIOWPlua2iOWAkuiuoeaXtlxuICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDI3KSB7XG4gICAgICAgIC8vIGVzY+WFs+mXrea2iOaBr1xuICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXJ0VGltZXIoKTsgLy8g5oGi5aSN5YCS6K6h5pe2XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuZHVyYXRpb24gPiAwKSB7XG4gICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMyLmNsb3NlZCkge1xuICAgICAgICAgIF90aGlzMi5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzLmR1cmF0aW9uKTtcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bik7XG4gIH0sXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bik7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9ub3RpZmljYXRpb24vc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX25vdGlmaWNhdGlvbl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChub3RpZmljYXRpb25fc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbm90aWZpY2F0aW9uL3NyYy9tYWluLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIG5vdGlmaWNhdGlvbl9zcmNfbWFpbl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhY2thZ2VzX25vdGlmaWNhdGlvbl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQzZGJjM2Q4X3JlbmRlcixcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQzZGJjM2Q4X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgbm90aWZpY2F0aW9uX3NyY19tYWluX2FwaTsgfVxubm90aWZpY2F0aW9uX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvbm90aWZpY2F0aW9uL3NyYy9tYWluLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBub3RpZmljYXRpb25fc3JjX21haW4gPSAobm90aWZpY2F0aW9uX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbm90aWZpY2F0aW9uL3NyYy9tYWluLmpzXG5cblxuXG5cblxudmFyIE5vdGlmaWNhdGlvbkNvbnN0cnVjdG9yID0gZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5leHRlbmQobm90aWZpY2F0aW9uX3NyY19tYWluKTtcblxudmFyIHNyY19tYWluX2luc3RhbmNlID0gdm9pZCAwO1xudmFyIGluc3RhbmNlcyA9IFtdO1xudmFyIHNlZWQgPSAxO1xuXG52YXIgbWFpbl9Ob3RpZmljYXRpb24gPSBmdW5jdGlvbiBOb3RpZmljYXRpb24ob3B0aW9ucykge1xuICBpZiAoZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5wcm90b3R5cGUuJGlzU2VydmVyKSByZXR1cm47XG4gIG9wdGlvbnMgPSBtZXJnZV9kZWZhdWx0KCkoe30sIG9wdGlvbnMpO1xuICB2YXIgdXNlck9uQ2xvc2UgPSBvcHRpb25zLm9uQ2xvc2U7XG4gIHZhciBpZCA9ICdub3RpZmljYXRpb25fJyArIHNlZWQrKztcbiAgdmFyIHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCAndG9wLXJpZ2h0JztcblxuICBvcHRpb25zLm9uQ2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgTm90aWZpY2F0aW9uLmNsb3NlKGlkLCB1c2VyT25DbG9zZSk7XG4gIH07XG5cbiAgc3JjX21haW5faW5zdGFuY2UgPSBuZXcgTm90aWZpY2F0aW9uQ29uc3RydWN0b3Ioe1xuICAgIGRhdGE6IG9wdGlvbnNcbiAgfSk7XG5cbiAgaWYgKE9iamVjdCh2ZG9tX1tcImlzVk5vZGVcIl0pKG9wdGlvbnMubWVzc2FnZSkpIHtcbiAgICBzcmNfbWFpbl9pbnN0YW5jZS4kc2xvdHMuZGVmYXVsdCA9IFtvcHRpb25zLm1lc3NhZ2VdO1xuICAgIG9wdGlvbnMubWVzc2FnZSA9ICdSRVBMQUNFRF9CWV9WTk9ERSc7XG4gIH1cbiAgc3JjX21haW5faW5zdGFuY2UuaWQgPSBpZDtcbiAgc3JjX21haW5faW5zdGFuY2UuJG1vdW50KCk7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3JjX21haW5faW5zdGFuY2UuJGVsKTtcbiAgc3JjX21haW5faW5zdGFuY2UudmlzaWJsZSA9IHRydWU7XG4gIHNyY19tYWluX2luc3RhbmNlLmRvbSA9IHNyY19tYWluX2luc3RhbmNlLiRlbDtcbiAgc3JjX21haW5faW5zdGFuY2UuZG9tLnN0eWxlLnpJbmRleCA9IHBvcHVwX1tcIlBvcHVwTWFuYWdlclwiXS5uZXh0WkluZGV4KCk7XG5cbiAgdmFyIHZlcnRpY2FsT2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQgfHwgMDtcbiAgaW5zdGFuY2VzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBpdGVtLnBvc2l0aW9uID09PSBwb3NpdGlvbjtcbiAgfSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZlcnRpY2FsT2Zmc2V0ICs9IGl0ZW0uJGVsLm9mZnNldEhlaWdodCArIDE2O1xuICB9KTtcbiAgdmVydGljYWxPZmZzZXQgKz0gMTY7XG4gIHNyY19tYWluX2luc3RhbmNlLnZlcnRpY2FsT2Zmc2V0ID0gdmVydGljYWxPZmZzZXQ7XG4gIGluc3RhbmNlcy5wdXNoKHNyY19tYWluX2luc3RhbmNlKTtcbiAgcmV0dXJuIHNyY19tYWluX2luc3RhbmNlO1xufTtcblxuWydzdWNjZXNzJywgJ3dhcm5pbmcnLCAnaW5mbycsICdlcnJvciddLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgbWFpbl9Ob3RpZmljYXRpb25bdHlwZV0gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgfHwgT2JqZWN0KHZkb21fW1wiaXNWTm9kZVwiXSkob3B0aW9ucykpIHtcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIG1lc3NhZ2U6IG9wdGlvbnNcbiAgICAgIH07XG4gICAgfVxuICAgIG9wdGlvbnMudHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIG1haW5fTm90aWZpY2F0aW9uKG9wdGlvbnMpO1xuICB9O1xufSk7XG5cbm1haW5fTm90aWZpY2F0aW9uLmNsb3NlID0gZnVuY3Rpb24gKGlkLCB1c2VyT25DbG9zZSkge1xuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIGxlbiA9IGluc3RhbmNlcy5sZW5ndGg7XG4gIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlcy5maWx0ZXIoZnVuY3Rpb24gKGluc3RhbmNlLCBpKSB7XG4gICAgaWYgKGluc3RhbmNlLmlkID09PSBpZCkge1xuICAgICAgaW5kZXggPSBpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSlbMF07XG4gIGlmICghaW5zdGFuY2UpIHJldHVybjtcblxuICBpZiAodHlwZW9mIHVzZXJPbkNsb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXNlck9uQ2xvc2UoaW5zdGFuY2UpO1xuICB9XG4gIGluc3RhbmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gIGlmIChsZW4gPD0gMSkgcmV0dXJuO1xuICB2YXIgcG9zaXRpb24gPSBpbnN0YW5jZS5wb3NpdGlvbjtcbiAgdmFyIHJlbW92ZWRIZWlnaHQgPSBpbnN0YW5jZS5kb20ub2Zmc2V0SGVpZ2h0O1xuICBmb3IgKHZhciBpID0gaW5kZXg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICBpZiAoaW5zdGFuY2VzW2ldLnBvc2l0aW9uID09PSBwb3NpdGlvbikge1xuICAgICAgaW5zdGFuY2VzW2ldLmRvbS5zdHlsZVtpbnN0YW5jZS52ZXJ0aWNhbFByb3BlcnR5XSA9IHBhcnNlSW50KGluc3RhbmNlc1tpXS5kb20uc3R5bGVbaW5zdGFuY2UudmVydGljYWxQcm9wZXJ0eV0sIDEwKSAtIHJlbW92ZWRIZWlnaHQgLSAxNiArICdweCc7XG4gICAgfVxuICB9XG59O1xuXG5tYWluX05vdGlmaWNhdGlvbi5jbG9zZUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IGluc3RhbmNlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGluc3RhbmNlc1tpXS5jbG9zZSgpO1xuICB9XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19ub3RpZmljYXRpb25fc3JjX21haW4gPSAobWFpbl9Ob3RpZmljYXRpb24pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9ub3RpZmljYXRpb24vaW5kZXguanNcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbm90aWZpY2F0aW9uID0gKHBhY2thZ2VzX25vdGlmaWNhdGlvbl9zcmNfbWFpbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NsaWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MzI3MDg2NDQmXG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzMyNzA4NjQ0X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXNsaWRlclwiLFxuICAgICAgY2xhc3M6IHtcbiAgICAgICAgXCJpcy12ZXJ0aWNhbFwiOiBfdm0udmVydGljYWwsXG4gICAgICAgIFwiZWwtc2xpZGVyLS13aXRoLWlucHV0XCI6IF92bS5zaG93SW5wdXRcbiAgICAgIH0sXG4gICAgICBhdHRyczoge1xuICAgICAgICByb2xlOiBcInNsaWRlclwiLFxuICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogX3ZtLm1pbixcbiAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IF92bS5tYXgsXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBfdm0udmVydGljYWwgPyBcInZlcnRpY2FsXCIgOiBcImhvcml6b250YWxcIixcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IF92bS5zbGlkZXJEaXNhYmxlZFxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX3ZtLnNob3dJbnB1dCAmJiAhX3ZtLnJhbmdlXG4gICAgICAgID8gX2MoXCJlbC1pbnB1dC1udW1iZXJcIiwge1xuICAgICAgICAgICAgcmVmOiBcImlucHV0XCIsXG4gICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1zbGlkZXJfX2lucHV0XCIsXG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICBzdGVwOiBfdm0uc3RlcCxcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5zbGlkZXJEaXNhYmxlZCxcbiAgICAgICAgICAgICAgY29udHJvbHM6IF92bS5zaG93SW5wdXRDb250cm9scyxcbiAgICAgICAgICAgICAgbWluOiBfdm0ubWluLFxuICAgICAgICAgICAgICBtYXg6IF92bS5tYXgsXG4gICAgICAgICAgICAgIGRlYm91bmNlOiBfdm0uZGVib3VuY2UsXG4gICAgICAgICAgICAgIHNpemU6IF92bS5pbnB1dFNpemVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbjogeyBjaGFuZ2U6IF92bS5lbWl0Q2hhbmdlIH0sXG4gICAgICAgICAgICBtb2RlbDoge1xuICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmZpcnN0VmFsdWUsXG4gICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigkJHYpIHtcbiAgICAgICAgICAgICAgICBfdm0uZmlyc3RWYWx1ZSA9ICQkdlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImZpcnN0VmFsdWVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHJlZjogXCJzbGlkZXJcIixcbiAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1zbGlkZXJfX3J1bndheVwiLFxuICAgICAgICAgIGNsYXNzOiB7IFwic2hvdy1pbnB1dFwiOiBfdm0uc2hvd0lucHV0LCBkaXNhYmxlZDogX3ZtLnNsaWRlckRpc2FibGVkIH0sXG4gICAgICAgICAgc3R5bGU6IF92bS5ydW53YXlTdHlsZSxcbiAgICAgICAgICBvbjogeyBjbGljazogX3ZtLm9uU2xpZGVyQ2xpY2sgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1zbGlkZXJfX2JhclwiLCBzdHlsZTogX3ZtLmJhclN0eWxlIH0pLFxuICAgICAgICAgIF9jKFwic2xpZGVyLWJ1dHRvblwiLCB7XG4gICAgICAgICAgICByZWY6IFwiYnV0dG9uMVwiLFxuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgdmVydGljYWw6IF92bS52ZXJ0aWNhbCxcbiAgICAgICAgICAgICAgXCJ0b29sdGlwLWNsYXNzXCI6IF92bS50b29sdGlwQ2xhc3NcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb2RlbDoge1xuICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmZpcnN0VmFsdWUsXG4gICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigkJHYpIHtcbiAgICAgICAgICAgICAgICBfdm0uZmlyc3RWYWx1ZSA9ICQkdlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImZpcnN0VmFsdWVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIF92bS5yYW5nZVxuICAgICAgICAgICAgPyBfYyhcInNsaWRlci1idXR0b25cIiwge1xuICAgICAgICAgICAgICAgIHJlZjogXCJidXR0b24yXCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIHZlcnRpY2FsOiBfdm0udmVydGljYWwsXG4gICAgICAgICAgICAgICAgICBcInRvb2x0aXAtY2xhc3NcIjogX3ZtLnRvb2x0aXBDbGFzc1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uc2Vjb25kVmFsdWUsXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oJCR2KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5zZWNvbmRWYWx1ZSA9ICQkdlxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwic2Vjb25kVmFsdWVcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgX3ZtLl9sKF92bS5zdG9wcywgZnVuY3Rpb24oaXRlbSwga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gX3ZtLnNob3dTdG9wc1xuICAgICAgICAgICAgICA/IF9jKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtc2xpZGVyX19zdG9wXCIsXG4gICAgICAgICAgICAgICAgICBzdHlsZTogX3ZtLmdldFN0b3BTdHlsZShpdGVtKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBfdm0ubWFya0xpc3QubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgX3ZtLl9sKF92bS5tYXJrTGlzdCwgZnVuY3Rpb24oaXRlbSwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfYyhcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtc2xpZGVyX19zdG9wIGVsLXNsaWRlcl9fbWFya3Mtc3RvcFwiLFxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiBfdm0uZ2V0U3RvcFN0eWxlKGl0ZW0ucG9zaXRpb24pXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtc2xpZGVyX19tYXJrc1wiIH0sXG4gICAgICAgICAgICAgICAgICBfdm0uX2woX3ZtLm1hcmtMaXN0LCBmdW5jdGlvbihpdGVtLCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jKFwic2xpZGVyLW1hcmtlclwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IF92bS5nZXRTdG9wU3R5bGUoaXRlbS5wb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgbWFyazogaXRlbS5tYXJrIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICBdLFxuICAgICAgICAyXG4gICAgICApXG4gICAgXSxcbiAgICAxXG4gIClcbn1cbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMzI3MDg2NDRfc3RhdGljUmVuZGVyRm5zID0gW11cbm1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8zMjcwODY0NF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NsaWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MzI3MDg2NDQmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9pbnB1dC1udW1iZXJcIlxudmFyIGlucHV0X251bWJlcl8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyKTtcbnZhciBpbnB1dF9udW1iZXJfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oaW5wdXRfbnVtYmVyXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2xpZGVyL3NyYy9idXR0b24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWU3MmQyYWQyJlxudmFyIGJ1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2U3MmQyYWQyX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIHJlZjogXCJidXR0b25cIixcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXNsaWRlcl9fYnV0dG9uLXdyYXBwZXJcIixcbiAgICAgIGNsYXNzOiB7IGhvdmVyOiBfdm0uaG92ZXJpbmcsIGRyYWdnaW5nOiBfdm0uZHJhZ2dpbmcgfSxcbiAgICAgIHN0eWxlOiBfdm0ud3JhcHBlclN0eWxlLFxuICAgICAgYXR0cnM6IHsgdGFiaW5kZXg6IFwiMFwiIH0sXG4gICAgICBvbjoge1xuICAgICAgICBtb3VzZWVudGVyOiBfdm0uaGFuZGxlTW91c2VFbnRlcixcbiAgICAgICAgbW91c2VsZWF2ZTogX3ZtLmhhbmRsZU1vdXNlTGVhdmUsXG4gICAgICAgIG1vdXNlZG93bjogX3ZtLm9uQnV0dG9uRG93bixcbiAgICAgICAgdG91Y2hzdGFydDogX3ZtLm9uQnV0dG9uRG93bixcbiAgICAgICAgZm9jdXM6IF92bS5oYW5kbGVNb3VzZUVudGVyLFxuICAgICAgICBibHVyOiBfdm0uaGFuZGxlTW91c2VMZWF2ZSxcbiAgICAgICAga2V5ZG93bjogW1xuICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwibGVmdFwiLCAzNywgJGV2ZW50LmtleSwgW1xuICAgICAgICAgICAgICAgIFwiTGVmdFwiLFxuICAgICAgICAgICAgICAgIFwiQXJyb3dMZWZ0XCJcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFwiYnV0dG9uXCIgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfdm0ub25MZWZ0S2V5RG93bigkZXZlbnQpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInJpZ2h0XCIsIDM5LCAkZXZlbnQua2V5LCBbXG4gICAgICAgICAgICAgICAgXCJSaWdodFwiLFxuICAgICAgICAgICAgICAgIFwiQXJyb3dSaWdodFwiXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcImJ1dHRvblwiIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX3ZtLm9uUmlnaHRLZXlEb3duKCRldmVudClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZG93blwiLCA0MCwgJGV2ZW50LmtleSwgW1xuICAgICAgICAgICAgICAgIFwiRG93blwiLFxuICAgICAgICAgICAgICAgIFwiQXJyb3dEb3duXCJcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIHJldHVybiBfdm0ub25MZWZ0S2V5RG93bigkZXZlbnQpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInVwXCIsIDM4LCAkZXZlbnQua2V5LCBbXCJVcFwiLCBcIkFycm93VXBcIl0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICByZXR1cm4gX3ZtLm9uUmlnaHRLZXlEb3duKCRldmVudClcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFxuICAgICAgICBcImVsLXRvb2x0aXBcIixcbiAgICAgICAge1xuICAgICAgICAgIHJlZjogXCJ0b29sdGlwXCIsXG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHBsYWNlbWVudDogXCJ0b3BcIixcbiAgICAgICAgICAgIFwicG9wcGVyLWNsYXNzXCI6IF92bS50b29sdGlwQ2xhc3MsXG4gICAgICAgICAgICBkaXNhYmxlZDogIV92bS5zaG93VG9vbHRpcFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFwic3BhblwiLCB7IGF0dHJzOiB7IHNsb3Q6IFwiY29udGVudFwiIH0sIHNsb3Q6IFwiY29udGVudFwiIH0sIFtcbiAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLmZvcm1hdFZhbHVlKSlcbiAgICAgICAgICBdKSxcbiAgICAgICAgICBfYyhcImRpdlwiLCB7XG4gICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1zbGlkZXJfX2J1dHRvblwiLFxuICAgICAgICAgICAgY2xhc3M6IHsgaG92ZXI6IF92bS5ob3ZlcmluZywgZHJhZ2dpbmc6IF92bS5kcmFnZ2luZyB9XG4gICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgICAgKVxuICAgIF0sXG4gICAgMVxuICApXG59XG52YXIgYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfZTcyZDJhZDJfc3RhdGljUmVuZGVyRm5zID0gW11cbmJ1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2U3MmQyYWQyX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2xpZGVyL3NyYy9idXR0b24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWU3MmQyYWQyJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zbGlkZXIvc3JjL2J1dHRvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNsaWRlcl9zcmNfYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsU2xpZGVyQnV0dG9uJyxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxUb29sdGlwOiB0b29sdGlwX2RlZmF1bHQuYVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIHZlcnRpY2FsOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIHRvb2x0aXBDbGFzczogU3RyaW5nXG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaG92ZXJpbmc6IGZhbHNlLFxuICAgICAgZHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgaXNDbGljazogZmFsc2UsXG4gICAgICBzdGFydFg6IDAsXG4gICAgICBjdXJyZW50WDogMCxcbiAgICAgIHN0YXJ0WTogMCxcbiAgICAgIGN1cnJlbnRZOiAwLFxuICAgICAgc3RhcnRQb3NpdGlvbjogMCxcbiAgICAgIG5ld1Bvc2l0aW9uOiBudWxsLFxuICAgICAgb2xkVmFsdWU6IHRoaXMudmFsdWVcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBkaXNhYmxlZDogZnVuY3Rpb24gZGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50LnNsaWRlckRpc2FibGVkO1xuICAgIH0sXG4gICAgbWF4OiBmdW5jdGlvbiBtYXgoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50Lm1heDtcbiAgICB9LFxuICAgIG1pbjogZnVuY3Rpb24gbWluKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5taW47XG4gICAgfSxcbiAgICBzdGVwOiBmdW5jdGlvbiBzdGVwKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5zdGVwO1xuICAgIH0sXG4gICAgc2hvd1Rvb2x0aXA6IGZ1bmN0aW9uIHNob3dUb29sdGlwKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5zaG93VG9vbHRpcDtcbiAgICB9LFxuICAgIHByZWNpc2lvbjogZnVuY3Rpb24gcHJlY2lzaW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5wcmVjaXNpb247XG4gICAgfSxcbiAgICBjdXJyZW50UG9zaXRpb246IGZ1bmN0aW9uIGN1cnJlbnRQb3NpdGlvbigpIHtcbiAgICAgIHJldHVybiAodGhpcy52YWx1ZSAtIHRoaXMubWluKSAvICh0aGlzLm1heCAtIHRoaXMubWluKSAqIDEwMCArICclJztcbiAgICB9LFxuICAgIGVuYWJsZUZvcm1hdDogZnVuY3Rpb24gZW5hYmxlRm9ybWF0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5mb3JtYXRUb29sdGlwIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gICAgfSxcbiAgICBmb3JtYXRWYWx1ZTogZnVuY3Rpb24gZm9ybWF0VmFsdWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmFibGVGb3JtYXQgJiYgdGhpcy4kcGFyZW50LmZvcm1hdFRvb2x0aXAodGhpcy52YWx1ZSkgfHwgdGhpcy52YWx1ZTtcbiAgICB9LFxuICAgIHdyYXBwZXJTdHlsZTogZnVuY3Rpb24gd3JhcHBlclN0eWxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmVydGljYWwgPyB7IGJvdHRvbTogdGhpcy5jdXJyZW50UG9zaXRpb24gfSA6IHsgbGVmdDogdGhpcy5jdXJyZW50UG9zaXRpb24gfTtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBkcmFnZ2luZzogZnVuY3Rpb24gZHJhZ2dpbmcodmFsKSB7XG4gICAgICB0aGlzLiRwYXJlbnQuZHJhZ2dpbmcgPSB2YWw7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBkaXNwbGF5VG9vbHRpcDogZnVuY3Rpb24gZGlzcGxheVRvb2x0aXAoKSB7XG4gICAgICB0aGlzLiRyZWZzLnRvb2x0aXAgJiYgKHRoaXMuJHJlZnMudG9vbHRpcC5zaG93UG9wcGVyID0gdHJ1ZSk7XG4gICAgfSxcbiAgICBoaWRlVG9vbHRpcDogZnVuY3Rpb24gaGlkZVRvb2x0aXAoKSB7XG4gICAgICB0aGlzLiRyZWZzLnRvb2x0aXAgJiYgKHRoaXMuJHJlZnMudG9vbHRpcC5zaG93UG9wcGVyID0gZmFsc2UpO1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VFbnRlcjogZnVuY3Rpb24gaGFuZGxlTW91c2VFbnRlcigpIHtcbiAgICAgIHRoaXMuaG92ZXJpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5kaXNwbGF5VG9vbHRpcCgpO1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VMZWF2ZTogZnVuY3Rpb24gaGFuZGxlTW91c2VMZWF2ZSgpIHtcbiAgICAgIHRoaXMuaG92ZXJpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICB9LFxuICAgIG9uQnV0dG9uRG93bjogZnVuY3Rpb24gb25CdXR0b25Eb3duKGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMub25EcmFnU3RhcnQoZXZlbnQpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25EcmFnZ2luZyk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vbkRyYWdnaW5nKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbkRyYWdFbmQpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbkRyYWdFbmQpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5vbkRyYWdFbmQpO1xuICAgIH0sXG4gICAgb25MZWZ0S2V5RG93bjogZnVuY3Rpb24gb25MZWZ0S2V5RG93bigpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgICB0aGlzLm5ld1Bvc2l0aW9uID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRQb3NpdGlvbikgLSB0aGlzLnN0ZXAgLyAodGhpcy5tYXggLSB0aGlzLm1pbikgKiAxMDA7XG4gICAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMubmV3UG9zaXRpb24pO1xuICAgICAgdGhpcy4kcGFyZW50LmVtaXRDaGFuZ2UoKTtcbiAgICB9LFxuICAgIG9uUmlnaHRLZXlEb3duOiBmdW5jdGlvbiBvblJpZ2h0S2V5RG93bigpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgICB0aGlzLm5ld1Bvc2l0aW9uID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRQb3NpdGlvbikgKyB0aGlzLnN0ZXAgLyAodGhpcy5tYXggLSB0aGlzLm1pbikgKiAxMDA7XG4gICAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMubmV3UG9zaXRpb24pO1xuICAgICAgdGhpcy4kcGFyZW50LmVtaXRDaGFuZ2UoKTtcbiAgICB9LFxuICAgIG9uRHJhZ1N0YXJ0OiBmdW5jdGlvbiBvbkRyYWdTdGFydChldmVudCkge1xuICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ2xpY2sgPSB0cnVlO1xuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgICBldmVudC5jbGllbnRZID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgICBldmVudC5jbGllbnRYID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmVydGljYWwpIHtcbiAgICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRQb3NpdGlvbik7XG4gICAgICB0aGlzLm5ld1Bvc2l0aW9uID0gdGhpcy5zdGFydFBvc2l0aW9uO1xuICAgIH0sXG4gICAgb25EcmFnZ2luZzogZnVuY3Rpb24gb25EcmFnZ2luZyhldmVudCkge1xuICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgICAgdGhpcy5pc0NsaWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGlzcGxheVRvb2x0aXAoKTtcbiAgICAgICAgdGhpcy4kcGFyZW50LnJlc2V0U2l6ZSgpO1xuICAgICAgICB2YXIgZGlmZiA9IDA7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAndG91Y2htb3ZlJykge1xuICAgICAgICAgIGV2ZW50LmNsaWVudFkgPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICAgICAgZXZlbnQuY2xpZW50WCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52ZXJ0aWNhbCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFkgPSBldmVudC5jbGllbnRZO1xuICAgICAgICAgIGRpZmYgPSAodGhpcy5zdGFydFkgLSB0aGlzLmN1cnJlbnRZKSAvIHRoaXMuJHBhcmVudC5zbGlkZXJTaXplICogMTAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY3VycmVudFggPSBldmVudC5jbGllbnRYO1xuICAgICAgICAgIGRpZmYgPSAodGhpcy5jdXJyZW50WCAtIHRoaXMuc3RhcnRYKSAvIHRoaXMuJHBhcmVudC5zbGlkZXJTaXplICogMTAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV3UG9zaXRpb24gPSB0aGlzLnN0YXJ0UG9zaXRpb24gKyBkaWZmO1xuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMubmV3UG9zaXRpb24pO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25EcmFnRW5kOiBmdW5jdGlvbiBvbkRyYWdFbmQoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5kcmFnZ2luZykge1xuICAgICAgICAvKlxuICAgICAgICAgKiDpmLLmraLlnKggbW91c2V1cCDlkI7nq4vljbPop6blj5EgY2xpY2vvvIzlr7zoh7Tmu5HlnZfmnInlh6DnjofkuqfnlJ/kuIDlsI/mrrXkvY3np7tcbiAgICAgICAgICog5LiN5L2/55SoIHByZXZlbnREZWZhdWx0IOaYr+WboOS4uiBtb3VzZXVwIOWSjCBjbGljayDmsqHmnInms6jlhozlnKjlkIzkuIDkuKogRE9NIOS4ilxuICAgICAgICAgKi9cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgICBfdGhpcy5oaWRlVG9vbHRpcCgpO1xuICAgICAgICAgIGlmICghX3RoaXMuaXNDbGljaykge1xuICAgICAgICAgICAgX3RoaXMuc2V0UG9zaXRpb24oX3RoaXMubmV3UG9zaXRpb24pO1xuICAgICAgICAgICAgX3RoaXMuJHBhcmVudC5lbWl0Q2hhbmdlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAwKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25EcmFnZ2luZyk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uRHJhZ2dpbmcpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25EcmFnRW5kKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbkRyYWdFbmQpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLm9uRHJhZ0VuZCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRQb3NpdGlvbjogZnVuY3Rpb24gc2V0UG9zaXRpb24obmV3UG9zaXRpb24pIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAobmV3UG9zaXRpb24gPT09IG51bGwgfHwgaXNOYU4obmV3UG9zaXRpb24pKSByZXR1cm47XG4gICAgICBpZiAobmV3UG9zaXRpb24gPCAwKSB7XG4gICAgICAgIG5ld1Bvc2l0aW9uID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobmV3UG9zaXRpb24gPiAxMDApIHtcbiAgICAgICAgbmV3UG9zaXRpb24gPSAxMDA7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoUGVyU3RlcCA9IDEwMCAvICgodGhpcy5tYXggLSB0aGlzLm1pbikgLyB0aGlzLnN0ZXApO1xuICAgICAgdmFyIHN0ZXBzID0gTWF0aC5yb3VuZChuZXdQb3NpdGlvbiAvIGxlbmd0aFBlclN0ZXApO1xuICAgICAgdmFyIHZhbHVlID0gc3RlcHMgKiBsZW5ndGhQZXJTdGVwICogKHRoaXMubWF4IC0gdGhpcy5taW4pICogMC4wMSArIHRoaXMubWluO1xuICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlLnRvRml4ZWQodGhpcy5wcmVjaXNpb24pKTtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuZGlzcGxheVRvb2x0aXAoKTtcbiAgICAgICAgX3RoaXMyLiRyZWZzLnRvb2x0aXAgJiYgX3RoaXMyLiRyZWZzLnRvb2x0aXAudXBkYXRlUG9wcGVyKCk7XG4gICAgICB9KTtcbiAgICAgIGlmICghdGhpcy5kcmFnZ2luZyAmJiB0aGlzLnZhbHVlICE9PSB0aGlzLm9sZFZhbHVlKSB7XG4gICAgICAgIHRoaXMub2xkVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NsaWRlci9zcmMvYnV0dG9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19zbGlkZXJfc3JjX2J1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChzbGlkZXJfc3JjX2J1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zbGlkZXIvc3JjL2J1dHRvbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBzcmNfYnV0dG9uX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfc2xpZGVyX3NyY19idXR0b252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGJ1dHRvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2U3MmQyYWQyX3JlbmRlcixcbiAgYnV0dG9udnVlX3R5cGVfdGVtcGxhdGVfaWRfZTcyZDJhZDJfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBzcmNfYnV0dG9uX2FwaTsgfVxuc3JjX2J1dHRvbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3NsaWRlci9zcmMvYnV0dG9uLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzbGlkZXJfc3JjX2J1dHRvbiA9IChzcmNfYnV0dG9uX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2xpZGVyL3NyYy9tYXJrZXIuanNcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG1hcmtlciA9ICh7XG4gIG5hbWU6ICdFbE1hcmtlcicsXG5cbiAgcHJvcHM6IHtcbiAgICBtYXJrOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3RdXG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgaCA9IGFyZ3VtZW50c1swXTtcblxuICAgIHZhciBsYWJlbCA9IHR5cGVvZiB0aGlzLm1hcmsgPT09ICdzdHJpbmcnID8gdGhpcy5tYXJrIDogdGhpcy5tYXJrLmxhYmVsO1xuXG4gICAgcmV0dXJuIGgoXG4gICAgICAnZGl2JyxcbiAgICAgIHsgJ2NsYXNzJzogJ2VsLXNsaWRlcl9fbWFya3MtdGV4dCcsIHN0eWxlOiB0aGlzLm1hcmsuc3R5bGUgfHwge30gfSxcbiAgICAgIFtsYWJlbF1cbiAgICApO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NsaWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzbGlkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxTbGlkZXInLFxuXG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hXSxcblxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgbWluOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAwXG4gICAgfSxcbiAgICBtYXg6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDEwMFxuICAgIH0sXG4gICAgc3RlcDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMVxuICAgIH0sXG4gICAgdmFsdWU6IHtcbiAgICAgIHR5cGU6IFtOdW1iZXIsIEFycmF5XSxcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIHNob3dJbnB1dDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICBzaG93SW5wdXRDb250cm9sczoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGlucHV0U2l6ZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ3NtYWxsJ1xuICAgIH0sXG4gICAgc2hvd1N0b3BzOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIHNob3dUb29sdGlwOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgZm9ybWF0VG9vbHRpcDogRnVuY3Rpb24sXG4gICAgZGlzYWJsZWQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgcmFuZ2U6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgdmVydGljYWw6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgaGVpZ2h0OiB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9LFxuICAgIGRlYm91bmNlOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAzMDBcbiAgICB9LFxuICAgIGxhYmVsOiB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9LFxuICAgIHRvb2x0aXBDbGFzczogU3RyaW5nLFxuICAgIG1hcmtzOiBPYmplY3RcbiAgfSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxJbnB1dE51bWJlcjogaW5wdXRfbnVtYmVyX2RlZmF1bHQuYSxcbiAgICBTbGlkZXJCdXR0b246IHNsaWRlcl9zcmNfYnV0dG9uLFxuICAgIFNsaWRlck1hcmtlcjogbWFya2VyXG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlyc3RWYWx1ZTogbnVsbCxcbiAgICAgIHNlY29uZFZhbHVlOiBudWxsLFxuICAgICAgb2xkVmFsdWU6IG51bGwsXG4gICAgICBkcmFnZ2luZzogZmFsc2UsXG4gICAgICBzbGlkZXJTaXplOiAxXG4gICAgfTtcbiAgfSxcblxuXG4gIHdhdGNoOiB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkVmFsKSB7XG4gICAgICBpZiAodGhpcy5kcmFnZ2luZyB8fCBBcnJheS5pc0FycmF5KHZhbCkgJiYgQXJyYXkuaXNBcnJheShvbGRWYWwpICYmIHZhbC5ldmVyeShmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gPT09IG9sZFZhbFtpbmRleF07XG4gICAgICB9KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNldFZhbHVlcygpO1xuICAgIH0sXG4gICAgZHJhZ2dpbmc6IGZ1bmN0aW9uIGRyYWdnaW5nKHZhbCkge1xuICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZXMoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpcnN0VmFsdWU6IGZ1bmN0aW9uIGZpcnN0VmFsdWUodmFsKSB7XG4gICAgICBpZiAodGhpcy5yYW5nZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIFt0aGlzLm1pblZhbHVlLCB0aGlzLm1heFZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZWNvbmRWYWx1ZTogZnVuY3Rpb24gc2Vjb25kVmFsdWUoKSB7XG4gICAgICBpZiAodGhpcy5yYW5nZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIFt0aGlzLm1pblZhbHVlLCB0aGlzLm1heFZhbHVlXSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBtaW46IGZ1bmN0aW9uIG1pbigpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWVzKCk7XG4gICAgfSxcbiAgICBtYXg6IGZ1bmN0aW9uIG1heCgpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWVzKCk7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICB2YWx1ZUNoYW5nZWQ6IGZ1bmN0aW9uIHZhbHVlQ2hhbmdlZCgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLnJhbmdlKSB7XG4gICAgICAgIHJldHVybiAhW3RoaXMubWluVmFsdWUsIHRoaXMubWF4VmFsdWVdLmV2ZXJ5KGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgICAgICAgIHJldHVybiBpdGVtID09PSBfdGhpcy5vbGRWYWx1ZVtpbmRleF07XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgIT09IHRoaXMub2xkVmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRWYWx1ZXM6IGZ1bmN0aW9uIHNldFZhbHVlcygpIHtcbiAgICAgIGlmICh0aGlzLm1pbiA+IHRoaXMubWF4KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tFbGVtZW50IEVycm9yXVtTbGlkZXJdbWluIHNob3VsZCBub3QgYmUgZ3JlYXRlciB0aGFuIG1heC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAodGhpcy5yYW5nZSAmJiBBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgaWYgKHZhbFsxXSA8IHRoaXMubWluKSB7XG4gICAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBbdGhpcy5taW4sIHRoaXMubWluXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsWzBdID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIFt0aGlzLm1heCwgdGhpcy5tYXhdKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxbMF0gPCB0aGlzLm1pbikge1xuICAgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgW3RoaXMubWluLCB2YWxbMV1dKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxbMV0gPiB0aGlzLm1heCkge1xuICAgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgW3ZhbFswXSwgdGhpcy5tYXhdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZpcnN0VmFsdWUgPSB2YWxbMF07XG4gICAgICAgICAgdGhpcy5zZWNvbmRWYWx1ZSA9IHZhbFsxXTtcbiAgICAgICAgICBpZiAodGhpcy52YWx1ZUNoYW5nZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsICdlbC5mb3JtLmNoYW5nZScsIFt0aGlzLm1pblZhbHVlLCB0aGlzLm1heFZhbHVlXSk7XG4gICAgICAgICAgICB0aGlzLm9sZFZhbHVlID0gdmFsLnNsaWNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnJhbmdlICYmIHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmICFpc05hTih2YWwpKSB7XG4gICAgICAgIGlmICh2YWwgPCB0aGlzLm1pbikge1xuICAgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdGhpcy5taW4pO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLm1heCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5maXJzdFZhbHVlID0gdmFsO1xuICAgICAgICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoKCdFbEZvcm1JdGVtJywgJ2VsLmZvcm0uY2hhbmdlJywgdmFsKTtcbiAgICAgICAgICAgIHRoaXMub2xkVmFsdWUgPSB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRQb3NpdGlvbjogZnVuY3Rpb24gc2V0UG9zaXRpb24ocGVyY2VudCkge1xuICAgICAgdmFyIHRhcmdldFZhbHVlID0gdGhpcy5taW4gKyBwZXJjZW50ICogKHRoaXMubWF4IC0gdGhpcy5taW4pIC8gMTAwO1xuICAgICAgaWYgKCF0aGlzLnJhbmdlKSB7XG4gICAgICAgIHRoaXMuJHJlZnMuYnV0dG9uMS5zZXRQb3NpdGlvbihwZXJjZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGJ1dHRvbiA9IHZvaWQgMDtcbiAgICAgIGlmIChNYXRoLmFicyh0aGlzLm1pblZhbHVlIC0gdGFyZ2V0VmFsdWUpIDwgTWF0aC5hYnModGhpcy5tYXhWYWx1ZSAtIHRhcmdldFZhbHVlKSkge1xuICAgICAgICBidXR0b24gPSB0aGlzLmZpcnN0VmFsdWUgPCB0aGlzLnNlY29uZFZhbHVlID8gJ2J1dHRvbjEnIDogJ2J1dHRvbjInO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnV0dG9uID0gdGhpcy5maXJzdFZhbHVlID4gdGhpcy5zZWNvbmRWYWx1ZSA/ICdidXR0b24xJyA6ICdidXR0b24yJztcbiAgICAgIH1cbiAgICAgIHRoaXMuJHJlZnNbYnV0dG9uXS5zZXRQb3NpdGlvbihwZXJjZW50KTtcbiAgICB9LFxuICAgIG9uU2xpZGVyQ2xpY2s6IGZ1bmN0aW9uIG9uU2xpZGVyQ2xpY2soZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLnNsaWRlckRpc2FibGVkIHx8IHRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIHRoaXMucmVzZXRTaXplKCk7XG4gICAgICBpZiAodGhpcy52ZXJ0aWNhbCkge1xuICAgICAgICB2YXIgc2xpZGVyT2Zmc2V0Qm90dG9tID0gdGhpcy4kcmVmcy5zbGlkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO1xuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKChzbGlkZXJPZmZzZXRCb3R0b20gLSBldmVudC5jbGllbnRZKSAvIHRoaXMuc2xpZGVyU2l6ZSAqIDEwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc2xpZGVyT2Zmc2V0TGVmdCA9IHRoaXMuJHJlZnMuc2xpZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oKGV2ZW50LmNsaWVudFggLSBzbGlkZXJPZmZzZXRMZWZ0KSAvIHRoaXMuc2xpZGVyU2l6ZSAqIDEwMCk7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9LFxuICAgIHJlc2V0U2l6ZTogZnVuY3Rpb24gcmVzZXRTaXplKCkge1xuICAgICAgaWYgKHRoaXMuJHJlZnMuc2xpZGVyKSB7XG4gICAgICAgIHRoaXMuc2xpZGVyU2l6ZSA9IHRoaXMuJHJlZnMuc2xpZGVyWydjbGllbnQnICsgKHRoaXMudmVydGljYWwgPyAnSGVpZ2h0JyA6ICdXaWR0aCcpXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGVtaXRDaGFuZ2U6IGZ1bmN0aW9uIGVtaXRDaGFuZ2UoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuJGVtaXQoJ2NoYW5nZScsIF90aGlzMi5yYW5nZSA/IFtfdGhpczIubWluVmFsdWUsIF90aGlzMi5tYXhWYWx1ZV0gOiBfdGhpczIudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBnZXRTdG9wU3R5bGU6IGZ1bmN0aW9uIGdldFN0b3BTdHlsZShwb3NpdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMudmVydGljYWwgPyB7ICdib3R0b20nOiBwb3NpdGlvbiArICclJyB9IDogeyAnbGVmdCc6IHBvc2l0aW9uICsgJyUnIH07XG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc3RvcHM6IGZ1bmN0aW9uIHN0b3BzKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5zaG93U3RvcHMgfHwgdGhpcy5taW4gPiB0aGlzLm1heCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKHRoaXMuc3RlcCA9PT0gMCkge1xuICAgICAgICAgZmFsc2UgJiYgZmFsc2U7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBzdG9wQ291bnQgPSAodGhpcy5tYXggLSB0aGlzLm1pbikgLyB0aGlzLnN0ZXA7XG4gICAgICB2YXIgc3RlcFdpZHRoID0gMTAwICogdGhpcy5zdGVwIC8gKHRoaXMubWF4IC0gdGhpcy5taW4pO1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBzdG9wQ291bnQ7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaChpICogc3RlcFdpZHRoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJhbmdlKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uIChzdGVwKSB7XG4gICAgICAgICAgcmV0dXJuIHN0ZXAgPCAxMDAgKiAoX3RoaXMzLm1pblZhbHVlIC0gX3RoaXMzLm1pbikgLyAoX3RoaXMzLm1heCAtIF90aGlzMy5taW4pIHx8IHN0ZXAgPiAxMDAgKiAoX3RoaXMzLm1heFZhbHVlIC0gX3RoaXMzLm1pbikgLyAoX3RoaXMzLm1heCAtIF90aGlzMy5taW4pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uIChzdGVwKSB7XG4gICAgICAgICAgcmV0dXJuIHN0ZXAgPiAxMDAgKiAoX3RoaXMzLmZpcnN0VmFsdWUgLSBfdGhpczMubWluKSAvIChfdGhpczMubWF4IC0gX3RoaXMzLm1pbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgbWFya0xpc3Q6IGZ1bmN0aW9uIG1hcmtMaXN0KCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5tYXJrcykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHZhciBtYXJrc0tleXMgPSBPYmplY3Qua2V5cyh0aGlzLm1hcmtzKTtcbiAgICAgIHJldHVybiBtYXJrc0tleXMubWFwKHBhcnNlRmxvYXQpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEgLSBiO1xuICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChwb2ludCkge1xuICAgICAgICByZXR1cm4gcG9pbnQgPD0gX3RoaXM0Lm1heCAmJiBwb2ludCA+PSBfdGhpczQubWluO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChwb2ludCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgICAgICBwb3NpdGlvbjogKHBvaW50IC0gX3RoaXM0Lm1pbikgKiAxMDAgLyAoX3RoaXM0Lm1heCAtIF90aGlzNC5taW4pLFxuICAgICAgICAgIG1hcms6IF90aGlzNC5tYXJrc1twb2ludF1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbWluVmFsdWU6IGZ1bmN0aW9uIG1pblZhbHVlKCkge1xuICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuZmlyc3RWYWx1ZSwgdGhpcy5zZWNvbmRWYWx1ZSk7XG4gICAgfSxcbiAgICBtYXhWYWx1ZTogZnVuY3Rpb24gbWF4VmFsdWUoKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5maXJzdFZhbHVlLCB0aGlzLnNlY29uZFZhbHVlKTtcbiAgICB9LFxuICAgIGJhclNpemU6IGZ1bmN0aW9uIGJhclNpemUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yYW5nZSA/IDEwMCAqICh0aGlzLm1heFZhbHVlIC0gdGhpcy5taW5WYWx1ZSkgLyAodGhpcy5tYXggLSB0aGlzLm1pbikgKyAnJScgOiAxMDAgKiAodGhpcy5maXJzdFZhbHVlIC0gdGhpcy5taW4pIC8gKHRoaXMubWF4IC0gdGhpcy5taW4pICsgJyUnO1xuICAgIH0sXG4gICAgYmFyU3RhcnQ6IGZ1bmN0aW9uIGJhclN0YXJ0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucmFuZ2UgPyAxMDAgKiAodGhpcy5taW5WYWx1ZSAtIHRoaXMubWluKSAvICh0aGlzLm1heCAtIHRoaXMubWluKSArICclJyA6ICcwJSc7XG4gICAgfSxcbiAgICBwcmVjaXNpb246IGZ1bmN0aW9uIHByZWNpc2lvbigpIHtcbiAgICAgIHZhciBwcmVjaXNpb25zID0gW3RoaXMubWluLCB0aGlzLm1heCwgdGhpcy5zdGVwXS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIGRlY2ltYWwgPSAoJycgKyBpdGVtKS5zcGxpdCgnLicpWzFdO1xuICAgICAgICByZXR1cm4gZGVjaW1hbCA/IGRlY2ltYWwubGVuZ3RoIDogMDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KG51bGwsIHByZWNpc2lvbnMpO1xuICAgIH0sXG4gICAgcnVud2F5U3R5bGU6IGZ1bmN0aW9uIHJ1bndheVN0eWxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmVydGljYWwgPyB7IGhlaWdodDogdGhpcy5oZWlnaHQgfSA6IHt9O1xuICAgIH0sXG4gICAgYmFyU3R5bGU6IGZ1bmN0aW9uIGJhclN0eWxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmVydGljYWwgPyB7XG4gICAgICAgIGhlaWdodDogdGhpcy5iYXJTaXplLFxuICAgICAgICBib3R0b206IHRoaXMuYmFyU3RhcnRcbiAgICAgIH0gOiB7XG4gICAgICAgIHdpZHRoOiB0aGlzLmJhclNpemUsXG4gICAgICAgIGxlZnQ6IHRoaXMuYmFyU3RhcnRcbiAgICAgIH07XG4gICAgfSxcbiAgICBzbGlkZXJEaXNhYmxlZDogZnVuY3Rpb24gc2xpZGVyRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciB2YWx1ZXRleHQgPSB2b2lkIDA7XG4gICAgaWYgKHRoaXMucmFuZ2UpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuZmlyc3RWYWx1ZSA9IE1hdGgubWF4KHRoaXMubWluLCB0aGlzLnZhbHVlWzBdKTtcbiAgICAgICAgdGhpcy5zZWNvbmRWYWx1ZSA9IE1hdGgubWluKHRoaXMubWF4LCB0aGlzLnZhbHVlWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlyc3RWYWx1ZSA9IHRoaXMubWluO1xuICAgICAgICB0aGlzLnNlY29uZFZhbHVlID0gdGhpcy5tYXg7XG4gICAgICB9XG4gICAgICB0aGlzLm9sZFZhbHVlID0gW3RoaXMuZmlyc3RWYWx1ZSwgdGhpcy5zZWNvbmRWYWx1ZV07XG4gICAgICB2YWx1ZXRleHQgPSB0aGlzLmZpcnN0VmFsdWUgKyAnLScgKyB0aGlzLnNlY29uZFZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgIT09ICdudW1iZXInIHx8IGlzTmFOKHRoaXMudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuZmlyc3RWYWx1ZSA9IHRoaXMubWluO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5maXJzdFZhbHVlID0gTWF0aC5taW4odGhpcy5tYXgsIE1hdGgubWF4KHRoaXMubWluLCB0aGlzLnZhbHVlKSk7XG4gICAgICB9XG4gICAgICB0aGlzLm9sZFZhbHVlID0gdGhpcy5maXJzdFZhbHVlO1xuICAgICAgdmFsdWV0ZXh0ID0gdGhpcy5maXJzdFZhbHVlO1xuICAgIH1cbiAgICB0aGlzLiRlbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWV0ZXh0JywgdmFsdWV0ZXh0KTtcblxuICAgIC8vIGxhYmVsIHNjcmVlbiByZWFkZXJcbiAgICB0aGlzLiRlbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aGlzLmxhYmVsID8gdGhpcy5sYWJlbCA6ICdzbGlkZXIgYmV0d2VlbiAnICsgdGhpcy5taW4gKyAnIGFuZCAnICsgdGhpcy5tYXgpO1xuXG4gICAgdGhpcy5yZXNldFNpemUoKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXNldFNpemUpO1xuICB9LFxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlc2V0U2l6ZSk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zbGlkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3NsaWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChzbGlkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2xpZGVyL3NyYy9tYWluLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHNsaWRlcl9zcmNfbWFpbl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhY2thZ2VzX3NsaWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzMyNzA4NjQ0X3JlbmRlcixcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzMyNzA4NjQ0X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgc2xpZGVyX3NyY19tYWluX2FwaTsgfVxuc2xpZGVyX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvc2xpZGVyL3NyYy9tYWluLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzbGlkZXJfc3JjX21haW4gPSAoc2xpZGVyX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2xpZGVyL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnNsaWRlcl9zcmNfbWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHNsaWRlcl9zcmNfbWFpbi5uYW1lLCBzbGlkZXJfc3JjX21haW4pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2xpZGVyID0gKHNsaWRlcl9zcmNfbWFpbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2xvYWRpbmcvc3JjL2xvYWRpbmcudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWVlZTBhN2FjJlxudmFyIGxvYWRpbmd2dWVfdHlwZV90ZW1wbGF0ZV9pZF9lZWUwYTdhY19yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJ0cmFuc2l0aW9uXCIsXG4gICAge1xuICAgICAgYXR0cnM6IHsgbmFtZTogXCJlbC1sb2FkaW5nLWZhZGVcIiB9LFxuICAgICAgb246IHsgXCJhZnRlci1sZWF2ZVwiOiBfdm0uaGFuZGxlQWZ0ZXJMZWF2ZSB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBfdm0udmlzaWJsZSxcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJ2aXNpYmxlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWxvYWRpbmctbWFza1wiLFxuICAgICAgICAgIGNsYXNzOiBbX3ZtLmN1c3RvbUNsYXNzLCB7IFwiaXMtZnVsbHNjcmVlblwiOiBfdm0uZnVsbHNjcmVlbiB9XSxcbiAgICAgICAgICBzdHlsZTogeyBiYWNrZ3JvdW5kQ29sb3I6IF92bS5iYWNrZ3JvdW5kIHx8IFwiXCIgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1sb2FkaW5nLXNwaW5uZXJcIiB9LCBbXG4gICAgICAgICAgICAhX3ZtLnNwaW5uZXJcbiAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgIFwic3ZnXCIsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImNpcmN1bGFyXCIsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHZpZXdCb3g6IFwiMjUgMjUgNTAgNTBcIiB9XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBfYyhcImNpcmNsZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwicGF0aFwiLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IGN4OiBcIjUwXCIsIGN5OiBcIjUwXCIsIHI6IFwiMjBcIiwgZmlsbDogXCJub25lXCIgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBfYyhcImlcIiwgeyBjbGFzczogX3ZtLnNwaW5uZXIgfSksXG4gICAgICAgICAgICBfdm0udGV4dFxuICAgICAgICAgICAgICA/IF9jKFwicFwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWxvYWRpbmctdGV4dFwiIH0sIFtcbiAgICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLnRleHQpKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICBdKVxuICAgICAgICBdXG4gICAgICApXG4gICAgXVxuICApXG59XG52YXIgbG9hZGluZ3Z1ZV90eXBlX3RlbXBsYXRlX2lkX2VlZTBhN2FjX3N0YXRpY1JlbmRlckZucyA9IFtdXG5sb2FkaW5ndnVlX3R5cGVfdGVtcGxhdGVfaWRfZWVlMGE3YWNfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9sb2FkaW5nL3NyYy9sb2FkaW5nLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1lZWUwYTdhYyZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbG9hZGluZy9zcmMvbG9hZGluZy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGxvYWRpbmd2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiBudWxsLFxuICAgICAgc3Bpbm5lcjogbnVsbCxcbiAgICAgIGJhY2tncm91bmQ6IG51bGwsXG4gICAgICBmdWxsc2NyZWVuOiB0cnVlLFxuICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICBjdXN0b21DbGFzczogJydcbiAgICB9O1xuICB9LFxuXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUFmdGVyTGVhdmU6IGZ1bmN0aW9uIGhhbmRsZUFmdGVyTGVhdmUoKSB7XG4gICAgICB0aGlzLiRlbWl0KCdhZnRlci1sZWF2ZScpO1xuICAgIH0sXG4gICAgc2V0VGV4dDogZnVuY3Rpb24gc2V0VGV4dCh0ZXh0KSB7XG4gICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2xvYWRpbmcvc3JjL2xvYWRpbmcudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19sb2FkaW5ndnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGxvYWRpbmd2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbG9hZGluZy9zcmMvbG9hZGluZy52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBsb2FkaW5nX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2xvYWRpbmd2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGxvYWRpbmd2dWVfdHlwZV90ZW1wbGF0ZV9pZF9lZWUwYTdhY19yZW5kZXIsXG4gIGxvYWRpbmd2dWVfdHlwZV90ZW1wbGF0ZV9pZF9lZWUwYTdhY19zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGxvYWRpbmdfYXBpOyB9XG5sb2FkaW5nX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvbG9hZGluZy9zcmMvbG9hZGluZy52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbG9hZGluZyA9IChsb2FkaW5nX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9hZnRlci1sZWF2ZVwiXG52YXIgYWZ0ZXJfbGVhdmVfID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMyk7XG52YXIgYWZ0ZXJfbGVhdmVfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oYWZ0ZXJfbGVhdmVfKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9sb2FkaW5nL3NyYy9kaXJlY3RpdmUuanNcblxuXG5cblxuXG52YXIgTWFzayA9IGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEuZXh0ZW5kKGxvYWRpbmcpO1xuXG52YXIgbG9hZGluZ0RpcmVjdGl2ZSA9IHt9O1xubG9hZGluZ0RpcmVjdGl2ZS5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBpZiAoVnVlLnByb3RvdHlwZS4kaXNTZXJ2ZXIpIHJldHVybjtcbiAgdmFyIHRvZ2dsZUxvYWRpbmcgPSBmdW5jdGlvbiB0b2dnbGVMb2FkaW5nKGVsLCBiaW5kaW5nKSB7XG4gICAgaWYgKGJpbmRpbmcudmFsdWUpIHtcbiAgICAgIFZ1ZS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChiaW5kaW5nLm1vZGlmaWVycy5mdWxsc2NyZWVuKSB7XG4gICAgICAgICAgZWwub3JpZ2luYWxQb3NpdGlvbiA9IE9iamVjdChkb21fW1wiZ2V0U3R5bGVcIl0pKGRvY3VtZW50LmJvZHksICdwb3NpdGlvbicpO1xuICAgICAgICAgIGVsLm9yaWdpbmFsT3ZlcmZsb3cgPSBPYmplY3QoZG9tX1tcImdldFN0eWxlXCJdKShkb2N1bWVudC5ib2R5LCAnb3ZlcmZsb3cnKTtcbiAgICAgICAgICBlbC5tYXNrU3R5bGUuekluZGV4ID0gcG9wdXBfW1wiUG9wdXBNYW5hZ2VyXCJdLm5leHRaSW5kZXgoKTtcblxuICAgICAgICAgIE9iamVjdChkb21fW1wiYWRkQ2xhc3NcIl0pKGVsLm1hc2ssICdpcy1mdWxsc2NyZWVuJyk7XG4gICAgICAgICAgaW5zZXJ0RG9tKGRvY3VtZW50LmJvZHksIGVsLCBiaW5kaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBPYmplY3QoZG9tX1tcInJlbW92ZUNsYXNzXCJdKShlbC5tYXNrLCAnaXMtZnVsbHNjcmVlbicpO1xuXG4gICAgICAgICAgaWYgKGJpbmRpbmcubW9kaWZpZXJzLmJvZHkpIHtcbiAgICAgICAgICAgIGVsLm9yaWdpbmFsUG9zaXRpb24gPSBPYmplY3QoZG9tX1tcImdldFN0eWxlXCJdKShkb2N1bWVudC5ib2R5LCAncG9zaXRpb24nKTtcblxuICAgICAgICAgICAgWyd0b3AnLCAnbGVmdCddLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgIHZhciBzY3JvbGwgPSBwcm9wZXJ0eSA9PT0gJ3RvcCcgPyAnc2Nyb2xsVG9wJyA6ICdzY3JvbGxMZWZ0JztcbiAgICAgICAgICAgICAgZWwubWFza1N0eWxlW3Byb3BlcnR5XSA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3Byb3BlcnR5XSArIGRvY3VtZW50LmJvZHlbc2Nyb2xsXSArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtzY3JvbGxdIC0gcGFyc2VJbnQoT2JqZWN0KGRvbV9bXCJnZXRTdHlsZVwiXSkoZG9jdW1lbnQuYm9keSwgJ21hcmdpbi0nICsgcHJvcGVydHkpLCAxMCkgKyAncHgnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBbJ2hlaWdodCcsICd3aWR0aCddLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgIGVsLm1hc2tTdHlsZVtwcm9wZXJ0eV0gPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtwcm9wZXJ0eV0gKyAncHgnO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGluc2VydERvbShkb2N1bWVudC5ib2R5LCBlbCwgYmluZGluZyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsLm9yaWdpbmFsUG9zaXRpb24gPSBPYmplY3QoZG9tX1tcImdldFN0eWxlXCJdKShlbCwgJ3Bvc2l0aW9uJyk7XG4gICAgICAgICAgICBpbnNlcnREb20oZWwsIGVsLCBiaW5kaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlcl9sZWF2ZV9kZWZhdWx0KCkoZWwuaW5zdGFuY2UsIGZ1bmN0aW9uIChfKSB7XG4gICAgICAgIGlmICghZWwuaW5zdGFuY2UuaGlkaW5nKSByZXR1cm47XG4gICAgICAgIGVsLmRvbVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdmFyIHRhcmdldCA9IGJpbmRpbmcubW9kaWZpZXJzLmZ1bGxzY3JlZW4gfHwgYmluZGluZy5tb2RpZmllcnMuYm9keSA/IGRvY3VtZW50LmJvZHkgOiBlbDtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJyZW1vdmVDbGFzc1wiXSkodGFyZ2V0LCAnZWwtbG9hZGluZy1wYXJlbnQtLXJlbGF0aXZlJyk7XG4gICAgICAgIE9iamVjdChkb21fW1wicmVtb3ZlQ2xhc3NcIl0pKHRhcmdldCwgJ2VsLWxvYWRpbmctcGFyZW50LS1oaWRkZW4nKTtcbiAgICAgICAgZWwuaW5zdGFuY2UuaGlkaW5nID0gZmFsc2U7XG4gICAgICB9LCAzMDAsIHRydWUpO1xuICAgICAgZWwuaW5zdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgZWwuaW5zdGFuY2UuaGlkaW5nID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIHZhciBpbnNlcnREb20gPSBmdW5jdGlvbiBpbnNlcnREb20ocGFyZW50LCBlbCwgYmluZGluZykge1xuICAgIGlmICghZWwuZG9tVmlzaWJsZSAmJiBPYmplY3QoZG9tX1tcImdldFN0eWxlXCJdKShlbCwgJ2Rpc3BsYXknKSAhPT0gJ25vbmUnICYmIE9iamVjdChkb21fW1wiZ2V0U3R5bGVcIl0pKGVsLCAndmlzaWJpbGl0eScpICE9PSAnaGlkZGVuJykge1xuICAgICAgT2JqZWN0LmtleXMoZWwubWFza1N0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgICBlbC5tYXNrLnN0eWxlW3Byb3BlcnR5XSA9IGVsLm1hc2tTdHlsZVtwcm9wZXJ0eV07XG4gICAgICB9KTtcblxuICAgICAgaWYgKGVsLm9yaWdpbmFsUG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgZWwub3JpZ2luYWxQb3NpdGlvbiAhPT0gJ2ZpeGVkJyAmJiBlbC5vcmlnaW5hbFBvc2l0aW9uICE9PSAnc3RpY2t5Jykge1xuICAgICAgICBPYmplY3QoZG9tX1tcImFkZENsYXNzXCJdKShwYXJlbnQsICdlbC1sb2FkaW5nLXBhcmVudC0tcmVsYXRpdmUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChiaW5kaW5nLm1vZGlmaWVycy5mdWxsc2NyZWVuICYmIGJpbmRpbmcubW9kaWZpZXJzLmxvY2spIHtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJhZGRDbGFzc1wiXSkocGFyZW50LCAnZWwtbG9hZGluZy1wYXJlbnQtLWhpZGRlbicpO1xuICAgICAgfVxuICAgICAgZWwuZG9tVmlzaWJsZSA9IHRydWU7XG5cbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbC5tYXNrKTtcbiAgICAgIFZ1ZS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChlbC5pbnN0YW5jZS5oaWRpbmcpIHtcbiAgICAgICAgICBlbC5pbnN0YW5jZS4kZW1pdCgnYWZ0ZXItbGVhdmUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbC5pbnN0YW5jZS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBlbC5kb21JbnNlcnRlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChlbC5kb21WaXNpYmxlICYmIGVsLmluc3RhbmNlLmhpZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgZWwuaW5zdGFuY2UudmlzaWJsZSA9IHRydWU7XG4gICAgICBlbC5pbnN0YW5jZS5oaWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgVnVlLmRpcmVjdGl2ZSgnbG9hZGluZycsIHtcbiAgICBiaW5kOiBmdW5jdGlvbiBiaW5kKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgICAgdmFyIHRleHRFeHIgPSBlbC5nZXRBdHRyaWJ1dGUoJ2VsZW1lbnQtbG9hZGluZy10ZXh0Jyk7XG4gICAgICB2YXIgc3Bpbm5lckV4ciA9IGVsLmdldEF0dHJpYnV0ZSgnZWxlbWVudC1sb2FkaW5nLXNwaW5uZXInKTtcbiAgICAgIHZhciBiYWNrZ3JvdW5kRXhyID0gZWwuZ2V0QXR0cmlidXRlKCdlbGVtZW50LWxvYWRpbmctYmFja2dyb3VuZCcpO1xuICAgICAgdmFyIGN1c3RvbUNsYXNzRXhyID0gZWwuZ2V0QXR0cmlidXRlKCdlbGVtZW50LWxvYWRpbmctY3VzdG9tLWNsYXNzJyk7XG4gICAgICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0O1xuICAgICAgdmFyIG1hc2sgPSBuZXcgTWFzayh7XG4gICAgICAgIGVsOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHRleHQ6IHZtICYmIHZtW3RleHRFeHJdIHx8IHRleHRFeHIsXG4gICAgICAgICAgc3Bpbm5lcjogdm0gJiYgdm1bc3Bpbm5lckV4cl0gfHwgc3Bpbm5lckV4cixcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB2bSAmJiB2bVtiYWNrZ3JvdW5kRXhyXSB8fCBiYWNrZ3JvdW5kRXhyLFxuICAgICAgICAgIGN1c3RvbUNsYXNzOiB2bSAmJiB2bVtjdXN0b21DbGFzc0V4cl0gfHwgY3VzdG9tQ2xhc3NFeHIsXG4gICAgICAgICAgZnVsbHNjcmVlbjogISFiaW5kaW5nLm1vZGlmaWVycy5mdWxsc2NyZWVuXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZWwuaW5zdGFuY2UgPSBtYXNrO1xuICAgICAgZWwubWFzayA9IG1hc2suJGVsO1xuICAgICAgZWwubWFza1N0eWxlID0ge307XG5cbiAgICAgIGJpbmRpbmcudmFsdWUgJiYgdG9nZ2xlTG9hZGluZyhlbCwgYmluZGluZyk7XG4gICAgfSxcblxuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGVsLCBiaW5kaW5nKSB7XG4gICAgICBlbC5pbnN0YW5jZS5zZXRUZXh0KGVsLmdldEF0dHJpYnV0ZSgnZWxlbWVudC1sb2FkaW5nLXRleHQnKSk7XG4gICAgICBpZiAoYmluZGluZy5vbGRWYWx1ZSAhPT0gYmluZGluZy52YWx1ZSkge1xuICAgICAgICB0b2dnbGVMb2FkaW5nKGVsLCBiaW5kaW5nKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQoZWwsIGJpbmRpbmcpIHtcbiAgICAgIGlmIChlbC5kb21JbnNlcnRlZCkge1xuICAgICAgICBlbC5tYXNrICYmIGVsLm1hc2sucGFyZW50Tm9kZSAmJiBlbC5tYXNrLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwubWFzayk7XG4gICAgICAgIHRvZ2dsZUxvYWRpbmcoZWwsIHsgdmFsdWU6IGZhbHNlLCBtb2RpZmllcnM6IGJpbmRpbmcubW9kaWZpZXJzIH0pO1xuICAgICAgfVxuICAgICAgZWwuaW5zdGFuY2UgJiYgZWwuaW5zdGFuY2UuJGRlc3Ryb3koKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2RpcmVjdGl2ZSA9IChsb2FkaW5nRGlyZWN0aXZlKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbG9hZGluZy9zcmMvaW5kZXguanNcblxuXG5cblxuXG5cblxudmFyIExvYWRpbmdDb25zdHJ1Y3RvciA9IGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEuZXh0ZW5kKGxvYWRpbmcpO1xuXG52YXIgc3JjX2RlZmF1bHRzID0ge1xuICB0ZXh0OiBudWxsLFxuICBmdWxsc2NyZWVuOiB0cnVlLFxuICBib2R5OiBmYWxzZSxcbiAgbG9jazogZmFsc2UsXG4gIGN1c3RvbUNsYXNzOiAnJ1xufTtcblxudmFyIGZ1bGxzY3JlZW5Mb2FkaW5nID0gdm9pZCAwO1xuXG5Mb2FkaW5nQ29uc3RydWN0b3IucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb24gPSAnJztcbkxvYWRpbmdDb25zdHJ1Y3Rvci5wcm90b3R5cGUub3JpZ2luYWxPdmVyZmxvdyA9ICcnO1xuXG5Mb2FkaW5nQ29uc3RydWN0b3IucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIGlmICh0aGlzLmZ1bGxzY3JlZW4pIHtcbiAgICBmdWxsc2NyZWVuTG9hZGluZyA9IHVuZGVmaW5lZDtcbiAgfVxuICBhZnRlcl9sZWF2ZV9kZWZhdWx0KCkodGhpcywgZnVuY3Rpb24gKF8pIHtcbiAgICB2YXIgdGFyZ2V0ID0gX3RoaXMuZnVsbHNjcmVlbiB8fCBfdGhpcy5ib2R5ID8gZG9jdW1lbnQuYm9keSA6IF90aGlzLnRhcmdldDtcbiAgICBPYmplY3QoZG9tX1tcInJlbW92ZUNsYXNzXCJdKSh0YXJnZXQsICdlbC1sb2FkaW5nLXBhcmVudC0tcmVsYXRpdmUnKTtcbiAgICBPYmplY3QoZG9tX1tcInJlbW92ZUNsYXNzXCJdKSh0YXJnZXQsICdlbC1sb2FkaW5nLXBhcmVudC0taGlkZGVuJyk7XG4gICAgaWYgKF90aGlzLiRlbCAmJiBfdGhpcy4kZWwucGFyZW50Tm9kZSkge1xuICAgICAgX3RoaXMuJGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoX3RoaXMuJGVsKTtcbiAgICB9XG4gICAgX3RoaXMuJGRlc3Ryb3koKTtcbiAgfSwgMzAwKTtcbiAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG59O1xuXG52YXIgc3JjX2FkZFN0eWxlID0gZnVuY3Rpb24gYWRkU3R5bGUob3B0aW9ucywgcGFyZW50LCBpbnN0YW5jZSkge1xuICB2YXIgbWFza1N0eWxlID0ge307XG4gIGlmIChvcHRpb25zLmZ1bGxzY3JlZW4pIHtcbiAgICBpbnN0YW5jZS5vcmlnaW5hbFBvc2l0aW9uID0gT2JqZWN0KGRvbV9bXCJnZXRTdHlsZVwiXSkoZG9jdW1lbnQuYm9keSwgJ3Bvc2l0aW9uJyk7XG4gICAgaW5zdGFuY2Uub3JpZ2luYWxPdmVyZmxvdyA9IE9iamVjdChkb21fW1wiZ2V0U3R5bGVcIl0pKGRvY3VtZW50LmJvZHksICdvdmVyZmxvdycpO1xuICAgIG1hc2tTdHlsZS56SW5kZXggPSBwb3B1cF9bXCJQb3B1cE1hbmFnZXJcIl0ubmV4dFpJbmRleCgpO1xuICB9IGVsc2UgaWYgKG9wdGlvbnMuYm9keSkge1xuICAgIGluc3RhbmNlLm9yaWdpbmFsUG9zaXRpb24gPSBPYmplY3QoZG9tX1tcImdldFN0eWxlXCJdKShkb2N1bWVudC5ib2R5LCAncG9zaXRpb24nKTtcbiAgICBbJ3RvcCcsICdsZWZ0J10uZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgIHZhciBzY3JvbGwgPSBwcm9wZXJ0eSA9PT0gJ3RvcCcgPyAnc2Nyb2xsVG9wJyA6ICdzY3JvbGxMZWZ0JztcbiAgICAgIG1hc2tTdHlsZVtwcm9wZXJ0eV0gPSBvcHRpb25zLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtwcm9wZXJ0eV0gKyBkb2N1bWVudC5ib2R5W3Njcm9sbF0gKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbc2Nyb2xsXSArICdweCc7XG4gICAgfSk7XG4gICAgWydoZWlnaHQnLCAnd2lkdGgnXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgbWFza1N0eWxlW3Byb3BlcnR5XSA9IG9wdGlvbnMudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3Byb3BlcnR5XSArICdweCc7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2Uub3JpZ2luYWxQb3NpdGlvbiA9IE9iamVjdChkb21fW1wiZ2V0U3R5bGVcIl0pKHBhcmVudCwgJ3Bvc2l0aW9uJyk7XG4gIH1cbiAgT2JqZWN0LmtleXMobWFza1N0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgIGluc3RhbmNlLiRlbC5zdHlsZVtwcm9wZXJ0eV0gPSBtYXNrU3R5bGVbcHJvcGVydHldO1xuICB9KTtcbn07XG5cbnZhciBzcmNfTG9hZGluZyA9IGZ1bmN0aW9uIExvYWRpbmcoKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICBpZiAoZXh0ZXJuYWxfdnVlX2RlZmF1bHQuYS5wcm90b3R5cGUuJGlzU2VydmVyKSByZXR1cm47XG4gIG9wdGlvbnMgPSBtZXJnZV9kZWZhdWx0KCkoe30sIHNyY19kZWZhdWx0cywgb3B0aW9ucyk7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy50YXJnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy50YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG9wdGlvbnMudGFyZ2V0KTtcbiAgfVxuICBvcHRpb25zLnRhcmdldCA9IG9wdGlvbnMudGFyZ2V0IHx8IGRvY3VtZW50LmJvZHk7XG4gIGlmIChvcHRpb25zLnRhcmdldCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgIG9wdGlvbnMuZnVsbHNjcmVlbiA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMuYm9keSA9IHRydWU7XG4gIH1cbiAgaWYgKG9wdGlvbnMuZnVsbHNjcmVlbiAmJiBmdWxsc2NyZWVuTG9hZGluZykge1xuICAgIHJldHVybiBmdWxsc2NyZWVuTG9hZGluZztcbiAgfVxuXG4gIHZhciBwYXJlbnQgPSBvcHRpb25zLmJvZHkgPyBkb2N1bWVudC5ib2R5IDogb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBpbnN0YW5jZSA9IG5ldyBMb2FkaW5nQ29uc3RydWN0b3Ioe1xuICAgIGVsOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxcbiAgICBkYXRhOiBvcHRpb25zXG4gIH0pO1xuXG4gIHNyY19hZGRTdHlsZShvcHRpb25zLCBwYXJlbnQsIGluc3RhbmNlKTtcbiAgaWYgKGluc3RhbmNlLm9yaWdpbmFsUG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgaW5zdGFuY2Uub3JpZ2luYWxQb3NpdGlvbiAhPT0gJ2ZpeGVkJyAmJiBpbnN0YW5jZS5vcmlnaW5hbFBvc2l0aW9uICE9PSAnc3RpY2t5Jykge1xuICAgIE9iamVjdChkb21fW1wiYWRkQ2xhc3NcIl0pKHBhcmVudCwgJ2VsLWxvYWRpbmctcGFyZW50LS1yZWxhdGl2ZScpO1xuICB9XG4gIGlmIChvcHRpb25zLmZ1bGxzY3JlZW4gJiYgb3B0aW9ucy5sb2NrKSB7XG4gICAgT2JqZWN0KGRvbV9bXCJhZGRDbGFzc1wiXSkocGFyZW50LCAnZWwtbG9hZGluZy1wYXJlbnQtLWhpZGRlbicpO1xuICB9XG4gIHBhcmVudC5hcHBlbmRDaGlsZChpbnN0YW5jZS4kZWwpO1xuICBleHRlcm5hbF92dWVfZGVmYXVsdC5hLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICBpbnN0YW5jZS52aXNpYmxlID0gdHJ1ZTtcbiAgfSk7XG4gIGlmIChvcHRpb25zLmZ1bGxzY3JlZW4pIHtcbiAgICBmdWxsc2NyZWVuTG9hZGluZyA9IGluc3RhbmNlO1xuICB9XG4gIHJldHVybiBpbnN0YW5jZTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyYyA9IChzcmNfTG9hZGluZyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2xvYWRpbmcvaW5kZXguanNcblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2xvYWRpbmcgPSAoe1xuICBpbnN0YWxsOiBmdW5jdGlvbiBpbnN0YWxsKFZ1ZSkge1xuICAgIFZ1ZS51c2Uoc3JjX2RpcmVjdGl2ZSk7XG4gICAgVnVlLnByb3RvdHlwZS4kbG9hZGluZyA9IHNyYztcbiAgfSxcblxuICBkaXJlY3RpdmU6IHNyY19kaXJlY3RpdmUsXG4gIHNlcnZpY2U6IHNyY1xufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2ljb24vc3JjL2ljb24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWNiM2ZlN2Y0JlxudmFyIGljb252dWVfdHlwZV90ZW1wbGF0ZV9pZF9jYjNmZTdmNF9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJpXCIsIHsgY2xhc3M6IFwiZWwtaWNvbi1cIiArIF92bS5uYW1lIH0pXG59XG52YXIgaWNvbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2NiM2ZlN2Y0X3N0YXRpY1JlbmRlckZucyA9IFtdXG5pY29udnVlX3R5cGVfdGVtcGxhdGVfaWRfY2IzZmU3ZjRfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pY29uL3NyYy9pY29uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1jYjNmZTdmNCZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaWNvbi9zcmMvaWNvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpY29udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsSWNvbicsXG5cbiAgcHJvcHM6IHtcbiAgICBuYW1lOiBTdHJpbmdcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2ljb24vc3JjL2ljb24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19pY29udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGljb252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaWNvbi9zcmMvaWNvbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBpY29uX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2ljb252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGljb252dWVfdHlwZV90ZW1wbGF0ZV9pZF9jYjNmZTdmNF9yZW5kZXIsXG4gIGljb252dWVfdHlwZV90ZW1wbGF0ZV9pZF9jYjNmZTdmNF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGljb25fYXBpOyB9XG5pY29uX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvaWNvbi9zcmMvaWNvbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaWNvbiA9IChpY29uX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaWNvbi9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5pY29uLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoaWNvbi5uYW1lLCBpY29uKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2ljb24gPSAoaWNvbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Jvdy9zcmMvcm93LmpzXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfcm93ID0gKHtcbiAgbmFtZTogJ0VsUm93JyxcblxuICBjb21wb25lbnROYW1lOiAnRWxSb3cnLFxuXG4gIHByb3BzOiB7XG4gICAgdGFnOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnZGl2J1xuICAgIH0sXG4gICAgZ3V0dGVyOiBOdW1iZXIsXG4gICAgdHlwZTogU3RyaW5nLFxuICAgIGp1c3RpZnk6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdzdGFydCdcbiAgICB9LFxuICAgIGFsaWduOiBTdHJpbmdcbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHN0eWxlOiBmdW5jdGlvbiBzdHlsZSgpIHtcbiAgICAgIHZhciByZXQgPSB7fTtcblxuICAgICAgaWYgKHRoaXMuZ3V0dGVyKSB7XG4gICAgICAgIHJldC5tYXJnaW5MZWZ0ID0gJy0nICsgdGhpcy5ndXR0ZXIgLyAyICsgJ3B4JztcbiAgICAgICAgcmV0Lm1hcmdpblJpZ2h0ID0gcmV0Lm1hcmdpbkxlZnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICByZXR1cm4gaCh0aGlzLnRhZywge1xuICAgICAgY2xhc3M6IFsnZWwtcm93JywgdGhpcy5qdXN0aWZ5ICE9PSAnc3RhcnQnID8gJ2lzLWp1c3RpZnktJyArIHRoaXMuanVzdGlmeSA6ICcnLCB0aGlzLmFsaWduID8gJ2lzLWFsaWduLScgKyB0aGlzLmFsaWduIDogJycsIHsgJ2VsLXJvdy0tZmxleCc6IHRoaXMudHlwZSA9PT0gJ2ZsZXgnIH1dLFxuICAgICAgc3R5bGU6IHRoaXMuc3R5bGVcbiAgICB9LCB0aGlzLiRzbG90cy5kZWZhdWx0KTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Jvdy9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zcmNfcm93Lmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoc3JjX3Jvdy5uYW1lLCBzcmNfcm93KTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3JvdyA9IChzcmNfcm93KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sL3NyYy9jb2wuanNcbnZhciBjb2xfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY29sID0gKHtcbiAgbmFtZTogJ0VsQ29sJyxcblxuICBwcm9wczoge1xuICAgIHNwYW46IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDI0XG4gICAgfSxcbiAgICB0YWc6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdkaXYnXG4gICAgfSxcbiAgICBvZmZzZXQ6IE51bWJlcixcbiAgICBwdWxsOiBOdW1iZXIsXG4gICAgcHVzaDogTnVtYmVyLFxuICAgIHhzOiBbTnVtYmVyLCBPYmplY3RdLFxuICAgIHNtOiBbTnVtYmVyLCBPYmplY3RdLFxuICAgIG1kOiBbTnVtYmVyLCBPYmplY3RdLFxuICAgIGxnOiBbTnVtYmVyLCBPYmplY3RdLFxuICAgIHhsOiBbTnVtYmVyLCBPYmplY3RdXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBndXR0ZXI6IGZ1bmN0aW9uIGd1dHRlcigpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG4gICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC4kb3B0aW9ucy5jb21wb25lbnROYW1lICE9PSAnRWxSb3cnKSB7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5ndXR0ZXIgOiAwO1xuICAgIH1cbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgY2xhc3NMaXN0ID0gW107XG4gICAgdmFyIHN0eWxlID0ge307XG5cbiAgICBpZiAodGhpcy5ndXR0ZXIpIHtcbiAgICAgIHN0eWxlLnBhZGRpbmdMZWZ0ID0gdGhpcy5ndXR0ZXIgLyAyICsgJ3B4JztcbiAgICAgIHN0eWxlLnBhZGRpbmdSaWdodCA9IHN0eWxlLnBhZGRpbmdMZWZ0O1xuICAgIH1cblxuICAgIFsnc3BhbicsICdvZmZzZXQnLCAncHVsbCcsICdwdXNoJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgaWYgKF90aGlzW3Byb3BdIHx8IF90aGlzW3Byb3BdID09PSAwKSB7XG4gICAgICAgIGNsYXNzTGlzdC5wdXNoKHByb3AgIT09ICdzcGFuJyA/ICdlbC1jb2wtJyArIHByb3AgKyAnLScgKyBfdGhpc1twcm9wXSA6ICdlbC1jb2wtJyArIF90aGlzW3Byb3BdKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIFsneHMnLCAnc20nLCAnbWQnLCAnbGcnLCAneGwnXS5mb3JFYWNoKGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICBpZiAodHlwZW9mIF90aGlzW3NpemVdID09PSAnbnVtYmVyJykge1xuICAgICAgICBjbGFzc0xpc3QucHVzaCgnZWwtY29sLScgKyBzaXplICsgJy0nICsgX3RoaXNbc2l6ZV0pO1xuICAgICAgfSBlbHNlIGlmIChjb2xfdHlwZW9mKF90aGlzW3NpemVdKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIHByb3BzID0gX3RoaXNbc2l6ZV07XG4gICAgICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgY2xhc3NMaXN0LnB1c2gocHJvcCAhPT0gJ3NwYW4nID8gJ2VsLWNvbC0nICsgc2l6ZSArICctJyArIHByb3AgKyAnLScgKyBwcm9wc1twcm9wXSA6ICdlbC1jb2wtJyArIHNpemUgKyAnLScgKyBwcm9wc1twcm9wXSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGgodGhpcy50YWcsIHtcbiAgICAgIGNsYXNzOiBbJ2VsLWNvbCcsIGNsYXNzTGlzdF0sXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9LCB0aGlzLiRzbG90cy5kZWZhdWx0KTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbC9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jb2wuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChjb2wubmFtZSwgY29sKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2NvbCA9IChjb2wpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy91cGxvYWQvc3JjL3VwbG9hZC1saXN0LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xNzNmZWRmNSZcbnZhciB1cGxvYWRfbGlzdHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE3M2ZlZGY1X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcInRyYW5zaXRpb24tZ3JvdXBcIixcbiAgICB7XG4gICAgICBjbGFzczogW1xuICAgICAgICBcImVsLXVwbG9hZC1saXN0XCIsXG4gICAgICAgIFwiZWwtdXBsb2FkLWxpc3QtLVwiICsgX3ZtLmxpc3RUeXBlLFxuICAgICAgICB7IFwiaXMtZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkIH1cbiAgICAgIF0sXG4gICAgICBhdHRyczogeyB0YWc6IFwidWxcIiwgbmFtZTogXCJlbC1saXN0XCIgfVxuICAgIH0sXG4gICAgX3ZtLl9sKF92bS5maWxlcywgZnVuY3Rpb24oZmlsZSkge1xuICAgICAgcmV0dXJuIF9jKFxuICAgICAgICBcImxpXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6IGZpbGUudWlkLFxuICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICBcImVsLXVwbG9hZC1saXN0X19pdGVtXCIsXG4gICAgICAgICAgICBcImlzLVwiICsgZmlsZS5zdGF0dXMsXG4gICAgICAgICAgICBfdm0uZm9jdXNpbmcgPyBcImZvY3VzaW5nXCIgOiBcIlwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhdHRyczogeyB0YWJpbmRleDogXCIwXCIgfSxcbiAgICAgICAgICBvbjoge1xuICAgICAgICAgICAga2V5ZG93bjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJkZWxldGVcIiwgWzgsIDQ2XSwgJGV2ZW50LmtleSwgW1xuICAgICAgICAgICAgICAgICAgXCJCYWNrc3BhY2VcIixcbiAgICAgICAgICAgICAgICAgIFwiRGVsZXRlXCIsXG4gICAgICAgICAgICAgICAgICBcIkRlbFwiXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAhX3ZtLmRpc2FibGVkICYmIF92bS4kZW1pdChcInJlbW92ZVwiLCBmaWxlKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvY3VzOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgX3ZtLmZvY3VzaW5nID0gdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsdXI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICBfdm0uZm9jdXNpbmcgPSBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgX3ZtLmZvY3VzaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfdm0uX3QoXG4gICAgICAgICAgICBcImRlZmF1bHRcIixcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgZmlsZS5zdGF0dXMgIT09IFwidXBsb2FkaW5nXCIgJiZcbiAgICAgICAgICAgICAgW1wicGljdHVyZS1jYXJkXCIsIFwicGljdHVyZVwiXS5pbmRleE9mKF92bS5saXN0VHlwZSkgPiAtMVxuICAgICAgICAgICAgICAgID8gX2MoXCJpbWdcIiwge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC11cGxvYWQtbGlzdF9faXRlbS10aHVtYm5haWxcIixcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgc3JjOiBmaWxlLnVybCwgYWx0OiBcIlwiIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJhXCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdXBsb2FkLWxpc3RfX2l0ZW0tbmFtZVwiLFxuICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVDbGljayhmaWxlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICBfYyhcImlcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pY29uLWRvY3VtZW50XCIgfSksXG4gICAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKGZpbGUubmFtZSkgKyBcIlxcbiAgICAgIFwiKVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJsYWJlbFwiLFxuICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtdXBsb2FkLWxpc3RfX2l0ZW0tc3RhdHVzLWxhYmVsXCIgfSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICAgIFwiZWwtaWNvbi11cGxvYWQtc3VjY2Vzc1wiOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIFwiZWwtaWNvbi1jaXJjbGUtY2hlY2tcIjogX3ZtLmxpc3RUeXBlID09PSBcInRleHRcIixcbiAgICAgICAgICAgICAgICAgICAgICBcImVsLWljb24tY2hlY2tcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcInBpY3R1cmUtY2FyZFwiLCBcInBpY3R1cmVcIl0uaW5kZXhPZihfdm0ubGlzdFR5cGUpID4gLTFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICFfdm0uZGlzYWJsZWRcbiAgICAgICAgICAgICAgICA/IF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWljb24tY2xvc2VcIixcbiAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uJGVtaXQoXCJyZW1vdmVcIiwgZmlsZSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgIV92bS5kaXNhYmxlZFxuICAgICAgICAgICAgICAgID8gX2MoXCJpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtaWNvbi1jbG9zZS10aXBcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLnQoXCJlbC51cGxvYWQuZGVsZXRlVGlwXCIpKSlcbiAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgZmlsZS5zdGF0dXMgPT09IFwidXBsb2FkaW5nXCJcbiAgICAgICAgICAgICAgICA/IF9jKFwiZWwtcHJvZ3Jlc3NcIiwge1xuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IF92bS5saXN0VHlwZSA9PT0gXCJwaWN0dXJlLWNhcmRcIiA/IFwiY2lyY2xlXCIgOiBcImxpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgICBcInN0cm9rZS13aWR0aFwiOiBfdm0ubGlzdFR5cGUgPT09IFwicGljdHVyZS1jYXJkXCIgPyA2IDogMixcbiAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlOiBfdm0ucGFyc2VQZXJjZW50YWdlKGZpbGUucGVyY2VudGFnZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICBfdm0ubGlzdFR5cGUgPT09IFwicGljdHVyZS1jYXJkXCJcbiAgICAgICAgICAgICAgICA/IF9jKFwic3BhblwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXVwbG9hZC1saXN0X19pdGVtLWFjdGlvbnNcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVQcmV2aWV3ICYmIF92bS5saXN0VHlwZSA9PT0gXCJwaWN0dXJlLWNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdXBsb2FkLWxpc3RfX2l0ZW0tcHJldmlld1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVQcmV2aWV3KGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbX2MoXCJpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtaWNvbi16b29tLWluXCIgfSldXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgIV92bS5kaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtdXBsb2FkLWxpc3RfX2l0ZW0tZGVsZXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLiRlbWl0KFwicmVtb3ZlXCIsIGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbX2MoXCJpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtaWNvbi1kZWxldGVcIiB9KV1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGZpbGU6IGZpbGUgfVxuICAgICAgICAgIClcbiAgICAgICAgXSxcbiAgICAgICAgMlxuICAgICAgKVxuICAgIH0pLFxuICAgIDBcbiAgKVxufVxudmFyIHVwbG9hZF9saXN0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMTczZmVkZjVfc3RhdGljUmVuZGVyRm5zID0gW11cbnVwbG9hZF9saXN0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMTczZmVkZjVfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy91cGxvYWQvc3JjL3VwbG9hZC1saXN0LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xNzNmZWRmNSZcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3Byb2dyZXNzXCJcbnZhciBwcm9ncmVzc18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KTtcbnZhciBwcm9ncmVzc19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihwcm9ncmVzc18pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy91cGxvYWQvc3JjL3VwbG9hZC1saXN0LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHVwbG9hZF9saXN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcblxuICBuYW1lOiAnRWxVcGxvYWRMaXN0JyxcblxuICBtaXhpbnM6IFtsb2NhbGVfZGVmYXVsdC5hXSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1c2luZzogZmFsc2VcbiAgICB9O1xuICB9LFxuXG4gIGNvbXBvbmVudHM6IHsgRWxQcm9ncmVzczogcHJvZ3Jlc3NfZGVmYXVsdC5hIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBmaWxlczoge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGlzYWJsZWQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgaGFuZGxlUHJldmlldzogRnVuY3Rpb24sXG4gICAgbGlzdFR5cGU6IFN0cmluZ1xuICB9LFxuICBtZXRob2RzOiB7XG4gICAgcGFyc2VQZXJjZW50YWdlOiBmdW5jdGlvbiBwYXJzZVBlcmNlbnRhZ2UodmFsKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgfSxcbiAgICBoYW5kbGVDbGljazogZnVuY3Rpb24gaGFuZGxlQ2xpY2soZmlsZSkge1xuICAgICAgdGhpcy5oYW5kbGVQcmV2aWV3ICYmIHRoaXMuaGFuZGxlUHJldmlldyhmaWxlKTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy91cGxvYWQvc3JjL3VwbG9hZC1saXN0LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfdXBsb2FkX2xpc3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAodXBsb2FkX2xpc3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtbGlzdC52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciB1cGxvYWRfbGlzdF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY191cGxvYWRfbGlzdHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgdXBsb2FkX2xpc3R2dWVfdHlwZV90ZW1wbGF0ZV9pZF8xNzNmZWRmNV9yZW5kZXIsXG4gIHVwbG9hZF9saXN0dnVlX3R5cGVfdGVtcGxhdGVfaWRfMTczZmVkZjVfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciB1cGxvYWRfbGlzdF9hcGk7IH1cbnVwbG9hZF9saXN0X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtbGlzdC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdXBsb2FkX2xpc3QgPSAodXBsb2FkX2xpc3RfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImJhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzXCJcbnZhciBleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KTtcbnZhciBleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc18pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3VwbG9hZC9zcmMvYWpheC5qc1xuZnVuY3Rpb24gZ2V0RXJyb3IoYWN0aW9uLCBvcHRpb24sIHhocikge1xuICB2YXIgbXNnID0gdm9pZCAwO1xuICBpZiAoeGhyLnJlc3BvbnNlKSB7XG4gICAgbXNnID0gJycgKyAoeGhyLnJlc3BvbnNlLmVycm9yIHx8IHhoci5yZXNwb25zZSk7XG4gIH0gZWxzZSBpZiAoeGhyLnJlc3BvbnNlVGV4dCkge1xuICAgIG1zZyA9ICcnICsgeGhyLnJlc3BvbnNlVGV4dDtcbiAgfSBlbHNlIHtcbiAgICBtc2cgPSAnZmFpbCB0byBwb3N0ICcgKyBhY3Rpb24gKyAnICcgKyB4aHIuc3RhdHVzO1xuICB9XG5cbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICBlcnIuc3RhdHVzID0geGhyLnN0YXR1cztcbiAgZXJyLm1ldGhvZCA9ICdwb3N0JztcbiAgZXJyLnVybCA9IGFjdGlvbjtcbiAgcmV0dXJuIGVycjtcbn1cblxuZnVuY3Rpb24gZ2V0Qm9keSh4aHIpIHtcbiAgdmFyIHRleHQgPSB4aHIucmVzcG9uc2VUZXh0IHx8IHhoci5yZXNwb25zZTtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBsb2FkKG9wdGlvbikge1xuICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgdmFyIGFjdGlvbiA9IG9wdGlvbi5hY3Rpb247XG5cbiAgaWYgKHhoci51cGxvYWQpIHtcbiAgICB4aHIudXBsb2FkLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiBwcm9ncmVzcyhlKSB7XG4gICAgICBpZiAoZS50b3RhbCA+IDApIHtcbiAgICAgICAgZS5wZXJjZW50ID0gZS5sb2FkZWQgLyBlLnRvdGFsICogMTAwO1xuICAgICAgfVxuICAgICAgb3B0aW9uLm9uUHJvZ3Jlc3MoZSk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gIGlmIChvcHRpb24uZGF0YSkge1xuICAgIE9iamVjdC5rZXlzKG9wdGlvbi5kYXRhKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9wdGlvbi5kYXRhW2tleV0pO1xuICAgIH0pO1xuICB9XG5cbiAgZm9ybURhdGEuYXBwZW5kKG9wdGlvbi5maWxlbmFtZSwgb3B0aW9uLmZpbGUsIG9wdGlvbi5maWxlLm5hbWUpO1xuXG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gZXJyb3IoZSkge1xuICAgIG9wdGlvbi5vbkVycm9yKGUpO1xuICB9O1xuXG4gIHhoci5vbmxvYWQgPSBmdW5jdGlvbiBvbmxvYWQoKSB7XG4gICAgaWYgKHhoci5zdGF0dXMgPCAyMDAgfHwgeGhyLnN0YXR1cyA+PSAzMDApIHtcbiAgICAgIHJldHVybiBvcHRpb24ub25FcnJvcihnZXRFcnJvcihhY3Rpb24sIG9wdGlvbiwgeGhyKSk7XG4gICAgfVxuXG4gICAgb3B0aW9uLm9uU3VjY2VzcyhnZXRCb2R5KHhocikpO1xuICB9O1xuXG4gIHhoci5vcGVuKCdwb3N0JywgYWN0aW9uLCB0cnVlKTtcblxuICBpZiAob3B0aW9uLndpdGhDcmVkZW50aWFscyAmJiAnd2l0aENyZWRlbnRpYWxzJyBpbiB4aHIpIHtcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBoZWFkZXJzID0gb3B0aW9uLmhlYWRlcnMgfHwge307XG5cbiAgZm9yICh2YXIgaXRlbSBpbiBoZWFkZXJzKSB7XG4gICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaXRlbSkgJiYgaGVhZGVyc1tpdGVtXSAhPT0gbnVsbCkge1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaXRlbSwgaGVhZGVyc1tpdGVtXSk7XG4gICAgfVxuICB9XG4gIHhoci5zZW5kKGZvcm1EYXRhKTtcbiAgcmV0dXJuIHhocjtcbn1cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtZHJhZ2dlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9N2ViYmYyMTkmXG52YXIgdXBsb2FkX2RyYWdnZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZWJiZjIxOV9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC11cGxvYWQtZHJhZ2dlclwiLFxuICAgICAgY2xhc3M6IHtcbiAgICAgICAgXCJpcy1kcmFnb3ZlclwiOiBfdm0uZHJhZ292ZXJcbiAgICAgIH0sXG4gICAgICBvbjoge1xuICAgICAgICBkcm9wOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIHJldHVybiBfdm0ub25Ecm9wKCRldmVudClcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ292ZXI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgcmV0dXJuIF92bS5vbkRyYWdvdmVyKCRldmVudClcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2xlYXZlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIF92bS5kcmFnb3ZlciA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAyXG4gIClcbn1cbnZhciB1cGxvYWRfZHJhZ2dlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdlYmJmMjE5X3N0YXRpY1JlbmRlckZucyA9IFtdXG51cGxvYWRfZHJhZ2dlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdlYmJmMjE5X3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtZHJhZ2dlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9N2ViYmYyMTkmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3VwbG9hZC9zcmMvdXBsb2FkLWRyYWdnZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdXBsb2FkX2RyYWdnZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxVcGxvYWREcmFnJyxcbiAgcHJvcHM6IHtcbiAgICBkaXNhYmxlZDogQm9vbGVhblxuICB9LFxuICBpbmplY3Q6IHtcbiAgICB1cGxvYWRlcjoge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9XG4gIH0sXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRyYWdvdmVyOiBmYWxzZVxuICAgIH07XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uRHJhZ292ZXI6IGZ1bmN0aW9uIG9uRHJhZ292ZXIoKSB7XG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kcmFnb3ZlciA9IHRydWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkRyb3A6IGZ1bmN0aW9uIG9uRHJvcChlKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy51cGxvYWRlcikgcmV0dXJuO1xuICAgICAgdmFyIGFjY2VwdCA9IHRoaXMudXBsb2FkZXIuYWNjZXB0O1xuICAgICAgdGhpcy5kcmFnb3ZlciA9IGZhbHNlO1xuICAgICAgaWYgKCFhY2NlcHQpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgnZmlsZScsIGUuZGF0YVRyYW5zZmVyLmZpbGVzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy4kZW1pdCgnZmlsZScsIFtdLnNsaWNlLmNhbGwoZS5kYXRhVHJhbnNmZXIuZmlsZXMpLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICB2YXIgdHlwZSA9IGZpbGUudHlwZSxcbiAgICAgICAgICAgIG5hbWUgPSBmaWxlLm5hbWU7XG5cbiAgICAgICAgdmFyIGV4dGVuc2lvbiA9IG5hbWUuaW5kZXhPZignLicpID4gLTEgPyAnLicgKyBuYW1lLnNwbGl0KCcuJykucG9wKCkgOiAnJztcbiAgICAgICAgdmFyIGJhc2VUeXBlID0gdHlwZS5yZXBsYWNlKC9cXC8uKiQvLCAnJyk7XG4gICAgICAgIHJldHVybiBhY2NlcHQuc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZS50cmltKCk7XG4gICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9KS5zb21lKGZ1bmN0aW9uIChhY2NlcHRlZFR5cGUpIHtcbiAgICAgICAgICBpZiAoL1xcLi4rJC8udGVzdChhY2NlcHRlZFR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uID09PSBhY2NlcHRlZFR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgvXFwvXFwqJC8udGVzdChhY2NlcHRlZFR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gYmFzZVR5cGUgPT09IGFjY2VwdGVkVHlwZS5yZXBsYWNlKC9cXC9cXCokLywgJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoL15bXlxcL10rXFwvW15cXC9dKyQvLnRlc3QoYWNjZXB0ZWRUeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT09IGFjY2VwdGVkVHlwZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy91cGxvYWQvc3JjL3VwbG9hZC1kcmFnZ2VyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfdXBsb2FkX2RyYWdnZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAodXBsb2FkX2RyYWdnZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtZHJhZ2dlci52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciB1cGxvYWRfZHJhZ2dlcl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY191cGxvYWRfZHJhZ2dlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgdXBsb2FkX2RyYWdnZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZWJiZjIxOV9yZW5kZXIsXG4gIHVwbG9hZF9kcmFnZ2VydnVlX3R5cGVfdGVtcGxhdGVfaWRfN2ViYmYyMTlfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciB1cGxvYWRfZHJhZ2dlcl9hcGk7IH1cbnVwbG9hZF9kcmFnZ2VyX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQtZHJhZ2dlci52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdXBsb2FkX2RyYWdnZXIgPSAodXBsb2FkX2RyYWdnZXJfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdXBsb2FkL3NyYy91cGxvYWQudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHVwbG9hZHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIGluamVjdDogWyd1cGxvYWRlciddLFxuICBjb21wb25lbnRzOiB7XG4gICAgVXBsb2FkRHJhZ2dlcjogdXBsb2FkX2RyYWdnZXJcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgYWN0aW9uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgbmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2ZpbGUnXG4gICAgfSxcbiAgICBkYXRhOiBPYmplY3QsXG4gICAgaGVhZGVyczogT2JqZWN0LFxuICAgIHdpdGhDcmVkZW50aWFsczogQm9vbGVhbixcbiAgICBtdWx0aXBsZTogQm9vbGVhbixcbiAgICBhY2NlcHQ6IFN0cmluZyxcbiAgICBvblN0YXJ0OiBGdW5jdGlvbixcbiAgICBvblByb2dyZXNzOiBGdW5jdGlvbixcbiAgICBvblN1Y2Nlc3M6IEZ1bmN0aW9uLFxuICAgIG9uRXJyb3I6IEZ1bmN0aW9uLFxuICAgIGJlZm9yZVVwbG9hZDogRnVuY3Rpb24sXG4gICAgZHJhZzogQm9vbGVhbixcbiAgICBvblByZXZpZXc6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7fVxuICAgIH0sXG4gICAgb25SZW1vdmU6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7fVxuICAgIH0sXG4gICAgZmlsZUxpc3Q6IEFycmF5LFxuICAgIGF1dG9VcGxvYWQ6IEJvb2xlYW4sXG4gICAgbGlzdFR5cGU6IFN0cmluZyxcbiAgICBodHRwUmVxdWVzdDoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1cGxvYWRcbiAgICB9LFxuICAgIGRpc2FibGVkOiBCb29sZWFuLFxuICAgIGxpbWl0OiBOdW1iZXIsXG4gICAgb25FeGNlZWQ6IEZ1bmN0aW9uXG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW91c2VvdmVyOiBmYWxzZSxcbiAgICAgIHJlcXM6IHt9XG4gICAgfTtcbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBpc0ltYWdlOiBmdW5jdGlvbiBpc0ltYWdlKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci5pbmRleE9mKCdpbWFnZScpICE9PSAtMTtcbiAgICB9LFxuICAgIGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2KSB7XG4gICAgICB2YXIgZmlsZXMgPSBldi50YXJnZXQuZmlsZXM7XG5cbiAgICAgIGlmICghZmlsZXMpIHJldHVybjtcbiAgICAgIHRoaXMudXBsb2FkRmlsZXMoZmlsZXMpO1xuICAgIH0sXG4gICAgdXBsb2FkRmlsZXM6IGZ1bmN0aW9uIHVwbG9hZEZpbGVzKGZpbGVzKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5saW1pdCAmJiB0aGlzLmZpbGVMaXN0Lmxlbmd0aCArIGZpbGVzLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcbiAgICAgICAgdGhpcy5vbkV4Y2VlZCAmJiB0aGlzLm9uRXhjZWVkKGZpbGVzLCB0aGlzLmZpbGVMaXN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcG9zdEZpbGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZmlsZXMpO1xuICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHBvc3RGaWxlcyA9IHBvc3RGaWxlcy5zbGljZSgwLCAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvc3RGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwb3N0RmlsZXMuZm9yRWFjaChmdW5jdGlvbiAocmF3RmlsZSkge1xuICAgICAgICBfdGhpcy5vblN0YXJ0KHJhd0ZpbGUpO1xuICAgICAgICBpZiAoX3RoaXMuYXV0b1VwbG9hZCkgX3RoaXMudXBsb2FkKHJhd0ZpbGUpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICB1cGxvYWQ6IGZ1bmN0aW9uIHVwbG9hZChyYXdGaWxlKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy4kcmVmcy5pbnB1dC52YWx1ZSA9IG51bGw7XG5cbiAgICAgIGlmICghdGhpcy5iZWZvcmVVcGxvYWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdChyYXdGaWxlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJlZm9yZSA9IHRoaXMuYmVmb3JlVXBsb2FkKHJhd0ZpbGUpO1xuICAgICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUudGhlbikge1xuICAgICAgICBiZWZvcmUudGhlbihmdW5jdGlvbiAocHJvY2Vzc2VkRmlsZSkge1xuICAgICAgICAgIHZhciBmaWxlVHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzZWRGaWxlKTtcblxuICAgICAgICAgIGlmIChmaWxlVHlwZSA9PT0gJ1tvYmplY3QgRmlsZV0nIHx8IGZpbGVUeXBlID09PSAnW29iamVjdCBCbG9iXScpIHtcbiAgICAgICAgICAgIGlmIChmaWxlVHlwZSA9PT0gJ1tvYmplY3QgQmxvYl0nKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3NlZEZpbGUgPSBuZXcgRmlsZShbcHJvY2Vzc2VkRmlsZV0sIHJhd0ZpbGUubmFtZSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IHJhd0ZpbGUudHlwZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcmF3RmlsZSkge1xuICAgICAgICAgICAgICBpZiAocmF3RmlsZS5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NlZEZpbGVbcF0gPSByYXdGaWxlW3BdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpczIucG9zdChwcm9jZXNzZWRGaWxlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMyLnBvc3QocmF3RmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLm9uUmVtb3ZlKG51bGwsIHJhd0ZpbGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoYmVmb3JlICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnBvc3QocmF3RmlsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uUmVtb3ZlKG51bGwsIHJhd0ZpbGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgYWJvcnQ6IGZ1bmN0aW9uIGFib3J0KGZpbGUpIHtcbiAgICAgIHZhciByZXFzID0gdGhpcy5yZXFzO1xuXG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICB2YXIgdWlkID0gZmlsZTtcbiAgICAgICAgaWYgKGZpbGUudWlkKSB1aWQgPSBmaWxlLnVpZDtcbiAgICAgICAgaWYgKHJlcXNbdWlkXSkge1xuICAgICAgICAgIHJlcXNbdWlkXS5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhyZXFzKS5mb3JFYWNoKGZ1bmN0aW9uICh1aWQpIHtcbiAgICAgICAgICBpZiAocmVxc1t1aWRdKSByZXFzW3VpZF0uYWJvcnQoKTtcbiAgICAgICAgICBkZWxldGUgcmVxc1t1aWRdO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHBvc3Q6IGZ1bmN0aW9uIHBvc3QocmF3RmlsZSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciB1aWQgPSByYXdGaWxlLnVpZDtcblxuICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgZmlsZTogcmF3RmlsZSxcbiAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICBmaWxlbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uLFxuICAgICAgICBvblByb2dyZXNzOiBmdW5jdGlvbiBvblByb2dyZXNzKGUpIHtcbiAgICAgICAgICBfdGhpczMub25Qcm9ncmVzcyhlLCByYXdGaWxlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TdWNjZXNzOiBmdW5jdGlvbiBvblN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgX3RoaXMzLm9uU3VjY2VzcyhyZXMsIHJhd0ZpbGUpO1xuICAgICAgICAgIGRlbGV0ZSBfdGhpczMucmVxc1t1aWRdO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBmdW5jdGlvbiBvbkVycm9yKGVycikge1xuICAgICAgICAgIF90aGlzMy5vbkVycm9yKGVyciwgcmF3RmlsZSk7XG4gICAgICAgICAgZGVsZXRlIF90aGlzMy5yZXFzW3VpZF07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgcmVxID0gdGhpcy5odHRwUmVxdWVzdChvcHRpb25zKTtcbiAgICAgIHRoaXMucmVxc1t1aWRdID0gcmVxO1xuICAgICAgaWYgKHJlcSAmJiByZXEudGhlbikge1xuICAgICAgICByZXEudGhlbihvcHRpb25zLm9uU3VjY2Vzcywgb3B0aW9ucy5vbkVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVDbGljaygpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLiRyZWZzLmlucHV0LnZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy4kcmVmcy5pbnB1dC5jbGljaygpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlS2V5ZG93bjogZnVuY3Rpb24gaGFuZGxlS2V5ZG93bihlKSB7XG4gICAgICBpZiAoZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCkgcmV0dXJuO1xuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMTMgfHwgZS5rZXlDb2RlID09PSAzMikge1xuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICB2YXIgaGFuZGxlQ2xpY2sgPSB0aGlzLmhhbmRsZUNsaWNrLFxuICAgICAgICBkcmFnID0gdGhpcy5kcmFnLFxuICAgICAgICBuYW1lID0gdGhpcy5uYW1lLFxuICAgICAgICBoYW5kbGVDaGFuZ2UgPSB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgbXVsdGlwbGUgPSB0aGlzLm11bHRpcGxlLFxuICAgICAgICBhY2NlcHQgPSB0aGlzLmFjY2VwdCxcbiAgICAgICAgbGlzdFR5cGUgPSB0aGlzLmxpc3RUeXBlLFxuICAgICAgICB1cGxvYWRGaWxlcyA9IHRoaXMudXBsb2FkRmlsZXMsXG4gICAgICAgIGRpc2FibGVkID0gdGhpcy5kaXNhYmxlZCxcbiAgICAgICAgaGFuZGxlS2V5ZG93biA9IHRoaXMuaGFuZGxlS2V5ZG93bjtcblxuICAgIHZhciBkYXRhID0ge1xuICAgICAgY2xhc3M6IHtcbiAgICAgICAgJ2VsLXVwbG9hZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICBvbjoge1xuICAgICAgICBjbGljazogaGFuZGxlQ2xpY2ssXG4gICAgICAgIGtleWRvd246IGhhbmRsZUtleWRvd25cbiAgICAgIH1cbiAgICB9O1xuICAgIGRhdGEuY2xhc3NbJ2VsLXVwbG9hZC0tJyArIGxpc3RUeXBlXSA9IHRydWU7XG4gICAgcmV0dXJuIGgoXG4gICAgICAnZGl2JyxcbiAgICAgIGV4dGVybmFsX2JhYmVsX2hlbHBlcl92dWVfanN4X21lcmdlX3Byb3BzX2RlZmF1bHQoKShbZGF0YSwge1xuICAgICAgICBhdHRyczogeyB0YWJpbmRleDogJzAnIH1cbiAgICAgIH1dKSxcbiAgICAgIFtkcmFnID8gaChcbiAgICAgICAgJ3VwbG9hZC1kcmFnZ2VyJyxcbiAgICAgICAge1xuICAgICAgICAgIGF0dHJzOiB7IGRpc2FibGVkOiBkaXNhYmxlZCB9LFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAnZmlsZSc6IHVwbG9hZEZpbGVzXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbdGhpcy4kc2xvdHMuZGVmYXVsdF1cbiAgICAgICkgOiB0aGlzLiRzbG90cy5kZWZhdWx0LCBoKCdpbnB1dCcsIHsgJ2NsYXNzJzogJ2VsLXVwbG9hZF9faW5wdXQnLCBhdHRyczogeyB0eXBlOiAnZmlsZScsIG5hbWU6IG5hbWUsIG11bHRpcGxlOiBtdWx0aXBsZSwgYWNjZXB0OiBhY2NlcHQgfSxcbiAgICAgICAgcmVmOiAnaW5wdXQnLCBvbjoge1xuICAgICAgICAgICdjaGFuZ2UnOiBoYW5kbGVDaGFuZ2VcbiAgICAgICAgfVxuICAgICAgfSldXG4gICAgKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3VwbG9hZC9zcmMvdXBsb2FkLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfdXBsb2FkdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHVwbG9hZHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy91cGxvYWQvc3JjL3VwbG9hZC52dWVcbnZhciB1cGxvYWRfcmVuZGVyLCB1cGxvYWRfc3RhdGljUmVuZGVyRm5zXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHVwbG9hZF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY191cGxvYWR2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHVwbG9hZF9yZW5kZXIsXG4gIHVwbG9hZF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHVwbG9hZF9hcGk7IH1cbnVwbG9hZF9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3VwbG9hZC9zcmMvdXBsb2FkLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfdXBsb2FkID0gKHVwbG9hZF9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy91cGxvYWQvc3JjL2luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcblxuXG5cblxuXG5cbmZ1bmN0aW9uIHNyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX25vb3AoKSB7fVxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxVcGxvYWQnLFxuXG4gIG1peGluczogW21pZ3JhdGluZ19kZWZhdWx0LmFdLFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBFbFByb2dyZXNzOiBwcm9ncmVzc19kZWZhdWx0LmEsXG4gICAgVXBsb2FkTGlzdDogdXBsb2FkX2xpc3QsXG4gICAgVXBsb2FkOiBzcmNfdXBsb2FkXG4gIH0sXG5cbiAgcHJvdmlkZTogZnVuY3Rpb24gcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBsb2FkZXI6IHRoaXNcbiAgICB9O1xuICB9LFxuXG5cbiAgaW5qZWN0OiB7XG4gICAgZWxGb3JtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIGFjdGlvbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICBkYXRhOiBPYmplY3QsXG4gICAgbXVsdGlwbGU6IEJvb2xlYW4sXG4gICAgbmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2ZpbGUnXG4gICAgfSxcbiAgICBkcmFnOiBCb29sZWFuLFxuICAgIGRyYWdnZXI6IEJvb2xlYW4sXG4gICAgd2l0aENyZWRlbnRpYWxzOiBCb29sZWFuLFxuICAgIHNob3dGaWxlTGlzdDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGFjY2VwdDogU3RyaW5nLFxuICAgIHR5cGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdzZWxlY3QnXG4gICAgfSxcbiAgICBiZWZvcmVVcGxvYWQ6IEZ1bmN0aW9uLFxuICAgIGJlZm9yZVJlbW92ZTogRnVuY3Rpb24sXG4gICAgb25SZW1vdmU6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfbm9vcFxuICAgIH0sXG4gICAgb25DaGFuZ2U6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfbm9vcFxuICAgIH0sXG4gICAgb25QcmV2aWV3OiB7XG4gICAgICB0eXBlOiBGdW5jdGlvblxuICAgIH0sXG4gICAgb25TdWNjZXNzOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHNyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX25vb3BcbiAgICB9LFxuICAgIG9uUHJvZ3Jlc3M6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfbm9vcFxuICAgIH0sXG4gICAgb25FcnJvcjoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBzcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19ub29wXG4gICAgfSxcbiAgICBmaWxlTGlzdDoge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXV0b1VwbG9hZDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGxpc3RUeXBlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAndGV4dCcgLy8gdGV4dCxwaWN0dXJlLHBpY3R1cmUtY2FyZFxuICAgIH0sXG4gICAgaHR0cFJlcXVlc3Q6IEZ1bmN0aW9uLFxuICAgIGRpc2FibGVkOiBCb29sZWFuLFxuICAgIGxpbWl0OiBOdW1iZXIsXG4gICAgb25FeGNlZWQ6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfbm9vcFxuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB1cGxvYWRGaWxlczogW10sXG4gICAgICBkcmFnT3ZlcjogZmFsc2UsXG4gICAgICBkcmFnaW5nOiBmYWxzZSxcbiAgICAgIHRlbXBJbmRleDogMVxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIHVwbG9hZERpc2FibGVkOiBmdW5jdGlvbiB1cGxvYWREaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8ICh0aGlzLmVsRm9ybSB8fCB7fSkuZGlzYWJsZWQ7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbGlzdFR5cGU6IGZ1bmN0aW9uIGxpc3RUeXBlKHR5cGUpIHtcbiAgICAgIGlmICh0eXBlID09PSAncGljdHVyZS1jYXJkJyB8fCB0eXBlID09PSAncGljdHVyZScpIHtcbiAgICAgICAgdGhpcy51cGxvYWRGaWxlcyA9IHRoaXMudXBsb2FkRmlsZXMubWFwKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgaWYgKCFmaWxlLnVybCAmJiBmaWxlLnJhdykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZmlsZS51cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUucmF3KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbRWxlbWVudCBFcnJvcl1bVXBsb2FkXScsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZmlsZUxpc3Q6IHtcbiAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoZmlsZUxpc3QpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICB0aGlzLnVwbG9hZEZpbGVzID0gZmlsZUxpc3QubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgaXRlbS51aWQgPSBpdGVtLnVpZCB8fCBEYXRlLm5vdygpICsgX3RoaXMudGVtcEluZGV4Kys7XG4gICAgICAgICAgaXRlbS5zdGF0dXMgPSBpdGVtLnN0YXR1cyB8fCAnc3VjY2Vzcyc7XG4gICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFuZGxlU3RhcnQ6IGZ1bmN0aW9uIGhhbmRsZVN0YXJ0KHJhd0ZpbGUpIHtcbiAgICAgIHJhd0ZpbGUudWlkID0gRGF0ZS5ub3coKSArIHRoaXMudGVtcEluZGV4Kys7XG4gICAgICB2YXIgZmlsZSA9IHtcbiAgICAgICAgc3RhdHVzOiAncmVhZHknLFxuICAgICAgICBuYW1lOiByYXdGaWxlLm5hbWUsXG4gICAgICAgIHNpemU6IHJhd0ZpbGUuc2l6ZSxcbiAgICAgICAgcGVyY2VudGFnZTogMCxcbiAgICAgICAgdWlkOiByYXdGaWxlLnVpZCxcbiAgICAgICAgcmF3OiByYXdGaWxlXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5saXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCcgfHwgdGhpcy5saXN0VHlwZSA9PT0gJ3BpY3R1cmUnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZmlsZS51cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHJhd0ZpbGUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbRWxlbWVudCBFcnJvcl1bVXBsb2FkXScsIGVycik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBsb2FkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgIHRoaXMub25DaGFuZ2UoZmlsZSwgdGhpcy51cGxvYWRGaWxlcyk7XG4gICAgfSxcbiAgICBoYW5kbGVQcm9ncmVzczogZnVuY3Rpb24gaGFuZGxlUHJvZ3Jlc3MoZXYsIHJhd0ZpbGUpIHtcbiAgICAgIHZhciBmaWxlID0gdGhpcy5nZXRGaWxlKHJhd0ZpbGUpO1xuICAgICAgdGhpcy5vblByb2dyZXNzKGV2LCBmaWxlLCB0aGlzLnVwbG9hZEZpbGVzKTtcbiAgICAgIGZpbGUuc3RhdHVzID0gJ3VwbG9hZGluZyc7XG4gICAgICBmaWxlLnBlcmNlbnRhZ2UgPSBldi5wZXJjZW50IHx8IDA7XG4gICAgfSxcbiAgICBoYW5kbGVTdWNjZXNzOiBmdW5jdGlvbiBoYW5kbGVTdWNjZXNzKHJlcywgcmF3RmlsZSkge1xuICAgICAgdmFyIGZpbGUgPSB0aGlzLmdldEZpbGUocmF3RmlsZSk7XG5cbiAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgIGZpbGUuc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICBmaWxlLnJlc3BvbnNlID0gcmVzO1xuXG4gICAgICAgIHRoaXMub25TdWNjZXNzKHJlcywgZmlsZSwgdGhpcy51cGxvYWRGaWxlcyk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoZmlsZSwgdGhpcy51cGxvYWRGaWxlcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVFcnJvcjogZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyLCByYXdGaWxlKSB7XG4gICAgICB2YXIgZmlsZSA9IHRoaXMuZ2V0RmlsZShyYXdGaWxlKTtcbiAgICAgIHZhciBmaWxlTGlzdCA9IHRoaXMudXBsb2FkRmlsZXM7XG5cbiAgICAgIGZpbGUuc3RhdHVzID0gJ2ZhaWwnO1xuXG4gICAgICBmaWxlTGlzdC5zcGxpY2UoZmlsZUxpc3QuaW5kZXhPZihmaWxlKSwgMSk7XG5cbiAgICAgIHRoaXMub25FcnJvcihlcnIsIGZpbGUsIHRoaXMudXBsb2FkRmlsZXMpO1xuICAgICAgdGhpcy5vbkNoYW5nZShmaWxlLCB0aGlzLnVwbG9hZEZpbGVzKTtcbiAgICB9LFxuICAgIGhhbmRsZVJlbW92ZTogZnVuY3Rpb24gaGFuZGxlUmVtb3ZlKGZpbGUsIHJhdykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmIChyYXcpIHtcbiAgICAgICAgZmlsZSA9IHRoaXMuZ2V0RmlsZShyYXcpO1xuICAgICAgfVxuICAgICAgdmFyIGRvUmVtb3ZlID0gZnVuY3Rpb24gZG9SZW1vdmUoKSB7XG4gICAgICAgIF90aGlzMi5hYm9ydChmaWxlKTtcbiAgICAgICAgdmFyIGZpbGVMaXN0ID0gX3RoaXMyLnVwbG9hZEZpbGVzO1xuICAgICAgICBmaWxlTGlzdC5zcGxpY2UoZmlsZUxpc3QuaW5kZXhPZihmaWxlKSwgMSk7XG4gICAgICAgIF90aGlzMi5vblJlbW92ZShmaWxlLCBmaWxlTGlzdCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoIXRoaXMuYmVmb3JlUmVtb3ZlKSB7XG4gICAgICAgIGRvUmVtb3ZlKCk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmJlZm9yZVJlbW92ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgYmVmb3JlID0gdGhpcy5iZWZvcmVSZW1vdmUoZmlsZSwgdGhpcy51cGxvYWRGaWxlcyk7XG4gICAgICAgIGlmIChiZWZvcmUgJiYgYmVmb3JlLnRoZW4pIHtcbiAgICAgICAgICBiZWZvcmUudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkb1JlbW92ZSgpO1xuICAgICAgICAgIH0sIHNyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX25vb3ApO1xuICAgICAgICB9IGVsc2UgaWYgKGJlZm9yZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBkb1JlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRGaWxlOiBmdW5jdGlvbiBnZXRGaWxlKHJhd0ZpbGUpIHtcbiAgICAgIHZhciBmaWxlTGlzdCA9IHRoaXMudXBsb2FkRmlsZXM7XG4gICAgICB2YXIgdGFyZ2V0ID0gdm9pZCAwO1xuICAgICAgZmlsZUxpc3QuZXZlcnkoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdGFyZ2V0ID0gcmF3RmlsZS51aWQgPT09IGl0ZW0udWlkID8gaXRlbSA6IG51bGw7XG4gICAgICAgIHJldHVybiAhdGFyZ2V0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0sXG4gICAgYWJvcnQ6IGZ1bmN0aW9uIGFib3J0KGZpbGUpIHtcbiAgICAgIHRoaXMuJHJlZnNbJ3VwbG9hZC1pbm5lciddLmFib3J0KGZpbGUpO1xuICAgIH0sXG4gICAgY2xlYXJGaWxlczogZnVuY3Rpb24gY2xlYXJGaWxlcygpIHtcbiAgICAgIHRoaXMudXBsb2FkRmlsZXMgPSBbXTtcbiAgICB9LFxuICAgIHN1Ym1pdDogZnVuY3Rpb24gc3VibWl0KCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHRoaXMudXBsb2FkRmlsZXMuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBmaWxlLnN0YXR1cyA9PT0gJ3JlYWR5JztcbiAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgX3RoaXMzLiRyZWZzWyd1cGxvYWQtaW5uZXInXS51cGxvYWQoZmlsZS5yYXcpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBnZXRNaWdyYXRpbmdDb25maWc6IGZ1bmN0aW9uIGdldE1pZ3JhdGluZ0NvbmZpZygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgJ2RlZmF1bHQtZmlsZS1saXN0JzogJ2RlZmF1bHQtZmlsZS1saXN0IGlzIHJlbmFtZWQgdG8gZmlsZS1saXN0LicsXG4gICAgICAgICAgJ3Nob3ctdXBsb2FkLWxpc3QnOiAnc2hvdy11cGxvYWQtbGlzdCBpcyByZW5hbWVkIHRvIHNob3ctZmlsZS1saXN0LicsXG4gICAgICAgICAgJ3RodW1ibmFpbC1tb2RlJzogJ3RodW1ibmFpbC1tb2RlIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHlvdSBjYW4gaW1wbGVtZW50IHRoZSBzYW1lIGVmZmVjdCBhY2NvcmRpbmcgdG8gdGhpcyBjYXNlOiBodHRwOi8vZWxlbWVudC5lbGVtZS5pby8jL3poLUNOL2NvbXBvbmVudC91cGxvYWQjeW9uZy1odS10b3UteGlhbmctc2hhbmctY2h1YW4nXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgdGhpcy51cGxvYWRGaWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICBpZiAoZmlsZS51cmwgJiYgZmlsZS51cmwuaW5kZXhPZignYmxvYjonKSA9PT0gMCkge1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGZpbGUudXJsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgdmFyIHVwbG9hZExpc3QgPSB2b2lkIDA7XG5cbiAgICBpZiAodGhpcy5zaG93RmlsZUxpc3QpIHtcbiAgICAgIHVwbG9hZExpc3QgPSBoKFxuICAgICAgICB1cGxvYWRfbGlzdCxcbiAgICAgICAge1xuICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICBkaXNhYmxlZDogdGhpcy51cGxvYWREaXNhYmxlZCxcbiAgICAgICAgICAgIGxpc3RUeXBlOiB0aGlzLmxpc3RUeXBlLFxuICAgICAgICAgICAgZmlsZXM6IHRoaXMudXBsb2FkRmlsZXMsXG5cbiAgICAgICAgICAgIGhhbmRsZVByZXZpZXc6IHRoaXMub25QcmV2aWV3IH0sXG4gICAgICAgICAgb246IHtcbiAgICAgICAgICAgICdyZW1vdmUnOiB0aGlzLmhhbmRsZVJlbW92ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2Z1bmN0aW9uIChwcm9wcykge1xuICAgICAgICAgIGlmIChfdGhpczQuJHNjb3BlZFNsb3RzLmZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczQuJHNjb3BlZFNsb3RzLmZpbGUoe1xuICAgICAgICAgICAgICBmaWxlOiBwcm9wcy5maWxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciB1cGxvYWREYXRhID0ge1xuICAgICAgcHJvcHM6IHtcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICBkcmFnOiB0aGlzLmRyYWcsXG4gICAgICAgIGFjdGlvbjogdGhpcy5hY3Rpb24sXG4gICAgICAgIG11bHRpcGxlOiB0aGlzLm11bHRpcGxlLFxuICAgICAgICAnYmVmb3JlLXVwbG9hZCc6IHRoaXMuYmVmb3JlVXBsb2FkLFxuICAgICAgICAnd2l0aC1jcmVkZW50aWFscyc6IHRoaXMud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICBhY2NlcHQ6IHRoaXMuYWNjZXB0LFxuICAgICAgICBmaWxlTGlzdDogdGhpcy51cGxvYWRGaWxlcyxcbiAgICAgICAgYXV0b1VwbG9hZDogdGhpcy5hdXRvVXBsb2FkLFxuICAgICAgICBsaXN0VHlwZTogdGhpcy5saXN0VHlwZSxcbiAgICAgICAgZGlzYWJsZWQ6IHRoaXMudXBsb2FkRGlzYWJsZWQsXG4gICAgICAgIGxpbWl0OiB0aGlzLmxpbWl0LFxuICAgICAgICAnb24tZXhjZWVkJzogdGhpcy5vbkV4Y2VlZCxcbiAgICAgICAgJ29uLXN0YXJ0JzogdGhpcy5oYW5kbGVTdGFydCxcbiAgICAgICAgJ29uLXByb2dyZXNzJzogdGhpcy5oYW5kbGVQcm9ncmVzcyxcbiAgICAgICAgJ29uLXN1Y2Nlc3MnOiB0aGlzLmhhbmRsZVN1Y2Nlc3MsXG4gICAgICAgICdvbi1lcnJvcic6IHRoaXMuaGFuZGxlRXJyb3IsXG4gICAgICAgICdvbi1wcmV2aWV3JzogdGhpcy5vblByZXZpZXcsXG4gICAgICAgICdvbi1yZW1vdmUnOiB0aGlzLmhhbmRsZVJlbW92ZSxcbiAgICAgICAgJ2h0dHAtcmVxdWVzdCc6IHRoaXMuaHR0cFJlcXVlc3RcbiAgICAgIH0sXG4gICAgICByZWY6ICd1cGxvYWQtaW5uZXInXG4gICAgfTtcblxuICAgIHZhciB0cmlnZ2VyID0gdGhpcy4kc2xvdHMudHJpZ2dlciB8fCB0aGlzLiRzbG90cy5kZWZhdWx0O1xuICAgIHZhciB1cGxvYWRDb21wb25lbnQgPSBoKFxuICAgICAgJ3VwbG9hZCcsXG4gICAgICB1cGxvYWREYXRhLFxuICAgICAgW3RyaWdnZXJdXG4gICAgKTtcblxuICAgIHJldHVybiBoKCdkaXYnLCBbdGhpcy5saXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCcgPyB1cGxvYWRMaXN0IDogJycsIHRoaXMuJHNsb3RzLnRyaWdnZXIgPyBbdXBsb2FkQ29tcG9uZW50LCB0aGlzLiRzbG90cy5kZWZhdWx0XSA6IHVwbG9hZENvbXBvbmVudCwgdGhpcy4kc2xvdHMudGlwLCB0aGlzLmxpc3RUeXBlICE9PSAncGljdHVyZS1jYXJkJyA/IHVwbG9hZExpc3QgOiAnJ10pO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdXBsb2FkL3NyYy9pbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdXBsb2FkX3NyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChzcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdXBsb2FkL3NyYy9pbmRleC52dWVcbnZhciBzcmNfcmVuZGVyLCBzcmNfc3RhdGljUmVuZGVyRm5zXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHVwbG9hZF9zcmNfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICB1cGxvYWRfc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBzcmNfcmVuZGVyLFxuICBzcmNfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBzcmNfYXBpOyB9XG51cGxvYWRfc3JjX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvdXBsb2FkL3NyYy9pbmRleC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdXBsb2FkX3NyYyA9ICh1cGxvYWRfc3JjX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdXBsb2FkL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnVwbG9hZF9zcmMuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudCh1cGxvYWRfc3JjLm5hbWUsIHVwbG9hZF9zcmMpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfdXBsb2FkID0gKHVwbG9hZF9zcmMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9wcm9ncmVzcy9zcmMvcHJvZ3Jlc3MudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTIyOWVlNDA2JlxudmFyIHByb2dyZXNzdnVlX3R5cGVfdGVtcGxhdGVfaWRfMjI5ZWU0MDZfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcHJvZ3Jlc3NcIixcbiAgICAgIGNsYXNzOiBbXG4gICAgICAgIFwiZWwtcHJvZ3Jlc3MtLVwiICsgX3ZtLnR5cGUsXG4gICAgICAgIF92bS5zdGF0dXMgPyBcImlzLVwiICsgX3ZtLnN0YXR1cyA6IFwiXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBcImVsLXByb2dyZXNzLS13aXRob3V0LXRleHRcIjogIV92bS5zaG93VGV4dCxcbiAgICAgICAgICBcImVsLXByb2dyZXNzLS10ZXh0LWluc2lkZVwiOiBfdm0udGV4dEluc2lkZVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgcm9sZTogXCJwcm9ncmVzc2JhclwiLFxuICAgICAgICBcImFyaWEtdmFsdWVub3dcIjogX3ZtLnBlcmNlbnRhZ2UsXG4gICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF92bS50eXBlID09PSBcImxpbmVcIlxuICAgICAgICA/IF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtcHJvZ3Jlc3MtYmFyXCIgfSwgW1xuICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1wcm9ncmVzcy1iYXJfX291dGVyXCIsXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogX3ZtLnN0cm9rZVdpZHRoICsgXCJweFwiLFxuICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBfdm0uZGVmaW5lQmFja0NvbG9yXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1wcm9ncmVzcy1iYXJfX2lubmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBfdm0uYmFyU3R5bGVcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5zaG93VGV4dCAmJiBfdm0udGV4dEluc2lkZVxuICAgICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1wcm9ncmVzcy1iYXJfX2lubmVyVGV4dFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IGNvbG9yOiBfdm0udGV4dENvbG9yIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLmNvbnRlbnQpKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApXG4gICAgICAgICAgXSlcbiAgICAgICAgOiBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXByb2dyZXNzLWNpcmNsZVwiLFxuICAgICAgICAgICAgICBzdHlsZTogeyBoZWlnaHQ6IF92bS53aWR0aCArIFwicHhcIiwgd2lkdGg6IF92bS53aWR0aCArIFwicHhcIiB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcInN2Z1wiLCB7IGF0dHJzOiB7IHZpZXdCb3g6IFwiMCAwIDEwMCAxMDBcIiB9IH0sIFtcbiAgICAgICAgICAgICAgICBfYyhcInBhdGhcIiwge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcHJvZ3Jlc3MtY2lyY2xlX190cmFja1wiLFxuICAgICAgICAgICAgICAgICAgc3R5bGU6IF92bS50cmFpbFBhdGhTdHlsZSxcbiAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgIGQ6IF92bS50cmFja1BhdGgsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogX3ZtLmRlZmluZUJhY2tDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHJva2Utd2lkdGhcIjogX3ZtLnJlbGF0aXZlU3Ryb2tlV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IFwibm9uZVwiXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgX2MoXCJwYXRoXCIsIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXByb2dyZXNzLWNpcmNsZV9fcGF0aFwiLFxuICAgICAgICAgICAgICAgICAgc3R5bGU6IF92bS5jaXJjbGVQYXRoU3R5bGUsXG4gICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICBkOiBfdm0udHJhY2tQYXRoLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IF92bS5zdHJva2UsXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0cm9rZS1saW5lY2FwXCI6IF92bS5zdHJva2VMaW5lY2FwLFxuICAgICAgICAgICAgICAgICAgICBcInN0cm9rZS13aWR0aFwiOiBfdm0ucGVyY2VudGFnZSA/IF92bS5yZWxhdGl2ZVN0cm9rZVdpZHRoIDogMFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKSxcbiAgICAgIF92bS5zaG93VGV4dCAmJiAhX3ZtLnRleHRJbnNpZGVcbiAgICAgICAgPyBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXByb2dyZXNzX190ZXh0XCIsXG4gICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgZm9udFNpemU6IF92bS5wcm9ncmVzc1RleHRTaXplICsgXCJweFwiLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBfdm0udGV4dENvbG9yXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICFfdm0uc3RhdHVzXG4gICAgICAgICAgICAgICAgPyBbX3ZtLl92KF92bS5fcyhfdm0uY29udGVudCkpXVxuICAgICAgICAgICAgICAgIDogX2MoXCJpXCIsIHsgY2xhc3M6IF92bS5pY29uQ2xhc3MgfSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpXG4gICAgXVxuICApXG59XG52YXIgcHJvZ3Jlc3N2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yMjllZTQwNl9zdGF0aWNSZW5kZXJGbnMgPSBbXVxucHJvZ3Jlc3N2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yMjllZTQwNl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Byb2dyZXNzL3NyYy9wcm9ncmVzcy52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MjI5ZWU0MDYmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3Byb2dyZXNzL3NyYy9wcm9ncmVzcy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwcm9ncmVzc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFByb2dyZXNzJyxcbiAgcHJvcHM6IHtcbiAgICB0eXBlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnbGluZScsXG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpIHtcbiAgICAgICAgcmV0dXJuIFsnbGluZScsICdjaXJjbGUnLCAnZGFzaGJvYXJkJ10uaW5kZXhPZih2YWwpID4gLTE7XG4gICAgICB9XG4gICAgfSxcbiAgICBwZXJjZW50YWdlOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpIHtcbiAgICAgICAgcmV0dXJuIHZhbCA+PSAwICYmIHZhbCA8PSAxMDA7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdGF0dXM6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAgICAgICByZXR1cm4gWydzdWNjZXNzJywgJ2V4Y2VwdGlvbicsICd3YXJuaW5nJ10uaW5kZXhPZih2YWwpID4gLTE7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdHJva2VXaWR0aDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogNlxuICAgIH0sXG4gICAgc3Ryb2tlTGluZWNhcDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ3JvdW5kJ1xuICAgIH0sXG4gICAgdGV4dEluc2lkZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICB3aWR0aDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMTI2XG4gICAgfSxcbiAgICBzaG93VGV4dDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGNvbG9yOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBBcnJheSwgRnVuY3Rpb25dLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGRlZmluZUJhY2tDb2xvcjoge1xuICAgICAgdHlwZTogW1N0cmluZywgQXJyYXksIEZ1bmN0aW9uXSxcbiAgICAgIGRlZmF1bHQ6ICcjZWJlZWY1J1xuICAgIH0sXG4gICAgdGV4dENvbG9yOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBBcnJheSwgRnVuY3Rpb25dLFxuICAgICAgZGVmYXVsdDogJyM2MDYyNjYnXG4gICAgfSxcbiAgICBmb3JtYXQ6IEZ1bmN0aW9uXG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgYmFyU3R5bGU6IGZ1bmN0aW9uIGJhclN0eWxlKCkge1xuICAgICAgdmFyIHN0eWxlID0ge307XG4gICAgICBzdHlsZS53aWR0aCA9IHRoaXMucGVyY2VudGFnZSArICclJztcbiAgICAgIHN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuZ2V0Q3VycmVudENvbG9yKHRoaXMucGVyY2VudGFnZSk7XG4gICAgICByZXR1cm4gc3R5bGU7XG4gICAgfSxcbiAgICByZWxhdGl2ZVN0cm9rZVdpZHRoOiBmdW5jdGlvbiByZWxhdGl2ZVN0cm9rZVdpZHRoKCkge1xuICAgICAgcmV0dXJuICh0aGlzLnN0cm9rZVdpZHRoIC8gdGhpcy53aWR0aCAqIDEwMCkudG9GaXhlZCgxKTtcbiAgICB9LFxuICAgIHJhZGl1czogZnVuY3Rpb24gcmFkaXVzKCkge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NpcmNsZScgfHwgdGhpcy50eXBlID09PSAnZGFzaGJvYXJkJykge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQoNTAgLSBwYXJzZUZsb2F0KHRoaXMucmVsYXRpdmVTdHJva2VXaWR0aCkgLyAyLCAxMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9LFxuICAgIHRyYWNrUGF0aDogZnVuY3Rpb24gdHJhY2tQYXRoKCkge1xuICAgICAgdmFyIHJhZGl1cyA9IHRoaXMucmFkaXVzO1xuICAgICAgdmFyIGlzRGFzaGJvYXJkID0gdGhpcy50eXBlID09PSAnZGFzaGJvYXJkJztcbiAgICAgIHJldHVybiAnXFxuICAgICAgICBNIDUwIDUwXFxuICAgICAgICBtIDAgJyArIChpc0Rhc2hib2FyZCA/ICcnIDogJy0nKSArIHJhZGl1cyArICdcXG4gICAgICAgIGEgJyArIHJhZGl1cyArICcgJyArIHJhZGl1cyArICcgMCAxIDEgMCAnICsgKGlzRGFzaGJvYXJkID8gJy0nIDogJycpICsgcmFkaXVzICogMiArICdcXG4gICAgICAgIGEgJyArIHJhZGl1cyArICcgJyArIHJhZGl1cyArICcgMCAxIDEgMCAnICsgKGlzRGFzaGJvYXJkID8gJycgOiAnLScpICsgcmFkaXVzICogMiArICdcXG4gICAgICAgICc7XG4gICAgfSxcbiAgICBwZXJpbWV0ZXI6IGZ1bmN0aW9uIHBlcmltZXRlcigpIHtcbiAgICAgIHJldHVybiAyICogTWF0aC5QSSAqIHRoaXMucmFkaXVzO1xuICAgIH0sXG4gICAgcmF0ZTogZnVuY3Rpb24gcmF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdkYXNoYm9hcmQnID8gMC43NSA6IDE7XG4gICAgfSxcbiAgICBzdHJva2VEYXNob2Zmc2V0OiBmdW5jdGlvbiBzdHJva2VEYXNob2Zmc2V0KCkge1xuICAgICAgdmFyIG9mZnNldCA9IC0xICogdGhpcy5wZXJpbWV0ZXIgKiAoMSAtIHRoaXMucmF0ZSkgLyAyO1xuICAgICAgcmV0dXJuIG9mZnNldCArICdweCc7XG4gICAgfSxcbiAgICB0cmFpbFBhdGhTdHlsZTogZnVuY3Rpb24gdHJhaWxQYXRoU3R5bGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHJva2VEYXNoYXJyYXk6IHRoaXMucGVyaW1ldGVyICogdGhpcy5yYXRlICsgJ3B4LCAnICsgdGhpcy5wZXJpbWV0ZXIgKyAncHgnLFxuICAgICAgICBzdHJva2VEYXNob2Zmc2V0OiB0aGlzLnN0cm9rZURhc2hvZmZzZXRcbiAgICAgIH07XG4gICAgfSxcbiAgICBjaXJjbGVQYXRoU3R5bGU6IGZ1bmN0aW9uIGNpcmNsZVBhdGhTdHlsZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0cm9rZURhc2hhcnJheTogdGhpcy5wZXJpbWV0ZXIgKiB0aGlzLnJhdGUgKiAodGhpcy5wZXJjZW50YWdlIC8gMTAwKSArICdweCwgJyArIHRoaXMucGVyaW1ldGVyICsgJ3B4JyxcbiAgICAgICAgc3Ryb2tlRGFzaG9mZnNldDogdGhpcy5zdHJva2VEYXNob2Zmc2V0LFxuICAgICAgICB0cmFuc2l0aW9uOiAnc3Ryb2tlLWRhc2hhcnJheSAwLjZzIGVhc2UgMHMsIHN0cm9rZSAwLjZzIGVhc2UnXG4gICAgICB9O1xuICAgIH0sXG4gICAgc3Ryb2tlOiBmdW5jdGlvbiBzdHJva2UoKSB7XG4gICAgICB2YXIgcmV0ID0gdm9pZCAwO1xuICAgICAgaWYgKHRoaXMuY29sb3IpIHtcbiAgICAgICAgcmV0ID0gdGhpcy5nZXRDdXJyZW50Q29sb3IodGhpcy5wZXJjZW50YWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zdGF0dXMpIHtcbiAgICAgICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgICAgIHJldCA9ICcjMTNjZTY2JztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2V4Y2VwdGlvbic6XG4gICAgICAgICAgICByZXQgPSAnI2ZmNDk0OSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgICAgIHJldCA9ICcjZTZhMjNjJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXQgPSAnIzIwYTBmZic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSxcbiAgICBpY29uQ2xhc3M6IGZ1bmN0aW9uIGljb25DbGFzcygpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ3dhcm5pbmcnKSB7XG4gICAgICAgIHJldHVybiAnZWwtaWNvbi13YXJuaW5nJztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdsaW5lJykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICdlbC1pY29uLWNpcmNsZS1jaGVjaycgOiAnZWwtaWNvbi1jaXJjbGUtY2xvc2UnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnZWwtaWNvbi1jaGVjaycgOiAnZWwtaWNvbi1jbG9zZSc7XG4gICAgICB9XG4gICAgfSxcbiAgICBwcm9ncmVzc1RleHRTaXplOiBmdW5jdGlvbiBwcm9ncmVzc1RleHRTaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2xpbmUnID8gMTIgKyB0aGlzLnN0cm9rZVdpZHRoICogMC40IDogdGhpcy53aWR0aCAqIDAuMTExMTExICsgMjtcbiAgICB9LFxuICAgIGNvbnRlbnQ6IGZ1bmN0aW9uIGNvbnRlbnQoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuZm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdCh0aGlzLnBlcmNlbnRhZ2UpIHx8ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyY2VudGFnZSArICclJztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRDdXJyZW50Q29sb3I6IGZ1bmN0aW9uIGdldEN1cnJlbnRDb2xvcihwZXJjZW50YWdlKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29sb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3IocGVyY2VudGFnZSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmNvbG9yID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExldmVsQ29sb3IocGVyY2VudGFnZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRMZXZlbENvbG9yOiBmdW5jdGlvbiBnZXRMZXZlbENvbG9yKHBlcmNlbnRhZ2UpIHtcbiAgICAgIHZhciBjb2xvckFycmF5ID0gdGhpcy5nZXRDb2xvckFycmF5KCkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5wZXJjZW50YWdlIC0gYi5wZXJjZW50YWdlO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sb3JBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29sb3JBcnJheVtpXS5wZXJjZW50YWdlID4gcGVyY2VudGFnZSkge1xuICAgICAgICAgIHJldHVybiBjb2xvckFycmF5W2ldLmNvbG9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sb3JBcnJheVtjb2xvckFycmF5Lmxlbmd0aCAtIDFdLmNvbG9yO1xuICAgIH0sXG4gICAgZ2V0Q29sb3JBcnJheTogZnVuY3Rpb24gZ2V0Q29sb3JBcnJheSgpIHtcbiAgICAgIHZhciBjb2xvciA9IHRoaXMuY29sb3I7XG4gICAgICB2YXIgc3BhbiA9IDEwMCAvIGNvbG9yLmxlbmd0aDtcbiAgICAgIHJldHVybiBjb2xvci5tYXAoZnVuY3Rpb24gKHNlcmllc0NvbG9yLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIHNlcmllc0NvbG9yID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2xvcjogc2VyaWVzQ29sb3IsXG4gICAgICAgICAgICBwZXJjZW50YWdlOiAoaW5kZXggKyAxKSAqIHNwYW5cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpZXNDb2xvcjtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Byb2dyZXNzL3NyYy9wcm9ncmVzcy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3Byb2dyZXNzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHByb2dyZXNzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Byb2dyZXNzL3NyYy9wcm9ncmVzcy52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBwcm9ncmVzc19jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19wcm9ncmVzc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgcHJvZ3Jlc3N2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yMjllZTQwNl9yZW5kZXIsXG4gIHByb2dyZXNzdnVlX3R5cGVfdGVtcGxhdGVfaWRfMjI5ZWU0MDZfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBwcm9ncmVzc19hcGk7IH1cbnByb2dyZXNzX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvcHJvZ3Jlc3Mvc3JjL3Byb2dyZXNzLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwcm9ncmVzcyA9IChwcm9ncmVzc19jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Byb2dyZXNzL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnByb2dyZXNzLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQocHJvZ3Jlc3MubmFtZSwgcHJvZ3Jlc3MpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfcHJvZ3Jlc3MgPSAocHJvZ3Jlc3MpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zcGlubmVyL3NyYy9zcGlubmVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02OTdiODUzOCZcbnZhciBzcGlubmVydnVlX3R5cGVfdGVtcGxhdGVfaWRfNjk3Yjg1MzhfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFwic3BhblwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXNwaW5uZXJcIiB9LCBbXG4gICAgX2MoXG4gICAgICBcInN2Z1wiLFxuICAgICAge1xuICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1zcGlubmVyLWlubmVyXCIsXG4gICAgICAgIHN0eWxlOiB7IHdpZHRoOiBfdm0ucmFkaXVzIC8gMiArIFwicHhcIiwgaGVpZ2h0OiBfdm0ucmFkaXVzIC8gMiArIFwicHhcIiB9LFxuICAgICAgICBhdHRyczogeyB2aWV3Qm94OiBcIjAgMCA1MCA1MFwiIH1cbiAgICAgIH0sXG4gICAgICBbXG4gICAgICAgIF9jKFwiY2lyY2xlXCIsIHtcbiAgICAgICAgICBzdGF0aWNDbGFzczogXCJwYXRoXCIsXG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIGN4OiBcIjI1XCIsXG4gICAgICAgICAgICBjeTogXCIyNVwiLFxuICAgICAgICAgICAgcjogXCIyMFwiLFxuICAgICAgICAgICAgZmlsbDogXCJub25lXCIsXG4gICAgICAgICAgICBzdHJva2U6IF92bS5zdHJva2VDb2xvcixcbiAgICAgICAgICAgIFwic3Ryb2tlLXdpZHRoXCI6IF92bS5zdHJva2VXaWR0aFxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIF1cbiAgICApXG4gIF0pXG59XG52YXIgc3Bpbm5lcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzY5N2I4NTM4X3N0YXRpY1JlbmRlckZucyA9IFtdXG5zcGlubmVydnVlX3R5cGVfdGVtcGxhdGVfaWRfNjk3Yjg1MzhfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zcGlubmVyL3NyYy9zcGlubmVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02OTdiODUzOCZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3Bpbm5lci9zcmMvc3Bpbm5lci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcGlubmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsU3Bpbm5lcicsXG4gIHByb3BzOiB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIHJhZGl1czoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMTAwXG4gICAgfSxcbiAgICBzdHJva2VXaWR0aDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogNVxuICAgIH0sXG4gICAgc3Ryb2tlQ29sb3I6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcjZWZlZmVmJ1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NwaW5uZXIvc3JjL3NwaW5uZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19zcGlubmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHNwaW5uZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3Bpbm5lci9zcmMvc3Bpbm5lci52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBzcGlubmVyX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX3NwaW5uZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHNwaW5uZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF82OTdiODUzOF9yZW5kZXIsXG4gIHNwaW5uZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF82OTdiODUzOF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHNwaW5uZXJfYXBpOyB9XG5zcGlubmVyX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvc3Bpbm5lci9zcmMvc3Bpbm5lci52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3Bpbm5lciA9IChzcGlubmVyX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3Bpbm5lci9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zcGlubmVyLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoc3Bpbm5lci5uYW1lLCBzcGlubmVyKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3NwaW5uZXIgPSAoc3Bpbm5lcik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL21lc3NhZ2Uvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQ1NWI5ZjYwJlxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80NTViOWY2MF9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJ0cmFuc2l0aW9uXCIsXG4gICAge1xuICAgICAgYXR0cnM6IHsgbmFtZTogXCJlbC1tZXNzYWdlLWZhZGVcIiB9LFxuICAgICAgb246IHsgXCJhZnRlci1sZWF2ZVwiOiBfdm0uaGFuZGxlQWZ0ZXJMZWF2ZSB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBfdm0udmlzaWJsZSxcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJ2aXNpYmxlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICBcImVsLW1lc3NhZ2VcIixcbiAgICAgICAgICAgIF92bS50eXBlICYmICFfdm0uaWNvbkNsYXNzID8gXCJlbC1tZXNzYWdlLS1cIiArIF92bS50eXBlIDogXCJcIixcbiAgICAgICAgICAgIF92bS5jZW50ZXIgPyBcImlzLWNlbnRlclwiIDogXCJcIixcbiAgICAgICAgICAgIF92bS5zaG93Q2xvc2UgPyBcImlzLWNsb3NhYmxlXCIgOiBcIlwiLFxuICAgICAgICAgICAgX3ZtLmN1c3RvbUNsYXNzXG4gICAgICAgICAgXSxcbiAgICAgICAgICBzdHlsZTogX3ZtLnBvc2l0aW9uU3R5bGUsXG4gICAgICAgICAgYXR0cnM6IHsgcm9sZTogXCJhbGVydFwiIH0sXG4gICAgICAgICAgb246IHsgbW91c2VlbnRlcjogX3ZtLmNsZWFyVGltZXIsIG1vdXNlbGVhdmU6IF92bS5zdGFydFRpbWVyIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF92bS5pY29uQ2xhc3NcbiAgICAgICAgICAgID8gX2MoXCJpXCIsIHsgY2xhc3M6IF92bS5pY29uQ2xhc3MgfSlcbiAgICAgICAgICAgIDogX2MoXCJpXCIsIHsgY2xhc3M6IF92bS50eXBlQ2xhc3MgfSksXG4gICAgICAgICAgX3ZtLl90KFwiZGVmYXVsdFwiLCBbXG4gICAgICAgICAgICAhX3ZtLmRhbmdlcm91c2x5VXNlSFRNTFN0cmluZ1xuICAgICAgICAgICAgICA/IF9jKFwicFwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLW1lc3NhZ2VfX2NvbnRlbnRcIiB9LCBbXG4gICAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKF92bS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICA6IF9jKFwicFwiLCB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1tZXNzYWdlX19jb250ZW50XCIsXG4gICAgICAgICAgICAgICAgICBkb21Qcm9wczogeyBpbm5lckhUTUw6IF92bS5fcyhfdm0ubWVzc2FnZSkgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSksXG4gICAgICAgICAgX3ZtLnNob3dDbG9zZVxuICAgICAgICAgICAgPyBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLW1lc3NhZ2VfX2Nsb3NlQnRuIGVsLWljb24tY2xvc2VcIixcbiAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLmNsb3NlIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgXSxcbiAgICAgICAgMlxuICAgICAgKVxuICAgIF1cbiAgKVxufVxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80NTViOWY2MF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxubWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ1NWI5ZjYwX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWVzc2FnZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDU1YjlmNjAmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL21lc3NhZ2Uvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbnZhciBzcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX3R5cGVNYXAgPSB7XG4gIHN1Y2Nlc3M6ICdzdWNjZXNzJyxcbiAgaW5mbzogJ2luZm8nLFxuICB3YXJuaW5nOiAnd2FybmluZycsXG4gIGVycm9yOiAnZXJyb3InXG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBtZXNzYWdlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICBtZXNzYWdlOiAnJyxcbiAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgaWNvbkNsYXNzOiAnJyxcbiAgICAgIGN1c3RvbUNsYXNzOiAnJyxcbiAgICAgIG9uQ2xvc2U6IG51bGwsXG4gICAgICBzaG93Q2xvc2U6IGZhbHNlLFxuICAgICAgY2xvc2VkOiBmYWxzZSxcbiAgICAgIHZlcnRpY2FsT2Zmc2V0OiAyMCxcbiAgICAgIHRpbWVyOiBudWxsLFxuICAgICAgZGFuZ2Vyb3VzbHlVc2VIVE1MU3RyaW5nOiBmYWxzZSxcbiAgICAgIGNlbnRlcjogZmFsc2VcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0eXBlQ2xhc3M6IGZ1bmN0aW9uIHR5cGVDbGFzcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUgJiYgIXRoaXMuaWNvbkNsYXNzID8gJ2VsLW1lc3NhZ2VfX2ljb24gZWwtaWNvbi0nICsgc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc190eXBlTWFwW3RoaXMudHlwZV0gOiAnJztcbiAgICB9LFxuICAgIHBvc2l0aW9uU3R5bGU6IGZ1bmN0aW9uIHBvc2l0aW9uU3R5bGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAndG9wJzogdGhpcy52ZXJ0aWNhbE9mZnNldCArICdweCdcbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgY2xvc2VkOiBmdW5jdGlvbiBjbG9zZWQobmV3VmFsKSB7XG4gICAgICBpZiAobmV3VmFsKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFuZGxlQWZ0ZXJMZWF2ZTogZnVuY3Rpb24gaGFuZGxlQWZ0ZXJMZWF2ZSgpIHtcbiAgICAgIHRoaXMuJGRlc3Ryb3kodHJ1ZSk7XG4gICAgICB0aGlzLiRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJGVsKTtcbiAgICB9LFxuICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vbkNsb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMub25DbG9zZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsZWFyVGltZXI6IGZ1bmN0aW9uIGNsZWFyVGltZXIoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgfSxcbiAgICBzdGFydFRpbWVyOiBmdW5jdGlvbiBzdGFydFRpbWVyKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuZHVyYXRpb24gPiAwKSB7XG4gICAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIV90aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgX3RoaXMuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuZHVyYXRpb24pO1xuICAgICAgfVxuICAgIH0sXG4gICAga2V5ZG93bjogZnVuY3Rpb24ga2V5ZG93bihlKSB7XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAvLyBlc2PlhbPpl63mtojmga9cbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duKTtcbiAgfSxcbiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lc3NhZ2Uvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX21lc3NhZ2Vfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAobWVzc2FnZV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZXNzYWdlL3NyYy9tYWluLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIG1lc3NhZ2Vfc3JjX21haW5fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBwYWNrYWdlc19tZXNzYWdlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNDU1YjlmNjBfcmVuZGVyLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNDU1YjlmNjBfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBtZXNzYWdlX3NyY19tYWluX2FwaTsgfVxubWVzc2FnZV9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL21lc3NhZ2Uvc3JjL21haW4udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG1lc3NhZ2Vfc3JjX21haW4gPSAobWVzc2FnZV9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvdHlwZXNcIlxudmFyIHR5cGVzXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL21lc3NhZ2Uvc3JjL21haW4uanNcbnZhciBtYWluX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5cblxuXG5cblxudmFyIE1lc3NhZ2VDb25zdHJ1Y3RvciA9IGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEuZXh0ZW5kKG1lc3NhZ2Vfc3JjX21haW4pO1xuXG52YXIgbWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZSA9IHZvaWQgMDtcbnZhciBtYWluX2luc3RhbmNlcyA9IFtdO1xudmFyIG1haW5fc2VlZCA9IDE7XG5cbnZhciBtYWluX01lc3NhZ2UgPSBmdW5jdGlvbiBNZXNzYWdlKG9wdGlvbnMpIHtcbiAgaWYgKGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEucHJvdG90eXBlLiRpc1NlcnZlcikgcmV0dXJuO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBtZXNzYWdlOiBvcHRpb25zXG4gICAgfTtcbiAgfVxuICB2YXIgdXNlck9uQ2xvc2UgPSBvcHRpb25zLm9uQ2xvc2U7XG4gIHZhciBpZCA9ICdtZXNzYWdlXycgKyBtYWluX3NlZWQrKztcblxuICBvcHRpb25zLm9uQ2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgTWVzc2FnZS5jbG9zZShpZCwgdXNlck9uQ2xvc2UpO1xuICB9O1xuICBtZXNzYWdlX3NyY19tYWluX2luc3RhbmNlID0gbmV3IE1lc3NhZ2VDb25zdHJ1Y3Rvcih7XG4gICAgZGF0YTogb3B0aW9uc1xuICB9KTtcbiAgbWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZS5pZCA9IGlkO1xuICBpZiAoT2JqZWN0KHZkb21fW1wiaXNWTm9kZVwiXSkobWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZS5tZXNzYWdlKSkge1xuICAgIG1lc3NhZ2Vfc3JjX21haW5faW5zdGFuY2UuJHNsb3RzLmRlZmF1bHQgPSBbbWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZS5tZXNzYWdlXTtcbiAgICBtZXNzYWdlX3NyY19tYWluX2luc3RhbmNlLm1lc3NhZ2UgPSBudWxsO1xuICB9XG4gIG1lc3NhZ2Vfc3JjX21haW5faW5zdGFuY2UuJG1vdW50KCk7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZS4kZWwpO1xuICB2YXIgdmVydGljYWxPZmZzZXQgPSBvcHRpb25zLm9mZnNldCB8fCAyMDtcbiAgbWFpbl9pbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZlcnRpY2FsT2Zmc2V0ICs9IGl0ZW0uJGVsLm9mZnNldEhlaWdodCArIDE2O1xuICB9KTtcbiAgbWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZS52ZXJ0aWNhbE9mZnNldCA9IHZlcnRpY2FsT2Zmc2V0O1xuICBtZXNzYWdlX3NyY19tYWluX2luc3RhbmNlLnZpc2libGUgPSB0cnVlO1xuICBtZXNzYWdlX3NyY19tYWluX2luc3RhbmNlLiRlbC5zdHlsZS56SW5kZXggPSBwb3B1cF9bXCJQb3B1cE1hbmFnZXJcIl0ubmV4dFpJbmRleCgpO1xuICBtYWluX2luc3RhbmNlcy5wdXNoKG1lc3NhZ2Vfc3JjX21haW5faW5zdGFuY2UpO1xuICByZXR1cm4gbWVzc2FnZV9zcmNfbWFpbl9pbnN0YW5jZTtcbn07XG5cblsnc3VjY2VzcycsICd3YXJuaW5nJywgJ2luZm8nLCAnZXJyb3InXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gIG1haW5fTWVzc2FnZVt0eXBlXSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgaWYgKE9iamVjdCh0eXBlc19bXCJpc09iamVjdFwiXSkob3B0aW9ucykgJiYgIU9iamVjdCh2ZG9tX1tcImlzVk5vZGVcIl0pKG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbWFpbl9NZXNzYWdlKG1haW5fZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgICB0eXBlOiB0eXBlXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiBtYWluX01lc3NhZ2Uoe1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIG1lc3NhZ2U6IG9wdGlvbnNcbiAgICB9KTtcbiAgfTtcbn0pO1xuXG5tYWluX01lc3NhZ2UuY2xvc2UgPSBmdW5jdGlvbiAoaWQsIHVzZXJPbkNsb3NlKSB7XG4gIHZhciBsZW4gPSBtYWluX2luc3RhbmNlcy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgcmVtb3ZlZEhlaWdodCA9IHZvaWQgMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChpZCA9PT0gbWFpbl9pbnN0YW5jZXNbaV0uaWQpIHtcbiAgICAgIHJlbW92ZWRIZWlnaHQgPSBtYWluX2luc3RhbmNlc1tpXS4kZWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgaW5kZXggPSBpO1xuICAgICAgaWYgKHR5cGVvZiB1c2VyT25DbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB1c2VyT25DbG9zZShtYWluX2luc3RhbmNlc1tpXSk7XG4gICAgICB9XG4gICAgICBtYWluX2luc3RhbmNlcy5zcGxpY2UoaSwgMSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGxlbiA8PSAxIHx8IGluZGV4ID09PSAtMSB8fCBpbmRleCA+IG1haW5faW5zdGFuY2VzLmxlbmd0aCAtIDEpIHJldHVybjtcbiAgZm9yICh2YXIgX2kgPSBpbmRleDsgX2kgPCBsZW4gLSAxOyBfaSsrKSB7XG4gICAgdmFyIGRvbSA9IG1haW5faW5zdGFuY2VzW19pXS4kZWw7XG4gICAgZG9tLnN0eWxlWyd0b3AnXSA9IHBhcnNlSW50KGRvbS5zdHlsZVsndG9wJ10sIDEwKSAtIHJlbW92ZWRIZWlnaHQgLSAxNiArICdweCc7XG4gIH1cbn07XG5cbm1haW5fTWVzc2FnZS5jbG9zZUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IG1haW5faW5zdGFuY2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgbWFpbl9pbnN0YW5jZXNbaV0uY2xvc2UoKTtcbiAgfVxufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfbWVzc2FnZV9zcmNfbWFpbiA9IChtYWluX01lc3NhZ2UpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tZXNzYWdlL2luZGV4LmpzXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX21lc3NhZ2UgPSAocGFja2FnZXNfbWVzc2FnZV9zcmNfbWFpbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2JhZGdlL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03Y2NiNjU5OCZcbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfN2NjYjY1OThfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAgeyBzdGF0aWNDbGFzczogXCJlbC1iYWRnZVwiIH0sXG4gICAgW1xuICAgICAgX3ZtLl90KFwiZGVmYXVsdFwiKSxcbiAgICAgIF9jKFwidHJhbnNpdGlvblwiLCB7IGF0dHJzOiB7IG5hbWU6IFwiZWwtem9vbS1pbi1jZW50ZXJcIiB9IH0sIFtcbiAgICAgICAgX2MoXCJzdXBcIiwge1xuICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICFfdm0uaGlkZGVuICYmIChfdm0uY29udGVudCB8fCBfdm0uY29udGVudCA9PT0gMCB8fCBfdm0uaXNEb3QpLFxuICAgICAgICAgICAgICBleHByZXNzaW9uOiBcIiFoaWRkZW4gJiYgKGNvbnRlbnQgfHwgY29udGVudCA9PT0gMCB8fCBpc0RvdClcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtYmFkZ2VfX2NvbnRlbnRcIixcbiAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgX3ZtLnR5cGUgPyBcImVsLWJhZGdlX19jb250ZW50LS1cIiArIF92bS50eXBlIDogbnVsbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJpcy1maXhlZFwiOiBfdm0uJHNsb3RzLmRlZmF1bHQsXG4gICAgICAgICAgICAgIFwiaXMtZG90XCI6IF92bS5pc0RvdFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgZG9tUHJvcHM6IHsgdGV4dENvbnRlbnQ6IF92bS5fcyhfdm0uY29udGVudCkgfVxuICAgICAgICB9KVxuICAgICAgXSlcbiAgICBdLFxuICAgIDJcbiAgKVxufVxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF83Y2NiNjU5OF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxubWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzdjY2I2NTk4X3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYmFkZ2Uvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdjY2I2NTk4JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9iYWRnZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYmFkZ2Vfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxCYWRnZScsXG5cbiAgcHJvcHM6IHtcbiAgICB2YWx1ZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICBtYXg6IE51bWJlcixcbiAgICBpc0RvdDogQm9vbGVhbixcbiAgICBoaWRkZW46IEJvb2xlYW4sXG4gICAgdHlwZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsKSB7XG4gICAgICAgIHJldHVybiBbJ3ByaW1hcnknLCAnc3VjY2VzcycsICd3YXJuaW5nJywgJ2luZm8nLCAnZGFuZ2VyJ10uaW5kZXhPZih2YWwpID4gLTE7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY29udGVudDogZnVuY3Rpb24gY29udGVudCgpIHtcbiAgICAgIGlmICh0aGlzLmlzRG90KSByZXR1cm47XG5cbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICB2YXIgbWF4ID0gdGhpcy5tYXg7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHR5cGVvZiBtYXggPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBtYXggPCB2YWx1ZSA/IG1heCArICcrJyA6IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYmFkZ2Uvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2JhZGdlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGJhZGdlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JhZGdlL3NyYy9tYWluLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGJhZGdlX3NyY19tYWluX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfYmFkZ2Vfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF83Y2NiNjU5OF9yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF83Y2NiNjU5OF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGJhZGdlX3NyY19tYWluX2FwaTsgfVxuYmFkZ2Vfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9iYWRnZS9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYmFkZ2Vfc3JjX21haW4gPSAoYmFkZ2Vfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9iYWRnZS9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5iYWRnZV9zcmNfbWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KGJhZGdlX3NyY19tYWluLm5hbWUsIGJhZGdlX3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGJhZGdlID0gKGJhZGdlX3NyY19tYWluKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2FyZC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NTlhNGE0MGYmXG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzU5YTRhNDBmX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNhcmRcIixcbiAgICAgIGNsYXNzOiBfdm0uc2hhZG93ID8gXCJpcy1cIiArIF92bS5zaGFkb3cgKyBcIi1zaGFkb3dcIiA6IFwiaXMtYWx3YXlzLXNoYWRvd1wiXG4gICAgfSxcbiAgICBbXG4gICAgICBfdm0uJHNsb3RzLmhlYWRlciB8fCBfdm0uaGVhZGVyXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1jYXJkX19oZWFkZXJcIiB9LFxuICAgICAgICAgICAgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl92KF92bS5fcyhfdm0uaGVhZGVyKSldKV0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgX2MoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtY2FyZF9fYm9keVwiLCBzdHlsZTogX3ZtLmJvZHlTdHlsZSB9LFxuICAgICAgICBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sXG4gICAgICAgIDJcbiAgICAgIClcbiAgICBdXG4gIClcbn1cbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTlhNGE0MGZfc3RhdGljUmVuZGVyRm5zID0gW11cbm1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81OWE0YTQwZl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NhcmQvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTU5YTRhNDBmJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYXJkL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXJkX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsQ2FyZCcsXG4gIHByb3BzOiB7XG4gICAgaGVhZGVyOiB7fSxcbiAgICBib2R5U3R5bGU6IHt9LFxuICAgIHNoYWRvdzoge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FyZC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfY2FyZF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChjYXJkX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NhcmQvc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY2FyZF9zcmNfbWFpbl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhY2thZ2VzX2NhcmRfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81OWE0YTQwZl9yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81OWE0YTQwZl9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGNhcmRfc3JjX21haW5fYXBpOyB9XG5jYXJkX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2FyZC9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY2FyZF9zcmNfbWFpbiA9IChjYXJkX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FyZC9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jYXJkX3NyY19tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoY2FyZF9zcmNfbWFpbi5uYW1lLCBjYXJkX3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhcmQgPSAoY2FyZF9zcmNfbWFpbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3JhdGUvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWFkYTU3NzgyJlxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF9hZGE1Nzc4Ml9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1yYXRlXCIsXG4gICAgICBhdHRyczoge1xuICAgICAgICByb2xlOiBcInNsaWRlclwiLFxuICAgICAgICBcImFyaWEtdmFsdWVub3dcIjogX3ZtLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgXCJhcmlhLXZhbHVldGV4dFwiOiBfdm0udGV4dCxcbiAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogX3ZtLm1heCxcbiAgICAgICAgdGFiaW5kZXg6IFwiMFwiXG4gICAgICB9LFxuICAgICAgb246IHsga2V5ZG93bjogX3ZtLmhhbmRsZUtleSB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfdm0uX2woX3ZtLm1heCwgZnVuY3Rpb24oaXRlbSwga2V5KSB7XG4gICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXJhdGVfX2l0ZW1cIixcbiAgICAgICAgICAgIHN0eWxlOiB7IGN1cnNvcjogX3ZtLnJhdGVEaXNhYmxlZCA/IFwiYXV0b1wiIDogXCJwb2ludGVyXCIgfSxcbiAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgIG1vdXNlbW92ZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgX3ZtLnNldEN1cnJlbnRWYWx1ZShpdGVtLCAkZXZlbnQpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1vdXNlbGVhdmU6IF92bS5yZXNldEN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgIF92bS5zZWxlY3RWYWx1ZShpdGVtKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgXCJpXCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1yYXRlX19pY29uXCIsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICAgIF92bS5jbGFzc2VzW2l0ZW0gLSAxXSxcbiAgICAgICAgICAgICAgICAgIHsgaG92ZXI6IF92bS5ob3ZlckluZGV4ID09PSBpdGVtIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBfdm0uZ2V0SWNvblN0eWxlKGl0ZW0pXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBfdm0uc2hvd0RlY2ltYWxJY29uKGl0ZW0pXG4gICAgICAgICAgICAgICAgICA/IF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcmF0ZV9fZGVjaW1hbFwiLFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBfdm0uZGVjaW1hbEljb25DbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogX3ZtLmRlY2ltYWxTdHlsZVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApXG4gICAgICAgICAgXVxuICAgICAgICApXG4gICAgICB9KSxcbiAgICAgIF92bS5zaG93VGV4dCB8fCBfdm0uc2hvd1Njb3JlXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtcmF0ZV9fdGV4dFwiLCBzdHlsZTogeyBjb2xvcjogX3ZtLnRleHRDb2xvciB9IH0sXG4gICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXVxuICAgICAgICAgIClcbiAgICAgICAgOiBfdm0uX2UoKVxuICAgIF0sXG4gICAgMlxuICApXG59XG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2FkYTU3NzgyX3N0YXRpY1JlbmRlckZucyA9IFtdXG5tYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfYWRhNTc3ODJfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYXRlL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1hZGE1Nzc4MiZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmF0ZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHJhdGVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxSYXRlJyxcblxuICBtaXhpbnM6IFttaWdyYXRpbmdfZGVmYXVsdC5hXSxcblxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvaW50ZXJBdExlZnRIYWxmOiB0cnVlLFxuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgaG92ZXJJbmRleDogLTFcbiAgICB9O1xuICB9LFxuXG5cbiAgcHJvcHM6IHtcbiAgICB2YWx1ZToge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMFxuICAgIH0sXG4gICAgbG93VGhyZXNob2xkOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAyXG4gICAgfSxcbiAgICBoaWdoVGhyZXNob2xkOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiA0XG4gICAgfSxcbiAgICBtYXg6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDVcbiAgICB9LFxuICAgIGNvbG9yczoge1xuICAgICAgdHlwZTogW0FycmF5LCBPYmplY3RdLFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiBbJyNGN0JBMkEnLCAnI0Y3QkEyQScsICcjRjdCQTJBJ107XG4gICAgICB9XG4gICAgfSxcbiAgICB2b2lkQ29sb3I6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcjQzZEMURFJ1xuICAgIH0sXG4gICAgZGlzYWJsZWRWb2lkQ29sb3I6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcjRUZGMkY3J1xuICAgIH0sXG4gICAgaWNvbkNsYXNzZXM6IHtcbiAgICAgIHR5cGU6IFtBcnJheSwgT2JqZWN0XSxcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gWydlbC1pY29uLXN0YXItb24nLCAnZWwtaWNvbi1zdGFyLW9uJywgJ2VsLWljb24tc3Rhci1vbiddO1xuICAgICAgfVxuICAgIH0sXG4gICAgdm9pZEljb25DbGFzczoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2VsLWljb24tc3Rhci1vZmYnXG4gICAgfSxcbiAgICBkaXNhYmxlZFZvaWRJY29uQ2xhc3M6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdlbC1pY29uLXN0YXItb24nXG4gICAgfSxcbiAgICBkaXNhYmxlZDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICBhbGxvd0hhbGY6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgc2hvd1RleHQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgc2hvd1Njb3JlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIHRleHRDb2xvcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJyMxZjJkM2QnXG4gICAgfSxcbiAgICB0ZXh0czoge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIFsn5p6B5beuJywgJ+WkseacmycsICfkuIDoiKwnLCAn5ruh5oSPJywgJ+aDiuWWnCddO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2NvcmVUZW1wbGF0ZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ3t2YWx1ZX0nXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdGV4dDogZnVuY3Rpb24gdGV4dCgpIHtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIGlmICh0aGlzLnNob3dTY29yZSkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLnNjb3JlVGVtcGxhdGUucmVwbGFjZSgvXFx7XFxzKnZhbHVlXFxzKlxcfS8sIHRoaXMucmF0ZURpc2FibGVkID8gdGhpcy52YWx1ZSA6IHRoaXMuY3VycmVudFZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG93VGV4dCkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLnRleHRzW01hdGguY2VpbCh0aGlzLmN1cnJlbnRWYWx1ZSkgLSAxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICBkZWNpbWFsU3R5bGU6IGZ1bmN0aW9uIGRlY2ltYWxTdHlsZSgpIHtcbiAgICAgIHZhciB3aWR0aCA9ICcnO1xuICAgICAgaWYgKHRoaXMucmF0ZURpc2FibGVkKSB7XG4gICAgICAgIHdpZHRoID0gdGhpcy52YWx1ZURlY2ltYWwgKyAnJSc7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYWxsb3dIYWxmKSB7XG4gICAgICAgIHdpZHRoID0gJzUwJSc7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogdGhpcy5hY3RpdmVDb2xvcixcbiAgICAgICAgd2lkdGg6IHdpZHRoXG4gICAgICB9O1xuICAgIH0sXG4gICAgdmFsdWVEZWNpbWFsOiBmdW5jdGlvbiB2YWx1ZURlY2ltYWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSAqIDEwMCAtIE1hdGguZmxvb3IodGhpcy52YWx1ZSkgKiAxMDA7XG4gICAgfSxcbiAgICBjbGFzc01hcDogZnVuY3Rpb24gY2xhc3NNYXAoKSB7XG4gICAgICB2YXIgX3JlZjtcblxuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5pY29uQ2xhc3NlcykgPyAoX3JlZiA9IHt9LCBfcmVmW3RoaXMubG93VGhyZXNob2xkXSA9IHRoaXMuaWNvbkNsYXNzZXNbMF0sIF9yZWZbdGhpcy5oaWdoVGhyZXNob2xkXSA9IHsgdmFsdWU6IHRoaXMuaWNvbkNsYXNzZXNbMV0sIGV4Y2x1ZGVkOiB0cnVlIH0sIF9yZWZbdGhpcy5tYXhdID0gdGhpcy5pY29uQ2xhc3Nlc1syXSwgX3JlZikgOiB0aGlzLmljb25DbGFzc2VzO1xuICAgIH0sXG4gICAgZGVjaW1hbEljb25DbGFzczogZnVuY3Rpb24gZGVjaW1hbEljb25DbGFzcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlRnJvbU1hcCh0aGlzLnZhbHVlLCB0aGlzLmNsYXNzTWFwKTtcbiAgICB9LFxuICAgIHZvaWRDbGFzczogZnVuY3Rpb24gdm9pZENsYXNzKCkge1xuICAgICAgcmV0dXJuIHRoaXMucmF0ZURpc2FibGVkID8gdGhpcy5kaXNhYmxlZFZvaWRJY29uQ2xhc3MgOiB0aGlzLnZvaWRJY29uQ2xhc3M7XG4gICAgfSxcbiAgICBhY3RpdmVDbGFzczogZnVuY3Rpb24gYWN0aXZlQ2xhc3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUZyb21NYXAodGhpcy5jdXJyZW50VmFsdWUsIHRoaXMuY2xhc3NNYXApO1xuICAgIH0sXG4gICAgY29sb3JNYXA6IGZ1bmN0aW9uIGNvbG9yTWFwKCkge1xuICAgICAgdmFyIF9yZWYyO1xuXG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLmNvbG9ycykgPyAoX3JlZjIgPSB7fSwgX3JlZjJbdGhpcy5sb3dUaHJlc2hvbGRdID0gdGhpcy5jb2xvcnNbMF0sIF9yZWYyW3RoaXMuaGlnaFRocmVzaG9sZF0gPSB7IHZhbHVlOiB0aGlzLmNvbG9yc1sxXSwgZXhjbHVkZWQ6IHRydWUgfSwgX3JlZjJbdGhpcy5tYXhdID0gdGhpcy5jb2xvcnNbMl0sIF9yZWYyKSA6IHRoaXMuY29sb3JzO1xuICAgIH0sXG4gICAgYWN0aXZlQ29sb3I6IGZ1bmN0aW9uIGFjdGl2ZUNvbG9yKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVGcm9tTWFwKHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmNvbG9yTWFwKTtcbiAgICB9LFxuICAgIGNsYXNzZXM6IGZ1bmN0aW9uIGNsYXNzZXMoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB2YXIgdGhyZXNob2xkID0gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgICBpZiAodGhpcy5hbGxvd0hhbGYgJiYgdGhpcy5jdXJyZW50VmFsdWUgIT09IE1hdGguZmxvb3IodGhpcy5jdXJyZW50VmFsdWUpKSB7XG4gICAgICAgIHRocmVzaG9sZC0tO1xuICAgICAgfVxuICAgICAgZm9yICg7IGkgPCB0aHJlc2hvbGQ7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLmFjdGl2ZUNsYXNzKTtcbiAgICAgIH1cbiAgICAgIGZvciAoOyBpIDwgdGhpcy5tYXg7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnZvaWRDbGFzcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgcmF0ZURpc2FibGVkOiBmdW5jdGlvbiByYXRlRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkO1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdmFsO1xuICAgICAgdGhpcy5wb2ludGVyQXRMZWZ0SGFsZiA9IHRoaXMudmFsdWUgIT09IE1hdGguZmxvb3IodGhpcy52YWx1ZSk7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRNaWdyYXRpbmdDb25maWc6IGZ1bmN0aW9uIGdldE1pZ3JhdGluZ0NvbmZpZygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgJ3RleHQtdGVtcGxhdGUnOiAndGV4dC10ZW1wbGF0ZSBpcyByZW5hbWVkIHRvIHNjb3JlLXRlbXBsYXRlLidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgIGdldFZhbHVlRnJvbU1hcDogZnVuY3Rpb24gZ2V0VmFsdWVGcm9tTWFwKHZhbHVlLCBtYXApIHtcbiAgICAgIHZhciBtYXRjaGVkS2V5cyA9IE9iamVjdC5rZXlzKG1hcCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHZhbCA9IG1hcFtrZXldO1xuICAgICAgICB2YXIgZXhjbHVkZWQgPSBPYmplY3QodHlwZXNfW1wiaXNPYmplY3RcIl0pKHZhbCkgPyB2YWwuZXhjbHVkZWQgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGV4Y2x1ZGVkID8gdmFsdWUgPCBrZXkgOiB2YWx1ZSA8PSBrZXk7XG4gICAgICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhIC0gYjtcbiAgICAgIH0pO1xuICAgICAgdmFyIG1hdGNoZWRWYWx1ZSA9IG1hcFttYXRjaGVkS2V5c1swXV07XG4gICAgICByZXR1cm4gT2JqZWN0KHR5cGVzX1tcImlzT2JqZWN0XCJdKShtYXRjaGVkVmFsdWUpID8gbWF0Y2hlZFZhbHVlLnZhbHVlIDogbWF0Y2hlZFZhbHVlIHx8ICcnO1xuICAgIH0sXG4gICAgc2hvd0RlY2ltYWxJY29uOiBmdW5jdGlvbiBzaG93RGVjaW1hbEljb24oaXRlbSkge1xuICAgICAgdmFyIHNob3dXaGVuRGlzYWJsZWQgPSB0aGlzLnJhdGVEaXNhYmxlZCAmJiB0aGlzLnZhbHVlRGVjaW1hbCA+IDAgJiYgaXRlbSAtIDEgPCB0aGlzLnZhbHVlICYmIGl0ZW0gPiB0aGlzLnZhbHVlO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHZhciBzaG93V2hlbkFsbG93SGFsZiA9IHRoaXMuYWxsb3dIYWxmICYmIHRoaXMucG9pbnRlckF0TGVmdEhhbGYgJiYgaXRlbSAtIDAuNSA8PSB0aGlzLmN1cnJlbnRWYWx1ZSAmJiBpdGVtID4gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgICByZXR1cm4gc2hvd1doZW5EaXNhYmxlZCB8fCBzaG93V2hlbkFsbG93SGFsZjtcbiAgICB9LFxuICAgIGdldEljb25TdHlsZTogZnVuY3Rpb24gZ2V0SWNvblN0eWxlKGl0ZW0pIHtcbiAgICAgIHZhciB2b2lkQ29sb3IgPSB0aGlzLnJhdGVEaXNhYmxlZCA/IHRoaXMuZGlzYWJsZWRWb2lkQ29sb3IgOiB0aGlzLnZvaWRDb2xvcjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiBpdGVtIDw9IHRoaXMuY3VycmVudFZhbHVlID8gdGhpcy5hY3RpdmVDb2xvciA6IHZvaWRDb2xvclxuICAgICAgfTtcbiAgICB9LFxuICAgIHNlbGVjdFZhbHVlOiBmdW5jdGlvbiBzZWxlY3RWYWx1ZSh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMucmF0ZURpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmFsbG93SGFsZiAmJiB0aGlzLnBvaW50ZXJBdExlZnRIYWxmKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdGhpcy5jdXJyZW50VmFsdWUpO1xuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB0aGlzLmN1cnJlbnRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTtcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlS2V5OiBmdW5jdGlvbiBoYW5kbGVLZXkoZSkge1xuICAgICAgaWYgKHRoaXMucmF0ZURpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSB0aGlzLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHZhciBrZXlDb2RlID0gZS5rZXlDb2RlO1xuICAgICAgaWYgKGtleUNvZGUgPT09IDM4IHx8IGtleUNvZGUgPT09IDM5KSB7XG4gICAgICAgIC8vIGxlZnQgLyBkb3duXG4gICAgICAgIGlmICh0aGlzLmFsbG93SGFsZikge1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZSArPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudFZhbHVlICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSAzNyB8fCBrZXlDb2RlID09PSA0MCkge1xuICAgICAgICBpZiAodGhpcy5hbGxvd0hhbGYpIHtcbiAgICAgICAgICBjdXJyZW50VmFsdWUgLT0gMC41O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZSAtPSAxO1xuICAgICAgICB9XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZSA8IDAgPyAwIDogY3VycmVudFZhbHVlO1xuICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlID4gdGhpcy5tYXggPyB0aGlzLm1heCA6IGN1cnJlbnRWYWx1ZTtcblxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBjdXJyZW50VmFsdWUpO1xuICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgY3VycmVudFZhbHVlKTtcbiAgICB9LFxuICAgIHNldEN1cnJlbnRWYWx1ZTogZnVuY3Rpb24gc2V0Q3VycmVudFZhbHVlKHZhbHVlLCBldmVudCkge1xuICAgICAgaWYgKHRoaXMucmF0ZURpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHRoaXMuYWxsb3dIYWxmKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgIGlmIChPYmplY3QoZG9tX1tcImhhc0NsYXNzXCJdKSh0YXJnZXQsICdlbC1yYXRlX19pdGVtJykpIHtcbiAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucXVlcnlTZWxlY3RvcignLmVsLXJhdGVfX2ljb24nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0KGRvbV9bXCJoYXNDbGFzc1wiXSkodGFyZ2V0LCAnZWwtcmF0ZV9fZGVjaW1hbCcpKSB7XG4gICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb2ludGVyQXRMZWZ0SGFsZiA9IGV2ZW50Lm9mZnNldFggKiAyIDw9IHRhcmdldC5jbGllbnRXaWR0aDtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0aGlzLnBvaW50ZXJBdExlZnRIYWxmID8gdmFsdWUgLSAwLjUgOiB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgICB0aGlzLmhvdmVySW5kZXggPSB2YWx1ZTtcbiAgICB9LFxuICAgIHJlc2V0Q3VycmVudFZhbHVlOiBmdW5jdGlvbiByZXNldEN1cnJlbnRWYWx1ZSgpIHtcbiAgICAgIGlmICh0aGlzLnJhdGVEaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5hbGxvd0hhbGYpIHtcbiAgICAgICAgdGhpcy5wb2ludGVyQXRMZWZ0SGFsZiA9IHRoaXMudmFsdWUgIT09IE1hdGguZmxvb3IodGhpcy52YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICB0aGlzLmhvdmVySW5kZXggPSAtMTtcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcbiAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgMCk7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmF0ZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfcmF0ZV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChyYXRlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhdGUvc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgcmF0ZV9zcmNfbWFpbl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhY2thZ2VzX3JhdGVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF9hZGE1Nzc4Ml9yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF9hZGE1Nzc4Ml9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHJhdGVfc3JjX21haW5fYXBpOyB9XG5yYXRlX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvcmF0ZS9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcmF0ZV9zcmNfbWFpbiA9IChyYXRlX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmF0ZS9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5yYXRlX3NyY19tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQocmF0ZV9zcmNfbWFpbi5uYW1lLCByYXRlX3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3JhdGUgPSAocmF0ZV9zcmNfbWFpbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3N0ZXBzL3NyYy9zdGVwcy52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2M2YjZkYzAmXG52YXIgc3RlcHN2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zYzZiNmRjMF9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1zdGVwc1wiLFxuICAgICAgY2xhc3M6IFtcbiAgICAgICAgIV92bS5zaW1wbGUgJiYgXCJlbC1zdGVwcy0tXCIgKyBfdm0uZGlyZWN0aW9uLFxuICAgICAgICBfdm0uc2ltcGxlICYmIFwiZWwtc3RlcHMtLXNpbXBsZVwiXG4gICAgICBdXG4gICAgfSxcbiAgICBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sXG4gICAgMlxuICApXG59XG52YXIgc3RlcHN2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zYzZiNmRjMF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuc3RlcHN2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zYzZiNmRjMF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N0ZXBzL3NyYy9zdGVwcy52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2M2YjZkYzAmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3N0ZXBzL3NyYy9zdGVwcy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHN0ZXBzdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsU3RlcHMnLFxuXG4gIG1peGluczogW21pZ3JhdGluZ19kZWZhdWx0LmFdLFxuXG4gIHByb3BzOiB7XG4gICAgc3BhY2U6IFtOdW1iZXIsIFN0cmluZ10sXG4gICAgYWN0aXZlOiBOdW1iZXIsXG4gICAgZGlyZWN0aW9uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnaG9yaXpvbnRhbCdcbiAgICB9LFxuICAgIGFsaWduQ2VudGVyOiBCb29sZWFuLFxuICAgIHNpbXBsZTogQm9vbGVhbixcbiAgICBmaW5pc2hTdGF0dXM6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdmaW5pc2gnXG4gICAgfSxcbiAgICBwcm9jZXNzU3RhdHVzOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAncHJvY2VzcydcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RlcHM6IFtdLFxuICAgICAgc3RlcE9mZnNldDogMFxuICAgIH07XG4gIH0sXG5cblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TWlncmF0aW5nQ29uZmlnOiBmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICdjZW50ZXInOiAnY2VudGVyIGlzIHJlbW92ZWQuJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKG5ld1ZhbCwgb2xkVmFsKSB7XG4gICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBuZXdWYWwsIG9sZFZhbCk7XG4gICAgfSxcbiAgICBzdGVwczogZnVuY3Rpb24gc3RlcHMoX3N0ZXBzKSB7XG4gICAgICBfc3RlcHMuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zdGVwcy9zcmMvc3RlcHMudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19zdGVwc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChzdGVwc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zdGVwcy9zcmMvc3RlcHMudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgc3RlcHNfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfc3RlcHN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHN0ZXBzdnVlX3R5cGVfdGVtcGxhdGVfaWRfM2M2YjZkYzBfcmVuZGVyLFxuICBzdGVwc3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzNjNmI2ZGMwX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgc3RlcHNfYXBpOyB9XG5zdGVwc19jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3N0ZXBzL3NyYy9zdGVwcy52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3RlcHMgPSAoc3RlcHNfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zdGVwcy9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zdGVwcy5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHN0ZXBzLm5hbWUsIHN0ZXBzKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3N0ZXBzID0gKHN0ZXBzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3RlcHMvc3JjL3N0ZXAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWY0MTRhODdhJlxudmFyIHN0ZXB2dWVfdHlwZV90ZW1wbGF0ZV9pZF9mNDE0YTg3YV9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1zdGVwXCIsXG4gICAgICBjbGFzczogW1xuICAgICAgICAhX3ZtLmlzU2ltcGxlICYmIFwiaXMtXCIgKyBfdm0uJHBhcmVudC5kaXJlY3Rpb24sXG4gICAgICAgIF92bS5pc1NpbXBsZSAmJiBcImlzLXNpbXBsZVwiLFxuICAgICAgICBfdm0uaXNMYXN0ICYmICFfdm0uc3BhY2UgJiYgIV92bS5pc0NlbnRlciAmJiBcImlzLWZsZXhcIixcbiAgICAgICAgX3ZtLmlzQ2VudGVyICYmICFfdm0uaXNWZXJ0aWNhbCAmJiAhX3ZtLmlzU2ltcGxlICYmIFwiaXMtY2VudGVyXCJcbiAgICAgIF0sXG4gICAgICBzdHlsZTogX3ZtLnN0eWxlXG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1zdGVwX19oZWFkXCIsIGNsYXNzOiBcImlzLVwiICsgX3ZtLmN1cnJlbnRTdGF0dXMgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtc3RlcF9fbGluZVwiLFxuICAgICAgICAgICAgICBzdHlsZTogX3ZtLmlzTGFzdFxuICAgICAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgICAgIDogeyBtYXJnaW5SaWdodDogX3ZtLiRwYXJlbnQuc3RlcE9mZnNldCArIFwicHhcIiB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXN0ZXBfX2xpbmUtaW5uZXJcIixcbiAgICAgICAgICAgICAgICBzdHlsZTogX3ZtLmxpbmVTdHlsZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXVxuICAgICAgICAgICksXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1zdGVwX19pY29uXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiBcImlzLVwiICsgKF92bS5pY29uID8gXCJpY29uXCIgOiBcInRleHRcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF92bS5jdXJyZW50U3RhdHVzICE9PSBcInN1Y2Nlc3NcIiAmJiBfdm0uY3VycmVudFN0YXR1cyAhPT0gXCJlcnJvclwiXG4gICAgICAgICAgICAgICAgPyBfdm0uX3QoXCJpY29uXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmljb25cbiAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXN0ZXBfX2ljb24taW5uZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtfdm0uaWNvbl1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgIV92bS5pY29uICYmICFfdm0uaXNTaW1wbGVcbiAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtc3RlcF9faWNvbi1pbm5lclwiIH0sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uaW5kZXggKyAxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICA6IF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXN0ZXBfX2ljb24taW5uZXIgaXMtc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgXCJlbC1pY29uLVwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChfdm0uY3VycmVudFN0YXR1cyA9PT0gXCJzdWNjZXNzXCIgPyBcImNoZWNrXCIgOiBcImNsb3NlXCIpXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgXVxuICAgICAgKSxcbiAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtc3RlcF9fbWFpblwiIH0sIFtcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZWY6IFwidGl0bGVcIixcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXN0ZXBfX3RpdGxlXCIsXG4gICAgICAgICAgICBjbGFzczogW1wiaXMtXCIgKyBfdm0uY3VycmVudFN0YXR1c11cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtfdm0uX3QoXCJ0aXRsZVwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXSxcbiAgICAgICAgICAyXG4gICAgICAgICksXG4gICAgICAgIF92bS5pc1NpbXBsZVxuICAgICAgICAgID8gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1zdGVwX19hcnJvd1wiIH0pXG4gICAgICAgICAgOiBfYyhcbiAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXN0ZXBfX2Rlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFtcImlzLVwiICsgX3ZtLmN1cnJlbnRTdGF0dXNdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtfdm0uX3QoXCJkZXNjcmlwdGlvblwiLCBbX3ZtLl92KF92bS5fcyhfdm0uZGVzY3JpcHRpb24pKV0pXSxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKVxuICAgICAgXSlcbiAgICBdXG4gIClcbn1cbnZhciBzdGVwdnVlX3R5cGVfdGVtcGxhdGVfaWRfZjQxNGE4N2Ffc3RhdGljUmVuZGVyRm5zID0gW11cbnN0ZXB2dWVfdHlwZV90ZW1wbGF0ZV9pZF9mNDE0YTg3YV9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N0ZXBzL3NyYy9zdGVwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1mNDE0YTg3YSZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3RlcHMvc3JjL3N0ZXAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3RlcHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFN0ZXAnLFxuXG4gIHByb3BzOiB7XG4gICAgdGl0bGU6IFN0cmluZyxcbiAgICBpY29uOiBTdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IFN0cmluZyxcbiAgICBzdGF0dXM6IFN0cmluZ1xuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluZGV4OiAtMSxcbiAgICAgIGxpbmVTdHlsZToge30sXG4gICAgICBpbnRlcm5hbFN0YXR1czogJydcbiAgICB9O1xuICB9LFxuICBiZWZvcmVDcmVhdGU6IGZ1bmN0aW9uIGJlZm9yZUNyZWF0ZSgpIHtcbiAgICB0aGlzLiRwYXJlbnQuc3RlcHMucHVzaCh0aGlzKTtcbiAgfSxcbiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICB2YXIgc3RlcHMgPSB0aGlzLiRwYXJlbnQuc3RlcHM7XG4gICAgdmFyIGluZGV4ID0gc3RlcHMuaW5kZXhPZih0aGlzKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgc3RlcHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIGN1cnJlbnRTdGF0dXM6IGZ1bmN0aW9uIGN1cnJlbnRTdGF0dXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0dXMgfHwgdGhpcy5pbnRlcm5hbFN0YXR1cztcbiAgICB9LFxuICAgIHByZXZTdGF0dXM6IGZ1bmN0aW9uIHByZXZTdGF0dXMoKSB7XG4gICAgICB2YXIgcHJldlN0ZXAgPSB0aGlzLiRwYXJlbnQuc3RlcHNbdGhpcy5pbmRleCAtIDFdO1xuICAgICAgcmV0dXJuIHByZXZTdGVwID8gcHJldlN0ZXAuY3VycmVudFN0YXR1cyA6ICd3YWl0JztcbiAgICB9LFxuICAgIGlzQ2VudGVyOiBmdW5jdGlvbiBpc0NlbnRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQuYWxpZ25DZW50ZXI7XG4gICAgfSxcbiAgICBpc1ZlcnRpY2FsOiBmdW5jdGlvbiBpc1ZlcnRpY2FsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5kaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCc7XG4gICAgfSxcbiAgICBpc1NpbXBsZTogZnVuY3Rpb24gaXNTaW1wbGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50LnNpbXBsZTtcbiAgICB9LFxuICAgIGlzTGFzdDogZnVuY3Rpb24gaXNMYXN0KCkge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcbiAgICAgIHJldHVybiBwYXJlbnQuc3RlcHNbcGFyZW50LnN0ZXBzLmxlbmd0aCAtIDFdID09PSB0aGlzO1xuICAgIH0sXG4gICAgc3RlcHNDb3VudDogZnVuY3Rpb24gc3RlcHNDb3VudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQuc3RlcHMubGVuZ3RoO1xuICAgIH0sXG4gICAgc3BhY2U6IGZ1bmN0aW9uIHNwYWNlKCkge1xuICAgICAgdmFyIGlzU2ltcGxlID0gdGhpcy5pc1NpbXBsZSxcbiAgICAgICAgICBzcGFjZSA9IHRoaXMuJHBhcmVudC5zcGFjZTtcblxuICAgICAgcmV0dXJuIGlzU2ltcGxlID8gJycgOiBzcGFjZTtcbiAgICB9LFxuXG4gICAgc3R5bGU6IGZ1bmN0aW9uIHN0eWxlKCkge1xuICAgICAgdmFyIHN0eWxlID0ge307XG4gICAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuICAgICAgdmFyIGxlbiA9IHBhcmVudC5zdGVwcy5sZW5ndGg7XG5cbiAgICAgIHZhciBzcGFjZSA9IHR5cGVvZiB0aGlzLnNwYWNlID09PSAnbnVtYmVyJyA/IHRoaXMuc3BhY2UgKyAncHgnIDogdGhpcy5zcGFjZSA/IHRoaXMuc3BhY2UgOiAxMDAgLyAobGVuIC0gKHRoaXMuaXNDZW50ZXIgPyAwIDogMSkpICsgJyUnO1xuICAgICAgc3R5bGUuZmxleEJhc2lzID0gc3BhY2U7XG4gICAgICBpZiAodGhpcy5pc1ZlcnRpY2FsKSByZXR1cm4gc3R5bGU7XG4gICAgICBpZiAodGhpcy5pc0xhc3QpIHtcbiAgICAgICAgc3R5bGUubWF4V2lkdGggPSAxMDAgLyB0aGlzLnN0ZXBzQ291bnQgKyAnJSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZS5tYXJnaW5SaWdodCA9IC10aGlzLiRwYXJlbnQuc3RlcE9mZnNldCArICdweCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHVwZGF0ZVN0YXR1czogZnVuY3Rpb24gdXBkYXRlU3RhdHVzKHZhbCkge1xuICAgICAgdmFyIHByZXZDaGlsZCA9IHRoaXMuJHBhcmVudC4kY2hpbGRyZW5bdGhpcy5pbmRleCAtIDFdO1xuXG4gICAgICBpZiAodmFsID4gdGhpcy5pbmRleCkge1xuICAgICAgICB0aGlzLmludGVybmFsU3RhdHVzID0gdGhpcy4kcGFyZW50LmZpbmlzaFN0YXR1cztcbiAgICAgIH0gZWxzZSBpZiAodmFsID09PSB0aGlzLmluZGV4ICYmIHRoaXMucHJldlN0YXR1cyAhPT0gJ2Vycm9yJykge1xuICAgICAgICB0aGlzLmludGVybmFsU3RhdHVzID0gdGhpcy4kcGFyZW50LnByb2Nlc3NTdGF0dXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmludGVybmFsU3RhdHVzID0gJ3dhaXQnO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldkNoaWxkKSBwcmV2Q2hpbGQuY2FsY1Byb2dyZXNzKHRoaXMuaW50ZXJuYWxTdGF0dXMpO1xuICAgIH0sXG4gICAgY2FsY1Byb2dyZXNzOiBmdW5jdGlvbiBjYWxjUHJvZ3Jlc3Moc3RhdHVzKSB7XG4gICAgICB2YXIgc3RlcCA9IDEwMDtcbiAgICAgIHZhciBzdHlsZSA9IHt9O1xuXG4gICAgICBzdHlsZS50cmFuc2l0aW9uRGVsYXkgPSAxNTAgKiB0aGlzLmluZGV4ICsgJ21zJztcbiAgICAgIGlmIChzdGF0dXMgPT09IHRoaXMuJHBhcmVudC5wcm9jZXNzU3RhdHVzKSB7XG4gICAgICAgIHN0ZXAgPSB0aGlzLmN1cnJlbnRTdGF0dXMgIT09ICdlcnJvcicgPyAwIDogMDtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnd2FpdCcpIHtcbiAgICAgICAgc3RlcCA9IDA7XG4gICAgICAgIHN0eWxlLnRyYW5zaXRpb25EZWxheSA9IC0xNTAgKiB0aGlzLmluZGV4ICsgJ21zJztcbiAgICAgIH1cblxuICAgICAgc3R5bGUuYm9yZGVyV2lkdGggPSBzdGVwICYmICF0aGlzLmlzU2ltcGxlID8gJzFweCcgOiAwO1xuICAgICAgdGhpcy4kcGFyZW50LmRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHN0eWxlLmhlaWdodCA9IHN0ZXAgKyAnJScgOiBzdHlsZS53aWR0aCA9IHN0ZXAgKyAnJSc7XG5cbiAgICAgIHRoaXMubGluZVN0eWxlID0gc3R5bGU7XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciB1bndhdGNoID0gdGhpcy4kd2F0Y2goJ2luZGV4JywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgX3RoaXMuJHdhdGNoKCckcGFyZW50LmFjdGl2ZScsIF90aGlzLnVwZGF0ZVN0YXR1cywgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG4gICAgICBfdGhpcy4kd2F0Y2goJyRwYXJlbnQucHJvY2Vzc1N0YXR1cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gX3RoaXMuJHBhcmVudC5hY3RpdmU7XG4gICAgICAgIF90aGlzLnVwZGF0ZVN0YXR1cyhhY3RpdmVJbmRleCk7XG4gICAgICB9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcbiAgICAgIHVud2F0Y2goKTtcbiAgICB9KTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N0ZXBzL3NyYy9zdGVwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfc3RlcHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChzdGVwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N0ZXBzL3NyYy9zdGVwLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHN0ZXBfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfc3RlcHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgc3RlcHZ1ZV90eXBlX3RlbXBsYXRlX2lkX2Y0MTRhODdhX3JlbmRlcixcbiAgc3RlcHZ1ZV90eXBlX3RlbXBsYXRlX2lkX2Y0MTRhODdhX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgc3RlcF9hcGk7IH1cbnN0ZXBfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9zdGVwcy9zcmMvc3RlcC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3RlcCA9IChzdGVwX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3RlcC9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zdGVwLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoc3RlcC5uYW1lLCBzdGVwKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3N0ZXAgPSAoc3RlcCk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhcm91c2VsL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01ZDVkMTQ4MiZcbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQ1ZDE0ODJfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgY2xhc3M6IF92bS5jYXJvdXNlbENsYXNzZXMsXG4gICAgICBvbjoge1xuICAgICAgICBtb3VzZWVudGVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICByZXR1cm4gX3ZtLmhhbmRsZU1vdXNlRW50ZXIoJGV2ZW50KVxuICAgICAgICB9LFxuICAgICAgICBtb3VzZWxlYXZlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICByZXR1cm4gX3ZtLmhhbmRsZU1vdXNlTGVhdmUoJGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNhcm91c2VsX19jb250YWluZXJcIixcbiAgICAgICAgICBzdHlsZTogeyBoZWlnaHQ6IF92bS5oZWlnaHQgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX3ZtLmFycm93RGlzcGxheVxuICAgICAgICAgICAgPyBfYyhcInRyYW5zaXRpb25cIiwgeyBhdHRyczogeyBuYW1lOiBcImNhcm91c2VsLWFycm93LWxlZnRcIiB9IH0sIFtcbiAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKF92bS5hcnJvdyA9PT0gXCJhbHdheXNcIiB8fCBfdm0uaG92ZXIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChfdm0ubG9vcCB8fCBfdm0uYWN0aXZlSW5kZXggPiAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiKGFycm93ID09PSAnYWx3YXlzJyB8fCBob3ZlcikgJiYgKGxvb3AgfHwgYWN0aXZlSW5kZXggPiAwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jYXJvdXNlbF9fYXJyb3cgZWwtY2Fyb3VzZWxfX2Fycm93LS1sZWZ0XCIsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHR5cGU6IFwiYnV0dG9uXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBtb3VzZWVudGVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVCdXR0b25FbnRlcihcImxlZnRcIilcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIG1vdXNlbGVhdmU6IF92bS5oYW5kbGVCdXR0b25MZWF2ZSxcbiAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS50aHJvdHRsZWRBcnJvd0NsaWNrKF92bS5hY3RpdmVJbmRleCAtIDEpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgW19jKFwiaVwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWljb24tYXJyb3ctbGVmdFwiIH0pXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgX3ZtLmFycm93RGlzcGxheVxuICAgICAgICAgICAgPyBfYyhcInRyYW5zaXRpb25cIiwgeyBhdHRyczogeyBuYW1lOiBcImNhcm91c2VsLWFycm93LXJpZ2h0XCIgfSB9LCBbXG4gICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChfdm0uYXJyb3cgPT09IFwiYWx3YXlzXCIgfHwgX3ZtLmhvdmVyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoX3ZtLmxvb3AgfHwgX3ZtLmFjdGl2ZUluZGV4IDwgX3ZtLml0ZW1zLmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCIoYXJyb3cgPT09ICdhbHdheXMnIHx8IGhvdmVyKSAmJiAobG9vcCB8fCBhY3RpdmVJbmRleCA8IGl0ZW1zLmxlbmd0aCAtIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNhcm91c2VsX19hcnJvdyBlbC1jYXJvdXNlbF9fYXJyb3ctLXJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHR5cGU6IFwiYnV0dG9uXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBtb3VzZWVudGVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVCdXR0b25FbnRlcihcInJpZ2h0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBtb3VzZWxlYXZlOiBfdm0uaGFuZGxlQnV0dG9uTGVhdmUsXG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0udGhyb3R0bGVkQXJyb3dDbGljayhfdm0uYWN0aXZlSW5kZXggKyAxKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtfYyhcImlcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pY29uLWFycm93LXJpZ2h0XCIgfSldXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICBfdm0uX3QoXCJkZWZhdWx0XCIpXG4gICAgICAgIF0sXG4gICAgICAgIDJcbiAgICAgICksXG4gICAgICBfdm0uaW5kaWNhdG9yUG9zaXRpb24gIT09IFwibm9uZVwiXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcInVsXCIsXG4gICAgICAgICAgICB7IGNsYXNzOiBfdm0uaW5kaWNhdG9yc0NsYXNzZXMgfSxcbiAgICAgICAgICAgIF92bS5fbChfdm0uaXRlbXMsIGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICBcImxpXCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiZWwtY2Fyb3VzZWxfX2luZGljYXRvclwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsLWNhcm91c2VsX19pbmRpY2F0b3ItLVwiICsgX3ZtLmRpcmVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgeyBcImlzLWFjdGl2ZVwiOiBpbmRleCA9PT0gX3ZtLmFjdGl2ZUluZGV4IH1cbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBtb3VzZWVudGVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0udGhyb3R0bGVkSW5kaWNhdG9ySG92ZXIoaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlSW5kaWNhdG9yQ2xpY2soaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF9jKFwiYnV0dG9uXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtY2Fyb3VzZWxfX2J1dHRvblwiIH0sIFtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmhhc0xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgPyBfYyhcInNwYW5cIiwgW192bS5fdihfdm0uX3MoaXRlbS5sYWJlbCkpXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpXG4gICAgXVxuICApXG59XG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVkNWQxNDgyX3N0YXRpY1JlbmRlckZucyA9IFtdXG5tYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQ1ZDE0ODJfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXJvdXNlbC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NWQ1ZDE0ODImXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJ0aHJvdHRsZS1kZWJvdW5jZS90aHJvdHRsZVwiXG52YXIgdGhyb3R0bGVfID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG52YXIgdGhyb3R0bGVfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4odGhyb3R0bGVfKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2Fyb3VzZWwvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhcm91c2VsX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsQ2Fyb3VzZWwnLFxuXG4gIHByb3BzOiB7XG4gICAgaW5pdGlhbEluZGV4OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAwXG4gICAgfSxcbiAgICBoZWlnaHQ6IFN0cmluZyxcbiAgICB0cmlnZ2VyOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnaG92ZXInXG4gICAgfSxcbiAgICBhdXRvcGxheToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGludGVydmFsOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAzMDAwXG4gICAgfSxcbiAgICBpbmRpY2F0b3JQb3NpdGlvbjogU3RyaW5nLFxuICAgIGluZGljYXRvcjoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnaG92ZXInXG4gICAgfSxcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgbG9vcDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGRpcmVjdGlvbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2hvcml6b250YWwnLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsKSB7XG4gICAgICAgIHJldHVybiBbJ2hvcml6b250YWwnLCAndmVydGljYWwnXS5pbmRleE9mKHZhbCkgIT09IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogW10sXG4gICAgICBhY3RpdmVJbmRleDogLTEsXG4gICAgICBjb250YWluZXJXaWR0aDogMCxcbiAgICAgIHRpbWVyOiBudWxsLFxuICAgICAgaG92ZXI6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgYXJyb3dEaXNwbGF5OiBmdW5jdGlvbiBhcnJvd0Rpc3BsYXkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcnJvdyAhPT0gJ25ldmVyJyAmJiB0aGlzLmRpcmVjdGlvbiAhPT0gJ3ZlcnRpY2FsJztcbiAgICB9LFxuICAgIGhhc0xhYmVsOiBmdW5jdGlvbiBoYXNMYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLml0ZW1zLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWwudG9TdHJpbmcoKS5sZW5ndGggPiAwO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBjYXJvdXNlbENsYXNzZXM6IGZ1bmN0aW9uIGNhcm91c2VsQ2xhc3NlcygpIHtcbiAgICAgIHZhciBjbGFzc2VzID0gWydlbC1jYXJvdXNlbCcsICdlbC1jYXJvdXNlbC0tJyArIHRoaXMuZGlyZWN0aW9uXTtcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdjYXJkJykge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2VsLWNhcm91c2VsLS1jYXJkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3NlcztcbiAgICB9LFxuICAgIGluZGljYXRvcnNDbGFzc2VzOiBmdW5jdGlvbiBpbmRpY2F0b3JzQ2xhc3NlcygpIHtcbiAgICAgIHZhciBjbGFzc2VzID0gWydlbC1jYXJvdXNlbF9faW5kaWNhdG9ycycsICdlbC1jYXJvdXNlbF9faW5kaWNhdG9ycy0tJyArIHRoaXMuZGlyZWN0aW9uXTtcbiAgICAgIGlmICh0aGlzLmhhc0xhYmVsKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnZWwtY2Fyb3VzZWxfX2luZGljYXRvcnMtLWxhYmVscycpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaW5kaWNhdG9yUG9zaXRpb24gPT09ICdvdXRzaWRlJyB8fCB0aGlzLnR5cGUgPT09ICdjYXJkJykge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2VsLWNhcm91c2VsX19pbmRpY2F0b3JzLS1vdXRzaWRlJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3NlcztcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBpdGVtczogZnVuY3Rpb24gaXRlbXModmFsKSB7XG4gICAgICBpZiAodmFsLmxlbmd0aCA+IDApIHRoaXMuc2V0QWN0aXZlSXRlbSh0aGlzLmluaXRpYWxJbmRleCk7XG4gICAgfSxcbiAgICBhY3RpdmVJbmRleDogZnVuY3Rpb24gYWN0aXZlSW5kZXgodmFsLCBvbGRWYWwpIHtcbiAgICAgIHRoaXMucmVzZXRJdGVtUG9zaXRpb24ob2xkVmFsKTtcbiAgICAgIGlmIChvbGRWYWwgPiAtMSkge1xuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWwsIG9sZFZhbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhdXRvcGxheTogZnVuY3Rpb24gYXV0b3BsYXkodmFsKSB7XG4gICAgICB2YWwgPyB0aGlzLnN0YXJ0VGltZXIoKSA6IHRoaXMucGF1c2VUaW1lcigpO1xuICAgIH0sXG4gICAgbG9vcDogZnVuY3Rpb24gbG9vcCgpIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlSXRlbSh0aGlzLmFjdGl2ZUluZGV4KTtcbiAgICB9LFxuICAgIGludGVydmFsOiBmdW5jdGlvbiBpbnRlcnZhbCgpIHtcbiAgICAgIHRoaXMucGF1c2VUaW1lcigpO1xuICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVNb3VzZUVudGVyOiBmdW5jdGlvbiBoYW5kbGVNb3VzZUVudGVyKCkge1xuICAgICAgdGhpcy5ob3ZlciA9IHRydWU7XG4gICAgICB0aGlzLnBhdXNlVGltZXIoKTtcbiAgICB9LFxuICAgIGhhbmRsZU1vdXNlTGVhdmU6IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTGVhdmUoKSB7XG4gICAgICB0aGlzLmhvdmVyID0gZmFsc2U7XG4gICAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICB9LFxuICAgIGl0ZW1JblN0YWdlOiBmdW5jdGlvbiBpdGVtSW5TdGFnZShpdGVtLCBpbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgICAgaWYgKGluZGV4ID09PSBsZW5ndGggLSAxICYmIGl0ZW0uaW5TdGFnZSAmJiB0aGlzLml0ZW1zWzBdLmFjdGl2ZSB8fCBpdGVtLmluU3RhZ2UgJiYgdGhpcy5pdGVtc1tpbmRleCArIDFdICYmIHRoaXMuaXRlbXNbaW5kZXggKyAxXS5hY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IDAgJiYgaXRlbS5pblN0YWdlICYmIHRoaXMuaXRlbXNbbGVuZ3RoIC0gMV0uYWN0aXZlIHx8IGl0ZW0uaW5TdGFnZSAmJiB0aGlzLml0ZW1zW2luZGV4IC0gMV0gJiYgdGhpcy5pdGVtc1tpbmRleCAtIDFdLmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZUJ1dHRvbkVudGVyOiBmdW5jdGlvbiBoYW5kbGVCdXR0b25FbnRlcihhcnJvdykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAndmVydGljYWwnKSByZXR1cm47XG4gICAgICB0aGlzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgIGlmIChhcnJvdyA9PT0gX3RoaXMuaXRlbUluU3RhZ2UoaXRlbSwgaW5kZXgpKSB7XG4gICAgICAgICAgaXRlbS5ob3ZlciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgaGFuZGxlQnV0dG9uTGVhdmU6IGZ1bmN0aW9uIGhhbmRsZUJ1dHRvbkxlYXZlKCkge1xuICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAndmVydGljYWwnKSByZXR1cm47XG4gICAgICB0aGlzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaXRlbS5ob3ZlciA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICB1cGRhdGVJdGVtczogZnVuY3Rpb24gdXBkYXRlSXRlbXMoKSB7XG4gICAgICB0aGlzLml0ZW1zID0gdGhpcy4kY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gY2hpbGQuJG9wdGlvbnMubmFtZSA9PT0gJ0VsQ2Fyb3VzZWxJdGVtJztcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcmVzZXRJdGVtUG9zaXRpb246IGZ1bmN0aW9uIHJlc2V0SXRlbVBvc2l0aW9uKG9sZEluZGV4KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgICAgICBpdGVtLnRyYW5zbGF0ZUl0ZW0oaW5kZXgsIF90aGlzMi5hY3RpdmVJbmRleCwgb2xkSW5kZXgpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwbGF5U2xpZGVzOiBmdW5jdGlvbiBwbGF5U2xpZGVzKCkge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPCB0aGlzLml0ZW1zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCsrO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmxvb3ApIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IDA7XG4gICAgICB9XG4gICAgfSxcbiAgICBwYXVzZVRpbWVyOiBmdW5jdGlvbiBwYXVzZVRpbWVyKCkge1xuICAgICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcbiAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdGFydFRpbWVyOiBmdW5jdGlvbiBzdGFydFRpbWVyKCkge1xuICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwgPD0gMCB8fCAhdGhpcy5hdXRvcGxheSB8fCB0aGlzLnRpbWVyKSByZXR1cm47XG4gICAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5wbGF5U2xpZGVzLCB0aGlzLmludGVydmFsKTtcbiAgICB9LFxuICAgIHJlc2V0VGltZXI6IGZ1bmN0aW9uIHJlc2V0VGltZXIoKSB7XG4gICAgICB0aGlzLnBhdXNlVGltZXIoKTtcbiAgICAgIHRoaXMuc3RhcnRUaW1lcigpO1xuICAgIH0sXG4gICAgc2V0QWN0aXZlSXRlbTogZnVuY3Rpb24gc2V0QWN0aXZlSXRlbShpbmRleCkge1xuICAgICAgaWYgKHR5cGVvZiBpbmRleCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIGZpbHRlcmVkSXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiBpdGVtLm5hbWUgPT09IGluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGluZGV4ID0gdGhpcy5pdGVtcy5pbmRleE9mKGZpbHRlcmVkSXRlbXNbMF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbmRleCA9IE51bWJlcihpbmRleCk7XG4gICAgICBpZiAoaXNOYU4oaW5kZXgpIHx8IGluZGV4ICE9PSBNYXRoLmZsb29yKGluZGV4KSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tFbGVtZW50IFdhcm5dW0Nhcm91c2VsXWluZGV4IG11c3QgYmUgYW4gaW50ZWdlci4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgICAgdmFyIG9sZEluZGV4ID0gdGhpcy5hY3RpdmVJbmRleDtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMubG9vcCA/IGxlbmd0aCAtIDEgOiAwO1xuICAgICAgfSBlbHNlIGlmIChpbmRleCA+PSBsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMubG9vcCA/IDAgOiBsZW5ndGggLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgICAgaWYgKG9sZEluZGV4ID09PSB0aGlzLmFjdGl2ZUluZGV4KSB7XG4gICAgICAgIHRoaXMucmVzZXRJdGVtUG9zaXRpb24ob2xkSW5kZXgpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXNldFRpbWVyKCk7XG4gICAgfSxcbiAgICBwcmV2OiBmdW5jdGlvbiBwcmV2KCkge1xuICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlSW5kZXggLSAxKTtcbiAgICB9LFxuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZUl0ZW0odGhpcy5hY3RpdmVJbmRleCArIDEpO1xuICAgIH0sXG4gICAgaGFuZGxlSW5kaWNhdG9yQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZUluZGljYXRvckNsaWNrKGluZGV4KSB7XG4gICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gaW5kZXg7XG4gICAgfSxcbiAgICBoYW5kbGVJbmRpY2F0b3JIb3ZlcjogZnVuY3Rpb24gaGFuZGxlSW5kaWNhdG9ySG92ZXIoaW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdob3ZlcicgJiYgaW5kZXggIT09IHRoaXMuYWN0aXZlSW5kZXgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdGhpcy50aHJvdHRsZWRBcnJvd0NsaWNrID0gdGhyb3R0bGVfZGVmYXVsdCgpKDMwMCwgdHJ1ZSwgZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICBfdGhpczMuc2V0QWN0aXZlSXRlbShpbmRleCk7XG4gICAgfSk7XG4gICAgdGhpcy50aHJvdHRsZWRJbmRpY2F0b3JIb3ZlciA9IHRocm90dGxlX2RlZmF1bHQoKSgzMDAsIGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgX3RoaXMzLmhhbmRsZUluZGljYXRvckhvdmVyKGluZGV4KTtcbiAgICB9KTtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIHRoaXMudXBkYXRlSXRlbXMoKTtcbiAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBPYmplY3QocmVzaXplX2V2ZW50X1tcImFkZFJlc2l6ZUxpc3RlbmVyXCJdKShfdGhpczQuJGVsLCBfdGhpczQucmVzZXRJdGVtUG9zaXRpb24pO1xuICAgICAgaWYgKF90aGlzNC5pbml0aWFsSW5kZXggPCBfdGhpczQuaXRlbXMubGVuZ3RoICYmIF90aGlzNC5pbml0aWFsSW5kZXggPj0gMCkge1xuICAgICAgICBfdGhpczQuYWN0aXZlSW5kZXggPSBfdGhpczQuaW5pdGlhbEluZGV4O1xuICAgICAgfVxuICAgICAgX3RoaXM0LnN0YXJ0VGltZXIoKTtcbiAgICB9KTtcbiAgfSxcbiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy4kZWwpIE9iamVjdChyZXNpemVfZXZlbnRfW1wicmVtb3ZlUmVzaXplTGlzdGVuZXJcIl0pKHRoaXMuJGVsLCB0aGlzLnJlc2V0SXRlbVBvc2l0aW9uKTtcbiAgICB0aGlzLnBhdXNlVGltZXIoKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhcm91c2VsL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19jYXJvdXNlbF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChjYXJvdXNlbF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXJvdXNlbC9zcmMvbWFpbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBjYXJvdXNlbF9zcmNfbWFpbl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhY2thZ2VzX2Nhcm91c2VsX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQ1ZDE0ODJfcmVuZGVyLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWQ1ZDE0ODJfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBjYXJvdXNlbF9zcmNfbWFpbl9hcGk7IH1cbmNhcm91c2VsX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2Fyb3VzZWwvc3JjL21haW4udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhcm91c2VsX3NyY19tYWluID0gKGNhcm91c2VsX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2Fyb3VzZWwvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY2Fyb3VzZWxfc3JjX21haW4uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChjYXJvdXNlbF9zcmNfbWFpbi5uYW1lLCBjYXJvdXNlbF9zcmNfbWFpbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXJvdXNlbCA9IChjYXJvdXNlbF9zcmNfbWFpbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Njcm9sbGJhci9zcmMvdXRpbC5qc1xudmFyIEJBUl9NQVAgPSB7XG4gIHZlcnRpY2FsOiB7XG4gICAgb2Zmc2V0OiAnb2Zmc2V0SGVpZ2h0JyxcbiAgICBzY3JvbGw6ICdzY3JvbGxUb3AnLFxuICAgIHNjcm9sbFNpemU6ICdzY3JvbGxIZWlnaHQnLFxuICAgIHNpemU6ICdoZWlnaHQnLFxuICAgIGtleTogJ3ZlcnRpY2FsJyxcbiAgICBheGlzOiAnWScsXG4gICAgY2xpZW50OiAnY2xpZW50WScsXG4gICAgZGlyZWN0aW9uOiAndG9wJ1xuICB9LFxuICBob3Jpem9udGFsOiB7XG4gICAgb2Zmc2V0OiAnb2Zmc2V0V2lkdGgnLFxuICAgIHNjcm9sbDogJ3Njcm9sbExlZnQnLFxuICAgIHNjcm9sbFNpemU6ICdzY3JvbGxXaWR0aCcsXG4gICAgc2l6ZTogJ3dpZHRoJyxcbiAgICBrZXk6ICdob3Jpem9udGFsJyxcbiAgICBheGlzOiAnWCcsXG4gICAgY2xpZW50OiAnY2xpZW50WCcsXG4gICAgZGlyZWN0aW9uOiAnbGVmdCdcbiAgfVxufTtcblxuZnVuY3Rpb24gcmVuZGVyVGh1bWJTdHlsZShfcmVmKSB7XG4gIHZhciBtb3ZlID0gX3JlZi5tb3ZlLFxuICAgICAgc2l6ZSA9IF9yZWYuc2l6ZSxcbiAgICAgIGJhciA9IF9yZWYuYmFyO1xuXG4gIHZhciBzdHlsZSA9IHt9O1xuICB2YXIgdHJhbnNsYXRlID0gJ3RyYW5zbGF0ZScgKyBiYXIuYXhpcyArICcoJyArIG1vdmUgKyAnJSknO1xuXG4gIHN0eWxlW2Jhci5zaXplXSA9IHNpemU7XG4gIHN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zbGF0ZTtcbiAgc3R5bGUubXNUcmFuc2Zvcm0gPSB0cmFuc2xhdGU7XG4gIHN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zbGF0ZTtcblxuICByZXR1cm4gc3R5bGU7XG59O1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zY3JvbGxiYXIvc3JjL2Jhci5qc1xuXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19iYXIgPSAoe1xuICBuYW1lOiAnQmFyJyxcblxuICBwcm9wczoge1xuICAgIHZlcnRpY2FsOiBCb29sZWFuLFxuICAgIHNpemU6IFN0cmluZyxcbiAgICBtb3ZlOiBOdW1iZXJcbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGJhcjogZnVuY3Rpb24gYmFyKCkge1xuICAgICAgcmV0dXJuIEJBUl9NQVBbdGhpcy52ZXJ0aWNhbCA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCddO1xuICAgIH0sXG4gICAgd3JhcDogZnVuY3Rpb24gd3JhcCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQud3JhcDtcbiAgICB9XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIHZhciBzaXplID0gdGhpcy5zaXplLFxuICAgICAgICBtb3ZlID0gdGhpcy5tb3ZlLFxuICAgICAgICBiYXIgPSB0aGlzLmJhcjtcblxuXG4gICAgcmV0dXJuIGgoXG4gICAgICAnZGl2JyxcbiAgICAgIHtcbiAgICAgICAgJ2NsYXNzJzogWydlbC1zY3JvbGxiYXJfX2JhcicsICdpcy0nICsgYmFyLmtleV0sXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgJ21vdXNlZG93bic6IHRoaXMuY2xpY2tUcmFja0hhbmRsZXJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtoKCdkaXYnLCB7XG4gICAgICAgIHJlZjogJ3RodW1iJyxcbiAgICAgICAgJ2NsYXNzJzogJ2VsLXNjcm9sbGJhcl9fdGh1bWInLFxuICAgICAgICBvbjoge1xuICAgICAgICAgICdtb3VzZWRvd24nOiB0aGlzLmNsaWNrVGh1bWJIYW5kbGVyXG4gICAgICAgIH0sXG5cbiAgICAgICAgc3R5bGU6IHJlbmRlclRodW1iU3R5bGUoeyBzaXplOiBzaXplLCBtb3ZlOiBtb3ZlLCBiYXI6IGJhciB9KSB9KV1cbiAgICApO1xuICB9LFxuXG5cbiAgbWV0aG9kczoge1xuICAgIGNsaWNrVGh1bWJIYW5kbGVyOiBmdW5jdGlvbiBjbGlja1RodW1iSGFuZGxlcihlKSB7XG4gICAgICAvLyBwcmV2ZW50IGNsaWNrIGV2ZW50IG9mIHJpZ2h0IGJ1dHRvblxuICAgICAgaWYgKGUuY3RybEtleSB8fCBlLmJ1dHRvbiA9PT0gMikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXJ0RHJhZyhlKTtcbiAgICAgIHRoaXNbdGhpcy5iYXIuYXhpc10gPSBlLmN1cnJlbnRUYXJnZXRbdGhpcy5iYXIub2Zmc2V0XSAtIChlW3RoaXMuYmFyLmNsaWVudF0gLSBlLmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbdGhpcy5iYXIuZGlyZWN0aW9uXSk7XG4gICAgfSxcbiAgICBjbGlja1RyYWNrSGFuZGxlcjogZnVuY3Rpb24gY2xpY2tUcmFja0hhbmRsZXIoZSkge1xuICAgICAgdmFyIG9mZnNldCA9IE1hdGguYWJzKGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3RoaXMuYmFyLmRpcmVjdGlvbl0gLSBlW3RoaXMuYmFyLmNsaWVudF0pO1xuICAgICAgdmFyIHRodW1iSGFsZiA9IHRoaXMuJHJlZnMudGh1bWJbdGhpcy5iYXIub2Zmc2V0XSAvIDI7XG4gICAgICB2YXIgdGh1bWJQb3NpdGlvblBlcmNlbnRhZ2UgPSAob2Zmc2V0IC0gdGh1bWJIYWxmKSAqIDEwMCAvIHRoaXMuJGVsW3RoaXMuYmFyLm9mZnNldF07XG5cbiAgICAgIHRoaXMud3JhcFt0aGlzLmJhci5zY3JvbGxdID0gdGh1bWJQb3NpdGlvblBlcmNlbnRhZ2UgKiB0aGlzLndyYXBbdGhpcy5iYXIuc2Nyb2xsU2l6ZV0gLyAxMDA7XG4gICAgfSxcbiAgICBzdGFydERyYWc6IGZ1bmN0aW9uIHN0YXJ0RHJhZyhlKSB7XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5jdXJzb3JEb3duID0gdHJ1ZTtcblxuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZURvY3VtZW50SGFuZGxlcik7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLm1vdXNlVXBEb2N1bWVudEhhbmRsZXIpO1xuICAgICAgZG9jdW1lbnQub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgICB9LFxuICAgIG1vdXNlTW92ZURvY3VtZW50SGFuZGxlcjogZnVuY3Rpb24gbW91c2VNb3ZlRG9jdW1lbnRIYW5kbGVyKGUpIHtcbiAgICAgIGlmICh0aGlzLmN1cnNvckRvd24gPT09IGZhbHNlKSByZXR1cm47XG4gICAgICB2YXIgcHJldlBhZ2UgPSB0aGlzW3RoaXMuYmFyLmF4aXNdO1xuXG4gICAgICBpZiAoIXByZXZQYWdlKSByZXR1cm47XG5cbiAgICAgIHZhciBvZmZzZXQgPSAodGhpcy4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbdGhpcy5iYXIuZGlyZWN0aW9uXSAtIGVbdGhpcy5iYXIuY2xpZW50XSkgKiAtMTtcbiAgICAgIHZhciB0aHVtYkNsaWNrUG9zaXRpb24gPSB0aGlzLiRyZWZzLnRodW1iW3RoaXMuYmFyLm9mZnNldF0gLSBwcmV2UGFnZTtcbiAgICAgIHZhciB0aHVtYlBvc2l0aW9uUGVyY2VudGFnZSA9IChvZmZzZXQgLSB0aHVtYkNsaWNrUG9zaXRpb24pICogMTAwIC8gdGhpcy4kZWxbdGhpcy5iYXIub2Zmc2V0XTtcblxuICAgICAgdGhpcy53cmFwW3RoaXMuYmFyLnNjcm9sbF0gPSB0aHVtYlBvc2l0aW9uUGVyY2VudGFnZSAqIHRoaXMud3JhcFt0aGlzLmJhci5zY3JvbGxTaXplXSAvIDEwMDtcbiAgICB9LFxuICAgIG1vdXNlVXBEb2N1bWVudEhhbmRsZXI6IGZ1bmN0aW9uIG1vdXNlVXBEb2N1bWVudEhhbmRsZXIoZSkge1xuICAgICAgdGhpcy5jdXJzb3JEb3duID0gZmFsc2U7XG4gICAgICB0aGlzW3RoaXMuYmFyLmF4aXNdID0gMDtcbiAgICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlRG9jdW1lbnRIYW5kbGVyKTtcbiAgICAgIGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSBudWxsO1xuICAgIH1cbiAgfSxcblxuICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkoZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5tb3VzZVVwRG9jdW1lbnRIYW5kbGVyKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Njcm9sbGJhci9zcmMvbWFpbi5qc1xuLy8gcmVmZXJlbmNlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2VsZGVsZ2Fkby9nZW1pbmktc2Nyb2xsYmFyL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG5cblxuXG5cblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2Nyb2xsYmFyX3NyY19tYWluID0gKHtcbiAgbmFtZTogJ0VsU2Nyb2xsYmFyJyxcblxuICBjb21wb25lbnRzOiB7IEJhcjogc3JjX2JhciB9LFxuXG4gIHByb3BzOiB7XG4gICAgbmF0aXZlOiBCb29sZWFuLFxuICAgIHdyYXBTdHlsZToge30sXG4gICAgd3JhcENsYXNzOiB7fSxcbiAgICB2aWV3Q2xhc3M6IHt9LFxuICAgIHZpZXdTdHlsZToge30sXG4gICAgbm9yZXNpemU6IEJvb2xlYW4sIC8vIOWmguaenCBjb250YWluZXIg5bC65a+45LiN5Lya5Y+R55Sf5Y+Y5YyW77yM5pyA5aW96K6+572u5a6D5Y+v5Lul5LyY5YyW5oCn6IO9XG4gICAgdGFnOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnZGl2J1xuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaXplV2lkdGg6ICcwJyxcbiAgICAgIHNpemVIZWlnaHQ6ICcwJyxcbiAgICAgIG1vdmVYOiAwLFxuICAgICAgbW92ZVk6IDBcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB3cmFwOiBmdW5jdGlvbiB3cmFwKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMud3JhcDtcbiAgICB9XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIHZhciBndXR0ZXIgPSBzY3JvbGxiYXJfd2lkdGhfZGVmYXVsdCgpKCk7XG4gICAgdmFyIHN0eWxlID0gdGhpcy53cmFwU3R5bGU7XG5cbiAgICBpZiAoZ3V0dGVyKSB7XG4gICAgICB2YXIgZ3V0dGVyV2l0aCA9ICctJyArIGd1dHRlciArICdweCc7XG4gICAgICB2YXIgZ3V0dGVyU3R5bGUgPSAnbWFyZ2luLWJvdHRvbTogJyArIGd1dHRlcldpdGggKyAnOyBtYXJnaW4tcmlnaHQ6ICcgKyBndXR0ZXJXaXRoICsgJzsnO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLndyYXBTdHlsZSkpIHtcbiAgICAgICAgc3R5bGUgPSBPYmplY3QodXRpbF9bXCJ0b09iamVjdFwiXSkodGhpcy53cmFwU3R5bGUpO1xuICAgICAgICBzdHlsZS5tYXJnaW5SaWdodCA9IHN0eWxlLm1hcmdpbkJvdHRvbSA9IGd1dHRlcldpdGg7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLndyYXBTdHlsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3R5bGUgKz0gZ3V0dGVyU3R5bGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZSA9IGd1dHRlclN0eWxlO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgdmlldyA9IGgodGhpcy50YWcsIHtcbiAgICAgIGNsYXNzOiBbJ2VsLXNjcm9sbGJhcl9fdmlldycsIHRoaXMudmlld0NsYXNzXSxcbiAgICAgIHN0eWxlOiB0aGlzLnZpZXdTdHlsZSxcbiAgICAgIHJlZjogJ3Jlc2l6ZSdcbiAgICB9LCB0aGlzLiRzbG90cy5kZWZhdWx0KTtcbiAgICB2YXIgd3JhcCA9IGgoXG4gICAgICAnZGl2JyxcbiAgICAgIHtcbiAgICAgICAgcmVmOiAnd3JhcCcsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICAnc2Nyb2xsJzogdGhpcy5oYW5kbGVTY3JvbGxcbiAgICAgICAgfSxcblxuICAgICAgICAnY2xhc3MnOiBbdGhpcy53cmFwQ2xhc3MsICdlbC1zY3JvbGxiYXJfX3dyYXAnLCBndXR0ZXIgPyAnJyA6ICdlbC1zY3JvbGxiYXJfX3dyYXAtLWhpZGRlbi1kZWZhdWx0J10gfSxcbiAgICAgIFtbdmlld11dXG4gICAgKTtcbiAgICB2YXIgbm9kZXMgPSB2b2lkIDA7XG5cbiAgICBpZiAoIXRoaXMubmF0aXZlKSB7XG4gICAgICBub2RlcyA9IFt3cmFwLCBoKHNyY19iYXIsIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBtb3ZlOiB0aGlzLm1vdmVYLFxuICAgICAgICAgIHNpemU6IHRoaXMuc2l6ZVdpZHRoIH1cbiAgICAgIH0pLCBoKHNyY19iYXIsIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB2ZXJ0aWNhbDogdHJ1ZSxcbiAgICAgICAgICBtb3ZlOiB0aGlzLm1vdmVZLFxuICAgICAgICAgIHNpemU6IHRoaXMuc2l6ZUhlaWdodCB9XG4gICAgICB9KV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVzID0gW2goXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7XG4gICAgICAgICAgcmVmOiAnd3JhcCcsXG4gICAgICAgICAgJ2NsYXNzJzogW3RoaXMud3JhcENsYXNzLCAnZWwtc2Nyb2xsYmFyX193cmFwJ10sXG4gICAgICAgICAgc3R5bGU6IHN0eWxlIH0sXG4gICAgICAgIFtbdmlld11dXG4gICAgICApXTtcbiAgICB9XG4gICAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3M6ICdlbC1zY3JvbGxiYXInIH0sIG5vZGVzKTtcbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVTY3JvbGw6IGZ1bmN0aW9uIGhhbmRsZVNjcm9sbCgpIHtcbiAgICAgIHZhciB3cmFwID0gdGhpcy53cmFwO1xuXG4gICAgICB0aGlzLm1vdmVZID0gd3JhcC5zY3JvbGxUb3AgKiAxMDAgLyB3cmFwLmNsaWVudEhlaWdodDtcbiAgICAgIHRoaXMubW92ZVggPSB3cmFwLnNjcm9sbExlZnQgKiAxMDAgLyB3cmFwLmNsaWVudFdpZHRoO1xuICAgIH0sXG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICB2YXIgaGVpZ2h0UGVyY2VudGFnZSA9IHZvaWQgMCxcbiAgICAgICAgICB3aWR0aFBlcmNlbnRhZ2UgPSB2b2lkIDA7XG4gICAgICB2YXIgd3JhcCA9IHRoaXMud3JhcDtcbiAgICAgIGlmICghd3JhcCkgcmV0dXJuO1xuXG4gICAgICBoZWlnaHRQZXJjZW50YWdlID0gd3JhcC5jbGllbnRIZWlnaHQgKiAxMDAgLyB3cmFwLnNjcm9sbEhlaWdodDtcbiAgICAgIHdpZHRoUGVyY2VudGFnZSA9IHdyYXAuY2xpZW50V2lkdGggKiAxMDAgLyB3cmFwLnNjcm9sbFdpZHRoO1xuXG4gICAgICB0aGlzLnNpemVIZWlnaHQgPSBoZWlnaHRQZXJjZW50YWdlIDwgMTAwID8gaGVpZ2h0UGVyY2VudGFnZSArICclJyA6ICcnO1xuICAgICAgdGhpcy5zaXplV2lkdGggPSB3aWR0aFBlcmNlbnRhZ2UgPCAxMDAgPyB3aWR0aFBlcmNlbnRhZ2UgKyAnJScgOiAnJztcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHJldHVybjtcbiAgICB0aGlzLiRuZXh0VGljayh0aGlzLnVwZGF0ZSk7XG4gICAgIXRoaXMubm9yZXNpemUgJiYgT2JqZWN0KHJlc2l6ZV9ldmVudF9bXCJhZGRSZXNpemVMaXN0ZW5lclwiXSkodGhpcy4kcmVmcy5yZXNpemUsIHRoaXMudXBkYXRlKTtcbiAgfSxcbiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHJldHVybjtcbiAgICAhdGhpcy5ub3Jlc2l6ZSAmJiBPYmplY3QocmVzaXplX2V2ZW50X1tcInJlbW92ZVJlc2l6ZUxpc3RlbmVyXCJdKSh0aGlzLiRyZWZzLnJlc2l6ZSwgdGhpcy51cGRhdGUpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2Nyb2xsYmFyL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnNjcm9sbGJhcl9zcmNfbWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHNjcm9sbGJhcl9zcmNfbWFpbi5uYW1lLCBzY3JvbGxiYXJfc3JjX21haW4pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2Nyb2xsYmFyID0gKHNjcm9sbGJhcl9zcmNfbWFpbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhcm91c2VsL3NyYy9pdGVtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xODAxYWUxOSZcbnZhciBpdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMTgwMWFlMTlfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICB2YWx1ZTogX3ZtLnJlYWR5LFxuICAgICAgICAgIGV4cHJlc3Npb246IFwicmVhZHlcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY2Fyb3VzZWxfX2l0ZW1cIixcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIFwiaXMtYWN0aXZlXCI6IF92bS5hY3RpdmUsXG4gICAgICAgIFwiZWwtY2Fyb3VzZWxfX2l0ZW0tLWNhcmRcIjogX3ZtLiRwYXJlbnQudHlwZSA9PT0gXCJjYXJkXCIsXG4gICAgICAgIFwiaXMtaW4tc3RhZ2VcIjogX3ZtLmluU3RhZ2UsXG4gICAgICAgIFwiaXMtaG92ZXJcIjogX3ZtLmhvdmVyLFxuICAgICAgICBcImlzLWFuaW1hdGluZ1wiOiBfdm0uYW5pbWF0aW5nXG4gICAgICB9LFxuICAgICAgc3R5bGU6IF92bS5pdGVtU3R5bGUsXG4gICAgICBvbjogeyBjbGljazogX3ZtLmhhbmRsZUl0ZW1DbGljayB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfdm0uJHBhcmVudC50eXBlID09PSBcImNhcmRcIlxuICAgICAgICA/IF9jKFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICFfdm0uYWN0aXZlLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiIWFjdGl2ZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jYXJvdXNlbF9fbWFza1wiXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgIF92bS5fdChcImRlZmF1bHRcIilcbiAgICBdLFxuICAgIDJcbiAgKVxufVxudmFyIGl0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF8xODAxYWUxOV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzE4MDFhZTE5X3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2Fyb3VzZWwvc3JjL2l0ZW0udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE4MDFhZTE5JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYXJvdXNlbC9zcmMvaXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cbnZhciBDQVJEX1NDQUxFID0gMC44Mztcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGl0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxDYXJvdXNlbEl0ZW0nLFxuXG4gIHByb3BzOiB7XG4gICAgbmFtZTogU3RyaW5nLFxuICAgIGxhYmVsOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaG92ZXI6IGZhbHNlLFxuICAgICAgdHJhbnNsYXRlOiAwLFxuICAgICAgc2NhbGU6IDEsXG4gICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgcmVhZHk6IGZhbHNlLFxuICAgICAgaW5TdGFnZTogZmFsc2UsXG4gICAgICBhbmltYXRpbmc6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBwcm9jZXNzSW5kZXg6IGZ1bmN0aW9uIHByb2Nlc3NJbmRleChpbmRleCwgYWN0aXZlSW5kZXgsIGxlbmd0aCkge1xuICAgICAgaWYgKGFjdGl2ZUluZGV4ID09PSAwICYmIGluZGV4ID09PSBsZW5ndGggLSAxKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZlSW5kZXggPT09IGxlbmd0aCAtIDEgJiYgaW5kZXggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgIH0gZWxzZSBpZiAoaW5kZXggPCBhY3RpdmVJbmRleCAtIDEgJiYgYWN0aXZlSW5kZXggLSBpbmRleCA+PSBsZW5ndGggLyAyKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggKyAxO1xuICAgICAgfSBlbHNlIGlmIChpbmRleCA+IGFjdGl2ZUluZGV4ICsgMSAmJiBpbmRleCAtIGFjdGl2ZUluZGV4ID49IGxlbmd0aCAvIDIpIHtcbiAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH0sXG4gICAgY2FsY0NhcmRUcmFuc2xhdGU6IGZ1bmN0aW9uIGNhbGNDYXJkVHJhbnNsYXRlKGluZGV4LCBhY3RpdmVJbmRleCkge1xuICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy4kcGFyZW50LiRlbC5vZmZzZXRXaWR0aDtcbiAgICAgIGlmICh0aGlzLmluU3RhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudFdpZHRoICogKCgyIC0gQ0FSRF9TQ0FMRSkgKiAoaW5kZXggLSBhY3RpdmVJbmRleCkgKyAxKSAvIDQ7XG4gICAgICB9IGVsc2UgaWYgKGluZGV4IDwgYWN0aXZlSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIC0oMSArIENBUkRfU0NBTEUpICogcGFyZW50V2lkdGggLyA0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICgzICsgQ0FSRF9TQ0FMRSkgKiBwYXJlbnRXaWR0aCAvIDQ7XG4gICAgICB9XG4gICAgfSxcbiAgICBjYWxjVHJhbnNsYXRlOiBmdW5jdGlvbiBjYWxjVHJhbnNsYXRlKGluZGV4LCBhY3RpdmVJbmRleCwgaXNWZXJ0aWNhbCkge1xuICAgICAgdmFyIGRpc3RhbmNlID0gdGhpcy4kcGFyZW50LiRlbFtpc1ZlcnRpY2FsID8gJ29mZnNldEhlaWdodCcgOiAnb2Zmc2V0V2lkdGgnXTtcbiAgICAgIHJldHVybiBkaXN0YW5jZSAqIChpbmRleCAtIGFjdGl2ZUluZGV4KTtcbiAgICB9LFxuICAgIHRyYW5zbGF0ZUl0ZW06IGZ1bmN0aW9uIHRyYW5zbGF0ZUl0ZW0oaW5kZXgsIGFjdGl2ZUluZGV4LCBvbGRJbmRleCkge1xuICAgICAgdmFyIHBhcmVudFR5cGUgPSB0aGlzLiRwYXJlbnQudHlwZTtcbiAgICAgIHZhciBwYXJlbnREaXJlY3Rpb24gPSB0aGlzLnBhcmVudERpcmVjdGlvbjtcbiAgICAgIHZhciBsZW5ndGggPSB0aGlzLiRwYXJlbnQuaXRlbXMubGVuZ3RoO1xuICAgICAgaWYgKHBhcmVudFR5cGUgIT09ICdjYXJkJyAmJiBvbGRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuYW5pbWF0aW5nID0gaW5kZXggPT09IGFjdGl2ZUluZGV4IHx8IGluZGV4ID09PSBvbGRJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCAhPT0gYWN0aXZlSW5kZXggJiYgbGVuZ3RoID4gMiAmJiB0aGlzLiRwYXJlbnQubG9vcCkge1xuICAgICAgICBpbmRleCA9IHRoaXMucHJvY2Vzc0luZGV4KGluZGV4LCBhY3RpdmVJbmRleCwgbGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJlbnRUeXBlID09PSAnY2FyZCcpIHtcbiAgICAgICAgaWYgKHBhcmVudERpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW0VsZW1lbnQgV2Fybl1bQ2Fyb3VzZWxddmVydGljYWwgZGlyZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gY2FyZCBtb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pblN0YWdlID0gTWF0aC5yb3VuZChNYXRoLmFicyhpbmRleCAtIGFjdGl2ZUluZGV4KSkgPD0gMTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBpbmRleCA9PT0gYWN0aXZlSW5kZXg7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlID0gdGhpcy5jYWxjQ2FyZFRyYW5zbGF0ZShpbmRleCwgYWN0aXZlSW5kZXgpO1xuICAgICAgICB0aGlzLnNjYWxlID0gdGhpcy5hY3RpdmUgPyAxIDogQ0FSRF9TQ0FMRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gaW5kZXggPT09IGFjdGl2ZUluZGV4O1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbCA9IHBhcmVudERpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJztcbiAgICAgICAgdGhpcy50cmFuc2xhdGUgPSB0aGlzLmNhbGNUcmFuc2xhdGUoaW5kZXgsIGFjdGl2ZUluZGV4LCBpc1ZlcnRpY2FsKTtcbiAgICAgICAgdGhpcy5zY2FsZSA9IDE7XG4gICAgICB9XG4gICAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB9LFxuICAgIGhhbmRsZUl0ZW1DbGljazogZnVuY3Rpb24gaGFuZGxlSXRlbUNsaWNrKCkge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcbiAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09ICdjYXJkJykge1xuICAgICAgICB2YXIgaW5kZXggPSBwYXJlbnQuaXRlbXMuaW5kZXhPZih0aGlzKTtcbiAgICAgICAgcGFyZW50LnNldEFjdGl2ZUl0ZW0oaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHBhcmVudERpcmVjdGlvbjogZnVuY3Rpb24gcGFyZW50RGlyZWN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5kaXJlY3Rpb247XG4gICAgfSxcbiAgICBpdGVtU3R5bGU6IGZ1bmN0aW9uIGl0ZW1TdHlsZSgpIHtcbiAgICAgIHZhciB0cmFuc2xhdGVUeXBlID0gdGhpcy5wYXJlbnREaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCcgPyAndHJhbnNsYXRlWScgOiAndHJhbnNsYXRlWCc7XG4gICAgICB2YXIgdmFsdWUgPSB0cmFuc2xhdGVUeXBlICsgJygnICsgdGhpcy50cmFuc2xhdGUgKyAncHgpIHNjYWxlKCcgKyB0aGlzLnNjYWxlICsgJyknO1xuICAgICAgdmFyIHN0eWxlID0ge1xuICAgICAgICB0cmFuc2Zvcm06IHZhbHVlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIE9iamVjdCh1dGlsX1tcImF1dG9wcmVmaXhlclwiXSkoc3R5bGUpO1xuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuICAgIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudXBkYXRlSXRlbXMoKTtcbiAgfSxcbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC51cGRhdGVJdGVtcygpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2Fyb3VzZWwvc3JjL2l0ZW0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGl0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2Fyb3VzZWwvc3JjL2l0ZW0udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgaXRlbV9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBpdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMTgwMWFlMTlfcmVuZGVyLFxuICBpdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMTgwMWFlMTlfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBpdGVtX2FwaTsgfVxuaXRlbV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2Nhcm91c2VsL3NyYy9pdGVtLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfaXRlbSA9IChpdGVtX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2Fyb3VzZWwtaXRlbS9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zcmNfaXRlbS5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHNyY19pdGVtLm5hbWUsIHNyY19pdGVtKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhcm91c2VsX2l0ZW0gPSAoc3JjX2l0ZW0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xsYXBzZS9zcmMvY29sbGFwc2UudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQ2MWQ1N2Y0JlxudmFyIGNvbGxhcHNldnVlX3R5cGVfdGVtcGxhdGVfaWRfNDYxZDU3ZjRfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY29sbGFwc2VcIixcbiAgICAgIGF0dHJzOiB7IHJvbGU6IFwidGFibGlzdFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCI6IFwidHJ1ZVwiIH1cbiAgICB9LFxuICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAyXG4gIClcbn1cbnZhciBjb2xsYXBzZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ2MWQ1N2Y0X3N0YXRpY1JlbmRlckZucyA9IFtdXG5jb2xsYXBzZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ2MWQ1N2Y0X3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sbGFwc2Uvc3JjL2NvbGxhcHNlLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00NjFkNTdmNCZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sbGFwc2Uvc3JjL2NvbGxhcHNlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjb2xsYXBzZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbENvbGxhcHNlJyxcblxuICBjb21wb25lbnROYW1lOiAnRWxDb2xsYXBzZScsXG5cbiAgcHJvcHM6IHtcbiAgICBhY2NvcmRpb246IEJvb2xlYW4sXG4gICAgdmFsdWU6IHtcbiAgICAgIHR5cGU6IFtBcnJheSwgU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZlTmFtZXM6IFtdLmNvbmNhdCh0aGlzLnZhbHVlKVxuICAgIH07XG4gIH0sXG4gIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbGxhcHNlOiB0aGlzXG4gICAgfTtcbiAgfSxcblxuXG4gIHdhdGNoOiB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKF92YWx1ZSkge1xuICAgICAgdGhpcy5hY3RpdmVOYW1lcyA9IFtdLmNvbmNhdChfdmFsdWUpO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0QWN0aXZlTmFtZXM6IGZ1bmN0aW9uIHNldEFjdGl2ZU5hbWVzKGFjdGl2ZU5hbWVzKSB7XG4gICAgICBhY3RpdmVOYW1lcyA9IFtdLmNvbmNhdChhY3RpdmVOYW1lcyk7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLmFjY29yZGlvbiA/IGFjdGl2ZU5hbWVzWzBdIDogYWN0aXZlTmFtZXM7XG4gICAgICB0aGlzLmFjdGl2ZU5hbWVzID0gYWN0aXZlTmFtZXM7XG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTtcbiAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbHVlKTtcbiAgICB9LFxuICAgIGhhbmRsZUl0ZW1DbGljazogZnVuY3Rpb24gaGFuZGxlSXRlbUNsaWNrKGl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLmFjY29yZGlvbikge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZU5hbWVzKCh0aGlzLmFjdGl2ZU5hbWVzWzBdIHx8IHRoaXMuYWN0aXZlTmFtZXNbMF0gPT09IDApICYmIHRoaXMuYWN0aXZlTmFtZXNbMF0gPT09IGl0ZW0ubmFtZSA/ICcnIDogaXRlbS5uYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhY3RpdmVOYW1lcyA9IHRoaXMuYWN0aXZlTmFtZXMuc2xpY2UoMCk7XG4gICAgICAgIHZhciBpbmRleCA9IGFjdGl2ZU5hbWVzLmluZGV4T2YoaXRlbS5uYW1lKTtcblxuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIGFjdGl2ZU5hbWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0aXZlTmFtZXMucHVzaChpdGVtLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlTmFtZXMoYWN0aXZlTmFtZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuICAgIHRoaXMuJG9uKCdpdGVtLWNsaWNrJywgdGhpcy5oYW5kbGVJdGVtQ2xpY2spO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sbGFwc2Uvc3JjL2NvbGxhcHNlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfY29sbGFwc2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoY29sbGFwc2V2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sbGFwc2Uvc3JjL2NvbGxhcHNlLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGNvbGxhcHNlX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2NvbGxhcHNldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBjb2xsYXBzZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ2MWQ1N2Y0X3JlbmRlcixcbiAgY29sbGFwc2V2dWVfdHlwZV90ZW1wbGF0ZV9pZF80NjFkNTdmNF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGNvbGxhcHNlX2FwaTsgfVxuY29sbGFwc2VfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9jb2xsYXBzZS9zcmMvY29sbGFwc2UudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNvbGxhcHNlID0gKGNvbGxhcHNlX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sbGFwc2UvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY29sbGFwc2UuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChjb2xsYXBzZS5uYW1lLCBjb2xsYXBzZSk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19jb2xsYXBzZSA9IChjb2xsYXBzZSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NvbGxhcHNlL3NyYy9jb2xsYXBzZS1pdGVtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yZDA1ZmFhYyZcbnZhciBjb2xsYXBzZV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmQwNWZhYWNfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY29sbGFwc2UtaXRlbVwiLFxuICAgICAgY2xhc3M6IHsgXCJpcy1hY3RpdmVcIjogX3ZtLmlzQWN0aXZlLCBcImlzLWRpc2FibGVkXCI6IF92bS5kaXNhYmxlZCB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICByb2xlOiBcInRhYlwiLFxuICAgICAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IF92bS5pc0FjdGl2ZSxcbiAgICAgICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiBcImVsLWNvbGxhcHNlLWNvbnRlbnQtXCIgKyBfdm0uaWQsXG4gICAgICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogXCJlbC1jb2xsYXBzZS1jb250ZW50LVwiICsgX3ZtLmlkXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jb2xsYXBzZS1pdGVtX19oZWFkZXJcIixcbiAgICAgICAgICAgICAgY2xhc3M6IHtcbiAgICAgICAgICAgICAgICBmb2N1c2luZzogX3ZtLmZvY3VzaW5nLFxuICAgICAgICAgICAgICAgIFwiaXMtYWN0aXZlXCI6IF92bS5pc0FjdGl2ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgaWQ6IFwiZWwtY29sbGFwc2UtaGVhZC1cIiArIF92bS5pZCxcbiAgICAgICAgICAgICAgICB0YWJpbmRleDogX3ZtLmRpc2FibGVkID8gdW5kZWZpbmVkIDogMFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiBfdm0uaGFuZGxlSGVhZGVyQ2xpY2ssXG4gICAgICAgICAgICAgICAga2V5dXA6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwic3BhY2VcIiwgMzIsICRldmVudC5rZXksIFtcbiAgICAgICAgICAgICAgICAgICAgICBcIiBcIixcbiAgICAgICAgICAgICAgICAgICAgICBcIlNwYWNlYmFyXCJcbiAgICAgICAgICAgICAgICAgICAgXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzLCAkZXZlbnQua2V5LCBcIkVudGVyXCIpXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5oYW5kbGVFbnRlckNsaWNrKCRldmVudClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZvY3VzOiBfdm0uaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgICAgYmx1cjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICBfdm0uZm9jdXNpbmcgPSBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX3ZtLl90KFwidGl0bGVcIiwgW192bS5fdihfdm0uX3MoX3ZtLnRpdGxlKSldKSxcbiAgICAgICAgICAgICAgX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jb2xsYXBzZS1pdGVtX19hcnJvdyBlbC1pY29uLWFycm93LXJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgY2xhc3M6IHsgXCJpcy1hY3RpdmVcIjogX3ZtLmlzQWN0aXZlIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICBdXG4gICAgICApLFxuICAgICAgX2MoXCJlbC1jb2xsYXBzZS10cmFuc2l0aW9uXCIsIFtcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uaXNBY3RpdmUsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJpc0FjdGl2ZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jb2xsYXBzZS1pdGVtX193cmFwXCIsXG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICByb2xlOiBcInRhYnBhbmVsXCIsXG4gICAgICAgICAgICAgIFwiYXJpYS1oaWRkZW5cIjogIV92bS5pc0FjdGl2ZSxcbiAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogXCJlbC1jb2xsYXBzZS1oZWFkLVwiICsgX3ZtLmlkLFxuICAgICAgICAgICAgICBpZDogXCJlbC1jb2xsYXBzZS1jb250ZW50LVwiICsgX3ZtLmlkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1jb2xsYXBzZS1pdGVtX19jb250ZW50XCIgfSxcbiAgICAgICAgICAgICAgW192bS5fdChcImRlZmF1bHRcIildLFxuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApXG4gICAgICAgICAgXVxuICAgICAgICApXG4gICAgICBdKVxuICAgIF0sXG4gICAgMVxuICApXG59XG52YXIgY29sbGFwc2VfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJkMDVmYWFjX3N0YXRpY1JlbmRlckZucyA9IFtdXG5jb2xsYXBzZV9pdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmQwNWZhYWNfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xsYXBzZS9zcmMvY29sbGFwc2UtaXRlbS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MmQwNWZhYWMmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NvbGxhcHNlL3NyYy9jb2xsYXBzZS1pdGVtLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY29sbGFwc2VfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbENvbGxhcHNlSXRlbScsXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsQ29sbGFwc2VJdGVtJyxcblxuICBtaXhpbnM6IFtlbWl0dGVyX2RlZmF1bHQuYV0sXG5cbiAgY29tcG9uZW50czogeyBFbENvbGxhcHNlVHJhbnNpdGlvbjogY29sbGFwc2VfdHJhbnNpdGlvbl9kZWZhdWx0LmEgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50V3JhcFN0eWxlOiB7XG4gICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICB9LFxuICAgICAgY29udGVudEhlaWdodDogMCxcbiAgICAgIGZvY3VzaW5nOiBmYWxzZSxcbiAgICAgIGlzQ2xpY2s6IGZhbHNlLFxuICAgICAgaWQ6IE9iamVjdCh1dGlsX1tcImdlbmVyYXRlSWRcIl0pKClcbiAgICB9O1xuICB9LFxuXG5cbiAgaW5qZWN0OiBbJ2NvbGxhcHNlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICB0aXRsZTogU3RyaW5nLFxuICAgIG5hbWU6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VpZDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRpc2FibGVkOiBCb29sZWFuXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpc0FjdGl2ZTogZnVuY3Rpb24gaXNBY3RpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZS5hY3RpdmVOYW1lcy5pbmRleE9mKHRoaXMubmFtZSkgPiAtMTtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUZvY3VzOiBmdW5jdGlvbiBoYW5kbGVGb2N1cygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIV90aGlzLmlzQ2xpY2spIHtcbiAgICAgICAgICBfdGhpcy5mb2N1c2luZyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMuaXNDbGljayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LCA1MCk7XG4gICAgfSxcbiAgICBoYW5kbGVIZWFkZXJDbGljazogZnVuY3Rpb24gaGFuZGxlSGVhZGVyQ2xpY2soKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5kaXNwYXRjaCgnRWxDb2xsYXBzZScsICdpdGVtLWNsaWNrJywgdGhpcyk7XG4gICAgICB0aGlzLmZvY3VzaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmlzQ2xpY2sgPSB0cnVlO1xuICAgIH0sXG4gICAgaGFuZGxlRW50ZXJDbGljazogZnVuY3Rpb24gaGFuZGxlRW50ZXJDbGljaygpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsQ29sbGFwc2UnLCAnaXRlbS1jbGljaycsIHRoaXMpO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbGxhcHNlL3NyYy9jb2xsYXBzZS1pdGVtLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfY29sbGFwc2VfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChjb2xsYXBzZV9pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbGxhcHNlL3NyYy9jb2xsYXBzZS1pdGVtLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGNvbGxhcHNlX2l0ZW1fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfY29sbGFwc2VfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgY29sbGFwc2VfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJkMDVmYWFjX3JlbmRlcixcbiAgY29sbGFwc2VfaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJkMDVmYWFjX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgY29sbGFwc2VfaXRlbV9hcGk7IH1cbmNvbGxhcHNlX2l0ZW1fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9jb2xsYXBzZS9zcmMvY29sbGFwc2UtaXRlbS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY29sbGFwc2VfaXRlbSA9IChjb2xsYXBzZV9pdGVtX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sbGFwc2UtaXRlbS9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jb2xsYXBzZV9pdGVtLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoY29sbGFwc2VfaXRlbS5uYW1lLCBjb2xsYXBzZV9pdGVtKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2NvbGxhcHNlX2l0ZW0gPSAoY29sbGFwc2VfaXRlbSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhc2NhZGVyL3NyYy9jYXNjYWRlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDMyNTM3YTYmXG52YXIgY2FzY2FkZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMzI1MzdhNl9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImNsaWNrb3V0c2lkZVwiLFxuICAgICAgICAgIHJhd05hbWU6IFwidi1jbGlja291dHNpZGVcIixcbiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gX3ZtLnRvZ2dsZURyb3BEb3duVmlzaWJsZShmYWxzZSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4cHJlc3Npb246IFwiKCkgPT4gdG9nZ2xlRHJvcERvd25WaXNpYmxlKGZhbHNlKVwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICByZWY6IFwicmVmZXJlbmNlXCIsXG4gICAgICBjbGFzczogW1xuICAgICAgICBcImVsLWNhc2NhZGVyXCIsXG4gICAgICAgIF92bS5yZWFsU2l6ZSAmJiBcImVsLWNhc2NhZGVyLS1cIiArIF92bS5yZWFsU2l6ZSxcbiAgICAgICAgeyBcImlzLWRpc2FibGVkXCI6IF92bS5pc0Rpc2FibGVkIH1cbiAgICAgIF0sXG4gICAgICBvbjoge1xuICAgICAgICBtb3VzZWVudGVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICBfdm0uaW5wdXRIb3ZlciA9IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgbW91c2VsZWF2ZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgX3ZtLmlucHV0SG92ZXIgPSBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBjbGljazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIF92bS50b2dnbGVEcm9wRG93blZpc2libGUoX3ZtLnJlYWRvbmx5ID8gdW5kZWZpbmVkIDogdHJ1ZSlcbiAgICAgICAgfSxcbiAgICAgICAga2V5ZG93bjogX3ZtLmhhbmRsZUtleURvd25cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFxuICAgICAgICBcImVsLWlucHV0XCIsXG4gICAgICAgIHtcbiAgICAgICAgICByZWY6IFwiaW5wdXRcIixcbiAgICAgICAgICBjbGFzczogeyBcImlzLWZvY3VzXCI6IF92bS5kcm9wRG93blZpc2libGUgfSxcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgc2l6ZTogX3ZtLnJlYWxTaXplLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IF92bS5wbGFjZWhvbGRlcixcbiAgICAgICAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHksXG4gICAgICAgICAgICBkaXNhYmxlZDogX3ZtLmlzRGlzYWJsZWQsXG4gICAgICAgICAgICBcInZhbGlkYXRlLWV2ZW50XCI6IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgZm9jdXM6IF92bS5oYW5kbGVGb2N1cyxcbiAgICAgICAgICAgIGJsdXI6IF92bS5oYW5kbGVCbHVyLFxuICAgICAgICAgICAgaW5wdXQ6IF92bS5oYW5kbGVJbnB1dFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAgIHZhbHVlOiBfdm0ubXVsdGlwbGUgPyBfdm0ucHJlc2VudFRleHQgOiBfdm0uaW5wdXRWYWx1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigkJHYpIHtcbiAgICAgICAgICAgICAgX3ZtLm11bHRpcGxlID8gX3ZtLnByZXNlbnRUZXh0IDogKF92bS5pbnB1dFZhbHVlID0gJCR2KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IFwibXVsdGlwbGUgPyBwcmVzZW50VGV4dCA6IGlucHV0VmFsdWVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFwidGVtcGxhdGVcIiwgeyBzbG90OiBcInN1ZmZpeFwiIH0sIFtcbiAgICAgICAgICAgIF92bS5jbGVhckJ0blZpc2libGVcbiAgICAgICAgICAgICAgPyBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAga2V5OiBcImNsZWFyXCIsXG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1pbnB1dF9faWNvbiBlbC1pY29uLWNpcmNsZS1jbG9zZVwiLFxuICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uaGFuZGxlQ2xlYXIoJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgOiBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAga2V5OiBcImFycm93LWRvd25cIixcbiAgICAgICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiZWwtaW5wdXRfX2ljb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbC1pY29uLWFycm93LWRvd25cIixcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmRyb3BEb3duVmlzaWJsZSAmJiBcImlzLXJldmVyc2VcIlxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgICBfdm0udG9nZ2xlRHJvcERvd25WaXNpYmxlKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSlcbiAgICAgICAgXSxcbiAgICAgICAgMlxuICAgICAgKSxcbiAgICAgIF92bS5tdWx0aXBsZVxuICAgICAgICA/IF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtY2FzY2FkZXJfX3RhZ3NcIiB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfdm0uX2woX3ZtLnByZXNlbnRUYWdzLCBmdW5jdGlvbih0YWcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgICAgICBcImVsLXRhZ1wiLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHRhZy5rZXksXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbmZvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZTogX3ZtLnRhZ1NpemUsXG4gICAgICAgICAgICAgICAgICAgICAgaGl0OiB0YWcuaGl0U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IHRhZy5jbG9zYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICBcImRpc2FibGUtdHJhbnNpdGlvbnNcIjogXCJcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIGNsb3NlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5kZWxldGVUYWcodGFnKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtfYyhcInNwYW5cIiwgW192bS5fdihfdm0uX3ModGFnLnRleHQpKV0pXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF92bS5maWx0ZXJhYmxlICYmICFfdm0uaXNEaXNhYmxlZFxuICAgICAgICAgICAgICAgID8gX2MoXCJpbnB1dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtbW9kZWwudHJpbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5pbnB1dFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJpbnB1dFZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnM6IHsgdHJpbTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jYXNjYWRlcl9fc2VhcmNoLWlucHV0XCIsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IF92bS5wcmVzZW50VGFncy5sZW5ndGggPyBcIlwiIDogX3ZtLnBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRvbVByb3BzOiB7IHZhbHVlOiBfdm0uaW5wdXRWYWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmlucHV0VmFsdWUgPSAkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5oYW5kbGVJbnB1dChfdm0uaW5wdXRWYWx1ZSwgZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnRvZ2dsZURyb3BEb3duVmlzaWJsZSh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAga2V5ZG93bjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQua2V5Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlbGV0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs4LCA0Nl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJCYWNrc3BhY2VcIiwgXCJEZWxldGVcIiwgXCJEZWxcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLmhhbmRsZURlbGV0ZSgkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBibHVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS4kZm9yY2VVcGRhdGUoKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgIF9jKFxuICAgICAgICBcInRyYW5zaXRpb25cIixcbiAgICAgICAge1xuICAgICAgICAgIGF0dHJzOiB7IG5hbWU6IFwiZWwtem9vbS1pbi10b3BcIiB9LFxuICAgICAgICAgIG9uOiB7IFwiYWZ0ZXItbGVhdmVcIjogX3ZtLmhhbmRsZURyb3Bkb3duTGVhdmUgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5kcm9wRG93blZpc2libGUsXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImRyb3BEb3duVmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZWY6IFwicG9wcGVyXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiBbXCJlbC1wb3BwZXJcIiwgXCJlbC1jYXNjYWRlcl9fZHJvcGRvd25cIiwgX3ZtLnBvcHBlckNsYXNzXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXCJlbC1jYXNjYWRlci1wYW5lbFwiLCB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICFfdm0uZmlsdGVyaW5nLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcIiFmaWx0ZXJpbmdcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcmVmOiBcInBhbmVsXCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IF92bS5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgcHJvcHM6IF92bS5jb25maWcsXG4gICAgICAgICAgICAgICAgICBib3JkZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgXCJyZW5kZXItbGFiZWxcIjogX3ZtLiRzY29wZWRTbG90cy5kZWZhdWx0XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgXCJleHBhbmQtY2hhbmdlXCI6IF92bS5oYW5kbGVFeHBhbmRDaGFuZ2UsXG4gICAgICAgICAgICAgICAgICBjbG9zZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS50b2dnbGVEcm9wRG93blZpc2libGUoZmFsc2UpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtb2RlbDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5jaGVja2VkVmFsdWUsXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oJCR2KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5jaGVja2VkVmFsdWUgPSAkJHZcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImNoZWNrZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgX3ZtLmZpbHRlcmFibGVcbiAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICBcImVsLXNjcm9sbGJhclwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5maWx0ZXJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiZmlsdGVyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIHJlZjogXCJzdWdnZXN0aW9uUGFuZWxcIixcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jYXNjYWRlcl9fc3VnZ2VzdGlvbi1wYW5lbFwiLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWc6IFwidWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidmlldy1jbGFzc1wiOiBcImVsLWNhc2NhZGVyX19zdWdnZXN0aW9uLWxpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleWRvd246IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLmhhbmRsZVN1Z2dlc3Rpb25LZXlEb3duKCRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uc3VnZ2VzdGlvbnMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF92bS5fbChfdm0uc3VnZ2VzdGlvbnMsIGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGl0ZW0udWlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtY2FzY2FkZXJfX3N1Z2dlc3Rpb24taXRlbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2hlY2tlZCAmJiBcImlzLWNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyB0YWJpbmRleDogLTEgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlU3VnZ2VzdGlvbkNsaWNrKGluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIFtfdm0uX3YoX3ZtLl9zKGl0ZW0udGV4dCkpXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtaWNvbi1jaGVja1wiIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl90KFwiZW1wdHlcIiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1jYXNjYWRlcl9fZW1wdHktdGV4dFwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0udChcImVsLmNhc2NhZGVyLm5vTWF0Y2hcIikpKV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMVxuICAgICAgICAgIClcbiAgICAgICAgXVxuICAgICAgKVxuICAgIF0sXG4gICAgMVxuICApXG59XG52YXIgY2FzY2FkZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMzI1MzdhNl9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuY2FzY2FkZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMzI1MzdhNl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhc2NhZGVyL3NyYy9jYXNjYWRlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDMyNTM3YTYmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9jYXNjYWRlci1wYW5lbFwiXG52YXIgY2FzY2FkZXJfcGFuZWxfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Myk7XG52YXIgY2FzY2FkZXJfcGFuZWxfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY2FzY2FkZXJfcGFuZWxfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL2FyaWEtdXRpbHNcIlxudmFyIGFyaWFfdXRpbHNfID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNSk7XG52YXIgYXJpYV91dGlsc19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihhcmlhX3V0aWxzXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhc2NhZGVyL3NyYy9jYXNjYWRlci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbnZhciBLZXlDb2RlID0gYXJpYV91dGlsc19kZWZhdWx0LmEua2V5cztcblxudmFyIE1pZ3JhdGluZ1Byb3BzID0ge1xuICBleHBhbmRUcmlnZ2VyOiB7XG4gICAgbmV3UHJvcDogJ2V4cGFuZFRyaWdnZXInLFxuICAgIHR5cGU6IFN0cmluZ1xuICB9LFxuICBjaGFuZ2VPblNlbGVjdDoge1xuICAgIG5ld1Byb3A6ICdjaGVja1N0cmljdGx5JyxcbiAgICB0eXBlOiBCb29sZWFuXG4gIH0sXG4gIGhvdmVyVGhyZXNob2xkOiB7XG4gICAgbmV3UHJvcDogJ2hvdmVyVGhyZXNob2xkJyxcbiAgICB0eXBlOiBOdW1iZXJcbiAgfVxufTtcblxudmFyIFBvcHBlck1peGluID0ge1xuICBwcm9wczoge1xuICAgIHBsYWNlbWVudDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2JvdHRvbS1zdGFydCdcbiAgICB9LFxuICAgIGFwcGVuZFRvQm9keTogdnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMuYXBwZW5kVG9Cb2R5LFxuICAgIHZpc2libGVBcnJvdzoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGFycm93T2Zmc2V0OiB2dWVfcG9wcGVyX2RlZmF1bHQuYS5wcm9wcy5hcnJvd09mZnNldCxcbiAgICBvZmZzZXQ6IHZ1ZV9wb3BwZXJfZGVmYXVsdC5hLnByb3BzLm9mZnNldCxcbiAgICBib3VuZGFyaWVzUGFkZGluZzogdnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMuYm91bmRhcmllc1BhZGRpbmcsXG4gICAgcG9wcGVyT3B0aW9uczogdnVlX3BvcHBlcl9kZWZhdWx0LmEucHJvcHMucG9wcGVyT3B0aW9ucyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46IHZ1ZV9wb3BwZXJfZGVmYXVsdC5hLnByb3BzLnRyYW5zZm9ybU9yaWdpblxuICB9LFxuICBtZXRob2RzOiB2dWVfcG9wcGVyX2RlZmF1bHQuYS5tZXRob2RzLFxuICBkYXRhOiB2dWVfcG9wcGVyX2RlZmF1bHQuYS5kYXRhLFxuICBiZWZvcmVEZXN0cm95OiB2dWVfcG9wcGVyX2RlZmF1bHQuYS5iZWZvcmVEZXN0cm95XG59O1xuXG52YXIgSW5wdXRTaXplTWFwID0ge1xuICBtZWRpdW06IDM2LFxuICBzbWFsbDogMzIsXG4gIG1pbmk6IDI4XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXNjYWRlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbENhc2NhZGVyJyxcblxuICBkaXJlY3RpdmVzOiB7IENsaWNrb3V0c2lkZTogY2xpY2tvdXRzaWRlX2RlZmF1bHQuYSB9LFxuXG4gIG1peGluczogW1BvcHBlck1peGluLCBlbWl0dGVyX2RlZmF1bHQuYSwgbG9jYWxlX2RlZmF1bHQuYSwgbWlncmF0aW5nX2RlZmF1bHQuYV0sXG5cbiAgaW5qZWN0OiB7XG4gICAgZWxGb3JtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgZWxGb3JtSXRlbToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9XG4gIH0sXG5cbiAgY29tcG9uZW50czoge1xuICAgIEVsSW5wdXQ6IGlucHV0X2RlZmF1bHQuYSxcbiAgICBFbFRhZzogdGFnX2RlZmF1bHQuYSxcbiAgICBFbFNjcm9sbGJhcjogc2Nyb2xsYmFyX2RlZmF1bHQuYSxcbiAgICBFbENhc2NhZGVyUGFuZWw6IGNhc2NhZGVyX3BhbmVsX2RlZmF1bHQuYVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IHt9LFxuICAgIG9wdGlvbnM6IEFycmF5LFxuICAgIHByb3BzOiBPYmplY3QsXG4gICAgc2l6ZTogU3RyaW5nLFxuICAgIHBsYWNlaG9sZGVyOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdChsaWJfbG9jYWxlX1tcInRcIl0pKCdlbC5jYXNjYWRlci5wbGFjZWhvbGRlcicpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW4sXG4gICAgY2xlYXJhYmxlOiBCb29sZWFuLFxuICAgIGZpbHRlcmFibGU6IEJvb2xlYW4sXG4gICAgZmlsdGVyTWV0aG9kOiBGdW5jdGlvbixcbiAgICBzZXBhcmF0b3I6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcgLyAnXG4gICAgfSxcbiAgICBzaG93QWxsTGV2ZWxzOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgY29sbGFwc2VUYWdzOiBCb29sZWFuLFxuICAgIGRlYm91bmNlOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAzMDBcbiAgICB9LFxuICAgIGJlZm9yZUZpbHRlcjoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgcG9wcGVyQ2xhc3M6IFN0cmluZ1xuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRyb3BEb3duVmlzaWJsZTogZmFsc2UsXG4gICAgICBjaGVja2VkVmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICBpbnB1dEhvdmVyOiBmYWxzZSxcbiAgICAgIGlucHV0VmFsdWU6IG51bGwsXG4gICAgICBwcmVzZW50VGV4dDogbnVsbCxcbiAgICAgIHByZXNlbnRUYWdzOiBbXSxcbiAgICAgIGNoZWNrZWROb2RlczogW10sXG4gICAgICBmaWx0ZXJpbmc6IGZhbHNlLFxuICAgICAgc3VnZ2VzdGlvbnM6IFtdLFxuICAgICAgaW5wdXRJbml0aWFsSGVpZ2h0OiAwLFxuICAgICAgcHJlc3NEZWxldGVDb3VudDogMFxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIHJlYWxTaXplOiBmdW5jdGlvbiByZWFsU2l6ZSgpIHtcbiAgICAgIHZhciBfZWxGb3JtSXRlbVNpemUgPSAodGhpcy5lbEZvcm1JdGVtIHx8IHt9KS5lbEZvcm1JdGVtU2l6ZTtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgfHwgX2VsRm9ybUl0ZW1TaXplIHx8ICh0aGlzLiRFTEVNRU5UIHx8IHt9KS5zaXplO1xuICAgIH0sXG4gICAgdGFnU2l6ZTogZnVuY3Rpb24gdGFnU2l6ZSgpIHtcbiAgICAgIHJldHVybiBbJ3NtYWxsJywgJ21pbmknXS5pbmRleE9mKHRoaXMucmVhbFNpemUpID4gLTEgPyAnbWluaScgOiAnc21hbGwnO1xuICAgIH0sXG4gICAgaXNEaXNhYmxlZDogZnVuY3Rpb24gaXNEaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8ICh0aGlzLmVsRm9ybSB8fCB7fSkuZGlzYWJsZWQ7XG4gICAgfSxcbiAgICBjb25maWc6IGZ1bmN0aW9uIGNvbmZpZygpIHtcbiAgICAgIHZhciBjb25maWcgPSB0aGlzLnByb3BzIHx8IHt9O1xuICAgICAgdmFyICRhdHRycyA9IHRoaXMuJGF0dHJzO1xuXG5cbiAgICAgIE9iamVjdC5rZXlzKE1pZ3JhdGluZ1Byb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChvbGRQcm9wKSB7XG4gICAgICAgIHZhciBfTWlncmF0aW5nUHJvcHMkb2xkUHIgPSBNaWdyYXRpbmdQcm9wc1tvbGRQcm9wXSxcbiAgICAgICAgICAgIG5ld1Byb3AgPSBfTWlncmF0aW5nUHJvcHMkb2xkUHIubmV3UHJvcCxcbiAgICAgICAgICAgIHR5cGUgPSBfTWlncmF0aW5nUHJvcHMkb2xkUHIudHlwZTtcblxuICAgICAgICB2YXIgb2xkVmFsdWUgPSAkYXR0cnNbb2xkUHJvcF0gfHwgJGF0dHJzW09iamVjdCh1dGlsX1tcImtlYmFiQ2FzZVwiXSkob2xkUHJvcCldO1xuICAgICAgICBpZiAoT2JqZWN0KHNoYXJlZF9bXCJpc0RlZlwiXSkob2xkUHJvcCkgJiYgIU9iamVjdChzaGFyZWRfW1wiaXNEZWZcIl0pKGNvbmZpZ1tuZXdQcm9wXSkpIHtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gQm9vbGVhbiAmJiBvbGRWYWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIG9sZFZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uZmlnW25ld1Byb3BdID0gb2xkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG4gICAgbXVsdGlwbGU6IGZ1bmN0aW9uIG11bHRpcGxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLm11bHRpcGxlO1xuICAgIH0sXG4gICAgbGVhZk9ubHk6IGZ1bmN0aW9uIGxlYWZPbmx5KCkge1xuICAgICAgcmV0dXJuICF0aGlzLmNvbmZpZy5jaGVja1N0cmljdGx5O1xuICAgIH0sXG4gICAgcmVhZG9ubHk6IGZ1bmN0aW9uIHJlYWRvbmx5KCkge1xuICAgICAgcmV0dXJuICF0aGlzLmZpbHRlcmFibGUgfHwgdGhpcy5tdWx0aXBsZTtcbiAgICB9LFxuICAgIGNsZWFyQnRuVmlzaWJsZTogZnVuY3Rpb24gY2xlYXJCdG5WaXNpYmxlKCkge1xuICAgICAgaWYgKCF0aGlzLmNsZWFyYWJsZSB8fCB0aGlzLmlzRGlzYWJsZWQgfHwgdGhpcy5maWx0ZXJpbmcgfHwgIXRoaXMuaW5wdXRIb3Zlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gISF0aGlzLmNoZWNrZWROb2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuICFub2RlLmlzRGlzYWJsZWQ7XG4gICAgICB9KS5sZW5ndGggOiAhIXRoaXMucHJlc2VudFRleHQ7XG4gICAgfSxcbiAgICBwYW5lbDogZnVuY3Rpb24gcGFuZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy5wYW5lbDtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBkaXNhYmxlZDogZnVuY3Rpb24gZGlzYWJsZWQoKSB7XG4gICAgICB0aGlzLmNvbXB1dGVQcmVzZW50Q29udGVudCgpO1xuICAgIH0sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuICAgICAgaWYgKCFPYmplY3QodXRpbF9bXCJpc0VxdWFsXCJdKSh2YWwsIHRoaXMuY2hlY2tlZFZhbHVlKSkge1xuICAgICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IHZhbDtcbiAgICAgICAgdGhpcy5jb21wdXRlUHJlc2VudENvbnRlbnQoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNoZWNrZWRWYWx1ZTogZnVuY3Rpb24gY2hlY2tlZFZhbHVlKHZhbCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSxcbiAgICAgICAgICBkcm9wRG93blZpc2libGUgPSB0aGlzLmRyb3BEb3duVmlzaWJsZTtcbiAgICAgIHZhciBfY29uZmlnID0gdGhpcy5jb25maWcsXG4gICAgICAgICAgY2hlY2tTdHJpY3RseSA9IF9jb25maWcuY2hlY2tTdHJpY3RseSxcbiAgICAgICAgICBtdWx0aXBsZSA9IF9jb25maWcubXVsdGlwbGU7XG5cblxuICAgICAgaWYgKCFPYmplY3QodXRpbF9bXCJpc0VxdWFsXCJdKSh2YWwsIHZhbHVlKSB8fCBPYmplY3QodHlwZXNfW1wiaXNVbmRlZmluZWRcIl0pKHZhbHVlKSkge1xuICAgICAgICB0aGlzLmNvbXB1dGVQcmVzZW50Q29udGVudCgpO1xuICAgICAgICAvLyBoaWRlIGRyb3Bkb3duIHdoZW4gc2luZ2xlIG1vZGVcbiAgICAgICAgaWYgKCFtdWx0aXBsZSAmJiAhY2hlY2tTdHJpY3RseSAmJiBkcm9wRG93blZpc2libGUpIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZURyb3BEb3duVmlzaWJsZShmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCAnZWwuZm9ybS5jaGFuZ2UnLCBbdmFsXSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKHRoaXMuY29tcHV0ZVByZXNlbnRDb250ZW50KTtcbiAgICAgIH0sXG4gICAgICBkZWVwOiB0cnVlXG4gICAgfSxcbiAgICBwcmVzZW50VGV4dDogZnVuY3Rpb24gcHJlc2VudFRleHQodmFsKSB7XG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSB2YWw7XG4gICAgfSxcbiAgICBwcmVzZW50VGFnczogZnVuY3Rpb24gcHJlc2VudFRhZ3ModmFsLCBvbGRWYWwpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmICh2YWwubGVuZ3RoIHx8IG9sZFZhbC5sZW5ndGgpKSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKHRoaXMudXBkYXRlU3R5bGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmlsdGVyaW5nOiBmdW5jdGlvbiBmaWx0ZXJpbmcodmFsKSB7XG4gICAgICB0aGlzLiRuZXh0VGljayh0aGlzLnVwZGF0ZVBvcHBlcik7XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBpbnB1dCA9IHRoaXMuJHJlZnMuaW5wdXQ7XG5cbiAgICBpZiAoaW5wdXQgJiYgaW5wdXQuJGVsKSB7XG4gICAgICB0aGlzLmlucHV0SW5pdGlhbEhlaWdodCA9IGlucHV0LiRlbC5vZmZzZXRIZWlnaHQgfHwgSW5wdXRTaXplTWFwW3RoaXMucmVhbFNpemVdIHx8IDQwO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0VtcHR5VmFsdWUodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuY29tcHV0ZVByZXNlbnRDb250ZW50KCk7XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJIYW5kbGVyID0gZGVib3VuY2VfZGVmYXVsdCgpKHRoaXMuZGVib3VuY2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbnB1dFZhbHVlID0gX3RoaXMuaW5wdXRWYWx1ZTtcblxuXG4gICAgICBpZiAoIWlucHV0VmFsdWUpIHtcbiAgICAgICAgX3RoaXMuZmlsdGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGJlZm9yZSA9IF90aGlzLmJlZm9yZUZpbHRlcihpbnB1dFZhbHVlKTtcbiAgICAgIGlmIChiZWZvcmUgJiYgYmVmb3JlLnRoZW4pIHtcbiAgICAgICAgYmVmb3JlLnRoZW4oX3RoaXMuZ2V0U3VnZ2VzdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmIChiZWZvcmUgIT09IGZhbHNlKSB7XG4gICAgICAgIF90aGlzLmdldFN1Z2dlc3Rpb25zKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5maWx0ZXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdChyZXNpemVfZXZlbnRfW1wiYWRkUmVzaXplTGlzdGVuZXJcIl0pKHRoaXMuJGVsLCB0aGlzLnVwZGF0ZVN0eWxlKTtcbiAgfSxcbiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICBPYmplY3QocmVzaXplX2V2ZW50X1tcInJlbW92ZVJlc2l6ZUxpc3RlbmVyXCJdKSh0aGlzLiRlbCwgdGhpcy51cGRhdGVTdHlsZSk7XG4gIH0sXG5cblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TWlncmF0aW5nQ29uZmlnOiBmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICdleHBhbmQtdHJpZ2dlcic6ICdleHBhbmQtdHJpZ2dlciBpcyByZW1vdmVkLCB1c2UgYHByb3BzLmV4cGFuZFRyaWdnZXJgIGluc3RlYWQuJyxcbiAgICAgICAgICAnY2hhbmdlLW9uLXNlbGVjdCc6ICdjaGFuZ2Utb24tc2VsZWN0IGlzIHJlbW92ZWQsIHVzZSBgcHJvcHMuY2hlY2tTdHJpY3RseWAgaW5zdGVhZC4nLFxuICAgICAgICAgICdob3Zlci10aHJlc2hvbGQnOiAnaG92ZXItdGhyZXNob2xkIGlzIHJlbW92ZWQsIHVzZSBgcHJvcHMuaG92ZXJUaHJlc2hvbGRgIGluc3RlYWQnXG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICdhY3RpdmUtaXRlbS1jaGFuZ2UnOiAnYWN0aXZlLWl0ZW0tY2hhbmdlIGlzIHJlbmFtZWQgdG8gZXhwYW5kLWNoYW5nZSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgIHRvZ2dsZURyb3BEb3duVmlzaWJsZTogZnVuY3Rpb24gdG9nZ2xlRHJvcERvd25WaXNpYmxlKHZpc2libGUpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSByZXR1cm47XG5cbiAgICAgIHZhciBkcm9wRG93blZpc2libGUgPSB0aGlzLmRyb3BEb3duVmlzaWJsZTtcbiAgICAgIHZhciBpbnB1dCA9IHRoaXMuJHJlZnMuaW5wdXQ7XG5cbiAgICAgIHZpc2libGUgPSBPYmplY3Qoc2hhcmVkX1tcImlzRGVmXCJdKSh2aXNpYmxlKSA/IHZpc2libGUgOiAhZHJvcERvd25WaXNpYmxlO1xuICAgICAgaWYgKHZpc2libGUgIT09IGRyb3BEb3duVmlzaWJsZSkge1xuICAgICAgICB0aGlzLmRyb3BEb3duVmlzaWJsZSA9IHZpc2libGU7XG4gICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMyLnVwZGF0ZVBvcHBlcigpO1xuICAgICAgICAgICAgX3RoaXMyLnBhbmVsLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQuJHJlZnMuaW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgdmlzaWJsZSk7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3Zpc2libGUtY2hhbmdlJywgdmlzaWJsZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVEcm9wZG93bkxlYXZlOiBmdW5jdGlvbiBoYW5kbGVEcm9wZG93bkxlYXZlKCkge1xuICAgICAgdGhpcy5maWx0ZXJpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IHRoaXMucHJlc2VudFRleHQ7XG4gICAgICB0aGlzLmRvRGVzdHJveSgpO1xuICAgIH0sXG4gICAgaGFuZGxlS2V5RG93bjogZnVuY3Rpb24gaGFuZGxlS2V5RG93bihldmVudCkge1xuICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgS2V5Q29kZS5lbnRlcjpcbiAgICAgICAgICB0aGlzLnRvZ2dsZURyb3BEb3duVmlzaWJsZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUuZG93bjpcbiAgICAgICAgICB0aGlzLnRvZ2dsZURyb3BEb3duVmlzaWJsZSh0cnVlKTtcbiAgICAgICAgICB0aGlzLmZvY3VzRmlyc3ROb2RlKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLmVzYzpcbiAgICAgICAgY2FzZSBLZXlDb2RlLnRhYjpcbiAgICAgICAgICB0aGlzLnRvZ2dsZURyb3BEb3duVmlzaWJsZShmYWxzZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVGb2N1czogZnVuY3Rpb24gaGFuZGxlRm9jdXMoZSkge1xuICAgICAgdGhpcy4kZW1pdCgnZm9jdXMnLCBlKTtcbiAgICB9LFxuICAgIGhhbmRsZUJsdXI6IGZ1bmN0aW9uIGhhbmRsZUJsdXIoZSkge1xuICAgICAgdGhpcy4kZW1pdCgnYmx1cicsIGUpO1xuICAgIH0sXG4gICAgaGFuZGxlSW5wdXQ6IGZ1bmN0aW9uIGhhbmRsZUlucHV0KHZhbCwgZXZlbnQpIHtcbiAgICAgICF0aGlzLmRyb3BEb3duVmlzaWJsZSAmJiB0aGlzLnRvZ2dsZURyb3BEb3duVmlzaWJsZSh0cnVlKTtcblxuICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmlzQ29tcG9zaW5nKSByZXR1cm47XG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHRoaXMuZmlsdGVySGFuZGxlcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUNsZWFyOiBmdW5jdGlvbiBoYW5kbGVDbGVhcigpIHtcbiAgICAgIHRoaXMucHJlc2VudFRleHQgPSAnJztcbiAgICAgIHRoaXMucGFuZWwuY2xlYXJDaGVja2VkTm9kZXMoKTtcbiAgICB9LFxuICAgIGhhbmRsZUV4cGFuZENoYW5nZTogZnVuY3Rpb24gaGFuZGxlRXhwYW5kQ2hhbmdlKHZhbHVlKSB7XG4gICAgICB0aGlzLiRuZXh0VGljayh0aGlzLnVwZGF0ZVBvcHBlci5iaW5kKHRoaXMpKTtcbiAgICAgIHRoaXMuJGVtaXQoJ2V4cGFuZC1jaGFuZ2UnLCB2YWx1ZSk7XG4gICAgICB0aGlzLiRlbWl0KCdhY3RpdmUtaXRlbS1jaGFuZ2UnLCB2YWx1ZSk7IC8vIERlcHJlY2F0ZWRcbiAgICB9LFxuICAgIGZvY3VzRmlyc3ROb2RlOiBmdW5jdGlvbiBmb2N1c0ZpcnN0Tm9kZSgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmaWx0ZXJpbmcgPSBfdGhpczMuZmlsdGVyaW5nO1xuICAgICAgICB2YXIgXyRyZWZzID0gX3RoaXMzLiRyZWZzLFxuICAgICAgICAgICAgcG9wcGVyID0gXyRyZWZzLnBvcHBlcixcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25QYW5lbCA9IF8kcmVmcy5zdWdnZXN0aW9uUGFuZWw7XG5cbiAgICAgICAgdmFyIGZpcnN0Tm9kZSA9IG51bGw7XG5cbiAgICAgICAgaWYgKGZpbHRlcmluZyAmJiBzdWdnZXN0aW9uUGFuZWwpIHtcbiAgICAgICAgICBmaXJzdE5vZGUgPSBzdWdnZXN0aW9uUGFuZWwuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1jYXNjYWRlcl9fc3VnZ2VzdGlvbi1pdGVtJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGZpcnN0TWVudSA9IHBvcHBlci5xdWVyeVNlbGVjdG9yKCcuZWwtY2FzY2FkZXItbWVudScpO1xuICAgICAgICAgIGZpcnN0Tm9kZSA9IGZpcnN0TWVudS5xdWVyeVNlbGVjdG9yKCcuZWwtY2FzY2FkZXItbm9kZVt0YWJpbmRleD1cIi0xXCJdJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlyc3ROb2RlKSB7XG4gICAgICAgICAgZmlyc3ROb2RlLmZvY3VzKCk7XG4gICAgICAgICAgIWZpbHRlcmluZyAmJiBmaXJzdE5vZGUuY2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBjb21wdXRlUHJlc2VudENvbnRlbnQ6IGZ1bmN0aW9uIGNvbXB1dGVQcmVzZW50Q29udGVudCgpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICAvLyBuZXh0VGljayBpcyByZXF1aXJlZCwgYmVjYXVzZSBjaGVja2VkIG5vZGVzIG1heSBub3QgY2hhbmdlIHJpZ2h0IG5vd1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXM0LmNvbmZpZy5tdWx0aXBsZSkge1xuICAgICAgICAgIF90aGlzNC5jb21wdXRlUHJlc2VudFRhZ3MoKTtcbiAgICAgICAgICBfdGhpczQucHJlc2VudFRleHQgPSBfdGhpczQucHJlc2VudFRhZ3MubGVuZ3RoID8gJyAnIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpczQuY29tcHV0ZVByZXNlbnRUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgaXNFbXB0eVZhbHVlOiBmdW5jdGlvbiBpc0VtcHR5VmFsdWUodmFsKSB7XG4gICAgICB2YXIgbXVsdGlwbGUgPSB0aGlzLm11bHRpcGxlO1xuICAgICAgdmFyIGVtaXRQYXRoID0gdGhpcy5wYW5lbC5jb25maWcuZW1pdFBhdGg7XG5cbiAgICAgIGlmIChtdWx0aXBsZSB8fCBlbWl0UGF0aCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiaXNFbXB0eVwiXSkodmFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGNvbXB1dGVQcmVzZW50VGV4dDogZnVuY3Rpb24gY29tcHV0ZVByZXNlbnRUZXh0KCkge1xuICAgICAgdmFyIGNoZWNrZWRWYWx1ZSA9IHRoaXMuY2hlY2tlZFZhbHVlLFxuICAgICAgICAgIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuXG4gICAgICBpZiAoIXRoaXMuaXNFbXB0eVZhbHVlKGNoZWNrZWRWYWx1ZSkpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnBhbmVsLmdldE5vZGVCeVZhbHVlKGNoZWNrZWRWYWx1ZSk7XG4gICAgICAgIGlmIChub2RlICYmIChjb25maWcuY2hlY2tTdHJpY3RseSB8fCBub2RlLmlzTGVhZikpIHtcbiAgICAgICAgICB0aGlzLnByZXNlbnRUZXh0ID0gbm9kZS5nZXRUZXh0KHRoaXMuc2hvd0FsbExldmVscywgdGhpcy5zZXBhcmF0b3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wcmVzZW50VGV4dCA9IG51bGw7XG4gICAgfSxcbiAgICBjb21wdXRlUHJlc2VudFRhZ3M6IGZ1bmN0aW9uIGNvbXB1dGVQcmVzZW50VGFncygpIHtcbiAgICAgIHZhciBpc0Rpc2FibGVkID0gdGhpcy5pc0Rpc2FibGVkLFxuICAgICAgICAgIGxlYWZPbmx5ID0gdGhpcy5sZWFmT25seSxcbiAgICAgICAgICBzaG93QWxsTGV2ZWxzID0gdGhpcy5zaG93QWxsTGV2ZWxzLFxuICAgICAgICAgIHNlcGFyYXRvciA9IHRoaXMuc2VwYXJhdG9yLFxuICAgICAgICAgIGNvbGxhcHNlVGFncyA9IHRoaXMuY29sbGFwc2VUYWdzO1xuXG4gICAgICB2YXIgY2hlY2tlZE5vZGVzID0gdGhpcy5nZXRDaGVja2VkTm9kZXMobGVhZk9ubHkpO1xuICAgICAgdmFyIHRhZ3MgPSBbXTtcblxuICAgICAgdmFyIGdlblRhZyA9IGZ1bmN0aW9uIGdlblRhZyhub2RlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICBrZXk6IG5vZGUudWlkLFxuICAgICAgICAgIHRleHQ6IG5vZGUuZ2V0VGV4dChzaG93QWxsTGV2ZWxzLCBzZXBhcmF0b3IpLFxuICAgICAgICAgIGhpdFN0YXRlOiBmYWxzZSxcbiAgICAgICAgICBjbG9zYWJsZTogIWlzRGlzYWJsZWQgJiYgIW5vZGUuaXNEaXNhYmxlZFxuICAgICAgICB9O1xuICAgICAgfTtcblxuICAgICAgaWYgKGNoZWNrZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGZpcnN0ID0gY2hlY2tlZE5vZGVzWzBdLFxuICAgICAgICAgICAgcmVzdCA9IGNoZWNrZWROb2Rlcy5zbGljZSgxKTtcblxuICAgICAgICB2YXIgcmVzdENvdW50ID0gcmVzdC5sZW5ndGg7XG4gICAgICAgIHRhZ3MucHVzaChnZW5UYWcoZmlyc3QpKTtcblxuICAgICAgICBpZiAocmVzdENvdW50KSB7XG4gICAgICAgICAgaWYgKGNvbGxhcHNlVGFncykge1xuICAgICAgICAgICAgdGFncy5wdXNoKHtcbiAgICAgICAgICAgICAga2V5OiAtMSxcbiAgICAgICAgICAgICAgdGV4dDogJysgJyArIHJlc3RDb3VudCxcbiAgICAgICAgICAgICAgY2xvc2FibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0YWdzLnB1c2goZ2VuVGFnKG5vZGUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmNoZWNrZWROb2RlcyA9IGNoZWNrZWROb2RlcztcbiAgICAgIHRoaXMucHJlc2VudFRhZ3MgPSB0YWdzO1xuICAgIH0sXG4gICAgZ2V0U3VnZ2VzdGlvbnM6IGZ1bmN0aW9uIGdldFN1Z2dlc3Rpb25zKCkge1xuICAgICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICAgIHZhciBmaWx0ZXJNZXRob2QgPSB0aGlzLmZpbHRlck1ldGhvZDtcblxuXG4gICAgICBpZiAoIU9iamVjdCh0eXBlc19bXCJpc0Z1bmN0aW9uXCJdKShmaWx0ZXJNZXRob2QpKSB7XG4gICAgICAgIGZpbHRlck1ldGhvZCA9IGZ1bmN0aW9uIGZpbHRlck1ldGhvZChub2RlLCBrZXl3b3JkKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUudGV4dC5pbmNsdWRlcyhrZXl3b3JkKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN1Z2dlc3Rpb25zID0gdGhpcy5wYW5lbC5nZXRGbGF0dGVkTm9kZXModGhpcy5sZWFmT25seSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmlzRGlzYWJsZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgbm9kZS50ZXh0ID0gbm9kZS5nZXRUZXh0KF90aGlzNS5zaG93QWxsTGV2ZWxzLCBfdGhpczUuc2VwYXJhdG9yKSB8fCAnJztcbiAgICAgICAgcmV0dXJuIGZpbHRlck1ldGhvZChub2RlLCBfdGhpczUuaW5wdXRWYWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5wcmVzZW50VGFncy5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICB0YWcuaGl0U3RhdGUgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWdnZXN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgbm9kZS5jaGVja2VkID0gT2JqZWN0KHV0aWxfW1wiaXNFcXVhbFwiXSkoX3RoaXM1LmNoZWNrZWRWYWx1ZSwgbm9kZS5nZXRWYWx1ZUJ5T3B0aW9uKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maWx0ZXJpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zO1xuICAgICAgdGhpcy4kbmV4dFRpY2sodGhpcy51cGRhdGVQb3BwZXIpO1xuICAgIH0sXG4gICAgaGFuZGxlU3VnZ2VzdGlvbktleURvd246IGZ1bmN0aW9uIGhhbmRsZVN1Z2dlc3Rpb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICB2YXIga2V5Q29kZSA9IGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICBzd2l0Y2ggKGtleUNvZGUpIHtcbiAgICAgICAgY2FzZSBLZXlDb2RlLmVudGVyOlxuICAgICAgICAgIHRhcmdldC5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUudXA6XG4gICAgICAgICAgdmFyIHByZXYgPSB0YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICBwcmV2ICYmIHByZXYuZm9jdXMoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLmRvd246XG4gICAgICAgICAgdmFyIG5leHQgPSB0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIG5leHQgJiYgbmV4dC5mb2N1cygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUuZXNjOlxuICAgICAgICBjYXNlIEtleUNvZGUudGFiOlxuICAgICAgICAgIHRoaXMudG9nZ2xlRHJvcERvd25WaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZURlbGV0ZTogZnVuY3Rpb24gaGFuZGxlRGVsZXRlKCkge1xuICAgICAgdmFyIGlucHV0VmFsdWUgPSB0aGlzLmlucHV0VmFsdWUsXG4gICAgICAgICAgcHJlc3NEZWxldGVDb3VudCA9IHRoaXMucHJlc3NEZWxldGVDb3VudCxcbiAgICAgICAgICBwcmVzZW50VGFncyA9IHRoaXMucHJlc2VudFRhZ3M7XG5cbiAgICAgIHZhciBsYXN0SW5kZXggPSBwcmVzZW50VGFncy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGxhc3RUYWcgPSBwcmVzZW50VGFnc1tsYXN0SW5kZXhdO1xuICAgICAgdGhpcy5wcmVzc0RlbGV0ZUNvdW50ID0gaW5wdXRWYWx1ZSA/IDAgOiBwcmVzc0RlbGV0ZUNvdW50ICsgMTtcblxuICAgICAgaWYgKCFsYXN0VGFnKSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLnByZXNzRGVsZXRlQ291bnQpIHtcbiAgICAgICAgaWYgKGxhc3RUYWcuaGl0U3RhdGUpIHtcbiAgICAgICAgICB0aGlzLmRlbGV0ZVRhZyhsYXN0VGFnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0VGFnLmhpdFN0YXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrOiBmdW5jdGlvbiBoYW5kbGVTdWdnZXN0aW9uQ2xpY2soaW5kZXgpIHtcbiAgICAgIHZhciBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XG5cbiAgICAgIHZhciB0YXJnZXROb2RlID0gdGhpcy5zdWdnZXN0aW9uc1tpbmRleF07XG5cbiAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICB2YXIgY2hlY2tlZCA9IHRhcmdldE5vZGUuY2hlY2tlZDtcblxuICAgICAgICB0YXJnZXROb2RlLmRvQ2hlY2soIWNoZWNrZWQpO1xuICAgICAgICB0aGlzLnBhbmVsLmNhbGN1bGF0ZU11bHRpQ2hlY2tlZFZhbHVlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IHRhcmdldE5vZGUuZ2V0VmFsdWVCeU9wdGlvbigpO1xuICAgICAgICB0aGlzLnRvZ2dsZURyb3BEb3duVmlzaWJsZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkZWxldGVUYWc6IGZ1bmN0aW9uIGRlbGV0ZVRhZyh0YWcpIHtcbiAgICAgIHZhciBjaGVja2VkVmFsdWUgPSB0aGlzLmNoZWNrZWRWYWx1ZTtcblxuICAgICAgdmFyIGN1cnJlbnQgPSB0YWcubm9kZS5nZXRWYWx1ZUJ5T3B0aW9uKCk7XG4gICAgICB2YXIgdmFsID0gY2hlY2tlZFZhbHVlLmZpbmQoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdCh1dGlsX1tcImlzRXF1YWxcIl0pKG4sIGN1cnJlbnQpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IGNoZWNrZWRWYWx1ZS5maWx0ZXIoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuICFPYmplY3QodXRpbF9bXCJpc0VxdWFsXCJdKShuLCBjdXJyZW50KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy4kZW1pdCgncmVtb3ZlLXRhZycsIHZhbCk7XG4gICAgfSxcbiAgICB1cGRhdGVTdHlsZTogZnVuY3Rpb24gdXBkYXRlU3R5bGUoKSB7XG4gICAgICB2YXIgJGVsID0gdGhpcy4kZWwsXG4gICAgICAgICAgaW5wdXRJbml0aWFsSGVpZ2h0ID0gdGhpcy5pbnB1dEluaXRpYWxIZWlnaHQ7XG5cbiAgICAgIGlmICh0aGlzLiRpc1NlcnZlciB8fCAhJGVsKSByZXR1cm47XG5cbiAgICAgIHZhciBzdWdnZXN0aW9uUGFuZWwgPSB0aGlzLiRyZWZzLnN1Z2dlc3Rpb25QYW5lbDtcblxuICAgICAgdmFyIGlucHV0SW5uZXIgPSAkZWwucXVlcnlTZWxlY3RvcignLmVsLWlucHV0X19pbm5lcicpO1xuXG4gICAgICBpZiAoIWlucHV0SW5uZXIpIHJldHVybjtcblxuICAgICAgdmFyIHRhZ3MgPSAkZWwucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyX190YWdzJyk7XG4gICAgICB2YXIgc3VnZ2VzdGlvblBhbmVsRWwgPSBudWxsO1xuXG4gICAgICBpZiAoc3VnZ2VzdGlvblBhbmVsICYmIChzdWdnZXN0aW9uUGFuZWxFbCA9IHN1Z2dlc3Rpb25QYW5lbC4kZWwpKSB7XG4gICAgICAgIHZhciBzdWdnZXN0aW9uTGlzdCA9IHN1Z2dlc3Rpb25QYW5lbEVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1jYXNjYWRlcl9fc3VnZ2VzdGlvbi1saXN0Jyk7XG4gICAgICAgIHN1Z2dlc3Rpb25MaXN0LnN0eWxlLm1pbldpZHRoID0gaW5wdXRJbm5lci5vZmZzZXRXaWR0aCArICdweCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0YWdzKSB7XG4gICAgICAgIHZhciBvZmZzZXRIZWlnaHQgPSBNYXRoLnJvdW5kKHRhZ3MuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcbiAgICAgICAgdmFyIGhlaWdodCA9IE1hdGgubWF4KG9mZnNldEhlaWdodCArIDYsIGlucHV0SW5pdGlhbEhlaWdodCkgKyAncHgnO1xuICAgICAgICBpbnB1dElubmVyLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgaWYgKHRoaXMuZHJvcERvd25WaXNpYmxlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVQb3BwZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIHB1YmxpYyBtZXRob2RzXG4gICAgKi9cbiAgICBnZXRDaGVja2VkTm9kZXM6IGZ1bmN0aW9uIGdldENoZWNrZWROb2RlcyhsZWFmT25seSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFuZWwuZ2V0Q2hlY2tlZE5vZGVzKGxlYWZPbmx5KTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci9zcmMvY2FzY2FkZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19jYXNjYWRlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChjYXNjYWRlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci9zcmMvY2FzY2FkZXIudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY2FzY2FkZXJfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfY2FzY2FkZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGNhc2NhZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMDMyNTM3YTZfcmVuZGVyLFxuICBjYXNjYWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzAzMjUzN2E2X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgY2FzY2FkZXJfYXBpOyB9XG5jYXNjYWRlcl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2Nhc2NhZGVyL3NyYy9jYXNjYWRlci52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY2FzY2FkZXIgPSAoY2FzY2FkZXJfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jYXNjYWRlci5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KGNhc2NhZGVyLm5hbWUsIGNhc2NhZGVyKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2Nhc2NhZGVyID0gKGNhc2NhZGVyKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01NWM4YWRlNyZcbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTVjOGFkZTdfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJjbGlja291dHNpZGVcIixcbiAgICAgICAgICByYXdOYW1lOiBcInYtY2xpY2tvdXRzaWRlXCIsXG4gICAgICAgICAgdmFsdWU6IF92bS5oaWRlLFxuICAgICAgICAgIGV4cHJlc3Npb246IFwiaGlkZVwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBjbGFzczogW1xuICAgICAgICBcImVsLWNvbG9yLXBpY2tlclwiLFxuICAgICAgICBfdm0uY29sb3JEaXNhYmxlZCA/IFwiaXMtZGlzYWJsZWRcIiA6IFwiXCIsXG4gICAgICAgIF92bS5jb2xvclNpemUgPyBcImVsLWNvbG9yLXBpY2tlci0tXCIgKyBfdm0uY29sb3JTaXplIDogXCJcIlxuICAgICAgXVxuICAgIH0sXG4gICAgW1xuICAgICAgX3ZtLmNvbG9yRGlzYWJsZWRcbiAgICAgICAgPyBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWNvbG9yLXBpY2tlcl9fbWFza1wiIH0pXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNvbG9yLXBpY2tlcl9fdHJpZ2dlclwiLFxuICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0uaGFuZGxlVHJpZ2dlciB9XG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jb2xvci1waWNrZXJfX2NvbG9yXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiB7IFwiaXMtYWxwaGFcIjogX3ZtLnNob3dBbHBoYSB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcInNwYW5cIiwge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNvbG9yLXBpY2tlcl9fY29sb3ItaW5uZXJcIixcbiAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBfdm0uZGlzcGxheWVkQ29sb3JcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAhX3ZtLnZhbHVlICYmICFfdm0uc2hvd1BhbmVsQ29sb3JcbiAgICAgICAgICAgICAgICA/IF9jKFwic3BhblwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNvbG9yLXBpY2tlcl9fZW1wdHkgZWwtaWNvbi1jbG9zZVwiXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApLFxuICAgICAgICAgIF9jKFwic3BhblwiLCB7XG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0udmFsdWUgfHwgX3ZtLnNob3dQYW5lbENvbG9yLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwidmFsdWUgfHwgc2hvd1BhbmVsQ29sb3JcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY29sb3ItcGlja2VyX19pY29uIGVsLWljb24tYXJyb3ctZG93blwiXG4gICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgICAgKSxcbiAgICAgIF9jKFwicGlja2VyLWRyb3Bkb3duXCIsIHtcbiAgICAgICAgcmVmOiBcImRyb3Bkb3duXCIsXG4gICAgICAgIGNsYXNzOiBbXCJlbC1jb2xvci1waWNrZXJfX3BhbmVsXCIsIF92bS5wb3BwZXJDbGFzcyB8fCBcIlwiXSxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBjb2xvcjogX3ZtLmNvbG9yLFxuICAgICAgICAgIFwic2hvdy1hbHBoYVwiOiBfdm0uc2hvd0FscGhhLFxuICAgICAgICAgIHByZWRlZmluZTogX3ZtLnByZWRlZmluZVxuICAgICAgICB9LFxuICAgICAgICBvbjogeyBwaWNrOiBfdm0uY29uZmlybVZhbHVlLCBjbGVhcjogX3ZtLmNsZWFyVmFsdWUgfSxcbiAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICB2YWx1ZTogX3ZtLnNob3dQaWNrZXIsXG4gICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCQkdikge1xuICAgICAgICAgICAgX3ZtLnNob3dQaWNrZXIgPSAkJHZcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4cHJlc3Npb246IFwic2hvd1BpY2tlclwiXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgXSxcbiAgICAxXG4gIClcbn1cbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTVjOGFkZTdfc3RhdGljUmVuZGVyRm5zID0gW11cbm1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81NWM4YWRlN19yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NTVjOGFkZTcmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb2xvci5qc1xudmFyIGNvbG9yX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmZ1bmN0aW9uIGNvbG9yX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIGhzdjJoc2wgPSBmdW5jdGlvbiBoc3YyaHNsKGh1ZSwgc2F0LCB2YWwpIHtcbiAgcmV0dXJuIFtodWUsIHNhdCAqIHZhbCAvICgoaHVlID0gKDIgLSBzYXQpICogdmFsKSA8IDEgPyBodWUgOiAyIC0gaHVlKSB8fCAwLCBodWUgLyAyXTtcbn07XG5cbi8vIE5lZWQgdG8gaGFuZGxlIDEuMCBhcyAxMDAlLCBzaW5jZSBvbmNlIGl0IGlzIGEgbnVtYmVyLCB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gaXQgYW5kIDFcbi8vIDxodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc0MjIwNzIvamF2YXNjcmlwdC1ob3ctdG8tZGV0ZWN0LW51bWJlci1hcy1hLWRlY2ltYWwtaW5jbHVkaW5nLTEtMD5cbnZhciBpc09uZVBvaW50WmVybyA9IGZ1bmN0aW9uIGlzT25lUG9pbnRaZXJvKG4pIHtcbiAgcmV0dXJuIHR5cGVvZiBuID09PSAnc3RyaW5nJyAmJiBuLmluZGV4T2YoJy4nKSAhPT0gLTEgJiYgcGFyc2VGbG9hdChuKSA9PT0gMTtcbn07XG5cbnZhciBpc1BlcmNlbnRhZ2UgPSBmdW5jdGlvbiBpc1BlcmNlbnRhZ2Uobikge1xuICByZXR1cm4gdHlwZW9mIG4gPT09ICdzdHJpbmcnICYmIG4uaW5kZXhPZignJScpICE9PSAtMTtcbn07XG5cbi8vIFRha2UgaW5wdXQgZnJvbSBbMCwgbl0gYW5kIHJldHVybiBpdCBhcyBbMCwgMV1cbnZhciBib3VuZDAxID0gZnVuY3Rpb24gYm91bmQwMSh2YWx1ZSwgbWF4KSB7XG4gIGlmIChpc09uZVBvaW50WmVybyh2YWx1ZSkpIHZhbHVlID0gJzEwMCUnO1xuXG4gIHZhciBwcm9jZXNzUGVyY2VudCA9IGlzUGVyY2VudGFnZSh2YWx1ZSk7XG4gIHZhbHVlID0gTWF0aC5taW4obWF4LCBNYXRoLm1heCgwLCBwYXJzZUZsb2F0KHZhbHVlKSkpO1xuXG4gIC8vIEF1dG9tYXRpY2FsbHkgY29udmVydCBwZXJjZW50YWdlIGludG8gbnVtYmVyXG4gIGlmIChwcm9jZXNzUGVyY2VudCkge1xuICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUgKiBtYXgsIDEwKSAvIDEwMDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnNcbiAgaWYgKE1hdGguYWJzKHZhbHVlIC0gbWF4KSA8IDAuMDAwMDAxKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvLyBDb252ZXJ0IGludG8gWzAsIDFdIHJhbmdlIGlmIGl0IGlzbid0IGFscmVhZHlcbiAgcmV0dXJuIHZhbHVlICUgbWF4IC8gcGFyc2VGbG9hdChtYXgpO1xufTtcblxudmFyIElOVF9IRVhfTUFQID0geyAxMDogJ0EnLCAxMTogJ0InLCAxMjogJ0MnLCAxMzogJ0QnLCAxNDogJ0UnLCAxNTogJ0YnIH07XG5cbnZhciB0b0hleCA9IGZ1bmN0aW9uIHRvSGV4KF9yZWYpIHtcbiAgdmFyIHIgPSBfcmVmLnIsXG4gICAgICBnID0gX3JlZi5nLFxuICAgICAgYiA9IF9yZWYuYjtcblxuICB2YXIgaGV4T25lID0gZnVuY3Rpb24gaGV4T25lKHZhbHVlKSB7XG4gICAgdmFsdWUgPSBNYXRoLm1pbihNYXRoLnJvdW5kKHZhbHVlKSwgMjU1KTtcbiAgICB2YXIgaGlnaCA9IE1hdGguZmxvb3IodmFsdWUgLyAxNik7XG4gICAgdmFyIGxvdyA9IHZhbHVlICUgMTY7XG4gICAgcmV0dXJuICcnICsgKElOVF9IRVhfTUFQW2hpZ2hdIHx8IGhpZ2gpICsgKElOVF9IRVhfTUFQW2xvd10gfHwgbG93KTtcbiAgfTtcblxuICBpZiAoaXNOYU4ocikgfHwgaXNOYU4oZykgfHwgaXNOYU4oYikpIHJldHVybiAnJztcblxuICByZXR1cm4gJyMnICsgaGV4T25lKHIpICsgaGV4T25lKGcpICsgaGV4T25lKGIpO1xufTtcblxudmFyIEhFWF9JTlRfTUFQID0geyBBOiAxMCwgQjogMTEsIEM6IDEyLCBEOiAxMywgRTogMTQsIEY6IDE1IH07XG5cbnZhciBwYXJzZUhleENoYW5uZWwgPSBmdW5jdGlvbiBwYXJzZUhleENoYW5uZWwoaGV4KSB7XG4gIGlmIChoZXgubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIChIRVhfSU5UX01BUFtoZXhbMF0udG9VcHBlckNhc2UoKV0gfHwgK2hleFswXSkgKiAxNiArIChIRVhfSU5UX01BUFtoZXhbMV0udG9VcHBlckNhc2UoKV0gfHwgK2hleFsxXSk7XG4gIH1cblxuICByZXR1cm4gSEVYX0lOVF9NQVBbaGV4WzFdLnRvVXBwZXJDYXNlKCldIHx8ICtoZXhbMV07XG59O1xuXG52YXIgaHNsMmhzdiA9IGZ1bmN0aW9uIGhzbDJoc3YoaHVlLCBzYXQsIGxpZ2h0KSB7XG4gIHNhdCA9IHNhdCAvIDEwMDtcbiAgbGlnaHQgPSBsaWdodCAvIDEwMDtcbiAgdmFyIHNtaW4gPSBzYXQ7XG4gIHZhciBsbWluID0gTWF0aC5tYXgobGlnaHQsIDAuMDEpO1xuICB2YXIgc3YgPSB2b2lkIDA7XG4gIHZhciB2ID0gdm9pZCAwO1xuXG4gIGxpZ2h0ICo9IDI7XG4gIHNhdCAqPSBsaWdodCA8PSAxID8gbGlnaHQgOiAyIC0gbGlnaHQ7XG4gIHNtaW4gKj0gbG1pbiA8PSAxID8gbG1pbiA6IDIgLSBsbWluO1xuICB2ID0gKGxpZ2h0ICsgc2F0KSAvIDI7XG4gIHN2ID0gbGlnaHQgPT09IDAgPyAyICogc21pbiAvIChsbWluICsgc21pbikgOiAyICogc2F0IC8gKGxpZ2h0ICsgc2F0KTtcblxuICByZXR1cm4ge1xuICAgIGg6IGh1ZSxcbiAgICBzOiBzdiAqIDEwMCxcbiAgICB2OiB2ICogMTAwXG4gIH07XG59O1xuXG4vLyBgcmdiVG9Ic3ZgXG4vLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNWXG4vLyAqQXNzdW1lczoqIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gdGhlIHNldCBbMCwgMjU1XSBvciBbMCwgMV1cbi8vICpSZXR1cm5zOiogeyBoLCBzLCB2IH0gaW4gWzAsMV1cbnZhciByZ2IyaHN2ID0gZnVuY3Rpb24gcmdiMmhzdihyLCBnLCBiKSB7XG4gIHIgPSBib3VuZDAxKHIsIDI1NSk7XG4gIGcgPSBib3VuZDAxKGcsIDI1NSk7XG4gIGIgPSBib3VuZDAxKGIsIDI1NSk7XG5cbiAgdmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICB2YXIgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gIHZhciBoID0gdm9pZCAwLFxuICAgICAgcyA9IHZvaWQgMDtcbiAgdmFyIHYgPSBtYXg7XG5cbiAgdmFyIGQgPSBtYXggLSBtaW47XG4gIHMgPSBtYXggPT09IDAgPyAwIDogZCAvIG1heDtcblxuICBpZiAobWF4ID09PSBtaW4pIHtcbiAgICBoID0gMDsgLy8gYWNocm9tYXRpY1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAobWF4KSB7XG4gICAgICBjYXNlIHI6XG4gICAgICAgIGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGc6XG4gICAgICAgIGggPSAoYiAtIHIpIC8gZCArIDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBiOlxuICAgICAgICBoID0gKHIgLSBnKSAvIGQgKyA0O1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaCAvPSA2O1xuICB9XG5cbiAgcmV0dXJuIHsgaDogaCAqIDM2MCwgczogcyAqIDEwMCwgdjogdiAqIDEwMCB9O1xufTtcblxuLy8gYGhzdlRvUmdiYFxuLy8gQ29udmVydHMgYW4gSFNWIGNvbG9yIHZhbHVlIHRvIFJHQi5cbi8vICpBc3N1bWVzOiogaCBpcyBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAzNjBdIGFuZCBzIGFuZCB2IGFyZSBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAxMDBdXG4vLyAqUmV0dXJuczoqIHsgciwgZywgYiB9IGluIHRoZSBzZXQgWzAsIDI1NV1cbnZhciBoc3YycmdiID0gZnVuY3Rpb24gaHN2MnJnYihoLCBzLCB2KSB7XG4gIGggPSBib3VuZDAxKGgsIDM2MCkgKiA2O1xuICBzID0gYm91bmQwMShzLCAxMDApO1xuICB2ID0gYm91bmQwMSh2LCAxMDApO1xuXG4gIHZhciBpID0gTWF0aC5mbG9vcihoKTtcbiAgdmFyIGYgPSBoIC0gaTtcbiAgdmFyIHAgPSB2ICogKDEgLSBzKTtcbiAgdmFyIHEgPSB2ICogKDEgLSBmICogcyk7XG4gIHZhciB0ID0gdiAqICgxIC0gKDEgLSBmKSAqIHMpO1xuICB2YXIgbW9kID0gaSAlIDY7XG4gIHZhciByID0gW3YsIHEsIHAsIHAsIHQsIHZdW21vZF07XG4gIHZhciBnID0gW3QsIHYsIHYsIHEsIHAsIHBdW21vZF07XG4gIHZhciBiID0gW3AsIHAsIHQsIHYsIHYsIHFdW21vZF07XG5cbiAgcmV0dXJuIHtcbiAgICByOiBNYXRoLnJvdW5kKHIgKiAyNTUpLFxuICAgIGc6IE1hdGgucm91bmQoZyAqIDI1NSksXG4gICAgYjogTWF0aC5yb3VuZChiICogMjU1KVxuICB9O1xufTtcblxudmFyIENvbG9yID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb2xvcihvcHRpb25zKSB7XG4gICAgY29sb3JfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29sb3IpO1xuXG4gICAgdGhpcy5faHVlID0gMDtcbiAgICB0aGlzLl9zYXR1cmF0aW9uID0gMTAwO1xuICAgIHRoaXMuX3ZhbHVlID0gMTAwO1xuICAgIHRoaXMuX2FscGhhID0gMTAwO1xuXG4gICAgdGhpcy5lbmFibGVBbHBoYSA9IGZhbHNlO1xuICAgIHRoaXMuZm9ybWF0ID0gJ2hleCc7XG4gICAgdGhpcy52YWx1ZSA9ICcnO1xuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBmb3IgKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uKSkge1xuICAgICAgICB0aGlzW29wdGlvbl0gPSBvcHRpb25zW29wdGlvbl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kb09uQ2hhbmdlKCk7XG4gIH1cblxuICBDb2xvci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0KHByb3AsIHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgKHR5cGVvZiBwcm9wID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogY29sb3JfdHlwZW9mKHByb3ApKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gcHJvcCkge1xuICAgICAgICBpZiAocHJvcC5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICAgIHRoaXMuc2V0KHAsIHByb3BbcF0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzWydfJyArIHByb3BdID0gdmFsdWU7XG4gICAgdGhpcy5kb09uQ2hhbmdlKCk7XG4gIH07XG5cbiAgQ29sb3IucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldChwcm9wKSB7XG4gICAgcmV0dXJuIHRoaXNbJ18nICsgcHJvcF07XG4gIH07XG5cbiAgQ29sb3IucHJvdG90eXBlLnRvUmdiID0gZnVuY3Rpb24gdG9SZ2IoKSB7XG4gICAgcmV0dXJuIGhzdjJyZ2IodGhpcy5faHVlLCB0aGlzLl9zYXR1cmF0aW9uLCB0aGlzLl92YWx1ZSk7XG4gIH07XG5cbiAgQ29sb3IucHJvdG90eXBlLmZyb21TdHJpbmcgPSBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuX2h1ZSA9IDA7XG4gICAgICB0aGlzLl9zYXR1cmF0aW9uID0gMTAwO1xuICAgICAgdGhpcy5fdmFsdWUgPSAxMDA7XG5cbiAgICAgIHRoaXMuZG9PbkNoYW5nZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBmcm9tSFNWID0gZnVuY3Rpb24gZnJvbUhTVihoLCBzLCB2KSB7XG4gICAgICBfdGhpcy5faHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMzYwLCBoKSk7XG4gICAgICBfdGhpcy5fc2F0dXJhdGlvbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgcykpO1xuICAgICAgX3RoaXMuX3ZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCB2KSk7XG5cbiAgICAgIF90aGlzLmRvT25DaGFuZ2UoKTtcbiAgICB9O1xuXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoJ2hzbCcpICE9PSAtMSkge1xuICAgICAgdmFyIHBhcnRzID0gdmFsdWUucmVwbGFjZSgvaHNsYXxoc2x8XFwofFxcKS9nbSwgJycpLnNwbGl0KC9cXHN8LC9nKS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsICE9PSAnJztcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAodmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gaW5kZXggPiAyID8gcGFyc2VGbG9hdCh2YWwpIDogcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICB0aGlzLl9hbHBoYSA9IE1hdGguZmxvb3IocGFyc2VGbG9hdChwYXJ0c1szXSkgKiAxMDApO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgdGhpcy5fYWxwaGEgPSAxMDA7XG4gICAgICB9XG4gICAgICBpZiAocGFydHMubGVuZ3RoID49IDMpIHtcbiAgICAgICAgdmFyIF9oc2wyaHN2ID0gaHNsMmhzdihwYXJ0c1swXSwgcGFydHNbMV0sIHBhcnRzWzJdKSxcbiAgICAgICAgICAgIGggPSBfaHNsMmhzdi5oLFxuICAgICAgICAgICAgcyA9IF9oc2wyaHN2LnMsXG4gICAgICAgICAgICB2ID0gX2hzbDJoc3YudjtcblxuICAgICAgICBmcm9tSFNWKGgsIHMsIHYpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaHN2JykgIT09IC0xKSB7XG4gICAgICB2YXIgX3BhcnRzID0gdmFsdWUucmVwbGFjZSgvaHN2YXxoc3Z8XFwofFxcKS9nbSwgJycpLnNwbGl0KC9cXHN8LC9nKS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsICE9PSAnJztcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAodmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gaW5kZXggPiAyID8gcGFyc2VGbG9hdCh2YWwpIDogcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKF9wYXJ0cy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgdGhpcy5fYWxwaGEgPSBNYXRoLmZsb29yKHBhcnNlRmxvYXQoX3BhcnRzWzNdKSAqIDEwMCk7XG4gICAgICB9IGVsc2UgaWYgKF9wYXJ0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgdGhpcy5fYWxwaGEgPSAxMDA7XG4gICAgICB9XG4gICAgICBpZiAoX3BhcnRzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGZyb21IU1YoX3BhcnRzWzBdLCBfcGFydHNbMV0sIF9wYXJ0c1syXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdyZ2InKSAhPT0gLTEpIHtcbiAgICAgIHZhciBfcGFydHMyID0gdmFsdWUucmVwbGFjZSgvcmdiYXxyZ2J8XFwofFxcKS9nbSwgJycpLnNwbGl0KC9cXHN8LC9nKS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsICE9PSAnJztcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAodmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gaW5kZXggPiAyID8gcGFyc2VGbG9hdCh2YWwpIDogcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKF9wYXJ0czIubGVuZ3RoID09PSA0KSB7XG4gICAgICAgIHRoaXMuX2FscGhhID0gTWF0aC5mbG9vcihwYXJzZUZsb2F0KF9wYXJ0czJbM10pICogMTAwKTtcbiAgICAgIH0gZWxzZSBpZiAoX3BhcnRzMi5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgdGhpcy5fYWxwaGEgPSAxMDA7XG4gICAgICB9XG4gICAgICBpZiAoX3BhcnRzMi5sZW5ndGggPj0gMykge1xuICAgICAgICB2YXIgX3JnYjJoc3YgPSByZ2IyaHN2KF9wYXJ0czJbMF0sIF9wYXJ0czJbMV0sIF9wYXJ0czJbMl0pLFxuICAgICAgICAgICAgX2ggPSBfcmdiMmhzdi5oLFxuICAgICAgICAgICAgX3MgPSBfcmdiMmhzdi5zLFxuICAgICAgICAgICAgX3YgPSBfcmdiMmhzdi52O1xuXG4gICAgICAgIGZyb21IU1YoX2gsIF9zLCBfdik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCcjJykgIT09IC0xKSB7XG4gICAgICB2YXIgaGV4ID0gdmFsdWUucmVwbGFjZSgnIycsICcnKS50cmltKCk7XG4gICAgICBpZiAoIS9eKD86WzAtOWEtZkEtRl17M30pezEsMn18WzAtOWEtZkEtRl17OH0kLy50ZXN0KGhleCkpIHJldHVybjtcbiAgICAgIHZhciByID0gdm9pZCAwLFxuICAgICAgICAgIGcgPSB2b2lkIDAsXG4gICAgICAgICAgYiA9IHZvaWQgMDtcblxuICAgICAgaWYgKGhleC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgciA9IHBhcnNlSGV4Q2hhbm5lbChoZXhbMF0gKyBoZXhbMF0pO1xuICAgICAgICBnID0gcGFyc2VIZXhDaGFubmVsKGhleFsxXSArIGhleFsxXSk7XG4gICAgICAgIGIgPSBwYXJzZUhleENoYW5uZWwoaGV4WzJdICsgaGV4WzJdKTtcbiAgICAgIH0gZWxzZSBpZiAoaGV4Lmxlbmd0aCA9PT0gNiB8fCBoZXgubGVuZ3RoID09PSA4KSB7XG4gICAgICAgIHIgPSBwYXJzZUhleENoYW5uZWwoaGV4LnN1YnN0cmluZygwLCAyKSk7XG4gICAgICAgIGcgPSBwYXJzZUhleENoYW5uZWwoaGV4LnN1YnN0cmluZygyLCA0KSk7XG4gICAgICAgIGIgPSBwYXJzZUhleENoYW5uZWwoaGV4LnN1YnN0cmluZyg0LCA2KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoZXgubGVuZ3RoID09PSA4KSB7XG4gICAgICAgIHRoaXMuX2FscGhhID0gTWF0aC5mbG9vcihwYXJzZUhleENoYW5uZWwoaGV4LnN1YnN0cmluZyg2KSkgLyAyNTUgKiAxMDApO1xuICAgICAgfSBlbHNlIGlmIChoZXgubGVuZ3RoID09PSAzIHx8IGhleC5sZW5ndGggPT09IDYpIHtcbiAgICAgICAgdGhpcy5fYWxwaGEgPSAxMDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBfcmdiMmhzdjIgPSByZ2IyaHN2KHIsIGcsIGIpLFxuICAgICAgICAgIF9oMiA9IF9yZ2IyaHN2Mi5oLFxuICAgICAgICAgIF9zMiA9IF9yZ2IyaHN2Mi5zLFxuICAgICAgICAgIF92MiA9IF9yZ2IyaHN2Mi52O1xuXG4gICAgICBmcm9tSFNWKF9oMiwgX3MyLCBfdjIpO1xuICAgIH1cbiAgfTtcblxuICBDb2xvci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUoY29sb3IpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoY29sb3IuX2h1ZSAtIHRoaXMuX2h1ZSkgPCAyICYmIE1hdGguYWJzKGNvbG9yLl9zYXR1cmF0aW9uIC0gdGhpcy5fc2F0dXJhdGlvbikgPCAxICYmIE1hdGguYWJzKGNvbG9yLl92YWx1ZSAtIHRoaXMuX3ZhbHVlKSA8IDEgJiYgTWF0aC5hYnMoY29sb3IuX2FscGhhIC0gdGhpcy5fYWxwaGEpIDwgMTtcbiAgfTtcblxuICBDb2xvci5wcm90b3R5cGUuZG9PbkNoYW5nZSA9IGZ1bmN0aW9uIGRvT25DaGFuZ2UoKSB7XG4gICAgdmFyIF9odWUgPSB0aGlzLl9odWUsXG4gICAgICAgIF9zYXR1cmF0aW9uID0gdGhpcy5fc2F0dXJhdGlvbixcbiAgICAgICAgX3ZhbHVlID0gdGhpcy5fdmFsdWUsXG4gICAgICAgIF9hbHBoYSA9IHRoaXMuX2FscGhhLFxuICAgICAgICBmb3JtYXQgPSB0aGlzLmZvcm1hdDtcblxuXG4gICAgaWYgKHRoaXMuZW5hYmxlQWxwaGEpIHtcbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgJ2hzbCc6XG4gICAgICAgICAgdmFyIGhzbCA9IGhzdjJoc2woX2h1ZSwgX3NhdHVyYXRpb24gLyAxMDAsIF92YWx1ZSAvIDEwMCk7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9ICdoc2xhKCcgKyBfaHVlICsgJywgJyArIE1hdGgucm91bmQoaHNsWzFdICogMTAwKSArICclLCAnICsgTWF0aC5yb3VuZChoc2xbMl0gKiAxMDApICsgJyUsICcgKyBfYWxwaGEgLyAxMDAgKyAnKSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2hzdic6XG4gICAgICAgICAgdGhpcy52YWx1ZSA9ICdoc3ZhKCcgKyBfaHVlICsgJywgJyArIE1hdGgucm91bmQoX3NhdHVyYXRpb24pICsgJyUsICcgKyBNYXRoLnJvdW5kKF92YWx1ZSkgKyAnJSwgJyArIF9hbHBoYSAvIDEwMCArICcpJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB2YXIgX2hzdjJyZ2IgPSBoc3YycmdiKF9odWUsIF9zYXR1cmF0aW9uLCBfdmFsdWUpLFxuICAgICAgICAgICAgICByID0gX2hzdjJyZ2IucixcbiAgICAgICAgICAgICAgZyA9IF9oc3YycmdiLmcsXG4gICAgICAgICAgICAgIGIgPSBfaHN2MnJnYi5iO1xuXG4gICAgICAgICAgdGhpcy52YWx1ZSA9ICdyZ2JhKCcgKyByICsgJywgJyArIGcgKyAnLCAnICsgYiArICcsICcgKyBfYWxwaGEgLyAxMDAgKyAnKSc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgJ2hzbCc6XG4gICAgICAgICAgdmFyIF9oc2wgPSBoc3YyaHNsKF9odWUsIF9zYXR1cmF0aW9uIC8gMTAwLCBfdmFsdWUgLyAxMDApO1xuICAgICAgICAgIHRoaXMudmFsdWUgPSAnaHNsKCcgKyBfaHVlICsgJywgJyArIE1hdGgucm91bmQoX2hzbFsxXSAqIDEwMCkgKyAnJSwgJyArIE1hdGgucm91bmQoX2hzbFsyXSAqIDEwMCkgKyAnJSknO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdoc3YnOlxuICAgICAgICAgIHRoaXMudmFsdWUgPSAnaHN2KCcgKyBfaHVlICsgJywgJyArIE1hdGgucm91bmQoX3NhdHVyYXRpb24pICsgJyUsICcgKyBNYXRoLnJvdW5kKF92YWx1ZSkgKyAnJSknO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZ2InOlxuICAgICAgICAgIHZhciBfaHN2MnJnYjIgPSBoc3YycmdiKF9odWUsIF9zYXR1cmF0aW9uLCBfdmFsdWUpLFxuICAgICAgICAgICAgICBfciA9IF9oc3YycmdiMi5yLFxuICAgICAgICAgICAgICBfZyA9IF9oc3YycmdiMi5nLFxuICAgICAgICAgICAgICBfYiA9IF9oc3YycmdiMi5iO1xuXG4gICAgICAgICAgdGhpcy52YWx1ZSA9ICdyZ2IoJyArIF9yICsgJywgJyArIF9nICsgJywgJyArIF9iICsgJyknO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMudmFsdWUgPSB0b0hleChoc3YycmdiKF9odWUsIF9zYXR1cmF0aW9uLCBfdmFsdWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIENvbG9yO1xufSgpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfY29sb3IgPSAoQ29sb3IpO1xuO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvcGlja2VyLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNjYwMTYyNSZcbnZhciBwaWNrZXJfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjYwMTYyNV9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJ0cmFuc2l0aW9uXCIsXG4gICAgeyBhdHRyczogeyBuYW1lOiBcImVsLXpvb20taW4tdG9wXCIgfSwgb246IHsgXCJhZnRlci1sZWF2ZVwiOiBfdm0uZG9EZXN0cm95IH0gfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBfdm0uc2hvd1BvcHBlcixcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJzaG93UG9wcGVyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNvbG9yLWRyb3Bkb3duXCJcbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtY29sb3ItZHJvcGRvd25fX21haW4td3JhcHBlclwiIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFwiaHVlLXNsaWRlclwiLCB7XG4gICAgICAgICAgICAgICAgcmVmOiBcImh1ZVwiLFxuICAgICAgICAgICAgICAgIHN0YXRpY1N0eWxlOiB7IGZsb2F0OiBcInJpZ2h0XCIgfSxcbiAgICAgICAgICAgICAgICBhdHRyczogeyBjb2xvcjogX3ZtLmNvbG9yLCB2ZXJ0aWNhbDogXCJcIiB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBfYyhcInN2LXBhbmVsXCIsIHsgcmVmOiBcInNsXCIsIGF0dHJzOiB7IGNvbG9yOiBfdm0uY29sb3IgfSB9KVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApLFxuICAgICAgICAgIF92bS5zaG93QWxwaGFcbiAgICAgICAgICAgID8gX2MoXCJhbHBoYS1zbGlkZXJcIiwgeyByZWY6IFwiYWxwaGFcIiwgYXR0cnM6IHsgY29sb3I6IF92bS5jb2xvciB9IH0pXG4gICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgIF92bS5wcmVkZWZpbmVcbiAgICAgICAgICAgID8gX2MoXCJwcmVkZWZpbmVcIiwge1xuICAgICAgICAgICAgICAgIGF0dHJzOiB7IGNvbG9yOiBfdm0uY29sb3IsIGNvbG9yczogX3ZtLnByZWRlZmluZSB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtY29sb3ItZHJvcGRvd25fX2J0bnNcIiB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLWNvbG9yLWRyb3Bkb3duX192YWx1ZVwiIH0sXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgX2MoXCJlbC1pbnB1dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IFwidmFsaWRhdGUtZXZlbnRcIjogZmFsc2UsIHNpemU6IFwibWluaVwiIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7IGJsdXI6IF92bS5oYW5kbGVDb25maXJtIH0sXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZU9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAga2V5dXA6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5oYW5kbGVDb25maXJtKCRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5jdXN0b21JbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oJCR2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uY3VzdG9tSW5wdXQgPSAkJHZcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiY3VzdG9tSW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImVsLWJ1dHRvblwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNvbG9yLWRyb3Bkb3duX19saW5rLWJ0blwiLFxuICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgc2l6ZTogXCJtaW5pXCIsIHR5cGU6IFwidGV4dFwiIH0sXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLiRlbWl0KFwiY2xlYXJcIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIF92bS5fcyhfdm0udChcImVsLmNvbG9ycGlja2VyLmNsZWFyXCIpKSArXG4gICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICBcIlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJlbC1idXR0b25cIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jb2xvci1kcm9wZG93bl9fYnRuXCIsXG4gICAgICAgICAgICAgICAgICBhdHRyczogeyBwbGFpbjogXCJcIiwgc2l6ZTogXCJtaW5pXCIgfSxcbiAgICAgICAgICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0uY29uZmlybVZhbHVlIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLnQoXCJlbC5jb2xvcnBpY2tlci5jb25maXJtXCIpKSArXG4gICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICBcIlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApXG4gICAgICAgIF0sXG4gICAgICAgIDFcbiAgICAgIClcbiAgICBdXG4gIClcbn1cbnZhciBwaWNrZXJfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjYwMTYyNV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxucGlja2VyX2Ryb3Bkb3dudnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY2MDE2MjVfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvcGlja2VyLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNjYwMTYyNSZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvc3YtcGFuZWwudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWQ4NTgzNTk2JlxudmFyIHN2X3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfZDg1ODM1OTZfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY29sb3Itc3ZwYW5lbFwiLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBfdm0uYmFja2dyb3VuZFxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1jb2xvci1zdnBhbmVsX193aGl0ZVwiIH0pLFxuICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1jb2xvci1zdnBhbmVsX19ibGFja1wiIH0pLFxuICAgICAgX2MoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jb2xvci1zdnBhbmVsX19jdXJzb3JcIixcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgdG9wOiBfdm0uY3Vyc29yVG9wICsgXCJweFwiLFxuICAgICAgICAgICAgbGVmdDogX3ZtLmN1cnNvckxlZnQgKyBcInB4XCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtfYyhcImRpdlwiKV1cbiAgICAgIClcbiAgICBdXG4gIClcbn1cbnZhciBzdl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkX2Q4NTgzNTk2X3N0YXRpY1JlbmRlckZucyA9IFtdXG5zdl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkX2Q4NTgzNTk2X3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3N2LXBhbmVsLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1kODU4MzU5NiZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2RyYWdnYWJsZS5qc1xuXG52YXIgaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkcmFnZ2FibGUgPSAoZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgaWYgKGV4dGVybmFsX3Z1ZV9kZWZhdWx0LmEucHJvdG90eXBlLiRpc1NlcnZlcikgcmV0dXJuO1xuICB2YXIgbW92ZUZuID0gZnVuY3Rpb24gbW92ZUZuKGV2ZW50KSB7XG4gICAgaWYgKG9wdGlvbnMuZHJhZykge1xuICAgICAgb3B0aW9ucy5kcmFnKGV2ZW50KTtcbiAgICB9XG4gIH07XG4gIHZhciB1cEZuID0gZnVuY3Rpb24gdXBGbihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVGbik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHVwRm4pO1xuICAgIGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSBudWxsO1xuICAgIGRvY3VtZW50Lm9uZHJhZ3N0YXJ0ID0gbnVsbDtcblxuICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgIGlmIChvcHRpb25zLmVuZCkge1xuICAgICAgb3B0aW9ucy5lbmQoZXZlbnQpO1xuICAgIH1cbiAgfTtcbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoaXNEcmFnZ2luZykgcmV0dXJuO1xuICAgIGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBkb2N1bWVudC5vbmRyYWdzdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgbW92ZUZuKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdXBGbik7XG4gICAgaXNEcmFnZ2luZyA9IHRydWU7XG5cbiAgICBpZiAob3B0aW9ucy5zdGFydCkge1xuICAgICAgb3B0aW9ucy5zdGFydChldmVudCk7XG4gICAgfVxuICB9KTtcbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3N2LXBhbmVsLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3ZfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnZWwtc2wtcGFuZWwnLFxuXG4gIHByb3BzOiB7XG4gICAgY29sb3I6IHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY29sb3JWYWx1ZTogZnVuY3Rpb24gY29sb3JWYWx1ZSgpIHtcbiAgICAgIHZhciBodWUgPSB0aGlzLmNvbG9yLmdldCgnaHVlJyk7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLmNvbG9yLmdldCgndmFsdWUnKTtcbiAgICAgIHJldHVybiB7IGh1ZTogaHVlLCB2YWx1ZTogdmFsdWUgfTtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBjb2xvclZhbHVlOiBmdW5jdGlvbiBjb2xvclZhbHVlKCkge1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgdmFyIHNhdHVyYXRpb24gPSB0aGlzLmNvbG9yLmdldCgnc2F0dXJhdGlvbicpO1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5jb2xvci5nZXQoJ3ZhbHVlJyk7XG5cbiAgICAgIHZhciBlbCA9IHRoaXMuJGVsO1xuICAgICAgdmFyIHdpZHRoID0gZWwuY2xpZW50V2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gZWwuY2xpZW50SGVpZ2h0O1xuXG5cbiAgICAgIHRoaXMuY3Vyc29yTGVmdCA9IHNhdHVyYXRpb24gKiB3aWR0aCAvIDEwMDtcbiAgICAgIHRoaXMuY3Vyc29yVG9wID0gKDEwMCAtIHZhbHVlKSAqIGhlaWdodCAvIDEwMDtcblxuICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gJ2hzbCgnICsgdGhpcy5jb2xvci5nZXQoJ2h1ZScpICsgJywgMTAwJSwgNTAlKSc7XG4gICAgfSxcbiAgICBoYW5kbGVEcmFnOiBmdW5jdGlvbiBoYW5kbGVEcmFnKGV2ZW50KSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLiRlbDtcbiAgICAgIHZhciByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIHZhciBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICAgIHZhciB0b3AgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3A7XG4gICAgICBsZWZ0ID0gTWF0aC5tYXgoMCwgbGVmdCk7XG4gICAgICBsZWZ0ID0gTWF0aC5taW4obGVmdCwgcmVjdC53aWR0aCk7XG5cbiAgICAgIHRvcCA9IE1hdGgubWF4KDAsIHRvcCk7XG4gICAgICB0b3AgPSBNYXRoLm1pbih0b3AsIHJlY3QuaGVpZ2h0KTtcblxuICAgICAgdGhpcy5jdXJzb3JMZWZ0ID0gbGVmdDtcbiAgICAgIHRoaXMuY3Vyc29yVG9wID0gdG9wO1xuICAgICAgdGhpcy5jb2xvci5zZXQoe1xuICAgICAgICBzYXR1cmF0aW9uOiBsZWZ0IC8gcmVjdC53aWR0aCAqIDEwMCxcbiAgICAgICAgdmFsdWU6IDEwMCAtIHRvcCAvIHJlY3QuaGVpZ2h0ICogMTAwXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZHJhZ2dhYmxlKHRoaXMuJGVsLCB7XG4gICAgICBkcmFnOiBmdW5jdGlvbiBkcmFnKGV2ZW50KSB7XG4gICAgICAgIF90aGlzLmhhbmRsZURyYWcoZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIGVuZDogZnVuY3Rpb24gZW5kKGV2ZW50KSB7XG4gICAgICAgIF90aGlzLmhhbmRsZURyYWcoZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3Vyc29yVG9wOiAwLFxuICAgICAgY3Vyc29yTGVmdDogMCxcbiAgICAgIGJhY2tncm91bmQ6ICdoc2woMCwgMTAwJSwgNTAlKSdcbiAgICB9O1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3N2LXBhbmVsLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjb21wb25lbnRzX3N2X3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHN2X3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9zdi1wYW5lbC52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBzdl9wYW5lbF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIGNvbXBvbmVudHNfc3ZfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHN2X3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfZDg1ODM1OTZfcmVuZGVyLFxuICBzdl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkX2Q4NTgzNTk2X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgc3ZfcGFuZWxfYXBpOyB9XG5zdl9wYW5lbF9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9zdi1wYW5lbC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3ZfcGFuZWwgPSAoc3ZfcGFuZWxfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvaHVlLXNsaWRlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NWNkYzQzYjEmXG52YXIgaHVlX3NsaWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVjZGM0M2IxX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNvbG9yLWh1ZS1zbGlkZXJcIixcbiAgICAgIGNsYXNzOiB7IFwiaXMtdmVydGljYWxcIjogX3ZtLnZlcnRpY2FsIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBcImJhclwiLFxuICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jb2xvci1odWUtc2xpZGVyX19iYXJcIixcbiAgICAgICAgb246IHsgY2xpY2s6IF92bS5oYW5kbGVDbGljayB9XG4gICAgICB9KSxcbiAgICAgIF9jKFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBcInRodW1iXCIsXG4gICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNvbG9yLWh1ZS1zbGlkZXJfX3RodW1iXCIsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgbGVmdDogX3ZtLnRodW1iTGVmdCArIFwicHhcIixcbiAgICAgICAgICB0b3A6IF92bS50aHVtYlRvcCArIFwicHhcIlxuICAgICAgICB9XG4gICAgICB9KVxuICAgIF1cbiAgKVxufVxudmFyIGh1ZV9zbGlkZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF81Y2RjNDNiMV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuaHVlX3NsaWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVjZGM0M2IxX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL2h1ZS1zbGlkZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTVjZGM0M2IxJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvaHVlLXNsaWRlci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaHVlX3NsaWRlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdlbC1jb2xvci1odWUtc2xpZGVyJyxcblxuICBwcm9wczoge1xuICAgIGNvbG9yOiB7XG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG5cbiAgICB2ZXJ0aWNhbDogQm9vbGVhblxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRodW1iTGVmdDogMCxcbiAgICAgIHRodW1iVG9wOiAwXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaHVlVmFsdWU6IGZ1bmN0aW9uIGh1ZVZhbHVlKCkge1xuICAgICAgdmFyIGh1ZSA9IHRoaXMuY29sb3IuZ2V0KCdodWUnKTtcbiAgICAgIHJldHVybiBodWU7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgaHVlVmFsdWU6IGZ1bmN0aW9uIGh1ZVZhbHVlKCkge1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgICAgdmFyIHRodW1iID0gdGhpcy4kcmVmcy50aHVtYjtcbiAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgIGlmICh0YXJnZXQgIT09IHRodW1iKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRHJhZyhldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVEcmFnOiBmdW5jdGlvbiBoYW5kbGVEcmFnKGV2ZW50KSB7XG4gICAgICB2YXIgcmVjdCA9IHRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHRodW1iID0gdGhpcy4kcmVmcy50aHVtYjtcblxuICAgICAgdmFyIGh1ZSA9IHZvaWQgMDtcblxuICAgICAgaWYgKCF0aGlzLnZlcnRpY2FsKSB7XG4gICAgICAgIHZhciBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICAgICAgbGVmdCA9IE1hdGgubWluKGxlZnQsIHJlY3Qud2lkdGggLSB0aHVtYi5vZmZzZXRXaWR0aCAvIDIpO1xuICAgICAgICBsZWZ0ID0gTWF0aC5tYXgodGh1bWIub2Zmc2V0V2lkdGggLyAyLCBsZWZ0KTtcblxuICAgICAgICBodWUgPSBNYXRoLnJvdW5kKChsZWZ0IC0gdGh1bWIub2Zmc2V0V2lkdGggLyAyKSAvIChyZWN0LndpZHRoIC0gdGh1bWIub2Zmc2V0V2lkdGgpICogMzYwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0b3AgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3A7XG4gICAgICAgIHRvcCA9IE1hdGgubWluKHRvcCwgcmVjdC5oZWlnaHQgLSB0aHVtYi5vZmZzZXRIZWlnaHQgLyAyKTtcbiAgICAgICAgdG9wID0gTWF0aC5tYXgodGh1bWIub2Zmc2V0SGVpZ2h0IC8gMiwgdG9wKTtcblxuICAgICAgICBodWUgPSBNYXRoLnJvdW5kKCh0b3AgLSB0aHVtYi5vZmZzZXRIZWlnaHQgLyAyKSAvIChyZWN0LmhlaWdodCAtIHRodW1iLm9mZnNldEhlaWdodCkgKiAzNjApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbG9yLnNldCgnaHVlJywgaHVlKTtcbiAgICB9LFxuICAgIGdldFRodW1iTGVmdDogZnVuY3Rpb24gZ2V0VGh1bWJMZWZ0KCkge1xuICAgICAgaWYgKHRoaXMudmVydGljYWwpIHJldHVybiAwO1xuICAgICAgdmFyIGVsID0gdGhpcy4kZWw7XG4gICAgICB2YXIgaHVlID0gdGhpcy5jb2xvci5nZXQoJ2h1ZScpO1xuXG4gICAgICBpZiAoIWVsKSByZXR1cm4gMDtcbiAgICAgIHZhciB0aHVtYiA9IHRoaXMuJHJlZnMudGh1bWI7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChodWUgKiAoZWwub2Zmc2V0V2lkdGggLSB0aHVtYi5vZmZzZXRXaWR0aCAvIDIpIC8gMzYwKTtcbiAgICB9LFxuICAgIGdldFRodW1iVG9wOiBmdW5jdGlvbiBnZXRUaHVtYlRvcCgpIHtcbiAgICAgIGlmICghdGhpcy52ZXJ0aWNhbCkgcmV0dXJuIDA7XG4gICAgICB2YXIgZWwgPSB0aGlzLiRlbDtcbiAgICAgIHZhciBodWUgPSB0aGlzLmNvbG9yLmdldCgnaHVlJyk7XG5cbiAgICAgIGlmICghZWwpIHJldHVybiAwO1xuICAgICAgdmFyIHRodW1iID0gdGhpcy4kcmVmcy50aHVtYjtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKGh1ZSAqIChlbC5vZmZzZXRIZWlnaHQgLSB0aHVtYi5vZmZzZXRIZWlnaHQgLyAyKSAvIDM2MCk7XG4gICAgfSxcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHRoaXMudGh1bWJMZWZ0ID0gdGhpcy5nZXRUaHVtYkxlZnQoKTtcbiAgICAgIHRoaXMudGh1bWJUb3AgPSB0aGlzLmdldFRodW1iVG9wKCk7XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBfJHJlZnMgPSB0aGlzLiRyZWZzLFxuICAgICAgICBiYXIgPSBfJHJlZnMuYmFyLFxuICAgICAgICB0aHVtYiA9IF8kcmVmcy50aHVtYjtcblxuXG4gICAgdmFyIGRyYWdDb25maWcgPSB7XG4gICAgICBkcmFnOiBmdW5jdGlvbiBkcmFnKGV2ZW50KSB7XG4gICAgICAgIF90aGlzLmhhbmRsZURyYWcoZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIGVuZDogZnVuY3Rpb24gZW5kKGV2ZW50KSB7XG4gICAgICAgIF90aGlzLmhhbmRsZURyYWcoZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBkcmFnZ2FibGUoYmFyLCBkcmFnQ29uZmlnKTtcbiAgICBkcmFnZ2FibGUodGh1bWIsIGRyYWdDb25maWcpO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvaHVlLXNsaWRlci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY29tcG9uZW50c19odWVfc2xpZGVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGh1ZV9zbGlkZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL2h1ZS1zbGlkZXIudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgaHVlX3NsaWRlcl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIGNvbXBvbmVudHNfaHVlX3NsaWRlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgaHVlX3NsaWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVjZGM0M2IxX3JlbmRlcixcbiAgaHVlX3NsaWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVjZGM0M2IxX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgaHVlX3NsaWRlcl9hcGk7IH1cbmh1ZV9zbGlkZXJfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvaHVlLXNsaWRlci52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaHVlX3NsaWRlciA9IChodWVfc2xpZGVyX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL2FscGhhLXNsaWRlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDY4YzY2Y2ImXG52YXIgYWxwaGFfc2xpZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY4YzY2Y2JfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY29sb3ItYWxwaGEtc2xpZGVyXCIsXG4gICAgICBjbGFzczogeyBcImlzLXZlcnRpY2FsXCI6IF92bS52ZXJ0aWNhbCB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcImRpdlwiLCB7XG4gICAgICAgIHJlZjogXCJiYXJcIixcbiAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY29sb3ItYWxwaGEtc2xpZGVyX19iYXJcIixcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBfdm0uYmFja2dyb3VuZFxuICAgICAgICB9LFxuICAgICAgICBvbjogeyBjbGljazogX3ZtLmhhbmRsZUNsaWNrIH1cbiAgICAgIH0pLFxuICAgICAgX2MoXCJkaXZcIiwge1xuICAgICAgICByZWY6IFwidGh1bWJcIixcbiAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY29sb3ItYWxwaGEtc2xpZGVyX190aHVtYlwiLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGxlZnQ6IF92bS50aHVtYkxlZnQgKyBcInB4XCIsXG4gICAgICAgICAgdG9wOiBfdm0udGh1bWJUb3AgKyBcInB4XCJcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICBdXG4gIClcbn1cbnZhciBhbHBoYV9zbGlkZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjhjNjZjYl9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuYWxwaGFfc2xpZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY4YzY2Y2JfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvYWxwaGEtc2xpZGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNjhjNjZjYiZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL2FscGhhLXNsaWRlci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYWxwaGFfc2xpZGVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ2VsLWNvbG9yLWFscGhhLXNsaWRlcicsXG5cbiAgcHJvcHM6IHtcbiAgICBjb2xvcjoge1xuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIHZlcnRpY2FsOiBCb29sZWFuXG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICAnY29sb3IuX2FscGhhJzogZnVuY3Rpb24gY29sb3JfYWxwaGEoKSB7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH0sXG4gICAgJ2NvbG9yLnZhbHVlJzogZnVuY3Rpb24gY29sb3JWYWx1ZSgpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVDbGljazogZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICAgIHZhciB0aHVtYiA9IHRoaXMuJHJlZnMudGh1bWI7XG4gICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICBpZiAodGFyZ2V0ICE9PSB0aHVtYikge1xuICAgICAgICB0aGlzLmhhbmRsZURyYWcoZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlRHJhZzogZnVuY3Rpb24gaGFuZGxlRHJhZyhldmVudCkge1xuICAgICAgdmFyIHJlY3QgPSB0aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHZhciB0aHVtYiA9IHRoaXMuJHJlZnMudGh1bWI7XG5cblxuICAgICAgaWYgKCF0aGlzLnZlcnRpY2FsKSB7XG4gICAgICAgIHZhciBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICAgICAgbGVmdCA9IE1hdGgubWF4KHRodW1iLm9mZnNldFdpZHRoIC8gMiwgbGVmdCk7XG4gICAgICAgIGxlZnQgPSBNYXRoLm1pbihsZWZ0LCByZWN0LndpZHRoIC0gdGh1bWIub2Zmc2V0V2lkdGggLyAyKTtcblxuICAgICAgICB0aGlzLmNvbG9yLnNldCgnYWxwaGEnLCBNYXRoLnJvdW5kKChsZWZ0IC0gdGh1bWIub2Zmc2V0V2lkdGggLyAyKSAvIChyZWN0LndpZHRoIC0gdGh1bWIub2Zmc2V0V2lkdGgpICogMTAwKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdG9wID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wO1xuICAgICAgICB0b3AgPSBNYXRoLm1heCh0aHVtYi5vZmZzZXRIZWlnaHQgLyAyLCB0b3ApO1xuICAgICAgICB0b3AgPSBNYXRoLm1pbih0b3AsIHJlY3QuaGVpZ2h0IC0gdGh1bWIub2Zmc2V0SGVpZ2h0IC8gMik7XG5cbiAgICAgICAgdGhpcy5jb2xvci5zZXQoJ2FscGhhJywgTWF0aC5yb3VuZCgodG9wIC0gdGh1bWIub2Zmc2V0SGVpZ2h0IC8gMikgLyAocmVjdC5oZWlnaHQgLSB0aHVtYi5vZmZzZXRIZWlnaHQpICogMTAwKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRUaHVtYkxlZnQ6IGZ1bmN0aW9uIGdldFRodW1iTGVmdCgpIHtcbiAgICAgIGlmICh0aGlzLnZlcnRpY2FsKSByZXR1cm4gMDtcbiAgICAgIHZhciBlbCA9IHRoaXMuJGVsO1xuICAgICAgdmFyIGFscGhhID0gdGhpcy5jb2xvci5fYWxwaGE7XG5cbiAgICAgIGlmICghZWwpIHJldHVybiAwO1xuICAgICAgdmFyIHRodW1iID0gdGhpcy4kcmVmcy50aHVtYjtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKGFscGhhICogKGVsLm9mZnNldFdpZHRoIC0gdGh1bWIub2Zmc2V0V2lkdGggLyAyKSAvIDEwMCk7XG4gICAgfSxcbiAgICBnZXRUaHVtYlRvcDogZnVuY3Rpb24gZ2V0VGh1bWJUb3AoKSB7XG4gICAgICBpZiAoIXRoaXMudmVydGljYWwpIHJldHVybiAwO1xuICAgICAgdmFyIGVsID0gdGhpcy4kZWw7XG4gICAgICB2YXIgYWxwaGEgPSB0aGlzLmNvbG9yLl9hbHBoYTtcblxuICAgICAgaWYgKCFlbCkgcmV0dXJuIDA7XG4gICAgICB2YXIgdGh1bWIgPSB0aGlzLiRyZWZzLnRodW1iO1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQoYWxwaGEgKiAoZWwub2Zmc2V0SGVpZ2h0IC0gdGh1bWIub2Zmc2V0SGVpZ2h0IC8gMikgLyAxMDApO1xuICAgIH0sXG4gICAgZ2V0QmFja2dyb3VuZDogZnVuY3Rpb24gZ2V0QmFja2dyb3VuZCgpIHtcbiAgICAgIGlmICh0aGlzLmNvbG9yICYmIHRoaXMuY29sb3IudmFsdWUpIHtcbiAgICAgICAgdmFyIF9jb2xvciR0b1JnYiA9IHRoaXMuY29sb3IudG9SZ2IoKSxcbiAgICAgICAgICAgIHIgPSBfY29sb3IkdG9SZ2IucixcbiAgICAgICAgICAgIGcgPSBfY29sb3IkdG9SZ2IuZyxcbiAgICAgICAgICAgIGIgPSBfY29sb3IkdG9SZ2IuYjtcblxuICAgICAgICByZXR1cm4gJ2xpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgnICsgciArICcsICcgKyBnICsgJywgJyArIGIgKyAnLCAwKSAwJSwgcmdiYSgnICsgciArICcsICcgKyBnICsgJywgJyArIGIgKyAnLCAxKSAxMDAlKSc7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgdGhpcy50aHVtYkxlZnQgPSB0aGlzLmdldFRodW1iTGVmdCgpO1xuICAgICAgdGhpcy50aHVtYlRvcCA9IHRoaXMuZ2V0VGh1bWJUb3AoKTtcbiAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMuZ2V0QmFja2dyb3VuZCgpO1xuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0aHVtYkxlZnQ6IDAsXG4gICAgICB0aHVtYlRvcDogMCxcbiAgICAgIGJhY2tncm91bmQ6IG51bGxcbiAgICB9O1xuICB9LFxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgXyRyZWZzID0gdGhpcy4kcmVmcyxcbiAgICAgICAgYmFyID0gXyRyZWZzLmJhcixcbiAgICAgICAgdGh1bWIgPSBfJHJlZnMudGh1bWI7XG5cblxuICAgIHZhciBkcmFnQ29uZmlnID0ge1xuICAgICAgZHJhZzogZnVuY3Rpb24gZHJhZyhldmVudCkge1xuICAgICAgICBfdGhpcy5oYW5kbGVEcmFnKGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICBlbmQ6IGZ1bmN0aW9uIGVuZChldmVudCkge1xuICAgICAgICBfdGhpcy5oYW5kbGVEcmFnKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZHJhZ2dhYmxlKGJhciwgZHJhZ0NvbmZpZyk7XG4gICAgZHJhZ2dhYmxlKHRodW1iLCBkcmFnQ29uZmlnKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL2FscGhhLXNsaWRlci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY29tcG9uZW50c19hbHBoYV9zbGlkZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoYWxwaGFfc2xpZGVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9hbHBoYS1zbGlkZXIudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgYWxwaGFfc2xpZGVyX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgY29tcG9uZW50c19hbHBoYV9zbGlkZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGFscGhhX3NsaWRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2OGM2NmNiX3JlbmRlcixcbiAgYWxwaGFfc2xpZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY4YzY2Y2Jfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhbHBoYV9zbGlkZXJfYXBpOyB9XG5hbHBoYV9zbGlkZXJfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvYWxwaGEtc2xpZGVyLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhbHBoYV9zbGlkZXIgPSAoYWxwaGFfc2xpZGVyX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3ByZWRlZmluZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDZlMDMwOTMmXG52YXIgcHJlZGVmaW5ldnVlX3R5cGVfdGVtcGxhdGVfaWRfMDZlMDMwOTNfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtY29sb3ItcHJlZGVmaW5lXCIgfSwgW1xuICAgIF9jKFxuICAgICAgXCJkaXZcIixcbiAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtY29sb3ItcHJlZGVmaW5lX19jb2xvcnNcIiB9LFxuICAgICAgX3ZtLl9sKF92bS5yZ2JhQ29sb3JzLCBmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IF92bS5jb2xvcnNbaW5kZXhdLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY29sb3ItcHJlZGVmaW5lX19jb2xvci1zZWxlY3RvclwiLFxuICAgICAgICAgICAgY2xhc3M6IHsgc2VsZWN0ZWQ6IGl0ZW0uc2VsZWN0ZWQsIFwiaXMtYWxwaGFcIjogaXRlbS5fYWxwaGEgPCAxMDAgfSxcbiAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBfdm0uaGFuZGxlU2VsZWN0KGluZGV4KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbX2MoXCJkaXZcIiwgeyBzdHlsZTogeyBcImJhY2tncm91bmQtY29sb3JcIjogaXRlbS52YWx1ZSB9IH0pXVxuICAgICAgICApXG4gICAgICB9KSxcbiAgICAgIDBcbiAgICApXG4gIF0pXG59XG52YXIgcHJlZGVmaW5ldnVlX3R5cGVfdGVtcGxhdGVfaWRfMDZlMDMwOTNfc3RhdGljUmVuZGVyRm5zID0gW11cbnByZWRlZmluZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ZTAzMDkzX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3ByZWRlZmluZS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDZlMDMwOTMmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9wcmVkZWZpbmUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcHJlZGVmaW5ldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgcHJvcHM6IHtcbiAgICBjb2xvcnM6IHsgdHlwZTogQXJyYXksIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgY29sb3I6IHsgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZ2JhQ29sb3JzOiB0aGlzLnBhcnNlQ29sb3JzKHRoaXMuY29sb3JzLCB0aGlzLmNvbG9yKVxuICAgIH07XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZVNlbGVjdDogZnVuY3Rpb24gaGFuZGxlU2VsZWN0KGluZGV4KSB7XG4gICAgICB0aGlzLmNvbG9yLmZyb21TdHJpbmcodGhpcy5jb2xvcnNbaW5kZXhdKTtcbiAgICB9LFxuICAgIHBhcnNlQ29sb3JzOiBmdW5jdGlvbiBwYXJzZUNvbG9ycyhjb2xvcnMsIGNvbG9yKSB7XG4gICAgICByZXR1cm4gY29sb3JzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGMgPSBuZXcgc3JjX2NvbG9yKCk7XG4gICAgICAgIGMuZW5hYmxlQWxwaGEgPSB0cnVlO1xuICAgICAgICBjLmZvcm1hdCA9ICdyZ2JhJztcbiAgICAgICAgYy5mcm9tU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgYy5zZWxlY3RlZCA9IGMudmFsdWUgPT09IGNvbG9yLnZhbHVlO1xuICAgICAgICByZXR1cm4gYztcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICAnJHBhcmVudC5jdXJyZW50Q29sb3InOiBmdW5jdGlvbiAkcGFyZW50Q3VycmVudENvbG9yKHZhbCkge1xuICAgICAgdmFyIGNvbG9yID0gbmV3IHNyY19jb2xvcigpO1xuICAgICAgY29sb3IuZnJvbVN0cmluZyh2YWwpO1xuXG4gICAgICB0aGlzLnJnYmFDb2xvcnMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpdGVtLnNlbGVjdGVkID0gY29sb3IuY29tcGFyZShpdGVtKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY29sb3JzOiBmdW5jdGlvbiBjb2xvcnMobmV3VmFsKSB7XG4gICAgICB0aGlzLnJnYmFDb2xvcnMgPSB0aGlzLnBhcnNlQ29sb3JzKG5ld1ZhbCwgdGhpcy5jb2xvcik7XG4gICAgfSxcbiAgICBjb2xvcjogZnVuY3Rpb24gY29sb3IobmV3VmFsKSB7XG4gICAgICB0aGlzLnJnYmFDb2xvcnMgPSB0aGlzLnBhcnNlQ29sb3JzKHRoaXMuY29sb3JzLCBuZXdWYWwpO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9wcmVkZWZpbmUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNvbXBvbmVudHNfcHJlZGVmaW5ldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHByZWRlZmluZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvcHJlZGVmaW5lLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHByZWRlZmluZV9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIGNvbXBvbmVudHNfcHJlZGVmaW5ldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBwcmVkZWZpbmV2dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNmUwMzA5M19yZW5kZXIsXG4gIHByZWRlZmluZXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ZTAzMDkzX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgcHJlZGVmaW5lX2FwaTsgfVxucHJlZGVmaW5lX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3ByZWRlZmluZS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcHJlZGVmaW5lID0gKHByZWRlZmluZV9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvcGlja2VyLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBpY2tlcl9kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdlbC1jb2xvci1waWNrZXItZHJvcGRvd24nLFxuXG4gIG1peGluczogW3Z1ZV9wb3BwZXJfZGVmYXVsdC5hLCBsb2NhbGVfZGVmYXVsdC5hXSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgU3ZQYW5lbDogc3ZfcGFuZWwsXG4gICAgSHVlU2xpZGVyOiBodWVfc2xpZGVyLFxuICAgIEFscGhhU2xpZGVyOiBhbHBoYV9zbGlkZXIsXG4gICAgRWxJbnB1dDogaW5wdXRfZGVmYXVsdC5hLFxuICAgIEVsQnV0dG9uOiBidXR0b25fZGVmYXVsdC5hLFxuICAgIFByZWRlZmluZTogcHJlZGVmaW5lXG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBjb2xvcjoge1xuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIHNob3dBbHBoYTogQm9vbGVhbixcbiAgICBwcmVkZWZpbmU6IEFycmF5XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VzdG9tSW5wdXQ6ICcnXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY3VycmVudENvbG9yOiBmdW5jdGlvbiBjdXJyZW50Q29sb3IoKSB7XG4gICAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuICAgICAgcmV0dXJuICFwYXJlbnQudmFsdWUgJiYgIXBhcmVudC5zaG93UGFuZWxDb2xvciA/ICcnIDogcGFyZW50LmNvbG9yLnZhbHVlO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgY29uZmlybVZhbHVlOiBmdW5jdGlvbiBjb25maXJtVmFsdWUoKSB7XG4gICAgICB0aGlzLiRlbWl0KCdwaWNrJyk7XG4gICAgfSxcbiAgICBoYW5kbGVDb25maXJtOiBmdW5jdGlvbiBoYW5kbGVDb25maXJtKCkge1xuICAgICAgdGhpcy5jb2xvci5mcm9tU3RyaW5nKHRoaXMuY3VzdG9tSW5wdXQpO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHRoaXMuJHBhcmVudC5wb3BwZXJFbG0gPSB0aGlzLnBvcHBlckVsbSA9IHRoaXMuJGVsO1xuICAgIHRoaXMucmVmZXJlbmNlRWxtID0gdGhpcy4kcGFyZW50LiRlbDtcbiAgfSxcblxuXG4gIHdhdGNoOiB7XG4gICAgc2hvd1BvcHBlcjogZnVuY3Rpb24gc2hvd1BvcHBlcih2YWwpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh2YWwgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfJHJlZnMgPSBfdGhpcy4kcmVmcyxcbiAgICAgICAgICAgICAgc2wgPSBfJHJlZnMuc2wsXG4gICAgICAgICAgICAgIGh1ZSA9IF8kcmVmcy5odWUsXG4gICAgICAgICAgICAgIGFscGhhID0gXyRyZWZzLmFscGhhO1xuXG4gICAgICAgICAgc2wgJiYgc2wudXBkYXRlKCk7XG4gICAgICAgICAgaHVlICYmIGh1ZS51cGRhdGUoKTtcbiAgICAgICAgICBhbHBoYSAmJiBhbHBoYS51cGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgY3VycmVudENvbG9yOiB7XG4gICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKHZhbCkge1xuICAgICAgICB0aGlzLmN1c3RvbUlucHV0ID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvY29tcG9uZW50cy9waWNrZXItZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNvbXBvbmVudHNfcGlja2VyX2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHBpY2tlcl9kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL2NvbXBvbmVudHMvcGlja2VyLWRyb3Bkb3duLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHBpY2tlcl9kcm9wZG93bl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIGNvbXBvbmVudHNfcGlja2VyX2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBwaWNrZXJfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjYwMTYyNV9yZW5kZXIsXG4gIHBpY2tlcl9kcm9wZG93bnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2NjAxNjI1X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgcGlja2VyX2Ryb3Bkb3duX2FwaTsgfVxucGlja2VyX2Ryb3Bkb3duX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3BpY2tlci1kcm9wZG93bi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGlja2VyX2Ryb3Bkb3duID0gKHBpY2tlcl9kcm9wZG93bl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjb2xvcl9waWNrZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxDb2xvclBpY2tlcicsXG5cbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmFdLFxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IFN0cmluZyxcbiAgICBzaG93QWxwaGE6IEJvb2xlYW4sXG4gICAgY29sb3JGb3JtYXQ6IFN0cmluZyxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgcG9wcGVyQ2xhc3M6IFN0cmluZyxcbiAgICBwcmVkZWZpbmU6IEFycmF5XG4gIH0sXG5cbiAgaW5qZWN0OiB7XG4gICAgZWxGb3JtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgZWxGb3JtSXRlbToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9XG4gIH0sXG5cbiAgZGlyZWN0aXZlczogeyBDbGlja291dHNpZGU6IGNsaWNrb3V0c2lkZV9kZWZhdWx0LmEgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGRpc3BsYXllZENvbG9yOiBmdW5jdGlvbiBkaXNwbGF5ZWRDb2xvcigpIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZSAmJiAhdGhpcy5zaG93UGFuZWxDb2xvcikge1xuICAgICAgICByZXR1cm4gJ3RyYW5zcGFyZW50JztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheWVkUmdiKHRoaXMuY29sb3IsIHRoaXMuc2hvd0FscGhhKTtcbiAgICB9LFxuICAgIF9lbEZvcm1JdGVtU2l6ZTogZnVuY3Rpb24gX2VsRm9ybUl0ZW1TaXplKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmVsRm9ybUl0ZW0gfHwge30pLmVsRm9ybUl0ZW1TaXplO1xuICAgIH0sXG4gICAgY29sb3JTaXplOiBmdW5jdGlvbiBjb2xvclNpemUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaXplIHx8IHRoaXMuX2VsRm9ybUl0ZW1TaXplIHx8ICh0aGlzLiRFTEVNRU5UIHx8IHt9KS5zaXplO1xuICAgIH0sXG4gICAgY29sb3JEaXNhYmxlZDogZnVuY3Rpb24gY29sb3JEaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8ICh0aGlzLmVsRm9ybSB8fCB7fSkuZGlzYWJsZWQ7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgdGhpcy5zaG93UGFuZWxDb2xvciA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh2YWwgJiYgdmFsICE9PSB0aGlzLmNvbG9yLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuY29sb3IuZnJvbVN0cmluZyh2YWwpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb2xvcjoge1xuICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuc2hvd1BhbmVsQ29sb3IgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGlzcGxheWVkQ29sb3I6IGZ1bmN0aW9uIGRpc3BsYXllZENvbG9yKHZhbCkge1xuICAgICAgaWYgKCF0aGlzLnNob3dQaWNrZXIpIHJldHVybjtcbiAgICAgIHZhciBjdXJyZW50VmFsdWVDb2xvciA9IG5ldyBzcmNfY29sb3Ioe1xuICAgICAgICBlbmFibGVBbHBoYTogdGhpcy5zaG93QWxwaGEsXG4gICAgICAgIGZvcm1hdDogdGhpcy5jb2xvckZvcm1hdFxuICAgICAgfSk7XG4gICAgICBjdXJyZW50VmFsdWVDb2xvci5mcm9tU3RyaW5nKHRoaXMudmFsdWUpO1xuXG4gICAgICB2YXIgY3VycmVudFZhbHVlQ29sb3JSZ2IgPSB0aGlzLmRpc3BsYXllZFJnYihjdXJyZW50VmFsdWVDb2xvciwgdGhpcy5zaG93QWxwaGEpO1xuICAgICAgaWYgKHZhbCAhPT0gY3VycmVudFZhbHVlQ29sb3JSZ2IpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgnYWN0aXZlLWNoYW5nZScsIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVUcmlnZ2VyOiBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VyKCkge1xuICAgICAgaWYgKHRoaXMuY29sb3JEaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5zaG93UGlja2VyID0gIXRoaXMuc2hvd1BpY2tlcjtcbiAgICB9LFxuICAgIGNvbmZpcm1WYWx1ZTogZnVuY3Rpb24gY29uZmlybVZhbHVlKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5jb2xvci52YWx1ZTtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpO1xuICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpO1xuICAgICAgdGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsICdlbC5mb3JtLmNoYW5nZScsIHZhbHVlKTtcbiAgICAgIHRoaXMuc2hvd1BpY2tlciA9IGZhbHNlO1xuICAgIH0sXG4gICAgY2xlYXJWYWx1ZTogZnVuY3Rpb24gY2xlYXJWYWx1ZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgbnVsbCk7XG4gICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBudWxsKTtcbiAgICAgIGlmICh0aGlzLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCAnZWwuZm9ybS5jaGFuZ2UnLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hvd1BhbmVsQ29sb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd1BpY2tlciA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNldENvbG9yKCk7XG4gICAgfSxcbiAgICBoaWRlOiBmdW5jdGlvbiBoaWRlKCkge1xuICAgICAgdGhpcy5zaG93UGlja2VyID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2V0Q29sb3IoKTtcbiAgICB9LFxuICAgIHJlc2V0Q29sb3I6IGZ1bmN0aW9uIHJlc2V0Q29sb3IoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoXykge1xuICAgICAgICBpZiAoX3RoaXMudmFsdWUpIHtcbiAgICAgICAgICBfdGhpcy5jb2xvci5mcm9tU3RyaW5nKF90aGlzLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpcy5zaG93UGFuZWxDb2xvciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGRpc3BsYXllZFJnYjogZnVuY3Rpb24gZGlzcGxheWVkUmdiKGNvbG9yLCBzaG93QWxwaGEpIHtcbiAgICAgIGlmICghKGNvbG9yIGluc3RhbmNlb2Ygc3JjX2NvbG9yKSkge1xuICAgICAgICB0aHJvdyBFcnJvcignY29sb3Igc2hvdWxkIGJlIGluc3RhbmNlIG9mIENvbG9yIENsYXNzJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBfY29sb3IkdG9SZ2IgPSBjb2xvci50b1JnYigpLFxuICAgICAgICAgIHIgPSBfY29sb3IkdG9SZ2IucixcbiAgICAgICAgICBnID0gX2NvbG9yJHRvUmdiLmcsXG4gICAgICAgICAgYiA9IF9jb2xvciR0b1JnYi5iO1xuXG4gICAgICByZXR1cm4gc2hvd0FscGhhID8gJ3JnYmEoJyArIHIgKyAnLCAnICsgZyArICcsICcgKyBiICsgJywgJyArIGNvbG9yLmdldCgnYWxwaGEnKSAvIDEwMCArICcpJyA6ICdyZ2IoJyArIHIgKyAnLCAnICsgZyArICcsICcgKyBiICsgJyknO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmNvbG9yLmZyb21TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnBvcHBlckVsbSA9IHRoaXMuJHJlZnMuZHJvcGRvd24uJGVsO1xuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHZhciBjb2xvciA9IG5ldyBzcmNfY29sb3Ioe1xuICAgICAgZW5hYmxlQWxwaGE6IHRoaXMuc2hvd0FscGhhLFxuICAgICAgZm9ybWF0OiB0aGlzLmNvbG9yRm9ybWF0XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IGNvbG9yLFxuICAgICAgc2hvd1BpY2tlcjogZmFsc2UsXG4gICAgICBzaG93UGFuZWxDb2xvcjogZmFsc2VcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcG9uZW50czoge1xuICAgIFBpY2tlckRyb3Bkb3duOiBwaWNrZXJfZHJvcGRvd25cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbG9yLXBpY2tlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfY29sb3JfcGlja2VyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGNvbG9yX3BpY2tlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29sb3JfcGlja2VyX3NyY19tYWluX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfY29sb3JfcGlja2VyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTVjOGFkZTdfcmVuZGVyLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTVjOGFkZTdfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBjb2xvcl9waWNrZXJfc3JjX21haW5fYXBpOyB9XG5jb2xvcl9waWNrZXJfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9jb2xvci1waWNrZXIvc3JjL21haW4udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNvbG9yX3BpY2tlcl9zcmNfbWFpbiA9IChjb2xvcl9waWNrZXJfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jb2xvci1waWNrZXIvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY29sb3JfcGlja2VyX3NyY19tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoY29sb3JfcGlja2VyX3NyY19tYWluLm5hbWUsIGNvbG9yX3BpY2tlcl9zcmNfbWFpbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjb2xvcl9waWNrZXIgPSAoY29sb3JfcGlja2VyX3NyY19tYWluKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdHJhbnNmZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTVjNjU0ZGQ4JlxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81YzY1NGRkOF9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7IHN0YXRpY0NsYXNzOiBcImVsLXRyYW5zZmVyXCIgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJ0cmFuc2Zlci1wYW5lbFwiLFxuICAgICAgICBfdm0uX2IoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVmOiBcImxlZnRQYW5lbFwiLFxuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgZGF0YTogX3ZtLnNvdXJjZURhdGEsXG4gICAgICAgICAgICAgIHRpdGxlOiBfdm0udGl0bGVzWzBdIHx8IF92bS50KFwiZWwudHJhbnNmZXIudGl0bGVzLjBcIiksXG4gICAgICAgICAgICAgIFwiZGVmYXVsdC1jaGVja2VkXCI6IF92bS5sZWZ0RGVmYXVsdENoZWNrZWQsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOlxuICAgICAgICAgICAgICAgIF92bS5maWx0ZXJQbGFjZWhvbGRlciB8fCBfdm0udChcImVsLnRyYW5zZmVyLmZpbHRlclBsYWNlaG9sZGVyXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb246IHsgXCJjaGVja2VkLWNoYW5nZVwiOiBfdm0ub25Tb3VyY2VDaGVja2VkQ2hhbmdlIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwidHJhbnNmZXItcGFuZWxcIixcbiAgICAgICAgICBfdm0uJHByb3BzLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICksXG4gICAgICAgIFtfdm0uX3QoXCJsZWZ0LWZvb3RlclwiKV0sXG4gICAgICAgIDJcbiAgICAgICksXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC10cmFuc2Zlcl9fYnV0dG9uc1wiIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwiZWwtYnV0dG9uXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICAgICAgXCJlbC10cmFuc2Zlcl9fYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgX3ZtLmhhc0J1dHRvblRleHRzID8gXCJpcy13aXRoLXRleHRzXCIgOiBcIlwiXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJwcmltYXJ5XCIsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5yaWdodENoZWNrZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG5hdGl2ZU9uOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5hZGRUb0xlZnQoJGV2ZW50KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXCJpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtaWNvbi1hcnJvdy1sZWZ0XCIgfSksXG4gICAgICAgICAgICAgIF92bS5idXR0b25UZXh0c1swXSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBfYyhcInNwYW5cIiwgW192bS5fdihfdm0uX3MoX3ZtLmJ1dHRvblRleHRzWzBdKSldKVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApLFxuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJlbC1idXR0b25cIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICBcImVsLXRyYW5zZmVyX19idXR0b25cIixcbiAgICAgICAgICAgICAgICBfdm0uaGFzQnV0dG9uVGV4dHMgPyBcImlzLXdpdGgtdGV4dHNcIiA6IFwiXCJcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInByaW1hcnlcIixcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogX3ZtLmxlZnRDaGVja2VkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBuYXRpdmVPbjoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uYWRkVG9SaWdodCgkZXZlbnQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfdm0uYnV0dG9uVGV4dHNbMV0gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gX2MoXCJzcGFuXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS5idXR0b25UZXh0c1sxXSkpXSlcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICBfYyhcImlcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pY29uLWFycm93LXJpZ2h0XCIgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApXG4gICAgICAgIF0sXG4gICAgICAgIDFcbiAgICAgICksXG4gICAgICBfYyhcbiAgICAgICAgXCJ0cmFuc2Zlci1wYW5lbFwiLFxuICAgICAgICBfdm0uX2IoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVmOiBcInJpZ2h0UGFuZWxcIixcbiAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgIGRhdGE6IF92bS50YXJnZXREYXRhLFxuICAgICAgICAgICAgICB0aXRsZTogX3ZtLnRpdGxlc1sxXSB8fCBfdm0udChcImVsLnRyYW5zZmVyLnRpdGxlcy4xXCIpLFxuICAgICAgICAgICAgICBcImRlZmF1bHQtY2hlY2tlZFwiOiBfdm0ucmlnaHREZWZhdWx0Q2hlY2tlZCxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6XG4gICAgICAgICAgICAgICAgX3ZtLmZpbHRlclBsYWNlaG9sZGVyIHx8IF92bS50KFwiZWwudHJhbnNmZXIuZmlsdGVyUGxhY2Vob2xkZXJcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbjogeyBcImNoZWNrZWQtY2hhbmdlXCI6IF92bS5vblRhcmdldENoZWNrZWRDaGFuZ2UgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0cmFuc2Zlci1wYW5lbFwiLFxuICAgICAgICAgIF92bS4kcHJvcHMsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKSxcbiAgICAgICAgW192bS5fdChcInJpZ2h0LWZvb3RlclwiKV0sXG4gICAgICAgIDJcbiAgICAgIClcbiAgICBdLFxuICAgIDFcbiAgKVxufVxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81YzY1NGRkOF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxubWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVjNjU0ZGQ4X3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJhbnNmZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTVjNjU0ZGQ4JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RyYW5zZmVyL3NyYy90cmFuc2Zlci1wYW5lbC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MmRkYWI4YmQmXG52YXIgdHJhbnNmZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZGRhYjhiZF9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC10cmFuc2Zlci1wYW5lbFwiIH0sIFtcbiAgICBfYyhcbiAgICAgIFwicFwiLFxuICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC10cmFuc2Zlci1wYW5lbF9faGVhZGVyXCIgfSxcbiAgICAgIFtcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJlbC1jaGVja2JveFwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGF0dHJzOiB7IGluZGV0ZXJtaW5hdGU6IF92bS5pc0luZGV0ZXJtaW5hdGUgfSxcbiAgICAgICAgICAgIG9uOiB7IGNoYW5nZTogX3ZtLmhhbmRsZUFsbENoZWNrZWRDaGFuZ2UgfSxcbiAgICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBfdm0uYWxsQ2hlY2tlZCxcbiAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCQkdikge1xuICAgICAgICAgICAgICAgIF92bS5hbGxDaGVja2VkID0gJCR2XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiYWxsQ2hlY2tlZFwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBfdm0uX3YoXCJcXG4gICAgICBcIiArIF92bS5fcyhfdm0udGl0bGUpICsgXCJcXG4gICAgICBcIiksXG4gICAgICAgICAgICBfYyhcInNwYW5cIiwgW192bS5fdihfdm0uX3MoX3ZtLmNoZWNrZWRTdW1tYXJ5KSldKVxuICAgICAgICAgIF1cbiAgICAgICAgKVxuICAgICAgXSxcbiAgICAgIDFcbiAgICApLFxuICAgIF9jKFxuICAgICAgXCJkaXZcIixcbiAgICAgIHtcbiAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICBcImVsLXRyYW5zZmVyLXBhbmVsX19ib2R5XCIsXG4gICAgICAgICAgX3ZtLmhhc0Zvb3RlciA/IFwiaXMtd2l0aC1mb290ZXJcIiA6IFwiXCJcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIFtcbiAgICAgICAgX3ZtLmZpbHRlcmFibGVcbiAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICBcImVsLWlucHV0XCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10cmFuc2Zlci1wYW5lbF9fZmlsdGVyXCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHsgc2l6ZTogXCJzbWFsbFwiLCBwbGFjZWhvbGRlcjogX3ZtLnBsYWNlaG9sZGVyIH0sXG4gICAgICAgICAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICAgICAgICAgIG1vdXNlZW50ZXI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBfdm0uaW5wdXRIb3ZlciA9IHRydWVcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBtb3VzZWxlYXZlOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmlucHV0SG92ZXIgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0ucXVlcnksXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oJCR2KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5xdWVyeSA9ICQkdlxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwicXVlcnlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICBjbGFzczogW1wiZWwtaW5wdXRfX2ljb25cIiwgXCJlbC1pY29uLVwiICsgX3ZtLmlucHV0SWNvbl0sXG4gICAgICAgICAgICAgICAgICBhdHRyczogeyBzbG90OiBcInByZWZpeFwiIH0sXG4gICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLmNsZWFyUXVlcnkgfSxcbiAgICAgICAgICAgICAgICAgIHNsb3Q6IFwicHJlZml4XCJcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJlbC1jaGVja2JveC1ncm91cFwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICFfdm0uaGFzTm9NYXRjaCAmJiBfdm0uZGF0YS5sZW5ndGggPiAwLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiIWhhc05vTWF0Y2ggJiYgZGF0YS5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRyYW5zZmVyLXBhbmVsX19saXN0XCIsXG4gICAgICAgICAgICBjbGFzczogeyBcImlzLWZpbHRlcmFibGVcIjogX3ZtLmZpbHRlcmFibGUgfSxcbiAgICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBfdm0uY2hlY2tlZCxcbiAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCQkdikge1xuICAgICAgICAgICAgICAgIF92bS5jaGVja2VkID0gJCR2XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tlZFwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBfdm0uX2woX3ZtLmZpbHRlcmVkRGF0YSwgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICBcImVsLWNoZWNrYm94XCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IGl0ZW1bX3ZtLmtleVByb3BdLFxuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRyYW5zZmVyLXBhbmVsX19pdGVtXCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBpdGVtW192bS5rZXlQcm9wXSxcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBpdGVtW192bS5kaXNhYmxlZFByb3BdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbX2MoXCJvcHRpb24tY29udGVudFwiLCB7IGF0dHJzOiB7IG9wdGlvbjogaXRlbSB9IH0pXSxcbiAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIDFcbiAgICAgICAgKSxcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJwXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmhhc05vTWF0Y2gsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJoYXNOb01hdGNoXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRyYW5zZmVyLXBhbmVsX19lbXB0eVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0udChcImVsLnRyYW5zZmVyLm5vTWF0Y2hcIikpKV1cbiAgICAgICAgKSxcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJwXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJzaG93XCIsXG4gICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmRhdGEubGVuZ3RoID09PSAwICYmICFfdm0uaGFzTm9NYXRjaCxcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImRhdGEubGVuZ3RoID09PSAwICYmICFoYXNOb01hdGNoXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRyYW5zZmVyLXBhbmVsX19lbXB0eVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0udChcImVsLnRyYW5zZmVyLm5vRGF0YVwiKSkpXVxuICAgICAgICApXG4gICAgICBdLFxuICAgICAgMVxuICAgICksXG4gICAgX3ZtLmhhc0Zvb3RlclxuICAgICAgPyBfYyhcbiAgICAgICAgICBcInBcIixcbiAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLXRyYW5zZmVyLXBhbmVsX19mb290ZXJcIiB9LFxuICAgICAgICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAgICAgICAyXG4gICAgICAgIClcbiAgICAgIDogX3ZtLl9lKClcbiAgXSlcbn1cbnZhciB0cmFuc2Zlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJkZGFiOGJkX3N0YXRpY1JlbmRlckZucyA9IFtdXG50cmFuc2Zlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJkZGFiOGJkX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJhbnNmZXIvc3JjL3RyYW5zZmVyLXBhbmVsLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yZGRhYjhiZCZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvdHJhbnNmZXIvc3JjL3RyYW5zZmVyLXBhbmVsLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdHJhbnNmZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBtaXhpbnM6IFtsb2NhbGVfZGVmYXVsdC5hXSxcblxuICBuYW1lOiAnRWxUcmFuc2ZlclBhbmVsJyxcblxuICBjb21wb25lbnROYW1lOiAnRWxUcmFuc2ZlclBhbmVsJyxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxDaGVja2JveEdyb3VwOiBjaGVja2JveF9ncm91cF9kZWZhdWx0LmEsXG4gICAgRWxDaGVja2JveDogY2hlY2tib3hfZGVmYXVsdC5hLFxuICAgIEVsSW5wdXQ6IGlucHV0X2RlZmF1bHQuYSxcbiAgICBPcHRpb25Db250ZW50OiB7XG4gICAgICBwcm9wczoge1xuICAgICAgICBvcHRpb246IE9iamVjdFxuICAgICAgfSxcbiAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICAgICAgdmFyIGdldFBhcmVudCA9IGZ1bmN0aW9uIGdldFBhcmVudCh2bSkge1xuICAgICAgICAgIGlmICh2bS4kb3B0aW9ucy5jb21wb25lbnROYW1lID09PSAnRWxUcmFuc2ZlclBhbmVsJykge1xuICAgICAgICAgICAgcmV0dXJuIHZtO1xuICAgICAgICAgIH0gZWxzZSBpZiAodm0uJHBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudCh2bS4kcGFyZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZtO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHBhbmVsID0gZ2V0UGFyZW50KHRoaXMpO1xuICAgICAgICB2YXIgdHJhbnNmZXIgPSBwYW5lbC4kcGFyZW50IHx8IHBhbmVsO1xuICAgICAgICByZXR1cm4gcGFuZWwucmVuZGVyQ29udGVudCA/IHBhbmVsLnJlbmRlckNvbnRlbnQoaCwgdGhpcy5vcHRpb24pIDogdHJhbnNmZXIuJHNjb3BlZFNsb3RzLmRlZmF1bHQgPyB0cmFuc2Zlci4kc2NvcGVkU2xvdHMuZGVmYXVsdCh7IG9wdGlvbjogdGhpcy5vcHRpb24gfSkgOiBoKCdzcGFuJywgW3RoaXMub3B0aW9uW3BhbmVsLmxhYmVsUHJvcF0gfHwgdGhpcy5vcHRpb25bcGFuZWwua2V5UHJvcF1dKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBkYXRhOiB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSxcbiAgICByZW5kZXJDb250ZW50OiBGdW5jdGlvbixcbiAgICBwbGFjZWhvbGRlcjogU3RyaW5nLFxuICAgIHRpdGxlOiBTdHJpbmcsXG4gICAgZmlsdGVyYWJsZTogQm9vbGVhbixcbiAgICBmb3JtYXQ6IE9iamVjdCxcbiAgICBmaWx0ZXJNZXRob2Q6IEZ1bmN0aW9uLFxuICAgIGRlZmF1bHRDaGVja2VkOiBBcnJheSxcbiAgICBwcm9wczogT2JqZWN0XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZDogW10sXG4gICAgICBhbGxDaGVja2VkOiBmYWxzZSxcbiAgICAgIHF1ZXJ5OiAnJyxcbiAgICAgIGlucHV0SG92ZXI6IGZhbHNlLFxuICAgICAgY2hlY2tDaGFuZ2VCeVVzZXI6IHRydWVcbiAgICB9O1xuICB9LFxuXG5cbiAgd2F0Y2g6IHtcbiAgICBjaGVja2VkOiBmdW5jdGlvbiBjaGVja2VkKHZhbCwgb2xkVmFsKSB7XG4gICAgICB0aGlzLnVwZGF0ZUFsbENoZWNrZWQoKTtcbiAgICAgIGlmICh0aGlzLmNoZWNrQ2hhbmdlQnlVc2VyKSB7XG4gICAgICAgIHZhciBtb3ZlZEtleXMgPSB2YWwuY29uY2F0KG9sZFZhbCkuZmlsdGVyKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgcmV0dXJuIHZhbC5pbmRleE9mKHYpID09PSAtMSB8fCBvbGRWYWwuaW5kZXhPZih2KSA9PT0gLTE7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiRlbWl0KCdjaGVja2VkLWNoYW5nZScsIHZhbCwgbW92ZWRLZXlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQtY2hhbmdlJywgdmFsKTtcbiAgICAgICAgdGhpcy5jaGVja0NoYW5nZUJ5VXNlciA9IHRydWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGNoZWNrZWQgPSBbXTtcbiAgICAgIHZhciBmaWx0ZXJlZERhdGFLZXlzID0gdGhpcy5maWx0ZXJlZERhdGEubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtW190aGlzLmtleVByb3BdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNoZWNrZWQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAoZmlsdGVyZWREYXRhS2V5cy5pbmRleE9mKGl0ZW0pID4gLTEpIHtcbiAgICAgICAgICBjaGVja2VkLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5jaGVja0NoYW5nZUJ5VXNlciA9IGZhbHNlO1xuICAgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDtcbiAgICB9LFxuICAgIGNoZWNrYWJsZURhdGE6IGZ1bmN0aW9uIGNoZWNrYWJsZURhdGEoKSB7XG4gICAgICB0aGlzLnVwZGF0ZUFsbENoZWNrZWQoKTtcbiAgICB9LFxuXG5cbiAgICBkZWZhdWx0Q2hlY2tlZDoge1xuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcih2YWwsIG9sZFZhbCkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICBpZiAob2xkVmFsICYmIHZhbC5sZW5ndGggPT09IG9sZFZhbC5sZW5ndGggJiYgdmFsLmV2ZXJ5KGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIG9sZFZhbC5pbmRleE9mKGl0ZW0pID4gLTE7XG4gICAgICAgIH0pKSByZXR1cm47XG4gICAgICAgIHZhciBjaGVja2VkID0gW107XG4gICAgICAgIHZhciBjaGVja2FibGVEYXRhS2V5cyA9IHRoaXMuY2hlY2thYmxlRGF0YS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gaXRlbVtfdGhpczIua2V5UHJvcF07XG4gICAgICAgIH0pO1xuICAgICAgICB2YWwuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIGlmIChjaGVja2FibGVEYXRhS2V5cy5pbmRleE9mKGl0ZW0pID4gLTEpIHtcbiAgICAgICAgICAgIGNoZWNrZWQucHVzaChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoZWNrQ2hhbmdlQnlVc2VyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZmlsdGVyZWREYXRhOiBmdW5jdGlvbiBmaWx0ZXJlZERhdGEoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgcmV0dXJuIHRoaXMuZGF0YS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBfdGhpczMuZmlsdGVyTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMy5maWx0ZXJNZXRob2QoX3RoaXMzLnF1ZXJ5LCBpdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgbGFiZWwgPSBpdGVtW190aGlzMy5sYWJlbFByb3BdIHx8IGl0ZW1bX3RoaXMzLmtleVByb3BdLnRvU3RyaW5nKCk7XG4gICAgICAgICAgcmV0dXJuIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihfdGhpczMucXVlcnkudG9Mb3dlckNhc2UoKSkgPiAtMTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBjaGVja2FibGVEYXRhOiBmdW5jdGlvbiBjaGVja2FibGVEYXRhKCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkRGF0YS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuICFpdGVtW190aGlzNC5kaXNhYmxlZFByb3BdO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBjaGVja2VkU3VtbWFyeTogZnVuY3Rpb24gY2hlY2tlZFN1bW1hcnkoKSB7XG4gICAgICB2YXIgY2hlY2tlZExlbmd0aCA9IHRoaXMuY2hlY2tlZC5sZW5ndGg7XG4gICAgICB2YXIgZGF0YUxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgICB2YXIgX2Zvcm1hdCA9IHRoaXMuZm9ybWF0LFxuICAgICAgICAgIG5vQ2hlY2tlZCA9IF9mb3JtYXQubm9DaGVja2VkLFxuICAgICAgICAgIGhhc0NoZWNrZWQgPSBfZm9ybWF0Lmhhc0NoZWNrZWQ7XG5cbiAgICAgIGlmIChub0NoZWNrZWQgJiYgaGFzQ2hlY2tlZCkge1xuICAgICAgICByZXR1cm4gY2hlY2tlZExlbmd0aCA+IDAgPyBoYXNDaGVja2VkLnJlcGxhY2UoL1xcJHtjaGVja2VkfS9nLCBjaGVja2VkTGVuZ3RoKS5yZXBsYWNlKC9cXCR7dG90YWx9L2csIGRhdGFMZW5ndGgpIDogbm9DaGVja2VkLnJlcGxhY2UoL1xcJHt0b3RhbH0vZywgZGF0YUxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2hlY2tlZExlbmd0aCArICcvJyArIGRhdGFMZW5ndGg7XG4gICAgICB9XG4gICAgfSxcbiAgICBpc0luZGV0ZXJtaW5hdGU6IGZ1bmN0aW9uIGlzSW5kZXRlcm1pbmF0ZSgpIHtcbiAgICAgIHZhciBjaGVja2VkTGVuZ3RoID0gdGhpcy5jaGVja2VkLmxlbmd0aDtcbiAgICAgIHJldHVybiBjaGVja2VkTGVuZ3RoID4gMCAmJiBjaGVja2VkTGVuZ3RoIDwgdGhpcy5jaGVja2FibGVEYXRhLmxlbmd0aDtcbiAgICB9LFxuICAgIGhhc05vTWF0Y2g6IGZ1bmN0aW9uIGhhc05vTWF0Y2goKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVyeS5sZW5ndGggPiAwICYmIHRoaXMuZmlsdGVyZWREYXRhLmxlbmd0aCA9PT0gMDtcbiAgICB9LFxuICAgIGlucHV0SWNvbjogZnVuY3Rpb24gaW5wdXRJY29uKCkge1xuICAgICAgcmV0dXJuIHRoaXMucXVlcnkubGVuZ3RoID4gMCAmJiB0aGlzLmlucHV0SG92ZXIgPyAnY2lyY2xlLWNsb3NlJyA6ICdzZWFyY2gnO1xuICAgIH0sXG4gICAgbGFiZWxQcm9wOiBmdW5jdGlvbiBsYWJlbFByb3AoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5sYWJlbCB8fCAnbGFiZWwnO1xuICAgIH0sXG4gICAga2V5UHJvcDogZnVuY3Rpb24ga2V5UHJvcCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmtleSB8fCAna2V5JztcbiAgICB9LFxuICAgIGRpc2FibGVkUHJvcDogZnVuY3Rpb24gZGlzYWJsZWRQcm9wKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuZGlzYWJsZWQgfHwgJ2Rpc2FibGVkJztcbiAgICB9LFxuICAgIGhhc0Zvb3RlcjogZnVuY3Rpb24gaGFzRm9vdGVyKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy4kc2xvdHMuZGVmYXVsdDtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHVwZGF0ZUFsbENoZWNrZWQ6IGZ1bmN0aW9uIHVwZGF0ZUFsbENoZWNrZWQoKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIGNoZWNrYWJsZURhdGFLZXlzID0gdGhpcy5jaGVja2FibGVEYXRhLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbVtfdGhpczUua2V5UHJvcF07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWxsQ2hlY2tlZCA9IGNoZWNrYWJsZURhdGFLZXlzLmxlbmd0aCA+IDAgJiYgY2hlY2thYmxlRGF0YUtleXMuZXZlcnkoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzNS5jaGVja2VkLmluZGV4T2YoaXRlbSkgPiAtMTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgaGFuZGxlQWxsQ2hlY2tlZENoYW5nZTogZnVuY3Rpb24gaGFuZGxlQWxsQ2hlY2tlZENoYW5nZSh2YWx1ZSkge1xuICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICAgIHRoaXMuY2hlY2tlZCA9IHZhbHVlID8gdGhpcy5jaGVja2FibGVEYXRhLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbVtfdGhpczYua2V5UHJvcF07XG4gICAgICB9KSA6IFtdO1xuICAgIH0sXG4gICAgY2xlYXJRdWVyeTogZnVuY3Rpb24gY2xlYXJRdWVyeSgpIHtcbiAgICAgIGlmICh0aGlzLmlucHV0SWNvbiA9PT0gJ2NpcmNsZS1jbG9zZScpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyYW5zZmVyL3NyYy90cmFuc2Zlci1wYW5lbC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3RyYW5zZmVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHRyYW5zZmVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyYW5zZmVyL3NyYy90cmFuc2Zlci1wYW5lbC52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciB0cmFuc2Zlcl9wYW5lbF9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY190cmFuc2Zlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgdHJhbnNmZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yZGRhYjhiZF9yZW5kZXIsXG4gIHRyYW5zZmVyX3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfMmRkYWI4YmRfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciB0cmFuc2Zlcl9wYW5lbF9hcGk7IH1cbnRyYW5zZmVyX3BhbmVsX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvdHJhbnNmZXIvc3JjL3RyYW5zZmVyLXBhbmVsLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0cmFuc2Zlcl9wYW5lbCA9ICh0cmFuc2Zlcl9wYW5lbF9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90cmFuc2Zlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0cmFuc2Zlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFRyYW5zZmVyJyxcblxuICBtaXhpbnM6IFtlbWl0dGVyX2RlZmF1bHQuYSwgbG9jYWxlX2RlZmF1bHQuYSwgbWlncmF0aW5nX2RlZmF1bHQuYV0sXG5cbiAgY29tcG9uZW50czoge1xuICAgIFRyYW5zZmVyUGFuZWw6IHRyYW5zZmVyX3BhbmVsLFxuICAgIEVsQnV0dG9uOiBidXR0b25fZGVmYXVsdC5hXG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBkYXRhOiB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSxcbiAgICB0aXRsZXM6IHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGJ1dHRvblRleHRzOiB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSxcbiAgICBmaWx0ZXJQbGFjZWhvbGRlcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGZpbHRlck1ldGhvZDogRnVuY3Rpb24sXG4gICAgbGVmdERlZmF1bHRDaGVja2VkOiB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSxcbiAgICByaWdodERlZmF1bHRDaGVja2VkOiB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSxcbiAgICByZW5kZXJDb250ZW50OiBGdW5jdGlvbixcbiAgICB2YWx1ZToge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0sXG4gICAgZm9ybWF0OiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgZmlsdGVyYWJsZTogQm9vbGVhbixcbiAgICBwcm9wczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWw6ICdsYWJlbCcsXG4gICAgICAgICAga2V5OiAna2V5JyxcbiAgICAgICAgICBkaXNhYmxlZDogJ2Rpc2FibGVkJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAgdGFyZ2V0T3JkZXI6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdvcmlnaW5hbCdcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdENoZWNrZWQ6IFtdLFxuICAgICAgcmlnaHRDaGVja2VkOiBbXVxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIGRhdGFPYmo6IGZ1bmN0aW9uIGRhdGFPYmooKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5wcm9wcy5rZXk7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhLnJlZHVjZShmdW5jdGlvbiAobywgY3VyKSB7XG4gICAgICAgIHJldHVybiAob1tjdXJba2V5XV0gPSBjdXIpICYmIG87XG4gICAgICB9LCB7fSk7XG4gICAgfSxcbiAgICBzb3VyY2VEYXRhOiBmdW5jdGlvbiBzb3VyY2VEYXRhKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgcmV0dXJuIHRoaXMuZGF0YS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnZhbHVlLmluZGV4T2YoaXRlbVtfdGhpcy5wcm9wcy5rZXldKSA9PT0gLTE7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHRhcmdldERhdGE6IGZ1bmN0aW9uIHRhcmdldERhdGEoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMudGFyZ2V0T3JkZXIgPT09ICdvcmlnaW5hbCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLnZhbHVlLmluZGV4T2YoaXRlbVtfdGhpczIucHJvcHMua2V5XSkgPiAtMTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5yZWR1Y2UoZnVuY3Rpb24gKGFyciwgY3VyKSB7XG4gICAgICAgICAgdmFyIHZhbCA9IF90aGlzMi5kYXRhT2JqW2N1cl07XG4gICAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgICAgYXJyLnB1c2godmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFycjtcbiAgICAgICAgfSwgW10pO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFzQnV0dG9uVGV4dHM6IGZ1bmN0aW9uIGhhc0J1dHRvblRleHRzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnV0dG9uVGV4dHMubGVuZ3RoID09PSAyO1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCAnZWwuZm9ybS5jaGFuZ2UnLCB2YWwpO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TWlncmF0aW5nQ29uZmlnOiBmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICdmb290ZXItZm9ybWF0JzogJ2Zvb3Rlci1mb3JtYXQgaXMgcmVuYW1lZCB0byBmb3JtYXQuJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgb25Tb3VyY2VDaGVja2VkQ2hhbmdlOiBmdW5jdGlvbiBvblNvdXJjZUNoZWNrZWRDaGFuZ2UodmFsLCBtb3ZlZEtleXMpIHtcbiAgICAgIHRoaXMubGVmdENoZWNrZWQgPSB2YWw7XG4gICAgICBpZiAobW92ZWRLZXlzID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgIHRoaXMuJGVtaXQoJ2xlZnQtY2hlY2stY2hhbmdlJywgdmFsLCBtb3ZlZEtleXMpO1xuICAgIH0sXG4gICAgb25UYXJnZXRDaGVja2VkQ2hhbmdlOiBmdW5jdGlvbiBvblRhcmdldENoZWNrZWRDaGFuZ2UodmFsLCBtb3ZlZEtleXMpIHtcbiAgICAgIHRoaXMucmlnaHRDaGVja2VkID0gdmFsO1xuICAgICAgaWYgKG1vdmVkS2V5cyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICB0aGlzLiRlbWl0KCdyaWdodC1jaGVjay1jaGFuZ2UnLCB2YWwsIG1vdmVkS2V5cyk7XG4gICAgfSxcbiAgICBhZGRUb0xlZnQ6IGZ1bmN0aW9uIGFkZFRvTGVmdCgpIHtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlLnNsaWNlKCk7XG4gICAgICB0aGlzLnJpZ2h0Q2hlY2tlZC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGN1cnJlbnRWYWx1ZS5pbmRleE9mKGl0ZW0pO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgY3VycmVudFZhbHVlKTtcbiAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIGN1cnJlbnRWYWx1ZSwgJ2xlZnQnLCB0aGlzLnJpZ2h0Q2hlY2tlZCk7XG4gICAgfSxcbiAgICBhZGRUb1JpZ2h0OiBmdW5jdGlvbiBhZGRUb1JpZ2h0KCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlLnNsaWNlKCk7XG4gICAgICB2YXIgaXRlbXNUb0JlTW92ZWQgPSBbXTtcbiAgICAgIHZhciBrZXkgPSB0aGlzLnByb3BzLmtleTtcbiAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHZhciBpdGVtS2V5ID0gaXRlbVtrZXldO1xuICAgICAgICBpZiAoX3RoaXMzLmxlZnRDaGVja2VkLmluZGV4T2YoaXRlbUtleSkgPiAtMSAmJiBfdGhpczMudmFsdWUuaW5kZXhPZihpdGVtS2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICBpdGVtc1RvQmVNb3ZlZC5wdXNoKGl0ZW1LZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IHRoaXMudGFyZ2V0T3JkZXIgPT09ICd1bnNoaWZ0JyA/IGl0ZW1zVG9CZU1vdmVkLmNvbmNhdChjdXJyZW50VmFsdWUpIDogY3VycmVudFZhbHVlLmNvbmNhdChpdGVtc1RvQmVNb3ZlZCk7XG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIGN1cnJlbnRWYWx1ZSk7XG4gICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBjdXJyZW50VmFsdWUsICdyaWdodCcsIHRoaXMubGVmdENoZWNrZWQpO1xuICAgIH0sXG4gICAgY2xlYXJRdWVyeTogZnVuY3Rpb24gY2xlYXJRdWVyeSh3aGljaCkge1xuICAgICAgaWYgKHdoaWNoID09PSAnbGVmdCcpIHtcbiAgICAgICAgdGhpcy4kcmVmcy5sZWZ0UGFuZWwucXVlcnkgPSAnJztcbiAgICAgIH0gZWxzZSBpZiAod2hpY2ggPT09ICdyaWdodCcpIHtcbiAgICAgICAgdGhpcy4kcmVmcy5yaWdodFBhbmVsLnF1ZXJ5ID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdHJhbnNmZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3RyYW5zZmVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHRyYW5zZmVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RyYW5zZmVyL3NyYy9tYWluLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHRyYW5zZmVyX3NyY19tYWluX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfdHJhbnNmZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81YzY1NGRkOF9yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81YzY1NGRkOF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHRyYW5zZmVyX3NyY19tYWluX2FwaTsgfVxudHJhbnNmZXJfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy90cmFuc2Zlci9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdHJhbnNmZXJfc3JjX21haW4gPSAodHJhbnNmZXJfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90cmFuc2Zlci9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG50cmFuc2Zlcl9zcmNfbWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHRyYW5zZmVyX3NyY19tYWluLm5hbWUsIHRyYW5zZmVyX3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRyYW5zZmVyID0gKHRyYW5zZmVyX3NyY19tYWluKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY29udGFpbmVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01YmYxODFkNCZcbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWJmMTgxZDRfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwic2VjdGlvblwiLFxuICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtY29udGFpbmVyXCIsIGNsYXNzOiB7IFwiaXMtdmVydGljYWxcIjogX3ZtLmlzVmVydGljYWwgfSB9LFxuICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAyXG4gIClcbn1cbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNWJmMTgxZDRfc3RhdGljUmVuZGVyRm5zID0gW11cbm1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81YmYxODFkNF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbnRhaW5lci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NWJmMTgxZDQmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NvbnRhaW5lci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNvbnRhaW5lcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbENvbnRhaW5lcicsXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsQ29udGFpbmVyJyxcblxuICBwcm9wczoge1xuICAgIGRpcmVjdGlvbjogU3RyaW5nXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpc1ZlcnRpY2FsOiBmdW5jdGlvbiBpc1ZlcnRpY2FsKCkge1xuICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAndmVydGljYWwnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLiRzbG90cyAmJiB0aGlzLiRzbG90cy5kZWZhdWx0ID8gdGhpcy4kc2xvdHMuZGVmYXVsdC5zb21lKGZ1bmN0aW9uICh2bm9kZSkge1xuICAgICAgICB2YXIgdGFnID0gdm5vZGUuY29tcG9uZW50T3B0aW9ucyAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zLnRhZztcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2VsLWhlYWRlcicgfHwgdGFnID09PSAnZWwtZm9vdGVyJztcbiAgICAgIH0pIDogZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY29udGFpbmVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19jb250YWluZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoY29udGFpbmVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbnRhaW5lci9zcmMvbWFpbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBjb250YWluZXJfc3JjX21haW5fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBwYWNrYWdlc19jb250YWluZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81YmYxODFkNF9yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81YmYxODFkNF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGNvbnRhaW5lcl9zcmNfbWFpbl9hcGk7IH1cbmNvbnRhaW5lcl9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2NvbnRhaW5lci9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY29udGFpbmVyX3NyY19tYWluID0gKGNvbnRhaW5lcl9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NvbnRhaW5lci9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jb250YWluZXJfc3JjX21haW4uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChjb250YWluZXJfc3JjX21haW4ubmFtZSwgY29udGFpbmVyX3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2NvbnRhaW5lciA9IChjb250YWluZXJfc3JjX21haW4pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9oZWFkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTJiMjk2YWIyJlxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8yYjI5NmFiMl9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJoZWFkZXJcIixcbiAgICB7IHN0YXRpY0NsYXNzOiBcImVsLWhlYWRlclwiLCBzdHlsZTogeyBoZWlnaHQ6IF92bS5oZWlnaHQgfSB9LFxuICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAyXG4gIClcbn1cbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMmIyOTZhYjJfc3RhdGljUmVuZGVyRm5zID0gW11cbm1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8yYjI5NmFiMl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2hlYWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MmIyOTZhYjImXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2hlYWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGhlYWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbEhlYWRlcicsXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsSGVhZGVyJyxcblxuICBwcm9wczoge1xuICAgIGhlaWdodDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJzYwcHgnXG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaGVhZGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19oZWFkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoaGVhZGVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2hlYWRlci9zcmMvbWFpbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBoZWFkZXJfc3JjX21haW5fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBwYWNrYWdlc19oZWFkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8yYjI5NmFiMl9yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8yYjI5NmFiMl9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGhlYWRlcl9zcmNfbWFpbl9hcGk7IH1cbmhlYWRlcl9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2hlYWRlci9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaGVhZGVyX3NyY19tYWluID0gKGhlYWRlcl9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2hlYWRlci9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5oZWFkZXJfc3JjX21haW4uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChoZWFkZXJfc3JjX21haW4ubmFtZSwgaGVhZGVyX3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGhlYWRlciA9IChoZWFkZXJfc3JjX21haW4pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9hc2lkZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDM0MTFkYmYmXG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzAzNDExZGJmX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImFzaWRlXCIsXG4gICAgeyBzdGF0aWNDbGFzczogXCJlbC1hc2lkZVwiLCBzdHlsZTogeyB3aWR0aDogX3ZtLndpZHRoIH0gfSxcbiAgICBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sXG4gICAgMlxuICApXG59XG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzAzNDExZGJmX3N0YXRpY1JlbmRlckZucyA9IFtdXG5tYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMDM0MTFkYmZfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9hc2lkZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDM0MTFkYmYmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2FzaWRlL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYXNpZGVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxBc2lkZScsXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsQXNpZGUnLFxuXG4gIHByb3BzOiB7XG4gICAgd2lkdGg6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICczMDBweCdcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9hc2lkZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfYXNpZGVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoYXNpZGVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYXNpZGUvc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgYXNpZGVfc3JjX21haW5fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBwYWNrYWdlc19hc2lkZV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzAzNDExZGJmX3JlbmRlcixcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzAzNDExZGJmX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgYXNpZGVfc3JjX21haW5fYXBpOyB9XG5hc2lkZV9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2FzaWRlL3NyYy9tYWluLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhc2lkZV9zcmNfbWFpbiA9IChhc2lkZV9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2FzaWRlL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmFzaWRlX3NyY19tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoYXNpZGVfc3JjX21haW4ubmFtZSwgYXNpZGVfc3JjX21haW4pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYXNpZGUgPSAoYXNpZGVfc3JjX21haW4pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9tYWluL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yYTNhNzQwNiZcbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMmEzYTc0MDZfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFwibWFpblwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLW1haW5cIiB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG59XG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJhM2E3NDA2X3N0YXRpY1JlbmRlckZucyA9IFtdXG5tYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMmEzYTc0MDZfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tYWluL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yYTNhNzQwNiZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbWFpbi9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG1haW5fc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxNYWluJyxcbiAgY29tcG9uZW50TmFtZTogJ0VsTWFpbidcbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tYWluL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19tYWluX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKG1haW5fc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbWFpbi9zcmMvbWFpbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBtYWluX3NyY19tYWluX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfbWFpbl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJhM2E3NDA2X3JlbmRlcixcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzJhM2E3NDA2X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgbWFpbl9zcmNfbWFpbl9hcGk7IH1cbm1haW5fc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9tYWluL3NyYy9tYWluLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBtYWluX3NyY19tYWluID0gKG1haW5fc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9tYWluL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbm1haW5fc3JjX21haW4uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChtYWluX3NyY19tYWluLm5hbWUsIG1haW5fc3JjX21haW4pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfbWFpbiA9IChtYWluX3NyY19tYWluKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZm9vdGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD04MDIxMDMzOCZcbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfODAyMTAzMzhfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZm9vdGVyXCIsXG4gICAgeyBzdGF0aWNDbGFzczogXCJlbC1mb290ZXJcIiwgc3R5bGU6IHsgaGVpZ2h0OiBfdm0uaGVpZ2h0IH0gfSxcbiAgICBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sXG4gICAgMlxuICApXG59XG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzgwMjEwMzM4X3N0YXRpY1JlbmRlckZucyA9IFtdXG5tYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfODAyMTAzMzhfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9mb290ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTgwMjEwMzM4JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9mb290ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBmb290ZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxGb290ZXInLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbEZvb3RlcicsXG5cbiAgcHJvcHM6IHtcbiAgICBoZWlnaHQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICc2MHB4J1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Zvb3Rlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfZm9vdGVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGZvb3Rlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9mb290ZXIvc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgZm9vdGVyX3NyY19tYWluX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfZm9vdGVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfODAyMTAzMzhfcmVuZGVyLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfODAyMTAzMzhfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBmb290ZXJfc3JjX21haW5fYXBpOyB9XG5mb290ZXJfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9mb290ZXIvc3JjL21haW4udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGZvb3Rlcl9zcmNfbWFpbiA9IChmb290ZXJfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9mb290ZXIvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZm9vdGVyX3NyY19tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoZm9vdGVyX3NyY19tYWluLm5hbWUsIGZvb3Rlcl9zcmNfbWFpbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBmb290ZXIgPSAoZm9vdGVyX3NyY19tYWluKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RpbWVsaW5lL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGltZWxpbmVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxUaW1lbGluZScsXG5cbiAgcHJvcHM6IHtcbiAgICByZXZlcnNlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgcHJvdmlkZTogZnVuY3Rpb24gcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGltZWxpbmU6IHRoaXNcbiAgICB9O1xuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgaCA9IGFyZ3VtZW50c1swXTtcblxuICAgIHZhciByZXZlcnNlID0gdGhpcy5yZXZlcnNlO1xuICAgIHZhciBjbGFzc2VzID0ge1xuICAgICAgJ2VsLXRpbWVsaW5lJzogdHJ1ZSxcbiAgICAgICdpcy1yZXZlcnNlJzogcmV2ZXJzZVxuICAgIH07XG4gICAgdmFyIHNsb3RzID0gdGhpcy4kc2xvdHMuZGVmYXVsdCB8fCBbXTtcbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgc2xvdHMgPSBzbG90cy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIHJldHVybiBoKFxuICAgICAgJ3VsJyxcbiAgICAgIHsgJ2NsYXNzJzogY2xhc3NlcyB9LFxuICAgICAgW3Nsb3RzXVxuICAgICk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90aW1lbGluZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfdGltZWxpbmVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAodGltZWxpbmVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZWxpbmUvc3JjL21haW4udnVlXG52YXIgbWFpbl9yZW5kZXIsIG1haW5fc3RhdGljUmVuZGVyRm5zXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHRpbWVsaW5lX3NyY19tYWluX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfdGltZWxpbmVfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW5fcmVuZGVyLFxuICBtYWluX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgdGltZWxpbmVfc3JjX21haW5fYXBpOyB9XG50aW1lbGluZV9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3RpbWVsaW5lL3NyYy9tYWluLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0aW1lbGluZV9zcmNfbWFpbiA9ICh0aW1lbGluZV9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RpbWVsaW5lL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnRpbWVsaW5lX3NyY19tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQodGltZWxpbmVfc3JjX21haW4ubmFtZSwgdGltZWxpbmVfc3JjX21haW4pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGltZWxpbmUgPSAodGltZWxpbmVfc3JjX21haW4pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90aW1lbGluZS9zcmMvaXRlbS52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NjFhNjllNTAmXG52YXIgaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYxYTY5ZTUwX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcImxpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtdGltZWxpbmUtaXRlbVwiIH0sIFtcbiAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXRpbWVsaW5lLWl0ZW1fX3RhaWxcIiB9KSxcbiAgICAhX3ZtLiRzbG90cy5kb3RcbiAgICAgID8gX2MoXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC10aW1lbGluZS1pdGVtX19ub2RlXCIsXG4gICAgICAgICAgICBjbGFzczogW1xuICAgICAgICAgICAgICBcImVsLXRpbWVsaW5lLWl0ZW1fX25vZGUtLVwiICsgKF92bS5zaXplIHx8IFwiXCIpLFxuICAgICAgICAgICAgICBcImVsLXRpbWVsaW5lLWl0ZW1fX25vZGUtLVwiICsgKF92bS50eXBlIHx8IFwiXCIpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBfdm0uY29sb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIF92bS5pY29uXG4gICAgICAgICAgICAgID8gX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRpbWVsaW5lLWl0ZW1fX2ljb25cIixcbiAgICAgICAgICAgICAgICAgIGNsYXNzOiBfdm0uaWNvblxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICBdXG4gICAgICAgIClcbiAgICAgIDogX3ZtLl9lKCksXG4gICAgX3ZtLiRzbG90cy5kb3RcbiAgICAgID8gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC10aW1lbGluZS1pdGVtX19kb3RcIiB9LCBbX3ZtLl90KFwiZG90XCIpXSwgMilcbiAgICAgIDogX3ZtLl9lKCksXG4gICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC10aW1lbGluZS1pdGVtX193cmFwcGVyXCIgfSwgW1xuICAgICAgIV92bS5oaWRlVGltZXN0YW1wICYmIF92bS5wbGFjZW1lbnQgPT09IFwidG9wXCJcbiAgICAgICAgPyBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXRpbWVsaW5lLWl0ZW1fX3RpbWVzdGFtcCBpcy10b3BcIiB9LCBbXG4gICAgICAgICAgICBfdm0uX3YoXCJcXG4gICAgICBcIiArIF92bS5fcyhfdm0udGltZXN0YW1wKSArIFwiXFxuICAgIFwiKVxuICAgICAgICAgIF0pXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC10aW1lbGluZS1pdGVtX19jb250ZW50XCIgfSxcbiAgICAgICAgW192bS5fdChcImRlZmF1bHRcIildLFxuICAgICAgICAyXG4gICAgICApLFxuICAgICAgIV92bS5oaWRlVGltZXN0YW1wICYmIF92bS5wbGFjZW1lbnQgPT09IFwiYm90dG9tXCJcbiAgICAgICAgPyBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXRpbWVsaW5lLWl0ZW1fX3RpbWVzdGFtcCBpcy1ib3R0b21cIiB9LCBbXG4gICAgICAgICAgICBfdm0uX3YoXCJcXG4gICAgICBcIiArIF92bS5fcyhfdm0udGltZXN0YW1wKSArIFwiXFxuICAgIFwiKVxuICAgICAgICAgIF0pXG4gICAgICAgIDogX3ZtLl9lKClcbiAgICBdKVxuICBdKVxufVxudmFyIGl0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF82MWE2OWU1MF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYxYTY5ZTUwX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZWxpbmUvc3JjL2l0ZW0udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTYxYTY5ZTUwJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy90aW1lbGluZS9zcmMvaXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGltZWxpbmVfc3JjX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxUaW1lbGluZUl0ZW0nLFxuXG4gIGluamVjdDogWyd0aW1lbGluZSddLFxuXG4gIHByb3BzOiB7XG4gICAgdGltZXN0YW1wOiBTdHJpbmcsXG5cbiAgICBoaWRlVGltZXN0YW1wOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuXG4gICAgcGxhY2VtZW50OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnYm90dG9tJ1xuICAgIH0sXG5cbiAgICB0eXBlOiBTdHJpbmcsXG5cbiAgICBjb2xvcjogU3RyaW5nLFxuXG4gICAgc2l6ZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ25vcm1hbCdcbiAgICB9LFxuXG4gICAgaWNvbjogU3RyaW5nXG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90aW1lbGluZS9zcmMvaXRlbS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfdGltZWxpbmVfc3JjX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAodGltZWxpbmVfc3JjX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvdGltZWxpbmUvc3JjL2l0ZW0udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgc3JjX2l0ZW1fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBwYWNrYWdlc190aW1lbGluZV9zcmNfaXRlbXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYxYTY5ZTUwX3JlbmRlcixcbiAgaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzYxYTY5ZTUwX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgc3JjX2l0ZW1fYXBpOyB9XG5zcmNfaXRlbV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3RpbWVsaW5lL3NyYy9pdGVtLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0aW1lbGluZV9zcmNfaXRlbSA9IChzcmNfaXRlbV9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RpbWVsaW5lLWl0ZW0vaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudGltZWxpbmVfc3JjX2l0ZW0uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudCh0aW1lbGluZV9zcmNfaXRlbS5uYW1lLCB0aW1lbGluZV9zcmNfaXRlbSk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0aW1lbGluZV9pdGVtID0gKHRpbWVsaW5lX3NyY19pdGVtKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvbGluay9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDFjZjNiNjUmXG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzAxY2YzYjY1X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImFcIixcbiAgICBfdm0uX2IoXG4gICAgICB7XG4gICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgXCJlbC1saW5rXCIsXG4gICAgICAgICAgX3ZtLnR5cGUgPyBcImVsLWxpbmstLVwiICsgX3ZtLnR5cGUgOiBcIlwiLFxuICAgICAgICAgIF92bS5kaXNhYmxlZCAmJiBcImlzLWRpc2FibGVkXCIsXG4gICAgICAgICAgX3ZtLnVuZGVybGluZSAmJiAhX3ZtLmRpc2FibGVkICYmIFwiaXMtdW5kZXJsaW5lXCJcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IHsgaHJlZjogX3ZtLmRpc2FibGVkID8gbnVsbCA6IF92bS5ocmVmIH0sXG4gICAgICAgIG9uOiB7IGNsaWNrOiBfdm0uaGFuZGxlQ2xpY2sgfVxuICAgICAgfSxcbiAgICAgIFwiYVwiLFxuICAgICAgX3ZtLiRhdHRycyxcbiAgICAgIGZhbHNlXG4gICAgKSxcbiAgICBbXG4gICAgICBfdm0uaWNvbiA/IF9jKFwiaVwiLCB7IGNsYXNzOiBfdm0uaWNvbiB9KSA6IF92bS5fZSgpLFxuICAgICAgX3ZtLiRzbG90cy5kZWZhdWx0XG4gICAgICAgID8gX2MoXCJzcGFuXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtbGluay0taW5uZXJcIiB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfdm0uJHNsb3RzLmljb24gPyBbX3ZtLiRzbG90cy5pY29uID8gX3ZtLl90KFwiaWNvblwiKSA6IF92bS5fZSgpXSA6IF92bS5fZSgpXG4gICAgXSxcbiAgICAyXG4gIClcbn1cbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMDFjZjNiNjVfc3RhdGljUmVuZGVyRm5zID0gW11cbm1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMWNmM2I2NV9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2xpbmsvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTAxY2YzYjY1JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9saW5rL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGxpbmtfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxMaW5rJyxcblxuICBwcm9wczoge1xuICAgIHR5cGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdkZWZhdWx0J1xuICAgIH0sXG4gICAgdW5kZXJsaW5lOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW4sXG4gICAgaHJlZjogU3RyaW5nLFxuICAgIGljb246IFN0cmluZ1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVDbGljazogZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBpZiAoIXRoaXMuaHJlZikge1xuICAgICAgICAgIHRoaXMuJGVtaXQoJ2NsaWNrJywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbGluay9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfbGlua19zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChsaW5rX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2xpbmsvc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgbGlua19zcmNfbWFpbl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhY2thZ2VzX2xpbmtfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMWNmM2I2NV9yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wMWNmM2I2NV9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGxpbmtfc3JjX21haW5fYXBpOyB9XG5saW5rX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvbGluay9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbGlua19zcmNfbWFpbiA9IChsaW5rX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvbGluay9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5saW5rX3NyY19tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQobGlua19zcmNfbWFpbi5uYW1lLCBsaW5rX3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2xpbmsgPSAobGlua19zcmNfbWFpbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2RpdmlkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdmYTAyYTdlJmZ1bmN0aW9uYWw9dHJ1ZSZcbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfN2ZhMDJhN2VfZnVuY3Rpb25hbF90cnVlX3JlbmRlciA9IGZ1bmN0aW9uKF9oLCBfdm0pIHtcbiAgdmFyIF9jID0gX3ZtLl9jXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIF92bS5fZyhcbiAgICAgIF92bS5fYihcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzOiBbXG4gICAgICAgICAgICBfdm0uZGF0YS5zdGF0aWNDbGFzcyxcbiAgICAgICAgICAgIFwiZWwtZGl2aWRlclwiLFxuICAgICAgICAgICAgXCJlbC1kaXZpZGVyLS1cIiArIF92bS5wcm9wcy5kaXJlY3Rpb25cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIF92bS5kYXRhLmF0dHJzLFxuICAgICAgICBmYWxzZVxuICAgICAgKSxcbiAgICAgIF92bS5saXN0ZW5lcnNcbiAgICApLFxuICAgIFtcbiAgICAgIF92bS5zbG90cygpLmRlZmF1bHQgJiYgX3ZtLnByb3BzLmRpcmVjdGlvbiAhPT0gXCJ2ZXJ0aWNhbFwiXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgeyBjbGFzczogW1wiZWwtZGl2aWRlcl9fdGV4dFwiLCBcImlzLVwiICsgX3ZtLnByb3BzLmNvbnRlbnRQb3NpdGlvbl0gfSxcbiAgICAgICAgICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIDogX3ZtLl9lKClcbiAgICBdXG4gIClcbn1cbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfN2ZhMDJhN2VfZnVuY3Rpb25hbF90cnVlX3N0YXRpY1JlbmRlckZucyA9IFtdXG5tYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfN2ZhMDJhN2VfZnVuY3Rpb25hbF90cnVlX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGl2aWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9N2ZhMDJhN2UmZnVuY3Rpb25hbD10cnVlJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kaXZpZGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZGl2aWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbERpdmlkZXInLFxuICBwcm9wczoge1xuICAgIGRpcmVjdGlvbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2hvcml6b250YWwnLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsKSB7XG4gICAgICAgIHJldHVybiBbJ2hvcml6b250YWwnLCAndmVydGljYWwnXS5pbmRleE9mKHZhbCkgIT09IC0xO1xuICAgICAgfVxuICAgIH0sXG4gICAgY29udGVudFBvc2l0aW9uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnY2VudGVyJyxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAgICAgICByZXR1cm4gWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCddLmluZGV4T2YodmFsKSAhPT0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGl2aWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfZGl2aWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChkaXZpZGVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RpdmlkZXIvc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgZGl2aWRlcl9zcmNfbWFpbl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhY2thZ2VzX2RpdmlkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZmEwMmE3ZV9mdW5jdGlvbmFsX3RydWVfcmVuZGVyLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfN2ZhMDJhN2VfZnVuY3Rpb25hbF90cnVlX3N0YXRpY1JlbmRlckZucyxcbiAgdHJ1ZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBkaXZpZGVyX3NyY19tYWluX2FwaTsgfVxuZGl2aWRlcl9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2RpdmlkZXIvc3JjL21haW4udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGRpdmlkZXJfc3JjX21haW4gPSAoZGl2aWRlcl9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RpdmlkZXIvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZGl2aWRlcl9zcmNfbWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KGRpdmlkZXJfc3JjX21haW4ubmFtZSwgZGl2aWRlcl9zcmNfbWFpbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkaXZpZGVyID0gKGRpdmlkZXJfc3JjX21haW4pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9pbWFnZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDRkODRhN2MmXG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQ0ZDg0YTdjX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtaW1hZ2VcIiB9LFxuICAgIFtcbiAgICAgIF92bS5sb2FkaW5nXG4gICAgICAgID8gX3ZtLl90KFwicGxhY2Vob2xkZXJcIiwgW1xuICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pbWFnZV9fcGxhY2Vob2xkZXJcIiB9KVxuICAgICAgICAgIF0pXG4gICAgICAgIDogX3ZtLmVycm9yXG4gICAgICAgID8gX3ZtLl90KFwiZXJyb3JcIiwgW1xuICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pbWFnZV9fZXJyb3JcIiB9LCBbXG4gICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLnQoXCJlbC5pbWFnZS5lcnJvclwiKSkpXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIF0pXG4gICAgICAgIDogX2MoXG4gICAgICAgICAgICBcImltZ1wiLFxuICAgICAgICAgICAgX3ZtLl9nKFxuICAgICAgICAgICAgICBfdm0uX2IoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtaW1hZ2VfX2lubmVyXCIsXG4gICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICBcImVsLWltYWdlX19pbm5lci0tY2VudGVyXCI6IF92bS5hbGlnbkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgXCJlbC1pbWFnZV9fcHJldmlld1wiOiBfdm0ucHJldmlld1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHN0eWxlOiBfdm0uaW1hZ2VTdHlsZSxcbiAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHNyYzogX3ZtLnNyYyB9LFxuICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5jbGlja0hhbmRsZXIgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJpbWdcIixcbiAgICAgICAgICAgICAgICBfdm0uJGF0dHJzLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF92bS4kbGlzdGVuZXJzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgIF92bS5wcmV2aWV3XG4gICAgICAgID8gW1xuICAgICAgICAgICAgX3ZtLnNob3dWaWV3ZXJcbiAgICAgICAgICAgICAgPyBfYyhcImltYWdlLXZpZXdlclwiLCB7XG4gICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICBcInotaW5kZXhcIjogX3ZtLnpJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgXCJpbml0aWFsLWluZGV4XCI6IF92bS5pbWFnZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICBcIm9uLWNsb3NlXCI6IF92bS5jbG9zZVZpZXdlcixcbiAgICAgICAgICAgICAgICAgICAgXCJ1cmwtbGlzdFwiOiBfdm0ucHJldmlld1NyY0xpc3RcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgXVxuICAgICAgICA6IF92bS5fZSgpXG4gICAgXSxcbiAgICAyXG4gIClcbn1cbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNDRkODRhN2Nfc3RhdGljUmVuZGVyRm5zID0gW11cbm1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80NGQ4NGE3Y19yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2ltYWdlL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00NGQ4NGE3YyZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9pbWFnZS9zcmMvaW1hZ2Utdmlld2VyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01ZTczYjMwNyZcbnZhciBpbWFnZV92aWV3ZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF81ZTczYjMwN19yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJ0cmFuc2l0aW9uXCIsIHsgYXR0cnM6IHsgbmFtZTogXCJ2aWV3ZXItZmFkZVwiIH0gfSwgW1xuICAgIF9jKFxuICAgICAgXCJkaXZcIixcbiAgICAgIHtcbiAgICAgICAgcmVmOiBcImVsLWltYWdlLXZpZXdlcl9fd3JhcHBlclwiLFxuICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1pbWFnZS12aWV3ZXJfX3dyYXBwZXJcIixcbiAgICAgICAgc3R5bGU6IHsgXCJ6LWluZGV4XCI6IF92bS52aWV3ZXJaSW5kZXggfSxcbiAgICAgICAgYXR0cnM6IHsgdGFiaW5kZXg6IFwiLTFcIiB9XG4gICAgICB9LFxuICAgICAgW1xuICAgICAgICBfYyhcImRpdlwiLCB7XG4gICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtaW1hZ2Utdmlld2VyX19tYXNrXCIsXG4gICAgICAgICAgb246IHtcbiAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKCRldmVudC50YXJnZXQgIT09ICRldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gX3ZtLmhhbmRsZU1hc2tDbGljaygkZXZlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtaW1hZ2Utdmlld2VyX19idG4gZWwtaW1hZ2Utdmlld2VyX19jbG9zZVwiLFxuICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5oaWRlIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtfYyhcImlcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pY29uLWNsb3NlXCIgfSldXG4gICAgICAgICksXG4gICAgICAgICFfdm0uaXNTaW5nbGVcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtaW1hZ2Utdmlld2VyX19idG4gZWwtaW1hZ2Utdmlld2VyX19wcmV2XCIsXG4gICAgICAgICAgICAgICAgICBjbGFzczogeyBcImlzLWRpc2FibGVkXCI6ICFfdm0uaW5maW5pdGUgJiYgX3ZtLmlzRmlyc3QgfSxcbiAgICAgICAgICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0ucHJldiB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX2MoXCJpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtaWNvbi1hcnJvdy1sZWZ0XCIgfSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWltYWdlLXZpZXdlcl9fYnRuIGVsLWltYWdlLXZpZXdlcl9fbmV4dFwiLFxuICAgICAgICAgICAgICAgICAgY2xhc3M6IHsgXCJpcy1kaXNhYmxlZFwiOiAhX3ZtLmluZmluaXRlICYmIF92bS5pc0xhc3QgfSxcbiAgICAgICAgICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0ubmV4dCB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX2MoXCJpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtaWNvbi1hcnJvdy1yaWdodFwiIH0pXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLWltYWdlLXZpZXdlcl9fYnRuIGVsLWltYWdlLXZpZXdlcl9fYWN0aW9uc1wiIH0sXG4gICAgICAgICAgW1xuICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pbWFnZS12aWV3ZXJfX2FjdGlvbnNfX2lubmVyXCIgfSwgW1xuICAgICAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWljb24tem9vbS1vdXRcIixcbiAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlQWN0aW9ucyhcInpvb21PdXRcIilcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWljb24tem9vbS1pblwiLFxuICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVBY3Rpb25zKFwiem9vbUluXCIpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgX2MoXCJpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtaW1hZ2Utdmlld2VyX19hY3Rpb25zX19kaXZpZGVyXCIgfSksXG4gICAgICAgICAgICAgIF9jKFwiaVwiLCB7IGNsYXNzOiBfdm0ubW9kZS5pY29uLCBvbjogeyBjbGljazogX3ZtLnRvZ2dsZU1vZGUgfSB9KSxcbiAgICAgICAgICAgICAgX2MoXCJpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtaW1hZ2Utdmlld2VyX19hY3Rpb25zX19kaXZpZGVyXCIgfSksXG4gICAgICAgICAgICAgIF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtaWNvbi1yZWZyZXNoLWxlZnRcIixcbiAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlQWN0aW9ucyhcImFudGljbG9jZWxpc2VcIilcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWljb24tcmVmcmVzaC1yaWdodFwiLFxuICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVBY3Rpb25zKFwiY2xvY2VsaXNlXCIpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICBdXG4gICAgICAgICksXG4gICAgICAgIF9jKFxuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1pbWFnZS12aWV3ZXJfX2NhbnZhc1wiIH0sXG4gICAgICAgICAgX3ZtLl9sKF92bS51cmxMaXN0LCBmdW5jdGlvbih1cmwsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpID09PSBfdm0uaW5kZXhcbiAgICAgICAgICAgICAgPyBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICBrZXk6IHVybCxcbiAgICAgICAgICAgICAgICAgIHJlZjogXCJpbWdcIixcbiAgICAgICAgICAgICAgICAgIHJlZkluRm9yOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtaW1hZ2Utdmlld2VyX19pbWdcIixcbiAgICAgICAgICAgICAgICAgIHN0eWxlOiBfdm0uaW1nU3R5bGUsXG4gICAgICAgICAgICAgICAgICBhdHRyczogeyBzcmM6IF92bS5jdXJyZW50SW1nLCByZWZlcnJlcnBvbGljeTogXCJuby1yZWZlcnJlclwiIH0sXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBsb2FkOiBfdm0uaGFuZGxlSW1nTG9hZCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IF92bS5oYW5kbGVJbWdFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgbW91c2Vkb3duOiBfdm0uaGFuZGxlTW91c2VEb3duXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIDBcbiAgICAgICAgKVxuICAgICAgXSxcbiAgICAgIDJcbiAgICApXG4gIF0pXG59XG52YXIgaW1hZ2Vfdmlld2VydnVlX3R5cGVfdGVtcGxhdGVfaWRfNWU3M2IzMDdfc3RhdGljUmVuZGVyRm5zID0gW11cbmltYWdlX3ZpZXdlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVlNzNiMzA3X3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW1hZ2Uvc3JjL2ltYWdlLXZpZXdlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NWU3M2IzMDcmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2ltYWdlL3NyYy9pbWFnZS12aWV3ZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxudmFyIGltYWdlX3ZpZXdlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxudmFyIE1vZGUgPSB7XG4gIENPTlRBSU46IHtcbiAgICBuYW1lOiAnY29udGFpbicsXG4gICAgaWNvbjogJ2VsLWljb24tZnVsbC1zY3JlZW4nXG4gIH0sXG4gIE9SSUdJTkFMOiB7XG4gICAgbmFtZTogJ29yaWdpbmFsJyxcbiAgICBpY29uOiAnZWwtaWNvbi1jLXNjYWxlLXRvLW9yaWdpbmFsJ1xuICB9XG59O1xuXG52YXIgbW91c2V3aGVlbEV2ZW50TmFtZSA9IE9iamVjdCh1dGlsX1tcImlzRmlyZWZveFwiXSkoKSA/ICdET01Nb3VzZVNjcm9sbCcgOiAnbW91c2V3aGVlbCc7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGltYWdlX3ZpZXdlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdlbEltYWdlVmlld2VyJyxcblxuICBwcm9wczoge1xuICAgIHVybExpc3Q6IHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHpJbmRleDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMjAwMFxuICAgIH0sXG4gICAgb25Td2l0Y2g6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7fVxuICAgIH0sXG4gICAgb25DbG9zZToge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHt9XG4gICAgfSxcbiAgICBpbml0aWFsSW5kZXg6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIGFwcGVuZFRvQm9keToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIG1hc2tDbG9zYWJsZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5kZXg6IHRoaXMuaW5pdGlhbEluZGV4LFxuICAgICAgaXNTaG93OiBmYWxzZSxcbiAgICAgIGluZmluaXRlOiB0cnVlLFxuICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICBtb2RlOiBNb2RlLkNPTlRBSU4sXG4gICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgc2NhbGU6IDEsXG4gICAgICAgIGRlZzogMCxcbiAgICAgICAgb2Zmc2V0WDogMCxcbiAgICAgICAgb2Zmc2V0WTogMCxcbiAgICAgICAgZW5hYmxlVHJhbnNpdGlvbjogZmFsc2VcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNTaW5nbGU6IGZ1bmN0aW9uIGlzU2luZ2xlKCkge1xuICAgICAgcmV0dXJuIHRoaXMudXJsTGlzdC5sZW5ndGggPD0gMTtcbiAgICB9LFxuICAgIGlzRmlyc3Q6IGZ1bmN0aW9uIGlzRmlyc3QoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gMDtcbiAgICB9LFxuICAgIGlzTGFzdDogZnVuY3Rpb24gaXNMYXN0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IHRoaXMudXJsTGlzdC5sZW5ndGggLSAxO1xuICAgIH0sXG4gICAgY3VycmVudEltZzogZnVuY3Rpb24gY3VycmVudEltZygpIHtcbiAgICAgIHJldHVybiB0aGlzLnVybExpc3RbdGhpcy5pbmRleF07XG4gICAgfSxcbiAgICBpbWdTdHlsZTogZnVuY3Rpb24gaW1nU3R5bGUoKSB7XG4gICAgICB2YXIgX3RyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgIHNjYWxlID0gX3RyYW5zZm9ybS5zY2FsZSxcbiAgICAgICAgICBkZWcgPSBfdHJhbnNmb3JtLmRlZyxcbiAgICAgICAgICBvZmZzZXRYID0gX3RyYW5zZm9ybS5vZmZzZXRYLFxuICAgICAgICAgIG9mZnNldFkgPSBfdHJhbnNmb3JtLm9mZnNldFksXG4gICAgICAgICAgZW5hYmxlVHJhbnNpdGlvbiA9IF90cmFuc2Zvcm0uZW5hYmxlVHJhbnNpdGlvbjtcblxuICAgICAgdmFyIHN0eWxlID0ge1xuICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZSgnICsgc2NhbGUgKyAnKSByb3RhdGUoJyArIGRlZyArICdkZWcpJyxcbiAgICAgICAgdHJhbnNpdGlvbjogZW5hYmxlVHJhbnNpdGlvbiA/ICd0cmFuc2Zvcm0gLjNzJyA6ICcnLFxuICAgICAgICAnbWFyZ2luLWxlZnQnOiBvZmZzZXRYICsgJ3B4JyxcbiAgICAgICAgJ21hcmdpbi10b3AnOiBvZmZzZXRZICsgJ3B4J1xuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09IE1vZGUuQ09OVEFJTikge1xuICAgICAgICBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLm1heEhlaWdodCA9ICcxMDAlJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuICAgIHZpZXdlclpJbmRleDogZnVuY3Rpb24gdmlld2VyWkluZGV4KCkge1xuICAgICAgdmFyIG5leHRaSW5kZXggPSBwb3B1cF9bXCJQb3B1cE1hbmFnZXJcIl0ubmV4dFpJbmRleCgpO1xuICAgICAgcmV0dXJuIHRoaXMuekluZGV4ID4gbmV4dFpJbmRleCA/IHRoaXMuekluZGV4IDogbmV4dFpJbmRleDtcbiAgICB9XG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgaW5kZXg6IHtcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIodmFsKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgdGhpcy5vblN3aXRjaCh2YWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY3VycmVudEltZzogZnVuY3Rpb24gY3VycmVudEltZyh2YWwpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uIChfKSB7XG4gICAgICAgIHZhciAkaW1nID0gX3RoaXMuJHJlZnMuaW1nWzBdO1xuICAgICAgICBpZiAoISRpbWcuY29tcGxldGUpIHtcbiAgICAgICAgICBfdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgIHRoaXMuZGV2aWNlU3VwcG9ydFVuaW5zdGFsbCgpO1xuICAgICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgfSxcbiAgICBkZXZpY2VTdXBwb3J0SW5zdGFsbDogZnVuY3Rpb24gZGV2aWNlU3VwcG9ydEluc3RhbGwoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5fa2V5RG93bkhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB2YXIga2V5Q29kZSA9IGUua2V5Q29kZTtcbiAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7XG4gICAgICAgICAgLy8gRVNDXG4gICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgIF90aGlzMi5oaWRlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAvLyBTUEFDRVxuICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICBfdGhpczIudG9nZ2xlTW9kZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gTEVGVF9BUlJPV1xuICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICBfdGhpczIucHJldigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gVVBfQVJST1dcbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgX3RoaXMyLmhhbmRsZUFjdGlvbnMoJ3pvb21JbicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gUklHSFRfQVJST1dcbiAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgX3RoaXMyLm5leHQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIC8vIERPV05fQVJST1dcbiAgICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgX3RoaXMyLmhhbmRsZUFjdGlvbnMoJ3pvb21PdXQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5fbW91c2VXaGVlbEhhbmRsZXIgPSBPYmplY3QodXRpbF9bXCJyYWZUaHJvdHRsZVwiXSkoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGRlbHRhID0gZS53aGVlbERlbHRhID8gZS53aGVlbERlbHRhIDogLWUuZGV0YWlsO1xuICAgICAgICBpZiAoZGVsdGEgPiAwKSB7XG4gICAgICAgICAgX3RoaXMyLmhhbmRsZUFjdGlvbnMoJ3pvb21JbicsIHtcbiAgICAgICAgICAgIHpvb21SYXRlOiAwLjAxNSxcbiAgICAgICAgICAgIGVuYWJsZVRyYW5zaXRpb246IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMyLmhhbmRsZUFjdGlvbnMoJ3pvb21PdXQnLCB7XG4gICAgICAgICAgICB6b29tUmF0ZTogMC4wMTUsXG4gICAgICAgICAgICBlbmFibGVUcmFuc2l0aW9uOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuX2tleURvd25IYW5kbGVyKTtcbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKGRvY3VtZW50LCBtb3VzZXdoZWVsRXZlbnROYW1lLCB0aGlzLl9tb3VzZVdoZWVsSGFuZGxlcik7XG4gICAgfSxcbiAgICBkZXZpY2VTdXBwb3J0VW5pbnN0YWxsOiBmdW5jdGlvbiBkZXZpY2VTdXBwb3J0VW5pbnN0YWxsKCkge1xuICAgICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuX2tleURvd25IYW5kbGVyKTtcbiAgICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShkb2N1bWVudCwgbW91c2V3aGVlbEV2ZW50TmFtZSwgdGhpcy5fbW91c2VXaGVlbEhhbmRsZXIpO1xuICAgICAgdGhpcy5fa2V5RG93bkhhbmRsZXIgPSBudWxsO1xuICAgICAgdGhpcy5fbW91c2VXaGVlbEhhbmRsZXIgPSBudWxsO1xuICAgIH0sXG4gICAgaGFuZGxlSW1nTG9hZDogZnVuY3Rpb24gaGFuZGxlSW1nTG9hZChlKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZUltZ0Vycm9yOiBmdW5jdGlvbiBoYW5kbGVJbWdFcnJvcihlKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIGUudGFyZ2V0LmFsdCA9ICfliqDovb3lpLHotKUnO1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VEb3duOiBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLmxvYWRpbmcgfHwgZS5idXR0b24gIT09IDApIHJldHVybjtcblxuICAgICAgdmFyIF90cmFuc2Zvcm0yID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgb2Zmc2V0WCA9IF90cmFuc2Zvcm0yLm9mZnNldFgsXG4gICAgICAgICAgb2Zmc2V0WSA9IF90cmFuc2Zvcm0yLm9mZnNldFk7XG5cbiAgICAgIHZhciBzdGFydFggPSBlLnBhZ2VYO1xuICAgICAgdmFyIHN0YXJ0WSA9IGUucGFnZVk7XG4gICAgICB0aGlzLl9kcmFnSGFuZGxlciA9IE9iamVjdCh1dGlsX1tcInJhZlRocm90dGxlXCJdKShmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgX3RoaXMzLnRyYW5zZm9ybS5vZmZzZXRYID0gb2Zmc2V0WCArIGV2LnBhZ2VYIC0gc3RhcnRYO1xuICAgICAgICBfdGhpczMudHJhbnNmb3JtLm9mZnNldFkgPSBvZmZzZXRZICsgZXYucGFnZVkgLSBzdGFydFk7XG4gICAgICB9KTtcbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fZHJhZ0hhbmRsZXIpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkoZG9jdW1lbnQsICdtb3VzZXVwJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShkb2N1bWVudCwgJ21vdXNlbW92ZScsIF90aGlzMy5fZHJhZ0hhbmRsZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuICAgIGhhbmRsZU1hc2tDbGljazogZnVuY3Rpb24gaGFuZGxlTWFza0NsaWNrKCkge1xuICAgICAgaWYgKHRoaXMubWFza0Nsb3NhYmxlKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgICBkZWc6IDAsXG4gICAgICAgIG9mZnNldFg6IDAsXG4gICAgICAgIG9mZnNldFk6IDAsXG4gICAgICAgIGVuYWJsZVRyYW5zaXRpb246IGZhbHNlXG4gICAgICB9O1xuICAgIH0sXG4gICAgdG9nZ2xlTW9kZTogZnVuY3Rpb24gdG9nZ2xlTW9kZSgpIHtcbiAgICAgIGlmICh0aGlzLmxvYWRpbmcpIHJldHVybjtcblxuICAgICAgdmFyIG1vZGVOYW1lcyA9IE9iamVjdC5rZXlzKE1vZGUpO1xuICAgICAgdmFyIG1vZGVWYWx1ZXMgPSBPYmplY3QudmFsdWVzKE1vZGUpO1xuICAgICAgdmFyIGluZGV4ID0gbW9kZVZhbHVlcy5pbmRleE9mKHRoaXMubW9kZSk7XG4gICAgICB2YXIgbmV4dEluZGV4ID0gKGluZGV4ICsgMSkgJSBtb2RlTmFtZXMubGVuZ3RoO1xuICAgICAgdGhpcy5tb2RlID0gTW9kZVttb2RlTmFtZXNbbmV4dEluZGV4XV07XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSxcbiAgICBwcmV2OiBmdW5jdGlvbiBwcmV2KCkge1xuICAgICAgaWYgKHRoaXMuaXNGaXJzdCAmJiAhdGhpcy5pbmZpbml0ZSkgcmV0dXJuO1xuICAgICAgdmFyIGxlbiA9IHRoaXMudXJsTGlzdC5sZW5ndGg7XG4gICAgICB0aGlzLmluZGV4ID0gKHRoaXMuaW5kZXggLSAxICsgbGVuKSAlIGxlbjtcbiAgICB9LFxuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAodGhpcy5pc0xhc3QgJiYgIXRoaXMuaW5maW5pdGUpIHJldHVybjtcbiAgICAgIHZhciBsZW4gPSB0aGlzLnVybExpc3QubGVuZ3RoO1xuICAgICAgdGhpcy5pbmRleCA9ICh0aGlzLmluZGV4ICsgMSkgJSBsZW47XG4gICAgfSxcbiAgICBoYW5kbGVBY3Rpb25zOiBmdW5jdGlvbiBoYW5kbGVBY3Rpb25zKGFjdGlvbikge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XG5cbiAgICAgIHZhciBfem9vbVJhdGUkcm90YXRlRGVnJGUgPSBpbWFnZV92aWV3ZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19leHRlbmRzKHtcbiAgICAgICAgem9vbVJhdGU6IDAuMixcbiAgICAgICAgcm90YXRlRGVnOiA5MCxcbiAgICAgICAgZW5hYmxlVHJhbnNpdGlvbjogdHJ1ZVxuICAgICAgfSwgb3B0aW9ucyksXG4gICAgICAgICAgem9vbVJhdGUgPSBfem9vbVJhdGUkcm90YXRlRGVnJGUuem9vbVJhdGUsXG4gICAgICAgICAgcm90YXRlRGVnID0gX3pvb21SYXRlJHJvdGF0ZURlZyRlLnJvdGF0ZURlZyxcbiAgICAgICAgICBlbmFibGVUcmFuc2l0aW9uID0gX3pvb21SYXRlJHJvdGF0ZURlZyRlLmVuYWJsZVRyYW5zaXRpb247XG5cbiAgICAgIHZhciB0cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybTtcblxuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgY2FzZSAnem9vbU91dCc6XG4gICAgICAgICAgaWYgKHRyYW5zZm9ybS5zY2FsZSA+IDAuMikge1xuICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlID0gcGFyc2VGbG9hdCgodHJhbnNmb3JtLnNjYWxlIC0gem9vbVJhdGUpLnRvRml4ZWQoMykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnem9vbUluJzpcbiAgICAgICAgICB0cmFuc2Zvcm0uc2NhbGUgPSBwYXJzZUZsb2F0KCh0cmFuc2Zvcm0uc2NhbGUgKyB6b29tUmF0ZSkudG9GaXhlZCgzKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Nsb2NlbGlzZSc6XG4gICAgICAgICAgdHJhbnNmb3JtLmRlZyArPSByb3RhdGVEZWc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FudGljbG9jZWxpc2UnOlxuICAgICAgICAgIHRyYW5zZm9ybS5kZWcgLT0gcm90YXRlRGVnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdHJhbnNmb3JtLmVuYWJsZVRyYW5zaXRpb24gPSBlbmFibGVUcmFuc2l0aW9uO1xuICAgIH1cbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB0aGlzLmRldmljZVN1cHBvcnRJbnN0YWxsKCk7XG4gICAgaWYgKHRoaXMuYXBwZW5kVG9Cb2R5KSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuJGVsKTtcbiAgICB9XG4gICAgLy8gYWRkIHRhYmluZGV4IHRoZW4gd3JhcHBlciBjYW4gYmUgZm9jdXNhYmxlIHZpYSBKYXZhc2NyaXB0XG4gICAgLy8gZm9jdXMgd3JhcHBlciBzbyBhcnJvdyBrZXkgY2FuJ3QgY2F1c2UgaW5uZXIgc2Nyb2xsIGJlaGF2aW9yIHVuZGVybmVhdGhcbiAgICB0aGlzLiRyZWZzWydlbC1pbWFnZS12aWV3ZXJfX3dyYXBwZXInXS5mb2N1cygpO1xuICB9LFxuICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICAvLyBpZiBhcHBlbmRUb0JvZHkgaXMgdHJ1ZSwgcmVtb3ZlIERPTSBub2RlIGFmdGVyIGRlc3Ryb3lcbiAgICBpZiAodGhpcy5hcHBlbmRUb0JvZHkgJiYgdGhpcy4kZWwgJiYgdGhpcy4kZWwucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy4kZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLiRlbCk7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW1hZ2Uvc3JjL2ltYWdlLXZpZXdlci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2ltYWdlX3ZpZXdlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChpbWFnZV92aWV3ZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW1hZ2Uvc3JjL2ltYWdlLXZpZXdlci52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBpbWFnZV92aWV3ZXJfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfaW1hZ2Vfdmlld2VydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBpbWFnZV92aWV3ZXJ2dWVfdHlwZV90ZW1wbGF0ZV9pZF81ZTczYjMwN19yZW5kZXIsXG4gIGltYWdlX3ZpZXdlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzVlNzNiMzA3X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgaW1hZ2Vfdmlld2VyX2FwaTsgfVxuaW1hZ2Vfdmlld2VyX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvaW1hZ2Uvc3JjL2ltYWdlLXZpZXdlci52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaW1hZ2Vfdmlld2VyID0gKGltYWdlX3ZpZXdlcl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9pbWFnZS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxuXG5cblxudmFyIGlzU3VwcG9ydE9iamVjdEZpdCA9IGZ1bmN0aW9uIGlzU3VwcG9ydE9iamVjdEZpdCgpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5vYmplY3RGaXQgIT09IHVuZGVmaW5lZDtcbn07XG5cbnZhciBPYmplY3RGaXQgPSB7XG4gIE5PTkU6ICdub25lJyxcbiAgQ09OVEFJTjogJ2NvbnRhaW4nLFxuICBDT1ZFUjogJ2NvdmVyJyxcbiAgRklMTDogJ2ZpbGwnLFxuICBTQ0FMRV9ET1dOOiAnc2NhbGUtZG93bidcbn07XG5cbnZhciBwcmV2T3ZlcmZsb3cgPSAnJztcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaW1hZ2Vfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxJbWFnZScsXG5cbiAgbWl4aW5zOiBbbG9jYWxlX2RlZmF1bHQuYV0sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgY29tcG9uZW50czoge1xuICAgIEltYWdlVmlld2VyOiBpbWFnZV92aWV3ZXJcbiAgfSxcblxuICBwcm9wczoge1xuICAgIHNyYzogU3RyaW5nLFxuICAgIGZpdDogU3RyaW5nLFxuICAgIGxhenk6IEJvb2xlYW4sXG4gICAgc2Nyb2xsQ29udGFpbmVyOiB7fSxcbiAgICBwcmV2aWV3U3JjTGlzdDoge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0sXG4gICAgekluZGV4OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAyMDAwXG4gICAgfSxcbiAgICBpbml0aWFsSW5kZXg6IE51bWJlclxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICBlcnJvcjogZmFsc2UsXG4gICAgICBzaG93OiAhdGhpcy5sYXp5LFxuICAgICAgaW1hZ2VXaWR0aDogMCxcbiAgICAgIGltYWdlSGVpZ2h0OiAwLFxuICAgICAgc2hvd1ZpZXdlcjogZmFsc2VcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpbWFnZVN0eWxlOiBmdW5jdGlvbiBpbWFnZVN0eWxlKCkge1xuICAgICAgdmFyIGZpdCA9IHRoaXMuZml0O1xuXG4gICAgICBpZiAoIXRoaXMuJGlzU2VydmVyICYmIGZpdCkge1xuICAgICAgICByZXR1cm4gaXNTdXBwb3J0T2JqZWN0Rml0KCkgPyB7ICdvYmplY3QtZml0JzogZml0IH0gOiB0aGlzLmdldEltYWdlU3R5bGUoZml0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICAgIGFsaWduQ2VudGVyOiBmdW5jdGlvbiBhbGlnbkNlbnRlcigpIHtcbiAgICAgIHJldHVybiAhdGhpcy4kaXNTZXJ2ZXIgJiYgIWlzU3VwcG9ydE9iamVjdEZpdCgpICYmIHRoaXMuZml0ICE9PSBPYmplY3RGaXQuRklMTDtcbiAgICB9LFxuICAgIHByZXZpZXc6IGZ1bmN0aW9uIHByZXZpZXcoKSB7XG4gICAgICB2YXIgcHJldmlld1NyY0xpc3QgPSB0aGlzLnByZXZpZXdTcmNMaXN0O1xuXG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwcmV2aWV3U3JjTGlzdCkgJiYgcHJldmlld1NyY0xpc3QubGVuZ3RoID4gMDtcbiAgICB9LFxuICAgIGltYWdlSW5kZXg6IGZ1bmN0aW9uIGltYWdlSW5kZXgoKSB7XG4gICAgICB2YXIgcHJldmlld0luZGV4ID0gMDtcbiAgICAgIHZhciBpbml0aWFsSW5kZXggPSB0aGlzLmluaXRpYWxJbmRleDtcbiAgICAgIGlmIChpbml0aWFsSW5kZXggPj0gMCkge1xuICAgICAgICBwcmV2aWV3SW5kZXggPSBpbml0aWFsSW5kZXg7XG4gICAgICAgIHJldHVybiBwcmV2aWV3SW5kZXg7XG4gICAgICB9XG4gICAgICB2YXIgc3JjSW5kZXggPSB0aGlzLnByZXZpZXdTcmNMaXN0LmluZGV4T2YodGhpcy5zcmMpO1xuICAgICAgaWYgKHNyY0luZGV4ID49IDApIHtcbiAgICAgICAgcHJldmlld0luZGV4ID0gc3JjSW5kZXg7XG4gICAgICAgIHJldHVybiBwcmV2aWV3SW5kZXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJldmlld0luZGV4O1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHNyYzogZnVuY3Rpb24gc3JjKHZhbCkge1xuICAgICAgdGhpcy5zaG93ICYmIHRoaXMubG9hZEltYWdlKCk7XG4gICAgfSxcbiAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCkge1xuICAgICAgdmFsICYmIHRoaXMubG9hZEltYWdlKCk7XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgaWYgKHRoaXMubGF6eSkge1xuICAgICAgdGhpcy5hZGRMYXp5TG9hZExpc3RlbmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9hZEltYWdlKCk7XG4gICAgfVxuICB9LFxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIHRoaXMubGF6eSAmJiB0aGlzLnJlbW92ZUxhenlMb2FkTGlzdGVuZXIoKTtcbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBsb2FkSW1hZ2U6IGZ1bmN0aW9uIGxvYWRJbWFnZSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLiRpc1NlcnZlcikgcmV0dXJuO1xuXG4gICAgICAvLyByZXNldCBzdGF0dXNcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLmVycm9yID0gZmFsc2U7XG5cbiAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gX3RoaXMuaGFuZGxlTG9hZChlLCBpbWcpO1xuICAgICAgfTtcbiAgICAgIGltZy5vbmVycm9yID0gdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpO1xuXG4gICAgICAvLyBiaW5kIGh0bWwgYXR0cnNcbiAgICAgIC8vIHNvIGl0IGNhbiBiZWhhdmUgY29uc2lzdGVudGx5XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLiRhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IF90aGlzLiRhdHRyc1trZXldO1xuICAgICAgICBpbWcuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICBpbWcuc3JjID0gdGhpcy5zcmM7XG4gICAgfSxcbiAgICBoYW5kbGVMb2FkOiBmdW5jdGlvbiBoYW5kbGVMb2FkKGUsIGltZykge1xuICAgICAgdGhpcy5pbWFnZVdpZHRoID0gaW1nLndpZHRoO1xuICAgICAgdGhpcy5pbWFnZUhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuZXJyb3IgPSBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZUVycm9yOiBmdW5jdGlvbiBoYW5kbGVFcnJvcihlKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuZXJyb3IgPSB0cnVlO1xuICAgICAgdGhpcy4kZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9LFxuICAgIGhhbmRsZUxhenlMb2FkOiBmdW5jdGlvbiBoYW5kbGVMYXp5TG9hZCgpIHtcbiAgICAgIGlmIChPYmplY3QoZG9tX1tcImlzSW5Db250YWluZXJcIl0pKHRoaXMuJGVsLCB0aGlzLl9zY3JvbGxDb250YWluZXIpKSB7XG4gICAgICAgIHRoaXMuc2hvdyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVtb3ZlTGF6eUxvYWRMaXN0ZW5lcigpO1xuICAgICAgfVxuICAgIH0sXG4gICAgYWRkTGF6eUxvYWRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkTGF6eUxvYWRMaXN0ZW5lcigpIHtcbiAgICAgIGlmICh0aGlzLiRpc1NlcnZlcikgcmV0dXJuO1xuXG4gICAgICB2YXIgc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5zY3JvbGxDb250YWluZXI7XG5cbiAgICAgIHZhciBfc2Nyb2xsQ29udGFpbmVyID0gbnVsbDtcblxuICAgICAgaWYgKE9iamVjdCh0eXBlc19bXCJpc0h0bWxFbGVtZW50XCJdKShzY3JvbGxDb250YWluZXIpKSB7XG4gICAgICAgIF9zY3JvbGxDb250YWluZXIgPSBzY3JvbGxDb250YWluZXI7XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdCh0eXBlc19bXCJpc1N0cmluZ1wiXSkoc2Nyb2xsQ29udGFpbmVyKSkge1xuICAgICAgICBfc2Nyb2xsQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzY3JvbGxDb250YWluZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3Njcm9sbENvbnRhaW5lciA9IE9iamVjdChkb21fW1wiZ2V0U2Nyb2xsQ29udGFpbmVyXCJdKSh0aGlzLiRlbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfc2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuX3Njcm9sbENvbnRhaW5lciA9IF9zY3JvbGxDb250YWluZXI7XG4gICAgICAgIHRoaXMuX2xhenlMb2FkSGFuZGxlciA9IHRocm90dGxlX2RlZmF1bHQoKSgyMDAsIHRoaXMuaGFuZGxlTGF6eUxvYWQpO1xuICAgICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShfc2Nyb2xsQ29udGFpbmVyLCAnc2Nyb2xsJywgdGhpcy5fbGF6eUxvYWRIYW5kbGVyKTtcbiAgICAgICAgdGhpcy5oYW5kbGVMYXp5TG9hZCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVtb3ZlTGF6eUxvYWRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGF6eUxvYWRMaXN0ZW5lcigpIHtcbiAgICAgIHZhciBfc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5fc2Nyb2xsQ29udGFpbmVyLFxuICAgICAgICAgIF9sYXp5TG9hZEhhbmRsZXIgPSB0aGlzLl9sYXp5TG9hZEhhbmRsZXI7XG5cblxuICAgICAgaWYgKHRoaXMuJGlzU2VydmVyIHx8ICFfc2Nyb2xsQ29udGFpbmVyIHx8ICFfbGF6eUxvYWRIYW5kbGVyKSByZXR1cm47XG5cbiAgICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShfc2Nyb2xsQ29udGFpbmVyLCAnc2Nyb2xsJywgX2xhenlMb2FkSGFuZGxlcik7XG4gICAgICB0aGlzLl9zY3JvbGxDb250YWluZXIgPSBudWxsO1xuICAgICAgdGhpcy5fbGF6eUxvYWRIYW5kbGVyID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogc2ltdWxhdGUgb2JqZWN0LWZpdCBiZWhhdmlvciB0byBjb21wYXRpYmxlIHdpdGggSUUxMSBhbmQgb3RoZXIgYnJvd3NlcnMgd2hpY2ggbm90IHN1cHBvcnQgb2JqZWN0LWZpdFxuICAgICAqL1xuICAgIGdldEltYWdlU3R5bGU6IGZ1bmN0aW9uIGdldEltYWdlU3R5bGUoZml0KSB7XG4gICAgICB2YXIgaW1hZ2VXaWR0aCA9IHRoaXMuaW1hZ2VXaWR0aCxcbiAgICAgICAgICBpbWFnZUhlaWdodCA9IHRoaXMuaW1hZ2VIZWlnaHQ7XG4gICAgICB2YXIgXyRlbCA9IHRoaXMuJGVsLFxuICAgICAgICAgIGNvbnRhaW5lcldpZHRoID0gXyRlbC5jbGllbnRXaWR0aCxcbiAgICAgICAgICBjb250YWluZXJIZWlnaHQgPSBfJGVsLmNsaWVudEhlaWdodDtcblxuXG4gICAgICBpZiAoIWltYWdlV2lkdGggfHwgIWltYWdlSGVpZ2h0IHx8ICFjb250YWluZXJXaWR0aCB8fCAhY29udGFpbmVySGVpZ2h0KSByZXR1cm4ge307XG5cbiAgICAgIHZhciBpbWFnZUFzcGVjdFJhdGlvID0gaW1hZ2VXaWR0aCAvIGltYWdlSGVpZ2h0O1xuICAgICAgdmFyIGNvbnRhaW5lckFzcGVjdFJhdGlvID0gY29udGFpbmVyV2lkdGggLyBjb250YWluZXJIZWlnaHQ7XG5cbiAgICAgIGlmIChmaXQgPT09IE9iamVjdEZpdC5TQ0FMRV9ET1dOKSB7XG4gICAgICAgIHZhciBpc1NtYWxsZXIgPSBpbWFnZVdpZHRoIDwgY29udGFpbmVyV2lkdGggJiYgaW1hZ2VIZWlnaHQgPCBjb250YWluZXJIZWlnaHQ7XG4gICAgICAgIGZpdCA9IGlzU21hbGxlciA/IE9iamVjdEZpdC5OT05FIDogT2JqZWN0Rml0LkNPTlRBSU47XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZml0KSB7XG4gICAgICAgIGNhc2UgT2JqZWN0Rml0Lk5PTkU6XG4gICAgICAgICAgcmV0dXJuIHsgd2lkdGg6ICdhdXRvJywgaGVpZ2h0OiAnYXV0bycgfTtcbiAgICAgICAgY2FzZSBPYmplY3RGaXQuQ09OVEFJTjpcbiAgICAgICAgICByZXR1cm4gaW1hZ2VBc3BlY3RSYXRpbyA8IGNvbnRhaW5lckFzcGVjdFJhdGlvID8geyB3aWR0aDogJ2F1dG8nIH0gOiB7IGhlaWdodDogJ2F1dG8nIH07XG4gICAgICAgIGNhc2UgT2JqZWN0Rml0LkNPVkVSOlxuICAgICAgICAgIHJldHVybiBpbWFnZUFzcGVjdFJhdGlvIDwgY29udGFpbmVyQXNwZWN0UmF0aW8gPyB7IGhlaWdodDogJ2F1dG8nIH0gOiB7IHdpZHRoOiAnYXV0bycgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICBjbGlja0hhbmRsZXI6IGZ1bmN0aW9uIGNsaWNrSGFuZGxlcigpIHtcbiAgICAgIC8vIGRvbid0IHNob3cgdmlld2VyIHdoZW4gcHJldmlldyBpcyBmYWxzZVxuICAgICAgaWYgKCF0aGlzLnByZXZpZXcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gcHJldmVudCBib2R5IHNjcm9sbFxuICAgICAgcHJldk92ZXJmbG93ID0gZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdztcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgIHRoaXMuc2hvd1ZpZXdlciA9IHRydWU7XG4gICAgfSxcbiAgICBjbG9zZVZpZXdlcjogZnVuY3Rpb24gY2xvc2VWaWV3ZXIoKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gcHJldk92ZXJmbG93O1xuICAgICAgdGhpcy5zaG93Vmlld2VyID0gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW1hZ2Uvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2ltYWdlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGltYWdlX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2ltYWdlL3NyYy9tYWluLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGltYWdlX3NyY19tYWluX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfaW1hZ2Vfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80NGQ4NGE3Y19yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF80NGQ4NGE3Y19zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGltYWdlX3NyY19tYWluX2FwaTsgfVxuaW1hZ2Vfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9pbWFnZS9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaW1hZ2Vfc3JjX21haW4gPSAoaW1hZ2Vfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbWFnZS9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5pbWFnZV9zcmNfbWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KGltYWdlX3NyY19tYWluLm5hbWUsIGltYWdlX3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2ltYWdlID0gKGltYWdlX3NyY19tYWluKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2FsZW5kYXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZkOTc1NmJlJlxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82ZDk3NTZiZV9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1jYWxlbmRhclwiIH0sIFtcbiAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWNhbGVuZGFyX19oZWFkZXJcIiB9LCBbXG4gICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWNhbGVuZGFyX190aXRsZVwiIH0sIFtcbiAgICAgICAgX3ZtLl92KFwiXFxuICAgICAgXCIgKyBfdm0uX3MoX3ZtLmkxOG5EYXRlKSArIFwiXFxuICAgIFwiKVxuICAgICAgXSksXG4gICAgICBfdm0udmFsaWRhdGVkUmFuZ2UubGVuZ3RoID09PSAwXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1jYWxlbmRhcl9fYnV0dG9uLWdyb3VwXCIgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJlbC1idXR0b24tZ3JvdXBcIixcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJlbC1idXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7IHR5cGU6IFwicGxhaW5cIiwgc2l6ZTogXCJtaW5pXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uc2VsZWN0RGF0ZShcInByZXYtbW9udGhcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgICBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fcyhfdm0udChcImVsLmRhdGVwaWNrZXIucHJldk1vbnRoXCIpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICBcImVsLWJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgdHlwZTogXCJwbGFpblwiLCBzaXplOiBcIm1pbmlcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zZWxlY3REYXRlKFwidG9kYXlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgICBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fcyhfdm0udChcImVsLmRhdGVwaWNrZXIudG9kYXlcIikpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgIFwiZWwtYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyB0eXBlOiBcInBsYWluXCIsIHNpemU6IFwibWluaVwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnNlbGVjdERhdGUoXCJuZXh0LW1vbnRoXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgICAgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLnQoXCJlbC5kYXRlcGlja2VyLm5leHRNb250aFwiKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApXG4gICAgICAgIDogX3ZtLl9lKClcbiAgICBdKSxcbiAgICBfdm0udmFsaWRhdGVkUmFuZ2UubGVuZ3RoID09PSAwXG4gICAgICA/IF9jKFxuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgeyBrZXk6IFwibm8tcmFuZ2VcIiwgc3RhdGljQ2xhc3M6IFwiZWwtY2FsZW5kYXJfX2JvZHlcIiB9LFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIF9jKFwiZGF0ZS10YWJsZVwiLCB7XG4gICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgZGF0ZTogX3ZtLmRhdGUsXG4gICAgICAgICAgICAgICAgXCJzZWxlY3RlZC1kYXlcIjogX3ZtLnJlYWxTZWxlY3RlZERheSxcbiAgICAgICAgICAgICAgICBcImZpcnN0LWRheS1vZi13ZWVrXCI6IF92bS5yZWFsRmlyc3REYXlPZldlZWtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb246IHsgcGljazogX3ZtLnBpY2tEYXkgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdLFxuICAgICAgICAgIDFcbiAgICAgICAgKVxuICAgICAgOiBfYyhcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHsga2V5OiBcImhhcy1yYW5nZVwiLCBzdGF0aWNDbGFzczogXCJlbC1jYWxlbmRhcl9fYm9keVwiIH0sXG4gICAgICAgICAgX3ZtLl9sKF92bS52YWxpZGF0ZWRSYW5nZSwgZnVuY3Rpb24ocmFuZ2UsIGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gX2MoXCJkYXRlLXRhYmxlXCIsIHtcbiAgICAgICAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICBkYXRlOiByYW5nZVswXSxcbiAgICAgICAgICAgICAgICBcInNlbGVjdGVkLWRheVwiOiBfdm0ucmVhbFNlbGVjdGVkRGF5LFxuICAgICAgICAgICAgICAgIHJhbmdlOiByYW5nZSxcbiAgICAgICAgICAgICAgICBcImhpZGUtaGVhZGVyXCI6IGluZGV4ICE9PSAwLFxuICAgICAgICAgICAgICAgIFwiZmlyc3QtZGF5LW9mLXdlZWtcIjogX3ZtLnJlYWxGaXJzdERheU9mV2Vla1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvbjogeyBwaWNrOiBfdm0ucGlja0RheSB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIDFcbiAgICAgICAgKVxuICBdKVxufVxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82ZDk3NTZiZV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxubWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzZkOTc1NmJlX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FsZW5kYXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZkOTc1NmJlJlxuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvZGF0ZVwiXG52YXIgZGF0ZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcbnZhciBkYXRlX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGRhdGVfKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2FsZW5kYXIvc3JjL2RhdGUtdGFibGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfZGF0ZV90YWJsZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIHByb3BzOiB7XG4gICAgc2VsZWN0ZWREYXk6IFN0cmluZywgLy8gZm9ybWF0ZWQgZGF0ZSB5eXl5LU1NLWRkXG4gICAgcmFuZ2U6IHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsKSB7XG4gICAgICAgIGlmICghKHZhbCAmJiB2YWwubGVuZ3RoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciBzdGFydCA9IHZhbFswXSxcbiAgICAgICAgICAgIGVuZCA9IHZhbFsxXTtcblxuICAgICAgICByZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bXCJ2YWxpZGF0ZVJhbmdlSW5PbmVNb250aFwiXSkoc3RhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkYXRlOiBEYXRlLFxuICAgIGhpZGVIZWFkZXI6IEJvb2xlYW4sXG4gICAgZmlyc3REYXlPZldlZWs6IE51bWJlclxuICB9LFxuXG4gIGluamVjdDogWydlbENhbGVuZGFyJ10sXG5cbiAgbWV0aG9kczoge1xuICAgIHRvTmVzdGVkQXJyOiBmdW5jdGlvbiB0b05lc3RlZEFycihkYXlzKSB7XG4gICAgICByZXR1cm4gT2JqZWN0KGRhdGVfdXRpbF9bXCJyYW5nZVwiXSkoZGF5cy5sZW5ndGggLyA3KS5tYXAoZnVuY3Rpb24gKF8sIGluZGV4KSB7XG4gICAgICAgIHZhciBzdGFydCA9IGluZGV4ICogNztcbiAgICAgICAgcmV0dXJuIGRheXMuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgNyk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldEZvcm1hdGVEYXRlOiBmdW5jdGlvbiBnZXRGb3JtYXRlRGF0ZShkYXksIHR5cGUpIHtcbiAgICAgIGlmICghZGF5IHx8IFsncHJldicsICdjdXJyZW50JywgJ25leHQnXS5pbmRleE9mKHR5cGUpID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGF5IG9yIHR5cGUnKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcmVmaXggPSB0aGlzLmN1ck1vbnRoRGF0ZVByZWZpeDtcbiAgICAgIGlmICh0eXBlID09PSAncHJldicpIHtcbiAgICAgICAgcHJlZml4ID0gdGhpcy5wcmV2TW9udGhEYXRlUHJlZml4O1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbmV4dCcpIHtcbiAgICAgICAgcHJlZml4ID0gdGhpcy5uZXh0TW9udGhEYXRlUHJlZml4O1xuICAgICAgfVxuICAgICAgZGF5ID0gKCcwMCcgKyBkYXkpLnNsaWNlKC0yKTtcbiAgICAgIHJldHVybiBwcmVmaXggKyAnLScgKyBkYXk7XG4gICAgfSxcbiAgICBnZXRDZWxsQ2xhc3M6IGZ1bmN0aW9uIGdldENlbGxDbGFzcyhfcmVmKSB7XG4gICAgICB2YXIgdGV4dCA9IF9yZWYudGV4dCxcbiAgICAgICAgICB0eXBlID0gX3JlZi50eXBlO1xuXG4gICAgICB2YXIgY2xhc3NlcyA9IFt0eXBlXTtcbiAgICAgIGlmICh0eXBlID09PSAnY3VycmVudCcpIHtcbiAgICAgICAgdmFyIGRhdGUgPSB0aGlzLmdldEZvcm1hdGVEYXRlKHRleHQsIHR5cGUpO1xuICAgICAgICBpZiAoZGF0ZSA9PT0gdGhpcy5zZWxlY3RlZERheSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnaXMtc2VsZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZSA9PT0gdGhpcy5mb3JtYXRlZFRvZGF5KSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpcy10b2RheScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3NlcztcbiAgICB9LFxuICAgIHBpY2tEYXk6IGZ1bmN0aW9uIHBpY2tEYXkoX3JlZjIpIHtcbiAgICAgIHZhciB0ZXh0ID0gX3JlZjIudGV4dCxcbiAgICAgICAgICB0eXBlID0gX3JlZjIudHlwZTtcblxuICAgICAgdmFyIGRhdGUgPSB0aGlzLmdldEZvcm1hdGVEYXRlKHRleHQsIHR5cGUpO1xuICAgICAgdGhpcy4kZW1pdCgncGljaycsIGRhdGUpO1xuICAgIH0sXG4gICAgY2VsbFJlbmRlclByb3h5OiBmdW5jdGlvbiBjZWxsUmVuZGVyUHJveHkoX3JlZjMpIHtcbiAgICAgIHZhciB0ZXh0ID0gX3JlZjMudGV4dCxcbiAgICAgICAgICB0eXBlID0gX3JlZjMudHlwZTtcbiAgICAgIHZhciBoID0gdGhpcy4kY3JlYXRlRWxlbWVudDtcblxuICAgICAgdmFyIHJlbmRlciA9IHRoaXMuZWxDYWxlbmRhci4kc2NvcGVkU2xvdHMuZGF0ZUNlbGw7XG4gICAgICBpZiAoIXJlbmRlcikgcmV0dXJuIGgoJ3NwYW4nLCBbdGV4dF0pO1xuXG4gICAgICB2YXIgZGF5ID0gdGhpcy5nZXRGb3JtYXRlRGF0ZSh0ZXh0LCB0eXBlKTtcbiAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoZGF5KTtcbiAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICBpc1NlbGVjdGVkOiB0aGlzLnNlbGVjdGVkRGF5ID09PSBkYXksXG4gICAgICAgIHR5cGU6IHR5cGUgKyAnLW1vbnRoJyxcbiAgICAgICAgZGF5OiBkYXlcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVuZGVyKHsgZGF0ZTogZGF0ZSwgZGF0YTogZGF0YSB9KTtcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBXRUVLX0RBWVM6IGZ1bmN0aW9uIFdFRUtfREFZUygpIHtcbiAgICAgIHJldHVybiBPYmplY3QoZGF0ZV91dGlsX1tcImdldEkxOG5TZXR0aW5nc1wiXSkoKS5kYXlOYW1lcztcbiAgICB9LFxuICAgIHByZXZNb250aERhdGVQcmVmaXg6IGZ1bmN0aW9uIHByZXZNb250aERhdGVQcmVmaXgoKSB7XG4gICAgICB2YXIgdGVtcCA9IG5ldyBEYXRlKHRoaXMuZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgdGVtcC5zZXREYXRlKDApO1xuICAgICAgcmV0dXJuIGRhdGVfZGVmYXVsdC5hLmZvcm1hdCh0ZW1wLCAneXl5eS1NTScpO1xuICAgIH0sXG4gICAgY3VyTW9udGhEYXRlUHJlZml4OiBmdW5jdGlvbiBjdXJNb250aERhdGVQcmVmaXgoKSB7XG4gICAgICByZXR1cm4gZGF0ZV9kZWZhdWx0LmEuZm9ybWF0KHRoaXMuZGF0ZSwgJ3l5eXktTU0nKTtcbiAgICB9LFxuICAgIG5leHRNb250aERhdGVQcmVmaXg6IGZ1bmN0aW9uIG5leHRNb250aERhdGVQcmVmaXgoKSB7XG4gICAgICB2YXIgdGVtcCA9IG5ldyBEYXRlKHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLmRhdGUuZ2V0TW9udGgoKSArIDEsIDEpO1xuICAgICAgcmV0dXJuIGRhdGVfZGVmYXVsdC5hLmZvcm1hdCh0ZW1wLCAneXl5eS1NTScpO1xuICAgIH0sXG4gICAgZm9ybWF0ZWRUb2RheTogZnVuY3Rpb24gZm9ybWF0ZWRUb2RheSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsQ2FsZW5kYXIuZm9ybWF0ZWRUb2RheTtcbiAgICB9LFxuICAgIGlzSW5SYW5nZTogZnVuY3Rpb24gaXNJblJhbmdlKCkge1xuICAgICAgcmV0dXJuIHRoaXMucmFuZ2UgJiYgdGhpcy5yYW5nZS5sZW5ndGg7XG4gICAgfSxcbiAgICByb3dzOiBmdW5jdGlvbiByb3dzKCkge1xuICAgICAgdmFyIGRheXMgPSBbXTtcbiAgICAgIC8vIGlmIHJhbmdlIGV4aXN0cywgc2hvdWxkIHJlbmRlciBkYXlzIGluIHJhbmdlLlxuICAgICAgaWYgKHRoaXMuaXNJblJhbmdlKSB7XG4gICAgICAgIHZhciBfcmFuZ2UgPSB0aGlzLnJhbmdlLFxuICAgICAgICAgICAgc3RhcnQgPSBfcmFuZ2VbMF0sXG4gICAgICAgICAgICBlbmQgPSBfcmFuZ2VbMV07XG5cbiAgICAgICAgdmFyIGN1cnJlbnRNb250aFJhbmdlID0gT2JqZWN0KGRhdGVfdXRpbF9bXCJyYW5nZVwiXSkoZW5kLmdldERhdGUoKSAtIHN0YXJ0LmdldERhdGUoKSArIDEpLm1hcChmdW5jdGlvbiAoXywgaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dDogc3RhcnQuZ2V0RGF0ZSgpICsgaW5kZXgsXG4gICAgICAgICAgICB0eXBlOiAnY3VycmVudCdcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlbWFpbmluZyA9IGN1cnJlbnRNb250aFJhbmdlLmxlbmd0aCAlIDc7XG4gICAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZyA9PT0gMCA/IDAgOiA3IC0gcmVtYWluaW5nO1xuICAgICAgICB2YXIgbmV4dE1vbnRoUmFuZ2UgPSBPYmplY3QoZGF0ZV91dGlsX1tcInJhbmdlXCJdKShyZW1haW5pbmcpLm1hcChmdW5jdGlvbiAoXywgaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dDogaW5kZXggKyAxLFxuICAgICAgICAgICAgdHlwZTogJ25leHQnXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRheXMgPSBjdXJyZW50TW9udGhSYW5nZS5jb25jYXQobmV4dE1vbnRoUmFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGRhdGUgPSB0aGlzLmRhdGU7XG4gICAgICAgIHZhciBmaXJzdERheSA9IE9iamVjdChkYXRlX3V0aWxfW1wiZ2V0Rmlyc3REYXlPZk1vbnRoXCJdKShkYXRlKTtcbiAgICAgICAgZmlyc3REYXkgPSBmaXJzdERheSA9PT0gMCA/IDcgOiBmaXJzdERheTtcbiAgICAgICAgdmFyIGZpcnN0RGF5T2ZXZWVrID0gdHlwZW9mIHRoaXMuZmlyc3REYXlPZldlZWsgPT09ICdudW1iZXInID8gdGhpcy5maXJzdERheU9mV2VlayA6IDE7XG4gICAgICAgIHZhciBvZmZzZXQgPSAoNyArIGZpcnN0RGF5IC0gZmlyc3REYXlPZldlZWspICUgNztcbiAgICAgICAgdmFyIHByZXZNb250aERheXMgPSBPYmplY3QoZGF0ZV91dGlsX1tcImdldFByZXZNb250aExhc3REYXlzXCJdKShkYXRlLCBvZmZzZXQpLm1hcChmdW5jdGlvbiAoZGF5KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQ6IGRheSxcbiAgICAgICAgICAgIHR5cGU6ICdwcmV2J1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgY3VycmVudE1vbnRoRGF5cyA9IE9iamVjdChkYXRlX3V0aWxfW1wiZ2V0TW9udGhEYXlzXCJdKShkYXRlKS5tYXAoZnVuY3Rpb24gKGRheSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0OiBkYXksXG4gICAgICAgICAgICB0eXBlOiAnY3VycmVudCdcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgZGF5cyA9IFtdLmNvbmNhdChwcmV2TW9udGhEYXlzLCBjdXJyZW50TW9udGhEYXlzKTtcbiAgICAgICAgdmFyIG5leHRNb250aERheXMgPSBPYmplY3QoZGF0ZV91dGlsX1tcInJhbmdlXCJdKSg0MiAtIGRheXMubGVuZ3RoKS5tYXAoZnVuY3Rpb24gKF8sIGluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQ6IGluZGV4ICsgMSxcbiAgICAgICAgICAgIHR5cGU6ICduZXh0J1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBkYXlzID0gZGF5cy5jb25jYXQobmV4dE1vbnRoRGF5cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50b05lc3RlZEFycihkYXlzKTtcbiAgICB9LFxuICAgIHdlZWtEYXlzOiBmdW5jdGlvbiB3ZWVrRGF5cygpIHtcbiAgICAgIHZhciBzdGFydCA9IHRoaXMuZmlyc3REYXlPZldlZWs7XG4gICAgICB2YXIgV0VFS19EQVlTID0gdGhpcy5XRUVLX0RBWVM7XG5cblxuICAgICAgaWYgKHR5cGVvZiBzdGFydCAhPT0gJ251bWJlcicgfHwgc3RhcnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFdFRUtfREFZUy5zbGljZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFdFRUtfREFZUy5zbGljZShzdGFydCkuY29uY2F0KFdFRUtfREFZUy5zbGljZSgwLCBzdGFydCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGggPSBhcmd1bWVudHNbMF07XG5cbiAgICB2YXIgdGhlYWQgPSB0aGlzLmhpZGVIZWFkZXIgPyBudWxsIDogaCgndGhlYWQnLCBbdGhpcy53ZWVrRGF5cy5tYXAoZnVuY3Rpb24gKGRheSkge1xuICAgICAgcmV0dXJuIGgoXG4gICAgICAgICd0aCcsXG4gICAgICAgIHsga2V5OiBkYXkgfSxcbiAgICAgICAgW2RheV1cbiAgICAgICk7XG4gICAgfSldKTtcbiAgICByZXR1cm4gaChcbiAgICAgICd0YWJsZScsXG4gICAgICB7XG4gICAgICAgICdjbGFzcyc6IHtcbiAgICAgICAgICAnZWwtY2FsZW5kYXItdGFibGUnOiB0cnVlLFxuICAgICAgICAgICdpcy1yYW5nZSc6IHRoaXMuaXNJblJhbmdlXG4gICAgICAgIH0sXG4gICAgICAgIGF0dHJzOiB7IGNlbGxzcGFjaW5nOiAnMCcsXG4gICAgICAgICAgY2VsbHBhZGRpbmc6ICcwJyB9XG4gICAgICB9LFxuICAgICAgW3RoZWFkLCBoKCd0Ym9keScsIFt0aGlzLnJvd3MubWFwKGZ1bmN0aW9uIChyb3csIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBoKFxuICAgICAgICAgICd0cicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgJ2NsYXNzJzoge1xuICAgICAgICAgICAgICAnZWwtY2FsZW5kYXItdGFibGVfX3Jvdyc6IHRydWUsXG4gICAgICAgICAgICAgICdlbC1jYWxlbmRhci10YWJsZV9fcm93LS1oaWRlLWJvcmRlcic6IGluZGV4ID09PSAwICYmIF90aGlzLmhpZGVIZWFkZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBrZXk6IGluZGV4IH0sXG4gICAgICAgICAgW3Jvdy5tYXAoZnVuY3Rpb24gKGNlbGwsIGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGgoXG4gICAgICAgICAgICAgICd0ZCcsXG4gICAgICAgICAgICAgIHsga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgJ2NsYXNzJzogX3RoaXMuZ2V0Q2VsbENsYXNzKGNlbGwpLFxuICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAnY2xpY2snOiBfdGhpcy5waWNrRGF5LmJpbmQoX3RoaXMsIGNlbGwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbaChcbiAgICAgICAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICAgICAgICB7ICdjbGFzcyc6ICdlbC1jYWxlbmRhci1kYXknIH0sXG4gICAgICAgICAgICAgICAgW190aGlzLmNlbGxSZW5kZXJQcm94eShjZWxsKV1cbiAgICAgICAgICAgICAgKV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSldXG4gICAgICAgICk7XG4gICAgICB9KV0pXVxuICAgICk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYWxlbmRhci9zcmMvZGF0ZS10YWJsZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY2FsZW5kYXJfc3JjX2RhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoc3JjX2RhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FsZW5kYXIvc3JjL2RhdGUtdGFibGUudnVlXG52YXIgZGF0ZV90YWJsZV9yZW5kZXIsIGRhdGVfdGFibGVfc3RhdGljUmVuZGVyRm5zXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHNyY19kYXRlX3RhYmxlX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgY2FsZW5kYXJfc3JjX2RhdGVfdGFibGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGRhdGVfdGFibGVfcmVuZGVyLFxuICBkYXRlX3RhYmxlX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgc3JjX2RhdGVfdGFibGVfYXBpOyB9XG5zcmNfZGF0ZV90YWJsZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2NhbGVuZGFyL3NyYy9kYXRlLXRhYmxlLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfZGF0ZV90YWJsZSA9IChzcmNfZGF0ZV90YWJsZV9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYWxlbmRhci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cblxuXG5cbnZhciB2YWxpZFR5cGVzID0gWydwcmV2LW1vbnRoJywgJ3RvZGF5JywgJ25leHQtbW9udGgnXTtcbnZhciB3ZWVrRGF5cyA9IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXTtcbnZhciBvbmVEYXkgPSA4NjQwMDAwMDtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY2FsZW5kYXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxDYWxlbmRhcicsXG5cbiAgbWl4aW5zOiBbbG9jYWxlX2RlZmF1bHQuYV0sXG5cbiAgY29tcG9uZW50czoge1xuICAgIERhdGVUYWJsZTogc3JjX2RhdGVfdGFibGUsXG4gICAgRWxCdXR0b246IGJ1dHRvbl9kZWZhdWx0LmEsXG4gICAgRWxCdXR0b25Hcm91cDogYnV0dG9uX2dyb3VwX2RlZmF1bHQuYVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IFtEYXRlLCBTdHJpbmcsIE51bWJlcl0sXG4gICAgcmFuZ2U6IHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IocmFuZ2UpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmFuZ2UpKSB7XG4gICAgICAgICAgcmV0dXJuIHJhbmdlLmxlbmd0aCA9PT0gMiAmJiByYW5nZS5ldmVyeShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicgfHwgaXRlbSBpbnN0YW5jZW9mIERhdGU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZpcnN0RGF5T2ZXZWVrOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAxXG4gICAgfVxuICB9LFxuXG4gIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsQ2FsZW5kYXI6IHRoaXNcbiAgICB9O1xuICB9LFxuXG5cbiAgbWV0aG9kczoge1xuICAgIHBpY2tEYXk6IGZ1bmN0aW9uIHBpY2tEYXkoZGF5KSB7XG4gICAgICB0aGlzLnJlYWxTZWxlY3RlZERheSA9IGRheTtcbiAgICB9LFxuICAgIHNlbGVjdERhdGU6IGZ1bmN0aW9uIHNlbGVjdERhdGUodHlwZSkge1xuICAgICAgaWYgKHZhbGlkVHlwZXMuaW5kZXhPZih0eXBlKSA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHR5cGUgJyArIHR5cGUpO1xuICAgICAgfVxuICAgICAgdmFyIGRheSA9ICcnO1xuICAgICAgaWYgKHR5cGUgPT09ICdwcmV2LW1vbnRoJykge1xuICAgICAgICBkYXkgPSB0aGlzLnByZXZNb250aERhdGVQcmVmaXggKyAnLTAxJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ25leHQtbW9udGgnKSB7XG4gICAgICAgIGRheSA9IHRoaXMubmV4dE1vbnRoRGF0ZVByZWZpeCArICctMDEnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF5ID0gdGhpcy5mb3JtYXRlZFRvZGF5O1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF5ID09PSB0aGlzLmZvcm1hdGVkRGF0ZSkgcmV0dXJuO1xuICAgICAgdGhpcy5waWNrRGF5KGRheSk7XG4gICAgfSxcbiAgICB0b0RhdGU6IGZ1bmN0aW9uIHRvRGF0ZSh2YWwpIHtcbiAgICAgIGlmICghdmFsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YWwnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWwgaW5zdGFuY2VvZiBEYXRlID8gdmFsIDogbmV3IERhdGUodmFsKTtcbiAgICB9LFxuICAgIHJhbmdlVmFsaWRhdG9yOiBmdW5jdGlvbiByYW5nZVZhbGlkYXRvcihkYXRlLCBpc1N0YXJ0KSB7XG4gICAgICB2YXIgZmlyc3REYXlPZldlZWsgPSB0aGlzLnJlYWxGaXJzdERheU9mV2VlaztcbiAgICAgIHZhciBleHBlY3RlZCA9IGlzU3RhcnQgPyBmaXJzdERheU9mV2VlayA6IGZpcnN0RGF5T2ZXZWVrID09PSAwID8gNiA6IGZpcnN0RGF5T2ZXZWVrIC0gMTtcbiAgICAgIHZhciBtZXNzYWdlID0gKGlzU3RhcnQgPyAnc3RhcnQnIDogJ2VuZCcpICsgJyBvZiByYW5nZSBzaG91bGQgYmUgJyArIHdlZWtEYXlzW2V4cGVjdGVkXSArICcuJztcbiAgICAgIGlmIChkYXRlLmdldERheSgpICE9PSBleHBlY3RlZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tFbGVtZW50Q2FsZW5kYXJdJywgbWVzc2FnZSwgJ0ludmFsaWQgcmFuZ2Ugd2lsbCBiZSBpZ25vcmVkLicpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBwcmV2TW9udGhEYXRlUHJlZml4OiBmdW5jdGlvbiBwcmV2TW9udGhEYXRlUHJlZml4KCkge1xuICAgICAgdmFyIHRlbXAgPSBuZXcgRGF0ZSh0aGlzLmRhdGUuZ2V0VGltZSgpKTtcbiAgICAgIHRlbXAuc2V0RGF0ZSgwKTtcbiAgICAgIHJldHVybiBkYXRlX2RlZmF1bHQuYS5mb3JtYXQodGVtcCwgJ3l5eXktTU0nKTtcbiAgICB9LFxuICAgIGN1ck1vbnRoRGF0ZVByZWZpeDogZnVuY3Rpb24gY3VyTW9udGhEYXRlUHJlZml4KCkge1xuICAgICAgcmV0dXJuIGRhdGVfZGVmYXVsdC5hLmZvcm1hdCh0aGlzLmRhdGUsICd5eXl5LU1NJyk7XG4gICAgfSxcbiAgICBuZXh0TW9udGhEYXRlUHJlZml4OiBmdW5jdGlvbiBuZXh0TW9udGhEYXRlUHJlZml4KCkge1xuICAgICAgdmFyIHRlbXAgPSBuZXcgRGF0ZSh0aGlzLmRhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5kYXRlLmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICAgIHJldHVybiBkYXRlX2RlZmF1bHQuYS5mb3JtYXQodGVtcCwgJ3l5eXktTU0nKTtcbiAgICB9LFxuICAgIGZvcm1hdGVkRGF0ZTogZnVuY3Rpb24gZm9ybWF0ZWREYXRlKCkge1xuICAgICAgcmV0dXJuIGRhdGVfZGVmYXVsdC5hLmZvcm1hdCh0aGlzLmRhdGUsICd5eXl5LU1NLWRkJyk7XG4gICAgfSxcbiAgICBpMThuRGF0ZTogZnVuY3Rpb24gaTE4bkRhdGUoKSB7XG4gICAgICB2YXIgeWVhciA9IHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgdmFyIG1vbnRoID0gdGhpcy5kYXRlLmdldE1vbnRoKCkgKyAxO1xuICAgICAgcmV0dXJuIHllYXIgKyAnICcgKyB0aGlzLnQoJ2VsLmRhdGVwaWNrZXIueWVhcicpICsgJyAnICsgdGhpcy50KCdlbC5kYXRlcGlja2VyLm1vbnRoJyArIG1vbnRoKTtcbiAgICB9LFxuICAgIGZvcm1hdGVkVG9kYXk6IGZ1bmN0aW9uIGZvcm1hdGVkVG9kYXkoKSB7XG4gICAgICByZXR1cm4gZGF0ZV9kZWZhdWx0LmEuZm9ybWF0KHRoaXMubm93LCAneXl5eS1NTS1kZCcpO1xuICAgIH0sXG5cblxuICAgIHJlYWxTZWxlY3RlZERheToge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIGlmICghdGhpcy52YWx1ZSkgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdGVkRGF0ZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERheSA9IHZhbDtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh2YWwpO1xuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIGRhdGUpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBkYXRlOiBmdW5jdGlvbiBkYXRlKCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWxTZWxlY3RlZERheSkge1xuICAgICAgICAgIHZhciBkID0gdGhpcy5zZWxlY3RlZERheS5zcGxpdCgnLScpO1xuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShkWzBdLCBkWzFdIC0gMSwgZFsyXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWxpZGF0ZWRSYW5nZS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZWRSYW5nZVswXVswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ub3c7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy50b0RhdGUodGhpcy52YWx1ZSk7XG4gICAgICB9XG4gICAgfSxcblxuXG4gICAgLy8gaWYgcmFuZ2UgaXMgdmFsaWQsIHdlIGdldCBhIHR3by1kaWdpdCBhcnJheVxuICAgIHZhbGlkYXRlZFJhbmdlOiBmdW5jdGlvbiB2YWxpZGF0ZWRSYW5nZSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciByYW5nZSA9IHRoaXMucmFuZ2U7XG4gICAgICBpZiAoIXJhbmdlKSByZXR1cm4gW107XG4gICAgICByYW5nZSA9IHJhbmdlLnJlZHVjZShmdW5jdGlvbiAocHJldiwgdmFsLCBpbmRleCkge1xuICAgICAgICB2YXIgZGF0ZSA9IF90aGlzLnRvRGF0ZSh2YWwpO1xuICAgICAgICBpZiAoX3RoaXMucmFuZ2VWYWxpZGF0b3IoZGF0ZSwgaW5kZXggPT09IDApKSB7XG4gICAgICAgICAgcHJldiA9IHByZXYuY29uY2F0KGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSwgW10pO1xuICAgICAgaWYgKHJhbmdlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICB2YXIgX3JhbmdlID0gcmFuZ2UsXG4gICAgICAgICAgICBzdGFydCA9IF9yYW5nZVswXSxcbiAgICAgICAgICAgIGVuZCA9IF9yYW5nZVsxXTtcblxuICAgICAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tFbGVtZW50Q2FsZW5kYXJdZW5kIHRpbWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBzdGFydCB0aW1lJyk7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIC8vIHN0YXJ0IHRpbWUgYW5kIGVuZCB0aW1lIGluIG9uZSBtb250aFxuICAgICAgICBpZiAoT2JqZWN0KGRhdGVfdXRpbF9bXCJ2YWxpZGF0ZVJhbmdlSW5PbmVNb250aFwiXSkoc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgICByZXR1cm4gW1tzdGFydCwgZW5kXV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGEgPSBbXTtcbiAgICAgICAgdmFyIHN0YXJ0RGF5ID0gbmV3IERhdGUoc3RhcnQuZ2V0RnVsbFllYXIoKSwgc3RhcnQuZ2V0TW9udGgoKSArIDEsIDEpO1xuICAgICAgICB2YXIgbGFzdERheSA9IHRoaXMudG9EYXRlKHN0YXJ0RGF5LmdldFRpbWUoKSAtIG9uZURheSk7XG4gICAgICAgIGlmICghT2JqZWN0KGRhdGVfdXRpbF9bXCJ2YWxpZGF0ZVJhbmdlSW5PbmVNb250aFwiXSkoc3RhcnREYXksIGVuZCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tFbGVtZW50Q2FsZW5kYXJdc3RhcnQgdGltZSBhbmQgZW5kIHRpbWUgaW50ZXJ2YWwgbXVzdCBub3QgZXhjZWVkIHR3byBtb250aHMnKTtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8g56ys5LiA5Liq5pyI55qE5pe26Ze06IyD5Zu0XG4gICAgICAgIGRhdGEucHVzaChbc3RhcnQsIGxhc3REYXldKTtcbiAgICAgICAgLy8g5LiL5LiA5pyI55qE5pe26Ze06IyD5Zu077yM6ZyA6KaB6K6h566X5LiA5LiL6K+l5pyI55qE56ys5LiA5Liq5ZGo6LW35aeL5pelXG4gICAgICAgIHZhciBmaXJzdERheU9mV2VlayA9IHRoaXMucmVhbEZpcnN0RGF5T2ZXZWVrO1xuICAgICAgICB2YXIgbmV4dE1vbnRGaXJzdERheSA9IHN0YXJ0RGF5LmdldERheSgpO1xuICAgICAgICB2YXIgaW50ZXJ2YWwgPSAwO1xuICAgICAgICBpZiAobmV4dE1vbnRGaXJzdERheSAhPT0gZmlyc3REYXlPZldlZWspIHtcbiAgICAgICAgICBpZiAoZmlyc3REYXlPZldlZWsgPT09IDApIHtcbiAgICAgICAgICAgIGludGVydmFsID0gNyAtIG5leHRNb250Rmlyc3REYXk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGludGVydmFsID0gZmlyc3REYXlPZldlZWsgLSBuZXh0TW9udEZpcnN0RGF5O1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBpbnRlcnZhbCA+IDAgPyBpbnRlcnZhbCA6IDcgKyBpbnRlcnZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnREYXkgPSB0aGlzLnRvRGF0ZShzdGFydERheS5nZXRUaW1lKCkgKyBpbnRlcnZhbCAqIG9uZURheSk7XG4gICAgICAgIGlmIChzdGFydERheS5nZXREYXRlKCkgPCBlbmQuZ2V0RGF0ZSgpKSB7XG4gICAgICAgICAgZGF0YS5wdXNoKFtzdGFydERheSwgZW5kXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSxcbiAgICByZWFsRmlyc3REYXlPZldlZWs6IGZ1bmN0aW9uIHJlYWxGaXJzdERheU9mV2VlaygpIHtcbiAgICAgIGlmICh0aGlzLmZpcnN0RGF5T2ZXZWVrIDwgMSB8fCB0aGlzLmZpcnN0RGF5T2ZXZWVrID4gNikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMuZmlyc3REYXlPZldlZWspO1xuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RlZERheTogJycsXG4gICAgICBub3c6IG5ldyBEYXRlKClcbiAgICB9O1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FsZW5kYXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2NhbGVuZGFyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGNhbGVuZGFyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NhbGVuZGFyL3NyYy9tYWluLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGNhbGVuZGFyX3NyY19tYWluX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfY2FsZW5kYXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82ZDk3NTZiZV9yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF82ZDk3NTZiZV9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGNhbGVuZGFyX3NyY19tYWluX2FwaTsgfVxuY2FsZW5kYXJfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9jYWxlbmRhci9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY2FsZW5kYXJfc3JjX21haW4gPSAoY2FsZW5kYXJfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYWxlbmRhci9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jYWxlbmRhcl9zcmNfbWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KGNhbGVuZGFyX3NyY19tYWluLm5hbWUsIGNhbGVuZGFyX3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhbGVuZGFyID0gKGNhbGVuZGFyX3NyY19tYWluKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYmFja3RvcC9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MjU3ZGQ0YTkmXG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzI1N2RkNGE5X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcInRyYW5zaXRpb25cIiwgeyBhdHRyczogeyBuYW1lOiBcImVsLWZhZGUtaW5cIiB9IH0sIFtcbiAgICBfdm0udmlzaWJsZVxuICAgICAgPyBfYyhcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWJhY2t0b3BcIixcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIHJpZ2h0OiBfdm0uc3R5bGVSaWdodCxcbiAgICAgICAgICAgICAgYm90dG9tOiBfdm0uc3R5bGVCb3R0b21cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgcmV0dXJuIF92bS5oYW5kbGVDbGljaygkZXZlbnQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIF92bS5fdChcImRlZmF1bHRcIiwgW19jKFwiZWwtaWNvblwiLCB7IGF0dHJzOiB7IG5hbWU6IFwiY2FyZXQtdG9wXCIgfSB9KV0pXG4gICAgICAgICAgXSxcbiAgICAgICAgICAyXG4gICAgICAgIClcbiAgICAgIDogX3ZtLl9lKClcbiAgXSlcbn1cbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMjU3ZGQ0YTlfc3RhdGljUmVuZGVyRm5zID0gW11cbm1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8yNTdkZDRhOV9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JhY2t0b3Avc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTI1N2RkNGE5JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9iYWNrdG9wL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxudmFyIGN1YmljID0gZnVuY3Rpb24gY3ViaWModmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgucG93KHZhbHVlLCAzKTtcbn07XG52YXIgZWFzZUluT3V0Q3ViaWMgPSBmdW5jdGlvbiBlYXNlSW5PdXRDdWJpYyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPCAwLjUgPyBjdWJpYyh2YWx1ZSAqIDIpIC8gMiA6IDEgLSBjdWJpYygoMSAtIHZhbHVlKSAqIDIpIC8gMjtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGJhY2t0b3Bfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxCYWNrdG9wJyxcblxuICBwcm9wczoge1xuICAgIHZpc2liaWxpdHlIZWlnaHQ6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDIwMFxuICAgIH0sXG4gICAgdGFyZ2V0OiBbU3RyaW5nXSxcbiAgICByaWdodDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogNDBcbiAgICB9LFxuICAgIGJvdHRvbToge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogNDBcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZWw6IG51bGwsXG4gICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICB2aXNpYmxlOiBmYWxzZVxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIHN0eWxlQm90dG9tOiBmdW5jdGlvbiBzdHlsZUJvdHRvbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJvdHRvbSArICdweCc7XG4gICAgfSxcbiAgICBzdHlsZVJpZ2h0OiBmdW5jdGlvbiBzdHlsZVJpZ2h0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucmlnaHQgKyAncHgnO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMudGhyb3R0bGVkU2Nyb2xsSGFuZGxlciA9IHRocm90dGxlX2RlZmF1bHQoKSgzMDAsIHRoaXMub25TY3JvbGwpO1xuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudGhyb3R0bGVkU2Nyb2xsSGFuZGxlcik7XG4gIH0sXG5cblxuICBtZXRob2RzOiB7XG4gICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQ7XG4gICAgICB0aGlzLmVsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgaWYgKHRoaXMudGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMudGFyZ2V0KTtcbiAgICAgICAgaWYgKCF0aGlzLmVsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXQgaXMgbm90IGV4aXN0ZWQ6ICcgKyB0aGlzLnRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmVsO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25TY3JvbGw6IGZ1bmN0aW9uIG9uU2Nyb2xsKCkge1xuICAgICAgdmFyIHNjcm9sbFRvcCA9IHRoaXMuZWwuc2Nyb2xsVG9wO1xuICAgICAgdGhpcy52aXNpYmxlID0gc2Nyb2xsVG9wID49IHRoaXMudmlzaWJpbGl0eUhlaWdodDtcbiAgICB9LFxuICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVDbGljayhlKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvVG9wKCk7XG4gICAgICB0aGlzLiRlbWl0KCdjbGljaycsIGUpO1xuICAgIH0sXG4gICAgc2Nyb2xsVG9Ub3A6IGZ1bmN0aW9uIHNjcm9sbFRvVG9wKCkge1xuICAgICAgdmFyIGVsID0gdGhpcy5lbDtcbiAgICAgIHZhciBiZWdpblRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgdmFyIGJlZ2luVmFsdWUgPSBlbC5zY3JvbGxUb3A7XG4gICAgICB2YXIgckFGID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jLCAxNik7XG4gICAgICB9O1xuICAgICAgdmFyIGZyYW1lRnVuYyA9IGZ1bmN0aW9uIGZyYW1lRnVuYygpIHtcbiAgICAgICAgdmFyIHByb2dyZXNzID0gKERhdGUubm93KCkgLSBiZWdpblRpbWUpIC8gNTAwO1xuICAgICAgICBpZiAocHJvZ3Jlc3MgPCAxKSB7XG4gICAgICAgICAgZWwuc2Nyb2xsVG9wID0gYmVnaW5WYWx1ZSAqICgxIC0gZWFzZUluT3V0Q3ViaWMocHJvZ3Jlc3MpKTtcbiAgICAgICAgICByQUYoZnJhbWVGdW5jKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgckFGKGZyYW1lRnVuYyk7XG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy50aHJvdHRsZWRTY3JvbGxIYW5kbGVyKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JhY2t0b3Avc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2JhY2t0b3Bfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoYmFja3RvcF9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9iYWNrdG9wL3NyYy9tYWluLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGJhY2t0b3Bfc3JjX21haW5fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBwYWNrYWdlc19iYWNrdG9wX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMjU3ZGQ0YTlfcmVuZGVyLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfMjU3ZGQ0YTlfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBiYWNrdG9wX3NyY19tYWluX2FwaTsgfVxuYmFja3RvcF9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2JhY2t0b3Avc3JjL21haW4udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGJhY2t0b3Bfc3JjX21haW4gPSAoYmFja3RvcF9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2JhY2t0b3AvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuYmFja3RvcF9zcmNfbWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KGJhY2t0b3Bfc3JjX21haW4ubmFtZSwgYmFja3RvcF9zcmNfbWFpbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBiYWNrdG9wID0gKGJhY2t0b3Bfc3JjX21haW4pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbmZpbml0ZS1zY3JvbGwvc3JjL21haW4uanNcblxuXG5cblxudmFyIGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eSkge1xuICBpZiAoZWxlbWVudCA9PT0gd2luZG93KSB7XG4gICAgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG4gIHZhciBjc3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTtcbiAgcmV0dXJuIHByb3BlcnR5ID8gY3NzW3Byb3BlcnR5XSA6IGNzcztcbn07XG5cbnZhciBlbnRyaWVzID0gZnVuY3Rpb24gZW50cmllcyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaiB8fCB7fSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gW2tleSwgb2JqW2tleV1dO1xuICB9KTtcbn07XG5cbnZhciBnZXRQb3NpdGlvblNpemUgPSBmdW5jdGlvbiBnZXRQb3NpdGlvblNpemUoZWwsIHByb3ApIHtcbiAgcmV0dXJuIGVsID09PSB3aW5kb3cgfHwgZWwgPT09IGRvY3VtZW50ID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W3Byb3BdIDogZWxbcHJvcF07XG59O1xuXG52YXIgZ2V0T2Zmc2V0SGVpZ2h0ID0gZnVuY3Rpb24gZ2V0T2Zmc2V0SGVpZ2h0KGVsKSB7XG4gIHJldHVybiBnZXRQb3NpdGlvblNpemUoZWwsICdvZmZzZXRIZWlnaHQnKTtcbn07XG5cbnZhciBnZXRDbGllbnRIZWlnaHQgPSBmdW5jdGlvbiBnZXRDbGllbnRIZWlnaHQoZWwpIHtcbiAgcmV0dXJuIGdldFBvc2l0aW9uU2l6ZShlbCwgJ2NsaWVudEhlaWdodCcpO1xufTtcblxudmFyIHNjb3BlID0gJ0VsSW5maW5pdGVTY3JvbGwnO1xudmFyIGF0dHJpYnV0ZXMgPSB7XG4gIGRlbGF5OiB7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGRlZmF1bHQ6IDIwMFxuICB9LFxuICBkaXN0YW5jZToge1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBkZWZhdWx0OiAwXG4gIH0sXG4gIGRpc2FibGVkOiB7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBkZWZhdWx0OiBmYWxzZVxuICB9LFxuICBpbW1lZGlhdGU6IHtcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGRlZmF1bHQ6IHRydWVcbiAgfVxufTtcblxudmFyIG1haW5fZ2V0U2Nyb2xsT3B0aW9ucyA9IGZ1bmN0aW9uIGdldFNjcm9sbE9wdGlvbnMoZWwsIHZtKSB7XG4gIGlmICghT2JqZWN0KHR5cGVzX1tcImlzSHRtbEVsZW1lbnRcIl0pKGVsKSkgcmV0dXJuIHt9O1xuXG4gIHJldHVybiBlbnRyaWVzKGF0dHJpYnV0ZXMpLnJlZHVjZShmdW5jdGlvbiAobWFwLCBfcmVmKSB7XG4gICAgdmFyIGtleSA9IF9yZWZbMF0sXG4gICAgICAgIG9wdGlvbiA9IF9yZWZbMV07XG4gICAgdmFyIHR5cGUgPSBvcHRpb24udHlwZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gb3B0aW9uLmRlZmF1bHQ7XG5cbiAgICB2YXIgdmFsdWUgPSBlbC5nZXRBdHRyaWJ1dGUoJ2luZmluaXRlLXNjcm9sbC0nICsga2V5KTtcbiAgICB2YWx1ZSA9IE9iamVjdCh0eXBlc19bXCJpc1VuZGVmaW5lZFwiXSkodm1bdmFsdWVdKSA/IHZhbHVlIDogdm1bdmFsdWVdO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBOdW1iZXI6XG4gICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgdmFsdWUgPSBOdW1iZXIuaXNOYU4odmFsdWUpID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBCb29sZWFuOlxuICAgICAgICB2YWx1ZSA9IE9iamVjdCh0eXBlc19bXCJpc0RlZmluZWRcIl0pKHZhbHVlKSA/IHZhbHVlID09PSAnZmFsc2UnID8gZmFsc2UgOiBCb29sZWFuKHZhbHVlKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YWx1ZSA9IHR5cGUodmFsdWUpO1xuICAgIH1cbiAgICBtYXBba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiBtYXA7XG4gIH0sIHt9KTtcbn07XG5cbnZhciBnZXRFbGVtZW50VG9wID0gZnVuY3Rpb24gZ2V0RWxlbWVudFRvcChlbCkge1xuICByZXR1cm4gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xufTtcblxudmFyIG1haW5faGFuZGxlU2Nyb2xsID0gZnVuY3Rpb24gaGFuZGxlU2Nyb2xsKGNiKSB7XG4gIHZhciBfc2NvcGUgPSB0aGlzW3Njb3BlXSxcbiAgICAgIGVsID0gX3Njb3BlLmVsLFxuICAgICAgdm0gPSBfc2NvcGUudm0sXG4gICAgICBjb250YWluZXIgPSBfc2NvcGUuY29udGFpbmVyLFxuICAgICAgb2JzZXJ2ZXIgPSBfc2NvcGUub2JzZXJ2ZXI7XG5cbiAgdmFyIF9nZXRTY3JvbGxPcHRpb25zID0gbWFpbl9nZXRTY3JvbGxPcHRpb25zKGVsLCB2bSksXG4gICAgICBkaXN0YW5jZSA9IF9nZXRTY3JvbGxPcHRpb25zLmRpc3RhbmNlLFxuICAgICAgZGlzYWJsZWQgPSBfZ2V0U2Nyb2xsT3B0aW9ucy5kaXNhYmxlZDtcblxuICBpZiAoZGlzYWJsZWQpIHJldHVybjtcblxuICB2YXIgY29udGFpbmVySW5mbyA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgaWYgKCFjb250YWluZXJJbmZvLndpZHRoICYmICFjb250YWluZXJJbmZvLmhlaWdodCkgcmV0dXJuO1xuXG4gIHZhciBzaG91bGRUcmlnZ2VyID0gZmFsc2U7XG5cbiAgaWYgKGNvbnRhaW5lciA9PT0gZWwpIHtcbiAgICAvLyBiZSBhd2FyZSBvZiBkaWZmZXJlbmNlIGJldHdlZW4gY2xpZW50SGVpZ2h0ICYgb2Zmc2V0SGVpZ2h0ICYgd2luZG93LmdldENvbXB1dGVkU3R5bGUoKS5oZWlnaHRcbiAgICB2YXIgc2Nyb2xsQm90dG9tID0gY29udGFpbmVyLnNjcm9sbFRvcCArIGdldENsaWVudEhlaWdodChjb250YWluZXIpO1xuICAgIHNob3VsZFRyaWdnZXIgPSBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQm90dG9tIDw9IGRpc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHZhciBoZWlnaHRCZWxvd1RvcCA9IGdldE9mZnNldEhlaWdodChlbCkgKyBnZXRFbGVtZW50VG9wKGVsKSAtIGdldEVsZW1lbnRUb3AoY29udGFpbmVyKTtcbiAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gZ2V0T2Zmc2V0SGVpZ2h0KGNvbnRhaW5lcik7XG4gICAgdmFyIGJvcmRlckJvdHRvbSA9IE51bWJlci5wYXJzZUZsb2F0KGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShjb250YWluZXIsICdib3JkZXJCb3R0b21XaWR0aCcpKTtcbiAgICBzaG91bGRUcmlnZ2VyID0gaGVpZ2h0QmVsb3dUb3AgLSBvZmZzZXRIZWlnaHQgKyBib3JkZXJCb3R0b20gPD0gZGlzdGFuY2U7XG4gIH1cblxuICBpZiAoc2hvdWxkVHJpZ2dlciAmJiBPYmplY3QodHlwZXNfW1wiaXNGdW5jdGlvblwiXSkoY2IpKSB7XG4gICAgY2IuY2FsbCh2bSk7XG4gIH0gZWxzZSBpZiAob2JzZXJ2ZXIpIHtcbiAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgdGhpc1tzY29wZV0ub2JzZXJ2ZXIgPSBudWxsO1xuICB9XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpbmZpbml0ZV9zY3JvbGxfc3JjX21haW4gPSAoe1xuICBuYW1lOiAnSW5maW5pdGVTY3JvbGwnLFxuICBpbnNlcnRlZDogZnVuY3Rpb24gaW5zZXJ0ZWQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgdmFyIGNiID0gYmluZGluZy52YWx1ZTtcblxuICAgIHZhciB2bSA9IHZub2RlLmNvbnRleHQ7XG4gICAgLy8gb25seSBpbmNsdWRlIHZlcnRpY2FsIHNjcm9sbFxuICAgIHZhciBjb250YWluZXIgPSBPYmplY3QoZG9tX1tcImdldFNjcm9sbENvbnRhaW5lclwiXSkoZWwsIHRydWUpO1xuXG4gICAgdmFyIF9nZXRTY3JvbGxPcHRpb25zMiA9IG1haW5fZ2V0U2Nyb2xsT3B0aW9ucyhlbCwgdm0pLFxuICAgICAgICBkZWxheSA9IF9nZXRTY3JvbGxPcHRpb25zMi5kZWxheSxcbiAgICAgICAgaW1tZWRpYXRlID0gX2dldFNjcm9sbE9wdGlvbnMyLmltbWVkaWF0ZTtcblxuICAgIHZhciBvblNjcm9sbCA9IGRlYm91bmNlX2RlZmF1bHQoKShkZWxheSwgbWFpbl9oYW5kbGVTY3JvbGwuYmluZChlbCwgY2IpKTtcblxuICAgIGVsW3Njb3BlXSA9IHsgZWw6IGVsLCB2bTogdm0sIGNvbnRhaW5lcjogY29udGFpbmVyLCBvblNjcm9sbDogb25TY3JvbGwgfTtcblxuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbCk7XG5cbiAgICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgICAgdmFyIG9ic2VydmVyID0gZWxbc2NvcGVdLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIob25TY3JvbGwpO1xuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lciwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG4gICAgICAgIG9uU2Nyb2xsKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZChlbCkge1xuICAgIHZhciBfZWwkc2NvcGUgPSBlbFtzY29wZV0sXG4gICAgICAgIGNvbnRhaW5lciA9IF9lbCRzY29wZS5jb250YWluZXIsXG4gICAgICAgIG9uU2Nyb2xsID0gX2VsJHNjb3BlLm9uU2Nyb2xsO1xuXG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsKTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbmZpbml0ZS1zY3JvbGwvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaW5maW5pdGVfc2Nyb2xsX3NyY19tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5kaXJlY3RpdmUoaW5maW5pdGVfc2Nyb2xsX3NyY19tYWluLm5hbWUsIGluZmluaXRlX3Njcm9sbF9zcmNfbWFpbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpbmZpbml0ZV9zY3JvbGwgPSAoaW5maW5pdGVfc2Nyb2xsX3NyY19tYWluKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcGFnZS1oZWFkZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTUwNzA5NTRjJlxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF81MDcwOTU0Y19yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1wYWdlLWhlYWRlclwiIH0sIFtcbiAgICBfYyhcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7XG4gICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXBhZ2UtaGVhZGVyX19sZWZ0XCIsXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgX3ZtLiRlbWl0KFwiYmFja1wiKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtcbiAgICAgICAgX2MoXCJpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtaWNvbi1iYWNrXCIgfSksXG4gICAgICAgIF9jKFxuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1wYWdlLWhlYWRlcl9fdGl0bGVcIiB9LFxuICAgICAgICAgIFtfdm0uX3QoXCJ0aXRsZVwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGl0bGUpKV0pXSxcbiAgICAgICAgICAyXG4gICAgICAgIClcbiAgICAgIF1cbiAgICApLFxuICAgIF9jKFxuICAgICAgXCJkaXZcIixcbiAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtcGFnZS1oZWFkZXJfX2NvbnRlbnRcIiB9LFxuICAgICAgW192bS5fdChcImNvbnRlbnRcIiwgW192bS5fdihfdm0uX3MoX3ZtLmNvbnRlbnQpKV0pXSxcbiAgICAgIDJcbiAgICApXG4gIF0pXG59XG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzUwNzA5NTRjX3N0YXRpY1JlbmRlckZucyA9IFtdXG5tYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNTA3MDk1NGNfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wYWdlLWhlYWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NTA3MDk1NGMmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3BhZ2UtaGVhZGVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhZ2VfaGVhZGVyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsUGFnZUhlYWRlcicsXG5cbiAgcHJvcHM6IHtcbiAgICB0aXRsZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QobGliX2xvY2FsZV9bXCJ0XCJdKSgnZWwucGFnZUhlYWRlci50aXRsZScpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY29udGVudDogU3RyaW5nXG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wYWdlLWhlYWRlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfcGFnZV9oZWFkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAocGFnZV9oZWFkZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcGFnZS1oZWFkZXIvc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgcGFnZV9oZWFkZXJfc3JjX21haW5fY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBwYWNrYWdlc19wYWdlX2hlYWRlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzUwNzA5NTRjX3JlbmRlcixcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzUwNzA5NTRjX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgcGFnZV9oZWFkZXJfc3JjX21haW5fYXBpOyB9XG5wYWdlX2hlYWRlcl9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3BhZ2UtaGVhZGVyL3NyYy9tYWluLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWdlX2hlYWRlcl9zcmNfbWFpbiA9IChwYWdlX2hlYWRlcl9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3BhZ2UtaGVhZGVyL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnBhZ2VfaGVhZGVyX3NyY19tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQocGFnZV9oZWFkZXJfc3JjX21haW4ubmFtZSwgcGFnZV9oZWFkZXJfc3JjX21haW4pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFnZV9oZWFkZXIgPSAocGFnZV9oZWFkZXJfc3JjX21haW4pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItcGFuZWwudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTM0OTMyMzQ2JlxudmFyIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQ5MzIzNDZfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgY2xhc3M6IFtcImVsLWNhc2NhZGVyLXBhbmVsXCIsIF92bS5ib3JkZXIgJiYgXCJpcy1ib3JkZXJlZFwiXSxcbiAgICAgIG9uOiB7IGtleWRvd246IF92bS5oYW5kbGVLZXlEb3duIH1cbiAgICB9LFxuICAgIF92bS5fbChfdm0ubWVudXMsIGZ1bmN0aW9uKG1lbnUsIGluZGV4KSB7XG4gICAgICByZXR1cm4gX2MoXCJjYXNjYWRlci1tZW51XCIsIHtcbiAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgcmVmOiBcIm1lbnVcIixcbiAgICAgICAgcmVmSW5Gb3I6IHRydWUsXG4gICAgICAgIGF0dHJzOiB7IGluZGV4OiBpbmRleCwgbm9kZXM6IG1lbnUgfVxuICAgICAgfSlcbiAgICB9KSxcbiAgICAxXG4gIClcbn1cbnZhciBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0OTMyMzQ2X3N0YXRpY1JlbmRlckZucyA9IFtdXG5jYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0OTMyMzQ2X3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zNDkzMjM0NiZcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3JhZGlvXCJcbnZhciByYWRpb18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTtcbnZhciByYWRpb19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihyYWRpb18pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbm9kZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG5cblxuXG5cblxuXG52YXIgc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGUpIHtcbiAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXNjYWRlcl9ub2RldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgaW5qZWN0OiBbJ3BhbmVsJ10sXG5cbiAgY29tcG9uZW50czoge1xuICAgIEVsQ2hlY2tib3g6IGNoZWNrYm94X2RlZmF1bHQuYSxcbiAgICBFbFJhZGlvOiByYWRpb19kZWZhdWx0LmFcbiAgfSxcblxuICBwcm9wczoge1xuICAgIG5vZGU6IHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBub2RlSWQ6IFN0cmluZ1xuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY29uZmlnOiBmdW5jdGlvbiBjb25maWcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYW5lbC5jb25maWc7XG4gICAgfSxcbiAgICBpc0xlYWY6IGZ1bmN0aW9uIGlzTGVhZigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUuaXNMZWFmO1xuICAgIH0sXG4gICAgaXNEaXNhYmxlZDogZnVuY3Rpb24gaXNEaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUuaXNEaXNhYmxlZDtcbiAgICB9LFxuICAgIGNoZWNrZWRWYWx1ZTogZnVuY3Rpb24gY2hlY2tlZFZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFuZWwuY2hlY2tlZFZhbHVlO1xuICAgIH0sXG4gICAgaXNDaGVja2VkOiBmdW5jdGlvbiBpc0NoZWNrZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlLmlzU2FtZU5vZGUodGhpcy5jaGVja2VkVmFsdWUpO1xuICAgIH0sXG4gICAgaW5BY3RpdmVQYXRoOiBmdW5jdGlvbiBpbkFjdGl2ZVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0luUGF0aCh0aGlzLnBhbmVsLmFjdGl2ZVBhdGgpO1xuICAgIH0sXG4gICAgaW5DaGVja2VkUGF0aDogZnVuY3Rpb24gaW5DaGVja2VkUGF0aCgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5jb25maWcuY2hlY2tTdHJpY3RseSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXR1cm4gdGhpcy5wYW5lbC5jaGVja2VkTm9kZVBhdGhzLnNvbWUoZnVuY3Rpb24gKGNoZWNrZWRQYXRoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5pc0luUGF0aChjaGVja2VkUGF0aCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUuZ2V0VmFsdWVCeU9wdGlvbigpO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFuZGxlRXhwYW5kOiBmdW5jdGlvbiBoYW5kbGVFeHBhbmQoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbCxcbiAgICAgICAgICBub2RlID0gdGhpcy5ub2RlLFxuICAgICAgICAgIGlzRGlzYWJsZWQgPSB0aGlzLmlzRGlzYWJsZWQsXG4gICAgICAgICAgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgICB2YXIgbXVsdGlwbGUgPSBjb25maWcubXVsdGlwbGUsXG4gICAgICAgICAgY2hlY2tTdHJpY3RseSA9IGNvbmZpZy5jaGVja1N0cmljdGx5O1xuXG5cbiAgICAgIGlmICghY2hlY2tTdHJpY3RseSAmJiBpc0Rpc2FibGVkIHx8IG5vZGUubG9hZGluZykgcmV0dXJuO1xuXG4gICAgICBpZiAoY29uZmlnLmxhenkgJiYgIW5vZGUubG9hZGVkKSB7XG4gICAgICAgIHBhbmVsLmxhenlMb2FkKG5vZGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBkbyBub3QgdXNlIGNhY2hlZCBsZWFmIHZhbHVlIGhlcmUsIGludm9rZSB0aGlzLmlzTGVhZiB0byBnZXQgbmV3IHZhbHVlLlxuICAgICAgICAgIHZhciBpc0xlYWYgPSBfdGhpczIuaXNMZWFmO1xuXG5cbiAgICAgICAgICBpZiAoIWlzTGVhZikgX3RoaXMyLmhhbmRsZUV4cGFuZCgpO1xuICAgICAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgLy8gaWYgbGVhZiBzeW5jIGNoZWNrZWQgc3RhdGUsIGVsc2UgY2xlYXIgY2hlY2tlZCBzdGF0ZVxuICAgICAgICAgICAgdmFyIGNoZWNrZWQgPSBpc0xlYWYgPyBub2RlLmNoZWNrZWQgOiBmYWxzZTtcbiAgICAgICAgICAgIF90aGlzMi5oYW5kbGVNdWx0aUNoZWNrQ2hhbmdlKGNoZWNrZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYW5lbC5oYW5kbGVFeHBhbmQobm9kZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVDaGVja0NoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hlY2tDaGFuZ2UoKSB7XG4gICAgICB2YXIgcGFuZWwgPSB0aGlzLnBhbmVsLFxuICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZSxcbiAgICAgICAgICBub2RlID0gdGhpcy5ub2RlO1xuXG4gICAgICBwYW5lbC5oYW5kbGVDaGVja0NoYW5nZSh2YWx1ZSk7XG4gICAgICBwYW5lbC5oYW5kbGVFeHBhbmQobm9kZSk7XG4gICAgfSxcbiAgICBoYW5kbGVNdWx0aUNoZWNrQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVNdWx0aUNoZWNrQ2hhbmdlKGNoZWNrZWQpIHtcbiAgICAgIHRoaXMubm9kZS5kb0NoZWNrKGNoZWNrZWQpO1xuICAgICAgdGhpcy5wYW5lbC5jYWxjdWxhdGVNdWx0aUNoZWNrZWRWYWx1ZSgpO1xuICAgIH0sXG4gICAgaXNJblBhdGg6IGZ1bmN0aW9uIGlzSW5QYXRoKHBhdGhOb2Rlcykge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGU7XG5cbiAgICAgIHZhciBzZWxlY3RlZFBhdGhOb2RlID0gcGF0aE5vZGVzW25vZGUubGV2ZWwgLSAxXSB8fCB7fTtcbiAgICAgIHJldHVybiBzZWxlY3RlZFBhdGhOb2RlLnVpZCA9PT0gbm9kZS51aWQ7XG4gICAgfSxcbiAgICByZW5kZXJQcmVmaXg6IGZ1bmN0aW9uIHJlbmRlclByZWZpeChoKSB7XG4gICAgICB2YXIgaXNMZWFmID0gdGhpcy5pc0xlYWYsXG4gICAgICAgICAgaXNDaGVja2VkID0gdGhpcy5pc0NoZWNrZWQsXG4gICAgICAgICAgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgICB2YXIgY2hlY2tTdHJpY3RseSA9IGNvbmZpZy5jaGVja1N0cmljdGx5LFxuICAgICAgICAgIG11bHRpcGxlID0gY29uZmlnLm11bHRpcGxlO1xuXG5cbiAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDaGVja2JveChoKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hlY2tTdHJpY3RseSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJSYWRpbyhoKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNMZWFmICYmIGlzQ2hlY2tlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDaGVja0ljb24oaCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcmVuZGVyUG9zdGZpeDogZnVuY3Rpb24gcmVuZGVyUG9zdGZpeChoKSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSxcbiAgICAgICAgICBpc0xlYWYgPSB0aGlzLmlzTGVhZjtcblxuXG4gICAgICBpZiAobm9kZS5sb2FkaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckxvYWRpbmdJY29uKGgpO1xuICAgICAgfSBlbHNlIGlmICghaXNMZWFmKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckV4cGFuZEljb24oaCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcmVuZGVyQ2hlY2tib3g6IGZ1bmN0aW9uIHJlbmRlckNoZWNrYm94KGgpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlLFxuICAgICAgICAgIGNvbmZpZyA9IHRoaXMuY29uZmlnLFxuICAgICAgICAgIGlzRGlzYWJsZWQgPSB0aGlzLmlzRGlzYWJsZWQ7XG5cbiAgICAgIHZhciBldmVudHMgPSB7XG4gICAgICAgIG9uOiB7IGNoYW5nZTogdGhpcy5oYW5kbGVNdWx0aUNoZWNrQ2hhbmdlIH0sXG4gICAgICAgIG5hdGl2ZU9uOiB7fVxuICAgICAgfTtcblxuICAgICAgaWYgKGNvbmZpZy5jaGVja1N0cmljdGx5KSB7XG4gICAgICAgIC8vIHdoZW4gZXZlcnkgbm9kZSBpcyBzZWxlY3RhYmxlLCBjbGljayBldmVudCBzaG91bGQgbm90IHRyaWdnZXIgZXhwYW5kIGV2ZW50LlxuICAgICAgICBldmVudHMubmF0aXZlT24uY2xpY2sgPSBzdG9wUHJvcGFnYXRpb247XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoKCdlbC1jaGVja2JveCcsIGV4dGVybmFsX2JhYmVsX2hlbHBlcl92dWVfanN4X21lcmdlX3Byb3BzX2RlZmF1bHQoKShbe1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHZhbHVlOiBub2RlLmNoZWNrZWQsXG4gICAgICAgICAgaW5kZXRlcm1pbmF0ZTogbm9kZS5pbmRldGVybWluYXRlLFxuICAgICAgICAgIGRpc2FibGVkOiBpc0Rpc2FibGVkXG4gICAgICAgIH1cbiAgICAgIH0sIGV2ZW50c10pKTtcbiAgICB9LFxuICAgIHJlbmRlclJhZGlvOiBmdW5jdGlvbiByZW5kZXJSYWRpbyhoKSB7XG4gICAgICB2YXIgY2hlY2tlZFZhbHVlID0gdGhpcy5jaGVja2VkVmFsdWUsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlLFxuICAgICAgICAgIGlzRGlzYWJsZWQgPSB0aGlzLmlzRGlzYWJsZWQ7XG5cbiAgICAgIC8vIHRvIGtlZXAgc2FtZSByZWZlcmVuY2UgaWYgdmFsdWUgY2F1c2UgcmFkaW8ncyBjaGVja2VkIHN0YXRlIGlzIGNhbGN1bGF0ZWQgYnkgcmVmZXJlbmNlIGNvbXBhcmlzaW9uO1xuXG4gICAgICBpZiAoT2JqZWN0KHV0aWxfW1wiaXNFcXVhbFwiXSkodmFsdWUsIGNoZWNrZWRWYWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSBjaGVja2VkVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoKFxuICAgICAgICAnZWwtcmFkaW8nLFxuICAgICAgICB7XG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHZhbHVlOiBjaGVja2VkVmFsdWUsXG4gICAgICAgICAgICBsYWJlbDogdmFsdWUsXG4gICAgICAgICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb246IHtcbiAgICAgICAgICAgICdjaGFuZ2UnOiB0aGlzLmhhbmRsZUNoZWNrQ2hhbmdlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuYXRpdmVPbjoge1xuICAgICAgICAgICAgJ2NsaWNrJzogc3RvcFByb3BhZ2F0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbaCgnc3BhbicpXVxuICAgICAgKTtcbiAgICB9LFxuICAgIHJlbmRlckNoZWNrSWNvbjogZnVuY3Rpb24gcmVuZGVyQ2hlY2tJY29uKGgpIHtcbiAgICAgIHJldHVybiBoKCdpJywgeyAnY2xhc3MnOiAnZWwtaWNvbi1jaGVjayBlbC1jYXNjYWRlci1ub2RlX19wcmVmaXgnIH0pO1xuICAgIH0sXG4gICAgcmVuZGVyTG9hZGluZ0ljb246IGZ1bmN0aW9uIHJlbmRlckxvYWRpbmdJY29uKGgpIHtcbiAgICAgIHJldHVybiBoKCdpJywgeyAnY2xhc3MnOiAnZWwtaWNvbi1sb2FkaW5nIGVsLWNhc2NhZGVyLW5vZGVfX3Bvc3RmaXgnIH0pO1xuICAgIH0sXG4gICAgcmVuZGVyRXhwYW5kSWNvbjogZnVuY3Rpb24gcmVuZGVyRXhwYW5kSWNvbihoKSB7XG4gICAgICByZXR1cm4gaCgnaScsIHsgJ2NsYXNzJzogJ2VsLWljb24tYXJyb3ctcmlnaHQgZWwtY2FzY2FkZXItbm9kZV9fcG9zdGZpeCcgfSk7XG4gICAgfSxcbiAgICByZW5kZXJDb250ZW50OiBmdW5jdGlvbiByZW5kZXJDb250ZW50KGgpIHtcbiAgICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWwsXG4gICAgICAgICAgbm9kZSA9IHRoaXMubm9kZTtcblxuICAgICAgdmFyIHJlbmRlciA9IHBhbmVsLnJlbmRlckxhYmVsRm47XG4gICAgICB2YXIgdm5vZGUgPSByZW5kZXIgPyByZW5kZXIoeyBub2RlOiBub2RlLCBkYXRhOiBub2RlLmRhdGEgfSkgOiBudWxsO1xuXG4gICAgICByZXR1cm4gaChcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICB7ICdjbGFzcyc6ICdlbC1jYXNjYWRlci1ub2RlX19sYWJlbCcgfSxcbiAgICAgICAgW3Zub2RlIHx8IG5vZGUubGFiZWxdXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB2YXIgaW5BY3RpdmVQYXRoID0gdGhpcy5pbkFjdGl2ZVBhdGgsXG4gICAgICAgIGluQ2hlY2tlZFBhdGggPSB0aGlzLmluQ2hlY2tlZFBhdGgsXG4gICAgICAgIGlzQ2hlY2tlZCA9IHRoaXMuaXNDaGVja2VkLFxuICAgICAgICBpc0xlYWYgPSB0aGlzLmlzTGVhZixcbiAgICAgICAgaXNEaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZCxcbiAgICAgICAgY29uZmlnID0gdGhpcy5jb25maWcsXG4gICAgICAgIG5vZGVJZCA9IHRoaXMubm9kZUlkO1xuICAgIHZhciBleHBhbmRUcmlnZ2VyID0gY29uZmlnLmV4cGFuZFRyaWdnZXIsXG4gICAgICAgIGNoZWNrU3RyaWN0bHkgPSBjb25maWcuY2hlY2tTdHJpY3RseSxcbiAgICAgICAgbXVsdGlwbGUgPSBjb25maWcubXVsdGlwbGU7XG5cbiAgICB2YXIgZGlzYWJsZWQgPSAhY2hlY2tTdHJpY3RseSAmJiBpc0Rpc2FibGVkO1xuICAgIHZhciBldmVudHMgPSB7IG9uOiB7fSB9O1xuXG4gICAgaWYgKGV4cGFuZFRyaWdnZXIgPT09ICdjbGljaycpIHtcbiAgICAgIGV2ZW50cy5vbi5jbGljayA9IHRoaXMuaGFuZGxlRXhwYW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICBldmVudHMub24ubW91c2VlbnRlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzMy5oYW5kbGVFeHBhbmQoKTtcbiAgICAgICAgX3RoaXMzLiRlbWl0KCdleHBhbmQnLCBlKTtcbiAgICAgIH07XG4gICAgICBldmVudHMub24uZm9jdXMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBfdGhpczMuaGFuZGxlRXhwYW5kKCk7XG4gICAgICAgIF90aGlzMy4kZW1pdCgnZXhwYW5kJywgZSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoaXNMZWFmICYmICFpc0Rpc2FibGVkICYmICFjaGVja1N0cmljdGx5ICYmICFtdWx0aXBsZSkge1xuICAgICAgZXZlbnRzLm9uLmNsaWNrID0gdGhpcy5oYW5kbGVDaGVja0NoYW5nZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaChcbiAgICAgICdsaScsXG4gICAgICBleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc19kZWZhdWx0KCkoW3tcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICByb2xlOiAnbWVudWl0ZW0nLFxuICAgICAgICAgIGlkOiBub2RlSWQsXG4gICAgICAgICAgJ2FyaWEtZXhwYW5kZWQnOiBpbkFjdGl2ZVBhdGgsXG4gICAgICAgICAgdGFiaW5kZXg6IGRpc2FibGVkID8gbnVsbCA6IC0xXG4gICAgICAgIH0sXG4gICAgICAgICdjbGFzcyc6IHtcbiAgICAgICAgICAnZWwtY2FzY2FkZXItbm9kZSc6IHRydWUsXG4gICAgICAgICAgJ2lzLXNlbGVjdGFibGUnOiBjaGVja1N0cmljdGx5LFxuICAgICAgICAgICdpbi1hY3RpdmUtcGF0aCc6IGluQWN0aXZlUGF0aCxcbiAgICAgICAgICAnaW4tY2hlY2tlZC1wYXRoJzogaW5DaGVja2VkUGF0aCxcbiAgICAgICAgICAnaXMtYWN0aXZlJzogaXNDaGVja2VkLFxuICAgICAgICAgICdpcy1kaXNhYmxlZCc6IGRpc2FibGVkXG4gICAgICAgIH1cbiAgICAgIH0sIGV2ZW50c10pLFxuICAgICAgW3RoaXMucmVuZGVyUHJlZml4KGgpLCB0aGlzLnJlbmRlckNvbnRlbnQoaCksIHRoaXMucmVuZGVyUG9zdGZpeChoKV1cbiAgICApO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW5vZGUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19jYXNjYWRlcl9ub2RldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGNhc2NhZGVyX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW5vZGUudnVlXG52YXIgY2FzY2FkZXJfbm9kZV9yZW5kZXIsIGNhc2NhZGVyX25vZGVfc3RhdGljUmVuZGVyRm5zXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGNhc2NhZGVyX25vZGVfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfY2FzY2FkZXJfbm9kZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgY2FzY2FkZXJfbm9kZV9yZW5kZXIsXG4gIGNhc2NhZGVyX25vZGVfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBjYXNjYWRlcl9ub2RlX2FwaTsgfVxuY2FzY2FkZXJfbm9kZV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1ub2RlLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXNjYWRlcl9ub2RlID0gKGNhc2NhZGVyX25vZGVfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW1lbnUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXNjYWRlcl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsQ2FzY2FkZXJNZW51JyxcblxuICBtaXhpbnM6IFtsb2NhbGVfZGVmYXVsdC5hXSxcblxuICBpbmplY3Q6IFsncGFuZWwnXSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxTY3JvbGxiYXI6IHNjcm9sbGJhcl9kZWZhdWx0LmEsXG4gICAgQ2FzY2FkZXJOb2RlOiBjYXNjYWRlcl9ub2RlXG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBub2Rlczoge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgaW5kZXg6IE51bWJlclxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGl2ZU5vZGU6IG51bGwsXG4gICAgICBob3ZlclRpbWVyOiBudWxsLFxuICAgICAgaWQ6IE9iamVjdCh1dGlsX1tcImdlbmVyYXRlSWRcIl0pKClcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICAgICAgcmV0dXJuICF0aGlzLm5vZGVzLmxlbmd0aDtcbiAgICB9LFxuICAgIG1lbnVJZDogZnVuY3Rpb24gbWVudUlkKCkge1xuICAgICAgcmV0dXJuICdjYXNjYWRlci1tZW51LScgKyB0aGlzLmlkICsgJy0nICsgdGhpcy5pbmRleDtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUV4cGFuZDogZnVuY3Rpb24gaGFuZGxlRXhwYW5kKGUpIHtcbiAgICAgIHRoaXMuYWN0aXZlTm9kZSA9IGUudGFyZ2V0O1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VNb3ZlOiBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZSkge1xuICAgICAgdmFyIGFjdGl2ZU5vZGUgPSB0aGlzLmFjdGl2ZU5vZGUsXG4gICAgICAgICAgaG92ZXJUaW1lciA9IHRoaXMuaG92ZXJUaW1lcjtcbiAgICAgIHZhciBob3ZlclpvbmUgPSB0aGlzLiRyZWZzLmhvdmVyWm9uZTtcblxuXG4gICAgICBpZiAoIWFjdGl2ZU5vZGUgfHwgIWhvdmVyWm9uZSkgcmV0dXJuO1xuXG4gICAgICBpZiAoYWN0aXZlTm9kZS5jb250YWlucyhlLnRhcmdldCkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpO1xuXG4gICAgICAgIHZhciBfJGVsJGdldEJvdW5kaW5nQ2xpZW4gPSB0aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIGxlZnQgPSBfJGVsJGdldEJvdW5kaW5nQ2xpZW4ubGVmdDtcblxuICAgICAgICB2YXIgc3RhcnRYID0gZS5jbGllbnRYIC0gbGVmdDtcbiAgICAgICAgdmFyIF8kZWwgPSB0aGlzLiRlbCxcbiAgICAgICAgICAgIG9mZnNldFdpZHRoID0gXyRlbC5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIG9mZnNldEhlaWdodCA9IF8kZWwub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIHZhciB0b3AgPSBhY3RpdmVOb2RlLm9mZnNldFRvcDtcbiAgICAgICAgdmFyIGJvdHRvbSA9IHRvcCArIGFjdGl2ZU5vZGUub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIGhvdmVyWm9uZS5pbm5lckhUTUwgPSAnXFxuICAgICAgICAgIDxwYXRoIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCIgZmlsbD1cInRyYW5zcGFyZW50XCIgZD1cIk0nICsgc3RhcnRYICsgJyAnICsgdG9wICsgJyBMJyArIG9mZnNldFdpZHRoICsgJyAwIFYnICsgdG9wICsgJyBaXCIgLz5cXG4gICAgICAgICAgPHBhdGggc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIiBmaWxsPVwidHJhbnNwYXJlbnRcIiBkPVwiTScgKyBzdGFydFggKyAnICcgKyBib3R0b20gKyAnIEwnICsgb2Zmc2V0V2lkdGggKyAnICcgKyBvZmZzZXRIZWlnaHQgKyAnIFYnICsgYm90dG9tICsgJyBaXCIgLz5cXG4gICAgICAgICc7XG4gICAgICB9IGVsc2UgaWYgKCFob3ZlclRpbWVyKSB7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lciA9IHNldFRpbWVvdXQodGhpcy5jbGVhckhvdmVyWm9uZSwgdGhpcy5wYW5lbC5jb25maWcuaG92ZXJUaHJlc2hvbGQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xlYXJIb3ZlclpvbmU6IGZ1bmN0aW9uIGNsZWFySG92ZXJab25lKCkge1xuICAgICAgdmFyIGhvdmVyWm9uZSA9IHRoaXMuJHJlZnMuaG92ZXJab25lO1xuXG4gICAgICBpZiAoIWhvdmVyWm9uZSkgcmV0dXJuO1xuICAgICAgaG92ZXJab25lLmlubmVySFRNTCA9ICcnO1xuICAgIH0sXG4gICAgcmVuZGVyRW1wdHlUZXh0OiBmdW5jdGlvbiByZW5kZXJFbXB0eVRleHQoaCkge1xuICAgICAgcmV0dXJuIGgoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7ICdjbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51X19lbXB0eS10ZXh0JyB9LFxuICAgICAgICBbdGhpcy50KCdlbC5jYXNjYWRlci5ub0RhdGEnKV1cbiAgICAgICk7XG4gICAgfSxcbiAgICByZW5kZXJOb2RlTGlzdDogZnVuY3Rpb24gcmVuZGVyTm9kZUxpc3QoaCkge1xuICAgICAgdmFyIG1lbnVJZCA9IHRoaXMubWVudUlkO1xuICAgICAgdmFyIGlzSG92ZXJNZW51ID0gdGhpcy5wYW5lbC5pc0hvdmVyTWVudTtcblxuICAgICAgdmFyIGV2ZW50cyA9IHsgb246IHt9IH07XG5cbiAgICAgIGlmIChpc0hvdmVyTWVudSkge1xuICAgICAgICBldmVudHMub24uZXhwYW5kID0gdGhpcy5oYW5kbGVFeHBhbmQ7XG4gICAgICB9XG5cbiAgICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMubWFwKGZ1bmN0aW9uIChub2RlLCBpbmRleCkge1xuICAgICAgICB2YXIgaGFzQ2hpbGRyZW4gPSBub2RlLmhhc0NoaWxkcmVuO1xuXG4gICAgICAgIHJldHVybiBoKCdjYXNjYWRlci1ub2RlJywgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfZGVmYXVsdCgpKFt7XG4gICAgICAgICAga2V5OiBub2RlLnVpZCxcbiAgICAgICAgICBhdHRyczogeyBub2RlOiBub2RlLFxuICAgICAgICAgICAgJ25vZGUtaWQnOiBtZW51SWQgKyAnLScgKyBpbmRleCxcbiAgICAgICAgICAgICdhcmlhLWhhc3BvcHVwJzogaGFzQ2hpbGRyZW4sXG4gICAgICAgICAgICAnYXJpYS1vd25zJzogaGFzQ2hpbGRyZW4gPyBtZW51SWQgOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9LCBldmVudHNdKSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFtdLmNvbmNhdChub2RlcywgW2lzSG92ZXJNZW51ID8gaCgnc3ZnJywgeyByZWY6ICdob3ZlclpvbmUnLCAnY2xhc3MnOiAnZWwtY2FzY2FkZXItbWVudV9faG92ZXItem9uZScgfSkgOiBudWxsXSk7XG4gICAgfVxuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICB2YXIgaXNFbXB0eSA9IHRoaXMuaXNFbXB0eSxcbiAgICAgICAgbWVudUlkID0gdGhpcy5tZW51SWQ7XG5cbiAgICB2YXIgZXZlbnRzID0geyBuYXRpdmVPbjoge30gfTtcblxuICAgIC8vIG9wdGltaXplIGhvdmVyIHRvIGV4cGFuZCBleHBlcmllbmNlICgjODAxMClcbiAgICBpZiAodGhpcy5wYW5lbC5pc0hvdmVyTWVudSkge1xuICAgICAgZXZlbnRzLm5hdGl2ZU9uLm1vdXNlbW92ZSA9IHRoaXMuaGFuZGxlTW91c2VNb3ZlO1xuICAgICAgLy8gZXZlbnRzLm5hdGl2ZU9uLm1vdXNlbGVhdmUgPSB0aGlzLmNsZWFySG92ZXJab25lO1xuICAgIH1cblxuICAgIHJldHVybiBoKFxuICAgICAgJ2VsLXNjcm9sbGJhcicsXG4gICAgICBleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc19kZWZhdWx0KCkoW3tcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB0YWc6ICd1bCcsXG4gICAgICAgICAgcm9sZTogJ21lbnUnLFxuICAgICAgICAgIGlkOiBtZW51SWQsXG5cbiAgICAgICAgICAnd3JhcC1jbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51X193cmFwJyxcbiAgICAgICAgICAndmlldy1jbGFzcyc6IHtcbiAgICAgICAgICAgICdlbC1jYXNjYWRlci1tZW51X19saXN0JzogdHJ1ZSxcbiAgICAgICAgICAgICdpcy1lbXB0eSc6IGlzRW1wdHlcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdjbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51JyB9LCBldmVudHNdKSxcbiAgICAgIFtpc0VtcHR5ID8gdGhpcy5yZW5kZXJFbXB0eVRleHQoaCkgOiB0aGlzLnJlbmRlck5vZGVMaXN0KGgpXVxuICAgICk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbWVudS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2Nhc2NhZGVyX21lbnV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoY2FzY2FkZXJfbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbWVudS52dWVcbnZhciBjYXNjYWRlcl9tZW51X3JlbmRlciwgY2FzY2FkZXJfbWVudV9zdGF0aWNSZW5kZXJGbnNcblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY2FzY2FkZXJfbWVudV9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19jYXNjYWRlcl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBjYXNjYWRlcl9tZW51X3JlbmRlcixcbiAgY2FzY2FkZXJfbWVudV9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGNhc2NhZGVyX21lbnVfYXBpOyB9XG5jYXNjYWRlcl9tZW51X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW1lbnUudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhc2NhZGVyX21lbnUgPSAoY2FzY2FkZXJfbWVudV9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9ub2RlLmpzXG52YXIgbm9kZV9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gc3JjX25vZGVfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cblxuXG52YXIgdWlkID0gMDtcblxudmFyIHNyY19ub2RlX05vZGUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5vZGUoZGF0YSwgY29uZmlnLCBwYXJlbnROb2RlKSB7XG4gICAgc3JjX25vZGVfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm9kZSk7XG5cbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50Tm9kZSB8fCBudWxsO1xuICAgIHRoaXMubGV2ZWwgPSAhdGhpcy5wYXJlbnQgPyAxIDogdGhpcy5wYXJlbnQubGV2ZWwgKyAxO1xuICAgIHRoaXMudWlkID0gdWlkKys7XG5cbiAgICB0aGlzLmluaXRTdGF0ZSgpO1xuICAgIHRoaXMuaW5pdENoaWxkcmVuKCk7XG4gIH1cblxuICBOb2RlLnByb3RvdHlwZS5pbml0U3RhdGUgPSBmdW5jdGlvbiBpbml0U3RhdGUoKSB7XG4gICAgdmFyIF9jb25maWcgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgdmFsdWVLZXkgPSBfY29uZmlnLnZhbHVlLFxuICAgICAgICBsYWJlbEtleSA9IF9jb25maWcubGFiZWw7XG5cblxuICAgIHRoaXMudmFsdWUgPSB0aGlzLmRhdGFbdmFsdWVLZXldO1xuICAgIHRoaXMubGFiZWwgPSB0aGlzLmRhdGFbbGFiZWxLZXldO1xuICAgIHRoaXMucGF0aE5vZGVzID0gdGhpcy5jYWxjdWxhdGVQYXRoTm9kZXMoKTtcbiAgICB0aGlzLnBhdGggPSB0aGlzLnBhdGhOb2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMucGF0aExhYmVscyA9IHRoaXMucGF0aE5vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUubGFiZWw7XG4gICAgfSk7XG5cbiAgICAvLyBsYXp5IGxvYWRcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmluaXRDaGlsZHJlbiA9IGZ1bmN0aW9uIGluaXRDaGlsZHJlbigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuXG4gICAgdmFyIGNoaWxkcmVuS2V5ID0gY29uZmlnLmNoaWxkcmVuO1xuICAgIHZhciBjaGlsZHJlbkRhdGEgPSB0aGlzLmRhdGFbY2hpbGRyZW5LZXldO1xuICAgIHRoaXMuaGFzQ2hpbGRyZW4gPSBBcnJheS5pc0FycmF5KGNoaWxkcmVuRGF0YSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IChjaGlsZHJlbkRhdGEgfHwgW10pLm1hcChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHJldHVybiBuZXcgTm9kZShjaGlsZCwgY29uZmlnLCBfdGhpcyk7XG4gICAgfSk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuY2FsY3VsYXRlUGF0aE5vZGVzID0gZnVuY3Rpb24gY2FsY3VsYXRlUGF0aE5vZGVzKCkge1xuICAgIHZhciBub2RlcyA9IFt0aGlzXTtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cbiAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICBub2Rlcy51bnNoaWZ0KHBhcmVudCk7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiBub2RlcztcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5nZXRQYXRoID0gZnVuY3Rpb24gZ2V0UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuZ2V0VmFsdWVCeU9wdGlvbiA9IGZ1bmN0aW9uIGdldFZhbHVlQnlPcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmVtaXRQYXRoID8gdGhpcy5nZXRQYXRoKCkgOiB0aGlzLmdldFZhbHVlKCk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuZ2V0VGV4dCA9IGZ1bmN0aW9uIGdldFRleHQoYWxsTGV2ZWxzLCBzZXBhcmF0b3IpIHtcbiAgICByZXR1cm4gYWxsTGV2ZWxzID8gdGhpcy5wYXRoTGFiZWxzLmpvaW4oc2VwYXJhdG9yKSA6IHRoaXMubGFiZWw7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuaXNTYW1lTm9kZSA9IGZ1bmN0aW9uIGlzU2FtZU5vZGUoY2hlY2tlZFZhbHVlKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZUJ5T3B0aW9uKCk7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkoY2hlY2tlZFZhbHVlKSA/IGNoZWNrZWRWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiBPYmplY3QodXRpbF9bXCJpc0VxdWFsXCJdKSh2YWwsIHZhbHVlKTtcbiAgICB9KSA6IE9iamVjdCh1dGlsX1tcImlzRXF1YWxcIl0pKGNoZWNrZWRWYWx1ZSwgdmFsdWUpO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmJyb2FkY2FzdCA9IGZ1bmN0aW9uIGJyb2FkY2FzdChldmVudCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIGhhbmRsZXJOYW1lID0gJ29uUGFyZW50JyArIE9iamVjdCh1dGlsX1tcImNhcGl0YWxpemVcIl0pKGV2ZW50KTtcblxuICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAvLyBib3R0b20gdXBcbiAgICAgICAgY2hpbGQuYnJvYWRjYXN0LmFwcGx5KGNoaWxkLCBbZXZlbnRdLmNvbmNhdChhcmdzKSk7XG4gICAgICAgIGNoaWxkW2hhbmRsZXJOYW1lXSAmJiBjaGlsZFtoYW5kbGVyTmFtZV0uYXBwbHkoY2hpbGQsIGFyZ3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50KSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG4gICAgdmFyIGhhbmRsZXJOYW1lID0gJ29uQ2hpbGQnICsgT2JqZWN0KHV0aWxfW1wiY2FwaXRhbGl6ZVwiXSkoZXZlbnQpO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50W2hhbmRsZXJOYW1lXSAmJiBwYXJlbnRbaGFuZGxlck5hbWVdLmFwcGx5KHBhcmVudCwgYXJncyk7XG4gICAgICBwYXJlbnQuZW1pdC5hcHBseShwYXJlbnQsIFtldmVudF0uY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUub25QYXJlbnRDaGVjayA9IGZ1bmN0aW9uIG9uUGFyZW50Q2hlY2soY2hlY2tlZCkge1xuICAgIGlmICghdGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLnNldENoZWNrU3RhdGUoY2hlY2tlZCk7XG4gICAgfVxuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLm9uQ2hpbGRDaGVjayA9IGZ1bmN0aW9uIG9uQ2hpbGRDaGVjaygpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG4gICAgdmFyIHZhbGlkQ2hpbGRyZW4gPSBjaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICByZXR1cm4gIWNoaWxkLmlzRGlzYWJsZWQ7XG4gICAgfSk7XG4gICAgdmFyIGNoZWNrZWQgPSB2YWxpZENoaWxkcmVuLmxlbmd0aCA/IHZhbGlkQ2hpbGRyZW4uZXZlcnkoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICByZXR1cm4gY2hpbGQuY2hlY2tlZDtcbiAgICB9KSA6IGZhbHNlO1xuXG4gICAgdGhpcy5zZXRDaGVja1N0YXRlKGNoZWNrZWQpO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLnNldENoZWNrU3RhdGUgPSBmdW5jdGlvbiBzZXRDaGVja1N0YXRlKGNoZWNrZWQpIHtcbiAgICB2YXIgdG90YWxOdW0gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDtcbiAgICB2YXIgY2hlY2tlZE51bSA9IHRoaXMuY2hpbGRyZW4ucmVkdWNlKGZ1bmN0aW9uIChjLCBwKSB7XG4gICAgICB2YXIgbnVtID0gcC5jaGVja2VkID8gMSA6IHAuaW5kZXRlcm1pbmF0ZSA/IDAuNSA6IDA7XG4gICAgICByZXR1cm4gYyArIG51bTtcbiAgICB9LCAwKTtcblxuICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWQ7XG4gICAgdGhpcy5pbmRldGVybWluYXRlID0gY2hlY2tlZE51bSAhPT0gdG90YWxOdW0gJiYgY2hlY2tlZE51bSA+IDA7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuc3luY0NoZWNrU3RhdGUgPSBmdW5jdGlvbiBzeW5jQ2hlY2tTdGF0ZShjaGVja2VkVmFsdWUpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlQnlPcHRpb24oKTtcbiAgICB2YXIgY2hlY2tlZCA9IHRoaXMuaXNTYW1lTm9kZShjaGVja2VkVmFsdWUsIHZhbHVlKTtcblxuICAgIHRoaXMuZG9DaGVjayhjaGVja2VkKTtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5kb0NoZWNrID0gZnVuY3Rpb24gZG9DaGVjayhjaGVja2VkKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tlZCAhPT0gY2hlY2tlZCkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLmNoZWNrU3RyaWN0bHkpIHtcbiAgICAgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGJvdHRvbSB1cCB0byB1bmlmeSB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGluZGV0ZXJtaW5hdGUgc3RhdGVcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ2NoZWNrJywgY2hlY2tlZCk7XG4gICAgICAgIHRoaXMuc2V0Q2hlY2tTdGF0ZShjaGVja2VkKTtcbiAgICAgICAgdGhpcy5lbWl0KCdjaGVjaycpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBub2RlX2NyZWF0ZUNsYXNzKE5vZGUsIFt7XG4gICAga2V5OiAnaXNEaXNhYmxlZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSxcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzLnBhcmVudCxcbiAgICAgICAgICBjb25maWcgPSB0aGlzLmNvbmZpZztcblxuICAgICAgdmFyIGRpc2FibGVkS2V5ID0gY29uZmlnLmRpc2FibGVkO1xuICAgICAgdmFyIGNoZWNrU3RyaWN0bHkgPSBjb25maWcuY2hlY2tTdHJpY3RseTtcblxuICAgICAgcmV0dXJuIGRhdGFbZGlzYWJsZWRLZXldIHx8ICFjaGVja1N0cmljdGx5ICYmIHBhcmVudCAmJiBwYXJlbnQuaXNEaXNhYmxlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc0xlYWYnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgbG9hZGVkID0gdGhpcy5sb2FkZWQsXG4gICAgICAgICAgaGFzQ2hpbGRyZW4gPSB0aGlzLmhhc0NoaWxkcmVuLFxuICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcbiAgICAgIHZhciBfY29uZmlnMiA9IHRoaXMuY29uZmlnLFxuICAgICAgICAgIGxhenkgPSBfY29uZmlnMi5sYXp5LFxuICAgICAgICAgIGxlYWZLZXkgPSBfY29uZmlnMi5sZWFmO1xuXG4gICAgICBpZiAobGF6eSkge1xuICAgICAgICB2YXIgaXNMZWFmID0gT2JqZWN0KHNoYXJlZF9bXCJpc0RlZlwiXSkoZGF0YVtsZWFmS2V5XSkgPyBkYXRhW2xlYWZLZXldIDogbG9hZGVkID8gIWNoaWxkcmVuLmxlbmd0aCA6IGZhbHNlO1xuICAgICAgICB0aGlzLmhhc0NoaWxkcmVuID0gIWlzTGVhZjtcbiAgICAgICAgcmV0dXJuIGlzTGVhZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhaGFzQ2hpbGRyZW47XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE5vZGU7XG59KCk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19ub2RlID0gKHNyY19ub2RlX05vZGUpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvc3RvcmUuanNcbmZ1bmN0aW9uIHN0b3JlX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXG5cblxudmFyIGZsYXROb2RlcyA9IGZ1bmN0aW9uIGZsYXROb2RlcyhkYXRhLCBsZWFmT25seSkge1xuICByZXR1cm4gZGF0YS5yZWR1Y2UoZnVuY3Rpb24gKHJlcywgbm9kZSkge1xuICAgIGlmIChub2RlLmlzTGVhZikge1xuICAgICAgcmVzLnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICFsZWFmT25seSAmJiByZXMucHVzaChub2RlKTtcbiAgICAgIHJlcyA9IHJlcy5jb25jYXQoZmxhdE5vZGVzKG5vZGUuY2hpbGRyZW4sIGxlYWZPbmx5KSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH0sIFtdKTtcbn07XG5cbnZhciBzdG9yZV9TdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3RvcmUoZGF0YSwgY29uZmlnKSB7XG4gICAgc3RvcmVfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RvcmUpO1xuXG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pbml0Tm9kZXMoZGF0YSk7XG4gIH1cblxuICBTdG9yZS5wcm90b3R5cGUuaW5pdE5vZGVzID0gZnVuY3Rpb24gaW5pdE5vZGVzKGRhdGEpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZGF0YSA9IE9iamVjdCh1dGlsX1tcImNvZXJjZVRydXRoeVZhbHVlVG9BcnJheVwiXSkoZGF0YSk7XG4gICAgdGhpcy5ub2RlcyA9IGRhdGEubWFwKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBzcmNfbm9kZShub2RlRGF0YSwgX3RoaXMuY29uZmlnKTtcbiAgICB9KTtcbiAgICB0aGlzLmZsYXR0ZWROb2RlcyA9IHRoaXMuZ2V0RmxhdHRlZE5vZGVzKGZhbHNlLCBmYWxzZSk7XG4gICAgdGhpcy5sZWFmTm9kZXMgPSB0aGlzLmdldEZsYXR0ZWROb2Rlcyh0cnVlLCBmYWxzZSk7XG4gIH07XG5cbiAgU3RvcmUucHJvdG90eXBlLmFwcGVuZE5vZGUgPSBmdW5jdGlvbiBhcHBlbmROb2RlKG5vZGVEYXRhLCBwYXJlbnROb2RlKSB7XG4gICAgdmFyIG5vZGUgPSBuZXcgc3JjX25vZGUobm9kZURhdGEsIHRoaXMuY29uZmlnLCBwYXJlbnROb2RlKTtcbiAgICB2YXIgY2hpbGRyZW4gPSBwYXJlbnROb2RlID8gcGFyZW50Tm9kZS5jaGlsZHJlbiA6IHRoaXMubm9kZXM7XG5cbiAgICBjaGlsZHJlbi5wdXNoKG5vZGUpO1xuICB9O1xuXG4gIFN0b3JlLnByb3RvdHlwZS5hcHBlbmROb2RlcyA9IGZ1bmN0aW9uIGFwcGVuZE5vZGVzKG5vZGVEYXRhTGlzdCwgcGFyZW50Tm9kZSkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgbm9kZURhdGFMaXN0ID0gT2JqZWN0KHV0aWxfW1wiY29lcmNlVHJ1dGh5VmFsdWVUb0FycmF5XCJdKShub2RlRGF0YUxpc3QpO1xuICAgIG5vZGVEYXRhTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgcmV0dXJuIF90aGlzMi5hcHBlbmROb2RlKG5vZGVEYXRhLCBwYXJlbnROb2RlKTtcbiAgICB9KTtcbiAgfTtcblxuICBTdG9yZS5wcm90b3R5cGUuZ2V0Tm9kZXMgPSBmdW5jdGlvbiBnZXROb2RlcygpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlcztcbiAgfTtcblxuICBTdG9yZS5wcm90b3R5cGUuZ2V0RmxhdHRlZE5vZGVzID0gZnVuY3Rpb24gZ2V0RmxhdHRlZE5vZGVzKGxlYWZPbmx5KSB7XG4gICAgdmFyIGNhY2hlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcblxuICAgIHZhciBjYWNoZWROb2RlcyA9IGxlYWZPbmx5ID8gdGhpcy5sZWFmTm9kZXMgOiB0aGlzLmZsYXR0ZWROb2RlcztcbiAgICByZXR1cm4gY2FjaGVkID8gY2FjaGVkTm9kZXMgOiBmbGF0Tm9kZXModGhpcy5ub2RlcywgbGVhZk9ubHkpO1xuICB9O1xuXG4gIFN0b3JlLnByb3RvdHlwZS5nZXROb2RlQnlWYWx1ZSA9IGZ1bmN0aW9uIGdldE5vZGVCeVZhbHVlKHZhbHVlKSB7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5nZXRGbGF0dGVkTm9kZXMoZmFsc2UsICF0aGlzLmNvbmZpZy5sYXp5KS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBPYmplY3QodXRpbF9bXCJ2YWx1ZUVxdWFsc1wiXSkobm9kZS5wYXRoLCB2YWx1ZSkgfHwgbm9kZS52YWx1ZSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGVzICYmIG5vZGVzLmxlbmd0aCA/IG5vZGVzWzBdIDogbnVsbDtcbiAgfTtcblxuICByZXR1cm4gU3RvcmU7XG59KCk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhc2NhZGVyX3BhbmVsX3NyY19zdG9yZSA9IChzdG9yZV9TdG9yZSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItcGFuZWwudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxudmFyIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG5cblxudmFyIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfS2V5Q29kZSA9IGFyaWFfdXRpbHNfZGVmYXVsdC5hLmtleXM7XG5cbnZhciBEZWZhdWx0UHJvcHMgPSB7XG4gIGV4cGFuZFRyaWdnZXI6ICdjbGljaycsIC8vIG9yIGhvdmVyXG4gIG11bHRpcGxlOiBmYWxzZSxcbiAgY2hlY2tTdHJpY3RseTogZmFsc2UsIC8vIHdoZXRoZXIgYWxsIG5vZGVzIGNhbiBiZSBzZWxlY3RlZFxuICBlbWl0UGF0aDogdHJ1ZSwgLy8gd2V0aGVyIHRvIGVtaXQgYW4gYXJyYXkgb2YgYWxsIGxldmVscyB2YWx1ZSBpbiB3aGljaCBub2RlIGlzIGxvY2F0ZWRcbiAgbGF6eTogZmFsc2UsXG4gIGxhenlMb2FkOiB1dGlsX1tcIm5vb3BcIl0sXG4gIHZhbHVlOiAndmFsdWUnLFxuICBsYWJlbDogJ2xhYmVsJyxcbiAgY2hpbGRyZW46ICdjaGlsZHJlbicsXG4gIGxlYWY6ICdsZWFmJyxcbiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGhvdmVyVGhyZXNob2xkOiA1MDBcbn07XG5cbnZhciBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2lzTGVhZiA9IGZ1bmN0aW9uIGlzTGVhZihlbCkge1xuICByZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgnYXJpYS1vd25zJyk7XG59O1xuXG52YXIgZ2V0U2libGluZyA9IGZ1bmN0aW9uIGdldFNpYmxpbmcoZWwsIGRpc3RhbmNlKSB7XG4gIHZhciBwYXJlbnROb2RlID0gZWwucGFyZW50Tm9kZTtcblxuICBpZiAocGFyZW50Tm9kZSkge1xuICAgIHZhciBzaWJsaW5ncyA9IHBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgnLmVsLWNhc2NhZGVyLW5vZGVbdGFiaW5kZXg9XCItMVwiXScpO1xuICAgIHZhciBpbmRleCA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoc2libGluZ3MsIGVsKTtcbiAgICByZXR1cm4gc2libGluZ3NbaW5kZXggKyBkaXN0YW5jZV0gfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciBnZXRNZW51SW5kZXggPSBmdW5jdGlvbiBnZXRNZW51SW5kZXgoZWwsIGRpc3RhbmNlKSB7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdmFyIHBpZWNlcyA9IGVsLmlkLnNwbGl0KCctJyk7XG4gIHJldHVybiBOdW1iZXIocGllY2VzW3BpZWNlcy5sZW5ndGggLSAyXSk7XG59O1xuXG52YXIgZm9jdXNOb2RlID0gZnVuY3Rpb24gZm9jdXNOb2RlKGVsKSB7XG4gIGlmICghZWwpIHJldHVybjtcbiAgZWwuZm9jdXMoKTtcbiAgIWNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfaXNMZWFmKGVsKSAmJiBlbC5jbGljaygpO1xufTtcblxudmFyIGNoZWNrTm9kZSA9IGZ1bmN0aW9uIGNoZWNrTm9kZShlbCkge1xuICBpZiAoIWVsKSByZXR1cm47XG5cbiAgdmFyIGlucHV0ID0gZWwucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgaWYgKGlucHV0KSB7XG4gICAgaW5wdXQuY2xpY2soKTtcbiAgfSBlbHNlIGlmIChjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2lzTGVhZihlbCkpIHtcbiAgICBlbC5jbGljaygpO1xuICB9XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbENhc2NhZGVyUGFuZWwnLFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBDYXNjYWRlck1lbnU6IGNhc2NhZGVyX21lbnVcbiAgfSxcblxuICBwcm9wczoge1xuICAgIHZhbHVlOiB7fSxcbiAgICBvcHRpb25zOiBBcnJheSxcbiAgICBwcm9wczogT2JqZWN0LFxuICAgIGJvcmRlcjoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIHJlbmRlckxhYmVsOiBGdW5jdGlvblxuICB9LFxuXG4gIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhbmVsOiB0aGlzXG4gICAgfTtcbiAgfSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZFZhbHVlOiBudWxsLFxuICAgICAgY2hlY2tlZE5vZGVQYXRoczogW10sXG4gICAgICBzdG9yZTogW10sXG4gICAgICBtZW51czogW10sXG4gICAgICBhY3RpdmVQYXRoOiBbXSxcbiAgICAgIGxvYWRDb3VudDogMFxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIGNvbmZpZzogZnVuY3Rpb24gY29uZmlnKCkge1xuICAgICAgcmV0dXJuIG1lcmdlX2RlZmF1bHQoKShjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2V4dGVuZHMoe30sIERlZmF1bHRQcm9wcyksIHRoaXMucHJvcHMgfHwge30pO1xuICAgIH0sXG4gICAgbXVsdGlwbGU6IGZ1bmN0aW9uIG11bHRpcGxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLm11bHRpcGxlO1xuICAgIH0sXG4gICAgY2hlY2tTdHJpY3RseTogZnVuY3Rpb24gY2hlY2tTdHJpY3RseSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5jaGVja1N0cmljdGx5O1xuICAgIH0sXG4gICAgbGVhZk9ubHk6IGZ1bmN0aW9uIGxlYWZPbmx5KCkge1xuICAgICAgcmV0dXJuICF0aGlzLmNoZWNrU3RyaWN0bHk7XG4gICAgfSxcbiAgICBpc0hvdmVyTWVudTogZnVuY3Rpb24gaXNIb3Zlck1lbnUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuZXhwYW5kVHJpZ2dlciA9PT0gJ2hvdmVyJztcbiAgICB9LFxuICAgIHJlbmRlckxhYmVsRm46IGZ1bmN0aW9uIHJlbmRlckxhYmVsRm4oKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJMYWJlbCB8fCB0aGlzLiRzY29wZWRTbG90cy5kZWZhdWx0O1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHRoaXMuc3luY0NoZWNrZWRWYWx1ZSgpO1xuICAgICAgdGhpcy5jaGVja1N0cmljdGx5ICYmIHRoaXMuY2FsY3VsYXRlQ2hlY2tlZE5vZGVQYXRocygpO1xuICAgIH0sXG5cbiAgICBvcHRpb25zOiB7XG4gICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICB0aGlzLmluaXRTdG9yZSgpO1xuICAgICAgfSxcbiAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgIGRlZXA6IHRydWVcbiAgICB9LFxuICAgIGNoZWNrZWRWYWx1ZTogZnVuY3Rpb24gY2hlY2tlZFZhbHVlKHZhbCkge1xuICAgICAgaWYgKCFPYmplY3QodXRpbF9bXCJpc0VxdWFsXCJdKSh2YWwsIHRoaXMudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuY2hlY2tTdHJpY3RseSAmJiB0aGlzLmNhbGN1bGF0ZUNoZWNrZWROb2RlUGF0aHMoKTtcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIGlmICghdGhpcy5pc0VtcHR5VmFsdWUodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuc3luY0NoZWNrZWRWYWx1ZSgpO1xuICAgIH1cbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBpbml0U3RvcmU6IGZ1bmN0aW9uIGluaXRTdG9yZSgpIHtcbiAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBpZiAoY29uZmlnLmxhenkgJiYgT2JqZWN0KHV0aWxfW1wiaXNFbXB0eVwiXSkob3B0aW9ucykpIHtcbiAgICAgICAgdGhpcy5sYXp5TG9hZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdG9yZSA9IG5ldyBjYXNjYWRlcl9wYW5lbF9zcmNfc3RvcmUob3B0aW9ucywgY29uZmlnKTtcbiAgICAgICAgdGhpcy5tZW51cyA9IFt0aGlzLnN0b3JlLmdldE5vZGVzKCldO1xuICAgICAgICB0aGlzLnN5bmNNZW51U3RhdGUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHN5bmNDaGVja2VkVmFsdWU6IGZ1bmN0aW9uIHN5bmNDaGVja2VkVmFsdWUoKSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlLFxuICAgICAgICAgIGNoZWNrZWRWYWx1ZSA9IHRoaXMuY2hlY2tlZFZhbHVlO1xuXG4gICAgICBpZiAoIU9iamVjdCh1dGlsX1tcImlzRXF1YWxcIl0pKHZhbHVlLCBjaGVja2VkVmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlUGF0aCA9IFtdO1xuICAgICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnN5bmNNZW51U3RhdGUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHN5bmNNZW51U3RhdGU6IGZ1bmN0aW9uIHN5bmNNZW51U3RhdGUoKSB7XG4gICAgICB2YXIgbXVsdGlwbGUgPSB0aGlzLm11bHRpcGxlLFxuICAgICAgICAgIGNoZWNrU3RyaWN0bHkgPSB0aGlzLmNoZWNrU3RyaWN0bHk7XG5cbiAgICAgIHRoaXMuc3luY0FjdGl2ZVBhdGgoKTtcbiAgICAgIG11bHRpcGxlICYmIHRoaXMuc3luY011bHRpQ2hlY2tTdGF0ZSgpO1xuICAgICAgY2hlY2tTdHJpY3RseSAmJiB0aGlzLmNhbGN1bGF0ZUNoZWNrZWROb2RlUGF0aHMoKTtcbiAgICAgIHRoaXMuJG5leHRUaWNrKHRoaXMuc2Nyb2xsSW50b1ZpZXcpO1xuICAgIH0sXG4gICAgc3luY011bHRpQ2hlY2tTdGF0ZTogZnVuY3Rpb24gc3luY011bHRpQ2hlY2tTdGF0ZSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBub2RlcyA9IHRoaXMuZ2V0RmxhdHRlZE5vZGVzKHRoaXMubGVhZk9ubHkpO1xuXG4gICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIG5vZGUuc3luY0NoZWNrU3RhdGUoX3RoaXMuY2hlY2tlZFZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgaXNFbXB0eVZhbHVlOiBmdW5jdGlvbiBpc0VtcHR5VmFsdWUodmFsKSB7XG4gICAgICB2YXIgbXVsdGlwbGUgPSB0aGlzLm11bHRpcGxlLFxuICAgICAgICAgIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgICAgdmFyIGVtaXRQYXRoID0gY29uZmlnLmVtaXRQYXRoO1xuXG4gICAgICBpZiAobXVsdGlwbGUgfHwgZW1pdFBhdGgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdCh1dGlsX1tcImlzRW1wdHlcIl0pKHZhbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBzeW5jQWN0aXZlUGF0aDogZnVuY3Rpb24gc3luY0FjdGl2ZVBhdGgoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZSxcbiAgICAgICAgICBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGUsXG4gICAgICAgICAgYWN0aXZlUGF0aCA9IHRoaXMuYWN0aXZlUGF0aCxcbiAgICAgICAgICBjaGVja2VkVmFsdWUgPSB0aGlzLmNoZWNrZWRWYWx1ZTtcblxuXG4gICAgICBpZiAoIU9iamVjdCh1dGlsX1tcImlzRW1wdHlcIl0pKGFjdGl2ZVBhdGgpKSB7XG4gICAgICAgIHZhciBub2RlcyA9IGFjdGl2ZVBhdGgubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5nZXROb2RlQnlWYWx1ZShub2RlLmdldFZhbHVlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leHBhbmROb2Rlcyhub2Rlcyk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzRW1wdHlWYWx1ZShjaGVja2VkVmFsdWUpKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG11bHRpcGxlID8gY2hlY2tlZFZhbHVlWzBdIDogY2hlY2tlZFZhbHVlO1xuICAgICAgICB2YXIgY2hlY2tlZE5vZGUgPSB0aGlzLmdldE5vZGVCeVZhbHVlKHZhbHVlKSB8fCB7fTtcbiAgICAgICAgdmFyIF9ub2RlcyA9IChjaGVja2VkTm9kZS5wYXRoTm9kZXMgfHwgW10pLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgdGhpcy5leHBhbmROb2Rlcyhfbm9kZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQYXRoID0gW107XG4gICAgICAgIHRoaXMubWVudXMgPSBbc3RvcmUuZ2V0Tm9kZXMoKV07XG4gICAgICB9XG4gICAgfSxcbiAgICBleHBhbmROb2RlczogZnVuY3Rpb24gZXhwYW5kTm9kZXMobm9kZXMpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBfdGhpczMuaGFuZGxlRXhwYW5kKG5vZGUsIHRydWUgLyogc2lsZW50ICovKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY2FsY3VsYXRlQ2hlY2tlZE5vZGVQYXRoczogZnVuY3Rpb24gY2FsY3VsYXRlQ2hlY2tlZE5vZGVQYXRocygpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICB2YXIgY2hlY2tlZFZhbHVlID0gdGhpcy5jaGVja2VkVmFsdWUsXG4gICAgICAgICAgbXVsdGlwbGUgPSB0aGlzLm11bHRpcGxlO1xuXG4gICAgICB2YXIgY2hlY2tlZFZhbHVlcyA9IG11bHRpcGxlID8gT2JqZWN0KHV0aWxfW1wiY29lcmNlVHJ1dGh5VmFsdWVUb0FycmF5XCJdKShjaGVja2VkVmFsdWUpIDogW2NoZWNrZWRWYWx1ZV07XG4gICAgICB0aGlzLmNoZWNrZWROb2RlUGF0aHMgPSBjaGVja2VkVmFsdWVzLm1hcChmdW5jdGlvbiAodikge1xuICAgICAgICB2YXIgY2hlY2tlZE5vZGUgPSBfdGhpczQuZ2V0Tm9kZUJ5VmFsdWUodik7XG4gICAgICAgIHJldHVybiBjaGVja2VkTm9kZSA/IGNoZWNrZWROb2RlLnBhdGhOb2RlcyA6IFtdO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBoYW5kbGVLZXlEb3duOiBmdW5jdGlvbiBoYW5kbGVLZXlEb3duKGUpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldCxcbiAgICAgICAgICBrZXlDb2RlID0gZS5rZXlDb2RlO1xuXG5cbiAgICAgIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgICAgICBjYXNlIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfS2V5Q29kZS51cDpcbiAgICAgICAgICB2YXIgcHJldiA9IGdldFNpYmxpbmcodGFyZ2V0LCAtMSk7XG4gICAgICAgICAgZm9jdXNOb2RlKHByZXYpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfS2V5Q29kZS5kb3duOlxuICAgICAgICAgIHZhciBuZXh0ID0gZ2V0U2libGluZyh0YXJnZXQsIDEpO1xuICAgICAgICAgIGZvY3VzTm9kZShuZXh0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0tleUNvZGUubGVmdDpcbiAgICAgICAgICB2YXIgcHJlTWVudSA9IHRoaXMuJHJlZnMubWVudVtnZXRNZW51SW5kZXgodGFyZ2V0KSAtIDFdO1xuICAgICAgICAgIGlmIChwcmVNZW51KSB7XG4gICAgICAgICAgICB2YXIgZXhwYW5kZWROb2RlID0gcHJlTWVudS4kZWwucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW5vZGVbYXJpYS1leHBhbmRlZD1cInRydWVcIl0nKTtcbiAgICAgICAgICAgIGZvY3VzTm9kZShleHBhbmRlZE5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0tleUNvZGUucmlnaHQ6XG4gICAgICAgICAgdmFyIG5leHRNZW51ID0gdGhpcy4kcmVmcy5tZW51W2dldE1lbnVJbmRleCh0YXJnZXQpICsgMV07XG4gICAgICAgICAgaWYgKG5leHRNZW51KSB7XG4gICAgICAgICAgICB2YXIgZmlyc3ROb2RlID0gbmV4dE1lbnUuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1jYXNjYWRlci1ub2RlW3RhYmluZGV4PVwiLTFcIl0nKTtcbiAgICAgICAgICAgIGZvY3VzTm9kZShmaXJzdE5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0tleUNvZGUuZW50ZXI6XG4gICAgICAgICAgY2hlY2tOb2RlKHRhcmdldCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19LZXlDb2RlLmVzYzpcbiAgICAgICAgY2FzZSBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX0tleUNvZGUudGFiOlxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2Nsb3NlJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlRXhwYW5kOiBmdW5jdGlvbiBoYW5kbGVFeHBhbmQobm9kZSwgc2lsZW50KSB7XG4gICAgICB2YXIgYWN0aXZlUGF0aCA9IHRoaXMuYWN0aXZlUGF0aDtcbiAgICAgIHZhciBsZXZlbCA9IG5vZGUubGV2ZWw7XG5cbiAgICAgIHZhciBwYXRoID0gYWN0aXZlUGF0aC5zbGljZSgwLCBsZXZlbCAtIDEpO1xuICAgICAgdmFyIG1lbnVzID0gdGhpcy5tZW51cy5zbGljZSgwLCBsZXZlbCk7XG5cbiAgICAgIGlmICghbm9kZS5pc0xlYWYpIHtcbiAgICAgICAgcGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICBtZW51cy5wdXNoKG5vZGUuY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFjdGl2ZVBhdGggPSBwYXRoO1xuICAgICAgdGhpcy5tZW51cyA9IG1lbnVzO1xuXG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICB2YXIgcGF0aFZhbHVlcyA9IHBhdGgubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VmFsdWUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBhY3RpdmVQYXRoVmFsdWVzID0gYWN0aXZlUGF0aC5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRWYWx1ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFPYmplY3QodXRpbF9bXCJ2YWx1ZUVxdWFsc1wiXSkocGF0aFZhbHVlcywgYWN0aXZlUGF0aFZhbHVlcykpIHtcbiAgICAgICAgICB0aGlzLiRlbWl0KCdhY3RpdmUtaXRlbS1jaGFuZ2UnLCBwYXRoVmFsdWVzKTsgLy8gRGVwcmVjYXRlZFxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2V4cGFuZC1jaGFuZ2UnLCBwYXRoVmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlQ2hlY2tDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUNoZWNrQ2hhbmdlKHZhbHVlKSB7XG4gICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IHZhbHVlO1xuICAgIH0sXG4gICAgbGF6eUxvYWQ6IGZ1bmN0aW9uIGxhenlMb2FkKG5vZGUsIG9uRnVsbGZpbGVkKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUgfHwgeyByb290OiB0cnVlLCBsZXZlbDogMCB9O1xuICAgICAgICB0aGlzLnN0b3JlID0gbmV3IGNhc2NhZGVyX3BhbmVsX3NyY19zdG9yZShbXSwgY29uZmlnKTtcbiAgICAgICAgdGhpcy5tZW51cyA9IFt0aGlzLnN0b3JlLmdldE5vZGVzKCldO1xuICAgICAgfVxuICAgICAgbm9kZS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHZhciByZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZShkYXRhTGlzdCkge1xuICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5yb290ID8gbnVsbCA6IG5vZGU7XG4gICAgICAgIGRhdGFMaXN0ICYmIGRhdGFMaXN0Lmxlbmd0aCAmJiBfdGhpczUuc3RvcmUuYXBwZW5kTm9kZXMoZGF0YUxpc3QsIHBhcmVudCk7XG4gICAgICAgIG5vZGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBub2RlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gZGlzcG9zZSBkZWZhdWx0IHZhbHVlIG9uIGxhenkgbG9hZCBtb2RlXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KF90aGlzNS5jaGVja2VkVmFsdWUpKSB7XG4gICAgICAgICAgdmFyIG5vZGVWYWx1ZSA9IF90aGlzNS5jaGVja2VkVmFsdWVbX3RoaXM1LmxvYWRDb3VudCsrXTtcbiAgICAgICAgICB2YXIgdmFsdWVLZXkgPSBfdGhpczUuY29uZmlnLnZhbHVlO1xuICAgICAgICAgIHZhciBsZWFmS2V5ID0gX3RoaXM1LmNvbmZpZy5sZWFmO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YUxpc3QpICYmIGRhdGFMaXN0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1bdmFsdWVLZXldID09PSBub2RlVmFsdWU7XG4gICAgICAgICAgfSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIGNoZWNrZWROb2RlID0gX3RoaXM1LnN0b3JlLmdldE5vZGVCeVZhbHVlKG5vZGVWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghY2hlY2tlZE5vZGUuZGF0YVtsZWFmS2V5XSkge1xuICAgICAgICAgICAgICBfdGhpczUubGF6eUxvYWQoY2hlY2tlZE5vZGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpczUuaGFuZGxlRXhwYW5kKGNoZWNrZWROb2RlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfdGhpczUubG9hZENvdW50ID09PSBfdGhpczUuY2hlY2tlZFZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICBfdGhpczUuJHBhcmVudC5jb21wdXRlUHJlc2VudFRleHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvbkZ1bGxmaWxlZCAmJiBvbkZ1bGxmaWxlZChkYXRhTGlzdCk7XG4gICAgICB9O1xuICAgICAgY29uZmlnLmxhenlMb2FkKG5vZGUsIHJlc29sdmUpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIHB1YmxpYyBtZXRob2RzXG4gICAgKi9cbiAgICBjYWxjdWxhdGVNdWx0aUNoZWNrZWRWYWx1ZTogZnVuY3Rpb24gY2FsY3VsYXRlTXVsdGlDaGVja2VkVmFsdWUoKSB7XG4gICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IHRoaXMuZ2V0Q2hlY2tlZE5vZGVzKHRoaXMubGVhZk9ubHkpLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5nZXRWYWx1ZUJ5T3B0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHNjcm9sbEludG9WaWV3OiBmdW5jdGlvbiBzY3JvbGxJbnRvVmlldygpIHtcbiAgICAgIGlmICh0aGlzLiRpc1NlcnZlcikgcmV0dXJuO1xuXG4gICAgICB2YXIgbWVudXMgPSB0aGlzLiRyZWZzLm1lbnUgfHwgW107XG4gICAgICBtZW51cy5mb3JFYWNoKGZ1bmN0aW9uIChtZW51KSB7XG4gICAgICAgIHZhciBtZW51RWxlbWVudCA9IG1lbnUuJGVsO1xuICAgICAgICBpZiAobWVudUVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbWVudUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVsLXNjcm9sbGJhcl9fd3JhcCcpO1xuICAgICAgICAgIHZhciBhY3RpdmVOb2RlID0gbWVudUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW5vZGUuaXMtYWN0aXZlJykgfHwgbWVudUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW5vZGUuaW4tYWN0aXZlLXBhdGgnKTtcbiAgICAgICAgICBzY3JvbGxfaW50b192aWV3X2RlZmF1bHQoKShjb250YWluZXIsIGFjdGl2ZU5vZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldE5vZGVCeVZhbHVlOiBmdW5jdGlvbiBnZXROb2RlQnlWYWx1ZSh2YWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldE5vZGVCeVZhbHVlKHZhbCk7XG4gICAgfSxcbiAgICBnZXRGbGF0dGVkTm9kZXM6IGZ1bmN0aW9uIGdldEZsYXR0ZWROb2RlcyhsZWFmT25seSkge1xuICAgICAgdmFyIGNhY2hlZCA9ICF0aGlzLmNvbmZpZy5sYXp5O1xuICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0RmxhdHRlZE5vZGVzKGxlYWZPbmx5LCBjYWNoZWQpO1xuICAgIH0sXG4gICAgZ2V0Q2hlY2tlZE5vZGVzOiBmdW5jdGlvbiBnZXRDaGVja2VkTm9kZXMobGVhZk9ubHkpIHtcbiAgICAgIHZhciBjaGVja2VkVmFsdWUgPSB0aGlzLmNoZWNrZWRWYWx1ZSxcbiAgICAgICAgICBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XG5cbiAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLmdldEZsYXR0ZWROb2RlcyhsZWFmT25seSk7XG4gICAgICAgIHJldHVybiBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5jaGVja2VkO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRW1wdHlWYWx1ZShjaGVja2VkVmFsdWUpID8gW10gOiBbdGhpcy5nZXROb2RlQnlWYWx1ZShjaGVja2VkVmFsdWUpXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsZWFyQ2hlY2tlZE5vZGVzOiBmdW5jdGlvbiBjbGVhckNoZWNrZWROb2RlcygpIHtcbiAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgICBsZWFmT25seSA9IHRoaXMubGVhZk9ubHk7XG4gICAgICB2YXIgbXVsdGlwbGUgPSBjb25maWcubXVsdGlwbGUsXG4gICAgICAgICAgZW1pdFBhdGggPSBjb25maWcuZW1pdFBhdGg7XG5cbiAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICB0aGlzLmdldENoZWNrZWROb2RlcyhsZWFmT25seSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuICFub2RlLmlzRGlzYWJsZWQ7XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5kb0NoZWNrKGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTXVsdGlDaGVja2VkVmFsdWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hlY2tlZFZhbHVlID0gZW1pdFBhdGggPyBbXSA6IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGNhc2NhZGVyX3BhbmVsX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2Nhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0OTMyMzQ2X3JlbmRlcixcbiAgY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDkzMjM0Nl9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGNhc2NhZGVyX3BhbmVsX2FwaTsgfVxuY2FzY2FkZXJfcGFuZWxfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItcGFuZWwudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhc2NhZGVyX3BhbmVsID0gKGNhc2NhZGVyX3BhbmVsX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY2FzY2FkZXJfcGFuZWwuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChjYXNjYWRlcl9wYW5lbC5uYW1lLCBjYXNjYWRlcl9wYW5lbCk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19jYXNjYWRlcl9wYW5lbCA9IChjYXNjYWRlcl9wYW5lbCk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9hdmF0YXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhdmF0YXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxBdmF0YXInLFxuXG4gIHByb3BzOiB7XG4gICAgc2l6ZToge1xuICAgICAgdHlwZTogW051bWJlciwgU3RyaW5nXSxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gWydsYXJnZScsICdtZWRpdW0nLCAnc21hbGwnXS5pbmNsdWRlcyh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcbiAgICAgIH1cbiAgICB9LFxuICAgIHNoYXBlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnY2lyY2xlJyxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAgICAgICByZXR1cm4gWydjaXJjbGUnLCAnc3F1YXJlJ10uaW5jbHVkZXModmFsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGljb246IFN0cmluZyxcbiAgICBzcmM6IFN0cmluZyxcbiAgICBhbHQ6IFN0cmluZyxcbiAgICBzcmNTZXQ6IFN0cmluZyxcbiAgICBlcnJvcjogRnVuY3Rpb24sXG4gICAgZml0OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnY292ZXInXG4gICAgfVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzSW1hZ2VFeGlzdDogdHJ1ZVxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIGF2YXRhckNsYXNzOiBmdW5jdGlvbiBhdmF0YXJDbGFzcygpIHtcbiAgICAgIHZhciBzaXplID0gdGhpcy5zaXplLFxuICAgICAgICAgIGljb24gPSB0aGlzLmljb24sXG4gICAgICAgICAgc2hhcGUgPSB0aGlzLnNoYXBlO1xuXG4gICAgICB2YXIgY2xhc3NMaXN0ID0gWydlbC1hdmF0YXInXTtcblxuICAgICAgaWYgKHNpemUgJiYgdHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNsYXNzTGlzdC5wdXNoKCdlbC1hdmF0YXItLScgKyBzaXplKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGljb24pIHtcbiAgICAgICAgY2xhc3NMaXN0LnB1c2goJ2VsLWF2YXRhci0taWNvbicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hhcGUpIHtcbiAgICAgICAgY2xhc3NMaXN0LnB1c2goJ2VsLWF2YXRhci0tJyArIHNoYXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNsYXNzTGlzdC5qb2luKCcgJyk7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVFcnJvcjogZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICB2YXIgZXJyb3IgPSB0aGlzLmVycm9yO1xuXG4gICAgICB2YXIgZXJyb3JGbGFnID0gZXJyb3IgPyBlcnJvcigpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGVycm9yRmxhZyAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5pc0ltYWdlRXhpc3QgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbmRlckF2YXRhcjogZnVuY3Rpb24gcmVuZGVyQXZhdGFyKCkge1xuICAgICAgdmFyIGggPSB0aGlzLiRjcmVhdGVFbGVtZW50O1xuICAgICAgdmFyIGljb24gPSB0aGlzLmljb24sXG4gICAgICAgICAgc3JjID0gdGhpcy5zcmMsXG4gICAgICAgICAgYWx0ID0gdGhpcy5hbHQsXG4gICAgICAgICAgaXNJbWFnZUV4aXN0ID0gdGhpcy5pc0ltYWdlRXhpc3QsXG4gICAgICAgICAgc3JjU2V0ID0gdGhpcy5zcmNTZXQsXG4gICAgICAgICAgZml0ID0gdGhpcy5maXQ7XG5cblxuICAgICAgaWYgKGlzSW1hZ2VFeGlzdCAmJiBzcmMpIHtcbiAgICAgICAgcmV0dXJuIGgoJ2ltZycsIHtcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgc3JjOiBzcmMsXG5cbiAgICAgICAgICAgIGFsdDogYWx0LFxuICAgICAgICAgICAgc3JjU2V0OiBzcmNTZXRcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAnZXJyb3InOiB0aGlzLmhhbmRsZUVycm9yXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHlsZTogeyAnb2JqZWN0LWZpdCc6IGZpdCB9IH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaWNvbikge1xuICAgICAgICByZXR1cm4gaCgnaScsIHsgJ2NsYXNzJzogaWNvbiB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuJHNsb3RzLmRlZmF1bHQ7XG4gICAgfVxuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBoID0gYXJndW1lbnRzWzBdO1xuICAgIHZhciBhdmF0YXJDbGFzcyA9IHRoaXMuYXZhdGFyQ2xhc3MsXG4gICAgICAgIHNpemUgPSB0aGlzLnNpemU7XG5cblxuICAgIHZhciBzaXplU3R5bGUgPSB0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgICBoZWlnaHQ6IHNpemUgKyAncHgnLFxuICAgICAgd2lkdGg6IHNpemUgKyAncHgnLFxuICAgICAgbGluZUhlaWdodDogc2l6ZSArICdweCdcbiAgICB9IDoge307XG5cbiAgICByZXR1cm4gaChcbiAgICAgICdzcGFuJyxcbiAgICAgIHsgJ2NsYXNzJzogYXZhdGFyQ2xhc3MsIHN0eWxlOiBzaXplU3R5bGUgfSxcbiAgICAgIFt0aGlzLnJlbmRlckF2YXRhcigpXVxuICAgICk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9hdmF0YXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2F2YXRhcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChhdmF0YXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYXZhdGFyL3NyYy9tYWluLnZ1ZVxudmFyIHNyY19tYWluX3JlbmRlciwgc3JjX21haW5fc3RhdGljUmVuZGVyRm5zXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGF2YXRhcl9zcmNfbWFpbl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhY2thZ2VzX2F2YXRhcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgc3JjX21haW5fcmVuZGVyLFxuICBzcmNfbWFpbl9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGF2YXRhcl9zcmNfbWFpbl9hcGk7IH1cbmF2YXRhcl9zcmNfbWFpbl9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2F2YXRhci9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYXZhdGFyX3NyY19tYWluID0gKGF2YXRhcl9zcmNfbWFpbl9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2F2YXRhci9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5hdmF0YXJfc3JjX21haW4uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChhdmF0YXJfc3JjX21haW4ubmFtZSwgYXZhdGFyX3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGF2YXRhciA9IChhdmF0YXJfc3JjX21haW4pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kcmF3ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWE0ODg1MjY0JlxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF9hNDg4NTI2NF9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJ0cmFuc2l0aW9uXCIsXG4gICAge1xuICAgICAgYXR0cnM6IHsgbmFtZTogXCJlbC1kcmF3ZXItZmFkZVwiIH0sXG4gICAgICBvbjogeyBcImFmdGVyLWVudGVyXCI6IF92bS5hZnRlckVudGVyLCBcImFmdGVyLWxlYXZlXCI6IF92bS5hZnRlckxlYXZlIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7XG4gICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgdmFsdWU6IF92bS52aXNpYmxlLFxuICAgICAgICAgICAgICBleHByZXNzaW9uOiBcInZpc2libGVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtZHJhd2VyX193cmFwcGVyXCIsXG4gICAgICAgICAgYXR0cnM6IHsgdGFiaW5kZXg6IFwiLTFcIiB9XG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWRyYXdlcl9fY29udGFpbmVyXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiBfdm0udmlzaWJsZSAmJiBcImVsLWRyYXdlcl9fb3BlblwiLFxuICAgICAgICAgICAgICBhdHRyczogeyByb2xlOiBcImRvY3VtZW50XCIsIHRhYmluZGV4OiBcIi0xXCIgfSxcbiAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICBpZiAoJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uaGFuZGxlV3JhcHBlckNsaWNrKCRldmVudClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmVmOiBcImRyYXdlclwiLFxuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtZHJhd2VyXCIsXG4gICAgICAgICAgICAgICAgICBjbGFzczogW192bS5kaXJlY3Rpb24sIF92bS5jdXN0b21DbGFzc10sXG4gICAgICAgICAgICAgICAgICBzdHlsZTogX3ZtLmlzSG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgICAgICA/IFwid2lkdGg6IFwiICsgX3ZtLmRyYXdlclNpemVcbiAgICAgICAgICAgICAgICAgICAgOiBcImhlaWdodDogXCIgKyBfdm0uZHJhd2VyU2l6ZSxcbiAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiYXJpYS1tb2RhbFwiOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogXCJlbC1kcmF3ZXJfX3RpdGxlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiOiBfdm0udGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IFwiZGlhbG9nXCIsXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4OiBcIi0xXCJcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF92bS53aXRoSGVhZGVyXG4gICAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImhlYWRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1kcmF3ZXJfX2hlYWRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyBpZDogXCJlbC1kcmF3ZXJfX3RpdGxlXCIgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl90KFwidGl0bGVcIiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGF0dHJzOiB7IHJvbGU6IFwiaGVhZGluZ1wiLCB0aXRsZTogX3ZtLnRpdGxlIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS50aXRsZSkpXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5zaG93Q2xvc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtZHJhd2VyX19jbG9zZS1idG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2xvc2UgXCIgKyAoX3ZtLnRpdGxlIHx8IFwiZHJhd2VyXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5jbG9zZURyYXdlciB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtZGlhbG9nX19jbG9zZSBlbC1pY29uIGVsLWljb24tY2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgIF92bS5yZW5kZXJlZFxuICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzZWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLWRyYXdlcl9fYm9keVwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKVxuICAgICAgICBdXG4gICAgICApXG4gICAgXVxuICApXG59XG52YXIgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkX2E0ODg1MjY0X3N0YXRpY1JlbmRlckZucyA9IFtdXG5tYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfYTQ4ODUyNjRfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kcmF3ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWE0ODg1MjY0JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9kcmF3ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkcmF3ZXJfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxEcmF3ZXInLFxuICBtaXhpbnM6IFtwb3B1cF9kZWZhdWx0LmEsIGVtaXR0ZXJfZGVmYXVsdC5hXSxcbiAgcHJvcHM6IHtcbiAgICBhcHBlbmRUb0JvZHk6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgYmVmb3JlQ2xvc2U6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uXG4gICAgfSxcbiAgICBjdXN0b21DbGFzczoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGNsb3NlT25QcmVzc0VzY2FwZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGRlc3Ryb3lPbkNsb3NlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIG1vZGFsOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgZGlyZWN0aW9uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAncnRsJyxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAgICAgICByZXR1cm4gWydsdHInLCAncnRsJywgJ3R0YicsICdidHQnXS5pbmRleE9mKHZhbCkgIT09IC0xO1xuICAgICAgfVxuICAgIH0sXG4gICAgbW9kYWxBcHBlbmRUb0JvZHk6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBzaG93Q2xvc2U6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBzaXplOiB7XG4gICAgICB0eXBlOiBbTnVtYmVyLCBTdHJpbmddLFxuICAgICAgZGVmYXVsdDogJzMwJSdcbiAgICB9LFxuICAgIHRpdGxlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgdmlzaWJsZToge1xuICAgICAgdHlwZTogQm9vbGVhblxuICAgIH0sXG4gICAgd3JhcHBlckNsb3NhYmxlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgd2l0aEhlYWRlcjoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNIb3Jpem9udGFsOiBmdW5jdGlvbiBpc0hvcml6b250YWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb24gPT09ICdydGwnIHx8IHRoaXMuZGlyZWN0aW9uID09PSAnbHRyJztcbiAgICB9LFxuICAgIGRyYXdlclNpemU6IGZ1bmN0aW9uIGRyYXdlclNpemUoKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRoaXMuc2l6ZSA9PT0gJ251bWJlcicgPyB0aGlzLnNpemUgKyAncHgnIDogdGhpcy5zaXplO1xuICAgIH1cbiAgfSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xvc2VkOiBmYWxzZSxcbiAgICAgIHByZXZBY3RpdmVFbGVtZW50OiBudWxsXG4gICAgfTtcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHZpc2libGU6IGZ1bmN0aW9uIHZpc2libGUodmFsKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuJGVtaXQoJ29wZW4nKTtcbiAgICAgICAgaWYgKHRoaXMuYXBwZW5kVG9Cb2R5KSB7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLiRlbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2QWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgdGhpcy4kZW1pdCgnY2xvc2UnKTtcbiAgICAgICAgICBpZiAodGhpcy5kZXN0cm95T25DbG9zZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKF90aGlzLnByZXZBY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICBfdGhpcy5wcmV2QWN0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgYWZ0ZXJFbnRlcjogZnVuY3Rpb24gYWZ0ZXJFbnRlcigpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ29wZW5lZCcpO1xuICAgIH0sXG4gICAgYWZ0ZXJMZWF2ZTogZnVuY3Rpb24gYWZ0ZXJMZWF2ZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2Nsb3NlZCcpO1xuICAgIH0sXG4gICAgaGlkZTogZnVuY3Rpb24gaGlkZShjYW5jZWwpIHtcbiAgICAgIGlmIChjYW5jZWwgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTp2aXNpYmxlJywgZmFsc2UpO1xuICAgICAgICB0aGlzLiRlbWl0KCdjbG9zZScpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95T25DbG9zZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMucmVuZGVyZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVXcmFwcGVyQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZVdyYXBwZXJDbGljaygpIHtcbiAgICAgIGlmICh0aGlzLndyYXBwZXJDbG9zYWJsZSkge1xuICAgICAgICB0aGlzLmNsb3NlRHJhd2VyKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBjbG9zZURyYXdlcjogZnVuY3Rpb24gY2xvc2VEcmF3ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuYmVmb3JlQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5iZWZvcmVDbG9zZSh0aGlzLmhpZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVDbG9zZTogZnVuY3Rpb24gaGFuZGxlQ2xvc2UoKSB7XG4gICAgICAvLyBUaGlzIG1ldGhvZCBoZXJlIHdpbGwgYmUgY2FsbGVkIGJ5IFBvcHVwTWFuZ2VyLCB3aGVuIHRoZSBgY2xvc2VPblByZXNzRXNjYXBlYCB3YXMgc2V0IHRvIHRydWVcbiAgICAgIC8vIHByZXNzaW5nIGBFU0NgIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCwgYW5kIGFsc28gY2xvc2UgdGhlIGRyYXdlci5cbiAgICAgIC8vIFRoaXMgbWV0aG9kIGFsc28gY2FsbHMgYGJlZm9yZUNsb3NlYCBpZiB0aGVyZSB3YXMgb25lLlxuICAgICAgdGhpcy5jbG9zZURyYXdlcigpO1xuICAgIH1cbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICBpZiAodGhpcy52aXNpYmxlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gdHJ1ZTtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgICAgaWYgKHRoaXMuYXBwZW5kVG9Cb2R5KSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy4kZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgLy8gaWYgYXBwZW5kVG9Cb2R5IGlzIHRydWUsIHJlbW92ZSBET00gbm9kZSBhZnRlciBkZXN0cm95XG4gICAgaWYgKHRoaXMuYXBwZW5kVG9Cb2R5ICYmIHRoaXMuJGVsICYmIHRoaXMuJGVsLnBhcmVudE5vZGUpIHtcbiAgICAgIHRoaXMuJGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWwpO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2RyYXdlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfZHJhd2VyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGRyYXdlcl9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kcmF3ZXIvc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgZHJhd2VyX3NyY19tYWluX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfZHJhd2VyX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfYTQ4ODUyNjRfcmVuZGVyLFxuICBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfYTQ4ODUyNjRfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBkcmF3ZXJfc3JjX21haW5fYXBpOyB9XG5kcmF3ZXJfc3JjX21haW5fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9kcmF3ZXIvc3JjL21haW4udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGRyYXdlcl9zcmNfbWFpbiA9IChkcmF3ZXJfc3JjX21haW5fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kcmF3ZXIvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZHJhd2VyX3NyY19tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoZHJhd2VyX3NyY19tYWluLm5hbWUsIGRyYXdlcl9zcmNfbWFpbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkcmF3ZXIgPSAoZHJhd2VyX3NyY19tYWluKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3RhdGlzdGljL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03NjMzOWFhNyZcbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNzYzMzlhYTdfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtc3RhdGlzdGljXCIgfSwgW1xuICAgIF92bS50aXRsZSB8fCBfdm0uJHNsb3RzLnRpdGxlXG4gICAgICA/IF9jKFxuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJoZWFkXCIgfSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBfdm0uX3QoXCJ0aXRsZVwiLCBbXG4gICAgICAgICAgICAgIF9jKFwic3BhblwiLCB7IHN0YXRpY0NsYXNzOiBcInRpdGxlXCIgfSwgW1xuICAgICAgICAgICAgICAgIF92bS5fdihcIlxcbiAgICAgICAgXCIgKyBfdm0uX3MoX3ZtLnRpdGxlKSArIFwiXFxuICAgICAgXCIpXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIF0sXG4gICAgICAgICAgMlxuICAgICAgICApXG4gICAgICA6IF92bS5fZSgpLFxuICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiY29uXCIgfSwgW1xuICAgICAgX3ZtLnByZWZpeCB8fCBfdm0uJHNsb3RzLnByZWZpeFxuICAgICAgICA/IF9jKFxuICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcInByZWZpeFwiIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF92bS5fdChcInByZWZpeFwiLCBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KFwiXFxuICAgICAgICBcIiArIF92bS5fcyhfdm0ucHJlZml4KSArIFwiXFxuICAgICAgXCIpXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgIF9jKFxuICAgICAgICBcInNwYW5cIixcbiAgICAgICAgeyBzdGF0aWNDbGFzczogXCJudW1iZXJcIiwgc3R5bGU6IF92bS52YWx1ZVN0eWxlIH0sXG4gICAgICAgIFtfdm0uX3QoXCJmb3JtYXR0ZXJcIiwgW192bS5fdihcIiBcIiArIF92bS5fcyhfdm0uZGlzcG9zZVZhbHVlKSldKV0sXG4gICAgICAgIDJcbiAgICAgICksXG4gICAgICBfdm0uc3VmZml4IHx8IF92bS4kc2xvdHMuc3VmZml4XG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwic3VmZml4XCIgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX3ZtLl90KFwic3VmZml4XCIsIFtcbiAgICAgICAgICAgICAgICBfdm0uX3YoXCJcXG4gICAgICAgIFwiICsgX3ZtLl9zKF92bS5zdWZmaXgpICsgXCJcXG4gICAgICBcIilcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpXG4gICAgXSlcbiAgXSlcbn1cbnZhciBtYWludnVlX3R5cGVfdGVtcGxhdGVfaWRfNzYzMzlhYTdfc3RhdGljUmVuZGVyRm5zID0gW11cbm1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF83NjMzOWFhN19yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3N0YXRpc3RpYy9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NzYzMzlhYTcmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9sb2Rhc2hcIlxudmFyIGxvZGFzaF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc3RhdGlzdGljL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzdGF0aXN0aWNfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxTdGF0aXN0aWMnLFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwb3NlVmFsdWU6ICcnLFxuICAgICAgdGltZVRhc2s6IG51bGwsXG4gICAgICBSRUZSRVNIX0lOVEVSVkFMOiAxMDAwIC8gMzBcbiAgICB9O1xuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgZGVjaW1hbFNlcGFyYXRvcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJy4nXG4gICAgfSxcbiAgICBncm91cFNlcGFyYXRvcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIHByZWNpc2lvbjoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH0sXG4gICAgdmFsdWU6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgcHJlZml4OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgc3VmZml4OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgdGl0bGU6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgdGltZUluZGljZXM6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgdmFsdWVTdHlsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZvcm1hdDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ0hIOm1tOnNzOlNTUydcbiAgICB9LFxuICAgIHJhdGU6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDEwMDBcbiAgICB9XG4gIH0sXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5icmFuY2goKTtcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHRoaXMuYnJhbmNoKCk7XG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgYnJhbmNoOiBmdW5jdGlvbiBicmFuY2goKSB7XG4gICAgICB2YXIgdGltZUluZGljZXMgPSB0aGlzLnRpbWVJbmRpY2VzLFxuICAgICAgICAgIGNvdW50RG93biA9IHRoaXMuY291bnREb3duLFxuICAgICAgICAgIGRpc3Bvc2UgPSB0aGlzLmRpc3Bvc2U7XG5cbiAgICAgIHRpbWVJbmRpY2VzID8gY291bnREb3duKCkgOiBkaXNwb3NlKCk7XG4gICAgfSxcbiAgICBtYWduaWZpY2F0aW9uOiBmdW5jdGlvbiBtYWduaWZpY2F0aW9uKG51bSkge1xuICAgICAgdmFyIG11bHJpcGxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxMDAwO1xuICAgICAgdmFyIGdyb3VwU2VwYXJhdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAnLCc7XG5cbiAgICAgIC8vIG1hZ25pZmljYXRpb24gZmFjdG9yXG4gICAgICB2YXIgbGV2ZWwgPSBTdHJpbmcobXVscmlwbGUpLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgcmVnID0gbmV3IFJlZ0V4cCgnXFxcXGR7MSwnICsgbGV2ZWwgKyAnfSg/PShcXFxcZHsnICsgbGV2ZWwgKyAnfSkrJCknLCAnZycpO1xuICAgICAgdmFyIHJlc3VsdCA9IFN0cmluZyhudW0pLnJlcGxhY2UocmVnLCAnJCYsJykuc3BsaXQoJywnKS5qb2luKGdyb3VwU2VwYXJhdG9yKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICBkaXNwb3NlOiBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSxcbiAgICAgICAgICBwcmVjaXNpb24gPSB0aGlzLnByZWNpc2lvbixcbiAgICAgICAgICBncm91cFNlcGFyYXRvciA9IHRoaXMuZ3JvdXBTZXBhcmF0b3IsXG4gICAgICAgICAgcmF0ZSA9IHRoaXMucmF0ZTtcblxuICAgICAgaWYgKCFPYmplY3QobG9kYXNoX1tcImlzTnVtYmVyXCJdKSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgdmFyIF9TdHJpbmckc3BsaXQgPSBTdHJpbmcodmFsdWUpLnNwbGl0KCcuJyksXG4gICAgICAgICAgaW50ZWdlciA9IF9TdHJpbmckc3BsaXRbMF0sXG4gICAgICAgICAgZGVjaW1hbCA9IF9TdHJpbmckc3BsaXRbMV07XG5cbiAgICAgIGlmIChwcmVjaXNpb24pIHtcbiAgICAgICAgZGVjaW1hbCA9ICcnICsgKGRlY2ltYWwgfHwgJycpICsgMSAudG9GaXhlZChwcmVjaXNpb24pLnJlcGxhY2UoJy4nLCAnJykuc2xpY2UoMSk7XG4gICAgICAgIGRlY2ltYWwgPSBkZWNpbWFsLnNsaWNlKDAsIHByZWNpc2lvbik7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgIC8vIDEwMDAgbXVsdGlwbHlpbmcgcG93ZXJcbiAgICAgIGlmIChncm91cFNlcGFyYXRvcikge1xuICAgICAgICBpbnRlZ2VyID0gdGhpcy5tYWduaWZpY2F0aW9uKGludGVnZXIsIHJhdGUsIGdyb3VwU2VwYXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0ID0gW2ludGVnZXIsIGRlY2ltYWxdLmpvaW4oZGVjaW1hbCA/IHRoaXMuZGVjaW1hbFNlcGFyYXRvciA6ICcnKTtcbiAgICAgIHRoaXMuZGlzcG9zZVZhbHVlID0gcmVzdWx0O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIGRpZmZEYXRlOiBmdW5jdGlvbiBkaWZmRGF0ZShtaW51ZW5kLCBzdWJ0cmFoZW5kKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgobWludWVuZCAtIHN1YnRyYWhlbmQsIDApO1xuICAgIH0sXG4gICAgc3VzcGVuZDogZnVuY3Rpb24gc3VzcGVuZChpc1N0b3ApIHtcbiAgICAgIGlmIChpc1N0b3ApIHtcbiAgICAgICAgaWYgKHRoaXMudGltZVRhc2spIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZVRhc2spO1xuICAgICAgICAgIHRoaXMudGltZVRhc2sgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJyYW5jaCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZGlzcG9zZVZhbHVlO1xuICAgIH0sXG5cbiAgICBmb3JtYXRUaW1lU3RyOiBmdW5jdGlvbiBmb3JtYXRUaW1lU3RyKHRpbWUpIHtcbiAgICAgIHZhciBmb3JtYXQgPSB0aGlzLmZvcm1hdDtcblxuICAgICAgdmFyIGVzY2FwZVJlZ2V4ID0gL1xcW1teXFxdXSpdL2c7XG4gICAgICB2YXIga2VlcExpc3QgPSAoZm9ybWF0Lm1hdGNoKGVzY2FwZVJlZ2V4KSB8fCBbXSkubWFwKGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgcmV0dXJuIHN0ci5zbGljZSgxLCAtMSk7XG4gICAgICB9KTtcbiAgICAgIHZhciB0aW1lVW5pdHMgPSBbWydZJywgMTAwMCAqIDYwICogNjAgKiAyNCAqIDM2NV0sIC8vIHllYXJzXG4gICAgICBbJ00nLCAxMDAwICogNjAgKiA2MCAqIDI0ICogMzBdLCAvLyBtb250aHNcbiAgICAgIFsnRCcsIDEwMDAgKiA2MCAqIDYwICogMjRdLCAvLyBkYXlzXG4gICAgICBbJ0gnLCAxMDAwICogNjAgKiA2MF0sIC8vIGhvdXJzXG4gICAgICBbJ20nLCAxMDAwICogNjBdLCAvLyBtaW51dGVzXG4gICAgICBbJ3MnLCAxMDAwXSwgLy8gc2Vjb25kc1xuICAgICAgWydTJywgMV0gLy8gbWlsbGlvbiBzZWNvbmRzXG4gICAgICBdO1xuICAgICAgdmFyIGZvcm1hdFRleHQgPSBPYmplY3QobG9kYXNoX1tcInJlZHVjZVwiXSkodGltZVVuaXRzLCBmdW5jdGlvbiAoY29uLCBpdGVtKSB7XG4gICAgICAgIHZhciBuYW1lID0gaXRlbVswXTtcbiAgICAgICAgcmV0dXJuIGNvbi5yZXBsYWNlKG5ldyBSZWdFeHAobmFtZSArICcrJywgJ2cnKSwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgdmFyIHN1bSA9IE9iamVjdChsb2Rhc2hfW1wiY2hhaW5cIl0pKHRpbWUpLmRpdmlkZShpdGVtWzFdKS5mbG9vcigwKS52YWx1ZSgpO1xuICAgICAgICAgIHRpbWUgLT0gT2JqZWN0KGxvZGFzaF9bXCJtdWx0aXBseVwiXSkoc3VtLCBpdGVtWzFdKTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0KGxvZGFzaF9bXCJwYWRTdGFydFwiXSkoU3RyaW5nKHN1bSksIFN0cmluZyhtYXRjaCkubGVuZ3RoLCAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBmb3JtYXQpO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHJldHVybiBmb3JtYXRUZXh0LnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0ga2VlcExpc3RbaW5kZXhdO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHN0b3BUaW1lOiBmdW5jdGlvbiBzdG9wVGltZSh0aW1lKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsgLy8gc3RvcFxuICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdGltZSk7XG4gICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdXNwZW5kKHRydWUpO1xuICAgICAgICB0aGlzLiRlbWl0KCdmaW5pc2gnLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICBjb3VudERvd246IGZ1bmN0aW9uIGNvdW50RG93bigpIHtcbiAgICAgIHZhciBSRUZSRVNIX0lOVEVSVkFMID0gdGhpcy5SRUZSRVNIX0lOVEVSVkFMLFxuICAgICAgICAgIHRpbWVUYXNrID0gdGhpcy50aW1lVGFzayxcbiAgICAgICAgICBkaWZmRGF0ZSA9IHRoaXMuZGlmZkRhdGUsXG4gICAgICAgICAgZm9ybWF0VGltZVN0ciA9IHRoaXMuZm9ybWF0VGltZVN0cixcbiAgICAgICAgICBzdG9wVGltZSA9IHRoaXMuc3RvcFRpbWUsXG4gICAgICAgICAgc3VzcGVuZCA9IHRoaXMuc3VzcGVuZDtcblxuICAgICAgaWYgKHRpbWVUYXNrKSByZXR1cm47XG4gICAgICB2YXIgdGhhbiA9IHRoaXM7XG4gICAgICB0aGlzLnRpbWVUYXNrID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlmZlRpZW0gPSBkaWZmRGF0ZSh0aGFuLnZhbHVlLCBEYXRlLm5vdygpKTtcbiAgICAgICAgdGhhbi5kaXNwb3NlVmFsdWUgPSBmb3JtYXRUaW1lU3RyKGRpZmZUaWVtKTtcbiAgICAgICAgc3RvcFRpbWUoZGlmZlRpZW0pO1xuICAgICAgfSwgUkVGUkVTSF9JTlRFUlZBTCk7XG4gICAgICB0aGlzLiRvbmNlKCdob29rOmJlZm9yZURlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN1c3BlbmQodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zdGF0aXN0aWMvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3N0YXRpc3RpY19zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChzdGF0aXN0aWNfc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3RhdGlzdGljL3NyYy9tYWluLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHN0YXRpc3RpY19zcmNfbWFpbl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhY2thZ2VzX3N0YXRpc3RpY19zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzc2MzM5YWE3X3JlbmRlcixcbiAgbWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzc2MzM5YWE3X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgc3RhdGlzdGljX3NyY19tYWluX2FwaTsgfVxuc3RhdGlzdGljX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvc3RhdGlzdGljL3NyYy9tYWluLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzdGF0aXN0aWNfc3JjX21haW4gPSAoc3RhdGlzdGljX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc3RhdGlzdGljL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnN0YXRpc3RpY19zcmNfbWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHN0YXRpc3RpY19zcmNfbWFpbi5uYW1lLCBzdGF0aXN0aWNfc3JjX21haW4pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3RhdGlzdGljID0gKHN0YXRpc3RpY19zcmNfbWFpbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3BvcGNvbmZpcm0vc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTA0OGRlNzMwJlxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNDhkZTczMF9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJlbC1wb3BvdmVyXCIsXG4gICAgX3ZtLl9iKFxuICAgICAge1xuICAgICAgICBhdHRyczogeyB0cmlnZ2VyOiBcImNsaWNrXCIgfSxcbiAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICB2YWx1ZTogX3ZtLnZpc2libGUsXG4gICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCQkdikge1xuICAgICAgICAgICAgX3ZtLnZpc2libGUgPSAkJHZcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4cHJlc3Npb246IFwidmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImVsLXBvcG92ZXJcIixcbiAgICAgIF92bS4kYXR0cnMsXG4gICAgICBmYWxzZVxuICAgICksXG4gICAgW1xuICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1wb3Bjb25maXJtXCIgfSwgW1xuICAgICAgICBfYyhcInBcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1wb3Bjb25maXJtX19tYWluXCIgfSwgW1xuICAgICAgICAgICFfdm0uaGlkZUljb25cbiAgICAgICAgICAgID8gX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1wb3Bjb25maXJtX19pY29uXCIsXG4gICAgICAgICAgICAgICAgY2xhc3M6IF92bS5pY29uLFxuICAgICAgICAgICAgICAgIHN0eWxlOiB7IGNvbG9yOiBfdm0uaWNvbkNvbG9yIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgX3ZtLl92KFwiXFxuICAgICAgXCIgKyBfdm0uX3MoX3ZtLnRpdGxlKSArIFwiXFxuICAgIFwiKVxuICAgICAgICBdKSxcbiAgICAgICAgX2MoXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLXBvcGNvbmZpcm1fX2FjdGlvblwiIH0sXG4gICAgICAgICAgW1xuICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgIFwiZWwtYnV0dG9uXCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhdHRyczogeyBzaXplOiBcIm1pbmlcIiwgdHlwZTogX3ZtLmNhbmNlbEJ1dHRvblR5cGUgfSxcbiAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLmNhbmNlbCB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICBcIlxcbiAgICAgICAgXCIgK1xuICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLmRpc3BsYXlDYW5jZWxCdXR0b25UZXh0KSArXG4gICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgXCJlbC1idXR0b25cIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF0dHJzOiB7IHNpemU6IFwibWluaVwiLCB0eXBlOiBfdm0uY29uZmlybUJ1dHRvblR5cGUgfSxcbiAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLmNvbmZpcm0gfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKF92bS5kaXNwbGF5Q29uZmlybUJ1dHRvblRleHQpICtcbiAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICBcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKVxuICAgICAgICAgIF0sXG4gICAgICAgICAgMVxuICAgICAgICApXG4gICAgICBdKSxcbiAgICAgIF92bS5fdChcInJlZmVyZW5jZVwiLCBudWxsLCB7IHNsb3Q6IFwicmVmZXJlbmNlXCIgfSlcbiAgICBdLFxuICAgIDJcbiAgKVxufVxudmFyIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNDhkZTczMF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxubWFpbnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA0OGRlNzMwX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wY29uZmlybS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDQ4ZGU3MzAmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9wb3BvdmVyXCJcbnZhciBwb3BvdmVyXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpO1xudmFyIHBvcG92ZXJfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4ocG9wb3Zlcl8pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9wb3Bjb25maXJtL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcG9wY29uZmlybV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFBvcGNvbmZpcm0nLFxuICBwcm9wczoge1xuICAgIHRpdGxlOiB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9LFxuICAgIGNvbmZpcm1CdXR0b25UZXh0OiB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9LFxuICAgIGNhbmNlbEJ1dHRvblRleHQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0sXG4gICAgY29uZmlybUJ1dHRvblR5cGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdwcmltYXJ5J1xuICAgIH0sXG4gICAgY2FuY2VsQnV0dG9uVHlwZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ3RleHQnXG4gICAgfSxcbiAgICBpY29uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnZWwtaWNvbi1xdWVzdGlvbidcbiAgICB9LFxuICAgIGljb25Db2xvcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJyNmOTAnXG4gICAgfSxcbiAgICBoaWRlSWNvbjoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBjb21wb25lbnRzOiB7XG4gICAgRWxQb3BvdmVyOiBwb3BvdmVyX2RlZmF1bHQuYSxcbiAgICBFbEJ1dHRvbjogYnV0dG9uX2RlZmF1bHQuYVxuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB2aXNpYmxlOiBmYWxzZVxuICAgIH07XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBkaXNwbGF5Q29uZmlybUJ1dHRvblRleHQ6IGZ1bmN0aW9uIGRpc3BsYXlDb25maXJtQnV0dG9uVGV4dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpcm1CdXR0b25UZXh0IHx8IE9iamVjdChsaWJfbG9jYWxlX1tcInRcIl0pKCdlbC5wb3Bjb25maXJtLmNvbmZpcm1CdXR0b25UZXh0Jyk7XG4gICAgfSxcbiAgICBkaXNwbGF5Q2FuY2VsQnV0dG9uVGV4dDogZnVuY3Rpb24gZGlzcGxheUNhbmNlbEJ1dHRvblRleHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYW5jZWxCdXR0b25UZXh0IHx8IE9iamVjdChsaWJfbG9jYWxlX1tcInRcIl0pKCdlbC5wb3Bjb25maXJtLmNhbmNlbEJ1dHRvblRleHQnKTtcbiAgICB9XG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICBjb25maXJtOiBmdW5jdGlvbiBjb25maXJtKCkge1xuICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLiRlbWl0KCdjb25maXJtJyk7XG4gICAgfSxcbiAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy4kZW1pdCgnY2FuY2VsJyk7XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wY29uZmlybS9zcmMvbWFpbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfcG9wY29uZmlybV9zcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChwb3Bjb25maXJtX3NyY19tYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3BvcGNvbmZpcm0vc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgcG9wY29uZmlybV9zcmNfbWFpbl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHBhY2thZ2VzX3BvcGNvbmZpcm1fc3JjX21haW52dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNDhkZTczMF9yZW5kZXIsXG4gIG1haW52dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNDhkZTczMF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHBvcGNvbmZpcm1fc3JjX21haW5fYXBpOyB9XG5wb3Bjb25maXJtX3NyY19tYWluX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvcG9wY29uZmlybS9zcmMvbWFpbi52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcG9wY29uZmlybV9zcmNfbWFpbiA9IChwb3Bjb25maXJtX3NyY19tYWluX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wY29uZmlybS9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5wb3Bjb25maXJtX3NyY19tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQocG9wY29uZmlybV9zcmNfbWFpbi5uYW1lLCBwb3Bjb25maXJtX3NyY19tYWluKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBvcGNvbmZpcm0gPSAocG9wY29uZmlybV9zcmNfbWFpbik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NrZWxldG9uL3NyYy9pbmRleC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9N2Y2NTkyNjkmXG52YXIgc3JjdnVlX3R5cGVfdGVtcGxhdGVfaWRfN2Y2NTkyNjlfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAgW1xuICAgICAgX3ZtLnVpTG9hZGluZ1xuICAgICAgICA/IFtcbiAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICBfdm0uX2IoXG4gICAgICAgICAgICAgICAgeyBjbGFzczogW1wiZWwtc2tlbGV0b25cIiwgX3ZtLmFuaW1hdGVkID8gXCJpcy1hbmltYXRlZFwiIDogXCJcIl0gfSxcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIF92bS4kYXR0cnMsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIF92bS5fbChfdm0uY291bnQsIGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5sb2FkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgPyBfdm0uX3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwidGVtcGxhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9sKF92bS5yb3dzLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jKFwiZWwtc2tlbGV0b24taXRlbVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGkgKyBcIi1cIiArIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVsLXNrZWxldG9uX19wYXJhZ3JhcGhcIjogaXRlbSAhPT0gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpcy1maXJzdFwiOiBpdGVtID09PSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlzLWxhc3RcIjogaXRlbSA9PT0gX3ZtLnJvd3MgJiYgX3ZtLnJvd3MgPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgdmFyaWFudDogXCJwXCIgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIDJcbiAgICAgICAgICAgIClcbiAgICAgICAgICBdXG4gICAgICAgIDogW192bS5fdChcImRlZmF1bHRcIiwgbnVsbCwgbnVsbCwgX3ZtLiRhdHRycyldXG4gICAgXSxcbiAgICAyXG4gIClcbn1cbnZhciBzcmN2dWVfdHlwZV90ZW1wbGF0ZV9pZF83ZjY1OTI2OV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuc3JjdnVlX3R5cGVfdGVtcGxhdGVfaWRfN2Y2NTkyNjlfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9za2VsZXRvbi9zcmMvaW5kZXgudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdmNjU5MjY5JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9za2VsZXRvbi9zcmMvaW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2tlbGV0b25fc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsU2tlbGV0b24nLFxuICBwcm9wczoge1xuICAgIGFuaW1hdGVkOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIGNvdW50OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAxXG4gICAgfSxcbiAgICByb3dzOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiA0XG4gICAgfSxcbiAgICBsb2FkaW5nOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgdGhyb3R0bGU6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9XG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgbG9hZGluZzoge1xuICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihsb2FkaW5nKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMudGhyb3R0bGUgPD0gMCkge1xuICAgICAgICAgIHRoaXMudWlMb2FkaW5nID0gbG9hZGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvYWRpbmcpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SGFuZGxlKTtcbiAgICAgICAgICB0aGlzLnRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnVpTG9hZGluZyA9IF90aGlzLmxvYWRpbmc7XG4gICAgICAgICAgfSwgdGhpcy50aHJvdHRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51aUxvYWRpbmcgPSBsb2FkaW5nO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBpbW1lZGlhdGU6IHRydWVcbiAgICB9XG4gIH0sXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpTG9hZGluZzogdGhpcy50aHJvdHRsZSA8PSAwID8gdGhpcy5sb2FkaW5nIDogZmFsc2VcbiAgICB9O1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2tlbGV0b24vc3JjL2luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19za2VsZXRvbl9zcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoc2tlbGV0b25fc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NrZWxldG9uL3NyYy9pbmRleC52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBza2VsZXRvbl9zcmNfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBwYWNrYWdlc19za2VsZXRvbl9zcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHNyY3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzdmNjU5MjY5X3JlbmRlcixcbiAgc3JjdnVlX3R5cGVfdGVtcGxhdGVfaWRfN2Y2NTkyNjlfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBza2VsZXRvbl9zcmNfYXBpOyB9XG5za2VsZXRvbl9zcmNfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9za2VsZXRvbi9zcmMvaW5kZXgudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNrZWxldG9uX3NyYyA9IChza2VsZXRvbl9zcmNfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9za2VsZXRvbi9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5za2VsZXRvbl9zcmMuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChza2VsZXRvbl9zcmMubmFtZSwgc2tlbGV0b25fc3JjKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNrZWxldG9uID0gKHNrZWxldG9uX3NyYyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NrZWxldG9uL3NyYy9pdGVtLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00YmM4ODA0YyZcbnZhciBpdGVtdnVlX3R5cGVfdGVtcGxhdGVfaWRfNGJjODgwNGNfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAgeyBjbGFzczogW1wiZWwtc2tlbGV0b25fX2l0ZW1cIiwgXCJlbC1za2VsZXRvbl9fXCIgKyBfdm0udmFyaWFudF0gfSxcbiAgICBbX3ZtLnZhcmlhbnQgPT09IFwiaW1hZ2VcIiA/IF9jKFwiaW1nLXBsYWNlaG9sZGVyXCIpIDogX3ZtLl9lKCldLFxuICAgIDFcbiAgKVxufVxudmFyIGl0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF80YmM4ODA0Y19zdGF0aWNSZW5kZXJGbnMgPSBbXVxuaXRlbXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzRiYzg4MDRjX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2tlbGV0b24vc3JjL2l0ZW0udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTRiYzg4MDRjJlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NrZWxldG9uL3NyYy9pbWctcGxhY2Vob2xkZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTFiMmNiNWMwJlxudmFyIGltZ19wbGFjZWhvbGRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzFiMmNiNWMwX3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcInN2Z1wiLFxuICAgIHtcbiAgICAgIGF0dHJzOiB7IHZpZXdCb3g6IFwiMCAwIDEwMjQgMTAyNFwiLCB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF9jKFwicGF0aFwiLCB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgZDpcbiAgICAgICAgICAgIFwiTTY0IDg5NlYxMjhoODk2djc2OEg2NHogbTY0LTEyOGwxOTItMTkyIDExNi4zNTIgMTE2LjM1Mkw2NDAgNDQ4bDI1NiAzMDcuMlYxOTJIMTI4djU3NnogbTIyNC00ODBhOTYgOTYgMCAxIDEtMC4wNjQgMTkyLjA2NEE5NiA5NiAwIDAgMSAzNTIgMjg4elwiXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgXVxuICApXG59XG52YXIgaW1nX3BsYWNlaG9sZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMWIyY2I1YzBfc3RhdGljUmVuZGVyRm5zID0gW11cbmltZ19wbGFjZWhvbGRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzFiMmNiNWMwX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2tlbGV0b24vc3JjL2ltZy1wbGFjZWhvbGRlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MWIyY2I1YzAmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NrZWxldG9uL3NyYy9pbWctcGxhY2Vob2xkZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGltZ19wbGFjZWhvbGRlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdJbWdQbGFjZWhvbGRlcidcbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9za2VsZXRvbi9zcmMvaW1nLXBsYWNlaG9sZGVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfaW1nX3BsYWNlaG9sZGVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGltZ19wbGFjZWhvbGRlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9za2VsZXRvbi9zcmMvaW1nLXBsYWNlaG9sZGVyLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGltZ19wbGFjZWhvbGRlcl9jb21wb25lbnQgPSBub3JtYWxpemVDb21wb25lbnQoXG4gIHNyY19pbWdfcGxhY2Vob2xkZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGltZ19wbGFjZWhvbGRlcnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzFiMmNiNWMwX3JlbmRlcixcbiAgaW1nX3BsYWNlaG9sZGVydnVlX3R5cGVfdGVtcGxhdGVfaWRfMWIyY2I1YzBfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBpbWdfcGxhY2Vob2xkZXJfYXBpOyB9XG5pbWdfcGxhY2Vob2xkZXJfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9za2VsZXRvbi9zcmMvaW1nLXBsYWNlaG9sZGVyLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpbWdfcGxhY2Vob2xkZXIgPSAoaW1nX3BsYWNlaG9sZGVyX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NrZWxldG9uL3NyYy9pdGVtLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbnZhciBfY29tcG9uZW50cztcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2tlbGV0b25fc3JjX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxTa2VsZXRvbkl0ZW0nLFxuICBwcm9wczoge1xuICAgIHZhcmlhbnQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICd0ZXh0J1xuICAgIH1cbiAgfSxcbiAgY29tcG9uZW50czogKF9jb21wb25lbnRzID0ge30sIF9jb21wb25lbnRzW2ltZ19wbGFjZWhvbGRlci5uYW1lXSA9IGltZ19wbGFjZWhvbGRlciwgX2NvbXBvbmVudHMpXG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2tlbGV0b24vc3JjL2l0ZW0udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3NrZWxldG9uX3NyY19pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHNrZWxldG9uX3NyY19pdGVtdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NrZWxldG9uL3NyYy9pdGVtLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHNrZWxldG9uX3NyY19pdGVtX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfc2tlbGV0b25fc3JjX2l0ZW12dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGl0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF80YmM4ODA0Y19yZW5kZXIsXG4gIGl0ZW12dWVfdHlwZV90ZW1wbGF0ZV9pZF80YmM4ODA0Y19zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHNrZWxldG9uX3NyY19pdGVtX2FwaTsgfVxuc2tlbGV0b25fc3JjX2l0ZW1fY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9za2VsZXRvbi9zcmMvaXRlbS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2tlbGV0b25fc3JjX2l0ZW0gPSAoc2tlbGV0b25fc3JjX2l0ZW1fY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9za2VsZXRvbi1pdGVtL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnNrZWxldG9uX3NyY19pdGVtLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoc2tlbGV0b25fc3JjX2l0ZW0ubmFtZSwgc2tlbGV0b25fc3JjX2l0ZW0pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2tlbGV0b25faXRlbSA9IChza2VsZXRvbl9zcmNfaXRlbSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2VtcHR5L3NyYy9pbmRleC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MzQ3Y2VkOTEmXG52YXIgc3JjdnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQ3Y2VkOTFfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtZW1wdHlcIiB9LCBbXG4gICAgX2MoXG4gICAgICBcImRpdlwiLFxuICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1lbXB0eV9faW1hZ2VcIiwgc3R5bGU6IF92bS5pbWFnZVN0eWxlIH0sXG4gICAgICBbXG4gICAgICAgIF92bS5pbWFnZVxuICAgICAgICAgID8gX2MoXCJpbWdcIiwge1xuICAgICAgICAgICAgICBhdHRyczogeyBzcmM6IF92bS5pbWFnZSwgb25kcmFnc3RhcnQ6IFwicmV0dXJuIGZhbHNlXCIgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IF92bS5fdChcImltYWdlXCIsIFtfYyhcImltZy1lbXB0eVwiKV0pXG4gICAgICBdLFxuICAgICAgMlxuICAgICksXG4gICAgX2MoXG4gICAgICBcImRpdlwiLFxuICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1lbXB0eV9fZGVzY3JpcHRpb25cIiB9LFxuICAgICAgW1xuICAgICAgICBfdm0uJHNsb3RzLmRlc2NyaXB0aW9uXG4gICAgICAgICAgPyBfdm0uX3QoXCJkZXNjcmlwdGlvblwiKVxuICAgICAgICAgIDogX2MoXCJwXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS5lbXB0eURlc2NyaXB0aW9uKSldKVxuICAgICAgXSxcbiAgICAgIDJcbiAgICApLFxuICAgIF92bS4kc2xvdHMuZGVmYXVsdFxuICAgICAgPyBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWVtcHR5X19ib3R0b21cIiB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG4gICAgICA6IF92bS5fZSgpXG4gIF0pXG59XG52YXIgc3JjdnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQ3Y2VkOTFfc3RhdGljUmVuZGVyRm5zID0gW11cbnNyY3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzM0N2NlZDkxX3JlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZW1wdHkvc3JjL2luZGV4LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zNDdjZWQ5MSZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9lbXB0eS9zcmMvaW1nLWVtcHR5LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00MjkxOGI4MiZcbnZhciBpbWdfZW1wdHl2dWVfdHlwZV90ZW1wbGF0ZV9pZF80MjkxOGI4Ml9yZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJzdmdcIixcbiAgICB7XG4gICAgICBhdHRyczoge1xuICAgICAgICB2aWV3Qm94OiBcIjAgMCA3OSA4NlwiLFxuICAgICAgICB2ZXJzaW9uOiBcIjEuMVwiLFxuICAgICAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgICAgICBcInhtbG5zOnhsaW5rXCI6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkZWZzXCIsXG4gICAgICAgIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwibGluZWFyR3JhZGllbnRcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICBpZDogXCJsaW5lYXJHcmFkaWVudC0xLVwiICsgX3ZtLmlkLFxuICAgICAgICAgICAgICAgIHgxOiBcIjM4Ljg1MDMwODYlXCIsXG4gICAgICAgICAgICAgICAgeTE6IFwiMCVcIixcbiAgICAgICAgICAgICAgICB4MjogXCI2MS4xNDk2OTE0JVwiLFxuICAgICAgICAgICAgICAgIHkyOiBcIjEwMCVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcInN0b3BcIiwgeyBhdHRyczogeyBcInN0b3AtY29sb3JcIjogXCIjRkNGQ0ZEXCIsIG9mZnNldDogXCIwJVwiIH0gfSksXG4gICAgICAgICAgICAgIF9jKFwic3RvcFwiLCB7IGF0dHJzOiB7IFwic3RvcC1jb2xvclwiOiBcIiNFRUVGRjNcIiwgb2Zmc2V0OiBcIjEwMCVcIiB9IH0pXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICksXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImxpbmVhckdyYWRpZW50XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgaWQ6IFwibGluZWFyR3JhZGllbnQtMi1cIiArIF92bS5pZCxcbiAgICAgICAgICAgICAgICB4MTogXCIwJVwiLFxuICAgICAgICAgICAgICAgIHkxOiBcIjkuNSVcIixcbiAgICAgICAgICAgICAgICB4MjogXCIxMDAlXCIsXG4gICAgICAgICAgICAgICAgeTI6IFwiOTAuNSVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcInN0b3BcIiwgeyBhdHRyczogeyBcInN0b3AtY29sb3JcIjogXCIjRkNGQ0ZEXCIsIG9mZnNldDogXCIwJVwiIH0gfSksXG4gICAgICAgICAgICAgIF9jKFwic3RvcFwiLCB7IGF0dHJzOiB7IFwic3RvcC1jb2xvclwiOiBcIiNFOUVCRUZcIiwgb2Zmc2V0OiBcIjEwMCVcIiB9IH0pXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICksXG4gICAgICAgICAgX2MoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgIGlkOiBcInBhdGgtMy1cIiArIF92bS5pZCxcbiAgICAgICAgICAgICAgeDogXCIwXCIsXG4gICAgICAgICAgICAgIHk6IFwiMFwiLFxuICAgICAgICAgICAgICB3aWR0aDogXCIxN1wiLFxuICAgICAgICAgICAgICBoZWlnaHQ6IFwiMzZcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIF0sXG4gICAgICAgIDFcbiAgICAgICksXG4gICAgICBfYyhcbiAgICAgICAgXCJnXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgaWQ6IFwiSWxsdXN0cmF0aW9uc1wiLFxuICAgICAgICAgICAgc3Ryb2tlOiBcIm5vbmVcIixcbiAgICAgICAgICAgIFwic3Ryb2tlLXdpZHRoXCI6IFwiMVwiLFxuICAgICAgICAgICAgZmlsbDogXCJub25lXCIsXG4gICAgICAgICAgICBcImZpbGwtcnVsZVwiOiBcImV2ZW5vZGRcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJnXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgaWQ6IFwiQi10eXBlXCIsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZSgtMTI2OC4wMDAwMDAsIC01MzUuMDAwMDAwKVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZ1wiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIkdyb3VwLTJcIixcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZSgxMjY4LjAwMDAwMCwgNTM1LjAwMDAwMClcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgX2MoXCJwYXRoXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZDogXCJPdmFsLUNvcHktMlwiLFxuICAgICAgICAgICAgICAgICAgICAgIGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBcIk0zOS41LDg2IEM2MS4zMTUyNDc2LDg2IDc5LDgzLjkxMDY2MjIgNzksODEuMzMzMzMzMyBDNzksNzguNzU2MDA0NSA1Ny4zMTUyNDc2LDc4IDM1LjUsNzggQzEzLjY4NDc1MjQsNzggMCw3OC43NTYwMDQ1IDAsODEuMzMzMzMzMyBDMCw4My45MTA2NjIyIDE3LjY4NDc1MjQsODYgMzkuNSw4NiBaXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbDogXCIjRjdGOEZDXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBfYyhcInBvbHlnb25cIiwge1xuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIlJlY3RhbmdsZS1Db3B5LTE0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbDogXCIjRTVFN0U5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOlxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cmFuc2xhdGUoMjcuNTAwMDAwLCA1MS41MDAwMDApIHNjYWxlKDEsIC0xKSB0cmFuc2xhdGUoLTI3LjUwMDAwMCwgLTUxLjUwMDAwMCkgXCIsXG4gICAgICAgICAgICAgICAgICAgICAgcG9pbnRzOiBcIjEzIDU4IDUzIDU4IDQyIDQ1IDIgNDVcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICBcImdcIixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogXCJHcm91cC1Db3B5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwidHJhbnNsYXRlKDM0LjUwMDAwMCwgMzEuNTAwMDAwKSBzY2FsZSgtMSwgMSkgcm90YXRlKC0yNS4wMDAwMDApIHRyYW5zbGF0ZSgtMzQuNTAwMDAwLCAtMzEuNTAwMDAwKSB0cmFuc2xhdGUoNy4wMDAwMDAsIDEwLjAwMDAwMClcIlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIF9jKFwicG9seWdvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXCJSZWN0YW5nbGUtQ29weS0xMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiBcIiNFNUU3RTlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHJhbnNsYXRlKDExLjUwMDAwMCwgNS4wMDAwMDApIHNjYWxlKDEsIC0xKSB0cmFuc2xhdGUoLTExLjUwMDAwMCwgLTUuMDAwMDAwKSBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzOiBcIjIuODQwNzgzMTZlLTE0IDMgMTggMyAyMyA3IDUgN1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXCJwb2x5Z29uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIlJlY3RhbmdsZS1Db3B5LTExXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IFwiI0VERUVGMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCItMy42OTE0OTE1NmUtMTUgNyAzOCA3IDM4IDQzIC0zLjY5MTQ5MTU2ZS0xNSA0M1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIlJlY3RhbmdsZS1Db3B5LTEyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IFwidXJsKCNsaW5lYXJHcmFkaWVudC0xLVwiICsgX3ZtLmlkICsgXCIpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRyYW5zbGF0ZSg0Ni41MDAwMDAsIDI1LjAwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtNDYuNTAwMDAwLCAtMjUuMDAwMDAwKSBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeDogXCIzOFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBcIjdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IFwiMTdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBcIjM2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcInBvbHlnb25cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFwiUmVjdGFuZ2xlLUNvcHktMTNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogXCIjRjhGOUZCXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRyYW5zbGF0ZSgzOS41MDAwMDAsIDMuNTAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0zOS41MDAwMDAsIC0zLjUwMDAwMCkgXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjI0IDcgNDEgNyA1NSAtMy42MzgwNjIwN2UtMTIgMzggLTMuNjM4MDYyMDdlLTEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgX2MoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZDogXCJSZWN0YW5nbGUtQ29weS0xNVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IFwidXJsKCNsaW5lYXJHcmFkaWVudC0yLVwiICsgX3ZtLmlkICsgXCIpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgeDogXCIxM1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHk6IFwiNDVcIixcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogXCI0MFwiLFxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogXCIzNlwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgIFwiZ1wiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIlJlY3RhbmdsZS1Db3B5LTE3XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKDUzLjAwMDAwMCwgNDUuMDAwMDAwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm1hc2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgYXR0cnM6IHsgaWQ6IFwibWFzay00LVwiICsgX3ZtLmlkLCBmaWxsOiBcIndoaXRlXCIgfSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcInVzZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgXCJ4bGluazpocmVmXCI6IFwiI3BhdGgtMy1cIiArIF92bS5pZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcInVzZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXCJNYXNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IFwiI0UwRTNFOVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cmFuc2xhdGUoOC41MDAwMDAsIDE4LjAwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtOC41MDAwMDAsIC0xOC4wMDAwMDApIFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcInhsaW5rOmhyZWZcIjogXCIjcGF0aC0zLVwiICsgX3ZtLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXCJwb2x5Z29uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIlJlY3RhbmdsZS1Db3B5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IFwiI0Q1RDdERVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrOiBcInVybCgjbWFzay00LVwiICsgX3ZtLmlkICsgXCIpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRyYW5zbGF0ZSgxMi4wMDAwMDAsIDkuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMi4wMDAwMDAsIC05LjAwMDAwMCkgXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50czogXCI3IDAgMjQgMCAyMCAxOCAtMS43MDUzMDI1N2UtMTMgMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBfYyhcInBvbHlnb25cIiwge1xuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIlJlY3RhbmdsZS1Db3B5LTE4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbDogXCIjRjhGOUZCXCIsXG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOlxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cmFuc2xhdGUoNjYuMDAwMDAwLCA1MS41MDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTY2LjAwMDAwMCwgLTUxLjUwMDAwMCkgXCIsXG4gICAgICAgICAgICAgICAgICAgICAgcG9pbnRzOiBcIjYyIDQ1IDc5IDQ1IDcwIDU4IDUzIDU4XCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApXG4gICAgICAgIF1cbiAgICAgIClcbiAgICBdXG4gIClcbn1cbnZhciBpbWdfZW1wdHl2dWVfdHlwZV90ZW1wbGF0ZV9pZF80MjkxOGI4Ml9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuaW1nX2VtcHR5dnVlX3R5cGVfdGVtcGxhdGVfaWRfNDI5MThiODJfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9lbXB0eS9zcmMvaW1nLWVtcHR5LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00MjkxOGI4MiZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvZW1wdHkvc3JjL2ltZy1lbXB0eS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG52YXIgaW1nX2VtcHR5dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfaWQgPSAwO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaW1nX2VtcHR5dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0ltZ0VtcHR5JyxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICsraW1nX2VtcHR5dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfaWRcbiAgICB9O1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZW1wdHkvc3JjL2ltZy1lbXB0eS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2ltZ19lbXB0eXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChpbWdfZW1wdHl2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZW1wdHkvc3JjL2ltZy1lbXB0eS52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBpbWdfZW1wdHlfY29tcG9uZW50ID0gbm9ybWFsaXplQ29tcG9uZW50KFxuICBzcmNfaW1nX2VtcHR5dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBpbWdfZW1wdHl2dWVfdHlwZV90ZW1wbGF0ZV9pZF80MjkxOGI4Ml9yZW5kZXIsXG4gIGltZ19lbXB0eXZ1ZV90eXBlX3RlbXBsYXRlX2lkXzQyOTE4YjgyX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgaW1nX2VtcHR5X2FwaTsgfVxuaW1nX2VtcHR5X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvZW1wdHkvc3JjL2ltZy1lbXB0eS52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaW1nX2VtcHR5ID0gKGltZ19lbXB0eV9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9lbXB0eS9zcmMvaW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxudmFyIHNyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2NvbXBvbmVudHM7XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZW1wdHlfc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsRW1wdHknLFxuICBjb21wb25lbnRzOiAoc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfY29tcG9uZW50cyA9IHt9LCBzcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19jb21wb25lbnRzW2ltZ19lbXB0eS5uYW1lXSA9IGltZ19lbXB0eSwgc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfY29tcG9uZW50cyksXG4gIHByb3BzOiB7XG4gICAgaW1hZ2U6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBpbWFnZVNpemU6IE51bWJlcixcbiAgICBkZXNjcmlwdGlvbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgZW1wdHlEZXNjcmlwdGlvbjogZnVuY3Rpb24gZW1wdHlEZXNjcmlwdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uIHx8IE9iamVjdChsaWJfbG9jYWxlX1tcInRcIl0pKCdlbC5lbXB0eS5kZXNjcmlwdGlvbicpO1xuICAgIH0sXG4gICAgaW1hZ2VTdHlsZTogZnVuY3Rpb24gaW1hZ2VTdHlsZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiB0aGlzLmltYWdlU2l6ZSA/IHRoaXMuaW1hZ2VTaXplICsgJ3B4JyA6ICcnXG4gICAgICB9O1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2VtcHR5L3NyYy9pbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfZW1wdHlfc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGVtcHR5X3NyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9lbXB0eS9zcmMvaW5kZXgudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgZW1wdHlfc3JjX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfZW1wdHlfc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBzcmN2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDdjZWQ5MV9yZW5kZXIsXG4gIHNyY3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzM0N2NlZDkxX3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgZW1wdHlfc3JjX2FwaTsgfVxuZW1wdHlfc3JjX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvZW1wdHkvc3JjL2luZGV4LnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBlbXB0eV9zcmMgPSAoZW1wdHlfc3JjX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZW1wdHkvaW5kZXguanNcblxuXG5lbXB0eV9zcmMuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChlbXB0eV9zcmMubmFtZSwgZW1wdHlfc3JjKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGVtcHR5ID0gKGVtcHR5X3NyYyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Rlc2NyaXB0aW9ucy9zcmMvZGVzY3JpcHRpb25zLXJvdy5qc1xudmFyIGRlc2NyaXB0aW9uc19yb3dfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGRlc2NyaXB0aW9uc19yb3cgPSAoe1xuICBuYW1lOiAnRWxEZXNjcmlwdGlvbnNSb3cnLFxuICBwcm9wczoge1xuICAgIHJvdzoge1xuICAgICAgdHlwZTogQXJyYXlcbiAgICB9XG4gIH0sXG4gIGluamVjdDogWydlbERlc2NyaXB0aW9ucyddLFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgdmFyIGVsRGVzY3JpcHRpb25zID0gdGhpcy5lbERlc2NyaXB0aW9ucztcblxuICAgIHZhciByb3cgPSAodGhpcy5yb3cgfHwgW10pLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uc19yb3dfZXh0ZW5kcyh7fSwgaXRlbSwge1xuICAgICAgICBsYWJlbDogaXRlbS5zbG90cy5sYWJlbCB8fCBpdGVtLnByb3BzLmxhYmVsXG4gICAgICB9LCBbJ2xhYmVsQ2xhc3NOYW1lJywgJ2NvbnRlbnRDbGFzc05hbWUnLCAnbGFiZWxTdHlsZScsICdjb250ZW50U3R5bGUnXS5yZWR1Y2UoZnVuY3Rpb24gKHJlcywga2V5KSB7XG4gICAgICAgIHJlc1trZXldID0gaXRlbS5wcm9wc1trZXldIHx8IGVsRGVzY3JpcHRpb25zW2tleV07XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9LCB7fSkpO1xuICAgIH0pO1xuICAgIGlmIChlbERlc2NyaXB0aW9ucy5kaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIHJldHVybiBoKCd0Ym9keScsIFtoKFxuICAgICAgICAndHInLFxuICAgICAgICB7ICdjbGFzcyc6ICdlbC1kZXNjcmlwdGlvbnMtcm93JyB9LFxuICAgICAgICBbcm93Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHZhciBfcmVmO1xuXG4gICAgICAgICAgcmV0dXJuIGgoXG4gICAgICAgICAgICAndGgnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAnY2xhc3MnOiAoX3JlZiA9IHtcbiAgICAgICAgICAgICAgICAnZWwtZGVzY3JpcHRpb25zLWl0ZW1fX2NlbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICdlbC1kZXNjcmlwdGlvbnMtaXRlbV9fbGFiZWwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICdoYXMtY29sb24nOiBlbERlc2NyaXB0aW9ucy5ib3JkZXIgPyBmYWxzZSA6IGVsRGVzY3JpcHRpb25zLmNvbG9uLFxuICAgICAgICAgICAgICAgICdpcy1ib3JkZXJlZC1sYWJlbCc6IGVsRGVzY3JpcHRpb25zLmJvcmRlclxuICAgICAgICAgICAgICB9LCBfcmVmW2l0ZW0ubGFiZWxDbGFzc05hbWVdID0gdHJ1ZSwgX3JlZiksXG4gICAgICAgICAgICAgIHN0eWxlOiBpdGVtLmxhYmVsU3R5bGUsXG4gICAgICAgICAgICAgIGF0dHJzOiB7IGNvbFNwYW46IGl0ZW0ucHJvcHMuc3BhblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2l0ZW0ubGFiZWxdXG4gICAgICAgICAgKTtcbiAgICAgICAgfSldXG4gICAgICApLCBoKFxuICAgICAgICAndHInLFxuICAgICAgICB7ICdjbGFzcyc6ICdlbC1kZXNjcmlwdGlvbnMtcm93JyB9LFxuICAgICAgICBbcm93Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiBoKFxuICAgICAgICAgICAgJ3RkJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgJ2NsYXNzJzogWydlbC1kZXNjcmlwdGlvbnMtaXRlbV9fY2VsbCcsICdlbC1kZXNjcmlwdGlvbnMtaXRlbV9fY29udGVudCcsIGl0ZW0uY29udGVudENsYXNzTmFtZV0sXG4gICAgICAgICAgICAgIHN0eWxlOiBpdGVtLmNvbnRlbnRTdHlsZSxcbiAgICAgICAgICAgICAgYXR0cnM6IHsgY29sU3BhbjogaXRlbS5wcm9wcy5zcGFuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbaXRlbS5zbG90cy5kZWZhdWx0XVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXVxuICAgICAgKV0pO1xuICAgIH1cbiAgICBpZiAoZWxEZXNjcmlwdGlvbnMuYm9yZGVyKSB7XG4gICAgICByZXR1cm4gaCgndGJvZHknLCBbaChcbiAgICAgICAgJ3RyJyxcbiAgICAgICAgeyAnY2xhc3MnOiAnZWwtZGVzY3JpcHRpb25zLXJvdycgfSxcbiAgICAgICAgW3Jvdy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICB2YXIgX3JlZjI7XG5cbiAgICAgICAgICByZXR1cm4gW2goXG4gICAgICAgICAgICAndGgnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAnY2xhc3MnOiAoX3JlZjIgPSB7XG4gICAgICAgICAgICAgICAgJ2VsLWRlc2NyaXB0aW9ucy1pdGVtX19jZWxsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAnZWwtZGVzY3JpcHRpb25zLWl0ZW1fX2xhYmVsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAnaXMtYm9yZGVyZWQtbGFiZWwnOiBlbERlc2NyaXB0aW9ucy5ib3JkZXJcbiAgICAgICAgICAgICAgfSwgX3JlZjJbaXRlbS5sYWJlbENsYXNzTmFtZV0gPSB0cnVlLCBfcmVmMiksXG4gICAgICAgICAgICAgIHN0eWxlOiBpdGVtLmxhYmVsU3R5bGUsXG4gICAgICAgICAgICAgIGF0dHJzOiB7IGNvbFNwYW46ICcxJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2l0ZW0ubGFiZWxdXG4gICAgICAgICAgKSwgaChcbiAgICAgICAgICAgICd0ZCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICdjbGFzcyc6IFsnZWwtZGVzY3JpcHRpb25zLWl0ZW1fX2NlbGwnLCAnZWwtZGVzY3JpcHRpb25zLWl0ZW1fX2NvbnRlbnQnLCBpdGVtLmNvbnRlbnRDbGFzc05hbWVdLFxuICAgICAgICAgICAgICBzdHlsZTogaXRlbS5jb250ZW50U3R5bGUsXG4gICAgICAgICAgICAgIGF0dHJzOiB7IGNvbFNwYW46IGl0ZW0ucHJvcHMuc3BhbiAqIDIgLSAxXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbaXRlbS5zbG90cy5kZWZhdWx0XVxuICAgICAgICAgICldO1xuICAgICAgICB9KV1cbiAgICAgICldKTtcbiAgICB9XG4gICAgcmV0dXJuIGgoJ3Rib2R5JywgW2goXG4gICAgICAndHInLFxuICAgICAgeyAnY2xhc3MnOiAnZWwtZGVzY3JpcHRpb25zLXJvdycgfSxcbiAgICAgIFtyb3cubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHZhciBfcmVmMztcblxuICAgICAgICByZXR1cm4gaChcbiAgICAgICAgICAndGQnLFxuICAgICAgICAgIHsgJ2NsYXNzJzogJ2VsLWRlc2NyaXB0aW9ucy1pdGVtIGVsLWRlc2NyaXB0aW9ucy1pdGVtX19jZWxsJywgYXR0cnM6IHsgY29sU3BhbjogaXRlbS5wcm9wcy5zcGFuIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtoKFxuICAgICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgICB7ICdjbGFzcyc6ICdlbC1kZXNjcmlwdGlvbnMtaXRlbV9fY29udGFpbmVyJyB9LFxuICAgICAgICAgICAgW2goXG4gICAgICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICdjbGFzcyc6IChfcmVmMyA9IHtcbiAgICAgICAgICAgICAgICAgICdlbC1kZXNjcmlwdGlvbnMtaXRlbV9fbGFiZWwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgJ2hhcy1jb2xvbic6IGVsRGVzY3JpcHRpb25zLmNvbG9uXG4gICAgICAgICAgICAgICAgfSwgX3JlZjNbaXRlbS5sYWJlbENsYXNzTmFtZV0gPSB0cnVlLCBfcmVmMyksXG4gICAgICAgICAgICAgICAgc3R5bGU6IGl0ZW0ubGFiZWxTdHlsZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbaXRlbS5sYWJlbF1cbiAgICAgICAgICAgICksIGgoXG4gICAgICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICdjbGFzcyc6IFsnZWwtZGVzY3JpcHRpb25zLWl0ZW1fX2NvbnRlbnQnLCBpdGVtLmNvbnRlbnRDbGFzc05hbWVdLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBpdGVtLmNvbnRlbnRTdHlsZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbaXRlbS5zbG90cy5kZWZhdWx0XVxuICAgICAgICAgICAgKV1cbiAgICAgICAgICApXVxuICAgICAgICApO1xuICAgICAgfSldXG4gICAgKV0pO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvZGVzY3JpcHRpb25zL3NyYy9pbmRleC5qc1xudmFyIHNyY19leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIHNyY19jb21wb25lbnRzO1xuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkZXNjcmlwdGlvbnNfc3JjID0gKHtcbiAgbmFtZTogJ0VsRGVzY3JpcHRpb25zJyxcbiAgY29tcG9uZW50czogKHNyY19jb21wb25lbnRzID0ge30sIHNyY19jb21wb25lbnRzW2Rlc2NyaXB0aW9uc19yb3cubmFtZV0gPSBkZXNjcmlwdGlvbnNfcm93LCBzcmNfY29tcG9uZW50cyksXG4gIHByb3BzOiB7XG4gICAgYm9yZGVyOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIGNvbHVtbjoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogM1xuICAgIH0sXG4gICAgZGlyZWN0aW9uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnaG9yaXpvbnRhbCdcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgICAgLy8gdmFsaWRhdG9yOiBpc1ZhbGlkQ29tcG9uZW50U2l6ZSxcbiAgICB9LFxuICAgIHRpdGxlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgZXh0cmE6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBsYWJlbFN0eWxlOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIGNvbnRlbnRTdHlsZToge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICBsYWJlbENsYXNzTmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGNvbnRlbnRDbGFzc05hbWU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBjb2xvbjoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgZGVzY3JpcHRpb25zU2l6ZTogZnVuY3Rpb24gZGVzY3JpcHRpb25zU2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7XG4gICAgfVxuICB9LFxuICBwcm92aWRlOiBmdW5jdGlvbiBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlbERlc2NyaXB0aW9uczogdGhpc1xuICAgIH07XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldE9wdGlvblByb3BzOiBmdW5jdGlvbiBnZXRPcHRpb25Qcm9wcyh2bm9kZSkge1xuICAgICAgaWYgKHZub2RlLmNvbXBvbmVudE9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE9wdGlvbnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zO1xuICAgICAgICB2YXIgX2NvbXBvbmVudE9wdGlvbnMkcHJvID0gY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEsXG4gICAgICAgICAgICBwcm9wc0RhdGEgPSBfY29tcG9uZW50T3B0aW9ucyRwcm8gPT09IHVuZGVmaW5lZCA/IHt9IDogX2NvbXBvbmVudE9wdGlvbnMkcHJvLFxuICAgICAgICAgICAgX2NvbXBvbmVudE9wdGlvbnMkQ3RvID0gY29tcG9uZW50T3B0aW9ucy5DdG9yLFxuICAgICAgICAgICAgQ3RvciA9IF9jb21wb25lbnRPcHRpb25zJEN0byA9PT0gdW5kZWZpbmVkID8ge30gOiBfY29tcG9uZW50T3B0aW9ucyRDdG87XG5cbiAgICAgICAgdmFyIHByb3BzID0gKEN0b3Iub3B0aW9ucyB8fCB7fSkucHJvcHMgfHwge307XG4gICAgICAgIHZhciByZXMgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBwcm9wcykge1xuICAgICAgICAgIHZhciB2ID0gcHJvcHNba107XG4gICAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHYuZGVmYXVsdDtcbiAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc1trXSA9IE9iamVjdCh0eXBlc19bXCJpc0Z1bmN0aW9uXCJdKShkZWZhdWx0VmFsdWUpID8gZGVmYXVsdFZhbHVlLmNhbGwodm5vZGUpIDogZGVmYXVsdFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3JjX2V4dGVuZHMoe30sIHJlcywgcHJvcHNEYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICAgIGdldFNsb3RzOiBmdW5jdGlvbiBnZXRTbG90cyh2bm9kZSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGNvbXBvbmVudE9wdGlvbnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zIHx8IHt9O1xuICAgICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4gfHwgY29tcG9uZW50T3B0aW9ucy5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIHZhciBzbG90cyA9IHt9O1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKCFfdGhpcy5pc0VtcHR5RWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgICB2YXIgbmFtZSA9IGNoaWxkLmRhdGEgJiYgY2hpbGQuZGF0YS5zbG90IHx8ICdkZWZhdWx0JztcbiAgICAgICAgICBzbG90c1tuYW1lXSA9IHNsb3RzW25hbWVdIHx8IFtdO1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgICAgIHNsb3RzW25hbWVdLnB1c2goY2hpbGQuY2hpbGRyZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzbG90c1tuYW1lXS5wdXNoKGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNyY19leHRlbmRzKHt9LCBzbG90cyk7XG4gICAgfSxcbiAgICBpc0VtcHR5RWxlbWVudDogZnVuY3Rpb24gaXNFbXB0eUVsZW1lbnQoYykge1xuICAgICAgcmV0dXJuICEoYy50YWcgfHwgYy50ZXh0ICYmIGMudGV4dC50cmltKCkgIT09ICcnKTtcbiAgICB9LFxuICAgIGZpbGxlZE5vZGU6IGZ1bmN0aW9uIGZpbGxlZE5vZGUobm9kZSwgc3BhbiwgY291bnQpIHtcbiAgICAgIHZhciBpc0xhc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuXG4gICAgICBpZiAoIW5vZGUucHJvcHMpIHtcbiAgICAgICAgbm9kZS5wcm9wcyA9IHt9O1xuICAgICAgfVxuICAgICAgaWYgKHNwYW4gPiBjb3VudCkge1xuICAgICAgICBub2RlLnByb3BzLnNwYW4gPSBjb3VudDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0xhc3QpIHtcbiAgICAgICAgLy8gc2V0IHRoZSBtYXggc3BhbiwgY2F1c2Ugb2YgdGhlIGxhc3QgdGRcbiAgICAgICAgbm9kZS5wcm9wcy5zcGFuID0gY291bnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9LFxuICAgIGdldFJvd3M6IGZ1bmN0aW9uIGdldFJvd3MoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGNoaWxkcmVuID0gKHRoaXMuJHNsb3RzLmRlZmF1bHQgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAodm5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHZub2RlLnRhZyAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnMuQ3Rvci5vcHRpb25zLm5hbWUgPT09ICdFbERlc2NyaXB0aW9uc0l0ZW0nO1xuICAgICAgfSk7XG4gICAgICB2YXIgbm9kZXMgPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKHZub2RlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJvcHM6IF90aGlzMi5nZXRPcHRpb25Qcm9wcyh2bm9kZSksXG4gICAgICAgICAgc2xvdHM6IF90aGlzMi5nZXRTbG90cyh2bm9kZSksXG4gICAgICAgICAgdm5vZGU6IHZub2RlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHZhciByb3dzID0gW107XG4gICAgICB2YXIgdGVtcCA9IFtdO1xuICAgICAgdmFyIGNvdW50ID0gdGhpcy5jb2x1bW47XG5cbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGluZGV4KSB7XG4gICAgICAgIHZhciBzcGFuID0gbm9kZS5wcm9wcy5zcGFuIHx8IDE7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSBjaGlsZHJlbi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdGVtcC5wdXNoKF90aGlzMi5maWxsZWROb2RlKG5vZGUsIHNwYW4sIGNvdW50LCB0cnVlKSk7XG4gICAgICAgICAgcm93cy5wdXNoKHRlbXApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzcGFuIDwgY291bnQpIHtcbiAgICAgICAgICBjb3VudCAtPSBzcGFuO1xuICAgICAgICAgIHRlbXAucHVzaChub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wLnB1c2goX3RoaXMyLmZpbGxlZE5vZGUobm9kZSwgc3BhbiwgY291bnQpKTtcbiAgICAgICAgICByb3dzLnB1c2godGVtcCk7XG4gICAgICAgICAgY291bnQgPSBfdGhpczIuY29sdW1uO1xuICAgICAgICAgIHRlbXAgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByb3dzO1xuICAgIH1cbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIGggPSBhcmd1bWVudHNbMF07XG4gICAgdmFyIHRpdGxlID0gdGhpcy50aXRsZSxcbiAgICAgICAgZXh0cmEgPSB0aGlzLmV4dHJhLFxuICAgICAgICBib3JkZXIgPSB0aGlzLmJvcmRlcixcbiAgICAgICAgZGVzY3JpcHRpb25zU2l6ZSA9IHRoaXMuZGVzY3JpcHRpb25zU2l6ZSxcbiAgICAgICAgJHNsb3RzID0gdGhpcy4kc2xvdHM7XG5cbiAgICB2YXIgcm93cyA9IHRoaXMuZ2V0Um93cygpO1xuXG4gICAgcmV0dXJuIGgoXG4gICAgICAnZGl2JyxcbiAgICAgIHsgJ2NsYXNzJzogJ2VsLWRlc2NyaXB0aW9ucycgfSxcbiAgICAgIFt0aXRsZSB8fCBleHRyYSB8fCAkc2xvdHMudGl0bGUgfHwgJHNsb3RzLmV4dHJhID8gaChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgJ2NsYXNzJzogJ2VsLWRlc2NyaXB0aW9uc19faGVhZGVyJyB9LFxuICAgICAgICBbaChcbiAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICB7ICdjbGFzcyc6ICdlbC1kZXNjcmlwdGlvbnNfX3RpdGxlJyB9LFxuICAgICAgICAgIFskc2xvdHMudGl0bGUgPyAkc2xvdHMudGl0bGUgOiB0aXRsZV1cbiAgICAgICAgKSwgaChcbiAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICB7ICdjbGFzcyc6ICdlbC1kZXNjcmlwdGlvbnNfX2V4dHJhJyB9LFxuICAgICAgICAgIFskc2xvdHMuZXh0cmEgPyAkc2xvdHMuZXh0cmEgOiBleHRyYV1cbiAgICAgICAgKV1cbiAgICAgICkgOiBudWxsLCBoKFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyAnY2xhc3MnOiAnZWwtZGVzY3JpcHRpb25zX19ib2R5JyB9LFxuICAgICAgICBbaChcbiAgICAgICAgICAndGFibGUnLFxuICAgICAgICAgIHsgJ2NsYXNzJzogWydlbC1kZXNjcmlwdGlvbnNfX3RhYmxlJywgeyAnaXMtYm9yZGVyZWQnOiBib3JkZXIgfSwgZGVzY3JpcHRpb25zU2l6ZSA/ICdlbC1kZXNjcmlwdGlvbnMtLScgKyBkZXNjcmlwdGlvbnNTaXplIDogJyddIH0sXG4gICAgICAgICAgW3Jvd3MubWFwKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIHJldHVybiBoKGRlc2NyaXB0aW9uc19yb3csIHtcbiAgICAgICAgICAgICAgYXR0cnM6IHsgcm93OiByb3cgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSldXG4gICAgICAgICldXG4gICAgICApXVxuICAgICk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kZXNjcmlwdGlvbnMvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZGVzY3JpcHRpb25zX3NyYy5pbnN0YWxsID0gZnVuY3Rpb24gaW5zdGFsbChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChkZXNjcmlwdGlvbnNfc3JjLm5hbWUsIGRlc2NyaXB0aW9uc19zcmMpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZGVzY3JpcHRpb25zID0gKGRlc2NyaXB0aW9uc19zcmMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kZXNjcmlwdGlvbnMvc3JjL2Rlc2NyaXB0aW9ucy1pdGVtLmpzXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkZXNjcmlwdGlvbnNfaXRlbSA9ICh7XG4gIG5hbWU6ICdFbERlc2NyaXB0aW9uc0l0ZW0nLFxuICBwcm9wczoge1xuICAgIGxhYmVsOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgc3Bhbjoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMVxuICAgIH0sXG4gICAgY29udGVudENsYXNzTmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGNvbnRlbnRTdHlsZToge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICBsYWJlbENsYXNzTmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGxhYmVsU3R5bGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH1cbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9kZXNjcmlwdGlvbnMtaXRlbS9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5kZXNjcmlwdGlvbnNfaXRlbS5pbnN0YWxsID0gZnVuY3Rpb24gaW5zdGFsbChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChkZXNjcmlwdGlvbnNfaXRlbS5uYW1lLCBkZXNjcmlwdGlvbnNfaXRlbSk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19kZXNjcmlwdGlvbnNfaXRlbSA9IChkZXNjcmlwdGlvbnNfaXRlbSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3Jlc3VsdC9zcmMvaW5kZXgudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTM0MDhiMTM5JlxudmFyIHNyY3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzM0MDhiMTM5X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXJlc3VsdFwiIH0sIFtcbiAgICBfYyhcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLXJlc3VsdF9faWNvblwiIH0sXG4gICAgICBbXG4gICAgICAgIF92bS5fdChcImljb25cIiwgW1xuICAgICAgICAgIF9jKF92bS5pY29uRWxlbWVudCwgeyB0YWc6IFwiY29tcG9uZW50XCIsIGNsYXNzOiBfdm0uaWNvbkVsZW1lbnQgfSlcbiAgICAgICAgXSlcbiAgICAgIF0sXG4gICAgICAyXG4gICAgKSxcbiAgICBfdm0udGl0bGUgfHwgX3ZtLiRzbG90cy50aXRsZVxuICAgICAgPyBfYyhcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtcmVzdWx0X190aXRsZVwiIH0sXG4gICAgICAgICAgW192bS5fdChcInRpdGxlXCIsIFtfYyhcInBcIiwgW192bS5fdihfdm0uX3MoX3ZtLnRpdGxlKSldKV0pXSxcbiAgICAgICAgICAyXG4gICAgICAgIClcbiAgICAgIDogX3ZtLl9lKCksXG4gICAgX3ZtLnN1YlRpdGxlIHx8IF92bS4kc2xvdHMuc3ViVGl0bGVcbiAgICAgID8gX2MoXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLXJlc3VsdF9fc3VidGl0bGVcIiB9LFxuICAgICAgICAgIFtfdm0uX3QoXCJzdWJUaXRsZVwiLCBbX2MoXCJwXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS5zdWJUaXRsZSkpXSldKV0sXG4gICAgICAgICAgMlxuICAgICAgICApXG4gICAgICA6IF92bS5fZSgpLFxuICAgIF92bS4kc2xvdHMuZXh0cmFcbiAgICAgID8gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1yZXN1bHRfX2V4dHJhXCIgfSwgW192bS5fdChcImV4dHJhXCIpXSwgMilcbiAgICAgIDogX3ZtLl9lKClcbiAgXSlcbn1cbnZhciBzcmN2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDA4YjEzOV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuc3JjdnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQwOGIxMzlfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yZXN1bHQvc3JjL2luZGV4LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zNDA4YjEzOSZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9yZXN1bHQvc3JjL2ljb24tc3VjY2Vzcy52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MTgxMTk0MTgmXG52YXIgaWNvbl9zdWNjZXNzdnVlX3R5cGVfdGVtcGxhdGVfaWRfMTgxMTk0MThfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwic3ZnXCIsXG4gICAgeyBhdHRyczogeyB2aWV3Qm94OiBcIjAgMCA0OCA0OFwiLCB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIH0gfSxcbiAgICBbXG4gICAgICBfYyhcInBhdGhcIiwge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIGQ6XG4gICAgICAgICAgICBcIk0yNCw0IEMzNS4wNDU2OTUsNCA0NCwxMi45NTQzMDUgNDQsMjQgQzQ0LDM1LjA0NTY5NSAzNS4wNDU2OTUsNDQgMjQsNDQgQzEyLjk1NDMwNSw0NCA0LDM1LjA0NTY5NSA0LDI0IEM0LDEyLjk1NDMwNSAxMi45NTQzMDUsNCAyNCw0IFogTTM0LjU1NDgwOTgsMTYuNDQ4NTcxMSBDMzMuOTYxMjIyOCwxNS44NTA0NzYzIDMyLjk5ODgyODIsMTUuODUwNDc2MyAzMi40MDUyNDEyLDE2LjQ0ODU3MTEgTDMyLjQwNTI0MTIsMTYuNDQ4NTcxMSBMMjEuNDEzNzU3LDI3LjU4MDU4MTEgTDIxLjQxMzc1NywyNy41ODA1ODExIEwyMS40MDM0NjQyLDI3LjU5MDg1NSBDMjEuMDA5NzU0MiwyNy45NzgxNjc0IDIwLjM3NjYxMDUsMjcuOTcyOTgxMSAxOS45ODkyOTgxLDI3LjU3OTI3MTEgTDE5Ljk4OTI5ODEsMjcuNTc5MjcxMSBMMTUuNTk0NzU4OCwyMy4xMTIxNDI4IEMxNS4wMDExNzE4LDIyLjUxNDA0OCAxNC4wMzg3NzcyLDIyLjUxNDA0OCAxMy40NDUxOTAyLDIzLjExMjE0MjggQzEyLjg1MTYwMzMsMjMuNzEwMjM3NiAxMi44NTE2MDMzLDI0LjY3OTk0MDkgMTMuNDQ1MTkwMiwyNS4yNzgwMzU3IEwxMy40NDUxOTAyLDI1LjI3ODAzNTcgTDE5LjYyNjA3ODYsMzEuNTUxNDI4OSBDMjAuMjE5NjY1NiwzMi4xNDk1MjM3IDIxLjE4MjA2MDIsMzIuMTQ5NTIzNyAyMS43NzU2NDcyLDMxLjU1MTQyODkgTDIxLjc3NTY0NzIsMzEuNTUxNDI4OSBMMzQuNTU0ODA5OCwxOC42MTQ0NjQgQzM1LjE0ODM5NjcsMTguMDE2MzY5MiAzNS4xNDgzOTY3LDE3LjA0NjY2NTkgMzQuNTU0ODA5OCwxNi40NDg1NzExIFpcIlxuICAgICAgICB9XG4gICAgICB9KVxuICAgIF1cbiAgKVxufVxudmFyIGljb25fc3VjY2Vzc3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzE4MTE5NDE4X3N0YXRpY1JlbmRlckZucyA9IFtdXG5pY29uX3N1Y2Nlc3N2dWVfdHlwZV90ZW1wbGF0ZV9pZF8xODExOTQxOF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Jlc3VsdC9zcmMvaWNvbi1zdWNjZXNzLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xODExOTQxOCZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmVzdWx0L3NyYy9pY29uLXN1Y2Nlc3MudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGljb25fc3VjY2Vzc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdJY29uU3VjY2Vzcydcbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yZXN1bHQvc3JjL2ljb24tc3VjY2Vzcy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2ljb25fc3VjY2Vzc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChpY29uX3N1Y2Nlc3N2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmVzdWx0L3NyYy9pY29uLXN1Y2Nlc3MudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgaWNvbl9zdWNjZXNzX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2ljb25fc3VjY2Vzc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgaWNvbl9zdWNjZXNzdnVlX3R5cGVfdGVtcGxhdGVfaWRfMTgxMTk0MThfcmVuZGVyLFxuICBpY29uX3N1Y2Nlc3N2dWVfdHlwZV90ZW1wbGF0ZV9pZF8xODExOTQxOF9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGljb25fc3VjY2Vzc19hcGk7IH1cbmljb25fc3VjY2Vzc19jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3Jlc3VsdC9zcmMvaWNvbi1zdWNjZXNzLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpY29uX3N1Y2Nlc3MgPSAoaWNvbl9zdWNjZXNzX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmVzdWx0L3NyYy9pY29uLWVycm9yLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yMTE5OTI0NiZcbnZhciBpY29uX2Vycm9ydnVlX3R5cGVfdGVtcGxhdGVfaWRfMjExOTkyNDZfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwic3ZnXCIsXG4gICAgeyBhdHRyczogeyB2aWV3Qm94OiBcIjAgMCA0OCA0OFwiLCB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIH0gfSxcbiAgICBbXG4gICAgICBfYyhcInBhdGhcIiwge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIGQ6XG4gICAgICAgICAgICBcIk0yNCw0IEMzNS4wNDU2OTUsNCA0NCwxMi45NTQzMDUgNDQsMjQgQzQ0LDM1LjA0NTY5NSAzNS4wNDU2OTUsNDQgMjQsNDQgQzEyLjk1NDMwNSw0NCA0LDM1LjA0NTY5NSA0LDI0IEM0LDEyLjk1NDMwNSAxMi45NTQzMDUsNCAyNCw0IFogTTMyLjU3ODE4LDE1LjQyMTgyIEMzMi4wMTU3NTM0LDE0Ljg1OTM5MzMgMzEuMTAzODc5NywxNC44NTkzOTMzIDMwLjU0MTQ1MywxNS40MjE4MiBMMzAuNTQxNDUzLDE1LjQyMTgyIEwyNC4wMDA2Nzg5LDIxLjk2MjU5NDEgTDE3LjQ1ODU0NywxNS40MjE4MiBDMTYuODk2MTIwMywxNC44NTkzOTMzIDE1Ljk4NDI0NjYsMTQuODU5MzkzMyAxNS40MjE4MiwxNS40MjE4MiBDMTQuODU5MzkzMywxNS45ODQyNDY2IDE0Ljg1OTM5MzMsMTYuODk2MTIwMyAxNS40MjE4MiwxNy40NTg1NDcgTDE1LjQyMTgyLDE3LjQ1ODU0NyBMMjEuOTYzOTUxOSwyMy45OTkzMjExIEwxNS40MjE4MiwzMC41NDE0NTMgQzE0Ljg1OTM5MzMsMzEuMTAzODc5NyAxNC44NTkzOTMzLDMyLjAxNTc1MzQgMTUuNDIxODIsMzIuNTc4MTggQzE1Ljk4NDI0NjYsMzMuMTQwNjA2NyAxNi44OTYxMjAzLDMzLjE0MDYwNjcgMTcuNDU4NTQ3LDMyLjU3ODE4IEwxNy40NTg1NDcsMzIuNTc4MTggTDI0LjAwMDY3ODksMjYuMDM2MDQ4MSBMMzAuNTQxNDUzLDMyLjU3ODE4IEMzMS4xMDM4Nzk3LDMzLjE0MDYwNjcgMzIuMDE1NzUzNCwzMy4xNDA2MDY3IDMyLjU3ODE4LDMyLjU3ODE4IEMzMy4xNDA2MDY3LDMyLjAxNTc1MzQgMzMuMTQwNjA2NywzMS4xMDM4Nzk3IDMyLjU3ODE4LDMwLjU0MTQ1MyBMMzIuNTc4MTgsMzAuNTQxNDUzIEwyNi4wMzc0MDU5LDIzLjk5OTMyMTEgTDMyLjU3ODE4LDE3LjQ1ODU0NyBDMzMuMTQwNjA2NywxNi44OTYxMjAzIDMzLjE0MDYwNjcsMTUuOTg0MjQ2NiAzMi41NzgxOCwxNS40MjE4MiBaXCJcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICBdXG4gIClcbn1cbnZhciBpY29uX2Vycm9ydnVlX3R5cGVfdGVtcGxhdGVfaWRfMjExOTkyNDZfc3RhdGljUmVuZGVyRm5zID0gW11cbmljb25fZXJyb3J2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yMTE5OTI0Nl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Jlc3VsdC9zcmMvaWNvbi1lcnJvci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MjExOTkyNDYmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3Jlc3VsdC9zcmMvaWNvbi1lcnJvci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaWNvbl9lcnJvcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdJY29uRXJyb3InXG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmVzdWx0L3NyYy9pY29uLWVycm9yLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfaWNvbl9lcnJvcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChpY29uX2Vycm9ydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Jlc3VsdC9zcmMvaWNvbi1lcnJvci52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBpY29uX2Vycm9yX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2ljb25fZXJyb3J2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIGljb25fZXJyb3J2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yMTE5OTI0Nl9yZW5kZXIsXG4gIGljb25fZXJyb3J2dWVfdHlwZV90ZW1wbGF0ZV9pZF8yMTE5OTI0Nl9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGljb25fZXJyb3JfYXBpOyB9XG5pY29uX2Vycm9yX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvcmVzdWx0L3NyYy9pY29uLWVycm9yLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpY29uX2Vycm9yID0gKGljb25fZXJyb3JfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9yZXN1bHQvc3JjL2ljb24td2FybmluZy52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDZmZThmMzEmXG52YXIgaWNvbl93YXJuaW5ndnVlX3R5cGVfdGVtcGxhdGVfaWRfNDZmZThmMzFfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwic3ZnXCIsXG4gICAgeyBhdHRyczogeyB2aWV3Qm94OiBcIjAgMCA0OCA0OFwiLCB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIH0gfSxcbiAgICBbXG4gICAgICBfYyhcInBhdGhcIiwge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIGQ6XG4gICAgICAgICAgICBcIk0yNCw0IEMzNS4wNDU2OTUsNCA0NCwxMi45NTQzMDUgNDQsMjQgQzQ0LDM1LjA0NTY5NSAzNS4wNDU2OTUsNDQgMjQsNDQgQzEyLjk1NDMwNSw0NCA0LDM1LjA0NTY5NSA0LDI0IEM0LDEyLjk1NDMwNSAxMi45NTQzMDUsNCAyNCw0IFogTTI0LDMxIEMyMi44OTU0MzA1LDMxIDIyLDMxLjg5NTQzMDUgMjIsMzMgQzIyLDM0LjEwNDU2OTUgMjIuODk1NDMwNSwzNSAyNCwzNSBDMjUuMTA0NTY5NSwzNSAyNiwzNC4xMDQ1Njk1IDI2LDMzIEMyNiwzMS44OTU0MzA1IDI1LjEwNDU2OTUsMzEgMjQsMzEgWiBNMjQsMTQgQzIzLjE3MTU3MjksMTQgMjIuNSwxNC42NzE1NzI5IDIyLjUsMTUuNSBMMjIuNSwxNS41IEwyMi41LDI3LjUgQzIyLjUsMjguMzI4NDI3MSAyMy4xNzE1NzI5LDI5IDI0LDI5IEMyNC44Mjg0MjcxLDI5IDI1LjUsMjguMzI4NDI3MSAyNS41LDI3LjUgTDI1LjUsMjcuNSBMMjUuNSwxNS41IEMyNS41LDE0LjY3MTU3MjkgMjQuODI4NDI3MSwxNCAyNCwxNCBaXCJcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICBdXG4gIClcbn1cbnZhciBpY29uX3dhcm5pbmd2dWVfdHlwZV90ZW1wbGF0ZV9pZF80NmZlOGYzMV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuaWNvbl93YXJuaW5ndnVlX3R5cGVfdGVtcGxhdGVfaWRfNDZmZThmMzFfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yZXN1bHQvc3JjL2ljb24td2FybmluZy52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDZmZThmMzEmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9yZXN1bHQvc3JjL2ljb24td2FybmluZy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9dHMmXG5cblxuXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpY29uX3dhcm5pbmd2dWVfdHlwZV9zY3JpcHRfbGFuZ190c18gPSAoe1xuICBuYW1lOiAnSWNvbldhcm5pbmcnXG59KTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yZXN1bHQvc3JjL2ljb24td2FybmluZy52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9dHMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2ljb25fd2FybmluZ3Z1ZV90eXBlX3NjcmlwdF9sYW5nX3RzXyA9IChpY29uX3dhcm5pbmd2dWVfdHlwZV9zY3JpcHRfbGFuZ190c18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmVzdWx0L3NyYy9pY29uLXdhcm5pbmcudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgaWNvbl93YXJuaW5nX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2ljb25fd2FybmluZ3Z1ZV90eXBlX3NjcmlwdF9sYW5nX3RzXyxcbiAgaWNvbl93YXJuaW5ndnVlX3R5cGVfdGVtcGxhdGVfaWRfNDZmZThmMzFfcmVuZGVyLFxuICBpY29uX3dhcm5pbmd2dWVfdHlwZV90ZW1wbGF0ZV9pZF80NmZlOGYzMV9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGljb25fd2FybmluZ19hcGk7IH1cbmljb25fd2FybmluZ19jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3Jlc3VsdC9zcmMvaWNvbi13YXJuaW5nLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpY29uX3dhcm5pbmcgPSAoaWNvbl93YXJuaW5nX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmVzdWx0L3NyYy9pY29uLWluZm8udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTE5ZTNkZTY5JlxudmFyIGljb25faW5mb3Z1ZV90eXBlX3RlbXBsYXRlX2lkXzE5ZTNkZTY5X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcInN2Z1wiLFxuICAgIHsgYXR0cnM6IHsgdmlld0JveDogXCIwIDAgNDggNDhcIiwgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB9IH0sXG4gICAgW1xuICAgICAgX2MoXCJwYXRoXCIsIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBkOlxuICAgICAgICAgICAgXCJNMjQsNCBDMzUuMDQ1Njk1LDQgNDQsMTIuOTU0MzA1IDQ0LDI0IEM0NCwzNS4wNDU2OTUgMzUuMDQ1Njk1LDQ0IDI0LDQ0IEMxMi45NTQzMDUsNDQgNCwzNS4wNDU2OTUgNCwyNCBDNCwxMi45NTQzMDUgMTIuOTU0MzA1LDQgMjQsNCBaIE0yNCwxOSBMMjEsMTkgQzIwLjE3MTU3MjksMTkgMTkuNSwxOS42NzE1NzI5IDE5LjUsMjAuNSBDMTkuNSwyMS4zMjg0MjcxIDIwLjE3MTU3MjksMjIgMjEsMjIgTDIxLDIyIEwyMi41LDIyIEwyMi41LDMxIEwyMSwzMSBDMjAuMTcxNTcyOSwzMSAxOS41LDMxLjY3MTU3MjkgMTkuNSwzMi41IEMxOS41LDMzLjMyODQyNzEgMjAuMTcxNTcyOSwzNCAyMSwzNCBMMjEsMzQgTDI3LDM0IEMyNy44Mjg0MjcxLDM0IDI4LjUsMzMuMzI4NDI3MSAyOC41LDMyLjUgQzI4LjUsMzEuNjcxNTcyOSAyNy44Mjg0MjcxLDMxIDI3LDMxIEwyNywzMSBMMjUuNSwzMSBMMjUuNSwyMC41IEMyNS41LDE5LjY3MTU3MjkgMjQuODI4NDI3MSwxOSAyNCwxOSBMMjQsMTkgWiBNMjQsMTMgQzIyLjg5NTQzMDUsMTMgMjIsMTMuODk1NDMwNSAyMiwxNSBDMjIsMTYuMTA0NTY5NSAyMi44OTU0MzA1LDE3IDI0LDE3IEMyNS4xMDQ1Njk1LDE3IDI2LDE2LjEwNDU2OTUgMjYsMTUgQzI2LDEzLjg5NTQzMDUgMjUuMTA0NTY5NSwxMyAyNCwxMyBaXCJcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICBdXG4gIClcbn1cbnZhciBpY29uX2luZm92dWVfdHlwZV90ZW1wbGF0ZV9pZF8xOWUzZGU2OV9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuaWNvbl9pbmZvdnVlX3R5cGVfdGVtcGxhdGVfaWRfMTllM2RlNjlfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yZXN1bHQvc3JjL2ljb24taW5mby52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MTllM2RlNjkmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9yZXN1bHQvc3JjL2ljb24taW5mby52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9dHMmXG5cblxuXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpY29uX2luZm92dWVfdHlwZV9zY3JpcHRfbGFuZ190c18gPSAoe1xuICBuYW1lOiAnSWNvbkluZm8nXG59KTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yZXN1bHQvc3JjL2ljb24taW5mby52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9dHMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2ljb25faW5mb3Z1ZV90eXBlX3NjcmlwdF9sYW5nX3RzXyA9IChpY29uX2luZm92dWVfdHlwZV9zY3JpcHRfbGFuZ190c18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmVzdWx0L3NyYy9pY29uLWluZm8udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgaWNvbl9pbmZvX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc3JjX2ljb25faW5mb3Z1ZV90eXBlX3NjcmlwdF9sYW5nX3RzXyxcbiAgaWNvbl9pbmZvdnVlX3R5cGVfdGVtcGxhdGVfaWRfMTllM2RlNjlfcmVuZGVyLFxuICBpY29uX2luZm92dWVfdHlwZV90ZW1wbGF0ZV9pZF8xOWUzZGU2OV9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGljb25faW5mb19hcGk7IH1cbmljb25faW5mb19jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3Jlc3VsdC9zcmMvaWNvbi1pbmZvLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpY29uX2luZm8gPSAoaWNvbl9pbmZvX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3Jlc3VsdC9zcmMvaW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxudmFyIHJlc3VsdF9zcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19jb21wb25lbnRzO1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cblxudmFyIEljb25NYXAgPSB7XG4gIHN1Y2Nlc3M6ICdpY29uLXN1Y2Nlc3MnLFxuICB3YXJuaW5nOiAnaWNvbi13YXJuaW5nJyxcbiAgZXJyb3I6ICdpY29uLWVycm9yJyxcbiAgaW5mbzogJ2ljb24taW5mbydcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHJlc3VsdF9zcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxSZXN1bHQnLFxuICBjb21wb25lbnRzOiAocmVzdWx0X3NyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2NvbXBvbmVudHMgPSB7fSwgcmVzdWx0X3NyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2NvbXBvbmVudHNbaWNvbl9zdWNjZXNzLm5hbWVdID0gaWNvbl9zdWNjZXNzLCByZXN1bHRfc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfY29tcG9uZW50c1tpY29uX2Vycm9yLm5hbWVdID0gaWNvbl9lcnJvciwgcmVzdWx0X3NyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2NvbXBvbmVudHNbaWNvbl93YXJuaW5nLm5hbWVdID0gaWNvbl93YXJuaW5nLCByZXN1bHRfc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfY29tcG9uZW50c1tpY29uX2luZm8ubmFtZV0gPSBpY29uX2luZm8sIHJlc3VsdF9zcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19jb21wb25lbnRzKSxcbiAgcHJvcHM6IHtcbiAgICB0aXRsZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIHN1YlRpdGxlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgaWNvbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2luZm8nXG4gICAgfVxuICB9LFxuICBjb21wdXRlZDoge1xuICAgIGljb25FbGVtZW50OiBmdW5jdGlvbiBpY29uRWxlbWVudCgpIHtcbiAgICAgIHZhciBpY29uID0gdGhpcy5pY29uO1xuICAgICAgcmV0dXJuIGljb24gJiYgSWNvbk1hcFtpY29uXSA/IEljb25NYXBbaWNvbl0gOiAnaWNvbi1pbmZvJztcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yZXN1bHQvc3JjL2luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19yZXN1bHRfc3JjdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHJlc3VsdF9zcmN2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmVzdWx0L3NyYy9pbmRleC52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciByZXN1bHRfc3JjX2NvbXBvbmVudCA9IG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgcGFja2FnZXNfcmVzdWx0X3NyY3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgc3JjdnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQwOGIxMzlfcmVuZGVyLFxuICBzcmN2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDA4YjEzOV9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIHJlc3VsdF9zcmNfYXBpOyB9XG5yZXN1bHRfc3JjX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvcmVzdWx0L3NyYy9pbmRleC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcmVzdWx0X3NyYyA9IChyZXN1bHRfc3JjX2NvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcmVzdWx0L2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnJlc3VsdF9zcmMuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChyZXN1bHRfc3JjLm5hbWUsIHJlc3VsdF9zcmMpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfcmVzdWx0ID0gKHJlc3VsdF9zcmMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvaW5kZXguanNcbi8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5ICcuL2J1aWxkL2Jpbi9idWlsZC1lbnRyeS5qcycgKi9cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbnZhciBjb21wb25lbnRzID0gW3BhY2thZ2VzX3BhZ2luYXRpb24sIGRpYWxvZywgcGFja2FnZXNfYXV0b2NvbXBsZXRlLCBwYWNrYWdlc19kcm9wZG93biwgcGFja2FnZXNfZHJvcGRvd25fbWVudSwgcGFja2FnZXNfZHJvcGRvd25faXRlbSwgcGFja2FnZXNfbWVudSwgcGFja2FnZXNfc3VibWVudSwgcGFja2FnZXNfbWVudV9pdGVtLCBwYWNrYWdlc19tZW51X2l0ZW1fZ3JvdXAsIHBhY2thZ2VzX2lucHV0LCBwYWNrYWdlc19pbnB1dF9udW1iZXIsIHBhY2thZ2VzX3JhZGlvLCBwYWNrYWdlc19yYWRpb19ncm91cCwgcGFja2FnZXNfcmFkaW9fYnV0dG9uLCBwYWNrYWdlc19jaGVja2JveCwgcGFja2FnZXNfY2hlY2tib3hfYnV0dG9uLCBwYWNrYWdlc19jaGVja2JveF9ncm91cCwgcGFja2FnZXNfc3dpdGNoLCBwYWNrYWdlc19zZWxlY3QsIHBhY2thZ2VzX29wdGlvbiwgcGFja2FnZXNfb3B0aW9uX2dyb3VwLCBwYWNrYWdlc19idXR0b24sIHBhY2thZ2VzX2J1dHRvbl9ncm91cCwgcGFja2FnZXNfdGFibGUsIHBhY2thZ2VzX3RhYmxlX2NvbHVtbiwgcGFja2FnZXNfZGF0ZV9waWNrZXIsIHBhY2thZ2VzX3RpbWVfc2VsZWN0LCBwYWNrYWdlc190aW1lX3BpY2tlciwgcG9wb3ZlciwgcGFja2FnZXNfdG9vbHRpcCwgcGFja2FnZXNfYnJlYWRjcnVtYiwgcGFja2FnZXNfYnJlYWRjcnVtYl9pdGVtLCBwYWNrYWdlc19mb3JtLCBwYWNrYWdlc19mb3JtX2l0ZW0sIHBhY2thZ2VzX3RhYnMsIHBhY2thZ2VzX3RhYl9wYW5lLCBwYWNrYWdlc190YWcsIHBhY2thZ2VzX3RyZWUsIHBhY2thZ2VzX2FsZXJ0LCBzbGlkZXIsIHBhY2thZ2VzX2ljb24sIHBhY2thZ2VzX3JvdywgcGFja2FnZXNfY29sLCBwYWNrYWdlc191cGxvYWQsIHBhY2thZ2VzX3Byb2dyZXNzLCBwYWNrYWdlc19zcGlubmVyLCBiYWRnZSwgY2FyZCwgcGFja2FnZXNfcmF0ZSwgcGFja2FnZXNfc3RlcHMsIHBhY2thZ2VzX3N0ZXAsIGNhcm91c2VsLCBzY3JvbGxiYXIsIGNhcm91c2VsX2l0ZW0sIHBhY2thZ2VzX2NvbGxhcHNlLCBwYWNrYWdlc19jb2xsYXBzZV9pdGVtLCBwYWNrYWdlc19jYXNjYWRlciwgY29sb3JfcGlja2VyLCB0cmFuc2ZlciwgcGFja2FnZXNfY29udGFpbmVyLCBoZWFkZXIsIGFzaWRlLCBwYWNrYWdlc19tYWluLCBmb290ZXIsIHRpbWVsaW5lLCB0aW1lbGluZV9pdGVtLCBwYWNrYWdlc19saW5rLCBkaXZpZGVyLCBwYWNrYWdlc19pbWFnZSwgY2FsZW5kYXIsIGJhY2t0b3AsIHBhZ2VfaGVhZGVyLCBwYWNrYWdlc19jYXNjYWRlcl9wYW5lbCwgYXZhdGFyLCBkcmF3ZXIsIHN0YXRpc3RpYywgcG9wY29uZmlybSwgc2tlbGV0b24sIHNrZWxldG9uX2l0ZW0sIGVtcHR5LCBkZXNjcmlwdGlvbnMsIHBhY2thZ2VzX2Rlc2NyaXB0aW9uc19pdGVtLCBwYWNrYWdlc19yZXN1bHQsIGNvbGxhcHNlX3RyYW5zaXRpb25fZGVmYXVsdC5hXTtcblxudmFyIHNyY19pbnN0YWxsID0gZnVuY3Rpb24gaW5zdGFsbChWdWUpIHtcbiAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gIGxpYl9sb2NhbGVfZGVmYXVsdC5hLnVzZShvcHRzLmxvY2FsZSk7XG4gIGxpYl9sb2NhbGVfZGVmYXVsdC5hLmkxOG4ob3B0cy5pMThuKTtcblxuICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgIFZ1ZS5jb21wb25lbnQoY29tcG9uZW50Lm5hbWUsIGNvbXBvbmVudCk7XG4gIH0pO1xuXG4gIFZ1ZS51c2UoaW5maW5pdGVfc2Nyb2xsKTtcbiAgVnVlLnVzZShwYWNrYWdlc19sb2FkaW5nLmRpcmVjdGl2ZSk7XG5cbiAgVnVlLnByb3RvdHlwZS4kRUxFTUVOVCA9IHtcbiAgICBzaXplOiBvcHRzLnNpemUgfHwgJycsXG4gICAgekluZGV4OiBvcHRzLnpJbmRleCB8fCAyMDAwXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kbG9hZGluZyA9IHBhY2thZ2VzX2xvYWRpbmcuc2VydmljZTtcbiAgVnVlLnByb3RvdHlwZS4kbXNnYm94ID0gbWVzc2FnZV9ib3g7XG4gIFZ1ZS5wcm90b3R5cGUuJGFsZXJ0ID0gbWVzc2FnZV9ib3guYWxlcnQ7XG4gIFZ1ZS5wcm90b3R5cGUuJGNvbmZpcm0gPSBtZXNzYWdlX2JveC5jb25maXJtO1xuICBWdWUucHJvdG90eXBlLiRwcm9tcHQgPSBtZXNzYWdlX2JveC5wcm9tcHQ7XG4gIFZ1ZS5wcm90b3R5cGUuJG5vdGlmeSA9IG5vdGlmaWNhdGlvbjtcbiAgVnVlLnByb3RvdHlwZS4kbWVzc2FnZSA9IHBhY2thZ2VzX21lc3NhZ2U7XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuVnVlKSB7XG4gIHNyY19pbnN0YWxsKHdpbmRvdy5WdWUpO1xufVxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfMCA9IF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHtcbiAgdmVyc2lvbjogJzIuMTUuMTMnLFxuICBsb2NhbGU6IGxpYl9sb2NhbGVfZGVmYXVsdC5hLnVzZSxcbiAgaTE4bjogbGliX2xvY2FsZV9kZWZhdWx0LmEuaTE4bixcbiAgaW5zdGFsbDogc3JjX2luc3RhbGwsXG4gIENvbGxhcHNlVHJhbnNpdGlvbjogY29sbGFwc2VfdHJhbnNpdGlvbl9kZWZhdWx0LmEsXG4gIExvYWRpbmc6IHBhY2thZ2VzX2xvYWRpbmcsXG4gIFBhZ2luYXRpb246IHBhY2thZ2VzX3BhZ2luYXRpb24sXG4gIERpYWxvZzogZGlhbG9nLFxuICBBdXRvY29tcGxldGU6IHBhY2thZ2VzX2F1dG9jb21wbGV0ZSxcbiAgRHJvcGRvd246IHBhY2thZ2VzX2Ryb3Bkb3duLFxuICBEcm9wZG93bk1lbnU6IHBhY2thZ2VzX2Ryb3Bkb3duX21lbnUsXG4gIERyb3Bkb3duSXRlbTogcGFja2FnZXNfZHJvcGRvd25faXRlbSxcbiAgTWVudTogcGFja2FnZXNfbWVudSxcbiAgU3VibWVudTogcGFja2FnZXNfc3VibWVudSxcbiAgTWVudUl0ZW06IHBhY2thZ2VzX21lbnVfaXRlbSxcbiAgTWVudUl0ZW1Hcm91cDogcGFja2FnZXNfbWVudV9pdGVtX2dyb3VwLFxuICBJbnB1dDogcGFja2FnZXNfaW5wdXQsXG4gIElucHV0TnVtYmVyOiBwYWNrYWdlc19pbnB1dF9udW1iZXIsXG4gIFJhZGlvOiBwYWNrYWdlc19yYWRpbyxcbiAgUmFkaW9Hcm91cDogcGFja2FnZXNfcmFkaW9fZ3JvdXAsXG4gIFJhZGlvQnV0dG9uOiBwYWNrYWdlc19yYWRpb19idXR0b24sXG4gIENoZWNrYm94OiBwYWNrYWdlc19jaGVja2JveCxcbiAgQ2hlY2tib3hCdXR0b246IHBhY2thZ2VzX2NoZWNrYm94X2J1dHRvbixcbiAgQ2hlY2tib3hHcm91cDogcGFja2FnZXNfY2hlY2tib3hfZ3JvdXAsXG4gIFN3aXRjaDogcGFja2FnZXNfc3dpdGNoLFxuICBTZWxlY3Q6IHBhY2thZ2VzX3NlbGVjdCxcbiAgT3B0aW9uOiBwYWNrYWdlc19vcHRpb24sXG4gIE9wdGlvbkdyb3VwOiBwYWNrYWdlc19vcHRpb25fZ3JvdXAsXG4gIEJ1dHRvbjogcGFja2FnZXNfYnV0dG9uLFxuICBCdXR0b25Hcm91cDogcGFja2FnZXNfYnV0dG9uX2dyb3VwLFxuICBUYWJsZTogcGFja2FnZXNfdGFibGUsXG4gIFRhYmxlQ29sdW1uOiBwYWNrYWdlc190YWJsZV9jb2x1bW4sXG4gIERhdGVQaWNrZXI6IHBhY2thZ2VzX2RhdGVfcGlja2VyLFxuICBUaW1lU2VsZWN0OiBwYWNrYWdlc190aW1lX3NlbGVjdCxcbiAgVGltZVBpY2tlcjogcGFja2FnZXNfdGltZV9waWNrZXIsXG4gIFBvcG92ZXI6IHBvcG92ZXIsXG4gIFRvb2x0aXA6IHBhY2thZ2VzX3Rvb2x0aXAsXG4gIE1lc3NhZ2VCb3g6IG1lc3NhZ2VfYm94LFxuICBCcmVhZGNydW1iOiBwYWNrYWdlc19icmVhZGNydW1iLFxuICBCcmVhZGNydW1iSXRlbTogcGFja2FnZXNfYnJlYWRjcnVtYl9pdGVtLFxuICBGb3JtOiBwYWNrYWdlc19mb3JtLFxuICBGb3JtSXRlbTogcGFja2FnZXNfZm9ybV9pdGVtLFxuICBUYWJzOiBwYWNrYWdlc190YWJzLFxuICBUYWJQYW5lOiBwYWNrYWdlc190YWJfcGFuZSxcbiAgVGFnOiBwYWNrYWdlc190YWcsXG4gIFRyZWU6IHBhY2thZ2VzX3RyZWUsXG4gIEFsZXJ0OiBwYWNrYWdlc19hbGVydCxcbiAgTm90aWZpY2F0aW9uOiBub3RpZmljYXRpb24sXG4gIFNsaWRlcjogc2xpZGVyLFxuICBJY29uOiBwYWNrYWdlc19pY29uLFxuICBSb3c6IHBhY2thZ2VzX3JvdyxcbiAgQ29sOiBwYWNrYWdlc19jb2wsXG4gIFVwbG9hZDogcGFja2FnZXNfdXBsb2FkLFxuICBQcm9ncmVzczogcGFja2FnZXNfcHJvZ3Jlc3MsXG4gIFNwaW5uZXI6IHBhY2thZ2VzX3NwaW5uZXIsXG4gIE1lc3NhZ2U6IHBhY2thZ2VzX21lc3NhZ2UsXG4gIEJhZGdlOiBiYWRnZSxcbiAgQ2FyZDogY2FyZCxcbiAgUmF0ZTogcGFja2FnZXNfcmF0ZSxcbiAgU3RlcHM6IHBhY2thZ2VzX3N0ZXBzLFxuICBTdGVwOiBwYWNrYWdlc19zdGVwLFxuICBDYXJvdXNlbDogY2Fyb3VzZWwsXG4gIFNjcm9sbGJhcjogc2Nyb2xsYmFyLFxuICBDYXJvdXNlbEl0ZW06IGNhcm91c2VsX2l0ZW0sXG4gIENvbGxhcHNlOiBwYWNrYWdlc19jb2xsYXBzZSxcbiAgQ29sbGFwc2VJdGVtOiBwYWNrYWdlc19jb2xsYXBzZV9pdGVtLFxuICBDYXNjYWRlcjogcGFja2FnZXNfY2FzY2FkZXIsXG4gIENvbG9yUGlja2VyOiBjb2xvcl9waWNrZXIsXG4gIFRyYW5zZmVyOiB0cmFuc2ZlcixcbiAgQ29udGFpbmVyOiBwYWNrYWdlc19jb250YWluZXIsXG4gIEhlYWRlcjogaGVhZGVyLFxuICBBc2lkZTogYXNpZGUsXG4gIE1haW46IHBhY2thZ2VzX21haW4sXG4gIEZvb3RlcjogZm9vdGVyLFxuICBUaW1lbGluZTogdGltZWxpbmUsXG4gIFRpbWVsaW5lSXRlbTogdGltZWxpbmVfaXRlbSxcbiAgTGluazogcGFja2FnZXNfbGluayxcbiAgRGl2aWRlcjogZGl2aWRlcixcbiAgSW1hZ2U6IHBhY2thZ2VzX2ltYWdlLFxuICBDYWxlbmRhcjogY2FsZW5kYXIsXG4gIEJhY2t0b3A6IGJhY2t0b3AsXG4gIEluZmluaXRlU2Nyb2xsOiBpbmZpbml0ZV9zY3JvbGwsXG4gIFBhZ2VIZWFkZXI6IHBhZ2VfaGVhZGVyLFxuICBDYXNjYWRlclBhbmVsOiBwYWNrYWdlc19jYXNjYWRlcl9wYW5lbCxcbiAgQXZhdGFyOiBhdmF0YXIsXG4gIERyYXdlcjogZHJhd2VyLFxuICBTdGF0aXN0aWM6IHN0YXRpc3RpYyxcbiAgUG9wY29uZmlybTogcG9wY29uZmlybSxcbiAgU2tlbGV0b246IHNrZWxldG9uLFxuICBTa2VsZXRvbkl0ZW06IHNrZWxldG9uX2l0ZW0sXG4gIEVtcHR5OiBlbXB0eSxcbiAgRGVzY3JpcHRpb25zOiBkZXNjcmlwdGlvbnMsXG4gIERlc2NyaXB0aW9uc0l0ZW06IHBhY2thZ2VzX2Rlc2NyaXB0aW9uc19pdGVtLFxuICBSZXN1bHQ6IHBhY2thZ2VzX3Jlc3VsdFxufSk7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKVtcImRlZmF1bHRcIl07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5c96\n')},6167:function(module,exports,__webpack_require__){"use strict";eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/**\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version {{version}}\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n//\n// Cross module loader\n// Supported: Node, AMD, Browser globals\n//\n;(function (root, factory) {\n if (true) {\n // AMD. Register as an anonymous module.\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n})(undefined, function () {\n\n 'use strict';\n\n var root = window;\n\n // default options\n var DEFAULTS = {\n // placement of the popper\n placement: 'bottom',\n\n gpuAcceleration: true,\n\n // shift popper from its origin by the given amount of pixels (can be negative)\n offset: 0,\n\n // the element which will act as boundary of the popper\n boundariesElement: 'viewport',\n\n // amount of pixel used to define a minimum distance between the boundaries and the popper\n boundariesPadding: 5,\n\n // popper will try to prevent overflow following this order,\n // by default, then, it could overflow on the left and on top of the boundariesElement\n preventOverflowOrder: ['left', 'right', 'top', 'bottom'],\n\n // the behavior used by flip to change the placement of the popper\n flipBehavior: 'flip',\n\n arrowElement: '[x-arrow]',\n\n arrowOffset: 0,\n\n // list of functions used to modify the offsets before they are applied to the popper\n modifiers: ['shift', 'offset', 'preventOverflow', 'keepTogether', 'arrow', 'flip', 'applyStyle'],\n\n modifiersIgnored: [],\n\n forceAbsolute: false\n };\n\n /**\n * Create a new Popper.js instance\n * @constructor Popper\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement|Object} popper\n * The HTML element used as popper, or a configuration used to generate the popper.\n * @param {String} [popper.tagName='div'] The tag name of the generated popper.\n * @param {Array} [popper.classNames=['popper']] Array of classes to apply to the generated popper.\n * @param {Array} [popper.attributes] Array of attributes to apply, specify `attr:value` to assign a value to it.\n * @param {HTMLElement|String} [popper.parent=window.document.body] The parent element, given as HTMLElement or as query string.\n * @param {String} [popper.content=''] The content of the popper, it can be text, html, or node; if it is not text, set `contentType` to `html` or `node`.\n * @param {String} [popper.contentType='text'] If `html`, the `content` will be parsed as HTML. If `node`, it will be appended as-is.\n * @param {String} [popper.arrowTagName='div'] Same as `popper.tagName` but for the arrow element.\n * @param {Array} [popper.arrowClassNames='popper__arrow'] Same as `popper.classNames` but for the arrow element.\n * @param {String} [popper.arrowAttributes=['x-arrow']] Same as `popper.attributes` but for the arrow element.\n * @param {Object} options\n * @param {String} [options.placement=bottom]\n * Placement of the popper accepted values: `top(-start, -end), right(-start, -end), bottom(-start, -right),\n * left(-start, -end)`\n *\n * @param {HTMLElement|String} [options.arrowElement='[x-arrow]']\n * The DOM Node used as arrow for the popper, or a CSS selector used to get the DOM node. It must be child of\n * its parent Popper. Popper.js will apply to the given element the style required to align the arrow with its\n * reference element.\n * By default, it will look for a child node of the popper with the `x-arrow` attribute.\n *\n * @param {Boolean} [options.gpuAcceleration=true]\n * When this property is set to true, the popper position will be applied using CSS3 translate3d, allowing the\n * browser to use the GPU to accelerate the rendering.\n * If set to false, the popper will be placed using `top` and `left` properties, not using the GPU.\n *\n * @param {Number} [options.offset=0]\n * Amount of pixels the popper will be shifted (can be negative).\n *\n * @param {String|Element} [options.boundariesElement='viewport']\n * The element which will define the boundaries of the popper position, the popper will never be placed outside\n * of the defined boundaries (except if `keepTogether` is enabled)\n *\n * @param {Number} [options.boundariesPadding=5]\n * Additional padding for the boundaries\n *\n * @param {Array} [options.preventOverflowOrder=['left', 'right', 'top', 'bottom']]\n * Order used when Popper.js tries to avoid overflows from the boundaries, they will be checked in order,\n * this means that the last ones will never overflow\n *\n * @param {String|Array} [options.flipBehavior='flip']\n * The behavior used by the `flip` modifier to change the placement of the popper when the latter is trying to\n * overlap its reference element. Defining `flip` as value, the placement will be flipped on\n * its axis (`right - left`, `top - bottom`).\n * You can even pass an array of placements (eg: `['right', 'left', 'top']` ) to manually specify\n * how alter the placement when a flip is needed. (eg. in the above example, it would first flip from right to left,\n * then, if even in its new placement, the popper is overlapping its reference element, it will be moved to top)\n *\n * @param {Array} [options.modifiers=[ 'shift', 'offset', 'preventOverflow', 'keepTogether', 'arrow', 'flip', 'applyStyle']]\n * List of functions used to modify the data before they are applied to the popper, add your custom functions\n * to this array to edit the offsets and placement.\n * The function should reflect the @params and @returns of preventOverflow\n *\n * @param {Array} [options.modifiersIgnored=[]]\n * Put here any built-in modifier name you want to exclude from the modifiers list\n * The function should reflect the @params and @returns of preventOverflow\n *\n * @param {Boolean} [options.removeOnDestroy=false]\n * Set to true if you want to automatically remove the popper when you call the `destroy` method.\n */\n function Popper(reference, popper, options) {\n this._reference = reference.jquery ? reference[0] : reference;\n this.state = {};\n\n // if the popper variable is a configuration object, parse it to generate an HTMLElement\n // generate a default popper if is not defined\n var isNotDefined = typeof popper === 'undefined' || popper === null;\n var isConfig = popper && Object.prototype.toString.call(popper) === '[object Object]';\n if (isNotDefined || isConfig) {\n this._popper = this.parse(isConfig ? popper : {});\n }\n // otherwise, use the given HTMLElement as popper\n else {\n this._popper = popper.jquery ? popper[0] : popper;\n }\n\n // with {} we create a new object with the options inside it\n this._options = Object.assign({}, DEFAULTS, options);\n\n // refactoring modifiers' list\n this._options.modifiers = this._options.modifiers.map(function (modifier) {\n // remove ignored modifiers\n if (this._options.modifiersIgnored.indexOf(modifier) !== -1) return;\n\n // set the x-placement attribute before everything else because it could be used to add margins to the popper\n // margins needs to be calculated to get the correct popper offsets\n if (modifier === 'applyStyle') {\n this._popper.setAttribute('x-placement', this._options.placement);\n }\n\n // return predefined modifier identified by string or keep the custom one\n return this.modifiers[modifier] || modifier;\n }.bind(this));\n\n // make sure to apply the popper position before any computation\n this.state.position = this._getPosition(this._popper, this._reference);\n setStyle(this._popper, { position: this.state.position, top: 0 });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n // setup event listeners, they will take care of update the position in specific situations\n this._setupEventListeners();\n return this;\n }\n\n //\n // Methods\n //\n /**\n * Destroy the popper\n * @method\n * @memberof Popper\n */\n Popper.prototype.destroy = function () {\n this._popper.removeAttribute('x-placement');\n this._popper.style.left = '';\n this._popper.style.position = '';\n this._popper.style.top = '';\n this._popper.style[getSupportedPropertyName('transform')] = '';\n this._removeEventListeners();\n\n // remove the popper if user explicity asked for the deletion on destroy\n if (this._options.removeOnDestroy) {\n this._popper.remove();\n }\n return this;\n };\n\n /**\n * Updates the position of the popper, computing the new offsets and applying the new style\n * @method\n * @memberof Popper\n */\n Popper.prototype.update = function () {\n var data = { instance: this, styles: {} };\n\n // store placement inside the data object, modifiers will be able to edit `placement` if needed\n // and refer to _originalPlacement to know the original value\n data.placement = this._options.placement;\n data._originalPlacement = this._options.placement;\n\n // compute the popper and reference offsets and put them inside data.offsets\n data.offsets = this._getOffsets(this._popper, this._reference, data.placement);\n\n // get boundaries\n data.boundaries = this._getBoundaries(data, this._options.boundariesPadding, this._options.boundariesElement);\n\n data = this.runModifiers(data, this._options.modifiers);\n\n if (typeof this.state.updateCallback === 'function') {\n this.state.updateCallback(data);\n }\n };\n\n /**\n * If a function is passed, it will be executed after the initialization of popper with as first argument the Popper instance.\n * @method\n * @memberof Popper\n * @param {Function} callback\n */\n Popper.prototype.onCreate = function (callback) {\n // the createCallbacks return as first argument the popper instance\n callback(this);\n return this;\n };\n\n /**\n * If a function is passed, it will be executed after each update of popper with as first argument the set of coordinates and informations\n * used to style popper and its arrow.\n * NOTE: it doesn't get fired on the first call of the `Popper.update()` method inside the `Popper` constructor!\n * @method\n * @memberof Popper\n * @param {Function} callback\n */\n Popper.prototype.onUpdate = function (callback) {\n this.state.updateCallback = callback;\n return this;\n };\n\n /**\n * Helper used to generate poppers from a configuration file\n * @method\n * @memberof Popper\n * @param config {Object} configuration\n * @returns {HTMLElement} popper\n */\n Popper.prototype.parse = function (config) {\n var defaultConfig = {\n tagName: 'div',\n classNames: ['popper'],\n attributes: [],\n parent: root.document.body,\n content: '',\n contentType: 'text',\n arrowTagName: 'div',\n arrowClassNames: ['popper__arrow'],\n arrowAttributes: ['x-arrow']\n };\n config = Object.assign({}, defaultConfig, config);\n\n var d = root.document;\n\n var popper = d.createElement(config.tagName);\n addClassNames(popper, config.classNames);\n addAttributes(popper, config.attributes);\n if (config.contentType === 'node') {\n popper.appendChild(config.content.jquery ? config.content[0] : config.content);\n } else if (config.contentType === 'html') {\n popper.innerHTML = config.content;\n } else {\n popper.textContent = config.content;\n }\n\n if (config.arrowTagName) {\n var arrow = d.createElement(config.arrowTagName);\n addClassNames(arrow, config.arrowClassNames);\n addAttributes(arrow, config.arrowAttributes);\n popper.appendChild(arrow);\n }\n\n var parent = config.parent.jquery ? config.parent[0] : config.parent;\n\n // if the given parent is a string, use it to match an element\n // if more than one element is matched, the first one will be used as parent\n // if no elements are matched, the script will throw an error\n if (typeof parent === 'string') {\n parent = d.querySelectorAll(config.parent);\n if (parent.length > 1) {\n console.warn('WARNING: the given `parent` query(' + config.parent + ') matched more than one element, the first one will be used');\n }\n if (parent.length === 0) {\n throw 'ERROR: the given `parent` doesn\\'t exists!';\n }\n parent = parent[0];\n }\n // if the given parent is a DOM nodes list or an array of nodes with more than one element,\n // the first one will be used as parent\n if (parent.length > 1 && parent instanceof Element === false) {\n console.warn('WARNING: you have passed as parent a list of elements, the first one will be used');\n parent = parent[0];\n }\n\n // append the generated popper to its parent\n parent.appendChild(popper);\n\n return popper;\n\n /**\n * Adds class names to the given element\n * @function\n * @ignore\n * @param {HTMLElement} target\n * @param {Array} classes\n */\n function addClassNames(element, classNames) {\n classNames.forEach(function (className) {\n element.classList.add(className);\n });\n }\n\n /**\n * Adds attributes to the given element\n * @function\n * @ignore\n * @param {HTMLElement} target\n * @param {Array} attributes\n * @example\n * addAttributes(element, [ 'data-info:foobar' ]);\n */\n function addAttributes(element, attributes) {\n attributes.forEach(function (attribute) {\n element.setAttribute(attribute.split(':')[0], attribute.split(':')[1] || '');\n });\n }\n };\n\n /**\n * Helper used to get the position which will be applied to the popper\n * @method\n * @memberof Popper\n * @param config {HTMLElement} popper element\n * @param reference {HTMLElement} reference element\n * @returns {String} position\n */\n Popper.prototype._getPosition = function (popper, reference) {\n var container = getOffsetParent(reference);\n\n if (this._options.forceAbsolute) {\n return 'absolute';\n }\n\n // Decide if the popper will be fixed\n // If the reference element is inside a fixed context, the popper will be fixed as well to allow them to scroll together\n var isParentFixed = isFixed(reference, container);\n return isParentFixed ? 'fixed' : 'absolute';\n };\n\n /**\n * Get offsets to the popper\n * @method\n * @memberof Popper\n * @access private\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\n Popper.prototype._getOffsets = function (popper, reference, placement) {\n placement = placement.split('-')[0];\n var popperOffsets = {};\n\n popperOffsets.position = this.state.position;\n var isParentFixed = popperOffsets.position === 'fixed';\n\n //\n // Get reference element position\n //\n var referenceOffsets = getOffsetRectRelativeToCustomParent(reference, getOffsetParent(popper), isParentFixed);\n\n //\n // Get popper sizes\n //\n var popperRect = getOuterSizes(popper);\n\n //\n // Compute offsets of popper\n //\n\n // depending by the popper placement we have to compute its offsets slightly differently\n if (['right', 'left'].indexOf(placement) !== -1) {\n popperOffsets.top = referenceOffsets.top + referenceOffsets.height / 2 - popperRect.height / 2;\n if (placement === 'left') {\n popperOffsets.left = referenceOffsets.left - popperRect.width;\n } else {\n popperOffsets.left = referenceOffsets.right;\n }\n } else {\n popperOffsets.left = referenceOffsets.left + referenceOffsets.width / 2 - popperRect.width / 2;\n if (placement === 'top') {\n popperOffsets.top = referenceOffsets.top - popperRect.height;\n } else {\n popperOffsets.top = referenceOffsets.bottom;\n }\n }\n\n // Add width and height to our offsets object\n popperOffsets.width = popperRect.width;\n popperOffsets.height = popperRect.height;\n\n return {\n popper: popperOffsets,\n reference: referenceOffsets\n };\n };\n\n /**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper\n * @access private\n */\n Popper.prototype._setupEventListeners = function () {\n // NOTE: 1 DOM access here\n this.state.updateBound = this.update.bind(this);\n root.addEventListener('resize', this.state.updateBound);\n // if the boundariesElement is window we don't need to listen for the scroll event\n if (this._options.boundariesElement !== 'window') {\n var target = getScrollParent(this._reference);\n // here it could be both `body` or `documentElement` thanks to Firefox, we then check both\n if (target === root.document.body || target === root.document.documentElement) {\n target = root;\n }\n target.addEventListener('scroll', this.state.updateBound);\n this.state.scrollTarget = target;\n }\n };\n\n /**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper\n * @access private\n */\n Popper.prototype._removeEventListeners = function () {\n // NOTE: 1 DOM access here\n root.removeEventListener('resize', this.state.updateBound);\n if (this._options.boundariesElement !== 'window' && this.state.scrollTarget) {\n this.state.scrollTarget.removeEventListener('scroll', this.state.updateBound);\n this.state.scrollTarget = null;\n }\n this.state.updateBound = null;\n };\n\n /**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper\n * @access private\n * @param {Object} data - Object containing the property \"offsets\" generated by `_getOffsets`\n * @param {Number} padding - Boundaries padding\n * @param {Element} boundariesElement - Element used to define the boundaries\n * @returns {Object} Coordinates of the boundaries\n */\n Popper.prototype._getBoundaries = function (data, padding, boundariesElement) {\n // NOTE: 1 DOM access here\n var boundaries = {};\n var width, height;\n if (boundariesElement === 'window') {\n var body = root.document.body,\n html = root.document.documentElement;\n\n height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n width = Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth);\n\n boundaries = {\n top: 0,\n right: width,\n bottom: height,\n left: 0\n };\n } else if (boundariesElement === 'viewport') {\n var offsetParent = getOffsetParent(this._popper);\n var scrollParent = getScrollParent(this._popper);\n var offsetParentRect = getOffsetRect(offsetParent);\n\n // Thanks the fucking native API, `document.body.scrollTop` & `document.documentElement.scrollTop`\n var getScrollTopValue = function getScrollTopValue(element) {\n return element == document.body ? Math.max(document.documentElement.scrollTop, document.body.scrollTop) : element.scrollTop;\n };\n var getScrollLeftValue = function getScrollLeftValue(element) {\n return element == document.body ? Math.max(document.documentElement.scrollLeft, document.body.scrollLeft) : element.scrollLeft;\n };\n\n // if the popper is fixed we don't have to substract scrolling from the boundaries\n var scrollTop = data.offsets.popper.position === 'fixed' ? 0 : getScrollTopValue(scrollParent);\n var scrollLeft = data.offsets.popper.position === 'fixed' ? 0 : getScrollLeftValue(scrollParent);\n\n boundaries = {\n top: 0 - (offsetParentRect.top - scrollTop),\n right: root.document.documentElement.clientWidth - (offsetParentRect.left - scrollLeft),\n bottom: root.document.documentElement.clientHeight - (offsetParentRect.top - scrollTop),\n left: 0 - (offsetParentRect.left - scrollLeft)\n };\n } else {\n if (getOffsetParent(this._popper) === boundariesElement) {\n boundaries = {\n top: 0,\n left: 0,\n right: boundariesElement.clientWidth,\n bottom: boundariesElement.clientHeight\n };\n } else {\n boundaries = getOffsetRect(boundariesElement);\n }\n }\n boundaries.left += padding;\n boundaries.right -= padding;\n boundaries.top = boundaries.top + padding;\n boundaries.bottom = boundaries.bottom - padding;\n return boundaries;\n };\n\n /**\n * Loop trough the list of modifiers and run them in order, each of them will then edit the data object\n * @method\n * @memberof Popper\n * @access public\n * @param {Object} data\n * @param {Array} modifiers\n * @param {Function} ends\n */\n Popper.prototype.runModifiers = function (data, modifiers, ends) {\n var modifiersToRun = modifiers.slice();\n if (ends !== undefined) {\n modifiersToRun = this._options.modifiers.slice(0, getArrayKeyIndex(this._options.modifiers, ends));\n }\n\n modifiersToRun.forEach(function (modifier) {\n if (isFunction(modifier)) {\n data = modifier.call(this, data);\n }\n }.bind(this));\n\n return data;\n };\n\n /**\n * Helper used to know if the given modifier depends from another one.\n * @method\n * @memberof Popper\n * @param {String} requesting - name of requesting modifier\n * @param {String} requested - name of requested modifier\n * @returns {Boolean}\n */\n Popper.prototype.isModifierRequired = function (requesting, requested) {\n var index = getArrayKeyIndex(this._options.modifiers, requesting);\n return !!this._options.modifiers.slice(0, index).filter(function (modifier) {\n return modifier === requested;\n }).length;\n };\n\n //\n // Modifiers\n //\n\n /**\n * Modifiers list\n * @namespace Popper.modifiers\n * @memberof Popper\n * @type {Object}\n */\n Popper.prototype.modifiers = {};\n\n /**\n * Apply the computed styles to the popper element\n * @method\n * @memberof Popper.modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @returns {Object} The same data object\n */\n Popper.prototype.modifiers.applyStyle = function (data) {\n // apply the final offsets to the popper\n // NOTE: 1 DOM access here\n var styles = {\n position: data.offsets.popper.position\n };\n\n // round top and left to avoid blurry text\n var left = Math.round(data.offsets.popper.left);\n var top = Math.round(data.offsets.popper.top);\n\n // if gpuAcceleration is set to true and transform is supported, we use `translate3d` to apply the position to the popper\n // we automatically use the supported prefixed version if needed\n var prefixedProperty;\n if (this._options.gpuAcceleration && (prefixedProperty = getSupportedPropertyName('transform'))) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles.top = 0;\n styles.left = 0;\n }\n // othwerise, we use the standard `left` and `top` properties\n else {\n styles.left = left;\n styles.top = top;\n }\n\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n Object.assign(styles, data.styles);\n\n setStyle(this._popper, styles);\n\n // set an attribute which will be useful to style the tooltip (use it to properly position its arrow)\n // NOTE: 1 DOM access here\n this._popper.setAttribute('x-placement', data.placement);\n\n // if the arrow modifier is required and the arrow style has been computed, apply the arrow style\n if (this.isModifierRequired(this.modifiers.applyStyle, this.modifiers.arrow) && data.offsets.arrow) {\n setStyle(data.arrowElement, data.offsets.arrow);\n }\n\n return data;\n };\n\n /**\n * Modifier used to shift the popper on the start or end of its reference element side\n * @method\n * @memberof Popper.modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @returns {Object} The data object, properly modified\n */\n Popper.prototype.modifiers.shift = function (data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftVariation = placement.split('-')[1];\n\n // if shift shiftVariation is specified, run the modifier\n if (shiftVariation) {\n var reference = data.offsets.reference;\n var popper = getPopperClientRect(data.offsets.popper);\n\n var shiftOffsets = {\n y: {\n start: { top: reference.top },\n end: { top: reference.top + reference.height - popper.height }\n },\n x: {\n start: { left: reference.left },\n end: { left: reference.left + reference.width - popper.width }\n }\n };\n\n var axis = ['bottom', 'top'].indexOf(basePlacement) !== -1 ? 'x' : 'y';\n\n data.offsets.popper = Object.assign(popper, shiftOffsets[axis][shiftVariation]);\n }\n\n return data;\n };\n\n /**\n * Modifier used to make sure the popper does not overflows from it's boundaries\n * @method\n * @memberof Popper.modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @returns {Object} The data object, properly modified\n */\n Popper.prototype.modifiers.preventOverflow = function (data) {\n var order = this._options.preventOverflowOrder;\n var popper = getPopperClientRect(data.offsets.popper);\n\n var check = {\n left: function left() {\n var left = popper.left;\n if (popper.left < data.boundaries.left) {\n left = Math.max(popper.left, data.boundaries.left);\n }\n return { left: left };\n },\n right: function right() {\n var left = popper.left;\n if (popper.right > data.boundaries.right) {\n left = Math.min(popper.left, data.boundaries.right - popper.width);\n }\n return { left: left };\n },\n top: function top() {\n var top = popper.top;\n if (popper.top < data.boundaries.top) {\n top = Math.max(popper.top, data.boundaries.top);\n }\n return { top: top };\n },\n bottom: function bottom() {\n var top = popper.top;\n if (popper.bottom > data.boundaries.bottom) {\n top = Math.min(popper.top, data.boundaries.bottom - popper.height);\n }\n return { top: top };\n }\n };\n\n order.forEach(function (direction) {\n data.offsets.popper = Object.assign(popper, check[direction]());\n });\n\n return data;\n };\n\n /**\n * Modifier used to make sure the popper is always near its reference\n * @method\n * @memberof Popper.modifiers\n * @argument {Object} data - The data object generated by _update method\n * @returns {Object} The data object, properly modified\n */\n Popper.prototype.modifiers.keepTogether = function (data) {\n var popper = getPopperClientRect(data.offsets.popper);\n var reference = data.offsets.reference;\n var f = Math.floor;\n\n if (popper.right < f(reference.left)) {\n data.offsets.popper.left = f(reference.left) - popper.width;\n }\n if (popper.left > f(reference.right)) {\n data.offsets.popper.left = f(reference.right);\n }\n if (popper.bottom < f(reference.top)) {\n data.offsets.popper.top = f(reference.top) - popper.height;\n }\n if (popper.top > f(reference.bottom)) {\n data.offsets.popper.top = f(reference.bottom);\n }\n\n return data;\n };\n\n /**\n * Modifier used to flip the placement of the popper when the latter is starting overlapping its reference element.\n * Requires the `preventOverflow` modifier before it in order to work.\n * **NOTE:** This modifier will run all its previous modifiers everytime it tries to flip the popper!\n * @method\n * @memberof Popper.modifiers\n * @argument {Object} data - The data object generated by _update method\n * @returns {Object} The data object, properly modified\n */\n Popper.prototype.modifiers.flip = function (data) {\n // check if preventOverflow is in the list of modifiers before the flip modifier.\n // otherwise flip would not work as expected.\n if (!this.isModifierRequired(this.modifiers.flip, this.modifiers.preventOverflow)) {\n console.warn('WARNING: preventOverflow modifier is required by flip modifier in order to work, be sure to include it before flip!');\n return data;\n }\n\n if (data.flipped && data.placement === data._originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n if (this._options.flipBehavior === 'flip') {\n flipOrder = [placement, placementOpposite];\n } else {\n flipOrder = this._options.flipBehavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = getPopperClientRect(data.offsets.popper);\n\n // this boolean is used to distinguish right and bottom from top and left\n // they need different computations to get flipped\n var a = ['right', 'bottom'].indexOf(placement) !== -1;\n\n // using Math.floor because the reference offsets may contain decimals we are not going to consider here\n if (a && Math.floor(data.offsets.reference[placement]) > Math.floor(popperOffsets[placementOpposite]) || !a && Math.floor(data.offsets.reference[placement]) < Math.floor(popperOffsets[placementOpposite])) {\n // we'll use this boolean to detect any flip loop\n data.flipped = true;\n data.placement = flipOrder[index + 1];\n if (variation) {\n data.placement += '-' + variation;\n }\n data.offsets.popper = this._getOffsets(this._popper, this._reference, data.placement).popper;\n\n data = this.runModifiers(data, this._options.modifiers, this._flip);\n }\n }.bind(this));\n return data;\n };\n\n /**\n * Modifier used to add an offset to the popper, useful if you more granularity positioning your popper.\n * The offsets will shift the popper on the side of its reference element.\n * @method\n * @memberof Popper.modifiers\n * @argument {Object} data - The data object generated by _update method\n * @returns {Object} The data object, properly modified\n */\n Popper.prototype.modifiers.offset = function (data) {\n var offset = this._options.offset;\n var popper = data.offsets.popper;\n\n if (data.placement.indexOf('left') !== -1) {\n popper.top -= offset;\n } else if (data.placement.indexOf('right') !== -1) {\n popper.top += offset;\n } else if (data.placement.indexOf('top') !== -1) {\n popper.left -= offset;\n } else if (data.placement.indexOf('bottom') !== -1) {\n popper.left += offset;\n }\n return data;\n };\n\n /**\n * Modifier used to move the arrows on the edge of the popper to make sure them are always between the popper and the reference element\n * It will use the CSS outer size of the arrow element to know how many pixels of conjuction are needed\n * @method\n * @memberof Popper.modifiers\n * @argument {Object} data - The data object generated by _update method\n * @returns {Object} The data object, properly modified\n */\n Popper.prototype.modifiers.arrow = function (data) {\n var arrow = this._options.arrowElement;\n var arrowOffset = this._options.arrowOffset;\n\n // if the arrowElement is a string, suppose it's a CSS selector\n if (typeof arrow === 'string') {\n arrow = this._popper.querySelector(arrow);\n }\n\n // if arrow element is not found, don't run the modifier\n if (!arrow) {\n return data;\n }\n\n // the arrow element must be child of its popper\n if (!this._popper.contains(arrow)) {\n console.warn('WARNING: `arrowElement` must be child of its popper element!');\n return data;\n }\n\n // arrow depends on keepTogether in order to work\n if (!this.isModifierRequired(this.modifiers.arrow, this.modifiers.keepTogether)) {\n console.warn('WARNING: keepTogether modifier is required by arrow modifier in order to work, be sure to include it before arrow!');\n return data;\n }\n\n var arrowStyle = {};\n var placement = data.placement.split('-')[0];\n var popper = getPopperClientRect(data.offsets.popper);\n var reference = data.offsets.reference;\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var side = isVertical ? 'top' : 'left';\n var translate = isVertical ? 'translateY' : 'translateX';\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowSize = getOuterSizes(arrow)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its reference have enough pixels in conjuction\n //\n\n // top/left side\n if (reference[opSide] - arrowSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowSize);\n }\n // bottom/right side\n if (reference[side] + arrowSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowSize - popper[opSide];\n }\n\n // compute center of the popper\n var center = reference[side] + (arrowOffset || reference[len] / 2 - arrowSize / 2);\n\n var sideValue = center - popper[side];\n\n // prevent arrow from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowSize - 8, sideValue), 8);\n arrowStyle[side] = sideValue;\n arrowStyle[altSide] = ''; // make sure to remove any old style from the arrow\n\n data.offsets.arrow = arrowStyle;\n data.arrowElement = arrow;\n\n return data;\n };\n\n //\n // Helpers\n //\n\n /**\n * Get the outer sizes of the given element (offset size + margins)\n * @function\n * @ignore\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\n function getOuterSizes(element) {\n // NOTE: 1 DOM access here\n var _display = element.style.display,\n _visibility = element.style.visibility;\n element.style.display = 'block';element.style.visibility = 'hidden';\n var calcWidthToForceRepaint = element.offsetWidth;\n\n // original method\n var styles = root.getComputedStyle(element);\n var x = parseFloat(styles.marginTop) + parseFloat(styles.marginBottom);\n var y = parseFloat(styles.marginLeft) + parseFloat(styles.marginRight);\n var result = { width: element.offsetWidth + y, height: element.offsetHeight + x };\n\n // reset element styles\n element.style.display = _display;element.style.visibility = _visibility;\n return result;\n }\n\n /**\n * Get the opposite placement of the given one/\n * @function\n * @ignore\n * @argument {String} placement\n * @returns {String} flipped placement\n */\n function getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n }\n\n /**\n * Given the popper offsets, generate an output similar to getBoundingClientRect\n * @function\n * @ignore\n * @argument {Object} popperOffsets\n * @returns {Object} ClientRect like output\n */\n function getPopperClientRect(popperOffsets) {\n var offsets = Object.assign({}, popperOffsets);\n offsets.right = offsets.left + offsets.width;\n offsets.bottom = offsets.top + offsets.height;\n return offsets;\n }\n\n /**\n * Given an array and the key to find, returns its index\n * @function\n * @ignore\n * @argument {Array} arr\n * @argument keyToFind\n * @returns index or null\n */\n function getArrayKeyIndex(arr, keyToFind) {\n var i = 0,\n key;\n for (key in arr) {\n if (arr[key] === keyToFind) {\n return i;\n }\n i++;\n }\n return null;\n }\n\n /**\n * Get CSS computed property of the given element\n * @function\n * @ignore\n * @argument {Eement} element\n * @argument {String} property\n */\n function getStyleComputedProperty(element, property) {\n // NOTE: 1 DOM access here\n var css = root.getComputedStyle(element, null);\n return css[property];\n }\n\n /**\n * Returns the offset parent of the given element\n * @function\n * @ignore\n * @argument {Element} element\n * @returns {Element} offset parent\n */\n function getOffsetParent(element) {\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent;\n return offsetParent === root.document.body || !offsetParent ? root.document.documentElement : offsetParent;\n }\n\n /**\n * Returns the scrolling parent of the given element\n * @function\n * @ignore\n * @argument {Element} element\n * @returns {Element} offset parent\n */\n function getScrollParent(element) {\n var parent = element.parentNode;\n\n if (!parent) {\n return element;\n }\n\n if (parent === root.document) {\n // Firefox puts the scrollTOp value on `documentElement` instead of `body`, we then check which of them is\n // greater than 0 and return the proper element\n if (root.document.body.scrollTop || root.document.body.scrollLeft) {\n return root.document.body;\n } else {\n return root.document.documentElement;\n }\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n if (['scroll', 'auto'].indexOf(getStyleComputedProperty(parent, 'overflow')) !== -1 || ['scroll', 'auto'].indexOf(getStyleComputedProperty(parent, 'overflow-x')) !== -1 || ['scroll', 'auto'].indexOf(getStyleComputedProperty(parent, 'overflow-y')) !== -1) {\n // If the detected scrollParent is body, we perform an additional check on its parentNode\n // in this way we'll get body if the browser is Chrome-ish, or documentElement otherwise\n // fixes issue #65\n return parent;\n }\n return getScrollParent(element.parentNode);\n }\n\n /**\n * Check if the given element is fixed or is inside a fixed parent\n * @function\n * @ignore\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\n function isFixed(element) {\n if (element === root.document.body) {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n return element.parentNode ? isFixed(element.parentNode) : element;\n }\n\n /**\n * Set the style to the given popper\n * @function\n * @ignore\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles - Object with a list of properties and values which will be applied to the element\n */\n function setStyle(element, styles) {\n function is_numeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n }\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && is_numeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n }\n\n /**\n * Check if the given variable is a function\n * @function\n * @ignore\n * @argument {*} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\n function isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n }\n\n /**\n * Get the position of the given element, relative to its offset parent\n * @function\n * @ignore\n * @param {Element} element\n * @return {Object} position - Coordinates of the element and its `scrollTop`\n */\n function getOffsetRect(element) {\n var elementRect = {\n width: element.offsetWidth,\n height: element.offsetHeight,\n left: element.offsetLeft,\n top: element.offsetTop\n };\n\n elementRect.right = elementRect.left + elementRect.width;\n elementRect.bottom = elementRect.top + elementRect.height;\n\n // position\n return elementRect;\n }\n\n /**\n * Get bounding client rect of given element\n * @function\n * @ignore\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\n function getBoundingClientRect(element) {\n var rect = element.getBoundingClientRect();\n\n // whether the IE version is lower than 11\n var isIE = navigator.userAgent.indexOf(\"MSIE\") != -1;\n\n // fix ie document bounding top always 0 bug\n var rectTop = isIE && element.tagName === 'HTML' ? -element.scrollTop : rect.top;\n\n return {\n left: rect.left,\n top: rectTop,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.right - rect.left,\n height: rect.bottom - rectTop\n };\n }\n\n /**\n * Given an element and one of its parents, return the offset\n * @function\n * @ignore\n * @param {HTMLElement} element\n * @param {HTMLElement} parent\n * @return {Object} rect\n */\n function getOffsetRectRelativeToCustomParent(element, parent, fixed) {\n var elementRect = getBoundingClientRect(element);\n var parentRect = getBoundingClientRect(parent);\n\n if (fixed) {\n var scrollParent = getScrollParent(parent);\n parentRect.top += scrollParent.scrollTop;\n parentRect.bottom += scrollParent.scrollTop;\n parentRect.left += scrollParent.scrollLeft;\n parentRect.right += scrollParent.scrollLeft;\n }\n\n var rect = {\n top: elementRect.top - parentRect.top,\n left: elementRect.left - parentRect.left,\n bottom: elementRect.top - parentRect.top + elementRect.height,\n right: elementRect.left - parentRect.left + elementRect.width,\n width: elementRect.width,\n height: elementRect.height\n };\n return rect;\n }\n\n /**\n * Get the prefixed supported property name\n * @function\n * @ignore\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase)\n */\n function getSupportedPropertyName(property) {\n var prefixes = ['', 'ms', 'webkit', 'moz', 'o'];\n\n for (var i = 0; i < prefixes.length; i++) {\n var toCheck = prefixes[i] ? prefixes[i] + property.charAt(0).toUpperCase() + property.slice(1) : property;\n if (typeof root.document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n }\n\n /**\n * The Object.assign() method is used to copy the values of all enumerable own properties from one or more source\n * objects to a target object. It will return the target object.\n * This polyfill doesn't support symbol properties, since ES5 doesn't have symbols anyway\n * Source: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n * @function\n * @ignore\n */\n if (!Object.assign) {\n Object.defineProperty(Object, 'assign', {\n enumerable: false,\n configurable: true,\n writable: true,\n value: function value(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert first argument to object');\n }\n\n var to = Object(target);\n for (var i = 1; i < arguments.length; i++) {\n var nextSource = arguments[i];\n if (nextSource === undefined || nextSource === null) {\n continue;\n }\n nextSource = Object(nextSource);\n\n var keysArray = Object.keys(nextSource);\n for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {\n var nextKey = keysArray[nextIndex];\n var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n if (desc !== undefined && desc.enumerable) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n return to;\n }\n });\n }\n\n return Popper;\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvcG9wcGVyLmpzPzYxNjciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0VBQWE7O0FBRWIsb0dBQW9HLG1CQUFtQixFQUFFLG1CQUFtQiw4SEFBOEg7O0FBRTFRO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELFFBQVEsSUFBMEM7QUFDbEQ7QUFDQSxRQUFRLG9DQUFPLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxvR0FBQztBQUN2QixLQUFLLE1BQU0sRUFRTjtBQUNMLENBQUM7O0FBRUQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsWUFBWTtBQUMzQixlQUFlLG1CQUFtQjtBQUNsQztBQUNBLGVBQWUsT0FBTztBQUN0QixlQUFlLE1BQU07QUFDckIsZUFBZSxNQUFNO0FBQ3JCLGVBQWUsbUJBQW1CO0FBQ2xDLGVBQWUsT0FBTyw4RUFBOEU7QUFDcEcsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsT0FBTztBQUN0QixlQUFlLE1BQU07QUFDckIsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxtQkFBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0Isc0JBQXNCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtRUFBbUUsaUJBQWlCO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBLENBQUMiLCJmaWxlIjoiNjE2Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgS2lja2FzcyBsaWJyYXJ5IHRvIGNyZWF0ZSBhbmQgcGxhY2UgcG9wcGVycyBuZWFyIHRoZWlyIHJlZmVyZW5jZSBlbGVtZW50cy5cbiAqIEB2ZXJzaW9uIHt7dmVyc2lvbn19XG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2IEZlZGVyaWNvIFppdm9sbyBhbmQgY29udHJpYnV0b3JzXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG4vL1xuLy8gQ3Jvc3MgbW9kdWxlIGxvYWRlclxuLy8gU3VwcG9ydGVkOiBOb2RlLCBBTUQsIEJyb3dzZXIgZ2xvYmFsc1xuLy9cbjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAoKHR5cGVvZiBtb2R1bGUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG1vZHVsZSkpID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXRcbiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsXG4gICAgICAgIC8vIGxpa2UgTm9kZS5cbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzIChyb290IGlzIHdpbmRvdylcbiAgICAgICAgcm9vdC5Qb3BwZXIgPSBmYWN0b3J5KCk7XG4gICAgfVxufSkodW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgcm9vdCA9IHdpbmRvdztcblxuICAgIC8vIGRlZmF1bHQgb3B0aW9uc1xuICAgIHZhciBERUZBVUxUUyA9IHtcbiAgICAgICAgLy8gcGxhY2VtZW50IG9mIHRoZSBwb3BwZXJcbiAgICAgICAgcGxhY2VtZW50OiAnYm90dG9tJyxcblxuICAgICAgICBncHVBY2NlbGVyYXRpb246IHRydWUsXG5cbiAgICAgICAgLy8gc2hpZnQgcG9wcGVyIGZyb20gaXRzIG9yaWdpbiBieSB0aGUgZ2l2ZW4gYW1vdW50IG9mIHBpeGVscyAoY2FuIGJlIG5lZ2F0aXZlKVxuICAgICAgICBvZmZzZXQ6IDAsXG5cbiAgICAgICAgLy8gdGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBhY3QgYXMgYm91bmRhcnkgb2YgdGhlIHBvcHBlclxuICAgICAgICBib3VuZGFyaWVzRWxlbWVudDogJ3ZpZXdwb3J0JyxcblxuICAgICAgICAvLyBhbW91bnQgb2YgcGl4ZWwgdXNlZCB0byBkZWZpbmUgYSBtaW5pbXVtIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvdW5kYXJpZXMgYW5kIHRoZSBwb3BwZXJcbiAgICAgICAgYm91bmRhcmllc1BhZGRpbmc6IDUsXG5cbiAgICAgICAgLy8gcG9wcGVyIHdpbGwgdHJ5IHRvIHByZXZlbnQgb3ZlcmZsb3cgZm9sbG93aW5nIHRoaXMgb3JkZXIsXG4gICAgICAgIC8vIGJ5IGRlZmF1bHQsIHRoZW4sIGl0IGNvdWxkIG92ZXJmbG93IG9uIHRoZSBsZWZ0IGFuZCBvbiB0b3Agb2YgdGhlIGJvdW5kYXJpZXNFbGVtZW50XG4gICAgICAgIHByZXZlbnRPdmVyZmxvd09yZGVyOiBbJ2xlZnQnLCAncmlnaHQnLCAndG9wJywgJ2JvdHRvbSddLFxuXG4gICAgICAgIC8vIHRoZSBiZWhhdmlvciB1c2VkIGJ5IGZsaXAgdG8gY2hhbmdlIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHBvcHBlclxuICAgICAgICBmbGlwQmVoYXZpb3I6ICdmbGlwJyxcblxuICAgICAgICBhcnJvd0VsZW1lbnQ6ICdbeC1hcnJvd10nLFxuXG4gICAgICAgIGFycm93T2Zmc2V0OiAwLFxuXG4gICAgICAgIC8vIGxpc3Qgb2YgZnVuY3Rpb25zIHVzZWQgdG8gbW9kaWZ5IHRoZSBvZmZzZXRzIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXJcbiAgICAgICAgbW9kaWZpZXJzOiBbJ3NoaWZ0JywgJ29mZnNldCcsICdwcmV2ZW50T3ZlcmZsb3cnLCAna2VlcFRvZ2V0aGVyJywgJ2Fycm93JywgJ2ZsaXAnLCAnYXBwbHlTdHlsZSddLFxuXG4gICAgICAgIG1vZGlmaWVyc0lnbm9yZWQ6IFtdLFxuXG4gICAgICAgIGZvcmNlQWJzb2x1dGU6IGZhbHNlXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBQb3BwZXIuanMgaW5zdGFuY2VcbiAgICAgKiBAY29uc3RydWN0b3IgUG9wcGVyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSBlbGVtZW50IHVzZWQgdG8gcG9zaXRpb24gdGhlIHBvcHBlclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8T2JqZWN0fSBwb3BwZXJcbiAgICAgKiAgICAgIFRoZSBIVE1MIGVsZW1lbnQgdXNlZCBhcyBwb3BwZXIsIG9yIGEgY29uZmlndXJhdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBwb3BwZXIuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtwb3BwZXIudGFnTmFtZT0nZGl2J10gVGhlIHRhZyBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgcG9wcGVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwb3BwZXIuY2xhc3NOYW1lcz1bJ3BvcHBlciddXSBBcnJheSBvZiBjbGFzc2VzIHRvIGFwcGx5IHRvIHRoZSBnZW5lcmF0ZWQgcG9wcGVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwb3BwZXIuYXR0cmlidXRlc10gQXJyYXkgb2YgYXR0cmlidXRlcyB0byBhcHBseSwgc3BlY2lmeSBgYXR0cjp2YWx1ZWAgdG8gYXNzaWduIGEgdmFsdWUgdG8gaXQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudHxTdHJpbmd9IFtwb3BwZXIucGFyZW50PXdpbmRvdy5kb2N1bWVudC5ib2R5XSBUaGUgcGFyZW50IGVsZW1lbnQsIGdpdmVuIGFzIEhUTUxFbGVtZW50IG9yIGFzIHF1ZXJ5IHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW3BvcHBlci5jb250ZW50PScnXSBUaGUgY29udGVudCBvZiB0aGUgcG9wcGVyLCBpdCBjYW4gYmUgdGV4dCwgaHRtbCwgb3Igbm9kZTsgaWYgaXQgaXMgbm90IHRleHQsIHNldCBgY29udGVudFR5cGVgIHRvIGBodG1sYCBvciBgbm9kZWAuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtwb3BwZXIuY29udGVudFR5cGU9J3RleHQnXSBJZiBgaHRtbGAsIHRoZSBgY29udGVudGAgd2lsbCBiZSBwYXJzZWQgYXMgSFRNTC4gSWYgYG5vZGVgLCBpdCB3aWxsIGJlIGFwcGVuZGVkIGFzLWlzLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbcG9wcGVyLmFycm93VGFnTmFtZT0nZGl2J10gU2FtZSBhcyBgcG9wcGVyLnRhZ05hbWVgIGJ1dCBmb3IgdGhlIGFycm93IGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BvcHBlci5hcnJvd0NsYXNzTmFtZXM9J3BvcHBlcl9fYXJyb3cnXSBTYW1lIGFzIGBwb3BwZXIuY2xhc3NOYW1lc2AgYnV0IGZvciB0aGUgYXJyb3cgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW3BvcHBlci5hcnJvd0F0dHJpYnV0ZXM9Wyd4LWFycm93J11dIFNhbWUgYXMgYHBvcHBlci5hdHRyaWJ1dGVzYCBidXQgZm9yIHRoZSBhcnJvdyBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBsYWNlbWVudD1ib3R0b21dXG4gICAgICogICAgICBQbGFjZW1lbnQgb2YgdGhlIHBvcHBlciBhY2NlcHRlZCB2YWx1ZXM6IGB0b3AoLXN0YXJ0LCAtZW5kKSwgcmlnaHQoLXN0YXJ0LCAtZW5kKSwgYm90dG9tKC1zdGFydCwgLXJpZ2h0KSxcbiAgICAgKiAgICAgIGxlZnQoLXN0YXJ0LCAtZW5kKWBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8U3RyaW5nfSBbb3B0aW9ucy5hcnJvd0VsZW1lbnQ9J1t4LWFycm93XSddXG4gICAgICogICAgICBUaGUgRE9NIE5vZGUgdXNlZCBhcyBhcnJvdyBmb3IgdGhlIHBvcHBlciwgb3IgYSBDU1Mgc2VsZWN0b3IgdXNlZCB0byBnZXQgdGhlIERPTSBub2RlLiBJdCBtdXN0IGJlIGNoaWxkIG9mXG4gICAgICogICAgICBpdHMgcGFyZW50IFBvcHBlci4gUG9wcGVyLmpzIHdpbGwgYXBwbHkgdG8gdGhlIGdpdmVuIGVsZW1lbnQgdGhlIHN0eWxlIHJlcXVpcmVkIHRvIGFsaWduIHRoZSBhcnJvdyB3aXRoIGl0c1xuICAgICAqICAgICAgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAgICogICAgICBCeSBkZWZhdWx0LCBpdCB3aWxsIGxvb2sgZm9yIGEgY2hpbGQgbm9kZSBvZiB0aGUgcG9wcGVyIHdpdGggdGhlIGB4LWFycm93YCBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmdwdUFjY2VsZXJhdGlvbj10cnVlXVxuICAgICAqICAgICAgV2hlbiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLCB0aGUgcG9wcGVyIHBvc2l0aW9uIHdpbGwgYmUgYXBwbGllZCB1c2luZyBDU1MzIHRyYW5zbGF0ZTNkLCBhbGxvd2luZyB0aGVcbiAgICAgKiAgICAgIGJyb3dzZXIgdG8gdXNlIHRoZSBHUFUgdG8gYWNjZWxlcmF0ZSB0aGUgcmVuZGVyaW5nLlxuICAgICAqICAgICAgSWYgc2V0IHRvIGZhbHNlLCB0aGUgcG9wcGVyIHdpbGwgYmUgcGxhY2VkIHVzaW5nIGB0b3BgIGFuZCBgbGVmdGAgcHJvcGVydGllcywgbm90IHVzaW5nIHRoZSBHUFUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMub2Zmc2V0PTBdXG4gICAgICogICAgICBBbW91bnQgb2YgcGl4ZWxzIHRoZSBwb3BwZXIgd2lsbCBiZSBzaGlmdGVkIChjYW4gYmUgbmVnYXRpdmUpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd8RWxlbWVudH0gW29wdGlvbnMuYm91bmRhcmllc0VsZW1lbnQ9J3ZpZXdwb3J0J11cbiAgICAgKiAgICAgIFRoZSBlbGVtZW50IHdoaWNoIHdpbGwgZGVmaW5lIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBwb3BwZXIgcG9zaXRpb24sIHRoZSBwb3BwZXIgd2lsbCBuZXZlciBiZSBwbGFjZWQgb3V0c2lkZVxuICAgICAqICAgICAgb2YgdGhlIGRlZmluZWQgYm91bmRhcmllcyAoZXhjZXB0IGlmIGBrZWVwVG9nZXRoZXJgIGlzIGVuYWJsZWQpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYm91bmRhcmllc1BhZGRpbmc9NV1cbiAgICAgKiAgICAgIEFkZGl0aW9uYWwgcGFkZGluZyBmb3IgdGhlIGJvdW5kYXJpZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLnByZXZlbnRPdmVyZmxvd09yZGVyPVsnbGVmdCcsICdyaWdodCcsICd0b3AnLCAnYm90dG9tJ11dXG4gICAgICogICAgICBPcmRlciB1c2VkIHdoZW4gUG9wcGVyLmpzIHRyaWVzIHRvIGF2b2lkIG92ZXJmbG93cyBmcm9tIHRoZSBib3VuZGFyaWVzLCB0aGV5IHdpbGwgYmUgY2hlY2tlZCBpbiBvcmRlcixcbiAgICAgKiAgICAgIHRoaXMgbWVhbnMgdGhhdCB0aGUgbGFzdCBvbmVzIHdpbGwgbmV2ZXIgb3ZlcmZsb3dcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBbb3B0aW9ucy5mbGlwQmVoYXZpb3I9J2ZsaXAnXVxuICAgICAqICAgICAgVGhlIGJlaGF2aW9yIHVzZWQgYnkgdGhlIGBmbGlwYCBtb2RpZmllciB0byBjaGFuZ2UgdGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wcGVyIHdoZW4gdGhlIGxhdHRlciBpcyB0cnlpbmcgdG9cbiAgICAgKiAgICAgIG92ZXJsYXAgaXRzIHJlZmVyZW5jZSBlbGVtZW50LiBEZWZpbmluZyBgZmxpcGAgYXMgdmFsdWUsIHRoZSBwbGFjZW1lbnQgd2lsbCBiZSBmbGlwcGVkIG9uXG4gICAgICogICAgICBpdHMgYXhpcyAoYHJpZ2h0IC0gbGVmdGAsIGB0b3AgLSBib3R0b21gKS5cbiAgICAgKiAgICAgIFlvdSBjYW4gZXZlbiBwYXNzIGFuIGFycmF5IG9mIHBsYWNlbWVudHMgKGVnOiBgWydyaWdodCcsICdsZWZ0JywgJ3RvcCddYCApIHRvIG1hbnVhbGx5IHNwZWNpZnlcbiAgICAgKiAgICAgIGhvdyBhbHRlciB0aGUgcGxhY2VtZW50IHdoZW4gYSBmbGlwIGlzIG5lZWRlZC4gKGVnLiBpbiB0aGUgYWJvdmUgZXhhbXBsZSwgaXQgd291bGQgZmlyc3QgZmxpcCBmcm9tIHJpZ2h0IHRvIGxlZnQsXG4gICAgICogICAgICB0aGVuLCBpZiBldmVuIGluIGl0cyBuZXcgcGxhY2VtZW50LCB0aGUgcG9wcGVyIGlzIG92ZXJsYXBwaW5nIGl0cyByZWZlcmVuY2UgZWxlbWVudCwgaXQgd2lsbCBiZSBtb3ZlZCB0byB0b3ApXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5tb2RpZmllcnM9WyAnc2hpZnQnLCAnb2Zmc2V0JywgJ3ByZXZlbnRPdmVyZmxvdycsICdrZWVwVG9nZXRoZXInLCAnYXJyb3cnLCAnZmxpcCcsICdhcHBseVN0eWxlJ11dXG4gICAgICogICAgICBMaXN0IG9mIGZ1bmN0aW9ucyB1c2VkIHRvIG1vZGlmeSB0aGUgZGF0YSBiZWZvcmUgdGhleSBhcmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLCBhZGQgeW91ciBjdXN0b20gZnVuY3Rpb25zXG4gICAgICogICAgICB0byB0aGlzIGFycmF5IHRvIGVkaXQgdGhlIG9mZnNldHMgYW5kIHBsYWNlbWVudC5cbiAgICAgKiAgICAgIFRoZSBmdW5jdGlvbiBzaG91bGQgcmVmbGVjdCB0aGUgQHBhcmFtcyBhbmQgQHJldHVybnMgb2YgcHJldmVudE92ZXJmbG93XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5tb2RpZmllcnNJZ25vcmVkPVtdXVxuICAgICAqICAgICAgUHV0IGhlcmUgYW55IGJ1aWx0LWluIG1vZGlmaWVyIG5hbWUgeW91IHdhbnQgdG8gZXhjbHVkZSBmcm9tIHRoZSBtb2RpZmllcnMgbGlzdFxuICAgICAqICAgICAgVGhlIGZ1bmN0aW9uIHNob3VsZCByZWZsZWN0IHRoZSBAcGFyYW1zIGFuZCBAcmV0dXJucyBvZiBwcmV2ZW50T3ZlcmZsb3dcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmVtb3ZlT25EZXN0cm95PWZhbHNlXVxuICAgICAqICAgICAgU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseSByZW1vdmUgdGhlIHBvcHBlciB3aGVuIHlvdSBjYWxsIHRoZSBgZGVzdHJveWAgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLl9yZWZlcmVuY2UgPSByZWZlcmVuY2UuanF1ZXJ5ID8gcmVmZXJlbmNlWzBdIDogcmVmZXJlbmNlO1xuICAgICAgICB0aGlzLnN0YXRlID0ge307XG5cbiAgICAgICAgLy8gaWYgdGhlIHBvcHBlciB2YXJpYWJsZSBpcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBwYXJzZSBpdCB0byBnZW5lcmF0ZSBhbiBIVE1MRWxlbWVudFxuICAgICAgICAvLyBnZW5lcmF0ZSBhIGRlZmF1bHQgcG9wcGVyIGlmIGlzIG5vdCBkZWZpbmVkXG4gICAgICAgIHZhciBpc05vdERlZmluZWQgPSB0eXBlb2YgcG9wcGVyID09PSAndW5kZWZpbmVkJyB8fCBwb3BwZXIgPT09IG51bGw7XG4gICAgICAgIHZhciBpc0NvbmZpZyA9IHBvcHBlciAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocG9wcGVyKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gICAgICAgIGlmIChpc05vdERlZmluZWQgfHwgaXNDb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcHBlciA9IHRoaXMucGFyc2UoaXNDb25maWcgPyBwb3BwZXIgOiB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCB1c2UgdGhlIGdpdmVuIEhUTUxFbGVtZW50IGFzIHBvcHBlclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3BwZXIgPSBwb3BwZXIuanF1ZXJ5ID8gcG9wcGVyWzBdIDogcG9wcGVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIC8vIHdpdGgge30gd2UgY3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBvcHRpb25zIGluc2lkZSBpdFxuICAgICAgICB0aGlzLl9vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVFMsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIHJlZmFjdG9yaW5nIG1vZGlmaWVycycgbGlzdFxuICAgICAgICB0aGlzLl9vcHRpb25zLm1vZGlmaWVycyA9IHRoaXMuX29wdGlvbnMubW9kaWZpZXJzLm1hcChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBpZ25vcmVkIG1vZGlmaWVyc1xuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubW9kaWZpZXJzSWdub3JlZC5pbmRleE9mKG1vZGlmaWVyKSAhPT0gLTEpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gc2V0IHRoZSB4LXBsYWNlbWVudCBhdHRyaWJ1dGUgYmVmb3JlIGV2ZXJ5dGhpbmcgZWxzZSBiZWNhdXNlIGl0IGNvdWxkIGJlIHVzZWQgdG8gYWRkIG1hcmdpbnMgdG8gdGhlIHBvcHBlclxuICAgICAgICAgICAgLy8gbWFyZ2lucyBuZWVkcyB0byBiZSBjYWxjdWxhdGVkIHRvIGdldCB0aGUgY29ycmVjdCBwb3BwZXIgb2Zmc2V0c1xuICAgICAgICAgICAgaWYgKG1vZGlmaWVyID09PSAnYXBwbHlTdHlsZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3BwZXIuc2V0QXR0cmlidXRlKCd4LXBsYWNlbWVudCcsIHRoaXMuX29wdGlvbnMucGxhY2VtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcmV0dXJuIHByZWRlZmluZWQgbW9kaWZpZXIgaWRlbnRpZmllZCBieSBzdHJpbmcgb3Iga2VlcCB0aGUgY3VzdG9tIG9uZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kaWZpZXJzW21vZGlmaWVyXSB8fCBtb2RpZmllcjtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyBtYWtlIHN1cmUgdG8gYXBwbHkgdGhlIHBvcHBlciBwb3NpdGlvbiBiZWZvcmUgYW55IGNvbXB1dGF0aW9uXG4gICAgICAgIHRoaXMuc3RhdGUucG9zaXRpb24gPSB0aGlzLl9nZXRQb3NpdGlvbih0aGlzLl9wb3BwZXIsIHRoaXMuX3JlZmVyZW5jZSk7XG4gICAgICAgIHNldFN0eWxlKHRoaXMuX3BvcHBlciwgeyBwb3NpdGlvbjogdGhpcy5zdGF0ZS5wb3NpdGlvbiwgdG9wOiAwIH0pO1xuXG4gICAgICAgIC8vIGZpcmUgdGhlIGZpcnN0IHVwZGF0ZSB0byBwb3NpdGlvbiB0aGUgcG9wcGVyIGluIHRoZSByaWdodCBwbGFjZVxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgIC8vIHNldHVwIGV2ZW50IGxpc3RlbmVycywgdGhleSB3aWxsIHRha2UgY2FyZSBvZiB1cGRhdGUgdGhlIHBvc2l0aW9uIGluIHNwZWNpZmljIHNpdHVhdGlvbnNcbiAgICAgICAgdGhpcy5fc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIE1ldGhvZHNcbiAgICAvL1xuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIHBvcHBlclxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAbWVtYmVyb2YgUG9wcGVyXG4gICAgICovXG4gICAgUG9wcGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9wb3BwZXIucmVtb3ZlQXR0cmlidXRlKCd4LXBsYWNlbWVudCcpO1xuICAgICAgICB0aGlzLl9wb3BwZXIuc3R5bGUubGVmdCA9ICcnO1xuICAgICAgICB0aGlzLl9wb3BwZXIuc3R5bGUucG9zaXRpb24gPSAnJztcbiAgICAgICAgdGhpcy5fcG9wcGVyLnN0eWxlLnRvcCA9ICcnO1xuICAgICAgICB0aGlzLl9wb3BwZXIuc3R5bGVbZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKCd0cmFuc2Zvcm0nKV0gPSAnJztcbiAgICAgICAgdGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgICAvLyByZW1vdmUgdGhlIHBvcHBlciBpZiB1c2VyIGV4cGxpY2l0eSBhc2tlZCBmb3IgdGhlIGRlbGV0aW9uIG9uIGRlc3Ryb3lcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVtb3ZlT25EZXN0cm95KSB7XG4gICAgICAgICAgICB0aGlzLl9wb3BwZXIucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBwb3BwZXIsIGNvbXB1dGluZyB0aGUgbmV3IG9mZnNldHMgYW5kIGFwcGx5aW5nIHRoZSBuZXcgc3R5bGVcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQG1lbWJlcm9mIFBvcHBlclxuICAgICAqL1xuICAgIFBvcHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9IHsgaW5zdGFuY2U6IHRoaXMsIHN0eWxlczoge30gfTtcblxuICAgICAgICAvLyBzdG9yZSBwbGFjZW1lbnQgaW5zaWRlIHRoZSBkYXRhIG9iamVjdCwgbW9kaWZpZXJzIHdpbGwgYmUgYWJsZSB0byBlZGl0IGBwbGFjZW1lbnRgIGlmIG5lZWRlZFxuICAgICAgICAvLyBhbmQgcmVmZXIgdG8gX29yaWdpbmFsUGxhY2VtZW50IHRvIGtub3cgdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgICAgIGRhdGEucGxhY2VtZW50ID0gdGhpcy5fb3B0aW9ucy5wbGFjZW1lbnQ7XG4gICAgICAgIGRhdGEuX29yaWdpbmFsUGxhY2VtZW50ID0gdGhpcy5fb3B0aW9ucy5wbGFjZW1lbnQ7XG5cbiAgICAgICAgLy8gY29tcHV0ZSB0aGUgcG9wcGVyIGFuZCByZWZlcmVuY2Ugb2Zmc2V0cyBhbmQgcHV0IHRoZW0gaW5zaWRlIGRhdGEub2Zmc2V0c1xuICAgICAgICBkYXRhLm9mZnNldHMgPSB0aGlzLl9nZXRPZmZzZXRzKHRoaXMuX3BvcHBlciwgdGhpcy5fcmVmZXJlbmNlLCBkYXRhLnBsYWNlbWVudCk7XG5cbiAgICAgICAgLy8gZ2V0IGJvdW5kYXJpZXNcbiAgICAgICAgZGF0YS5ib3VuZGFyaWVzID0gdGhpcy5fZ2V0Qm91bmRhcmllcyhkYXRhLCB0aGlzLl9vcHRpb25zLmJvdW5kYXJpZXNQYWRkaW5nLCB0aGlzLl9vcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50KTtcblxuICAgICAgICBkYXRhID0gdGhpcy5ydW5Nb2RpZmllcnMoZGF0YSwgdGhpcy5fb3B0aW9ucy5tb2RpZmllcnMpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdGF0ZS51cGRhdGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGVDYWxsYmFjayhkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJZiBhIGZ1bmN0aW9uIGlzIHBhc3NlZCwgaXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgcG9wcGVyIHdpdGggYXMgZmlyc3QgYXJndW1lbnQgdGhlIFBvcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAbWV0aG9kXG4gICAgICogQG1lbWJlcm9mIFBvcHBlclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgUG9wcGVyLnByb3RvdHlwZS5vbkNyZWF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAvLyB0aGUgY3JlYXRlQ2FsbGJhY2tzIHJldHVybiBhcyBmaXJzdCBhcmd1bWVudCB0aGUgcG9wcGVyIGluc3RhbmNlXG4gICAgICAgIGNhbGxiYWNrKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSWYgYSBmdW5jdGlvbiBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgZWFjaCB1cGRhdGUgb2YgcG9wcGVyIHdpdGggYXMgZmlyc3QgYXJndW1lbnQgdGhlIHNldCBvZiBjb29yZGluYXRlcyBhbmQgaW5mb3JtYXRpb25zXG4gICAgICogdXNlZCB0byBzdHlsZSBwb3BwZXIgYW5kIGl0cyBhcnJvdy5cbiAgICAgKiBOT1RFOiBpdCBkb2Vzbid0IGdldCBmaXJlZCBvbiB0aGUgZmlyc3QgY2FsbCBvZiB0aGUgYFBvcHBlci51cGRhdGUoKWAgbWV0aG9kIGluc2lkZSB0aGUgYFBvcHBlcmAgY29uc3RydWN0b3IhXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIFBvcHBlci5wcm90b3R5cGUub25VcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGVDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGVscGVyIHVzZWQgdG8gZ2VuZXJhdGUgcG9wcGVycyBmcm9tIGEgY29uZmlndXJhdGlvbiBmaWxlXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKiBAcGFyYW0gY29uZmlnIHtPYmplY3R9IGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IHBvcHBlclxuICAgICAqL1xuICAgIFBvcHBlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIHZhciBkZWZhdWx0Q29uZmlnID0ge1xuICAgICAgICAgICAgdGFnTmFtZTogJ2RpdicsXG4gICAgICAgICAgICBjbGFzc05hbWVzOiBbJ3BvcHBlciddLFxuICAgICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgICAgICBwYXJlbnQ6IHJvb3QuZG9jdW1lbnQuYm9keSxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgICAgICAgY29udGVudFR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGFycm93VGFnTmFtZTogJ2RpdicsXG4gICAgICAgICAgICBhcnJvd0NsYXNzTmFtZXM6IFsncG9wcGVyX19hcnJvdyddLFxuICAgICAgICAgICAgYXJyb3dBdHRyaWJ1dGVzOiBbJ3gtYXJyb3cnXVxuICAgICAgICB9O1xuICAgICAgICBjb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q29uZmlnLCBjb25maWcpO1xuXG4gICAgICAgIHZhciBkID0gcm9vdC5kb2N1bWVudDtcblxuICAgICAgICB2YXIgcG9wcGVyID0gZC5jcmVhdGVFbGVtZW50KGNvbmZpZy50YWdOYW1lKTtcbiAgICAgICAgYWRkQ2xhc3NOYW1lcyhwb3BwZXIsIGNvbmZpZy5jbGFzc05hbWVzKTtcbiAgICAgICAgYWRkQXR0cmlidXRlcyhwb3BwZXIsIGNvbmZpZy5hdHRyaWJ1dGVzKTtcbiAgICAgICAgaWYgKGNvbmZpZy5jb250ZW50VHlwZSA9PT0gJ25vZGUnKSB7XG4gICAgICAgICAgICBwb3BwZXIuYXBwZW5kQ2hpbGQoY29uZmlnLmNvbnRlbnQuanF1ZXJ5ID8gY29uZmlnLmNvbnRlbnRbMF0gOiBjb25maWcuY29udGVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLmNvbnRlbnRUeXBlID09PSAnaHRtbCcpIHtcbiAgICAgICAgICAgIHBvcHBlci5pbm5lckhUTUwgPSBjb25maWcuY29udGVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcHBlci50ZXh0Q29udGVudCA9IGNvbmZpZy5jb250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5hcnJvd1RhZ05hbWUpIHtcbiAgICAgICAgICAgIHZhciBhcnJvdyA9IGQuY3JlYXRlRWxlbWVudChjb25maWcuYXJyb3dUYWdOYW1lKTtcbiAgICAgICAgICAgIGFkZENsYXNzTmFtZXMoYXJyb3csIGNvbmZpZy5hcnJvd0NsYXNzTmFtZXMpO1xuICAgICAgICAgICAgYWRkQXR0cmlidXRlcyhhcnJvdywgY29uZmlnLmFycm93QXR0cmlidXRlcyk7XG4gICAgICAgICAgICBwb3BwZXIuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBhcmVudCA9IGNvbmZpZy5wYXJlbnQuanF1ZXJ5ID8gY29uZmlnLnBhcmVudFswXSA6IGNvbmZpZy5wYXJlbnQ7XG5cbiAgICAgICAgLy8gaWYgdGhlIGdpdmVuIHBhcmVudCBpcyBhIHN0cmluZywgdXNlIGl0IHRvIG1hdGNoIGFuIGVsZW1lbnRcbiAgICAgICAgLy8gaWYgbW9yZSB0aGFuIG9uZSBlbGVtZW50IGlzIG1hdGNoZWQsIHRoZSBmaXJzdCBvbmUgd2lsbCBiZSB1c2VkIGFzIHBhcmVudFxuICAgICAgICAvLyBpZiBubyBlbGVtZW50cyBhcmUgbWF0Y2hlZCwgdGhlIHNjcmlwdCB3aWxsIHRocm93IGFuIGVycm9yXG4gICAgICAgIGlmICh0eXBlb2YgcGFyZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGFyZW50ID0gZC5xdWVyeVNlbGVjdG9yQWxsKGNvbmZpZy5wYXJlbnQpO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiB0aGUgZ2l2ZW4gYHBhcmVudGAgcXVlcnkoJyArIGNvbmZpZy5wYXJlbnQgKyAnKSBtYXRjaGVkIG1vcmUgdGhhbiBvbmUgZWxlbWVudCwgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHVzZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgJ0VSUk9SOiB0aGUgZ2l2ZW4gYHBhcmVudGAgZG9lc25cXCd0IGV4aXN0cyEnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50WzBdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHRoZSBnaXZlbiBwYXJlbnQgaXMgYSBET00gbm9kZXMgbGlzdCBvciBhbiBhcnJheSBvZiBub2RlcyB3aXRoIG1vcmUgdGhhbiBvbmUgZWxlbWVudCxcbiAgICAgICAgLy8gdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHVzZWQgYXMgcGFyZW50XG4gICAgICAgIGlmIChwYXJlbnQubGVuZ3RoID4gMSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiB5b3UgaGF2ZSBwYXNzZWQgYXMgcGFyZW50IGEgbGlzdCBvZiBlbGVtZW50cywgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHVzZWQnKTtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFwcGVuZCB0aGUgZ2VuZXJhdGVkIHBvcHBlciB0byBpdHMgcGFyZW50XG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChwb3BwZXIpO1xuXG4gICAgICAgIHJldHVybiBwb3BwZXI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgY2xhc3MgbmFtZXMgdG8gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBpZ25vcmVcbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdGFyZ2V0XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGNsYXNzZXNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGFkZENsYXNzTmFtZXMoZWxlbWVudCwgY2xhc3NOYW1lcykge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYXR0cmlidXRlcyB0byB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQGlnbm9yZVxuICAgICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXRcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXR0cmlidXRlc1xuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBhZGRBdHRyaWJ1dGVzKGVsZW1lbnQsIFsgJ2RhdGEtaW5mbzpmb29iYXInIF0pO1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gYWRkQXR0cmlidXRlcyhlbGVtZW50LCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZS5zcGxpdCgnOicpWzBdLCBhdHRyaWJ1dGUuc3BsaXQoJzonKVsxXSB8fCAnJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgdXNlZCB0byBnZXQgdGhlIHBvc2l0aW9uIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKiBAcGFyYW0gY29uZmlnIHtIVE1MRWxlbWVudH0gcG9wcGVyIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIHtIVE1MRWxlbWVudH0gcmVmZXJlbmNlIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBwb3NpdGlvblxuICAgICAqL1xuICAgIFBvcHBlci5wcm90b3R5cGUuX2dldFBvc2l0aW9uID0gZnVuY3Rpb24gKHBvcHBlciwgcmVmZXJlbmNlKSB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBnZXRPZmZzZXRQYXJlbnQocmVmZXJlbmNlKTtcblxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5mb3JjZUFic29sdXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2Fic29sdXRlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlY2lkZSBpZiB0aGUgcG9wcGVyIHdpbGwgYmUgZml4ZWRcbiAgICAgICAgLy8gSWYgdGhlIHJlZmVyZW5jZSBlbGVtZW50IGlzIGluc2lkZSBhIGZpeGVkIGNvbnRleHQsIHRoZSBwb3BwZXIgd2lsbCBiZSBmaXhlZCBhcyB3ZWxsIHRvIGFsbG93IHRoZW0gdG8gc2Nyb2xsIHRvZ2V0aGVyXG4gICAgICAgIHZhciBpc1BhcmVudEZpeGVkID0gaXNGaXhlZChyZWZlcmVuY2UsIGNvbnRhaW5lcik7XG4gICAgICAgIHJldHVybiBpc1BhcmVudEZpeGVkID8gJ2ZpeGVkJyA6ICdhYnNvbHV0ZSc7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldCBvZmZzZXRzIHRvIHRoZSBwb3BwZXJcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQG1lbWJlcm9mIFBvcHBlclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gcG9wcGVyIC0gdGhlIHBvcHBlciBlbGVtZW50XG4gICAgICogQHBhcmFtIHtFbGVtZW50fSByZWZlcmVuY2UgLSB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgKHRoZSBwb3BwZXIgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzKVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvZmZzZXRzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyXG4gICAgICovXG4gICAgUG9wcGVyLnByb3RvdHlwZS5fZ2V0T2Zmc2V0cyA9IGZ1bmN0aW9uIChwb3BwZXIsIHJlZmVyZW5jZSwgcGxhY2VtZW50KSB7XG4gICAgICAgIHBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICAgICAgICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHt9O1xuXG4gICAgICAgIHBvcHBlck9mZnNldHMucG9zaXRpb24gPSB0aGlzLnN0YXRlLnBvc2l0aW9uO1xuICAgICAgICB2YXIgaXNQYXJlbnRGaXhlZCA9IHBvcHBlck9mZnNldHMucG9zaXRpb24gPT09ICdmaXhlZCc7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gR2V0IHJlZmVyZW5jZSBlbGVtZW50IHBvc2l0aW9uXG4gICAgICAgIC8vXG4gICAgICAgIHZhciByZWZlcmVuY2VPZmZzZXRzID0gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9DdXN0b21QYXJlbnQocmVmZXJlbmNlLCBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKSwgaXNQYXJlbnRGaXhlZCk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gR2V0IHBvcHBlciBzaXplc1xuICAgICAgICAvL1xuICAgICAgICB2YXIgcG9wcGVyUmVjdCA9IGdldE91dGVyU2l6ZXMocG9wcGVyKTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBDb21wdXRlIG9mZnNldHMgb2YgcG9wcGVyXG4gICAgICAgIC8vXG5cbiAgICAgICAgLy8gZGVwZW5kaW5nIGJ5IHRoZSBwb3BwZXIgcGxhY2VtZW50IHdlIGhhdmUgdG8gY29tcHV0ZSBpdHMgb2Zmc2V0cyBzbGlnaHRseSBkaWZmZXJlbnRseVxuICAgICAgICBpZiAoWydyaWdodCcsICdsZWZ0J10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMSkge1xuICAgICAgICAgICAgcG9wcGVyT2Zmc2V0cy50b3AgPSByZWZlcmVuY2VPZmZzZXRzLnRvcCArIHJlZmVyZW5jZU9mZnNldHMuaGVpZ2h0IC8gMiAtIHBvcHBlclJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIGlmIChwbGFjZW1lbnQgPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIHBvcHBlck9mZnNldHMubGVmdCA9IHJlZmVyZW5jZU9mZnNldHMubGVmdCAtIHBvcHBlclJlY3Qud2lkdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBvcHBlck9mZnNldHMubGVmdCA9IHJlZmVyZW5jZU9mZnNldHMucmlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb3BwZXJPZmZzZXRzLmxlZnQgPSByZWZlcmVuY2VPZmZzZXRzLmxlZnQgKyByZWZlcmVuY2VPZmZzZXRzLndpZHRoIC8gMiAtIHBvcHBlclJlY3Qud2lkdGggLyAyO1xuICAgICAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICBwb3BwZXJPZmZzZXRzLnRvcCA9IHJlZmVyZW5jZU9mZnNldHMudG9wIC0gcG9wcGVyUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBvcHBlck9mZnNldHMudG9wID0gcmVmZXJlbmNlT2Zmc2V0cy5ib3R0b207XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgd2lkdGggYW5kIGhlaWdodCB0byBvdXIgb2Zmc2V0cyBvYmplY3RcbiAgICAgICAgcG9wcGVyT2Zmc2V0cy53aWR0aCA9IHBvcHBlclJlY3Qud2lkdGg7XG4gICAgICAgIHBvcHBlck9mZnNldHMuaGVpZ2h0ID0gcG9wcGVyUmVjdC5oZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvcHBlcjogcG9wcGVyT2Zmc2V0cyxcbiAgICAgICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlT2Zmc2V0c1xuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCBuZWVkZWQgZXZlbnQgbGlzdGVuZXJzIHVzZWQgdG8gdXBkYXRlIHRoZSBwb3BwZXIgcG9zaXRpb25cbiAgICAgKiBAbWV0aG9kXG4gICAgICogQG1lbWJlcm9mIFBvcHBlclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIFBvcHBlci5wcm90b3R5cGUuX3NldHVwRXZlbnRMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG4gICAgICAgIHRoaXMuc3RhdGUudXBkYXRlQm91bmQgPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpO1xuICAgICAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuc3RhdGUudXBkYXRlQm91bmQpO1xuICAgICAgICAvLyBpZiB0aGUgYm91bmRhcmllc0VsZW1lbnQgaXMgd2luZG93IHdlIGRvbid0IG5lZWQgdG8gbGlzdGVuIGZvciB0aGUgc2Nyb2xsIGV2ZW50XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50ICE9PSAnd2luZG93Jykge1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGdldFNjcm9sbFBhcmVudCh0aGlzLl9yZWZlcmVuY2UpO1xuICAgICAgICAgICAgLy8gaGVyZSBpdCBjb3VsZCBiZSBib3RoIGBib2R5YCBvciBgZG9jdW1lbnRFbGVtZW50YCB0aGFua3MgdG8gRmlyZWZveCwgd2UgdGhlbiBjaGVjayBib3RoXG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSByb290LmRvY3VtZW50LmJvZHkgfHwgdGFyZ2V0ID09PSByb290LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHJvb3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zdGF0ZS51cGRhdGVCb3VuZCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnNjcm9sbFRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVzZWQgdG8gdXBkYXRlIHRoZSBwb3BwZXIgcG9zaXRpb25cbiAgICAgKiBAbWV0aG9kXG4gICAgICogQG1lbWJlcm9mIFBvcHBlclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIFBvcHBlci5wcm90b3R5cGUuX3JlbW92ZUV2ZW50TGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBOT1RFOiAxIERPTSBhY2Nlc3MgaGVyZVxuICAgICAgICByb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuc3RhdGUudXBkYXRlQm91bmQpO1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudCAhPT0gJ3dpbmRvdycgJiYgdGhpcy5zdGF0ZS5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuc2Nyb2xsVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc3RhdGUudXBkYXRlQm91bmQpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zY3JvbGxUYXJnZXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUudXBkYXRlQm91bmQgPSBudWxsO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlZCB0aGUgYm91bmRhcmllcyBsaW1pdHMgYW5kIHJldHVybiB0aGVtXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIE9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBcIm9mZnNldHNcIiBnZW5lcmF0ZWQgYnkgYF9nZXRPZmZzZXRzYFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwYWRkaW5nIC0gQm91bmRhcmllcyBwYWRkaW5nXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBib3VuZGFyaWVzRWxlbWVudCAtIEVsZW1lbnQgdXNlZCB0byBkZWZpbmUgdGhlIGJvdW5kYXJpZXNcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBDb29yZGluYXRlcyBvZiB0aGUgYm91bmRhcmllc1xuICAgICAqL1xuICAgIFBvcHBlci5wcm90b3R5cGUuX2dldEJvdW5kYXJpZXMgPSBmdW5jdGlvbiAoZGF0YSwgcGFkZGluZywgYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgICAgICAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcbiAgICAgICAgdmFyIGJvdW5kYXJpZXMgPSB7fTtcbiAgICAgICAgdmFyIHdpZHRoLCBoZWlnaHQ7XG4gICAgICAgIGlmIChib3VuZGFyaWVzRWxlbWVudCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICAgIHZhciBib2R5ID0gcm9vdC5kb2N1bWVudC5ib2R5LFxuICAgICAgICAgICAgICAgIGh0bWwgPSByb290LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoYm9keS5zY3JvbGxIZWlnaHQsIGJvZHkub2Zmc2V0SGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgaHRtbC5zY3JvbGxIZWlnaHQsIGh0bWwub2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgoYm9keS5zY3JvbGxXaWR0aCwgYm9keS5vZmZzZXRXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5vZmZzZXRXaWR0aCk7XG5cbiAgICAgICAgICAgIGJvdW5kYXJpZXMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiB3aWR0aCxcbiAgICAgICAgICAgICAgICBib3R0b206IGhlaWdodCxcbiAgICAgICAgICAgICAgICBsZWZ0OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAndmlld3BvcnQnKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KHRoaXMuX3BvcHBlcik7XG4gICAgICAgICAgICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KHRoaXMuX3BvcHBlcik7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0UGFyZW50UmVjdCA9IGdldE9mZnNldFJlY3Qob2Zmc2V0UGFyZW50KTtcblxuICAgICAgICAgICAgLy8gVGhhbmtzIHRoZSBmdWNraW5nIG5hdGl2ZSBBUEksIGBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcGAgJiBgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcGBcbiAgICAgICAgICAgIHZhciBnZXRTY3JvbGxUb3BWYWx1ZSA9IGZ1bmN0aW9uIGdldFNjcm9sbFRvcFZhbHVlKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudCA9PSBkb2N1bWVudC5ib2R5ID8gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApIDogZWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGdldFNjcm9sbExlZnRWYWx1ZSA9IGZ1bmN0aW9uIGdldFNjcm9sbExlZnRWYWx1ZShlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgPT0gZG9jdW1lbnQuYm9keSA/IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpIDogZWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gaWYgdGhlIHBvcHBlciBpcyBmaXhlZCB3ZSBkb24ndCBoYXZlIHRvIHN1YnN0cmFjdCBzY3JvbGxpbmcgZnJvbSB0aGUgYm91bmRhcmllc1xuICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IGRhdGEub2Zmc2V0cy5wb3BwZXIucG9zaXRpb24gPT09ICdmaXhlZCcgPyAwIDogZ2V0U2Nyb2xsVG9wVmFsdWUoc2Nyb2xsUGFyZW50KTtcbiAgICAgICAgICAgIHZhciBzY3JvbGxMZWZ0ID0gZGF0YS5vZmZzZXRzLnBvcHBlci5wb3NpdGlvbiA9PT0gJ2ZpeGVkJyA/IDAgOiBnZXRTY3JvbGxMZWZ0VmFsdWUoc2Nyb2xsUGFyZW50KTtcblxuICAgICAgICAgICAgYm91bmRhcmllcyA9IHtcbiAgICAgICAgICAgICAgICB0b3A6IDAgLSAob2Zmc2V0UGFyZW50UmVjdC50b3AgLSBzY3JvbGxUb3ApLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiByb290LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCAtIChvZmZzZXRQYXJlbnRSZWN0LmxlZnQgLSBzY3JvbGxMZWZ0KSxcbiAgICAgICAgICAgICAgICBib3R0b206IHJvb3QuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCAtIChvZmZzZXRQYXJlbnRSZWN0LnRvcCAtIHNjcm9sbFRvcCksXG4gICAgICAgICAgICAgICAgbGVmdDogMCAtIChvZmZzZXRQYXJlbnRSZWN0LmxlZnQgLSBzY3JvbGxMZWZ0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChnZXRPZmZzZXRQYXJlbnQodGhpcy5fcG9wcGVyKSA9PT0gYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBib3VuZGFyaWVzID0ge1xuICAgICAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBib3VuZGFyaWVzRWxlbWVudC5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiBib3VuZGFyaWVzRWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBib3VuZGFyaWVzID0gZ2V0T2Zmc2V0UmVjdChib3VuZGFyaWVzRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYm91bmRhcmllcy5sZWZ0ICs9IHBhZGRpbmc7XG4gICAgICAgIGJvdW5kYXJpZXMucmlnaHQgLT0gcGFkZGluZztcbiAgICAgICAgYm91bmRhcmllcy50b3AgPSBib3VuZGFyaWVzLnRvcCArIHBhZGRpbmc7XG4gICAgICAgIGJvdW5kYXJpZXMuYm90dG9tID0gYm91bmRhcmllcy5ib3R0b20gLSBwYWRkaW5nO1xuICAgICAgICByZXR1cm4gYm91bmRhcmllcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTG9vcCB0cm91Z2ggdGhlIGxpc3Qgb2YgbW9kaWZpZXJzIGFuZCBydW4gdGhlbSBpbiBvcmRlciwgZWFjaCBvZiB0aGVtIHdpbGwgdGhlbiBlZGl0IHRoZSBkYXRhIG9iamVjdFxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAbWVtYmVyb2YgUG9wcGVyXG4gICAgICogQGFjY2VzcyBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVyc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVuZHNcbiAgICAgKi9cbiAgICBQb3BwZXIucHJvdG90eXBlLnJ1bk1vZGlmaWVycyA9IGZ1bmN0aW9uIChkYXRhLCBtb2RpZmllcnMsIGVuZHMpIHtcbiAgICAgICAgdmFyIG1vZGlmaWVyc1RvUnVuID0gbW9kaWZpZXJzLnNsaWNlKCk7XG4gICAgICAgIGlmIChlbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1vZGlmaWVyc1RvUnVuID0gdGhpcy5fb3B0aW9ucy5tb2RpZmllcnMuc2xpY2UoMCwgZ2V0QXJyYXlLZXlJbmRleCh0aGlzLl9vcHRpb25zLm1vZGlmaWVycywgZW5kcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgbW9kaWZpZXJzVG9SdW4uZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKG1vZGlmaWVyKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBtb2RpZmllci5jYWxsKHRoaXMsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgdXNlZCB0byBrbm93IGlmIHRoZSBnaXZlbiBtb2RpZmllciBkZXBlbmRzIGZyb20gYW5vdGhlciBvbmUuXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdGluZyAtIG5hbWUgb2YgcmVxdWVzdGluZyBtb2RpZmllclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0ZWQgLSBuYW1lIG9mIHJlcXVlc3RlZCBtb2RpZmllclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIFBvcHBlci5wcm90b3R5cGUuaXNNb2RpZmllclJlcXVpcmVkID0gZnVuY3Rpb24gKHJlcXVlc3RpbmcsIHJlcXVlc3RlZCkge1xuICAgICAgICB2YXIgaW5kZXggPSBnZXRBcnJheUtleUluZGV4KHRoaXMuX29wdGlvbnMubW9kaWZpZXJzLCByZXF1ZXN0aW5nKTtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fb3B0aW9ucy5tb2RpZmllcnMuc2xpY2UoMCwgaW5kZXgpLmZpbHRlcihmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBtb2RpZmllciA9PT0gcmVxdWVzdGVkO1xuICAgICAgICB9KS5sZW5ndGg7XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy8gTW9kaWZpZXJzXG4gICAgLy9cblxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVycyBsaXN0XG4gICAgICogQG5hbWVzcGFjZSBQb3BwZXIubW9kaWZpZXJzXG4gICAgICogQG1lbWJlcm9mIFBvcHBlclxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgUG9wcGVyLnByb3RvdHlwZS5tb2RpZmllcnMgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEFwcGx5IHRoZSBjb21wdXRlZCBzdHlsZXMgdG8gdGhlIHBvcHBlciBlbGVtZW50XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBtZW1iZXJvZiBQb3BwZXIubW9kaWZpZXJzXG4gICAgICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIGRhdGEgb2JqZWN0XG4gICAgICovXG4gICAgUG9wcGVyLnByb3RvdHlwZS5tb2RpZmllcnMuYXBwbHlTdHlsZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIC8vIGFwcGx5IHRoZSBmaW5hbCBvZmZzZXRzIHRvIHRoZSBwb3BwZXJcbiAgICAgICAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcbiAgICAgICAgdmFyIHN0eWxlcyA9IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBkYXRhLm9mZnNldHMucG9wcGVyLnBvc2l0aW9uXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gcm91bmQgdG9wIGFuZCBsZWZ0IHRvIGF2b2lkIGJsdXJyeSB0ZXh0XG4gICAgICAgIHZhciBsZWZ0ID0gTWF0aC5yb3VuZChkYXRhLm9mZnNldHMucG9wcGVyLmxlZnQpO1xuICAgICAgICB2YXIgdG9wID0gTWF0aC5yb3VuZChkYXRhLm9mZnNldHMucG9wcGVyLnRvcCk7XG5cbiAgICAgICAgLy8gaWYgZ3B1QWNjZWxlcmF0aW9uIGlzIHNldCB0byB0cnVlIGFuZCB0cmFuc2Zvcm0gaXMgc3VwcG9ydGVkLCB3ZSB1c2UgYHRyYW5zbGF0ZTNkYCB0byBhcHBseSB0aGUgcG9zaXRpb24gdG8gdGhlIHBvcHBlclxuICAgICAgICAvLyB3ZSBhdXRvbWF0aWNhbGx5IHVzZSB0aGUgc3VwcG9ydGVkIHByZWZpeGVkIHZlcnNpb24gaWYgbmVlZGVkXG4gICAgICAgIHZhciBwcmVmaXhlZFByb3BlcnR5O1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5ncHVBY2NlbGVyYXRpb24gJiYgKHByZWZpeGVkUHJvcGVydHkgPSBnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUoJ3RyYW5zZm9ybScpKSkge1xuICAgICAgICAgICAgc3R5bGVzW3ByZWZpeGVkUHJvcGVydHldID0gJ3RyYW5zbGF0ZTNkKCcgKyBsZWZ0ICsgJ3B4LCAnICsgdG9wICsgJ3B4LCAwKSc7XG4gICAgICAgICAgICBzdHlsZXMudG9wID0gMDtcbiAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGh3ZXJpc2UsIHdlIHVzZSB0aGUgc3RhbmRhcmQgYGxlZnRgIGFuZCBgdG9wYCBwcm9wZXJ0aWVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gdG9wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIC8vIGFueSBwcm9wZXJ0eSBwcmVzZW50IGluIGBkYXRhLnN0eWxlc2Agd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIsXG4gICAgICAgIC8vIGluIHRoaXMgd2F5IHdlIGNhbiBtYWtlIHRoZSAzcmQgcGFydHkgbW9kaWZpZXJzIGFkZCBjdXN0b20gc3R5bGVzIHRvIGl0XG4gICAgICAgIC8vIEJlIGF3YXJlLCBtb2RpZmllcnMgY291bGQgb3ZlcnJpZGUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgcHJldmlvdXNcbiAgICAgICAgLy8gbGluZXMgb2YgdGhpcyBtb2RpZmllciFcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZXMsIGRhdGEuc3R5bGVzKTtcblxuICAgICAgICBzZXRTdHlsZSh0aGlzLl9wb3BwZXIsIHN0eWxlcyk7XG5cbiAgICAgICAgLy8gc2V0IGFuIGF0dHJpYnV0ZSB3aGljaCB3aWxsIGJlIHVzZWZ1bCB0byBzdHlsZSB0aGUgdG9vbHRpcCAodXNlIGl0IHRvIHByb3Blcmx5IHBvc2l0aW9uIGl0cyBhcnJvdylcbiAgICAgICAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcbiAgICAgICAgdGhpcy5fcG9wcGVyLnNldEF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnLCBkYXRhLnBsYWNlbWVudCk7XG5cbiAgICAgICAgLy8gaWYgdGhlIGFycm93IG1vZGlmaWVyIGlzIHJlcXVpcmVkIGFuZCB0aGUgYXJyb3cgc3R5bGUgaGFzIGJlZW4gY29tcHV0ZWQsIGFwcGx5IHRoZSBhcnJvdyBzdHlsZVxuICAgICAgICBpZiAodGhpcy5pc01vZGlmaWVyUmVxdWlyZWQodGhpcy5tb2RpZmllcnMuYXBwbHlTdHlsZSwgdGhpcy5tb2RpZmllcnMuYXJyb3cpICYmIGRhdGEub2Zmc2V0cy5hcnJvdykge1xuICAgICAgICAgICAgc2V0U3R5bGUoZGF0YS5hcnJvd0VsZW1lbnQsIGRhdGEub2Zmc2V0cy5hcnJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTW9kaWZpZXIgdXNlZCB0byBzaGlmdCB0aGUgcG9wcGVyIG9uIHRoZSBzdGFydCBvciBlbmQgb2YgaXRzIHJlZmVyZW5jZSBlbGVtZW50IHNpZGVcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQG1lbWJlcm9mIFBvcHBlci5tb2RpZmllcnNcbiAgICAgKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gICAgICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICAgICAqL1xuICAgIFBvcHBlci5wcm90b3R5cGUubW9kaWZpZXJzLnNoaWZ0ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50O1xuICAgICAgICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICAgICAgICB2YXIgc2hpZnRWYXJpYXRpb24gPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcblxuICAgICAgICAvLyBpZiBzaGlmdCBzaGlmdFZhcmlhdGlvbiBpcyBzcGVjaWZpZWQsIHJ1biB0aGUgbW9kaWZpZXJcbiAgICAgICAgaWYgKHNoaWZ0VmFyaWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZTtcbiAgICAgICAgICAgIHZhciBwb3BwZXIgPSBnZXRQb3BwZXJDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpO1xuXG4gICAgICAgICAgICB2YXIgc2hpZnRPZmZzZXRzID0ge1xuICAgICAgICAgICAgICAgIHk6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHsgdG9wOiByZWZlcmVuY2UudG9wIH0sXG4gICAgICAgICAgICAgICAgICAgIGVuZDogeyB0b3A6IHJlZmVyZW5jZS50b3AgKyByZWZlcmVuY2UuaGVpZ2h0IC0gcG9wcGVyLmhlaWdodCB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB7IGxlZnQ6IHJlZmVyZW5jZS5sZWZ0IH0sXG4gICAgICAgICAgICAgICAgICAgIGVuZDogeyBsZWZ0OiByZWZlcmVuY2UubGVmdCArIHJlZmVyZW5jZS53aWR0aCAtIHBvcHBlci53aWR0aCB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIGF4aXMgPSBbJ2JvdHRvbScsICd0b3AnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMSA/ICd4JyA6ICd5JztcblxuICAgICAgICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24ocG9wcGVyLCBzaGlmdE9mZnNldHNbYXhpc11bc2hpZnRWYXJpYXRpb25dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBNb2RpZmllciB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgcG9wcGVyIGRvZXMgbm90IG92ZXJmbG93cyBmcm9tIGl0J3MgYm91bmRhcmllc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAbWVtYmVyb2YgUG9wcGVyLm1vZGlmaWVyc1xuICAgICAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gICAgICovXG4gICAgUG9wcGVyLnByb3RvdHlwZS5tb2RpZmllcnMucHJldmVudE92ZXJmbG93ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyIG9yZGVyID0gdGhpcy5fb3B0aW9ucy5wcmV2ZW50T3ZlcmZsb3dPcmRlcjtcbiAgICAgICAgdmFyIHBvcHBlciA9IGdldFBvcHBlckNsaWVudFJlY3QoZGF0YS5vZmZzZXRzLnBvcHBlcik7XG5cbiAgICAgICAgdmFyIGNoZWNrID0ge1xuICAgICAgICAgICAgbGVmdDogZnVuY3Rpb24gbGVmdCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IHBvcHBlci5sZWZ0O1xuICAgICAgICAgICAgICAgIGlmIChwb3BwZXIubGVmdCA8IGRhdGEuYm91bmRhcmllcy5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBNYXRoLm1heChwb3BwZXIubGVmdCwgZGF0YS5ib3VuZGFyaWVzLmxlZnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBsZWZ0OiBsZWZ0IH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmlnaHQ6IGZ1bmN0aW9uIHJpZ2h0KCkge1xuICAgICAgICAgICAgICAgIHZhciBsZWZ0ID0gcG9wcGVyLmxlZnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvcHBlci5yaWdodCA+IGRhdGEuYm91bmRhcmllcy5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gTWF0aC5taW4ocG9wcGVyLmxlZnQsIGRhdGEuYm91bmRhcmllcy5yaWdodCAtIHBvcHBlci53aWR0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxlZnQ6IGxlZnQgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0b3A6IGZ1bmN0aW9uIHRvcCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9wID0gcG9wcGVyLnRvcDtcbiAgICAgICAgICAgICAgICBpZiAocG9wcGVyLnRvcCA8IGRhdGEuYm91bmRhcmllcy50b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gTWF0aC5tYXgocG9wcGVyLnRvcCwgZGF0YS5ib3VuZGFyaWVzLnRvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHRvcDogdG9wIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm90dG9tOiBmdW5jdGlvbiBib3R0b20oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvcCA9IHBvcHBlci50b3A7XG4gICAgICAgICAgICAgICAgaWYgKHBvcHBlci5ib3R0b20gPiBkYXRhLmJvdW5kYXJpZXMuYm90dG9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IE1hdGgubWluKHBvcHBlci50b3AsIGRhdGEuYm91bmRhcmllcy5ib3R0b20gLSBwb3BwZXIuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdG9wOiB0b3AgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBvcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHBvcHBlciwgY2hlY2tbZGlyZWN0aW9uXSgpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVyIHVzZWQgdG8gbWFrZSBzdXJlIHRoZSBwb3BwZXIgaXMgYWx3YXlzIG5lYXIgaXRzIHJlZmVyZW5jZVxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAbWVtYmVyb2YgUG9wcGVyLm1vZGlmaWVyc1xuICAgICAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBfdXBkYXRlIG1ldGhvZFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAgICAgKi9cbiAgICBQb3BwZXIucHJvdG90eXBlLm1vZGlmaWVycy5rZWVwVG9nZXRoZXIgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgcG9wcGVyID0gZ2V0UG9wcGVyQ2xpZW50UmVjdChkYXRhLm9mZnNldHMucG9wcGVyKTtcbiAgICAgICAgdmFyIHJlZmVyZW5jZSA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2U7XG4gICAgICAgIHZhciBmID0gTWF0aC5mbG9vcjtcblxuICAgICAgICBpZiAocG9wcGVyLnJpZ2h0IDwgZihyZWZlcmVuY2UubGVmdCkpIHtcbiAgICAgICAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIubGVmdCA9IGYocmVmZXJlbmNlLmxlZnQpIC0gcG9wcGVyLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3BwZXIubGVmdCA+IGYocmVmZXJlbmNlLnJpZ2h0KSkge1xuICAgICAgICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlci5sZWZ0ID0gZihyZWZlcmVuY2UucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3BwZXIuYm90dG9tIDwgZihyZWZlcmVuY2UudG9wKSkge1xuICAgICAgICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlci50b3AgPSBmKHJlZmVyZW5jZS50b3ApIC0gcG9wcGVyLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9wcGVyLnRvcCA+IGYocmVmZXJlbmNlLmJvdHRvbSkpIHtcbiAgICAgICAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIudG9wID0gZihyZWZlcmVuY2UuYm90dG9tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBNb2RpZmllciB1c2VkIHRvIGZsaXAgdGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wcGVyIHdoZW4gdGhlIGxhdHRlciBpcyBzdGFydGluZyBvdmVybGFwcGluZyBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAgICogUmVxdWlyZXMgdGhlIGBwcmV2ZW50T3ZlcmZsb3dgIG1vZGlmaWVyIGJlZm9yZSBpdCBpbiBvcmRlciB0byB3b3JrLlxuICAgICAqICoqTk9URToqKiBUaGlzIG1vZGlmaWVyIHdpbGwgcnVuIGFsbCBpdHMgcHJldmlvdXMgbW9kaWZpZXJzIGV2ZXJ5dGltZSBpdCB0cmllcyB0byBmbGlwIHRoZSBwb3BwZXIhXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBtZW1iZXJvZiBQb3BwZXIubW9kaWZpZXJzXG4gICAgICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IF91cGRhdGUgbWV0aG9kXG4gICAgICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICAgICAqL1xuICAgIFBvcHBlci5wcm90b3R5cGUubW9kaWZpZXJzLmZsaXAgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAvLyBjaGVjayBpZiBwcmV2ZW50T3ZlcmZsb3cgaXMgaW4gdGhlIGxpc3Qgb2YgbW9kaWZpZXJzIGJlZm9yZSB0aGUgZmxpcCBtb2RpZmllci5cbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZsaXAgd291bGQgbm90IHdvcmsgYXMgZXhwZWN0ZWQuXG4gICAgICAgIGlmICghdGhpcy5pc01vZGlmaWVyUmVxdWlyZWQodGhpcy5tb2RpZmllcnMuZmxpcCwgdGhpcy5tb2RpZmllcnMucHJldmVudE92ZXJmbG93KSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBwcmV2ZW50T3ZlcmZsb3cgbW9kaWZpZXIgaXMgcmVxdWlyZWQgYnkgZmxpcCBtb2RpZmllciBpbiBvcmRlciB0byB3b3JrLCBiZSBzdXJlIHRvIGluY2x1ZGUgaXQgYmVmb3JlIGZsaXAhJyk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLmZsaXBwZWQgJiYgZGF0YS5wbGFjZW1lbnQgPT09IGRhdGEuX29yaWdpbmFsUGxhY2VtZW50KSB7XG4gICAgICAgICAgICAvLyBzZWVtcyBsaWtlIGZsaXAgaXMgdHJ5aW5nIHRvIGxvb3AsIHByb2JhYmx5IHRoZXJlJ3Mgbm90IGVub3VnaCBzcGFjZSBvbiBhbnkgb2YgdGhlIGZsaXBwYWJsZSBzaWRlc1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgICAgICAgdmFyIHBsYWNlbWVudE9wcG9zaXRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgICAgICAgdmFyIHZhcmlhdGlvbiA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMV0gfHwgJyc7XG5cbiAgICAgICAgdmFyIGZsaXBPcmRlciA9IFtdO1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5mbGlwQmVoYXZpb3IgPT09ICdmbGlwJykge1xuICAgICAgICAgICAgZmxpcE9yZGVyID0gW3BsYWNlbWVudCwgcGxhY2VtZW50T3Bwb3NpdGVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmxpcE9yZGVyID0gdGhpcy5fb3B0aW9ucy5mbGlwQmVoYXZpb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmbGlwT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAoc3RlcCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChwbGFjZW1lbnQgIT09IHN0ZXAgfHwgZmxpcE9yZGVyLmxlbmd0aCA9PT0gaW5kZXggKyAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICAgICAgICAgICAgcGxhY2VtZW50T3Bwb3NpdGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuXG4gICAgICAgICAgICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGdldFBvcHBlckNsaWVudFJlY3QoZGF0YS5vZmZzZXRzLnBvcHBlcik7XG5cbiAgICAgICAgICAgIC8vIHRoaXMgYm9vbGVhbiBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIHJpZ2h0IGFuZCBib3R0b20gZnJvbSB0b3AgYW5kIGxlZnRcbiAgICAgICAgICAgIC8vIHRoZXkgbmVlZCBkaWZmZXJlbnQgY29tcHV0YXRpb25zIHRvIGdldCBmbGlwcGVkXG4gICAgICAgICAgICB2YXIgYSA9IFsncmlnaHQnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcblxuICAgICAgICAgICAgLy8gdXNpbmcgTWF0aC5mbG9vciBiZWNhdXNlIHRoZSByZWZlcmVuY2Ugb2Zmc2V0cyBtYXkgY29udGFpbiBkZWNpbWFscyB3ZSBhcmUgbm90IGdvaW5nIHRvIGNvbnNpZGVyIGhlcmVcbiAgICAgICAgICAgIGlmIChhICYmIE1hdGguZmxvb3IoZGF0YS5vZmZzZXRzLnJlZmVyZW5jZVtwbGFjZW1lbnRdKSA+IE1hdGguZmxvb3IocG9wcGVyT2Zmc2V0c1twbGFjZW1lbnRPcHBvc2l0ZV0pIHx8ICFhICYmIE1hdGguZmxvb3IoZGF0YS5vZmZzZXRzLnJlZmVyZW5jZVtwbGFjZW1lbnRdKSA8IE1hdGguZmxvb3IocG9wcGVyT2Zmc2V0c1twbGFjZW1lbnRPcHBvc2l0ZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gd2UnbGwgdXNlIHRoaXMgYm9vbGVhbiB0byBkZXRlY3QgYW55IGZsaXAgbG9vcFxuICAgICAgICAgICAgICAgIGRhdGEuZmxpcHBlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZGF0YS5wbGFjZW1lbnQgPSBmbGlwT3JkZXJbaW5kZXggKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAodmFyaWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEucGxhY2VtZW50ICs9ICctJyArIHZhcmlhdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IHRoaXMuX2dldE9mZnNldHModGhpcy5fcG9wcGVyLCB0aGlzLl9yZWZlcmVuY2UsIGRhdGEucGxhY2VtZW50KS5wb3BwZXI7XG5cbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5ydW5Nb2RpZmllcnMoZGF0YSwgdGhpcy5fb3B0aW9ucy5tb2RpZmllcnMsIHRoaXMuX2ZsaXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTW9kaWZpZXIgdXNlZCB0byBhZGQgYW4gb2Zmc2V0IHRvIHRoZSBwb3BwZXIsIHVzZWZ1bCBpZiB5b3UgbW9yZSBncmFudWxhcml0eSBwb3NpdGlvbmluZyB5b3VyIHBvcHBlci5cbiAgICAgKiBUaGUgb2Zmc2V0cyB3aWxsIHNoaWZ0IHRoZSBwb3BwZXIgb24gdGhlIHNpZGUgb2YgaXRzIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAbWVtYmVyb2YgUG9wcGVyLm1vZGlmaWVyc1xuICAgICAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBfdXBkYXRlIG1ldGhvZFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAgICAgKi9cbiAgICBQb3BwZXIucHJvdG90eXBlLm1vZGlmaWVycy5vZmZzZXQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb3B0aW9ucy5vZmZzZXQ7XG4gICAgICAgIHZhciBwb3BwZXIgPSBkYXRhLm9mZnNldHMucG9wcGVyO1xuXG4gICAgICAgIGlmIChkYXRhLnBsYWNlbWVudC5pbmRleE9mKCdsZWZ0JykgIT09IC0xKSB7XG4gICAgICAgICAgICBwb3BwZXIudG9wIC09IG9mZnNldDtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnBsYWNlbWVudC5pbmRleE9mKCdyaWdodCcpICE9PSAtMSkge1xuICAgICAgICAgICAgcG9wcGVyLnRvcCArPSBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5wbGFjZW1lbnQuaW5kZXhPZigndG9wJykgIT09IC0xKSB7XG4gICAgICAgICAgICBwb3BwZXIubGVmdCAtPSBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5wbGFjZW1lbnQuaW5kZXhPZignYm90dG9tJykgIT09IC0xKSB7XG4gICAgICAgICAgICBwb3BwZXIubGVmdCArPSBvZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVyIHVzZWQgdG8gbW92ZSB0aGUgYXJyb3dzIG9uIHRoZSBlZGdlIG9mIHRoZSBwb3BwZXIgdG8gbWFrZSBzdXJlIHRoZW0gYXJlIGFsd2F5cyBiZXR3ZWVuIHRoZSBwb3BwZXIgYW5kIHRoZSByZWZlcmVuY2UgZWxlbWVudFxuICAgICAqIEl0IHdpbGwgdXNlIHRoZSBDU1Mgb3V0ZXIgc2l6ZSBvZiB0aGUgYXJyb3cgZWxlbWVudCB0byBrbm93IGhvdyBtYW55IHBpeGVscyBvZiBjb25qdWN0aW9uIGFyZSBuZWVkZWRcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQG1lbWJlcm9mIFBvcHBlci5tb2RpZmllcnNcbiAgICAgKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgX3VwZGF0ZSBtZXRob2RcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gICAgICovXG4gICAgUG9wcGVyLnByb3RvdHlwZS5tb2RpZmllcnMuYXJyb3cgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgYXJyb3cgPSB0aGlzLl9vcHRpb25zLmFycm93RWxlbWVudDtcbiAgICAgICAgdmFyIGFycm93T2Zmc2V0ID0gdGhpcy5fb3B0aW9ucy5hcnJvd09mZnNldDtcblxuICAgICAgICAvLyBpZiB0aGUgYXJyb3dFbGVtZW50IGlzIGEgc3RyaW5nLCBzdXBwb3NlIGl0J3MgYSBDU1Mgc2VsZWN0b3JcbiAgICAgICAgaWYgKHR5cGVvZiBhcnJvdyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGFycm93ID0gdGhpcy5fcG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgYXJyb3cgZWxlbWVudCBpcyBub3QgZm91bmQsIGRvbid0IHJ1biB0aGUgbW9kaWZpZXJcbiAgICAgICAgaWYgKCFhcnJvdykge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgYXJyb3cgZWxlbWVudCBtdXN0IGJlIGNoaWxkIG9mIGl0cyBwb3BwZXJcbiAgICAgICAgaWYgKCF0aGlzLl9wb3BwZXIuY29udGFpbnMoYXJyb3cpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IGBhcnJvd0VsZW1lbnRgIG11c3QgYmUgY2hpbGQgb2YgaXRzIHBvcHBlciBlbGVtZW50IScpO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhcnJvdyBkZXBlbmRzIG9uIGtlZXBUb2dldGhlciBpbiBvcmRlciB0byB3b3JrXG4gICAgICAgIGlmICghdGhpcy5pc01vZGlmaWVyUmVxdWlyZWQodGhpcy5tb2RpZmllcnMuYXJyb3csIHRoaXMubW9kaWZpZXJzLmtlZXBUb2dldGhlcikpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignV0FSTklORzoga2VlcFRvZ2V0aGVyIG1vZGlmaWVyIGlzIHJlcXVpcmVkIGJ5IGFycm93IG1vZGlmaWVyIGluIG9yZGVyIHRvIHdvcmssIGJlIHN1cmUgdG8gaW5jbHVkZSBpdCBiZWZvcmUgYXJyb3chJyk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhcnJvd1N0eWxlID0ge307XG4gICAgICAgIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICAgICAgICB2YXIgcG9wcGVyID0gZ2V0UG9wcGVyQ2xpZW50UmVjdChkYXRhLm9mZnNldHMucG9wcGVyKTtcbiAgICAgICAgdmFyIHJlZmVyZW5jZSA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2U7XG4gICAgICAgIHZhciBpc1ZlcnRpY2FsID0gWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcblxuICAgICAgICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICAgICAgdmFyIHNpZGUgPSBpc1ZlcnRpY2FsID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgICAgIHZhciB0cmFuc2xhdGUgPSBpc1ZlcnRpY2FsID8gJ3RyYW5zbGF0ZVknIDogJ3RyYW5zbGF0ZVgnO1xuICAgICAgICB2YXIgYWx0U2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgICAgICAgdmFyIG9wU2lkZSA9IGlzVmVydGljYWwgPyAnYm90dG9tJyA6ICdyaWdodCc7XG4gICAgICAgIHZhciBhcnJvd1NpemUgPSBnZXRPdXRlclNpemVzKGFycm93KVtsZW5dO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGV4dGVuZHMga2VlcFRvZ2V0aGVyIGJlaGF2aW9yIG1ha2luZyBzdXJlIHRoZSBwb3BwZXIgYW5kIGl0cyByZWZlcmVuY2UgaGF2ZSBlbm91Z2ggcGl4ZWxzIGluIGNvbmp1Y3Rpb25cbiAgICAgICAgLy9cblxuICAgICAgICAvLyB0b3AvbGVmdCBzaWRlXG4gICAgICAgIGlmIChyZWZlcmVuY2Vbb3BTaWRlXSAtIGFycm93U2l6ZSA8IHBvcHBlcltzaWRlXSkge1xuICAgICAgICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlcltzaWRlXSAtPSBwb3BwZXJbc2lkZV0gLSAocmVmZXJlbmNlW29wU2lkZV0gLSBhcnJvd1NpemUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJvdHRvbS9yaWdodCBzaWRlXG4gICAgICAgIGlmIChyZWZlcmVuY2Vbc2lkZV0gKyBhcnJvd1NpemUgPiBwb3BwZXJbb3BTaWRlXSkge1xuICAgICAgICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlcltzaWRlXSArPSByZWZlcmVuY2Vbc2lkZV0gKyBhcnJvd1NpemUgLSBwb3BwZXJbb3BTaWRlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbXB1dGUgY2VudGVyIG9mIHRoZSBwb3BwZXJcbiAgICAgICAgdmFyIGNlbnRlciA9IHJlZmVyZW5jZVtzaWRlXSArIChhcnJvd09mZnNldCB8fCByZWZlcmVuY2VbbGVuXSAvIDIgLSBhcnJvd1NpemUgLyAyKTtcblxuICAgICAgICB2YXIgc2lkZVZhbHVlID0gY2VudGVyIC0gcG9wcGVyW3NpZGVdO1xuXG4gICAgICAgIC8vIHByZXZlbnQgYXJyb3cgZnJvbSBiZWluZyBwbGFjZWQgbm90IGNvbnRpZ3VvdXNseSB0byBpdHMgcG9wcGVyXG4gICAgICAgIHNpZGVWYWx1ZSA9IE1hdGgubWF4KE1hdGgubWluKHBvcHBlcltsZW5dIC0gYXJyb3dTaXplIC0gOCwgc2lkZVZhbHVlKSwgOCk7XG4gICAgICAgIGFycm93U3R5bGVbc2lkZV0gPSBzaWRlVmFsdWU7XG4gICAgICAgIGFycm93U3R5bGVbYWx0U2lkZV0gPSAnJzsgLy8gbWFrZSBzdXJlIHRvIHJlbW92ZSBhbnkgb2xkIHN0eWxlIGZyb20gdGhlIGFycm93XG5cbiAgICAgICAgZGF0YS5vZmZzZXRzLmFycm93ID0gYXJyb3dTdHlsZTtcbiAgICAgICAgZGF0YS5hcnJvd0VsZW1lbnQgPSBhcnJvdztcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuXG4gICAgLy9cbiAgICAvLyBIZWxwZXJzXG4gICAgLy9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgb3V0ZXIgc2l6ZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgKG9mZnNldCBzaXplICsgbWFyZ2lucylcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAaWdub3JlXG4gICAgICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IGNvbnRhaW5pbmcgd2lkdGggYW5kIGhlaWdodCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0T3V0ZXJTaXplcyhlbGVtZW50KSB7XG4gICAgICAgIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG4gICAgICAgIHZhciBfZGlzcGxheSA9IGVsZW1lbnQuc3R5bGUuZGlzcGxheSxcbiAgICAgICAgICAgIF92aXNpYmlsaXR5ID0gZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5O1xuICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB2YXIgY2FsY1dpZHRoVG9Gb3JjZVJlcGFpbnQgPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuXG4gICAgICAgIC8vIG9yaWdpbmFsIG1ldGhvZFxuICAgICAgICB2YXIgc3R5bGVzID0gcm9vdC5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgICAgICB2YXIgeCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCkgKyBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5Cb3R0b20pO1xuICAgICAgICB2YXIgeSA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkxlZnQpICsgcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luUmlnaHQpO1xuICAgICAgICB2YXIgcmVzdWx0ID0geyB3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCArIHksIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQgKyB4IH07XG5cbiAgICAgICAgLy8gcmVzZXQgZWxlbWVudCBzdHlsZXNcbiAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gX2Rpc3BsYXk7ZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gX3Zpc2liaWxpdHk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvcHBvc2l0ZSBwbGFjZW1lbnQgb2YgdGhlIGdpdmVuIG9uZS9cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAaWdub3JlXG4gICAgICogQGFyZ3VtZW50IHtTdHJpbmd9IHBsYWNlbWVudFxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IGZsaXBwZWQgcGxhY2VtZW50XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBoYXNoID0geyBsZWZ0OiAncmlnaHQnLCByaWdodDogJ2xlZnQnLCBib3R0b206ICd0b3AnLCB0b3A6ICdib3R0b20nIH07XG4gICAgICAgIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gdGhlIHBvcHBlciBvZmZzZXRzLCBnZW5lcmF0ZSBhbiBvdXRwdXQgc2ltaWxhciB0byBnZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAaWdub3JlXG4gICAgICogQGFyZ3VtZW50IHtPYmplY3R9IHBvcHBlck9mZnNldHNcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBDbGllbnRSZWN0IGxpa2Ugb3V0cHV0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0UG9wcGVyQ2xpZW50UmVjdChwb3BwZXJPZmZzZXRzKSB7XG4gICAgICAgIHZhciBvZmZzZXRzID0gT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyT2Zmc2V0cyk7XG4gICAgICAgIG9mZnNldHMucmlnaHQgPSBvZmZzZXRzLmxlZnQgKyBvZmZzZXRzLndpZHRoO1xuICAgICAgICBvZmZzZXRzLmJvdHRvbSA9IG9mZnNldHMudG9wICsgb2Zmc2V0cy5oZWlnaHQ7XG4gICAgICAgIHJldHVybiBvZmZzZXRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGFuIGFycmF5IGFuZCB0aGUga2V5IHRvIGZpbmQsIHJldHVybnMgaXRzIGluZGV4XG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQGlnbm9yZVxuICAgICAqIEBhcmd1bWVudCB7QXJyYXl9IGFyclxuICAgICAqIEBhcmd1bWVudCBrZXlUb0ZpbmRcbiAgICAgKiBAcmV0dXJucyBpbmRleCBvciBudWxsXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0QXJyYXlLZXlJbmRleChhcnIsIGtleVRvRmluZCkge1xuICAgICAgICB2YXIgaSA9IDAsXG4gICAgICAgICAgICBrZXk7XG4gICAgICAgIGZvciAoa2V5IGluIGFycikge1xuICAgICAgICAgICAgaWYgKGFycltrZXldID09PSBrZXlUb0ZpbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgQ1NTIGNvbXB1dGVkIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQGlnbm9yZVxuICAgICAqIEBhcmd1bWVudCB7RWVtZW50fSBlbGVtZW50XG4gICAgICogQGFyZ3VtZW50IHtTdHJpbmd9IHByb3BlcnR5XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KSB7XG4gICAgICAgIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG4gICAgICAgIHZhciBjc3MgPSByb290LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7XG4gICAgICAgIHJldHVybiBjc3NbcHJvcGVydHldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG9mZnNldCBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAaWdub3JlXG4gICAgICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IG9mZnNldCBwYXJlbnRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICAgICAgICAvLyBOT1RFOiAxIERPTSBhY2Nlc3MgaGVyZVxuICAgICAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG4gICAgICAgIHJldHVybiBvZmZzZXRQYXJlbnQgPT09IHJvb3QuZG9jdW1lbnQuYm9keSB8fCAhb2Zmc2V0UGFyZW50ID8gcm9vdC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgOiBvZmZzZXRQYXJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2Nyb2xsaW5nIHBhcmVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gb2Zmc2V0IHBhcmVudFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFNjcm9sbFBhcmVudChlbGVtZW50KSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG5cbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmVudCA9PT0gcm9vdC5kb2N1bWVudCkge1xuICAgICAgICAgICAgLy8gRmlyZWZveCBwdXRzIHRoZSBzY3JvbGxUT3AgdmFsdWUgb24gYGRvY3VtZW50RWxlbWVudGAgaW5zdGVhZCBvZiBgYm9keWAsIHdlIHRoZW4gY2hlY2sgd2hpY2ggb2YgdGhlbSBpc1xuICAgICAgICAgICAgLy8gZ3JlYXRlciB0aGFuIDAgYW5kIHJldHVybiB0aGUgcHJvcGVyIGVsZW1lbnRcbiAgICAgICAgICAgIGlmIChyb290LmRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8IHJvb3QuZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvb3QuZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvb3QuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyZWZveCB3YW50IHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gICAgICAgIGlmIChbJ3Njcm9sbCcsICdhdXRvJ10uaW5kZXhPZihnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkocGFyZW50LCAnb3ZlcmZsb3cnKSkgIT09IC0xIHx8IFsnc2Nyb2xsJywgJ2F1dG8nXS5pbmRleE9mKGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShwYXJlbnQsICdvdmVyZmxvdy14JykpICE9PSAtMSB8fCBbJ3Njcm9sbCcsICdhdXRvJ10uaW5kZXhPZihnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkocGFyZW50LCAnb3ZlcmZsb3cteScpKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBkZXRlY3RlZCBzY3JvbGxQYXJlbnQgaXMgYm9keSwgd2UgcGVyZm9ybSBhbiBhZGRpdGlvbmFsIGNoZWNrIG9uIGl0cyBwYXJlbnROb2RlXG4gICAgICAgICAgICAvLyBpbiB0aGlzIHdheSB3ZSdsbCBnZXQgYm9keSBpZiB0aGUgYnJvd3NlciBpcyBDaHJvbWUtaXNoLCBvciBkb2N1bWVudEVsZW1lbnQgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyBmaXhlcyBpc3N1ZSAjNjVcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChlbGVtZW50LnBhcmVudE5vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIGZpeGVkIG9yIGlzIGluc2lkZSBhIGZpeGVkIHBhcmVudFxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAYXJndW1lbnQge0VsZW1lbnR9IGN1c3RvbUNvbnRhaW5lclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBhbnN3ZXIgdG8gXCJpc0ZpeGVkP1wiXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGaXhlZChlbGVtZW50KSB7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSByb290LmRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQsICdwb3NpdGlvbicpID09PSAnZml4ZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudC5wYXJlbnROb2RlID8gaXNGaXhlZChlbGVtZW50LnBhcmVudE5vZGUpIDogZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHN0eWxlIHRvIHRoZSBnaXZlbiBwb3BwZXJcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAaWdub3JlXG4gICAgICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhcHBseSB0aGUgc3R5bGUgdG9cbiAgICAgKiBAYXJndW1lbnQge09iamVjdH0gc3R5bGVzIC0gT2JqZWN0IHdpdGggYSBsaXN0IG9mIHByb3BlcnRpZXMgYW5kIHZhbHVlcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRTdHlsZShlbGVtZW50LCBzdHlsZXMpIHtcbiAgICAgICAgZnVuY3Rpb24gaXNfbnVtZXJpYyhuKSB7XG4gICAgICAgICAgICByZXR1cm4gbiAhPT0gJycgJiYgIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgdmFyIHVuaXQgPSAnJztcbiAgICAgICAgICAgIC8vIGFkZCB1bml0IGlmIHRoZSB2YWx1ZSBpcyBudW1lcmljIGFuZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZ1xuICAgICAgICAgICAgaWYgKFsnd2lkdGgnLCAnaGVpZ2h0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLmluZGV4T2YocHJvcCkgIT09IC0xICYmIGlzX251bWVyaWMoc3R5bGVzW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgIHVuaXQgPSAncHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHN0eWxlc1twcm9wXSArIHVuaXQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIGZ1bmN0aW9uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQGlnbm9yZVxuICAgICAqIEBhcmd1bWVudCB7Kn0gZnVuY3Rpb25Ub0NoZWNrIC0gdmFyaWFibGUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYW5zd2VyIHRvOiBpcyBhIGZ1bmN0aW9uP1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuY3Rpb25Ub0NoZWNrKSB7XG4gICAgICAgIHZhciBnZXRUeXBlID0ge307XG4gICAgICAgIHJldHVybiBmdW5jdGlvblRvQ2hlY2sgJiYgZ2V0VHlwZS50b1N0cmluZy5jYWxsKGZ1bmN0aW9uVG9DaGVjaykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgcmVsYXRpdmUgdG8gaXRzIG9mZnNldCBwYXJlbnRcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAaWdub3JlXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHJldHVybiB7T2JqZWN0fSBwb3NpdGlvbiAtIENvb3JkaW5hdGVzIG9mIHRoZSBlbGVtZW50IGFuZCBpdHMgYHNjcm9sbFRvcGBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRPZmZzZXRSZWN0KGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRSZWN0ID0ge1xuICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0LFxuICAgICAgICAgICAgbGVmdDogZWxlbWVudC5vZmZzZXRMZWZ0LFxuICAgICAgICAgICAgdG9wOiBlbGVtZW50Lm9mZnNldFRvcFxuICAgICAgICB9O1xuXG4gICAgICAgIGVsZW1lbnRSZWN0LnJpZ2h0ID0gZWxlbWVudFJlY3QubGVmdCArIGVsZW1lbnRSZWN0LndpZHRoO1xuICAgICAgICBlbGVtZW50UmVjdC5ib3R0b20gPSBlbGVtZW50UmVjdC50b3AgKyBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAgICAgLy8gcG9zaXRpb25cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRSZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBib3VuZGluZyBjbGllbnQgcmVjdCBvZiBnaXZlbiBlbGVtZW50XG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQGlnbm9yZVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IGNsaWVudCByZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIC8vIHdoZXRoZXIgdGhlIElFIHZlcnNpb24gaXMgbG93ZXIgdGhhbiAxMVxuICAgICAgICB2YXIgaXNJRSA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIk1TSUVcIikgIT0gLTE7XG5cbiAgICAgICAgLy8gZml4IGllIGRvY3VtZW50IGJvdW5kaW5nIHRvcCBhbHdheXMgMCBidWdcbiAgICAgICAgdmFyIHJlY3RUb3AgPSBpc0lFICYmIGVsZW1lbnQudGFnTmFtZSA9PT0gJ0hUTUwnID8gLWVsZW1lbnQuc2Nyb2xsVG9wIDogcmVjdC50b3A7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICAgICAgICAgIHRvcDogcmVjdFRvcCxcbiAgICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0LFxuICAgICAgICAgICAgYm90dG9tOiByZWN0LmJvdHRvbSxcbiAgICAgICAgICAgIHdpZHRoOiByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LFxuICAgICAgICAgICAgaGVpZ2h0OiByZWN0LmJvdHRvbSAtIHJlY3RUb3BcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhbiBlbGVtZW50IGFuZCBvbmUgb2YgaXRzIHBhcmVudHMsIHJldHVybiB0aGUgb2Zmc2V0XG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQGlnbm9yZVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJlbnRcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHJlY3RcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0N1c3RvbVBhcmVudChlbGVtZW50LCBwYXJlbnQsIGZpeGVkKSB7XG4gICAgICAgIHZhciBlbGVtZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTtcbiAgICAgICAgdmFyIHBhcmVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QocGFyZW50KTtcblxuICAgICAgICBpZiAoZml4ZWQpIHtcbiAgICAgICAgICAgIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQocGFyZW50KTtcbiAgICAgICAgICAgIHBhcmVudFJlY3QudG9wICs9IHNjcm9sbFBhcmVudC5zY3JvbGxUb3A7XG4gICAgICAgICAgICBwYXJlbnRSZWN0LmJvdHRvbSArPSBzY3JvbGxQYXJlbnQuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgcGFyZW50UmVjdC5sZWZ0ICs9IHNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgcGFyZW50UmVjdC5yaWdodCArPSBzY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWN0ID0ge1xuICAgICAgICAgICAgdG9wOiBlbGVtZW50UmVjdC50b3AgLSBwYXJlbnRSZWN0LnRvcCxcbiAgICAgICAgICAgIGxlZnQ6IGVsZW1lbnRSZWN0LmxlZnQgLSBwYXJlbnRSZWN0LmxlZnQsXG4gICAgICAgICAgICBib3R0b206IGVsZW1lbnRSZWN0LnRvcCAtIHBhcmVudFJlY3QudG9wICsgZWxlbWVudFJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgcmlnaHQ6IGVsZW1lbnRSZWN0LmxlZnQgLSBwYXJlbnRSZWN0LmxlZnQgKyBlbGVtZW50UmVjdC53aWR0aCxcbiAgICAgICAgICAgIHdpZHRoOiBlbGVtZW50UmVjdC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogZWxlbWVudFJlY3QuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcHJlZml4ZWQgc3VwcG9ydGVkIHByb3BlcnR5IG5hbWVcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAaWdub3JlXG4gICAgICogQGFyZ3VtZW50IHtTdHJpbmd9IHByb3BlcnR5IChjYW1lbENhc2UpXG4gICAgICogQHJldHVybnMge1N0cmluZ30gcHJlZml4ZWQgcHJvcGVydHkgKGNhbWVsQ2FzZSlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUocHJvcGVydHkpIHtcbiAgICAgICAgdmFyIHByZWZpeGVzID0gWycnLCAnbXMnLCAnd2Via2l0JywgJ21veicsICdvJ107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHRvQ2hlY2sgPSBwcmVmaXhlc1tpXSA/IHByZWZpeGVzW2ldICsgcHJvcGVydHkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKSA6IHByb3BlcnR5O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb290LmRvY3VtZW50LmJvZHkuc3R5bGVbdG9DaGVja10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIE9iamVjdC5hc3NpZ24oKSBtZXRob2QgaXMgdXNlZCB0byBjb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2VcbiAgICAgKiBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdC4gSXQgd2lsbCByZXR1cm4gdGhlIHRhcmdldCBvYmplY3QuXG4gICAgICogVGhpcyBwb2x5ZmlsbCBkb2Vzbid0IHN1cHBvcnQgc3ltYm9sIHByb3BlcnRpZXMsIHNpbmNlIEVTNSBkb2Vzbid0IGhhdmUgc3ltYm9scyBhbnl3YXlcbiAgICAgKiBTb3VyY2U6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAaWdub3JlXG4gICAgICovXG4gICAgaWYgKCFPYmplY3QuYXNzaWduKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QsICdhc3NpZ24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgZmlyc3QgYXJndW1lbnQgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHRvID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRTb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0U291cmNlID09PSB1bmRlZmluZWQgfHwgbmV4dFNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV4dFNvdXJjZSA9IE9iamVjdChuZXh0U291cmNlKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIga2V5c0FycmF5ID0gT2JqZWN0LmtleXMobmV4dFNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG5leHRJbmRleCA9IDAsIGxlbiA9IGtleXNBcnJheS5sZW5ndGg7IG5leHRJbmRleCA8IGxlbjsgbmV4dEluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0S2V5ID0ga2V5c0FycmF5W25leHRJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobmV4dFNvdXJjZSwgbmV4dEtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYyAhPT0gdW5kZWZpbmVkICYmIGRlc2MuZW51bWVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdG87XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBQb3BwZXI7XG59KTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6167\n")},"6ac9":function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 78);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 2:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"5924\");\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"8122\");\n\n/***/ }),\n\n/***/ 5:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"e974\");\n\n/***/ }),\n\n/***/ 7:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"2b0e\");\n\n/***/ }),\n\n/***/ 78:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/popover/src/main.vue?vue&type=template&id=52060272&\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"span\",\n [\n _c(\n \"transition\",\n {\n attrs: { name: _vm.transition },\n on: {\n \"after-enter\": _vm.handleAfterEnter,\n \"after-leave\": _vm.handleAfterLeave\n }\n },\n [\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: !_vm.disabled && _vm.showPopper,\n expression: \"!disabled && showPopper\"\n }\n ],\n ref: \"popper\",\n staticClass: \"el-popover el-popper\",\n class: [_vm.popperClass, _vm.content && \"el-popover--plain\"],\n style: { width: _vm.width + \"px\" },\n attrs: {\n role: \"tooltip\",\n id: _vm.tooltipId,\n \"aria-hidden\":\n _vm.disabled || !_vm.showPopper ? \"true\" : \"false\"\n }\n },\n [\n _vm.title\n ? _c(\"div\", {\n staticClass: \"el-popover__title\",\n domProps: { textContent: _vm._s(_vm.title) }\n })\n : _vm._e(),\n _vm._t(\"default\", [_vm._v(_vm._s(_vm.content))])\n ],\n 2\n )\n ]\n ),\n _c(\n \"span\",\n { ref: \"wrapper\", staticClass: \"el-popover__reference-wrapper\" },\n [_vm._t(\"reference\")],\n 2\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/popover/src/main.vue?vue&type=template&id=52060272&\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/vue-popper\"\nvar vue_popper_ = __webpack_require__(5);\nvar vue_popper_default = /*#__PURE__*/__webpack_require__.n(vue_popper_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/dom\"\nvar dom_ = __webpack_require__(2);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/util\"\nvar util_ = __webpack_require__(3);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/popover/src/main.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/* harmony default export */ var mainvue_type_script_lang_js_ = ({\n name: 'ElPopover',\n\n mixins: [vue_popper_default.a],\n\n props: {\n trigger: {\n type: String,\n default: 'click',\n validator: function validator(value) {\n return ['click', 'focus', 'hover', 'manual'].indexOf(value) > -1;\n }\n },\n openDelay: {\n type: Number,\n default: 0\n },\n closeDelay: {\n type: Number,\n default: 200\n },\n title: String,\n disabled: Boolean,\n content: String,\n reference: {},\n popperClass: String,\n width: {},\n visibleArrow: {\n default: true\n },\n arrowOffset: {\n type: Number,\n default: 0\n },\n transition: {\n type: String,\n default: 'fade-in-linear'\n },\n tabindex: {\n type: Number,\n default: 0\n }\n },\n\n computed: {\n tooltipId: function tooltipId() {\n return 'el-popover-' + Object(util_[\"generateId\"])();\n }\n },\n watch: {\n showPopper: function showPopper(val) {\n if (this.disabled) {\n return;\n }\n val ? this.$emit('show') : this.$emit('hide');\n }\n },\n\n mounted: function mounted() {\n var _this = this;\n\n var reference = this.referenceElm = this.reference || this.$refs.reference;\n var popper = this.popper || this.$refs.popper;\n\n if (!reference && this.$refs.wrapper.children) {\n reference = this.referenceElm = this.$refs.wrapper.children[0];\n }\n // 可访问性\n if (reference) {\n Object(dom_[\"addClass\"])(reference, 'el-popover__reference');\n reference.setAttribute('aria-describedby', this.tooltipId);\n reference.setAttribute('tabindex', this.tabindex); // tab序列\n popper.setAttribute('tabindex', 0);\n\n if (this.trigger !== 'click') {\n Object(dom_[\"on\"])(reference, 'focusin', function () {\n _this.handleFocus();\n var instance = reference.__vue__;\n if (instance && typeof instance.focus === 'function') {\n instance.focus();\n }\n });\n Object(dom_[\"on\"])(popper, 'focusin', this.handleFocus);\n Object(dom_[\"on\"])(reference, 'focusout', this.handleBlur);\n Object(dom_[\"on\"])(popper, 'focusout', this.handleBlur);\n }\n Object(dom_[\"on\"])(reference, 'keydown', this.handleKeydown);\n Object(dom_[\"on\"])(reference, 'click', this.handleClick);\n }\n if (this.trigger === 'click') {\n Object(dom_[\"on\"])(reference, 'click', this.doToggle);\n Object(dom_[\"on\"])(document, 'click', this.handleDocumentClick);\n } else if (this.trigger === 'hover') {\n Object(dom_[\"on\"])(reference, 'mouseenter', this.handleMouseEnter);\n Object(dom_[\"on\"])(popper, 'mouseenter', this.handleMouseEnter);\n Object(dom_[\"on\"])(reference, 'mouseleave', this.handleMouseLeave);\n Object(dom_[\"on\"])(popper, 'mouseleave', this.handleMouseLeave);\n } else if (this.trigger === 'focus') {\n if (this.tabindex < 0) {\n console.warn('[Element Warn][Popover]a negative taindex means that the element cannot be focused by tab key');\n }\n if (reference.querySelector('input, textarea')) {\n Object(dom_[\"on\"])(reference, 'focusin', this.doShow);\n Object(dom_[\"on\"])(reference, 'focusout', this.doClose);\n } else {\n Object(dom_[\"on\"])(reference, 'mousedown', this.doShow);\n Object(dom_[\"on\"])(reference, 'mouseup', this.doClose);\n }\n }\n },\n beforeDestroy: function beforeDestroy() {\n this.cleanup();\n },\n deactivated: function deactivated() {\n this.cleanup();\n },\n\n\n methods: {\n doToggle: function doToggle() {\n this.showPopper = !this.showPopper;\n },\n doShow: function doShow() {\n this.showPopper = true;\n },\n doClose: function doClose() {\n this.showPopper = false;\n },\n handleFocus: function handleFocus() {\n Object(dom_[\"addClass\"])(this.referenceElm, 'focusing');\n if (this.trigger === 'click' || this.trigger === 'focus') this.showPopper = true;\n },\n handleClick: function handleClick() {\n Object(dom_[\"removeClass\"])(this.referenceElm, 'focusing');\n },\n handleBlur: function handleBlur() {\n Object(dom_[\"removeClass\"])(this.referenceElm, 'focusing');\n if (this.trigger === 'click' || this.trigger === 'focus') this.showPopper = false;\n },\n handleMouseEnter: function handleMouseEnter() {\n var _this2 = this;\n\n clearTimeout(this._timer);\n if (this.openDelay) {\n this._timer = setTimeout(function () {\n _this2.showPopper = true;\n }, this.openDelay);\n } else {\n this.showPopper = true;\n }\n },\n handleKeydown: function handleKeydown(ev) {\n if (ev.keyCode === 27 && this.trigger !== 'manual') {\n // esc\n this.doClose();\n }\n },\n handleMouseLeave: function handleMouseLeave() {\n var _this3 = this;\n\n clearTimeout(this._timer);\n if (this.closeDelay) {\n this._timer = setTimeout(function () {\n _this3.showPopper = false;\n }, this.closeDelay);\n } else {\n this.showPopper = false;\n }\n },\n handleDocumentClick: function handleDocumentClick(e) {\n var reference = this.reference || this.$refs.reference;\n var popper = this.popper || this.$refs.popper;\n\n if (!reference && this.$refs.wrapper.children) {\n reference = this.referenceElm = this.$refs.wrapper.children[0];\n }\n if (!this.$el || !reference || this.$el.contains(e.target) || reference.contains(e.target) || !popper || popper.contains(e.target)) return;\n this.showPopper = false;\n },\n handleAfterEnter: function handleAfterEnter() {\n this.$emit('after-enter');\n },\n handleAfterLeave: function handleAfterLeave() {\n this.$emit('after-leave');\n this.doDestroy();\n },\n cleanup: function cleanup() {\n if (this.openDelay || this.closeDelay) {\n clearTimeout(this._timer);\n }\n }\n },\n\n destroyed: function destroyed() {\n var reference = this.reference;\n\n Object(dom_[\"off\"])(reference, 'click', this.doToggle);\n Object(dom_[\"off\"])(reference, 'mouseup', this.doClose);\n Object(dom_[\"off\"])(reference, 'mousedown', this.doShow);\n Object(dom_[\"off\"])(reference, 'focusin', this.doShow);\n Object(dom_[\"off\"])(reference, 'focusout', this.doClose);\n Object(dom_[\"off\"])(reference, 'mousedown', this.doShow);\n Object(dom_[\"off\"])(reference, 'mouseup', this.doClose);\n Object(dom_[\"off\"])(reference, 'mouseleave', this.handleMouseLeave);\n Object(dom_[\"off\"])(reference, 'mouseenter', this.handleMouseEnter);\n Object(dom_[\"off\"])(document, 'click', this.handleDocumentClick);\n }\n});\n// CONCATENATED MODULE: ./packages/popover/src/main.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_mainvue_type_script_lang_js_ = (mainvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/popover/src/main.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n src_mainvue_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 api; }\ncomponent.options.__file = \"packages/popover/src/main.vue\"\n/* harmony default export */ var main = (component.exports);\n// CONCATENATED MODULE: ./packages/popover/src/directive.js\nvar getReference = function getReference(el, binding, vnode) {\n var _ref = binding.expression ? binding.value : binding.arg;\n var popper = vnode.context.$refs[_ref];\n if (popper) {\n if (Array.isArray(popper)) {\n popper[0].$refs.reference = el;\n } else {\n popper.$refs.reference = el;\n }\n }\n};\n\n/* harmony default export */ var directive = ({\n bind: function bind(el, binding, vnode) {\n getReference(el, binding, vnode);\n },\n inserted: function inserted(el, binding, vnode) {\n getReference(el, binding, vnode);\n }\n});\n// EXTERNAL MODULE: external \"vue\"\nvar external_vue_ = __webpack_require__(7);\nvar external_vue_default = /*#__PURE__*/__webpack_require__.n(external_vue_);\n\n// CONCATENATED MODULE: ./packages/popover/index.js\n\n\n\n\nexternal_vue_default.a.directive('popover', directive);\n\n/* istanbul ignore next */\nmain.install = function (Vue) {\n Vue.directive('popover', directive);\n Vue.component(main.name, main);\n};\nmain.directive = directive;\n\n/* harmony default export */ var popover = __webpack_exports__[\"default\"] = (main);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvcG9wb3Zlci5qcz82YWM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELGdDQUFnQztBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0Usa0JBQWtCO0FBQ2xGO0FBQ0EseURBQXlELGNBQWM7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsaUNBQWlDO0FBQ2xGLHdIQUF3SCxtQkFBbUIsRUFBRTtBQUM3STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsMEJBQTBCLEVBQUU7QUFDL0QseUNBQXlDLGVBQWU7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCwrREFBK0Q7QUFDN0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsMkZBQTJGLDJCQUEyQixFQUFFO0FBQ3hIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQTBCOztBQUVuRCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBMkI7O0FBRXBELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUFpQzs7QUFFMUQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQUs7O0FBRTlCLE9BQU87O0FBRVA7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwwQkFBMEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLCtEQUErRDtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxvRztBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBOzs7OztBQUtBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPOztBQUVQLFVBQVUiLCJmaWxlIjoiNmFjOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC9cIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNzgpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoe1xuXG4vKioqLyAwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gbm9ybWFsaXplQ29tcG9uZW50OyB9KTtcbi8qIGdsb2JhbHMgX19WVUVfU1NSX0NPTlRFWFRfXyAqL1xuXG4vLyBJTVBPUlRBTlQ6IERvIE5PVCB1c2UgRVMyMDE1IGZlYXR1cmVzIGluIHRoaXMgZmlsZSAoZXhjZXB0IGZvciBtb2R1bGVzKS5cbi8vIFRoaXMgbW9kdWxlIGlzIGEgcnVudGltZSB1dGlsaXR5IGZvciBjbGVhbmVyIGNvbXBvbmVudCBtb2R1bGUgb3V0cHV0IGFuZCB3aWxsXG4vLyBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgd2VicGFjayB1c2VyIGJ1bmRsZS5cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50IChcbiAgc2NyaXB0RXhwb3J0cyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZ1bmN0aW9uYWxUZW1wbGF0ZSxcbiAgaW5qZWN0U3R5bGVzLFxuICBzY29wZUlkLFxuICBtb2R1bGVJZGVudGlmaWVyLCAvKiBzZXJ2ZXIgb25seSAqL1xuICBzaGFkb3dNb2RlIC8qIHZ1ZS1jbGkgb25seSAqL1xuKSB7XG4gIC8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3BcbiAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2NyaXB0RXhwb3J0cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2NyaXB0RXhwb3J0cy5vcHRpb25zXG4gICAgOiBzY3JpcHRFeHBvcnRzXG5cbiAgLy8gcmVuZGVyIGZ1bmN0aW9uc1xuICBpZiAocmVuZGVyKSB7XG4gICAgb3B0aW9ucy5yZW5kZXIgPSByZW5kZXJcbiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IHN0YXRpY1JlbmRlckZuc1xuICAgIG9wdGlvbnMuX2NvbXBpbGVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gZnVuY3Rpb25hbCB0ZW1wbGF0ZVxuICBpZiAoZnVuY3Rpb25hbFRlbXBsYXRlKSB7XG4gICAgb3B0aW9ucy5mdW5jdGlvbmFsID0gdHJ1ZVxuICB9XG5cbiAgLy8gc2NvcGVkSWRcbiAgaWYgKHNjb3BlSWQpIHtcbiAgICBvcHRpb25zLl9zY29wZUlkID0gJ2RhdGEtdi0nICsgc2NvcGVJZFxuICB9XG5cbiAgdmFyIGhvb2tcbiAgaWYgKG1vZHVsZUlkZW50aWZpZXIpIHsgLy8gc2VydmVyIGJ1aWxkXG4gICAgaG9vayA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAvLyAyLjMgaW5qZWN0aW9uXG4gICAgICBjb250ZXh0ID1cbiAgICAgICAgY29udGV4dCB8fCAvLyBjYWNoZWQgY2FsbFxuICAgICAgICAodGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dCkgfHwgLy8gc3RhdGVmdWxcbiAgICAgICAgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LiR2bm9kZSAmJiB0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCkgLy8gZnVuY3Rpb25hbFxuICAgICAgLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlXG4gICAgICBpZiAoIWNvbnRleHQgJiYgdHlwZW9mIF9fVlVFX1NTUl9DT05URVhUX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnRleHQgPSBfX1ZVRV9TU1JfQ09OVEVYVF9fXG4gICAgICB9XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHN0eWxlc1xuICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCBjb250ZXh0KVxuICAgICAgfVxuICAgICAgLy8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlXG4gICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykge1xuICAgICAgICBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcilcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGVcbiAgICAvLyBuZXZlciBnZXRzIGNhbGxlZFxuICAgIG9wdGlvbnMuX3NzclJlZ2lzdGVyID0gaG9va1xuICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykge1xuICAgIGhvb2sgPSBzaGFkb3dNb2RlXG4gICAgICA/IGZ1bmN0aW9uICgpIHsgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgdGhpcy4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290KSB9XG4gICAgICA6IGluamVjdFN0eWxlc1xuICB9XG5cbiAgaWYgKGhvb2spIHtcbiAgICBpZiAob3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndFxuICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgbm9ybWFsaXplclxuICAgICAgb3B0aW9ucy5faW5qZWN0U3R5bGVzID0gaG9va1xuICAgICAgLy8gcmVnaXN0ZXIgZm9yIGZ1bmN0aW9hbCBjb21wb25lbnQgaW4gdnVlIGZpbGVcbiAgICAgIHZhciBvcmlnaW5hbFJlbmRlciA9IG9wdGlvbnMucmVuZGVyXG4gICAgICBvcHRpb25zLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcldpdGhTdHlsZUluamVjdGlvbiAoaCwgY29udGV4dCkge1xuICAgICAgICBob29rLmNhbGwoY29udGV4dClcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsIGNvbnRleHQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgcmVnaXN0cmF0aW9uIGFzIGJlZm9yZUNyZWF0ZSBob29rXG4gICAgICB2YXIgZXhpc3RpbmcgPSBvcHRpb25zLmJlZm9yZUNyZWF0ZVxuICAgICAgb3B0aW9ucy5iZWZvcmVDcmVhdGUgPSBleGlzdGluZ1xuICAgICAgICA/IFtdLmNvbmNhdChleGlzdGluZywgaG9vaylcbiAgICAgICAgOiBbaG9va11cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDI6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL2RvbVwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDM6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL3V0aWxcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy92dWUtcG9wcGVyXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidnVlXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzg6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3BvcG92ZXIvc3JjL21haW4udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTUyMDYwMjcyJlxudmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcInNwYW5cIixcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJ0cmFuc2l0aW9uXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBhdHRyczogeyBuYW1lOiBfdm0udHJhbnNpdGlvbiB9LFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBcImFmdGVyLWVudGVyXCI6IF92bS5oYW5kbGVBZnRlckVudGVyLFxuICAgICAgICAgICAgXCJhZnRlci1sZWF2ZVwiOiBfdm0uaGFuZGxlQWZ0ZXJMZWF2ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiAhX3ZtLmRpc2FibGVkICYmIF92bS5zaG93UG9wcGVyLFxuICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCIhZGlzYWJsZWQgJiYgc2hvd1BvcHBlclwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZWY6IFwicG9wcGVyXCIsXG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXBvcG92ZXIgZWwtcG9wcGVyXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiBbX3ZtLnBvcHBlckNsYXNzLCBfdm0uY29udGVudCAmJiBcImVsLXBvcG92ZXItLXBsYWluXCJdLFxuICAgICAgICAgICAgICBzdHlsZTogeyB3aWR0aDogX3ZtLndpZHRoICsgXCJweFwiIH0sXG4gICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgcm9sZTogXCJ0b29sdGlwXCIsXG4gICAgICAgICAgICAgICAgaWQ6IF92bS50b29sdGlwSWQsXG4gICAgICAgICAgICAgICAgXCJhcmlhLWhpZGRlblwiOlxuICAgICAgICAgICAgICAgICAgX3ZtLmRpc2FibGVkIHx8ICFfdm0uc2hvd1BvcHBlciA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF92bS50aXRsZVxuICAgICAgICAgICAgICAgID8gX2MoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1wb3BvdmVyX190aXRsZVwiLFxuICAgICAgICAgICAgICAgICAgICBkb21Qcm9wczogeyB0ZXh0Q29udGVudDogX3ZtLl9zKF92bS50aXRsZSkgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICBfdm0uX3QoXCJkZWZhdWx0XCIsIFtfdm0uX3YoX3ZtLl9zKF92bS5jb250ZW50KSldKVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIF1cbiAgICAgICksXG4gICAgICBfYyhcbiAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgIHsgcmVmOiBcIndyYXBwZXJcIiwgc3RhdGljQ2xhc3M6IFwiZWwtcG9wb3Zlcl9fcmVmZXJlbmNlLXdyYXBwZXJcIiB9LFxuICAgICAgICBbX3ZtLl90KFwicmVmZXJlbmNlXCIpXSxcbiAgICAgICAgMlxuICAgICAgKVxuICAgIF0sXG4gICAgMVxuICApXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cbnJlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wb3Zlci9zcmMvbWFpbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NTIwNjAyNzImXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy92dWUtcG9wcGVyXCJcbnZhciB2dWVfcG9wcGVyXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG52YXIgdnVlX3BvcHBlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih2dWVfcG9wcGVyXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9kb21cIlxudmFyIGRvbV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvdXRpbFwiXG52YXIgdXRpbF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9wb3BvdmVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBtYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsUG9wb3ZlcicsXG5cbiAgbWl4aW5zOiBbdnVlX3BvcHBlcl9kZWZhdWx0LmFdLFxuXG4gIHByb3BzOiB7XG4gICAgdHJpZ2dlcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2NsaWNrJyxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBbJ2NsaWNrJywgJ2ZvY3VzJywgJ2hvdmVyJywgJ21hbnVhbCddLmluZGV4T2YodmFsdWUpID4gLTE7XG4gICAgICB9XG4gICAgfSxcbiAgICBvcGVuRGVsYXk6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIGNsb3NlRGVsYXk6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDIwMFxuICAgIH0sXG4gICAgdGl0bGU6IFN0cmluZyxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBjb250ZW50OiBTdHJpbmcsXG4gICAgcmVmZXJlbmNlOiB7fSxcbiAgICBwb3BwZXJDbGFzczogU3RyaW5nLFxuICAgIHdpZHRoOiB7fSxcbiAgICB2aXNpYmxlQXJyb3c6IHtcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGFycm93T2Zmc2V0OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAwXG4gICAgfSxcbiAgICB0cmFuc2l0aW9uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnZmFkZS1pbi1saW5lYXInXG4gICAgfSxcbiAgICB0YWJpbmRleDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHRvb2x0aXBJZDogZnVuY3Rpb24gdG9vbHRpcElkKCkge1xuICAgICAgcmV0dXJuICdlbC1wb3BvdmVyLScgKyBPYmplY3QodXRpbF9bXCJnZW5lcmF0ZUlkXCJdKSgpO1xuICAgIH1cbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBzaG93UG9wcGVyOiBmdW5jdGlvbiBzaG93UG9wcGVyKHZhbCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFsID8gdGhpcy4kZW1pdCgnc2hvdycpIDogdGhpcy4kZW1pdCgnaGlkZScpO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgcmVmZXJlbmNlID0gdGhpcy5yZWZlcmVuY2VFbG0gPSB0aGlzLnJlZmVyZW5jZSB8fCB0aGlzLiRyZWZzLnJlZmVyZW5jZTtcbiAgICB2YXIgcG9wcGVyID0gdGhpcy5wb3BwZXIgfHwgdGhpcy4kcmVmcy5wb3BwZXI7XG5cbiAgICBpZiAoIXJlZmVyZW5jZSAmJiB0aGlzLiRyZWZzLndyYXBwZXIuY2hpbGRyZW4pIHtcbiAgICAgIHJlZmVyZW5jZSA9IHRoaXMucmVmZXJlbmNlRWxtID0gdGhpcy4kcmVmcy53cmFwcGVyLmNoaWxkcmVuWzBdO1xuICAgIH1cbiAgICAvLyDlj6/orr/pl67mgKdcbiAgICBpZiAocmVmZXJlbmNlKSB7XG4gICAgICBPYmplY3QoZG9tX1tcImFkZENsYXNzXCJdKShyZWZlcmVuY2UsICdlbC1wb3BvdmVyX19yZWZlcmVuY2UnKTtcbiAgICAgIHJlZmVyZW5jZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aGlzLnRvb2x0aXBJZCk7XG4gICAgICByZWZlcmVuY2Uuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIHRoaXMudGFiaW5kZXgpOyAvLyB0YWLluo/liJdcbiAgICAgIHBvcHBlci5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgMCk7XG5cbiAgICAgIGlmICh0aGlzLnRyaWdnZXIgIT09ICdjbGljaycpIHtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocmVmZXJlbmNlLCAnZm9jdXNpbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5oYW5kbGVGb2N1cygpO1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHJlZmVyZW5jZS5fX3Z1ZV9fO1xuICAgICAgICAgIGlmIChpbnN0YW5jZSAmJiB0eXBlb2YgaW5zdGFuY2UuZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocG9wcGVyLCAnZm9jdXNpbicsIHRoaXMuaGFuZGxlRm9jdXMpO1xuICAgICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShyZWZlcmVuY2UsICdmb2N1c291dCcsIHRoaXMuaGFuZGxlQmx1cik7XG4gICAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHBvcHBlciwgJ2ZvY3Vzb3V0JywgdGhpcy5oYW5kbGVCbHVyKTtcbiAgICAgIH1cbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHJlZmVyZW5jZSwgJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleWRvd24pO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocmVmZXJlbmNlLCAnY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocmVmZXJlbmNlLCAnY2xpY2snLCB0aGlzLmRvVG9nZ2xlKTtcbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKGRvY3VtZW50LCAnY2xpY2snLCB0aGlzLmhhbmRsZURvY3VtZW50Q2xpY2spO1xuICAgIH0gZWxzZSBpZiAodGhpcy50cmlnZ2VyID09PSAnaG92ZXInKSB7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShyZWZlcmVuY2UsICdtb3VzZWVudGVyJywgdGhpcy5oYW5kbGVNb3VzZUVudGVyKTtcbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHBvcHBlciwgJ21vdXNlZW50ZXInLCB0aGlzLmhhbmRsZU1vdXNlRW50ZXIpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocmVmZXJlbmNlLCAnbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSk7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKShwb3BwZXIsICdtb3VzZWxlYXZlJywgdGhpcy5oYW5kbGVNb3VzZUxlYXZlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2ZvY3VzJykge1xuICAgICAgaWYgKHRoaXMudGFiaW5kZXggPCAwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW0VsZW1lbnQgV2Fybl1bUG9wb3Zlcl1hIG5lZ2F0aXZlIHRhaW5kZXggbWVhbnMgdGhhdCB0aGUgZWxlbWVudCBjYW5ub3QgYmUgZm9jdXNlZCBieSB0YWIga2V5Jyk7XG4gICAgICB9XG4gICAgICBpZiAocmVmZXJlbmNlLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCB0ZXh0YXJlYScpKSB7XG4gICAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHJlZmVyZW5jZSwgJ2ZvY3VzaW4nLCB0aGlzLmRvU2hvdyk7XG4gICAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHJlZmVyZW5jZSwgJ2ZvY3Vzb3V0JywgdGhpcy5kb0Nsb3NlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHJlZmVyZW5jZSwgJ21vdXNlZG93bicsIHRoaXMuZG9TaG93KTtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkocmVmZXJlbmNlLCAnbW91c2V1cCcsIHRoaXMuZG9DbG9zZSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICB9LFxuICBkZWFjdGl2YXRlZDogZnVuY3Rpb24gZGVhY3RpdmF0ZWQoKSB7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH0sXG5cblxuICBtZXRob2RzOiB7XG4gICAgZG9Ub2dnbGU6IGZ1bmN0aW9uIGRvVG9nZ2xlKCkge1xuICAgICAgdGhpcy5zaG93UG9wcGVyID0gIXRoaXMuc2hvd1BvcHBlcjtcbiAgICB9LFxuICAgIGRvU2hvdzogZnVuY3Rpb24gZG9TaG93KCkge1xuICAgICAgdGhpcy5zaG93UG9wcGVyID0gdHJ1ZTtcbiAgICB9LFxuICAgIGRvQ2xvc2U6IGZ1bmN0aW9uIGRvQ2xvc2UoKSB7XG4gICAgICB0aGlzLnNob3dQb3BwZXIgPSBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZUZvY3VzOiBmdW5jdGlvbiBoYW5kbGVGb2N1cygpIHtcbiAgICAgIE9iamVjdChkb21fW1wiYWRkQ2xhc3NcIl0pKHRoaXMucmVmZXJlbmNlRWxtLCAnZm9jdXNpbmcnKTtcbiAgICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdjbGljaycgfHwgdGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB0aGlzLnNob3dQb3BwZXIgPSB0cnVlO1xuICAgIH0sXG4gICAgaGFuZGxlQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKCkge1xuICAgICAgT2JqZWN0KGRvbV9bXCJyZW1vdmVDbGFzc1wiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdmb2N1c2luZycpO1xuICAgIH0sXG4gICAgaGFuZGxlQmx1cjogZnVuY3Rpb24gaGFuZGxlQmx1cigpIHtcbiAgICAgIE9iamVjdChkb21fW1wicmVtb3ZlQ2xhc3NcIl0pKHRoaXMucmVmZXJlbmNlRWxtLCAnZm9jdXNpbmcnKTtcbiAgICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdjbGljaycgfHwgdGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB0aGlzLnNob3dQb3BwZXIgPSBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZU1vdXNlRW50ZXI6IGZ1bmN0aW9uIGhhbmRsZU1vdXNlRW50ZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICAgIGlmICh0aGlzLm9wZW5EZWxheSkge1xuICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMi5zaG93UG9wcGVyID0gdHJ1ZTtcbiAgICAgICAgfSwgdGhpcy5vcGVuRGVsYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93UG9wcGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUtleWRvd246IGZ1bmN0aW9uIGhhbmRsZUtleWRvd24oZXYpIHtcbiAgICAgIGlmIChldi5rZXlDb2RlID09PSAyNyAmJiB0aGlzLnRyaWdnZXIgIT09ICdtYW51YWwnKSB7XG4gICAgICAgIC8vIGVzY1xuICAgICAgICB0aGlzLmRvQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZU1vdXNlTGVhdmU6IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTGVhdmUoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICAgIGlmICh0aGlzLmNsb3NlRGVsYXkpIHtcbiAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczMuc2hvd1BvcHBlciA9IGZhbHNlO1xuICAgICAgICB9LCB0aGlzLmNsb3NlRGVsYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93UG9wcGVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVEb2N1bWVudENsaWNrOiBmdW5jdGlvbiBoYW5kbGVEb2N1bWVudENsaWNrKGUpIHtcbiAgICAgIHZhciByZWZlcmVuY2UgPSB0aGlzLnJlZmVyZW5jZSB8fCB0aGlzLiRyZWZzLnJlZmVyZW5jZTtcbiAgICAgIHZhciBwb3BwZXIgPSB0aGlzLnBvcHBlciB8fCB0aGlzLiRyZWZzLnBvcHBlcjtcblxuICAgICAgaWYgKCFyZWZlcmVuY2UgJiYgdGhpcy4kcmVmcy53cmFwcGVyLmNoaWxkcmVuKSB7XG4gICAgICAgIHJlZmVyZW5jZSA9IHRoaXMucmVmZXJlbmNlRWxtID0gdGhpcy4kcmVmcy53cmFwcGVyLmNoaWxkcmVuWzBdO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLiRlbCB8fCAhcmVmZXJlbmNlIHx8IHRoaXMuJGVsLmNvbnRhaW5zKGUudGFyZ2V0KSB8fCByZWZlcmVuY2UuY29udGFpbnMoZS50YXJnZXQpIHx8ICFwb3BwZXIgfHwgcG9wcGVyLmNvbnRhaW5zKGUudGFyZ2V0KSkgcmV0dXJuO1xuICAgICAgdGhpcy5zaG93UG9wcGVyID0gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVBZnRlckVudGVyOiBmdW5jdGlvbiBoYW5kbGVBZnRlckVudGVyKCkge1xuICAgICAgdGhpcy4kZW1pdCgnYWZ0ZXItZW50ZXInKTtcbiAgICB9LFxuICAgIGhhbmRsZUFmdGVyTGVhdmU6IGZ1bmN0aW9uIGhhbmRsZUFmdGVyTGVhdmUoKSB7XG4gICAgICB0aGlzLiRlbWl0KCdhZnRlci1sZWF2ZScpO1xuICAgICAgdGhpcy5kb0Rlc3Ryb3koKTtcbiAgICB9LFxuICAgIGNsZWFudXA6IGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgICBpZiAodGhpcy5vcGVuRGVsYXkgfHwgdGhpcy5jbG9zZURlbGF5KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRlc3Ryb3llZDogZnVuY3Rpb24gZGVzdHJveWVkKCkge1xuICAgIHZhciByZWZlcmVuY2UgPSB0aGlzLnJlZmVyZW5jZTtcblxuICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdjbGljaycsIHRoaXMuZG9Ub2dnbGUpO1xuICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdtb3VzZXVwJywgdGhpcy5kb0Nsb3NlKTtcbiAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkocmVmZXJlbmNlLCAnbW91c2Vkb3duJywgdGhpcy5kb1Nob3cpO1xuICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdmb2N1c2luJywgdGhpcy5kb1Nob3cpO1xuICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdmb2N1c291dCcsIHRoaXMuZG9DbG9zZSk7XG4gICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKHJlZmVyZW5jZSwgJ21vdXNlZG93bicsIHRoaXMuZG9TaG93KTtcbiAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkocmVmZXJlbmNlLCAnbW91c2V1cCcsIHRoaXMuZG9DbG9zZSk7XG4gICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKHJlZmVyZW5jZSwgJ21vdXNlbGVhdmUnLCB0aGlzLmhhbmRsZU1vdXNlTGVhdmUpO1xuICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdtb3VzZWVudGVyJywgdGhpcy5oYW5kbGVNb3VzZUVudGVyKTtcbiAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkoZG9jdW1lbnQsICdjbGljaycsIHRoaXMuaGFuZGxlRG9jdW1lbnRDbGljayk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wb3BvdmVyL3NyYy9tYWluLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChtYWludnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1xudmFyIGNvbXBvbmVudE5vcm1hbGl6ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3BvcG92ZXIvc3JjL21haW4udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gT2JqZWN0KGNvbXBvbmVudE5vcm1hbGl6ZXJbXCJhXCIgLyogZGVmYXVsdCAqL10pKFxuICBzcmNfbWFpbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGFwaTsgfVxuY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9wb3BvdmVyL3NyYy9tYWluLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBtYWluID0gKGNvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wb3Zlci9zcmMvZGlyZWN0aXZlLmpzXG52YXIgZ2V0UmVmZXJlbmNlID0gZnVuY3Rpb24gZ2V0UmVmZXJlbmNlKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICB2YXIgX3JlZiA9IGJpbmRpbmcuZXhwcmVzc2lvbiA/IGJpbmRpbmcudmFsdWUgOiBiaW5kaW5nLmFyZztcbiAgdmFyIHBvcHBlciA9IHZub2RlLmNvbnRleHQuJHJlZnNbX3JlZl07XG4gIGlmIChwb3BwZXIpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwb3BwZXIpKSB7XG4gICAgICBwb3BwZXJbMF0uJHJlZnMucmVmZXJlbmNlID0gZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcHBlci4kcmVmcy5yZWZlcmVuY2UgPSBlbDtcbiAgICB9XG4gIH1cbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGRpcmVjdGl2ZSA9ICh7XG4gIGJpbmQ6IGZ1bmN0aW9uIGJpbmQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgZ2V0UmVmZXJlbmNlKGVsLCBiaW5kaW5nLCB2bm9kZSk7XG4gIH0sXG4gIGluc2VydGVkOiBmdW5jdGlvbiBpbnNlcnRlZChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBnZXRSZWZlcmVuY2UoZWwsIGJpbmRpbmcsIHZub2RlKTtcbiAgfVxufSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwidnVlXCJcbnZhciBleHRlcm5hbF92dWVfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbnZhciBleHRlcm5hbF92dWVfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZXh0ZXJuYWxfdnVlXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvcG9wb3Zlci9pbmRleC5qc1xuXG5cblxuXG5leHRlcm5hbF92dWVfZGVmYXVsdC5hLmRpcmVjdGl2ZSgncG9wb3ZlcicsIGRpcmVjdGl2ZSk7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5tYWluLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5kaXJlY3RpdmUoJ3BvcG92ZXInLCBkaXJlY3RpdmUpO1xuICBWdWUuY29tcG9uZW50KG1haW4ubmFtZSwgbWFpbik7XG59O1xubWFpbi5kaXJlY3RpdmUgPSBkaXJlY3RpdmU7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBvcG92ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChtYWluKTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6ac9\n")},"6b7c":function(module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\n\nvar _locale = __webpack_require__("4897");\n\nexports.default = {\n methods: {\n t: function t() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _locale.t.apply(this, args);\n }\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvbWl4aW5zL2xvY2FsZS5qcz82YjdjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLGNBQWMsbUJBQU8sQ0FBQyxNQUF1Qjs7QUFFN0M7QUFDQTtBQUNBO0FBQ0EscUVBQXFFLGFBQWE7QUFDbEY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI2YjdjLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2xvY2FsZSA9IHJlcXVpcmUoJ2VsZW1lbnQtdWkvbGliL2xvY2FsZScpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIG1ldGhvZHM6IHtcbiAgICB0OiBmdW5jdGlvbiB0KCkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9sb2NhbGUudC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH1cbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6b7c\n')},"722f":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _ariaUtils = __webpack_require__(\"e452\");\n\nvar _ariaUtils2 = _interopRequireDefault(_ariaUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @constructor\n * @desc Dialog object providing modal focus management.\n *\n * Assumptions: The element serving as the dialog container is present in the\n * DOM and hidden. The dialog container has role='dialog'.\n *\n * @param dialogId\n * The ID of the element serving as the dialog container.\n * @param focusAfterClosed\n * Either the DOM node or the ID of the DOM node to focus when the\n * dialog closes.\n * @param focusFirst\n * Optional parameter containing either the DOM node or the ID of the\n * DOM node to focus when the dialog opens. If not specified, the\n * first focusable element in the dialog will receive focus.\n */\nvar aria = aria || {};\nvar tabEvent;\n\naria.Dialog = function (dialog, focusAfterClosed, focusFirst) {\n var _this = this;\n\n this.dialogNode = dialog;\n if (this.dialogNode === null || this.dialogNode.getAttribute('role') !== 'dialog') {\n throw new Error('Dialog() requires a DOM element with ARIA role of dialog.');\n }\n\n if (typeof focusAfterClosed === 'string') {\n this.focusAfterClosed = document.getElementById(focusAfterClosed);\n } else if ((typeof focusAfterClosed === 'undefined' ? 'undefined' : _typeof(focusAfterClosed)) === 'object') {\n this.focusAfterClosed = focusAfterClosed;\n } else {\n this.focusAfterClosed = null;\n }\n\n if (typeof focusFirst === 'string') {\n this.focusFirst = document.getElementById(focusFirst);\n } else if ((typeof focusFirst === 'undefined' ? 'undefined' : _typeof(focusFirst)) === 'object') {\n this.focusFirst = focusFirst;\n } else {\n this.focusFirst = null;\n }\n\n if (this.focusFirst) {\n this.focusFirst.focus();\n } else {\n _ariaUtils2.default.focusFirstDescendant(this.dialogNode);\n }\n\n this.lastFocus = document.activeElement;\n tabEvent = function tabEvent(e) {\n _this.trapFocus(e);\n };\n this.addListeners();\n};\n\naria.Dialog.prototype.addListeners = function () {\n document.addEventListener('focus', tabEvent, true);\n};\n\naria.Dialog.prototype.removeListeners = function () {\n document.removeEventListener('focus', tabEvent, true);\n};\n\naria.Dialog.prototype.closeDialog = function () {\n var _this2 = this;\n\n this.removeListeners();\n if (this.focusAfterClosed) {\n setTimeout(function () {\n _this2.focusAfterClosed.focus();\n });\n }\n};\n\naria.Dialog.prototype.trapFocus = function (event) {\n if (_ariaUtils2.default.IgnoreUtilFocusChanges) {\n return;\n }\n if (this.dialogNode.contains(event.target)) {\n this.lastFocus = event.target;\n } else {\n _ariaUtils2.default.focusFirstDescendant(this.dialogNode);\n if (this.lastFocus === document.activeElement) {\n _ariaUtils2.default.focusLastDescendant(this.dialogNode);\n }\n this.lastFocus = document.activeElement;\n }\n};\n\nexports.default = aria.Dialog;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvYXJpYS1kaWFsb2cuanM/NzIyZiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQSxvR0FBb0csbUJBQW1CLEVBQUUsbUJBQW1CLDhIQUE4SDs7QUFFMVEsaUJBQWlCLG1CQUFPLENBQUMsTUFBYzs7QUFFdkM7O0FBRUEsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI3MjJmLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfYXJpYVV0aWxzID0gcmVxdWlyZSgnLi9hcmlhLXV0aWxzJyk7XG5cbnZhciBfYXJpYVV0aWxzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FyaWFVdGlscyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZGVzYyBEaWFsb2cgb2JqZWN0IHByb3ZpZGluZyBtb2RhbCBmb2N1cyBtYW5hZ2VtZW50LlxuICpcbiAqIEFzc3VtcHRpb25zOiBUaGUgZWxlbWVudCBzZXJ2aW5nIGFzIHRoZSBkaWFsb2cgY29udGFpbmVyIGlzIHByZXNlbnQgaW4gdGhlXG4gKiBET00gYW5kIGhpZGRlbi4gVGhlIGRpYWxvZyBjb250YWluZXIgaGFzIHJvbGU9J2RpYWxvZycuXG4gKlxuICogQHBhcmFtIGRpYWxvZ0lkXG4gKiAgICAgICAgICBUaGUgSUQgb2YgdGhlIGVsZW1lbnQgc2VydmluZyBhcyB0aGUgZGlhbG9nIGNvbnRhaW5lci5cbiAqIEBwYXJhbSBmb2N1c0FmdGVyQ2xvc2VkXG4gKiAgICAgICAgICBFaXRoZXIgdGhlIERPTSBub2RlIG9yIHRoZSBJRCBvZiB0aGUgRE9NIG5vZGUgdG8gZm9jdXMgd2hlbiB0aGVcbiAqICAgICAgICAgIGRpYWxvZyBjbG9zZXMuXG4gKiBAcGFyYW0gZm9jdXNGaXJzdFxuICogICAgICAgICAgT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgZWl0aGVyIHRoZSBET00gbm9kZSBvciB0aGUgSUQgb2YgdGhlXG4gKiAgICAgICAgICBET00gbm9kZSB0byBmb2N1cyB3aGVuIHRoZSBkaWFsb2cgb3BlbnMuIElmIG5vdCBzcGVjaWZpZWQsIHRoZVxuICogICAgICAgICAgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgaW4gdGhlIGRpYWxvZyB3aWxsIHJlY2VpdmUgZm9jdXMuXG4gKi9cbnZhciBhcmlhID0gYXJpYSB8fCB7fTtcbnZhciB0YWJFdmVudDtcblxuYXJpYS5EaWFsb2cgPSBmdW5jdGlvbiAoZGlhbG9nLCBmb2N1c0FmdGVyQ2xvc2VkLCBmb2N1c0ZpcnN0KSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5kaWFsb2dOb2RlID0gZGlhbG9nO1xuICBpZiAodGhpcy5kaWFsb2dOb2RlID09PSBudWxsIHx8IHRoaXMuZGlhbG9nTm9kZS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ2RpYWxvZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpYWxvZygpIHJlcXVpcmVzIGEgRE9NIGVsZW1lbnQgd2l0aCBBUklBIHJvbGUgb2YgZGlhbG9nLicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBmb2N1c0FmdGVyQ2xvc2VkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuZm9jdXNBZnRlckNsb3NlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvY3VzQWZ0ZXJDbG9zZWQpO1xuICB9IGVsc2UgaWYgKCh0eXBlb2YgZm9jdXNBZnRlckNsb3NlZCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoZm9jdXNBZnRlckNsb3NlZCkpID09PSAnb2JqZWN0Jykge1xuICAgIHRoaXMuZm9jdXNBZnRlckNsb3NlZCA9IGZvY3VzQWZ0ZXJDbG9zZWQ7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2VkID0gbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZm9jdXNGaXJzdCA9PT0gJ3N0cmluZycpIHtcbiAgICB0aGlzLmZvY3VzRmlyc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb2N1c0ZpcnN0KTtcbiAgfSBlbHNlIGlmICgodHlwZW9mIGZvY3VzRmlyc3QgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGZvY3VzRmlyc3QpKSA9PT0gJ29iamVjdCcpIHtcbiAgICB0aGlzLmZvY3VzRmlyc3QgPSBmb2N1c0ZpcnN0O1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZm9jdXNGaXJzdCA9IG51bGw7XG4gIH1cblxuICBpZiAodGhpcy5mb2N1c0ZpcnN0KSB7XG4gICAgdGhpcy5mb2N1c0ZpcnN0LmZvY3VzKCk7XG4gIH0gZWxzZSB7XG4gICAgX2FyaWFVdGlsczIuZGVmYXVsdC5mb2N1c0ZpcnN0RGVzY2VuZGFudCh0aGlzLmRpYWxvZ05vZGUpO1xuICB9XG5cbiAgdGhpcy5sYXN0Rm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICB0YWJFdmVudCA9IGZ1bmN0aW9uIHRhYkV2ZW50KGUpIHtcbiAgICBfdGhpcy50cmFwRm9jdXMoZSk7XG4gIH07XG4gIHRoaXMuYWRkTGlzdGVuZXJzKCk7XG59O1xuXG5hcmlhLkRpYWxvZy5wcm90b3R5cGUuYWRkTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRhYkV2ZW50LCB0cnVlKTtcbn07XG5cbmFyaWEuRGlhbG9nLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGFiRXZlbnQsIHRydWUpO1xufTtcblxuYXJpYS5EaWFsb2cucHJvdG90eXBlLmNsb3NlRGlhbG9nID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3RoaXMyID0gdGhpcztcblxuICB0aGlzLnJlbW92ZUxpc3RlbmVycygpO1xuICBpZiAodGhpcy5mb2N1c0FmdGVyQ2xvc2VkKSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczIuZm9jdXNBZnRlckNsb3NlZC5mb2N1cygpO1xuICAgIH0pO1xuICB9XG59O1xuXG5hcmlhLkRpYWxvZy5wcm90b3R5cGUudHJhcEZvY3VzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGlmIChfYXJpYVV0aWxzMi5kZWZhdWx0Lklnbm9yZVV0aWxGb2N1c0NoYW5nZXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHRoaXMuZGlhbG9nTm9kZS5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgdGhpcy5sYXN0Rm9jdXMgPSBldmVudC50YXJnZXQ7XG4gIH0gZWxzZSB7XG4gICAgX2FyaWFVdGlsczIuZGVmYXVsdC5mb2N1c0ZpcnN0RGVzY2VuZGFudCh0aGlzLmRpYWxvZ05vZGUpO1xuICAgIGlmICh0aGlzLmxhc3RGb2N1cyA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgX2FyaWFVdGlsczIuZGVmYXVsdC5mb2N1c0xhc3REZXNjZW5kYW50KHRoaXMuZGlhbG9nTm9kZSk7XG4gICAgfVxuICAgIHRoaXMubGFzdEZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgfVxufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gYXJpYS5EaWFsb2c7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///722f\n")},"7f4d":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nexports.default = function (target) {\n for (var i = 1, j = arguments.length; i < j; i++) {\n var source = arguments[i] || {};\n for (var prop in source) {\n if (source.hasOwnProperty(prop)) {\n var value = source[prop];\n if (value !== undefined) {\n target[prop] = value;\n }\n }\n }\n }\n\n return target;\n};\n\n;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvbWVyZ2UuanM/N2Y0ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQTtBQUNBLHVDQUF1QyxPQUFPO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiN2Y0ZC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxLCBqID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gfHwge307XG4gICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gc291cmNlW3Byb3BdO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbjsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7f4d\n")},"7fc1":function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 93);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 4:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"d010\");\n\n/***/ }),\n\n/***/ 93:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/checkbox/src/checkbox-group.vue?vue&type=template&id=7289a290&\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 staticClass: \"el-checkbox-group\",\n attrs: { role: \"group\", \"aria-label\": \"checkbox-group\" }\n },\n [_vm._t(\"default\")],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox-group.vue?vue&type=template&id=7289a290&\n\n// EXTERNAL MODULE: external \"element-ui/lib/mixins/emitter\"\nvar emitter_ = __webpack_require__(4);\nvar emitter_default = /*#__PURE__*/__webpack_require__.n(emitter_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/checkbox/src/checkbox-group.vue?vue&type=script&lang=js&\n\n\n\n/* harmony default export */ var checkbox_groupvue_type_script_lang_js_ = ({\n name: 'ElCheckboxGroup',\n\n componentName: 'ElCheckboxGroup',\n\n mixins: [emitter_default.a],\n\n inject: {\n elFormItem: {\n default: ''\n }\n },\n\n props: {\n value: {},\n disabled: Boolean,\n min: Number,\n max: Number,\n size: String,\n fill: String,\n textColor: String\n },\n\n computed: {\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n checkboxGroupSize: function checkboxGroupSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n }\n },\n\n watch: {\n value: function value(_value) {\n this.dispatch('ElFormItem', 'el.form.change', [_value]);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox-group.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_checkbox_groupvue_type_script_lang_js_ = (checkbox_groupvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox-group.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n src_checkbox_groupvue_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 api; }\ncomponent.options.__file = \"packages/checkbox/src/checkbox-group.vue\"\n/* harmony default export */ var checkbox_group = (component.exports);\n// CONCATENATED MODULE: ./packages/checkbox-group/index.js\n\n\n/* istanbul ignore next */\ncheckbox_group.install = function (Vue) {\n Vue.component(checkbox_group.name, checkbox_group);\n};\n\n/* harmony default export */ var packages_checkbox_group = __webpack_exports__[\"default\"] = (checkbox_group);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvY2hlY2tib3gtZ3JvdXAuanM/N2ZjMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxnQ0FBZ0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLGtCQUFrQjtBQUNsRjtBQUNBLHlEQUF5RCxjQUFjO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGlDQUFpQztBQUNsRix3SEFBd0gsbUJBQW1CLEVBQUU7QUFDN0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDBCQUEwQixFQUFFO0FBQy9ELHlDQUF5QyxlQUFlO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsK0RBQStEO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJGQUEyRiwyQkFBMkIsRUFBRTtBQUN4SDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUErQjs7QUFFeEQsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7OztBQUlBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLG1DQUFtQztBQUNuQyxLQUFLO0FBQ0w7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSx3SDtBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPOztBQUVQLFVBQVUiLCJmaWxlIjoiN2ZjMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC9cIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gOTMpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoe1xuXG4vKioqLyAwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gbm9ybWFsaXplQ29tcG9uZW50OyB9KTtcbi8qIGdsb2JhbHMgX19WVUVfU1NSX0NPTlRFWFRfXyAqL1xuXG4vLyBJTVBPUlRBTlQ6IERvIE5PVCB1c2UgRVMyMDE1IGZlYXR1cmVzIGluIHRoaXMgZmlsZSAoZXhjZXB0IGZvciBtb2R1bGVzKS5cbi8vIFRoaXMgbW9kdWxlIGlzIGEgcnVudGltZSB1dGlsaXR5IGZvciBjbGVhbmVyIGNvbXBvbmVudCBtb2R1bGUgb3V0cHV0IGFuZCB3aWxsXG4vLyBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgd2VicGFjayB1c2VyIGJ1bmRsZS5cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50IChcbiAgc2NyaXB0RXhwb3J0cyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZ1bmN0aW9uYWxUZW1wbGF0ZSxcbiAgaW5qZWN0U3R5bGVzLFxuICBzY29wZUlkLFxuICBtb2R1bGVJZGVudGlmaWVyLCAvKiBzZXJ2ZXIgb25seSAqL1xuICBzaGFkb3dNb2RlIC8qIHZ1ZS1jbGkgb25seSAqL1xuKSB7XG4gIC8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3BcbiAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2NyaXB0RXhwb3J0cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2NyaXB0RXhwb3J0cy5vcHRpb25zXG4gICAgOiBzY3JpcHRFeHBvcnRzXG5cbiAgLy8gcmVuZGVyIGZ1bmN0aW9uc1xuICBpZiAocmVuZGVyKSB7XG4gICAgb3B0aW9ucy5yZW5kZXIgPSByZW5kZXJcbiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IHN0YXRpY1JlbmRlckZuc1xuICAgIG9wdGlvbnMuX2NvbXBpbGVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gZnVuY3Rpb25hbCB0ZW1wbGF0ZVxuICBpZiAoZnVuY3Rpb25hbFRlbXBsYXRlKSB7XG4gICAgb3B0aW9ucy5mdW5jdGlvbmFsID0gdHJ1ZVxuICB9XG5cbiAgLy8gc2NvcGVkSWRcbiAgaWYgKHNjb3BlSWQpIHtcbiAgICBvcHRpb25zLl9zY29wZUlkID0gJ2RhdGEtdi0nICsgc2NvcGVJZFxuICB9XG5cbiAgdmFyIGhvb2tcbiAgaWYgKG1vZHVsZUlkZW50aWZpZXIpIHsgLy8gc2VydmVyIGJ1aWxkXG4gICAgaG9vayA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAvLyAyLjMgaW5qZWN0aW9uXG4gICAgICBjb250ZXh0ID1cbiAgICAgICAgY29udGV4dCB8fCAvLyBjYWNoZWQgY2FsbFxuICAgICAgICAodGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dCkgfHwgLy8gc3RhdGVmdWxcbiAgICAgICAgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LiR2bm9kZSAmJiB0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCkgLy8gZnVuY3Rpb25hbFxuICAgICAgLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlXG4gICAgICBpZiAoIWNvbnRleHQgJiYgdHlwZW9mIF9fVlVFX1NTUl9DT05URVhUX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnRleHQgPSBfX1ZVRV9TU1JfQ09OVEVYVF9fXG4gICAgICB9XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHN0eWxlc1xuICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCBjb250ZXh0KVxuICAgICAgfVxuICAgICAgLy8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlXG4gICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykge1xuICAgICAgICBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcilcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGVcbiAgICAvLyBuZXZlciBnZXRzIGNhbGxlZFxuICAgIG9wdGlvbnMuX3NzclJlZ2lzdGVyID0gaG9va1xuICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykge1xuICAgIGhvb2sgPSBzaGFkb3dNb2RlXG4gICAgICA/IGZ1bmN0aW9uICgpIHsgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgdGhpcy4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290KSB9XG4gICAgICA6IGluamVjdFN0eWxlc1xuICB9XG5cbiAgaWYgKGhvb2spIHtcbiAgICBpZiAob3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndFxuICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgbm9ybWFsaXplclxuICAgICAgb3B0aW9ucy5faW5qZWN0U3R5bGVzID0gaG9va1xuICAgICAgLy8gcmVnaXN0ZXIgZm9yIGZ1bmN0aW9hbCBjb21wb25lbnQgaW4gdnVlIGZpbGVcbiAgICAgIHZhciBvcmlnaW5hbFJlbmRlciA9IG9wdGlvbnMucmVuZGVyXG4gICAgICBvcHRpb25zLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcldpdGhTdHlsZUluamVjdGlvbiAoaCwgY29udGV4dCkge1xuICAgICAgICBob29rLmNhbGwoY29udGV4dClcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsIGNvbnRleHQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgcmVnaXN0cmF0aW9uIGFzIGJlZm9yZUNyZWF0ZSBob29rXG4gICAgICB2YXIgZXhpc3RpbmcgPSBvcHRpb25zLmJlZm9yZUNyZWF0ZVxuICAgICAgb3B0aW9ucy5iZWZvcmVDcmVhdGUgPSBleGlzdGluZ1xuICAgICAgICA/IFtdLmNvbmNhdChleGlzdGluZywgaG9vaylcbiAgICAgICAgOiBbaG9va11cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQ6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL21peGlucy9lbWl0dGVyXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTM6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC1ncm91cC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NzI4OWEyOTAmXG52YXIgcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY2hlY2tib3gtZ3JvdXBcIixcbiAgICAgIGF0dHJzOiB7IHJvbGU6IFwiZ3JvdXBcIiwgXCJhcmlhLWxhYmVsXCI6IFwiY2hlY2tib3gtZ3JvdXBcIiB9XG4gICAgfSxcbiAgICBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sXG4gICAgMlxuICApXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cbnJlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LWdyb3VwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03Mjg5YTI5MCZcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL21peGlucy9lbWl0dGVyXCJcbnZhciBlbWl0dGVyXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG52YXIgZW1pdHRlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihlbWl0dGVyXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC1ncm91cC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjaGVja2JveF9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbENoZWNrYm94R3JvdXAnLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbENoZWNrYm94R3JvdXAnLFxuXG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hXSxcblxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm1JdGVtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIHZhbHVlOiB7fSxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBtaW46IE51bWJlcixcbiAgICBtYXg6IE51bWJlcixcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgZmlsbDogU3RyaW5nLFxuICAgIHRleHRDb2xvcjogU3RyaW5nXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBfZWxGb3JtSXRlbVNpemU6IGZ1bmN0aW9uIF9lbEZvcm1JdGVtU2l6ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5lbEZvcm1JdGVtIHx8IHt9KS5lbEZvcm1JdGVtU2l6ZTtcbiAgICB9LFxuICAgIGNoZWNrYm94R3JvdXBTaXplOiBmdW5jdGlvbiBjaGVja2JveEdyb3VwU2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgfHwgdGhpcy5fZWxGb3JtSXRlbVNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKF92YWx1ZSkge1xuICAgICAgdGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsICdlbC5mb3JtLmNoYW5nZScsIFtfdmFsdWVdKTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gtZ3JvdXAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19jaGVja2JveF9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChjaGVja2JveF9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbnZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gtZ3JvdXAudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gT2JqZWN0KGNvbXBvbmVudE5vcm1hbGl6ZXJbXCJhXCIgLyogZGVmYXVsdCAqL10pKFxuICBzcmNfY2hlY2tib3hfZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhcGk7IH1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LWdyb3VwLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjaGVja2JveF9ncm91cCA9IChjb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94LWdyb3VwL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNoZWNrYm94X2dyb3VwLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoY2hlY2tib3hfZ3JvdXAubmFtZSwgY2hlY2tib3hfZ3JvdXApO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfY2hlY2tib3hfZ3JvdXAgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChjaGVja2JveF9ncm91cCk7XG5cbi8qKiovIH0pXG5cbi8qKioqKiovIH0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7fc1\n")},8122:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.isMac = exports.isEmpty = exports.isEqual = exports.arrayEquals = exports.looseEqual = exports.capitalize = exports.kebabCase = exports.autoprefixer = exports.isFirefox = exports.isEdge = exports.isIE = exports.coerceTruthyValueToArray = exports.arrayFind = exports.arrayFindIndex = exports.escapeRegexpString = exports.valueEquals = exports.generateId = exports.getValueByPath = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.noop = noop;\nexports.hasOwn = hasOwn;\nexports.toObject = toObject;\nexports.getPropByPath = getPropByPath;\nexports.rafThrottle = rafThrottle;\nexports.objToArray = objToArray;\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _types = __webpack_require__(\"a742\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction noop() {};\n\nfunction hasOwn(obj, key) {\n return hasOwnProperty.call(obj, key);\n};\n\nfunction extend(to, _from) {\n for (var key in _from) {\n to[key] = _from[key];\n }\n return to;\n};\n\nfunction toObject(arr) {\n var res = {};\n for (var i = 0; i < arr.length; i++) {\n if (arr[i]) {\n extend(res, arr[i]);\n }\n }\n return res;\n};\n\nvar getValueByPath = exports.getValueByPath = function getValueByPath(object, prop) {\n prop = prop || '';\n var paths = prop.split('.');\n var current = object;\n var result = null;\n for (var i = 0, j = paths.length; i < j; i++) {\n var path = paths[i];\n if (!current) break;\n\n if (i === j - 1) {\n result = current[path];\n break;\n }\n current = current[path];\n }\n return result;\n};\n\nfunction getPropByPath(obj, path, strict) {\n var tempObj = obj;\n path = path.replace(/\\[(\\w+)\\]/g, '.$1');\n path = path.replace(/^\\./, '');\n\n var keyArr = path.split('.');\n var i = 0;\n for (var len = keyArr.length; i < len - 1; ++i) {\n if (!tempObj && !strict) break;\n var key = keyArr[i];\n if (key in tempObj) {\n tempObj = tempObj[key];\n } else {\n if (strict) {\n throw new Error('please transfer a valid prop path to form item!');\n }\n break;\n }\n }\n return {\n o: tempObj,\n k: keyArr[i],\n v: tempObj ? tempObj[keyArr[i]] : null\n };\n};\n\nvar generateId = exports.generateId = function generateId() {\n return Math.floor(Math.random() * 10000);\n};\n\nvar valueEquals = exports.valueEquals = function valueEquals(a, b) {\n // see: https://stackoverflow.com/questions/3115982/how-to-check-if-two-arrays-are-equal-with-javascript\n if (a === b) return true;\n if (!(a instanceof Array)) return false;\n if (!(b instanceof Array)) return false;\n if (a.length !== b.length) return false;\n for (var i = 0; i !== a.length; ++i) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\nvar escapeRegexpString = exports.escapeRegexpString = function escapeRegexpString() {\n var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return String(value).replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n};\n\n// TODO: use native Array.find, Array.findIndex when IE support is dropped\nvar arrayFindIndex = exports.arrayFindIndex = function arrayFindIndex(arr, pred) {\n for (var i = 0; i !== arr.length; ++i) {\n if (pred(arr[i])) {\n return i;\n }\n }\n return -1;\n};\n\nvar arrayFind = exports.arrayFind = function arrayFind(arr, pred) {\n var idx = arrayFindIndex(arr, pred);\n return idx !== -1 ? arr[idx] : undefined;\n};\n\n// coerce truthy value to array\nvar coerceTruthyValueToArray = exports.coerceTruthyValueToArray = function coerceTruthyValueToArray(val) {\n if (Array.isArray(val)) {\n return val;\n } else if (val) {\n return [val];\n } else {\n return [];\n }\n};\n\nvar isIE = exports.isIE = function isIE() {\n return !_vue2.default.prototype.$isServer && !isNaN(Number(document.documentMode));\n};\n\nvar isEdge = exports.isEdge = function isEdge() {\n return !_vue2.default.prototype.$isServer && navigator.userAgent.indexOf('Edge') > -1;\n};\n\nvar isFirefox = exports.isFirefox = function isFirefox() {\n return !_vue2.default.prototype.$isServer && !!window.navigator.userAgent.match(/firefox/i);\n};\n\nvar autoprefixer = exports.autoprefixer = function autoprefixer(style) {\n if ((typeof style === 'undefined' ? 'undefined' : _typeof(style)) !== 'object') return style;\n var rules = ['transform', 'transition', 'animation'];\n var prefixes = ['ms-', 'webkit-'];\n rules.forEach(function (rule) {\n var value = style[rule];\n if (rule && value) {\n prefixes.forEach(function (prefix) {\n style[prefix + rule] = value;\n });\n }\n });\n return style;\n};\n\nvar kebabCase = exports.kebabCase = function kebabCase(str) {\n var hyphenateRE = /([^-])([A-Z])/g;\n return str.replace(hyphenateRE, '$1-$2').replace(hyphenateRE, '$1-$2').toLowerCase();\n};\n\nvar capitalize = exports.capitalize = function capitalize(str) {\n if (!(0, _types.isString)(str)) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nvar looseEqual = exports.looseEqual = function looseEqual(a, b) {\n var isObjectA = (0, _types.isObject)(a);\n var isObjectB = (0, _types.isObject)(b);\n if (isObjectA && isObjectB) {\n return JSON.stringify(a) === JSON.stringify(b);\n } else if (!isObjectA && !isObjectB) {\n return String(a) === String(b);\n } else {\n return false;\n }\n};\n\nvar arrayEquals = exports.arrayEquals = function arrayEquals(arrayA, arrayB) {\n arrayA = arrayA || [];\n arrayB = arrayB || [];\n\n if (arrayA.length !== arrayB.length) {\n return false;\n }\n\n for (var i = 0; i < arrayA.length; i++) {\n if (!looseEqual(arrayA[i], arrayB[i])) {\n return false;\n }\n }\n\n return true;\n};\n\nvar isEqual = exports.isEqual = function isEqual(value1, value2) {\n if (Array.isArray(value1) && Array.isArray(value2)) {\n return arrayEquals(value1, value2);\n }\n return looseEqual(value1, value2);\n};\n\nvar isEmpty = exports.isEmpty = function isEmpty(val) {\n // null or undefined\n if (val == null) return true;\n\n if (typeof val === 'boolean') return false;\n\n if (typeof val === 'number') return !val;\n\n if (val instanceof Error) return val.message === '';\n\n switch (Object.prototype.toString.call(val)) {\n // String or Array\n case '[object String]':\n case '[object Array]':\n return !val.length;\n\n // Map or Set or File\n case '[object File]':\n case '[object Map]':\n case '[object Set]':\n {\n return !val.size;\n }\n // Plain Object\n case '[object Object]':\n {\n return !Object.keys(val).length;\n }\n }\n\n return false;\n};\n\nfunction rafThrottle(fn) {\n var locked = false;\n return function () {\n var _this = this;\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (locked) return;\n locked = true;\n window.requestAnimationFrame(function (_) {\n fn.apply(_this, args);\n locked = false;\n });\n };\n}\n\nfunction objToArray(obj) {\n if (Array.isArray(obj)) {\n return obj;\n }\n return isEmpty(obj) ? [] : [obj];\n}\n\nvar isMac = exports.isMac = function isMac() {\n return !_vue2.default.prototype.$isServer && /macintosh|mac os x/i.test(navigator.userAgent);\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvdXRpbC5qcz84MTIyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7O0FBRUEsb0dBQW9HLG1CQUFtQixFQUFFLG1CQUFtQiw4SEFBOEg7O0FBRTFRO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLG1CQUFPLENBQUMsTUFBSzs7QUFFeEI7O0FBRUEsYUFBYSxtQkFBTyxDQUFDLE1BQTRCOztBQUVqRCxzQ0FBc0MsdUNBQXVDLGdCQUFnQjs7QUFFN0Y7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLGdCQUFnQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxPQUFPO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLGFBQWE7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixtQkFBbUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtRUFBbUUsYUFBYTtBQUNoRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6IjgxMjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmlzTWFjID0gZXhwb3J0cy5pc0VtcHR5ID0gZXhwb3J0cy5pc0VxdWFsID0gZXhwb3J0cy5hcnJheUVxdWFscyA9IGV4cG9ydHMubG9vc2VFcXVhbCA9IGV4cG9ydHMuY2FwaXRhbGl6ZSA9IGV4cG9ydHMua2ViYWJDYXNlID0gZXhwb3J0cy5hdXRvcHJlZml4ZXIgPSBleHBvcnRzLmlzRmlyZWZveCA9IGV4cG9ydHMuaXNFZGdlID0gZXhwb3J0cy5pc0lFID0gZXhwb3J0cy5jb2VyY2VUcnV0aHlWYWx1ZVRvQXJyYXkgPSBleHBvcnRzLmFycmF5RmluZCA9IGV4cG9ydHMuYXJyYXlGaW5kSW5kZXggPSBleHBvcnRzLmVzY2FwZVJlZ2V4cFN0cmluZyA9IGV4cG9ydHMudmFsdWVFcXVhbHMgPSBleHBvcnRzLmdlbmVyYXRlSWQgPSBleHBvcnRzLmdldFZhbHVlQnlQYXRoID0gdW5kZWZpbmVkO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmV4cG9ydHMubm9vcCA9IG5vb3A7XG5leHBvcnRzLmhhc093biA9IGhhc093bjtcbmV4cG9ydHMudG9PYmplY3QgPSB0b09iamVjdDtcbmV4cG9ydHMuZ2V0UHJvcEJ5UGF0aCA9IGdldFByb3BCeVBhdGg7XG5leHBvcnRzLnJhZlRocm90dGxlID0gcmFmVGhyb3R0bGU7XG5leHBvcnRzLm9ialRvQXJyYXkgPSBvYmpUb0FycmF5O1xuXG52YXIgX3Z1ZSA9IHJlcXVpcmUoJ3Z1ZScpO1xuXG52YXIgX3Z1ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92dWUpO1xuXG52YXIgX3R5cGVzID0gcmVxdWlyZSgnZWxlbWVudC11aS9saWIvdXRpbHMvdHlwZXMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG5mdW5jdGlvbiBoYXNPd24ob2JqLCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xufTtcblxuZnVuY3Rpb24gZXh0ZW5kKHRvLCBfZnJvbSkge1xuICBmb3IgKHZhciBrZXkgaW4gX2Zyb20pIHtcbiAgICB0b1trZXldID0gX2Zyb21ba2V5XTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xuXG5mdW5jdGlvbiB0b09iamVjdChhcnIpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhcnJbaV0pIHtcbiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG52YXIgZ2V0VmFsdWVCeVBhdGggPSBleHBvcnRzLmdldFZhbHVlQnlQYXRoID0gZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGgob2JqZWN0LCBwcm9wKSB7XG4gIHByb3AgPSBwcm9wIHx8ICcnO1xuICB2YXIgcGF0aHMgPSBwcm9wLnNwbGl0KCcuJyk7XG4gIHZhciBjdXJyZW50ID0gb2JqZWN0O1xuICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBwYXRocy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICB2YXIgcGF0aCA9IHBhdGhzW2ldO1xuICAgIGlmICghY3VycmVudCkgYnJlYWs7XG5cbiAgICBpZiAoaSA9PT0gaiAtIDEpIHtcbiAgICAgIHJlc3VsdCA9IGN1cnJlbnRbcGF0aF07XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRbcGF0aF07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmZ1bmN0aW9uIGdldFByb3BCeVBhdGgob2JqLCBwYXRoLCBzdHJpY3QpIHtcbiAgdmFyIHRlbXBPYmogPSBvYmo7XG4gIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcWyhcXHcrKVxcXS9nLCAnLiQxJyk7XG4gIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC4vLCAnJyk7XG5cbiAgdmFyIGtleUFyciA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdmFyIGkgPSAwO1xuICBmb3IgKHZhciBsZW4gPSBrZXlBcnIubGVuZ3RoOyBpIDwgbGVuIC0gMTsgKytpKSB7XG4gICAgaWYgKCF0ZW1wT2JqICYmICFzdHJpY3QpIGJyZWFrO1xuICAgIHZhciBrZXkgPSBrZXlBcnJbaV07XG4gICAgaWYgKGtleSBpbiB0ZW1wT2JqKSB7XG4gICAgICB0ZW1wT2JqID0gdGVtcE9ialtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncGxlYXNlIHRyYW5zZmVyIGEgdmFsaWQgcHJvcCBwYXRoIHRvIGZvcm0gaXRlbSEnKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIG86IHRlbXBPYmosXG4gICAgazoga2V5QXJyW2ldLFxuICAgIHY6IHRlbXBPYmogPyB0ZW1wT2JqW2tleUFycltpXV0gOiBudWxsXG4gIH07XG59O1xuXG52YXIgZ2VuZXJhdGVJZCA9IGV4cG9ydHMuZ2VuZXJhdGVJZCA9IGZ1bmN0aW9uIGdlbmVyYXRlSWQoKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMCk7XG59O1xuXG52YXIgdmFsdWVFcXVhbHMgPSBleHBvcnRzLnZhbHVlRXF1YWxzID0gZnVuY3Rpb24gdmFsdWVFcXVhbHMoYSwgYikge1xuICAvLyBzZWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMxMTU5ODIvaG93LXRvLWNoZWNrLWlmLXR3by1hcnJheXMtYXJlLWVxdWFsLXdpdGgtamF2YXNjcmlwdFxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmICghKGEgaW5zdGFuY2VvZiBBcnJheSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKCEoYiBpbnN0YW5jZW9mIEFycmF5KSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAodmFyIGkgPSAwOyBpICE9PSBhLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBlc2NhcGVSZWdleHBTdHJpbmcgPSBleHBvcnRzLmVzY2FwZVJlZ2V4cFN0cmluZyA9IGZ1bmN0aW9uIGVzY2FwZVJlZ2V4cFN0cmluZygpIHtcbiAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvW3xcXFxce30oKVtcXF1eJCsqPy5dL2csICdcXFxcJCYnKTtcbn07XG5cbi8vIFRPRE86IHVzZSBuYXRpdmUgQXJyYXkuZmluZCwgQXJyYXkuZmluZEluZGV4IHdoZW4gSUUgc3VwcG9ydCBpcyBkcm9wcGVkXG52YXIgYXJyYXlGaW5kSW5kZXggPSBleHBvcnRzLmFycmF5RmluZEluZGV4ID0gZnVuY3Rpb24gYXJyYXlGaW5kSW5kZXgoYXJyLCBwcmVkKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpICE9PSBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAocHJlZChhcnJbaV0pKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxudmFyIGFycmF5RmluZCA9IGV4cG9ydHMuYXJyYXlGaW5kID0gZnVuY3Rpb24gYXJyYXlGaW5kKGFyciwgcHJlZCkge1xuICB2YXIgaWR4ID0gYXJyYXlGaW5kSW5kZXgoYXJyLCBwcmVkKTtcbiAgcmV0dXJuIGlkeCAhPT0gLTEgPyBhcnJbaWR4XSA6IHVuZGVmaW5lZDtcbn07XG5cbi8vIGNvZXJjZSB0cnV0aHkgdmFsdWUgdG8gYXJyYXlcbnZhciBjb2VyY2VUcnV0aHlWYWx1ZVRvQXJyYXkgPSBleHBvcnRzLmNvZXJjZVRydXRoeVZhbHVlVG9BcnJheSA9IGZ1bmN0aW9uIGNvZXJjZVRydXRoeVZhbHVlVG9BcnJheSh2YWwpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJldHVybiB2YWw7XG4gIH0gZWxzZSBpZiAodmFsKSB7XG4gICAgcmV0dXJuIFt2YWxdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbXTtcbiAgfVxufTtcblxudmFyIGlzSUUgPSBleHBvcnRzLmlzSUUgPSBmdW5jdGlvbiBpc0lFKCkge1xuICByZXR1cm4gIV92dWUyLmRlZmF1bHQucHJvdG90eXBlLiRpc1NlcnZlciAmJiAhaXNOYU4oTnVtYmVyKGRvY3VtZW50LmRvY3VtZW50TW9kZSkpO1xufTtcblxudmFyIGlzRWRnZSA9IGV4cG9ydHMuaXNFZGdlID0gZnVuY3Rpb24gaXNFZGdlKCkge1xuICByZXR1cm4gIV92dWUyLmRlZmF1bHQucHJvdG90eXBlLiRpc1NlcnZlciAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA+IC0xO1xufTtcblxudmFyIGlzRmlyZWZveCA9IGV4cG9ydHMuaXNGaXJlZm94ID0gZnVuY3Rpb24gaXNGaXJlZm94KCkge1xuICByZXR1cm4gIV92dWUyLmRlZmF1bHQucHJvdG90eXBlLiRpc1NlcnZlciAmJiAhIXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9maXJlZm94L2kpO1xufTtcblxudmFyIGF1dG9wcmVmaXhlciA9IGV4cG9ydHMuYXV0b3ByZWZpeGVyID0gZnVuY3Rpb24gYXV0b3ByZWZpeGVyKHN0eWxlKSB7XG4gIGlmICgodHlwZW9mIHN0eWxlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihzdHlsZSkpICE9PSAnb2JqZWN0JykgcmV0dXJuIHN0eWxlO1xuICB2YXIgcnVsZXMgPSBbJ3RyYW5zZm9ybScsICd0cmFuc2l0aW9uJywgJ2FuaW1hdGlvbiddO1xuICB2YXIgcHJlZml4ZXMgPSBbJ21zLScsICd3ZWJraXQtJ107XG4gIHJ1bGVzLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICB2YXIgdmFsdWUgPSBzdHlsZVtydWxlXTtcbiAgICBpZiAocnVsZSAmJiB2YWx1ZSkge1xuICAgICAgcHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICAgIHN0eWxlW3ByZWZpeCArIHJ1bGVdID0gdmFsdWU7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3R5bGU7XG59O1xuXG52YXIga2ViYWJDYXNlID0gZXhwb3J0cy5rZWJhYkNhc2UgPSBmdW5jdGlvbiBrZWJhYkNhc2Uoc3RyKSB7XG4gIHZhciBoeXBoZW5hdGVSRSA9IC8oW14tXSkoW0EtWl0pL2c7XG4gIHJldHVybiBzdHIucmVwbGFjZShoeXBoZW5hdGVSRSwgJyQxLSQyJykucmVwbGFjZShoeXBoZW5hdGVSRSwgJyQxLSQyJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBjYXBpdGFsaXplID0gZXhwb3J0cy5jYXBpdGFsaXplID0gZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHIpIHtcbiAgaWYgKCEoMCwgX3R5cGVzLmlzU3RyaW5nKShzdHIpKSByZXR1cm4gc3RyO1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xufTtcblxudmFyIGxvb3NlRXF1YWwgPSBleHBvcnRzLmxvb3NlRXF1YWwgPSBmdW5jdGlvbiBsb29zZUVxdWFsKGEsIGIpIHtcbiAgdmFyIGlzT2JqZWN0QSA9ICgwLCBfdHlwZXMuaXNPYmplY3QpKGEpO1xuICB2YXIgaXNPYmplY3RCID0gKDAsIF90eXBlcy5pc09iamVjdCkoYik7XG4gIGlmIChpc09iamVjdEEgJiYgaXNPYmplY3RCKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpID09PSBKU09OLnN0cmluZ2lmeShiKTtcbiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHtcbiAgICByZXR1cm4gU3RyaW5nKGEpID09PSBTdHJpbmcoYik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG52YXIgYXJyYXlFcXVhbHMgPSBleHBvcnRzLmFycmF5RXF1YWxzID0gZnVuY3Rpb24gYXJyYXlFcXVhbHMoYXJyYXlBLCBhcnJheUIpIHtcbiAgYXJyYXlBID0gYXJyYXlBIHx8IFtdO1xuICBhcnJheUIgPSBhcnJheUIgfHwgW107XG5cbiAgaWYgKGFycmF5QS5sZW5ndGggIT09IGFycmF5Qi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5QS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghbG9vc2VFcXVhbChhcnJheUFbaV0sIGFycmF5QltpXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBpc0VxdWFsID0gZXhwb3J0cy5pc0VxdWFsID0gZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZTEsIHZhbHVlMikge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTEpICYmIEFycmF5LmlzQXJyYXkodmFsdWUyKSkge1xuICAgIHJldHVybiBhcnJheUVxdWFscyh2YWx1ZTEsIHZhbHVlMik7XG4gIH1cbiAgcmV0dXJuIGxvb3NlRXF1YWwodmFsdWUxLCB2YWx1ZTIpO1xufTtcblxudmFyIGlzRW1wdHkgPSBleHBvcnRzLmlzRW1wdHkgPSBmdW5jdGlvbiBpc0VtcHR5KHZhbCkge1xuICAvLyBudWxsIG9yIHVuZGVmaW5lZFxuICBpZiAodmFsID09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHJldHVybiAhdmFsO1xuXG4gIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbC5tZXNzYWdlID09PSAnJztcblxuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpKSB7XG4gICAgLy8gU3RyaW5nIG9yIEFycmF5XG4gICAgY2FzZSAnW29iamVjdCBTdHJpbmddJzpcbiAgICBjYXNlICdbb2JqZWN0IEFycmF5XSc6XG4gICAgICByZXR1cm4gIXZhbC5sZW5ndGg7XG5cbiAgICAvLyBNYXAgb3IgU2V0IG9yIEZpbGVcbiAgICBjYXNlICdbb2JqZWN0IEZpbGVdJzpcbiAgICBjYXNlICdbb2JqZWN0IE1hcF0nOlxuICAgIGNhc2UgJ1tvYmplY3QgU2V0XSc6XG4gICAgICB7XG4gICAgICAgIHJldHVybiAhdmFsLnNpemU7XG4gICAgICB9XG4gICAgLy8gUGxhaW4gT2JqZWN0XG4gICAgY2FzZSAnW29iamVjdCBPYmplY3RdJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuICFPYmplY3Qua2V5cyh2YWwpLmxlbmd0aDtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHJhZlRocm90dGxlKGZuKSB7XG4gIHZhciBsb2NrZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKGxvY2tlZCkgcmV0dXJuO1xuICAgIGxvY2tlZCA9IHRydWU7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoXykge1xuICAgICAgZm4uYXBwbHkoX3RoaXMsIGFyZ3MpO1xuICAgICAgbG9ja2VkID0gZmFsc2U7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9ialRvQXJyYXkob2JqKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIHJldHVybiBpc0VtcHR5KG9iaikgPyBbXSA6IFtvYmpdO1xufVxuXG52YXIgaXNNYWMgPSBleHBvcnRzLmlzTWFjID0gZnVuY3Rpb24gaXNNYWMoKSB7XG4gIHJldHVybiAhX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyICYmIC9tYWNpbnRvc2h8bWFjIG9zIHgvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8122\n")},"845f":function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 97);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 97:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/button/src/button-group.vue?vue&type=template&id=3d8661d0&\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"el-button-group\" }, [_vm._t(\"default\")], 2)\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/button/src/button-group.vue?vue&type=template&id=3d8661d0&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/button/src/button-group.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n\n/* harmony default export */ var button_groupvue_type_script_lang_js_ = ({\n name: 'ElButtonGroup'\n});\n// CONCATENATED MODULE: ./packages/button/src/button-group.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_button_groupvue_type_script_lang_js_ = (button_groupvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/button/src/button-group.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n src_button_groupvue_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 api; }\ncomponent.options.__file = \"packages/button/src/button-group.vue\"\n/* harmony default export */ var button_group = (component.exports);\n// CONCATENATED MODULE: ./packages/button-group/index.js\n\n\n/* istanbul ignore next */\nbutton_group.install = function (Vue) {\n Vue.component(button_group.name, button_group);\n};\n\n/* harmony default export */ var packages_button_group = __webpack_exports__[\"default\"] = (button_group);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvYnV0dG9uLWdyb3VwLmpzPzg0NWYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsZ0NBQWdDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxrQkFBa0I7QUFDbEY7QUFDQSx5REFBeUQsY0FBYztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQ0FBaUM7QUFDbEYsd0hBQXdILG1CQUFtQixFQUFFO0FBQzdJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQkFBMEIsRUFBRTtBQUMvRCx5Q0FBeUMsZUFBZTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtEQUErRDtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwyRkFBMkYsMkJBQTJCLEVBQUU7QUFDeEg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlDQUFpQztBQUNyRDtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esb0g7QUFDQTtBQUNBOztBQUVBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTzs7QUFFUCxVQUFVIiwiZmlsZSI6Ijg0NWYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2Rpc3QvXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDk3KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIG5vcm1hbGl6ZUNvbXBvbmVudDsgfSk7XG4vKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi9cblxuLy8gSU1QT1JUQU5UOiBEbyBOT1QgdXNlIEVTMjAxNSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgKGV4Y2VwdCBmb3IgbW9kdWxlcykuXG4vLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbFxuLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudCAoXG4gIHNjcmlwdEV4cG9ydHMsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmdW5jdGlvbmFsVGVtcGxhdGUsXG4gIGluamVjdFN0eWxlcyxcbiAgc2NvcGVJZCxcbiAgbW9kdWxlSWRlbnRpZmllciwgLyogc2VydmVyIG9ubHkgKi9cbiAgc2hhZG93TW9kZSAvKiB2dWUtY2xpIG9ubHkgKi9cbikge1xuICAvLyBWdWUuZXh0ZW5kIGNvbnN0cnVjdG9yIGV4cG9ydCBpbnRlcm9wXG4gIHZhciBvcHRpb25zID0gdHlwZW9mIHNjcmlwdEV4cG9ydHMgPT09ICdmdW5jdGlvbidcbiAgICA/IHNjcmlwdEV4cG9ydHMub3B0aW9uc1xuICAgIDogc2NyaXB0RXhwb3J0c1xuXG4gIC8vIHJlbmRlciBmdW5jdGlvbnNcbiAgaWYgKHJlbmRlcikge1xuICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyXG4gICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnNcbiAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWVcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGZ1bmN0aW9uYWxUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25hbCA9IHRydWVcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWRcbiAgfVxuXG4gIHZhciBob29rXG4gIGlmIChtb2R1bGVJZGVudGlmaWVyKSB7IC8vIHNlcnZlciBidWlsZFxuICAgIGhvb2sgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgLy8gMi4zIGluamVjdGlvblxuICAgICAgY29udGV4dCA9XG4gICAgICAgIGNvbnRleHQgfHwgLy8gY2FjaGVkIGNhbGxcbiAgICAgICAgKHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHQpIHx8IC8vIHN0YXRlZnVsXG4gICAgICAgICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC4kdm5vZGUgJiYgdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQpIC8vIGZ1bmN0aW9uYWxcbiAgICAgIC8vIDIuMiB3aXRoIHJ1bkluTmV3Q29udGV4dDogdHJ1ZVxuICAgICAgaWYgKCFjb250ZXh0ICYmIHR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb250ZXh0ID0gX19WVUVfU1NSX0NPTlRFWFRfX1xuICAgICAgfVxuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCBzdHlsZXNcbiAgICAgIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICAgICAgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgY29udGV4dClcbiAgICAgIH1cbiAgICAgIC8vIHJlZ2lzdGVyIGNvbXBvbmVudCBtb2R1bGUgaWRlbnRpZmllciBmb3IgYXN5bmMgY2h1bmsgaW5mZXJyZW5jZVxuICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMpIHtcbiAgICAgICAgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKG1vZHVsZUlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHVzZWQgYnkgc3NyIGluIGNhc2UgY29tcG9uZW50IGlzIGNhY2hlZCBhbmQgYmVmb3JlQ3JlYXRlXG4gICAgLy8gbmV2ZXIgZ2V0cyBjYWxsZWRcbiAgICBvcHRpb25zLl9zc3JSZWdpc3RlciA9IGhvb2tcbiAgfSBlbHNlIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICBob29rID0gc2hhZG93TW9kZVxuICAgICAgPyBmdW5jdGlvbiAoKSB7IGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIHRoaXMuJHJvb3QuJG9wdGlvbnMuc2hhZG93Um9vdCkgfVxuICAgICAgOiBpbmplY3RTdHlsZXNcbiAgfVxuXG4gIGlmIChob29rKSB7XG4gICAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgICAgLy8gZm9yIHRlbXBsYXRlLW9ubHkgaG90LXJlbG9hZCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgcmVuZGVyIGZuIGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRocm91Z2ggdGhlIG5vcm1hbGl6ZXJcbiAgICAgIG9wdGlvbnMuX2luamVjdFN0eWxlcyA9IGhvb2tcbiAgICAgIC8vIHJlZ2lzdGVyIGZvciBmdW5jdGlvYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlXG4gICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24gKGgsIGNvbnRleHQpIHtcbiAgICAgICAgaG9vay5jYWxsKGNvbnRleHQpXG4gICAgICAgIHJldHVybiBvcmlnaW5hbFJlbmRlcihoLCBjb250ZXh0KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiBhcyBiZWZvcmVDcmVhdGUgaG9va1xuICAgICAgdmFyIGV4aXN0aW5nID0gb3B0aW9ucy5iZWZvcmVDcmVhdGVcbiAgICAgIG9wdGlvbnMuYmVmb3JlQ3JlYXRlID0gZXhpc3RpbmdcbiAgICAgICAgPyBbXS5jb25jYXQoZXhpc3RpbmcsIGhvb2spXG4gICAgICAgIDogW2hvb2tdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHBvcnRzOiBzY3JpcHRFeHBvcnRzLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA5Nzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24tZ3JvdXAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNkODY2MWQwJlxudmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWJ1dHRvbi1ncm91cFwiIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9idXR0b24vc3JjL2J1dHRvbi1ncm91cC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2Q4NjYxZDAmXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLWdyb3VwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBidXR0b25fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxCdXR0b25Hcm91cCdcbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9idXR0b24vc3JjL2J1dHRvbi1ncm91cC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2J1dHRvbl9ncm91cHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChidXR0b25fZ3JvdXB2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXG52YXIgY29tcG9uZW50Tm9ybWFsaXplciA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24tZ3JvdXAudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gT2JqZWN0KGNvbXBvbmVudE5vcm1hbGl6ZXJbXCJhXCIgLyogZGVmYXVsdCAqL10pKFxuICBzcmNfYnV0dG9uX2dyb3VwdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgYXBpOyB9XG5jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLWdyb3VwLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBidXR0b25fZ3JvdXAgPSAoY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9idXR0b24tZ3JvdXAvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuYnV0dG9uX2dyb3VwLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoYnV0dG9uX2dyb3VwLm5hbWUsIGJ1dHRvbl9ncm91cCk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19idXR0b25fZ3JvdXAgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChidXR0b25fZ3JvdXApO1xuXG4vKioqLyB9KVxuXG4vKioqKioqLyB9KTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///845f\n")},"8bbc":function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 132);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 132:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/tag/src/tag.vue?vue&type=script&lang=js&\n\n/* harmony default export */ var tagvue_type_script_lang_js_ = ({\n name: 'ElTag',\n props: {\n text: String,\n closable: Boolean,\n type: String,\n hit: Boolean,\n disableTransitions: Boolean,\n color: String,\n size: String,\n effect: {\n type: String,\n default: 'light',\n validator: function validator(val) {\n return ['dark', 'light', 'plain'].indexOf(val) !== -1;\n }\n }\n },\n methods: {\n handleClose: function handleClose(event) {\n event.stopPropagation();\n this.$emit('close', event);\n },\n handleClick: function handleClick(event) {\n this.$emit('click', event);\n }\n },\n computed: {\n tagSize: function tagSize() {\n return this.size || (this.$ELEMENT || {}).size;\n }\n },\n render: function render(h) {\n var type = this.type,\n tagSize = this.tagSize,\n hit = this.hit,\n effect = this.effect;\n\n var classes = ['el-tag', type ? 'el-tag--' + type : '', tagSize ? 'el-tag--' + tagSize : '', effect ? 'el-tag--' + effect : '', hit && 'is-hit'];\n var tagEl = h(\n 'span',\n {\n 'class': classes,\n style: { backgroundColor: this.color },\n on: {\n 'click': this.handleClick\n }\n },\n [this.$slots.default, this.closable && h('i', { 'class': 'el-tag__close el-icon-close', on: {\n 'click': this.handleClose\n }\n })]\n );\n\n return this.disableTransitions ? tagEl : h(\n 'transition',\n {\n attrs: { name: 'el-zoom-in-center' }\n },\n [tagEl]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/tag/src/tag.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_tagvue_type_script_lang_js_ = (tagvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/tag/src/tag.vue\nvar render, staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n src_tagvue_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 api; }\ncomponent.options.__file = \"packages/tag/src/tag.vue\"\n/* harmony default export */ var tag = (component.exports);\n// CONCATENATED MODULE: ./packages/tag/index.js\n\n\n/* istanbul ignore next */\ntag.install = function (Vue) {\n Vue.component(tag.name, tag);\n};\n\n/* harmony default export */ var packages_tag = __webpack_exports__[\"default\"] = (tag);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdGFnLmpzPzhiYmMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsZ0NBQWdDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxrQkFBa0I7QUFDbEY7QUFDQSx5REFBeUQsY0FBYztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQ0FBaUM7QUFDbEYsd0hBQXdILG1CQUFtQixFQUFFO0FBQzdJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQkFBMEIsRUFBRTtBQUMvRCx5Q0FBeUMsZUFBZTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtEQUErRDtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwyRkFBMkYsMkJBQTJCLEVBQUU7QUFDeEg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw4QkFBOEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esa0c7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7O0FBS0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsWUFBWTtBQUN2QjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87O0FBRVAsVUFBVSIsImZpbGUiOiI4YmJjLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbi8qKioqKiovIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4vKioqKioqLyBcdFx0cmV0dXJuIG5zO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9kaXN0L1wiO1xuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxMzIpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoe1xuXG4vKioqLyAwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gbm9ybWFsaXplQ29tcG9uZW50OyB9KTtcbi8qIGdsb2JhbHMgX19WVUVfU1NSX0NPTlRFWFRfXyAqL1xuXG4vLyBJTVBPUlRBTlQ6IERvIE5PVCB1c2UgRVMyMDE1IGZlYXR1cmVzIGluIHRoaXMgZmlsZSAoZXhjZXB0IGZvciBtb2R1bGVzKS5cbi8vIFRoaXMgbW9kdWxlIGlzIGEgcnVudGltZSB1dGlsaXR5IGZvciBjbGVhbmVyIGNvbXBvbmVudCBtb2R1bGUgb3V0cHV0IGFuZCB3aWxsXG4vLyBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgd2VicGFjayB1c2VyIGJ1bmRsZS5cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50IChcbiAgc2NyaXB0RXhwb3J0cyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZ1bmN0aW9uYWxUZW1wbGF0ZSxcbiAgaW5qZWN0U3R5bGVzLFxuICBzY29wZUlkLFxuICBtb2R1bGVJZGVudGlmaWVyLCAvKiBzZXJ2ZXIgb25seSAqL1xuICBzaGFkb3dNb2RlIC8qIHZ1ZS1jbGkgb25seSAqL1xuKSB7XG4gIC8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3BcbiAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2NyaXB0RXhwb3J0cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2NyaXB0RXhwb3J0cy5vcHRpb25zXG4gICAgOiBzY3JpcHRFeHBvcnRzXG5cbiAgLy8gcmVuZGVyIGZ1bmN0aW9uc1xuICBpZiAocmVuZGVyKSB7XG4gICAgb3B0aW9ucy5yZW5kZXIgPSByZW5kZXJcbiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IHN0YXRpY1JlbmRlckZuc1xuICAgIG9wdGlvbnMuX2NvbXBpbGVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gZnVuY3Rpb25hbCB0ZW1wbGF0ZVxuICBpZiAoZnVuY3Rpb25hbFRlbXBsYXRlKSB7XG4gICAgb3B0aW9ucy5mdW5jdGlvbmFsID0gdHJ1ZVxuICB9XG5cbiAgLy8gc2NvcGVkSWRcbiAgaWYgKHNjb3BlSWQpIHtcbiAgICBvcHRpb25zLl9zY29wZUlkID0gJ2RhdGEtdi0nICsgc2NvcGVJZFxuICB9XG5cbiAgdmFyIGhvb2tcbiAgaWYgKG1vZHVsZUlkZW50aWZpZXIpIHsgLy8gc2VydmVyIGJ1aWxkXG4gICAgaG9vayA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAvLyAyLjMgaW5qZWN0aW9uXG4gICAgICBjb250ZXh0ID1cbiAgICAgICAgY29udGV4dCB8fCAvLyBjYWNoZWQgY2FsbFxuICAgICAgICAodGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dCkgfHwgLy8gc3RhdGVmdWxcbiAgICAgICAgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LiR2bm9kZSAmJiB0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCkgLy8gZnVuY3Rpb25hbFxuICAgICAgLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlXG4gICAgICBpZiAoIWNvbnRleHQgJiYgdHlwZW9mIF9fVlVFX1NTUl9DT05URVhUX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnRleHQgPSBfX1ZVRV9TU1JfQ09OVEVYVF9fXG4gICAgICB9XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHN0eWxlc1xuICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCBjb250ZXh0KVxuICAgICAgfVxuICAgICAgLy8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlXG4gICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykge1xuICAgICAgICBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcilcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGVcbiAgICAvLyBuZXZlciBnZXRzIGNhbGxlZFxuICAgIG9wdGlvbnMuX3NzclJlZ2lzdGVyID0gaG9va1xuICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykge1xuICAgIGhvb2sgPSBzaGFkb3dNb2RlXG4gICAgICA/IGZ1bmN0aW9uICgpIHsgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgdGhpcy4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290KSB9XG4gICAgICA6IGluamVjdFN0eWxlc1xuICB9XG5cbiAgaWYgKGhvb2spIHtcbiAgICBpZiAob3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndFxuICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgbm9ybWFsaXplclxuICAgICAgb3B0aW9ucy5faW5qZWN0U3R5bGVzID0gaG9va1xuICAgICAgLy8gcmVnaXN0ZXIgZm9yIGZ1bmN0aW9hbCBjb21wb25lbnQgaW4gdnVlIGZpbGVcbiAgICAgIHZhciBvcmlnaW5hbFJlbmRlciA9IG9wdGlvbnMucmVuZGVyXG4gICAgICBvcHRpb25zLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcldpdGhTdHlsZUluamVjdGlvbiAoaCwgY29udGV4dCkge1xuICAgICAgICBob29rLmNhbGwoY29udGV4dClcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsIGNvbnRleHQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgcmVnaXN0cmF0aW9uIGFzIGJlZm9yZUNyZWF0ZSBob29rXG4gICAgICB2YXIgZXhpc3RpbmcgPSBvcHRpb25zLmJlZm9yZUNyZWF0ZVxuICAgICAgb3B0aW9ucy5iZWZvcmVDcmVhdGUgPSBleGlzdGluZ1xuICAgICAgICA/IFtdLmNvbmNhdChleGlzdGluZywgaG9vaylcbiAgICAgICAgOiBbaG9va11cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDEzMjpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3RhZy9zcmMvdGFnLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGFndnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsVGFnJyxcbiAgcHJvcHM6IHtcbiAgICB0ZXh0OiBTdHJpbmcsXG4gICAgY2xvc2FibGU6IEJvb2xlYW4sXG4gICAgdHlwZTogU3RyaW5nLFxuICAgIGhpdDogQm9vbGVhbixcbiAgICBkaXNhYmxlVHJhbnNpdGlvbnM6IEJvb2xlYW4sXG4gICAgY29sb3I6IFN0cmluZyxcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgZWZmZWN0OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnbGlnaHQnLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsKSB7XG4gICAgICAgIHJldHVybiBbJ2RhcmsnLCAnbGlnaHQnLCAncGxhaW4nXS5pbmRleE9mKHZhbCkgIT09IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUNsb3NlOiBmdW5jdGlvbiBoYW5kbGVDbG9zZShldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLiRlbWl0KCdjbG9zZScsIGV2ZW50KTtcbiAgICB9LFxuICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgICAgdGhpcy4kZW1pdCgnY2xpY2snLCBldmVudCk7XG4gICAgfVxuICB9LFxuICBjb21wdXRlZDoge1xuICAgIHRhZ1NpemU6IGZ1bmN0aW9uIHRhZ1NpemUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaXplIHx8ICh0aGlzLiRFTEVNRU5UIHx8IHt9KS5zaXplO1xuICAgIH1cbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoaCkge1xuICAgIHZhciB0eXBlID0gdGhpcy50eXBlLFxuICAgICAgICB0YWdTaXplID0gdGhpcy50YWdTaXplLFxuICAgICAgICBoaXQgPSB0aGlzLmhpdCxcbiAgICAgICAgZWZmZWN0ID0gdGhpcy5lZmZlY3Q7XG5cbiAgICB2YXIgY2xhc3NlcyA9IFsnZWwtdGFnJywgdHlwZSA/ICdlbC10YWctLScgKyB0eXBlIDogJycsIHRhZ1NpemUgPyAnZWwtdGFnLS0nICsgdGFnU2l6ZSA6ICcnLCBlZmZlY3QgPyAnZWwtdGFnLS0nICsgZWZmZWN0IDogJycsIGhpdCAmJiAnaXMtaGl0J107XG4gICAgdmFyIHRhZ0VsID0gaChcbiAgICAgICdzcGFuJyxcbiAgICAgIHtcbiAgICAgICAgJ2NsYXNzJzogY2xhc3NlcyxcbiAgICAgICAgc3R5bGU6IHsgYmFja2dyb3VuZENvbG9yOiB0aGlzLmNvbG9yIH0sXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgJ2NsaWNrJzogdGhpcy5oYW5kbGVDbGlja1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW3RoaXMuJHNsb3RzLmRlZmF1bHQsIHRoaXMuY2xvc2FibGUgJiYgaCgnaScsIHsgJ2NsYXNzJzogJ2VsLXRhZ19fY2xvc2UgZWwtaWNvbi1jbG9zZScsIG9uOiB7XG4gICAgICAgICAgJ2NsaWNrJzogdGhpcy5oYW5kbGVDbG9zZVxuICAgICAgICB9XG4gICAgICB9KV1cbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVRyYW5zaXRpb25zID8gdGFnRWwgOiBoKFxuICAgICAgJ3RyYW5zaXRpb24nLFxuICAgICAge1xuICAgICAgICBhdHRyczogeyBuYW1lOiAnZWwtem9vbS1pbi1jZW50ZXInIH1cbiAgICAgIH0sXG4gICAgICBbdGFnRWxdXG4gICAgKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhZy9zcmMvdGFnLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfdGFndnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHRhZ3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbnZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy90YWcvc3JjL3RhZy52dWVcbnZhciByZW5kZXIsIHN0YXRpY1JlbmRlckZuc1xuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBjb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplcltcImFcIiAvKiBkZWZhdWx0ICovXSkoXG4gIHNyY190YWd2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhcGk7IH1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvdGFnL3NyYy90YWcudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRhZyA9IChjb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3RhZy9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG50YWcuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudCh0YWcubmFtZSwgdGFnKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX3RhZyA9IF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHRhZyk7XG5cbi8qKiovIH0pXG5cbi8qKioqKiovIH0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8bbc\n")},"9d7e":function(module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\nexports.default = function (Vue) {\n\n /**\n * template\n *\n * @param {String} string\n * @param {Array} ...args\n * @return {String}\n */\n\n function template(string) {\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 if (args.length === 1 && _typeof(args[0]) === \'object\') {\n args = args[0];\n }\n\n if (!args || !args.hasOwnProperty) {\n args = {};\n }\n\n return string.replace(RE_NARGS, function (match, prefix, i, index) {\n var result = void 0;\n\n if (string[index - 1] === \'{\' && string[index + match.length] === \'}\') {\n return i;\n } else {\n result = (0, _util.hasOwn)(args, i) ? args[i] : null;\n if (result === null || result === undefined) {\n return \'\';\n }\n\n return result;\n }\n });\n }\n\n return template;\n};\n\nvar _util = __webpack_require__("8122");\n\nvar RE_NARGS = /(%|)\\{([0-9a-zA-Z_]+)\\}/g;\n/**\n * String format template\n * - Inspired:\n * https://github.com/Matt-Esch/string-template/index.js\n */\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvbG9jYWxlL2Zvcm1hdC5qcz85ZDdlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLG9HQUFvRyxtQkFBbUIsRUFBRSxtQkFBbUIsOEhBQThIOztBQUUxUTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxNQUFNO0FBQ25CLGNBQWM7QUFDZDs7QUFFQTtBQUNBLHNGQUFzRixhQUFhO0FBQ25HO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGtDQUFrQyx3Q0FBd0M7QUFDMUU7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBLFlBQVksbUJBQU8sQ0FBQyxNQUEyQjs7QUFFL0Msc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjlkN2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKFZ1ZSkge1xuXG4gIC8qKlxuICAgKiB0ZW1wbGF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7QXJyYXl9IC4uLmFyZ3NcbiAgICogQHJldHVybiB7U3RyaW5nfVxuICAgKi9cblxuICBmdW5jdGlvbiB0ZW1wbGF0ZShzdHJpbmcpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBfdHlwZW9mKGFyZ3NbMF0pID09PSAnb2JqZWN0Jykge1xuICAgICAgYXJncyA9IGFyZ3NbMF07XG4gICAgfVxuXG4gICAgaWYgKCFhcmdzIHx8ICFhcmdzLmhhc093blByb3BlcnR5KSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKFJFX05BUkdTLCBmdW5jdGlvbiAobWF0Y2gsIHByZWZpeCwgaSwgaW5kZXgpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2b2lkIDA7XG5cbiAgICAgIGlmIChzdHJpbmdbaW5kZXggLSAxXSA9PT0gJ3snICYmIHN0cmluZ1tpbmRleCArIG1hdGNoLmxlbmd0aF0gPT09ICd9Jykge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9ICgwLCBfdXRpbC5oYXNPd24pKGFyZ3MsIGkpID8gYXJnc1tpXSA6IG51bGw7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBsYXRlO1xufTtcblxudmFyIF91dGlsID0gcmVxdWlyZSgnZWxlbWVudC11aS9saWIvdXRpbHMvdXRpbCcpO1xuXG52YXIgUkVfTkFSR1MgPSAvKCV8KVxceyhbMC05YS16QS1aX10rKVxcfS9nO1xuLyoqXG4gKiAgU3RyaW5nIGZvcm1hdCB0ZW1wbGF0ZVxuICogIC0gSW5zcGlyZWQ6XG4gKiAgICBodHRwczovL2dpdGh1Yi5jb20vTWF0dC1Fc2NoL3N0cmluZy10ZW1wbGF0ZS9pbmRleC5qc1xuICovIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9d7e\n')},a742:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.isDefined = exports.isUndefined = exports.isFunction = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.isString = isString;\nexports.isObject = isObject;\nexports.isHtmlElement = isHtmlElement;\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction isString(obj) {\n return Object.prototype.toString.call(obj) === '[object String]';\n}\n\nfunction isObject(obj) {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nfunction isHtmlElement(node) {\n return node && node.nodeType === Node.ELEMENT_NODE;\n}\n\n/**\n * - Inspired:\n * https://github.com/jashkenas/underscore/blob/master/modules/isFunction.js\n */\nvar isFunction = function isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n};\n\nif ( true && (typeof Int8Array === 'undefined' ? 'undefined' : _typeof(Int8Array)) !== 'object' && (_vue2.default.prototype.$isServer || typeof document.childNodes !== 'function')) {\n exports.isFunction = isFunction = function isFunction(obj) {\n return typeof obj === 'function' || false;\n };\n}\n\nexports.isFunction = isFunction;\nvar isUndefined = exports.isUndefined = function isUndefined(val) {\n return val === void 0;\n};\n\nvar isDefined = exports.isDefined = function isDefined(val) {\n return val !== undefined && val !== null;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvdHlwZXMuanM/YTc0MiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBOztBQUVBLG9HQUFvRyxtQkFBbUIsRUFBRSxtQkFBbUIsOEhBQThIOztBQUUxUTtBQUNBO0FBQ0E7O0FBRUEsV0FBVyxtQkFBTyxDQUFDLE1BQUs7O0FBRXhCOztBQUVBLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUksS0FBeUI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6ImE3NDIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmlzRGVmaW5lZCA9IGV4cG9ydHMuaXNVbmRlZmluZWQgPSBleHBvcnRzLmlzRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuZXhwb3J0cy5pc0h0bWxFbGVtZW50ID0gaXNIdG1sRWxlbWVudDtcblxudmFyIF92dWUgPSByZXF1aXJlKCd2dWUnKTtcblxudmFyIF92dWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdnVlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG5mdW5jdGlvbiBpc0h0bWxFbGVtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREU7XG59XG5cbi8qKlxuICogIC0gSW5zcGlyZWQ6XG4gKiAgICBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvYmxvYi9tYXN0ZXIvbW9kdWxlcy9pc0Z1bmN0aW9uLmpzXG4gKi9cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gaXNGdW5jdGlvbihmdW5jdGlvblRvQ2hlY2spIHtcbiAgdmFyIGdldFR5cGUgPSB7fTtcbiAgcmV0dXJuIGZ1bmN0aW9uVG9DaGVjayAmJiBnZXRUeXBlLnRvU3RyaW5nLmNhbGwoZnVuY3Rpb25Ub0NoZWNrKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn07XG5cbmlmICh0eXBlb2YgLy4vICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgSW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihJbnQ4QXJyYXkpKSAhPT0gJ29iamVjdCcgJiYgKF92dWUyLmRlZmF1bHQucHJvdG90eXBlLiRpc1NlcnZlciB8fCB0eXBlb2YgZG9jdW1lbnQuY2hpbGROb2RlcyAhPT0gJ2Z1bmN0aW9uJykpIHtcbiAgZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicgfHwgZmFsc2U7XG4gIH07XG59XG5cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG52YXIgaXNVbmRlZmluZWQgPSBleHBvcnRzLmlzVW5kZWZpbmVkID0gZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsKSB7XG4gIHJldHVybiB2YWwgPT09IHZvaWQgMDtcbn07XG5cbnZhciBpc0RlZmluZWQgPSBleHBvcnRzLmlzRGVmaW5lZCA9IGZ1bmN0aW9uIGlzRGVmaW5lZCh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gbnVsbDtcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///a742\n")},c284:function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 104);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 104:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/progress/src/progress.vue?vue&type=template&id=229ee406&\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 staticClass: \"el-progress\",\n class: [\n \"el-progress--\" + _vm.type,\n _vm.status ? \"is-\" + _vm.status : \"\",\n {\n \"el-progress--without-text\": !_vm.showText,\n \"el-progress--text-inside\": _vm.textInside\n }\n ],\n attrs: {\n role: \"progressbar\",\n \"aria-valuenow\": _vm.percentage,\n \"aria-valuemin\": \"0\",\n \"aria-valuemax\": \"100\"\n }\n },\n [\n _vm.type === \"line\"\n ? _c(\"div\", { staticClass: \"el-progress-bar\" }, [\n _c(\n \"div\",\n {\n staticClass: \"el-progress-bar__outer\",\n style: {\n height: _vm.strokeWidth + \"px\",\n backgroundColor: _vm.defineBackColor\n }\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"el-progress-bar__inner\",\n style: _vm.barStyle\n },\n [\n _vm.showText && _vm.textInside\n ? _c(\n \"div\",\n {\n staticClass: \"el-progress-bar__innerText\",\n style: { color: _vm.textColor }\n },\n [_vm._v(_vm._s(_vm.content))]\n )\n : _vm._e()\n ]\n )\n ]\n )\n ])\n : _c(\n \"div\",\n {\n staticClass: \"el-progress-circle\",\n style: { height: _vm.width + \"px\", width: _vm.width + \"px\" }\n },\n [\n _c(\"svg\", { attrs: { viewBox: \"0 0 100 100\" } }, [\n _c(\"path\", {\n staticClass: \"el-progress-circle__track\",\n style: _vm.trailPathStyle,\n attrs: {\n d: _vm.trackPath,\n stroke: _vm.defineBackColor,\n \"stroke-width\": _vm.relativeStrokeWidth,\n fill: \"none\"\n }\n }),\n _c(\"path\", {\n staticClass: \"el-progress-circle__path\",\n style: _vm.circlePathStyle,\n attrs: {\n d: _vm.trackPath,\n stroke: _vm.stroke,\n fill: \"none\",\n \"stroke-linecap\": _vm.strokeLinecap,\n \"stroke-width\": _vm.percentage ? _vm.relativeStrokeWidth : 0\n }\n })\n ])\n ]\n ),\n _vm.showText && !_vm.textInside\n ? _c(\n \"div\",\n {\n staticClass: \"el-progress__text\",\n style: {\n fontSize: _vm.progressTextSize + \"px\",\n color: _vm.textColor\n }\n },\n [\n !_vm.status\n ? [_vm._v(_vm._s(_vm.content))]\n : _c(\"i\", { class: _vm.iconClass })\n ],\n 2\n )\n : _vm._e()\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/progress/src/progress.vue?vue&type=template&id=229ee406&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/progress/src/progress.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ var progressvue_type_script_lang_js_ = ({\n name: 'ElProgress',\n props: {\n type: {\n type: String,\n default: 'line',\n validator: function validator(val) {\n return ['line', 'circle', 'dashboard'].indexOf(val) > -1;\n }\n },\n percentage: {\n type: Number,\n default: 0,\n required: true,\n validator: function validator(val) {\n return val >= 0 && val <= 100;\n }\n },\n status: {\n type: String,\n validator: function validator(val) {\n return ['success', 'exception', 'warning'].indexOf(val) > -1;\n }\n },\n strokeWidth: {\n type: Number,\n default: 6\n },\n strokeLinecap: {\n type: String,\n default: 'round'\n },\n textInside: {\n type: Boolean,\n default: false\n },\n width: {\n type: Number,\n default: 126\n },\n showText: {\n type: Boolean,\n default: true\n },\n color: {\n type: [String, Array, Function],\n default: ''\n },\n defineBackColor: {\n type: [String, Array, Function],\n default: '#ebeef5'\n },\n textColor: {\n type: [String, Array, Function],\n default: '#606266'\n },\n format: Function\n },\n computed: {\n barStyle: function barStyle() {\n var style = {};\n style.width = this.percentage + '%';\n style.backgroundColor = this.getCurrentColor(this.percentage);\n return style;\n },\n relativeStrokeWidth: function relativeStrokeWidth() {\n return (this.strokeWidth / this.width * 100).toFixed(1);\n },\n radius: function radius() {\n if (this.type === 'circle' || this.type === 'dashboard') {\n return parseInt(50 - parseFloat(this.relativeStrokeWidth) / 2, 10);\n } else {\n return 0;\n }\n },\n trackPath: function trackPath() {\n var radius = this.radius;\n var isDashboard = this.type === 'dashboard';\n return '\\n M 50 50\\n m 0 ' + (isDashboard ? '' : '-') + radius + '\\n a ' + radius + ' ' + radius + ' 0 1 1 0 ' + (isDashboard ? '-' : '') + radius * 2 + '\\n a ' + radius + ' ' + radius + ' 0 1 1 0 ' + (isDashboard ? '' : '-') + radius * 2 + '\\n ';\n },\n perimeter: function perimeter() {\n return 2 * Math.PI * this.radius;\n },\n rate: function rate() {\n return this.type === 'dashboard' ? 0.75 : 1;\n },\n strokeDashoffset: function strokeDashoffset() {\n var offset = -1 * this.perimeter * (1 - this.rate) / 2;\n return offset + 'px';\n },\n trailPathStyle: function trailPathStyle() {\n return {\n strokeDasharray: this.perimeter * this.rate + 'px, ' + this.perimeter + 'px',\n strokeDashoffset: this.strokeDashoffset\n };\n },\n circlePathStyle: function circlePathStyle() {\n return {\n strokeDasharray: this.perimeter * this.rate * (this.percentage / 100) + 'px, ' + this.perimeter + 'px',\n strokeDashoffset: this.strokeDashoffset,\n transition: 'stroke-dasharray 0.6s ease 0s, stroke 0.6s ease'\n };\n },\n stroke: function stroke() {\n var ret = void 0;\n if (this.color) {\n ret = this.getCurrentColor(this.percentage);\n } else {\n switch (this.status) {\n case 'success':\n ret = '#13ce66';\n break;\n case 'exception':\n ret = '#ff4949';\n break;\n case 'warning':\n ret = '#e6a23c';\n break;\n default:\n ret = '#20a0ff';\n }\n }\n return ret;\n },\n iconClass: function iconClass() {\n if (this.status === 'warning') {\n return 'el-icon-warning';\n }\n if (this.type === 'line') {\n return this.status === 'success' ? 'el-icon-circle-check' : 'el-icon-circle-close';\n } else {\n return this.status === 'success' ? 'el-icon-check' : 'el-icon-close';\n }\n },\n progressTextSize: function progressTextSize() {\n return this.type === 'line' ? 12 + this.strokeWidth * 0.4 : this.width * 0.111111 + 2;\n },\n content: function content() {\n if (typeof this.format === 'function') {\n return this.format(this.percentage) || '';\n } else {\n return this.percentage + '%';\n }\n }\n },\n methods: {\n getCurrentColor: function getCurrentColor(percentage) {\n if (typeof this.color === 'function') {\n return this.color(percentage);\n } else if (typeof this.color === 'string') {\n return this.color;\n } else {\n return this.getLevelColor(percentage);\n }\n },\n getLevelColor: function getLevelColor(percentage) {\n var colorArray = this.getColorArray().sort(function (a, b) {\n return a.percentage - b.percentage;\n });\n\n for (var i = 0; i < colorArray.length; i++) {\n if (colorArray[i].percentage > percentage) {\n return colorArray[i].color;\n }\n }\n return colorArray[colorArray.length - 1].color;\n },\n getColorArray: function getColorArray() {\n var color = this.color;\n var span = 100 / color.length;\n return color.map(function (seriesColor, index) {\n if (typeof seriesColor === 'string') {\n return {\n color: seriesColor,\n percentage: (index + 1) * span\n };\n }\n return seriesColor;\n });\n }\n }\n});\n// CONCATENATED MODULE: ./packages/progress/src/progress.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_progressvue_type_script_lang_js_ = (progressvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/progress/src/progress.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n src_progressvue_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 api; }\ncomponent.options.__file = \"packages/progress/src/progress.vue\"\n/* harmony default export */ var progress = (component.exports);\n// CONCATENATED MODULE: ./packages/progress/index.js\n\n\n/* istanbul ignore next */\nprogress.install = function (Vue) {\n Vue.component(progress.name, progress);\n};\n\n/* harmony default export */ var packages_progress = __webpack_exports__[\"default\"] = (progress);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvcHJvZ3Jlc3MuanM/YzI4NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxnQ0FBZ0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLGtCQUFrQjtBQUNsRjtBQUNBLHlEQUF5RCxjQUFjO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGlDQUFpQztBQUNsRix3SEFBd0gsbUJBQW1CLEVBQUU7QUFDN0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDBCQUEwQixFQUFFO0FBQy9ELHlDQUF5QyxlQUFlO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsK0RBQStEO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJGQUEyRiwyQkFBMkIsRUFBRTtBQUN4SDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFCQUFxQixpQ0FBaUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsYUFBYTtBQUNiO0FBQ0EseUJBQXlCLFNBQVMseUJBQXlCLEVBQUU7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsdUJBQXVCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVAscUJBQXFCLHVCQUF1QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDRHO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsWUFBWTtBQUN2QjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87O0FBRVAsVUFBVSIsImZpbGUiOiJjMjg0LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbi8qKioqKiovIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4vKioqKioqLyBcdFx0cmV0dXJuIG5zO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9kaXN0L1wiO1xuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxMDQpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoe1xuXG4vKioqLyAwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gbm9ybWFsaXplQ29tcG9uZW50OyB9KTtcbi8qIGdsb2JhbHMgX19WVUVfU1NSX0NPTlRFWFRfXyAqL1xuXG4vLyBJTVBPUlRBTlQ6IERvIE5PVCB1c2UgRVMyMDE1IGZlYXR1cmVzIGluIHRoaXMgZmlsZSAoZXhjZXB0IGZvciBtb2R1bGVzKS5cbi8vIFRoaXMgbW9kdWxlIGlzIGEgcnVudGltZSB1dGlsaXR5IGZvciBjbGVhbmVyIGNvbXBvbmVudCBtb2R1bGUgb3V0cHV0IGFuZCB3aWxsXG4vLyBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgd2VicGFjayB1c2VyIGJ1bmRsZS5cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50IChcbiAgc2NyaXB0RXhwb3J0cyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZ1bmN0aW9uYWxUZW1wbGF0ZSxcbiAgaW5qZWN0U3R5bGVzLFxuICBzY29wZUlkLFxuICBtb2R1bGVJZGVudGlmaWVyLCAvKiBzZXJ2ZXIgb25seSAqL1xuICBzaGFkb3dNb2RlIC8qIHZ1ZS1jbGkgb25seSAqL1xuKSB7XG4gIC8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3BcbiAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2NyaXB0RXhwb3J0cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2NyaXB0RXhwb3J0cy5vcHRpb25zXG4gICAgOiBzY3JpcHRFeHBvcnRzXG5cbiAgLy8gcmVuZGVyIGZ1bmN0aW9uc1xuICBpZiAocmVuZGVyKSB7XG4gICAgb3B0aW9ucy5yZW5kZXIgPSByZW5kZXJcbiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IHN0YXRpY1JlbmRlckZuc1xuICAgIG9wdGlvbnMuX2NvbXBpbGVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gZnVuY3Rpb25hbCB0ZW1wbGF0ZVxuICBpZiAoZnVuY3Rpb25hbFRlbXBsYXRlKSB7XG4gICAgb3B0aW9ucy5mdW5jdGlvbmFsID0gdHJ1ZVxuICB9XG5cbiAgLy8gc2NvcGVkSWRcbiAgaWYgKHNjb3BlSWQpIHtcbiAgICBvcHRpb25zLl9zY29wZUlkID0gJ2RhdGEtdi0nICsgc2NvcGVJZFxuICB9XG5cbiAgdmFyIGhvb2tcbiAgaWYgKG1vZHVsZUlkZW50aWZpZXIpIHsgLy8gc2VydmVyIGJ1aWxkXG4gICAgaG9vayA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAvLyAyLjMgaW5qZWN0aW9uXG4gICAgICBjb250ZXh0ID1cbiAgICAgICAgY29udGV4dCB8fCAvLyBjYWNoZWQgY2FsbFxuICAgICAgICAodGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dCkgfHwgLy8gc3RhdGVmdWxcbiAgICAgICAgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LiR2bm9kZSAmJiB0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCkgLy8gZnVuY3Rpb25hbFxuICAgICAgLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlXG4gICAgICBpZiAoIWNvbnRleHQgJiYgdHlwZW9mIF9fVlVFX1NTUl9DT05URVhUX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnRleHQgPSBfX1ZVRV9TU1JfQ09OVEVYVF9fXG4gICAgICB9XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHN0eWxlc1xuICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCBjb250ZXh0KVxuICAgICAgfVxuICAgICAgLy8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlXG4gICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykge1xuICAgICAgICBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcilcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGVcbiAgICAvLyBuZXZlciBnZXRzIGNhbGxlZFxuICAgIG9wdGlvbnMuX3NzclJlZ2lzdGVyID0gaG9va1xuICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykge1xuICAgIGhvb2sgPSBzaGFkb3dNb2RlXG4gICAgICA/IGZ1bmN0aW9uICgpIHsgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgdGhpcy4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290KSB9XG4gICAgICA6IGluamVjdFN0eWxlc1xuICB9XG5cbiAgaWYgKGhvb2spIHtcbiAgICBpZiAob3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndFxuICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgbm9ybWFsaXplclxuICAgICAgb3B0aW9ucy5faW5qZWN0U3R5bGVzID0gaG9va1xuICAgICAgLy8gcmVnaXN0ZXIgZm9yIGZ1bmN0aW9hbCBjb21wb25lbnQgaW4gdnVlIGZpbGVcbiAgICAgIHZhciBvcmlnaW5hbFJlbmRlciA9IG9wdGlvbnMucmVuZGVyXG4gICAgICBvcHRpb25zLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcldpdGhTdHlsZUluamVjdGlvbiAoaCwgY29udGV4dCkge1xuICAgICAgICBob29rLmNhbGwoY29udGV4dClcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsIGNvbnRleHQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgcmVnaXN0cmF0aW9uIGFzIGJlZm9yZUNyZWF0ZSBob29rXG4gICAgICB2YXIgZXhpc3RpbmcgPSBvcHRpb25zLmJlZm9yZUNyZWF0ZVxuICAgICAgb3B0aW9ucy5iZWZvcmVDcmVhdGUgPSBleGlzdGluZ1xuICAgICAgICA/IFtdLmNvbmNhdChleGlzdGluZywgaG9vaylcbiAgICAgICAgOiBbaG9va11cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDEwNDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcHJvZ3Jlc3Mvc3JjL3Byb2dyZXNzLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yMjllZTQwNiZcbnZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1wcm9ncmVzc1wiLFxuICAgICAgY2xhc3M6IFtcbiAgICAgICAgXCJlbC1wcm9ncmVzcy0tXCIgKyBfdm0udHlwZSxcbiAgICAgICAgX3ZtLnN0YXR1cyA/IFwiaXMtXCIgKyBfdm0uc3RhdHVzIDogXCJcIixcbiAgICAgICAge1xuICAgICAgICAgIFwiZWwtcHJvZ3Jlc3MtLXdpdGhvdXQtdGV4dFwiOiAhX3ZtLnNob3dUZXh0LFxuICAgICAgICAgIFwiZWwtcHJvZ3Jlc3MtLXRleHQtaW5zaWRlXCI6IF92bS50ZXh0SW5zaWRlXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBhdHRyczoge1xuICAgICAgICByb2xlOiBcInByb2dyZXNzYmFyXCIsXG4gICAgICAgIFwiYXJpYS12YWx1ZW5vd1wiOiBfdm0ucGVyY2VudGFnZSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX3ZtLnR5cGUgPT09IFwibGluZVwiXG4gICAgICAgID8gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1wcm9ncmVzcy1iYXJcIiB9LCBbXG4gICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXByb2dyZXNzLWJhcl9fb3V0ZXJcIixcbiAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBfdm0uc3Ryb2tlV2lkdGggKyBcInB4XCIsXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IF92bS5kZWZpbmVCYWNrQ29sb3JcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXByb2dyZXNzLWJhcl9faW5uZXJcIixcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IF92bS5iYXJTdHlsZVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLnNob3dUZXh0ICYmIF92bS50ZXh0SW5zaWRlXG4gICAgICAgICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXByb2dyZXNzLWJhcl9faW5uZXJUZXh0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsgY29sb3I6IF92bS50ZXh0Q29sb3IgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uY29udGVudCkpXVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIClcbiAgICAgICAgICBdKVxuICAgICAgICA6IF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcHJvZ3Jlc3MtY2lyY2xlXCIsXG4gICAgICAgICAgICAgIHN0eWxlOiB7IGhlaWdodDogX3ZtLndpZHRoICsgXCJweFwiLCB3aWR0aDogX3ZtLndpZHRoICsgXCJweFwiIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFwic3ZnXCIsIHsgYXR0cnM6IHsgdmlld0JveDogXCIwIDAgMTAwIDEwMFwiIH0gfSwgW1xuICAgICAgICAgICAgICAgIF9jKFwicGF0aFwiLCB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1wcm9ncmVzcy1jaXJjbGVfX3RyYWNrXCIsXG4gICAgICAgICAgICAgICAgICBzdHlsZTogX3ZtLnRyYWlsUGF0aFN0eWxlLFxuICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgZDogX3ZtLnRyYWNrUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBfdm0uZGVmaW5lQmFja0NvbG9yLFxuICAgICAgICAgICAgICAgICAgICBcInN0cm9rZS13aWR0aFwiOiBfdm0ucmVsYXRpdmVTdHJva2VXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogXCJub25lXCJcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBfYyhcInBhdGhcIiwge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcHJvZ3Jlc3MtY2lyY2xlX19wYXRoXCIsXG4gICAgICAgICAgICAgICAgICBzdHlsZTogX3ZtLmNpcmNsZVBhdGhTdHlsZSxcbiAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgIGQ6IF92bS50cmFja1BhdGgsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogX3ZtLnN0cm9rZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3Ryb2tlLWxpbmVjYXBcIjogX3ZtLnN0cm9rZUxpbmVjYXAsXG4gICAgICAgICAgICAgICAgICAgIFwic3Ryb2tlLXdpZHRoXCI6IF92bS5wZXJjZW50YWdlID8gX3ZtLnJlbGF0aXZlU3Ryb2tlV2lkdGggOiAwXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApLFxuICAgICAgX3ZtLnNob3dUZXh0ICYmICFfdm0udGV4dEluc2lkZVxuICAgICAgICA/IF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtcHJvZ3Jlc3NfX3RleHRcIixcbiAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogX3ZtLnByb2dyZXNzVGV4dFNpemUgKyBcInB4XCIsXG4gICAgICAgICAgICAgICAgY29sb3I6IF92bS50ZXh0Q29sb3JcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgIV92bS5zdGF0dXNcbiAgICAgICAgICAgICAgICA/IFtfdm0uX3YoX3ZtLl9zKF92bS5jb250ZW50KSldXG4gICAgICAgICAgICAgICAgOiBfYyhcImlcIiwgeyBjbGFzczogX3ZtLmljb25DbGFzcyB9KVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIDogX3ZtLl9lKClcbiAgICBdXG4gIClcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wcm9ncmVzcy9zcmMvcHJvZ3Jlc3MudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTIyOWVlNDA2JlxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9wcm9ncmVzcy9zcmMvcHJvZ3Jlc3MudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcHJvZ3Jlc3N2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxQcm9ncmVzcycsXG4gIHByb3BzOiB7XG4gICAgdHlwZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2xpbmUnLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsKSB7XG4gICAgICAgIHJldHVybiBbJ2xpbmUnLCAnY2lyY2xlJywgJ2Rhc2hib2FyZCddLmluZGV4T2YodmFsKSA+IC0xO1xuICAgICAgfVxuICAgIH0sXG4gICAgcGVyY2VudGFnZToge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMCxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsKSB7XG4gICAgICAgIHJldHVybiB2YWwgPj0gMCAmJiB2YWwgPD0gMTAwO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3RhdHVzOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpIHtcbiAgICAgICAgcmV0dXJuIFsnc3VjY2VzcycsICdleGNlcHRpb24nLCAnd2FybmluZyddLmluZGV4T2YodmFsKSA+IC0xO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3Ryb2tlV2lkdGg6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDZcbiAgICB9LFxuICAgIHN0cm9rZUxpbmVjYXA6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdyb3VuZCdcbiAgICB9LFxuICAgIHRleHRJbnNpZGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgd2lkdGg6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDEyNlxuICAgIH0sXG4gICAgc2hvd1RleHQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjb2xvcjoge1xuICAgICAgdHlwZTogW1N0cmluZywgQXJyYXksIEZ1bmN0aW9uXSxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBkZWZpbmVCYWNrQ29sb3I6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIEFycmF5LCBGdW5jdGlvbl0sXG4gICAgICBkZWZhdWx0OiAnI2ViZWVmNSdcbiAgICB9LFxuICAgIHRleHRDb2xvcjoge1xuICAgICAgdHlwZTogW1N0cmluZywgQXJyYXksIEZ1bmN0aW9uXSxcbiAgICAgIGRlZmF1bHQ6ICcjNjA2MjY2J1xuICAgIH0sXG4gICAgZm9ybWF0OiBGdW5jdGlvblxuICB9LFxuICBjb21wdXRlZDoge1xuICAgIGJhclN0eWxlOiBmdW5jdGlvbiBiYXJTdHlsZSgpIHtcbiAgICAgIHZhciBzdHlsZSA9IHt9O1xuICAgICAgc3R5bGUud2lkdGggPSB0aGlzLnBlcmNlbnRhZ2UgKyAnJSc7XG4gICAgICBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmdldEN1cnJlbnRDb2xvcih0aGlzLnBlcmNlbnRhZ2UpO1xuICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG4gICAgcmVsYXRpdmVTdHJva2VXaWR0aDogZnVuY3Rpb24gcmVsYXRpdmVTdHJva2VXaWR0aCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5zdHJva2VXaWR0aCAvIHRoaXMud2lkdGggKiAxMDApLnRvRml4ZWQoMSk7XG4gICAgfSxcbiAgICByYWRpdXM6IGZ1bmN0aW9uIHJhZGl1cygpIHtcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdjaXJjbGUnIHx8IHRoaXMudHlwZSA9PT0gJ2Rhc2hib2FyZCcpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KDUwIC0gcGFyc2VGbG9hdCh0aGlzLnJlbGF0aXZlU3Ryb2tlV2lkdGgpIC8gMiwgMTApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSxcbiAgICB0cmFja1BhdGg6IGZ1bmN0aW9uIHRyYWNrUGF0aCgpIHtcbiAgICAgIHZhciByYWRpdXMgPSB0aGlzLnJhZGl1cztcbiAgICAgIHZhciBpc0Rhc2hib2FyZCA9IHRoaXMudHlwZSA9PT0gJ2Rhc2hib2FyZCc7XG4gICAgICByZXR1cm4gJ1xcbiAgICAgICAgTSA1MCA1MFxcbiAgICAgICAgbSAwICcgKyAoaXNEYXNoYm9hcmQgPyAnJyA6ICctJykgKyByYWRpdXMgKyAnXFxuICAgICAgICBhICcgKyByYWRpdXMgKyAnICcgKyByYWRpdXMgKyAnIDAgMSAxIDAgJyArIChpc0Rhc2hib2FyZCA/ICctJyA6ICcnKSArIHJhZGl1cyAqIDIgKyAnXFxuICAgICAgICBhICcgKyByYWRpdXMgKyAnICcgKyByYWRpdXMgKyAnIDAgMSAxIDAgJyArIChpc0Rhc2hib2FyZCA/ICcnIDogJy0nKSArIHJhZGl1cyAqIDIgKyAnXFxuICAgICAgICAnO1xuICAgIH0sXG4gICAgcGVyaW1ldGVyOiBmdW5jdGlvbiBwZXJpbWV0ZXIoKSB7XG4gICAgICByZXR1cm4gMiAqIE1hdGguUEkgKiB0aGlzLnJhZGl1cztcbiAgICB9LFxuICAgIHJhdGU6IGZ1bmN0aW9uIHJhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlID09PSAnZGFzaGJvYXJkJyA/IDAuNzUgOiAxO1xuICAgIH0sXG4gICAgc3Ryb2tlRGFzaG9mZnNldDogZnVuY3Rpb24gc3Ryb2tlRGFzaG9mZnNldCgpIHtcbiAgICAgIHZhciBvZmZzZXQgPSAtMSAqIHRoaXMucGVyaW1ldGVyICogKDEgLSB0aGlzLnJhdGUpIC8gMjtcbiAgICAgIHJldHVybiBvZmZzZXQgKyAncHgnO1xuICAgIH0sXG4gICAgdHJhaWxQYXRoU3R5bGU6IGZ1bmN0aW9uIHRyYWlsUGF0aFN0eWxlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3Ryb2tlRGFzaGFycmF5OiB0aGlzLnBlcmltZXRlciAqIHRoaXMucmF0ZSArICdweCwgJyArIHRoaXMucGVyaW1ldGVyICsgJ3B4JyxcbiAgICAgICAgc3Ryb2tlRGFzaG9mZnNldDogdGhpcy5zdHJva2VEYXNob2Zmc2V0XG4gICAgICB9O1xuICAgIH0sXG4gICAgY2lyY2xlUGF0aFN0eWxlOiBmdW5jdGlvbiBjaXJjbGVQYXRoU3R5bGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHJva2VEYXNoYXJyYXk6IHRoaXMucGVyaW1ldGVyICogdGhpcy5yYXRlICogKHRoaXMucGVyY2VudGFnZSAvIDEwMCkgKyAncHgsICcgKyB0aGlzLnBlcmltZXRlciArICdweCcsXG4gICAgICAgIHN0cm9rZURhc2hvZmZzZXQ6IHRoaXMuc3Ryb2tlRGFzaG9mZnNldCxcbiAgICAgICAgdHJhbnNpdGlvbjogJ3N0cm9rZS1kYXNoYXJyYXkgMC42cyBlYXNlIDBzLCBzdHJva2UgMC42cyBlYXNlJ1xuICAgICAgfTtcbiAgICB9LFxuICAgIHN0cm9rZTogZnVuY3Rpb24gc3Ryb2tlKCkge1xuICAgICAgdmFyIHJldCA9IHZvaWQgMDtcbiAgICAgIGlmICh0aGlzLmNvbG9yKSB7XG4gICAgICAgIHJldCA9IHRoaXMuZ2V0Q3VycmVudENvbG9yKHRoaXMucGVyY2VudGFnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc3RhdHVzKSB7XG4gICAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgICAgICByZXQgPSAnIzEzY2U2Nic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdleGNlcHRpb24nOlxuICAgICAgICAgICAgcmV0ID0gJyNmZjQ5NDknO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgICAgICByZXQgPSAnI2U2YTIzYyc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0ID0gJyMyMGEwZmYnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0sXG4gICAgaWNvbkNsYXNzOiBmdW5jdGlvbiBpY29uQ2xhc3MoKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPT09ICd3YXJuaW5nJykge1xuICAgICAgICByZXR1cm4gJ2VsLWljb24td2FybmluZyc7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50eXBlID09PSAnbGluZScpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnZWwtaWNvbi1jaXJjbGUtY2hlY2snIDogJ2VsLWljb24tY2lyY2xlLWNsb3NlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnID8gJ2VsLWljb24tY2hlY2snIDogJ2VsLWljb24tY2xvc2UnO1xuICAgICAgfVxuICAgIH0sXG4gICAgcHJvZ3Jlc3NUZXh0U2l6ZTogZnVuY3Rpb24gcHJvZ3Jlc3NUZXh0U2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdsaW5lJyA/IDEyICsgdGhpcy5zdHJva2VXaWR0aCAqIDAuNCA6IHRoaXMud2lkdGggKiAwLjExMTExMSArIDI7XG4gICAgfSxcbiAgICBjb250ZW50OiBmdW5jdGlvbiBjb250ZW50KCkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQodGhpcy5wZXJjZW50YWdlKSB8fCAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcmNlbnRhZ2UgKyAnJSc7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgZ2V0Q3VycmVudENvbG9yOiBmdW5jdGlvbiBnZXRDdXJyZW50Q29sb3IocGVyY2VudGFnZSkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9yKHBlcmNlbnRhZ2UpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5jb2xvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMZXZlbENvbG9yKHBlcmNlbnRhZ2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0TGV2ZWxDb2xvcjogZnVuY3Rpb24gZ2V0TGV2ZWxDb2xvcihwZXJjZW50YWdlKSB7XG4gICAgICB2YXIgY29sb3JBcnJheSA9IHRoaXMuZ2V0Q29sb3JBcnJheSgpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEucGVyY2VudGFnZSAtIGIucGVyY2VudGFnZTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbG9yQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNvbG9yQXJyYXlbaV0ucGVyY2VudGFnZSA+IHBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICByZXR1cm4gY29sb3JBcnJheVtpXS5jb2xvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbG9yQXJyYXlbY29sb3JBcnJheS5sZW5ndGggLSAxXS5jb2xvcjtcbiAgICB9LFxuICAgIGdldENvbG9yQXJyYXk6IGZ1bmN0aW9uIGdldENvbG9yQXJyYXkoKSB7XG4gICAgICB2YXIgY29sb3IgPSB0aGlzLmNvbG9yO1xuICAgICAgdmFyIHNwYW4gPSAxMDAgLyBjb2xvci5sZW5ndGg7XG4gICAgICByZXR1cm4gY29sb3IubWFwKGZ1bmN0aW9uIChzZXJpZXNDb2xvciwgaW5kZXgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXJpZXNDb2xvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29sb3I6IHNlcmllc0NvbG9yLFxuICAgICAgICAgICAgcGVyY2VudGFnZTogKGluZGV4ICsgMSkgKiBzcGFuXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWVzQ29sb3I7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wcm9ncmVzcy9zcmMvcHJvZ3Jlc3MudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19wcm9ncmVzc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChwcm9ncmVzc3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbnZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9wcm9ncmVzcy9zcmMvcHJvZ3Jlc3MudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gT2JqZWN0KGNvbXBvbmVudE5vcm1hbGl6ZXJbXCJhXCIgLyogZGVmYXVsdCAqL10pKFxuICBzcmNfcHJvZ3Jlc3N2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhcGk7IH1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvcHJvZ3Jlc3Mvc3JjL3Byb2dyZXNzLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwcm9ncmVzcyA9IChjb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Byb2dyZXNzL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnByb2dyZXNzLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQocHJvZ3Jlc3MubmFtZSwgcHJvZ3Jlc3MpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfcHJvZ3Jlc3MgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChwcm9ncmVzcyk7XG5cbi8qKiovIH0pXG5cbi8qKioqKiovIH0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///c284\n")},c56a:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nexports.default = function (instance, callback) {\n var speed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 300;\n var once = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n if (!instance || !callback) throw new Error('instance & callback is required');\n var called = false;\n var afterLeaveCallback = function afterLeaveCallback() {\n if (called) return;\n called = true;\n if (callback) {\n callback.apply(null, arguments);\n }\n };\n if (once) {\n instance.$once('after-leave', afterLeaveCallback);\n } else {\n instance.$on('after-leave', afterLeaveCallback);\n }\n setTimeout(function () {\n afterLeaveCallback();\n }, speed + 100);\n};\n\n; /**\n * Bind after-leave event for vue instance. Make sure after-leave is called in any browsers.\n *\n * @param {Vue} instance Vue instance.\n * @param {Function} callback callback of after-leave event\n * @param {Number} speed the speed of transition, default value is 300ms\n * @param {Boolean} once weather bind after-leave once. default value is false.\n */\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvYWZ0ZXItbGVhdmUuanM/YzU2YSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLGFBQWEsSUFBSTtBQUNqQixhQUFhLFNBQVM7QUFDdEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQiIsImZpbGUiOiJjNTZhLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIGNhbGxiYWNrKSB7XG4gIHZhciBzcGVlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMzAwO1xuICB2YXIgb25jZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG5cbiAgaWYgKCFpbnN0YW5jZSB8fCAhY2FsbGJhY2spIHRocm93IG5ldyBFcnJvcignaW5zdGFuY2UgJiBjYWxsYmFjayBpcyByZXF1aXJlZCcpO1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHZhciBhZnRlckxlYXZlQ2FsbGJhY2sgPSBmdW5jdGlvbiBhZnRlckxlYXZlQ2FsbGJhY2soKSB7XG4gICAgaWYgKGNhbGxlZCkgcmV0dXJuO1xuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfTtcbiAgaWYgKG9uY2UpIHtcbiAgICBpbnN0YW5jZS4kb25jZSgnYWZ0ZXItbGVhdmUnLCBhZnRlckxlYXZlQ2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIGluc3RhbmNlLiRvbignYWZ0ZXItbGVhdmUnLCBhZnRlckxlYXZlQ2FsbGJhY2spO1xuICB9XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyTGVhdmVDYWxsYmFjaygpO1xuICB9LCBzcGVlZCArIDEwMCk7XG59O1xuXG47IC8qKlxuICAgKiBCaW5kIGFmdGVyLWxlYXZlIGV2ZW50IGZvciB2dWUgaW5zdGFuY2UuIE1ha2Ugc3VyZSBhZnRlci1sZWF2ZSBpcyBjYWxsZWQgaW4gYW55IGJyb3dzZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge1Z1ZX0gaW5zdGFuY2UgVnVlIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjayBvZiBhZnRlci1sZWF2ZSBldmVudFxuICAgKiBAcGFyYW0ge051bWJlcn0gc3BlZWQgdGhlIHNwZWVkIG9mIHRyYW5zaXRpb24sIGRlZmF1bHQgdmFsdWUgaXMgMzAwbXNcbiAgICogQHBhcmFtIHtCb29sZWFufSBvbmNlIHdlYXRoZXIgYmluZCBhZnRlci1sZWF2ZSBvbmNlLiBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLlxuICAgKi8iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///c56a\n")},d010:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nfunction _broadcast(componentName, eventName, params) {\n this.$children.forEach(function (child) {\n var name = child.$options.componentName;\n\n if (name === componentName) {\n child.$emit.apply(child, [eventName].concat(params));\n } else {\n _broadcast.apply(child, [componentName, eventName].concat([params]));\n }\n });\n}\nexports.default = {\n methods: {\n dispatch: function dispatch(componentName, eventName, params) {\n var parent = this.$parent || this.$root;\n var name = parent.$options.componentName;\n\n while (parent && (!name || name !== componentName)) {\n parent = parent.$parent;\n\n if (parent) {\n name = parent.$options.componentName;\n }\n }\n if (parent) {\n parent.$emit.apply(parent, [eventName].concat(params));\n }\n },\n broadcast: function broadcast(componentName, eventName, params) {\n _broadcast.call(this, componentName, eventName, params);\n }\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvbWl4aW5zL2VtaXR0ZXIuanM/ZDAxMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJkMDEwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5mdW5jdGlvbiBfYnJvYWRjYXN0KGNvbXBvbmVudE5hbWUsIGV2ZW50TmFtZSwgcGFyYW1zKSB7XG4gIHRoaXMuJGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgdmFyIG5hbWUgPSBjaGlsZC4kb3B0aW9ucy5jb21wb25lbnROYW1lO1xuXG4gICAgaWYgKG5hbWUgPT09IGNvbXBvbmVudE5hbWUpIHtcbiAgICAgIGNoaWxkLiRlbWl0LmFwcGx5KGNoaWxkLCBbZXZlbnROYW1lXS5jb25jYXQocGFyYW1zKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9icm9hZGNhc3QuYXBwbHkoY2hpbGQsIFtjb21wb25lbnROYW1lLCBldmVudE5hbWVdLmNvbmNhdChbcGFyYW1zXSkpO1xuICAgIH1cbiAgfSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIG1ldGhvZHM6IHtcbiAgICBkaXNwYXRjaDogZnVuY3Rpb24gZGlzcGF0Y2goY29tcG9uZW50TmFtZSwgZXZlbnROYW1lLCBwYXJhbXMpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQgfHwgdGhpcy4kcm9vdDtcbiAgICAgIHZhciBuYW1lID0gcGFyZW50LiRvcHRpb25zLmNvbXBvbmVudE5hbWU7XG5cbiAgICAgIHdoaWxlIChwYXJlbnQgJiYgKCFuYW1lIHx8IG5hbWUgIT09IGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuXG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICBuYW1lID0gcGFyZW50LiRvcHRpb25zLmNvbXBvbmVudE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcGFyZW50LiRlbWl0LmFwcGx5KHBhcmVudCwgW2V2ZW50TmFtZV0uY29uY2F0KHBhcmFtcykpO1xuICAgICAgfVxuICAgIH0sXG4gICAgYnJvYWRjYXN0OiBmdW5jdGlvbiBicm9hZGNhc3QoY29tcG9uZW50TmFtZSwgZXZlbnROYW1lLCBwYXJhbXMpIHtcbiAgICAgIF9icm9hZGNhc3QuY2FsbCh0aGlzLCBjb21wb25lbnROYW1lLCBldmVudE5hbWUsIHBhcmFtcyk7XG4gICAgfVxuICB9XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///d010\n")},d397:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.isDef = isDef;\nexports.isKorean = isKorean;\nfunction isDef(val) {\n return val !== undefined && val !== null;\n}\nfunction isKorean(text) {\n var reg = /([(\\uAC00-\\uD7AF)|(\\u3130-\\u318F)])+/gi;\n return reg.test(text);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvc2hhcmVkLmpzP2QzOTciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZDM5Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5pc0RlZiA9IGlzRGVmO1xuZXhwb3J0cy5pc0tvcmVhbiA9IGlzS29yZWFuO1xuZnVuY3Rpb24gaXNEZWYodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IG51bGw7XG59XG5mdW5jdGlvbiBpc0tvcmVhbih0ZXh0KSB7XG4gIHZhciByZWcgPSAvKFsoXFx1QUMwMC1cXHVEN0FGKXwoXFx1MzEzMC1cXHUzMThGKV0pKy9naTtcbiAgcmV0dXJuIHJlZy50ZXN0KHRleHQpO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///d397\n")},d7d1:function(module,exports,__webpack_require__){"use strict";eval("var __WEBPACK_AMD_DEFINE_RESULT__;\n\n/* Modified from https://github.com/taylorhakes/fecha\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 Taylor Hakes\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/*eslint-disable*/\n// 把 YYYY-MM-DD 改成了 yyyy-MM-dd\n(function (main) {\n 'use strict';\n\n /**\n * Parse or format dates\n * @class fecha\n */\n\n var fecha = {};\n var token = /d{1,4}|M{1,4}|yy(?:yy)?|S{1,3}|Do|ZZ|([HhMsDm])\\1?|[aA]|\"[^\"]*\"|'[^']*'/g;\n var twoDigits = '\\\\d\\\\d?';\n var threeDigits = '\\\\d{3}';\n var fourDigits = '\\\\d{4}';\n var word = '[^\\\\s]+';\n var literal = /\\[([^]*?)\\]/gm;\n var noop = function noop() {};\n\n function regexEscape(str) {\n return str.replace(/[|\\\\{()[^$+*?.-]/g, '\\\\$&');\n }\n\n function shorten(arr, sLen) {\n var newArr = [];\n for (var i = 0, len = arr.length; i < len; i++) {\n newArr.push(arr[i].substr(0, sLen));\n }\n return newArr;\n }\n\n function monthUpdate(arrName) {\n return function (d, v, i18n) {\n var index = i18n[arrName].indexOf(v.charAt(0).toUpperCase() + v.substr(1).toLowerCase());\n if (~index) {\n d.month = index;\n }\n };\n }\n\n function pad(val, len) {\n val = String(val);\n len = len || 2;\n while (val.length < len) {\n val = '0' + val;\n }\n return val;\n }\n\n var dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n var monthNamesShort = shorten(monthNames, 3);\n var dayNamesShort = shorten(dayNames, 3);\n fecha.i18n = {\n dayNamesShort: dayNamesShort,\n dayNames: dayNames,\n monthNamesShort: monthNamesShort,\n monthNames: monthNames,\n amPm: ['am', 'pm'],\n DoFn: function DoFn(D) {\n return D + ['th', 'st', 'nd', 'rd'][D % 10 > 3 ? 0 : (D - D % 10 !== 10) * D % 10];\n }\n };\n\n var formatFlags = {\n D: function D(dateObj) {\n return dateObj.getDay();\n },\n DD: function DD(dateObj) {\n return pad(dateObj.getDay());\n },\n Do: function Do(dateObj, i18n) {\n return i18n.DoFn(dateObj.getDate());\n },\n d: function d(dateObj) {\n return dateObj.getDate();\n },\n dd: function dd(dateObj) {\n return pad(dateObj.getDate());\n },\n ddd: function ddd(dateObj, i18n) {\n return i18n.dayNamesShort[dateObj.getDay()];\n },\n dddd: function dddd(dateObj, i18n) {\n return i18n.dayNames[dateObj.getDay()];\n },\n M: function M(dateObj) {\n return dateObj.getMonth() + 1;\n },\n MM: function MM(dateObj) {\n return pad(dateObj.getMonth() + 1);\n },\n MMM: function MMM(dateObj, i18n) {\n return i18n.monthNamesShort[dateObj.getMonth()];\n },\n MMMM: function MMMM(dateObj, i18n) {\n return i18n.monthNames[dateObj.getMonth()];\n },\n yy: function yy(dateObj) {\n return pad(String(dateObj.getFullYear()), 4).substr(2);\n },\n yyyy: function yyyy(dateObj) {\n return pad(dateObj.getFullYear(), 4);\n },\n h: function h(dateObj) {\n return dateObj.getHours() % 12 || 12;\n },\n hh: function hh(dateObj) {\n return pad(dateObj.getHours() % 12 || 12);\n },\n H: function H(dateObj) {\n return dateObj.getHours();\n },\n HH: function HH(dateObj) {\n return pad(dateObj.getHours());\n },\n m: function m(dateObj) {\n return dateObj.getMinutes();\n },\n mm: function mm(dateObj) {\n return pad(dateObj.getMinutes());\n },\n s: function s(dateObj) {\n return dateObj.getSeconds();\n },\n ss: function ss(dateObj) {\n return pad(dateObj.getSeconds());\n },\n S: function S(dateObj) {\n return Math.round(dateObj.getMilliseconds() / 100);\n },\n SS: function SS(dateObj) {\n return pad(Math.round(dateObj.getMilliseconds() / 10), 2);\n },\n SSS: function SSS(dateObj) {\n return pad(dateObj.getMilliseconds(), 3);\n },\n a: function a(dateObj, i18n) {\n return dateObj.getHours() < 12 ? i18n.amPm[0] : i18n.amPm[1];\n },\n A: function A(dateObj, i18n) {\n return dateObj.getHours() < 12 ? i18n.amPm[0].toUpperCase() : i18n.amPm[1].toUpperCase();\n },\n ZZ: function ZZ(dateObj) {\n var o = dateObj.getTimezoneOffset();\n return (o > 0 ? '-' : '+') + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4);\n }\n };\n\n var parseFlags = {\n d: [twoDigits, function (d, v) {\n d.day = v;\n }],\n Do: [twoDigits + word, function (d, v) {\n d.day = parseInt(v, 10);\n }],\n M: [twoDigits, function (d, v) {\n d.month = v - 1;\n }],\n yy: [twoDigits, function (d, v) {\n var da = new Date(),\n cent = +('' + da.getFullYear()).substr(0, 2);\n d.year = '' + (v > 68 ? cent - 1 : cent) + v;\n }],\n h: [twoDigits, function (d, v) {\n d.hour = v;\n }],\n m: [twoDigits, function (d, v) {\n d.minute = v;\n }],\n s: [twoDigits, function (d, v) {\n d.second = v;\n }],\n yyyy: [fourDigits, function (d, v) {\n d.year = v;\n }],\n S: ['\\\\d', function (d, v) {\n d.millisecond = v * 100;\n }],\n SS: ['\\\\d{2}', function (d, v) {\n d.millisecond = v * 10;\n }],\n SSS: [threeDigits, function (d, v) {\n d.millisecond = v;\n }],\n D: [twoDigits, noop],\n ddd: [word, noop],\n MMM: [word, monthUpdate('monthNamesShort')],\n MMMM: [word, monthUpdate('monthNames')],\n a: [word, function (d, v, i18n) {\n var val = v.toLowerCase();\n if (val === i18n.amPm[0]) {\n d.isPm = false;\n } else if (val === i18n.amPm[1]) {\n d.isPm = true;\n }\n }],\n ZZ: ['[^\\\\s]*?[\\\\+\\\\-]\\\\d\\\\d:?\\\\d\\\\d|[^\\\\s]*?Z', function (d, v) {\n var parts = (v + '').match(/([+-]|\\d\\d)/gi),\n minutes;\n\n if (parts) {\n minutes = +(parts[1] * 60) + parseInt(parts[2], 10);\n d.timezoneOffset = parts[0] === '+' ? minutes : -minutes;\n }\n }]\n };\n parseFlags.dd = parseFlags.d;\n parseFlags.dddd = parseFlags.ddd;\n parseFlags.DD = parseFlags.D;\n parseFlags.mm = parseFlags.m;\n parseFlags.hh = parseFlags.H = parseFlags.HH = parseFlags.h;\n parseFlags.MM = parseFlags.M;\n parseFlags.ss = parseFlags.s;\n parseFlags.A = parseFlags.a;\n\n // Some common format strings\n fecha.masks = {\n default: 'ddd MMM dd yyyy HH:mm:ss',\n shortDate: 'M/D/yy',\n mediumDate: 'MMM d, yyyy',\n longDate: 'MMMM d, yyyy',\n fullDate: 'dddd, MMMM d, yyyy',\n shortTime: 'HH:mm',\n mediumTime: 'HH:mm:ss',\n longTime: 'HH:mm:ss.SSS'\n };\n\n /***\n * Format a date\n * @method format\n * @param {Date|number} dateObj\n * @param {string} mask Format of the date, i.e. 'mm-dd-yy' or 'shortDate'\n */\n fecha.format = function (dateObj, mask, i18nSettings) {\n var i18n = i18nSettings || fecha.i18n;\n\n if (typeof dateObj === 'number') {\n dateObj = new Date(dateObj);\n }\n\n if (Object.prototype.toString.call(dateObj) !== '[object Date]' || isNaN(dateObj.getTime())) {\n throw new Error('Invalid Date in fecha.format');\n }\n\n mask = fecha.masks[mask] || mask || fecha.masks['default'];\n\n var literals = [];\n\n // Make literals inactive by replacing them with ??\n mask = mask.replace(literal, function ($0, $1) {\n literals.push($1);\n return '@@@';\n });\n // Apply formatting rules\n mask = mask.replace(token, function ($0) {\n return $0 in formatFlags ? formatFlags[$0](dateObj, i18n) : $0.slice(1, $0.length - 1);\n });\n // Inline literal values back into the formatted value\n return mask.replace(/@@@/g, function () {\n return literals.shift();\n });\n };\n\n /**\n * Parse a date string into an object, changes - into /\n * @method parse\n * @param {string} dateStr Date string\n * @param {string} format Date parse format\n * @returns {Date|boolean}\n */\n fecha.parse = function (dateStr, format, i18nSettings) {\n var i18n = i18nSettings || fecha.i18n;\n\n if (typeof format !== 'string') {\n throw new Error('Invalid format in fecha.parse');\n }\n\n format = fecha.masks[format] || format;\n\n // Avoid regular expression denial of service, fail early for really long strings\n // https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS\n if (dateStr.length > 1000) {\n return null;\n }\n\n var dateInfo = {};\n var parseInfo = [];\n var literals = [];\n format = format.replace(literal, function ($0, $1) {\n literals.push($1);\n return '@@@';\n });\n var newFormat = regexEscape(format).replace(token, function ($0) {\n if (parseFlags[$0]) {\n var info = parseFlags[$0];\n parseInfo.push(info[1]);\n return '(' + info[0] + ')';\n }\n\n return $0;\n });\n newFormat = newFormat.replace(/@@@/g, function () {\n return literals.shift();\n });\n var matches = dateStr.match(new RegExp(newFormat, 'i'));\n if (!matches) {\n return null;\n }\n\n for (var i = 1; i < matches.length; i++) {\n parseInfo[i - 1](dateInfo, matches[i], i18n);\n }\n\n var today = new Date();\n if (dateInfo.isPm === true && dateInfo.hour != null && +dateInfo.hour !== 12) {\n dateInfo.hour = +dateInfo.hour + 12;\n } else if (dateInfo.isPm === false && +dateInfo.hour === 12) {\n dateInfo.hour = 0;\n }\n\n var date;\n if (dateInfo.timezoneOffset != null) {\n dateInfo.minute = +(dateInfo.minute || 0) - +dateInfo.timezoneOffset;\n date = new Date(Date.UTC(dateInfo.year || today.getFullYear(), dateInfo.month || 0, dateInfo.day || 1, dateInfo.hour || 0, dateInfo.minute || 0, dateInfo.second || 0, dateInfo.millisecond || 0));\n } else {\n date = new Date(dateInfo.year || today.getFullYear(), dateInfo.month || 0, dateInfo.day || 1, dateInfo.hour || 0, dateInfo.minute || 0, dateInfo.second || 0, dateInfo.millisecond || 0);\n }\n return date;\n };\n\n /* istanbul ignore next */\n if ( true && module.exports) {\n module.exports = fecha;\n } else if (true) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n return fecha;\n }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n})(undefined);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvZGF0ZS5qcz9kN2QxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtDQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixJQUFJLEdBQUcsSUFBSSxhQUFhLElBQUk7QUFDN0M7QUFDQSx5QkFBeUIsRUFBRTtBQUMzQix3QkFBd0IsRUFBRTtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBLHFDQUFxQyxTQUFTO0FBQzlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsY0FBYyxFQUFFO0FBQ2hCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsb0JBQW9CO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLEtBQTZCO0FBQ25DO0FBQ0EsR0FBRyxVQUFVLElBQTBDO0FBQ3ZELElBQUksbUNBQU87QUFDWDtBQUNBLEtBQUs7QUFBQSxvR0FBQztBQUNOLEdBQUcsTUFBTSxFQUVOO0FBQ0gsQ0FBQyIsImZpbGUiOiJkN2QxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKiBNb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS90YXlsb3JoYWtlcy9mZWNoYVxuICpcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUYXlsb3IgSGFrZXNcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiAgICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiAgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogICAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG4vKmVzbGludC1kaXNhYmxlKi9cbi8vIOaKiiBZWVlZLU1NLUREIOaUueaIkOS6hiB5eXl5LU1NLWRkXG4oZnVuY3Rpb24gKG1haW4pIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiBQYXJzZSBvciBmb3JtYXQgZGF0ZXNcbiAgICogQGNsYXNzIGZlY2hhXG4gICAqL1xuXG4gIHZhciBmZWNoYSA9IHt9O1xuICB2YXIgdG9rZW4gPSAvZHsxLDR9fE17MSw0fXx5eSg/Onl5KT98U3sxLDN9fERvfFpafChbSGhNc0RtXSlcXDE/fFthQV18XCJbXlwiXSpcInwnW14nXSonL2c7XG4gIHZhciB0d29EaWdpdHMgPSAnXFxcXGRcXFxcZD8nO1xuICB2YXIgdGhyZWVEaWdpdHMgPSAnXFxcXGR7M30nO1xuICB2YXIgZm91ckRpZ2l0cyA9ICdcXFxcZHs0fSc7XG4gIHZhciB3b3JkID0gJ1teXFxcXHNdKyc7XG4gIHZhciBsaXRlcmFsID0gL1xcWyhbXl0qPylcXF0vZ207XG4gIHZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG4gIGZ1bmN0aW9uIHJlZ2V4RXNjYXBlKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvW3xcXFxceygpW14kKyo/Li1dL2csICdcXFxcJCYnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3J0ZW4oYXJyLCBzTGVuKSB7XG4gICAgdmFyIG5ld0FyciA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIG5ld0Fyci5wdXNoKGFycltpXS5zdWJzdHIoMCwgc0xlbikpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3QXJyO1xuICB9XG5cbiAgZnVuY3Rpb24gbW9udGhVcGRhdGUoYXJyTmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgdiwgaTE4bikge1xuICAgICAgdmFyIGluZGV4ID0gaTE4blthcnJOYW1lXS5pbmRleE9mKHYuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2LnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGlmICh+aW5kZXgpIHtcbiAgICAgICAgZC5tb250aCA9IGluZGV4O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBwYWQodmFsLCBsZW4pIHtcbiAgICB2YWwgPSBTdHJpbmcodmFsKTtcbiAgICBsZW4gPSBsZW4gfHwgMjtcbiAgICB3aGlsZSAodmFsLmxlbmd0aCA8IGxlbikge1xuICAgICAgdmFsID0gJzAnICsgdmFsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgdmFyIGRheU5hbWVzID0gWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddO1xuICB2YXIgbW9udGhOYW1lcyA9IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddO1xuICB2YXIgbW9udGhOYW1lc1Nob3J0ID0gc2hvcnRlbihtb250aE5hbWVzLCAzKTtcbiAgdmFyIGRheU5hbWVzU2hvcnQgPSBzaG9ydGVuKGRheU5hbWVzLCAzKTtcbiAgZmVjaGEuaTE4biA9IHtcbiAgICBkYXlOYW1lc1Nob3J0OiBkYXlOYW1lc1Nob3J0LFxuICAgIGRheU5hbWVzOiBkYXlOYW1lcyxcbiAgICBtb250aE5hbWVzU2hvcnQ6IG1vbnRoTmFtZXNTaG9ydCxcbiAgICBtb250aE5hbWVzOiBtb250aE5hbWVzLFxuICAgIGFtUG06IFsnYW0nLCAncG0nXSxcbiAgICBEb0ZuOiBmdW5jdGlvbiBEb0ZuKEQpIHtcbiAgICAgIHJldHVybiBEICsgWyd0aCcsICdzdCcsICduZCcsICdyZCddW0QgJSAxMCA+IDMgPyAwIDogKEQgLSBEICUgMTAgIT09IDEwKSAqIEQgJSAxMF07XG4gICAgfVxuICB9O1xuXG4gIHZhciBmb3JtYXRGbGFncyA9IHtcbiAgICBEOiBmdW5jdGlvbiBEKGRhdGVPYmopIHtcbiAgICAgIHJldHVybiBkYXRlT2JqLmdldERheSgpO1xuICAgIH0sXG4gICAgREQ6IGZ1bmN0aW9uIEREKGRhdGVPYmopIHtcbiAgICAgIHJldHVybiBwYWQoZGF0ZU9iai5nZXREYXkoKSk7XG4gICAgfSxcbiAgICBEbzogZnVuY3Rpb24gRG8oZGF0ZU9iaiwgaTE4bikge1xuICAgICAgcmV0dXJuIGkxOG4uRG9GbihkYXRlT2JqLmdldERhdGUoKSk7XG4gICAgfSxcbiAgICBkOiBmdW5jdGlvbiBkKGRhdGVPYmopIHtcbiAgICAgIHJldHVybiBkYXRlT2JqLmdldERhdGUoKTtcbiAgICB9LFxuICAgIGRkOiBmdW5jdGlvbiBkZChkYXRlT2JqKSB7XG4gICAgICByZXR1cm4gcGFkKGRhdGVPYmouZ2V0RGF0ZSgpKTtcbiAgICB9LFxuICAgIGRkZDogZnVuY3Rpb24gZGRkKGRhdGVPYmosIGkxOG4pIHtcbiAgICAgIHJldHVybiBpMThuLmRheU5hbWVzU2hvcnRbZGF0ZU9iai5nZXREYXkoKV07XG4gICAgfSxcbiAgICBkZGRkOiBmdW5jdGlvbiBkZGRkKGRhdGVPYmosIGkxOG4pIHtcbiAgICAgIHJldHVybiBpMThuLmRheU5hbWVzW2RhdGVPYmouZ2V0RGF5KCldO1xuICAgIH0sXG4gICAgTTogZnVuY3Rpb24gTShkYXRlT2JqKSB7XG4gICAgICByZXR1cm4gZGF0ZU9iai5nZXRNb250aCgpICsgMTtcbiAgICB9LFxuICAgIE1NOiBmdW5jdGlvbiBNTShkYXRlT2JqKSB7XG4gICAgICByZXR1cm4gcGFkKGRhdGVPYmouZ2V0TW9udGgoKSArIDEpO1xuICAgIH0sXG4gICAgTU1NOiBmdW5jdGlvbiBNTU0oZGF0ZU9iaiwgaTE4bikge1xuICAgICAgcmV0dXJuIGkxOG4ubW9udGhOYW1lc1Nob3J0W2RhdGVPYmouZ2V0TW9udGgoKV07XG4gICAgfSxcbiAgICBNTU1NOiBmdW5jdGlvbiBNTU1NKGRhdGVPYmosIGkxOG4pIHtcbiAgICAgIHJldHVybiBpMThuLm1vbnRoTmFtZXNbZGF0ZU9iai5nZXRNb250aCgpXTtcbiAgICB9LFxuICAgIHl5OiBmdW5jdGlvbiB5eShkYXRlT2JqKSB7XG4gICAgICByZXR1cm4gcGFkKFN0cmluZyhkYXRlT2JqLmdldEZ1bGxZZWFyKCkpLCA0KS5zdWJzdHIoMik7XG4gICAgfSxcbiAgICB5eXl5OiBmdW5jdGlvbiB5eXl5KGRhdGVPYmopIHtcbiAgICAgIHJldHVybiBwYWQoZGF0ZU9iai5nZXRGdWxsWWVhcigpLCA0KTtcbiAgICB9LFxuICAgIGg6IGZ1bmN0aW9uIGgoZGF0ZU9iaikge1xuICAgICAgcmV0dXJuIGRhdGVPYmouZ2V0SG91cnMoKSAlIDEyIHx8IDEyO1xuICAgIH0sXG4gICAgaGg6IGZ1bmN0aW9uIGhoKGRhdGVPYmopIHtcbiAgICAgIHJldHVybiBwYWQoZGF0ZU9iai5nZXRIb3VycygpICUgMTIgfHwgMTIpO1xuICAgIH0sXG4gICAgSDogZnVuY3Rpb24gSChkYXRlT2JqKSB7XG4gICAgICByZXR1cm4gZGF0ZU9iai5nZXRIb3VycygpO1xuICAgIH0sXG4gICAgSEg6IGZ1bmN0aW9uIEhIKGRhdGVPYmopIHtcbiAgICAgIHJldHVybiBwYWQoZGF0ZU9iai5nZXRIb3VycygpKTtcbiAgICB9LFxuICAgIG06IGZ1bmN0aW9uIG0oZGF0ZU9iaikge1xuICAgICAgcmV0dXJuIGRhdGVPYmouZ2V0TWludXRlcygpO1xuICAgIH0sXG4gICAgbW06IGZ1bmN0aW9uIG1tKGRhdGVPYmopIHtcbiAgICAgIHJldHVybiBwYWQoZGF0ZU9iai5nZXRNaW51dGVzKCkpO1xuICAgIH0sXG4gICAgczogZnVuY3Rpb24gcyhkYXRlT2JqKSB7XG4gICAgICByZXR1cm4gZGF0ZU9iai5nZXRTZWNvbmRzKCk7XG4gICAgfSxcbiAgICBzczogZnVuY3Rpb24gc3MoZGF0ZU9iaikge1xuICAgICAgcmV0dXJuIHBhZChkYXRlT2JqLmdldFNlY29uZHMoKSk7XG4gICAgfSxcbiAgICBTOiBmdW5jdGlvbiBTKGRhdGVPYmopIHtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKGRhdGVPYmouZ2V0TWlsbGlzZWNvbmRzKCkgLyAxMDApO1xuICAgIH0sXG4gICAgU1M6IGZ1bmN0aW9uIFNTKGRhdGVPYmopIHtcbiAgICAgIHJldHVybiBwYWQoTWF0aC5yb3VuZChkYXRlT2JqLmdldE1pbGxpc2Vjb25kcygpIC8gMTApLCAyKTtcbiAgICB9LFxuICAgIFNTUzogZnVuY3Rpb24gU1NTKGRhdGVPYmopIHtcbiAgICAgIHJldHVybiBwYWQoZGF0ZU9iai5nZXRNaWxsaXNlY29uZHMoKSwgMyk7XG4gICAgfSxcbiAgICBhOiBmdW5jdGlvbiBhKGRhdGVPYmosIGkxOG4pIHtcbiAgICAgIHJldHVybiBkYXRlT2JqLmdldEhvdXJzKCkgPCAxMiA/IGkxOG4uYW1QbVswXSA6IGkxOG4uYW1QbVsxXTtcbiAgICB9LFxuICAgIEE6IGZ1bmN0aW9uIEEoZGF0ZU9iaiwgaTE4bikge1xuICAgICAgcmV0dXJuIGRhdGVPYmouZ2V0SG91cnMoKSA8IDEyID8gaTE4bi5hbVBtWzBdLnRvVXBwZXJDYXNlKCkgOiBpMThuLmFtUG1bMV0udG9VcHBlckNhc2UoKTtcbiAgICB9LFxuICAgIFpaOiBmdW5jdGlvbiBaWihkYXRlT2JqKSB7XG4gICAgICB2YXIgbyA9IGRhdGVPYmouZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgIHJldHVybiAobyA+IDAgPyAnLScgOiAnKycpICsgcGFkKE1hdGguZmxvb3IoTWF0aC5hYnMobykgLyA2MCkgKiAxMDAgKyBNYXRoLmFicyhvKSAlIDYwLCA0KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBhcnNlRmxhZ3MgPSB7XG4gICAgZDogW3R3b0RpZ2l0cywgZnVuY3Rpb24gKGQsIHYpIHtcbiAgICAgIGQuZGF5ID0gdjtcbiAgICB9XSxcbiAgICBEbzogW3R3b0RpZ2l0cyArIHdvcmQsIGZ1bmN0aW9uIChkLCB2KSB7XG4gICAgICBkLmRheSA9IHBhcnNlSW50KHYsIDEwKTtcbiAgICB9XSxcbiAgICBNOiBbdHdvRGlnaXRzLCBmdW5jdGlvbiAoZCwgdikge1xuICAgICAgZC5tb250aCA9IHYgLSAxO1xuICAgIH1dLFxuICAgIHl5OiBbdHdvRGlnaXRzLCBmdW5jdGlvbiAoZCwgdikge1xuICAgICAgdmFyIGRhID0gbmV3IERhdGUoKSxcbiAgICAgICAgICBjZW50ID0gKygnJyArIGRhLmdldEZ1bGxZZWFyKCkpLnN1YnN0cigwLCAyKTtcbiAgICAgIGQueWVhciA9ICcnICsgKHYgPiA2OCA/IGNlbnQgLSAxIDogY2VudCkgKyB2O1xuICAgIH1dLFxuICAgIGg6IFt0d29EaWdpdHMsIGZ1bmN0aW9uIChkLCB2KSB7XG4gICAgICBkLmhvdXIgPSB2O1xuICAgIH1dLFxuICAgIG06IFt0d29EaWdpdHMsIGZ1bmN0aW9uIChkLCB2KSB7XG4gICAgICBkLm1pbnV0ZSA9IHY7XG4gICAgfV0sXG4gICAgczogW3R3b0RpZ2l0cywgZnVuY3Rpb24gKGQsIHYpIHtcbiAgICAgIGQuc2Vjb25kID0gdjtcbiAgICB9XSxcbiAgICB5eXl5OiBbZm91ckRpZ2l0cywgZnVuY3Rpb24gKGQsIHYpIHtcbiAgICAgIGQueWVhciA9IHY7XG4gICAgfV0sXG4gICAgUzogWydcXFxcZCcsIGZ1bmN0aW9uIChkLCB2KSB7XG4gICAgICBkLm1pbGxpc2Vjb25kID0gdiAqIDEwMDtcbiAgICB9XSxcbiAgICBTUzogWydcXFxcZHsyfScsIGZ1bmN0aW9uIChkLCB2KSB7XG4gICAgICBkLm1pbGxpc2Vjb25kID0gdiAqIDEwO1xuICAgIH1dLFxuICAgIFNTUzogW3RocmVlRGlnaXRzLCBmdW5jdGlvbiAoZCwgdikge1xuICAgICAgZC5taWxsaXNlY29uZCA9IHY7XG4gICAgfV0sXG4gICAgRDogW3R3b0RpZ2l0cywgbm9vcF0sXG4gICAgZGRkOiBbd29yZCwgbm9vcF0sXG4gICAgTU1NOiBbd29yZCwgbW9udGhVcGRhdGUoJ21vbnRoTmFtZXNTaG9ydCcpXSxcbiAgICBNTU1NOiBbd29yZCwgbW9udGhVcGRhdGUoJ21vbnRoTmFtZXMnKV0sXG4gICAgYTogW3dvcmQsIGZ1bmN0aW9uIChkLCB2LCBpMThuKSB7XG4gICAgICB2YXIgdmFsID0gdi50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHZhbCA9PT0gaTE4bi5hbVBtWzBdKSB7XG4gICAgICAgIGQuaXNQbSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh2YWwgPT09IGkxOG4uYW1QbVsxXSkge1xuICAgICAgICBkLmlzUG0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1dLFxuICAgIFpaOiBbJ1teXFxcXHNdKj9bXFxcXCtcXFxcLV1cXFxcZFxcXFxkOj9cXFxcZFxcXFxkfFteXFxcXHNdKj9aJywgZnVuY3Rpb24gKGQsIHYpIHtcbiAgICAgIHZhciBwYXJ0cyA9ICh2ICsgJycpLm1hdGNoKC8oWystXXxcXGRcXGQpL2dpKSxcbiAgICAgICAgICBtaW51dGVzO1xuXG4gICAgICBpZiAocGFydHMpIHtcbiAgICAgICAgbWludXRlcyA9ICsocGFydHNbMV0gKiA2MCkgKyBwYXJzZUludChwYXJ0c1syXSwgMTApO1xuICAgICAgICBkLnRpbWV6b25lT2Zmc2V0ID0gcGFydHNbMF0gPT09ICcrJyA/IG1pbnV0ZXMgOiAtbWludXRlcztcbiAgICAgIH1cbiAgICB9XVxuICB9O1xuICBwYXJzZUZsYWdzLmRkID0gcGFyc2VGbGFncy5kO1xuICBwYXJzZUZsYWdzLmRkZGQgPSBwYXJzZUZsYWdzLmRkZDtcbiAgcGFyc2VGbGFncy5ERCA9IHBhcnNlRmxhZ3MuRDtcbiAgcGFyc2VGbGFncy5tbSA9IHBhcnNlRmxhZ3MubTtcbiAgcGFyc2VGbGFncy5oaCA9IHBhcnNlRmxhZ3MuSCA9IHBhcnNlRmxhZ3MuSEggPSBwYXJzZUZsYWdzLmg7XG4gIHBhcnNlRmxhZ3MuTU0gPSBwYXJzZUZsYWdzLk07XG4gIHBhcnNlRmxhZ3Muc3MgPSBwYXJzZUZsYWdzLnM7XG4gIHBhcnNlRmxhZ3MuQSA9IHBhcnNlRmxhZ3MuYTtcblxuICAvLyBTb21lIGNvbW1vbiBmb3JtYXQgc3RyaW5nc1xuICBmZWNoYS5tYXNrcyA9IHtcbiAgICBkZWZhdWx0OiAnZGRkIE1NTSBkZCB5eXl5IEhIOm1tOnNzJyxcbiAgICBzaG9ydERhdGU6ICdNL0QveXknLFxuICAgIG1lZGl1bURhdGU6ICdNTU0gZCwgeXl5eScsXG4gICAgbG9uZ0RhdGU6ICdNTU1NIGQsIHl5eXknLFxuICAgIGZ1bGxEYXRlOiAnZGRkZCwgTU1NTSBkLCB5eXl5JyxcbiAgICBzaG9ydFRpbWU6ICdISDptbScsXG4gICAgbWVkaXVtVGltZTogJ0hIOm1tOnNzJyxcbiAgICBsb25nVGltZTogJ0hIOm1tOnNzLlNTUydcbiAgfTtcblxuICAvKioqXG4gICAqIEZvcm1hdCBhIGRhdGVcbiAgICogQG1ldGhvZCBmb3JtYXRcbiAgICogQHBhcmFtIHtEYXRlfG51bWJlcn0gZGF0ZU9ialxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWFzayBGb3JtYXQgb2YgdGhlIGRhdGUsIGkuZS4gJ21tLWRkLXl5JyBvciAnc2hvcnREYXRlJ1xuICAgKi9cbiAgZmVjaGEuZm9ybWF0ID0gZnVuY3Rpb24gKGRhdGVPYmosIG1hc2ssIGkxOG5TZXR0aW5ncykge1xuICAgIHZhciBpMThuID0gaTE4blNldHRpbmdzIHx8IGZlY2hhLmkxOG47XG5cbiAgICBpZiAodHlwZW9mIGRhdGVPYmogPT09ICdudW1iZXInKSB7XG4gICAgICBkYXRlT2JqID0gbmV3IERhdGUoZGF0ZU9iaik7XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRlT2JqKSAhPT0gJ1tvYmplY3QgRGF0ZV0nIHx8IGlzTmFOKGRhdGVPYmouZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIERhdGUgaW4gZmVjaGEuZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgbWFzayA9IGZlY2hhLm1hc2tzW21hc2tdIHx8IG1hc2sgfHwgZmVjaGEubWFza3NbJ2RlZmF1bHQnXTtcblxuICAgIHZhciBsaXRlcmFscyA9IFtdO1xuXG4gICAgLy8gTWFrZSBsaXRlcmFscyBpbmFjdGl2ZSBieSByZXBsYWNpbmcgdGhlbSB3aXRoID8/XG4gICAgbWFzayA9IG1hc2sucmVwbGFjZShsaXRlcmFsLCBmdW5jdGlvbiAoJDAsICQxKSB7XG4gICAgICBsaXRlcmFscy5wdXNoKCQxKTtcbiAgICAgIHJldHVybiAnQEBAJztcbiAgICB9KTtcbiAgICAvLyBBcHBseSBmb3JtYXR0aW5nIHJ1bGVzXG4gICAgbWFzayA9IG1hc2sucmVwbGFjZSh0b2tlbiwgZnVuY3Rpb24gKCQwKSB7XG4gICAgICByZXR1cm4gJDAgaW4gZm9ybWF0RmxhZ3MgPyBmb3JtYXRGbGFnc1skMF0oZGF0ZU9iaiwgaTE4bikgOiAkMC5zbGljZSgxLCAkMC5sZW5ndGggLSAxKTtcbiAgICB9KTtcbiAgICAvLyBJbmxpbmUgbGl0ZXJhbCB2YWx1ZXMgYmFjayBpbnRvIHRoZSBmb3JtYXR0ZWQgdmFsdWVcbiAgICByZXR1cm4gbWFzay5yZXBsYWNlKC9AQEAvZywgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGxpdGVyYWxzLnNoaWZ0KCk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFBhcnNlIGEgZGF0ZSBzdHJpbmcgaW50byBhbiBvYmplY3QsIGNoYW5nZXMgLSBpbnRvIC9cbiAgICogQG1ldGhvZCBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0ZVN0ciBEYXRlIHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IERhdGUgcGFyc2UgZm9ybWF0XG4gICAqIEByZXR1cm5zIHtEYXRlfGJvb2xlYW59XG4gICAqL1xuICBmZWNoYS5wYXJzZSA9IGZ1bmN0aW9uIChkYXRlU3RyLCBmb3JtYXQsIGkxOG5TZXR0aW5ncykge1xuICAgIHZhciBpMThuID0gaTE4blNldHRpbmdzIHx8IGZlY2hhLmkxOG47XG5cbiAgICBpZiAodHlwZW9mIGZvcm1hdCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmb3JtYXQgaW4gZmVjaGEucGFyc2UnKTtcbiAgICB9XG5cbiAgICBmb3JtYXQgPSBmZWNoYS5tYXNrc1tmb3JtYXRdIHx8IGZvcm1hdDtcblxuICAgIC8vIEF2b2lkIHJlZ3VsYXIgZXhwcmVzc2lvbiBkZW5pYWwgb2Ygc2VydmljZSwgZmFpbCBlYXJseSBmb3IgcmVhbGx5IGxvbmcgc3RyaW5nc1xuICAgIC8vIGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvUmVndWxhcl9leHByZXNzaW9uX0RlbmlhbF9vZl9TZXJ2aWNlXy1fUmVEb1NcbiAgICBpZiAoZGF0ZVN0ci5sZW5ndGggPiAxMDAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgZGF0ZUluZm8gPSB7fTtcbiAgICB2YXIgcGFyc2VJbmZvID0gW107XG4gICAgdmFyIGxpdGVyYWxzID0gW107XG4gICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UobGl0ZXJhbCwgZnVuY3Rpb24gKCQwLCAkMSkge1xuICAgICAgbGl0ZXJhbHMucHVzaCgkMSk7XG4gICAgICByZXR1cm4gJ0BAQCc7XG4gICAgfSk7XG4gICAgdmFyIG5ld0Zvcm1hdCA9IHJlZ2V4RXNjYXBlKGZvcm1hdCkucmVwbGFjZSh0b2tlbiwgZnVuY3Rpb24gKCQwKSB7XG4gICAgICBpZiAocGFyc2VGbGFnc1skMF0pIHtcbiAgICAgICAgdmFyIGluZm8gPSBwYXJzZUZsYWdzWyQwXTtcbiAgICAgICAgcGFyc2VJbmZvLnB1c2goaW5mb1sxXSk7XG4gICAgICAgIHJldHVybiAnKCcgKyBpbmZvWzBdICsgJyknO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJDA7XG4gICAgfSk7XG4gICAgbmV3Rm9ybWF0ID0gbmV3Rm9ybWF0LnJlcGxhY2UoL0BAQC9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbHMuc2hpZnQoKTtcbiAgICB9KTtcbiAgICB2YXIgbWF0Y2hlcyA9IGRhdGVTdHIubWF0Y2gobmV3IFJlZ0V4cChuZXdGb3JtYXQsICdpJykpO1xuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYXJzZUluZm9baSAtIDFdKGRhdGVJbmZvLCBtYXRjaGVzW2ldLCBpMThuKTtcbiAgICB9XG5cbiAgICB2YXIgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIGlmIChkYXRlSW5mby5pc1BtID09PSB0cnVlICYmIGRhdGVJbmZvLmhvdXIgIT0gbnVsbCAmJiArZGF0ZUluZm8uaG91ciAhPT0gMTIpIHtcbiAgICAgIGRhdGVJbmZvLmhvdXIgPSArZGF0ZUluZm8uaG91ciArIDEyO1xuICAgIH0gZWxzZSBpZiAoZGF0ZUluZm8uaXNQbSA9PT0gZmFsc2UgJiYgK2RhdGVJbmZvLmhvdXIgPT09IDEyKSB7XG4gICAgICBkYXRlSW5mby5ob3VyID0gMDtcbiAgICB9XG5cbiAgICB2YXIgZGF0ZTtcbiAgICBpZiAoZGF0ZUluZm8udGltZXpvbmVPZmZzZXQgIT0gbnVsbCkge1xuICAgICAgZGF0ZUluZm8ubWludXRlID0gKyhkYXRlSW5mby5taW51dGUgfHwgMCkgLSArZGF0ZUluZm8udGltZXpvbmVPZmZzZXQ7XG4gICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoZGF0ZUluZm8ueWVhciB8fCB0b2RheS5nZXRGdWxsWWVhcigpLCBkYXRlSW5mby5tb250aCB8fCAwLCBkYXRlSW5mby5kYXkgfHwgMSwgZGF0ZUluZm8uaG91ciB8fCAwLCBkYXRlSW5mby5taW51dGUgfHwgMCwgZGF0ZUluZm8uc2Vjb25kIHx8IDAsIGRhdGVJbmZvLm1pbGxpc2Vjb25kIHx8IDApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGVJbmZvLnllYXIgfHwgdG9kYXkuZ2V0RnVsbFllYXIoKSwgZGF0ZUluZm8ubW9udGggfHwgMCwgZGF0ZUluZm8uZGF5IHx8IDEsIGRhdGVJbmZvLmhvdXIgfHwgMCwgZGF0ZUluZm8ubWludXRlIHx8IDAsIGRhdGVJbmZvLnNlY29uZCB8fCAwLCBkYXRlSW5mby5taWxsaXNlY29uZCB8fCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG4gIH07XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmZWNoYTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZlY2hhO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG1haW4uZmVjaGEgPSBmZWNoYTtcbiAgfVxufSkodW5kZWZpbmVkKTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///d7d1\n")},d940:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.validateRangeInOneMonth = exports.extractTimeFormat = exports.extractDateFormat = exports.nextYear = exports.prevYear = exports.nextMonth = exports.prevMonth = exports.changeYearMonthAndClampDate = exports.timeWithinRange = exports.limitTimeRange = exports.clearMilliseconds = exports.clearTime = exports.modifyWithTimeString = exports.modifyTime = exports.modifyDate = exports.range = exports.getRangeMinutes = exports.getMonthDays = exports.getPrevMonthLastDays = exports.getRangeHours = exports.getWeekNumber = exports.getStartDateOfMonth = exports.nextDate = exports.prevDate = exports.getFirstDayOfMonth = exports.getDayCountOfYear = exports.getDayCountOfMonth = exports.parseDate = exports.formatDate = exports.isDateObject = exports.isDate = exports.toDate = exports.getI18nSettings = undefined;\n\nvar _date = __webpack_require__(\"d7d1\");\n\nvar _date2 = _interopRequireDefault(_date);\n\nvar _locale = __webpack_require__(\"4897\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar weeks = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\nvar months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];\n\nvar newArray = function newArray(start, end) {\n var result = [];\n for (var i = start; i <= end; i++) {\n result.push(i);\n }\n return result;\n};\n\nvar getI18nSettings = exports.getI18nSettings = function getI18nSettings() {\n return {\n dayNamesShort: weeks.map(function (week) {\n return (0, _locale.t)('el.datepicker.weeks.' + week);\n }),\n dayNames: weeks.map(function (week) {\n return (0, _locale.t)('el.datepicker.weeks.' + week);\n }),\n monthNamesShort: months.map(function (month) {\n return (0, _locale.t)('el.datepicker.months.' + month);\n }),\n monthNames: months.map(function (month, index) {\n return (0, _locale.t)('el.datepicker.month' + (index + 1));\n }),\n amPm: ['am', 'pm']\n };\n};\n\nvar toDate = exports.toDate = function toDate(date) {\n return isDate(date) ? new Date(date) : null;\n};\n\nvar isDate = exports.isDate = function isDate(date) {\n if (date === null || date === undefined) return false;\n if (isNaN(new Date(date).getTime())) return false;\n if (Array.isArray(date)) return false; // deal with `new Date([ new Date() ]) -> new Date()`\n return true;\n};\n\nvar isDateObject = exports.isDateObject = function isDateObject(val) {\n return val instanceof Date;\n};\n\nvar formatDate = exports.formatDate = function formatDate(date, format) {\n date = toDate(date);\n if (!date) return '';\n return _date2.default.format(date, format || 'yyyy-MM-dd', getI18nSettings());\n};\n\nvar parseDate = exports.parseDate = function parseDate(string, format) {\n return _date2.default.parse(string, format || 'yyyy-MM-dd', getI18nSettings());\n};\n\nvar getDayCountOfMonth = exports.getDayCountOfMonth = function getDayCountOfMonth(year, month) {\n if (isNaN(+month)) return 31;\n\n return new Date(year, +month + 1, 0).getDate();\n};\n\nvar getDayCountOfYear = exports.getDayCountOfYear = function getDayCountOfYear(year) {\n var isLeapYear = year % 400 === 0 || year % 100 !== 0 && year % 4 === 0;\n return isLeapYear ? 366 : 365;\n};\n\nvar getFirstDayOfMonth = exports.getFirstDayOfMonth = function getFirstDayOfMonth(date) {\n var temp = new Date(date.getTime());\n temp.setDate(1);\n return temp.getDay();\n};\n\n// see: https://stackoverflow.com/questions/3674539/incrementing-a-date-in-javascript\n// {prev, next} Date should work for Daylight Saving Time\n// Adding 24 * 60 * 60 * 1000 does not work in the above scenario\nvar prevDate = exports.prevDate = function prevDate(date) {\n var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() - amount);\n};\n\nvar nextDate = exports.nextDate = function nextDate(date) {\n var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + amount);\n};\n\nvar getStartDateOfMonth = exports.getStartDateOfMonth = function getStartDateOfMonth(year, month) {\n var result = new Date(year, month, 1);\n var day = result.getDay();\n\n if (day === 0) {\n return prevDate(result, 7);\n } else {\n return prevDate(result, day);\n }\n};\n\nvar getWeekNumber = exports.getWeekNumber = function getWeekNumber(src) {\n if (!isDate(src)) return null;\n var date = new Date(src.getTime());\n date.setHours(0, 0, 0, 0);\n // Thursday in current week decides the year.\n date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);\n // January 4 is always in week 1.\n var week1 = new Date(date.getFullYear(), 0, 4);\n // Adjust to Thursday in week 1 and count number of weeks from date to week 1.\n // Rounding should be fine for Daylight Saving Time. Its shift should never be more than 12 hours.\n return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);\n};\n\nvar getRangeHours = exports.getRangeHours = function getRangeHours(ranges) {\n var hours = [];\n var disabledHours = [];\n\n (ranges || []).forEach(function (range) {\n var value = range.map(function (date) {\n return date.getHours();\n });\n\n disabledHours = disabledHours.concat(newArray(value[0], value[1]));\n });\n\n if (disabledHours.length) {\n for (var i = 0; i < 24; i++) {\n hours[i] = disabledHours.indexOf(i) === -1;\n }\n } else {\n for (var _i = 0; _i < 24; _i++) {\n hours[_i] = false;\n }\n }\n\n return hours;\n};\n\nvar getPrevMonthLastDays = exports.getPrevMonthLastDays = function getPrevMonthLastDays(date, amount) {\n if (amount <= 0) return [];\n var temp = new Date(date.getTime());\n temp.setDate(0);\n var lastDay = temp.getDate();\n return range(amount).map(function (_, index) {\n return lastDay - (amount - index - 1);\n });\n};\n\nvar getMonthDays = exports.getMonthDays = function getMonthDays(date) {\n var temp = new Date(date.getFullYear(), date.getMonth() + 1, 0);\n var days = temp.getDate();\n return range(days).map(function (_, index) {\n return index + 1;\n });\n};\n\nfunction setRangeData(arr, start, end, value) {\n for (var i = start; i < end; i++) {\n arr[i] = value;\n }\n}\n\nvar getRangeMinutes = exports.getRangeMinutes = function getRangeMinutes(ranges, hour) {\n var minutes = new Array(60);\n\n if (ranges.length > 0) {\n ranges.forEach(function (range) {\n var start = range[0];\n var end = range[1];\n var startHour = start.getHours();\n var startMinute = start.getMinutes();\n var endHour = end.getHours();\n var endMinute = end.getMinutes();\n if (startHour === hour && endHour !== hour) {\n setRangeData(minutes, startMinute, 60, true);\n } else if (startHour === hour && endHour === hour) {\n setRangeData(minutes, startMinute, endMinute + 1, true);\n } else if (startHour !== hour && endHour === hour) {\n setRangeData(minutes, 0, endMinute + 1, true);\n } else if (startHour < hour && endHour > hour) {\n setRangeData(minutes, 0, 60, true);\n }\n });\n } else {\n setRangeData(minutes, 0, 60, true);\n }\n return minutes;\n};\n\nvar range = exports.range = function range(n) {\n // see https://stackoverflow.com/questions/3746725/create-a-javascript-array-containing-1-n\n return Array.apply(null, { length: n }).map(function (_, n) {\n return n;\n });\n};\n\nvar modifyDate = exports.modifyDate = function modifyDate(date, y, m, d) {\n return new Date(y, m, d, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n};\n\nvar modifyTime = exports.modifyTime = function modifyTime(date, h, m, s) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), h, m, s, date.getMilliseconds());\n};\n\nvar modifyWithTimeString = exports.modifyWithTimeString = function modifyWithTimeString(date, time) {\n if (date == null || !time) {\n return date;\n }\n time = parseDate(time, 'HH:mm:ss');\n return modifyTime(date, time.getHours(), time.getMinutes(), time.getSeconds());\n};\n\nvar clearTime = exports.clearTime = function clearTime(date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n};\n\nvar clearMilliseconds = exports.clearMilliseconds = function clearMilliseconds(date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), 0);\n};\n\nvar limitTimeRange = exports.limitTimeRange = function limitTimeRange(date, ranges) {\n var format = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'HH:mm:ss';\n\n // TODO: refactory a more elegant solution\n if (ranges.length === 0) return date;\n var normalizeDate = function normalizeDate(date) {\n return _date2.default.parse(_date2.default.format(date, format), format);\n };\n var ndate = normalizeDate(date);\n var nranges = ranges.map(function (range) {\n return range.map(normalizeDate);\n });\n if (nranges.some(function (nrange) {\n return ndate >= nrange[0] && ndate <= nrange[1];\n })) return date;\n\n var minDate = nranges[0][0];\n var maxDate = nranges[0][0];\n\n nranges.forEach(function (nrange) {\n minDate = new Date(Math.min(nrange[0], minDate));\n maxDate = new Date(Math.max(nrange[1], minDate));\n });\n\n var ret = ndate < minDate ? minDate : maxDate;\n // preserve Year/Month/Date\n return modifyDate(ret, date.getFullYear(), date.getMonth(), date.getDate());\n};\n\nvar timeWithinRange = exports.timeWithinRange = function timeWithinRange(date, selectableRange, format) {\n var limitedDate = limitTimeRange(date, selectableRange, format);\n return limitedDate.getTime() === date.getTime();\n};\n\nvar changeYearMonthAndClampDate = exports.changeYearMonthAndClampDate = function changeYearMonthAndClampDate(date, year, month) {\n // clamp date to the number of days in `year`, `month`\n // eg: (2010-1-31, 2010, 2) => 2010-2-28\n var monthDate = Math.min(date.getDate(), getDayCountOfMonth(year, month));\n return modifyDate(date, year, month, monthDate);\n};\n\nvar prevMonth = exports.prevMonth = function prevMonth(date) {\n var year = date.getFullYear();\n var month = date.getMonth();\n return month === 0 ? changeYearMonthAndClampDate(date, year - 1, 11) : changeYearMonthAndClampDate(date, year, month - 1);\n};\n\nvar nextMonth = exports.nextMonth = function nextMonth(date) {\n var year = date.getFullYear();\n var month = date.getMonth();\n return month === 11 ? changeYearMonthAndClampDate(date, year + 1, 0) : changeYearMonthAndClampDate(date, year, month + 1);\n};\n\nvar prevYear = exports.prevYear = function prevYear(date) {\n var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n var year = date.getFullYear();\n var month = date.getMonth();\n return changeYearMonthAndClampDate(date, year - amount, month);\n};\n\nvar nextYear = exports.nextYear = function nextYear(date) {\n var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n var year = date.getFullYear();\n var month = date.getMonth();\n return changeYearMonthAndClampDate(date, year + amount, month);\n};\n\nvar extractDateFormat = exports.extractDateFormat = function extractDateFormat(format) {\n return format.replace(/\\W?m{1,2}|\\W?ZZ/g, '').replace(/\\W?h{1,2}|\\W?s{1,3}|\\W?a/gi, '').trim();\n};\n\nvar extractTimeFormat = exports.extractTimeFormat = function extractTimeFormat(format) {\n return format.replace(/\\W?D{1,2}|\\W?Do|\\W?d{1,4}|\\W?M{1,4}|\\W?y{2,4}/g, '').trim();\n};\n\nvar validateRangeInOneMonth = exports.validateRangeInOneMonth = function validateRangeInOneMonth(start, end) {\n return start.getMonth() === end.getMonth() && start.getFullYear() === end.getFullYear();\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvZGF0ZS11dGlsLmpzP2Q5NDAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsTUFBMkI7O0FBRS9DOztBQUVBLGNBQWMsbUJBQU8sQ0FBQyxNQUF1Qjs7QUFFN0Msc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQixVQUFVO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSSxXQUFXO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHOztBQUVIO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTtBQUNBLEdBQUc7QUFDSCxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QixZQUFZO0FBQ3hDO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCLElBQUksNEJBQTRCLElBQUksTUFBTSxJQUFJO0FBQzVFOztBQUVBO0FBQ0EsOEJBQThCLElBQUksWUFBWSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUk7QUFDdEU7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6ImQ5NDAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnZhbGlkYXRlUmFuZ2VJbk9uZU1vbnRoID0gZXhwb3J0cy5leHRyYWN0VGltZUZvcm1hdCA9IGV4cG9ydHMuZXh0cmFjdERhdGVGb3JtYXQgPSBleHBvcnRzLm5leHRZZWFyID0gZXhwb3J0cy5wcmV2WWVhciA9IGV4cG9ydHMubmV4dE1vbnRoID0gZXhwb3J0cy5wcmV2TW9udGggPSBleHBvcnRzLmNoYW5nZVllYXJNb250aEFuZENsYW1wRGF0ZSA9IGV4cG9ydHMudGltZVdpdGhpblJhbmdlID0gZXhwb3J0cy5saW1pdFRpbWVSYW5nZSA9IGV4cG9ydHMuY2xlYXJNaWxsaXNlY29uZHMgPSBleHBvcnRzLmNsZWFyVGltZSA9IGV4cG9ydHMubW9kaWZ5V2l0aFRpbWVTdHJpbmcgPSBleHBvcnRzLm1vZGlmeVRpbWUgPSBleHBvcnRzLm1vZGlmeURhdGUgPSBleHBvcnRzLnJhbmdlID0gZXhwb3J0cy5nZXRSYW5nZU1pbnV0ZXMgPSBleHBvcnRzLmdldE1vbnRoRGF5cyA9IGV4cG9ydHMuZ2V0UHJldk1vbnRoTGFzdERheXMgPSBleHBvcnRzLmdldFJhbmdlSG91cnMgPSBleHBvcnRzLmdldFdlZWtOdW1iZXIgPSBleHBvcnRzLmdldFN0YXJ0RGF0ZU9mTW9udGggPSBleHBvcnRzLm5leHREYXRlID0gZXhwb3J0cy5wcmV2RGF0ZSA9IGV4cG9ydHMuZ2V0Rmlyc3REYXlPZk1vbnRoID0gZXhwb3J0cy5nZXREYXlDb3VudE9mWWVhciA9IGV4cG9ydHMuZ2V0RGF5Q291bnRPZk1vbnRoID0gZXhwb3J0cy5wYXJzZURhdGUgPSBleHBvcnRzLmZvcm1hdERhdGUgPSBleHBvcnRzLmlzRGF0ZU9iamVjdCA9IGV4cG9ydHMuaXNEYXRlID0gZXhwb3J0cy50b0RhdGUgPSBleHBvcnRzLmdldEkxOG5TZXR0aW5ncyA9IHVuZGVmaW5lZDtcblxudmFyIF9kYXRlID0gcmVxdWlyZSgnZWxlbWVudC11aS9saWIvdXRpbHMvZGF0ZScpO1xuXG52YXIgX2RhdGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGF0ZSk7XG5cbnZhciBfbG9jYWxlID0gcmVxdWlyZSgnZWxlbWVudC11aS9saWIvbG9jYWxlJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciB3ZWVrcyA9IFsnc3VuJywgJ21vbicsICd0dWUnLCAnd2VkJywgJ3RodScsICdmcmknLCAnc2F0J107XG52YXIgbW9udGhzID0gWydqYW4nLCAnZmViJywgJ21hcicsICdhcHInLCAnbWF5JywgJ2p1bicsICdqdWwnLCAnYXVnJywgJ3NlcCcsICdvY3QnLCAnbm92JywgJ2RlYyddO1xuXG52YXIgbmV3QXJyYXkgPSBmdW5jdGlvbiBuZXdBcnJheShzdGFydCwgZW5kKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgcmVzdWx0LnB1c2goaSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBnZXRJMThuU2V0dGluZ3MgPSBleHBvcnRzLmdldEkxOG5TZXR0aW5ncyA9IGZ1bmN0aW9uIGdldEkxOG5TZXR0aW5ncygpIHtcbiAgcmV0dXJuIHtcbiAgICBkYXlOYW1lc1Nob3J0OiB3ZWVrcy5tYXAoZnVuY3Rpb24gKHdlZWspIHtcbiAgICAgIHJldHVybiAoMCwgX2xvY2FsZS50KSgnZWwuZGF0ZXBpY2tlci53ZWVrcy4nICsgd2Vlayk7XG4gICAgfSksXG4gICAgZGF5TmFtZXM6IHdlZWtzLm1hcChmdW5jdGlvbiAod2Vlaykge1xuICAgICAgcmV0dXJuICgwLCBfbG9jYWxlLnQpKCdlbC5kYXRlcGlja2VyLndlZWtzLicgKyB3ZWVrKTtcbiAgICB9KSxcbiAgICBtb250aE5hbWVzU2hvcnQ6IG1vbnRocy5tYXAoZnVuY3Rpb24gKG1vbnRoKSB7XG4gICAgICByZXR1cm4gKDAsIF9sb2NhbGUudCkoJ2VsLmRhdGVwaWNrZXIubW9udGhzLicgKyBtb250aCk7XG4gICAgfSksXG4gICAgbW9udGhOYW1lczogbW9udGhzLm1hcChmdW5jdGlvbiAobW9udGgsIGluZGV4KSB7XG4gICAgICByZXR1cm4gKDAsIF9sb2NhbGUudCkoJ2VsLmRhdGVwaWNrZXIubW9udGgnICsgKGluZGV4ICsgMSkpO1xuICAgIH0pLFxuICAgIGFtUG06IFsnYW0nLCAncG0nXVxuICB9O1xufTtcblxudmFyIHRvRGF0ZSA9IGV4cG9ydHMudG9EYXRlID0gZnVuY3Rpb24gdG9EYXRlKGRhdGUpIHtcbiAgcmV0dXJuIGlzRGF0ZShkYXRlKSA/IG5ldyBEYXRlKGRhdGUpIDogbnVsbDtcbn07XG5cbnZhciBpc0RhdGUgPSBleHBvcnRzLmlzRGF0ZSA9IGZ1bmN0aW9uIGlzRGF0ZShkYXRlKSB7XG4gIGlmIChkYXRlID09PSBudWxsIHx8IGRhdGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaXNOYU4obmV3IERhdGUoZGF0ZSkuZ2V0VGltZSgpKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRlKSkgcmV0dXJuIGZhbHNlOyAvLyBkZWFsIHdpdGggYG5ldyBEYXRlKFsgbmV3IERhdGUoKSBdKSAtPiBuZXcgRGF0ZSgpYFxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBpc0RhdGVPYmplY3QgPSBleHBvcnRzLmlzRGF0ZU9iamVjdCA9IGZ1bmN0aW9uIGlzRGF0ZU9iamVjdCh2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIERhdGU7XG59O1xuXG52YXIgZm9ybWF0RGF0ZSA9IGV4cG9ydHMuZm9ybWF0RGF0ZSA9IGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0KSB7XG4gIGRhdGUgPSB0b0RhdGUoZGF0ZSk7XG4gIGlmICghZGF0ZSkgcmV0dXJuICcnO1xuICByZXR1cm4gX2RhdGUyLmRlZmF1bHQuZm9ybWF0KGRhdGUsIGZvcm1hdCB8fCAneXl5eS1NTS1kZCcsIGdldEkxOG5TZXR0aW5ncygpKTtcbn07XG5cbnZhciBwYXJzZURhdGUgPSBleHBvcnRzLnBhcnNlRGF0ZSA9IGZ1bmN0aW9uIHBhcnNlRGF0ZShzdHJpbmcsIGZvcm1hdCkge1xuICByZXR1cm4gX2RhdGUyLmRlZmF1bHQucGFyc2Uoc3RyaW5nLCBmb3JtYXQgfHwgJ3l5eXktTU0tZGQnLCBnZXRJMThuU2V0dGluZ3MoKSk7XG59O1xuXG52YXIgZ2V0RGF5Q291bnRPZk1vbnRoID0gZXhwb3J0cy5nZXREYXlDb3VudE9mTW9udGggPSBmdW5jdGlvbiBnZXREYXlDb3VudE9mTW9udGgoeWVhciwgbW9udGgpIHtcbiAgaWYgKGlzTmFOKCttb250aCkpIHJldHVybiAzMTtcblxuICByZXR1cm4gbmV3IERhdGUoeWVhciwgK21vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xufTtcblxudmFyIGdldERheUNvdW50T2ZZZWFyID0gZXhwb3J0cy5nZXREYXlDb3VudE9mWWVhciA9IGZ1bmN0aW9uIGdldERheUNvdW50T2ZZZWFyKHllYXIpIHtcbiAgdmFyIGlzTGVhcFllYXIgPSB5ZWFyICUgNDAwID09PSAwIHx8IHllYXIgJSAxMDAgIT09IDAgJiYgeWVhciAlIDQgPT09IDA7XG4gIHJldHVybiBpc0xlYXBZZWFyID8gMzY2IDogMzY1O1xufTtcblxudmFyIGdldEZpcnN0RGF5T2ZNb250aCA9IGV4cG9ydHMuZ2V0Rmlyc3REYXlPZk1vbnRoID0gZnVuY3Rpb24gZ2V0Rmlyc3REYXlPZk1vbnRoKGRhdGUpIHtcbiAgdmFyIHRlbXAgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSk7XG4gIHRlbXAuc2V0RGF0ZSgxKTtcbiAgcmV0dXJuIHRlbXAuZ2V0RGF5KCk7XG59O1xuXG4vLyBzZWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM2NzQ1MzkvaW5jcmVtZW50aW5nLWEtZGF0ZS1pbi1qYXZhc2NyaXB0XG4vLyB7cHJldiwgbmV4dH0gRGF0ZSBzaG91bGQgd29yayBmb3IgRGF5bGlnaHQgU2F2aW5nIFRpbWVcbi8vIEFkZGluZyAyNCAqIDYwICogNjAgKiAxMDAwIGRvZXMgbm90IHdvcmsgaW4gdGhlIGFib3ZlIHNjZW5hcmlvXG52YXIgcHJldkRhdGUgPSBleHBvcnRzLnByZXZEYXRlID0gZnVuY3Rpb24gcHJldkRhdGUoZGF0ZSkge1xuICB2YXIgYW1vdW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxO1xuXG4gIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkgLSBhbW91bnQpO1xufTtcblxudmFyIG5leHREYXRlID0gZXhwb3J0cy5uZXh0RGF0ZSA9IGZ1bmN0aW9uIG5leHREYXRlKGRhdGUpIHtcbiAgdmFyIGFtb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcblxuICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpICsgYW1vdW50KTtcbn07XG5cbnZhciBnZXRTdGFydERhdGVPZk1vbnRoID0gZXhwb3J0cy5nZXRTdGFydERhdGVPZk1vbnRoID0gZnVuY3Rpb24gZ2V0U3RhcnREYXRlT2ZNb250aCh5ZWFyLCBtb250aCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xuICB2YXIgZGF5ID0gcmVzdWx0LmdldERheSgpO1xuXG4gIGlmIChkYXkgPT09IDApIHtcbiAgICByZXR1cm4gcHJldkRhdGUocmVzdWx0LCA3KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcHJldkRhdGUocmVzdWx0LCBkYXkpO1xuICB9XG59O1xuXG52YXIgZ2V0V2Vla051bWJlciA9IGV4cG9ydHMuZ2V0V2Vla051bWJlciA9IGZ1bmN0aW9uIGdldFdlZWtOdW1iZXIoc3JjKSB7XG4gIGlmICghaXNEYXRlKHNyYykpIHJldHVybiBudWxsO1xuICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAvLyBUaHVyc2RheSBpbiBjdXJyZW50IHdlZWsgZGVjaWRlcyB0aGUgeWVhci5cbiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgMyAtIChkYXRlLmdldERheSgpICsgNikgJSA3KTtcbiAgLy8gSmFudWFyeSA0IGlzIGFsd2F5cyBpbiB3ZWVrIDEuXG4gIHZhciB3ZWVrMSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgMCwgNCk7XG4gIC8vIEFkanVzdCB0byBUaHVyc2RheSBpbiB3ZWVrIDEgYW5kIGNvdW50IG51bWJlciBvZiB3ZWVrcyBmcm9tIGRhdGUgdG8gd2VlayAxLlxuICAvLyBSb3VuZGluZyBzaG91bGQgYmUgZmluZSBmb3IgRGF5bGlnaHQgU2F2aW5nIFRpbWUuIEl0cyBzaGlmdCBzaG91bGQgbmV2ZXIgYmUgbW9yZSB0aGFuIDEyIGhvdXJzLlxuICByZXR1cm4gMSArIE1hdGgucm91bmQoKChkYXRlLmdldFRpbWUoKSAtIHdlZWsxLmdldFRpbWUoKSkgLyA4NjQwMDAwMCAtIDMgKyAod2VlazEuZ2V0RGF5KCkgKyA2KSAlIDcpIC8gNyk7XG59O1xuXG52YXIgZ2V0UmFuZ2VIb3VycyA9IGV4cG9ydHMuZ2V0UmFuZ2VIb3VycyA9IGZ1bmN0aW9uIGdldFJhbmdlSG91cnMocmFuZ2VzKSB7XG4gIHZhciBob3VycyA9IFtdO1xuICB2YXIgZGlzYWJsZWRIb3VycyA9IFtdO1xuXG4gIChyYW5nZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgdmFyIHZhbHVlID0gcmFuZ2UubWFwKGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpO1xuICAgIH0pO1xuXG4gICAgZGlzYWJsZWRIb3VycyA9IGRpc2FibGVkSG91cnMuY29uY2F0KG5ld0FycmF5KHZhbHVlWzBdLCB2YWx1ZVsxXSkpO1xuICB9KTtcblxuICBpZiAoZGlzYWJsZWRIb3Vycy5sZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICAgIGhvdXJzW2ldID0gZGlzYWJsZWRIb3Vycy5pbmRleE9mKGkpID09PSAtMTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IDI0OyBfaSsrKSB7XG4gICAgICBob3Vyc1tfaV0gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaG91cnM7XG59O1xuXG52YXIgZ2V0UHJldk1vbnRoTGFzdERheXMgPSBleHBvcnRzLmdldFByZXZNb250aExhc3REYXlzID0gZnVuY3Rpb24gZ2V0UHJldk1vbnRoTGFzdERheXMoZGF0ZSwgYW1vdW50KSB7XG4gIGlmIChhbW91bnQgPD0gMCkgcmV0dXJuIFtdO1xuICB2YXIgdGVtcCA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTtcbiAgdGVtcC5zZXREYXRlKDApO1xuICB2YXIgbGFzdERheSA9IHRlbXAuZ2V0RGF0ZSgpO1xuICByZXR1cm4gcmFuZ2UoYW1vdW50KS5tYXAoZnVuY3Rpb24gKF8sIGluZGV4KSB7XG4gICAgcmV0dXJuIGxhc3REYXkgLSAoYW1vdW50IC0gaW5kZXggLSAxKTtcbiAgfSk7XG59O1xuXG52YXIgZ2V0TW9udGhEYXlzID0gZXhwb3J0cy5nZXRNb250aERheXMgPSBmdW5jdGlvbiBnZXRNb250aERheXMoZGF0ZSkge1xuICB2YXIgdGVtcCA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgMCk7XG4gIHZhciBkYXlzID0gdGVtcC5nZXREYXRlKCk7XG4gIHJldHVybiByYW5nZShkYXlzKS5tYXAoZnVuY3Rpb24gKF8sIGluZGV4KSB7XG4gICAgcmV0dXJuIGluZGV4ICsgMTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBzZXRSYW5nZURhdGEoYXJyLCBzdGFydCwgZW5kLCB2YWx1ZSkge1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIGFycltpXSA9IHZhbHVlO1xuICB9XG59XG5cbnZhciBnZXRSYW5nZU1pbnV0ZXMgPSBleHBvcnRzLmdldFJhbmdlTWludXRlcyA9IGZ1bmN0aW9uIGdldFJhbmdlTWludXRlcyhyYW5nZXMsIGhvdXIpIHtcbiAgdmFyIG1pbnV0ZXMgPSBuZXcgQXJyYXkoNjApO1xuXG4gIGlmIChyYW5nZXMubGVuZ3RoID4gMCkge1xuICAgIHJhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgdmFyIHN0YXJ0ID0gcmFuZ2VbMF07XG4gICAgICB2YXIgZW5kID0gcmFuZ2VbMV07XG4gICAgICB2YXIgc3RhcnRIb3VyID0gc3RhcnQuZ2V0SG91cnMoKTtcbiAgICAgIHZhciBzdGFydE1pbnV0ZSA9IHN0YXJ0LmdldE1pbnV0ZXMoKTtcbiAgICAgIHZhciBlbmRIb3VyID0gZW5kLmdldEhvdXJzKCk7XG4gICAgICB2YXIgZW5kTWludXRlID0gZW5kLmdldE1pbnV0ZXMoKTtcbiAgICAgIGlmIChzdGFydEhvdXIgPT09IGhvdXIgJiYgZW5kSG91ciAhPT0gaG91cikge1xuICAgICAgICBzZXRSYW5nZURhdGEobWludXRlcywgc3RhcnRNaW51dGUsIDYwLCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnRIb3VyID09PSBob3VyICYmIGVuZEhvdXIgPT09IGhvdXIpIHtcbiAgICAgICAgc2V0UmFuZ2VEYXRhKG1pbnV0ZXMsIHN0YXJ0TWludXRlLCBlbmRNaW51dGUgKyAxLCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnRIb3VyICE9PSBob3VyICYmIGVuZEhvdXIgPT09IGhvdXIpIHtcbiAgICAgICAgc2V0UmFuZ2VEYXRhKG1pbnV0ZXMsIDAsIGVuZE1pbnV0ZSArIDEsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGFydEhvdXIgPCBob3VyICYmIGVuZEhvdXIgPiBob3VyKSB7XG4gICAgICAgIHNldFJhbmdlRGF0YShtaW51dGVzLCAwLCA2MCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0UmFuZ2VEYXRhKG1pbnV0ZXMsIDAsIDYwLCB0cnVlKTtcbiAgfVxuICByZXR1cm4gbWludXRlcztcbn07XG5cbnZhciByYW5nZSA9IGV4cG9ydHMucmFuZ2UgPSBmdW5jdGlvbiByYW5nZShuKSB7XG4gIC8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzQ2NzI1L2NyZWF0ZS1hLWphdmFzY3JpcHQtYXJyYXktY29udGFpbmluZy0xLW5cbiAgcmV0dXJuIEFycmF5LmFwcGx5KG51bGwsIHsgbGVuZ3RoOiBuIH0pLm1hcChmdW5jdGlvbiAoXywgbikge1xuICAgIHJldHVybiBuO1xuICB9KTtcbn07XG5cbnZhciBtb2RpZnlEYXRlID0gZXhwb3J0cy5tb2RpZnlEYXRlID0gZnVuY3Rpb24gbW9kaWZ5RGF0ZShkYXRlLCB5LCBtLCBkKSB7XG4gIHJldHVybiBuZXcgRGF0ZSh5LCBtLCBkLCBkYXRlLmdldEhvdXJzKCksIGRhdGUuZ2V0TWludXRlcygpLCBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7XG59O1xuXG52YXIgbW9kaWZ5VGltZSA9IGV4cG9ydHMubW9kaWZ5VGltZSA9IGZ1bmN0aW9uIG1vZGlmeVRpbWUoZGF0ZSwgaCwgbSwgcykge1xuICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpLCBoLCBtLCBzLCBkYXRlLmdldE1pbGxpc2Vjb25kcygpKTtcbn07XG5cbnZhciBtb2RpZnlXaXRoVGltZVN0cmluZyA9IGV4cG9ydHMubW9kaWZ5V2l0aFRpbWVTdHJpbmcgPSBmdW5jdGlvbiBtb2RpZnlXaXRoVGltZVN0cmluZyhkYXRlLCB0aW1lKSB7XG4gIGlmIChkYXRlID09IG51bGwgfHwgIXRpbWUpIHtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuICB0aW1lID0gcGFyc2VEYXRlKHRpbWUsICdISDptbTpzcycpO1xuICByZXR1cm4gbW9kaWZ5VGltZShkYXRlLCB0aW1lLmdldEhvdXJzKCksIHRpbWUuZ2V0TWludXRlcygpLCB0aW1lLmdldFNlY29uZHMoKSk7XG59O1xuXG52YXIgY2xlYXJUaW1lID0gZXhwb3J0cy5jbGVhclRpbWUgPSBmdW5jdGlvbiBjbGVhclRpbWUoZGF0ZSkge1xuICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcbn07XG5cbnZhciBjbGVhck1pbGxpc2Vjb25kcyA9IGV4cG9ydHMuY2xlYXJNaWxsaXNlY29uZHMgPSBmdW5jdGlvbiBjbGVhck1pbGxpc2Vjb25kcyhkYXRlKSB7XG4gIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCksIGRhdGUuZ2V0SG91cnMoKSwgZGF0ZS5nZXRNaW51dGVzKCksIGRhdGUuZ2V0U2Vjb25kcygpLCAwKTtcbn07XG5cbnZhciBsaW1pdFRpbWVSYW5nZSA9IGV4cG9ydHMubGltaXRUaW1lUmFuZ2UgPSBmdW5jdGlvbiBsaW1pdFRpbWVSYW5nZShkYXRlLCByYW5nZXMpIHtcbiAgdmFyIGZvcm1hdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogJ0hIOm1tOnNzJztcblxuICAvLyBUT0RPOiByZWZhY3RvcnkgYSBtb3JlIGVsZWdhbnQgc29sdXRpb25cbiAgaWYgKHJhbmdlcy5sZW5ndGggPT09IDApIHJldHVybiBkYXRlO1xuICB2YXIgbm9ybWFsaXplRGF0ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGUoZGF0ZSkge1xuICAgIHJldHVybiBfZGF0ZTIuZGVmYXVsdC5wYXJzZShfZGF0ZTIuZGVmYXVsdC5mb3JtYXQoZGF0ZSwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgfTtcbiAgdmFyIG5kYXRlID0gbm9ybWFsaXplRGF0ZShkYXRlKTtcbiAgdmFyIG5yYW5nZXMgPSByYW5nZXMubWFwKGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHJldHVybiByYW5nZS5tYXAobm9ybWFsaXplRGF0ZSk7XG4gIH0pO1xuICBpZiAobnJhbmdlcy5zb21lKGZ1bmN0aW9uIChucmFuZ2UpIHtcbiAgICByZXR1cm4gbmRhdGUgPj0gbnJhbmdlWzBdICYmIG5kYXRlIDw9IG5yYW5nZVsxXTtcbiAgfSkpIHJldHVybiBkYXRlO1xuXG4gIHZhciBtaW5EYXRlID0gbnJhbmdlc1swXVswXTtcbiAgdmFyIG1heERhdGUgPSBucmFuZ2VzWzBdWzBdO1xuXG4gIG5yYW5nZXMuZm9yRWFjaChmdW5jdGlvbiAobnJhbmdlKSB7XG4gICAgbWluRGF0ZSA9IG5ldyBEYXRlKE1hdGgubWluKG5yYW5nZVswXSwgbWluRGF0ZSkpO1xuICAgIG1heERhdGUgPSBuZXcgRGF0ZShNYXRoLm1heChucmFuZ2VbMV0sIG1pbkRhdGUpKTtcbiAgfSk7XG5cbiAgdmFyIHJldCA9IG5kYXRlIDwgbWluRGF0ZSA/IG1pbkRhdGUgOiBtYXhEYXRlO1xuICAvLyBwcmVzZXJ2ZSBZZWFyL01vbnRoL0RhdGVcbiAgcmV0dXJuIG1vZGlmeURhdGUocmV0LCBkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xufTtcblxudmFyIHRpbWVXaXRoaW5SYW5nZSA9IGV4cG9ydHMudGltZVdpdGhpblJhbmdlID0gZnVuY3Rpb24gdGltZVdpdGhpblJhbmdlKGRhdGUsIHNlbGVjdGFibGVSYW5nZSwgZm9ybWF0KSB7XG4gIHZhciBsaW1pdGVkRGF0ZSA9IGxpbWl0VGltZVJhbmdlKGRhdGUsIHNlbGVjdGFibGVSYW5nZSwgZm9ybWF0KTtcbiAgcmV0dXJuIGxpbWl0ZWREYXRlLmdldFRpbWUoKSA9PT0gZGF0ZS5nZXRUaW1lKCk7XG59O1xuXG52YXIgY2hhbmdlWWVhck1vbnRoQW5kQ2xhbXBEYXRlID0gZXhwb3J0cy5jaGFuZ2VZZWFyTW9udGhBbmRDbGFtcERhdGUgPSBmdW5jdGlvbiBjaGFuZ2VZZWFyTW9udGhBbmRDbGFtcERhdGUoZGF0ZSwgeWVhciwgbW9udGgpIHtcbiAgLy8gY2xhbXAgZGF0ZSB0byB0aGUgbnVtYmVyIG9mIGRheXMgaW4gYHllYXJgLCBgbW9udGhgXG4gIC8vIGVnOiAoMjAxMC0xLTMxLCAyMDEwLCAyKSA9PiAyMDEwLTItMjhcbiAgdmFyIG1vbnRoRGF0ZSA9IE1hdGgubWluKGRhdGUuZ2V0RGF0ZSgpLCBnZXREYXlDb3VudE9mTW9udGgoeWVhciwgbW9udGgpKTtcbiAgcmV0dXJuIG1vZGlmeURhdGUoZGF0ZSwgeWVhciwgbW9udGgsIG1vbnRoRGF0ZSk7XG59O1xuXG52YXIgcHJldk1vbnRoID0gZXhwb3J0cy5wcmV2TW9udGggPSBmdW5jdGlvbiBwcmV2TW9udGgoZGF0ZSkge1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgdmFyIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICByZXR1cm4gbW9udGggPT09IDAgPyBjaGFuZ2VZZWFyTW9udGhBbmRDbGFtcERhdGUoZGF0ZSwgeWVhciAtIDEsIDExKSA6IGNoYW5nZVllYXJNb250aEFuZENsYW1wRGF0ZShkYXRlLCB5ZWFyLCBtb250aCAtIDEpO1xufTtcblxudmFyIG5leHRNb250aCA9IGV4cG9ydHMubmV4dE1vbnRoID0gZnVuY3Rpb24gbmV4dE1vbnRoKGRhdGUpIHtcbiAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIHZhciBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgcmV0dXJuIG1vbnRoID09PSAxMSA/IGNoYW5nZVllYXJNb250aEFuZENsYW1wRGF0ZShkYXRlLCB5ZWFyICsgMSwgMCkgOiBjaGFuZ2VZZWFyTW9udGhBbmRDbGFtcERhdGUoZGF0ZSwgeWVhciwgbW9udGggKyAxKTtcbn07XG5cbnZhciBwcmV2WWVhciA9IGV4cG9ydHMucHJldlllYXIgPSBmdW5jdGlvbiBwcmV2WWVhcihkYXRlKSB7XG4gIHZhciBhbW91bnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG5cbiAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIHZhciBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgcmV0dXJuIGNoYW5nZVllYXJNb250aEFuZENsYW1wRGF0ZShkYXRlLCB5ZWFyIC0gYW1vdW50LCBtb250aCk7XG59O1xuXG52YXIgbmV4dFllYXIgPSBleHBvcnRzLm5leHRZZWFyID0gZnVuY3Rpb24gbmV4dFllYXIoZGF0ZSkge1xuICB2YXIgYW1vdW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxO1xuXG4gIHZhciB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICB2YXIgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gIHJldHVybiBjaGFuZ2VZZWFyTW9udGhBbmRDbGFtcERhdGUoZGF0ZSwgeWVhciArIGFtb3VudCwgbW9udGgpO1xufTtcblxudmFyIGV4dHJhY3REYXRlRm9ybWF0ID0gZXhwb3J0cy5leHRyYWN0RGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIGV4dHJhY3REYXRlRm9ybWF0KGZvcm1hdCkge1xuICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoL1xcVz9tezEsMn18XFxXP1paL2csICcnKS5yZXBsYWNlKC9cXFc/aHsxLDJ9fFxcVz9zezEsM318XFxXP2EvZ2ksICcnKS50cmltKCk7XG59O1xuXG52YXIgZXh0cmFjdFRpbWVGb3JtYXQgPSBleHBvcnRzLmV4dHJhY3RUaW1lRm9ybWF0ID0gZnVuY3Rpb24gZXh0cmFjdFRpbWVGb3JtYXQoZm9ybWF0KSB7XG4gIHJldHVybiBmb3JtYXQucmVwbGFjZSgvXFxXP0R7MSwyfXxcXFc/RG98XFxXP2R7MSw0fXxcXFc/TXsxLDR9fFxcVz95ezIsNH0vZywgJycpLnRyaW0oKTtcbn07XG5cbnZhciB2YWxpZGF0ZVJhbmdlSW5PbmVNb250aCA9IGV4cG9ydHMudmFsaWRhdGVSYW5nZUluT25lTW9udGggPSBmdW5jdGlvbiB2YWxpZGF0ZVJhbmdlSW5PbmVNb250aChzdGFydCwgZW5kKSB7XG4gIHJldHVybiBzdGFydC5nZXRNb250aCgpID09PSBlbmQuZ2V0TW9udGgoKSAmJiBzdGFydC5nZXRGdWxsWWVhcigpID09PSBlbmQuZ2V0RnVsbFllYXIoKTtcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///d940\n")},dcdc:function(module,exports,__webpack_require__){eval('module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: \'Module\' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, \'__esModule\', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === \'object\' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, \'default\', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != \'string\') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module[\'default\']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, \'a\', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = "/dist/";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 91);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 4:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("d010");\n\n/***/ }),\n\n/***/ 91:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/checkbox/src/checkbox.vue?vue&type=template&id=d0387074&\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "label",\n {\n staticClass: "el-checkbox",\n class: [\n _vm.border && _vm.checkboxSize\n ? "el-checkbox--" + _vm.checkboxSize\n : "",\n { "is-disabled": _vm.isDisabled },\n { "is-bordered": _vm.border },\n { "is-checked": _vm.isChecked }\n ],\n attrs: { id: _vm.id }\n },\n [\n _c(\n "span",\n {\n staticClass: "el-checkbox__input",\n class: {\n "is-disabled": _vm.isDisabled,\n "is-checked": _vm.isChecked,\n "is-indeterminate": _vm.indeterminate,\n "is-focus": _vm.focus\n },\n attrs: {\n tabindex: _vm.indeterminate ? 0 : false,\n role: _vm.indeterminate ? "checkbox" : false,\n "aria-checked": _vm.indeterminate ? "mixed" : false\n }\n },\n [\n _c("span", { staticClass: "el-checkbox__inner" }),\n _vm.trueLabel || _vm.falseLabel\n ? _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.model,\n expression: "model"\n }\n ],\n staticClass: "el-checkbox__original",\n attrs: {\n type: "checkbox",\n "aria-hidden": _vm.indeterminate ? "true" : "false",\n name: _vm.name,\n disabled: _vm.isDisabled,\n "true-value": _vm.trueLabel,\n "false-value": _vm.falseLabel\n },\n domProps: {\n checked: Array.isArray(_vm.model)\n ? _vm._i(_vm.model, null) > -1\n : _vm._q(_vm.model, _vm.trueLabel)\n },\n on: {\n change: [\n function($event) {\n var $$a = _vm.model,\n $$el = $event.target,\n $$c = $$el.checked ? _vm.trueLabel : _vm.falseLabel\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 && (_vm.model = $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n (_vm.model = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.model = $$c\n }\n },\n _vm.handleChange\n ],\n focus: function($event) {\n _vm.focus = true\n },\n blur: function($event) {\n _vm.focus = false\n }\n }\n })\n : _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.model,\n expression: "model"\n }\n ],\n staticClass: "el-checkbox__original",\n attrs: {\n type: "checkbox",\n "aria-hidden": _vm.indeterminate ? "true" : "false",\n disabled: _vm.isDisabled,\n name: _vm.name\n },\n domProps: {\n value: _vm.label,\n checked: Array.isArray(_vm.model)\n ? _vm._i(_vm.model, _vm.label) > -1\n : _vm.model\n },\n on: {\n change: [\n function($event) {\n var $$a = _vm.model,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = _vm.label,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 && (_vm.model = $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n (_vm.model = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.model = $$c\n }\n },\n _vm.handleChange\n ],\n focus: function($event) {\n _vm.focus = true\n },\n blur: function($event) {\n _vm.focus = false\n }\n }\n })\n ]\n ),\n _vm.$slots.default || _vm.label\n ? _c(\n "span",\n { staticClass: "el-checkbox__label" },\n [\n _vm._t("default"),\n !_vm.$slots.default ? [_vm._v(_vm._s(_vm.label))] : _vm._e()\n ],\n 2\n )\n : _vm._e()\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox.vue?vue&type=template&id=d0387074&\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/emitter"\nvar emitter_ = __webpack_require__(4);\nvar emitter_default = /*#__PURE__*/__webpack_require__.n(emitter_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/checkbox/src/checkbox.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ var checkboxvue_type_script_lang_js_ = ({\n name: \'ElCheckbox\',\n\n mixins: [emitter_default.a],\n\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n\n componentName: \'ElCheckbox\',\n\n data: function data() {\n return {\n selfModel: false,\n focus: false,\n isLimitExceeded: false\n };\n },\n\n\n computed: {\n model: {\n get: function get() {\n return this.isGroup ? this.store : this.value !== undefined ? this.value : this.selfModel;\n },\n set: function set(val) {\n if (this.isGroup) {\n this.isLimitExceeded = false;\n this._checkboxGroup.min !== undefined && val.length < this._checkboxGroup.min && (this.isLimitExceeded = true);\n\n this._checkboxGroup.max !== undefined && val.length > this._checkboxGroup.max && (this.isLimitExceeded = true);\n\n this.isLimitExceeded === false && this.dispatch(\'ElCheckboxGroup\', \'input\', [val]);\n } else {\n this.$emit(\'input\', val);\n this.selfModel = val;\n }\n }\n },\n\n isChecked: function isChecked() {\n if ({}.toString.call(this.model) === \'[object Boolean]\') {\n return this.model;\n } else if (Array.isArray(this.model)) {\n return this.model.indexOf(this.label) > -1;\n } else if (this.model !== null && this.model !== undefined) {\n return this.model === this.trueLabel;\n }\n },\n isGroup: function isGroup() {\n var parent = this.$parent;\n while (parent) {\n if (parent.$options.componentName !== \'ElCheckboxGroup\') {\n parent = parent.$parent;\n } else {\n this._checkboxGroup = parent;\n return true;\n }\n }\n return false;\n },\n store: function store() {\n return this._checkboxGroup ? this._checkboxGroup.value : this.value;\n },\n\n\n /* used to make the isDisabled judgment under max/min props */\n isLimitDisabled: function isLimitDisabled() {\n var _checkboxGroup = this._checkboxGroup,\n max = _checkboxGroup.max,\n min = _checkboxGroup.min;\n\n return !!(max || min) && this.model.length >= max && !this.isChecked || this.model.length <= min && this.isChecked;\n },\n isDisabled: function isDisabled() {\n return this.isGroup ? this._checkboxGroup.disabled || this.disabled || (this.elForm || {}).disabled || this.isLimitDisabled : this.disabled || (this.elForm || {}).disabled;\n },\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n checkboxSize: function checkboxSize() {\n var temCheckboxSize = this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n return this.isGroup ? this._checkboxGroup.checkboxGroupSize || temCheckboxSize : temCheckboxSize;\n }\n },\n\n props: {\n value: {},\n label: {},\n indeterminate: Boolean,\n disabled: Boolean,\n checked: Boolean,\n name: String,\n trueLabel: [String, Number],\n falseLabel: [String, Number],\n id: String, /* 当indeterminate为真时,为controls提供相关连的checkbox的id,表明元素间的控制关系*/\n controls: String, /* 当indeterminate为真时,为controls提供相关连的checkbox的id,表明元素间的控制关系*/\n border: Boolean,\n size: String\n },\n\n methods: {\n addToStore: function addToStore() {\n if (Array.isArray(this.model) && this.model.indexOf(this.label) === -1) {\n this.model.push(this.label);\n } else {\n this.model = this.trueLabel || true;\n }\n },\n handleChange: function handleChange(ev) {\n var _this = this;\n\n if (this.isLimitExceeded) return;\n var value = void 0;\n if (ev.target.checked) {\n value = this.trueLabel === undefined ? true : this.trueLabel;\n } else {\n value = this.falseLabel === undefined ? false : this.falseLabel;\n }\n this.$emit(\'change\', value, ev);\n this.$nextTick(function () {\n if (_this.isGroup) {\n _this.dispatch(\'ElCheckboxGroup\', \'change\', [_this._checkboxGroup.value]);\n }\n });\n }\n },\n\n created: function created() {\n this.checked && this.addToStore();\n },\n mounted: function mounted() {\n // 为indeterminate元素 添加aria-controls 属性\n if (this.indeterminate) {\n this.$el.setAttribute(\'aria-controls\', this.controls);\n }\n },\n\n\n watch: {\n value: function value(_value) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', _value);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_checkboxvue_type_script_lang_js_ = (checkboxvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/checkbox/src/checkbox.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer["a" /* default */])(\n src_checkboxvue_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 api; }\ncomponent.options.__file = "packages/checkbox/src/checkbox.vue"\n/* harmony default export */ var src_checkbox = (component.exports);\n// CONCATENATED MODULE: ./packages/checkbox/index.js\n\n\n/* istanbul ignore next */\nsrc_checkbox.install = function (Vue) {\n Vue.component(src_checkbox.name, src_checkbox);\n};\n\n/* harmony default export */ var packages_checkbox = __webpack_exports__["default"] = (src_checkbox);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvY2hlY2tib3guanM/ZGNkYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxnQ0FBZ0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLGtCQUFrQjtBQUNsRjtBQUNBLHlEQUF5RCxjQUFjO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGlDQUFpQztBQUNsRix3SEFBd0gsbUJBQW1CLEVBQUU7QUFDN0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDBCQUEwQixFQUFFO0FBQy9ELHlDQUF5QyxlQUFlO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsK0RBQStEO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJGQUEyRiwyQkFBMkIsRUFBRTtBQUN4SDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7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QUFFUCxVQUFVIiwiZmlsZSI6ImRjZGMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2Rpc3QvXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDkxKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIG5vcm1hbGl6ZUNvbXBvbmVudDsgfSk7XG4vKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi9cblxuLy8gSU1QT1JUQU5UOiBEbyBOT1QgdXNlIEVTMjAxNSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgKGV4Y2VwdCBmb3IgbW9kdWxlcykuXG4vLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbFxuLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudCAoXG4gIHNjcmlwdEV4cG9ydHMsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmdW5jdGlvbmFsVGVtcGxhdGUsXG4gIGluamVjdFN0eWxlcyxcbiAgc2NvcGVJZCxcbiAgbW9kdWxlSWRlbnRpZmllciwgLyogc2VydmVyIG9ubHkgKi9cbiAgc2hhZG93TW9kZSAvKiB2dWUtY2xpIG9ubHkgKi9cbikge1xuICAvLyBWdWUuZXh0ZW5kIGNvbnN0cnVjdG9yIGV4cG9ydCBpbnRlcm9wXG4gIHZhciBvcHRpb25zID0gdHlwZW9mIHNjcmlwdEV4cG9ydHMgPT09ICdmdW5jdGlvbidcbiAgICA/IHNjcmlwdEV4cG9ydHMub3B0aW9uc1xuICAgIDogc2NyaXB0RXhwb3J0c1xuXG4gIC8vIHJlbmRlciBmdW5jdGlvbnNcbiAgaWYgKHJlbmRlcikge1xuICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyXG4gICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnNcbiAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWVcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGZ1bmN0aW9uYWxUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25hbCA9IHRydWVcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWRcbiAgfVxuXG4gIHZhciBob29rXG4gIGlmIChtb2R1bGVJZGVudGlmaWVyKSB7IC8vIHNlcnZlciBidWlsZFxuICAgIGhvb2sgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgLy8gMi4zIGluamVjdGlvblxuICAgICAgY29udGV4dCA9XG4gICAgICAgIGNvbnRleHQgfHwgLy8gY2FjaGVkIGNhbGxcbiAgICAgICAgKHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHQpIHx8IC8vIHN0YXRlZnVsXG4gICAgICAgICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC4kdm5vZGUgJiYgdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQpIC8vIGZ1bmN0aW9uYWxcbiAgICAgIC8vIDIuMiB3aXRoIHJ1bkluTmV3Q29udGV4dDogdHJ1ZVxuICAgICAgaWYgKCFjb250ZXh0ICYmIHR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb250ZXh0ID0gX19WVUVfU1NSX0NPTlRFWFRfX1xuICAgICAgfVxuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCBzdHlsZXNcbiAgICAgIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICAgICAgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgY29udGV4dClcbiAgICAgIH1cbiAgICAgIC8vIHJlZ2lzdGVyIGNvbXBvbmVudCBtb2R1bGUgaWRlbnRpZmllciBmb3IgYXN5bmMgY2h1bmsgaW5mZXJyZW5jZVxuICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMpIHtcbiAgICAgICAgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKG1vZHVsZUlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHVzZWQgYnkgc3NyIGluIGNhc2UgY29tcG9uZW50IGlzIGNhY2hlZCBhbmQgYmVmb3JlQ3JlYXRlXG4gICAgLy8gbmV2ZXIgZ2V0cyBjYWxsZWRcbiAgICBvcHRpb25zLl9zc3JSZWdpc3RlciA9IGhvb2tcbiAgfSBlbHNlIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICBob29rID0gc2hhZG93TW9kZVxuICAgICAgPyBmdW5jdGlvbiAoKSB7IGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIHRoaXMuJHJvb3QuJG9wdGlvbnMuc2hhZG93Um9vdCkgfVxuICAgICAgOiBpbmplY3RTdHlsZXNcbiAgfVxuXG4gIGlmIChob29rKSB7XG4gICAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgICAgLy8gZm9yIHRlbXBsYXRlLW9ubHkgaG90LXJlbG9hZCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgcmVuZGVyIGZuIGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRocm91Z2ggdGhlIG5vcm1hbGl6ZXJcbiAgICAgIG9wdGlvbnMuX2luamVjdFN0eWxlcyA9IGhvb2tcbiAgICAgIC8vIHJlZ2lzdGVyIGZvciBmdW5jdGlvYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlXG4gICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24gKGgsIGNvbnRleHQpIHtcbiAgICAgICAgaG9vay5jYWxsKGNvbnRleHQpXG4gICAgICAgIHJldHVybiBvcmlnaW5hbFJlbmRlcihoLCBjb250ZXh0KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiBhcyBiZWZvcmVDcmVhdGUgaG9va1xuICAgICAgdmFyIGV4aXN0aW5nID0gb3B0aW9ucy5iZWZvcmVDcmVhdGVcbiAgICAgIG9wdGlvbnMuYmVmb3JlQ3JlYXRlID0gZXhpc3RpbmdcbiAgICAgICAgPyBbXS5jb25jYXQoZXhpc3RpbmcsIGhvb2spXG4gICAgICAgIDogW2hvb2tdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHBvcnRzOiBzY3JpcHRFeHBvcnRzLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA0OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZW1pdHRlclwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDkxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWQwMzg3MDc0JlxudmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImxhYmVsXCIsXG4gICAge1xuICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY2hlY2tib3hcIixcbiAgICAgIGNsYXNzOiBbXG4gICAgICAgIF92bS5ib3JkZXIgJiYgX3ZtLmNoZWNrYm94U2l6ZVxuICAgICAgICAgID8gXCJlbC1jaGVja2JveC0tXCIgKyBfdm0uY2hlY2tib3hTaXplXG4gICAgICAgICAgOiBcIlwiLFxuICAgICAgICB7IFwiaXMtZGlzYWJsZWRcIjogX3ZtLmlzRGlzYWJsZWQgfSxcbiAgICAgICAgeyBcImlzLWJvcmRlcmVkXCI6IF92bS5ib3JkZXIgfSxcbiAgICAgICAgeyBcImlzLWNoZWNrZWRcIjogX3ZtLmlzQ2hlY2tlZCB9XG4gICAgICBdLFxuICAgICAgYXR0cnM6IHsgaWQ6IF92bS5pZCB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1jaGVja2JveF9faW5wdXRcIixcbiAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgXCJpcy1kaXNhYmxlZFwiOiBfdm0uaXNEaXNhYmxlZCxcbiAgICAgICAgICAgIFwiaXMtY2hlY2tlZFwiOiBfdm0uaXNDaGVja2VkLFxuICAgICAgICAgICAgXCJpcy1pbmRldGVybWluYXRlXCI6IF92bS5pbmRldGVybWluYXRlLFxuICAgICAgICAgICAgXCJpcy1mb2N1c1wiOiBfdm0uZm9jdXNcbiAgICAgICAgICB9LFxuICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICB0YWJpbmRleDogX3ZtLmluZGV0ZXJtaW5hdGUgPyAwIDogZmFsc2UsXG4gICAgICAgICAgICByb2xlOiBfdm0uaW5kZXRlcm1pbmF0ZSA/IFwiY2hlY2tib3hcIiA6IGZhbHNlLFxuICAgICAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjogX3ZtLmluZGV0ZXJtaW5hdGUgPyBcIm1peGVkXCIgOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFwic3BhblwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLWNoZWNrYm94X19pbm5lclwiIH0pLFxuICAgICAgICAgIF92bS50cnVlTGFiZWwgfHwgX3ZtLmZhbHNlTGFiZWxcbiAgICAgICAgICAgID8gX2MoXCJpbnB1dFwiLCB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLm1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcIm1vZGVsXCJcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWNoZWNrYm94X19vcmlnaW5hbFwiLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImNoZWNrYm94XCIsXG4gICAgICAgICAgICAgICAgICBcImFyaWEtaGlkZGVuXCI6IF92bS5pbmRldGVybWluYXRlID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBfdm0ubmFtZSxcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBfdm0uaXNEaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgIFwidHJ1ZS12YWx1ZVwiOiBfdm0udHJ1ZUxhYmVsLFxuICAgICAgICAgICAgICAgICAgXCJmYWxzZS12YWx1ZVwiOiBfdm0uZmFsc2VMYWJlbFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IEFycmF5LmlzQXJyYXkoX3ZtLm1vZGVsKVxuICAgICAgICAgICAgICAgICAgICA/IF92bS5faShfdm0ubW9kZWwsIG51bGwpID4gLTFcbiAgICAgICAgICAgICAgICAgICAgOiBfdm0uX3EoX3ZtLm1vZGVsLCBfdm0udHJ1ZUxhYmVsKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgIGNoYW5nZTogW1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgJCRhID0gX3ZtLm1vZGVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJCRlbCA9ICRldmVudC50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAkJGMgPSAkJGVsLmNoZWNrZWQgPyBfdm0udHJ1ZUxhYmVsIDogX3ZtLmZhbHNlTGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSgkJGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgJCR2ID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJCRpID0gX3ZtLl9pKCQkYSwgJCR2KVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQkZWwuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAkJGkgPCAwICYmIChfdm0ubW9kZWwgPSAkJGEuY29uY2F0KFskJHZdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICQkaSA+IC0xICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKF92bS5tb2RlbCA9ICQkYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsICQkaSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoJCRhLnNsaWNlKCQkaSArIDEpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLm1vZGVsID0gJCRjXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlQ2hhbmdlXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBfdm0uZm9jdXMgPSB0cnVlXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYmx1cjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5mb2N1cyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBfYyhcImlucHV0XCIsIHtcbiAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibW9kZWxcIixcbiAgICAgICAgICAgICAgICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0ubW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwibW9kZWxcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiZWwtY2hlY2tib3hfX29yaWdpbmFsXCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY2hlY2tib3hcIixcbiAgICAgICAgICAgICAgICAgIFwiYXJpYS1oaWRkZW5cIjogX3ZtLmluZGV0ZXJtaW5hdGUgPyBcInRydWVcIiA6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBfdm0uaXNEaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IF92bS5uYW1lXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5sYWJlbCxcbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IEFycmF5LmlzQXJyYXkoX3ZtLm1vZGVsKVxuICAgICAgICAgICAgICAgICAgICA/IF92bS5faShfdm0ubW9kZWwsIF92bS5sYWJlbCkgPiAtMVxuICAgICAgICAgICAgICAgICAgICA6IF92bS5tb2RlbFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgIGNoYW5nZTogW1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgJCRhID0gX3ZtLm1vZGVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJCRlbCA9ICRldmVudC50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAkJGMgPSAkJGVsLmNoZWNrZWQgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSgkJGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgJCR2ID0gX3ZtLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAkJGkgPSBfdm0uX2koJCRhLCAkJHYpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCRlbC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICQkaSA8IDAgJiYgKF92bS5tb2RlbCA9ICQkYS5jb25jYXQoWyQkdl0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJCRpID4gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3ZtLm1vZGVsID0gJCRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgJCRpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCgkJGEuc2xpY2UoJCRpICsgMSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0ubW9kZWwgPSAkJGNcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVDaGFuZ2VcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICBmb2N1czogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF92bS5mb2N1cyA9IHRydWVcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBibHVyOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZtLmZvY3VzID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgIF1cbiAgICAgICksXG4gICAgICBfdm0uJHNsb3RzLmRlZmF1bHQgfHwgX3ZtLmxhYmVsXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtY2hlY2tib3hfX2xhYmVsXCIgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX3ZtLl90KFwiZGVmYXVsdFwiKSxcbiAgICAgICAgICAgICAgIV92bS4kc2xvdHMuZGVmYXVsdCA/IFtfdm0uX3YoX3ZtLl9zKF92bS5sYWJlbCkpXSA6IF92bS5fZSgpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgOiBfdm0uX2UoKVxuICAgIF1cbiAgKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2NoZWNrYm94L3NyYy9jaGVja2JveC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZDAzODcwNzQmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZW1pdHRlclwiXG52YXIgZW1pdHRlcl8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xudmFyIGVtaXR0ZXJfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZW1pdHRlcl8pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNoZWNrYm94dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsQ2hlY2tib3gnLFxuXG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hXSxcblxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBlbEZvcm1JdGVtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH1cbiAgfSxcblxuICBjb21wb25lbnROYW1lOiAnRWxDaGVja2JveCcsXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZk1vZGVsOiBmYWxzZSxcbiAgICAgIGZvY3VzOiBmYWxzZSxcbiAgICAgIGlzTGltaXRFeGNlZWRlZDogZmFsc2VcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBtb2RlbDoge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzR3JvdXAgPyB0aGlzLnN0b3JlIDogdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkID8gdGhpcy52YWx1ZSA6IHRoaXMuc2VsZk1vZGVsO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbCkge1xuICAgICAgICBpZiAodGhpcy5pc0dyb3VwKSB7XG4gICAgICAgICAgdGhpcy5pc0xpbWl0RXhjZWVkZWQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLl9jaGVja2JveEdyb3VwLm1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbC5sZW5ndGggPCB0aGlzLl9jaGVja2JveEdyb3VwLm1pbiAmJiAodGhpcy5pc0xpbWl0RXhjZWVkZWQgPSB0cnVlKTtcblxuICAgICAgICAgIHRoaXMuX2NoZWNrYm94R3JvdXAubWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsLmxlbmd0aCA+IHRoaXMuX2NoZWNrYm94R3JvdXAubWF4ICYmICh0aGlzLmlzTGltaXRFeGNlZWRlZCA9IHRydWUpO1xuXG4gICAgICAgICAgdGhpcy5pc0xpbWl0RXhjZWVkZWQgPT09IGZhbHNlICYmIHRoaXMuZGlzcGF0Y2goJ0VsQ2hlY2tib3hHcm91cCcsICdpbnB1dCcsIFt2YWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG4gICAgICAgICAgdGhpcy5zZWxmTW9kZWwgPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgaXNDaGVja2VkOiBmdW5jdGlvbiBpc0NoZWNrZWQoKSB7XG4gICAgICBpZiAoe30udG9TdHJpbmcuY2FsbCh0aGlzLm1vZGVsKSA9PT0gJ1tvYmplY3QgQm9vbGVhbl0nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMubW9kZWwpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmluZGV4T2YodGhpcy5sYWJlbCkgPiAtMTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwgPT09IHRoaXMudHJ1ZUxhYmVsO1xuICAgICAgfVxuICAgIH0sXG4gICAgaXNHcm91cDogZnVuY3Rpb24gaXNHcm91cCgpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQuJG9wdGlvbnMuY29tcG9uZW50TmFtZSAhPT0gJ0VsQ2hlY2tib3hHcm91cCcpIHtcbiAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9jaGVja2JveEdyb3VwID0gcGFyZW50O1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBzdG9yZTogZnVuY3Rpb24gc3RvcmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hlY2tib3hHcm91cCA/IHRoaXMuX2NoZWNrYm94R3JvdXAudmFsdWUgOiB0aGlzLnZhbHVlO1xuICAgIH0sXG5cblxuICAgIC8qIHVzZWQgdG8gbWFrZSB0aGUgaXNEaXNhYmxlZCBqdWRnbWVudCB1bmRlciBtYXgvbWluIHByb3BzICovXG4gICAgaXNMaW1pdERpc2FibGVkOiBmdW5jdGlvbiBpc0xpbWl0RGlzYWJsZWQoKSB7XG4gICAgICB2YXIgX2NoZWNrYm94R3JvdXAgPSB0aGlzLl9jaGVja2JveEdyb3VwLFxuICAgICAgICAgIG1heCA9IF9jaGVja2JveEdyb3VwLm1heCxcbiAgICAgICAgICBtaW4gPSBfY2hlY2tib3hHcm91cC5taW47XG5cbiAgICAgIHJldHVybiAhIShtYXggfHwgbWluKSAmJiB0aGlzLm1vZGVsLmxlbmd0aCA+PSBtYXggJiYgIXRoaXMuaXNDaGVja2VkIHx8IHRoaXMubW9kZWwubGVuZ3RoIDw9IG1pbiAmJiB0aGlzLmlzQ2hlY2tlZDtcbiAgICB9LFxuICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uIGlzRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0dyb3VwID8gdGhpcy5fY2hlY2tib3hHcm91cC5kaXNhYmxlZCB8fCB0aGlzLmRpc2FibGVkIHx8ICh0aGlzLmVsRm9ybSB8fCB7fSkuZGlzYWJsZWQgfHwgdGhpcy5pc0xpbWl0RGlzYWJsZWQgOiB0aGlzLmRpc2FibGVkIHx8ICh0aGlzLmVsRm9ybSB8fCB7fSkuZGlzYWJsZWQ7XG4gICAgfSxcbiAgICBfZWxGb3JtSXRlbVNpemU6IGZ1bmN0aW9uIF9lbEZvcm1JdGVtU2l6ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5lbEZvcm1JdGVtIHx8IHt9KS5lbEZvcm1JdGVtU2l6ZTtcbiAgICB9LFxuICAgIGNoZWNrYm94U2l6ZTogZnVuY3Rpb24gY2hlY2tib3hTaXplKCkge1xuICAgICAgdmFyIHRlbUNoZWNrYm94U2l6ZSA9IHRoaXMuc2l6ZSB8fCB0aGlzLl9lbEZvcm1JdGVtU2l6ZSB8fCAodGhpcy4kRUxFTUVOVCB8fCB7fSkuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzLmlzR3JvdXAgPyB0aGlzLl9jaGVja2JveEdyb3VwLmNoZWNrYm94R3JvdXBTaXplIHx8IHRlbUNoZWNrYm94U2l6ZSA6IHRlbUNoZWNrYm94U2l6ZTtcbiAgICB9XG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICB2YWx1ZToge30sXG4gICAgbGFiZWw6IHt9LFxuICAgIGluZGV0ZXJtaW5hdGU6IEJvb2xlYW4sXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW4sXG4gICAgY2hlY2tlZDogQm9vbGVhbixcbiAgICBuYW1lOiBTdHJpbmcsXG4gICAgdHJ1ZUxhYmVsOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgIGZhbHNlTGFiZWw6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgaWQ6IFN0cmluZywgLyog5b2TaW5kZXRlcm1pbmF0ZeS4uuecn+aXtu+8jOS4umNvbnRyb2xz5o+Q5L6b55u45YWz6L+e55qEY2hlY2tib3jnmoRpZO+8jOihqOaYjuWFg+e0oOmXtOeahOaOp+WItuWFs+ezuyovXG4gICAgY29udHJvbHM6IFN0cmluZywgLyog5b2TaW5kZXRlcm1pbmF0ZeS4uuecn+aXtu+8jOS4umNvbnRyb2xz5o+Q5L6b55u45YWz6L+e55qEY2hlY2tib3jnmoRpZO+8jOihqOaYjuWFg+e0oOmXtOeahOaOp+WItuWFs+ezuyovXG4gICAgYm9yZGVyOiBCb29sZWFuLFxuICAgIHNpemU6IFN0cmluZ1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBhZGRUb1N0b3JlOiBmdW5jdGlvbiBhZGRUb1N0b3JlKCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5tb2RlbCkgJiYgdGhpcy5tb2RlbC5pbmRleE9mKHRoaXMubGFiZWwpID09PSAtMSkge1xuICAgICAgICB0aGlzLm1vZGVsLnB1c2godGhpcy5sYWJlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy50cnVlTGFiZWwgfHwgdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5pc0xpbWl0RXhjZWVkZWQpIHJldHVybjtcbiAgICAgIHZhciB2YWx1ZSA9IHZvaWQgMDtcbiAgICAgIGlmIChldi50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMudHJ1ZUxhYmVsID09PSB1bmRlZmluZWQgPyB0cnVlIDogdGhpcy50cnVlTGFiZWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuZmFsc2VMYWJlbCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLmZhbHNlTGFiZWw7XG4gICAgICB9XG4gICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWx1ZSwgZXYpO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuaXNHcm91cCkge1xuICAgICAgICAgIF90aGlzLmRpc3BhdGNoKCdFbENoZWNrYm94R3JvdXAnLCAnY2hhbmdlJywgW190aGlzLl9jaGVja2JveEdyb3VwLnZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuICAgIHRoaXMuY2hlY2tlZCAmJiB0aGlzLmFkZFRvU3RvcmUoKTtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICAvLyDkuLppbmRldGVybWluYXRl5YWD57SgIOa3u+WKoGFyaWEtY29udHJvbHMg5bGe5oCnXG4gICAgaWYgKHRoaXMuaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgdGhpcy4kZWwuc2V0QXR0cmlidXRlKCdhcmlhLWNvbnRyb2xzJywgdGhpcy5jb250cm9scyk7XG4gICAgfVxuICB9LFxuXG5cbiAgd2F0Y2g6IHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoX3ZhbHVlKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoKCdFbEZvcm1JdGVtJywgJ2VsLmZvcm0uY2hhbmdlJywgX3ZhbHVlKTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19jaGVja2JveHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChjaGVja2JveHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbnZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC9zcmMvY2hlY2tib3gudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gT2JqZWN0KGNvbXBvbmVudE5vcm1hbGl6ZXJbXCJhXCIgLyogZGVmYXVsdCAqL10pKFxuICBzcmNfY2hlY2tib3h2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhcGk7IH1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2hlY2tib3gvc3JjL2NoZWNrYm94LnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfY2hlY2tib3ggPSAoY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jaGVja2JveC9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5zcmNfY2hlY2tib3guaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChzcmNfY2hlY2tib3gubmFtZSwgc3JjX2NoZWNrYm94KTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2NoZWNrYm94ID0gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoc3JjX2NoZWNrYm94KTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///dcdc\n')},e450:function(module,exports,__webpack_require__){eval('module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: \'Module\' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, \'__esModule\', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === \'object\' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, \'default\', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != \'string\') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module[\'default\']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, \'a\', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = "/dist/";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 87);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 10:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("f3ad");\n\n/***/ }),\n\n/***/ 2:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("5924");\n\n/***/ }),\n\n/***/ 22:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("12f2");\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("8122");\n\n/***/ }),\n\n/***/ 30:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var element_ui_src_utils_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);\n/* harmony import */ var element_ui_src_utils_dom__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(element_ui_src_utils_dom__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var element_ui_src_utils_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);\n/* harmony import */ var element_ui_src_utils_util__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(element_ui_src_utils_util__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\n/* harmony default export */ __webpack_exports__["a"] = ({\n bind: function bind(el, binding, vnode) {\n var interval = null;\n var startTime = void 0;\n var maxIntervals = Object(element_ui_src_utils_util__WEBPACK_IMPORTED_MODULE_1__["isMac"])() ? 100 : 200;\n var handler = function handler() {\n return vnode.context[binding.expression].apply();\n };\n var clear = function clear() {\n if (Date.now() - startTime < maxIntervals) {\n handler();\n }\n clearInterval(interval);\n interval = null;\n };\n\n Object(element_ui_src_utils_dom__WEBPACK_IMPORTED_MODULE_0__["on"])(el, \'mousedown\', function (e) {\n if (e.button !== 0) return;\n startTime = Date.now();\n Object(element_ui_src_utils_dom__WEBPACK_IMPORTED_MODULE_0__["once"])(document, \'mouseup\', clear);\n clearInterval(interval);\n interval = setInterval(handler, maxIntervals);\n });\n }\n});\n\n/***/ }),\n\n/***/ 87:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input-number/src/input-number.vue?vue&type=template&id=42f8cf66&\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 class: [\n "el-input-number",\n _vm.inputNumberSize ? "el-input-number--" + _vm.inputNumberSize : "",\n { "is-disabled": _vm.inputNumberDisabled },\n { "is-without-controls": !_vm.controls },\n { "is-controls-right": _vm.controlsAtRight }\n ],\n on: {\n dragstart: function($event) {\n $event.preventDefault()\n }\n }\n },\n [\n _vm.controls\n ? _c(\n "span",\n {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.decrease,\n expression: "decrease"\n }\n ],\n staticClass: "el-input-number__decrease",\n class: { "is-disabled": _vm.minDisabled },\n attrs: { role: "button" },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n return _vm.decrease($event)\n }\n }\n },\n [\n _c("i", {\n class:\n "el-icon-" + (_vm.controlsAtRight ? "arrow-down" : "minus")\n })\n ]\n )\n : _vm._e(),\n _vm.controls\n ? _c(\n "span",\n {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.increase,\n expression: "increase"\n }\n ],\n staticClass: "el-input-number__increase",\n class: { "is-disabled": _vm.maxDisabled },\n attrs: { role: "button" },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n return _vm.increase($event)\n }\n }\n },\n [\n _c("i", {\n class: "el-icon-" + (_vm.controlsAtRight ? "arrow-up" : "plus")\n })\n ]\n )\n : _vm._e(),\n _c("el-input", {\n ref: "input",\n attrs: {\n value: _vm.displayValue,\n placeholder: _vm.placeholder,\n disabled: _vm.inputNumberDisabled,\n size: _vm.inputNumberSize,\n max: _vm.max,\n min: _vm.min,\n name: _vm.name,\n label: _vm.label\n },\n on: {\n blur: _vm.handleBlur,\n focus: _vm.handleFocus,\n input: _vm.handleInput,\n change: _vm.handleInputChange\n },\n nativeOn: {\n keydown: [\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "up", 38, $event.key, ["Up", "ArrowUp"])\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.increase($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "down", 40, $event.key, [\n "Down",\n "ArrowDown"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.decrease($event)\n }\n ]\n }\n })\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/input-number/src/input-number.vue?vue&type=template&id=42f8cf66&\n\n// EXTERNAL MODULE: external "element-ui/lib/input"\nvar input_ = __webpack_require__(10);\nvar input_default = /*#__PURE__*/__webpack_require__.n(input_);\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/focus"\nvar focus_ = __webpack_require__(22);\nvar focus_default = /*#__PURE__*/__webpack_require__.n(focus_);\n\n// EXTERNAL MODULE: ./src/directives/repeat-click.js\nvar repeat_click = __webpack_require__(30);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/input-number/src/input-number.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//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ var input_numbervue_type_script_lang_js_ = ({\n name: \'ElInputNumber\',\n mixins: [focus_default()(\'input\')],\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n directives: {\n repeatClick: repeat_click["a" /* default */]\n },\n components: {\n ElInput: input_default.a\n },\n props: {\n step: {\n type: Number,\n default: 1\n },\n stepStrictly: {\n type: Boolean,\n default: false\n },\n max: {\n type: Number,\n default: Infinity\n },\n min: {\n type: Number,\n default: -Infinity\n },\n value: {},\n disabled: Boolean,\n size: String,\n controls: {\n type: Boolean,\n default: true\n },\n controlsPosition: {\n type: String,\n default: \'\'\n },\n name: String,\n label: String,\n placeholder: String,\n precision: {\n type: Number,\n validator: function validator(val) {\n return val >= 0 && val === parseInt(val, 10);\n }\n }\n },\n data: function data() {\n return {\n currentValue: 0,\n userInput: null\n };\n },\n\n watch: {\n value: {\n immediate: true,\n handler: function handler(value) {\n var newVal = value === undefined ? value : Number(value);\n if (newVal !== undefined) {\n if (isNaN(newVal)) {\n return;\n }\n\n if (this.stepStrictly) {\n var stepPrecision = this.getPrecision(this.step);\n var precisionFactor = Math.pow(10, stepPrecision);\n newVal = Math.round(newVal / this.step) * precisionFactor * this.step / precisionFactor;\n }\n\n if (this.precision !== undefined) {\n newVal = this.toPrecision(newVal, this.precision);\n }\n }\n if (newVal >= this.max) newVal = this.max;\n if (newVal <= this.min) newVal = this.min;\n this.currentValue = newVal;\n this.userInput = null;\n this.$emit(\'input\', newVal);\n }\n }\n },\n computed: {\n minDisabled: function minDisabled() {\n return this._decrease(this.value, this.step) < this.min;\n },\n maxDisabled: function maxDisabled() {\n return this._increase(this.value, this.step) > this.max;\n },\n numPrecision: function numPrecision() {\n var value = this.value,\n step = this.step,\n getPrecision = this.getPrecision,\n precision = this.precision;\n\n var stepPrecision = getPrecision(step);\n if (precision !== undefined) {\n if (stepPrecision > precision) {\n console.warn(\'[Element Warn][InputNumber]precision should not be less than the decimal places of step\');\n }\n return precision;\n } else {\n return Math.max(getPrecision(value), stepPrecision);\n }\n },\n controlsAtRight: function controlsAtRight() {\n return this.controls && this.controlsPosition === \'right\';\n },\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n inputNumberSize: function inputNumberSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n inputNumberDisabled: function inputNumberDisabled() {\n return this.disabled || !!(this.elForm || {}).disabled;\n },\n displayValue: function displayValue() {\n if (this.userInput !== null) {\n return this.userInput;\n }\n\n var currentValue = this.currentValue;\n\n if (typeof currentValue === \'number\') {\n if (this.stepStrictly) {\n var stepPrecision = this.getPrecision(this.step);\n var precisionFactor = Math.pow(10, stepPrecision);\n currentValue = Math.round(currentValue / this.step) * precisionFactor * this.step / precisionFactor;\n }\n\n if (this.precision !== undefined) {\n currentValue = currentValue.toFixed(this.precision);\n }\n }\n\n return currentValue;\n }\n },\n methods: {\n toPrecision: function toPrecision(num, precision) {\n if (precision === undefined) precision = this.numPrecision;\n return parseFloat(Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision));\n },\n getPrecision: function getPrecision(value) {\n if (value === undefined) return 0;\n var valueString = value.toString();\n var dotPosition = valueString.indexOf(\'.\');\n var precision = 0;\n if (dotPosition !== -1) {\n precision = valueString.length - dotPosition - 1;\n }\n return precision;\n },\n _increase: function _increase(val, step) {\n if (typeof val !== \'number\' && val !== undefined) return this.currentValue;\n\n var precisionFactor = Math.pow(10, this.numPrecision);\n // Solve the accuracy problem of JS decimal calculation by converting the value to integer.\n return this.toPrecision((precisionFactor * val + precisionFactor * step) / precisionFactor);\n },\n _decrease: function _decrease(val, step) {\n if (typeof val !== \'number\' && val !== undefined) return this.currentValue;\n\n var precisionFactor = Math.pow(10, this.numPrecision);\n\n return this.toPrecision((precisionFactor * val - precisionFactor * step) / precisionFactor);\n },\n increase: function increase() {\n if (this.inputNumberDisabled || this.maxDisabled) return;\n var value = this.value || 0;\n var newVal = this._increase(value, this.step);\n this.setCurrentValue(newVal);\n },\n decrease: function decrease() {\n if (this.inputNumberDisabled || this.minDisabled) return;\n var value = this.value || 0;\n var newVal = this._decrease(value, this.step);\n this.setCurrentValue(newVal);\n },\n handleBlur: function handleBlur(event) {\n this.$emit(\'blur\', event);\n },\n handleFocus: function handleFocus(event) {\n this.$emit(\'focus\', event);\n },\n setCurrentValue: function setCurrentValue(newVal) {\n var oldVal = this.currentValue;\n if (typeof newVal === \'number\' && this.precision !== undefined) {\n newVal = this.toPrecision(newVal, this.precision);\n }\n if (newVal >= this.max) newVal = this.max;\n if (newVal <= this.min) newVal = this.min;\n if (oldVal === newVal) return;\n this.userInput = null;\n this.$emit(\'input\', newVal);\n this.$emit(\'change\', newVal, oldVal);\n this.currentValue = newVal;\n },\n handleInput: function handleInput(value) {\n this.userInput = value;\n },\n handleInputChange: function handleInputChange(value) {\n var newVal = value === \'\' ? undefined : Number(value);\n if (!isNaN(newVal) || value === \'\') {\n this.setCurrentValue(newVal);\n }\n this.userInput = null;\n },\n select: function select() {\n this.$refs.input.select();\n }\n },\n mounted: function mounted() {\n var innerInput = this.$refs.input.$refs.input;\n innerInput.setAttribute(\'role\', \'spinbutton\');\n innerInput.setAttribute(\'aria-valuemax\', this.max);\n innerInput.setAttribute(\'aria-valuemin\', this.min);\n innerInput.setAttribute(\'aria-valuenow\', this.currentValue);\n innerInput.setAttribute(\'aria-disabled\', this.inputNumberDisabled);\n },\n updated: function updated() {\n if (!this.$refs || !this.$refs.input) return;\n var innerInput = this.$refs.input.$refs.input;\n innerInput.setAttribute(\'aria-valuenow\', this.currentValue);\n }\n});\n// CONCATENATED MODULE: ./packages/input-number/src/input-number.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_input_numbervue_type_script_lang_js_ = (input_numbervue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/input-number/src/input-number.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer["a" /* default */])(\n src_input_numbervue_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 api; }\ncomponent.options.__file = "packages/input-number/src/input-number.vue"\n/* harmony default export */ var input_number = (component.exports);\n// CONCATENATED MODULE: ./packages/input-number/index.js\n\n\n/* istanbul ignore next */\ninput_number.install = function (Vue) {\n Vue.component(input_number.name, input_number);\n};\n\n/* harmony default export */ var packages_input_number = __webpack_exports__["default"] = (input_number);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvaW5wdXQtbnVtYmVyLmpzP2U0NTAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsZ0NBQWdDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxrQkFBa0I7QUFDbEY7QUFDQSx5REFBeUQsY0FBYztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQ0FBaUM7QUFDbEYsd0hBQXdILG1CQUFtQixFQUFFO0FBQzdJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQkFBMEIsRUFBRTtBQUMvRCx5Q0FBeUMsZUFBZTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtEQUErRDtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwyRkFBMkYsMkJBQTJCLEVBQUU7QUFDeEg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBc0I7O0FBRS9DLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFbkQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQTZCOztBQUV0RCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBMkI7O0FBRXBELE9BQU87O0FBRVA7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMseUNBQXlDO0FBQ2xELFNBQVMsdUNBQXVDO0FBQ2hELFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixpQ0FBaUM7QUFDdkQsc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGlDQUFpQztBQUN2RCxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxtQ0FBbUM7QUFDbkMsS0FBSztBQUNMO0FBQ0Esc0VBQXNFO0FBQ3RFLEtBQUs7QUFDTDtBQUNBLGtEQUFrRDtBQUNsRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxvSDtBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPOztBQUVQLFVBQVUiLCJmaWxlIjoiZTQ1MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC9cIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gODcpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoe1xuXG4vKioqLyAwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gbm9ybWFsaXplQ29tcG9uZW50OyB9KTtcbi8qIGdsb2JhbHMgX19WVUVfU1NSX0NPTlRFWFRfXyAqL1xuXG4vLyBJTVBPUlRBTlQ6IERvIE5PVCB1c2UgRVMyMDE1IGZlYXR1cmVzIGluIHRoaXMgZmlsZSAoZXhjZXB0IGZvciBtb2R1bGVzKS5cbi8vIFRoaXMgbW9kdWxlIGlzIGEgcnVudGltZSB1dGlsaXR5IGZvciBjbGVhbmVyIGNvbXBvbmVudCBtb2R1bGUgb3V0cHV0IGFuZCB3aWxsXG4vLyBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgd2VicGFjayB1c2VyIGJ1bmRsZS5cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50IChcbiAgc2NyaXB0RXhwb3J0cyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZ1bmN0aW9uYWxUZW1wbGF0ZSxcbiAgaW5qZWN0U3R5bGVzLFxuICBzY29wZUlkLFxuICBtb2R1bGVJZGVudGlmaWVyLCAvKiBzZXJ2ZXIgb25seSAqL1xuICBzaGFkb3dNb2RlIC8qIHZ1ZS1jbGkgb25seSAqL1xuKSB7XG4gIC8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3BcbiAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2NyaXB0RXhwb3J0cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2NyaXB0RXhwb3J0cy5vcHRpb25zXG4gICAgOiBzY3JpcHRFeHBvcnRzXG5cbiAgLy8gcmVuZGVyIGZ1bmN0aW9uc1xuICBpZiAocmVuZGVyKSB7XG4gICAgb3B0aW9ucy5yZW5kZXIgPSByZW5kZXJcbiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IHN0YXRpY1JlbmRlckZuc1xuICAgIG9wdGlvbnMuX2NvbXBpbGVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gZnVuY3Rpb25hbCB0ZW1wbGF0ZVxuICBpZiAoZnVuY3Rpb25hbFRlbXBsYXRlKSB7XG4gICAgb3B0aW9ucy5mdW5jdGlvbmFsID0gdHJ1ZVxuICB9XG5cbiAgLy8gc2NvcGVkSWRcbiAgaWYgKHNjb3BlSWQpIHtcbiAgICBvcHRpb25zLl9zY29wZUlkID0gJ2RhdGEtdi0nICsgc2NvcGVJZFxuICB9XG5cbiAgdmFyIGhvb2tcbiAgaWYgKG1vZHVsZUlkZW50aWZpZXIpIHsgLy8gc2VydmVyIGJ1aWxkXG4gICAgaG9vayA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAvLyAyLjMgaW5qZWN0aW9uXG4gICAgICBjb250ZXh0ID1cbiAgICAgICAgY29udGV4dCB8fCAvLyBjYWNoZWQgY2FsbFxuICAgICAgICAodGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dCkgfHwgLy8gc3RhdGVmdWxcbiAgICAgICAgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LiR2bm9kZSAmJiB0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCkgLy8gZnVuY3Rpb25hbFxuICAgICAgLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlXG4gICAgICBpZiAoIWNvbnRleHQgJiYgdHlwZW9mIF9fVlVFX1NTUl9DT05URVhUX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnRleHQgPSBfX1ZVRV9TU1JfQ09OVEVYVF9fXG4gICAgICB9XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHN0eWxlc1xuICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCBjb250ZXh0KVxuICAgICAgfVxuICAgICAgLy8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlXG4gICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykge1xuICAgICAgICBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcilcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGVcbiAgICAvLyBuZXZlciBnZXRzIGNhbGxlZFxuICAgIG9wdGlvbnMuX3NzclJlZ2lzdGVyID0gaG9va1xuICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykge1xuICAgIGhvb2sgPSBzaGFkb3dNb2RlXG4gICAgICA/IGZ1bmN0aW9uICgpIHsgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgdGhpcy4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290KSB9XG4gICAgICA6IGluamVjdFN0eWxlc1xuICB9XG5cbiAgaWYgKGhvb2spIHtcbiAgICBpZiAob3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndFxuICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgbm9ybWFsaXplclxuICAgICAgb3B0aW9ucy5faW5qZWN0U3R5bGVzID0gaG9va1xuICAgICAgLy8gcmVnaXN0ZXIgZm9yIGZ1bmN0aW9hbCBjb21wb25lbnQgaW4gdnVlIGZpbGVcbiAgICAgIHZhciBvcmlnaW5hbFJlbmRlciA9IG9wdGlvbnMucmVuZGVyXG4gICAgICBvcHRpb25zLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcldpdGhTdHlsZUluamVjdGlvbiAoaCwgY29udGV4dCkge1xuICAgICAgICBob29rLmNhbGwoY29udGV4dClcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsIGNvbnRleHQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgcmVnaXN0cmF0aW9uIGFzIGJlZm9yZUNyZWF0ZSBob29rXG4gICAgICB2YXIgZXhpc3RpbmcgPSBvcHRpb25zLmJlZm9yZUNyZWF0ZVxuICAgICAgb3B0aW9ucy5iZWZvcmVDcmVhdGUgPSBleGlzdGluZ1xuICAgICAgICA/IFtdLmNvbmNhdChleGlzdGluZywgaG9vaylcbiAgICAgICAgOiBbaG9va11cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDEwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9pbnB1dFwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDI6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL2RvbVwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDIyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZm9jdXNcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGVsZW1lbnRfdWlfc3JjX3V0aWxzX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBlbGVtZW50X3VpX3NyY191dGlsc19kb21fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihlbGVtZW50X3VpX3NyY191dGlsc19kb21fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgZWxlbWVudF91aV9zcmNfdXRpbHNfdXRpbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBlbGVtZW50X3VpX3NyY191dGlsc191dGlsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZWxlbWVudF91aV9zcmNfdXRpbHNfdXRpbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTtcblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoe1xuICBiaW5kOiBmdW5jdGlvbiBiaW5kKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIHZhciBpbnRlcnZhbCA9IG51bGw7XG4gICAgdmFyIHN0YXJ0VGltZSA9IHZvaWQgMDtcbiAgICB2YXIgbWF4SW50ZXJ2YWxzID0gT2JqZWN0KGVsZW1lbnRfdWlfc3JjX3V0aWxzX3V0aWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImlzTWFjXCJdKSgpID8gMTAwIDogMjAwO1xuICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAgICAgIHJldHVybiB2bm9kZS5jb250ZXh0W2JpbmRpbmcuZXhwcmVzc2lvbl0uYXBwbHkoKTtcbiAgICB9O1xuICAgIHZhciBjbGVhciA9IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBtYXhJbnRlcnZhbHMpIHtcbiAgICAgICAgaGFuZGxlcigpO1xuICAgICAgfVxuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICBpbnRlcnZhbCA9IG51bGw7XG4gICAgfTtcblxuICAgIE9iamVjdChlbGVtZW50X3VpX3NyY191dGlsc19kb21fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcIm9uXCJdKShlbCwgJ21vdXNlZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBPYmplY3QoZWxlbWVudF91aV9zcmNfdXRpbHNfZG9tX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJvbmNlXCJdKShkb2N1bWVudCwgJ21vdXNldXAnLCBjbGVhcik7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoaGFuZGxlciwgbWF4SW50ZXJ2YWxzKTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4Nzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaW5wdXQtbnVtYmVyL3NyYy9pbnB1dC1udW1iZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQyZjhjZjY2JlxudmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIGNsYXNzOiBbXG4gICAgICAgIFwiZWwtaW5wdXQtbnVtYmVyXCIsXG4gICAgICAgIF92bS5pbnB1dE51bWJlclNpemUgPyBcImVsLWlucHV0LW51bWJlci0tXCIgKyBfdm0uaW5wdXROdW1iZXJTaXplIDogXCJcIixcbiAgICAgICAgeyBcImlzLWRpc2FibGVkXCI6IF92bS5pbnB1dE51bWJlckRpc2FibGVkIH0sXG4gICAgICAgIHsgXCJpcy13aXRob3V0LWNvbnRyb2xzXCI6ICFfdm0uY29udHJvbHMgfSxcbiAgICAgICAgeyBcImlzLWNvbnRyb2xzLXJpZ2h0XCI6IF92bS5jb250cm9sc0F0UmlnaHQgfVxuICAgICAgXSxcbiAgICAgIG9uOiB7XG4gICAgICAgIGRyYWdzdGFydDogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX3ZtLmNvbnRyb2xzXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwicmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtcmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmRlY3JlYXNlLFxuICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJkZWNyZWFzZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1pbnB1dC1udW1iZXJfX2RlY3JlYXNlXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiB7IFwiaXMtZGlzYWJsZWRcIjogX3ZtLm1pbkRpc2FibGVkIH0sXG4gICAgICAgICAgICAgIGF0dHJzOiB7IHJvbGU6IFwiYnV0dG9uXCIgfSxcbiAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICBrZXlkb3duOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzLCAkZXZlbnQua2V5LCBcIkVudGVyXCIpXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uZGVjcmVhc2UoJGV2ZW50KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICBjbGFzczpcbiAgICAgICAgICAgICAgICAgIFwiZWwtaWNvbi1cIiArIChfdm0uY29udHJvbHNBdFJpZ2h0ID8gXCJhcnJvdy1kb3duXCIgOiBcIm1pbnVzXCIpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgX3ZtLmNvbnRyb2xzXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwicmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtcmVwZWF0LWNsaWNrXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmluY3JlYXNlLFxuICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJpbmNyZWFzZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1pbnB1dC1udW1iZXJfX2luY3JlYXNlXCIsXG4gICAgICAgICAgICAgIGNsYXNzOiB7IFwiaXMtZGlzYWJsZWRcIjogX3ZtLm1heERpc2FibGVkIH0sXG4gICAgICAgICAgICAgIGF0dHJzOiB7IHJvbGU6IFwiYnV0dG9uXCIgfSxcbiAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICBrZXlkb3duOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzLCAkZXZlbnQua2V5LCBcIkVudGVyXCIpXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uaW5jcmVhc2UoJGV2ZW50KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICBjbGFzczogXCJlbC1pY29uLVwiICsgKF92bS5jb250cm9sc0F0UmlnaHQgPyBcImFycm93LXVwXCIgOiBcInBsdXNcIilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfYyhcImVsLWlucHV0XCIsIHtcbiAgICAgICAgcmVmOiBcImlucHV0XCIsXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdmFsdWU6IF92bS5kaXNwbGF5VmFsdWUsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IF92bS5wbGFjZWhvbGRlcixcbiAgICAgICAgICBkaXNhYmxlZDogX3ZtLmlucHV0TnVtYmVyRGlzYWJsZWQsXG4gICAgICAgICAgc2l6ZTogX3ZtLmlucHV0TnVtYmVyU2l6ZSxcbiAgICAgICAgICBtYXg6IF92bS5tYXgsXG4gICAgICAgICAgbWluOiBfdm0ubWluLFxuICAgICAgICAgIG5hbWU6IF92bS5uYW1lLFxuICAgICAgICAgIGxhYmVsOiBfdm0ubGFiZWxcbiAgICAgICAgfSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBibHVyOiBfdm0uaGFuZGxlQmx1cixcbiAgICAgICAgICBmb2N1czogX3ZtLmhhbmRsZUZvY3VzLFxuICAgICAgICAgIGlucHV0OiBfdm0uaGFuZGxlSW5wdXQsXG4gICAgICAgICAgY2hhbmdlOiBfdm0uaGFuZGxlSW5wdXRDaGFuZ2VcbiAgICAgICAgfSxcbiAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICBrZXlkb3duOiBbXG4gICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInVwXCIsIDM4LCAkZXZlbnQua2V5LCBbXCJVcFwiLCBcIkFycm93VXBcIl0pXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgcmV0dXJuIF92bS5pbmNyZWFzZSgkZXZlbnQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJkb3duXCIsIDQwLCAkZXZlbnQua2V5LCBbXG4gICAgICAgICAgICAgICAgICBcIkRvd25cIixcbiAgICAgICAgICAgICAgICAgIFwiQXJyb3dEb3duXCJcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgIHJldHVybiBfdm0uZGVjcmVhc2UoJGV2ZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICBdLFxuICAgIDFcbiAgKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0LW51bWJlci9zcmMvaW5wdXQtbnVtYmVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00MmY4Y2Y2NiZcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL2lucHV0XCJcbnZhciBpbnB1dF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbnZhciBpbnB1dF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihpbnB1dF8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2ZvY3VzXCJcbnZhciBmb2N1c18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcbnZhciBmb2N1c19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihmb2N1c18pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vc3JjL2RpcmVjdGl2ZXMvcmVwZWF0LWNsaWNrLmpzXG52YXIgcmVwZWF0X2NsaWNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2lucHV0LW51bWJlci9zcmMvaW5wdXQtbnVtYmVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGlucHV0X251bWJlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbElucHV0TnVtYmVyJyxcbiAgbWl4aW5zOiBbZm9jdXNfZGVmYXVsdCgpKCdpbnB1dCcpXSxcbiAgaW5qZWN0OiB7XG4gICAgZWxGb3JtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgZWxGb3JtSXRlbToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9XG4gIH0sXG4gIGRpcmVjdGl2ZXM6IHtcbiAgICByZXBlYXRDbGljazogcmVwZWF0X2NsaWNrW1wiYVwiIC8qIGRlZmF1bHQgKi9dXG4gIH0sXG4gIGNvbXBvbmVudHM6IHtcbiAgICBFbElucHV0OiBpbnB1dF9kZWZhdWx0LmFcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICBzdGVwOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAxXG4gICAgfSxcbiAgICBzdGVwU3RyaWN0bHk6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgbWF4OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiBJbmZpbml0eVxuICAgIH0sXG4gICAgbWluOiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAtSW5maW5pdHlcbiAgICB9LFxuICAgIHZhbHVlOiB7fSxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgY29udHJvbHM6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjb250cm9sc1Bvc2l0aW9uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH0sXG4gICAgbmFtZTogU3RyaW5nLFxuICAgIGxhYmVsOiBTdHJpbmcsXG4gICAgcGxhY2Vob2xkZXI6IFN0cmluZyxcbiAgICBwcmVjaXNpb246IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsID49IDAgJiYgdmFsID09PSBwYXJzZUludCh2YWwsIDEwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogMCxcbiAgICAgIHVzZXJJbnB1dDogbnVsbFxuICAgIH07XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICB2YWx1ZToge1xuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcih2YWx1ZSkge1xuICAgICAgICB2YXIgbmV3VmFsID0gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgaWYgKG5ld1ZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGlzTmFOKG5ld1ZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zdGVwU3RyaWN0bHkpIHtcbiAgICAgICAgICAgIHZhciBzdGVwUHJlY2lzaW9uID0gdGhpcy5nZXRQcmVjaXNpb24odGhpcy5zdGVwKTtcbiAgICAgICAgICAgIHZhciBwcmVjaXNpb25GYWN0b3IgPSBNYXRoLnBvdygxMCwgc3RlcFByZWNpc2lvbik7XG4gICAgICAgICAgICBuZXdWYWwgPSBNYXRoLnJvdW5kKG5ld1ZhbCAvIHRoaXMuc3RlcCkgKiBwcmVjaXNpb25GYWN0b3IgKiB0aGlzLnN0ZXAgLyBwcmVjaXNpb25GYWN0b3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbCA9IHRoaXMudG9QcmVjaXNpb24obmV3VmFsLCB0aGlzLnByZWNpc2lvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdWYWwgPj0gdGhpcy5tYXgpIG5ld1ZhbCA9IHRoaXMubWF4O1xuICAgICAgICBpZiAobmV3VmFsIDw9IHRoaXMubWluKSBuZXdWYWwgPSB0aGlzLm1pbjtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBuZXdWYWw7XG4gICAgICAgIHRoaXMudXNlcklucHV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBuZXdWYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICBtaW5EaXNhYmxlZDogZnVuY3Rpb24gbWluRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVjcmVhc2UodGhpcy52YWx1ZSwgdGhpcy5zdGVwKSA8IHRoaXMubWluO1xuICAgIH0sXG4gICAgbWF4RGlzYWJsZWQ6IGZ1bmN0aW9uIG1heERpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2luY3JlYXNlKHRoaXMudmFsdWUsIHRoaXMuc3RlcCkgPiB0aGlzLm1heDtcbiAgICB9LFxuICAgIG51bVByZWNpc2lvbjogZnVuY3Rpb24gbnVtUHJlY2lzaW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSxcbiAgICAgICAgICBzdGVwID0gdGhpcy5zdGVwLFxuICAgICAgICAgIGdldFByZWNpc2lvbiA9IHRoaXMuZ2V0UHJlY2lzaW9uLFxuICAgICAgICAgIHByZWNpc2lvbiA9IHRoaXMucHJlY2lzaW9uO1xuXG4gICAgICB2YXIgc3RlcFByZWNpc2lvbiA9IGdldFByZWNpc2lvbihzdGVwKTtcbiAgICAgIGlmIChwcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RlcFByZWNpc2lvbiA+IHByZWNpc2lvbikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW0VsZW1lbnQgV2Fybl1bSW5wdXROdW1iZXJdcHJlY2lzaW9uIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHRoZSBkZWNpbWFsIHBsYWNlcyBvZiBzdGVwJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZWNpc2lvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChnZXRQcmVjaXNpb24odmFsdWUpLCBzdGVwUHJlY2lzaW9uKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbnRyb2xzQXRSaWdodDogZnVuY3Rpb24gY29udHJvbHNBdFJpZ2h0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udHJvbHMgJiYgdGhpcy5jb250cm9sc1Bvc2l0aW9uID09PSAncmlnaHQnO1xuICAgIH0sXG4gICAgX2VsRm9ybUl0ZW1TaXplOiBmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZWxGb3JtSXRlbSB8fCB7fSkuZWxGb3JtSXRlbVNpemU7XG4gICAgfSxcbiAgICBpbnB1dE51bWJlclNpemU6IGZ1bmN0aW9uIGlucHV0TnVtYmVyU2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgfHwgdGhpcy5fZWxGb3JtSXRlbVNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7XG4gICAgfSxcbiAgICBpbnB1dE51bWJlckRpc2FibGVkOiBmdW5jdGlvbiBpbnB1dE51bWJlckRpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgISEodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkO1xuICAgIH0sXG4gICAgZGlzcGxheVZhbHVlOiBmdW5jdGlvbiBkaXNwbGF5VmFsdWUoKSB7XG4gICAgICBpZiAodGhpcy51c2VySW5wdXQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlcklucHV0O1xuICAgICAgfVxuXG4gICAgICB2YXIgY3VycmVudFZhbHVlID0gdGhpcy5jdXJyZW50VmFsdWU7XG5cbiAgICAgIGlmICh0eXBlb2YgY3VycmVudFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAodGhpcy5zdGVwU3RyaWN0bHkpIHtcbiAgICAgICAgICB2YXIgc3RlcFByZWNpc2lvbiA9IHRoaXMuZ2V0UHJlY2lzaW9uKHRoaXMuc3RlcCk7XG4gICAgICAgICAgdmFyIHByZWNpc2lvbkZhY3RvciA9IE1hdGgucG93KDEwLCBzdGVwUHJlY2lzaW9uKTtcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBNYXRoLnJvdW5kKGN1cnJlbnRWYWx1ZSAvIHRoaXMuc3RlcCkgKiBwcmVjaXNpb25GYWN0b3IgKiB0aGlzLnN0ZXAgLyBwcmVjaXNpb25GYWN0b3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS50b0ZpeGVkKHRoaXMucHJlY2lzaW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIHRvUHJlY2lzaW9uOiBmdW5jdGlvbiB0b1ByZWNpc2lvbihudW0sIHByZWNpc2lvbikge1xuICAgICAgaWYgKHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkKSBwcmVjaXNpb24gPSB0aGlzLm51bVByZWNpc2lvbjtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KE1hdGgucm91bmQobnVtICogTWF0aC5wb3coMTAsIHByZWNpc2lvbikpIC8gTWF0aC5wb3coMTAsIHByZWNpc2lvbikpO1xuICAgIH0sXG4gICAgZ2V0UHJlY2lzaW9uOiBmdW5jdGlvbiBnZXRQcmVjaXNpb24odmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgICAgIHZhciB2YWx1ZVN0cmluZyA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICB2YXIgZG90UG9zaXRpb24gPSB2YWx1ZVN0cmluZy5pbmRleE9mKCcuJyk7XG4gICAgICB2YXIgcHJlY2lzaW9uID0gMDtcbiAgICAgIGlmIChkb3RQb3NpdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgcHJlY2lzaW9uID0gdmFsdWVTdHJpbmcubGVuZ3RoIC0gZG90UG9zaXRpb24gLSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByZWNpc2lvbjtcbiAgICB9LFxuICAgIF9pbmNyZWFzZTogZnVuY3Rpb24gX2luY3JlYXNlKHZhbCwgc3RlcCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWwgIT09ICdudW1iZXInICYmIHZhbCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWU7XG5cbiAgICAgIHZhciBwcmVjaXNpb25GYWN0b3IgPSBNYXRoLnBvdygxMCwgdGhpcy5udW1QcmVjaXNpb24pO1xuICAgICAgLy8gU29sdmUgdGhlIGFjY3VyYWN5IHByb2JsZW0gb2YgSlMgZGVjaW1hbCBjYWxjdWxhdGlvbiBieSBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBpbnRlZ2VyLlxuICAgICAgcmV0dXJuIHRoaXMudG9QcmVjaXNpb24oKHByZWNpc2lvbkZhY3RvciAqIHZhbCArIHByZWNpc2lvbkZhY3RvciAqIHN0ZXApIC8gcHJlY2lzaW9uRmFjdG9yKTtcbiAgICB9LFxuICAgIF9kZWNyZWFzZTogZnVuY3Rpb24gX2RlY3JlYXNlKHZhbCwgc3RlcCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWwgIT09ICdudW1iZXInICYmIHZhbCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWU7XG5cbiAgICAgIHZhciBwcmVjaXNpb25GYWN0b3IgPSBNYXRoLnBvdygxMCwgdGhpcy5udW1QcmVjaXNpb24pO1xuXG4gICAgICByZXR1cm4gdGhpcy50b1ByZWNpc2lvbigocHJlY2lzaW9uRmFjdG9yICogdmFsIC0gcHJlY2lzaW9uRmFjdG9yICogc3RlcCkgLyBwcmVjaXNpb25GYWN0b3IpO1xuICAgIH0sXG4gICAgaW5jcmVhc2U6IGZ1bmN0aW9uIGluY3JlYXNlKCkge1xuICAgICAgaWYgKHRoaXMuaW5wdXROdW1iZXJEaXNhYmxlZCB8fCB0aGlzLm1heERpc2FibGVkKSByZXR1cm47XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlIHx8IDA7XG4gICAgICB2YXIgbmV3VmFsID0gdGhpcy5faW5jcmVhc2UodmFsdWUsIHRoaXMuc3RlcCk7XG4gICAgICB0aGlzLnNldEN1cnJlbnRWYWx1ZShuZXdWYWwpO1xuICAgIH0sXG4gICAgZGVjcmVhc2U6IGZ1bmN0aW9uIGRlY3JlYXNlKCkge1xuICAgICAgaWYgKHRoaXMuaW5wdXROdW1iZXJEaXNhYmxlZCB8fCB0aGlzLm1pbkRpc2FibGVkKSByZXR1cm47XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlIHx8IDA7XG4gICAgICB2YXIgbmV3VmFsID0gdGhpcy5fZGVjcmVhc2UodmFsdWUsIHRoaXMuc3RlcCk7XG4gICAgICB0aGlzLnNldEN1cnJlbnRWYWx1ZShuZXdWYWwpO1xuICAgIH0sXG4gICAgaGFuZGxlQmx1cjogZnVuY3Rpb24gaGFuZGxlQmx1cihldmVudCkge1xuICAgICAgdGhpcy4kZW1pdCgnYmx1cicsIGV2ZW50KTtcbiAgICB9LFxuICAgIGhhbmRsZUZvY3VzOiBmdW5jdGlvbiBoYW5kbGVGb2N1cyhldmVudCkge1xuICAgICAgdGhpcy4kZW1pdCgnZm9jdXMnLCBldmVudCk7XG4gICAgfSxcbiAgICBzZXRDdXJyZW50VmFsdWU6IGZ1bmN0aW9uIHNldEN1cnJlbnRWYWx1ZShuZXdWYWwpIHtcbiAgICAgIHZhciBvbGRWYWwgPSB0aGlzLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgbmV3VmFsID09PSAnbnVtYmVyJyAmJiB0aGlzLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbCA9IHRoaXMudG9QcmVjaXNpb24obmV3VmFsLCB0aGlzLnByZWNpc2lvbik7XG4gICAgICB9XG4gICAgICBpZiAobmV3VmFsID49IHRoaXMubWF4KSBuZXdWYWwgPSB0aGlzLm1heDtcbiAgICAgIGlmIChuZXdWYWwgPD0gdGhpcy5taW4pIG5ld1ZhbCA9IHRoaXMubWluO1xuICAgICAgaWYgKG9sZFZhbCA9PT0gbmV3VmFsKSByZXR1cm47XG4gICAgICB0aGlzLnVzZXJJbnB1dCA9IG51bGw7XG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIG5ld1ZhbCk7XG4gICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBuZXdWYWwsIG9sZFZhbCk7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IG5ld1ZhbDtcbiAgICB9LFxuICAgIGhhbmRsZUlucHV0OiBmdW5jdGlvbiBoYW5kbGVJbnB1dCh2YWx1ZSkge1xuICAgICAgdGhpcy51c2VySW5wdXQgPSB2YWx1ZTtcbiAgICB9LFxuICAgIGhhbmRsZUlucHV0Q2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVJbnB1dENoYW5nZSh2YWx1ZSkge1xuICAgICAgdmFyIG5ld1ZhbCA9IHZhbHVlID09PSAnJyA/IHVuZGVmaW5lZCA6IE51bWJlcih2YWx1ZSk7XG4gICAgICBpZiAoIWlzTmFOKG5ld1ZhbCkgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHRoaXMuc2V0Q3VycmVudFZhbHVlKG5ld1ZhbCk7XG4gICAgICB9XG4gICAgICB0aGlzLnVzZXJJbnB1dCA9IG51bGw7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdCgpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuc2VsZWN0KCk7XG4gICAgfVxuICB9LFxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBpbm5lcklucHV0ID0gdGhpcy4kcmVmcy5pbnB1dC4kcmVmcy5pbnB1dDtcbiAgICBpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgncm9sZScsICdzcGluYnV0dG9uJyk7XG4gICAgaW5uZXJJbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtYXgnLCB0aGlzLm1heCk7XG4gICAgaW5uZXJJbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtaW4nLCB0aGlzLm1pbik7XG4gICAgaW5uZXJJbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLmN1cnJlbnRWYWx1ZSk7XG4gICAgaW5uZXJJbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCB0aGlzLmlucHV0TnVtYmVyRGlzYWJsZWQpO1xuICB9LFxuICB1cGRhdGVkOiBmdW5jdGlvbiB1cGRhdGVkKCkge1xuICAgIGlmICghdGhpcy4kcmVmcyB8fCAhdGhpcy4kcmVmcy5pbnB1dCkgcmV0dXJuO1xuICAgIHZhciBpbm5lcklucHV0ID0gdGhpcy4kcmVmcy5pbnB1dC4kcmVmcy5pbnB1dDtcbiAgICBpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMuY3VycmVudFZhbHVlKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0LW51bWJlci9zcmMvaW5wdXQtbnVtYmVyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfaW5wdXRfbnVtYmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKGlucHV0X251bWJlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbnZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbnB1dC1udW1iZXIvc3JjL2lucHV0LW51bWJlci52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBjb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplcltcImFcIiAvKiBkZWZhdWx0ICovXSkoXG4gIHNyY19pbnB1dF9udW1iZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhcGk7IH1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvaW5wdXQtbnVtYmVyL3NyYy9pbnB1dC1udW1iZXIudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGlucHV0X251bWJlciA9IChjb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0LW51bWJlci9pbmRleC5qc1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5pbnB1dF9udW1iZXIuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChpbnB1dF9udW1iZXIubmFtZSwgaW5wdXRfbnVtYmVyKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHBhY2thZ2VzX2lucHV0X251bWJlciA9IF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKGlucHV0X251bWJlcik7XG5cbi8qKiovIH0pXG5cbi8qKioqKiovIH0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///e450\n')},e452:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nvar aria = aria || {};\n\naria.Utils = aria.Utils || {};\n\n/**\n * @desc Set focus on descendant nodes until the first focusable element is\n * found.\n * @param element\n * DOM node for which to find the first focusable descendant.\n * @returns\n * true if a focusable element is found and focus is set.\n */\naria.Utils.focusFirstDescendant = function (element) {\n for (var i = 0; i < element.childNodes.length; i++) {\n var child = element.childNodes[i];\n if (aria.Utils.attemptFocus(child) || aria.Utils.focusFirstDescendant(child)) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * @desc Find the last descendant node that is focusable.\n * @param element\n * DOM node for which to find the last focusable descendant.\n * @returns\n * true if a focusable element is found and focus is set.\n */\n\naria.Utils.focusLastDescendant = function (element) {\n for (var i = element.childNodes.length - 1; i >= 0; i--) {\n var child = element.childNodes[i];\n if (aria.Utils.attemptFocus(child) || aria.Utils.focusLastDescendant(child)) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * @desc Set Attempt to set focus on the current node.\n * @param element\n * The node to attempt to focus on.\n * @returns\n * true if element is focused.\n */\naria.Utils.attemptFocus = function (element) {\n if (!aria.Utils.isFocusable(element)) {\n return false;\n }\n aria.Utils.IgnoreUtilFocusChanges = true;\n try {\n element.focus();\n } catch (e) {}\n aria.Utils.IgnoreUtilFocusChanges = false;\n return document.activeElement === element;\n};\n\naria.Utils.isFocusable = function (element) {\n if (element.tabIndex > 0 || element.tabIndex === 0 && element.getAttribute('tabIndex') !== null) {\n return true;\n }\n\n if (element.disabled) {\n return false;\n }\n\n switch (element.nodeName) {\n case 'A':\n return !!element.href && element.rel !== 'ignore';\n case 'INPUT':\n return element.type !== 'hidden' && element.type !== 'file';\n case 'BUTTON':\n case 'SELECT':\n case 'TEXTAREA':\n return true;\n default:\n return false;\n }\n};\n\n/**\n * 触发一个事件\n * mouseenter, mouseleave, mouseover, keyup, change, click 等\n * @param {Element} elm\n * @param {String} name\n * @param {*} opts\n */\naria.Utils.triggerEvent = function (elm, name) {\n var eventName = void 0;\n\n if (/^mouse|click/.test(name)) {\n eventName = 'MouseEvents';\n } else if (/^key/.test(name)) {\n eventName = 'KeyboardEvent';\n } else {\n eventName = 'HTMLEvents';\n }\n var evt = document.createEvent(eventName);\n\n for (var _len = arguments.length, opts = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n opts[_key - 2] = arguments[_key];\n }\n\n evt.initEvent.apply(evt, [name].concat(opts));\n elm.dispatchEvent ? elm.dispatchEvent(evt) : elm.fireEvent('on' + name, evt);\n\n return elm;\n};\n\naria.Utils.keys = {\n tab: 9,\n enter: 13,\n space: 32,\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n esc: 27\n};\n\nexports.default = aria.Utils;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvYXJpYS11dGlscy5qcz9lNDUyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLCtCQUErQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZDQUE2QyxRQUFRO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxPQUFPO0FBQ25CLFlBQVksRUFBRTtBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSxvRkFBb0YsYUFBYTtBQUNqRztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiJlNDUyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIGFyaWEgPSBhcmlhIHx8IHt9O1xuXG5hcmlhLlV0aWxzID0gYXJpYS5VdGlscyB8fCB7fTtcblxuLyoqXG4gKiBAZGVzYyBTZXQgZm9jdXMgb24gZGVzY2VuZGFudCBub2RlcyB1bnRpbCB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgaXNcbiAqICAgICAgIGZvdW5kLlxuICogQHBhcmFtIGVsZW1lbnRcbiAqICAgICAgICAgIERPTSBub2RlIGZvciB3aGljaCB0byBmaW5kIHRoZSBmaXJzdCBmb2N1c2FibGUgZGVzY2VuZGFudC5cbiAqIEByZXR1cm5zXG4gKiAgdHJ1ZSBpZiBhIGZvY3VzYWJsZSBlbGVtZW50IGlzIGZvdW5kIGFuZCBmb2N1cyBpcyBzZXQuXG4gKi9cbmFyaWEuVXRpbHMuZm9jdXNGaXJzdERlc2NlbmRhbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGVsZW1lbnQuY2hpbGROb2Rlc1tpXTtcbiAgICBpZiAoYXJpYS5VdGlscy5hdHRlbXB0Rm9jdXMoY2hpbGQpIHx8IGFyaWEuVXRpbHMuZm9jdXNGaXJzdERlc2NlbmRhbnQoY2hpbGQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBAZGVzYyBGaW5kIHRoZSBsYXN0IGRlc2NlbmRhbnQgbm9kZSB0aGF0IGlzIGZvY3VzYWJsZS5cbiAqIEBwYXJhbSBlbGVtZW50XG4gKiAgICAgICAgICBET00gbm9kZSBmb3Igd2hpY2ggdG8gZmluZCB0aGUgbGFzdCBmb2N1c2FibGUgZGVzY2VuZGFudC5cbiAqIEByZXR1cm5zXG4gKiAgdHJ1ZSBpZiBhIGZvY3VzYWJsZSBlbGVtZW50IGlzIGZvdW5kIGFuZCBmb2N1cyBpcyBzZXQuXG4gKi9cblxuYXJpYS5VdGlscy5mb2N1c0xhc3REZXNjZW5kYW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgZm9yICh2YXIgaSA9IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBjaGlsZCA9IGVsZW1lbnQuY2hpbGROb2Rlc1tpXTtcbiAgICBpZiAoYXJpYS5VdGlscy5hdHRlbXB0Rm9jdXMoY2hpbGQpIHx8IGFyaWEuVXRpbHMuZm9jdXNMYXN0RGVzY2VuZGFudChjaGlsZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEBkZXNjIFNldCBBdHRlbXB0IHRvIHNldCBmb2N1cyBvbiB0aGUgY3VycmVudCBub2RlLlxuICogQHBhcmFtIGVsZW1lbnRcbiAqICAgICAgICAgIFRoZSBub2RlIHRvIGF0dGVtcHQgdG8gZm9jdXMgb24uXG4gKiBAcmV0dXJuc1xuICogIHRydWUgaWYgZWxlbWVudCBpcyBmb2N1c2VkLlxuICovXG5hcmlhLlV0aWxzLmF0dGVtcHRGb2N1cyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIGlmICghYXJpYS5VdGlscy5pc0ZvY3VzYWJsZShlbGVtZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmlhLlV0aWxzLklnbm9yZVV0aWxGb2N1c0NoYW5nZXMgPSB0cnVlO1xuICB0cnkge1xuICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgfSBjYXRjaCAoZSkge31cbiAgYXJpYS5VdGlscy5JZ25vcmVVdGlsRm9jdXNDaGFuZ2VzID0gZmFsc2U7XG4gIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBlbGVtZW50O1xufTtcblxuYXJpYS5VdGlscy5pc0ZvY3VzYWJsZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50LnRhYkluZGV4ID4gMCB8fCBlbGVtZW50LnRhYkluZGV4ID09PSAwICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJJbmRleCcpICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZWxlbWVudC5kaXNhYmxlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaCAoZWxlbWVudC5ub2RlTmFtZSkge1xuICAgIGNhc2UgJ0EnOlxuICAgICAgcmV0dXJuICEhZWxlbWVudC5ocmVmICYmIGVsZW1lbnQucmVsICE9PSAnaWdub3JlJztcbiAgICBjYXNlICdJTlBVVCc6XG4gICAgICByZXR1cm4gZWxlbWVudC50eXBlICE9PSAnaGlkZGVuJyAmJiBlbGVtZW50LnR5cGUgIT09ICdmaWxlJztcbiAgICBjYXNlICdCVVRUT04nOlxuICAgIGNhc2UgJ1NFTEVDVCc6XG4gICAgY2FzZSAnVEVYVEFSRUEnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiDop6blj5HkuIDkuKrkuovku7ZcbiAqIG1vdXNlZW50ZXIsIG1vdXNlbGVhdmUsIG1vdXNlb3Zlciwga2V5dXAsIGNoYW5nZSwgY2xpY2sg562JXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbG1cbiAqIEBwYXJhbSAge1N0cmluZ30gbmFtZVxuICogQHBhcmFtICB7Kn0gb3B0c1xuICovXG5hcmlhLlV0aWxzLnRyaWdnZXJFdmVudCA9IGZ1bmN0aW9uIChlbG0sIG5hbWUpIHtcbiAgdmFyIGV2ZW50TmFtZSA9IHZvaWQgMDtcblxuICBpZiAoL15tb3VzZXxjbGljay8udGVzdChuYW1lKSkge1xuICAgIGV2ZW50TmFtZSA9ICdNb3VzZUV2ZW50cyc7XG4gIH0gZWxzZSBpZiAoL15rZXkvLnRlc3QobmFtZSkpIHtcbiAgICBldmVudE5hbWUgPSAnS2V5Ym9hcmRFdmVudCc7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnROYW1lID0gJ0hUTUxFdmVudHMnO1xuICB9XG4gIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChldmVudE5hbWUpO1xuXG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBvcHRzID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIG9wdHNbX2tleSAtIDJdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgZXZ0LmluaXRFdmVudC5hcHBseShldnQsIFtuYW1lXS5jb25jYXQob3B0cykpO1xuICBlbG0uZGlzcGF0Y2hFdmVudCA/IGVsbS5kaXNwYXRjaEV2ZW50KGV2dCkgOiBlbG0uZmlyZUV2ZW50KCdvbicgKyBuYW1lLCBldnQpO1xuXG4gIHJldHVybiBlbG07XG59O1xuXG5hcmlhLlV0aWxzLmtleXMgPSB7XG4gIHRhYjogOSxcbiAgZW50ZXI6IDEzLFxuICBzcGFjZTogMzIsXG4gIGxlZnQ6IDM3LFxuICB1cDogMzgsXG4gIHJpZ2h0OiAzOSxcbiAgZG93bjogNDAsXG4gIGVzYzogMjdcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGFyaWEuVXRpbHM7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///e452\n")},e62d:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nexports.default = function () {\n if (_vue2.default.prototype.$isServer) return 0;\n if (scrollBarWidth !== undefined) return scrollBarWidth;\n\n var outer = document.createElement('div');\n outer.className = 'el-scrollbar__wrap';\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.position = 'absolute';\n outer.style.top = '-9999px';\n document.body.appendChild(outer);\n\n var widthNoScroll = outer.offsetWidth;\n outer.style.overflow = 'scroll';\n\n var inner = document.createElement('div');\n inner.style.width = '100%';\n outer.appendChild(inner);\n\n var widthWithScroll = inner.offsetWidth;\n outer.parentNode.removeChild(outer);\n scrollBarWidth = widthNoScroll - widthWithScroll;\n\n return scrollBarWidth;\n};\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar scrollBarWidth = void 0;\n\n;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvc2Nyb2xsYmFyLXdpZHRoLmpzP2U2MmQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUFLOztBQUV4Qjs7QUFFQSxzQ0FBc0MsdUNBQXVDLGdCQUFnQjs7QUFFN0Y7O0FBRUEiLCJmaWxlIjoiZTYyZC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyKSByZXR1cm4gMDtcbiAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSB1bmRlZmluZWQpIHJldHVybiBzY3JvbGxCYXJXaWR0aDtcblxuICB2YXIgb3V0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3V0ZXIuY2xhc3NOYW1lID0gJ2VsLXNjcm9sbGJhcl9fd3JhcCc7XG4gIG91dGVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgb3V0ZXIuc3R5bGUud2lkdGggPSAnMTAwcHgnO1xuICBvdXRlci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIG91dGVyLnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdXRlcik7XG5cbiAgdmFyIHdpZHRoTm9TY3JvbGwgPSBvdXRlci5vZmZzZXRXaWR0aDtcbiAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcblxuICB2YXIgaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgaW5uZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gIG91dGVyLmFwcGVuZENoaWxkKGlubmVyKTtcblxuICB2YXIgd2lkdGhXaXRoU2Nyb2xsID0gaW5uZXIub2Zmc2V0V2lkdGg7XG4gIG91dGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob3V0ZXIpO1xuICBzY3JvbGxCYXJXaWR0aCA9IHdpZHRoTm9TY3JvbGwgLSB3aWR0aFdpdGhTY3JvbGw7XG5cbiAgcmV0dXJuIHNjcm9sbEJhcldpZHRoO1xufTtcblxudmFyIF92dWUgPSByZXF1aXJlKCd2dWUnKTtcblxudmFyIF92dWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdnVlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIHNjcm9sbEJhcldpZHRoID0gdm9pZCAwO1xuXG47Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///e62d\n")},e772:function(module,exports,__webpack_require__){eval('module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: \'Module\' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, \'__esModule\', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === \'object\' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, \'default\', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != \'string\') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module[\'default\']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, \'a\', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = "/dist/";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 54);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("8122");\n\n/***/ }),\n\n/***/ 33:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/option.vue?vue&type=template&id=7a44c642&\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "li",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-select-dropdown__item",\n class: {\n selected: _vm.itemSelected,\n "is-disabled": _vm.disabled || _vm.groupDisabled || _vm.limitReached,\n hover: _vm.hover\n },\n on: {\n mouseenter: _vm.hoverItem,\n click: function($event) {\n $event.stopPropagation()\n return _vm.selectOptionClick($event)\n }\n }\n },\n [_vm._t("default", [_c("span", [_vm._v(_vm._s(_vm.currentLabel))])])],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/select/src/option.vue?vue&type=template&id=7a44c642&\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/emitter"\nvar emitter_ = __webpack_require__(4);\nvar emitter_default = /*#__PURE__*/__webpack_require__.n(emitter_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/util"\nvar util_ = __webpack_require__(3);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/option.vue?vue&type=script&lang=js&\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : 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/* harmony default export */ var optionvue_type_script_lang_js_ = ({\n mixins: [emitter_default.a],\n\n name: \'ElOption\',\n\n componentName: \'ElOption\',\n\n inject: [\'select\'],\n\n props: {\n value: {\n required: true\n },\n label: [String, Number],\n created: Boolean,\n disabled: {\n type: Boolean,\n default: false\n }\n },\n\n data: function data() {\n return {\n index: -1,\n groupDisabled: false,\n visible: true,\n hitState: false,\n hover: false\n };\n },\n\n\n computed: {\n isObject: function isObject() {\n return Object.prototype.toString.call(this.value).toLowerCase() === \'[object object]\';\n },\n currentLabel: function currentLabel() {\n return this.label || (this.isObject ? \'\' : this.value);\n },\n currentValue: function currentValue() {\n return this.value || this.label || \'\';\n },\n itemSelected: function itemSelected() {\n if (!this.select.multiple) {\n return this.isEqual(this.value, this.select.value);\n } else {\n return this.contains(this.select.value, this.value);\n }\n },\n limitReached: function limitReached() {\n if (this.select.multiple) {\n return !this.itemSelected && (this.select.value || []).length >= this.select.multipleLimit && this.select.multipleLimit > 0;\n } else {\n return false;\n }\n }\n },\n\n watch: {\n currentLabel: function currentLabel() {\n if (!this.created && !this.select.remote) this.dispatch(\'ElSelect\', \'setSelected\');\n },\n value: function value(val, oldVal) {\n var _select = this.select,\n remote = _select.remote,\n valueKey = _select.valueKey;\n\n if (!this.created && !remote) {\n if (valueKey && (typeof val === \'undefined\' ? \'undefined\' : _typeof(val)) === \'object\' && (typeof oldVal === \'undefined\' ? \'undefined\' : _typeof(oldVal)) === \'object\' && val[valueKey] === oldVal[valueKey]) {\n return;\n }\n this.dispatch(\'ElSelect\', \'setSelected\');\n }\n }\n },\n\n methods: {\n isEqual: function isEqual(a, b) {\n if (!this.isObject) {\n return a === b;\n } else {\n var valueKey = this.select.valueKey;\n return Object(util_["getValueByPath"])(a, valueKey) === Object(util_["getValueByPath"])(b, valueKey);\n }\n },\n contains: function contains() {\n var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var target = arguments[1];\n\n if (!this.isObject) {\n return arr && arr.indexOf(target) > -1;\n } else {\n var valueKey = this.select.valueKey;\n return arr && arr.some(function (item) {\n return Object(util_["getValueByPath"])(item, valueKey) === Object(util_["getValueByPath"])(target, valueKey);\n });\n }\n },\n handleGroupDisabled: function handleGroupDisabled(val) {\n this.groupDisabled = val;\n },\n hoverItem: function hoverItem() {\n if (!this.disabled && !this.groupDisabled) {\n this.select.hoverIndex = this.select.options.indexOf(this);\n }\n },\n selectOptionClick: function selectOptionClick() {\n if (this.disabled !== true && this.groupDisabled !== true) {\n this.dispatch(\'ElSelect\', \'handleOptionClick\', [this, true]);\n }\n },\n queryChange: function queryChange(query) {\n this.visible = new RegExp(Object(util_["escapeRegexpString"])(query), \'i\').test(this.currentLabel) || this.created;\n if (!this.visible) {\n this.select.filteredOptionsCount--;\n }\n }\n },\n\n created: function created() {\n this.select.options.push(this);\n this.select.cachedOptions.push(this);\n this.select.optionsCount++;\n this.select.filteredOptionsCount++;\n\n this.$on(\'queryChange\', this.queryChange);\n this.$on(\'handleGroupDisabled\', this.handleGroupDisabled);\n },\n beforeDestroy: function beforeDestroy() {\n var _select2 = this.select,\n selected = _select2.selected,\n multiple = _select2.multiple;\n\n var selectedOptions = multiple ? selected : [selected];\n var index = this.select.cachedOptions.indexOf(this);\n var selectedIndex = selectedOptions.indexOf(this);\n\n // if option is not selected, remove it from cache\n if (index > -1 && selectedIndex < 0) {\n this.select.cachedOptions.splice(index, 1);\n }\n this.select.onOptionDestroy(this.select.options.indexOf(this));\n }\n});\n// CONCATENATED MODULE: ./packages/select/src/option.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_optionvue_type_script_lang_js_ = (optionvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/select/src/option.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer["a" /* default */])(\n src_optionvue_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 api; }\ncomponent.options.__file = "packages/select/src/option.vue"\n/* harmony default export */ var src_option = __webpack_exports__["a"] = (component.exports);\n\n/***/ }),\n\n/***/ 4:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("d010");\n\n/***/ }),\n\n/***/ 54:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _select_src_option__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33);\n\n\n/* istanbul ignore next */\n_select_src_option__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].install = function (Vue) {\n Vue.component(_select_src_option__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].name, _select_src_option__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"]);\n};\n\n/* harmony default export */ __webpack_exports__["default"] = (_select_src_option__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"]);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvb3B0aW9uLmpzP2U3NzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsZ0NBQWdDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxrQkFBa0I7QUFDbEY7QUFDQSx5REFBeUQsY0FBYztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQ0FBaUM7QUFDbEYsd0hBQXdILG1CQUFtQixFQUFFO0FBQzdJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQkFBMEIsRUFBRTtBQUMvRCx5Q0FBeUMsZUFBZTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtEQUErRDtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwyRkFBMkYsMkJBQTJCLEVBQUU7QUFDeEg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FB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b2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2Rpc3QvXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDU0KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIG5vcm1hbGl6ZUNvbXBvbmVudDsgfSk7XG4vKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi9cblxuLy8gSU1QT1JUQU5UOiBEbyBOT1QgdXNlIEVTMjAxNSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgKGV4Y2VwdCBmb3IgbW9kdWxlcykuXG4vLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbFxuLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudCAoXG4gIHNjcmlwdEV4cG9ydHMsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmdW5jdGlvbmFsVGVtcGxhdGUsXG4gIGluamVjdFN0eWxlcyxcbiAgc2NvcGVJZCxcbiAgbW9kdWxlSWRlbnRpZmllciwgLyogc2VydmVyIG9ubHkgKi9cbiAgc2hhZG93TW9kZSAvKiB2dWUtY2xpIG9ubHkgKi9cbikge1xuICAvLyBWdWUuZXh0ZW5kIGNvbnN0cnVjdG9yIGV4cG9ydCBpbnRlcm9wXG4gIHZhciBvcHRpb25zID0gdHlwZW9mIHNjcmlwdEV4cG9ydHMgPT09ICdmdW5jdGlvbidcbiAgICA/IHNjcmlwdEV4cG9ydHMub3B0aW9uc1xuICAgIDogc2NyaXB0RXhwb3J0c1xuXG4gIC8vIHJlbmRlciBmdW5jdGlvbnNcbiAgaWYgKHJlbmRlcikge1xuICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyXG4gICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnNcbiAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWVcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGZ1bmN0aW9uYWxUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25hbCA9IHRydWVcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWRcbiAgfVxuXG4gIHZhciBob29rXG4gIGlmIChtb2R1bGVJZGVudGlmaWVyKSB7IC8vIHNlcnZlciBidWlsZFxuICAgIGhvb2sgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgLy8gMi4zIGluamVjdGlvblxuICAgICAgY29udGV4dCA9XG4gICAgICAgIGNvbnRleHQgfHwgLy8gY2FjaGVkIGNhbGxcbiAgICAgICAgKHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHQpIHx8IC8vIHN0YXRlZnVsXG4gICAgICAgICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC4kdm5vZGUgJiYgdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQpIC8vIGZ1bmN0aW9uYWxcbiAgICAgIC8vIDIuMiB3aXRoIHJ1bkluTmV3Q29udGV4dDogdHJ1ZVxuICAgICAgaWYgKCFjb250ZXh0ICYmIHR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb250ZXh0ID0gX19WVUVfU1NSX0NPTlRFWFRfX1xuICAgICAgfVxuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCBzdHlsZXNcbiAgICAgIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICAgICAgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgY29udGV4dClcbiAgICAgIH1cbiAgICAgIC8vIHJlZ2lzdGVyIGNvbXBvbmVudCBtb2R1bGUgaWRlbnRpZmllciBmb3IgYXN5bmMgY2h1bmsgaW5mZXJyZW5jZVxuICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMpIHtcbiAgICAgICAgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKG1vZHVsZUlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHVzZWQgYnkgc3NyIGluIGNhc2UgY29tcG9uZW50IGlzIGNhY2hlZCBhbmQgYmVmb3JlQ3JlYXRlXG4gICAgLy8gbmV2ZXIgZ2V0cyBjYWxsZWRcbiAgICBvcHRpb25zLl9zc3JSZWdpc3RlciA9IGhvb2tcbiAgfSBlbHNlIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICBob29rID0gc2hhZG93TW9kZVxuICAgICAgPyBmdW5jdGlvbiAoKSB7IGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIHRoaXMuJHJvb3QuJG9wdGlvbnMuc2hhZG93Um9vdCkgfVxuICAgICAgOiBpbmplY3RTdHlsZXNcbiAgfVxuXG4gIGlmIChob29rKSB7XG4gICAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgICAgLy8gZm9yIHRlbXBsYXRlLW9ubHkgaG90LXJlbG9hZCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgcmVuZGVyIGZuIGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRocm91Z2ggdGhlIG5vcm1hbGl6ZXJcbiAgICAgIG9wdGlvbnMuX2luamVjdFN0eWxlcyA9IGhvb2tcbiAgICAgIC8vIHJlZ2lzdGVyIGZvciBmdW5jdGlvYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlXG4gICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24gKGgsIGNvbnRleHQpIHtcbiAgICAgICAgaG9vay5jYWxsKGNvbnRleHQpXG4gICAgICAgIHJldHVybiBvcmlnaW5hbFJlbmRlcihoLCBjb250ZXh0KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiBhcyBiZWZvcmVDcmVhdGUgaG9va1xuICAgICAgdmFyIGV4aXN0aW5nID0gb3B0aW9ucy5iZWZvcmVDcmVhdGVcbiAgICAgIG9wdGlvbnMuYmVmb3JlQ3JlYXRlID0gZXhpc3RpbmdcbiAgICAgICAgPyBbXS5jb25jYXQoZXhpc3RpbmcsIGhvb2spXG4gICAgICAgIDogW2hvb2tdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHBvcnRzOiBzY3JpcHRFeHBvcnRzLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzM6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03YTQ0YzY0MiZcbnZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJsaVwiLFxuICAgIHtcbiAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgdmFsdWU6IF92bS52aXNpYmxlLFxuICAgICAgICAgIGV4cHJlc3Npb246IFwidmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3QtZHJvcGRvd25fX2l0ZW1cIixcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIHNlbGVjdGVkOiBfdm0uaXRlbVNlbGVjdGVkLFxuICAgICAgICBcImlzLWRpc2FibGVkXCI6IF92bS5kaXNhYmxlZCB8fCBfdm0uZ3JvdXBEaXNhYmxlZCB8fCBfdm0ubGltaXRSZWFjaGVkLFxuICAgICAgICBob3ZlcjogX3ZtLmhvdmVyXG4gICAgICB9LFxuICAgICAgb246IHtcbiAgICAgICAgbW91c2VlbnRlcjogX3ZtLmhvdmVySXRlbSxcbiAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHJldHVybiBfdm0uc2VsZWN0T3B0aW9uQ2xpY2soJGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbX3ZtLl90KFwiZGVmYXVsdFwiLCBbX2MoXCJzcGFuXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS5jdXJyZW50TGFiZWwpKV0pXSldLFxuICAgIDJcbiAgKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03YTQ0YzY0MiZcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL21peGlucy9lbWl0dGVyXCJcbnZhciBlbWl0dGVyXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG52YXIgZW1pdHRlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihlbWl0dGVyXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCJcbnZhciB1dGlsXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG9wdGlvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hXSxcblxuICBuYW1lOiAnRWxPcHRpb24nLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbE9wdGlvbicsXG5cbiAgaW5qZWN0OiBbJ3NlbGVjdCddLFxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBsYWJlbDogW1N0cmluZywgTnVtYmVyXSxcbiAgICBjcmVhdGVkOiBCb29sZWFuLFxuICAgIGRpc2FibGVkOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5kZXg6IC0xLFxuICAgICAgZ3JvdXBEaXNhYmxlZDogZmFsc2UsXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgaGl0U3RhdGU6IGZhbHNlLFxuICAgICAgaG92ZXI6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNPYmplY3Q6IGZ1bmN0aW9uIGlzT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzLnZhbHVlKS50b0xvd2VyQ2FzZSgpID09PSAnW29iamVjdCBvYmplY3RdJztcbiAgICB9LFxuICAgIGN1cnJlbnRMYWJlbDogZnVuY3Rpb24gY3VycmVudExhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFiZWwgfHwgKHRoaXMuaXNPYmplY3QgPyAnJyA6IHRoaXMudmFsdWUpO1xuICAgIH0sXG4gICAgY3VycmVudFZhbHVlOiBmdW5jdGlvbiBjdXJyZW50VmFsdWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSB8fCB0aGlzLmxhYmVsIHx8ICcnO1xuICAgIH0sXG4gICAgaXRlbVNlbGVjdGVkOiBmdW5jdGlvbiBpdGVtU2VsZWN0ZWQoKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0Lm11bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWwodGhpcy52YWx1ZSwgdGhpcy5zZWxlY3QudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbnModGhpcy5zZWxlY3QudmFsdWUsIHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbGltaXRSZWFjaGVkOiBmdW5jdGlvbiBsaW1pdFJlYWNoZWQoKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3QubXVsdGlwbGUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLml0ZW1TZWxlY3RlZCAmJiAodGhpcy5zZWxlY3QudmFsdWUgfHwgW10pLmxlbmd0aCA+PSB0aGlzLnNlbGVjdC5tdWx0aXBsZUxpbWl0ICYmIHRoaXMuc2VsZWN0Lm11bHRpcGxlTGltaXQgPiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGN1cnJlbnRMYWJlbDogZnVuY3Rpb24gY3VycmVudExhYmVsKCkge1xuICAgICAgaWYgKCF0aGlzLmNyZWF0ZWQgJiYgIXRoaXMuc2VsZWN0LnJlbW90ZSkgdGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCAnc2V0U2VsZWN0ZWQnKTtcbiAgICB9LFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZFZhbCkge1xuICAgICAgdmFyIF9zZWxlY3QgPSB0aGlzLnNlbGVjdCxcbiAgICAgICAgICByZW1vdGUgPSBfc2VsZWN0LnJlbW90ZSxcbiAgICAgICAgICB2YWx1ZUtleSA9IF9zZWxlY3QudmFsdWVLZXk7XG5cbiAgICAgIGlmICghdGhpcy5jcmVhdGVkICYmICFyZW1vdGUpIHtcbiAgICAgICAgaWYgKHZhbHVlS2V5ICYmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWwpKSA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiBvbGRWYWwgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9sZFZhbCkpID09PSAnb2JqZWN0JyAmJiB2YWxbdmFsdWVLZXldID09PSBvbGRWYWxbdmFsdWVLZXldKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsU2VsZWN0JywgJ3NldFNlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBpc0VxdWFsOiBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgICAgIGlmICghdGhpcy5pc09iamVjdCkge1xuICAgICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB2YWx1ZUtleSA9IHRoaXMuc2VsZWN0LnZhbHVlS2V5O1xuICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGEsIHZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGIsIHZhbHVlS2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbnRhaW5zOiBmdW5jdGlvbiBjb250YWlucygpIHtcbiAgICAgIHZhciBhcnIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICAgICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKCF0aGlzLmlzT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBhcnIgJiYgYXJyLmluZGV4T2YodGFyZ2V0KSA+IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHZhbHVlS2V5ID0gdGhpcy5zZWxlY3QudmFsdWVLZXk7XG4gICAgICAgIHJldHVybiBhcnIgJiYgYXJyLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGl0ZW0sIHZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKHRhcmdldCwgdmFsdWVLZXkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUdyb3VwRGlzYWJsZWQ6IGZ1bmN0aW9uIGhhbmRsZUdyb3VwRGlzYWJsZWQodmFsKSB7XG4gICAgICB0aGlzLmdyb3VwRGlzYWJsZWQgPSB2YWw7XG4gICAgfSxcbiAgICBob3Zlckl0ZW06IGZ1bmN0aW9uIGhvdmVySXRlbSgpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5ncm91cERpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LmhvdmVySW5kZXggPSB0aGlzLnNlbGVjdC5vcHRpb25zLmluZGV4T2YodGhpcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZWxlY3RPcHRpb25DbGljazogZnVuY3Rpb24gc2VsZWN0T3B0aW9uQ2xpY2soKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSAmJiB0aGlzLmdyb3VwRGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCAnaGFuZGxlT3B0aW9uQ2xpY2snLCBbdGhpcywgdHJ1ZV0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlDaGFuZ2U6IGZ1bmN0aW9uIHF1ZXJ5Q2hhbmdlKHF1ZXJ5KSB7XG4gICAgICB0aGlzLnZpc2libGUgPSBuZXcgUmVnRXhwKE9iamVjdCh1dGlsX1tcImVzY2FwZVJlZ2V4cFN0cmluZ1wiXSkocXVlcnkpLCAnaScpLnRlc3QodGhpcy5jdXJyZW50TGFiZWwpIHx8IHRoaXMuY3JlYXRlZDtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LmZpbHRlcmVkT3B0aW9uc0NvdW50LS07XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5zZWxlY3Qub3B0aW9ucy5wdXNoKHRoaXMpO1xuICAgIHRoaXMuc2VsZWN0LmNhY2hlZE9wdGlvbnMucHVzaCh0aGlzKTtcbiAgICB0aGlzLnNlbGVjdC5vcHRpb25zQ291bnQrKztcbiAgICB0aGlzLnNlbGVjdC5maWx0ZXJlZE9wdGlvbnNDb3VudCsrO1xuXG4gICAgdGhpcy4kb24oJ3F1ZXJ5Q2hhbmdlJywgdGhpcy5xdWVyeUNoYW5nZSk7XG4gICAgdGhpcy4kb24oJ2hhbmRsZUdyb3VwRGlzYWJsZWQnLCB0aGlzLmhhbmRsZUdyb3VwRGlzYWJsZWQpO1xuICB9LFxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIHZhciBfc2VsZWN0MiA9IHRoaXMuc2VsZWN0LFxuICAgICAgICBzZWxlY3RlZCA9IF9zZWxlY3QyLnNlbGVjdGVkLFxuICAgICAgICBtdWx0aXBsZSA9IF9zZWxlY3QyLm11bHRpcGxlO1xuXG4gICAgdmFyIHNlbGVjdGVkT3B0aW9ucyA9IG11bHRpcGxlID8gc2VsZWN0ZWQgOiBbc2VsZWN0ZWRdO1xuICAgIHZhciBpbmRleCA9IHRoaXMuc2VsZWN0LmNhY2hlZE9wdGlvbnMuaW5kZXhPZih0aGlzKTtcbiAgICB2YXIgc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkT3B0aW9ucy5pbmRleE9mKHRoaXMpO1xuXG4gICAgLy8gaWYgb3B0aW9uIGlzIG5vdCBzZWxlY3RlZCwgcmVtb3ZlIGl0IGZyb20gY2FjaGVcbiAgICBpZiAoaW5kZXggPiAtMSAmJiBzZWxlY3RlZEluZGV4IDwgMCkge1xuICAgICAgdGhpcy5zZWxlY3QuY2FjaGVkT3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdC5vbk9wdGlvbkRlc3Ryb3kodGhpcy5zZWxlY3Qub3B0aW9ucy5pbmRleE9mKHRoaXMpKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfb3B0aW9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKG9wdGlvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbnZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBjb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplcltcImFcIiAvKiBkZWZhdWx0ICovXSkoXG4gIHNyY19vcHRpb252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhcGk7IH1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19vcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChjb21wb25lbnQuZXhwb3J0cyk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA0OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZW1pdHRlclwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU0OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2VsZWN0X3NyY19vcHRpb25fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzMpO1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5fc2VsZWN0X3NyY19vcHRpb25fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1svKiBkZWZhdWx0ICovIFwiYVwiXS5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KF9zZWxlY3Rfc3JjX29wdGlvbl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWy8qIGRlZmF1bHQgKi8gXCJhXCJdLm5hbWUsIF9zZWxlY3Rfc3JjX29wdGlvbl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWy8qIGRlZmF1bHQgKi8gXCJhXCJdKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoX3NlbGVjdF9zcmNfb3B0aW9uX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bLyogZGVmYXVsdCAqLyBcImFcIl0pO1xuXG4vKioqLyB9KVxuXG4vKioqKioqLyB9KTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///e772\n')},e974:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _popup = __webpack_require__(\"5128\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar PopperJS = _vue2.default.prototype.$isServer ? function () {} : __webpack_require__(\"6167\");\nvar stop = function stop(e) {\n return e.stopPropagation();\n};\n\n/**\n * @param {HTMLElement} [reference=$refs.reference] - The reference element used to position the popper.\n * @param {HTMLElement} [popper=$refs.popper] - The HTML element used as popper, or a configuration used to generate the popper.\n * @param {String} [placement=button] - Placement of the popper accepted values: top(-start, -end), right(-start, -end), bottom(-start, -end), left(-start, -end)\n * @param {Number} [offset=0] - Amount of pixels the popper will be shifted (can be negative).\n * @param {Boolean} [visible=false] Visibility of the popup element.\n * @param {Boolean} [visible-arrow=false] Visibility of the arrow, no style.\n */\nexports.default = {\n props: {\n transformOrigin: {\n type: [Boolean, String],\n default: true\n },\n placement: {\n type: String,\n default: 'bottom'\n },\n boundariesPadding: {\n type: Number,\n default: 5\n },\n reference: {},\n popper: {},\n offset: {\n default: 0\n },\n value: Boolean,\n visibleArrow: Boolean,\n arrowOffset: {\n type: Number,\n default: 35\n },\n appendToBody: {\n type: Boolean,\n default: true\n },\n popperOptions: {\n type: Object,\n default: function _default() {\n return {\n gpuAcceleration: false\n };\n }\n }\n },\n\n data: function data() {\n return {\n showPopper: false,\n currentPlacement: ''\n };\n },\n\n\n watch: {\n value: {\n immediate: true,\n handler: function handler(val) {\n this.showPopper = val;\n this.$emit('input', val);\n }\n },\n\n showPopper: function showPopper(val) {\n if (this.disabled) return;\n val ? this.updatePopper() : this.destroyPopper();\n this.$emit('input', val);\n }\n },\n\n methods: {\n createPopper: function createPopper() {\n var _this = this;\n\n if (this.$isServer) return;\n this.currentPlacement = this.currentPlacement || this.placement;\n if (!/^(top|bottom|left|right)(-start|-end)?$/g.test(this.currentPlacement)) {\n return;\n }\n\n var options = this.popperOptions;\n var popper = this.popperElm = this.popperElm || this.popper || this.$refs.popper;\n var reference = this.referenceElm = this.referenceElm || this.reference || this.$refs.reference;\n\n if (!reference && this.$slots.reference && this.$slots.reference[0]) {\n reference = this.referenceElm = this.$slots.reference[0].elm;\n }\n\n if (!popper || !reference) return;\n if (this.visibleArrow) this.appendArrow(popper);\n if (this.appendToBody) document.body.appendChild(this.popperElm);\n if (this.popperJS && this.popperJS.destroy) {\n this.popperJS.destroy();\n }\n\n options.placement = this.currentPlacement;\n options.offset = this.offset;\n options.arrowOffset = this.arrowOffset;\n this.popperJS = new PopperJS(reference, popper, options);\n this.popperJS.onCreate(function (_) {\n _this.$emit('created', _this);\n _this.resetTransformOrigin();\n _this.$nextTick(_this.updatePopper);\n });\n if (typeof options.onUpdate === 'function') {\n this.popperJS.onUpdate(options.onUpdate);\n }\n this.popperJS._popper.style.zIndex = _popup.PopupManager.nextZIndex();\n this.popperElm.addEventListener('click', stop);\n },\n updatePopper: function updatePopper() {\n var popperJS = this.popperJS;\n if (popperJS) {\n popperJS.update();\n if (popperJS._popper) {\n popperJS._popper.style.zIndex = _popup.PopupManager.nextZIndex();\n }\n } else {\n this.createPopper();\n }\n },\n doDestroy: function doDestroy(forceDestroy) {\n /* istanbul ignore if */\n if (!this.popperJS || this.showPopper && !forceDestroy) return;\n this.popperJS.destroy();\n this.popperJS = null;\n },\n destroyPopper: function destroyPopper() {\n if (this.popperJS) {\n this.resetTransformOrigin();\n }\n },\n resetTransformOrigin: function resetTransformOrigin() {\n if (!this.transformOrigin) return;\n var placementMap = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left'\n };\n var placement = this.popperJS._popper.getAttribute('x-placement').split('-')[0];\n var origin = placementMap[placement];\n this.popperJS._popper.style.transformOrigin = typeof this.transformOrigin === 'string' ? this.transformOrigin : ['top', 'bottom'].indexOf(placement) > -1 ? 'center ' + origin : origin + ' center';\n },\n appendArrow: function appendArrow(element) {\n var hash = void 0;\n if (this.appended) {\n return;\n }\n\n this.appended = true;\n\n for (var item in element.attributes) {\n if (/^_v-/.test(element.attributes[item].name)) {\n hash = element.attributes[item].name;\n break;\n }\n }\n\n var arrow = document.createElement('div');\n\n if (hash) {\n arrow.setAttribute(hash, '');\n }\n arrow.setAttribute('x-arrow', '');\n arrow.className = 'popper__arrow';\n element.appendChild(arrow);\n }\n },\n\n beforeDestroy: function beforeDestroy() {\n this.doDestroy(true);\n if (this.popperElm && this.popperElm.parentNode === document.body) {\n this.popperElm.removeEventListener('click', stop);\n document.body.removeChild(this.popperElm);\n }\n },\n\n\n // call destroy in keep-alive mode\n deactivated: function deactivated() {\n this.$options.beforeDestroy[0].call(this);\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvdnVlLXBvcHBlci5qcz9lOTc0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUFLOztBQUV4Qjs7QUFFQSxhQUFhLG1CQUFPLENBQUMsTUFBNEI7O0FBRWpELHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RixpRUFBaUUsR0FBRyxtQkFBTyxDQUFDLE1BQVU7QUFDdEY7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCLFdBQVcsWUFBWTtBQUN2QixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsaUJBQWlCO0FBQ2pCLGNBQWM7QUFDZDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImU5NzQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdnVlID0gcmVxdWlyZSgndnVlJyk7XG5cbnZhciBfdnVlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Z1ZSk7XG5cbnZhciBfcG9wdXAgPSByZXF1aXJlKCdlbGVtZW50LXVpL2xpYi91dGlscy9wb3B1cCcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgUG9wcGVySlMgPSBfdnVlMi5kZWZhdWx0LnByb3RvdHlwZS4kaXNTZXJ2ZXIgPyBmdW5jdGlvbiAoKSB7fSA6IHJlcXVpcmUoJy4vcG9wcGVyJyk7XG52YXIgc3RvcCA9IGZ1bmN0aW9uIHN0b3AoZSkge1xuICByZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW3JlZmVyZW5jZT0kcmVmcy5yZWZlcmVuY2VdIC0gVGhlIHJlZmVyZW5jZSBlbGVtZW50IHVzZWQgdG8gcG9zaXRpb24gdGhlIHBvcHBlci5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtwb3BwZXI9JHJlZnMucG9wcGVyXSAtIFRoZSBIVE1MIGVsZW1lbnQgdXNlZCBhcyBwb3BwZXIsIG9yIGEgY29uZmlndXJhdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBwb3BwZXIuXG4gKiBAcGFyYW0ge1N0cmluZ30gW3BsYWNlbWVudD1idXR0b25dIC0gUGxhY2VtZW50IG9mIHRoZSBwb3BwZXIgYWNjZXB0ZWQgdmFsdWVzOiB0b3AoLXN0YXJ0LCAtZW5kKSwgcmlnaHQoLXN0YXJ0LCAtZW5kKSwgYm90dG9tKC1zdGFydCwgLWVuZCksIGxlZnQoLXN0YXJ0LCAtZW5kKVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvZmZzZXQ9MF0gLSBBbW91bnQgb2YgcGl4ZWxzIHRoZSBwb3BwZXIgd2lsbCBiZSBzaGlmdGVkIChjYW4gYmUgbmVnYXRpdmUpLlxuICogQHBhcmFtIHtCb29sZWFufSBbdmlzaWJsZT1mYWxzZV0gVmlzaWJpbGl0eSBvZiB0aGUgcG9wdXAgZWxlbWVudC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3Zpc2libGUtYXJyb3c9ZmFsc2VdIFZpc2liaWxpdHkgb2YgdGhlIGFycm93LCBubyBzdHlsZS5cbiAqL1xuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBwcm9wczoge1xuICAgIHRyYW5zZm9ybU9yaWdpbjoge1xuICAgICAgdHlwZTogW0Jvb2xlYW4sIFN0cmluZ10sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBwbGFjZW1lbnQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdib3R0b20nXG4gICAgfSxcbiAgICBib3VuZGFyaWVzUGFkZGluZzoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogNVxuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fSxcbiAgICBwb3BwZXI6IHt9LFxuICAgIG9mZnNldDoge1xuICAgICAgZGVmYXVsdDogMFxuICAgIH0sXG4gICAgdmFsdWU6IEJvb2xlYW4sXG4gICAgdmlzaWJsZUFycm93OiBCb29sZWFuLFxuICAgIGFycm93T2Zmc2V0OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiAzNVxuICAgIH0sXG4gICAgYXBwZW5kVG9Cb2R5OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgcG9wcGVyT3B0aW9uczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZ3B1QWNjZWxlcmF0aW9uOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93UG9wcGVyOiBmYWxzZSxcbiAgICAgIGN1cnJlbnRQbGFjZW1lbnQ6ICcnXG4gICAgfTtcbiAgfSxcblxuXG4gIHdhdGNoOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIodmFsKSB7XG4gICAgICAgIHRoaXMuc2hvd1BvcHBlciA9IHZhbDtcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBzaG93UG9wcGVyOiBmdW5jdGlvbiBzaG93UG9wcGVyKHZhbCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICAgIHZhbCA/IHRoaXMudXBkYXRlUG9wcGVyKCkgOiB0aGlzLmRlc3Ryb3lQb3BwZXIoKTtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGNyZWF0ZVBvcHBlcjogZnVuY3Rpb24gY3JlYXRlUG9wcGVyKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuJGlzU2VydmVyKSByZXR1cm47XG4gICAgICB0aGlzLmN1cnJlbnRQbGFjZW1lbnQgPSB0aGlzLmN1cnJlbnRQbGFjZW1lbnQgfHwgdGhpcy5wbGFjZW1lbnQ7XG4gICAgICBpZiAoIS9eKHRvcHxib3R0b218bGVmdHxyaWdodCkoLXN0YXJ0fC1lbmQpPyQvZy50ZXN0KHRoaXMuY3VycmVudFBsYWNlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMucG9wcGVyT3B0aW9ucztcbiAgICAgIHZhciBwb3BwZXIgPSB0aGlzLnBvcHBlckVsbSA9IHRoaXMucG9wcGVyRWxtIHx8IHRoaXMucG9wcGVyIHx8IHRoaXMuJHJlZnMucG9wcGVyO1xuICAgICAgdmFyIHJlZmVyZW5jZSA9IHRoaXMucmVmZXJlbmNlRWxtID0gdGhpcy5yZWZlcmVuY2VFbG0gfHwgdGhpcy5yZWZlcmVuY2UgfHwgdGhpcy4kcmVmcy5yZWZlcmVuY2U7XG5cbiAgICAgIGlmICghcmVmZXJlbmNlICYmIHRoaXMuJHNsb3RzLnJlZmVyZW5jZSAmJiB0aGlzLiRzbG90cy5yZWZlcmVuY2VbMF0pIHtcbiAgICAgICAgcmVmZXJlbmNlID0gdGhpcy5yZWZlcmVuY2VFbG0gPSB0aGlzLiRzbG90cy5yZWZlcmVuY2VbMF0uZWxtO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXBvcHBlciB8fCAhcmVmZXJlbmNlKSByZXR1cm47XG4gICAgICBpZiAodGhpcy52aXNpYmxlQXJyb3cpIHRoaXMuYXBwZW5kQXJyb3cocG9wcGVyKTtcbiAgICAgIGlmICh0aGlzLmFwcGVuZFRvQm9keSkgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnBvcHBlckVsbSk7XG4gICAgICBpZiAodGhpcy5wb3BwZXJKUyAmJiB0aGlzLnBvcHBlckpTLmRlc3Ryb3kpIHtcbiAgICAgICAgdGhpcy5wb3BwZXJKUy5kZXN0cm95KCk7XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbnMucGxhY2VtZW50ID0gdGhpcy5jdXJyZW50UGxhY2VtZW50O1xuICAgICAgb3B0aW9ucy5vZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgIG9wdGlvbnMuYXJyb3dPZmZzZXQgPSB0aGlzLmFycm93T2Zmc2V0O1xuICAgICAgdGhpcy5wb3BwZXJKUyA9IG5ldyBQb3BwZXJKUyhyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucyk7XG4gICAgICB0aGlzLnBvcHBlckpTLm9uQ3JlYXRlKGZ1bmN0aW9uIChfKSB7XG4gICAgICAgIF90aGlzLiRlbWl0KCdjcmVhdGVkJywgX3RoaXMpO1xuICAgICAgICBfdGhpcy5yZXNldFRyYW5zZm9ybU9yaWdpbigpO1xuICAgICAgICBfdGhpcy4kbmV4dFRpY2soX3RoaXMudXBkYXRlUG9wcGVyKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucG9wcGVySlMub25VcGRhdGUob3B0aW9ucy5vblVwZGF0ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnBvcHBlckpTLl9wb3BwZXIuc3R5bGUuekluZGV4ID0gX3BvcHVwLlBvcHVwTWFuYWdlci5uZXh0WkluZGV4KCk7XG4gICAgICB0aGlzLnBvcHBlckVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN0b3ApO1xuICAgIH0sXG4gICAgdXBkYXRlUG9wcGVyOiBmdW5jdGlvbiB1cGRhdGVQb3BwZXIoKSB7XG4gICAgICB2YXIgcG9wcGVySlMgPSB0aGlzLnBvcHBlckpTO1xuICAgICAgaWYgKHBvcHBlckpTKSB7XG4gICAgICAgIHBvcHBlckpTLnVwZGF0ZSgpO1xuICAgICAgICBpZiAocG9wcGVySlMuX3BvcHBlcikge1xuICAgICAgICAgIHBvcHBlckpTLl9wb3BwZXIuc3R5bGUuekluZGV4ID0gX3BvcHVwLlBvcHVwTWFuYWdlci5uZXh0WkluZGV4KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3JlYXRlUG9wcGVyKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkb0Rlc3Ryb3k6IGZ1bmN0aW9uIGRvRGVzdHJveShmb3JjZURlc3Ryb3kpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCF0aGlzLnBvcHBlckpTIHx8IHRoaXMuc2hvd1BvcHBlciAmJiAhZm9yY2VEZXN0cm95KSByZXR1cm47XG4gICAgICB0aGlzLnBvcHBlckpTLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMucG9wcGVySlMgPSBudWxsO1xuICAgIH0sXG4gICAgZGVzdHJveVBvcHBlcjogZnVuY3Rpb24gZGVzdHJveVBvcHBlcigpIHtcbiAgICAgIGlmICh0aGlzLnBvcHBlckpTKSB7XG4gICAgICAgIHRoaXMucmVzZXRUcmFuc2Zvcm1PcmlnaW4oKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlc2V0VHJhbnNmb3JtT3JpZ2luOiBmdW5jdGlvbiByZXNldFRyYW5zZm9ybU9yaWdpbigpIHtcbiAgICAgIGlmICghdGhpcy50cmFuc2Zvcm1PcmlnaW4pIHJldHVybjtcbiAgICAgIHZhciBwbGFjZW1lbnRNYXAgPSB7XG4gICAgICAgIHRvcDogJ2JvdHRvbScsXG4gICAgICAgIGJvdHRvbTogJ3RvcCcsXG4gICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgIHJpZ2h0OiAnbGVmdCdcbiAgICAgIH07XG4gICAgICB2YXIgcGxhY2VtZW50ID0gdGhpcy5wb3BwZXJKUy5fcG9wcGVyLmdldEF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnKS5zcGxpdCgnLScpWzBdO1xuICAgICAgdmFyIG9yaWdpbiA9IHBsYWNlbWVudE1hcFtwbGFjZW1lbnRdO1xuICAgICAgdGhpcy5wb3BwZXJKUy5fcG9wcGVyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IHR5cGVvZiB0aGlzLnRyYW5zZm9ybU9yaWdpbiA9PT0gJ3N0cmluZycgPyB0aGlzLnRyYW5zZm9ybU9yaWdpbiA6IFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+IC0xID8gJ2NlbnRlciAnICsgb3JpZ2luIDogb3JpZ2luICsgJyBjZW50ZXInO1xuICAgIH0sXG4gICAgYXBwZW5kQXJyb3c6IGZ1bmN0aW9uIGFwcGVuZEFycm93KGVsZW1lbnQpIHtcbiAgICAgIHZhciBoYXNoID0gdm9pZCAwO1xuICAgICAgaWYgKHRoaXMuYXBwZW5kZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFwcGVuZGVkID0gdHJ1ZTtcblxuICAgICAgZm9yICh2YXIgaXRlbSBpbiBlbGVtZW50LmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKC9eX3YtLy50ZXN0KGVsZW1lbnQuYXR0cmlidXRlc1tpdGVtXS5uYW1lKSkge1xuICAgICAgICAgIGhhc2ggPSBlbGVtZW50LmF0dHJpYnV0ZXNbaXRlbV0ubmFtZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgYXJyb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgaWYgKGhhc2gpIHtcbiAgICAgICAgYXJyb3cuc2V0QXR0cmlidXRlKGhhc2gsICcnKTtcbiAgICAgIH1cbiAgICAgIGFycm93LnNldEF0dHJpYnV0ZSgneC1hcnJvdycsICcnKTtcbiAgICAgIGFycm93LmNsYXNzTmFtZSA9ICdwb3BwZXJfX2Fycm93JztcbiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICAgIH1cbiAgfSxcblxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIHRoaXMuZG9EZXN0cm95KHRydWUpO1xuICAgIGlmICh0aGlzLnBvcHBlckVsbSAmJiB0aGlzLnBvcHBlckVsbS5wYXJlbnROb2RlID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICB0aGlzLnBvcHBlckVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHN0b3ApO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLnBvcHBlckVsbSk7XG4gICAgfVxuICB9LFxuXG5cbiAgLy8gY2FsbCBkZXN0cm95IGluIGtlZXAtYWxpdmUgbW9kZVxuICBkZWFjdGl2YXRlZDogZnVuY3Rpb24gZGVhY3RpdmF0ZWQoKSB7XG4gICAgdGhpcy4kb3B0aW9ucy5iZWZvcmVEZXN0cm95WzBdLmNhbGwodGhpcyk7XG4gIH1cbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///e974\n")},eedf:function(module,exports,__webpack_require__){eval('module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: \'Module\' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, \'__esModule\', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === \'object\' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, \'default\', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != \'string\') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module[\'default\']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, \'a\', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = "/dist/";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 96);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 96:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/button/src/button.vue?vue&type=template&id=ca859fb4&\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "button",\n {\n staticClass: "el-button",\n class: [\n _vm.type ? "el-button--" + _vm.type : "",\n _vm.buttonSize ? "el-button--" + _vm.buttonSize : "",\n {\n "is-disabled": _vm.buttonDisabled,\n "is-loading": _vm.loading,\n "is-plain": _vm.plain,\n "is-round": _vm.round,\n "is-circle": _vm.circle\n }\n ],\n attrs: {\n disabled: _vm.buttonDisabled || _vm.loading,\n autofocus: _vm.autofocus,\n type: _vm.nativeType\n },\n on: { click: _vm.handleClick }\n },\n [\n _vm.loading ? _c("i", { staticClass: "el-icon-loading" }) : _vm._e(),\n _vm.icon && !_vm.loading ? _c("i", { class: _vm.icon }) : _vm._e(),\n _vm.$slots.default ? _c("span", [_vm._t("default")], 2) : _vm._e()\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/button/src/button.vue?vue&type=template&id=ca859fb4&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/button/src/button.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/* harmony default export */ var buttonvue_type_script_lang_js_ = ({\n name: \'ElButton\',\n\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n\n props: {\n type: {\n type: String,\n default: \'default\'\n },\n size: String,\n icon: {\n type: String,\n default: \'\'\n },\n nativeType: {\n type: String,\n default: \'button\'\n },\n loading: Boolean,\n disabled: Boolean,\n plain: Boolean,\n autofocus: Boolean,\n round: Boolean,\n circle: Boolean\n },\n\n computed: {\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n buttonSize: function buttonSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n buttonDisabled: function buttonDisabled() {\n return this.$options.propsData.hasOwnProperty(\'disabled\') ? this.disabled : (this.elForm || {}).disabled;\n }\n },\n\n methods: {\n handleClick: function handleClick(evt) {\n this.$emit(\'click\', evt);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/button/src/button.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_buttonvue_type_script_lang_js_ = (buttonvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/button/src/button.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer["a" /* default */])(\n src_buttonvue_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 api; }\ncomponent.options.__file = "packages/button/src/button.vue"\n/* harmony default export */ var src_button = (component.exports);\n// CONCATENATED MODULE: ./packages/button/index.js\n\n\n/* istanbul ignore next */\nsrc_button.install = function (Vue) {\n Vue.component(src_button.name, src_button);\n};\n\n/* harmony default export */ var packages_button = __webpack_exports__["default"] = (src_button);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvYnV0dG9uLmpzP2VlZGYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsZ0NBQWdDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxrQkFBa0I7QUFDbEY7QUFDQSx5REFBeUQsY0FBYztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQ0FBaUM7QUFDbEYsd0hBQXdILG1CQUFtQixFQUFFO0FBQzdJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQkFBMEIsRUFBRTtBQUMvRCx5Q0FBeUMsZUFBZTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtEQUErRDtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwyRkFBMkYsMkJBQTJCLEVBQUU7QUFDeEg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsV0FBVztBQUNYLEtBQUs7QUFDTDtBQUNBLDZCQUE2QixpQ0FBaUM7QUFDOUQsMENBQTBDLGtCQUFrQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLG1DQUFtQztBQUNuQyxLQUFLO0FBQ0w7QUFDQSxzRUFBc0U7QUFDdEUsS0FBSztBQUNMO0FBQ0Esb0dBQW9HO0FBQ3BHO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esd0c7QUFDQTtBQUNBOztBQUVBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTzs7QUFFUCxVQUFVIiwiZmlsZSI6ImVlZGYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2Rpc3QvXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDk2KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIG5vcm1hbGl6ZUNvbXBvbmVudDsgfSk7XG4vKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi9cblxuLy8gSU1QT1JUQU5UOiBEbyBOT1QgdXNlIEVTMjAxNSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgKGV4Y2VwdCBmb3IgbW9kdWxlcykuXG4vLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbFxuLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudCAoXG4gIHNjcmlwdEV4cG9ydHMsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmdW5jdGlvbmFsVGVtcGxhdGUsXG4gIGluamVjdFN0eWxlcyxcbiAgc2NvcGVJZCxcbiAgbW9kdWxlSWRlbnRpZmllciwgLyogc2VydmVyIG9ubHkgKi9cbiAgc2hhZG93TW9kZSAvKiB2dWUtY2xpIG9ubHkgKi9cbikge1xuICAvLyBWdWUuZXh0ZW5kIGNvbnN0cnVjdG9yIGV4cG9ydCBpbnRlcm9wXG4gIHZhciBvcHRpb25zID0gdHlwZW9mIHNjcmlwdEV4cG9ydHMgPT09ICdmdW5jdGlvbidcbiAgICA/IHNjcmlwdEV4cG9ydHMub3B0aW9uc1xuICAgIDogc2NyaXB0RXhwb3J0c1xuXG4gIC8vIHJlbmRlciBmdW5jdGlvbnNcbiAgaWYgKHJlbmRlcikge1xuICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyXG4gICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnNcbiAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWVcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGZ1bmN0aW9uYWxUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25hbCA9IHRydWVcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWRcbiAgfVxuXG4gIHZhciBob29rXG4gIGlmIChtb2R1bGVJZGVudGlmaWVyKSB7IC8vIHNlcnZlciBidWlsZFxuICAgIGhvb2sgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgLy8gMi4zIGluamVjdGlvblxuICAgICAgY29udGV4dCA9XG4gICAgICAgIGNvbnRleHQgfHwgLy8gY2FjaGVkIGNhbGxcbiAgICAgICAgKHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHQpIHx8IC8vIHN0YXRlZnVsXG4gICAgICAgICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC4kdm5vZGUgJiYgdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQpIC8vIGZ1bmN0aW9uYWxcbiAgICAgIC8vIDIuMiB3aXRoIHJ1bkluTmV3Q29udGV4dDogdHJ1ZVxuICAgICAgaWYgKCFjb250ZXh0ICYmIHR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb250ZXh0ID0gX19WVUVfU1NSX0NPTlRFWFRfX1xuICAgICAgfVxuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCBzdHlsZXNcbiAgICAgIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICAgICAgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgY29udGV4dClcbiAgICAgIH1cbiAgICAgIC8vIHJlZ2lzdGVyIGNvbXBvbmVudCBtb2R1bGUgaWRlbnRpZmllciBmb3IgYXN5bmMgY2h1bmsgaW5mZXJyZW5jZVxuICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMpIHtcbiAgICAgICAgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKG1vZHVsZUlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHVzZWQgYnkgc3NyIGluIGNhc2UgY29tcG9uZW50IGlzIGNhY2hlZCBhbmQgYmVmb3JlQ3JlYXRlXG4gICAgLy8gbmV2ZXIgZ2V0cyBjYWxsZWRcbiAgICBvcHRpb25zLl9zc3JSZWdpc3RlciA9IGhvb2tcbiAgfSBlbHNlIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICBob29rID0gc2hhZG93TW9kZVxuICAgICAgPyBmdW5jdGlvbiAoKSB7IGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIHRoaXMuJHJvb3QuJG9wdGlvbnMuc2hhZG93Um9vdCkgfVxuICAgICAgOiBpbmplY3RTdHlsZXNcbiAgfVxuXG4gIGlmIChob29rKSB7XG4gICAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgICAgLy8gZm9yIHRlbXBsYXRlLW9ubHkgaG90LXJlbG9hZCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgcmVuZGVyIGZuIGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRocm91Z2ggdGhlIG5vcm1hbGl6ZXJcbiAgICAgIG9wdGlvbnMuX2luamVjdFN0eWxlcyA9IGhvb2tcbiAgICAgIC8vIHJlZ2lzdGVyIGZvciBmdW5jdGlvYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlXG4gICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24gKGgsIGNvbnRleHQpIHtcbiAgICAgICAgaG9vay5jYWxsKGNvbnRleHQpXG4gICAgICAgIHJldHVybiBvcmlnaW5hbFJlbmRlcihoLCBjb250ZXh0KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiBhcyBiZWZvcmVDcmVhdGUgaG9va1xuICAgICAgdmFyIGV4aXN0aW5nID0gb3B0aW9ucy5iZWZvcmVDcmVhdGVcbiAgICAgIG9wdGlvbnMuYmVmb3JlQ3JlYXRlID0gZXhpc3RpbmdcbiAgICAgICAgPyBbXS5jb25jYXQoZXhpc3RpbmcsIGhvb2spXG4gICAgICAgIDogW2hvb2tdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHBvcnRzOiBzY3JpcHRFeHBvcnRzLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA5Njpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWNhODU5ZmI0JlxudmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImJ1dHRvblwiLFxuICAgIHtcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWJ1dHRvblwiLFxuICAgICAgY2xhc3M6IFtcbiAgICAgICAgX3ZtLnR5cGUgPyBcImVsLWJ1dHRvbi0tXCIgKyBfdm0udHlwZSA6IFwiXCIsXG4gICAgICAgIF92bS5idXR0b25TaXplID8gXCJlbC1idXR0b24tLVwiICsgX3ZtLmJ1dHRvblNpemUgOiBcIlwiLFxuICAgICAgICB7XG4gICAgICAgICAgXCJpcy1kaXNhYmxlZFwiOiBfdm0uYnV0dG9uRGlzYWJsZWQsXG4gICAgICAgICAgXCJpcy1sb2FkaW5nXCI6IF92bS5sb2FkaW5nLFxuICAgICAgICAgIFwiaXMtcGxhaW5cIjogX3ZtLnBsYWluLFxuICAgICAgICAgIFwiaXMtcm91bmRcIjogX3ZtLnJvdW5kLFxuICAgICAgICAgIFwiaXMtY2lyY2xlXCI6IF92bS5jaXJjbGVcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIGRpc2FibGVkOiBfdm0uYnV0dG9uRGlzYWJsZWQgfHwgX3ZtLmxvYWRpbmcsXG4gICAgICAgIGF1dG9mb2N1czogX3ZtLmF1dG9mb2N1cyxcbiAgICAgICAgdHlwZTogX3ZtLm5hdGl2ZVR5cGVcbiAgICAgIH0sXG4gICAgICBvbjogeyBjbGljazogX3ZtLmhhbmRsZUNsaWNrIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIF92bS5sb2FkaW5nID8gX2MoXCJpXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtaWNvbi1sb2FkaW5nXCIgfSkgOiBfdm0uX2UoKSxcbiAgICAgIF92bS5pY29uICYmICFfdm0ubG9hZGluZyA/IF9jKFwiaVwiLCB7IGNsYXNzOiBfdm0uaWNvbiB9KSA6IF92bS5fZSgpLFxuICAgICAgX3ZtLiRzbG90cy5kZWZhdWx0ID8gX2MoXCJzcGFuXCIsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMikgOiBfdm0uX2UoKVxuICAgIF1cbiAgKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1jYTg1OWZiNCZcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBidXR0b252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBuYW1lOiAnRWxCdXR0b24nLFxuXG4gIGluamVjdDoge1xuICAgIGVsRm9ybToge1xuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIGVsRm9ybUl0ZW06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgdHlwZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2RlZmF1bHQnXG4gICAgfSxcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgaWNvbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJydcbiAgICB9LFxuICAgIG5hdGl2ZVR5cGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdidXR0b24nXG4gICAgfSxcbiAgICBsb2FkaW5nOiBCb29sZWFuLFxuICAgIGRpc2FibGVkOiBCb29sZWFuLFxuICAgIHBsYWluOiBCb29sZWFuLFxuICAgIGF1dG9mb2N1czogQm9vbGVhbixcbiAgICByb3VuZDogQm9vbGVhbixcbiAgICBjaXJjbGU6IEJvb2xlYW5cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIF9lbEZvcm1JdGVtU2l6ZTogZnVuY3Rpb24gX2VsRm9ybUl0ZW1TaXplKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmVsRm9ybUl0ZW0gfHwge30pLmVsRm9ybUl0ZW1TaXplO1xuICAgIH0sXG4gICAgYnV0dG9uU2l6ZTogZnVuY3Rpb24gYnV0dG9uU2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgfHwgdGhpcy5fZWxGb3JtSXRlbVNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7XG4gICAgfSxcbiAgICBidXR0b25EaXNhYmxlZDogZnVuY3Rpb24gYnV0dG9uRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kb3B0aW9ucy5wcm9wc0RhdGEuaGFzT3duUHJvcGVydHkoJ2Rpc2FibGVkJykgPyB0aGlzLmRpc2FibGVkIDogKHRoaXMuZWxGb3JtIHx8IHt9KS5kaXNhYmxlZDtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbiBoYW5kbGVDbGljayhldnQpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2NsaWNrJywgZXZ0KTtcbiAgICB9XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9idXR0b24vc3JjL2J1dHRvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2J1dHRvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChidXR0b252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXG52YXIgY29tcG9uZW50Tm9ybWFsaXplciA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnV0dG9uL3NyYy9idXR0b24udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gT2JqZWN0KGNvbXBvbmVudE5vcm1hbGl6ZXJbXCJhXCIgLyogZGVmYXVsdCAqL10pKFxuICBzcmNfYnV0dG9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgYXBpOyB9XG5jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL2J1dHRvbi9zcmMvYnV0dG9uLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfYnV0dG9uID0gKGNvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvYnV0dG9uL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnNyY19idXR0b24uaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHtcbiAgVnVlLmNvbXBvbmVudChzcmNfYnV0dG9uLm5hbWUsIHNyY19idXR0b24pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfYnV0dG9uID0gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoc3JjX2J1dHRvbik7XG5cbi8qKiovIH0pXG5cbi8qKioqKiovIH0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///eedf\n')},f0d9:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.default = {\n el: {\n colorpicker: {\n confirm: '确定',\n clear: '清空'\n },\n datepicker: {\n now: '此刻',\n today: '今天',\n cancel: '取消',\n clear: '清空',\n confirm: '确定',\n selectDate: '选择日期',\n selectTime: '选择时间',\n startDate: '开始日期',\n startTime: '开始时间',\n endDate: '结束日期',\n endTime: '结束时间',\n prevYear: '前一年',\n nextYear: '后一年',\n prevMonth: '上个月',\n nextMonth: '下个月',\n year: '年',\n month1: '1 月',\n month2: '2 月',\n month3: '3 月',\n month4: '4 月',\n month5: '5 月',\n month6: '6 月',\n month7: '7 月',\n month8: '8 月',\n month9: '9 月',\n month10: '10 月',\n month11: '11 月',\n month12: '12 月',\n // week: '周次',\n weeks: {\n sun: '日',\n mon: '一',\n tue: '二',\n wed: '三',\n thu: '四',\n fri: '五',\n sat: '六'\n },\n months: {\n jan: '一月',\n feb: '二月',\n mar: '三月',\n apr: '四月',\n may: '五月',\n jun: '六月',\n jul: '七月',\n aug: '八月',\n sep: '九月',\n oct: '十月',\n nov: '十一月',\n dec: '十二月'\n }\n },\n select: {\n loading: '加载中',\n noMatch: '无匹配数据',\n noData: '无数据',\n placeholder: '请选择'\n },\n cascader: {\n noMatch: '无匹配数据',\n loading: '加载中',\n placeholder: '请选择',\n noData: '暂无数据'\n },\n pagination: {\n goto: '前往',\n pagesize: '条/页',\n total: '共 {total} 条',\n pageClassifier: '页'\n },\n messagebox: {\n title: '提示',\n confirm: '确定',\n cancel: '取消',\n error: '输入的数据不合法!'\n },\n upload: {\n deleteTip: '按 delete 键可删除',\n delete: '删除',\n preview: '查看图片',\n continue: '继续上传'\n },\n table: {\n emptyText: '暂无数据',\n confirmFilter: '筛选',\n resetFilter: '重置',\n clearFilter: '全部',\n sumText: '合计'\n },\n tree: {\n emptyText: '暂无数据'\n },\n transfer: {\n noMatch: '无匹配数据',\n noData: '无数据',\n titles: ['列表 1', '列表 2'],\n filterPlaceholder: '请输入搜索内容',\n noCheckedFormat: '共 {total} 项',\n hasCheckedFormat: '已选 {checked}/{total} 项'\n },\n image: {\n error: '加载失败'\n },\n pageHeader: {\n title: '返回'\n },\n popconfirm: {\n confirmButtonText: '确定',\n cancelButtonText: '取消'\n },\n empty: {\n description: '暂无数据'\n }\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvbG9jYWxlL2xhbmcvemgtQ04uanM/ZjBkOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsTUFBTTtBQUN2QjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixNQUFNO0FBQ2pDLDZCQUE2QixRQUFRLEVBQUUsTUFBTTtBQUM3QyxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImYwZDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIGVsOiB7XG4gICAgY29sb3JwaWNrZXI6IHtcbiAgICAgIGNvbmZpcm06ICfnoa7lrponLFxuICAgICAgY2xlYXI6ICfmuIXnqbonXG4gICAgfSxcbiAgICBkYXRlcGlja2VyOiB7XG4gICAgICBub3c6ICfmraTliLsnLFxuICAgICAgdG9kYXk6ICfku4rlpKknLFxuICAgICAgY2FuY2VsOiAn5Y+W5raIJyxcbiAgICAgIGNsZWFyOiAn5riF56m6JyxcbiAgICAgIGNvbmZpcm06ICfnoa7lrponLFxuICAgICAgc2VsZWN0RGF0ZTogJ+mAieaLqeaXpeacnycsXG4gICAgICBzZWxlY3RUaW1lOiAn6YCJ5oup5pe26Ze0JyxcbiAgICAgIHN0YXJ0RGF0ZTogJ+W8gOWni+aXpeacnycsXG4gICAgICBzdGFydFRpbWU6ICflvIDlp4vml7bpl7QnLFxuICAgICAgZW5kRGF0ZTogJ+e7k+adn+aXpeacnycsXG4gICAgICBlbmRUaW1lOiAn57uT5p2f5pe26Ze0JyxcbiAgICAgIHByZXZZZWFyOiAn5YmN5LiA5bm0JyxcbiAgICAgIG5leHRZZWFyOiAn5ZCO5LiA5bm0JyxcbiAgICAgIHByZXZNb250aDogJ+S4iuS4quaciCcsXG4gICAgICBuZXh0TW9udGg6ICfkuIvkuKrmnIgnLFxuICAgICAgeWVhcjogJ+W5tCcsXG4gICAgICBtb250aDE6ICcxIOaciCcsXG4gICAgICBtb250aDI6ICcyIOaciCcsXG4gICAgICBtb250aDM6ICczIOaciCcsXG4gICAgICBtb250aDQ6ICc0IOaciCcsXG4gICAgICBtb250aDU6ICc1IOaciCcsXG4gICAgICBtb250aDY6ICc2IOaciCcsXG4gICAgICBtb250aDc6ICc3IOaciCcsXG4gICAgICBtb250aDg6ICc4IOaciCcsXG4gICAgICBtb250aDk6ICc5IOaciCcsXG4gICAgICBtb250aDEwOiAnMTAg5pyIJyxcbiAgICAgIG1vbnRoMTE6ICcxMSDmnIgnLFxuICAgICAgbW9udGgxMjogJzEyIOaciCcsXG4gICAgICAvLyB3ZWVrOiAn5ZGo5qyhJyxcbiAgICAgIHdlZWtzOiB7XG4gICAgICAgIHN1bjogJ+aXpScsXG4gICAgICAgIG1vbjogJ+S4gCcsXG4gICAgICAgIHR1ZTogJ+S6jCcsXG4gICAgICAgIHdlZDogJ+S4iScsXG4gICAgICAgIHRodTogJ+WbmycsXG4gICAgICAgIGZyaTogJ+S6lCcsXG4gICAgICAgIHNhdDogJ+WFrSdcbiAgICAgIH0sXG4gICAgICBtb250aHM6IHtcbiAgICAgICAgamFuOiAn5LiA5pyIJyxcbiAgICAgICAgZmViOiAn5LqM5pyIJyxcbiAgICAgICAgbWFyOiAn5LiJ5pyIJyxcbiAgICAgICAgYXByOiAn5Zub5pyIJyxcbiAgICAgICAgbWF5OiAn5LqU5pyIJyxcbiAgICAgICAganVuOiAn5YWt5pyIJyxcbiAgICAgICAganVsOiAn5LiD5pyIJyxcbiAgICAgICAgYXVnOiAn5YWr5pyIJyxcbiAgICAgICAgc2VwOiAn5Lmd5pyIJyxcbiAgICAgICAgb2N0OiAn5Y2B5pyIJyxcbiAgICAgICAgbm92OiAn5Y2B5LiA5pyIJyxcbiAgICAgICAgZGVjOiAn5Y2B5LqM5pyIJ1xuICAgICAgfVxuICAgIH0sXG4gICAgc2VsZWN0OiB7XG4gICAgICBsb2FkaW5nOiAn5Yqg6L295LitJyxcbiAgICAgIG5vTWF0Y2g6ICfml6DljLnphY3mlbDmja4nLFxuICAgICAgbm9EYXRhOiAn5peg5pWw5o2uJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAn6K+36YCJ5oupJ1xuICAgIH0sXG4gICAgY2FzY2FkZXI6IHtcbiAgICAgIG5vTWF0Y2g6ICfml6DljLnphY3mlbDmja4nLFxuICAgICAgbG9hZGluZzogJ+WKoOi9veS4rScsXG4gICAgICBwbGFjZWhvbGRlcjogJ+ivt+mAieaLqScsXG4gICAgICBub0RhdGE6ICfmmoLml6DmlbDmja4nXG4gICAgfSxcbiAgICBwYWdpbmF0aW9uOiB7XG4gICAgICBnb3RvOiAn5YmN5b6AJyxcbiAgICAgIHBhZ2VzaXplOiAn5p2hL+mhtScsXG4gICAgICB0b3RhbDogJ+WFsSB7dG90YWx9IOadoScsXG4gICAgICBwYWdlQ2xhc3NpZmllcjogJ+mhtSdcbiAgICB9LFxuICAgIG1lc3NhZ2Vib3g6IHtcbiAgICAgIHRpdGxlOiAn5o+Q56S6JyxcbiAgICAgIGNvbmZpcm06ICfnoa7lrponLFxuICAgICAgY2FuY2VsOiAn5Y+W5raIJyxcbiAgICAgIGVycm9yOiAn6L6T5YWl55qE5pWw5o2u5LiN5ZCI5rOVISdcbiAgICB9LFxuICAgIHVwbG9hZDoge1xuICAgICAgZGVsZXRlVGlwOiAn5oyJIGRlbGV0ZSDplK7lj6/liKDpmaQnLFxuICAgICAgZGVsZXRlOiAn5Yig6ZmkJyxcbiAgICAgIHByZXZpZXc6ICfmn6XnnIvlm77niYcnLFxuICAgICAgY29udGludWU6ICfnu6fnu63kuIrkvKAnXG4gICAgfSxcbiAgICB0YWJsZToge1xuICAgICAgZW1wdHlUZXh0OiAn5pqC5peg5pWw5o2uJyxcbiAgICAgIGNvbmZpcm1GaWx0ZXI6ICfnrZvpgIknLFxuICAgICAgcmVzZXRGaWx0ZXI6ICfph43nva4nLFxuICAgICAgY2xlYXJGaWx0ZXI6ICflhajpg6gnLFxuICAgICAgc3VtVGV4dDogJ+WQiOiuoSdcbiAgICB9LFxuICAgIHRyZWU6IHtcbiAgICAgIGVtcHR5VGV4dDogJ+aaguaXoOaVsOaNridcbiAgICB9LFxuICAgIHRyYW5zZmVyOiB7XG4gICAgICBub01hdGNoOiAn5peg5Yy56YWN5pWw5o2uJyxcbiAgICAgIG5vRGF0YTogJ+aXoOaVsOaNricsXG4gICAgICB0aXRsZXM6IFsn5YiX6KGoIDEnLCAn5YiX6KGoIDInXSxcbiAgICAgIGZpbHRlclBsYWNlaG9sZGVyOiAn6K+36L6T5YWl5pCc57Si5YaF5a65JyxcbiAgICAgIG5vQ2hlY2tlZEZvcm1hdDogJ+WFsSB7dG90YWx9IOmhuScsXG4gICAgICBoYXNDaGVja2VkRm9ybWF0OiAn5bey6YCJIHtjaGVja2VkfS97dG90YWx9IOmhuSdcbiAgICB9LFxuICAgIGltYWdlOiB7XG4gICAgICBlcnJvcjogJ+WKoOi9veWksei0pSdcbiAgICB9LFxuICAgIHBhZ2VIZWFkZXI6IHtcbiAgICAgIHRpdGxlOiAn6L+U5ZueJ1xuICAgIH0sXG4gICAgcG9wY29uZmlybToge1xuICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLFxuICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCdcbiAgICB9LFxuICAgIGVtcHR5OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ+aaguaXoOaVsOaNridcbiAgICB9XG4gIH1cbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///f0d9\n")},f3ad:function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 75);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 11:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"2bb5\");\n\n/***/ }),\n\n/***/ 21:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"d397\");\n\n/***/ }),\n\n/***/ 4:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"d010\");\n\n/***/ }),\n\n/***/ 75:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input/src/input.vue?vue&type=template&id=343dd774&\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 class: [\n _vm.type === \"textarea\" ? \"el-textarea\" : \"el-input\",\n _vm.inputSize ? \"el-input--\" + _vm.inputSize : \"\",\n {\n \"is-disabled\": _vm.inputDisabled,\n \"is-exceed\": _vm.inputExceed,\n \"el-input-group\": _vm.$slots.prepend || _vm.$slots.append,\n \"el-input-group--append\": _vm.$slots.append,\n \"el-input-group--prepend\": _vm.$slots.prepend,\n \"el-input--prefix\": _vm.$slots.prefix || _vm.prefixIcon,\n \"el-input--suffix\":\n _vm.$slots.suffix ||\n _vm.suffixIcon ||\n _vm.clearable ||\n _vm.showPassword\n }\n ],\n on: {\n mouseenter: function($event) {\n _vm.hovering = true\n },\n mouseleave: function($event) {\n _vm.hovering = false\n }\n }\n },\n [\n _vm.type !== \"textarea\"\n ? [\n _vm.$slots.prepend\n ? _c(\n \"div\",\n { staticClass: \"el-input-group__prepend\" },\n [_vm._t(\"prepend\")],\n 2\n )\n : _vm._e(),\n _vm.type !== \"textarea\"\n ? _c(\n \"input\",\n _vm._b(\n {\n ref: \"input\",\n staticClass: \"el-input__inner\",\n attrs: {\n tabindex: _vm.tabindex,\n type: _vm.showPassword\n ? _vm.passwordVisible\n ? \"text\"\n : \"password\"\n : _vm.type,\n disabled: _vm.inputDisabled,\n readonly: _vm.readonly,\n autocomplete: _vm.autoComplete || _vm.autocomplete,\n \"aria-label\": _vm.label\n },\n on: {\n compositionstart: _vm.handleCompositionStart,\n compositionupdate: _vm.handleCompositionUpdate,\n compositionend: _vm.handleCompositionEnd,\n input: _vm.handleInput,\n focus: _vm.handleFocus,\n blur: _vm.handleBlur,\n change: _vm.handleChange\n }\n },\n \"input\",\n _vm.$attrs,\n false\n )\n )\n : _vm._e(),\n _vm.$slots.prefix || _vm.prefixIcon\n ? _c(\n \"span\",\n { staticClass: \"el-input__prefix\" },\n [\n _vm._t(\"prefix\"),\n _vm.prefixIcon\n ? _c(\"i\", {\n staticClass: \"el-input__icon\",\n class: _vm.prefixIcon\n })\n : _vm._e()\n ],\n 2\n )\n : _vm._e(),\n _vm.getSuffixVisible()\n ? _c(\"span\", { staticClass: \"el-input__suffix\" }, [\n _c(\n \"span\",\n { staticClass: \"el-input__suffix-inner\" },\n [\n !_vm.showClear ||\n !_vm.showPwdVisible ||\n !_vm.isWordLimitVisible\n ? [\n _vm._t(\"suffix\"),\n _vm.suffixIcon\n ? _c(\"i\", {\n staticClass: \"el-input__icon\",\n class: _vm.suffixIcon\n })\n : _vm._e()\n ]\n : _vm._e(),\n _vm.showClear\n ? _c(\"i\", {\n staticClass:\n \"el-input__icon el-icon-circle-close el-input__clear\",\n on: {\n mousedown: function($event) {\n $event.preventDefault()\n },\n click: _vm.clear\n }\n })\n : _vm._e(),\n _vm.showPwdVisible\n ? _c(\"i\", {\n staticClass:\n \"el-input__icon el-icon-view el-input__clear\",\n on: { click: _vm.handlePasswordVisible }\n })\n : _vm._e(),\n _vm.isWordLimitVisible\n ? _c(\"span\", { staticClass: \"el-input__count\" }, [\n _c(\n \"span\",\n { staticClass: \"el-input__count-inner\" },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(_vm.textLength) +\n \"/\" +\n _vm._s(_vm.upperLimit) +\n \"\\n \"\n )\n ]\n )\n ])\n : _vm._e()\n ],\n 2\n ),\n _vm.validateState\n ? _c(\"i\", {\n staticClass: \"el-input__icon\",\n class: [\"el-input__validateIcon\", _vm.validateIcon]\n })\n : _vm._e()\n ])\n : _vm._e(),\n _vm.$slots.append\n ? _c(\n \"div\",\n { staticClass: \"el-input-group__append\" },\n [_vm._t(\"append\")],\n 2\n )\n : _vm._e()\n ]\n : _c(\n \"textarea\",\n _vm._b(\n {\n ref: \"textarea\",\n staticClass: \"el-textarea__inner\",\n style: _vm.textareaStyle,\n attrs: {\n tabindex: _vm.tabindex,\n disabled: _vm.inputDisabled,\n readonly: _vm.readonly,\n autocomplete: _vm.autoComplete || _vm.autocomplete,\n \"aria-label\": _vm.label\n },\n on: {\n compositionstart: _vm.handleCompositionStart,\n compositionupdate: _vm.handleCompositionUpdate,\n compositionend: _vm.handleCompositionEnd,\n input: _vm.handleInput,\n focus: _vm.handleFocus,\n blur: _vm.handleBlur,\n change: _vm.handleChange\n }\n },\n \"textarea\",\n _vm.$attrs,\n false\n )\n ),\n _vm.isWordLimitVisible && _vm.type === \"textarea\"\n ? _c(\"span\", { staticClass: \"el-input__count\" }, [\n _vm._v(_vm._s(_vm.textLength) + \"/\" + _vm._s(_vm.upperLimit))\n ])\n : _vm._e()\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/input/src/input.vue?vue&type=template&id=343dd774&\n\n// EXTERNAL MODULE: external \"element-ui/lib/mixins/emitter\"\nvar emitter_ = __webpack_require__(4);\nvar emitter_default = /*#__PURE__*/__webpack_require__.n(emitter_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/mixins/migrating\"\nvar migrating_ = __webpack_require__(11);\nvar migrating_default = /*#__PURE__*/__webpack_require__.n(migrating_);\n\n// CONCATENATED MODULE: ./packages/input/src/calcTextareaHeight.js\nvar hiddenTextarea = void 0;\n\nvar HIDDEN_STYLE = '\\n height:0 !important;\\n visibility:hidden !important;\\n overflow:hidden !important;\\n position:absolute !important;\\n z-index:-1000 !important;\\n top:0 !important;\\n right:0 !important\\n';\n\nvar CONTEXT_STYLE = ['letter-spacing', 'line-height', 'padding-top', 'padding-bottom', 'font-family', 'font-weight', 'font-size', 'text-rendering', 'text-transform', 'width', 'text-indent', 'padding-left', 'padding-right', 'border-width', 'box-sizing'];\n\nfunction calculateNodeStyling(targetElement) {\n var style = window.getComputedStyle(targetElement);\n\n var boxSizing = style.getPropertyValue('box-sizing');\n\n var paddingSize = parseFloat(style.getPropertyValue('padding-bottom')) + parseFloat(style.getPropertyValue('padding-top'));\n\n var borderSize = parseFloat(style.getPropertyValue('border-bottom-width')) + parseFloat(style.getPropertyValue('border-top-width'));\n\n var contextStyle = CONTEXT_STYLE.map(function (name) {\n return name + ':' + style.getPropertyValue(name);\n }).join(';');\n\n return { contextStyle: contextStyle, paddingSize: paddingSize, borderSize: borderSize, boxSizing: boxSizing };\n}\n\nfunction calcTextareaHeight(targetElement) {\n var minRows = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var maxRows = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n if (!hiddenTextarea) {\n hiddenTextarea = document.createElement('textarea');\n document.body.appendChild(hiddenTextarea);\n }\n\n var _calculateNodeStyling = calculateNodeStyling(targetElement),\n paddingSize = _calculateNodeStyling.paddingSize,\n borderSize = _calculateNodeStyling.borderSize,\n boxSizing = _calculateNodeStyling.boxSizing,\n contextStyle = _calculateNodeStyling.contextStyle;\n\n hiddenTextarea.setAttribute('style', contextStyle + ';' + HIDDEN_STYLE);\n hiddenTextarea.value = targetElement.value || targetElement.placeholder || '';\n\n var height = hiddenTextarea.scrollHeight;\n var result = {};\n\n if (boxSizing === 'border-box') {\n height = height + borderSize;\n } else if (boxSizing === 'content-box') {\n height = height - paddingSize;\n }\n\n hiddenTextarea.value = '';\n var singleRowHeight = hiddenTextarea.scrollHeight - paddingSize;\n\n if (minRows !== null) {\n var minHeight = singleRowHeight * minRows;\n if (boxSizing === 'border-box') {\n minHeight = minHeight + paddingSize + borderSize;\n }\n height = Math.max(minHeight, height);\n result.minHeight = minHeight + 'px';\n }\n if (maxRows !== null) {\n var maxHeight = singleRowHeight * maxRows;\n if (boxSizing === 'border-box') {\n maxHeight = maxHeight + paddingSize + borderSize;\n }\n height = Math.min(maxHeight, height);\n }\n result.height = height + 'px';\n hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n hiddenTextarea = null;\n return result;\n};\n// EXTERNAL MODULE: external \"element-ui/lib/utils/merge\"\nvar merge_ = __webpack_require__(9);\nvar merge_default = /*#__PURE__*/__webpack_require__.n(merge_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/shared\"\nvar shared_ = __webpack_require__(21);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/input/src/input.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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 */ var inputvue_type_script_lang_js_ = ({\n name: 'ElInput',\n\n componentName: 'ElInput',\n\n mixins: [emitter_default.a, migrating_default.a],\n\n inheritAttrs: false,\n\n inject: {\n elForm: {\n default: ''\n },\n elFormItem: {\n default: ''\n }\n },\n\n data: function data() {\n return {\n textareaCalcStyle: {},\n hovering: false,\n focused: false,\n isComposing: false,\n passwordVisible: false\n };\n },\n\n\n props: {\n value: [String, Number],\n size: String,\n resize: String,\n form: String,\n disabled: Boolean,\n readonly: Boolean,\n type: {\n type: String,\n default: 'text'\n },\n autosize: {\n type: [Boolean, Object],\n default: false\n },\n autocomplete: {\n type: String,\n default: 'off'\n },\n /** @Deprecated in next major version */\n autoComplete: {\n type: String,\n validator: function validator(val) {\n false && false;\n return true;\n }\n },\n validateEvent: {\n type: Boolean,\n default: true\n },\n suffixIcon: String,\n prefixIcon: String,\n label: String,\n clearable: {\n type: Boolean,\n default: false\n },\n showPassword: {\n type: Boolean,\n default: false\n },\n showWordLimit: {\n type: Boolean,\n default: false\n },\n tabindex: String\n },\n\n computed: {\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n validateState: function validateState() {\n return this.elFormItem ? this.elFormItem.validateState : '';\n },\n needStatusIcon: function needStatusIcon() {\n return this.elForm ? this.elForm.statusIcon : false;\n },\n validateIcon: function validateIcon() {\n return {\n validating: 'el-icon-loading',\n success: 'el-icon-circle-check',\n error: 'el-icon-circle-close'\n }[this.validateState];\n },\n textareaStyle: function textareaStyle() {\n return merge_default()({}, this.textareaCalcStyle, { resize: this.resize });\n },\n inputSize: function inputSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n inputDisabled: function inputDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n },\n nativeInputValue: function nativeInputValue() {\n return this.value === null || this.value === undefined ? '' : String(this.value);\n },\n showClear: function showClear() {\n return this.clearable && !this.inputDisabled && !this.readonly && this.nativeInputValue && (this.focused || this.hovering);\n },\n showPwdVisible: function showPwdVisible() {\n return this.showPassword && !this.inputDisabled && !this.readonly && (!!this.nativeInputValue || this.focused);\n },\n isWordLimitVisible: function isWordLimitVisible() {\n return this.showWordLimit && this.$attrs.maxlength && (this.type === 'text' || this.type === 'textarea') && !this.inputDisabled && !this.readonly && !this.showPassword;\n },\n upperLimit: function upperLimit() {\n return this.$attrs.maxlength;\n },\n textLength: function textLength() {\n if (typeof this.value === 'number') {\n return String(this.value).length;\n }\n\n return (this.value || '').length;\n },\n inputExceed: function inputExceed() {\n // show exceed style if length of initial value greater then maxlength\n return this.isWordLimitVisible && this.textLength > this.upperLimit;\n }\n },\n\n watch: {\n value: function value(val) {\n this.$nextTick(this.resizeTextarea);\n if (this.validateEvent) {\n this.dispatch('ElFormItem', 'el.form.change', [val]);\n }\n },\n\n // native input value is set explicitly\n // do not use v-model / :value in template\n // see: https://github.com/ElemeFE/element/issues/14521\n nativeInputValue: function nativeInputValue() {\n this.setNativeInputValue();\n },\n\n // when change between <input> and <textarea>,\n // update DOM dependent value and styles\n // https://github.com/ElemeFE/element/issues/14857\n type: function type() {\n var _this = this;\n\n this.$nextTick(function () {\n _this.setNativeInputValue();\n _this.resizeTextarea();\n _this.updateIconOffset();\n });\n }\n },\n\n methods: {\n focus: function focus() {\n this.getInput().focus();\n },\n blur: function blur() {\n this.getInput().blur();\n },\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {\n 'icon': 'icon is removed, use suffix-icon / prefix-icon instead.',\n 'on-icon-click': 'on-icon-click is removed.'\n },\n events: {\n 'click': 'click is removed.'\n }\n };\n },\n handleBlur: function handleBlur(event) {\n this.focused = false;\n this.$emit('blur', event);\n if (this.validateEvent) {\n this.dispatch('ElFormItem', 'el.form.blur', [this.value]);\n }\n },\n select: function select() {\n this.getInput().select();\n },\n resizeTextarea: function resizeTextarea() {\n if (this.$isServer) return;\n var autosize = this.autosize,\n type = this.type;\n\n if (type !== 'textarea') return;\n if (!autosize) {\n this.textareaCalcStyle = {\n minHeight: calcTextareaHeight(this.$refs.textarea).minHeight\n };\n return;\n }\n var minRows = autosize.minRows;\n var maxRows = autosize.maxRows;\n\n this.textareaCalcStyle = calcTextareaHeight(this.$refs.textarea, minRows, maxRows);\n },\n setNativeInputValue: function setNativeInputValue() {\n var input = this.getInput();\n if (!input) return;\n if (input.value === this.nativeInputValue) return;\n input.value = this.nativeInputValue;\n },\n handleFocus: function handleFocus(event) {\n this.focused = true;\n this.$emit('focus', event);\n },\n handleCompositionStart: function handleCompositionStart(event) {\n this.$emit('compositionstart', event);\n this.isComposing = true;\n },\n handleCompositionUpdate: function handleCompositionUpdate(event) {\n this.$emit('compositionupdate', event);\n var text = event.target.value;\n var lastCharacter = text[text.length - 1] || '';\n this.isComposing = !Object(shared_[\"isKorean\"])(lastCharacter);\n },\n handleCompositionEnd: function handleCompositionEnd(event) {\n this.$emit('compositionend', event);\n if (this.isComposing) {\n this.isComposing = false;\n this.handleInput(event);\n }\n },\n handleInput: function handleInput(event) {\n // should not emit input during composition\n // see: https://github.com/ElemeFE/element/issues/10516\n if (this.isComposing) return;\n\n // hack for https://github.com/ElemeFE/element/issues/8548\n // should remove the following line when we don't support IE\n if (event.target.value === this.nativeInputValue) return;\n\n this.$emit('input', event.target.value);\n\n // ensure native input value is controlled\n // see: https://github.com/ElemeFE/element/issues/12850\n this.$nextTick(this.setNativeInputValue);\n },\n handleChange: function handleChange(event) {\n this.$emit('change', event.target.value);\n },\n calcIconOffset: function calcIconOffset(place) {\n var elList = [].slice.call(this.$el.querySelectorAll('.el-input__' + place) || []);\n if (!elList.length) return;\n var el = null;\n for (var i = 0; i < elList.length; i++) {\n if (elList[i].parentNode === this.$el) {\n el = elList[i];\n break;\n }\n }\n if (!el) return;\n var pendantMap = {\n suffix: 'append',\n prefix: 'prepend'\n };\n\n var pendant = pendantMap[place];\n if (this.$slots[pendant]) {\n el.style.transform = 'translateX(' + (place === 'suffix' ? '-' : '') + this.$el.querySelector('.el-input-group__' + pendant).offsetWidth + 'px)';\n } else {\n el.removeAttribute('style');\n }\n },\n updateIconOffset: function updateIconOffset() {\n this.calcIconOffset('prefix');\n this.calcIconOffset('suffix');\n },\n clear: function clear() {\n this.$emit('input', '');\n this.$emit('change', '');\n this.$emit('clear');\n },\n handlePasswordVisible: function handlePasswordVisible() {\n var _this2 = this;\n\n this.passwordVisible = !this.passwordVisible;\n this.$nextTick(function () {\n _this2.focus();\n });\n },\n getInput: function getInput() {\n return this.$refs.input || this.$refs.textarea;\n },\n getSuffixVisible: function getSuffixVisible() {\n return this.$slots.suffix || this.suffixIcon || this.showClear || this.showPassword || this.isWordLimitVisible || this.validateState && this.needStatusIcon;\n }\n },\n\n created: function created() {\n this.$on('inputSelect', this.select);\n },\n mounted: function mounted() {\n this.setNativeInputValue();\n this.resizeTextarea();\n this.updateIconOffset();\n },\n updated: function updated() {\n this.$nextTick(this.updateIconOffset);\n }\n});\n// CONCATENATED MODULE: ./packages/input/src/input.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_inputvue_type_script_lang_js_ = (inputvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/input/src/input.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n src_inputvue_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 api; }\ncomponent.options.__file = \"packages/input/src/input.vue\"\n/* harmony default export */ var input = (component.exports);\n// CONCATENATED MODULE: ./packages/input/index.js\n\n\n/* istanbul ignore next */\ninput.install = function (Vue) {\n Vue.component(input.name, input);\n};\n\n/* harmony default export */ var packages_input = __webpack_exports__[\"default\"] = (input);\n\n/***/ }),\n\n/***/ 9:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"7f4d\");\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvaW5wdXQuanM/ZjNhZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxnQ0FBZ0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLGtCQUFrQjtBQUNsRjtBQUNBLHlEQUF5RCxjQUFjO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGlDQUFpQztBQUNsRix3SEFBd0gsbUJBQW1CLEVBQUU7QUFDN0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDBCQUEwQixFQUFFO0FBQy9ELHlDQUF5QyxlQUFlO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsK0RBQStEO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJGQUEyRiwyQkFBMkIsRUFBRTtBQUN4SDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFD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QUFFQSw0Q0FBNEMsaUNBQWlDLCtCQUErQixpQ0FBaUMsNkJBQTZCLHFCQUFxQjs7QUFFL0w7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRyxTQUFTOztBQUVaLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3REFBd0Q7QUFDeEQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE1BQUssSUFBSSxLQUFLO0FBQ3ZCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSwrQkFBK0IsMkJBQTJCLHNCQUFzQjtBQUNoRixLQUFLO0FBQ0w7QUFDQSxzRUFBc0U7QUFDdEUsS0FBSztBQUNMO0FBQ0EsZ0RBQWdEO0FBQ2hELEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixtQkFBbUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxzRztBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBNEI7O0FBRXJELE9BQU87O0FBRVAsVUFBVSIsImZpbGUiOiJmM2FkLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbi8qKioqKiovIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4vKioqKioqLyBcdFx0cmV0dXJuIG5zO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9kaXN0L1wiO1xuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA3NSk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovICh7XG5cbi8qKiovIDA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBub3JtYWxpemVDb21wb25lbnQ7IH0pO1xuLyogZ2xvYmFscyBfX1ZVRV9TU1JfQ09OVEVYVF9fICovXG5cbi8vIElNUE9SVEFOVDogRG8gTk9UIHVzZSBFUzIwMTUgZmVhdHVyZXMgaW4gdGhpcyBmaWxlIChleGNlcHQgZm9yIG1vZHVsZXMpLlxuLy8gVGhpcyBtb2R1bGUgaXMgYSBydW50aW1lIHV0aWxpdHkgZm9yIGNsZWFuZXIgY29tcG9uZW50IG1vZHVsZSBvdXRwdXQgYW5kIHdpbGxcbi8vIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCB3ZWJwYWNrIHVzZXIgYnVuZGxlLlxuXG5mdW5jdGlvbiBub3JtYWxpemVDb21wb25lbnQgKFxuICBzY3JpcHRFeHBvcnRzLFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZnVuY3Rpb25hbFRlbXBsYXRlLFxuICBpbmplY3RTdHlsZXMsXG4gIHNjb3BlSWQsXG4gIG1vZHVsZUlkZW50aWZpZXIsIC8qIHNlcnZlciBvbmx5ICovXG4gIHNoYWRvd01vZGUgLyogdnVlLWNsaSBvbmx5ICovXG4pIHtcbiAgLy8gVnVlLmV4dGVuZCBjb25zdHJ1Y3RvciBleHBvcnQgaW50ZXJvcFxuICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nXG4gICAgPyBzY3JpcHRFeHBvcnRzLm9wdGlvbnNcbiAgICA6IHNjcmlwdEV4cG9ydHNcblxuICAvLyByZW5kZXIgZnVuY3Rpb25zXG4gIGlmIChyZW5kZXIpIHtcbiAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlclxuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gc3RhdGljUmVuZGVyRm5zXG4gICAgb3B0aW9ucy5fY29tcGlsZWQgPSB0cnVlXG4gIH1cblxuICAvLyBmdW5jdGlvbmFsIHRlbXBsYXRlXG4gIGlmIChmdW5jdGlvbmFsVGVtcGxhdGUpIHtcbiAgICBvcHRpb25zLmZ1bmN0aW9uYWwgPSB0cnVlXG4gIH1cblxuICAvLyBzY29wZWRJZFxuICBpZiAoc2NvcGVJZCkge1xuICAgIG9wdGlvbnMuX3Njb3BlSWQgPSAnZGF0YS12LScgKyBzY29wZUlkXG4gIH1cblxuICB2YXIgaG9va1xuICBpZiAobW9kdWxlSWRlbnRpZmllcikgeyAvLyBzZXJ2ZXIgYnVpbGRcbiAgICBob29rID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIC8vIDIuMyBpbmplY3Rpb25cbiAgICAgIGNvbnRleHQgPVxuICAgICAgICBjb250ZXh0IHx8IC8vIGNhY2hlZCBjYWxsXG4gICAgICAgICh0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0KSB8fCAvLyBzdGF0ZWZ1bFxuICAgICAgICAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuJHZub2RlICYmIHRoaXMucGFyZW50LiR2bm9kZS5zc3JDb250ZXh0KSAvLyBmdW5jdGlvbmFsXG4gICAgICAvLyAyLjIgd2l0aCBydW5Jbk5ld0NvbnRleHQ6IHRydWVcbiAgICAgIGlmICghY29udGV4dCAmJiB0eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfXyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29udGV4dCA9IF9fVlVFX1NTUl9DT05URVhUX19cbiAgICAgIH1cbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgc3R5bGVzXG4gICAgICBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgICAgIGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIGNvbnRleHQpXG4gICAgICB9XG4gICAgICAvLyByZWdpc3RlciBjb21wb25lbnQgbW9kdWxlIGlkZW50aWZpZXIgZm9yIGFzeW5jIGNodW5rIGluZmVycmVuY2VcbiAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzKSB7XG4gICAgICAgIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzLmFkZChtb2R1bGVJZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB1c2VkIGJ5IHNzciBpbiBjYXNlIGNvbXBvbmVudCBpcyBjYWNoZWQgYW5kIGJlZm9yZUNyZWF0ZVxuICAgIC8vIG5ldmVyIGdldHMgY2FsbGVkXG4gICAgb3B0aW9ucy5fc3NyUmVnaXN0ZXIgPSBob29rXG4gIH0gZWxzZSBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgaG9vayA9IHNoYWRvd01vZGVcbiAgICAgID8gZnVuY3Rpb24gKCkgeyBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCB0aGlzLiRyb290LiRvcHRpb25zLnNoYWRvd1Jvb3QpIH1cbiAgICAgIDogaW5qZWN0U3R5bGVzXG4gIH1cblxuICBpZiAoaG9vaykge1xuICAgIGlmIChvcHRpb25zLmZ1bmN0aW9uYWwpIHtcbiAgICAgIC8vIGZvciB0ZW1wbGF0ZS1vbmx5IGhvdC1yZWxvYWQgYmVjYXVzZSBpbiB0aGF0IGNhc2UgdGhlIHJlbmRlciBmbiBkb2Vzbid0XG4gICAgICAvLyBnbyB0aHJvdWdoIHRoZSBub3JtYWxpemVyXG4gICAgICBvcHRpb25zLl9pbmplY3RTdHlsZXMgPSBob29rXG4gICAgICAvLyByZWdpc3RlciBmb3IgZnVuY3Rpb2FsIGNvbXBvbmVudCBpbiB2dWUgZmlsZVxuICAgICAgdmFyIG9yaWdpbmFsUmVuZGVyID0gb3B0aW9ucy5yZW5kZXJcbiAgICAgIG9wdGlvbnMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyV2l0aFN0eWxlSW5qZWN0aW9uIChoLCBjb250ZXh0KSB7XG4gICAgICAgIGhvb2suY2FsbChjb250ZXh0KVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxSZW5kZXIoaCwgY29udGV4dClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCByZWdpc3RyYXRpb24gYXMgYmVmb3JlQ3JlYXRlIGhvb2tcbiAgICAgIHZhciBleGlzdGluZyA9IG9wdGlvbnMuYmVmb3JlQ3JlYXRlXG4gICAgICBvcHRpb25zLmJlZm9yZUNyZWF0ZSA9IGV4aXN0aW5nXG4gICAgICAgID8gW10uY29uY2F0KGV4aXN0aW5nLCBob29rKVxuICAgICAgICA6IFtob29rXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXhwb3J0czogc2NyaXB0RXhwb3J0cyxcbiAgICBvcHRpb25zOiBvcHRpb25zXG4gIH1cbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMTE6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL21peGlucy9taWdyYXRpbmdcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyMTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvc2hhcmVkXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2VtaXR0ZXJcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3NTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaW5wdXQvc3JjL2lucHV0LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zNDNkZDc3NCZcbnZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBjbGFzczogW1xuICAgICAgICBfdm0udHlwZSA9PT0gXCJ0ZXh0YXJlYVwiID8gXCJlbC10ZXh0YXJlYVwiIDogXCJlbC1pbnB1dFwiLFxuICAgICAgICBfdm0uaW5wdXRTaXplID8gXCJlbC1pbnB1dC0tXCIgKyBfdm0uaW5wdXRTaXplIDogXCJcIixcbiAgICAgICAge1xuICAgICAgICAgIFwiaXMtZGlzYWJsZWRcIjogX3ZtLmlucHV0RGlzYWJsZWQsXG4gICAgICAgICAgXCJpcy1leGNlZWRcIjogX3ZtLmlucHV0RXhjZWVkLFxuICAgICAgICAgIFwiZWwtaW5wdXQtZ3JvdXBcIjogX3ZtLiRzbG90cy5wcmVwZW5kIHx8IF92bS4kc2xvdHMuYXBwZW5kLFxuICAgICAgICAgIFwiZWwtaW5wdXQtZ3JvdXAtLWFwcGVuZFwiOiBfdm0uJHNsb3RzLmFwcGVuZCxcbiAgICAgICAgICBcImVsLWlucHV0LWdyb3VwLS1wcmVwZW5kXCI6IF92bS4kc2xvdHMucHJlcGVuZCxcbiAgICAgICAgICBcImVsLWlucHV0LS1wcmVmaXhcIjogX3ZtLiRzbG90cy5wcmVmaXggfHwgX3ZtLnByZWZpeEljb24sXG4gICAgICAgICAgXCJlbC1pbnB1dC0tc3VmZml4XCI6XG4gICAgICAgICAgICBfdm0uJHNsb3RzLnN1ZmZpeCB8fFxuICAgICAgICAgICAgX3ZtLnN1ZmZpeEljb24gfHxcbiAgICAgICAgICAgIF92bS5jbGVhcmFibGUgfHxcbiAgICAgICAgICAgIF92bS5zaG93UGFzc3dvcmRcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIG9uOiB7XG4gICAgICAgIG1vdXNlZW50ZXI6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgIF92bS5ob3ZlcmluZyA9IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgbW91c2VsZWF2ZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgX3ZtLmhvdmVyaW5nID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX3ZtLnR5cGUgIT09IFwidGV4dGFyZWFcIlxuICAgICAgICA/IFtcbiAgICAgICAgICAgIF92bS4kc2xvdHMucHJlcGVuZFxuICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtaW5wdXQtZ3JvdXBfX3ByZXBlbmRcIiB9LFxuICAgICAgICAgICAgICAgICAgW192bS5fdChcInByZXBlbmRcIildLFxuICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgIF92bS50eXBlICE9PSBcInRleHRhcmVhXCJcbiAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgIFwiaW5wdXRcIixcbiAgICAgICAgICAgICAgICAgIF92bS5fYihcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHJlZjogXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWlucHV0X19pbm5lclwiLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleDogX3ZtLnRhYmluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogX3ZtLnNob3dQYXNzd29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IF92bS5wYXNzd29yZFZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBfdm0uaW5wdXREaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHksXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU6IF92bS5hdXRvQ29tcGxldGUgfHwgX3ZtLmF1dG9jb21wbGV0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiOiBfdm0ubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbnN0YXJ0OiBfdm0uaGFuZGxlQ29tcG9zaXRpb25TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9udXBkYXRlOiBfdm0uaGFuZGxlQ29tcG9zaXRpb25VcGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbmVuZDogX3ZtLmhhbmRsZUNvbXBvc2l0aW9uRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IF92bS5oYW5kbGVJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzOiBfdm0uaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBibHVyOiBfdm0uaGFuZGxlQmx1cixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogX3ZtLmhhbmRsZUNoYW5nZVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgICAgICBfdm0uJGF0dHJzLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgIF92bS4kc2xvdHMucHJlZml4IHx8IF92bS5wcmVmaXhJY29uXG4gICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtaW5wdXRfX3ByZWZpeFwiIH0sXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIF92bS5fdChcInByZWZpeFwiKSxcbiAgICAgICAgICAgICAgICAgICAgX3ZtLnByZWZpeEljb25cbiAgICAgICAgICAgICAgICAgICAgICA/IF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWlucHV0X19pY29uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBfdm0ucHJlZml4SWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgIF92bS5nZXRTdWZmaXhWaXNpYmxlKClcbiAgICAgICAgICAgICAgPyBfYyhcInNwYW5cIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pbnB1dF9fc3VmZml4XCIgfSwgW1xuICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImVsLWlucHV0X19zdWZmaXgtaW5uZXJcIiB9LFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgIV92bS5zaG93Q2xlYXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAhX3ZtLnNob3dQd2RWaXNpYmxlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgIV92bS5pc1dvcmRMaW1pdFZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdChcInN1ZmZpeFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uc3VmZml4SWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWlucHV0X19pY29uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IF92bS5zdWZmaXhJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLnNob3dDbGVhclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC1pbnB1dF9faWNvbiBlbC1pY29uLWNpcmNsZS1jbG9zZSBlbC1pbnB1dF9fY2xlYXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2Vkb3duOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogX3ZtLmNsZWFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICBfdm0uc2hvd1B3ZFZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gX2MoXCJpXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtaW5wdXRfX2ljb24gZWwtaWNvbi12aWV3IGVsLWlucHV0X19jbGVhclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7IGNsaWNrOiBfdm0uaGFuZGxlUGFzc3dvcmRWaXNpYmxlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3ZtLl9lKCksXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLmlzV29yZExpbWl0VmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfYyhcInNwYW5cIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pbnB1dF9fY291bnRcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiZWwtaW5wdXRfX2NvdW50LWlubmVyXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICAgICAgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKF92bS50ZXh0TGVuZ3RoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi9cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3MoX3ZtLnVwcGVyTGltaXQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBfdm0udmFsaWRhdGVTdGF0ZVxuICAgICAgICAgICAgICAgICAgICA/IF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1pbnB1dF9faWNvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFtcImVsLWlucHV0X192YWxpZGF0ZUljb25cIiwgX3ZtLnZhbGlkYXRlSWNvbl1cbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgICAgICAgIF92bS4kc2xvdHMuYXBwZW5kXG4gICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1pbnB1dC1ncm91cF9fYXBwZW5kXCIgfSxcbiAgICAgICAgICAgICAgICAgIFtfdm0uX3QoXCJhcHBlbmRcIildLFxuICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBfdm0uX2UoKVxuICAgICAgICAgIF1cbiAgICAgICAgOiBfYyhcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIixcbiAgICAgICAgICAgIF92bS5fYihcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlZjogXCJ0ZXh0YXJlYVwiLFxuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXRleHRhcmVhX19pbm5lclwiLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBfdm0udGV4dGFyZWFTdHlsZSxcbiAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgdGFiaW5kZXg6IF92bS50YWJpbmRleCxcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBfdm0uaW5wdXREaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHksXG4gICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU6IF92bS5hdXRvQ29tcGxldGUgfHwgX3ZtLmF1dG9jb21wbGV0ZSxcbiAgICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiOiBfdm0ubGFiZWxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbnN0YXJ0OiBfdm0uaGFuZGxlQ29tcG9zaXRpb25TdGFydCxcbiAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9udXBkYXRlOiBfdm0uaGFuZGxlQ29tcG9zaXRpb25VcGRhdGUsXG4gICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbmVuZDogX3ZtLmhhbmRsZUNvbXBvc2l0aW9uRW5kLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IF92bS5oYW5kbGVJbnB1dCxcbiAgICAgICAgICAgICAgICAgIGZvY3VzOiBfdm0uaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgICAgICBibHVyOiBfdm0uaGFuZGxlQmx1cixcbiAgICAgICAgICAgICAgICAgIGNoYW5nZTogX3ZtLmhhbmRsZUNoYW5nZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiLFxuICAgICAgICAgICAgICBfdm0uJGF0dHJzLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICBfdm0uaXNXb3JkTGltaXRWaXNpYmxlICYmIF92bS50eXBlID09PSBcInRleHRhcmVhXCJcbiAgICAgICAgPyBfYyhcInNwYW5cIiwgeyBzdGF0aWNDbGFzczogXCJlbC1pbnB1dF9fY291bnRcIiB9LCBbXG4gICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKF92bS50ZXh0TGVuZ3RoKSArIFwiL1wiICsgX3ZtLl9zKF92bS51cHBlckxpbWl0KSlcbiAgICAgICAgICBdKVxuICAgICAgICA6IF92bS5fZSgpXG4gICAgXSxcbiAgICAyXG4gIClcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbnB1dC9zcmMvaW5wdXQudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTM0M2RkNzc0JlxuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2VtaXR0ZXJcIlxudmFyIGVtaXR0ZXJfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBlbWl0dGVyX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGVtaXR0ZXJfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL21peGlucy9taWdyYXRpbmdcIlxudmFyIG1pZ3JhdGluZ18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcbnZhciBtaWdyYXRpbmdfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obWlncmF0aW5nXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5wdXQvc3JjL2NhbGNUZXh0YXJlYUhlaWdodC5qc1xudmFyIGhpZGRlblRleHRhcmVhID0gdm9pZCAwO1xuXG52YXIgSElEREVOX1NUWUxFID0gJ1xcbiAgaGVpZ2h0OjAgIWltcG9ydGFudDtcXG4gIHZpc2liaWxpdHk6aGlkZGVuICFpbXBvcnRhbnQ7XFxuICBvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudDtcXG4gIHBvc2l0aW9uOmFic29sdXRlICFpbXBvcnRhbnQ7XFxuICB6LWluZGV4Oi0xMDAwICFpbXBvcnRhbnQ7XFxuICB0b3A6MCAhaW1wb3J0YW50O1xcbiAgcmlnaHQ6MCAhaW1wb3J0YW50XFxuJztcblxudmFyIENPTlRFWFRfU1RZTEUgPSBbJ2xldHRlci1zcGFjaW5nJywgJ2xpbmUtaGVpZ2h0JywgJ3BhZGRpbmctdG9wJywgJ3BhZGRpbmctYm90dG9tJywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtd2VpZ2h0JywgJ2ZvbnQtc2l6ZScsICd0ZXh0LXJlbmRlcmluZycsICd0ZXh0LXRyYW5zZm9ybScsICd3aWR0aCcsICd0ZXh0LWluZGVudCcsICdwYWRkaW5nLWxlZnQnLCAncGFkZGluZy1yaWdodCcsICdib3JkZXItd2lkdGgnLCAnYm94LXNpemluZyddO1xuXG5mdW5jdGlvbiBjYWxjdWxhdGVOb2RlU3R5bGluZyh0YXJnZXRFbGVtZW50KSB7XG4gIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldEVsZW1lbnQpO1xuXG4gIHZhciBib3hTaXppbmcgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3gtc2l6aW5nJyk7XG5cbiAgdmFyIHBhZGRpbmdTaXplID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpKSArIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSk7XG5cbiAgdmFyIGJvcmRlclNpemUgPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci1ib3R0b20td2lkdGgnKSkgKyBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci10b3Atd2lkdGgnKSk7XG5cbiAgdmFyIGNvbnRleHRTdHlsZSA9IENPTlRFWFRfU1RZTEUubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWUgKyAnOicgKyBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xuICB9KS5qb2luKCc7Jyk7XG5cbiAgcmV0dXJuIHsgY29udGV4dFN0eWxlOiBjb250ZXh0U3R5bGUsIHBhZGRpbmdTaXplOiBwYWRkaW5nU2l6ZSwgYm9yZGVyU2l6ZTogYm9yZGVyU2l6ZSwgYm94U2l6aW5nOiBib3hTaXppbmcgfTtcbn1cblxuZnVuY3Rpb24gY2FsY1RleHRhcmVhSGVpZ2h0KHRhcmdldEVsZW1lbnQpIHtcbiAgdmFyIG1pblJvd3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gIHZhciBtYXhSb3dzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuXG4gIGlmICghaGlkZGVuVGV4dGFyZWEpIHtcbiAgICBoaWRkZW5UZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoaWRkZW5UZXh0YXJlYSk7XG4gIH1cblxuICB2YXIgX2NhbGN1bGF0ZU5vZGVTdHlsaW5nID0gY2FsY3VsYXRlTm9kZVN0eWxpbmcodGFyZ2V0RWxlbWVudCksXG4gICAgICBwYWRkaW5nU2l6ZSA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5wYWRkaW5nU2l6ZSxcbiAgICAgIGJvcmRlclNpemUgPSBfY2FsY3VsYXRlTm9kZVN0eWxpbmcuYm9yZGVyU2l6ZSxcbiAgICAgIGJveFNpemluZyA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5ib3hTaXppbmcsXG4gICAgICBjb250ZXh0U3R5bGUgPSBfY2FsY3VsYXRlTm9kZVN0eWxpbmcuY29udGV4dFN0eWxlO1xuXG4gIGhpZGRlblRleHRhcmVhLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBjb250ZXh0U3R5bGUgKyAnOycgKyBISURERU5fU1RZTEUpO1xuICBoaWRkZW5UZXh0YXJlYS52YWx1ZSA9IHRhcmdldEVsZW1lbnQudmFsdWUgfHwgdGFyZ2V0RWxlbWVudC5wbGFjZWhvbGRlciB8fCAnJztcblxuICB2YXIgaGVpZ2h0ID0gaGlkZGVuVGV4dGFyZWEuc2Nyb2xsSGVpZ2h0O1xuICB2YXIgcmVzdWx0ID0ge307XG5cbiAgaWYgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgaGVpZ2h0ID0gaGVpZ2h0ICsgYm9yZGVyU2l6ZTtcbiAgfSBlbHNlIGlmIChib3hTaXppbmcgPT09ICdjb250ZW50LWJveCcpIHtcbiAgICBoZWlnaHQgPSBoZWlnaHQgLSBwYWRkaW5nU2l6ZTtcbiAgfVxuXG4gIGhpZGRlblRleHRhcmVhLnZhbHVlID0gJyc7XG4gIHZhciBzaW5nbGVSb3dIZWlnaHQgPSBoaWRkZW5UZXh0YXJlYS5zY3JvbGxIZWlnaHQgLSBwYWRkaW5nU2l6ZTtcblxuICBpZiAobWluUm93cyAhPT0gbnVsbCkge1xuICAgIHZhciBtaW5IZWlnaHQgPSBzaW5nbGVSb3dIZWlnaHQgKiBtaW5Sb3dzO1xuICAgIGlmIChib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xuICAgICAgbWluSGVpZ2h0ID0gbWluSGVpZ2h0ICsgcGFkZGluZ1NpemUgKyBib3JkZXJTaXplO1xuICAgIH1cbiAgICBoZWlnaHQgPSBNYXRoLm1heChtaW5IZWlnaHQsIGhlaWdodCk7XG4gICAgcmVzdWx0Lm1pbkhlaWdodCA9IG1pbkhlaWdodCArICdweCc7XG4gIH1cbiAgaWYgKG1heFJvd3MgIT09IG51bGwpIHtcbiAgICB2YXIgbWF4SGVpZ2h0ID0gc2luZ2xlUm93SGVpZ2h0ICogbWF4Um93cztcbiAgICBpZiAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAgIG1heEhlaWdodCA9IG1heEhlaWdodCArIHBhZGRpbmdTaXplICsgYm9yZGVyU2l6ZTtcbiAgICB9XG4gICAgaGVpZ2h0ID0gTWF0aC5taW4obWF4SGVpZ2h0LCBoZWlnaHQpO1xuICB9XG4gIHJlc3VsdC5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICBoaWRkZW5UZXh0YXJlYS5wYXJlbnROb2RlICYmIGhpZGRlblRleHRhcmVhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaGlkZGVuVGV4dGFyZWEpO1xuICBoaWRkZW5UZXh0YXJlYSA9IG51bGw7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL21lcmdlXCJcbnZhciBtZXJnZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xudmFyIG1lcmdlX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKG1lcmdlXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9zaGFyZWRcIlxudmFyIHNoYXJlZF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaW5wdXQvc3JjL2lucHV0LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGlucHV0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsSW5wdXQnLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbElucHV0JyxcblxuICBtaXhpbnM6IFtlbWl0dGVyX2RlZmF1bHQuYSwgbWlncmF0aW5nX2RlZmF1bHQuYV0sXG5cbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBlbEZvcm1JdGVtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH1cbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0YXJlYUNhbGNTdHlsZToge30sXG4gICAgICBob3ZlcmluZzogZmFsc2UsXG4gICAgICBmb2N1c2VkOiBmYWxzZSxcbiAgICAgIGlzQ29tcG9zaW5nOiBmYWxzZSxcbiAgICAgIHBhc3N3b3JkVmlzaWJsZTogZmFsc2VcbiAgICB9O1xuICB9LFxuXG5cbiAgcHJvcHM6IHtcbiAgICB2YWx1ZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgcmVzaXplOiBTdHJpbmcsXG4gICAgZm9ybTogU3RyaW5nLFxuICAgIGRpc2FibGVkOiBCb29sZWFuLFxuICAgIHJlYWRvbmx5OiBCb29sZWFuLFxuICAgIHR5cGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICd0ZXh0J1xuICAgIH0sXG4gICAgYXV0b3NpemU6IHtcbiAgICAgIHR5cGU6IFtCb29sZWFuLCBPYmplY3RdLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIGF1dG9jb21wbGV0ZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ29mZidcbiAgICB9LFxuICAgIC8qKiBARGVwcmVjYXRlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24gKi9cbiAgICBhdXRvQ29tcGxldGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkge1xuICAgICAgICAgZmFsc2UgJiYgZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgdmFsaWRhdGVFdmVudDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIHN1ZmZpeEljb246IFN0cmluZyxcbiAgICBwcmVmaXhJY29uOiBTdHJpbmcsXG4gICAgbGFiZWw6IFN0cmluZyxcbiAgICBjbGVhcmFibGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgc2hvd1Bhc3N3b3JkOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIHNob3dXb3JkTGltaXQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgdGFiaW5kZXg6IFN0cmluZ1xuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgX2VsRm9ybUl0ZW1TaXplOiBmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZWxGb3JtSXRlbSB8fCB7fSkuZWxGb3JtSXRlbVNpemU7XG4gICAgfSxcbiAgICB2YWxpZGF0ZVN0YXRlOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXRlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxGb3JtSXRlbSA/IHRoaXMuZWxGb3JtSXRlbS52YWxpZGF0ZVN0YXRlIDogJyc7XG4gICAgfSxcbiAgICBuZWVkU3RhdHVzSWNvbjogZnVuY3Rpb24gbmVlZFN0YXR1c0ljb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbEZvcm0gPyB0aGlzLmVsRm9ybS5zdGF0dXNJY29uIDogZmFsc2U7XG4gICAgfSxcbiAgICB2YWxpZGF0ZUljb246IGZ1bmN0aW9uIHZhbGlkYXRlSWNvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkYXRpbmc6ICdlbC1pY29uLWxvYWRpbmcnLFxuICAgICAgICBzdWNjZXNzOiAnZWwtaWNvbi1jaXJjbGUtY2hlY2snLFxuICAgICAgICBlcnJvcjogJ2VsLWljb24tY2lyY2xlLWNsb3NlJ1xuICAgICAgfVt0aGlzLnZhbGlkYXRlU3RhdGVdO1xuICAgIH0sXG4gICAgdGV4dGFyZWFTdHlsZTogZnVuY3Rpb24gdGV4dGFyZWFTdHlsZSgpIHtcbiAgICAgIHJldHVybiBtZXJnZV9kZWZhdWx0KCkoe30sIHRoaXMudGV4dGFyZWFDYWxjU3R5bGUsIHsgcmVzaXplOiB0aGlzLnJlc2l6ZSB9KTtcbiAgICB9LFxuICAgIGlucHV0U2l6ZTogZnVuY3Rpb24gaW5wdXRTaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSB8fCB0aGlzLl9lbEZvcm1JdGVtU2l6ZSB8fCAodGhpcy4kRUxFTUVOVCB8fCB7fSkuc2l6ZTtcbiAgICB9LFxuICAgIGlucHV0RGlzYWJsZWQ6IGZ1bmN0aW9uIGlucHV0RGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkO1xuICAgIH0sXG4gICAgbmF0aXZlSW5wdXRWYWx1ZTogZnVuY3Rpb24gbmF0aXZlSW5wdXRWYWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlID09PSBudWxsIHx8IHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKHRoaXMudmFsdWUpO1xuICAgIH0sXG4gICAgc2hvd0NsZWFyOiBmdW5jdGlvbiBzaG93Q2xlYXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbGVhcmFibGUgJiYgIXRoaXMuaW5wdXREaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSAmJiB0aGlzLm5hdGl2ZUlucHV0VmFsdWUgJiYgKHRoaXMuZm9jdXNlZCB8fCB0aGlzLmhvdmVyaW5nKTtcbiAgICB9LFxuICAgIHNob3dQd2RWaXNpYmxlOiBmdW5jdGlvbiBzaG93UHdkVmlzaWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3dQYXNzd29yZCAmJiAhdGhpcy5pbnB1dERpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5ICYmICghIXRoaXMubmF0aXZlSW5wdXRWYWx1ZSB8fCB0aGlzLmZvY3VzZWQpO1xuICAgIH0sXG4gICAgaXNXb3JkTGltaXRWaXNpYmxlOiBmdW5jdGlvbiBpc1dvcmRMaW1pdFZpc2libGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93V29yZExpbWl0ICYmIHRoaXMuJGF0dHJzLm1heGxlbmd0aCAmJiAodGhpcy50eXBlID09PSAndGV4dCcgfHwgdGhpcy50eXBlID09PSAndGV4dGFyZWEnKSAmJiAhdGhpcy5pbnB1dERpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5ICYmICF0aGlzLnNob3dQYXNzd29yZDtcbiAgICB9LFxuICAgIHVwcGVyTGltaXQ6IGZ1bmN0aW9uIHVwcGVyTGltaXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kYXR0cnMubWF4bGVuZ3RoO1xuICAgIH0sXG4gICAgdGV4dExlbmd0aDogZnVuY3Rpb24gdGV4dExlbmd0aCgpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlKS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAodGhpcy52YWx1ZSB8fCAnJykubGVuZ3RoO1xuICAgIH0sXG4gICAgaW5wdXRFeGNlZWQ6IGZ1bmN0aW9uIGlucHV0RXhjZWVkKCkge1xuICAgICAgLy8gc2hvdyBleGNlZWQgc3R5bGUgaWYgbGVuZ3RoIG9mIGluaXRpYWwgdmFsdWUgZ3JlYXRlciB0aGVuIG1heGxlbmd0aFxuICAgICAgcmV0dXJuIHRoaXMuaXNXb3JkTGltaXRWaXNpYmxlICYmIHRoaXMudGV4dExlbmd0aCA+IHRoaXMudXBwZXJMaW1pdDtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG4gICAgICB0aGlzLiRuZXh0VGljayh0aGlzLnJlc2l6ZVRleHRhcmVhKTtcbiAgICAgIGlmICh0aGlzLnZhbGlkYXRlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsICdlbC5mb3JtLmNoYW5nZScsIFt2YWxdKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gbmF0aXZlIGlucHV0IHZhbHVlIGlzIHNldCBleHBsaWNpdGx5XG4gICAgLy8gZG8gbm90IHVzZSB2LW1vZGVsIC8gOnZhbHVlIGluIHRlbXBsYXRlXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy8xNDUyMVxuICAgIG5hdGl2ZUlucHV0VmFsdWU6IGZ1bmN0aW9uIG5hdGl2ZUlucHV0VmFsdWUoKSB7XG4gICAgICB0aGlzLnNldE5hdGl2ZUlucHV0VmFsdWUoKTtcbiAgICB9LFxuXG4gICAgLy8gd2hlbiBjaGFuZ2UgYmV0d2VlbiA8aW5wdXQ+IGFuZCA8dGV4dGFyZWE+LFxuICAgIC8vIHVwZGF0ZSBET00gZGVwZW5kZW50IHZhbHVlIGFuZCBzdHlsZXNcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vRWxlbWVGRS9lbGVtZW50L2lzc3Vlcy8xNDg1N1xuICAgIHR5cGU6IGZ1bmN0aW9uIHR5cGUoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnNldE5hdGl2ZUlucHV0VmFsdWUoKTtcbiAgICAgICAgX3RoaXMucmVzaXplVGV4dGFyZWEoKTtcbiAgICAgICAgX3RoaXMudXBkYXRlSWNvbk9mZnNldCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICB0aGlzLmdldElucHV0KCkuZm9jdXMoKTtcbiAgICB9LFxuICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICB0aGlzLmdldElucHV0KCkuYmx1cigpO1xuICAgIH0sXG4gICAgZ2V0TWlncmF0aW5nQ29uZmlnOiBmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICdpY29uJzogJ2ljb24gaXMgcmVtb3ZlZCwgdXNlIHN1ZmZpeC1pY29uIC8gcHJlZml4LWljb24gaW5zdGVhZC4nLFxuICAgICAgICAgICdvbi1pY29uLWNsaWNrJzogJ29uLWljb24tY2xpY2sgaXMgcmVtb3ZlZC4nXG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICdjbGljayc6ICdjbGljayBpcyByZW1vdmVkLidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgIGhhbmRsZUJsdXI6IGZ1bmN0aW9uIGhhbmRsZUJsdXIoZXZlbnQpIHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgdGhpcy4kZW1pdCgnYmx1cicsIGV2ZW50KTtcbiAgICAgIGlmICh0aGlzLnZhbGlkYXRlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCgnRWxGb3JtSXRlbScsICdlbC5mb3JtLmJsdXInLCBbdGhpcy52YWx1ZV0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QoKSB7XG4gICAgICB0aGlzLmdldElucHV0KCkuc2VsZWN0KCk7XG4gICAgfSxcbiAgICByZXNpemVUZXh0YXJlYTogZnVuY3Rpb24gcmVzaXplVGV4dGFyZWEoKSB7XG4gICAgICBpZiAodGhpcy4kaXNTZXJ2ZXIpIHJldHVybjtcbiAgICAgIHZhciBhdXRvc2l6ZSA9IHRoaXMuYXV0b3NpemUsXG4gICAgICAgICAgdHlwZSA9IHRoaXMudHlwZTtcblxuICAgICAgaWYgKHR5cGUgIT09ICd0ZXh0YXJlYScpIHJldHVybjtcbiAgICAgIGlmICghYXV0b3NpemUpIHtcbiAgICAgICAgdGhpcy50ZXh0YXJlYUNhbGNTdHlsZSA9IHtcbiAgICAgICAgICBtaW5IZWlnaHQ6IGNhbGNUZXh0YXJlYUhlaWdodCh0aGlzLiRyZWZzLnRleHRhcmVhKS5taW5IZWlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG1pblJvd3MgPSBhdXRvc2l6ZS5taW5Sb3dzO1xuICAgICAgdmFyIG1heFJvd3MgPSBhdXRvc2l6ZS5tYXhSb3dzO1xuXG4gICAgICB0aGlzLnRleHRhcmVhQ2FsY1N0eWxlID0gY2FsY1RleHRhcmVhSGVpZ2h0KHRoaXMuJHJlZnMudGV4dGFyZWEsIG1pblJvd3MsIG1heFJvd3MpO1xuICAgIH0sXG4gICAgc2V0TmF0aXZlSW5wdXRWYWx1ZTogZnVuY3Rpb24gc2V0TmF0aXZlSW5wdXRWYWx1ZSgpIHtcbiAgICAgIHZhciBpbnB1dCA9IHRoaXMuZ2V0SW5wdXQoKTtcbiAgICAgIGlmICghaW5wdXQpIHJldHVybjtcbiAgICAgIGlmIChpbnB1dC52YWx1ZSA9PT0gdGhpcy5uYXRpdmVJbnB1dFZhbHVlKSByZXR1cm47XG4gICAgICBpbnB1dC52YWx1ZSA9IHRoaXMubmF0aXZlSW5wdXRWYWx1ZTtcbiAgICB9LFxuICAgIGhhbmRsZUZvY3VzOiBmdW5jdGlvbiBoYW5kbGVGb2N1cyhldmVudCkge1xuICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuJGVtaXQoJ2ZvY3VzJywgZXZlbnQpO1xuICAgIH0sXG4gICAgaGFuZGxlQ29tcG9zaXRpb25TdGFydDogZnVuY3Rpb24gaGFuZGxlQ29tcG9zaXRpb25TdGFydChldmVudCkge1xuICAgICAgdGhpcy4kZW1pdCgnY29tcG9zaXRpb25zdGFydCcsIGV2ZW50KTtcbiAgICAgIHRoaXMuaXNDb21wb3NpbmcgPSB0cnVlO1xuICAgIH0sXG4gICAgaGFuZGxlQ29tcG9zaXRpb25VcGRhdGU6IGZ1bmN0aW9uIGhhbmRsZUNvbXBvc2l0aW9uVXBkYXRlKGV2ZW50KSB7XG4gICAgICB0aGlzLiRlbWl0KCdjb21wb3NpdGlvbnVwZGF0ZScsIGV2ZW50KTtcbiAgICAgIHZhciB0ZXh0ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgdmFyIGxhc3RDaGFyYWN0ZXIgPSB0ZXh0W3RleHQubGVuZ3RoIC0gMV0gfHwgJyc7XG4gICAgICB0aGlzLmlzQ29tcG9zaW5nID0gIU9iamVjdChzaGFyZWRfW1wiaXNLb3JlYW5cIl0pKGxhc3RDaGFyYWN0ZXIpO1xuICAgIH0sXG4gICAgaGFuZGxlQ29tcG9zaXRpb25FbmQ6IGZ1bmN0aW9uIGhhbmRsZUNvbXBvc2l0aW9uRW5kKGV2ZW50KSB7XG4gICAgICB0aGlzLiRlbWl0KCdjb21wb3NpdGlvbmVuZCcsIGV2ZW50KTtcbiAgICAgIGlmICh0aGlzLmlzQ29tcG9zaW5nKSB7XG4gICAgICAgIHRoaXMuaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYW5kbGVJbnB1dChldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBoYW5kbGVJbnB1dDogZnVuY3Rpb24gaGFuZGxlSW5wdXQoZXZlbnQpIHtcbiAgICAgIC8vIHNob3VsZCBub3QgZW1pdCBpbnB1dCBkdXJpbmcgY29tcG9zaXRpb25cbiAgICAgIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvMTA1MTZcbiAgICAgIGlmICh0aGlzLmlzQ29tcG9zaW5nKSByZXR1cm47XG5cbiAgICAgIC8vIGhhY2sgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZUZFL2VsZW1lbnQvaXNzdWVzLzg1NDhcbiAgICAgIC8vIHNob3VsZCByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIHdoZW4gd2UgZG9uJ3Qgc3VwcG9ydCBJRVxuICAgICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gdGhpcy5uYXRpdmVJbnB1dFZhbHVlKSByZXR1cm47XG5cbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgZXZlbnQudGFyZ2V0LnZhbHVlKTtcblxuICAgICAgLy8gZW5zdXJlIG5hdGl2ZSBpbnB1dCB2YWx1ZSBpcyBjb250cm9sbGVkXG4gICAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZUZFL2VsZW1lbnQvaXNzdWVzLzEyODUwXG4gICAgICB0aGlzLiRuZXh0VGljayh0aGlzLnNldE5hdGl2ZUlucHV0VmFsdWUpO1xuICAgIH0sXG4gICAgaGFuZGxlQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfSxcbiAgICBjYWxjSWNvbk9mZnNldDogZnVuY3Rpb24gY2FsY0ljb25PZmZzZXQocGxhY2UpIHtcbiAgICAgIHZhciBlbExpc3QgPSBbXS5zbGljZS5jYWxsKHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5lbC1pbnB1dF9fJyArIHBsYWNlKSB8fCBbXSk7XG4gICAgICBpZiAoIWVsTGlzdC5sZW5ndGgpIHJldHVybjtcbiAgICAgIHZhciBlbCA9IG51bGw7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZWxMaXN0W2ldLnBhcmVudE5vZGUgPT09IHRoaXMuJGVsKSB7XG4gICAgICAgICAgZWwgPSBlbExpc3RbaV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZWwpIHJldHVybjtcbiAgICAgIHZhciBwZW5kYW50TWFwID0ge1xuICAgICAgICBzdWZmaXg6ICdhcHBlbmQnLFxuICAgICAgICBwcmVmaXg6ICdwcmVwZW5kJ1xuICAgICAgfTtcblxuICAgICAgdmFyIHBlbmRhbnQgPSBwZW5kYW50TWFwW3BsYWNlXTtcbiAgICAgIGlmICh0aGlzLiRzbG90c1twZW5kYW50XSkge1xuICAgICAgICBlbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgnICsgKHBsYWNlID09PSAnc3VmZml4JyA/ICctJyA6ICcnKSArIHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1pbnB1dC1ncm91cF9fJyArIHBlbmRhbnQpLm9mZnNldFdpZHRoICsgJ3B4KSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGVJY29uT2Zmc2V0OiBmdW5jdGlvbiB1cGRhdGVJY29uT2Zmc2V0KCkge1xuICAgICAgdGhpcy5jYWxjSWNvbk9mZnNldCgncHJlZml4Jyk7XG4gICAgICB0aGlzLmNhbGNJY29uT2Zmc2V0KCdzdWZmaXgnKTtcbiAgICB9LFxuICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgJycpO1xuICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgJycpO1xuICAgICAgdGhpcy4kZW1pdCgnY2xlYXInKTtcbiAgICB9LFxuICAgIGhhbmRsZVBhc3N3b3JkVmlzaWJsZTogZnVuY3Rpb24gaGFuZGxlUGFzc3dvcmRWaXNpYmxlKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMucGFzc3dvcmRWaXNpYmxlID0gIXRoaXMucGFzc3dvcmRWaXNpYmxlO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuZm9jdXMoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZ2V0SW5wdXQ6IGZ1bmN0aW9uIGdldElucHV0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQgfHwgdGhpcy4kcmVmcy50ZXh0YXJlYTtcbiAgICB9LFxuICAgIGdldFN1ZmZpeFZpc2libGU6IGZ1bmN0aW9uIGdldFN1ZmZpeFZpc2libGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc2xvdHMuc3VmZml4IHx8IHRoaXMuc3VmZml4SWNvbiB8fCB0aGlzLnNob3dDbGVhciB8fCB0aGlzLnNob3dQYXNzd29yZCB8fCB0aGlzLmlzV29yZExpbWl0VmlzaWJsZSB8fCB0aGlzLnZhbGlkYXRlU3RhdGUgJiYgdGhpcy5uZWVkU3RhdHVzSWNvbjtcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcbiAgICB0aGlzLiRvbignaW5wdXRTZWxlY3QnLCB0aGlzLnNlbGVjdCk7XG4gIH0sXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5zZXROYXRpdmVJbnB1dFZhbHVlKCk7XG4gICAgdGhpcy5yZXNpemVUZXh0YXJlYSgpO1xuICAgIHRoaXMudXBkYXRlSWNvbk9mZnNldCgpO1xuICB9LFxuICB1cGRhdGVkOiBmdW5jdGlvbiB1cGRhdGVkKCkge1xuICAgIHRoaXMuJG5leHRUaWNrKHRoaXMudXBkYXRlSWNvbk9mZnNldCk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbnB1dC9zcmMvaW5wdXQudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19pbnB1dHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChpbnB1dHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbnZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9pbnB1dC9zcmMvaW5wdXQudnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gT2JqZWN0KGNvbXBvbmVudE5vcm1hbGl6ZXJbXCJhXCIgLyogZGVmYXVsdCAqL10pKFxuICBzcmNfaW5wdXR2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhcGk7IH1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvaW5wdXQvc3JjL2lucHV0LnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBpbnB1dCA9IChjb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0L2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlucHV0Lmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoaW5wdXQubmFtZSwgaW5wdXQpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfaW5wdXQgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChpbnB1dCk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9tZXJnZVwiKTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///f3ad\n")},f494:function(module,exports,__webpack_require__){eval('module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: \'Module\' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, \'__esModule\', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === \'object\' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, \'default\', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != \'string\') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module[\'default\']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, \'a\', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = "/dist/";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 88);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return normalizeComponent; });\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 () { injectStyles.call(this, this.$root.$options.shadowRoot) }\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 functioal 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\n/***/ }),\n\n/***/ 4:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("d010");\n\n/***/ }),\n\n/***/ 88:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/radio/src/radio.vue?vue&type=template&id=69cd6268&\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "label",\n {\n staticClass: "el-radio",\n class: [\n _vm.border && _vm.radioSize ? "el-radio--" + _vm.radioSize : "",\n { "is-disabled": _vm.isDisabled },\n { "is-focus": _vm.focus },\n { "is-bordered": _vm.border },\n { "is-checked": _vm.model === _vm.label }\n ],\n attrs: {\n role: "radio",\n "aria-checked": _vm.model === _vm.label,\n "aria-disabled": _vm.isDisabled,\n tabindex: _vm.tabIndex\n },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "space", 32, $event.key, [" ", "Spacebar"])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.model = _vm.isDisabled ? _vm.model : _vm.label\n }\n }\n },\n [\n _c(\n "span",\n {\n staticClass: "el-radio__input",\n class: {\n "is-disabled": _vm.isDisabled,\n "is-checked": _vm.model === _vm.label\n }\n },\n [\n _c("span", { staticClass: "el-radio__inner" }),\n _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.model,\n expression: "model"\n }\n ],\n ref: "radio",\n staticClass: "el-radio__original",\n attrs: {\n type: "radio",\n "aria-hidden": "true",\n name: _vm.name,\n disabled: _vm.isDisabled,\n tabindex: "-1",\n autocomplete: "off"\n },\n domProps: {\n value: _vm.label,\n checked: _vm._q(_vm.model, _vm.label)\n },\n on: {\n focus: function($event) {\n _vm.focus = true\n },\n blur: function($event) {\n _vm.focus = false\n },\n change: [\n function($event) {\n _vm.model = _vm.label\n },\n _vm.handleChange\n ]\n }\n })\n ]\n ),\n _c(\n "span",\n {\n staticClass: "el-radio__label",\n on: {\n keydown: function($event) {\n $event.stopPropagation()\n }\n }\n },\n [\n _vm._t("default"),\n !_vm.$slots.default ? [_vm._v(_vm._s(_vm.label))] : _vm._e()\n ],\n 2\n )\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/radio/src/radio.vue?vue&type=template&id=69cd6268&\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/emitter"\nvar emitter_ = __webpack_require__(4);\nvar emitter_default = /*#__PURE__*/__webpack_require__.n(emitter_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/radio/src/radio.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//\n//\n//\n\n\n\n/* harmony default export */ var radiovue_type_script_lang_js_ = ({\n name: \'ElRadio\',\n\n mixins: [emitter_default.a],\n\n inject: {\n elForm: {\n default: \'\'\n },\n\n elFormItem: {\n default: \'\'\n }\n },\n\n componentName: \'ElRadio\',\n\n props: {\n value: {},\n label: {},\n disabled: Boolean,\n name: String,\n border: Boolean,\n size: String\n },\n\n data: function data() {\n return {\n focus: false\n };\n },\n\n computed: {\n isGroup: function isGroup() {\n var parent = this.$parent;\n while (parent) {\n if (parent.$options.componentName !== \'ElRadioGroup\') {\n parent = parent.$parent;\n } else {\n this._radioGroup = parent;\n return true;\n }\n }\n return false;\n },\n\n model: {\n get: function get() {\n return this.isGroup ? this._radioGroup.value : this.value;\n },\n set: function set(val) {\n if (this.isGroup) {\n this.dispatch(\'ElRadioGroup\', \'input\', [val]);\n } else {\n this.$emit(\'input\', val);\n }\n this.$refs.radio && (this.$refs.radio.checked = this.model === this.label);\n }\n },\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n radioSize: function radioSize() {\n var temRadioSize = this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n return this.isGroup ? this._radioGroup.radioGroupSize || temRadioSize : temRadioSize;\n },\n isDisabled: function isDisabled() {\n return this.isGroup ? this._radioGroup.disabled || this.disabled || (this.elForm || {}).disabled : this.disabled || (this.elForm || {}).disabled;\n },\n tabIndex: function tabIndex() {\n return this.isDisabled || this.isGroup && this.model !== this.label ? -1 : 0;\n }\n },\n\n methods: {\n handleChange: function handleChange() {\n var _this = this;\n\n this.$nextTick(function () {\n _this.$emit(\'change\', _this.model);\n _this.isGroup && _this.dispatch(\'ElRadioGroup\', \'handleChange\', _this.model);\n });\n }\n }\n});\n// CONCATENATED MODULE: ./packages/radio/src/radio.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_radiovue_type_script_lang_js_ = (radiovue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/radio/src/radio.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer["a" /* default */])(\n src_radiovue_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 api; }\ncomponent.options.__file = "packages/radio/src/radio.vue"\n/* harmony default export */ var src_radio = (component.exports);\n// CONCATENATED MODULE: ./packages/radio/index.js\n\n\n/* istanbul ignore next */\nsrc_radio.install = function (Vue) {\n Vue.component(src_radio.name, src_radio);\n};\n\n/* harmony default export */ var packages_radio = __webpack_exports__["default"] = (src_radio);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvcmFkaW8uanM/ZjQ5NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxnQ0FBZ0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLGtCQUFrQjtBQUNsRjtBQUNBLHlEQUF5RCxjQUFjO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGlDQUFpQztBQUNsRix3SEFBd0gsbUJBQW1CLEVBQUU7QUFDN0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDBCQUEwQixFQUFFO0FBQy9ELHlDQUF5QyxlQUFlO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsK0RBQStEO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJGQUEyRiwyQkFBMkIsRUFBRTtBQUN4SDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFD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O0FBQ0E7QUFDQTs7QUFFQTs7Ozs7O0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsWUFBWTtBQUN2QjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87O0FBRVAsVUFBVSIsImZpbGUiOiJmNDk0LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbi8qKioqKiovIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4vKioqKioqLyBcdFx0cmV0dXJuIG5zO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9kaXN0L1wiO1xuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA4OCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovICh7XG5cbi8qKiovIDA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBub3JtYWxpemVDb21wb25lbnQ7IH0pO1xuLyogZ2xvYmFscyBfX1ZVRV9TU1JfQ09OVEVYVF9fICovXG5cbi8vIElNUE9SVEFOVDogRG8gTk9UIHVzZSBFUzIwMTUgZmVhdHVyZXMgaW4gdGhpcyBmaWxlIChleGNlcHQgZm9yIG1vZHVsZXMpLlxuLy8gVGhpcyBtb2R1bGUgaXMgYSBydW50aW1lIHV0aWxpdHkgZm9yIGNsZWFuZXIgY29tcG9uZW50IG1vZHVsZSBvdXRwdXQgYW5kIHdpbGxcbi8vIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCB3ZWJwYWNrIHVzZXIgYnVuZGxlLlxuXG5mdW5jdGlvbiBub3JtYWxpemVDb21wb25lbnQgKFxuICBzY3JpcHRFeHBvcnRzLFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZnVuY3Rpb25hbFRlbXBsYXRlLFxuICBpbmplY3RTdHlsZXMsXG4gIHNjb3BlSWQsXG4gIG1vZHVsZUlkZW50aWZpZXIsIC8qIHNlcnZlciBvbmx5ICovXG4gIHNoYWRvd01vZGUgLyogdnVlLWNsaSBvbmx5ICovXG4pIHtcbiAgLy8gVnVlLmV4dGVuZCBjb25zdHJ1Y3RvciBleHBvcnQgaW50ZXJvcFxuICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nXG4gICAgPyBzY3JpcHRFeHBvcnRzLm9wdGlvbnNcbiAgICA6IHNjcmlwdEV4cG9ydHNcblxuICAvLyByZW5kZXIgZnVuY3Rpb25zXG4gIGlmIChyZW5kZXIpIHtcbiAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlclxuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gc3RhdGljUmVuZGVyRm5zXG4gICAgb3B0aW9ucy5fY29tcGlsZWQgPSB0cnVlXG4gIH1cblxuICAvLyBmdW5jdGlvbmFsIHRlbXBsYXRlXG4gIGlmIChmdW5jdGlvbmFsVGVtcGxhdGUpIHtcbiAgICBvcHRpb25zLmZ1bmN0aW9uYWwgPSB0cnVlXG4gIH1cblxuICAvLyBzY29wZWRJZFxuICBpZiAoc2NvcGVJZCkge1xuICAgIG9wdGlvbnMuX3Njb3BlSWQgPSAnZGF0YS12LScgKyBzY29wZUlkXG4gIH1cblxuICB2YXIgaG9va1xuICBpZiAobW9kdWxlSWRlbnRpZmllcikgeyAvLyBzZXJ2ZXIgYnVpbGRcbiAgICBob29rID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIC8vIDIuMyBpbmplY3Rpb25cbiAgICAgIGNvbnRleHQgPVxuICAgICAgICBjb250ZXh0IHx8IC8vIGNhY2hlZCBjYWxsXG4gICAgICAgICh0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0KSB8fCAvLyBzdGF0ZWZ1bFxuICAgICAgICAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuJHZub2RlICYmIHRoaXMucGFyZW50LiR2bm9kZS5zc3JDb250ZXh0KSAvLyBmdW5jdGlvbmFsXG4gICAgICAvLyAyLjIgd2l0aCBydW5Jbk5ld0NvbnRleHQ6IHRydWVcbiAgICAgIGlmICghY29udGV4dCAmJiB0eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfXyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29udGV4dCA9IF9fVlVFX1NTUl9DT05URVhUX19cbiAgICAgIH1cbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgc3R5bGVzXG4gICAgICBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgICAgIGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIGNvbnRleHQpXG4gICAgICB9XG4gICAgICAvLyByZWdpc3RlciBjb21wb25lbnQgbW9kdWxlIGlkZW50aWZpZXIgZm9yIGFzeW5jIGNodW5rIGluZmVycmVuY2VcbiAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzKSB7XG4gICAgICAgIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzLmFkZChtb2R1bGVJZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB1c2VkIGJ5IHNzciBpbiBjYXNlIGNvbXBvbmVudCBpcyBjYWNoZWQgYW5kIGJlZm9yZUNyZWF0ZVxuICAgIC8vIG5ldmVyIGdldHMgY2FsbGVkXG4gICAgb3B0aW9ucy5fc3NyUmVnaXN0ZXIgPSBob29rXG4gIH0gZWxzZSBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgaG9vayA9IHNoYWRvd01vZGVcbiAgICAgID8gZnVuY3Rpb24gKCkgeyBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCB0aGlzLiRyb290LiRvcHRpb25zLnNoYWRvd1Jvb3QpIH1cbiAgICAgIDogaW5qZWN0U3R5bGVzXG4gIH1cblxuICBpZiAoaG9vaykge1xuICAgIGlmIChvcHRpb25zLmZ1bmN0aW9uYWwpIHtcbiAgICAgIC8vIGZvciB0ZW1wbGF0ZS1vbmx5IGhvdC1yZWxvYWQgYmVjYXVzZSBpbiB0aGF0IGNhc2UgdGhlIHJlbmRlciBmbiBkb2Vzbid0XG4gICAgICAvLyBnbyB0aHJvdWdoIHRoZSBub3JtYWxpemVyXG4gICAgICBvcHRpb25zLl9pbmplY3RTdHlsZXMgPSBob29rXG4gICAgICAvLyByZWdpc3RlciBmb3IgZnVuY3Rpb2FsIGNvbXBvbmVudCBpbiB2dWUgZmlsZVxuICAgICAgdmFyIG9yaWdpbmFsUmVuZGVyID0gb3B0aW9ucy5yZW5kZXJcbiAgICAgIG9wdGlvbnMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyV2l0aFN0eWxlSW5qZWN0aW9uIChoLCBjb250ZXh0KSB7XG4gICAgICAgIGhvb2suY2FsbChjb250ZXh0KVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxSZW5kZXIoaCwgY29udGV4dClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCByZWdpc3RyYXRpb24gYXMgYmVmb3JlQ3JlYXRlIGhvb2tcbiAgICAgIHZhciBleGlzdGluZyA9IG9wdGlvbnMuYmVmb3JlQ3JlYXRlXG4gICAgICBvcHRpb25zLmJlZm9yZUNyZWF0ZSA9IGV4aXN0aW5nXG4gICAgICAgID8gW10uY29uY2F0KGV4aXN0aW5nLCBob29rKVxuICAgICAgICA6IFtob29rXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXhwb3J0czogc2NyaXB0RXhwb3J0cyxcbiAgICBvcHRpb25zOiBvcHRpb25zXG4gIH1cbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2VtaXR0ZXJcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4ODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02OWNkNjI2OCZcbnZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJsYWJlbFwiLFxuICAgIHtcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXJhZGlvXCIsXG4gICAgICBjbGFzczogW1xuICAgICAgICBfdm0uYm9yZGVyICYmIF92bS5yYWRpb1NpemUgPyBcImVsLXJhZGlvLS1cIiArIF92bS5yYWRpb1NpemUgOiBcIlwiLFxuICAgICAgICB7IFwiaXMtZGlzYWJsZWRcIjogX3ZtLmlzRGlzYWJsZWQgfSxcbiAgICAgICAgeyBcImlzLWZvY3VzXCI6IF92bS5mb2N1cyB9LFxuICAgICAgICB7IFwiaXMtYm9yZGVyZWRcIjogX3ZtLmJvcmRlciB9LFxuICAgICAgICB7IFwiaXMtY2hlY2tlZFwiOiBfdm0ubW9kZWwgPT09IF92bS5sYWJlbCB9XG4gICAgICBdLFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgcm9sZTogXCJyYWRpb1wiLFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiBfdm0ubW9kZWwgPT09IF92bS5sYWJlbCxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IF92bS5pc0Rpc2FibGVkLFxuICAgICAgICB0YWJpbmRleDogX3ZtLnRhYkluZGV4XG4gICAgICB9LFxuICAgICAgb246IHtcbiAgICAgICAga2V5ZG93bjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJzcGFjZVwiLCAzMiwgJGV2ZW50LmtleSwgW1wiIFwiLCBcIlNwYWNlYmFyXCJdKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9XG4gICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICBfdm0ubW9kZWwgPSBfdm0uaXNEaXNhYmxlZCA/IF92bS5tb2RlbCA6IF92bS5sYWJlbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfYyhcbiAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1yYWRpb19faW5wdXRcIixcbiAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgXCJpcy1kaXNhYmxlZFwiOiBfdm0uaXNEaXNhYmxlZCxcbiAgICAgICAgICAgIFwiaXMtY2hlY2tlZFwiOiBfdm0ubW9kZWwgPT09IF92bS5sYWJlbFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFwic3BhblwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXJhZGlvX19pbm5lclwiIH0pLFxuICAgICAgICAgIF9jKFwiaW5wdXRcIiwge1xuICAgICAgICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJtb2RlbFwiLFxuICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0ubW9kZWwsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogXCJtb2RlbFwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWY6IFwicmFkaW9cIixcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXJhZGlvX19vcmlnaW5hbFwiLFxuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJyYWRpb1wiLFxuICAgICAgICAgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICBuYW1lOiBfdm0ubmFtZSxcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5pc0Rpc2FibGVkLFxuICAgICAgICAgICAgICB0YWJpbmRleDogXCItMVwiLFxuICAgICAgICAgICAgICBhdXRvY29tcGxldGU6IFwib2ZmXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICB2YWx1ZTogX3ZtLmxhYmVsLFxuICAgICAgICAgICAgICBjaGVja2VkOiBfdm0uX3EoX3ZtLm1vZGVsLCBfdm0ubGFiZWwpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgIF92bS5mb2N1cyA9IHRydWVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYmx1cjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgX3ZtLmZvY3VzID0gZmFsc2VcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY2hhbmdlOiBbXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICBfdm0ubW9kZWwgPSBfdm0ubGFiZWxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF92bS5oYW5kbGVDaGFuZ2VcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIF1cbiAgICAgICksXG4gICAgICBfYyhcbiAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1yYWRpb19fbGFiZWxcIixcbiAgICAgICAgICBvbjoge1xuICAgICAgICAgICAga2V5ZG93bjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF92bS5fdChcImRlZmF1bHRcIiksXG4gICAgICAgICAgIV92bS4kc2xvdHMuZGVmYXVsdCA/IFtfdm0uX3YoX3ZtLl9zKF92bS5sYWJlbCkpXSA6IF92bS5fZSgpXG4gICAgICAgIF0sXG4gICAgICAgIDJcbiAgICAgIClcbiAgICBdXG4gIClcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTY5Y2Q2MjY4JlxuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2VtaXR0ZXJcIlxudmFyIGVtaXR0ZXJfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBlbWl0dGVyX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGVtaXR0ZXJfKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvcmFkaW8vc3JjL3JhZGlvLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHJhZGlvdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsUmFkaW8nLFxuXG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hXSxcblxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcblxuICAgIGVsRm9ybUl0ZW06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbFJhZGlvJyxcblxuICBwcm9wczoge1xuICAgIHZhbHVlOiB7fSxcbiAgICBsYWJlbDoge30sXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW4sXG4gICAgbmFtZTogU3RyaW5nLFxuICAgIGJvcmRlcjogQm9vbGVhbixcbiAgICBzaXplOiBTdHJpbmdcbiAgfSxcblxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogZmFsc2VcbiAgICB9O1xuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNHcm91cDogZnVuY3Rpb24gaXNHcm91cCgpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQuJG9wdGlvbnMuY29tcG9uZW50TmFtZSAhPT0gJ0VsUmFkaW9Hcm91cCcpIHtcbiAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9yYWRpb0dyb3VwID0gcGFyZW50O1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIG1vZGVsOiB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNHcm91cCA/IHRoaXMuX3JhZGlvR3JvdXAudmFsdWUgOiB0aGlzLnZhbHVlO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbCkge1xuICAgICAgICBpZiAodGhpcy5pc0dyb3VwKSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaCgnRWxSYWRpb0dyb3VwJywgJ2lucHV0JywgW3ZhbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiRyZWZzLnJhZGlvICYmICh0aGlzLiRyZWZzLnJhZGlvLmNoZWNrZWQgPSB0aGlzLm1vZGVsID09PSB0aGlzLmxhYmVsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9lbEZvcm1JdGVtU2l6ZTogZnVuY3Rpb24gX2VsRm9ybUl0ZW1TaXplKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmVsRm9ybUl0ZW0gfHwge30pLmVsRm9ybUl0ZW1TaXplO1xuICAgIH0sXG4gICAgcmFkaW9TaXplOiBmdW5jdGlvbiByYWRpb1NpemUoKSB7XG4gICAgICB2YXIgdGVtUmFkaW9TaXplID0gdGhpcy5zaXplIHx8IHRoaXMuX2VsRm9ybUl0ZW1TaXplIHx8ICh0aGlzLiRFTEVNRU5UIHx8IHt9KS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXMuaXNHcm91cCA/IHRoaXMuX3JhZGlvR3JvdXAucmFkaW9Hcm91cFNpemUgfHwgdGVtUmFkaW9TaXplIDogdGVtUmFkaW9TaXplO1xuICAgIH0sXG4gICAgaXNEaXNhYmxlZDogZnVuY3Rpb24gaXNEaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzR3JvdXAgPyB0aGlzLl9yYWRpb0dyb3VwLmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZWQgfHwgKHRoaXMuZWxGb3JtIHx8IHt9KS5kaXNhYmxlZCA6IHRoaXMuZGlzYWJsZWQgfHwgKHRoaXMuZWxGb3JtIHx8IHt9KS5kaXNhYmxlZDtcbiAgICB9LFxuICAgIHRhYkluZGV4OiBmdW5jdGlvbiB0YWJJbmRleCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRGlzYWJsZWQgfHwgdGhpcy5pc0dyb3VwICYmIHRoaXMubW9kZWwgIT09IHRoaXMubGFiZWwgPyAtMSA6IDA7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuJGVtaXQoJ2NoYW5nZScsIF90aGlzLm1vZGVsKTtcbiAgICAgICAgX3RoaXMuaXNHcm91cCAmJiBfdGhpcy5kaXNwYXRjaCgnRWxSYWRpb0dyb3VwJywgJ2hhbmRsZUNoYW5nZScsIF90aGlzLm1vZGVsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhZGlvL3NyYy9yYWRpby52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3JhZGlvdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHJhZGlvdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1xudmFyIGNvbXBvbmVudE5vcm1hbGl6ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhZGlvL3NyYy9yYWRpby52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBjb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplcltcImFcIiAvKiBkZWZhdWx0ICovXSkoXG4gIHNyY19yYWRpb3Z1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGFwaTsgfVxuY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9yYWRpby9zcmMvcmFkaW8udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19yYWRpbyA9IChjb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3JhZGlvL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnNyY19yYWRpby5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHNyY19yYWRpby5uYW1lLCBzcmNfcmFkaW8pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfcmFkaW8gPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChzcmNfcmFkaW8pO1xuXG4vKioqLyB9KVxuXG4vKioqKioqLyB9KTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///f494\n')},f6f8:function(module){eval('module.exports = JSON.parse("{\\"_from\\":\\"element-ui@2.15.13\\",\\"_id\\":\\"element-ui@2.15.13\\",\\"_inBundle\\":false,\\"_integrity\\":\\"sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==\\",\\"_location\\":\\"/element-ui\\",\\"_phantomChildren\\":{},\\"_requested\\":{\\"type\\":\\"version\\",\\"registry\\":true,\\"raw\\":\\"element-ui@2.15.13\\",\\"name\\":\\"element-ui\\",\\"escapedName\\":\\"element-ui\\",\\"rawSpec\\":\\"2.15.13\\",\\"saveSpec\\":null,\\"fetchSpec\\":\\"2.15.13\\"},\\"_requiredBy\\":[\\"/\\"],\\"_resolved\\":\\"https://registry.npmjs.org/element-ui/-/element-ui-2.15.13.tgz\\",\\"_shasum\\":\\"380f019ee7d15b181105587b41fd5914c308a143\\",\\"_spec\\":\\"element-ui@2.15.13\\",\\"_where\\":\\"E:\\\\\\\\云美\\\\\\\\调解\\\\\\\\pc端\\\\\\\\Mediation-Frontend\\",\\"bugs\\":{\\"url\\":\\"https://github.com/ElemeFE/element/issues\\"},\\"bundleDependencies\\":false,\\"dependencies\\":{\\"async-validator\\":\\"~1.8.1\\",\\"babel-helper-vue-jsx-merge-props\\":\\"^2.0.0\\",\\"deepmerge\\":\\"^1.2.0\\",\\"normalize-wheel\\":\\"^1.0.1\\",\\"resize-observer-polyfill\\":\\"^1.5.0\\",\\"throttle-debounce\\":\\"^1.0.1\\"},\\"deprecated\\":false,\\"description\\":\\"A Component Library for Vue.js.\\",\\"devDependencies\\":{\\"@vue/component-compiler-utils\\":\\"^2.6.0\\",\\"algoliasearch\\":\\"^3.24.5\\",\\"babel-cli\\":\\"^6.26.0\\",\\"babel-core\\":\\"^6.26.3\\",\\"babel-loader\\":\\"^7.1.5\\",\\"babel-plugin-add-module-exports\\":\\"^0.2.1\\",\\"babel-plugin-istanbul\\":\\"^4.1.1\\",\\"babel-plugin-module-resolver\\":\\"^2.2.0\\",\\"babel-plugin-syntax-jsx\\":\\"^6.18.0\\",\\"babel-plugin-transform-vue-jsx\\":\\"^3.7.0\\",\\"babel-preset-env\\":\\"^1.7.0\\",\\"babel-preset-stage-2\\":\\"^6.24.1\\",\\"babel-regenerator-runtime\\":\\"^6.5.0\\",\\"chai\\":\\"^4.2.0\\",\\"chokidar\\":\\"^1.7.0\\",\\"copy-webpack-plugin\\":\\"^5.0.0\\",\\"coveralls\\":\\"^3.0.3\\",\\"cp-cli\\":\\"^1.0.2\\",\\"cross-env\\":\\"^3.1.3\\",\\"css-loader\\":\\"^2.1.0\\",\\"es6-promise\\":\\"^4.0.5\\",\\"eslint\\":\\"4.18.2\\",\\"eslint-config-elemefe\\":\\"0.1.1\\",\\"eslint-loader\\":\\"^2.0.0\\",\\"eslint-plugin-html\\":\\"^4.0.1\\",\\"eslint-plugin-json\\":\\"^1.2.0\\",\\"file-loader\\":\\"^1.1.11\\",\\"file-save\\":\\"^0.2.0\\",\\"gulp\\":\\"^4.0.0\\",\\"gulp-autoprefixer\\":\\"^6.0.0\\",\\"gulp-cssmin\\":\\"^0.2.0\\",\\"gulp-sass\\":\\"^4.0.2\\",\\"highlight.js\\":\\"^9.3.0\\",\\"html-webpack-plugin\\":\\"^3.2.0\\",\\"json-loader\\":\\"^0.5.7\\",\\"json-templater\\":\\"^1.0.4\\",\\"karma\\":\\"^4.0.1\\",\\"karma-chrome-launcher\\":\\"^2.2.0\\",\\"karma-coverage\\":\\"^1.1.2\\",\\"karma-mocha\\":\\"^1.3.0\\",\\"karma-sinon-chai\\":\\"^2.0.2\\",\\"karma-sourcemap-loader\\":\\"^0.3.7\\",\\"karma-spec-reporter\\":\\"^0.0.32\\",\\"karma-webpack\\":\\"^3.0.5\\",\\"launch-editor-middleware\\":\\"^2.3.0\\",\\"markdown-it\\":\\"^8.4.1\\",\\"markdown-it-anchor\\":\\"^5.0.2\\",\\"markdown-it-chain\\":\\"^1.3.0\\",\\"markdown-it-container\\":\\"^2.0.0\\",\\"mini-css-extract-plugin\\":\\"^0.4.1\\",\\"mocha\\":\\"^6.0.2\\",\\"node-sass\\":\\"^4.11.0\\",\\"optimize-css-assets-webpack-plugin\\":\\"^5.0.1\\",\\"postcss\\":\\"^7.0.14\\",\\"progress-bar-webpack-plugin\\":\\"^1.11.0\\",\\"rimraf\\":\\"^2.5.4\\",\\"sass-loader\\":\\"^7.1.0\\",\\"select-version-cli\\":\\"^0.0.2\\",\\"sinon\\":\\"^7.2.7\\",\\"sinon-chai\\":\\"^3.3.0\\",\\"style-loader\\":\\"^0.23.1\\",\\"transliteration\\":\\"^1.1.11\\",\\"uglifyjs-webpack-plugin\\":\\"^2.1.1\\",\\"uppercamelcase\\":\\"^1.1.0\\",\\"url-loader\\":\\"^1.0.1\\",\\"vue\\":\\"2.5.21\\",\\"vue-loader\\":\\"^15.7.0\\",\\"vue-router\\":\\"^3.0.1\\",\\"vue-template-compiler\\":\\"2.5.21\\",\\"vue-template-es2015-compiler\\":\\"^1.6.0\\",\\"webpack\\":\\"^4.14.0\\",\\"webpack-cli\\":\\"^3.0.8\\",\\"webpack-dev-server\\":\\"^3.1.11\\",\\"webpack-node-externals\\":\\"^1.7.2\\"},\\"faas\\":[{\\"domain\\":\\"element\\",\\"public\\":\\"temp_web/element\\"},{\\"domain\\":\\"element-theme\\",\\"public\\":\\"examples/element-ui\\",\\"build\\":[\\"yarn\\",\\"npm run deploy:build\\"]}],\\"files\\":[\\"lib\\",\\"src\\",\\"packages\\",\\"types\\",\\"web-types.json\\"],\\"homepage\\":\\"http://element.eleme.io\\",\\"keywords\\":[\\"eleme\\",\\"vue\\",\\"components\\"],\\"license\\":\\"MIT\\",\\"main\\":\\"lib/element-ui.common.js\\",\\"name\\":\\"element-ui\\",\\"peerDependencies\\":{\\"vue\\":\\"^2.5.17\\"},\\"repository\\":{\\"type\\":\\"git\\",\\"url\\":\\"git+ssh://git@github.com/ElemeFE/element.git\\"},\\"scripts\\":{\\"bootstrap\\":\\"yarn || npm i\\",\\"build:file\\":\\"node build/bin/iconInit.js & node build/bin/build-entry.js & node build/bin/i18n.js & node build/bin/version.js\\",\\"build:theme\\":\\"node build/bin/gen-cssfile && gulp build --gulpfile packages/theme-chalk/gulpfile.js && cp-cli packages/theme-chalk/lib lib/theme-chalk\\",\\"build:umd\\":\\"node build/bin/build-locale.js\\",\\"build:utils\\":\\"cross-env BABEL_ENV=utils babel src --out-dir lib --ignore src/index.js\\",\\"clean\\":\\"rimraf lib && rimraf packages/*/lib && rimraf test/**/coverage\\",\\"deploy:build\\":\\"npm run build:file && cross-env NODE_ENV=production webpack --config build/webpack.demo.js && echo element.eleme.io>>examples/element-ui/CNAME\\",\\"deploy:extension\\":\\"cross-env NODE_ENV=production webpack --config build/webpack.extension.js\\",\\"dev\\":\\"npm run bootstrap && npm run build:file && cross-env NODE_ENV=development webpack-dev-server --config build/webpack.demo.js & node build/bin/template.js\\",\\"dev:extension\\":\\"rimraf examples/extension/dist && cross-env NODE_ENV=development webpack --watch --config build/webpack.extension.js\\",\\"dev:play\\":\\"npm run build:file && cross-env NODE_ENV=development PLAY_ENV=true webpack-dev-server --config build/webpack.demo.js\\",\\"dist\\":\\"npm run clean && npm run build:file && npm run lint && webpack --config build/webpack.conf.js && webpack --config build/webpack.common.js && webpack --config build/webpack.component.js && npm run build:utils && npm run build:umd && npm run build:theme\\",\\"i18n\\":\\"node build/bin/i18n.js\\",\\"lint\\":\\"eslint src/**/* test/**/* packages/**/* build/**/* --quiet\\",\\"pub\\":\\"npm run bootstrap && sh build/git-release.sh && sh build/release.sh && node build/bin/gen-indices.js\\",\\"test\\":\\"npm run lint && npm run build:theme && cross-env CI_ENV=/dev/ BABEL_ENV=test karma start test/unit/karma.conf.js --single-run\\",\\"test:watch\\":\\"npm run build:theme && cross-env BABEL_ENV=test karma start test/unit/karma.conf.js\\"},\\"style\\":\\"lib/theme-chalk/index.css\\",\\"typings\\":\\"types/index.d.ts\\",\\"unpkg\\":\\"lib/index.js\\",\\"version\\":\\"2.15.13\\",\\"web-types\\":\\"./web-types.json\\"}");\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJmNmY4LmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///f6f8\n')}}]);
|